Infograb logo
GCP 컴퓨트 인스턴스를 자동으로 발견하기

Teleport Discovery Service는 GCP에 연결하여 구성된 레이블과 일치하는 GCP Compute Engine 인스턴스를 자동으로 발견하고 등록할 수 있습니다. 그런 다음 발견된 인스턴스에서 Teleport를 설치하고 시작하며 클러스터에 조인하는 스크립트를 실행합니다.

전제 조건

  • 실행 중인 Teleport 클러스터 버전 이상. Teleport를 시작하려면, 가입하기 위해 무료 평가판에 등록하거나 데모 환경 설정하기를 참조하세요.

  • tctl 관리 도구와 tsh 클라이언트 도구.

    tctltsh 다운로드에 대한 지침은 설치를 방문하세요.

  • Discovery Service를 실행할 GCP 컴퓨트 인스턴스.
  • Teleport 클러스터에 조인할 GCP 컴퓨트 인스턴스, 기본 Teleport 설치 스크립트를 사용할 경우 Ubuntu/Debian/RHEL을 실행 중인 인스턴스. (다른 리눅스 배포판의 경우, Teleport를 수동으로 설치할 수 있습니다.)
  • 당신의 Teleport 클러스터에 연결할 수 있는지 확인하려면, tsh login으로 로그인한 다음 현재 자격 증명을 사용하여 tctl 명령어를 실행할 수 있는지 확인하십시오. 예를 들어:
    tsh login --proxy=teleport.example.com --user=email@example.com
    tctl status

    클러스터 teleport.example.com

    버전 16.2.0

    CA 핀 sha256:abdc1245efgh5678abdc1245efgh5678abdc1245efgh5678abdc1245efgh5678

    클러스터에 연결하고 tctl status 명령어를 실행할 수 있다면, 현재 자격 증명을 사용하여 작업대에서 후속 tctl 명령어를 실행할 수 있습니다. 자신의 Teleport 클러스터를 호스팅하는 경우, Teleport 인증 서비스를 호스팅하는 컴퓨터에서 전체 권한으로 tctl 명령어를 실행할 수도 있습니다.

1단계/6. GCP 초대 토큰 생성

GCP 컴퓨트 인스턴스를 발견할 때, Teleport는 SSH 서비스 인스턴스에 조인하는 것을 인증하기 위해 GCP 초대 토큰을 사용합니다.

token.yaml이라는 파일을 생성하세요:

# token.yaml
kind: token
version: v2
metadata:
  # 토큰 이름은 비밀이 아니며 인스턴스는 이 토큰을 사용하기 위해
  # GCP 프로젝트에서 실행 중임을 증명해야 합니다.
  name: gcp-discovery-token
spec:
  # 필요한 최소 역할 집합을 사용하세요 (예: Node, Proxy, App, Kube, DB, WindowsDesktop)
  roles: [Node]

  # 이 토큰에 허용되는 조인 방법 설정
  join_method: gcp

  gcp:
    allow:
      # VM이 조인할 수 있는 GCP 프로젝트 ID.
      - project_ids: []
        # (선택 사항) VM이 조인할 수 있는 위치. 주의: 지역과
        # 존 모두 허용됩니다.
        locations: []
        # (선택 사항) VM이 조인할 수 있는 서비스 계정의 이메일 주소.
        service_accounts: []

project_ids 필드에 인스턴스의 프로젝트 ID를 추가하세요. 다음 명령으로 토큰을 Teleport 클러스터에 추가하세요:

tctl create -f token.yaml

2단계/6. Teleport에 대한 IAM 권한 구성

인스턴스를 발견하는 데 필요한 IAM 권한을 Teleport에 부여할 서비스 계정을 만듭니다.

GCP 콘솔에서 IAM > Roles로 이동하고 + Create Role을 클릭합니다. 역할 이름을 선택하고(예: teleport-discovery) 다음 권한을 부여합니다:

  • compute.instances.get
  • compute.instances.getGuestAttributes
  • compute.instances.list
  • compute.instances.setMetadata
  • iam.serviceAccounts.actAs
  • iam.serviceAccounts.get
  • iam.serviceAccounts.list
Custom role

Create를 클릭합니다.

IAM > Service accounts로 이동하여 + Create Service Account를 클릭합니다. 서비스 계정의 이름을 선택하고(예: teleport-discovery) 해당 이메일 주소를 클립보드에 복사합니다. Create and Continue를 클릭합니다.

Service account

IAM으로 이동하여 Grant Access를 클릭합니다. 서비스 계정의 이메일을 New principals 필드에 붙여넣고 사용자 정의 역할을 선택합니다. Save를 클릭합니다.

Role assignment

다음을 복사하여 teleport-discovery-role.yaml이라는 파일에 붙여넣습니다:

# teleport-discovery-role.yaml
title: "teleport-discovery"
description: "GCP 컴퓨트 인스턴스를 발견하기 위한 역할"
stage: "ALPHA"
includedPermissions:
- compute.instances.get
- compute.instances.getGuestAttributes
- compute.instances.list
- compute.instances.setMetadata
- iam.serviceAccounts.actAs
- iam.serviceAccounts.get
- iam.serviceAccounts.list

다음 명령을 실행하여 역할을 생성합니다:

gcloud iam roles create teleport_discovery \--project=project_id \--file=teleport-discovery-role.yaml

다음 명령을 실행하여 서비스 계정을 생성합니다:

gcloud iam service-accounts create teleport-discovery \--description="GCP 컴퓨트 인스턴스를 발견하도록 Teleport를 활성화하는 서비스 계정" \--display-name="teleport-discovery"

다음 명령을 실행하여 새 역할을 새 서비스 계정에 추가합니다:

gcloud projects add-iam-policy-binding project_id \--member="serviceAccount:teleport-discovery@project_id.iam.gserviceaccount.com" \--role="projects/project_id/roles/teleport_discovery"

3단계/6. 발견할 인스턴스 구성

발견할 각 인스턴스에 서비스 계정이 할당되어 있는지 확인합니다. 서비스 계정에 대한 권한은 필요하지 않습니다. 인스턴스에 서비스 계정이 있는지 확인하려면 다음 명령을 실행하고 serviceAccounts 아래에 최소한 하나의 항목이 있는지 확인합니다:

gcloud compute instances describe --format="yaml(name,serviceAccounts)" instance_name

인스턴스에서 게스트 속성 활성화

게스트 속성(드물게 업데이트되는 데이터에 사용되는 사용자 지정 메타데이터의 하위 집합)은 Teleport가 인스턴스의 SSH 호스트 키에 접근할 수 있도록 발견된 인스턴스에서 활성화해야 합니다. 인스턴스 메타데이터의 enable-guest-attributesTRUE로 설정하여 게스트 속성을 활성화하세요.

gcloud compute instances add-metadata instance_name \--metadata=enable-guest-attributes=True

인스턴스 생성 시 게스트 속성이 활성화되면 게스트 속성이 인스턴스의 호스트 키로 자동으로 채워집니다. 인스턴스 생성 후 게스트 속성이 활성화된 경우, 아래에 호스트 키를 수동으로 추가할 수 있습니다:

add-host-keys.sh라는 이름의 파일을 만들고 다음 내용을 복사합니다:

#!/usr/bin/env bash
for file in /etc/ssh/ssh_host_*_key.pub; do
  read -r KEY_TYPE KEY _ <"$file"
  curl -X PUT --data "$KEY" "http://metadata.google.internal/computeMetadata/v1/instance/guest-attributes/hostkeys/$KEY_TYPE" -H "Metadata-Flavor: Google"
done

다음 명령을 실행하여 호스트 키를 시작 스크립트의 일부로 추가합니다:

gcloud compute instances add-metadata instance_name \--metadata-from-file=startup-script="add-host-keys.sh"

다음 명령을 실행하여 SSH를 통해 호스트 키를 추가합니다:

gcloud compute ssh instance_name \--command='for file in /etc/ssh/ssh_host_*_key.pub; do KEY_TYPE=$(awk '\''{print $1}'\'' $file); KEY=$(awk '\''{print $2}'\'' $file); curl -X PUT --data "$KEY" "http://metadata.google.internal/computeMetadata/v1/instance/guest-attributes/hostkeys/$KEY_TYPE" -H "Metadata-Flavor: Google"; done'

4단계/6. Teleport Discovery Service 설치

Tip

Discovery Service를 이미 다른 Teleport 서비스(예: Auth 또는 Proxy)가 실행 중인 호스트에서 실행할 계획이라면 이 단계를 건너뛰어도 됩니다.

Discovery Service를 실행할 가상 머신에 Teleport를 설치하세요.

Linux 서버에 Teleport 설치하기:

  1. Teleport 에디션에 따라 edition을(를) 다음 중 하나로 지정합니다:

    에디션
    Teleport Enterprise Cloudcloud
    Teleport Enterprise (자체 호스팅)enterprise
    Teleport Community Editionoss
  2. 설치할 Teleport의 버전을 확인합니다. 클러스터에서 자동 에이전트 업데이트가 활성화되어 있는 경우, 업데이터와 호환되는 최신 Teleport 버전을 쿼리합니다:

    TELEPORT_DOMAIN=example.teleport.com
    TELEPORT_VERSION="$(curl https://$TELEPORT_DOMAIN/v1/webapi/automaticupgrades/channel/default/version | sed 's/v//')"

    그렇지 않으면, Teleport 클러스터의 버전을 확인합니다:

    TELEPORT_DOMAIN=example.teleport.com
    TELEPORT_VERSION="$(curl https://$TELEPORT_DOMAIN/v1/webapi/ping | jq -r '.server_version')"
  3. Linux 서버에 Teleport를 설치합니다:

    curl https://cdn.teleport.dev/install-v16.2.0.sh | bash -s ${TELEPORT_VERSION} edition

    설치 스크립트는 Linux 서버에서 패키지 관리자를 감지하고 이를 사용하여 Teleport 바이너리를 설치합니다. 설치를 사용자 지정하려면 설치 가이드에서 Teleport 패키지 리포지토리에 대해 알아보세요.

5단계/6. Teleport를 GCP 컴퓨트 인스턴스를 발견하도록 구성

Discovery Service를 자체 호스트에서 실행하는 경우, 클러스터에 연결하기 위해 유효한 초대 토큰이 필요합니다. Teleport Auth Service에 대해 다음 명령을 실행하여 생성하세요:

tctl tokens add --type=discovery

생성된 토큰을 Discovery Service를 실행할 가상 머신의 /tmp/token에 저장합니다.

GCP 인스턴스 발견을 활성화하려면 teleport.yamldiscovery_service.gcp 섹션에 최소한 하나의 항목을 포함해야 합니다:

version: v3
teleport:
  join_params:
    token_name: "/tmp/token"
    method: token
  proxy_server: "teleport.example.com:443"
auth_service:
  enabled: off
proxy_service:
  enabled: off
ssh_service:
  enabled: off
discovery_service:
  enabled: "yes"
  gcp:
    - types: ["gce"]
      # VM이 조인할 수 있는 GCP 프로젝트의 ID.
      project_ids: []
      # (선택 사항) VM이 조인할 수 있는 위치. 주의: 지역과
      # 존 모두 허용됩니다.
      locations: []
      # (선택 사항) VM이 조인할 수 있는 서비스 계정의 이메일 주소.
      service_accounts: []
      # (선택 사항) 조인하는 VM이 가져야 하는 레이블.
      labels:
        "env": "prod" # 레이블:env=prod인 가상 머신과 일치
      install:
        public_proxy_addr: "teleport.example.com:443"
  • teleport.auth_server 또는 teleport.proxy_server 키를 Auth Service 또는 Proxy Service의 도메인 이름과 포트에 맞게 수정합니다.
  • discovery_service.gcp 아래의 키를 GCP 환경에 맞게 조정하여 Discovery Service와 연관짓고자 하는 프로젝트, 위치, 서비스 계정, 태그를 설정합니다.

GCP 자격 증명

Teleport Discovery Service는 로그인할 수 있도록 위에서 생성한 teleport-discovery GCP 서비스 계정의 자격증명이 필요합니다.

가장 쉬운 방법은 GCP 인스턴스에서 Discovery Service를 실행하고 해당 인스턴스에 서비스 계정을 할당하는 것입니다. 대체 방법에 대한 자세한 내용은 Set Up Application Default Credentials를 참조하세요.

6단계/6. [선택 사항] 기본 설치 스크립트 사용자 정의

설치 프로그램을 맞춤 설정하려면 사용자가 installer 리소스에 대해 list, create, readupdate 동사를 허용하는 역할을 가져야 합니다.

installer-manager.yaml이라는 파일을 다음 내용으로 생성하세요:

kind: role
version: v5
metadata:
  name: installer-manager
spec:
  allow:
    rules:
      - resources: [installer]
        verbs: [list, create, read, update]

역할을 생성합니다:

tctl create -f installer-manager.yaml

역할 'installer-manager' 가 생성되었습니다

기본적으로 editor 프리셋 역할은 필요한 권한을 가지고 있습니다.

기본 설치 프로그램 스크립트를 맞춤 설정하려면, 워크스테이션에서 다음 명령을 실행하세요:

tctl get installer/default-installer > teleport-default-installer.yaml

결과로 생성된 teleport-default-installer.yaml 파일은 발견된 인스턴스를 등록할 때 실행될 내용을 변경하기 위해 편집할 수 있습니다.

기본 설치 프로그램에 원하는 변경 사항을 적용한 후, 해당 리소스는 다음을 실행하여 업데이트할 수 있습니다:

tctl create -f teleport-default-installer.yaml

여러 installer 리소스가 존재할 수 있으며 teleport.yamldiscovery_service.gcp 목록 항목의 gcp.install.script_name 섹션에서 지정할 수 있습니다:

discovery_service:
  gcp:
    - types: ["gce"]
      tags:
       - "env": "prod"
      install: # 기본 설치 프로그램이 사용될 때의 선택적 섹션.
        script_name: "default-installer"
    - types: ["gce"]
      tags:
       - "env": "devel"
      install:
        script_name: "devel-installer"

installer 리소스는 다음과 같은 템플릿 옵션을 가지고 있습니다:

  • {{ .MajorVersion }}: 저장소에서 설치할 Teleport의 주요 버전입니다.
  • {{ .PublicProxyAddr }}: 연결할 Teleport Proxy 서비스의 공용 주소입니다.
  • {{ .RepoChannel }}: 선택적 패키지 저장소 (apt/yum) 채널 이름입니다.
    형식은 <channel>/<version>입니다. 예: stable/v16. 자세한 내용은 설치를 참조하세요.
  • {{ .AutomaticUpgrades }}: 자동 업데이트가 활성화되었는지 비활성화되었는지를 나타냅니다.
    그 값은 true 또는 false입니다. 자세한 정보는 자동 에이전트 업데이트를 참조하세요.
  • {{ .TeleportPackage }}: 사용할 Teleport 패키지입니다.
    그 값은 클러스터가 엔터프라이즈인지 여부에 따라 teleport-ent 또는 teleport입니다.

다음과 같이 사용할 수 있습니다:

kind: installer
metadata:
  name: default-installer
spec:
  script: |
    echo {{ .PublicProxyAddr }}
    echo Teleport-{{ .MajorVersion }}
    echo Repository Channel: {{ .RepoChannel }}
version: v1

설치 시 검색되면 다음과 같은 내용을 가진 스크립트로 평가됩니다:

echo teleport.example.com
echo Teleport-16.2.0
echo Repository Channel: stable/v16.2.0

기본 설치 프로그램은 다음과 같은 작업을 수행합니다:

  • 지원되는 Linux 배포판에 공식 Teleport 저장소를 추가합니다.
  • apt 또는 yum을 통해 Teleport를 설치합니다.
  • Teleport 구성 파일을 생성하고 /etc/teleport.yaml에 기록합니다.
  • Teleport 서비스를 활성화하고 시작합니다.

다음 단계

Teleport 원문 보기