You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:02:53