//
Search
Duplicate
🌛

AWS SSM 적용기 (gossm)

EC2에 접속하기 위해서는 Private key가 필요합니다. 접속해야 하는 EC2 대수가 늘어날수록 Key의 개수도 함께 늘어나게 되는데요. 다른 개발팀에서 접속을 해야 하는 상황이면 키는 기하급수적으로 분산되어 각자 Local 노트북 환경에 보관하게 됩니다.
만약 그 Local 노트북 환경이 해킹을 당하거나 분실하게 된다면 어떻게 될까요?
다른 사람에게 폴더 자료를 복사해 주다가 그 안에 있는 Key 파일이 함께 전송된다면 어떻게 될까요?
물론 확률이 낮은 상황이지만 100% 배제를 못하는 상황이기 때문에 관리를 해주는 것이 필요합니다.
EC2에 접속하는 방법 중 SSM(AWS System Manager)을 사용하면 여러가지 장점이 있습니다.
Bastion Host 필요 없음
Key 필요 없음
Security Group(SG) 필요 없음
구성을 하기 위해서는 접속하려는 EC2에 부여할 Role을 생성 및 할당하고 ssm user를 만들어서 access key와 security key를 접속하려는 터미널 환경에서 등록을 해야 합니다.
우선 EC2에 부여할 Role을 먼저 생성해 보겠습니다.
AWS IAM에서 EC2와 SSM 관련된 권한은 “AmazonEC2RoleforSSM”, “AmazonSSMManagedInstanceCode” 이 있는데 최소 권한만 주기 위해서는 AmazonSSMManagedInstanceCode 권한을 EC2에 할당하면 됩니다.
IAM 페이지에서 역할을 선택하고 역할 만들기를 눌러서 일반 사용 사례에서 EC2 선택 후 다음 진행합니다.
위에서 이야기 한 AmazonSSMManagedInstanceCore 권한을 선택하고 다음 진행합니다.
이름 지정, 검토 및 생성 페이지에서 EC2에 할당할 역할 이름을 지정하고 역할 생성을 진행합니다.
생성된 역할을 확인해 보면 아래 내용처럼 들어가 있습니다.
이제 ec2-ssm-role 역할을 할당할 EC2를 선택하고 실제 터미널에서 접속이 가능한지 확인해 보겠습니다.
단계에서 생성한 역할을 지정하고 IAM 역할 업데이트를 역할이 EC2에 적용됩니다.
이제 ssm user를 생성하고 맞는 권한을 부여하는 작업을 진행합니다. IAM 페이지에서 사용자 선택 후 사용자 추가 버튼을 눌러서 진행합니다.
사용자 이름은 사용할 user 이름으로 작성하고 AWS 자격 증명 유형은 “액세스 키” 방식으로 나중에 터미널에서 aws configure 명령을 통해서 등록할 key 정보를 확인합니다.
기존 정책 직접 연결을 선택 하고 “정책 생성” 버튼을 눌러서 JSON 형태로 권한을 부여하도록 하겠습니다.
아래의 내용을 정책 생성(JSON)에 복사하고 정책을 생성 진행 합니다.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ssm:DescribeSessions", "ssm:DescribeInstanceProperties", "ssm:DescribeInstanceInformation", "ssm:DescribeDocument", "ssm:StartSession", "ssm:TerminateSession" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "ssmmessages:CreateControlChannel", "ssmmessages:CreateDataChannel", "ssmmessages:OpenControlChannel", "ssmmessages:OpenDataChannel" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "ec2:DescribeInstanceStatus", "ec2:DescribeInstances" ], "Resource": "*" } ] }
JSON
복사
최종 정책 검토 단계에서 이름을 지정하고 “정책 생성” 버튼을 누르면 사용자에 할당할 정책이 생성됩니다.
정책이 생성된 이후에 다시 사용자 추가 과정을 진행해서 마무리하면 됩니다. 위에서 생성한 정책을 선택하고 다음 진행합니다.
ssm 사용자에 추가될 권한을 확인하고 사용자 만들기 버튼을 눌러서 완료합니다.
콘솔 상에서 보이는 키 정보는 한 번만 볼 수 있기 때문에 .csv 다운로드 파일을 눌러서 액세스 키 ID와 비밀 세스 키 정보가 있는 파일을 보관해서 관리하는 것이 좋습니다.
이제 터미널 환경에서 gossm 프로그램을 통해서 ssm 이용을 하기 위해 AWS Account key 등록 작업을 진행합니다.
# aws configure AWS Access Key ID [****************]: Access Key는 ssm-user에 대한 key입니다. AWS Secret Access Key [[****************]: Secret Access Key는 ssm-user에 대한 key입니다. Default region name [ap-northeast-2]: 다른 리전일 경우 지정 Default output format [None]:
Shell
복사
이제 다 왔습니다.
터미널에서 gossm 파일을 다운로드 받아서 좀 더 편리하게 사용할 수 있도록 작업을 진행합니다.
현재 제 환경은 Windows 11 환경에 Oracle Linux 8.5 버전 OS를 WSL 형태로 사용중이니 참고하시기 바랍니다.
# wget https://github.com/gjbae1212/gossm/releases/download/v1.5.0/gossm_1.5.0_Linux_x86_64.tar.gz --2022-11-18 18:04:16-- https://github.com/gjbae1212/gossm/releases/download/v1.5.0/gossm_1.5.0_Linux_x86_64.tar.gz Resolving github.com (github.com)... 20.100.245.247 Connecting to github.com (github.com)|20.100.245.247|:443... connected. HTTP request sent, awaiting response... 302 Found Location: https://objects.githubusercontent.com/github-production-release-asset-2e65be/195654997/5d9a75d9-a4cb-4d02-a2c4-04c8fb283de0?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20221118%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20221118T090416Z&X-Amz-Expires=300&X-Amz-Signature=a735ad10d0e179403d6d926f3cb9302a08cc5f271f9f3a0d6d5310bdb85961a3&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=195654997&response-content-disposition=attachment%3B%20filename%3Dgossm_1.5.0_Linux_x86_64.tar.gz&response-content-type=application%2Foctet-stream [following] --2022-11-18 18:04:16-- https://objects.githubusercontent.com/github-production-release-asset-2e65be/195654997/5d9a75d9-a4cb-4d02-a2c4-04c8fb283de0?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20221118%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20221118T090416Z&X-Amz-Expires=300&X-Amz-Signature=a735ad10d0e179403d6d926f3cb9302a08cc5f271f9f3a0d6d5310bdb85961a3&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=195654997&response-content-disposition=attachment%3B%20filename%3Dgossm_1.5.0_Linux_x86_64.tar.gz&response-content-type=application%2Foctet-stream Resolving objects.githubusercontent.com (objects.githubusercontent.com)... 185.199.110.133, 185.199.111.133, 185.199.108.133, ... Connecting to objects.githubusercontent.com (objects.githubusercontent.com)|185.199.110.133|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 18106097 (17M) [application/octet-stream] Saving to: ‘gossm_1.5.0_Linux_x86_64.tar.gz’ gossm_1.5.0_Linux_x86_64.tar.gz 1%[==> ] 295.38K 41.4KB/s eta 7m 4s
Shell
복사
gossm_1.5.0_Linux_x86_64.tar.gz 파일이 다운로드 완료되면 압축과 아카이빙을 풀고 gossm 파일 실행을 하면 됩니다.
만약 명령어 수행에 오류가 발생하면 해당 EC2에 접속 후 amazon-ssm-agent 서비스를 재기동하고 다시 실행하면 정상적으로 동작합니다.
# gossm start region (ap-northeast-2) ? Choose a target in AWS: [Use arrows to move, type to filter] > prometheus (i-0bf952sdfsada8456) sentry (i-0ewesdfsdd494c9ca)
Shell
복사
만약 지금 사용하는 AWS 환경이 Multi Account 환경이라면 .aws/credentials 파일에 여러 개의 key 정보가 있을 것입니다.
이 경우에는 -p 옵션을 통해서 특정 account key를 지정할 수 있습니다.
# gossm gossm is interactive CLI tool that you select server in AWS and then could connect or send files your AWS server using start-session, ssh, scp in AWS Systems Manger Session Manager. Usage: gossm [command] Available Commands: cmd Exec `run command` under AWS SSM with interactive CLI completion Generate the autocompletion script for the specified shell fwd Exec `fwd` under AWS SSM with interactive CLI fwdrem Exec `fwdrem` under AWS SSM with interactive CLI help Help about any command mfa It's to authenticate MFA on AWS, and save authenticated mfa token in .aws/credentials_mfa. scp Exec `scp` under AWS SSM with interactive CLI ssh Exec `ssh` under AWS SSM with interactive CLI start Exec `start-session` under AWS SSM with interactive CLI Flags: -h, --help help for gossm -p, --profile string [optional] if you are having multiple aws profiles, it is one of profiles (default is AWS_PROFILE environment variable or default) -r, --region string [optional] it is region in AWS that would like to do something -v, --version version for gossm Use "gossm [command] --help" for more information about a command. # gossm start -p ssm
Shell
복사
amazon linux에는 기본적으로 ssm agent가 설치되어 있지만 다른 리눅스의 경우는 ssm-agent 설치가 안 되어 있을 수 있습니다. 이 경우는 다운로드해 설치하면 됩니다.
$ sudo systemctl status amazon-ssm-agent ● amazon-ssm-agent.service - amazon-ssm-agent Loaded: loaded (/usr/lib/systemd/system/amazon-ssm-agent.service; enabled; vendor preset: enabled) Active: active (running) since Tue 2022-11-15 07:03:27 UTC; 2 days ago Main PID: 2261 (amazon-ssm-agen) Tasks: 18 Memory: 4.5M CGroup: /system.slice/amazon-ssm-agent.service ├─2261 /usr/bin/amazon-ssm-agent └─2417 /usr/bin/ssm-agent-worker Nov 15 07:03:27 ip-172-31-37-121.ap-northeast-2.compute.internal amazon-ssm-agent[2261]: New Seelog Logger Creation Complete Nov 15 07:03:27 ip-172-31-37-121.ap-northeast-2.compute.internal amazon-ssm-agent[2261]: 2022-11-15 07:03:27 INFO Agent will take identity from EC2 Nov 15 07:03:27 ip-172-31-37-121.ap-northeast-2.compute.internal amazon-ssm-agent[2261]: 2022-11-15 07:03:27 INFO [amazon-ssm-agent] using named... IPC Nov 15 07:03:27 ip-172-31-37-121.ap-northeast-2.compute.internal amazon-ssm-agent[2261]: 2022-11-15 07:03:27 INFO [amazon-ssm-agent] using named... IPC Nov 15 07:03:27 ip-172-31-37-121.ap-northeast-2.compute.internal amazon-ssm-agent[2261]: 2022-11-15 07:03:27 INFO [amazon-ssm-agent] using named... IPC Nov 15 07:03:28 ip-172-31-37-121.ap-northeast-2.compute.internal amazon-ssm-agent[2261]: 2022-11-15 07:03:27 INFO [amazon-ssm-agent] amazon-ssm-...24.0 Nov 15 07:03:28 ip-172-31-37-121.ap-northeast-2.compute.internal amazon-ssm-agent[2261]: 2022-11-15 07:03:27 INFO [amazon-ssm-agent] OS: linux, ...md64 Nov 15 07:03:28 ip-172-31-37-121.ap-northeast-2.compute.internal amazon-ssm-agent[2261]: 2022-11-15 07:03:28 INFO [amazon-ssm-agent] [LongRunnin...cess Nov 15 07:03:28 ip-172-31-37-121.ap-northeast-2.compute.internal amazon-ssm-agent[2261]: 2022-11-15 07:03:28 INFO [amazon-ssm-agent] [LongRunnin...rted Nov 15 07:03:28 ip-172-31-37-121.ap-northeast-2.compute.internal amazon-ssm-agent[2261]: 2022-11-15 07:03:28 INFO [amazon-ssm-agent] [LongRunnin...onds Hint: Some lines were ellipsized, use -l to show in full.
Shell
복사