Ubuntu Server 16.04:创建仅能SSH访问webroot特定目录的用户
我之前也碰到过一模一样的需求,折腾了好几次才摸透正确的配置方式,给你一套经过验证的步骤,确保这个用户只能通过SSH(这里用更适合文件管理的SFTP模式)访问指定的webroot子文件夹:
1. 创建受限系统用户
首先创建一个专门的用户,直接把他的家目录绑定到你指定的webroot文件夹,同时禁止他登录交互式shell(避免不必要的系统访问权限):
sudo useradd -m -d /var/www/your-target-folder -s /usr/sbin/nologin restricted-user
-m:自动创建用户家目录(这里就是你要让他管理的特定文件夹)-d:指定用户的家目录为webroot下的目标文件夹-s /usr/sbin/nologin:禁止用户登录系统的交互式shell,只保留SSH相关的访问权限
接着给用户设置登录密码:
sudo passwd restricted-user
2. 调整目录权限(关键!)
SFTP的目录限制有严格的权限要求,必须确保目标文件夹的父目录(比如/var/www)是root用户所有,且没有其他用户的写权限,否则SSH服务会直接拒绝该用户连接:
# 先设置父目录(/var/www)的权限,必须是root所有且无其他用户写权限 sudo chown root:root /var/www sudo chmod 755 /var/www # 再让目标文件夹归受限用户所有,方便他正常管理文件 sudo chown restricted-user:restricted-user /var/www/your-target-folder sudo chmod 755 /var/www/your-target-folder # 如果需要同组用户也能编辑,可改成775
3. 配置SSH服务器实现目录锁定
编辑SSH的主配置文件:
sudo nano /etc/ssh/sshd_config
替换SFTP子系统模块
找到原来的Subsystem sftp行,注释掉并替换为SSH内部的SFTP模块:
# Subsystem sftp /usr/lib/openssh/sftp-server Subsystem sftp internal-sftp
添加用户专属限制规则
在文件末尾添加以下配置,专门针对刚才创建的受限用户:
Match User restricted-user ForceCommand internal-sftp # 强制用户只能使用SFTP,不能执行任何shell命令 ChrootDirectory /var/www # 将用户的根目录锁定在/var/www,无法访问系统其他路径 PermitTunnel no AllowAgentForwarding no AllowTcpForwarding no X11Forwarding no
解释:ChrootDirectory会把用户的访问范围锁死在/var/www内,而我们之前把用户的家目录设为/var/www/your-target-folder,所以用户登录SFTP后会自动进入这个目标文件夹,且无法切换到/var/www以外的任何系统目录。
重启SSH服务使配置生效
sudo systemctl restart sshd
4. 测试连接验证效果
现在用SFTP命令测试是否配置成功:
sftp restricted-user@your-server-ip
输入密码后,你会自动进入/var/www/your-target-folder,尝试执行cd /或者cd /root会提示权限不足,证明限制生效。日常管理文件直接用SFTP的put(上传)、get(下载)命令即可。
如果你的需求是允许用户通过SSH执行特定命令但仅限制在目标目录,可以用rbash(受限bash)结合环境变量配置,但这种方式安全性不如SFTP,有需要的话可以再追问细节~
内容的提问来源于stack exchange,提问作者john deo

