前言:
開發項目客戶要求與三方通過sftp互動檔案,我方系統部署sftp伺服器。考慮安全,計劃對提供給三方的使用者實作chroot控制
提供sftp本次選用的是系統自帶的internal-sftp。
限制使用者隻能在home目錄下活動,需要使用chroot。openssl4.8p1以後都支援chroot,目前作業系統是rehl6.6 X64,自帶openssl版本足夠。
檢視openssl版本指令:
開始正題,因為接入三方很多,現計劃建立sftpusers使用者組,各三方的sftp使用者都屬于此組以便統一管理。使用者HOME目錄統一指定到/chroot目錄下。
- 建立使用者組
# groupadd sftpusers
- 配置chroot目錄
# mkdir /chroot
# 因root建立,此步可省# chown root:root /chroot
# chown 755 /chroot
- 建立新使用者
# useradd -d /chroot/DF999999 -s /bin/false -g sftpusers DF999999
注意:
-d意為指定home目錄
-g意為使用者DF999999主屬組為sftpusers。若此處為-G,則會自動建立DF999999組為使用者的主屬組。
為使用者初始化密碼
# passwd DF999999
- 配置使用者home目錄權限,用于chroot控制
# chown root:root /chroot/DF999999
# chmod 755 /chroot/DF99999
-
配置sshd_config
編輯 /etc/ssh/sshd_config,line132左右
# 找到如下行,并注釋掉
Subsystem sftp /usr/libexec/openssh/sftp-server
# 添加如下幾行
Subsystem sftp internal-sftp
Match Group sftpusers
ChrootDirectory %h
ForceCommand internal-sftp
如上記錄說明:
Subsystem sftp internal-sftp
這行指定使用sftp服務使用系統自帶的internal-sftp
Match Group sftpusers
這行用來比對sftpusers組的使用者,如果要比對多個組,多個組之間用逗号分割;
當然,也可以比對使用者
Match User DF999999
這樣就可以比對使用者了,多個使用者名之間也是用逗号分割,但我們這裡按組比對更靈活和友善.
ChrootDirectory %h
用chroot将使用者的根目錄指定到%h,%h代表使用者home目錄,這樣使用者 就隻能在使用者目錄下活動。也可用%u,%u代表使用者名。
ForceCommand internal-sftp
指定sftp指令
6. 重新開機sshd服務
# service sshd restart
重新開機完畢後使用者DF999999就可以正常通過sftp用戶端登入了。
但是因為/chroot以及/chroot/DF999999都屬于root使用者組,是以無讀寫權限。進行如下處理:
- 于/chroot/DF999999目錄下建立上傳目錄
# mkdir /chroot/DF999999/send
- 上傳目錄權限控制
# chown DF999999:sftpusers /chroot/DF999999/send
# chmod 777 /chroot/DF999999/send
至此,使用者可以sftp登入,并上傳檔案到send目錄下。
重要說明:
1.如果目錄下不能上傳檔案,提示沒有權限,檢查SElinux是否關閉,可以使用如下指令關閉SElinux。修改/etc/selinux/config檔案中的SELINUX=”” 為 disabled ,然後重新開機。
或:
# setenforce 0
2.chroot設定需要遵循兩個原則
- 由ChrootDirectory指定的目錄開始一直往上到系統根目錄為止的目錄擁有者都隻能是root
-
由ChrootDirectory指定的目錄開始一直往上到系統根目錄為止都不可以具有群組寫入權限
遵循如上兩個原則,我将/chroot以及/chroot/DF999999目錄設定擁有者全部為root使用者,且權限全部為755(群組無寫入權限)