【技术贴】强推!批量管理密钥时效方法!

2023-01-16 16:00

IAM role非常便捷,在任何时候,我们都建议在能使用IAM role的地方都使用它,比如在亚马逊云科技的所有服务上(包括EC2、RDS、Lambda等)。但在避免不了使用Accesskey访问密钥的时候,我们建议您定期的更换密钥,来降低密钥被盗用的风险。


本文使用两种方式,带您检查使用时长过长的访问密钥。

1.手动检查:通过控制台或aws cli命令行的方式检查,以停用您认为有风险的密钥。

2.Lambda自动检查通知:使用EventBridge、Lambda,定期自动执行Lambda来检查您使用时长过长的访问密钥,并通知到邮件、企业微信、钉钉、Slack等(本文以企业微信为例)。


   手动检查   






控制台方式

1.控制台进⼊IAM(Identity and Access Management)身份管理服务。

2.在⽤户(User)的安全证书(security certificate)栏位下,访问密钥处可以看到您当前User所创建的访问密钥(access key)列表。此处可以检查每个访问密钥的创建时间,状态栏处可以选择停⽤,以在合适时间合理管理您的密钥。


AWS CLI方式

1.终端键⼊ aws iam list-access-keys ,查看当前User所创建的访问密钥(access key/secret key)列表,如上图所示。 CreateDate 处以检查每个访问密钥的创建时间

2.在⽤户(User)的安全证书(security certificate)栏位下,访问密钥处可以看到您当前User所创建的访问密钥

(access key)列表。此处可以检查每个访问密钥的创建时间,状态栏处可以选择停⽤,以在合适时间合理管理

您的密钥。


进阶 - Lambda⾃动检查并通知





架构总览

Lambda函数:python编写代码,以检查该账户下所有超过30天的accesskey,并通知到后端软体,本⽂以企业微信为例。

EventBridge:Schedule定期执⾏事件,每30天执⾏⼀次Lambda,以⾃动完成

auto_check_accesskey_notifier.py 的任务。


Lambda的函数部署






创建Lambda函数

1.AWS Lambda服务下创建Lambda函数。

2.运⾏环境选择Python3.8,使⽤合适的IAM⻆⾊(为了演示⽅便,此处使⽤admin权限),完成创建。

打包并上传Lambda函数代码

以下源码以及zip⽂件可从Github仓库中获取。更多的场景需求,欢迎⼀起讨论。

Github仓库:

https://github.com/Erlichooo/auto_check_accesskey_notifier

在本地空⽂件夹下,新建函数⽂件 lambda_function.py ,内容如下:

from datetime import datetimeimport boto3import requestsimport jsonimport os# 企业微信机器人变量tokenUrl = "https://qyapi.weixin.qq.com/cgi-bin/gettoken"corpid = os.getenv('corpid')corpsecret = os.getenv('corpsecret')agentid = os.getenv('agentid')# 获取企微tokendef get_token():    values = {'corpid': corpid, 'corpsecret': corpsecret}    req = requests.post(tokenUrl, params=values)    data = json.loads(req.text)    return data["access_token"]sendMsg = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token="# 发送消息到企微机器人(通过token+机器人agentid)def send_msg(msg):    url = sendMsg + get_token()    print(url)    values = """{"touser" : "@all" ,      "msgtype":"text",      "agentid":""" + agentid + """,      "text":{        "content": "%s"      },      "safe":"0"      }""" % msg    requests.post(url, values)# 列出当前账号下超过30天的accesskeydef list_ot_accesskey():    # Create IAM client    iam = boto3.client('iam')    response = iam.list_users()    msg_aksk = ''    # 遍历Users    for Users in response['Users']:        User_name = Users['UserName']        paginator = iam.get_paginator('list_access_keys')        for response_lsak in paginator.paginate(UserName=User_name):            i = 0            count_keys = len(response_lsak['AccessKeyMetadata'])            # 遍历accesskey            for i in range(count_keys):                AK_Key_Id = response_lsak['AccessKeyMetadata'][i]['AccessKeyId']                AK_Key_createDate = response_lsak['AccessKeyMetadata'][i]['CreateDate']                # 获取当前时间                date_now = datetime.now().date()                AK_Key_date = AK_Key_createDate.date()                AK_used_days = date_now - AK_Key_date                days = int(str(AK_used_days).split(" ")[0])                if days >= 30:                    tmp_aksk = "\n\nAccessKey: " + AK_Key_Id + "\nIAM user: " + User_name + "\nUsage: " + str(                        days) + " days"                    msg_aksk = msg_aksk + tmp_aksk    return msg_akskdef lambda_handler(event, context):    # 获取当前账户AccountId    sts = boto3.client('sts')    response_identity = sts.get_caller_identity()    accountId = response_identity['Account']    # 获取超过30天的accesskey    msg_aksk = list_ot_accesskey()    msg = "Notification Details:\nAccessKeys under your account[" + accountId + "] have been already used more than 30 days, pls check it and change another to use.\n" + msg_aksk    # 将消息发送到企业微信    send_msg(msg)    print(format(msg) + '\n')

使⽤ python requests 库发送 post 请求:

独⽴安装 requests 库,需要将包和 lambda 代码⼀起上传到 AWS Lambda 执⾏环境。以使⽤虚拟环境

来安装函数依赖为例。

参考⽂档:

https://docs.aws.amazon.com/zh_cn/lambda/latest/dg/python-package.html#python-package-dependencies

1.创建虚拟环境。

python3 -m venv v-env

2.激活环境。

source v-env/bin/activate

3.使用 pip 安装库。

pip install requests

4.停用虚拟环境。

deactivate

5.使用库内容创建一个 ZIP 存档。

cd v-env/lib/python3.9/site-packages

6.将函数代码添加到存档中

zip -r9 ${OLDPWD}/function.zip .cd $OLDPWDzip -g function.zip lambda_function.py


7.将二进制 ZIP 部署包上传到Lambda 并更新函数代码

8.通过更改代码或编辑函数环境变量,将agentid、corpid、corpsecret更改为您企业微信对应值

tips.   agentid: 机器人代理ID,corpid: 公司ID,corpsecret: 公司密钥


EventBridge Schedule定时事件创建

1.Amazon EventBridge服务下,创建EventBridge 计划。

2.指定计划。按照您的业务需求,填写合适的执⾏频率,本例以30天为⼀个周期,⾃动执⾏lambda检查本账户下使⽤时⻓过⻓的accessskey。

3.选择⽬标。选择Lambda作为事件的执⾏⽬标,Lambda函数选择先前部署的

auto_check_accesskey_notifier 函数,完成创建。


效果演示

以上已经完成使⽤Lambda、EventBridge⾃动检查并通知到企业微信的实验,效果如下图示:


云与应用现代化
——
扫描关注微信公众号
获取更多云端资讯
联系我们
——

模板表单-2(1)

  • 姓名*

  • 电话*

  • 邮箱*

  • 公司*

  • 职称*

  • 地址*

  • 需求*