使用 ssh 金鑰、使用者隔離(sftp 與 ssh)、不同連接埠和使用者目錄約束在 Amazon Linux 2 上設定 sftp

使用 ssh 金鑰、使用者隔離(sftp 與 ssh)、不同連接埠和使用者目錄約束在 Amazon Linux 2 上設定 sftp

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

您的ChrootDirectoryis /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,我想你就可以開始了。

相關內容