1怕品、前言
sftp可以為傳輸文件提供一種安全的網(wǎng)絡(luò)的加密方法妇垢。sftp 與 ftp 有著幾乎一樣的語法和功能。SFTP 為 SSH的其中一部分肉康,是一種傳輸檔案至 Blogger 伺服器的安全方式闯估。其實在SSH軟件包中,已經(jīng)包含了一個叫作SFTP(Secure File Transfer Protocol)的安全文件信息傳輸子系統(tǒng)吼和,SFTP本身沒有單獨的守護進程涨薪,它必須使用sshd守護進程(端口號默認(rèn)是22)來完成相應(yīng)的連接和答復(fù)操作,所以從某種意義上來說纹安,SFTP并不像一個服務(wù)器程序尤辱,而更像是一個客戶端程序。SFTP同樣是使用加密傳輸認(rèn)證信息和傳輸?shù)臄?shù)據(jù)厢岂,所以光督,使用SFTP是非常安全的。但是塔粒,由于這種傳輸方式使用了加密/解密技術(shù)结借,所以傳輸效率比普通的FTP要低得多,如果您對網(wǎng)絡(luò)安全性要求更高時卒茬,可以使用SFTP代替FTP船老。
2咖熟、搭建sftp服務(wù)器
系統(tǒng)背景:Centos 6.10
需求:創(chuàng)建三個用戶,其中一個為sftp管理員柳畔,其余兩個分別為指定目錄的訪問用戶馍管。sftp管理員對其他用戶的sftp根目錄下的內(nèi)容具有讀寫權(quán)限,限制其他用戶只能訪問其自己的根目錄且僅有讀權(quán)限薪韩;相關(guān)的sftp用戶不能登錄到Linux系統(tǒng)中确沸。
- 確認(rèn)openssh的版本
[root@localhost ~]# ssh -V
OpenSSH_5.3p1, OpenSSL 1.0.1e-fips 11 Feb 2013
使用上述命令查看openssh的版本,要求版本高于4.8p1俘陷,低于此版本需升級罗捎。
- 創(chuàng)建sftp管理組及用戶組
[root@localhost ~]# groupadd sftpadmin
[root@localhost ~]# groupadd sftp
- 創(chuàng)建sftp管理用戶及普通用戶
[root@localhost ~]# useradd -g sftp -s /bin/false charles #/bin/false也可以替換為/sbin/nologin,目的是不允許該用戶登錄到系統(tǒng)中
[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
- 分別創(chuàng)建對應(yīng)用戶的sftp根目錄并指定為其家目錄
[root@localhost ~]# mkdir -pv /data/sftp/{charles,john}/share
mkdir: 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-server
Subsystem sftp internal-sftp #這行指定使用sftp服務(wù)使用系統(tǒng)自帶的internal-sftp
Match Group sftp #這行用來匹配sftpusers組的用戶捉偏,如果要匹配多個組倒得,多個組之間用逗號分割;
ChrootDirectory /data/sftp/%u #用chroot將用戶的根目錄指定到%h告私,%h代表用戶home目錄屎暇,這樣用戶就只能在用戶目錄下活動。也可用%u驻粟,%u代表用戶名根悼。
ForceCommand internal-sftp #指定sftp命令
AllowTcpForwarding no
X11Forwarding no
Match user sftpadmin #匹配用戶了,多個用戶名之間也是用逗號分割
ChrootDirectory /data/sftp
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
- 設(shè)置Chroot目錄的權(quán)限
[root@localhost ~]# chown root:sftp /data/sftp/{charles,john} #修改普通用戶的根目錄屬組
[root@localhost ~]# chmod 755 /data/sftp/{charles,john} #修改普通用戶的根目錄權(quán)限
[root@localhost ~]# chown root:sftpadmin /data/sftp/ #修改管理員的根目錄屬組
[root@localhost ~]# chmod 755 /data/sftp/ #修改管理員根目錄的權(quán)限
[root@localhost ~]# chown sftpadmin:sftp /data/sftp/{charles,john}/share/ #修改各普通用戶下的share目錄的屬主為管理員蜀撑,屬組為普通用戶組
[root@localhost ~]# chmod 750 /data/sftp/{charles,john}/share/ #各share目錄管理員的權(quán)限為讀寫挤巡,sftp組僅有讀權(quán)限,其他用戶沒有權(quán)限訪問
- 關(guān)閉selinux
[root@localhost ~]# vim /etc/selinux/config
SELINUX=permissive
[root@localhost ~]# setenforce 0
- 重啟sshd服務(wù)
[root@localhost ~]# service sshd restart
Stopping sshd: [ OK ]
Starting sshd: [ OK ]
- 驗證sftp登錄
#sftpadmin 管理員登錄酷麦,能對share目錄下的文件進行讀寫操作
[root@localhost ~]# sftp sftpadmin@127.0.0.1
Connecting to 127.0.0.1...
sftpadmin@127.0.0.1's password:
sftp> ls
charles john
#普通用戶登錄矿卑,對share目錄下的文件只能進行讀操作
[root@localhost ~]# sftp charles@127.0.0.1
Connecting to 127.0.0.1...
charles@127.0.0.1's password:
sftp> ls
share
驗證登錄出現(xiàn)sftp>
基本就說明了sftp服務(wù)器搭建成功了,剩下需要注意的就是權(quán)限問題了沃饶。此時也可以通過相關(guān)的ftp client 如:FileZilla FTP Client 和xftp 來連接到對應(yīng)的sftp服務(wù)器了母廷。
另外需要注意的是:ChrootDirectory的權(quán)限問題,你設(shè)定的目錄必須是root用戶所有糊肤,否則就會出現(xiàn)問題琴昆。所以請確保sftp用戶根目錄的所有人是root, 權(quán)限是 750 或者 755。注意以下兩點原則:
1)目錄開始一直往上到系統(tǒng)根目錄為止的目錄擁有者都只能是 root馆揉,用戶組可以不是 root业舍。
2)目錄開始一直往上到系統(tǒng)根目錄為止都不可以具有群組寫入權(quán)限
3、設(shè)置記錄sftp服務(wù)器的登錄及操作日志
既然搭建了sftp服務(wù)器,那么通常還是需要知道哪些人在什么時候做了哪些操作舷暮,默認(rèn)情況下sftp服務(wù)只會記錄相關(guān)的登錄信息态罪,默認(rèn)保存在/var/log/audit/audit.log日志下。但是默認(rèn)的記錄方式并不便于管理員獲取指定的信息下面,因此我們可以對sftp日志進行另行的設(shè)置指定复颈。
- 修改/etc/ssh/sshd_config
[root@localhost ~]# vim /etc/ssh/sshd_config
Subsystem sftp internal-sftp -l VERBOSE -f AUTH,local5 #設(shè)置日志級別為VERBOSE,并指定日志記錄的收集設(shè)施
Match Group sftp
ChrootDirectory /data/sftp/%u
ForceCommand internal-sftp -l VERBOSE #設(shè)置日志級別為VERBOSE
AllowTcpForwarding no
X11Forwarding no
Match user sftpadmin
ChrootDirectory /data/sftp
ForceCommand internal-sftp -l VERBOSE #設(shè)置日志級別為VERBOSE
AllowTcpForwarding no
X11Forwarding no
- 修改rsyslog.conf
[root@localhost ~]# vim /etc/rsyslog.conf
auth,authpriv.*,local5.* /var/log/sftp.log #設(shè)置將相關(guān)的auth诸狭、authpriv及l(fā)ocal5相關(guān)的日志信息記錄到/var/log/sftp.log文件
- 重啟sshd和rsyslog
[root@localhost ~]# service sshd restart
Stopping sshd: [ OK ]
Starting sshd: s [ OK ]
[root@localhost ~]# service rsyslog restart
Shutting 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 sftpadmin
Jul 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=sftpadmin
Jul 12 15:46:50 localhost sshd[1814]: Failed password for sftpadmin from 10.10.10.1 port 61361 ssh2
Jul 12 15:46:54 localhost sshd[1814]: Accepted password for sftpadmin from 10.10.10.1 port 61361 ssh2
Jul 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 sftp
Jul 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 4
Jul 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 0666
Jul 12 15:46:58 localhost sshd[1820]: close "/charles/share/New File" bytes read 0 written 0
Jul 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 ~]#
在進行了相關(guān)的sftp服務(wù)器操作后券膀,查看相應(yīng)的sftp.log君纫,能查看到相應(yīng)的登錄信息及操作日志驯遇,此時對于管理員排查來說就比之前方便了。
4蓄髓、限制ssh連接的訪問Ip
[root@localhost ~]# vim /etc/ssh/sshd_config
# Authentication:
AllowUsers root@10.10.10.* #限制root用戶只能通過10.10.10.*網(wǎng)段登錄訪問
AllowUsers charles@10.10.10.* #限制charles用戶只能通過10.10.10.*網(wǎng)段登錄訪問
AllowUsers john@10.10.10.*
5叉庐、sftp的密鑰認(rèn)證
- 將對應(yīng)用戶的家目錄更改回默認(rèn)路徑并修改其屬主和屬組權(quán)限:
[root@localhost ~]# usermod -d /home/charles/ charles
- 創(chuàng)建密鑰對
[root@localhost ~]# mkdir /home/charles/.ssh
[root@localhost ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): #默認(rèn)保存路徑
Enter passphrase (empty for no passphrase):
Enter same passphrase again: #輸入密鑰認(rèn)證密碼
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.localdomain
The 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 #修改對應(yīng)家目錄的屬主和屬組
[root@localhost ~]# service sshd restart #最后重啟sshd服務(wù)
- 測試密鑰登錄sftp
[root@localhost ~]# sftp -oIdentityFile=/root/.ssh/id_rsa charles@10.10.10.11
Connecting to 10.10.10.11...
Enter passphrase for key '/root/.ssh/id_rsa':
sftp> ls
share
如上圖所示会喝,輸入了密鑰認(rèn)證的密碼后陡叠,應(yīng)該能正常登錄到sftp服務(wù)中。
此時可以將/root/.ssh/id_rsa 復(fù)制出來肢执,導(dǎo)入到相關(guān)的ssh或sftp連接客戶端即可實現(xiàn)相關(guān)的密鑰登錄枉阵,如: