让乌班图的 www-data 用户支持 SSH 登录

核心风险提示

www-data 是 Apache、Nginx 等 Web 服务的默认运行用户,默认被限制登录权限。赋予其 SSH 登录能力存在安全隐患:若 Web 程序被入侵,攻击者可通过 SSH 进一步控制服务器。

生产环境如需管理 Web 目录,优先使用 sudo -u www-data 切换用户,而非开启 SSH 登录。

第一部分:解决 .bash_history 权限不足问题

错误根源

www-data 的家目录默认配置为 /var/www,但该目录默认所有者为 root 用户。bash 执行 history 命令时,需要在 /var/www 下创建 / 写入 .bash_history 文件保存命令历史,www-data 因无目录写入权限触发报错。

修复步骤(服务器端 root 权限执行)

  1. 修改 /var/www 目录所有权
    将目录及其子文件的所有者和所属组改为 www-data,确保用户对家目录的完全控制权:

    sudo chown -R www-data:www-data /var/www
  2. 配置目录权限
    设置权限为 755,保证 www-data 可读写执行,其他用户仅可读,避免影响 Web 服务正常运行:

    sudo chmod -R 755 /var/www
    
  3. 手动创建并配置 .bash_history 文件
    提前创建文件并配置严格权限,避免首次执行 history 仍触发错误:

    # 创建命令历史文件
    sudo touch /var/www/.bash_history
    # 设置文件所有者
    sudo chown www-data:www-data /var/www/.bash_history
    # 设置文件权限为 600(仅 www-data 可读写,符合安全规范)
    sudo chmod 600 /var/www/.bash_history

即时验证操作

通过本地切换用户验证问题是否解决,无需 SSH 登录:

# 切换到 www-data 用户
sudo su - www-data
# 执行 history 命令
history
  • 验证成功:无「权限不够」报错,命令行显示历史记录(首次执行可能为空)。
  • 验证失败:重新检查目录及文件的所有者和权限配置。

第二部分:配置 www-data 无密码 SSH 登录

前置准备:修改 www-data 登录 Shell

www-data 默认 Shell 为 /usr/sbin/nologin,会直接拒绝 SSH 登录,需改为可交互 Shell:

# 修改登录 Shell 为 /bin/bash
sudo usermod -s /bin/bash www-data

# 验证修改结果
grep www-data /etc/passwd
# 正确输出示例:www-data:x:33:33:www-data:/var/www:/bin/bash

客户端生成 SSH 密钥对

在本地客户端(需登录服务器的设备)生成密钥对,无需设置密码短语,实现真正无密码登录:

# 生成 4096 位 RSA 密钥对,按回车使用默认路径保存
ssh-keygen -t rsa -b 4096
生成后,客户端公钥路径为 ~/.ssh/id_rsa.pub(Windows 系统路径:C:\Users\你的用户名\.ssh\id_rsa.pub)。

服务器端部署客户端公钥

SSH 对密钥文件和目录的权限要求极高,权限错误会直接导致登录失败,需严格按步骤执行:
  1. 创建 www-data 的 .ssh 目录
    sudo mkdir -p /var/www/.ssh
  2. 配置 .ssh 目录权限
  3. 导入客户端公钥
    • 方式 1(客户端与服务器直连,推荐)
      在客户端执行以下命令,一键将公钥复制到服务器:

      ssh-copy-id -i ~/.ssh/id_rsa.pub www-data@你的服务器IP
      
    • 方式 2(无法直连,手动粘贴)
      1. 复制客户端 id_rsa.pub 文件内的全部内容
      2. 在服务器执行命令,编辑公钥授权文件:
        sudo nano /var/www/.ssh/authorized_keys
        

配置 SSH 服务,禁用密码登录

编辑 SSH 服务配置文件,强制仅允许密钥登录,彻底关闭密码登录通道:
  1. 打开配置文件
    sudo nano /etc/ssh/sshd_config
    
  2. 修改以下配置项
    # 启用公钥认证(确保未被注释)
    PubkeyAuthentication yes
    # 禁用密码登录
    PasswordAuthentication no
    # 禁用挑战式密码认证
    ChallengeResponseAuthentication no
    # (可选)仅允许 www-data 从指定 IP 登录,进一步降低风险
    # AllowUsers www-data@你的客户端IP
  3. 重启 SSH 服务使配置生效
    sudo systemctl restart sshd
    

无密码 SSH 登录测试

在客户端执行以下命令,验证是否无需输入密码即可登录:

ssh www-data@你的服务器IP
  • 登录成功:直接进入 www-data 命令行界面,无密码提示。
  • 登录失败:查看服务器 SSH 日志排查问题:
    sudo tail -f /var/log/auth.log | grep www-data
    
  • 常见故障原因:.ssh 目录或 authorized_keys 文件权限错误、公钥粘贴不完整。

紧急回滚方案(配置错误时)

若配置后无法登录服务器,通过服务器本地终端执行以下命令恢复密码登录:

# 重新启用密码登录
sudo sed -i 's/PasswordAuthentication no/PasswordAuthentication yes/' /etc/ssh/sshd_config
# 重启 SSH 服务
sudo systemctl restart sshd

安全加固建议

  1. 若必须开启 www-data SSH 登录,务必配置 AllowUsers 限制登录 IP,避免全网可访问。
  2. 定期检查 SSH 登录日志,监控异常行为:
    sudo tail -f /var/log/auth.log | grep www-data
    
© 版权声明

相关文章

暂无评论

none
暂无评论...