sftp全称:Secure File Transfer Protocol,与ftp有着一样的功能和语法。sftp是ssh的一部分,同样使用22端口。
目标
本篇文章以centos系统为例,搭建一个sftp服务,使用的账号是 ftpuser,该账号使用sftp客户端软件登录后的根目录为:/opt/sftp,该账号只能访问 /opt/sftp 及其子目录,对子目录有读写权限,对 /opt/sftp仅有访问权限。
账号:ftpuser
根目录:/opt/sftp
读写目录:/opt/sftp/doc
添加账号
已经添加了账号的话直接略过。该账号只能使用sftp客户端登录,不能ssh到服务器。
useradd ftpuser -s /sbin/nologin
#设置密码
passwd ftpuser
配置 /etc/ssh/sshd_config
修改或增加配置如下
UsePAM yes
Subsystem sftp internal-sftp
Match User ftpuser
ChrootDirectory /opt/sftp/
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
如果需要配置多个账号,只需要重复以下配置就好了(或者使用 Match Group xx)
Match User ftpuser
ChrootDirectory /opt/sftp/
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
具体上面的配置什么意思,还不清楚。
ChrootDirectory 指定登录后的根目录,并且将用户限制在该目录及其子目录下。
这里有条规则
1、由 ChrootDirectory 指定的目录开始一直往上到系统根目录为止的目录拥有者都只能是 root
2、由 ChrootDirectory 指定的目录开始一直往上到系统根目录为止都不可以具有群组写入权限(最大权限 755)
在本实例中,opt 和 sftp 这两个目录的属主都是 root,属组合其他用户都没有写权限
创建目录
mkdir -p /opt/sftp
#设置属主和属组,本例都是root
chown root:root /opt /opt/sftp
#设置权限
chmod 755 /opt /opt/sftp
mkdir /opt/sftp/doc
chown ftpuser:root /opt/sftp/doc
chmod 755 /opt/sftp/doc
由于目录 sftp 只有root才有写的权限,而我们登录的用户是 ftpuser,所以我们对 sftp只有读的权限,没有写的权限,ftp账号登录后只能操作sftp目录的子目录,所以此处将 doc 目录的属主设置为 ftpuser,并设置属主的权限为 rwx。
注意: 由于 ChrootDirectory 的两条规则限制,我们不可能对 ChrootDirectory 指定的目录有写的权限,所以只能在其子目录下操作