本文目录导读:

清理未使用的权限通常指管理云平台(如阿里云、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
最佳实践与风险控制
- 先扫描,后删除:脚本默认只输出日志,不执行删除,将实际删除命令注释或放在
if之后由你手动取消注释。 - 强制备份:任何删除前都应备份数据(策略内容、sudoers文件),上述脚本已包含备份步骤。
- 设置冷却期:在云平台上,权限可能被自动化工具(如Terraform、Ansible)动态引用,建议:标记为未使用后,观察7天再删除。
- 忽略预置/内置权限:云平台的内置权限(如
AdministratorAccess)不可删除,脚本中通过PolicyType Custom进行过滤。 - 使用云厂商的合规工具:
- 阿里云:访问控制(RAM)控制台 -> 权限策略管理 -> 自动提供“最近引用时间”字段。
- AWS:可以使用
IAM Access Analyzer策略生成,自动分析哪些权限被真正使用。
进阶:基于日志的精准清理
仅凭“未关联”删除权限风险较高(因为可能关联后被动态解除),真正的“未使用”应该基于API调用记录。
思路:
- 开启云平台的 CloudTrail (AWS) 或 ActionTrail (阿里云)。
- 查询过去90天内该权限对应的Action是否被调用。
- 如果某权限策略中的Action从未出现在日志中,该策略才算“未使用”。
这涉及更复杂的数据分析和API查询,通常需要配合Python+云SDK实现。
- 清理云平台权限:使用官方CLI +
ListEntitiesForPolicy是标准方法。 - 清理系统权限:使用
id命令 + 文件解析。 - 核心原则:备份 + 手动确认 + 小范围灰度(先删非核心权限,再删重要权限)。
希望这些脚本和思路能帮助你安全高效地清理未使用权限,如果你有特定的云平台或系统版本,可以提供更多细节以获取更精准的脚本。