Centos

sftp 僅在 chroot 時才授予權限?

  • August 19, 2016

我在我的 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

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