[GCP]SSH 로 GCE(VM) 접속방법 좀 더 알아보기

이정운 (Jungwoon Lee)
google-cloud-apac
Published in
12 min readJul 30, 2020

안녕하세요 이정운 입니다.

Google cloud 의 GCE(VM) 에 ssh 로 접속할 때 쉽게 관리콘솔에서 클릭하는 형태로 바로 접속을 많이 하시는데, 해당 방법 말고 조금 더 큰 규모의 환경을 관리하는 경우에 더 나은 방법이 있을까 찾아보고 테스트를 수행해봤습니다. 이번 포스팅에서는 해당 테스트를 간단하게 정리하고 공유하도록 하겠습니다.

액세스 방법 선택
https://cloud.google.com/compute/docs/instances/access-overview

  • OS 로그인
  • 메타데이터에서 SSH 키 관리
  • 사용자에게 일시적으로 인스턴스에 대한 액세스 권한 부여

VM 에 엑세스 하기위한 여러 방법이 존재하지만, OS 로그인 기능을 사용하면 Compute Engine IAM 역할을 사용하여 Linux 인스턴스에 대한 ssh 액세스를 관리할 수 있고 필요한 경우에 2단계 인증으로 OS 로그인을 설정하여 추가 보안 레이어를 적용하거나 조직 정책 설정으로 조직 수준에서 액세스를 관리할 수 있는 이점을 가지고 있습니다. 그렇기때문에, 공식 문서를 확인해보시면 대부분의 경우 OS 로그인을 사용하는 것이 좋다고 언급되어 있습니다.

그럼 실제 테스트를 통해서 GCE 에 대한 자주 사용되는 ssh 접속 방법을 테스트 해보도록 하겠습니다.

#1) OS 로그인을 통한 SSH 접속

https://cloud.google.com/compute/docs/instances/managing-instance-access

GCE 에 대한 OS 로그인을 사용하시려면 해당 GCE 메타데이터나 전체 메타데이터에 OS 로그인 사용 설정을 추가해야 합니다. 예를 들어, 특정 GCE 에 대해서만 OS 로그인을 설정하려면 하단과 같이 GCE 설정 안의 메타데이터에 ‘enable-oslogin = TRUE’ 를 넣어줍니다.

또는, 전체 프로젝트 단위로 적용하려면 GCP 관리콘솔의 “Compute Engine > 메타데이터” 메뉴에서 ‘enable-oslogin = TRUE’ 를 추가해 주면 됩니다.

GCE 에 대한 OS 로그인 기능을 사용하려면 메타데이터 설정 이외에 IAM 을 통해서 사용하고자 하는 사용자에게 필요한 권한을 부여해야 합니다.

기본적으로 하단의 둘중 하나의 권한이 반드시 필요합니다.

roles/compute.osLogin — 관리자 권한을 부여하지 않음
roles/compute.osAdminLogin — 관리자 권한을 부여함

해당 권한 이외에 VM 인스턴스 세부정보를 비롯하여 프로젝트의 모든 리소스를 볼 수 있는 roles/compute.viewer 역할이나, VM 인스턴스가 서비스 계정을 사용하는 경우 서비스 계정을 사용할 수 있는 roles/iam.serviceAccountUser 권한이 부여 되어야 합니다.

이러한 권한은 GCP 관리콘솔의 “IAM 및 관리자 > IAM” 메뉴에서 사용자 추가와 함께 가능합니다.

OS 로그인을 위해 필요한 기본 설정이 완료되었으므로 간단하게 ssh 접속 테스트를 수행해보도록 하겠습니다. 데스크탑이나 Cloud Shell 이라면 “gcloud auth login” 명령을 사용하여 권한을 부여받은 사용자로 로그인을 먼저 수행합니다. (또는, 처음 접속시부터 해당 사용자로 로그인)

gcloud auth login

하단과 같은 gcloud 명령을 통해서 ssh 로 접속합니다. 접속시에 확인이 가능하지만 자동으로 ssh key 생성을 수행한 후 정상적으로 ssh 에 접속 가능한 것을 확인 가능합니다.

gcloud beta compute ssh --zone "asia-northeast3-c" "ssh-instance-1" --project "jwlee-myproject-01"

팁 #1) ERROR: (gcloud.beta.compute.ssh) [/usr/bin/ssh] exited with return code [255]가 발생되면 ~/.ssh 폴더를 전부 날리고 다시 ssh 시도해보면 일반적으로는 문제가 해결됩니다.

테스트 해보시면 아시겠지만 roles/compute.osLogin 일 경우 등록된 사용자 id 를 기준으로 jungwoon@freejava.co.kr 이 jungwoon_freejava_co_kr 이라는 사용자로 자동 생성된 후 접근이 됩니다. (roles/compute.osAdminLogin 일경우 테스트 해보니 jungwoon 이 사용자로 접근 됩니다.)

https://cloud.google.com/compute/docs/instances/managing-instance-access#login_messages

참고로 하단과 같이 ‘gcloud compute os-login describe-profile’ 명령을 통해서 사용자 이름을 확인할 수도 있습니다.

gcloud compute os-login describe-profile

추신 #1) roles/compute.osAdminLogin 권한이 있다면 ssh 접속후에 ‘sudo -s’ , ‘sudo -i’ 명령을 통해서 root 로도 접근이 가능합니다.

추신 #2) 조직을 사용하는 경우라면 좀 더 다양하게 보안을 강화하거나 OS 로그인 조건을 관리하실 수 있습니다.

조직의 OS 로그인 관리
https://cloud.google.com/compute/docs/oslogin/manage-oslogin-in-an-org

GCP 에서 조직(Organization) 활용하기 3부 — 조직 정책
https://medium.com/google-cloud-apac/gcp-gcp-%EC%97%90%EC%84%9C-%EC%A1%B0%EC%A7%81-organization-%ED%99%9C%EC%9A%A9%ED%95%98%EA%B8%B0-3%EB%B6%80-%EC%A1%B0%EC%A7%81-%EC%A0%95%EC%B1%85-d4995ffacf8d

추신 #3) OS 로그인을 사용하면서 타사 도구를 사용하여 VM에 연결하려면 하단의 링크를 참고하여 사용자 계정에 SSH 키를 추가해야 합니다

5단계: (선택사항) 사용자 계정에 SSH 키 추가
https://cloud.google.com/compute/docs/instances/managing-instance-access#add_oslogin_keys

#2) 메타데이터에서 SSH 키 관리

https://cloud.google.com/compute/docs/instances/adding-removing-ssh-keys

다음으로는 ‘메타데이터에서 SSH 키 관리’ 라고 불리우는, 메타데이터에서 ssh public key 를 저장해두고 private key 로 접속하는 방법을 테스트해보도록 하겠습니다. 액세스 관리를 위해 자체 디렉터리 서비스를 실행 중이거나 OS 로그인을 설정할 수 없는 경우 메타데이터에서 SSH 키 및 로컬 사용자 계정을 수동으로 관리할 수 있습니다. (참고로, 타사 도구 활용을 위해서 OS 로그인을 사용했을 경우에도 메타데이터에 public key 등록 및 private key 로 접근해서 사용이 가능합니다.)

우선, 이러한 작업을 수행하려면 다음과 같은 권한이 있어야 합니다.

  • 인스턴스에 메타데이터를 설정하는 경우, 인스턴스에 대한 compute.instances.setMetadata 권한
  • 프로젝트 차원의 메타데이터를 설정하는 경우, 프로젝트에 대한 compute.projects.setCommonInstanceMetadata 권한
  • 프로젝트 차원의 메타데이터를 설정하는 경우, 프로젝트에 대한 iam.serviceAccounts.actAs 권한

이 방식은 설정이 간편하긴 하지만 Cloud Console, gcloud 명령줄 도구 또는 API를 통해 공개 SSH 키를 직접 만들고 관리하는 경우 더 이상 액세스 권한이 없는 사용자가 액세스할 수 없도록 사용된 키를 추적하고 공개 SSH 키를 직접 삭제해야 하는 작업이 추가되어야 하는 점을 인지해야 합니다. 예를 들어, 팀원이 프로젝트를 그만둘 경우, 인스턴스에 계속 액세스할 수 없도록 메타데이터에서 공개 SSH 키를 삭제해야 합니다.

가장 먼저 VM 접근을 위해서 새로운 SSH 키를 만들어야 합니다.

https://cloud.google.com/compute/docs/instances/adding-removing-ssh-keys#createsshkeys

하단의 ssh-keygen 명령을 통해서 간단하게 SSH 키를 생성합니다. 일반적으로 SSH public key/private key 가 쌍으로 생성되며 참고로 ssh key 만들때 사용한 Username 이 실제 ssh 접속시에 사용됩니다.

ssh-keygen -t rsa -f ~/.ssh/keyfile01 -C jungwoon

자신만 비공개 키를 읽을 수 있도록 권한을 수정합니다.

chmod 400 ~/.ssh/keyfile01

다음으로 생성된 public key 를 확인 및 내용을 복사합니다.

~/.ssh/keyfile01.pub 파일 확인 및 복사

GCP 관리콘솔에 접속해서 접근하려는 GCE 인스턴스에서 ‘수정’ 버튼을 클릭한 후 복사해둔 public key 인 keyfile01.pub 의 ssh 키를 입력합니다.

정상적으로 public key 가 복사되었으면 ‘저장’ 버튼을 클릭하여 설정을 저장합니다.

이제 실제로 SSH 접속을 시도해 보겠습니다. ssh 접속시에는 이전에 생성해둔 private key 가 필요합니다.(keyfile01) 하단과 같은 ssh 명령을 통해서 접속을 테스트 합니다.

ssh -i ~/.ssh/keyfile01 jungwoon@34.73.213.64

보시면 아시겠지만 자동으로 ssh 키만들때 사용한 사용자가 VM에 생성되며 해당 이름으로 접속 가능한 것을 확인 가능합니다.

ssh key 를 생성한 Cloud Shell 이 아니라 외부에서 접속하는 경우에는 Cloud shell 에서 생성해둔 private key 를 다운로드 해야 합니다.

데스크탑에 다운로드 한 private key 는 사용과 보안을 위해서 권한을 하단과 같이 조정 합니다.

chmod 400 ./keyfile01

이제 gcloud 가 아닌 ssh 명령을 이용해서 접속 테스트를 해봅니다. 외부의 타사도구라도 정상적으로 접속이 가능한 것을 확인 가능합니다.

ssh -i ./keyfile01 jungwoon@34.73.213.64

Disclaimer: 본 글의 작성자는 Google 직원이지만 Google cloud 를 공부하는 한 개인으로서 작성된 글입니다. 본 글의 내용, 입장은 Google 을 대변하지 않으며 Google 이 해당 콘텐츠를 보장하지 않습니다.

참고 자료 #1

액세스 방법 선택
https://cloud.google.com/compute/docs/instances/access-overview

OS 로그인 설정
https://cloud.google.com/compute/docs/instances/managing-instance-access

메타데이터에서 SSH 키 관리
https://cloud.google.com/compute/docs/instances/adding-removing-ssh-keys

조직의 OS 로그인 관리
https://cloud.google.com/compute/docs/oslogin/manage-oslogin-in-an-org

GCP 에서 조직(Organization) 활용하기 3부 — 조직 정책
https://medium.com/google-cloud-apac/gcp-gcp-%EC%97%90%EC%84%9C-%EC%A1%B0%EC%A7%81-organization-%ED%99%9C%EC%9A%A9%ED%95%98%EA%B8%B0-3%EB%B6%80-%EC%A1%B0%EC%A7%81-%EC%A0%95%EC%B1%85-d4995ffacf8d

--

--

이정운 (Jungwoon Lee)
google-cloud-apac

Technical engineer who dreams better future. (These thoughts are my own personal opinions, and do not reflect or represent Google’s opinions or plans.)