배경
최근들어 Public Subnet에 대한 보안이 강화되고 있습니다. 얼마전까지만 해도 Public Subnet의 Bastion Host를 이용해 Private Subnet의 EC2에 접속해 서비스들을 관리하던 것들이 이제는 시큐리티 거버넌스에 의해 이를 금지하는 회사들이 점점 늘어나고 있습니다.
이번 포스팅은 Public Subnet에 Bastion Host 설치 없이 Private Subnet에 설치된 EC2 인스턴스에 SSM(System Manager)을 통해 접속해 Security Issue를 최소화 하는 방법에 대해 알아봅니다.
SSM을 통한 Private Subnet의 EC2 접속
SSM 실습을 위한 테스트 VPC 생성
실습을 위한 VPC를 생성해 보도록 하겠습니다. AWS Admin Console에서 VPC 관리 화면으로 접속하시기 바랍니다.
이 예제에서는 Seoul 리전을 이용해 실습해 보도록 하겠습니다.
를 클릭해 새 VPC를 생성하도록 합니다.
아래와 같이 vpc를 입력해 성성하도록 합니다.
Private Subnet 생성
VPC가 생성되었다면 EC2 Instance를 생성할 Private Subnet을 생성합니다.
VPC 관리 화면에서 왼쪽 'Subnets ' 메뉴를 클릭해 Subnet 설정화면으로 이동합니다.
Create subnet 화면을 클릭해 신규 Subnet을 생성하도록 합니다.
VPC ID는 방금 새로 생성한 VPC(SSM-TEST)를 선택하고 원하는 Subnet 이름을 지정한 후 CIDR는 10.0.0.0/24로 지정해 Private Subnet을 생성하도록 합니다.
VPC 라우팅 테이블 생성
이제 새로 생성한 VPC와 Private Subnet 사이에 라우팅이 될 수 있도록 라우팅 테이블을 생성하도록 합니다.
VPC 관리 콘솔의 왼족 메뉴에서 'Route Tables'를 클릭하고 'Create route table'을 클릭합니다.
원하는 Route Table 이름을 입력한 후(이 예제에서는 ssm-test-subnet-rt) 아까 생성한 테스트용 VPC를 선택하도록 합니다. 모든 입력이 완료되었으면 'Create route table'을 클릭해 route table을 생성합니다.
마지막으로 생성된 route table에서 우리가 생성한 private subnet과 연결하도록 하겠습니다. 생성한 Route Table을 선택 후 아래의 tab에서 Subnet associations tab을 클릭 후 'Edit subnet associations' 버튼을 클릭하도록 합니다.
Edit subnet associations 화면에서 가능한 서브넷(ssm-test-private-subnet)에 체크한 후 'Save associations' 버튼을 클릭하도록 합니다.
SSM 연결을 위한 EC2 인스턴스 생성
AWS Web Console에서 EC2 서비스를 찾아 EC2 Dashboard 화면을 출력합니다. EC2 Dashboard 화면에서 'Launch Instance' 버튼을 클릭해 새로운 EC2 인스턴스 화면을 호출하도록 합니다.
새로 생성되는 EC2 Instance의 이름을 입력하고(여기서는 ssm-test-ec2) 적절한 ec2 type을를 선택합니다.(이 여기서는 t3.small 타입으로 amazon linux를 선택했습니다.) 그리고 Key pair(login) 항목은 'Proceed without a key pair(Not recommended)를 선택합니다.
network settings는 'EDIT' 버튼을 클릭해 아래와 같이 선택 및 입력하도록 합니다.
VPC | ssm-test |
Subnet | ssm-test-private-subnet |
Auto-assign public IP | Disable |
Firewall(security group) | Create security group |
Security group name | ssm-test-security-group |
Security group rule |
그리고 나머지 항목은 기본값을 그대로 두도록 합니다. 모든 설정이 완료되었다면 'Lauch instance' 버튼을 클릭해 EC2 Instance를 생성하도록 합니다.
IAM Role 생성
EC2 Instance가 SSM을 사용하기 위해서는 SSM을 위한 EC2 권한이 필요합니다. 이 권한을 가진 IAM Role을 생성하도록 합니다.
AWS Web Console에서 IAM 화면을 호출한 후 'Create role' 버튼을 클릭합니다.
이번에 생성하는 Role은 AWS EC2 Instance에 대한 권한이기 때문에 Trusted entity type에는 AWS Service를, Use case에는 EC2를 선택한 후 Next 버튼을 클릭하도록 합니다.
Add permissions에서 "AmazonEC2RoleforSSM"을 필터에 입력해 해당 롤을 찾아 선택한 후(체크박스를 반드시 체크) Next 버튼을 클릭하도록 합니다.
Name, review, and create 화면에서 Role name을 임의로 입력한 후(여기서는 ssm-test-ec2-role이라고 지었습니다.) 'Create role'버튼을 클릭해 role을 생성하도록 합니다.
EC2 Role 바인딩
이제 위에서 만든 Role(여기서는 ssm-test-ec2-role)을 EC2에 연결하도록 합니다. AWS Web Admin Console에서 EC2를 찾아 들어갑니다. EC2 Instance 메뉴에서 생성되어 있는 EC2 Instance를 선택 후 Actions> Security>Modify IAM role을 선택 하도록 합니다.
Modify IAM role 화면에서 IAM role을 앞서 생성한 SSM 권한을 가진 EC2 Role로 선택합니다.(여기서는 ssm-test-ec2-role) 그리고 'Update IAM role' 버튼을 클릭해 IAM role을 업데이트 합니다.
DNS host names 활성화
이후 진행할 SSM을 위한 Endpoint가 생성되기 위해서는 먼저 Private DNS Name에 대한 활성화가 필요합니다.
AWS Web Console에서 VPC를 찾아 클릭합니다. VPC 리스트에서 예제를 위해 생성했던 VPC를 선택 후(여기서는 ssm-test) Action > Edit VPC settings를 클릭합니다.
Edit VPC settings 화면의 DNS settings를 찾아 'Enable DNS hostnames' 체크박스를 체크한 후 저장 하고 나옵니다.
SSM을 위한 EndPoint 생성
아래 그림과 같이 Private Subnet의 EC2에 SSM을 통해 접속하기 위해서는 VPC에 대한 SSM Endpoint가 필요합니다.
AWS Web Console에서 VPC를 찾아 화면을 이동합니다. VPC 관리화면의 왼쪽 메뉴에서 Endpoints를 찾아 클릭해 VPC Endpoint 관리 화면으로 들어간 후 상단의 'Create endpoint' 버튼을 클릭하도록 합니다.
Create endpoint 화면에서 다음과 같은 조건으로 endpoint를 생성합니다.
- Name tag에 ssm-test-endpoint-ssm이라고 입력합니다.(이후 ssm-test-endpoint-ssmmessages, ssm-test-endpoint-ec2messages를 하나씩 더 만들 겁니다.)
- Service category에 AWS services가 선택되어있는지 확인합니다.
- Services 란에 ssm을 입력해 Service Name에 com.amazonaws.[선택한 리전: e.g. ap-northeast-2].ssm 이란 이름을 찾아 선택합니다. (두번째 endpoint를 생성할때는 ssmmessages, 세번째는 ec2messages로 검색합니다.)
- VPC에 앞서 성생한 VPC를 선택합니다.(여기서는 ssm-test)
- Subnets에 VPC 생성할 때 생성된 Private Subnet이 포함된 AZ의 서브넷을 선택합니다.(이 예에서는 ap-northeast-2b)
- IP Address type에 IPv4를 선택합니다.
- Security groups에 앞서 생성한 security group을 선택합니다.(여기서는 ssm-test-security-group)
- Policy에 Full access를 선택합니다.
- Crate endpoint를 클릭해 EndPoint 생성을 완료합니다.
1.부터 9까지 작업을 반복합니다. 이때 서비스에서 ssmmessages, ec2messages라는 서비스 이름으로 검색해 각각 ssm-test-endpoint-ssmmessages, ssm-test-endpoint-ec2messages라는 이름으로 엔드포인트를 두개 더 만들도록 합니다.
3개의 SSM endpoint가 생성되면 VPC의 endpoint 화면에서 다음과 같은 화면이 보입니다.
이제, SSM 설정이 완료되었습니다.
Session Manager(SSM)을 통한 EC2 인스턴스 접속
AWS Web Console에서 EC2를 찾아 화면을 이동합니다. EC2 관리 화면에서 Instances메뉴를 찾은 후 앞서 생성한 EC2를 찾아 체크박스를 클릭해 해당 인스턴스를 선택한 후 상단의 'Connect'버튼을 클릭합니다.
여러 접속 옵션 중 'Session Manager' 탭을 클릭합니다.
'Connect' 버튼을 클릭해 EC2 Console에 접속합니다.
그런데 만약, PC에서 접속하고자 한다면
1. 먼저 PC의 consol에서 aws configure 명령어를 통해 access key id와 secret access key 그리고 default region을 설정한 후 다음의 명령어를 통해 원격에서 접속 할 수 있습니다.
* Access Key Id와 Secret Access Key는 AWS Console> IAM > [사용자] > Security Credential 에서 확인 가능
2. PC의 console에서 aws ssm start-session --target [원격에 접속하고자 하는 EC2 Instance ID] 을 통해 접속 가능
이제 Bastion Host없이 Private Subnet에 있는 EC2에 SSM을 통해 접속할 수 있게 되었습니다.
RDP를 이용한 Windows Instance 접속
Windows 서버의 경우 인스턴스를 앞서 Amazon Linux 버전의 인스턴스를 설치하는 것과 동일한 방식으로 설치를 합니다. 다만 Security Group에서 기본으로 RDP 포트가 설정되는데 이 이외에 HTTPS 포트도 추가를 해서 AWS Web Console에서 브라우저를 통해 접속 할 수 있도록 해줍니다.
마지막으로 포트포워딩을 통해서 사용하고 있는 PC에서 "원격데스크톱" 어플리케이션을 통해 접속 할 수 있습니다.
AWS-StartPortForwardingSession 이란 문서를 통해 포트 포워딩 방식으로 3389에서의 트래픽을 원하는 로컬 포트로 리디렉션해주는 방식입니다. 다음과 같이 PC 콘솔에서 명령어를 실행해 줍니다.
다만 사전에 PC에 aws configure 명령어를 통해 AWS 계정에 대한 Access Key ID, Secret Access Key 및 Default Region에 대한 설정을 해야 합니다. 아래 그림 참고(이미 설정 하셨다면 다시 하실 필요 없습니다.)
* Access Key Id와 Secret Access Key는 AWS Console> IAM > [사용자] > Security Credential 에서 확인 가능
PC에서 AWS 계정에 대한 설정이 완료 되었다면 아래의 명령어를 통해 SSM을 위한 포트포워딩을 설정합니다.
aws ssm start-session --target <instance-id> --document-name AWS-StartPortForwardingSession --parameters "localPortNumber=55678,portNumber=3389"
마지막으로 RDP Client에서 접속 서버 위치를 앞서 포트포워딩 시켰던 localhost:[포워딩한 포트] 로 변경하면 접속 할 수 있습니다.
접속이 완료 되었습니다.
그 이외에 Administrator에 대한 password를 설정했다면 AWS Console의 EC2 관리 창에서 Windows EC2 인스턴스의 Connect 버튼을 클릭해 RDP client 탭에서 Connect using Fleet Manager를 통해서도 접속 할 수 있습니다.
아래의 Connect 버튼을 클릭합니다.
RDP 클라이언트 등이 없을 때 Fleet Manager를 통한 접속은 유용합니다.
이것으로 포스팅을 완료합니다.
감사합니다.
'Cloud Service > AWS' 카테고리의 다른 글
RDS Custom for ORACLE를 사용해보자! (0) | 2023.07.13 |
---|---|
AWS DynamoDB Spring Boot CRUD 예제 (1) | 2023.01.11 |
개인 PC에 DynamoDB를 설치해 테스트 해보자 (0) | 2023.01.04 |
VPC 간의 연결 방식- VPC Peering, VGW, DGW, TGW 비교 (0) | 2022.03.01 |
Route 53과 ALB 연동 (0) | 2022.02.03 |