| name | aws-security |
| description | AWS security audit and account information without MCP. Use when the user asks about account info, session details, credential verification, or security posture. |
AWS Security & Account Info / AWS ๋ณด์ ๋ฐ ๊ณ์ ์ ๋ณด
MCP ์์ด boto3/CLI๋ก ์ง์ ๋ณด์์ ๊ด๋ฆฌํฉ๋๋ค.
When to Use / ์ฌ์ฉ ์์
- "ํ์ฌ AWS ๊ณ์ ์ ๋ณด" / "Current AWS account info"
- "์๊ฒฉ ์ฆ๋ช
ํ์ธ" / "Verify credentials"
- "๋ณด์ ๊ฐ์ฌ" / "Security audit"
- "๋ฆฌ์์ค ํ๊น
ํ์ธ" / "Check resource tagging"
Account & Session Info / ๊ณ์ ๋ฐ ์ธ์
์ ๋ณด
aws sts get-caller-identity
aws iam list-account-aliases
aws configure get region
import boto3
sts = boto3.client('sts')
identity = sts.get_caller_identity()
print(f"Account: {identity['Account']}")
print(f"ARN: {identity['Arn']}")
print(f"UserId: {identity['UserId']}")
Security Audit / ๋ณด์ ๊ฐ์ฌ
IAM Credential Report / IAM ์๊ฒฉ ์ฆ๋ช
๋ณด๊ณ ์
aws iam generate-credential-report
aws iam get-credential-report --query 'Content' --output text | base64 -d
Access Key Age Check / ์ก์ธ์ค ํค ๊ฒฝ๊ณผ ํ์ธ
iam = boto3.client('iam')
users = iam.list_users()['Users']
for user in users:
keys = iam.list_access_keys(UserName=user['UserName'])['AccessKeyMetadata']
for key in keys:
age = (datetime.now(key['CreateDate'].tzinfo) - key['CreateDate']).days
print(f" {user['UserName']}: {key['AccessKeyId']} ({age} days, {key['Status']})")
MFA Status Check / MFA ์ํ ํ์ธ
for user in iam.list_users()['Users']:
mfa = iam.list_mfa_devices(UserName=user['UserName'])['MFADevices']
status = 'MFA enabled' if mfa else 'NO MFA'
print(f" {user['UserName']}: {status}")
Policy Simulation / ์ ์ฑ
์๋ฎฌ๋ ์ด์
iam.simulate_principal_policy(
PolicySourceArn='arn:aws:iam::123456789012:user/testuser',
ActionNames=['s3:GetObject', 's3:PutObject', 'ec2:DescribeInstances'],
ResourceArns=['*']
)
Resource Discovery / ๋ฆฌ์์ค ํ์
Cloud Control API - Any Resource / ๋ชจ๋ ๋ฆฌ์์ค ์กฐํ
cc = boto3.client('cloudcontrol')
resource_types = [
'AWS::EC2::Instance',
'AWS::EC2::SecurityGroup',
'AWS::S3::Bucket',
'AWS::RDS::DBInstance',
'AWS::Lambda::Function',
'AWS::IAM::Role',
]
for rt in resource_types:
try:
result = cc.list_resources(TypeName=rt)
count = len(result.get('ResourceDescriptions', []))
print(f" {rt}: {count} resources")
except Exception:
pass
Tag Compliance Check / ํ๊ทธ ์ค์ ํ์ธ
aws resourcegroupstaggingapi get-resources \
--query 'ResourceTagMappingList[?Tags==`[]`].ResourceARN'
Network Security / ๋คํธ์ํฌ ๋ณด์
aws ec2 describe-security-groups \
--query 'SecurityGroups[?IpPermissions[?IpRanges[?CidrIp==`0.0.0.0/0`]]].{ID:GroupId,Name:GroupName}'
aws ec2 describe-subnets \
--query 'Subnets[?MapPublicIpOnLaunch==`true`].{ID:SubnetId,VPC:VpcId,CIDR:CidrBlock}'
Quick Security Checklist / ๋น ๋ฅธ ๋ณด์ ์ฒดํฌ๋ฆฌ์คํธ
import boto3
def security_audit():
iam = boto3.client('iam')
summary = iam.get_account_summary()['SummaryMap']
print(f"Root MFA: {'YES' if summary['AccountMFAEnabled'] else 'NO'}")
for u in iam.list_users()['Users']:
mfa = iam.list_mfa_devices(UserName=u['UserName'])['MFADevices']
if not mfa:
print(f" No MFA: {u['UserName']}")
from datetime import datetime, timezone
for u in iam.list_users()['Users']:
for k in iam.list_access_keys(UserName=u['UserName'])['AccessKeyMetadata']:
age = (datetime.now(timezone.utc) - k['CreateDate']).days
if age > 90:
print(f" Old key ({age}d): {u['UserName']} - {k['AccessKeyId']}")
for r in iam.list_roles()['Roles']:
last_used = r.get('RoleLastUsed', {}).get('LastUsedDate')
if not last_used:
print(f" Never used role: {r['RoleName']}")
security_audit()