AWS SSM을 사용한다면 요구사항을 모두 만족 할 수 있습니다.
AWS DOCS for SSM
SecurityGroup 생성
VPC Endpoint 생성
Service
- com.amazonaws.us-east-1.ec2messages
- com.amazonaws.us-east-1.ssmmessages
- com.amazonaws.us-east-1.ssm
💡 SSM 을 위한 VPC Endpoint를 생성하면 불필요한 외부 통신을 허용하지 않아도 된다.
AmazonSSMMnagedInstanceCore Policy를 포함한 IAM ROLE 생성
💡 ssm-user의 권한만 통제하면 EC2에 접속하는 모든 USER의 권한을 통제할 수 있음.
ssm-user의 권한 설정 (/etc/sudoers.d/ssm-agent-users)
기본적으로 sudo 가 모든 명령어에 대해 열려있음

#!/bin/bash
INSTANCE_IDS=$(aws ec2 describe-instances \
--region us-east-1 \
--filters "Name=instance-state-name,Values=running" \
--query "Reservations[*].Instances[*].InstanceId" \
--output text)
for INSTANCE_ID in $INSTANCE_IDS; do
echo "Sending command to $INSTANCE_ID..."
aws ssm send-command \
--region us-east-1 \
--document-name "AWS-RunShellScript" \
--targets "Key=InstanceIds,Values=$INSTANCE_ID" \
--cli-input-json file://user-management.json
done
{
"Parameters": {
"commands": [
"#!/bin/bash",
"echo 'ssm-user ALL=(ALL) !/bin/su, !/bin/rm, !/bin/mv, !/bin/cp, !/bin/chmod, !/bin/chown, !/sbin/reboot, !/sbin/shutdown, !/bin/kill, !/bin/apt, !/bin/apt-get,!/bin/curl, !/bin/wget' | sudo tee -a /etc/sudoers.d/ssm-agent-users > /dev/null 2>&1"
]
}
}
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetEncryptionConfiguration"
],
"Resource": [
"arn:aws:s3:::{BucketName}/*",
"arn:aws:s3:::{BucketName}"
]
}
]
}
EC2에 대한 접속, 유저 권한 및 로깅을 설정할 수 있는 방법은 상당히 많습니다.
다만 별다른 설치 없이 AWS Managed Service인 SSM만으로 이정도로 제어할 수 있다는 점은 상당히 유의미 한 것 같습니다.
해당 포스트에 포함되지 않은 IAM ROLE별로 접근할 수 있는 EC2를 제어하는 등의 기능을 추가적으로 이용한다면,
대부분의 PROD 환경에 요구되는 보안사항을 준수할 수 있을 것으로 보입니다.