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.%';

练习任务

  1. 创建一个 7 天有效的临时账号 temp_ops,仅允许执行 systemctl status nginx
  2. temp_ops 的 SSH 访问限制为只允许来自 10.0.1.0/24
  3. 在 MySQL 中创建只读账号并验证无法执行 INSERT
  4. 在 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

指标与审计建议

  • 账号合规率、权限回收及时率、异常权限占比、临时授权平均时长、审计覆盖率。
  • 审计日志需与工单、审批、资源访问记录关联,形成“身份—权限—行为”的闭环。
  • 建议季度复核权限,结合日志与审计结果发现超权限使用与异常授权。