如何用boto3禁用AWS用户密码?CIS基准合规实现求助
我来帮你搞定这两个关于用boto3管理AWS IAM用户密码的问题:
1. 如何使用boto3在AWS中禁用用户密码?
要禁用IAM用户的登录密码,你需要用到IAM客户端的update_login_profile方法,通过设置PasswordEnabled=False来关闭密码登录权限。这里给你一个简单的实现示例:
首先初始化IAM客户端:
import boto3 # 初始化IAM客户端(如果需要指定会话或区域,可以自行调整) iam_client = boto3.client('iam')
然后写一个禁用指定用户密码的函数:
def disable_user_password(username): try: iam_client.update_login_profile( UserName=username, PasswordEnabled=False ) print(f"✅ 已成功禁用用户 {username} 的登录密码") except iam_client.exceptions.NoSuchEntityException: print(f"ℹ️ 用户 {username} 从未设置过密码,没有可禁用的登录配置")
这个方法的作用很直接:如果用户已经设置过密码(存在登录配置文件),调用后会立即禁用密码,用户无法再用密码登录AWS控制台;如果用户从未设置过密码,会抛出NoSuchEntityException,我们可以捕获这个异常做友好提示。
2. 实现CIS基准要求:禁用90天及以上未使用的启用状态密码
你已经能获取密码的使用时长和上次使用时间,现在只需要把这个逻辑和禁用密码的API结合起来就行。核心步骤是:遍历用户→检查密码是否启用→计算未使用天数→如果≥90天就禁用。
这里给你一个完整的实现代码,适配你的需求:
import boto3 from datetime import datetime, timezone iam_client = boto3.client('iam') def check_and_disable_stale_passwords(): # 获取所有IAM用户列表 all_users = iam_client.list_users()['Users'] for user in all_users: username = user['UserName'] # 获取密码上次使用时间(如果从未使用过,这个字段会不存在) password_last_used = user.get('PasswordLastUsed') user_create_date = user['CreateDate'] try: # 检查用户的密码是否处于启用状态 login_profile = iam_client.get_login_profile(UserName=username) is_password_enabled = login_profile['LoginProfile']['PasswordEnabled'] if not is_password_enabled: print(f"ℹ️ 用户 {username} 的密码已禁用,跳过检查") continue # 计算密码未使用的天数 if password_last_used is None: # 密码从未被使用过,用用户创建日期来计算时长 days_unused = (datetime.now(timezone.utc) - user_create_date).days print(f"⚠️ 用户 {username} 的密码从未使用过,已创建 {days_unused} 天") else: days_unused = (datetime.now(timezone.utc) - password_last_used).days # 符合CIS基准要求:启用状态且90天未使用,禁用密码 if days_unused >= 90: iam_client.update_login_profile( UserName=username, PasswordEnabled=False ) print(f"✅ 已禁用用户 {username} 超过90天未使用的密码") else: print(f"ℹ️ 用户 {username} 的密码最近 {days_unused} 天使用过,无需处理") except iam_client.exceptions.NoSuchEntityException: # 用户从未设置过密码,跳过 print(f"ℹ️ 用户 {username} 未设置密码,跳过检查") # 执行检查和禁用操作 check_and_disable_stale_passwords()
几个关键细节要注意:
PasswordLastUsed是UTC时间,所以计算时要用datetime.now(timezone.utc)来对比,避免时区偏差导致天数计算错误- 如果用户设置了密码但从未登录过,
PasswordLastUsed字段不会存在,这时候我们用用户的创建日期来计算时长,因为密码从创建后就没被用过,完全符合CIS基准的要求 - 对比你之前处理访问密钥的代码,密码的禁用是用
update_login_profile,而访问密钥用的是update_access_key,这是IAM中两种凭证的不同操作方式
内容的提问来源于stack exchange,提问作者eatsfood
相关产品推荐
相关产品推荐

