在 Linux 中为非 SSH 用户配置 SFTP 环境

Linux系统 gongyj 1922℃ 已收录 0评论

SFTP(SSH File Transfer Protocol)是 SSH 2.0 的一项扩展协议,提供安全的文件访问、文件传输和文件管理功能。SFTP 协议的目标是通过任何可靠的数据流提供安全的文件传输功能,本身不提供验证和安全,需要依赖底层协议。SFTP 协议虽然在 SSH2 协议中描述,但它是通用的,独立于 SSH2 套件中的其余协议。SFTP 常作为 SSH2.0 实现的一个子系统。

SFTP 除了也有文件传输功能,有相似的命令集外,与 FTP 是无关的。与标准 FTP 不同,它加密命令和数据,以防止在网络上明文传输密码和敏感信息。功能上与 FTP 相似,但由于使用了不同的协议,不能使用标准的 FTP 客户端与 SFTP 服务器通讯,也不能使用 SFTP 客户端与 FTP 服务器通讯。

SFTP 是二进制协议,所有的命令(请求)都打包成二进制消息后发送到服务器,服务器回复二进制应答包。 与早期的仅支持文件传输的 SCP 协议(SSH1.x中的)相比,SFTP 协议支持更广泛的远程文件操作。SFTP 客户端增加的额外功能包括:恢复中断的传输、目录列表、远程文件删除。SFTP 服务器支持大多数平台。SSH1 是过时的,不安全的,不推荐使用。

FTPS 和 SFTP 相同点在于都组合使用了对称加密算法(DES/3DES,AES等)、非对称加密算法(RSA,DSA)和密钥交换算法。不同之处在于他们的验证方式,FTPS 使用 X.509 证书验证,而 SFTP 使用 SSH 密钥。X.509 证书包含公钥和证书持有者信息,通过这些信息,另一方可以校验证书本身的完整性和验证证书持有者。SSH 密钥仅包含公钥。 

SSH 服务器提供了如下 3 种验证方式:

1、密码验证

2、密钥验证

3、密码加密钥验证

关于验证方式的选择,推荐使用密钥验证,其安全性高于单纯的密码验证。

在 CentOS 系统中,所有个人用户默认都可以使用 SSH 登录和 SFTP 登录。如果想禁止这 2 种行为,可以编辑 SSH 服务的配置文件 /etc/ssh/sshd_config ,添加内容如下:

# 禁止用户user1登陆,多个用户空格分隔
DenyUsers user1
# 禁止用户组group1的所有用户登录,多个空格分隔
DenyGroups group1

完成上面的配置后,就可以禁止用户或用户组的用户进行 远程 SSH 登录 与 SFTP登录了。

但在某些环境中,系统管理员想要允许极少数用户在可以传输文件到 Linux 机器中,但是不允许使用 SSH。要实现这一目的,我们可以使用 SFTP,并为其构建 chroot 环境。当我们为 SFTP 配置 chroot 环境后,只有被许可的用户可以访问,并被限制到他们的家目录中,换言之:被许可的用户将处于牢笼环境中,在此环境中它们甚至不能切换它们的目录。

配置步骤如下:

1、创建组:

groupadd  sftp_users

2、新建用户并配置附属组(sftp_users)

useradd  -G sftp_users  -s /sbin/nologin  test1
passwd test1

对于已经存在的用户,可以使用 usermod 命令进行修改就可以了,或者直接编辑 passwd 与 group 文件:

usermod -G sftp_users  -s /sbin/nologin test1

如果想要修改 home 目录,使用 -d 参数就行修改,目录的权限也要修改好。

3、修改 SSH 配置文件

 vim /etc/ssh/sshd_config
#Subsystem       sftp    /usr/libexec/openssh/sftp-server    #注释掉该行配置,添加下面一行,并在文件尾添加和修改下面的内容
Subsystem        sftp    internal-sftp

Match Group sftp_users                                       #组名,单个用户可以 Match user 用户名。
X11Forwarding no                                             #是否允许进行 X11 转发,配置文件中设为了 YES,改成默认值 NO。
AllowTcpForwarding no                                        #指定是否允许转发 TCP 协议,默认是 YES。
ChrootDirectory %h                                           #指定用户验证后用于 chroot 环境的路径(默认是改用户的家目录)。
ForceCommand internal-sftp                                   #强制执行内部 sftp,并忽略任何~/.ssh/rc文件中的命令。

4、修改目录权限

chmod 755 /home/test1
chown root /home/test1

然后重启一下 SSH 服务,就可以使用了。

目录权限设置上要遵循2点:

ChrootDirectory 设置的目录权限及其所有的上级文件夹权限,属主必须是 root;

ChrootDirectory 设置的目录权限及其所有的上级文件夹权限,只有属主能拥有写权限,权限最大设置只能是755。

如果不能遵循以上 2 点,即使是该目录仅属于某个用户,也可能会影响到所有的 SFTP 用户,如下边错误提示:

sftp test1@192.168.100.254
Connecting to 192.168.100.254...
test1@192.16.100.254's password:
Write failed: Broken pipe
Couldn't read packet: Connection reset by peer

修改权限后,用户对 home 目录就没有写入权限,如果你想要允许 test1 用户上传文件,那么创建一个上传文件夹,设置权限如下:

mkdir /home/test1/upload
chown test1. /home/test1/upload

5、访问系统测试

尝试通过 ssh 访问系统:

[root@localhost ~]# ssh test1@192.168.100.254
test1@192.168.100.254's password:
This service allows sftp connections only.
Connection to 192.168.100.254 closed.
[root@localhost ~]#


可以看到,现在 test1 用户,已经不能 ssh 远程登录服务器了,并提示只允许 sftp。
测试 sftp 登录:

[root@localhost ~]# sftp test1@192.168.100.254
Connecting to 192.168.100.254...
test1@192.168.100.254's password:
sftp> ls
upload    yp.conf   yum.conf
sftp> cd /etc
Couldn't canonicalise: No such file or directory
sftp> cd upload
sftp> put install.log
Uploading install.log to /upload/install.log
install.log                                                  100%   39KB  39.1KB/s   00:00
sftp> ls
bak.tar.gz   install.log
sftp> get bak.tar.gz
Fetching /upload/bak.tar.gz to bak.tar.gz
/upload/bak.tar.gz                                           100%  176MB  11.0MB/s   00:16

可以看到,test1 用户可以通过 sftp 登录,而且 chroot 环境不能切换目录,被限制在用户的家目录下。在进行上传和下载测试过程中,也都可以正常使用。使用 sftp 时,如果 ssh 端口号不是默认的 22 ,则使用 -oPort 参数即可,如:sftp -oPort=1612 test1@192.168.100.254 。

本站文章如未注明,均为原创丨本网站采用BY-NC-SA协议进行授权,转载请注明转自:http://blog.chopmoon.com/favorites/230.html
喜欢 (1)
发表我的评论
取消评论

表情 代码 贴图 加粗 链接 私信 删除线 签到

Hi,请填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
正在加载中……