搭建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 -V
OpenSSH_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}/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服务使用系统自带的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
- 设置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 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
验证登录出现sftp>
基本就说明了sftp服务器搭建成功了,剩下需要注意的就是权限问题了。此时也可以通过相关的ftp client 如:FileZilla FTP Client 和xftp 来连接到对应的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 sftp
ChrootDirectory /data/sftp/%u
ForceCommand internal-sftp -l VERBOSE #设置日志级别为VERBOSE
AllowTcpForwarding no
X11Forwarding no
Match user sftpadmin
ChrootDirectory /data/sftp
ForceCommand internal-sftp -l VERBOSE #设置日志级别为VERBOSE
AllowTcpForwarding no
X11Forwarding no
- 修改rsyslog.conf
[root@localhost ~]# vim /etc/rsyslog.conf
auth,authpriv.*,local5.* /var/log/sftp.log #设置将相关的auth、authpriv及local5相关的日志信息记录到/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 ~]#
在进行了相关的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 rsa
Generating 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.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 #修改对应家目录的属主和属组
[root@localhost ~]# service sshd restart #最后重启sshd服务
- 测试密钥登录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
如上图所示,输入了密钥认证的密码后,应该能正常登录到sftp服务中。
此时可以将/root/.ssh/id_rsa 复制出来,导入到相关的ssh或sftp连接客户端即可实现相关的密钥登录,如:
sftp服务密钥认证1 sftp服务密钥认证2sftp服务密钥认证3 sftp服务密钥认证4