如何检查哪些IAM角色及其策略json附加到正在运行的EC2 实例?
是否可以通过AWS CLI实现?
这里是aws ec2 ddescribe-instances的响应
我尝试触发命令 - aws iam list-instance-profiles ,它给了我以下错误 -
发生错误(AccessDenied)时调用ListInstanceProfiles操作:用户:无权执行:iam:资源上的ListInstanceProfiles:
答案 0 :(得分:2)
是。如果查看aws ec2 describe-instances
命令生成的响应,您会注意到生成的JSON数据
IamInstanceProfile
- > (结构)与实例关联的IAM实例配置文件(如果适用)。
Arn
- > (字符串)实例配置文件的Amazon资源名称(ARN)。
Id
- > (字符串)实例配置文件的ID。
稍后,您可以使用iam
cli interface来获取政策/角色详情。
aws iam get-instance-profile --instance-profile-name <name here>
答案 1 :(得分:1)
请运行describe-instances命令(OSX / Linux / UNIX)确定所选实例是否分配了任何IAM角色/实例配置文件:
aws ec2 describe-instances
--region us-east-1
--instance-ids i-07a2ad8872fb3226b
--query 'Reservations[*].Instances[*].IamInstanceProfile'
答案 2 :(得分:1)
无需查找已安装计算机的AWS CLI,仅该计算机应具有Internet且没有元数据的阻止。
您可以卷曲EC2中的元数据
curl -s http://169.254.169.254/latest/meta-data/iam/info |grep InstanceProfileArn | awk '{print $3}'
答案 3 :(得分:0)
如果您使用的是boto3(Python):
import boto3
client = boto3.client('ec2')
response = client.describe_instances()
# Example 1 - Short version
for r in response['Reservations']:
for instance in r['Instances']:
if instance.get('IamInstanceProfile'):
print (instance['InstanceId'], instance['IamInstanceProfile'])
# Example 2 - Longer version
for r in response['Reservations']:
for instance in r['Instances']:
if instance.get('IamInstanceProfile'):
raw = client.describe_iam_instance_profile_associations(
Filters=[
{
'Name': 'instance-id',
'Values': [instance['InstanceId']]
}
]
)
current_res = raw.get('IamInstanceProfileAssociations')[0] # <----- We're passing only one instance id in filter so only one result is returned
print (current_res.get('InstanceId'), current_res.get('IamInstanceProfile'))
答案 4 :(得分:0)
使用 boto3
ec2 = session.client('ec2')
iam = session.client('iam')
使用 ec2 客户端描述实例配置文件关联并获取实例配置文件名称
ec2.describe_iam_instance_profile_associations(Filters=[{'Name': 'instance-id','Values': ['i-02a1cde71XXXXXX']}])
回复:
{'IamInstanceProfileAssociations': [{'AssociationId': 'iip-assoc-0f7dd8ceeXXXXXX', 'InstanceId': 'i-02a1cde71XXXXXX', 'IamInstanceProfile': {'Arn': 'arn:aws:iam::12345679012:instance-profile/XYZ', 'Id': 'XXXXXXXXXXXXX'}, 'State': 'associated'}],....... }
使用 iam 客户端并调用 get_instance_profile 来获取与 instanceProfile 关联的 RoleName
iam.get_instance_profile(InstanceProfileName='XYZ')
回复:
{'InstanceProfile': {'Path': '/', 'InstanceProfileName': 'XYZ', 'InstanceProfileId': 'XXXXXXXXXXXXX', 'Arn': arn:aws:iam::12345679012:instance-profile/XYZ', 'CreateDate': datetime.datetime(2021, 6, 10, 16, 15, 8, tzinfo=tzutc()), 'Roles': [{'Path': '/', 'RoleName': 'ABCD', ............... 'RetryAttempts': 0}}
或者,您可以使用 list_attached_role_policies 来了解角色附加的托管策略是什么
iam.list_attached_role_policies(RoleName='ABCD')
回复:
{'AttachedPolicies': [{'PolicyName': 'EFG', 'PolicyArn': 'arn:aws:iam::12345679012:policy/EFG'}], 'IsTruncated': ......}}