Linux配置SFTP
需求:配置多个SFTP用户,对应不同的SFTP路径
1. 创建sftp根目录
比如我配置 /data/sftp_data
为sftp
根目录,之后每个用户都对应,该目录下的子目录
mkdir /data/sftp_data
2. 创建组
因为有多个 sftp 用户,所以需要建立一个组为sftp
,专门管理 sftp 用户
groupadd sftp
3. 创建用户
3.1 创建用户
useradd -m -d /data/sftp_data/user1 -s /usr/sbin/nologin -g sftp user1
-m:自动创建 home 目录
-d:指定 home 目录为 /data/sftp_data/user1
-s:shell 为 /usr/sbin/nologin 禁止用户使用SSH登录,仅用于 SFTP
-g:指定组为 sftp
3.2 配置用户密码
passwd user1
4. 配置SSH
4.1 修改/etc/ssh/sshd_config
vim /etc/ssh/sshd_config
注释Subsystem sftp /usr/lib/openssh/sftp-server
新增Subsystem sftp internal-sftp
,表示sftp服务使用系统自带的internal-sftp
文件最后面新增内容:
Match Group sftp # 匹配组,多个组用逗号分隔
ChrootDirectory %h # 指定用户根目录。%h表示用户home目录,%u表示用户名
X11Forwarding no # 禁止X11转发
AllowTcpForwarding no # 禁止TCP转发
ForceCommand internal-sftp # 强制使用系统internal-sftp
也可以
Match User 用户名
,这样就可以单独为指定用户做配置
4.2 重启SSH
service ssh restart
5. 配置目录权限
在第4
步,指定了ChrootDirectory
,而ChrootDirectory
权限要求有以下两点:
ChrootDirectory
指定的目录及该目录到系统根目录为止,目录拥有者都只能是root
ChrootDirectory
指定的目录及该目录到系统根目录为止,群组用户不能有写入权限
因此/data
、/data/sftp_data
、/data/sftp_data/user1
的拥有者必须为root
,且权限为755
。
因为我的
/data
目录下有别的数据,所以我分别改权限
chown root:root /data
chown -R root:root /data/sftp_data
chmod 755 /data
chmod -R 755 /data/sftp_data
如果没有按照以上规则配置权限,则用户连接sftp会失败,且有类似以下错误:
user1@127.0.0.1's password:
packet_write_wait: Connection to 127.0.0.1 port 22: Broken pipe
Connection closed
6. 测试sftp连接
sftp user1@127.0.0.1
7. sftp上传
这个时候用户访问的是配置好的,仅对于该用户的sftp根目录,但这个目录是没有写入权限的
比如user1
连接sftp后,用户看到的是/
,对应实际机器上的 /data/sftp_data/user1
,因此如果用户需要上传文件的话,需要在用户sftp根目录下建立一个所有者为该用户的目录,比如:
mkdir /data/sftp_data/user1/upload
chown user1:sftp /data/sftp_data/user1/upload
此时用户登录sftp后,就可以将文件上传到upload
目录下了
8. 配置多个用户
由于/etc/ssh/sshd_config
已经配置为Match Group sftp
,所以之后新增用户,仅需要将新增用户归属组为sftp
即可,而不需要每次都配置/etc/ssh/sshd_config
,也不需要每次都重启ssh