본문으로 건너뛰기
김신건의 로그

[AWS] SSM Session Manager: 배스천 없는 셸 접속

· 수정 · 📖 약 4분 · 1,398자/단어 #aws #cloud #ssm #systems-manager #security #remote-access
AWS Session Manager, SSM Session Manager, Session Manager, 배스천 없는 SSH, 포트 없는 셸

정의

AWS SSM Session ManagerSystems Manager 의 셸 접속 기능. SSH / RDP 포트를 열지 않고, 배스천 호스트도 없이, 브라우저 / CLI / IDE 에서 EC2 및 온프레미스 서버에 셸을 열 수 있게 한다. 모든 세션은 CloudTrail 로 감사되고 로그는 S3 / CloudWatch Logs 에 저장.

한 줄 요약: 포트 22/3389 를 영원히 닫아도 서버 관리 가능하게 만드는 서비스.

왜 Session Manager 인가

전통 원격 접속의 문제:

  • 인바운드 포트 개방 (SSH 22, RDP 3389) = 공격 표면 증가
  • 배스천 호스트 = 별도 EC2 유지 비용 + 관리 부담
  • SSH 키 관리 = 유출 위험, 로테이션 어려움, 개인 IdP 와 연동 어려움
  • 접속 감사 어려움 = 누가 언제 무엇을 실행했는지 추적 부실
  • 프라이빗 서브넷 접속 = VPN / bastion / port forwarding 필요

Session Manager 의 답:

  • 인바운드 포트 0 개 (SSM Agent 가 아웃바운드 443 으로 SSM 서비스에 연결)
  • 배스천 불필요 (SSM 서비스 자체가 게이트웨이 역할)
  • SSH 키 불필요 (IAM role 로 인증)
  • 완전한 감사 (모든 세션 시작/명령/출력 기록)
  • 프라이빗 서브넷 지원 (VPC Endpoint 로)

어떻게 동작하는가

sequenceDiagram
    participant User as 사용자<br/>(콘솔/CLI)
    participant STS as IAM/STS
    participant SSM as SSM 서비스
    participant Agent as SSM Agent<br/>(EC2 안)

    Note over Agent: 부팅 시부터<br/>SSM 서비스에 지속 연결<br/>(아웃바운드 443)

    User->>STS: 자격증명 확인
    STS-->>User: 세션 토큰
    User->>SSM: StartSession(target=i-abc123)
    SSM->>SSM: IAM 정책 검사

    alt 허용됨
        SSM->>Agent: 세션 초대 (기존 연결 재사용)
        Agent-->>SSM: 세션 시작 승인
        SSM-->>User: WebSocket URL

        loop 인터랙티브 세션
            User->>SSM: 키 입력 (WebSocket)
            SSM->>Agent: 키 전달
            Agent->>Agent: 셸에서 실행
            Agent-->>SSM: 출력 스트림
            SSM-->>User: 출력
        end

        Note over SSM: 모든 세션 로그를<br/>S3 / CloudWatch Logs 로
    else 거부
        SSM-->>User: Access Denied
    end

핵심 통찰:

  • 연결 방향이 역전됨: 사용자 → 서버가 아니라, 서버 (SSM Agent) → SSM 서비스 로 아웃바운드 연결
  • 사용자는 SSM 서비스와 통신 (443)
  • SSM 서비스가 이미 열린 아웃바운드 연결을 통해 서버로 명령 전달
  • 인바운드 규칙 필요 없음

필요한 준비물

1. SSM Agent

  • Amazon Linux 2/2023, Ubuntu, RHEL 등 최신 AMI 에 기본 설치
  • 온프레미스 서버는 수동 설치 (amazon-ssm-agent 패키지)
  • 자동 시작 (systemd)

2. IAM Instance Profile

인스턴스에 SSM 통신 권한 부여. AmazonSSMManagedInstanceCore AWS 관리형 정책이 최소.

Instance Profile: EC2-SSM-Role
  Policies:
    - AmazonSSMManagedInstanceCore  (필수)
    - CloudWatchAgentServerPolicy    (모니터링용, 선택)

3. 사용자 IAM 권한

관리자에게는 ssm:StartSession, 대상 리소스 지정.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "ssm:StartSession",
      "Resource": [
        "arn:aws:ec2:*:*:instance/*",
        "arn:aws:ssm:*::document/AWS-StartSSHSession"
      ],
      "Condition": {
        "StringEquals": {
          "aws:ResourceTag/Environment": "prod",
          "ssm:SessionDocumentAccessCheck": "true"
        }
      }
    }
  ]
}
  • 태그 기반 접근 제어 가능 (Environment=prod 만 접근 허용 등)
  • DocumentAccessCheck: 특정 SSM Document 만 사용

4. (프라이빗 서브넷) VPC Endpoint

프라이빗 서브넷 인스턴스는 인터넷 접근 없이 SSM 통신하려면 3개 endpoint 필요:

  • com.amazonaws.<region>.ssm
  • com.amazonaws.<region>.ssmmessages
  • com.amazonaws.<region>.ec2messages

접속 방법 3 가지

1. AWS 콘솔 (브라우저)

EC2 콘솔 → Connect → Session Manager. 브라우저 안에서 xterm.

적합:

  • 임시 트러블슈팅
  • 노트북 없이 태블릿 등에서
  • 처음 시작

2. AWS CLI

aws ssm start-session --target i-0abc123def456
  • 로컬 터미널에서 그대로
  • Session Manager Plugin 필요 (brew install --cask session-manager-plugin)

3. SSH 프록시 (기존 SSH 도구와 호환)

~/.ssh/config:

Host i-* mi-*
  ProxyCommand aws ssm start-session --target %h \
    --document-name AWS-StartSSHSession \
    --parameters portNumber=%p
ssh ec2-user@i-0abc123def456
scp file.tar.gz ec2-user@i-0abc123def456:/tmp/

핵심: scp, rsync, VS Code Remote SSH 등 SSH 기반 도구가 그대로 작동. 인바운드 22 여전히 닫힘.

4. 포트 포워딩 (Port Forwarding)

로컬 포트 → 인스턴스의 특정 포트 터널.

# 로컬 5432 → 인스턴스 5432 (RDS 프록시)
aws ssm start-session \
  --target i-0abc123def456 \
  --document-name AWS-StartPortForwardingSession \
  --parameters "portNumber=5432,localPortNumber=5432"

# 원격 호스트 포워딩 (인스턴스 → RDS)
aws ssm start-session \
  --target i-0abc123def456 \
  --document-name AWS-StartPortForwardingSessionToRemoteHost \
  --parameters '{"host":["my-db.abc.us-east-1.rds.amazonaws.com"],"portNumber":["5432"],"localPortNumber":["5432"]}'

로컬에서 psql -h localhost -p 5432 로 RDS 접속 가능. 개발자 노트북에서 프라이빗 RDS 접속의 표준 방법.

감사 & 로깅

CloudTrail 이벤트

  • StartSession, TerminateSession, ResumeSession 이벤트 자동 기록
  • 누가 언제 어느 인스턴스에 접속했는지 감사

세션 로그

Preferences 에서 활성화하면 모든 키 입력 + 출력 을 저장.

flowchart LR
    Session["세션 실행<br/>사용자 명령 + 셸 출력"]

    Session --> KMS["KMS 로 암호화 (선택)"]
    KMS --> S3[("S3 버킷")]
    KMS --> CWL[("CloudWatch Logs")]

    S3 --> Athena["Athena 로<br/>감사 SQL"]
    CWL --> Insights["CloudWatch Logs<br/>Insights"]

용도:

  • 규제 준수 감사 (SOC2, PCI-DSS, HIPAA)
  • 사고 조사 (누가 무엇을 실행했나)
  • 보안 팀 정책 강제

실행 사용자

기본은 ssm-user 라는 전용 사용자 (sudo 권한 있음). 변경 가능:

Session Manager Preferences:
  Run As: ec2-user   # 기존 사용자로 세션 시작

패턴:

  • 개인화: 사용자마다 다른 OS 계정으로 실행 (audit trail 명확)
  • 표준화: 모두 ssm-user 로 실행 (단순함)

Session Manager vs 대안 비교

방법인바운드 포트배스천SSH 키감사
SSH 직접22 개방X필요서버 로그만
배스천 호스트22 (배스천만)O필요배스천 로그
VPN + SSHVPN 필요X필요VPN + SSH 로그
EC2 Instance Connect22 (일시 IP)X임시CloudTrail
Session Manager없음X없음완전 (모든 입력)

실전 사용 시나리오

1. 프라이빗 서브넷 EC2 접속

1. EC2 는 프라이빗 서브넷 (인터넷 X)
2. VPC Endpoint (ssm, ssmmessages, ec2messages) 활성
3. IAM Instance Profile 에 AmazonSSMManagedInstanceCore
4. 개발자: aws ssm start-session --target i-xxx

배스천/VPN 없이 프라이빗 서브넷 접근 성공.

2. 로컬 노트북에서 프라이빗 RDS 접속

1. Session Manager 로 EC2 에 port forwarding 세션
2. 로컬 5432 -> EC2 -> RDS 5432 터널
3. psql -h localhost 로 접속

RDS 를 인터넷에 노출 없이 개발자가 접속.

3. RDP 대체 (Windows)

aws ssm start-session \
  --target i-0abc \
  --document-name AWS-StartPortForwardingSession \
  --parameters "portNumber=3389,localPortNumber=13389"

mstsc /v:localhost:13389 로 RDP 접속. 인바운드 3389 여전히 닫힘.

4. 감사가 필수인 환경

Preferences:
  Enable session logging: S3 + CloudWatch Logs
  KMS 암호화: enabled

정책:
  1일 1회 CloudWatch Logs Insights 로 특권 세션 리뷰
  이상 세션은 알림 (SNS + Lambda)

금융, 의료, 정부 등 감사 필수 환경.

함정

WARNING

SSM Agent + IAM Instance Profile 없으면 관리형 노드 안 됨. 두 조건 모두 필요.

CAUTION

프라이빗 서브넷 접근 시 VPC Endpoint 3개 (ssm, ssmmessages, ec2messages) 필수. 없으면 SSM Agent 가 SSM 서비스와 통신 불가.

WARNING

세션 로그 활성화 안 함 = 감사 사각. 규제 환경은 반드시 S3 + CloudWatch Logs 로.

IMPORTANT

ssm-user 는 sudo 권한. 원치 않으면 특정 사용자 (ec2-user 등) 로 실행하도록 Preferences 조정.

CAUTION

CLI 접속 시 Session Manager Plugin 필요. 설치 안 하면 CLI 로 세션 못 엶.

WARNING

IAM 정책 지나치게 넓음 = 모든 EC2 접근 허용. 태그 조건 (Environment=prod), 리소스 지정으로 최소 권한.

IMPORTANT

SCP 로 파일 전송 은 SSH 프록시 설정 후 가능. Session Manager 자체는 raw 셸만.

관련 위키

이 글의 용어 (9개)
[AWS] CloudTrail (API Activity Logging)cloud
정의 AWS CloudTrail 은 AWS 계정의 API 호출 및 사용자 활동을 기록 하는 감사 로깅 서비스입니다. "누가, 언제, 어디서, 어떤 API 를, 어떤 리소스에 대해…
[AWS] CloudWatch: 메트릭, 로그, 알람cloud
정의 CloudWatch = AWS 의 모니터링 + 로그 + 알람 통합 서비스. 메트릭 수집, 로그 집계, 대시보드, 알람, 이상 감지를 하나의 서비스에서 제공. 사용 상황 | …
[AWS] EC2: 인스턴스 타입, AMI, EBScloud
정의 EC2 (Elastic Compute Cloud) = AWS 의 VM 서비스. instance type (CPU / RAM / NW) 결정 + AMI (OS 이미지) + E…
[AWS] IAM: User, Role, Policy, STScloud
정의 IAM (Identity and Access Management) = AWS 의 권한 관리 전부. User, Group, Role, Policy 로 구성. "누가 어떤 리소…
[AWS] KMS: 암호화 키 관리, envelope encryptioncloud
정의 KMS (Key Management Service) = 암호화 키 중앙 관리. envelope encryption + IAM 통합 + 감사 로그. 키 종류 | 종류 | 의미…
[AWS] S3: object storage, storage classes, lifecyclecloud
정의 S3 = AWS 의 object storage. bucket + key + object. 11 9's durability (99.999999999%), 무한 확장. 2026…
[AWS] SSM Run Command: 다수 서버 명령 실행cloud
정의 AWS SSM Run Command 는 하나의 API 호출로 수십 - 수천 개의 EC2 및 온프레미스 서버에 명령을 원격 실행 하는 Systems Manager 기능. SS…
[AWS] Systems Manager: 노드 운영 도구 모음 (인덱스)cloud
정의 AWS Systems Manager (SSM) 는 AWS / 온프레미스 / 멀티클라우드에 걸친 노드 (서버, 인스턴스, VM, IoT 등) 를 대규모로 안전하게 관리 / 운…
[AWS] VPC: Virtual Private Cloudcloud
정의 VPC (Virtual Private Cloud) = AWS 안의 논리적 격리 네트워크. CIDR 정의 + subnet 분할 + 라우팅. AWS 리소스를 격리된 네트워크에 …

💬 댓글

사이트 검색 / 명령어

검색

스크롤 = 확대/축소 · 드래그 = 이동 · 0 = 원래 크기 · ESC = 닫기