Amazon-Ec2

使用 ssh 密鑰、使用者隔離(sftp 與 ssh)、不同埠和使用者目錄限制在 Amazon Linux 2 上設置 sftp

  • September 3, 2021

TDLR:我有一個 Catch 22,根據使用者主目錄的權限,我可以讓 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 使用者。對於 sftp 使用者,在“sftpusers”組中,我希望埠 2299 僅用作 sftp,而不是 ssh。對於非 sftpusers,我希望拒絕訪問埠 2299。

好的,所以,我用主目錄 /sftp-data/user1 和 shell /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,ssh 公鑰認證在埠 2299 上成功,但使用者立即註銷,此消息保存在 /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 圍繞標準 ssh 身份驗證啟用 AWS Instance Connect 的包裝器。

對於額外的信用……如果上述問題不夠具有挑戰性,你能想出一個方案,我可以讓特定的 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 打開了調試日誌記錄。使用 ChrootDirectory 指令,/sftp-data/user1 由 root 擁有,並且 SSH 身份驗證失敗,我在 /var/log/secure 中看到了這一點:

debug1:無法打開授權密鑰“/sftp-data/user1/.ssh/authorized_keys”:權限被拒絕

ps 清楚地告訴我 root 正在執行 sshd 程序。

ChrootDirectory的 is /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目錄應該是可讀的。

引用自:https://serverfault.com/questions/1076474