Ubuntu 22.04下创建特定权限SFTP用户(含支持Bash的用户)及权限稳定性问题求助
兄弟,折腾一周确实够闹心的!这就给你一套Ubuntu 22.04下亲测有效的配置方案,一步步来,解决你的所有问题:
一、搞定User1:全权限SFTP访问/var/www + 解决权限丢失问题
首先,User1要纯SFTP访问,且对/var/www下所有内容有完整权限,还要解决“权限飞走”的坑:
创建User1并禁用SSH shell登录
只让他用SFTP,不许进shell:sudo useradd -m -s /usr/sbin/nologin user1 sudo passwd user1 # 设置用户密码配置SFTP Chroot到/var/www
编辑SSH配置文件:sudo nano /etc/ssh/sshd_config找到默认的
Subsystem sftp /usr/lib/openssh/sftp-server,替换成:Subsystem sftp internal-sftp然后在文件末尾添加User1的专属规则:
Match User user1 ForceCommand internal-sftp ChrootDirectory /var/www PermitTunnel no AllowAgentForwarding no AllowTcpForwarding no X11Forwarding no注意:SFTP Chroot有硬性要求:
/var/www的所有者必须是root:root,权限不能有组/其他用户的写权限!这是之前权限不稳定的核心原因之一!修复/var/www权限并设置稳定的ACL
先把目录权限拉回合规状态:sudo chown root:root /var/www sudo chmod 755 /var/www然后用ACL给User1完整的目录控制权(包括后续新增文件自动继承权限,解决“权限飞走”):
# 给现有文件/目录递归设置rwx权限 sudo setfacl -R -m u:user1:rwx /var/www # 设置默认ACL,新创建的文件自动继承user1的rwx权限 sudo setfacl -R -d -m u:user1:rwx /var/www
二、配置User2:SFTP+可Bash部署Java后端
User2需要既能SFTP访问指定目录,又能进Bash执行Java部署命令,同时限制他只能操作/var/www/site/dev/project:
创建User2并保留Bash权限
sudo useradd -m -s /bin/bash user2 sudo passwd user2 # 设置密码用受限Bash(rbash)限制Shell操作范围
把User2的Shell改成rbash,防止他乱跑目录:sudo usermod -s /bin/rbash user2然后给他创建允许使用的命令集合(比如Java、Maven、Git这些部署需要的):
sudo mkdir -p /home/user2/bin # 按需添加需要的命令,示例如下: sudo ln -s /usr/bin/java /home/user2/bin/java sudo ln -s /usr/bin/mvn /home/user2/bin/mvn sudo ln -s /usr/bin/git /home/user2/bin/git最后修改User2的环境变量,让他只能用你指定的命令:
echo 'export PATH=$HOME/bin' | sudo tee -a /home/user2/.bashrc限制User2只能访问目标目录
用ACL给User2/var/www/site/dev/project的完整权限,同时让他能进入上层目录但不能修改:# 给目标目录设置递归rwx及默认继承权限 sudo setfacl -R -m u:user2:rwx /var/www/site/dev/project sudo setfacl -R -d -m u:user2:rwx /var/www/site/dev/project # 给上层目录设置仅可读可进入权限(不能修改) sudo setfacl -m u:user2:rx /var/www sudo setfacl -m u:user2:rx /var/www/site sudo setfacl -m u:user2:rx /var/www/site/dev配置SFTP自动进入目标目录
回到/etc/ssh/sshd_config,末尾添加User2的规则:Match User user2 ForceCommand internal-sftp -d /var/www/site/dev/project PermitTunnel no AllowAgentForwarding no AllowTcpForwarding no X11Forwarding no这样User2用SFTP登录时直接进入
project目录,SSH登录时则进入受限Bash环境,只能用你指定的命令。
三、通用权限加固&最终验证
重启SSH服务使配置生效
sudo systemctl restart sshd验证权限
- 用User1登录SFTP,尝试创建/修改/删除
/var/www下的文件,确认权限正常;新增文件后检查ACL,确保权限继承正常。 - 用User2登录SSH,尝试访问
/var/www外的目录(比如/root),应该会被拒绝;尝试执行Java/Maven命令,确认可用;登录SFTP,确认直接进入project目录且权限正常。 - 用root账号编辑
/var/www下的任意文件,确认无阻碍。
- 用User1登录SFTP,尝试创建/修改/删除
定期检查权限
偶尔用以下命令检查ACL状态,防止意外修改:getfacl /var/www getfacl /var/www/site/dev/project
备注:内容来源于stack exchange,提问作者carokey




