Amazon EC2 Instance Connect를 통해 EC2 인스턴스에 대한 SSH 연결하기
AWS는 AWS Identity and Access Management(IAM)를 사용하여 EC2 인스턴스에 대한 SSH 액세스를 제어하는 새로운 방법인 Amazon EC2 Instance Connect를 제공합니다.
Amazon EC2 Instance Connect 기능 소개
Chef, Puppet 같은 코드형 인프라(IaC) 도구가 업계에서 서버를 구성하는 데 일반적으로 사용되고 있지만, 경우에 따라 인스턴스에 액세스하여 미세 조정하거나 시스템 로그를 참조하거나 애플리케이션 문제를 디버깅해야 합니다. Linux 서버에 연결하는 가장 일반적인 도구는 SSH(Secure Shell)입니다. 이 도구는 1995년에 만들어졌으며 현재 거의 모든 Linux 배포판에 기본적으로 설치되어 있습니다.
SSH를 통해 호스트에 연결할 때 SSH 키 페어를 사용하여 개별적으로 사용자를 인증하는 경우가 많습니다. 따라서 조직에서는 이러한 SSH 키를 저장, 공유, 액세스 관리 및 유지 관리해야 합니다.
일부 조직에서는 단일 점프 지점을 사용하여 호스트에 대한 네트워크 액세스를 제한하는 Bastion 호스트도 유지 관리합니다. 이러한 조직은 추가 네트워크 난독화 계층을 추가하여 로깅을 제공하고 악성 SSH 액세스를 방지합니다. 하지만 Bastion 호스트를 실행하는 데에는 어려움이 따릅니다. 설치된 사용자 키를 유지 관리하고, 교체를 처리하며, Bastion 호스트를 항상 사용할 수 있도록 하고 무엇보다 안전하게 유지합니다.
Amazon EC2 Instance Connect는 이러한 많은 문제를 간소화하여 보안 태세를 개선하는 데 도움이 되는 다음과 같은 이점을 제공합니다.
- 중앙 집중식 액세스 제어 – 사용자별 및 인스턴스별 수준에서 EC2 인스턴스에 대한 중앙 집중식 액세스 제어를 적용합니다. IAM 정책 및 보안 주체는 SSH 키를 공유하고 관리할 필요가 없습니다.
- 수명이 짧은 키 – SSH 키는 인스턴스에서 지속되지 않고 기본적으로 단기적으로 유지됩니다. 권한이 부여된 사용자가 연결할 때 인스턴스에서만 액세스할 수 있으므로 실시간으로 액세스 권한을 부여하거나 취소하기가 더욱 쉬워집니다. 이렇게 하면 수명이 긴 키에서 벗어날 수도 있습니다. 대신 권한이 부여된 사용자가 연결할 때마다 일회성 SSH 키를 생성하므로 키를 추적하고 유지할 필요가 없습니다.
- 감사 기능 – EC2 Instance Connect를 통한 사용자 연결은 AWS CloudTrail에 로깅되므로 연결 요청을 쉽게 감사하고 규정 준수를 유지하는 데 필요한 가시성을 제공합니다.
- 유비쿼터스 액세스 – EC2 Instance Connect는 기존 SSH 클라이언트와 원활하게 작동합니다. 또한 EC2 콘솔의 새로운 브라우저 기반 SSH 클라이언트에서 인스턴스에 연결할 수 있으므로 워크플로나 도구를 변경하지 않고도 일관된 경험을 제공할 수 있습니다.
EC2 Instance Connect 작동 방식
인스턴스에서 EC2 Instance Connect 기능이 활성화되면 해당 인스턴스의 SSH 대몬(sshd)이 사용자 지정 AuthorizedKeysCommand 스크립트로 구성됩니다. 이 스크립트는 SSH 인증 프로세스 중에 인스턴스 메타데이터에서 SSH 퍼블릭 키를 읽도록 AuthorizedKeysCommand를 업데이트하고 인스턴스에 연결합니다.
SSH 퍼블릭 키는 인스턴스 메타데이터에서 60초 동안 한 번만 사용할 수 있습니다. 인스턴스에 성공적으로 연결하려면 이 기간 내에 SSH를 사용하여 연결해야 합니다. 키는 만료되므로 이전처럼 이러한 키를 직접 추적하거나 관리할 필요가 없습니다.
EC2 Instance Connect를 위한 EC2 인스턴스 구성
EC2 Instance Connect를 사용하여 시작하려면 먼저 기존 인스턴스를 구성해야 합니다. 현재 EC2 Instance Connect는 Amazon Linux 2 및 Ubuntu를 지원합니다. 기능을 활성화하려면 RPM 또는 Debian 패키지를 각각 설치합니다. 새로운 Amazon Linux 2 인스턴스에는 EC2 Instance Connect 기능이 기본적으로 활성화되어 있으므로, 추가 구성 없이 SSH를 사용하여 새로 시작된 인스턴스에 즉시 연결할 수 있습니다.
먼저 기존 인스턴스를 구성합니다. 이 경우 계정에서 실행 중인 Amazon Linux 2 인스턴스를 설정합니다. Ubuntu에 대한 단계는 EC2 Instance Connect 설정을 참조하십시오.
- SSH를 사용하여 인스턴스에 연결합니다. 인스턴스에서 비교적 최신 버전의 Amazon Linux 2가 실행되고 있습니다.
[ec2-user@ip-10-1-0-15 ~]$ uname -srv Linux 4.14.104-95.84.amzn2.x86_64 #1 SMP Fri Jun 21 12:40:53 UTC 2019
- yum 명령을 사용하여 ec2-instance-connect RPM 패키지를 설치합니다.
$ sudo yum install ec2-instance-connect Loaded plugins: extras_suggestions, langpacks, priorities, update-motd Resolving Dependencies --> Running transaction check ---> Package ec2-instance-connect.noarch 0:1.1-9.amzn2 will be installed --> Finished Dependency Resolution ........ Installed: ec2-instance-connect.noarch 0:1.1-9.amzn2 Complete!
이 RPM은 몇 가지 스크립트를 로컬로 설치하고 /etc/ssh/sshd_config에서 AuthorizedKeysCommand 및 AuthorizedKeysCommandUser 구성을 변경합니다. 구성 관리 도구를 사용하여 sshd 구성을 관리하는 경우 설명서에 설명된 대로 패키지를 설치하고 줄을 추가합니다.
ec2-instance-connect가 설치되면 사용자를 설정하고 인스턴스에 연결할 준비가 된 것입니다.
IAM 사용자 설정
먼저 IAM 사용자가 SSH 키를 EC2 Instance Connect로 푸시할 수 있도록 허용합니다. 조직의 다른 사용자에게 추가할 수 있도록 새로운 IAM 정책을 생성합니다.
- IAM 콘솔에서 정책, 정책 생성을 선택합니다.
- 정책 생성 페이지에서 JSON을 선택하고 다음 JSON 문서를 입력합니다. $REGION 및 $ACCOUNTID를 고유한 값으로 바꿉니다.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2-instance-connect:SendSSHPublicKey" ], "Resource": [ "arn:aws:ec2:$REGION:$ACCOUNTID:instance/*" ], "Condition": { "StringEquals": { "ec2:osuser": "ec2-user" } } } ] }
Amazon Linux 2에서 ec2-user를 ec2:osuser의 값으로 사용합니다. 적절한 SSH 사용자가 메타데이터를 사용할 수 있도록 이를 지정합니다. 자세한 내용은 Amazon EC2 Instance Connect 서비스에 대한 작업, 리소스 및 조건 키를 참조하십시오.
- 정책 검토를 선택합니다.
- 정책 검토 페이지에서 정책의 이름을 지정하고 설명을 제공한 다음 정책 생성을 선택합니다.
- 정책 생성 페이지에서 새 그룹(“HostAdmins”라고 이름을 지정함)을 생성하여 정책을 무언가에 연결합니다.
- 정책 연결 페이지에서 방금 생성한 정책을 연결하고 다음 단계를 선택합니다.
- 그룹 생성을 선택합니다.
- 그룹 페이지에서 새로 생성된 그룹을 선택하고 그룹 작업, 그룹에 사용자 추가를 선택합니다.
- 이 그룹에 추가할 사용자를 선택한 다음 사용자 추가를 선택합니다.
이제 사용자는 EC2 Instance Connect를 사용할 수 있습니다.
EC2 Instance Connect를 사용하여 인스턴스에 연결
인스턴스가 구성되고 사용자가 적절한 정책으로 설정되면 일반 SSH 클라이언트를 사용하거나 AWS Management Console을 사용하여 직접 인스턴스에 연결합니다. 원활한 SSH 경험을 제공하기 위해 EC2 Instance Connect는 명령줄 도구에서 이러한 단계를 마무리합니다. 또한 콘솔에서 SSH 키 생성 및 배포를 처리하는 브라우저 기반 인터페이스를 제공합니다.
SSH 클라이언트에 연결하려면
- 새 프라이빗 키와 퍼블릭 키인 mynew_key 및 mynew_key.pub를 각각 생성합니다.
$ ssh-keygen -t rsa -f mynew_key
- 다음 AWS CLI 명령을 사용하여 사용자를 인증하고 send-ssh-public-key 명령을 사용하여 인스턴스에 퍼블릭 키를 푸시합니다. 이를 지원하려면 최신 버전의 AWS CLI가 필요합니다.
$ aws ec2-instance-connect send-ssh-public-key --region us-east-1 --instance-id i-0989ec3292613a4f9 --availability-zone us-east-1f --instance-os-user ec2-user --ssh-public-key file://mynew_key.pub { "RequestId": "505f8675-710a-11e9-9263-4d440e7745c6", "Success": true }
- 인증 후에는 퍼블릭 키가 인스턴스 메타데이터를 통해 60초 동안 인스턴스에 제공됩니다. 이 기간 동안 연결된 프라이빗 키를 사용하여 인스턴스에 연결합니다.
$ ssh -i mynew_key ec2-user@ec2-34-204-200-76.compute-1.amazonaws.com
어떤 이유로 60초 이내에 연결하지 않으면 다음 오류가 표시됩니다.
$ ssh -i mynew_key ec2-user@ec2-34-204-200-76.compute-1.amazonaws.com
권한이 거부되었습니다(publickey,gssapi-keyex,gssapi-with-mic).
그럴 경우 SSH를 사용하여 연결하도록 send-ssh-public-key 명령을 다시 실행합니다.
이제 콘솔에서 인스턴스에 연결합니다.
EC2 콘솔에서 연결하려면
- Amazon EC2 콘솔을 엽니다.
- 왼쪽 탐색 창에서 인스턴스를 선택하고 연결할 인스턴스를 선택합니다.
- 연결을 선택합니다.
- 인스턴스에 연결 페이지에서 EC2 Instance Connect(브라우저 기반 SSH 연결), 연결을 선택합니다.
다음 터미널 창이 열리고 이제 SSH를 통해 인스턴스에 연결됩니다.
CloudTrail을 사용한 감사
모든 연결 시도에 대해 이벤트 세부 정보를 볼 수도 있습니다. 여기에는 대상 인스턴스 ID, OS 사용자 이름 및 퍼블릭 키가 포함되며, 모두 CloudTrail의 SendSSHPublicKey API 호출에 해당하는 SSH 연결을 설정하는 데 사용됩니다.
CloudTrail 콘솔에서 SendSSHPublicKey를 검색합니다.
최근에 EC2 Instance Connect를 사용한 경우 사용자가 이 API 작업을 호출하여 SSH 키를 대상 호스트로 전송한 레코드가 표시됩니다. 이벤트 세부 정보를 보면 감사에 사용할 수 있는 인스턴스 및 기타 중요한 정보가 표시됩니다.
다음 예에서는 사용 중인 SendSSHPublicKey 명령을 보여주는 CloudTrail 이벤트의 JSON을 참조하십시오.
{
"eventVersion": "1.05",
"userIdentity": {
"type": "User",
"principalId": "1234567890",
"arn": "arn:aws:iam:: 1234567890:$USER",
"accountId": "1234567890",
"accessKeyId": "ABCDEFGHIJK3RFIONTQQ",
"userName": "$ACCOUNT_NAME",
"sessionContext": {
"attributes": {
"mfaAuthenticated": "true",
"creationDate": "2019-05-07T18:35:18Z"
}
}
},
"eventTime": "2019-06-21T13:58:32Z",
"eventSource": "ec2-instance-connect.amazonaws.com",
"eventName": "SendSSHPublicKey",
"awsRegion": "us-east-1",
"sourceIPAddress": "34.204.194.237",
"userAgent": "aws-cli/1.15.61 Python/2.7.16 Linux/4.14.77-70.59.amzn1.x86_64 botocore/1.10.60",
"requestParameters": {
"instanceId": "i-0989ec3292613a4f9",
"osUser": "ec2-user",
"SSHKey": {
"publicKey": "ssh-rsa <removed>n"
}
},
"responseElements": null,
"requestID": "df1a5fa5-710a-11e9-9a13-cba345085725",
"eventID": "070c0ca9-5878-4af9-8eca-6be4158359c4",
"eventType": "AwsApiCall",
"recipientAccountId": "1234567890"
}
S3 버킷에서 CloudTrail 이벤트를 수집하도록 AWS 계정을 구성한 경우 프로그래밍 방식으로 정보를 다운로드하고 감사할 수 있습니다. 자세한 내용은 CloudTrail 로그 파일 가져오기 및 보기를 참조하십시오.
결론
Amazon EC2 Instance Connect는 복잡한 SSH 키 관리 전략에 대한 대안을 제공하며 CloudTrail에서 내장된 감사 기능을 사용할 경우의 이점이 있습니다. 모든 EC2 인스턴스에서 사용할 수 있는 EC2 인스턴스 메타데이터 및 IAM과 통합하면 IAM 정책에 따라 수명이 짧은 키를 안전하게 배포하고 액세스를 제어할 수 있습니다.
EC2 Instance Connect 작업에는 몇 가지 추가 기능이 있습니다. 앞으로 AWS는 정책 조건에서 리소스 태그를 사용하여 액세스를 제어할 수 있는 태그 기반 권한 부여를 시작할 예정입니다. 또한 AWS는 Amazon Linux 2 외에도 인기 있는 Linux 배포판에서 기본적으로 EC2 Instance Connect를 활성화할 계획입니다.
EC2 Instance Connect는 현재 미국 동부(오하이오 및 버지니아 북부), 미국 서부(캘리포니아 북부 및 오레곤), 아시아 태평양(뭄바이, 서울, 싱가포르, 시드니 및 도쿄), 캐나다(중부), EU(프랑크푸르트, 아일랜드, 런던 및 파리) 및 남아메리카(상파울루) AWS 리전에서 추가 비용 없이 사용할 수 있습니다.
– Saloni Sonpal, Amazon EC2 선임 프로덕트 매니저
이 글은 AWS Compute 블로그의 New: Using Amazon EC2 Instance Connect for SSH access to your EC2 Instances의 한국어 번역입니다.
Source: Amazon EC2 Instance Connect를 통해 EC2 인스턴스에 대한 SSH 연결하기