搭建sftp服务器
1、前言
sftp可以為傳輸文件提供一種安全的網絡的加密方法。sftp 與 ftp 有著幾乎一樣的語法和功能。SFTP 為 SSH的其中一部分,是一種傳輸檔案至 Blogger 伺服器的安全方式。其實在SSH軟件包中,已經包含了一個叫作SFTP(Secure File Transfer Protocol)的安全文件信息傳輸子系統,SFTP本身沒有單獨的守護進程,它必須使用sshd守護進程(端口號默認是22)來完成相應的連接和答復操作,所以從某種意義上來說,SFTP并不像一個服務器程序,而更像是一個客戶端程序。SFTP同樣是使用加密傳輸認證信息和傳輸的數據,所以,使用SFTP是非常安全的。但是,由于這種傳輸方式使用了加密/解密技術,所以傳輸效率比普通的FTP要低得多,如果您對網絡安全性要求更高時,可以使用SFTP代替FTP。
2、搭建sftp服務器
系統背景:Centos 6.10
需求:創建三個用戶,其中一個為sftp管理員,其余兩個分別為指定目錄的訪問用戶。sftp管理員對其他用戶的sftp根目錄下的內容具有讀寫權限,限制其他用戶只能訪問其自己的根目錄且僅有讀權限;相關的sftp用戶不能登錄到Linux系統中。
- 確認openssh的版本
[root@localhost ~]# ssh -VOpenSSH_5.3p1, OpenSSL 1.0.1e-fips 11 Feb 2013使用上述命令查看openssh的版本,要求版本高于4.8p1,低于此版本需升級。
- 創建sftp管理組及用戶組
[root@localhost ~]# groupadd sftpadmin[root@localhost ~]# groupadd sftp- 創建sftp管理用戶及普通用戶
[root@localhost ~]# useradd -g sftp -s /bin/false charles #/bin/false也可以替換為/sbin/nologin,目的是不允許該用戶登錄到系統中[root@localhost ~]# useradd -g sftp -s /bin/false john[root@localhost ~]# useradd -g sftpadmin -s /bin/false sftpadmin[root@localhost ~]# passwd charles[root@localhost ~]# passwd john[root@localhost ~]# passwd sftpadmin- 分別創建對應用戶的sftp根目錄并指定為其家目錄
[root@localhost ~]# mkdir -pv /data/sftp/{charles,john}/sharemkdir: created directory `/data'mkdir: created directory `/data/sftp'mkdir: created directory `/data/sftp/charles'mkdir: created directory `/data/sftp/charles/share'mkdir: created directory `/data/sftp/john'mkdir: created directory `/data/sftp/john/share'[root@localhost ~]# usermod -d /data/sftp/ sftpadmin #可忽略[root@localhost ~]# usermod -d /data/sftp/charles/ charles #可忽略[root@localhost ~]# usermod -d /data/sftp/john/ john #可忽略- 配置sshd_config文件
[root@localhost ~]# vim /etc/ssh/sshd_config找到如下這行,用#符號注釋掉,大致在文件末尾處。 #Subsystem sftp /usr/libexec/openssh/sftp-serverSubsystem sftp internal-sftp #這行指定使用sftp服務使用系統自帶的internal-sftpMatch Group sftp #這行用來匹配sftpusers組的用戶,如果要匹配多個組,多個組之間用逗號分割; ChrootDirectory /data/sftp/%u #用chroot將用戶的根目錄指定到%h,%h代表用戶home目錄,這樣用戶就只能在用戶目錄下活動。也可用%u,%u代表用戶名。ForceCommand internal-sftp #指定sftp命令 AllowTcpForwarding noX11Forwarding noMatch user sftpadmin #匹配用戶了,多個用戶名之間也是用逗號分割ChrootDirectory /data/sftpForceCommand internal-sftpAllowTcpForwarding noX11Forwarding no- 設置Chroot目錄的權限
[root@localhost ~]# chown root:sftp /data/sftp/{charles,john} #修改普通用戶的根目錄屬組[root@localhost ~]# chmod 755 /data/sftp/{charles,john} #修改普通用戶的根目錄權限[root@localhost ~]# chown root:sftpadmin /data/sftp/ #修改管理員的根目錄屬組[root@localhost ~]# chmod 755 /data/sftp/ #修改管理員根目錄的權限[root@localhost ~]# chown sftpadmin:sftp /data/sftp/{charles,john}/share/ #修改各普通用戶下的share目錄的屬主為管理員,屬組為普通用戶組[root@localhost ~]# chmod 750 /data/sftp/{charles,john}/share/ #各share目錄管理員的權限為讀寫,sftp組僅有讀權限,其他用戶沒有權限訪問- 關閉selinux
[root@localhost ~]# vim /etc/selinux/config SELINUX=permissive[root@localhost ~]# setenforce 0- 重啟sshd服務
[root@localhost ~]# service sshd restartStopping sshd: [ OK ]Starting sshd: [ OK ]- 驗證sftp登錄
#sftpadmin 管理員登錄,能對share目錄下的文件進行讀寫操作[root@localhost ~]# sftp sftpadmin@127.0.0.1Connecting to 127.0.0.1...sftpadmin@127.0.0.1's password: sftp> lscharles john #普通用戶登錄,對share目錄下的文件只能進行讀操作[root@localhost ~]# sftp charles@127.0.0.1Connecting to 127.0.0.1...charles@127.0.0.1's password: sftp> lsshare驗證登錄出現sftp> 基本就說明了sftp服務器搭建成功了,剩下需要注意的就是權限問題了。此時也可以通過相關的ftp client 如:FileZilla FTP Client 和xftp 來連接到對應的sftp服務器了。
sftp client 連接sftp服務器
?
另外需要注意的是:ChrootDirectory的權限問題,你設定的目錄必須是root用戶所有,否則就會出現問題。所以請確保sftp用戶根目錄的所有人是root, 權限是 750 或者 755。注意以下兩點原則:
1)目錄開始一直往上到系統根目錄為止的目錄擁有者都只能是 root,用戶組可以不是 root。
2)目錄開始一直往上到系統根目錄為止都不可以具有群組寫入權限
3、設置記錄sftp服務器的登錄及操作日志
既然搭建了sftp服務器,那么通常還是需要知道哪些人在什么時候做了哪些操作,默認情況下sftp服務只會記錄相關的登錄信息,默認保存在/var/log/audit/audit.log日志下。但是默認的記錄方式并不便于管理員獲取指定的信息,因此我們可以對sftp日志進行另行的設置指定。
- 修改/etc/ssh/sshd_config
[root@localhost ~]# vim /etc/ssh/sshd_config Subsystem sftp internal-sftp -l VERBOSE -f AUTH,local5 #設置日志級別為VERBOSE,并指定日志記錄的收集設施Match Group sftpChrootDirectory /data/sftp/%uForceCommand internal-sftp -l VERBOSE #設置日志級別為VERBOSEAllowTcpForwarding noX11Forwarding noMatch user sftpadminChrootDirectory /data/sftpForceCommand internal-sftp -l VERBOSE #設置日志級別為VERBOSEAllowTcpForwarding noX11Forwarding no- 修改rsyslog.conf
[root@localhost ~]# vim /etc/rsyslog.confauth,authpriv.*,local5.* /var/log/sftp.log #設置將相關的auth、authpriv及local5相關的日志信息記錄到/var/log/sftp.log文件- 重啟sshd和rsyslog
[root@localhost ~]# service sshd restartStopping sshd: [ OK ]Starting sshd: s [ OK ][root@localhost ~]# service rsyslog restartShutting down system logger: [ OK ]Starting system logger: [ OK ]- 查看日志
[root@localhost ~]# cat /var/log/sftp.log Jul 12 15:46:46 localhost sshd[1706]: pam_unix(sshd:session): session closed for user sftpadminJul 12 15:46:49 localhost unix_chkpwd[1816]: password check failed for user (sftpadmin)Jul 12 15:46:49 localhost sshd[1814]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=10.10.10.1 user=sftpadminJul 12 15:46:50 localhost sshd[1814]: Failed password for sftpadmin from 10.10.10.1 port 61361 ssh2Jul 12 15:46:54 localhost sshd[1814]: Accepted password for sftpadmin from 10.10.10.1 port 61361 ssh2Jul 12 15:46:54 localhost sshd[1814]: pam_unix(sshd:session): session opened for user sftpadmin by (uid=0)Jul 12 15:46:54 localhost sshd[1819]: subsystem request for sftpJul 12 15:46:54 localhost sshd[1820]: session opened for local user sftpadmin from [10.10.10.1]Jul 12 15:46:54 localhost sshd[1820]: received client version 4Jul 12 15:46:54 localhost sshd[1820]: realpath "."Jul 12 15:46:54 localhost sshd[1820]: opendir "/"Jul 12 15:46:54 localhost sshd[1820]: closedir "/"Jul 12 15:46:55 localhost sshd[1820]: realpath "/charles"Jul 12 15:46:55 localhost sshd[1820]: opendir "/charles"Jul 12 15:46:55 localhost sshd[1820]: closedir "/charles"Jul 12 15:46:56 localhost sshd[1820]: realpath "/charles/share"Jul 12 15:46:56 localhost sshd[1820]: opendir "/charles/share"Jul 12 15:46:56 localhost sshd[1820]: closedir "/charles/share"Jul 12 15:46:58 localhost sshd[1820]: open "/charles/share/New File" flags WRITE,CREATE,TRUNCATE mode 0666Jul 12 15:46:58 localhost sshd[1820]: close "/charles/share/New File" bytes read 0 written 0Jul 12 15:46:58 localhost sshd[1820]: realpath "/charles/share"Jul 12 15:46:58 localhost sshd[1820]: opendir "/charles/share"Jul 12 15:46:58 localhost sshd[1820]: closedir "/charles/share"Jul 12 15:47:01 localhost sshd[1820]: rename old "/charles/share/New File" new "/charles/share/testfile"[root@localhost ~]#在進行了相關的sftp服務器操作后,查看相應的sftp.log,能查看到相應的登錄信息及操作日志,此時對于管理員排查來說就比之前方便了。
4、限制ssh連接的訪問Ip
[root@localhost ~]# vim /etc/ssh/sshd_config # Authentication:AllowUsers root@10.10.10.* #限制root用戶只能通過10.10.10.*網段登錄訪問AllowUsers charles@10.10.10.* #限制charles用戶只能通過10.10.10.*網段登錄訪問AllowUsers john@10.10.10.*5、sftp的密鑰認證
- 將對應用戶的家目錄更改回默認路徑并修改其屬主和屬組權限:
[root@localhost ~]# usermod -d /home/charles/ charles- 創建密鑰對
[root@localhost ~]# mkdir /home/charles/.ssh[root@localhost ~]# ssh-keygen -t rsaGenerating public/private rsa key pair.Enter file in which to save the key (/root/.ssh/id_rsa): #默認保存路徑Enter passphrase (empty for no passphrase): Enter same passphrase again: #輸入密鑰認證密碼Your identification has been saved in /root/.ssh/id_rsa.Your public key has been saved in /root/.ssh/id_rsa.pub.The key fingerprint is:9f:76:8f:e0:a3:68:ae:38:34:cf:7c:7d:b0:0d:77:d3 root@localhost.localdomainThe key's randomart image is:+--[ RSA 2048]----+| || || || || S . || o o...o E || . = . *=... || ..+ o.oo+o o || ...=o .o... . |+-----------------+[root@localhost ~]# cp /root/.ssh/id_rsa.pub /home/charles/.ssh/authorized_keys #將公鑰保存為指定用戶的家目錄下的authorized_keys,額外的keys可通過cat追加到authorized_keys中[root@localhost ~]# chown -R charles.sftp /home/charles #修改對應家目錄的屬主和屬組 [root@localhost ~]# service sshd restart #最后重啟sshd服務- 測試密鑰登錄sftp
[root@localhost ~]# sftp -oIdentityFile=/root/.ssh/id_rsa charles@10.10.10.11Connecting to 10.10.10.11...Enter passphrase for key '/root/.ssh/id_rsa': sftp> lsshare如上圖所示,輸入了密鑰認證的密碼后,應該能正常登錄到sftp服務中。
?
總結
- 上一篇: 机器学习系列全集,301页PDF精心整理
- 下一篇: android 华为 imei,华为手机