AWS 기술 블로그

EC2 Instance Connect Endpoint를 이용해 Amazon EC2및 Amazon RDS 인스턴스에 안전하게 접속하기

이 글은 AWS Computing Blog에 게시된 “Secure Connectivity from Public to Private: Introducing EC2 Instance Connect Endpoont by Shelia Busser” 의 내용을 기반으로 작성하였으며 추가내용이 반영되었습니다.

인터넷을 통해 Amazon Virtual Private Cloud(Amazon VPC)에 위치한 프라이빗(Private) IP가 할당된 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스에 접속하는 것을 생각해 보면 관리자가 Internet Gateway(IGW)를 생성한 후 퍼블릭(Public) IP 주소를 베스천(Bastion) 호스트에 할당하여 연결한 후 포트 포워딩을 사용하여 접속을 원하는 인스턴스에 접속해야 합니다.

2023년 6월 AWS는 인터넷을 통해 인스턴스 및 기타 VPC 리소스에 안전하게 연결할 수 있는 새로운 기능인 Amazon EC2 Instance Connect(EIC) Endpoint를 출시했습니다. EIC Endpoint를 사용하면 더이상 IGW, 퍼블릭 IP 주소, 베스천 호스트 및 연결을 위한 에이전트(SSM Agent)를 별도로 설치할 필요가 없습니다. EIC Endpoint는 자격증명 기반(identity-based) 및 네트워크 기반(network-based) 액세스 제어를 결합하여 조직의 보안 요구 사항을 충족하는 데 필요한 격리, 제어 및 로깅을 제공합니다. 또한 관리자는 연결을 위해 사용되는 베스천 호스트에 대한 유지보수 부담을 줄일 수 있습니다. EIC Endpoint는 AWS Management ConsoleAWS Command Line Interface(AWS CLI)를 이용하여 사용할 수 있으며 사용자가 주로 선호하는 PutTTY 및 OpenSSH와 같은 도구를 계속 사용할 수 있는 유연성까지 제공합니다.

이 포스트에서는 EIC Endpoint의 작동 방식과 보안 제어에 대한 개요를 설명하고,  EIC Endpoint 생성 과정을 안내하며, EIC Endpoint를 통해 인터넷에서 인스턴스에 SSH로 접속하는 방법을 시연합니다.

EIC Endpoint 개요

EIC Endpoint 는 사용자 인증이 적용된 TCP proxy 입니다. 여기에는 두 가지 모드가 있는데 첫 번째는AWS CLI 를 사용하는 것 입니다. IAM 자격증명을 통해 보안이  적용된 WebSocket 터널을 사용자의 워크스테이션에서부터 Endpoint까지 만들 수 있습니다. 터널이 한번 생성되면 여러분이 선호하는 클라이언트 애플리케이션을 이용하여 lookback 주소(127.0.0.1 or localhost) 를 통해 리소스에 접속 할 수 있습니다. 두 번째는 AWS CLI를 사용하지 않을 때 콘솔(Console)을 이용할 수 있습니다. 여러분의 VPC에 보안이 적용된 심리스(Seamless) 연결을 지원합니다.  인증 및 인가는 트래픽이 VPC의 리소스에 도달하기 전에 이루어집니다. 다음 그림은 사용자가 EIC Endpoint를 통해 리소스에 접속하는 것을 보여줍니다.

EIC Endpoint는 굉장히 높은 수준의 유연성을 제공합니다. 첫 번째로, VPC가 IGW나 NAT Gateway를 이용하여 인터넷에 직접 접속할 필요가 없습니다.

두 번째로, 여러분이 접속하려고 하는 리소스에 별도의 에이전트를 설치할 필요가 없습니다. 따라서 에이전트를 지원하지 않는 서드파티 어플라이언스와 같은 리소스를 쉽게 원격 관리 할 수 있습니다. 세 번째로 여러분이 사용하던 클라이언트 애플리케이션을 그대로 사용할 수 있습니다. 그리고 마지막으로 IAM 과 보안그룹(Security Groups)을 사용하여 접근제어를 할 수 있습니다. 이 내용은 다음 섹션에 더 자세히 이야기 하겠습니다.

EIC Endpoint를 사용하는데 앞서 퍼블릭IP 공간에서 VPC로의 접근을 관리하는 AWS가 제공하는 두가지 핵심 서비스를 알 필요가 있습니다. 첫 번째는 EC2 Instance Connect 입니다. 이 서비스를 이용하면IAM 자격증명을 통해 SSH Key를 인스턴스에 일시적(ephemeral)으로 할당하는 메커니즘을 사용합니다. 따라서 SSH Key 를 장기로 할당하여 사용할 필요가 없으며 여러분들이 SSH Key를 별도로 관리할 필요가 없습니다.  지금까지는 EC2 Instance Connect가 인터넷을 통해 인스턴스에 접근하기 위해 퍼블릭IP가 필요했지만. 이제 EC2 Instance Connect 를 EIC Endpoint와 함께 사용할 수 있습니다. 이를 두가지를 결합하면 퍼블릭 IP를 노출하지 않고 ephemeral-key-based SSH를 이용하여 인스턴스에 연결할 수 있습니다. 두번째로 AWS는 인스턴스에 에이전트 기반 연결을 제공하는 Systems Manager Session Manager(SSM)가 있습니다. SSM은 인증 및 인가를 위해 IAM을 사용하며, 에이전트가 실행되도록 구성될 수 있는 환경에 이상적입니다.

EIC Endpoint는 퍼블릭 IP공간에서 프라이빗 IP 리소스에 접근 가능하게 해주기때문에 EIC Endpoint를 처음 생성하기 전에 보안제어 및 기능에 대해 먼저 알아보겠습니다.

보안제어 및 기능

인터넷을 통해 여러 VPC 내에 위치한 리소스를 관리하는 많은 고객들은 여전히 퍼블릭IP 주소를 사용하거나 베스천 호스트와 장기간 사용되는 SSH 키(long-lived SSH keys) 방식을 사용합니다. 퍼블릭IP를 사용하면 IGW 라우트(route) 혹은 보안그룹으로 어느정도 보호할 수 있지만 동적(Dynamic) IP 환경에서는 이런 제어를 관리하기 어렵게 됩니다.결과적으로 장기간 사용되는 SSH키를 신중하게 관리하는 것이 유일한 방어 계층입니다. 하지만 키 관리는  실패로 이어질 수 있으므로 여러 계층의 방어가 중요해지게 됩니다. 물론 베스천 호스트가 도움이 될 수 있지만 인프라의 관리, 패치 및 유지하는 작업부담이 크게 증가합니다.

EIC Endpoint를 생성하고 이를 통해 안전한 터널링 기술을 통해 연결을 설정하기 위해 IAM 권한이 필요합니다. 자격증명기반 액세스 제어를 이용하여 사용자가 언제, 어떻게, 얼마나 오래 연결할 수 있는지 관리(governing)할 수 있으며 보안그룹과 같은 전통적인 네트워크 액세스 제어도 사용할 수 있습니다. VPC 리소스와 연결된 보안그룹을 사용하여 액세스를 허용 또는 거부 할 수 있습니다. IAM 정책이나 보안그룹 모두 기본 동작은 명시적으로 허용되지 않는 한 트래픽을 거부합니다.

EIC Endpoint는 컨트롤 플레인(Control Plane)과 데이터 플레인(Data Plane)의 권한 분리 측면에서의 중요한 보안 요구 사항을 충족합니다. EC2 의 모든 IAM 권한을 가진 관리자는 EIC Endpoint(컨트롤 플레인)를 생성하고 제어할 수 있습니다. 그러나 EC2 인스턴스 연결 IAM 권한(데이터 플레인)도 함께 필요합니다. 반대로 VPC의 리소스로 터널링하기 위해 EIC Endpoint를 사용해야할 DevOps 엔지니어는 컨트롤 플레인을 필요로하지 않습니다. 모든 경우에 EIC Endpoint를 사용하는 IAM 주체(Principal)는 동일한 AWS 계정의 일부여야 합니다(직접 또는 교차 계정 역할(Role) 수임(Assumetion)을 사용한). 보안 관리자(Security administrators)와 감사자(auditors)에게는 EIC Endpoint API를 통한 구성 및 연결을 위한 모든 API 호출이 AWS CoundTrail에 기록되며 EIC Endpoint 활동의 중앙 집중식 뷰(view)를 제공합니다. 데이터 플레인 연결 기록에는 요청을 하는 IAM 주체, 그들의 소스 IP 주소, 요청된 대상 IP주소 및 대상 포트가 포함됩니다. 다음 그림은CloudTrail에 기록된 내용의 예 입니다.

EIC Endpoint는 선택적으로 클라이언트IP보존(또는 소스 IP보존이라고도 함)을 지원하며, 이는 특정 조직에 중요한 보안 고려 사항입니다. 예를들어, 연결하려는 리소스가 클라이언트의 공용 IP 주소의 네트워크 액세스를 허용하고 있거나 인스턴스 액세스 로그에 클라이언트의 실제 IP 주소가 반드시 포함되어야 하는 경우가 있습니다.

Endpoint를 생성할 때 이 기능을 활성화할 수 있지만, 기본 설정은 꺼져(Off) 있습니다. 이 기능이 꺼져 있을 때는 EIC Endpoint를 통한 연결은 네트워크 패킷의 소스 IP필드에 EIC Endpoint에 할당된 사설 IP주소가 기록됩니다. 기본 설정은 EIC Endpoint를 통해 프록시된 연결이 경로 테이블(Routing Table)이 허용하는 한 연결이  어디까지든 도달할 수 있게 합니다. 기억하실 점은 이 설정을 어떻게 하든지 CloudTrail에는 클라이언트의 실제 IP주소가 기록됩니다.

EIC Endpoint는 자격증명기반 인증 및 권한부여(authorization)를 전통적인 네트워크 파라미터 제어와 결합하여 보안을 강화하며, 세부적인 액세스 제어, 로깅, 모니터링 및 깊이 있는 방어를 제공합니다. 더욱이, 이 모든 작업을 VPC 내에서 인터넷 활성화를 필요로 하지 않기때문에 프라이빗 VPC 리소스에 부정접근 가능성을 최소화합니다.

시작하기

 EIC Endpoint 만들기

한 VPC 당 하나의 EIC Endpoint만 필요하며 EIC Endpoint를 생성 또는 수정하고 리소스에 연결하려면 사용자는 필요한 IAM 권한이 있어야 합니다. VPC 리소스와 관련된 모든 보안그룹은 연결을 허용하기 위한 룰(Rule)이 있어야 합니다. 자세한 내용은  보안그룹 구성 및 샘플 IAM 권한에 대한 문서를 확인하시면 됩니다.

AWS CLI 또는 콘솔을 사용하여 EIC Endpoint를 생성할 수 있습니다.

EIC Endpoint를 콘솔에서 만들기

EIC Endpoint를 만들기전에 필요한 보안그룹 생성이 필요합니다. EIC Endpoint의 입장에서는 패킷을 내보내는 것이기때문에 ssh 접속을 위한 룰을 새로운 Outbound rules 에 설정하였습니다.

콘솔에서 VPC->Endpoints->Create Endpoint 에서 EC2 Instance Connect Endpoint를 선택합니다.

EIC Endpoint를 생성할 VPC 를 선택하고 앞에 설명한 클라이언트 IP 보존이 필요한 경우 Preserve Client IP 를 선택합니다.

미리 설정해 둔 보안그룹을 선택합니다. 보안그룹을 선택하지 않는 경우 선택한 VPC의 기본(default)보안그룹을 사용합니다.

EIC 엔드포인트가 연결될 서브넷을 선택합니다.

EIC EndpointAWS CLI로 만들기

AWS CLI로 EIC Endpoint를 만들기 위해 다음 커맨드를 실행하시면 됩니다. [SUBNET] 에 서브넷 아이디를 입력하고 [SG-ID] 에 Security Group 아이디를 입력합니다.

aws ec2 create-instance-connect-endpoint \
    --subnet-id [SUBNET] \
    --security-group-id [SG-ID] 

EIC Endpoint를 AWS CLI나 콘솔을 통해 만들었으면 이제 리눅스 인스턴스에 SSH를 이용하여 어떻게 연결 할 수 있는지 알아봅니다. 물론 오픈터널 API를 이용하여 RDP를 이용하여 윈도우 인스턴스에 연결하는것도 가능합니다.

리눅스 인스턴스에 SSH로 접속하기

VPC 서브넷에 EIC Endpoint를 설정한 경우, SSH를 사용하여 리소스에 연결할 수 있습니다. 기존에는 SSH를 통한 EC2 인스턴스 액세스는 키페어 및 보안그룹과 같은 네트워크 액세스 제어 기능을 이용하여 관리 되었습니다. 여기에 EIC Endpoint를 사용하면 IAM 정책을 통해 추가적인 제어 레이어가 활성화되어 원격 액세스의 보안 수준이 향상됩니다. 아래에서 SSH를 통한 연결하는 두 가지 방법을 설명하겠습니다.

 

원클릭(One-click) 명령 사용

SSH 키를 생성하고 주기적으로 교체하는 운영 부담을 더욱 줄이기 위해, AWS CLI의 새로운 ec2-instance-connect ssh 명령을 사용할 수 있습니다. 이 새로운 명령을 사용하면 인스턴스에 연결하기 위해 일시적(ephemeral)으로 생성되는 키를 제공합니다. 이 명령은 OpenSSH 클라이언트 및 최신 버전의 AWS CLI를 사용해야 합니다.  AWS CLI 명령을 실행할때 오류가 발생하는 경우 최신 버전의 AWS CLI를 사용하고 있는지 확인 하시면 됩니다. 이 명령을 사용하고 연결하려면 여기에 자세히 나와 있는 IAM 권한이 필요합니다. 대략 다음과 같이 권한을 설정합니다.

{
    "Version": "2012-10-17",
    "Statement": [{
            "Sid": "EC2InstanceConnect",
            "Action": "ec2-instance-connect:OpenTunnel",
            "Effect": "Allow",
            "Resource": "arn:aws:ec2:region:account-id:instance-connect-endpoint/eice-123456789abcdef",
            "Condition": {
                "NumericEquals": {
                    "ec2-instance-connect:remotePort": "22"
                },
                "IpAddress": {
                    "ec2-instance-connect:privateIpAddress": "10.0.1.0/31"
                },
                "NumericLessThanEquals": {
                    "ec2-instance-connect:maxTunnelDuration": "3600"
                }
            }
        },
        {
            "Sid": "SSHPublicKey",
            "Effect": "Allow",
            "Action": "ec2-instance-connect:SendSSHPublicKey",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "ec2:osuser": "ami-username"
                }
            }
        },
        {
            "Sid": "Describe",
            "Action": [
                "ec2:DescribeInstances",
                "ec2:DescribeInstanceConnectEndpoints"
            ],
            "Effect": "Allow",
            "Resource": "*"
        }
    ]
}

구성한 후, 다음 그림에서 보는 대로 새로운 AWS CLI 명령을 사용하여 연결할 수 있습니다

터널 명령 사용하기

표준 도구를 사용하거나 프록시 명령을 사용하여 SSH로 연결할 수도 있습니다. 인스턴스로 프라이빗 터널 (TCP 프록시)을 연결하려면 AWS CLI 명령을 실행해야 합니다. 이때는 터널을 통해 SSH로 연결하기때문에 SSH키가 필요합니다. 이 명령에 대한 자세한 내용은 아래 그림에서 확인할 수 있습니다.

연결 테스트를 위해 다음 명령을 실행합니다. 여기서 [INSTANCE]는 EC2 인스턴스의 인스턴스 ID이고, [SSH-KEY]는 SSH 키의 위치와 이름입니다. SSH 키 사용에 대한 안내는 Amazon EC2 키페어 및 Linux 인스턴스 문서를 참조하십시오.

ssh ec2-user@[INSTANCE] \
    -i [SSH-KEY] \
    -o ProxyCommand='aws ec2-instance-connect open-tunnel \
    --instance-id %h'

한번 EIC Endpoint를 구성한 후에는 AWS CLI를 사용하여 퍼블릭 IP나 IGW 없이 EC2 인스턴스에 SSH로 접속할 수 있습니다.

GUI 도구로Amazon RDS 접속하기

터널 명령을 이용하면 IntelliJ의 Database Tool이나 SQL Workbench와 같은 GUI 툴을 이용하여 Amazon RDS에 접속 할 수 있습니다. 이때open-tunnel의 private-ip-address 옵션을 사용해야 하는데, 이때는 remote-port 에22 혹은 3306을 사용할 수 없습니다. 따라서 RDS를 생성할 때 3389 포트를 사용하였습니다.  그리고 EIC Endpoint의 Outband Rule에 3389를 추가하여 줍니다.

또한 RDS의 Security Group의 Inbound Rules에 3389 포트를 EIC Endpoint에 적용된 Security Group을 Source 로 추가하여 줍니다.

다음 명령을 통해 Amazon RDS로 터널을 생성합니다.

aws ec2-instance-connect open-tunnel --instance-connect-endpoint-id eice-0d29970XXXXXXXXXX --private-ip-address database-1.XXXXXXXXXXXX.ap-northeast-2.rds.amazonaws.com --local-port 3306 --remote-port 3389 --profile mfa

선호하는 Database Tool을 이용하여 lookback 주소(127.0.0.1 or localhost) 를 통해 RDS에 접속 할 수 있습니다.

MFA(Multi-Factor Authentication) 적용하기

AWS CLI를 이용하기 위해서는 Access Key가 필요하지만 보다 안전한 환경을 위해서 AWS CLI 에 MFA를 적용할 수 있습니다. AWS 환경에서 사용하는 멀티 팩터 인증(MFA)의 모든 것 블로그 포스팅을 참고하여 MFA를 적용할 수 있습니다.

블로그 포스팅 내용을 참고하여 MFA를 활성화 한 후 IAM 유저의 기본 인증키 정보를 이용하여 AWS CLI를 설정합니다.

(*참고: 아래 첨부된 AWS Credential의 AccessKey와 SecretKey는 모두 일부 마스킹 처리 되었습니다.)

MFA를 사용하기 위해서는 새로운 get-session-token을 통해 임시 자격증명을 생성해야 합니다. serial-number는 IAM User -> Security Credentials -> MFA 디바이스-> Identifier 항목의 ARN을 입력하고 token-code 는 여러분의 MFA 디바이스에 나타난 토큰 코드를 입력합니다.

이렇게 생성된 임시 자격 증명을 이용하여 새 프로파일 구성을 추가 합니다. 새 프로파일을 만들지 않는경우 default 프로파일 정보가 사라지기 때문에 임시 자격 증명을 얻기 위해 새로 access_key를 생성해야 할 수 있으므로 새로운 프로파일을 생성하는 것을 권장합니다.

MFA가 활성화 되었는지 프로파일을 이용하여 확인합니다.

임시 자격증명이 만료 되면 액세스가 거부 됩니다. duration-seconds 옵션을 사용하여 만료 기간(초)을 지정할 수 있습니다. 이 값의 범위는 900초(15분)~129,600초(36시간) 기본값은 36시간 입니다. 루트 사용자 자격 증명을 사용하는 경우 이 범위는 900초(15분)부터 3600초(1시간)까지 입니다.

결론

EIC Endpoint는 IGW, 퍼블릭 IP, 에이전트, 및 보안 관리 호스트 없이 프라이빗 서브넷에 위치한 인스턴스에 SSH 또는 RDP를 통해 안전하게 연결할 수 있는 솔루션을 제공합니다. VPC에 EIC Endpoint를 구성함으로써 고객이 선호하는 기존의 클라이언트 도구 또는 콘솔/AWS CLI를 이용하여 안전하게 연결할 수 있습니다. 더 많은 정보를 알아보려면 EIC Endpoint 문서를 참고하시기 바랍니다.

HyoSung Lee

HyoSung Lee

이효성 솔루션즈 아키텍트는 다양한 분야에서의 서비스 설계 및 운영 경험을 바탕으로 ISV/DNB 고객들이 AWS 를 활용해 서비스를 만들고 고도화하는 과정에서 기술적인 도움을 드리는 업무를 하고 있습니다.