[AWS] Session Manager

고구마양갱·2025년 11월 23일

AWS CLOUD

목록 보기
31/32
post-thumbnail

  EC2 를 접속할 때 SSH, bastion host 등을 통해 접속할 수 있으나 이는 구성이 까다롭고 기술적 취약점이 발생할 가능성이 크다. AWS Session Manager 을 활용하면 보안성은 높이고 관리를 쉽게할 수 있다.

1. AWS Session Manager

  AWS System Manager 에서 제공하는 서비스이며, 번거롭게 SSH 및 Bastion host를 통하지 않고 EC2 에 접속할 수 있다. (EC2 외에 다른 인스턴스에도 연결 가능하다. 다만 고급기능이며 사용 시 추가 요금이 발생한다.)

장점을 정리해보면 아래와 같다.

- bastion host와 SSH 설정이 필요 없음
- Security group 필요 없음
- 인터넷과 분리된 private instance 에 바로 접속 가능
- 위의 편리성을 가지면서 SSH 기능을 사용 가능
- KMS 를 통해 세션 데이터 암호화 가능

2. AWS Session manager 구성,테스트

  Session manger 구성은 다음과 같이 진행한다.

*. 외부 인터넷과 통신이 가능한 public EC2 에 session manager 로 연결

- IAM USER 에 적용할 policy 구성
- EC2 에 적용할 role 구성
- EC2 에 SSM Agent 설치
- 세션 암호화를 위한 KMS 구성
- Session manager 를 사용한 EC2 접속

**. 외부 인터넷으로 부터 차단된 private EC2 에 session manager 로 연결

- VPC Endpoint 생성
- private EC2 SSM Agent 설치 및 업데이트

1) IAM USER Policy 할당

  Session manger 연결을 위해 IAM USER 에 SESSION MANAGER 관련 권한을 할당해야 한다. 명확히는 EC2 에 SSM (AWS SYSTEM MANAGEMENT) 으로 연결하기 위해 policy 를 할당하는 것이다.

만약 IAM USER 에 ADMIN 권한이 있다면 별도로 권한을 추가할 필요가 없다. 왜냐면 ADMIN 권한으로 모든 권한을 갖고 있기 때문이다. 그러나 이러한 경우는 특별한 경우이며, 대부분은
제한된 권한을 갖고 있기 때문에 IAM USER 에 session manager 를 사용할 수 있는 권한을 할당해야 한다.

IAM USER 에 직접 할당해도 되지만 보안상 Group 에 할당하는 것을 권장한다.

AmazonSSMManagedInstanceCore 권한을 추가하면 되며, 필요 시 json 으로 policy 를 따로 만들어 적용해도 된다.

AmazonSSMManagedInstanceCore 이며, 이 권한을 그룹 또는 사용자에 할당한다.

 

cf) 그리고 kms 를 통한 세션 암복호화를 위해 사용자 정의 정책을 생성한다.

위와 같이 사용자 정의 policy 를 생성하고, session manager 로 접속할 USER에게 할당한다.

2) EC2 에 IAM ROLE 할당

  IAM USER 에 Policy 를 할당했으니, EC2에 권한을 할당할 role 을 생성한다.
EC2 에는 두개의 policy 를 role 로 할당할 것인데,

하나는 AWS 에서 제공하는 AmazonEC2RoleforSSM 권한이고, 다른 하나는 KMS 로 세션을 암복호화 하기 위한 권한이다. 세션 암복호화 권한은 JSON 을 통해 따로 생성한다.

AmazonEC2RoleforSSM 권한 을 추가하고

위와 같이 사용자 정의 정책을 하나 더 추가한다. 이 정책은 kms 를 통해 세션을 암복호화 하기 위한 정책이다.
kms:Encrypt 는 암호화 권한, kms:Decrypt 는 복호화 권한, kms:ReEncrypt 는 재 암호화 권한, kms:GenerateDataKey 는 데이터 암호화에 필요한 키 생성 권한, kms:DescribeKey 는 암복호화 key 의 상세정보를 조회 할 수 있는 권한이다.

두개의 권한을 role 에 추가하고, 이 role 을 session manager 로 접속할 EC2 에 할당한다.

EC2 에 role 을 할당하는 방법은 EC2 를 선택하고 actions > security > modify IAM role 을 선택한다.

modify IAM role 설정으로 들어가면, 우리가 생성한 role 을 선택할 수 있다. role 선택 후 update IAM role 을 선택해서 role 을 적용한다.

3) EC2 SSM Agent 설치

  SSM(AWS System Manager)으로 EC2에 연결하기 위해선 EC2 에 SSM Agent 를 설치해야 한다. 다행히도 최근에 출시된 리눅스 이미지로 EC2 를 설치하면 자동으로 SSM Agent 가 설치된다. 만약에 에이전트가 활성화 되지 않거나, 에이전트 업데이트가 필요한 경우, 인터넷에 연결된 EC2 에 SSM 정책을 ROLE 로 할당하고, EC2 를 재부팅해주면 SSM Agent 가 활성화(업데이트) 된다.

외부 인터넷과 분리된 EC2 에서 SSM Agent 가 설치되어 있지 않다면, 설치 파일을 수동으로 옮겨서 설치해야 한다. 단순한 SSM Agent 업데이트라면 run command 서비스로 가능하다.

  그런데 외부 인터넷과 차단된 private subnet 에 있는 EC2의 SSM agent는 어떻게 활성화할까 ? 이런 경우엔 VPC endpoint 를 추가하고 보안 그룹, VPC ACL 설정을 변경한 뒤에
SSM 의 RUN Command 기능을 통해 ssm agent 를 활성화 할 수 있다. (대부분의 경우 ssm agent 가 설치되어 있으나, 간혹 버전 업데이트가 필요할 수 있다. 이런 경우에 run command 를 통해 버전 업데이트를 수행하면 된다.)

연결 대상이 여러개면, 일일이 SSM Agent 설치 여부, 버전을 확인하기 어렵다. 이런 경우 SSM 의 INVENTORY 메뉴를 보면 SSM Agent 설치 여부, 버전 현황을 파악할 수 있다.

SSM Agent 설치 정보를 확인할 수 있다. (외부 인터넷 연결이 안되어 있으면 안보일 수 있으며, 외부 인터넷 연결이 차단된 인스턴스의 경우 VPC 에 Endpoint 를 만들어 AWS 서비스와 통신가능하게 하면 SSM agent 설치 현황을 볼 수 있다.)

cf) 외부 인터넷과 분리된(차단된) EC2 에 SSM agent 활성화

  외부 인터넷과 분리된 사설망의 인스턴스의 경우에도 SSM 사용할 수 있다. 다만 몇가지 과정을 추가로 수행해야 한다.

- VPC Endpoint 생성
- VPC ACLs, EC2 보안 그룹 정책 변경
- Run Command 를 통한 SSM Agent 업데이트

1. VPC Endpoint 생성

EC2 가 AWS 와 통신할 수 있게 하기 위해 5가지의 VPC Endpoint 를 생성한다. 외부 인터넷과과 통신하는 것은 아니며, AWS 서비스와만 통신하게 된다. 생성하는 것 자체는 어렵지 않다.

- 5가지의 VPC Endpoint 생성,
AWS 와 SSM Agent 통신 목적 (기본 구성) : SSM Endpoint, EC2messagess Endpoint, ssmmessages Endpoint 구성
추가 구성 : S3 Endpoint (SSM Agent 업데이트), KMS Endpoint (kms 를 통한 세션 암복호화)

생성전에 먼저 dns settings 의 enable dns resolution 과 enable dns hostnames 설정을 활성화 한다.

endpoint 이름을 입력하고 서비스 타입을 aws services 을 선택한다.

endpoint 를 어떤 서비스에 쓸지 선택하는데, ssm endpoint 를 만들 것이므로 ssm 을 검색하여 ssm 을 선택한다.

endpoint 를 어느 vpc 에 생성할지, vpc 를 선택한다. 여기서 private dns name 설정 에 반드시 체크한다. (private dns name 을 체크하지 않으면, 기능 수행에 문제가 있을 수 있다.) ip 유형은 ipv4 를 선택한다.

vpc 에 생성된 az 와 서브넷을 선택한다. public 인스턴스에 session manager로 연결하고 싶으면 생성해놓은 public subnet 을, private instance 에 session manager 로 연결하고 싶으면 private subnet 을 선택한다.

endpoint 보안 그룹을 선택한다. ssm 의 session manager 을 쓰기 위해선 tcp 443 포트를 열어야 한다. aws 서비스 에만 통신하므로 모튼 포트를 오픈했다.

태그는 선택사항이며, 설정완료 후 create endpoint 를 선택해서 endpoint 를 생성한다.

endpoint 생성 후 활성화 될 때 까지 약 1분 정도 소요된다.

이런식으로 ssm Endpoint, ssmmessages Endpoint, ec2messages Endpoint, S3 Endpoint, kms Endpoint 총 5개의 endpoint 를 생성한다.

2. VPC ACLs, EC2 보안 그룹 정책 변경

VPC Endpoint 를 구성했다면, VPC ACLs, EC2 보안 그룹에서

- ssm.region.amazonaws.com
- ssmmessages.region.amazonaws.com
- ec2messages.region.amazonaws.com

을 목적지로 443 포트를 오픈한다.

간단한 과정이므로 사진은 생략한다.

3. Run Command 를 통한 SSM Agent 업데이트

  AWS System manager 메뉴의 Run command 를 활용한다.

우측의 run command 를 선택하면

Run command 로 실행할 수 있는 명렁어 리스트가 출력되며, ssm agent update 를 할 것이므로 AWS-UpdateSSMAgent 를 선택한다.

Description, Version, Allow Downgrade 는 디폴트 옵션 그대로 둔다.

명령어를 실행할 대상 인스턴스를 선택한다. 인스턴스 태그, 리소스 그룹, 개별 인스턴스를 선택하여 Run Command 를 실행할 수 있다. session manager 를 통해 접속할 private 인스턴스를 선택한다.

other parameters의 commet 는 필요하면 입력하고, timeout(seconds)는 run command 로 명령어 실행했을 때 타임아웃을 설정하는 것이다. 120 초로 설정하면 120 초 동안 명령어 실행에 응답이 없으면 실행이 중지된다.

cloudwatch 와 sns, command line 에 대한 설명인데 딱히 설정할 필요 없으니, 디폴트 설정 그대로 둔다. 설정 완료 후 우측 하단의 run 버튼을 선택하면 선택한 명령어가 실행된다.

선택한 인스턴스 대상으로 SSM Agent update 명령어가 실행 되었음을 확인할 수 있다. 이렇게 되면 인터넷과 통신이 불가능한 private instance 의 ssm agent 활성화된 것이다.

4) KMS key 생성

  세션 암복호화를 위해 aws KMS 에서 key를 생성한다. costomer managed keys 에서 key 만 생성하면 되므로 간단하다. 다만 key 를 session manager 에서 사용하기 위한 몇 가지 조건이 있는데

첫째로 costomer managed keys 에서 생성한 key 여야만 session manager 에 적용할 수 있다.

  session manager 의 세션 암복호화를 위한 key 는 반드시 대칭키 (Symmetric key) 여야 한다.
session manager 에서 비대칭키(Asymmetric key)는 사용할 수 없다. 비대칭키는 애초에 session manager 설정에서 조회되지 않고, 대칭키만 조회, 선택할 수 있다.

그리고

마지막으로, session manager 로 연결하는 인스턴스와 생성한 key 의 리전이 일치해야 한다. key 리전은 설정은 single region, multi-region 밖에 없었는데, mulit-region 설정을 해야하나 하지만, 그게 아니다. 우측 상단을 보면 현재 리전이 보이는데, key를 생성할 때 현재 위치한 리전이 어디였는지에 따라 key 의 리전이 결정된다.
만약 key 를 생성할 때 우측 상단에 표시되는 리전이 seoul(서울) 이었다면, 생성한 key의 리전은 seoul(서울)리전이 되는 것이다.

AWS KMS 로 가서, Costomer managed keys 메뉴에서 대칭키를 생성한다.

우측상단의 create key 를 선택한다.

session manager 에 사용하기 위해서 대칭키를 생성해야 하므로 key type 은 symmetric을 선택한다. 나머진 디폴트 설정 그대로 둔다. 다만 key usage 는 encrypt and decrypt 로 설정되어 있는지 확인한다.

하단의 regionality 는 단일 리전으로 키를 사용할 것인지, 멀티리전으로 키를 사용할 것인지 설정이다. 멀티리전으로 사용하면 여러 리전에 대해 키를 사용할 수 있다.

alias 는 key name 이라 보면 된다. description, tags 는 선택사항이니 따로 입력할 필요는 없다.

생성한 key의 관리자를 지정한다. 생성된 사용자 중 관리자 계정을 선택한다.

key 의 사용권한을 선택한다. 사용권한 선택이지만, key 를 사용해 암복호화를 수행할 사용자 계정을 선택하면 된다.

key 권한을 텍스트 형식으로도 수정할 수 있다. key 관리자와 사용자 권한을 설정했다면 별도로 수정할 필요는 없다.

key 권한 확인이 끝나면, key 설정 리뷰 페이지가 나오며, 필요한 부분을 설정했는지 확인한다.

key 설정들을 재확인 한 후 finish 를 선택해서 key 를 생성한다.

생성한 key 는 활성화되는데 조금 시간이 걸리며, 활성화 되면 status 가 enabled 로 표시된다. 활성화 된 key 는 사용가능하다.

5) Session Manager 설정, 테스트

  사전 설정을 완료했으니, session manager 설정 후, 외부 인터넷 연결이 가능한 public EC2 와 외부 인터넷 연결이 차단된 private 인스턴스에 session manager 로 접속 한다. 복잡한 설정은 아니며,

세션 타임아웃과 세션 암복호화를 위한 설정만 하면 된다.

AWS System manager 에 가서 Session manager를 선택한다.

session manager 에서 preferences 메뉴의 general preferences 에서 세션 암복호화 설정과 세션 타임 아웃을 설정할 수 있다. 단순 테스트 목적이므로 세션타임 아웃은 그대로 두고, 세션 암복호화를 설정한다.

kms encryption 의 enable kms encryption 에 체크하고, kms key option 에 select a kms key 를 선택한다. 물론 key 의 arn 을 복사, 붙여넣기 해도 된다.

그리고 kms key 부분에서 방금 생성한 대칭키를 선택한다.

아래 설정은 클라우드 와치, s3 로깅이 있는데 단순한 테스트이므로 따로 설정할 필요는 없다.

설정 후 save 선택해 설정을 적용한다.

session manager 설정 적용 완료

EC2 로 돌아가서, 외부 인터넷 연결이 가능한 EC2 와 외부 인터넷이 차단된 private EC2 를 session manager 로 접속해본다.

외부 인터넷 연결이 차단된 private 서브넷의 EC2 에 접속한다.
상단을 보면 session is encryptted using AWS KMS 가 출력되며, 이는 KMS 를 통해 세션 암호화가 정상적으로 수행되었음을 보여준다.

구글 dns 로 ping 을 한 이유는 외부 인터넷 연결이 차단된 인스턴스임을 보여주기 위함이다.
(외부로의 ping 이 차단되어 있다.)

외부 인터넷 연결이 가능한 public 서브넷의 EC2 에 접속한다.
상단을 보면 session is encryptted using AWS KMS 가 출력되며, 이는 KMS 를 통해 세션 암호화가 정상적으로 수행되었음을 보여준다.

구글 dns 로 ping 을 한 이유는 외부 인터넷 연결이 차단된 인스턴스임을 보여주기 위함이다.
(외부로의 ping 이 성공하여, 외부 인터넷과 연결되어 있음을 알 수 있다.)

3. Session manager 구성 시 주의사항

  Session manager 구성 시 신경써야 할 부분들이 있어, 따로 정리할 필요가 있다.

1) IAM POLICY, ROLE 할당 시 주의사항

  IAM USER , EC2 에 할당할 권한이 여러개여서 이 부분에서 문제가 생길 수 있다.

ㄱ. Session manager 사용을 위한 권한 할당

  어떤 목적으로 session manager 사용 할지에 따라, 그리고 얼마만큼 제한할지에 따라 할당할 권한은 다르다. 그러나 session manager 사용을 위해 SSM 관련 권한을 할당은 필수이므로, Session manager 사용 시 IAM USER 와 EC2 에 SSM 권한 할당하는 것을 잊어서는 안된다.

ㄴ. 세션 암복호화를 위한 권한 할당

  IAM USER 에 할당할 POLICY, EC2 에 할당할 ROLE 에는 세션 암복호화를 위해 하기의 권한들이 필수로 포함되어야 한다. (KMS 관련 권한) JSON 형식으로 추가하는게 편하며, 관련 POLICY 를 통해 포괄적으로도 추가할 수 있다.

"kms:Encrypt",
"kms:Decrypt",
"kms:ReEncrypt",
"kms:GenerateDataKey",
"kms:DescribeKey"

2) KMS KEY 생성, 관리 시 주의사항

  KMS KEY 는 session manager 의 세션을 암복호화 하기 위해 사용한다.
session manager 에 kms key 를 적용할려면, 아래 사항을 숙지해야 한다.

- session manager 에 적용하는 kms key 는 대칭키(symmetric key)여야 적용 할 수 있다. 비대칭(asymmetric key)는 session manager 에서 조회되지 않으므로 적용할 수 없다.
- kms key 의 리전과 session manager 로 접속하는 인스턴스의 리전이 동일해야 한다. key 생성시 별도로 리전을 선택하지 않지만, key 생성할 때 우측 상단에 표시되는 리전이 어디인지에 따라서 key 의 리전이 결정된다.

3) 인터넷 연결 차단된 인스턴스 연결 시

  인터넷 연결이 차단된 인스턴스의 경우, run command 를 통한 ssm agent 업데이트, vpc endpoint 생성을 별도로 해야 한다.

- 인터넷 연결이 차단된 망에서 session manager 연결을 위해, 기본적으로 ssm vpc endpoint, ssmmessages vpc endpoint, ec2messages vpc endpoint 이 세가지 vpc endpoint 를 구성한다.
- 추가로 ssm agent update 를 위해 s3 vpc endpoint, KMS 를 통한 세션 암복호화를 위해 kms vpc endpoint 를 구성한다.
cf) vpc 엔드포인트 추가시 vpc 와 서브넷이 ec2가 위치한 vpc,서브넷인지 확인해야 한다.

- vpc endpoint 구성 시 dns hostname 설정을 체크해야 한다(필수). dns hostname 기능을 활성화 하더라도, route53 에서 별도의 설정을 할 필요가 없다. (hosted zone 이런 것들을 추가로 설정할 필요 없고, route53 설정 없이도 session manager 사용에 전혀 문제가 없다.)

- VPC endpoint 의 ssm 활용을 위해 VPC NACL, EC2 보안그룹, VPC endpoint 의 보안그룹에 인바운드, 아웃바운드 443 포트를 오픈한다. 목적지는 아래와 같다.

- ssm.region.amazonaws.com
- ssmmessages.region.amazonaws.com
- ec2messages.region.amazonaws.com
- s3.region.amazonaws.com
- kms.region.amazonaws.com

- 인터넷 연결이 차단되어 있기 때문에, 일반적인 방법으로는 ssm agent 를 업데이트할 수 없다. 그래서 aws system manager 의 run command 를 활용해서 aws 서비스를 통해 ssm agent 업데이트를 수행한다. run command 사용을 위해선 위에서 설명한 vpc endpoint 를 먼저 구성해야 한다.

0개의 댓글