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
练习#
- 创建业务账号
appuser,限制为/sbin/nologin,并验证无法交互登录。 - 为运维组配置仅允许重启 nginx 的 sudo 权限,验证
systemctl restart nginx可执行、systemctl restart sshd被拒绝。 - 通过
find检出系统中可被所有人写的目录,收紧权限并记录前后变化。
通过系统性最小化配置,可显著降低入侵后的扩展面与误操作风险,为后续认证、审计与网络策略打下基础。