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"}""" % msgrequests.post(url, values)# 列出当前账号下超过30天的accesskeydef list_ot_accesskey():# Create IAM clientiam = boto3.client('iam')response = iam.list_users()msg_aksk = ''# 遍历Usersfor 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 = 0count_keys = len(response_lsak['AccessKeyMetadata'])# 遍历accesskeyfor 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_datedays = 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_akskreturn msg_akskdef lambda_handler(event, context):# 获取当前账户AccountIdsts = boto3.client('sts')response_identity = sts.get_caller_identity()accountId = response_identity['Account']# 获取超过30天的accesskeymsg_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⾃动检查并通知到企业微信的实验,效果如下图示:
