Infograb logo
Spacelift에서 머신 ID 배포하기

Spacelift와 Teleport Terraform 공급자를 사용하여 GitOps 및 코드로서의 인프라를 통해 동적 구성 리소스를 관리할 수 있습니다. 이렇게 하면 Teleport 구성의 변경 내용에 대한 감사 기록이 생성되고 운영자가 검토할 수 있는 단일 정보 출처가 제공됩니다.

이 가이드는 Spacelift 스택에서 실행되는 Teleport Terraform 공급자가 Teleport 클러스터를 구성할 수 있도록 해주는 머신 ID 에이전트인 tbot을 사용하는 방법을 보여줍니다.

이번 설정에서 tbot은 Spacelift에 의해 서명된 ID 토큰을 제시함으로써 Teleport Auth 서비스에 자신의 신원을 입증합니다. 이를 통해 tbot은 장기적으로 공유 비밀 없이 Teleport 클러스터와 인증할 수 있습니다.

이 가이드를 따르면서 Spacelift를 사용하여 동적 리소스를 생성하는 방법을 보여주기 위해 권한이 없는 Teleport 사용자 및 역할을 생성합니다.

필수 조건

  • 실행 중인 Teleport 클러스터. Teleport를 시작하려면 가입하기 무료 체험판을 이용해 보세요.

  • tctl 관리 도구 및 tsh 클라이언트 도구 버전 >= 16.2.0.

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

  • 당신의 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 명령어를 실행할 수도 있습니다.
  • Terraform 구성을 저장할 GitHub 리포지터리 및 이 리포지터리에 연결된 Spacelift 스택.
  • 유료 Spacelift 계정이 필요합니다. 이는 spacelift 참여 방법을 사용하기 위해 필요합니다.
  • Teleport 사용자는 토큰 리소스를 생성할 수 있는 권한이 있어야 합니다.

1단계/3. 역할 및 머신 ID 봇 생성

example-bot-role.yaml을 생성합니다. 이 파일은 Spacelift의 봇 사용자에게 할당할 Teleport 역할을 선언합니다. tbot은 사용자가 이 역할에 접근할 수 있도록 짧은 수명의 자격 증명을 생성하여 Spacelift가 Terraform을 사용하여 동적 Teleport 리소스를 관리할 수 있게 합니다:

kind: role
version: v5
metadata:
  name: example-bot
spec:
  allow:
    rules:
    - resources:
      - app
      - cluster_auth_preference
      - cluster_networking_config
      - db
      - device
      - github
      - login_rule
      - oidc
      - okta_import_rule
      - role
      - saml
      - session_recording_config
      - token
      - trusted_cluster
      - user
      verbs:
      - create
      - read
      - update
      - delete
      - list
  deny: {}
  options: {}

이 역할은 Teleport 리소스를 생성, 업데이트, 삭제, 목록화할 수 있는 접근을 부여합니다. Terraform을 사용하여 구성할 의도가 없는 리소스를 이 목록에서 제거하여 피해를 줄이는 것이 좋습니다. Teleport 역할에서 접근을 허용할 수 있는 동적 리소스는 Teleport 역할 참조을 참조하십시오.

매니페스트를 적용하여 이 역할을 생성하세요:

$ tctl create example-bot-role.yaml

bot.yaml을 생성합니다:

kind: bot
version: v1
metadata:
  # 이름은 클러스터에서 봇의 고유 식별자입니다.
  name: example
spec:
  # 방금 생성한 역할을 봇에 부여합니다.
  roles:
    - example-bot

example을 봇에 대한 고유하고 설명적인 이름으로 교체하십시오.

이 파일을 적용하려면 tctl를 사용하세요:

tctl create bot.yaml

2단계/3. Spacelift를 위한 참여 토큰 생성

Spacelift 스택이 Teleport 클러스터와 인증할 수 있도록 하려면 먼저 참여 토큰을 생성해야 합니다. 참여 토큰은 Teleport Auth 서비스가 봇이나 노드가 클러스터에 참여하도록 허용할지 여부를 결정하는 기준을 설정합니다.

이 예에서는 특정 Spacelift 스택 내에서 모든 실행에 접근을 허용하는 참여 토큰을 생성합니다.

bot-token.yaml이라는 파일을 생성합니다:

kind: token
version: v2
metadata:
  name: example-bot
spec:
  # 봇 역할은 이 토큰이 봇 사용자에 대한 접근을 부여함을 나타냅니다.
  # 이는 Teleport에 내장되어 있습니다.
  roles: [Bot]
  join_method: spacelift
  # bot_name은 이 토큰이 접근을 허용하는 봇 사용자입니다. 이는
  # 이전 단계에서 생성한 봇의 이름과 일치해야 합니다.
  bot_name: example
  spacelift:
    # hostname은 Spacelift 테넌트의 호스트 이름이어야 합니다.
    hostname: example.app.spacelift.io
    # allow는 어떤 Spacelift 실행이 접근을 허용받을지를 제어하는 규칙을 지정합니다.
    # 일치하지 않는 규칙은 거부됩니다.
    allow:
    # space_id는 모듈이나 스택이 존재하는 공간을 식별합니다.
    - space_id: root
      # caller_type은 caller_id의 유형입니다. 이는 `stack` 또는 `module`이어야 합니다.
      caller_type: stack
      # caller_id는 호출자의 ID입니다. 예: 스택이나 모듈의 이름입니다.
      caller_id: my-stack

다음을 교체하세요:

  • example.app.spacelift.io를 Spacelift 테넌트의 호스트 이름으로 교체합니다.
  • my-stack을 Spacelift 스택의 이름으로 교체합니다.
  • root를 스택이 존재하는 공간의 ID로 교체합니다. Spacelift UI의 "Spaces" 페이지의 "space details" 패널에서 ID를 확인할 수 있습니다.

리소스 파일을 작성한 후 tctl을 사용하여 토큰을 생성합니다:

tctl create -f bot-token.yaml

다음 명령어로 example-bot 토큰이 생성되었는지 확인하세요:

tctl tokens ls
Token Type Labels Expiry Time (UTC)----------- ---- ------ ----------------------------------------------example-bot Bot

3단계/3. Spacelift 스택 구성

이 단계에서는 git 리포지터리를 수정하여:

  • Spacelift가 Machine ID로 생성된 자격 증명을 사용하여 Teleport Terraform 공급자를 봇 사용자로 인증하도록 구성합니다.
  • git 리포지터리를 사용하여 동적 Teleport 리소스를 생성합니다.

계속하기 전에 GitHub 리포지터리를 복제합니다. 복제한 후, 기본 브랜치에서 브랜치를 체크아웃합니다.

Spacelift를 봇 사용자로 인증하도록 구성하기

봇이 성공적으로 생성되었으므로 이제 Spacelift 스택을 구성하여 tbot을 사용하여 이 봇으로 인증하도록 해야 하며, 다음에 tbot에서 생성된 자격 증명을 사용하여 Terraform 공급자를 구성해야 합니다.

이를 돕기 위해 Teleport는 커스텀 Spacelift 컨테이너 이미지를 배포합니다. 이 이미지는 Spacelift에서 제공하는 기본 이미지에 tbot을 추가한 것입니다.

Spacelift 스택에 연결된 리포지터리 내에서 .spacelift/config.yaml을 생성하여 teleport-spacelift-runner 이미지를 지정하고 tbot을 호출하여 자격 증명을 생성하는 before_init 단계를 포함합니다:

version: "1"
stack_defaults:
  runner_image: public.ecr.aws/gravitational/teleport-spacelift-runner:16.2.0
  before_init:
  - |-
    tbot start --oneshot \
      --data-dir=memory:// \
      --proxy-server teleport.example.com:443 \
      --join-method spacelift \
      --token example-bot \
      --destination-dir=/mnt/workspace/tbot-output

다음을 교체하세요:

  • teleport.example.com:443를 Teleport 클러스터의 주소로 교체합니다.
  • example-bot을 첫 번째 단계에서 생성한 토큰의 이름으로 교체합니다.
하나의 리포지터리에서 여러 스택을 사용하나요?

하나의 리포지터리 내에 여러 Spacelift 스택이 있는 경우, stack_defaults를 사용하면 이 구성이 리포지터리 내 모든 스택에 적용된다는 점에 유의해야 합니다.

이를 피하려면 stack_defaults 대신 stacks 키를 사용하여 특정 스택을 구성할 수 있습니다. 더 많은 정보는 Spacelift 런타임 구성 문서를 참조하십시오.

구성 리소스 선언하기

main.tf라는 파일에 다음을 추가하여 Teleport Terraform 공급자를 구성하고 두 개의 동적 리소스, 사용자와 역할을 선언합니다:

terraform {
  required_providers {
    teleport = {
      source  = "terraform.releases.teleport.dev/gravitational/teleport"
      version = ">= 16.2.0"
    }
  }
}

provider "teleport" {
  addr               = "teleport.example.com:443"
  identity_file_path = "/mnt/workspace/tbot-output/identity"
}

resource "teleport_role" "terraform_test" {
  version = "v7"
  metadata = {
    name        = "terraform-test"
    description = "Terraform test role"
    labels = {
      test = "true"
    }
  }
}

resource "teleport_user" "terraform-test" {
  metadata = {
    name        = "terraform-test"
    description = "Terraform test user"

    labels = {
      test = "true"
    }
  }

  spec = {
    roles = [teleport_role.terraform_test.id]
  }
}

provider 블록에서 teleport.example.com:443를 Teleport Proxy 서비스의 호스트 및 HTTPS 포트로 변경하세요.

변경 사항을 커밋하고 브랜치를 GitHub로 푸시한 후 main 브랜치에 대한 Pull Request를 열어야 합니다. (지금은 병합하지 마세요.)

설정이 작동하는지 확인하기

Spacelift UI에서 스택으로 이동한 다음 PRs로 이동합니다. 열었던 PR의 이름을 클릭합니다.

이전에 정의한 사용자와 역할이 포함된 Terraform 계획을 볼 수 있어야 합니다:

terraform plan을 실행할 때 Spacelift는 tbot이 생성한 자격 증명을 사용하여 Teleport에 인증합니다.

PR을 병합한 후 스택으로 이동하고 Runs를 클릭합니다. PR 병합에 해당하는 첫 번째 실행의 상태를 클릭하여 실행 페이지로 이동합니다. 확인을 클릭하여 Terraform 계획을 적용하기 시작합니다.

성공을 나타내는 출력이 표시될 것입니다:

다음 명령어를 실행하여 Spacelift가 새 사용자와 역할을 생성했는지 확인합니다. 각 리소스에 대한 YAML 데이터를 반환해야 합니다:

tctl get roles/terraform-test
tctl get users/terraform-test

다음 단계

  • Terraform과 Spacelift를 사용하여 Teleport 구성 리소스를 관리하는 방법을 알게 되었으므로 Terraform 리소스 참조를 읽어 구성을 보완하세요.
  • Machine ID가 Teleport 클러스터에 인증하는 데 사용하는 Spacelift의 OIDC 구현에 대해 더 알고 싶다면 Spacelift 문서를 읽으세요.
  • 익명의 Machine ID 원격 측정 데이터를 전송하여 서비스 계정을 위한 안전한 액세스를 달성하는 데 어떻게 도움을 줄 수 있는지 알아보세요.
Teleport 원문 보기