19.8.2 账号生命周期与最小权限原则
账号生命周期管理以“创建—使用—变更—停用—审计”为主线,覆盖入职、岗位变更、离职与外包到期。平台侧需统一账号源与身份目录,确保人、岗、权、资源的映射可追踪与可回溯。账号创建必须绑定工单,提供业务归属、负责人、有效期与访问范围;账号变更触发权限回收或重新评估;离职或到期自动禁用并吊销证书/密钥,避免孤儿账号与长期有效权限。
最小权限原则强调“仅授予完成任务所需的最低权限”,权限需具备时效性与可审计性。落地实践包括:默认无权、按需申请、短期授权、定期复核、权限分层与环境隔离。生产环境更严格:关键操作双人复核或审批流;高危命令白名单与审计;数据库、K8s、CI/CD权限细化到项目/命名空间/资源级别。
以下给出基于 Linux 本地账号、sudo、SSH 与数据库的示例流程(可作为平台实现的最小原子动作)。
1)账号创建与过期控制(Linux)
# 1. 创建用户并设置过期时间(30天后过期)
sudo useradd -m -s /bin/bash -e "$(date -d '+30 days' +%F)" ops_user
# 2. 设置初始密码并强制首次登录修改
sudo passwd ops_user
sudo chage -d 0 ops_user
# 3. 查看用户过期与密码策略
sudo chage -l ops_user
# 预期:Account expires 显示到期日期
2)最小权限 sudo 策略(仅允许 systemctl/nginx/log 读取)
# /etc/sudoers.d/ops_user
# 说明:仅允许查看服务状态、重载nginx、查看日志
ops_user ALL=(root) NOPASSWD: /bin/systemctl status nginx, /bin/systemctl reload nginx, /usr/bin/tail -n 200 /var/log/nginx/*.log
# 验证
sudo -l -U ops_user
# 预期:只列出上述允许命令
3)账号变更与权限回收
# 从运维组移除、禁用sudo
sudo gpasswd -d ops_user ops
sudo rm -f /etc/sudoers.d/ops_user
# 禁用账号(离职/到期)
sudo usermod -L ops_user
sudo chage -E 0 ops_user
4)SSH 密钥与访问控制
# 生成临时密钥(供短期授权)
ssh-keygen -t ed25519 -C "ops_user_temp" -f /tmp/ops_user_temp
# 将公钥部署到目标用户
sudo -u ops_user mkdir -p /home/ops_user/.ssh
sudo -u ops_user chmod 700 /home/ops_user/.ssh
sudo -u ops_user sh -c 'cat /tmp/ops_user_temp.pub >> /home/ops_user/.ssh/authorized_keys'
sudo -u ops_user chmod 600 /home/ops_user/.ssh/authorized_keys
5)数据库最小权限(MySQL 示例)
-- 仅允许读取指定库的查询
CREATE USER 'ops_user'@'10.0.%' IDENTIFIED BY 'StrongPass!23';
GRANT SELECT ON app_db.* TO 'ops_user'@'10.0.%';
FLUSH PRIVILEGES;
-- 回收权限
REVOKE ALL PRIVILEGES ON app_db.* FROM 'ops_user'@'10.0.%';
DROP USER 'ops_user'@'10.0.%';
6)Kubernetes 最小权限(命名空间级 RBAC 示例)
# /tmp/ops-reader.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: ops-reader
namespace: app-prod
rules:
- apiGroups: [""]
resources: ["pods","services"]
verbs: ["get","list","watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: ops-reader-binding
namespace: app-prod
subjects:
- kind: User
name: ops_user
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: ops-reader
apiGroup: rbac.authorization.k8s.io
kubectl apply -f /tmp/ops-reader.yaml
kubectl auth can-i list pods -n app-prod --as=ops_user
# 预期:yes
故障排查清单(账号/权限)
# 1. 账号无法登录
sudo passwd -S ops_user # 检查锁定状态
sudo faillock --user ops_user # 检查是否被锁定(PAM)
sudo tail -n 50 /var/log/secure # 登录失败原因
# 2. sudo 权限不生效
sudo visudo -c # 检查语法
sudo -l -U ops_user # 查看授权命令
getent group ops # 检查组成员
# 3. SSH 密钥无效
sudo ls -ld /home/ops_user/.ssh
sudo ls -l /home/ops_user/.ssh/authorized_keys
# 目录权限700,文件600
# 4. MySQL 权限不足
SHOW GRANTS FOR 'ops_user'@'10.0.%';
练习任务
- 创建一个 7 天有效的临时账号
temp_ops,仅允许执行systemctl status nginx。 - 将
temp_ops的 SSH 访问限制为只允许来自10.0.1.0/24。 - 在 MySQL 中创建只读账号并验证无法执行
INSERT。 - 在 K8s 中为
ops_user授权只读app-dev命名空间,并验证app-prod被拒绝。
# 练习验证示例
kubectl auth can-i get pods -n app-dev --as=ops_user
kubectl auth can-i get pods -n app-prod --as=ops_user
指标与审计建议
- 账号合规率、权限回收及时率、异常权限占比、临时授权平均时长、审计覆盖率。
- 审计日志需与工单、审批、资源访问记录关联,形成“身份—权限—行为”的闭环。
- 建议季度复核权限,结合日志与审计结果发现超权限使用与异常授权。