Cloud/AWS

Session Manager를 통한 Private 인스턴스 접근과 로깅

Omoknooni 2024. 1. 26. 17:46

Internet Gateway가 연결된 Public Subnet에 위치한 인스턴스들은 부여된 Public IP를 통해 SSH Keypair를 가지고 바로 인스턴스에 접속할 수 있다.

하지만 외부와 연결이 없는 폐쇄된 Private Subnet에 위치한 인스턴스들은 이와 같이 접속할 수 없다.

보통 이런 경우에는 Public Subnet에 Bastion host를 두어 이를 거쳐서 내부 Private 인스턴스로 접근하고는 한다.

 

Bastion host를 두고 접속하는 방법에는 다음과 같은 단점들이 존재한다.

  • Bastion host 인스턴스 : Private 인스턴스의 접속을 위한 인스턴스가 별도로 필요하고, 관리도 해줘야 한다.
  • 인바운드 포트 : 접속을 위해 SSH 포트 설정이 필요하다
  • SSH Key Pair : SSH를 사용하므로 Key pair 관리도 필요하다.

 

이러한 단점들을 보완하기 위해 AWS에서는 Session Manager라는 서비스를 제공한다.

이번에는 Session Manager를 통해 Private 인스턴스에 접근하는 방법을 알아보도록 한다.

 

Session Manager

AWS Systems Manager(SSM)의 기능 중 하나로, EC2 인스턴스에 대한 접근을 관리한다. Session Manager는 브라우저 쉘이나 CLI를 통해 이용할 수 있다.

 

Bastion host가 아닌 Session Manager를 이용해 인스턴스에 접근하는 경우, 다음과 같은 이점을 얻을 수 있다.

  • 별도의 Bastion host가 필요없음 : SSM을 통해 다이렉트로 인스턴스에 접근하므로 Bastion host가 필요없다.
  • HTTPS를 이용한 통신 : SSH를 이용하는 것이 아닌 HTTPS를 이용하므로 SSH Key pair 관리가 필요없다.
  • 인바운드 설정 X : 인스턴스의 인바운드 포트 설정이 필요없다. 

 

Session Manager 접근 실습

이번 Session Manager 실습의 아키텍쳐는 아래와 같다.

 

Public 서브넷과 Private 서브넷에 각각 인스턴스를 구축한 다음, SSH가 아닌 Session Manager를 통해 세션을 생성하고 접근해보도록 한다. 

또한 Bastion host 없이 Session Manager를 통해 다이렉트로 Private 인스턴스에 접근해 보도록 한다.

 

 

SSM Role 생성

SSM이 인스턴스에 접근하기 위해, SSM Role을 생성해 인스턴스에 할당해주어야한다.

 

먼저, IAM Role을 생성하도록한다.

Role 생성에서 EC2 사용사례를 검색하면 'EC2 Role for AWS Systems Manager'라는 이름의 SSM 관련 Role을 확인할 수 있다.

 

이 Role에는 AmazonSSMManagedInstaceCore라는 정책 하나만 연결되어있다. 이 정책에는 EC2 인스턴스가 SSM으로부터의 접근을 허용하는 권한이 정의되어있다.

 

 

이렇게 EC2 인스턴스에 연결할 SSM Role을 생성할 수 있다.

 

 

인스턴스 생성

SSM 접근 테스트용 인스턴스를 Public 서브넷에 하나, Private 서브넷에 하나 생성하도록 한다

 

SSM 접근하기 위해 대상 인스턴스에는 SSM Agent를 설치해주어야한다. 대부분의 Amazon 제공 AMI들에는 기본적으로 SSM Agent가 미리 설치되어있다.

아래 Docs에서 관련 AMI들을 확인할 수 있다.

 

Amazon Machine Images(AMIs), SSM Agent 사전 설치 - AWS Systems Manager

SSM Agent가 이 목록에 없는 AWS 관리형 AMIs에 사전 설치되어 있을 수 있습니다. 이 경우 일반적으로 운영 체제(OS)에서 모든 Systems Manager 기능이 완벽하게 지원되지 않습니다. 또는 SSM Agent가 AWS Marketp

docs.aws.amazon.com

 

보안그룹도 어떠한 인바운드 규칙 설정도 하지 않은 상태로 연결해보도록한다.

 

 

인스턴스를 생성하면 위에서 생성한 SSM Role을 할당하고, 해당 인스턴스를 재부팅해준다.

그리고 인스턴스 연결 > Session Manager를 통해 접근할 수 있다.

 

하지만, Private 서브넷의 인스턴스에는 연결할 수 없다는 것을 확인할 수 있다.

 

VPC Endpoint 생성

Session Manager를 사용하기 위해서는 인스턴스의 아웃바운드 인터넷 엑세스가 필요하다. 따라서 완전히 폐쇄된 Private 서브넷에 접근하기 위해 VPC 엔드포인트를 추가적으로 설정해주어야한다. 

Session Manager가 VPC Endpoint를 통해서 Private 서브넷의 인스턴스에 접근하게 되는 것이다.

(VPC 엔드포인트 이외에도 인터넷 설정을 위해 NAT Gataway와 같은 수단을 사용할 수도 있다.) 

 

Session Manager로 Private 서브넷 접근을 위해 총 3개의 엔드포인트를 생성해줘야한다.

  • ssm
  • ec2messages
  • ssmmessages

 

엔드포인트 생성에 앞서 VPC의 DNS 설정을 해주어야한다.

VPC설정에서 다음과 같이 DNS 확인 / 호스트 이름을 활성화해준다.

 

 

다음으로 엔드포인트에 연결해줄 보안그룹을 생성한다.

Session Manager는 HTTPS 트래픽을 이용하기 때문에, 인바운드 HTTPS 규칙을 적용해준다.

 

 

보안그룹을 생성 후, 먼저 ssm 엔드포인트를 생성해준다.

 

 

이와 마찬가지로 ec2messages, ssmmessages 엔드포인트도 생성해준다.

엔드포인트 생성 후 모두 사용 가능한 상태가 될 때까지 대기한다.

3개의 VPC 엔드포인트를 생성

 

 

이후 다시 Private 서브넷의 인스턴스에 Session Manager를 확인해보면 연결이 활성화되어있는 것을 볼 수 있다.

Session Manager를 통해 Private 인스턴스에 접속

 

 

세션 로깅

Session Manager의 특징 중 하나로, 세션 활동 로깅이 존재한다.

S3, Cloudwatch log group, Cloudtrail 등의 AWS 서비스들과 통합을 이용해 세션 활동 기록을 감사 / 추적할 수 있는 옵션을 제공한다.

 

System Manager에서 노드 관리 > 세션 관리자(Session Manger) 메뉴에서 세션을 시작하거나 세션의 기록들을 확인할 수 있다.

 

 

세션 로그들을 S3 버킷에 저장해보도록한다.

Session Manager의 기록을 로깅하기 위해서 인스턴스에 설정했던 IAM Role에 S3 버킷에 접근할 수 있는 권한을 추가해준다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::{{ BUCKET NAME }}/*"
        }
    ]
}

 

 

Private 인스턴스가 S3 버킷에 접근할 수 있도록 S3 엔드포인트도 생성해준다.

 

 

S3 엔드포인트를 생성 한 다음, Session Manager 메뉴에서 S3 로깅을 설정해준다.

 

 

로깅 설정 후 다시 인스턴스에 연결해서 작업 후 세션을 종료하면 다음과 같이 버킷에 로그가 저장되는 것을 볼 수 있다.

 

 

 

이렇게 Bastion host 없이 모든 인스턴스들에 접근할 수 있는 SSM의 Session Manager를 알아보았다. Bastion host와 같은 다른 별개의 인스턴스 리소스를 관리할 필요없이 간편하게 접근할 수 있다는 장점이 있었다.

뿐만 아니라 접근 세션 별 로깅도 지원해 간단하게 로깅 구성을 할 수 있었다.

 

다만, 인터넷 아웃바운드가 필요해 엔드포인트를 생성해주어야 비로소 모든 인스턴스에 접근할 수 있다는 점이 아쉬웠던 부분으로 남았다.

이 점을 해결한 EC2 인스턴스 연결 엔드포인트(EC2 Instance Connect Endpoint)가 비교적 최근에 등장했다고 하는데, 다음에는 이를 이용해 인스턴스에 접근해보도록 한다.