文章目录
一、问题背景
在不同客户环境我们可能会遇到用户提出下面问题:如何限制用户使用 SFTP 时仅能访问指定目录?如何限制用户不离开SFTP 目录?本文的目的就是为这些应用场景提供配置参考建议。
例如:
openAI 的 GPT 大模型的发展历程。
二、配置方法
本示例效果如下:
指定用户仅能通过 SFTP 访问服务器,无法正常登录到操作系统环境中。
当指定用户是属于 sftpgrp 这个用户组的成员时,只能在特定目录下进行操作,无法随意访问服务器环境中的其他 目录内容。
(一)OpenSSH 服务配置
为了实现上述效果,我们需要对 OpenSSH 服务配置进行调整。在银河麒麟高级服务器操作系统 V10 中,OpenSSH 服务配置文件位于/etc/ssh/sshd_config,我们需要在配置文件中修改下面内容:
注释默认的 sftp 子系统配置:
#Subsystem sftp /usr/libexec/openssh/sftp-server -l INFO -f AUTH
添加全新的 sftp 配置:
Subsystem sftp internal-sftp
在配置文件末尾添加针对sftpgrp 用户组的特定规则:
Match Group sftpgrp
ForceCommand internal-sftp X11Forwarding no AllowTcpForwarding no PermitTTY no
ChrootDirectory /sftp/%u
我们通过 Match 参数指定了匹配的规则为用户组(Group), Group 后设置的内容对应到我们示例中提到的sftpgrp 用户组。通过ChrootDirectory 参数让满足条件的用户访问 SFTP 时,切换 SFTP 环境的家目录到/sftp 目录下,这里的%u 对应登录用户的用户名, 例如我当前登录的用户名为 kylin,那么当 kylin 用户属于 sftpgrp 用户组时,SFTP 会直接访问到服务器的/sftp/kylin 目录。
完成上述配置后,我们需要通过 systemctl reload sshd 命令让 OpenSSH 服务重新加载配置文件,以保障我们的配置生效。
(二)创建目标用户
我们创建一个名为 kylin 的用户,用来对应本次示例中,仅能SFTP 访问服务器,并且仅能访问服务器的/sftp/kylin 目录。我们需要进行下面操作:
创建sftpgrp 用户组:
# groupadd sftpgrp
创建 kylin 用户:
# useradd -d /kylin -M -g sftpgrp -s /sbin/nologin kylin
我们通过-d 参数指定用户的家目录,-M 参数表示不自动创建用户家目录的文件夹,-g 指定了 kylin 用户属于 sftpgrp 用户组,- s 设置了 kylin 用户默认的 SHELL,这里的/sbin/nologin 作为 SHELL 会导致用户无法直接登录操作系统获得交互式的命令行环境。
为kylin 用户设置登录密码:
# passwd kylin
(三)设置目标目录
最后我们来创建提供给 kylin 用户访问的 SFTP 目录:
创建目录:
# mkdir -p /sftp/kylin
修改目录权限:
# chmod -R 755 /sftp/kylin
修改目录属主:
# chown root:sftpgrp /sftp/kylin
三、测试效果
配置完成后,我们可以通过使用 SFTP 客户端工具访问服务器来检验配置的效果。例如通过 root 用户使用sftp 客户端访问服务器时,可以获取到下面信息:
# sftp root@192.168.1.100
Authorized users only. All activities may be monitored and reported.
root@192.168.1.100's password: Connected to 192.168.1.100.
sftp> pwd
Remote working directory: /root
sftp> ls /
/backup /bin /boot /box /data /dev /etc /home
/lib /lib64 /media /mnt /opt /proc /root /run
/sbin /srv /sys /tmp /usr /var
sftp>
可以看到,我们使用 root 用户通过 sftp 客户端登录后,家目录位于/root,并且可以查看家目录以外的路径,例如根目录下的 内容。
我们通过配置的 kylin 用户使用 sftp 客户端访问服务器时,显示信息如下:
# sftp kylin@192.168.1.100
Authorized users only. All activities may be monitored and reported. atmsftp@192.168.1.100's password:
Connected to 192.168.1.100.
sftp> pwd
Remote working directory: /
sftp> ls /
sftp>
kylin 用户的情况跟 root 出现了巨大差异,我们默认的家目录为“/”,并且无法看到其他目录的内容。
四、常见问题
配置过程我们可能会遇到下面几种情况,供大家参考:
(一)OpenSSH 服务报错
我们在执行systemctl reload sshd 或者systemctl restart sshd 时遇到报错。
如果您是在参考本文进行配置过程遇到了上述现象,很有可能与配置中第一步,也就是 OpenSSH 服务的配置文件修改有关, 错误的配置文件内容会导致服务无法正常启动。
请检查您Match 配置的内容位于OpenSSH 配置文件中的什么位置。根据 Match 配置的使用描述,在满足条件的情况下,Match 下方的内容会覆盖全局系统配置的内容,直到遇到下一个 Match 参数或配置文件末尾。
所以正确的配置方式是把教程中的配置内容追加到 OpenSSH
配置文件末尾。
(二)用户无法通过 SFTP 成功登录服务器
先检查是否是由于身份验证错误,导致用户无法正常登录, 检查途径是查看/var/log/secure 日志内容。
- 目录权限问题导致登录异常
这里我们提一种特殊情况:目录权限导致的无法登录问题。 在银河麒麟高级服务器操作系统 V10 SP1 的 0711 这个版本中, root 用户默认的 umask 被设置为 0077(大部分 Linux 的配置是0022),这是一个非常高安全的配置,但同时也为我们带来了使用问题,那就是创建出来的目录默认权限是 700。这个情况下我们在创建目录环节创建的目录实际都仅允许root 用户访问而拒绝其他用户访问,最终会导致用户登录失败。
- 目录属主问题导致登录异常
这个问题与 ChrootDirectroy 这个参数有关,该参数要求目录的属主必须是 root 用户,否则日志会一直出现“bad ownership or modes for chroot directory”的报错信息。
(三)问题分析方法
对于本文中的各种问题分析,总结下来就是看日志。如何查 看日志?我们仅需要关注 OpenSSH 服务的日志内容即可,当中会展示为什么我们的服务无法正常启动,为什么我们的用户登录会 失败,什么时候我们的服务被重启过,什么时候什么用户登录到 了服务器中。
如何查看日志呢?非常简单,通过 journalctl -u sshd 即可查看
OpenSSH 服务日志内容。