提示:为保证文章的正确性和实用性,文章内容可能会不定时优化改进,若您有建议或者文章存在错误请私信留言或评论指正💖😊💖。下面以Ubuntu22.04操作系统为例,介绍具体的操作步骤,如果本文对你有帮助,记得关注加收藏🤞。
1、文章前言
本文以Ubuntu22.04系统为例,介绍如何在Linux环境中,根据用户数据隔离性需求,配置独立或共享目录的sftp服务。
2、服务介绍
SFTP(SSH File Transfer Protocol)是一种通过SSH(Secure Shell)进行安全传输文件的协议。由于SFTP是基于SSH的,所以SFTP使用SSH的TCP22端口进行数据传输,具备了SSH的安全性和数据加密功能来保护文件传输过程中的数据安全。
3、操作步骤
3.1、规划配置sftp全局数据存储目录
在配置sftp之前,首先要规划并配置好sftp数据存储目录。在生产环境使用中,建议为sftp数据存储目录单独挂载一个lvm逻辑卷,而不是直接挂载使用磁盘分区,使用逻辑卷的好处是方便后期动态调整sftp数据存储目录空间大小,以及对数据进行快照等操作。
步骤一: 如下图,请参考【Liunx常用操作】LVM逻辑卷的介绍和相关操作(创建、删除、扩缩容)章节中的“创建并挂载逻辑卷”步骤,完成sftp数据存储目录的创建和挂载。注意:sftp数据存储目录的所属用户和组要配置为“root:root”,权限配置为755
3.2、配置sftp用户独立目录的sftp服务
3.2.1、创建并配置sftp用户
步骤一: 执行以下命令,创建用户组“sftpusers”。
sudo groupadd -f sftpusers
步骤二: 执行以下命令,创建用户“zhangsan、lisi”,并指定用户所属组为“sftpusers”。
sudo useradd -g sftpusers zhangsan sudo useradd -g sftpusers lisi
步骤三: 执行以下命令,并根据提示,设置用户“zhangsan、lisi”的密码。
sudo passwd zhangsan sudo passwd lisi
步骤四: 执行以下命令,设置用户“zhangsan、lisi”的密码为永不过期。
sudo chage -m 0 -M 99999 -I -1 -E -1 zhangsan sudo chage -m 0 -M 99999 -I -1 -E -1 lisi
步骤五: 执行以下命令,创建用户“zhangsan、lisi”同名目录以及数据存储目录“data”。
sudo mkdir -p /sftpdata/zhangsan/data sudo mkdir -p /sftpdata/lisi/data
步骤六: 执行以下命令,将“zhangsan、lisi”数据存储目录“data”的所属用户和用户组分别配置为“zhangsan:sftpusers”和“lisi:sftpusers”。
sudo chown zhangsan:sftpusers /sftpdata/zhangsan/data/ sudo chown lisi:sftpusers /sftpdata/lisi/data/
步骤七: 执行以下命令,分别修改用户“zhangsan、lisi”的主目录为“/sftpdata/zhangsan”和“/sftpdata/lisi”。
sudo usermod -d /sftpdata/zhangsan/ zhangsan sudo usermod -d /sftpdata/lisi/ lisi
3.2.2、配置sshd_config文件
步骤一: 执行以下命令,查看系统内是否安装openssh-server服务。
apt list |grep openssh-server
或者
dpkg --get-selections |grep openssh-server
步骤二: 若已安装openssh-server服务,则执行步骤三配置sftp服务相关参数。若未安装openssh-server服务,则参考【Liunx常用操作】Ubuntu Server系统配置软件源章节,配置软件源并安装openssh-server服务后,再执行下面步骤。
步骤三: 执行以下命令,编辑sftp的配置文件“/etc/ssh/sshd_config”。
sudo vim /etc/ssh/sshd_config
步骤四: 按住“Shift”+“g”键,将光标移动至配置文件最后一行,按“o”另起一行进入插入模式,并根据下表描述,复制以下内容至配置文件末尾,修改参数值为实际环境需求。
针对用户生效的sftp配置模板:
Match User zhangsan ChrootDirectory /sftpdata/zhangsan ForceCommand internal-sftp PermitTunnel no AllowTcpForwarding no Match User lisi ChrootDirectory /sftpdata/lisi ForceCommand internal-sftp
参数 | 值 | 说明 |
---|---|---|
Match | User xxx或者Group xxx | 引入一个条件块,条件块以Match开始,以另一个Match或者文件结尾结束。Match下面的配置项针对当前Match的值生效,且比全局设置的参数优先。如果存在一个值满足多个Match,则针对该值只生效第一个Match下的参数 |
ChrootDirectory | 目录 | 将sftp用户限制在指定的目录中,用户将无法访问该目录之外的文件系统目录 |
ForceCommand | internal-sftp或者cvs server或者命令脚本的绝对路径 | 指定用户成功登录后要强制执行的命令或脚本权限。比如仅允许使用sftp协议进行文件传输操作的“internal-sftp”或者仅允许访问CVS服务器的“cvs server”又或者可以通过配置“/etc/profile”以及用户的“~/.bashrc”文件自定义限制权限的“/usr/local/bin/limited-shell” |
PermitTunnel | yes or no | 是否允许用户进行进行SSH隧道链接,禁止可以防止用户在sftp会话中建立与其他服务器或设备的SSH隧道连接 |
AllowTcpForwarding | yes or no | 是否允许用户进行TCP转发,禁止可以防止用户在sftp会话中建立与其他服务器或设备的TCP连接 |
X11Forwarding | yes or no | 是否允许用户进行X11转发,禁止可以防止用户在sftp会话中显示远程X11图形应用程序窗口 |
AllowAgentForwarding | yes or no | 是否允许用户进行代理转发,禁止可以防止用户在sftp会话中使用代理转发来访问其他系统或服务,甚至绕过网络防火墙 |
PermitTTY | yes or no | 是否允许用户在sftp会话中使用TTY(终端)进行交互,默认为yes。禁止可以限制用户只能执行非交互式的命令或脚本 |
步骤五: 在“/etc/ssh/sshd_config”配置文件中找到如下行并取消注释(删除行首的#
符号)。若没有该行则手动添加,若有该行则查看行首是否有#
,有则去掉#
,没有则跳过该步骤。
Subsystem sftp /usr/lib/openssh/sftp-server
步骤六: sftp相关配置修改完成后,按“Esc”键退出vim文本编辑器的插入模式,按住“Shift”+“:”键进入vim文本编辑器的命令行模式,输入“wq”保存修改并退出编辑。
步骤七: 执行以下命令,重启ssh服务使配置生效。
sudo systemctl restart ssh
步骤八: 执行以下命令,确认ssh服务状态为“active (running)”。
sudo systemctl status ssh
3.2.3、验证sftp连接
步骤一: 本地执行以下命令,输入密码分别用“zhangsan、lisi”用户登录sftp服务器,执行如下图中命令,查看sftp目录下数据,并分别创建一个“welcome_用户名_sftp”的文件夹,然后输入“exit”退出sftp服务器。
sftp zhangsan@127.0.0.1 sftp lisi@127.0.0.1
步骤二: 执行以下命令,可以看到各用户目录下的“welcome_用户名_sftp”文件夹。
sudo ls -l /sftpdata/*/data
说明:sftp用户空间独立的使用场景下,各个用户在“/etc/ssh/sshd_config”配置文件中需独立配置Match条件块,从而实现每个用户的数据存储目录独立,彼此间不可见。
3.3、配置sftp用户共享目录的sftp服务
3.3.1、创建并配置sftp用户
步骤一: 执行以下命令,创建用户组“sftpusers”。
sudo groupadd -f sftpusers
步骤二: 执行以下命令,创建用户“zhangsan、lisi”,并指定用户所属组为“sftpusers”。
sudo useradd -g sftpusers zhangsan sudo useradd -g sftpusers lisi
步骤三: 执行以下命令,并根据提示,设置用户“zhangsan、lisi”的密码。
sudo passwd zhangsan sudo passwd lisi
步骤四: 执行以下命令,设置用户“zhangsan、lisi”的密码为永不过期。
sudo chage -m 0 -M 99999 -I -1 -E -1 zhangsan sudo chage -m 0 -M 99999 -I -1 -E -1 lisi
步骤五: 执行以下命令,创建共享的“share”目录。
sudo mkdir /sftpdata/share/
步骤六: 执行以下命令,将“share”目录的所属用户和用户组配置为“zhangsan:sftpusers”,并把权限设置为“777”。
sudo chown zhangsan:sftpusers /sftpdata/share/ sudo chmod 777 /sftpdata/share/
步骤七: 执行以下命令,分别修改用户“zhangsan、lisi”的主目录为“/sftpdata/share”。
sudo usermod -d /sftpdata/share/ zhangsan sudo usermod -d /sftpdata/share/ lisi
3.3.2、配置sshd_config文件
步骤一: 执行以下命令,查看系统内是否安装openssh-server服务。
apt list |grep openssh-server
或者
dpkg --get-selections |grep openssh-server
步骤二: 若已安装openssh-server服务,则执行步骤三配置sftp服务相关参数。若未安装openssh-server服务,则参考【Liunx常用操作】Ubuntu Server系统配置软件源章节,配置软件源并安装openssh-server服务后,再执行下面步骤。
步骤三: 执行以下命令,编辑sftp的配置文件“/etc/ssh/sshd_config”。
sudo vim /etc/ssh/sshd_config
步骤四: 按住“Shift”+“g”键,将光标移动至配置文件最后一行,按“o”另起一行进入插入模式,并根据下表描述,复制以下内容至配置文件末尾,修改参数值为实际环境需求。
针对sftpusers用户组生效的sftp配置模板:说明:使用“针对sftpusers用户组生效的sftp配置模板”配置“/etc/ssh/sshd_config”文件时,如果后期需要新增sftp用户,只需参考上面步骤创建新的sftp用户并加入sftpusers用户组即可,无需再次修改“/etc/ssh/sshd_config”配置文件。
Match Group sftpusers ChrootDirectory /sftpdata/ ForceCommand internal-sftp PermitTunnel no AllowTcpForwarding no X11Forwarding no AllowAgentForwarding no
参数 | 值 | 说明 |
---|---|---|
Match | User xxx或者Group xxx | 引入一个条件块,条件块以Match开始,以另一个Match或者文件结尾结束。Match下面的配置项针对当前Match的值生效,且比全局设置的参数优先。如果存在一个值满足多个Match,则针对该值只生效第一个Match下的参数 |
ChrootDirectory | 目录 | 将sftp用户限制在指定的目录中,用户将无法访问该目录之外的文件系统目录 |
ForceCommand | internal-sftp或者cvs server或者命令脚本的绝对路径 | 指定用户成功登录后要强制执行的命令或脚本权限。比如仅允许使用sftp协议进行文件传输操作的“internal-sftp”或者仅允许访问CVS服务器的“cvs server”又或者可以通过配置“/etc/profile”以及用户的“~/.bashrc”文件自定义限制权限的“/usr/local/bin/limited-shell” |
PermitTunnel | yes or no | 是否允许用户进行进行SSH隧道链接,禁止可以防止用户在sftp会话中建立与其他服务器或设备的SSH隧道连接 |
AllowTcpForwarding | yes or no | 是否允许用户进行TCP转发,禁止可以防止用户在sftp会话中建立与其他服务器或设备的TCP连接 |
X11Forwarding | yes or no | 是否允许用户进行X11转发,禁止可以防止用户在sftp会话中显示远程X11图形应用程序窗口 |
AllowAgentForwarding | yes or no | 是否允许用户进行代理转发,禁止可以防止用户在sftp会话中使用代理转发来访问其他系统或服务,甚至绕过网络防火墙 |
PermitTTY | yes or no | 是否允许用户在sftp会话中使用TTY(终端)进行交互,默认为yes。禁止可以限制用户只能执行非交互式的命令或脚本 |
步骤五: 在“/etc/ssh/sshd_config”配置文件中找到如下行并取消注释(删除行首的#
符号)。若没有该行则手动添加,若有该行则查看行首是否有#
,有则去掉#
,没有则跳过该步骤。
Subsystem sftp /usr/lib/openssh/sftp-server
步骤六: sftp相关配置修改完成后,按“Esc”键退出vim文本编辑器的插入模式,按住“Shift”+“:”键进入vim文本编辑器的命令行模式,输入“wq”保存修改并退出编辑。
步骤七: 执行以下命令,重启ssh服务使配置生效。
sudo systemctl restart ssh
步骤八: 执行以下命令,确认ssh服务状态为“active (running)”。
sudo systemctl status ssh
3.3.3、验证sftp连接
步骤一: 本地执行以下命令,输入密码分别用“zhangsan、lisi”用户登录sftp服务器,执行如下图中命令,查看sftp目录下数据,并分别创建一个“用户名_create_welcome”的文件夹,然后输入“exit”退出sftp服务器。
sftp zhangsan@127.0.0.1 sftp lisi@127.0.0.1
步骤二: 执行以下命令,可以看到“share”目录下各个“用户名_create_welcome”文件夹,。
sudo ls -l /sftpdata/share/
说明:sftp用户空间共享的使用场景下,各个用户在“/etc/ssh/sshd_config”配置文件中共用sftpusers用户组的Match条件块,从而实现每个用户的可见权限相同,彼此数据共享,其他用户可以看见但默认不可修改。
4、总结
sftp服务的配置流程大致为:规划配置sftp全局数据存储目录 > 检查或安装openssh-server服务 > 创建sftp用户及其数据存储目录 > 配置“/etc/ssh/sshd_config文件” > 重启ssh服务 > 用户登录测试