Linux

搭建sftp服务器

2018-07-16  本文已影响1826人  小尛酒窝

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服务器了。

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 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服务密钥认证2
sftp服务密钥认证3 sftp服务密钥认证4
上一篇 下一篇

猜你喜欢

热点阅读