回收IAM User的AKSK计划

背景

AK/SK(Access Key/Secret Key)泄漏的影响是深远和严重的。首先,这使外部攻击者可以获得对您云环境的未授权访问,可能导致敏感数据的泄露、篡改或删除。其次,攻击者可以利用这些凭证来发起更广泛的攻击,如身份盗用和权限提升,威胁到整个组织的安全。此外,AK/SK泄漏可能导致重大的财务损失,因为恶意行为者可能会利用这些凭证来启动大量的云资源,产生巨额的费用。因此,强化AK/SK的保护措施和监控是至关重要的,以减少安全风险和维护组织的信誉。

目标

回收IAM User的AK/SK。

如何实现

步骤 1: 确定访问类型

  • 真人访问:这类访问通常需要通过控制台和命令行界面 (CLI) 进行。在此情形下,应通过IAM Identity Center分配权限,其中分配的是IAM Role,这类权限是短期的,以增强安全性。

  • 程序访问:此类访问指的是代码或脚本通过API访问AWS资源,此时使用的是AK/SK。

步骤 2: 真人访问通过IAM Identity Center

要求所有的真人访问AWS都要通过IAM Identity Center。在IAM Identity Center中创建权限集,用户和组,为需要访问AWS控制台,CLI的人分配权限。

步骤3: 切换程序使用IAM Role,删除代码中的AKSK

3.1 扫描代码中存在明文AKSK的情况

安装Prowler在自己的机器上;此工具提供了当前环境的安全状态。此外, AWS Security Hub 提供了自动合规扫描并且可以 integrate with Prowler

使用以下命令扫描AWS上使用明文口令的情况,然后排查泄漏的IAM AKSK是否在里面。建议所有的明文AKSK都应该删除,使用IAM role的方式进行授权。

prowler aws --categories secrets

命令执行成功后会自动生成一份AKSK在代码中是否存在的报告。根据报告就可以针对使用了AKSK的EC2,Lambda,EKS等进行改造。

3.2 EC2绑定IAM Role

IAM Role是什么。您可以使用Amazon CLI或Amazon API或使用自定义URL来代入roles。有关role使用的更多信息,请参阅IAM用户指南

使用IAM role来管理临时凭证,比在 EC2 实例中存储访问密钥更安全。有关更多信息,请参阅 IAM 用户指南中的 使用 IAM 角色向在 Amazon EC2 实例上运行的应用程序授予权限

扫描没有绑定IAM Role的EC2实例

没有绑定IAM Role大概率是在代码中通过AKSK来获取权限。可以通过AWS Config的ec2-instance-profile-attached规则进行检查,识别没有绑定IAM角色的EC2实例。

IAM角色与EC2实例的关联

IAM角色可用于为在Amazon EC2实例上运行的应用程序提供必要的AWS权限。这避免了将访问密钥直接存储在EC2实例上,提高了安全性。IAM角色授予的权限由策略决定,这些策略指定了角色可以执行哪些AWS服务和资源上的操作。

步骤概述:

  1. 创建IAM角色:首先,在IAM中创建一个角色,并附加一组策略,这些策略定义了角色的权限。

  2. 将角色附加到EC2实例:创建或现有的EC2实例可以被指定这个IAM角色。这样,运行在EC2实例上的应用程序就可以利用这个角色的权限,而不需要管理静态的AWS访问密钥。

  3. 在应用程序中利用IAM角色:应用程序可以通过AWS SDK或命令行工具自动获取与角色关联的临时凭证。这些凭证可用于执行允许的AWS服务调用。

在Amazon EC2实例上部署的应用程序可以利用与该实例关联的IAM角色,无需管理静态的AWS凭证即可调用AWS服务。以下是一个示例代码,展示如何使用AWS SDK(本示例以Python为例)调用S3服务,列出一个特定存储桶中的对象。这段代码假设您已将IAM角色附加到EC2实例,且该角色具有访问指定S3存储桶的权限。

import boto3

def list_s3_objects(bucket_name):
    """列出S3存储桶中的对象"""
    # 利用EC2实例的IAM角色创建S3服务客户端
    s3 = boto3.client('s3')
    response = s3.list_objects_v2(Bucket=bucket_name)

    if 'Contents' in response:
        for item in response['Contents']:
            print(item['Key'])
    else:
        print(f"存储桶 {bucket_name} 为空或不存在。")

# 替换为您的存储桶名称
bucket_name = 'your-bucket-name'
list_s3_objects(bucket_name)

通过使用EC2实例的IAM角色,这段代码无需显式提供AWS访问密钥和密钥ID,提高了应用程序的安全性和维护性。

可以参考: #

3.3 运行在Amazon EKS上的应用

使用IAM role来管理临时凭证,比在 EKS中存储访问密钥AK/SK更安全。

EKS上配置IAM角色以供Pods使用:

  1. 创建IAM角色和策略:首先创建一个IAM角色,然后创建或关联一个策略,该策略规定了对AWS服务的访问权限。确保策略满足你的应用需求。

  2. 使用IAM roles for service accounts (IRSA):利用EKS的IAM roles for service accounts (IRSA)功能,允许Kubernetes服务帐户关联IAM角色。这样,运行在EKS上的Pods可以使用该服务帐户的权限,从而通过AWS的临时凭证访问AWS资源,无需管理静态的访问密钥。

  3. 创建OIDC身份提供者:在EKS集群中创建OIDC(OpenID Connect)身份提供者。这一步是启用IRSA的前提。

  4. 关联IAM角色和Kubernetes服务账号:创建一个Kubernetes服务账号,并通过注解将其与IAM角色关联。这样,在此服务账号下运行的Pods就有权使用IAM角色的权限。

示例:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: my-service-account
  namespace: my-namespace
  annotations:
    eks.amazonaws.com/role-arn: arn:aws:iam::123456789012:role/my-iam-role

通过这种方式,EKS上运行的应用程序能够更安全、更方便地管理对AWS资源的访问权限。

更多信息参考此文档:https://aws.github.io/aws-eks-best-practices/security/docs/iam/#restrict-access-to-the-instance-profile-assigned-to-the-worker-node

3.4 Lambda中使用IAM Role

在AWS Lambda中使用IAM角色代替代码中的访问密钥(AK/SK)是一种提高安全性的最佳实践。首先,确保为Lambda函数创建或指定一个具有所需权限的IAM角色。这个角色应包括对必要AWS服务的访问权限。在Lambda函数的配置中,指定这个IAM角色。通过这种方式,Lambda运行时会自动使用该角色的权限,无需在代码中嵌入AK/SK。这样不仅简化了凭证管理,还减少了因凭证泄露导致的安全风险。AWS还会负责管理这些角色的临时凭证,确保访问安全且高效。

步骤4: 回收AK/SK

确认所有权限都改造完成后,就可以开始回收AK/SK了,具体步骤如下:

  1. 登录AWS管理控制台。

  2. 转到IAM服务页面。

  3. 在导航窗格中选择“用户”。

  4. 选择相应的用户。

  5. 在“安全凭证”标签下,找到需要回收的AK/SK。

  6. 采取措施禁用或删除AK/SK。

通过对访问类型的明确区分和对敏感凭证的及时管理,可以大幅降低安全风险。

其他应用场景的短期有效权限使用

IAM Role还可以用于跨账号访问以及跨服务访问,更多的访问使用介绍参见IAM Role的应用场景

最后更新于