TDLR:我有一個第 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 用戶。對於「sftpusers」群組中的 sftp 用戶,我希望連接埠 2299 僅用作 sftp,而不是用作 ssh。對於非 sftpuser,我希望拒絕存取連接埠 2299。
好的,所以,我建立了一個使用者“user1”,其主目錄為 /sftp-data/user1 和 shell /sbin/nologin。我創建了 /sftp-data/user1/.ssh/authorized_keys 並使用公共 ssh 金鑰填充它。 /sftp-data 由 root 擁有,擁有 700 權限。 /sftp-data/user1/.ssh 及以下內容由 user1 擁有,且 /sftp-data/user1/.ssh/authorized_keys 擁有權限 600。更多內容請見下文。
我建立了使用者群組 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。
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 進程。
答案1
您的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
目錄應該可讀。
答案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,我想你就可以開始了。