一、引言

在计算机系统的使用过程中,安全问题一直是大家非常关注的重点。特别是对于一些提供 SFTP 服务的系统,为了防止用户通过 Shell 登录系统从而带来安全风险,我们需要进行相应的安全配置,让用户只能通过 SFTP 访问系统,而无法进行 Shell 登录。接下来,我们就详细聊聊如何实现这一安全配置。

二、应用场景

2.1 共享文件存储

很多企业或者组织会搭建一个共享文件存储服务器,使用 SFTP 服务让员工上传和下载文件。在这种情况下,员工只需要通过 SFTP 访问文件就可以了,不需要登录系统进行其他操作。如果允许他们通过 Shell 登录,可能会误操作或者恶意修改系统配置,影响服务器的正常运行。比如一家设计公司,设计师们只需要将设计好的文件上传到服务器,或者从服务器下载素材,通过 SFTP 服务就能满足需求,禁用 Shell 登录可以避免他们不小心修改服务器的重要配置。

2.2 数据备份

有些公司会定期将重要数据备份到 SFTP 服务器上。备份程序只需要通过 SFTP 协议将数据传输到服务器即可,不需要登录系统。禁用 Shell 登录可以防止备份程序所在的系统被攻击后,攻击者通过备份账号登录到 SFTP 服务器的系统中,从而保护服务器的安全。例如,一家电商公司每天晚上会将当天的订单数据备份到 SFTP 服务器,禁用备份用户的 Shell 登录可以降低数据泄露的风险。

三、技术优缺点

3.1 优点

  • 增强安全性:禁用 Shell 登录可以大大减少系统被攻击的面。如果用户只能通过 SFTP 访问文件,那么攻击者就无法利用用户账号登录系统,执行恶意命令,如安装木马、篡改系统文件等。比如,在一个开源项目的文件托管服务器上,开发者只能通过 SFTP 上传和下载代码,即使开发者的账号密码泄露,攻击者也无法登录系统进行破坏。
  • 便于管理:管理员可以更方便地控制用户的操作权限。只允许用户进行 SFTP 操作,避免了用户在系统中进行不必要的操作,减少了系统故障的发生概率。例如,在一个学校的教学资源服务器上,学生只能通过 SFTP 下载学习资料,管理员可以更轻松地管理服务器的文件和资源。

3.2 缺点

  • 功能受限:对于一些需要在系统中执行命令的用户来说,禁用 Shell 登录会带来不便。比如,开发人员可能需要在服务器上进行一些调试工作,但是由于无法登录 Shell,就需要通过其他方式来完成,增加了工作的复杂性。
  • 配置复杂:实现用户只能通过 SFTP 访问而无法登录系统的安全配置需要一定的技术知识和经验。管理员需要对系统的用户管理、权限设置等方面有深入的了解,否则可能会出现配置错误,导致用户无法正常使用 SFTP 服务。

四、实现步骤(以 Linux 系统为例)

4.1 创建 SFTP 用户组

首先,我们需要创建一个专门用于 SFTP 用户的组。在 Linux 系统中,可以使用以下命令来创建:

# 创建一个名为 sftpusers 的用户组
groupadd sftpusers

这个命令的作用是在系统中创建一个名为 sftpusers 的用户组,后续我们会将需要使用 SFTP 服务的用户添加到这个组中。

4.2 创建 SFTP 用户

接下来,我们创建一个新的用户,并将其添加到 sftpusers 组中。

# 创建一个名为 sftpuser 的用户,并将其添加到 sftpusers 组中
useradd -g sftpusers -s /sbin/nologin sftpuser
# 设置 sftpuser 用户的密码
passwd sftpuser

useradd 命令用于创建新用户,-g 参数指定用户所属的组,-s 参数指定用户的登录 Shell,这里我们将其设置为 /sbin/nologin,表示该用户无法通过 Shell 登录系统。passwd 命令用于设置用户的密码。

4.3 配置 SSH 服务

我们需要对 SSH 服务进行配置,让 SFTP 用户只能通过 SFTP 访问系统。编辑 /etc/ssh/sshd_config 文件:

# 编辑 SSH 配置文件
vi /etc/ssh/sshd_config

在文件中添加或修改以下内容:

# 禁用 SSH 协议版本 1
Protocol 2
# 禁止用户使用密码登录,可根据实际情况选择是否启用
# PasswordAuthentication no
# 设置 SFTP 子系统
Subsystem sftp internal-sftp
# 匹配 sftpusers 组的用户
Match Group sftpusers
    ChrootDirectory /data/sftp/%u
    ForceCommand internal-sftp
    AllowTcpForwarding no
    X11Forwarding no
  • Protocol 2:只允许使用 SSH 协议版本 2,增强安全性。
  • Subsystem sftp internal-sftp:使用 SSH 内置的 SFTP 子系统。
  • Match Group sftpusers:匹配 sftpusers 组的用户。
  • ChrootDirectory /data/sftp/%u:将用户的根目录限制在 /data/sftp/%u 目录下,%u 表示用户名,这样用户只能访问自己的目录。
  • ForceCommand internal-sftp:强制用户只能使用 SFTP 服务。
  • AllowTcpForwarding noX11Forwarding no:禁止用户进行 TCP 转发和 X11 转发。

4.4 创建用户目录并设置权限

为 SFTP 用户创建目录,并设置正确的权限:

# 创建 SFTP 用户目录
mkdir -p /data/sftp/sftpuser
# 设置目录的所有者为 root
chown root:sftpusers /data/sftp/sftpuser
# 设置目录的权限为 755
chmod 755 /data/sftp/sftpuser
# 在用户目录下创建可写的目录
mkdir /data/sftp/sftpuser/upload
# 设置可写目录的所有者为 sftpuser
chown sftpuser:sftpusers /data/sftp/sftpuser/upload
# 设置可写目录的权限为 755
chmod 755 /data/sftp/sftpuser/upload

这里我们创建了一个 /data/sftp/sftpuser 目录作为用户的根目录,将其所有者设置为 root,权限设置为 755,确保用户无法修改根目录。然后在根目录下创建一个 upload 目录,将其所有者设置为 sftpuser,用户可以在这个目录下上传和下载文件。

4.5 重启 SSH 服务

完成以上配置后,我们需要重启 SSH 服务使配置生效:

# 重启 SSH 服务
systemctl restart sshd

五、注意事项

5.1 目录权限

在设置用户目录权限时,一定要注意 ChrootDirectory 指定的目录及其上级目录的所有者必须是 root,并且权限不能设置为可写(一般为 755),否则会导致 SSH 服务拒绝用户登录。例如,如果 /data/sftp 目录的所有者不是 root,或者权限设置为可写,用户就无法正常使用 SFTP 服务。

5.2 服务重启

每次修改 sshd_config 文件后,都需要重启 SSH 服务才能使配置生效。在重启服务之前,最好先检查配置文件的语法是否正确,避免因为配置错误导致 SSH 服务无法启动。可以使用 sshd -t 命令来检查配置文件的语法:

# 检查 SSH 配置文件的语法
sshd -t

5.3 用户管理

在添加或删除 SFTP 用户时,要及时更新用户组和目录权限。如果删除了一个用户,要记得删除其对应的目录,避免占用系统空间。同时,要定期修改用户的密码,提高系统的安全性。

六、文章总结

通过以上步骤,我们可以实现 SFTP 服务用户禁用 Shell 登录,让用户只能通过 SFTP 访问系统,从而增强系统的安全性。在实际应用中,我们要根据具体的需求和场景,合理配置系统,权衡技术的优缺点。同时,要注意目录权限、服务重启和用户管理等方面的问题,确保系统的正常运行。虽然禁用 Shell 登录会带来一些功能上的限制和配置上的复杂性,但从安全的角度来看,这些都是值得的。通过这种安全配置,我们可以有效地保护服务器的安全,防止数据泄露和系统被攻击。