You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Ubuntu 22.04下创建特定权限SFTP用户(含支持Bash的用户)及权限稳定性问题求助

Ubuntu 22.04下创建特定权限SFTP用户(含支持Bash的用户)及权限稳定性问题求助

兄弟,折腾一周确实够闹心的!这就给你一套Ubuntu 22.04下亲测有效的配置方案,一步步来,解决你的所有问题:

一、搞定User1:全权限SFTP访问/var/www + 解决权限丢失问题

首先,User1要纯SFTP访问,且对/var/www下所有内容有完整权限,还要解决“权限飞走”的坑:

  1. 创建User1并禁用SSH shell登录
    只让他用SFTP,不许进shell:

    sudo useradd -m -s /usr/sbin/nologin user1
    sudo passwd user1  # 设置用户密码
    
  2. 配置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,权限不能有组/其他用户的写权限!这是之前权限不稳定的核心原因之一!

  3. 修复/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

  1. 创建User2并保留Bash权限

    sudo useradd -m -s /bin/bash user2
    sudo passwd user2  # 设置密码
    
  2. 用受限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
    
  3. 限制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
    
  4. 配置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环境,只能用你指定的命令。

三、通用权限加固&最终验证

  1. 重启SSH服务使配置生效

    sudo systemctl restart sshd
    
  2. 验证权限

    • 用User1登录SFTP,尝试创建/修改/删除/var/www下的文件,确认权限正常;新增文件后检查ACL,确保权限继承正常。
    • 用User2登录SSH,尝试访问/var/www外的目录(比如/root),应该会被拒绝;尝试执行Java/Maven命令,确认可用;登录SFTP,确认直接进入project目录且权限正常。
    • 用root账号编辑/var/www下的任意文件,确认无阻碍。
  3. 定期检查权限
    偶尔用以下命令检查ACL状态,防止意外修改:

    getfacl /var/www
    getfacl /var/www/site/dev/project
    

备注:内容来源于stack exchange,提问作者carokey

火山引擎 最新活动