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

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
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,193评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,306评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,130评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,110评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,118评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,085评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,007评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,844评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,283评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,508评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,395评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,985评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,630评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,797评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,653评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,553评论 2 352

推荐阅读更多精彩内容

  • 1、查看openssh的版本 使用ssh -v 命令来查看openssh的版本,版本必须大于4.8p1,低于的这个...
    ByeBuy阅读 4,131评论 1 4
  • 1、远程连接服务器 远程连接服务器对于管理员来说,是一个很有用的操作。它使得对服务器的管理更为方便。不过方便归方便...
    Zhang21阅读 39,492评论 0 20
  • 加密算法 对称加密算法 加密和解密使用同一个密钥 DES、3DES、AES、Blowfish、Twofish、ID...
    毛利卷卷发阅读 1,577评论 0 4
  • 原文链接 之前两篇文章利用SSH代理访问内网资源和使用SSH代理在本地开发环境调试各种回调两篇文章,介绍了ssh的...
    冯宇Ops阅读 12,879评论 1 3
  • 两人世界本来只是个很小的圈,当其中一个人开始膨胀时,圈就越变越大,直到撑出了一个缺口,让其他东西混了进来。 01 ...
    雾岛翔介阅读 990评论 0 51