自动化脚本如何清理未使用权限

wen 实用脚本 4

本文目录导读:

自动化脚本如何清理未使用权限

  1. 云平台:清理未使用的RAM(资源访问管理)权限
  2. 操作系统:清理Linux系统中未使用的Sudo权限或组权限
  3. 最佳实践与风险控制
  4. 进阶:基于日志的精准清理

清理未使用的权限通常指管理云平台(如阿里云、AWS、Azure)或操作系统中的权限、角色、策略,为了安全合规,需要通过自动化脚本识别并移除冗余权限。

以下提供针对云平台(以阿里云为例)Linux系统的清洗思路及脚本模板。

云平台:清理未使用的RAM(资源访问管理)权限

这是最典型的需求,核心思路是:遍历所有权限策略 -> 检查其引用次数(附加到用户/角色/用户组) -> 若引用为0且非预置权限 -> 删除。

阿里云(使用阿里云CLI + Shell脚本)

前提条件:

  • 已安装并配置 aliyun cli
  • 拥有 AliyunRAMReadOnlyAccess(读)和 AliyunRAMFullAccess(删)权限。
#!/bin/bash
# 安全清理阿里云未使用的自定义权限策略
# 获取所有自定义权限策略列表
echo "正在获取所有自定义权限策略..."
policies=$(
  aliyun ram ListPolicies \
    --PolicyType Custom \
    --MaxItems 500 \
    --format json
)
# 遍历每个策略
echo "$policies" | jq -r '.Policies.Policy[] | .PolicyName + ":" + .DefaultVersion' | while IFS=':' read -r name version; do
  # 查询该策略被哪些实体(用户、组、角色)引用
  entities=$(
    aliyun ram ListEntitiesForPolicy \
      --PolicyType Custom \
      --PolicyName "$name"
  )
  # 判断引用数量
  user_count=$(echo "$entities" | jq '.Users.User | length')
  group_count=$(echo "$entities" | jq '.Groups.Group | length')
  role_count=$(echo "$entities" | jq '.Roles.Role | length')
  total=$((user_count + group_count + role_count))
  if [ "$total" -eq 0 ]; then
    echo "发现未使用策略: $name (版本: $version)"
    # 安全措施:先备份策略内容(可选)
    aliyun ram GetPolicyVersion \
      --PolicyName "$name" \
      --PolicyType Custom \
      --VersionId "$version" \
      --format json > "./backup_policy_${name}.json"
    echo "已备份到 ./backup_policy_${name}.json"
    # 执行删除(建议先注释,手动确认后再取消注释)
    # aliyun ram DeletePolicy --PolicyName "$name" --PolicyType Custom
    # echo "已删除策略: $name"
  fi
done
echo "扫描结束。"

AWS(使用AWS CLI + Shell脚本)

AWS 的权限管理相对严格,需区分 Customer Managed Policies(客户托管策略)和 Inline Policies(内联策略)。

#!/bin/bash
# 扫描并列出AWS中未关联的客户托管策略
echo "获取所有客户托管策略..."
policies=$(aws iam list-policies --scope Local --only-attached false --query 'Policies[*].[PolicyName, Arn]' --output text)
while IFS=$'\t' read -r name arn; do
  # 使用 get-policy-version 检查是否被引用(更好的替代是 list-entities-for-policy)
  attachment_count=$(aws iam list-entities-for-policy --policy-arn "$arn" --query 'length(PolicyUsers[]) + length(PolicyGroups[]) + length(PolicyRoles[])' --output text)
  if [ "$attachment_count" -eq 0 ]; then
    echo "未使用策略: $name ($arn)"
    # 备份
    aws iam get-policy-version --policy-arn "$arn" --version-id $(aws iam list-policy-versions --policy-arn "$arn" --query 'Versions[?IsDefaultVersion==`true`].VersionId' --output text) > "./aws_backup_${name}.json"
    # 删除前建议手动确认,或添加 -y 参数
    # aws iam delete-policy --policy-arn "$arn"
  fi
done <<< "$policies"

操作系统:清理Linux系统中未使用的Sudo权限或组权限

清理过期的 sudoers 条目(谨慎操作)

注意:直接修改 /etc/sudoers 风险极高,正确的做法是检查 /etc/sudoers.d/ 下的文件。

#!/bin/bash
# 检查系统中已不存在的用户所拥有的sudo权限
echo "检查 /etc/sudoers.d/ 中已删除用户的残留权限..."
for file in /etc/sudoers.d/*; do
  # 跳过注释或非文件
  [ -f "$file" ] || continue
  # 提取文件中声明的用户名(假设格式为 “username ALL=(ALL)” )
  users_in_file=$(grep -oP '^\s*[\w.-]+' "$file")
  for user in $users_in_file; do
    # 检查用户是否存在于系统中
    if ! id "$user" &>/dev/null; then
      echo "发现残留权限: 用户 '$user' 已不存在,其权限定义在 $file"
      # 备份文件
      cp "$file" "${file}.bak.$(date +%Y%m%d%H%M%S)"
      # 移除包含该用户的行(危险操作,请确保备份)
      # sed -i "/^$user /d" "$file"
      # echo "已从 $file 中移除 $user 的权限"
    fi
  done
done

清理已删除用户的组群成员关系

#!/bin/bash
# 检查各用户组中是否存在已删除的用户
echo "检查 /etc/group 中已删除用户的残留..."
while IFS=: read -r group_name _ group_id members; do
  [ -z "$members" ] && continue
  IFS=',' read -ra user_list <<< "$members"
  for user in "${user_list[@]}"; do
    if ! id "$user" &>/dev/null; then
      echo "组 $group_name (GID: $group_id) 包含已删除的用户 '$user'"
      # 此处可执行清理命令(需谨慎):
      # gpasswd -d "$user" "$group_name" 2>/dev/null  # 但该命令要求用户存在,所以改用 sed
      # sed -i "s/:$user,/:,/" /etc/group  # 替换格式要注意
    fi
  done
done < /etc/group

最佳实践与风险控制

  1. 先扫描,后删除:脚本默认只输出日志,不执行删除,将实际删除命令注释或放在 if 之后由你手动取消注释。
  2. 强制备份:任何删除前都应备份数据(策略内容、sudoers文件),上述脚本已包含备份步骤。
  3. 设置冷却期:在云平台上,权限可能被自动化工具(如Terraform、Ansible)动态引用,建议:标记为未使用后,观察7天再删除。
  4. 忽略预置/内置权限:云平台的内置权限(如AdministratorAccess)不可删除,脚本中通过PolicyType Custom进行过滤。
  5. 使用云厂商的合规工具
    • 阿里云:访问控制(RAM)控制台 -> 权限策略管理 -> 自动提供“最近引用时间”字段。
    • AWS:可以使用 IAM Access Analyzer 策略生成,自动分析哪些权限被真正使用。

进阶:基于日志的精准清理

仅凭“未关联”删除权限风险较高(因为可能关联后被动态解除),真正的“未使用”应该基于API调用记录。

思路:

  1. 开启云平台的 CloudTrail (AWS) 或 ActionTrail (阿里云)。
  2. 查询过去90天内该权限对应的Action是否被调用。
  3. 如果某权限策略中的Action从未出现在日志中,该策略才算“未使用”。

这涉及更复杂的数据分析和API查询,通常需要配合Python+云SDK实现。

  • 清理云平台权限:使用官方CLI + ListEntitiesForPolicy 是标准方法。
  • 清理系统权限:使用 id 命令 + 文件解析。
  • 核心原则备份 + 手动确认 + 小范围灰度(先删非核心权限,再删重要权限)。

希望这些脚本和思路能帮助你安全高效地清理未使用权限,如果你有特定的云平台或系统版本,可以提供更多细节以获取更精准的脚本。

抱歉,评论功能暂时关闭!