使用 ssh 密鑰、使用者隔離(sftp 與 ssh)、不同埠和使用者目錄限制在 Amazon Linux 2 上設置 sftp
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
目錄應該是可讀的。