为什么使用 sftp?
1. 基于 ssh 协议,保证数据安全性
2. 大多数防火墙不会阻止 ssh 协议
3. 完全基于文件系统权限对用户进行管理
4. 配置比 vsftpd 简单
另外,我在集成商工作服务于各大甲方,在厦门的一些企业,如:金融财务公司、银行等等绝大多数已经不再使用 ftp 协议来传输文件,转而采用 sftp 进行多个单位之间的文件传输。
需求如下
1. ftp 工作目录设置为 /sftp 并且所有用户被锁定在该目录下无法切换出去
2. 所有 sftp 用户登录后会默认位于为 /sftp/<username>/home 目录下,并且用户没有权限进入其他用户的目录
3. 设置共享目录为 /sftp/public 允许所有 ftp 用户上传文件,但不能删除其他人的文件
4. 设置团队协作目录为 /sftp/teamwork 允许所有 ftp 用户在里面上传、修改、删除文件
5. 限制所有使用 sftp 登录的用户无法登录到 bash
配置步骤
▶ 1. 创建用户组:sftpusers 并创建2个用户:ftpuser01 和 ftpuser02 加入到该用户组
*注意:所有要使用 sftp 登录的用户都要加入到该组,才能实现 "锁定目录" 功能。
# groupadd sftpusers
# adduser ftpuser01 -G sftpusers
# adduser ftpuser02 -G sftpusers
▶ 2. 为这两个用户配置密码,该密码用于 sftp 登录
# echo "123456" | passwd --stdin ftpuser01
Changing password for user ftpuser01.
passwd: all authentication tokens updated successfully.
# echo "123456" | passwd --stdin ftpuser02
Changing password for user ftpuser02.
passwd: all authentication tokens updated successfully
▶ 3. 为这两个用户创建 sftp 目录
# mkdir -p /sftp/ftpuser01/home
# mkdir -p /sftp/ftpuser02/home
▶ 4. 为这两个用户的 sftp 目录配置对应的权限,将所属用户和组改为对应用户名,然后修改权限为:770,这样其他用户就没有权限访问自己的目录
# chown -R ftpuser01:ftpuser01 /sftp/ftpuser01
# chown -R ftpuser02:ftpuser02 /sftp/ftpuser02
# chmod -R 770 /sftp/ftpuser01
# chmod -R 770 /sftp/ftpuser02
▶ 5. 修改 sshd 配置文件 /etc/ssh/sshd_config 在该文件的最后几行,修改并添加以下内容
#Subsystem sftp /usr/libexec/openssh/sftp-server <-- 注释掉原本这一行
Subsystem sftp internal-sftp -d %u/home <-- 新增这一行,用于指定用户登录后位于的目录
Match Group sftpusers <-- 新增这一行,用于匹配 sftpusers 组的用户
ChrootDirectory /sftp <-- 新增这一行,用于限制用户不能离开 /sftp 目录
▶ 6. 重启 sshd 服务以生效配置
# systemctl restart sshd
▶ 7. 使用 WinSCP 进行连接并测试。在界面中,文件协议选择【SFTP】,主机名填写服务器的IP地址,然后填写用户名 ftpuser01 以及密码
测试上传文件是否正常
尝试切换到最外层目录,只能看到2个ftp用户的目录,无法再切换出去了
使用 ftpuser01 用户,尝试进入 ftpuser02 的目录,会提示权限被拒绝,因为没有进入该目录的权限,这符合我们最初的设计
▶ 8. 创建团队协作目录和共享目录
# mkdir -p /sftp/teamwork # mkdir -p /sftp/public
▶ 9. 为团队协作目录配置权限,所属用户为 root,组用户为 sftpusers,设置 sgid 特殊权限使得该目录下创建的文件自动继承父目录的所属组用户
# chown root:sftpusers /sftp/teamwork # chmod 2770 /sftp/teamwork
▶ 10. 为共享目录配置相关权限,由于是共享目录,所以任何人都有最高的权限,但需要设置 stick bit 特殊权限位使用户只能删除自己的文件而不能删除不属于自己的文件
# chmod 1777 /sftp/public
▶ 11. 继续使用 WinSCP 连接到服务器上,以 ftpuser01 身份进行连接。进入 teamwork 目录,创建一个文件并写入内容
进入 public 目录,也创建一个文件
以 ftpuser02 身份登录到 sftp 服务器,并切换到最外层目录
进入到 teamwork 目录下,可以看到【user01文件】,尝试打开并追加一些内容,保存的时候提示 "无法覆盖文件,但可以删除后创建新文件替代",但这样做文件就属于 ftpuser02 了,这里我们不这么做,点击【跳过】
这是因为默认情况下,ftpuser01 用户创建出来的文件,组权限只有 r (只读)的权限
ftpuser01 可以自行修改该文件的组权限,增加 w(写)权限即可
现在再次使用 ftpuser02 用户,再次尝试追加内容到该文件
虽然提示报错,但是显示上传成功,可以在 WinSCP 设置中忽略该错误即可,按照下图进行配置即可
再次使用 ftpuser02 用户追加内容到 teamwork 目录下的【user01文件】,这次可以直接保存并且不会报错
使用 ftpuser02 用户删除 teamwork 目录下【user01文件】,文件可以直接被删除,这符合团队协作目录的功能
使用 ftpuser02 用户进入 public 目录,尝试删除 ftpuser01 创建的【user01文件】,会提示禁止删除,因为该目录被配置了粘滞位