EC2 를 접속할 때 SSH, bastion host 등을 통해 접속할 수 있으나 이는 구성이 까다롭고 기술적 취약점이 발생할 가능성이 크다. AWS Session Manager 을 활용하면 보안성은 높이고 관리를 쉽게할 수 있다.
AWS System Manager 에서 제공하는 서비스이며, 번거롭게 SSH 및 Bastion host를 통하지 않고 EC2 에 접속할 수 있다. (EC2 외에 다른 인스턴스에도 연결 가능하다. 다만 고급기능이며 사용 시 추가 요금이 발생한다.)
장점을 정리해보면 아래와 같다.
- bastion host와 SSH 설정이 필요 없음
- Security group 필요 없음
- 인터넷과 분리된 private instance 에 바로 접속 가능
- 위의 편리성을 가지면서 SSH 기능을 사용 가능
- KMS 를 통해 세션 데이터 암호화 가능
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 설치 및 업데이트
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에게 할당한다.
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 을 적용한다.
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 설치 현황을 볼 수 있다.)
외부 인터넷과 분리된 사설망의 인스턴스의 경우에도 SSM 사용할 수 있다. 다만 몇가지 과정을 추가로 수행해야 한다.
- VPC Endpoint 생성
- VPC ACLs, EC2 보안 그룹 정책 변경
- Run Command 를 통한 SSM Agent 업데이트
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 를 생성한다.

VPC Endpoint 를 구성했다면, VPC ACLs, EC2 보안 그룹에서
- ssm.region.amazonaws.com
- ssmmessages.region.amazonaws.com
- ec2messages.region.amazonaws.com
을 목적지로 443 포트를 오픈한다.
간단한 과정이므로 사진은 생략한다.
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 활성화된 것이다.
세션 암복호화를 위해 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 는 사용가능하다.
사전 설정을 완료했으니, 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 이 성공하여, 외부 인터넷과 연결되어 있음을 알 수 있다.)
Session manager 구성 시 신경써야 할 부분들이 있어, 따로 정리할 필요가 있다.
IAM USER , EC2 에 할당할 권한이 여러개여서 이 부분에서 문제가 생길 수 있다.
어떤 목적으로 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"
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 의 리전이 결정된다.
인터넷 연결이 차단된 인스턴스의 경우, 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 를 먼저 구성해야 한다.