1.9.2 用户与权限最小化配置

用户与权限最小化配置#

最小权限原则要求用户仅获得完成工作所需的最低权限,避免共享账号与过度授权,减少横向移动与误操作风险。配置需从账号、组、文件权限、特权命令四个层面同时收敛,并可量化检查与回滚。

原理草图与控制面#

文章图片

账号与组策略(含命令与解释)#

# 1) 创建业务组与运维组
groupadd appgrp
groupadd opgrp
# 说明:分别用于业务账号与运维账号的权限边界

# 2) 创建业务账号,限制登录Shell
useradd -m -g appgrp -s /sbin/nologin appuser
# -m 创建家目录;-g 主组;-s 设置登录Shell为不可交互

# 3) 创建运维账号,允许登录
useradd -m -g opgrp -s /bin/bash ops
passwd ops
# passwd 设置密码,建议由密码策略强制复杂度

# 4) 禁用系统账号交互登录
usermod -s /sbin/nologin shutdown
usermod -s /sbin/nologin halt
# usermod -s 修改Shell,防止被用于登录

# 5) 检查可登录账号清单(筛除nologin/false)
awk -F: '$7!~/nologin|false/ {print $1,$7}' /etc/passwd
# 输出账号名与Shell,便于复核

密码与登录限制(配置与示例)#

# 1) 密码复杂度(以 Debian/Ubuntu PAM 为例)
apt-get -y install libpam-pwquality
# 安装PAM密码复杂度模块

# /etc/security/pwquality.conf
minlen = 12
minclass = 4
retry = 3
# minlen 最小长度;minclass 复杂度类别数量

# 2) 密码有效期
chage -M 90 -m 7 -W 14 ops
# -M 最大90天;-m 最小7天;-W 过期前14天告警

# 3) 登录失败锁定(以 RHEL/CentOS PAM 为例)
# /etc/pam.d/system-auth
auth required pam_faillock.so preauth silent deny=5 unlock_time=600
auth required pam_faillock.so authfail deny=5 unlock_time=600
# 5次失败锁定10分钟

文件与目录权限最小化(示例与解释)#

# 1) 设置业务目录属主属组
mkdir -p /srv/app/conf /srv/app/data
chown -R appuser:appgrp /srv/app
chmod 750 /srv/app
# 750: 用户可读写执行;组可读执行;其他无权限

# 2) 收紧敏感目录权限(示例)
chmod 700 /root
chmod 640 /etc/shadow
# /etc/shadow 仅root可读写,组只读或无权限

# 3) 设置umask降低默认权限
echo "umask 027" >> /etc/profile
# 027: 新文件默认 640,新目录默认 750

sudo与特权命令控制(配置与示例)#

# 1) 创建精细化sudo策略文件
cat >/etc/sudoers.d/opgrp <<'EOF'
%opgrp ALL=(root) /usr/bin/systemctl status *,/usr/bin/systemctl restart nginx
%opgrp ALL=(root) /usr/bin/journalctl -u nginx
EOF
chmod 440 /etc/sudoers.d/opgrp
# 只允许运维组执行指定systemctl与journalctl命令

# 2) 验证sudo配置语法
visudo -c
# 语法检查通过才生效

# 3) 查看sudo审计日志(RHEL/CentOS)
grep sudo /var/log/secure | tail -n 20

最小化配置检查清单(可执行)#

# 1) 找出空密码账号
awk -F: '($2==""){print $1}' /etc/shadow

# 2) 找出UID为0的账号(除root外需重点排查)
awk -F: '($3==0){print $1,$3,$7}' /etc/passwd

# 3) 查找可被所有人写的目录(常见提权风险)
find / -xdev -type d -perm -0002 -print 2>/dev/null

# 4) 列出sudo授权项
sudo -l -U ops

常见排错#

  • sudo提示“not in sudoers”:确认账号是否在 opgrp 组内
    bash id ops # 输出中应包含 opgrp usermod -aG opgrp ops
  • 设置 nologin 后仍可登录:检查是否使用了 SSH key 且有 ForceCommand
    bash grep -E "ForceCommand|Match" -n /etc/ssh/sshd_config systemctl reload sshd
  • PAM 密码策略不生效:确认对应 PAM 文件已引用 pwquality
    bash grep pwquality /etc/pam.d/system-auth /etc/pam.d/password-auth

练习#

  1. 创建业务账号 appuser,限制为 /sbin/nologin,并验证无法交互登录。
  2. 为运维组配置仅允许重启 nginx 的 sudo 权限,验证 systemctl restart nginx 可执行、systemctl restart sshd 被拒绝。
  3. 通过 find 检出系统中可被所有人写的目录,收紧权限并记录前后变化。

通过系统性最小化配置,可显著降低入侵后的扩展面与误操作风险,为后续认证、审计与网络策略打下基础。