Infograb logo
1부: Terraform으로 인프라 등록하기

이 가이드는 Teleport Terraform 시작 가이드의 1부입니다. Terraform 시작 가이드의 범위와 목적에 대한 개요를 읽어보세요.

이 가이드는 Terraform을 사용하여 Teleport와 함께 인프라 리소스를 등록하는 방법을 보여줍니다. 당신은:

  • 가상 머신에서 실행 중인 Teleport 에이전트 풀을 배포합니다.
  • 2부에서 이러한 리소스에 대한 액세스를 가능하게 하는 Teleport 역할을 구성할 수 있도록 env:devenv:prod로 에이전트가 등록한 리소스를 라벨링합니다.

작동 방식

에이전트는 인프라 리소스를 프록시하기 위해 하나 이상의 Teleport 서비스를 실행하도록 구성된 Teleport 인스턴스입니다. 에이전트가 Teleport 클러스터 내에서 어떻게 실행되는지에 대한 간략한 아키텍처 개요는 Teleport 에이전트 소개를 읽어보세요.

Teleport 에이전트를 클러스터에 가입하는 데 사용할 수 있는 여러 방법이 있으며, 우리는 서비스를 클러스터에 가입하기 가이드에서 이를 논의합니다. 이 가이드에서는 가입 토큰 방법을 사용할 것입니다. 여기서 운영자는 Auth 서비스에 안전한 토큰을 저장하고, 에이전트는 클러스터에 가입하기 위해 해당 토큰을 제시합니다.

어떤 가입 방법을 사용하든 다음 Terraform 리소스가 포함됩니다:

  • Teleport 서비스를 실행하기 위한 컴퓨트 인스턴스
  • 에이전트 풀의 각 컴퓨트 인스턴스에 대한 가입 토큰

사전 요구사항

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

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

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

Tip

이 가이드는 새 Teleport 데모 클러스터에서 따라하는 것을 추천합니다. 에이전트 풀이 어떻게 작동하는지 보고 익숙해진 후, 이 가이드에서 배운 내용을 적용하여 인프라를 보호하세요. 데모 클러스터를 시작하는 방법은 다음과 같습니다:

  • 가상 머신 인스턴스를 생성할 수 있는 권한이 있는 AWS, Google Cloud 또는 Azure 계정.

  • 가상 머신 인스턴스가 Teleport Proxy 서비스에 연결할 수 있도록 하는 클라우드 인프라. 예를 들면:

    • 공개 NAT 게이트웨이나 NAT 인스턴스가 있는 AWS 서브넷
    • Google Cloud NAT
    • Azure NAT 게이트웨이

    최소 보안 데모 클러스터에서는 배포하는 VM 인스턴스에 공인 IP 주소를 구성할 수도 있습니다.

  • Terraform v1.0.0 이상.

  • 당신의 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단계/3. Terraform 모듈 가져오기

이 단계에서는 Teleport 리소스를 등록하는 방법을 보여주는 Terraform 모듈을 다운로드합니다. 이러한 모듈은 Teleport Terraform 리소스가 함께 작동하여 Teleport 에이전트를 관리할 수 있도록 하는 최소한의 예제입니다.

이 가이드를 마치고 설정에 익숙해지면, 운영 환경에 맞게 Terraform 구성을 수정해야 합니다.

  1. Terraform 프로젝트 디렉토리로 이동합니다.

  2. Teleport 코드 저장소를 가져오고 이 프로젝트에 대한 예제 Terraform 구성을 현재 작업 디렉터리로 복사합니다. 다음 명령은 클라우드 공급자에 적합한 하위 모듈을 cloud라는 하위 디렉토리에, Teleport 리소스에 대한 HCL 구성을 teleport라는 하위 디렉토리에 복사합니다:

    git clone --depth=1 https://github.com/gravitational/teleport teleport-clone
    cp -R teleport-clone/examples/terraform-starter/agent-installation teleport
    cp -R teleport-clone/examples/terraform-starter/aws cloud
    rm -rf teleport-clone
    git clone --depth=1 https://github.com/gravitational/teleport teleport-clone
    cp -R teleport-clone/examples/terraform-starter/agent-installation teleport
    cp -R teleport-clone/examples/terraform-starter/gcp cloud
    rm -rf teleport-clone
    git clone --depth=1 https://github.com/gravitational/teleport teleport-clone
    cp -R teleport-clone/examples/terraform-starter/agent-installation teleport
    cp -R teleport-clone/examples/terraform-starter/azure cloud
    rm -rf teleport-clone
  3. 이전 단계에서 다운로드한 하위 모듈을 구성하는 다음 내용을 포함하는 agent.tf라는 파일을 만듭니다:

    module "agent_installation_dev" {
      source      = "./teleport"
      agent_count = 1
      agent_labels = {
        env = "dev"
      }
      proxy_service_address = "teleport.example.com:443"
      teleport_edition      = "cloud"
      teleport_version      = "16.2.0"
    }
    
    module "agent_installation_prod" {
      source      = "./teleport"
      agent_count = 1
      agent_labels = {
        env = "prod"
      }
      proxy_service_address = "teleport.example.com:443"
      teleport_edition      = "cloud"
      teleport_version      = "16.2.0"
    }
    
    module "agent_deployment" {
      region           = ""
      source           = "./cloud"
      subnet_id        = ""
      userdata_scripts = concat(
        module.agent_installation_dev.userdata_scripts,
        module.agent_installation_prod.userdata_scripts
      )
    }
    
    module "agent_installation_dev" {
      source      = "./teleport"
      agent_count = 1
      agent_labels = {
        env = "dev"
      }
      proxy_service_address = "teleport.example.com:443"
      teleport_edition      = "cloud"
      teleport_version      = "16.2.0"
    }
    
    module "agent_installation_prod" {
      source      = "./teleport"
      agent_count = 1
      agent_labels = {
        env = "prod"
      }
      proxy_service_address = "teleport.example.com:443"
      teleport_edition      = "cloud"
      teleport_version      = "16.2.0"
    }
    
    module "agent_deployment" {
      gcp_zone         = "us-east1-b"
      google_project   = ""
      source           = "./cloud"
      subnet_id        = ""
      userdata_scripts = concat(
        module.agent_installation_dev.userdata_scripts,
        module.agent_installation_prod.userdata_scripts
      )
    }
    
    module "agent_installation_dev" {
      source      = "./teleport"
      agent_count = 1
      agent_labels = {
        env = "dev"
      }
      proxy_service_address = "teleport.example.com:443"
      teleport_edition      = "cloud"
      teleport_version      = "16.2.0"
    }
    
    module "agent_installation_prod" {
      source      = "./teleport"
      agent_count = 1
      agent_labels = {
        env = "prod"
      }
      proxy_service_address = "teleport.example.com:443"
      teleport_edition      = "cloud"
      teleport_version      = "16.2.0"
    }
    
    module "agent_deployment" {
      azure_resource_group = ""
      public_key_path      = ""
      region               = "East US"
      source               = "./cloud"
      subnet_id            = ""
      userdata_scripts     = concat(
        module.agent_installation_dev.userdata_scripts,
        module.agent_installation_prod.userdata_scripts
      )
    }
    

agent_installation_* 모듈 블록 각각은 agent_count 입력의 수만큼 설치 스크립트를 생성합니다. 각 설치 스크립트는 Teleport Join Token으로 Teleport SSH 서비스를 실행하며, agent_labels에 지정된 키/값 쌍으로 에이전트를 라벨링합니다. 이 구성은 모든 설치 스크립트를 agent_deployment 모듈로 전달하여 가상 머신에서 실행되도록 합니다. 각 스크립트마다 하나의 VM이 시작됩니다.

Teleport 사용을 확장하면서 각 에이전트에 대한 부담을 줄이기 위해 이 수를 늘릴 수 있습니다.

agent.tf에서 agent_installation_devagent_installation_prod 블록을 다음과 같이 수정하세요:

  1. proxy_service_address를 Teleport Proxy 서비스의 호스트 및 HTTPS 포트로 할당합니다. 예: mytenant.teleport.sh:443.

    포트를 포함하는 것을 잊지 마세요.

  2. teleport_edition가 Teleport 에디션과 일치하는지 확인합니다. oss, cloud 또는 enterprise로 할당합니다. 기본값은 oss입니다.

  3. 필요한 경우, 에이전트에서 실행할 Teleport 버전의 값을 변경하세요. Teleport 클러스터와 동일한 주요 버전 또는 하나 뒤로 해야 합니다.

agent.tf에서 module "agent_deployment" 블록을 다음과 같이 수정하세요:

  1. 최소 보안 데모 환경에 인스턴스를 배포하고 NAT 게이트웨이, NAT 인스턴스 또는 인스턴스를 Teleport Proxy 서비스에 연결하는 다른 방법이 없는 경우, 각 에이전트 인스턴스에 공인 IP 주소를 연결하도록 module 블록을 수정하세요:

    insecure_direct_access=true
    
  2. 클라우드 공급자에 따라 나머지 입력 변수를 할당하세요:

    1. region을 Teleport 에이전트를 배포할 AWS 지역으로 할당합니다. 예: us-east-1.
    2. subnet_id에 Teleport 에이전트를 배포할 서브넷의 ID를 포함하세요.
    1. google_project를 Google Cloud 프로젝트의 이름으로 할당하고, gcp_zone을 에이전트를 배포할 구역으로 할당합니다. 예: us-east1-b.

    2. subnet_id에 Teleport 에이전트를 배포할 Google Cloud 서브넷의 이름이나 URI를 포함하세요.

      서브넷 URI는 다음 형식을 가집니다:

      projects/PROJECT_NAME/regions/REGION/subnetworks/SUBNET_NAME
      
    1. azure_resource_group를 Teleport 에이전트를 배포할 Azure 리소스 그룹의 이름으로 할당합니다.

    2. Azure VM 인스턴스는 2048비트 이상의 RSA 공개 키를 포함해야 하므로 유효한 공개 SSH 키의 경로를 할당해야 합니다. 이 모듈은 유효성을 검사하기 위해 public_key_path를 사용합니다.

    3. region을 Teleport 에이전트를 배포할 Azure 지역으로 할당합니다. 예: East US.

    4. subnet_id에 Teleport 에이전트를 배포할 서브넷의 ID를 포함하세요. 다음 형식을 사용하세요:

    /subscriptions/SUBSCRIPTION/resourceGroups/RESOURCE_GROUP/providers/Microsoft.Network/virtualNetworks/NETWORK_NAME/subnets/SUBNET_NAME
    

2단계/3. 공급자 구성 추가

이 단계에서는 Teleport 클러스터 및 클라우드 공급자에 대해 terraform-starter 모듈을 구성합니다.

Terraform 프로젝트 디렉토리에서 provider.tf라는 파일이 다음 내용을 포함하는지 확인합니다.

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 4.0"
    }

    teleport = {
      source  = "terraform.releases.teleport.dev/gravitational/teleport"
      version = "~> 16.0"
    }
  }
}

provider "aws" {
  region = AWS_REGION
}

provider "teleport" {
  # Teleport Enterprise(Managed) 테넌트 URL의 호스트:포트로 addr 업데이트
  addr               = PROXY_SERVICE_ADDRESS
  identity_file_path = "terraform-identity/identity"
}

다음 자리표시자를 교체하세요:

자리표시자
AWS_REGIONTeleport 에이전트를 배포할 AWS 지역, 예: us-east-2
PROXY_SERVICE_ADDRESSTeleport Proxy 서비스의 호스트 및 포트, 예: example.teleport.sh:443
terraform {
  required_providers {
    google = {
      source  = "hashicorp/google"
      version = "~> 5.5.0"
    }

    teleport = {
      source  = "terraform.releases.teleport.dev/gravitational/teleport"
      version = "~> 16.0"
    }
  }
}

provider "google" {
  project = GOOGLE_CLOUD_PROJECT
  region  = GOOGLE_CLOUD_REGION
}

provider "teleport" {
  # Teleport Enterprise(Managed) 테넌트 URL의 호스트:포트로 addr 업데이트
  addr               = PROXY_SERVICE_ADDRESS
  identity_file_path = "terraform-identity/identity"
}

다음 자리표시자를 교체하세요:

자리표시자
GOOGLE_CLOUD_PROJECTTeleport 에이전트를 배포할 Google Cloud 프로젝트.
GOOGLE_CLOUD_REGIONTeleport 에이전트를 배포할 Google Cloud 지역.
PROXY_SERVICE_ADDRESSTeleport Proxy 서비스의 호스트 및 포트, 예: example.teleport.sh:443
terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "~> 3.0.0"
    }

    teleport = {
      source  = "terraform.releases.teleport.dev/gravitational/teleport"
      version = "~> 16.0"
    }
  }
}

provider "teleport" {
  identity_file_path = "terraform-identity/identity"
  # Teleport Cloud 테넌트 URL의 호스트:포트로 addr 업데이트
  addr               = PROXY_SERVICE_ADDRESS
}

provider "azurerm" {
  features {}
}

다음 자리표시자를 교체하세요:

자리표시자
PROXY_SERVICE_ADDRESSTeleport Proxy 서비스의 호스트 및 포트, 예: example.teleport.sh:443

3단계/3. 배포 확인

이 단계에서는 Terraform 구성을 적용하기 위해 Teleport 봇을 만듭니다. 이 봇은 한 시간 동안 존재하며, TF 프로바이더가 지원하는 모든 리소스를 수정할 수 있는 기본 terraform-provider 역할이 부여됩니다.

  1. Terraform 프로젝트 디렉토리로 이동한 후, 다음 명령어를 실행합니다. eval 명령은 Teleport Terraform 프로바이더의 자격 증명에 대해 환경 변수를 셸에 할당합니다:

    eval "$(tctl terraform env)"
    🔑 MFA 요구 확인 중이 작업은 관리자 수준 행동이며 MFA를 완료해야 합니다.보안 키를 누르세요.보안 키 터치 감지됨.⚙️ 임시 봇 "tctl-terraform-env-82ab1a2e" 및 해당 토큰 생성 중🤖 임시 봇을 사용하여 인증서 획득 중🚀 인증서 획득 완료, 이제 이 터미널에서 1시간 동안 Terraform을 사용할 수 있습니다.
  2. 클라우드 공급자 자격 증명이 Terraform에 사용 가능한지 확인합니다. 이는 귀하의 조직에 대한 표준 접근 방식입니다.

  3. Terraform 구성을 적용합니다:

    terraform init
    terraform apply
  4. apply 명령이 완료되면 다음 명령을 실행하여 에이전트가 성공적으로 배포되었는지 확인합니다. 이 명령은 에이전트가 Node 역할을 가진 것으로 가정하고, role=agent-pool 라벨이 있는 모든 Teleport SSH 서비스 인스턴스를 나열합니다:

    tsh ls role=agent-pool
    노드 이름 주소 라벨-------------------------- ---------- ---------------ip-10-1-1-187.ec2.internal ⟵ 터널 role=agent-poolip-10-1-1-24.ec2.internal ⟵ 터널 role=agent-pool

추가 읽기: 모듈 작동 방식

이 섹션에서는 terraform-starter 모듈에 구성된 리소스를 설명합니다.

가입 토큰

terraform-starter 모듈은 각 Teleport 에이전트에 대해 하나의 가상 머신 인스턴스를 배포합니다. 각 에이전트는 토큰을 사용하여 클러스터에 가입합니다. 우리는 random_string 리소스를 사용하여 토큰의 값을 지정하며, teleport_provision_token Terraform 리소스를 사용하여 각 토큰을 생성합니다:

(!examples/terraform-starter/agent-installation/token.tf!)

teleport_provision_token 리소스를 적용하면, Teleport Terraform 프로바이더가 Teleport Auth 서비스 백엔드에 생성합니다.

사용자 데이터 스크립트

terraform-starter 모듈에 의해 배포된 각 Teleport 에이전트는 에이전트를 위한 Teleport 구성 파일을 생성하는 사용자 데이터 스크립트를 로드합니다:

(!examples/terraform-starter/agent-installation/userdata!)

구성 파일은 각 인스턴스에 Teleport SSH 서비스에 role: agent-pool 라벨을 추가합니다. 이는 나중에 에이전트 풀의 호스트에 접근하기 쉽게 만들고, 모듈의 agent_labels 입력을 사용하여 구성한 라벨을 추가합니다.

이 스크립트는 시작 시 OpenSSH를 비활성화하고 승인된 공개 키를 삭제하여 에이전트 인스턴스에 대한 접근 옵션으로 Teleport만 사용하도록 설정합니다.

가상 머신 인스턴스

terraform-starter의 각 클라우드 전용 하위 모듈은 클라우드 공급자에서 가상 머신 인스턴스를 배포하기 위한 리소스를 선언합니다:

ec2-instance.tf는 Amazon Linux 2023 머신 이미지에 대한 데이터 소스를 선언하고 이를 사용하여 Teleport 에이전트를 실행하는 EC2 인스턴스를 시작합니다. teleport_provision_token 리소스를 사용합니다:

(!examples/terraform-starter/aws/ec2-instance.tf!)

gcp-instance.tf는 Teleport 에이전트를 실행하기 위해 teleport_provision_token을 사용하는 Google Compute Engine 인스턴스를 선언합니다:

(!examples/terraform-starter/gcp/gcp-instance.tf!)

azure-instance.tf는 Teleport 에이전트를 실행하기 위해 teleport_provision_token 리소스를 사용하여 Azure 가상 머신 리소스를 선언하며, 각 인스턴스에 필요한 네트워크 인터페이스도 포함합니다.

Azure VM 인스턴스는 사용자 계정을 요구하지만 이 모듈은 유효성을 통과하기 위해 임시 계정을 선언하며, 인스턴스 접근은 Teleport를 통해 이루어집니다:

(!examples/terraform-starter/azure/azure-instance.tf!)

다음 단계: 리소스를 등록하기 위한 더 많은 옵션

Terraform 시작 가이드의 1부에서는 Terraform을 사용하여 Teleport와 함께 인프라 리소스를 등록하기 위해 에이전트 풀이 배포되는 방법을 보여주었습니다. 이 가이드에서는 리소스를 동적으로 등록하는 방법을 보여주었지만, Teleport를 사용하여 더 많은 인프라를 보호하기 위해 다음과 같은 방법으로 리소스를 보호할 수 있습니다:

  • 자동 발견 구성
  • 리소스 등록 구성

자동 발견 구성

이 가이드에서 보여준 것보다 더 확장 가능한 리소스 등록 방법으로, Teleport 발견 서비스를 구성하여 인프라 내의 리소스를 자동으로 감지하고 Teleport Auth 서비스에 등록합니다.

Teleport 발견 서비스를 구성하려면:

  1. Terraform 시작 모듈에서 관리되는 에이전트 인스턴스에서 실행되는 사용자 데이터 스크립트를 수정합니다. 자동 발견 가이드를 따라 발견 서비스를 구성하고 에이전트가 등록된 리소스를 프록시할 수 있도록 활성화합니다.
  2. 이전에 생성한 가입 토큰 리소스에 Discovery 역할을 추가합니다. 이 가이드에서 가입 토큰은 Node 역할만 가지고 있습니다.
  3. 자동 발견된 리소스를 프록시하려는 에이전트 서비스에 해당하는 역할을 가입 토큰 리소스에 추가합니다. 추가할 역할은 자동 발견 가이드에서는 아이템에 따라 달라집니다.

리소스를 수동으로 등록하기

리소스를 수동으로 등록하고 에이전트에 인프라에서 특정 엔드포인트를 프록시하도록 지시할 수도 있습니다. 수동 등록에 대한 정보는 각 리소스 유형에 대한 문서 섹션을 읽어보세요:

리소스를 수동으로 등록하는 프로세스에 익숙해지면 Terraform 모듈을 수정하여:

  1. 토큰 역할 추가: 생성한 토큰 리소스에는 Node 역할만 있으며 추가 리소스를 프록시하는 권한을 부여하기 위해 역할을 추가할 수 있습니다. 수동으로 리소스를 등록하는 가이드를 참조하여 토큰에 추가할 역할을 결정합니다.
  2. 에이전트 서비스가 추가 인프라 리소스를 프록시하도록 사용자 데이터 스크립트를 변경합니다.
  3. 동적 리소스 배포: 각 인프라에 리소스를 등록하기 위해 적용할 수 있는 Terraform 리소스에 대한 Terraform 제공자 참조를 참조하세요.
Teleport 원문 보기