AWS Bastion Host 설정 - AWS Bastion Host seoljeong

(bastion host 보안그룹)보안 그룹 생성한 후에 인바운드 규칙에는 로컬 PC에서 bastion host에 ssh 연결이 가능해야 하기 때문에 위와 같이 설정해 주었습니다. 규칙 편집 시에, 소스 카테고리에서 '내 IP'를 설정하면 자동으로 본인 아이피가 입력이 됩니다. 여기서 'sg-'로 시작하는 보안그룹 ID를 복사 해 둡니다. 바로 다음 단계에서 사용해야 하게 됩니다.

AWS Bastion Host 설정 - AWS Bastion Host seoljeong

(web server 보안그룹) 마찬가지로 web server를 위한 보안그룹을 생성하고 인바운드 규칙을 설정하겠습니다. SSH 규칙의 소스에 아까 복사해둔 bastion의 보안그룹 ID를 입력합니다. 위와 같이 설정하면, bastion 보안그룹에 속해 있는 인스턴스만 web server쪽으로 접근이 가능해집니다.

Bastion Host?
Public 네트워크에서 Private 네트워크에 대한 액세스를 제공하기 위한 목적을 가진 서버입니다.

Bastion Host는 일반적으로 Amazon VPC (Virtual Private Cloud)의 Public Subnet에 있는 Amazon EC2 인스턴스에서 실행됩니다.
Linux 인스턴스는 공개적으로 액세스할 수 없는 Subnet에 있으며,  Bastion Host를 실행하는 기본 EC2 인스턴스에 연결된 Security Group에 연결된 Security Group에서 SSH 액세스를 허용하는 Security Group으로 설정됩니다.
Bastion Host 사용자는 다음 다이어그램에 설명된대로, Bastion Host에 연결하여 Linux 인스턴스에 연결합니다.

AWS Bastion Host 설정 - AWS Bastion Host seoljeong

Bastion Host 운영
A. EC2
1. 인스턴스
1) Bastion Host
IP: Public IP 할당
Subnet: Public Subnet1에 배치

2) WebServer Instance1
IP: Public IP 부여하지 않는다.
Subnet: Private Subnet1에 배치

AWS Bastion Host 설정 - AWS Bastion Host seoljeong

2. Security Group
1) Bastion Host
Type: SSH
Source: My IP를 지정하여 Bastion Host로 접속할 HostPC의 공인 IP를 지정해준다. (Bastion Host 접속 제어)

2) WebServer Instance1
Type: SSH
Source: Bastion Host의 Public Subnet에 할당된 IP를 입력한다.

AWS Bastion Host 설정 - AWS Bastion Host seoljeong

B. VPC
1. VPC
vpc: 172.31.0.0/16

AWS Bastion Host 설정 - AWS Bastion Host seoljeong

2. Subnet
Private Subnet: 172.31.16.0/20
Public Subnet: 172.31.0.0/20

3. RouteTable
1) Private RouteTable
– 로컬 네트워크 대역만 라우팅한다.
2) Public RouteTable
– 로컬 대역외의 트래픽은 인터넷 게이트웨이로 보내어 외부와의 통신이 가능하도록 한다.

4. ACL
1) PrivateSubnet ACL
– Bastion Host에 대해서만 SSH 접속을 허용하도록 설정
2) PublicSubnet ACL
– 어떤 곳에서든지 SSH 요청을 가능하도록 한 다음 SecurityGroup에서 필요시 더 세부설정을 한다.

C. SSH 접속
1. Bastion Host로 접속
– Public IP 사용

2. pem 파일 업로드
– Bastion Host에서 Private Subnet의 Instance로 접속하기 위해서는 Private Subnet Instance의 .pem 파일이 필요하다

3. Private Subnet으로 ssh 접속
$ ssh -i “plura.pem” [email protected]

AWS Bastion Host 설정 - AWS Bastion Host seoljeong

Bastion Host 운영 목적

AWS Bastion Host 설정 - AWS Bastion Host seoljeong

Public 서버 1대에서 하루동안 발생된 로그인 실패 (약 11,000건) 탐지목록입니다. 이와 같이 Public서버는 보통 하루에 수만~수십만건의 계정 탈취 공격을 받습니다.
방화벽 장비를 통해 관리를 하더라도 서버별 확인하는 것은 어려울 수 있으며, 모든 IP 주소를 통제할 수 없기 때문에 보안에 취약해질 수 있습니다.

Bastion Host 운영 시, Private Instance에서 발생되는 계정 액세스 로그들을 한곳에서 취합 및 제어하여 관리가 보다 용이해집니다.
중요한 것은 Bastion Host가 Linux 인스턴스에 대한 유일한 SSH 트래픽 소스라는 것입니다.

AWS Bastion Host 설정 - AWS Bastion Host seoljeong

또한, PLURA V5에서는 공개키 로그인 성공 시, 해당 로그 필터탐지 하여 Private Instance로 액세스한 IP 주소, 생성일 등 확인할 수 있습니다.

참조
https://aws.amazon.com/ko/blogs/security/how-to-record-ssh-sessions-established-through-a-bastion-host/
https://galid1.tistory.com/365
https://registry.terraform.io/modules/Guimove/bastion/aws/latest

로컬 시스템에서 프라이빗 Amazon Relational Database Service(RDS) DB 인스턴스에 연결하고 싶습니다. Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스를 Bastion(점프) 호스트로 사용하여 이 작업을 수행하려면 어떻게 해야 하나요?

간략한 설명

Amazon EC2 인스턴스를 점프 서버로 사용하여 로컬 시스템에서 프라이빗 Amazon RDS DB 인스턴스에 연결하려면 다음 단계를 따르세요.

  1. EC2 인스턴스를 시작 및 구성하고 하고 인스턴스의 네트워크 설정을 구성합니다.
  2. RDS DB 인스턴스의 보안 그룹을 구성합니다.
  3. 로컬 시스템에서 RDS DB 인스턴스에 연결합니다.

중요:프라이빗 Amazon RDS 또는 Amazon Aurora DB 인스턴스에 연결하려면 VPN 또는 AWS Direct Connect를 사용하는 것이 가장 좋습니다. 이러한 옵션을 사용할 수 없다면 Bastion 호스트를 사용합니다. 다음 예제 구성은 보안 그룹을 사용하여 액세스를 제한합니다. 그러나 연결을 보다 안전하게 하기 위해 서브넷의 네트워크 액세스 제어 목록(네트워크 ACL)을 제한할 수 있습니다. 0.0.0.0/0 대신 더 작은 범위를 사용하도록 인터넷 게이트웨이의 라우팅 범위를 제한할 수도 있습니다. 예를 들어 인터넷 게이트웨이를 추가할 때 필요한 CIDR 범위만 대상의 라우팅 테이블에 추가합니다. 자세한 정보는 라우팅 옵션 예제를 참조하세요.

해결 방법

다음 예제 구성은 Amazon Virtual Private Cloud(Amazon VPC)에 있는 Amazon RDS for MySQL 인스턴스에 대한 것입니다. 인스턴스에는 EC2 인스턴스에 대해 설정된 보안 그룹이 있습니다.

EC2 인스턴스 시작 및 구성

  1. Amazon EC2 콘솔을 연 다음 인스턴스 시작(Launch Instance)을 선택합니다.
  2. Amazon Machine Image(AMI)를 선택합니다.
  3. 인스턴스 유형을 선택한 후 [Next: Configure Instance Details(다음: 인스턴스 세부 정보 구성)]를 선택합니다.
  4. [Network(네트워크)]에서 RDS DB 인스턴스가 사용하는 VPC를 선택합니다.
  5. 서브넷(Subnet)에서 라우팅 테이블에 인터넷 게이트웨이가 있는 서브넷을 선택합니다. 인터넷 게이트웨이가 아직 없는 경우에는 EC2 인스턴스를 생성한 후 서브넷에 추가할 수 있습니다.
  6. 퍼블릭 IP 자동 할당(Auto-assign public IP)의 경우 활성화(Enable)가 선택되어 있는지 확인합니다.
  7. [Next: Add Storage(다음: 스토리지 추가)]를 선택하고 필요에 따라 스토리지를 수정합니다.
  8. [Next: Add Tags(다음: 태그 추가)]를 선택하고 필요에 따라 태그를 추가합니다.
  9. [Next: Configure Security Group(다음: 보안 그룹 구성)]을 선택하고 [Add Rule(규칙 추가)]을 선택한 후 다음을 입력합니다.
    [Type(유형)]: ‘사용자 지정 TCP 규칙’을 입력합니다.
    프로토콜(Protocol): ‘CP’를 입력합니다.
    포트 범위(Port Range): ‘22‘를 입력합니다.
    [소스(Source)]: 로컬 시스템의 IP 주소를 입력합니다. 기본적으로 소스 IP 주소는 모두에게 개방되어 있습니다. 하지만 로컬 퍼블릭 IP 주소만 허용하도록 액세스를 제한할 수 있습니다.
  10. 검토 및 시작(Review and Launch)을 선택합니다.
  11. [시작(Launch)]을 선택합니다.

RDS DB 인스턴스의 보안 그룹 구성

참고: 하나 이상의 EC2 인스턴스를 RDS 데이터베이스에 자동으로 연결하려면 EC2 인스턴스를 RDS 데이터베이스에 자동으로 연결을 참조하세요.

  1. Amazon RDS 콘솔을 열고 탐색 창에서 데이터베이스(Databases)를 선택합니다.
  2. RDS DB 인스턴스의 이름을 선택합니다. 또는 아직 없는 경우 RDS DB 인스턴스를 생성합니다.
  3. [연결 및 보안(Connectivity & security)] 탭을 선택합니다.
  4. [Security(보안)] 섹션에서 [VPC Security Groups(VPC 보안 그룹)] 아래의 링크를 선택합니다.
  5. 보안 그룹을 선택하고 작업(Actions)을 선택한 다음 인바운드 규칙 편집(Edit inbound rules)을 선택합니다.
  6. 규칙 추가(Add Rule)를 선택하고 다음을 입력합니다.
    유형(Type): ‘사용자 지정 TCP 규칙’을 입력합니다.
    [Protocol(프로토콜)]: ‘TCP’를 입력합니다.
    [Port Range(포트 범위)]: RDS DB 인스턴스의 포트를 입력합니다.
    [Source(소스)]: EC2 인스턴스의 프라이빗 IP 주소를 입력합니다.
  7. 저장을 선택합니다.

보안 그룹에 대한 이 구성은 EC2 인스턴스의 프라이빗 IP 주소에서 수신되는 트래픽을 허용합니다. EC2 인스턴스와 RDS DB 인스턴스가 동일한 VPC를 사용하는 경우 RDS DB 인스턴스의 라이팅 테이블을 수정할 필요가 없습니다. VPC가 다른 경우 VPC 피어링 연결을 생성하여 해당 VPC 간의 연결을 허용합니다.

참고: 확장성이 더 높은 솔루션을 사용하는 경우에는 주의해야 합니다. 예를 들어 보안 그룹 규칙에서 보안 그룹 ID를 사용하는 경우, 단일 인스턴스에 대한 액세스를 제한하지 않는지 확인합니다. 대신 특정 보안 그룹 ID를 사용하는 모든 리소스로 제한해야 합니다.

로컬 시스템에서 RDS DB 인스턴스에 연결

사용하는 클라이언트에 따라 RDS DB 인스턴스에 연결하는 단계가 다릅니다. 자세한 내용은 Amazon RDS DB 인스턴스에 연결을 참조하세요. MySQL을 사용하는 경우 SSL을 사용하여 클라이언트 애플리케이션과 Amazon RDS 간의 연결을 암호화하는 것이 모범 사례입니다.

다음 예제에서는 MySQL Workbench 클라이언트를 사용하여 배스천 호스트에 연결합니다.

  1. 새 연결을 시작하고 [Connection Method(연결 방법)]에서 [Standard TCP/IP over SSH(표준 TCP/IP over SSH)]를 선택합니다.
  2. EC2 인스턴스의 SSH 설정에 대한 다음 세부 정보를 입력합니다.
    참고: 퍼블릭 IP 주소로 시작된 EC2 인스턴스는 생성된 VPC에 DNS 호스트 이름(DNS Hostnames)이 활성화되어 있는 경우 퍼블릭 DNS가 있습니다.
    퍼블릭 IP 자동 할당(Auto-assign Public IP): DNS 호스트 이름(DNS Hostnames) 옵션에서 활성화(Enable)가 선택되어 있는지 확인합니다.
    SSH 호스트 이름(SSH Hostname): EC2 인스턴스의 퍼블릭 DNS 이름 또는 퍼블릭 IP 주소를 입력합니다.
    SSH 사용자 이름(SSH Username): EC2 인스턴스의 사용자 이름을 입력합니다. 예를 들어 "ec2-user"는 EC2 Linux 시스템의 사용자 이름입니다.
    [SSH Key File(SSH 키 파일)]: EC2 인스턴스를 생성할 때 사용한 프라이빗 키를 선택합니다.
  3. MySQL 인스턴스 설정에 대한 다음 세부 정보를 입력합니다.
    [MySQL 호스트 이름]: RDS DB 인스턴스 엔드포인트를 입력합니다.
    MySQL 서버 포트(MySQL Server port): ‘3306’(또는 사용하는 사용자 지정 포트)을 입력합니다.
    [사용자 이름(Username)]: RDS DB 인스턴스의 사용자 이름을 입력합니다.
    [암호(Password)]: RDS DB 인스턴스의 암호를 입력합니다.
  4. 테스트 연결(Test Connection)을 선택합니다.
  5. 연결이 성공하면 연결 이름을 입력하고 연결을 저장합니다.

SSH 터널을 사용하여 로컬 MySQL 클라이언트에서 프라이빗 RDS 인스턴스로 연결하려면 다음 명령을 참조하세요.

리눅스 또는 macOS:

다음 명령을 실행합니다.

ssh -N -L 3336:127.0.0.1:3306 [user]@[server_ip]

mysql -u MYSQL_USER -p -h 127.0.0.1

참고: 사용자, server_ip 및 mysql_user를 자신의 정보로 바꿉니다.

Windows PowerShell:

ssh -i ".pem" @ -L :: -N

참고: filename 및 username을 사용자 정보로 바꿉니다. EC2_Endpoint, port_number, RDS_Endpoint 및 Port_number를 RDS 인스턴스에 대한 정보로 바꿉니다.