sftp 僅在 chroot 時才授予權限?
我在我的 centos 盒子上配置了 sshd_conf,如下所示:
Match group pilots ChrootDirectory /home/pilots ForceCommand internal-sftp X11Forwarding no AllowTcpForwarding no
和目錄 /home/pilots 像這樣:
# ls -al /home/pilots total 12 drwxr-x---. 3 root pilots 4096 Mar 10 14:20 . drwxr-xr-x. 7 root root 4096 Mar 10 14:10 .. drwxrwxr-x. 2 root pilots 4096 Mar 10 15:21 data -rwxrwxrwx. 1 root root 0 Mar 10 14:20 topLevel #
如果我在沒有啟用 ChrootDirectory 指令的情況下作為 Pilots 組中的使用者 sftp,我可以 cd 到 /home/pilots 文件夾(或其子目錄)並毫無困難地執行 ls 或 get 。但是,如果我啟用 ChrootDirectory 指令,雖然我仍然可以 sftp 進入,並且可以 cd 到數據,但我無法執行 ls 或進入任一目錄。例如,嘗試 ls 會給出遠端 readdir("/"): Permission denied 錯誤,並且嘗試獲取 topLevel 會給出 File “/topLevel” not found。我在想也許我不在我期望的目錄中,但是 cd 數據的能力似乎表明 chroot 確實按預期工作。
查看消息日誌,當 ls 被拒絕時,我看到以下內容:
type=1400 audit(1394494944.504:50): avc: denied { read } for pid=22758 comm="sshd" name="pilots" dev=dm-0 ino=400504 scontext=unconfined_u:system_r:chroot_user_t:s0-s0:c0.c1023 tcontext=unconfined_u:object_r:home_root_t:s0 tclass=dir
所以有否認的記錄。仍然沒有告訴我為什麼。
我可能做錯了什麼?
幾個潛在的重要注意事項:
- 有問題的使用者存在於遠端 LDAP 伺服器上,通過 sssd 訪問
- 訪問控制必須按組進行,因為許多使用者需要對同一文件夾進行讀取訪問。因此所有權仍然是根。
編輯:在進一步調查中,這似乎與 SELinux 有關 -
echo 0 >/selinux/enforce
解決了這個問題,儘管是在笨拙的情況下,用大錘的方式殺死一隻螞蟻。如果可能的話,我想知道“正確的”修復。
我在此頁面上找到了解決方案。綜上所述,在按照上述配置配置 sftp 後,需要執行以下兩個命令才能在啟用 SELinux 的情況下允許訪問:
setsebool -P ssh_chroot_rw_homedirs on restorecon -R /home/$USERNAME
在這種情況下,第二個命令將是
restorecon -R /home/pilots
. 在此之後,即使在 chroot 下,sftp 也可以正常工作,而無需完全禁用 SELinux。
尾隨@ibrewster 的答案(包括他連結到的外部資源),這裡是來自該外部頁面的完整說明集,以及一些附加資訊,以使其與無密碼登錄和 SELinux 強制一起工作。
在這裡重新發布,以防外部連結的頁面將來碰巧消失。
這些說明適用於 RHEL7 和 CentOS7(可能還有其他版本):
在遠端系統上:
首先,添加並配置要chroot的使用者帳戶:
請注意,外部資源使用了不同的路徑
sftp-server
。確保您的系統上有正確的路徑或為痛苦做好準備。;-) 下面的路徑適用於 RHEL7 和 CentOS7 的最小安裝。# From command line: groupadd sftponly useradd -d /home/$USERNAME -s /usr/libexec/openssh/sftp-server -M -N -g sftponly $USERNAME mkdir -p /home/$USERNAME/uploads /home/$USERNAME/downloads /home/$USERNAME/.ssh chown $USERNAME:sftponly /home/$USERNAME/uploads /home/$USERNAME/downloads /home/$USERNAME/.ssh chown root /home/$USERNAME chmod 755 /home/$USERNAME chmod 700 /home/$USERNAME/.ssh passwd $USERNAME echo '/usr/libexec/openssh/sftp-server' >> /etc/shells
雖然我在上面設置了密碼,但一旦我知道配置有效,我將使用無密碼登錄。向前…
假設您已
SELinux
啟用並強制執行(您應該),請發出以下命令以使其滿意:setsebool -P ssh_chroot_rw_homedirs on restorecon -R /home/$USERNAME
現在,編輯 sshd 配置,如下所示:
[root@remote]# vi /etc/ssh/sshd_config # # CHANGE lines: # # override default of no subsystems #Subsystem sftp /usr/libexec/openssh/sftp-server # commented out Subsystem sftp internal-sftp # added # # ADD the following at the bottom: # Match group sftponly ChrootDirectory %h AllowTcpForwarding no ForceCommand internal-sftp
最後重啟sshd
[root@remote]# systemctl restart sshd.service
在客戶端系統上
首先在本地創建相同的帳戶。
[root@client]# useradd -m $USERNAME [root@client]# passwd $USERNAME [root@client]# su $USERNAME
好的,現在讓我們設置我們的 RSA 密鑰對。
[$USERNAME@client]# ssh-keygen
我無法讓 ssh-copy-id 與上面的 chroot 配置一起使用,因此我
authorized_keys
使用客戶的 id_rsa.pub 文本手動創建了該文件。[$USERNAME@client]# cat .ssh/id_rsa.pub ---some key here---
然後回到遠端系統,
[root@remote]# vi /home/$USERNAME/.ssh/authorized_keys ---past key from right above, then wq---
不要忘記為此文件設置權限:
[root@remote]# chown $USERNAME:sftpusers /home/$USERNAME/.ssh/authorized_keys
準備測試
現在一切都應該到位。來自客戶:
[$USERNAME@client]# sftp $USERNAME@remote
這應該可以讓您進入。如果系統提示您輸入密碼(我們尚未在遠端禁用 PasswordAuthentication),那麼您在遠端系統上存在配置問題。掃描您的 /var/log/secure 以獲取詳細資訊。
如果您在沒有提示輸入密碼的情況下登錄,您就快完成了。
返回遠端系統:
[root@remote]# vi /etc/ssh/sshd_config # disable PasswordAuthentication PasswordAuthentication no # or optionally, just comment that line out # PasswordAuthentication no -- save and exit with :wq --
在遠端系統上重新啟動 sshd:
[root@remote]# systemctl restart sshd.service
來自客戶的最終測試
[$USERNAME@client]# sftp $USERNAME@remote # in like Flynn? yay!
完成的
您應該設置為使用chroot sftp和無密碼登錄(
SELinux
設置為enforcing)