警告:在操作之前,先打個多個會話窗口,避免操作不當,引起無法登錄服務器,例如這樣
背景:
1.需要搭建sftp服務器(一般服務器自帶sftp服務,此處不再贅述)
2.sftp只允許訪問指定目錄,不能訪問其他目錄(重點)
在一些生產環境中,有時,用戶需要傳數據到服務器,但是配置ftp服務比較麻煩,此時,我們可以為用戶創建sftp賬戶,讓用戶使用sftp來上傳下載所需的數據。Sftp賬號即為系統賬號,將賬戶密碼給用戶,用戶除了能登錄sftp上傳下載數據外,還可以訪問系統中的其他目錄,由此,給我們的系統帶來了安全隱患,再次,我們需要配置用戶只能通過sftp登錄系統下載上傳所需的數據。
1.創建sftp用戶joshua317
useradd joshua317 echo abc123 | passwd --stdin joshua317
2.設置sftp用戶joshua317的賬戶權限
設置sftp的賬號權限需要通過修改sshd_config配置文件進行,sshd_config配置文件修改內容如下:
vi /etc/ssh/sshd_config #內容修改如下 # Subsystem sftp /usr/libexec/openssh/sftp-server #注釋掉此行並添加一下行 Subsystem sftp internal-sftp Match User joshua317 #此處設置控制的用戶,也可以設置為組 ChrootDirectory /home/joshua317 #允許用戶訪問的目錄,此處我們設置為用戶家目錄,根據具體情況自己定義 X11Forwarding no AllowTcpForwarding no ForceCommand internal-sftp
配置完成后需要重啟服務:
service sshd reload
或者
systemctl restart sshd #根據不同的操作系統選擇不同命令,這里服務器版本是centos7.X
此處配置完我們用另一台機器測試登錄,會出現錯誤,使用win系統sftp客戶端(FileZilla)同樣也不能正常登陸
[root@xxxxxxxxxxxxx ~]# sftp joshua317@172.17.xxx.xxx Connecting to 172.17.xxx.xxx... joshua317@172.17.xxx.xxx's password: Write failed: Broken pipe Couldn't read packet: Connection reset by peer
這是由於沒有配置目錄的正確權限,我們需要設置用戶訪問的目錄的權限
3.設置允許用戶訪問目錄的權限
重點:sftp用戶訪問目錄需要設置所有者和所屬組的權限均為root,並設置目錄的權限為755,
但此目錄下的文件及目錄的權限我們可根據自己的需求任意設置。
chown root:root /home/joshua317/ #不要使用chown -R chmod 755 /home/joshua317/ #不要使用chmod -R #設置該sftp賬號不允許登錄 usermod joshua317 -s /sbin/nologin #然后重啟 service sshd reload
至此,我們的sftp配置已經完成,
4.測試
使用linux測試:
使用windows客戶端FileZilla測試:
5.設置用戶上傳文件權限
經過上面的設置后用戶可正常瀏覽下載目錄中的文件,但是用戶無法上傳文件。
此時需要在/home/joshua317/下建立屬主屬組為joshua317的目錄,並給/home/joshua317下的目錄設置acl權限即可。
mkdir /home/joshua317/test chown joshua317:joshua317 /home/joshua317/test chmod 755 /home/joshua317/test #查看 getfacl /home/joshua317/test
測試是否可以在/homne/joshua317/test下面創建文件或者目錄
6.額外:通過用戶組處理
如果又需要創建一個用戶joshua318,可以繼續通過匹配用戶的形式,只需要進行如下操作
首先創建一個用戶
#添加一個用戶,指定用戶組為joshua317,目錄為/home/joshua317,賬號不允許登錄 useradd -g joshua317 -s /sbin/nologin -m joshua318 echo abc123 | passwd --stdin joshua318
調整sshd_config
vi /etc/ssh/sshd_config Match User joshua318 ChrootDirectory /home/joshua317 #重啟sshd service sshd reload
但如果有很多個用戶,此時就需要通過組進行匹配
vi /etc/ssh/sshd_config Match Group joshua317 ChrootDirectory /home/joshua317 #然后重啟 service sshd reload
測試是否成功: