Amazon Linux 2 で ssh キー、ユーザー分離 (sftp と ssh)、異なるポート、ユーザー ディレクトリ制約を使用して sftp を設定する

Amazon Linux 2 で ssh キー、ユーザー分離 (sftp と ssh)、異なるポート、ユーザー ディレクトリ制約を使用して sftp を設定する

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 を再起動すれば、問題なく動作すると思います。

関連情報