TDLR: ユーザーのホーム ディレクトリの権限に応じて、SSH 認証を機能させることも、ユーザー ディレクトリの制約を機能させることも、両方を機能させることはできないというジレンマに陥っています。
ところで、私は本当に独自の SFTP サーバーを構築したいと思っています。AWS Transfer サービスやそれに代わるものを試すことはお勧めしません。よろしくお願いします。
以下は、/etc/ssh/sshd_config 内の関連する (デフォルトから変更された) 内容です。
Subsystem sftp internal-sftp
Port 22
Port 2299
Match Group sftpusers LocalPort 2299
ChrootDirectory /sftp-data/%u
ForceCommand internal-sftp
Match Group sftpusers LocalPort 22
DenyGroups sftpusers
Match LocalPort 2299 Group *,!sftpusers
DenyUsers *
ポート 22 を通常の ssh と同じように機能させたいのですが、非 sftp ユーザーに対してのみ機能させたいです。グループ "sftpusers" の sftp ユーザーに対しては、ポート 2299 を ssh ではなく sftp としてのみ機能させたいです。非 sftp ユーザーに対しては、ポート 2299 へのアクセスを拒否したいです。
さて、ホーム ディレクトリ /sftp-data/user1、シェル /sbin/nologin を持つユーザー "user1" を作成しました。/sftp-data/user1/.ssh/authorized_keys を作成し、そこに公開 SSH キーを入力しました。/sftp-data は、700 の権限を持つ root によって所有されています。/sftp-data/user1/.ssh およびそれ以下の所有者は user1 であり、/sftp-data/user1/.ssh/authorized_keys は権限 600 を持っています。/sftp-data/user1 の所有権/権限は、ここで問題になっています。詳細は以下を参照してください。
ユーザー グループ sftpusers を作成し、user1 をそのグループに追加しました。ただし、AWS で取得する組み込み ec2-user はそのグループのメンバーではありません。ec2-user を使用したテストは正常に機能しました。ssh 経由のアクセス、ポート 22 はいつもどおり機能しましたが、ポート 2299 にはアクセスできませんでした。
そこで、user1 でのテストが面白くなりました。user1 はポート 22 にアクセスできません。これは素晴らしいことです。user1 が /sftp-data/user1 を所有しているため、ポート 2299 での ssh 公開キー認証は成功しますが、ユーザーはすぐにログアウトされ、次のメッセージが /var/log/secure に保存されます。
Sep 2 19:21:38 ip-192-168-0-25 sshd[10369]: Accepted publickey for user1 from <ip-address redacted> port 61110 ssh2: ECDSA SHA256:<sha redacted>
Sep 2 19:13:23 ip-192-168-0-25 sshd[9803]: pam_unix(sshd:session): session opened for user user1 by (uid=0)
Sep 2 19:13:23 ip-192-168-0-25 sshd[9803]: fatal: bad ownership or modes for chroot directory "/sftp-data/user1" [postauth]
Sep 2 19:13:23 ip-192-168-0-25 sshd[9803]: pam_unix(sshd:session): session closed for user user1
確かに、それは理にかなっています。chroot では、/sftp-data/user1 が root によって所有され、権限が 700 である必要があります。したがって、そのようにすると、sftp (ssh キー) 認証は失敗します。
Sep 2 19:41:00 ip-192-168-0-25 sshd[11693]: error: AuthorizedKeysCommand /opt/aws/bin/eic_run_authorized_keys user1 SHA256:<sha redacted> failed, status 22
ちなみに、eic_run_authorized_keys は、AWS Instance Connect を有効にするために AWS が標準の SSH 認証に組み込むラッパーです。
追加のクレジットとして... 上記の問題が十分に難しくない場合、すべてのプロジェクトにグループを作成せずに、特定の sftp ユーザーに特定のプロジェクト ディレクトリへのアクセスのみを許可するスキームを思い付くことができますか? 各ユーザーのホーム ディレクトリからプロジェクト ディレクトリへのリンクがあれば素晴らしいと思います。
@anx からリクエストされた追加情報:
# getent passwd user1
user1:x:1001:1001::/sftp-data/user1:/sbin/nologin
# namei -l /sftp-data/user1/.ssh/authorized_keys
f: /sftp-data/user1/.ssh/authorized_keys
dr-xr-xr-x root root /
drwxr-xr-x root root sftp-data
drwx------ root root user1
drwx------ user1 sftpusers .ssh
-rw------- user1 sftpusers authorized_keys
sshd の DEBUG ログを有効にしました。ChrootDirectory ディレクティブを使用し、/sftp-data/user1 が root によって所有され、SSH 認証が失敗すると、/var/log/secure に次のメッセージが表示されます。
debug1: 承認されたキー '/sftp-data/user1/.ssh/authorized_keys' を開けませんでした: 権限が拒否されました
ps では、root が sshd プロセスを実行していることが明確に示されています。
答え1
はChrootDirectory
であり/sftp-data/user1
、これは root によって所有されている必要があります。そして、それは次のようになります:
# namei -l /sftp-data/user1/.ssh/authorized_keys
f: /sftp-data/user1/.ssh/authorized_keys
dr-xr-xr-x root root /
drwxr-xr-x root root sftp-data
drwx------ root root user1
drwx------ user1 sftpusers .ssh
-rw------- user1 sftpusers authorized_keys
ただし、この時点で sshd は既にユーザーを user1 に変更し、権限を削除しているため、user1 は下位レベルのディレクトリに降りることができません。そのためには、ディレクトリに検索権限 ( a+x
) が必要です。
chmod a+x /sftp-data/user1
これで、user1 はサブディレクトリに降りることができ、.ssh
ディレクトリは読み取り可能になるはずです。
答え2
/sftp-data/user1/.ssh
これは主にフォルダ権限の問題だと思います。とその下のディレクトリは が所有しているはずだと思いますuser1
が、 が所有しているようですroot
。次のように試してくださいroot
。
の公開キーが/sftp-data/user1/.ssh/authorized_keys
正確であることを確認します。その後、次の権限を変更する必要があると思います:
chmod 700 /sftp-data/user1/.ssh
chmod 600 /sftp-data/user1/.ssh/authorized_keys
chown root:sftpusers /sftp-data
chown -R user1:user1 /sftp-data/user1/.ssh
SSH を再起動すれば、問題なく動作すると思います。