AWS SSM만으로 Private EC2 완전 제어

‍최정민·2025년 4월 9일
0
post-thumbnail

1. 요구사항

  • Public Subnet
  • Private Subnet에 위치한 EC2에 SSH외의 다른 벙법으로의 접근이 필요 (22번 port 사용x)
  • EC2에 접근하는 사용자의 권한을 중앙에서 통제 할 수 있어야함.
  • 접속 및 사용자의 활동을 저장해야 한다.

2. 솔루션 : AWS SSM


3. SSM-USER로 EC2 접속 (with VPC Endpoint)

1) VPC Endpoint 생성

  • SecurityGroup 생성

    • Inbound rules
      • Source: EC2가 존재하는 Private Subnet의 CIDR Block
      • Port : 443
    • Outbound rules : x
  • VPC Endpoint 생성

    • Service
      - com.amazonaws.us-east-1.ec2messages
      - com.amazonaws.us-east-1.ssmmessages
      - com.amazonaws.us-east-1.ssm

💡 SSM 을 위한 VPC Endpoint를 생성하면 불필요한 외부 통신을 허용하지 않아도 된다.


2) EC2 Profile 설정

  • IAM ROLE 생성
    • AmazonSSMMnagedInstanceCore Policy를 포함한 IAM ROLE 생성

  • EC2 Profile 설정

3) EC2’s SecurityGroup 설정

  • Inbound rules : X
  • Outbound rules
    • Destination : VPC Endpoint(for ssm)’s SecurityGroupID
    • Port : 443


4) 접속 테스트

  • SSM Agent를 재시작하기 위해 인스턴스 재기동
  • Session Manager를 통한 접속


4. RUN-SCRIPT를 통해 USER권한 관리

1) ssm-user

  • 현재 설정에서 session manager를 제외한 방식으로는 EC2 접근 불가능
  • session manager 설정을 변경하지 않는 이상 모든 user는 ssm-user로 접속할 수 밖에 없음

💡 ssm-user의 권한만 통제하면 EC2에 접속하는 모든 USER의 권한을 통제할 수 있음.

  • ssm-user의 권한 설정 (/etc/sudoers.d/ssm-agent-users)

    • 기본적으로 sudo 가 모든 명령어에 대해 열려있음

      ![](https://velog.velcdn.com/images/cjm2021401/post/8a345953-86ea-4fe7-8521-8bc40118594e/image.png)

2) USER 권한 관리 스크립트 적용 (RUN Command)

  • user-management-init.sh
    • AWS CLI에서 모든 EC2 불러온 후 RUN Script 실행
#!/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
  • user-management.json
    • 실행하고자 하는 명령어
      • /etc/sudoers.d/ssm-agent-users 파일에 비밀번호를 요구하는 명령어를 추가
{
    "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"
        ]
    }
}

3) 적용 결과


5. Session Logging 를 통한 사용자 행동 로깅

1) VPC Endpoint 생성

  • Service : com.amazonaws.us-east-1.s3
  • Type: Gateway
  • Route Tables: EC2가 있는 Private Subnet의 Route Tables


2) EC2’s SecurityGroup 수정

  • Outbound rule 추가
    • Destination : Prefix lists’s id (com.amazonaws.us-east-1.s3)
    • Port : 443


3) EC2 Profile 권한추가

  • Policy 생성 (ssm-agent가 s3로 log를 보내기 위한 policy)
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "s3:PutObject",
                    "s3:GetEncryptionConfiguration"
                ],
                "Resource": [
                    "arn:aws:s3:::{BucketName}/*",
                    "arn:aws:s3:::{BucketName}"
                ]
            }
        ]
    }
  • 생성된 Policy를 EC2의 Profile(IAM ROLE)에 추가

4) Session Manager 설정에서 Logging 활성화

5) 결과

  • EC2 접속 후 해당 명령어 실행
    • cat 12345678910
    • cat mayf

  • 해당 세션에 대한 로그 S3에 저장

  • Log 파일


6. 마치며

EC2에 대한 접속, 유저 권한 및 로깅을 설정할 수 있는 방법은 상당히 많습니다.

다만 별다른 설치 없이 AWS Managed Service인 SSM만으로 이정도로 제어할 수 있다는 점은 상당히 유의미 한 것 같습니다.

해당 포스트에 포함되지 않은 IAM ROLE별로 접근할 수 있는 EC2를 제어하는 등의 기능을 추가적으로 이용한다면,
대부분의 PROD 환경에 요구되는 보안사항을 준수할 수 있을 것으로 보입니다.

profile
DevOps Engineer

0개의 댓글