InfoGrab Docs

Teleport Terraform 프로바이더 시작하기

요약

이 가이드는 프로덕션 환경에서 Teleport 리소스를 관리하는 Terraform 모듈의 예제를 제공합니다. 이 가이드에서는 두 가지 목적을 수행하는 Terraform 모듈 사용 방법을 보여줍니다: Teleport 에이전트를 클러스터에 연결하고 인프라 리소스에 대한 역할 기반 접근 제어를 구성합니다.

이 가이드는 프로덕션 환경에서 Teleport 리소스를 관리하는 Terraform 모듈의 예제를 제공합니다. 이 가이드를 통해 일반적인 Teleport 설정 작업을 완료하기 위해 Terraform으로 관리해야 할 Teleport 리소스를 이해할 수 있습니다. 예제 모듈을 완전한 Teleport 클러스터 리소스 관리의 시작점으로 활용할 수 있습니다.

작동 방식#

이 가이드에서는 두 가지 목적을 수행하는 Terraform 모듈 사용 방법을 보여줍니다: Teleport 에이전트를 클러스터에 연결하고 인프라 리소스에 대한 역할 기반 접근 제어를 구성합니다.

Teleport 에이전트 연결#

에이전트는 인프라 리소스를 프록시하기 위해 하나 이상의 Teleport 서비스를 실행하도록 구성된 Teleport 인스턴스입니다(Teleport 에이전트 소개 참조). Teleport 에이전트를 클러스터에 연결하는 방법에는 여러 가지가 있으며, 이에 대해서는 클러스터에 서비스 연결 가이드에서 설명합니다. 이 가이드에서는 조인 토큰 방식을 사용합니다. 운영자가 Auth 서비스에 보안 토큰을 저장하고, 에이전트가 클러스터에 참여하기 위해 토큰을 제시합니다.

Terraform 모듈은 가상 머신 인스턴스에 Teleport 에이전트 풀을 배포하여 Linux 서버, 데이터베이스, Kubernetes 클러스터와 같은 리소스를 등록합니다. 그런 다음 Terraform으로 동적 인프라 리소스를 선언하거나 각 에이전트에 제공되는 구성 파일을 변경할 수 있습니다.

역할 기반 접근 제어 구성#

모듈은 또한 Teleport 역할 기반 접근 제어를 구성하여 리소스에 대한 다양한 수준의 접근을 제공합니다. Teleport Identity Governance에서 제공하는 Access Requests도 구성하여 사용자가 기본적으로 더 낮은 권한의 역할로 인증하되 더 높은 권한의 역할에 대한 접근을 요청할 수 있도록 합니다. 인증 커넥터를 통해 사용자가 Single Sign-On 프로바이더를 사용하여 Teleport에 인증할 수 있습니다.

사전 요구사항#

  • 실행 중인 Teleport (v16.2.0 이상) 클러스터. 없는 경우 시작하기를 참조하세요.
Tip

이 가이드는 새로운 Teleport 데모 클러스터에서 따라하는 것을 권장합니다. 설정에 익숙해진 후, 이 가이드의 교훈을 인프라 보호에 적용하세요. 다음을 사용하여 데모 클러스터를 시작할 수 있습니다:

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

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

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

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

  • [선택사항] Single Sign-On 인증 커넥터를 추가하는 경우, OIDC 또는 SAML을 지원하는 ID 프로바이더. 다음 중 하나가 있어야 합니다:

    • 조직에서 SAML 속성 또는 OIDC 클레임을 수정할 수 있는 권한.
    • 두 가지 수준의 접근에 매핑하려는 기존 사용자 그룹: dev 리소스에 연결하는 기능; 그리고 prod 접근에 대한 Access Requests를 검토하는 기능.
  • [선택사항] Single Sign-On 인증 커넥터를 추가하는 경우, Teleport 클러스터를 위해 IdP에 등록된 앱. 다음 가이드는 SAML 또는 OIDC 인증 커넥터를 지원하도록 IdP를 설정하는 방법을 보여줍니다. 링크된 섹션만 읽으세요. 이 가이드는 Terraform 대신 tctl을 사용하여 인증 커넥터를 관리한다고 가정합니다:

  • 문제 해결을 위해 프리셋 editorauditor 역할을 가진 로컬 사용자로 이 가이드의 설정 단계를 완료하는 것을 권장합니다. 프로덕션 환경에서는 권한이 낮은 사용자를 사용하여 이 가이드의 교훈을 적용할 수 있습니다.

  • Terraform v[terraform.version] 이상.

1/7단계. Terraform 모듈 가져오기#

terraform-starter 모듈을 구성하려면, GitHub에서 gravitational/teleport 저장소를 클론하고 하위 모듈을 프로젝트 디렉터리에 복사합니다. 이 가이드를 완료하고 설정에 익숙해진 후, Terraform 구성을 수정하여 프로덕션 인프라를 수용할 수 있습니다.

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

  2. Teleport 코드 저장소를 가져오고 이 프로젝트의 예제 Terraform 구성을 현재 작업 디렉터리에 복사합니다.

    $ git clone --depth=1 https://github.com/gravitational/teleport teleport-clone --branch=branch/v(=teleport.major_version=)
    

2/7단계. 프로바이더 구성 추가#

이 단계에서는 Teleport 클러스터와 클라우드 프로바이더에 대한 terraform-starter 모듈을 구성합니다.

Terraform 프로젝트 디렉터리에서, Teleport 에이전트를 배포하려는 클라우드 프로바이더에 따라 provider.tf 파일에 다음 내용이 포함되어 있는지 확인합니다:

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

    teleport = {
      source  = "terraform.releases.teleport.dev/gravitational/teleport"
      version = "~> (=teleport.major_version=).0"
    }
  }
}

provider "aws" {
  region = AWS_REGION
}

provider "teleport" {
  # Teleport Enterprise (Cloud) 테넌트 URL의 host:port를 가리키도록 addr을 업데이트하세요
  addr               = PROXY_SERVICE_ADDRESS
}

다음 플레이스홀더를 교체합니다:

플레이스홀더
AWS_REGION 에이전트를 배포할 AWS 리전, 예: us-east-2
PROXY_SERVICE_ADDRESS Teleport 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 = "~> (=teleport.major_version=).0"
    }
  }
}

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

provider "teleport" {
  # Teleport Enterprise (Cloud) 테넌트 URL의 host:port를 가리키도록 addr을 업데이트하세요
  addr               = PROXY_SERVICE_ADDRESS
}

다음 플레이스홀더를 교체합니다:

플레이스홀더
GOOGLE_CLOUD_PROJECT 에이전트를 배포할 Google Cloud 프로젝트.
GOOGLE_CLOUD_REGION 에이전트를 배포할 Google Cloud 리전.
PROXY_SERVICE_ADDRESS Teleport 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 = "~> (=teleport.major_version=).0"
    }
  }
}

provider "teleport" {
  # Teleport Cloud 테넌트 URL의 host:port를 가리키도록 addr을 업데이트하세요
  addr               = PROXY_SERVICE_ADDRESS
}

provider "azurerm" {
  features {}
}

다음 플레이스홀더를 교체합니다:

플레이스홀더
PROXY_SERVICE_ADDRESS Teleport Proxy 서비스의 호스트와 포트, 예: example.teleport.sh:443

3/7단계. 에이전트 배포 구성#

Teleport 에이전트를 배포하도록 Terraform 프로젝트를 구성합니다:

  1. 클라우드 프로바이더에 맞는 하위 모듈을 cloud라는 서브디렉터리에 복사하고, Teleport 리소스에 대한 HCL 구성을 teleport라는 서브디렉터리에 복사합니다:

$ cp -R teleport-clone/examples/terraform-starter/agent-installation teleport
$ cp -R teleport-clone/examples/terraform-starter/aws cloud
$ cp -R teleport-clone/examples/terraform-starter/agent-installation teleport
$ cp -R teleport-clone/examples/terraform-starter/gcp cloud
$ cp -R teleport-clone/examples/terraform-starter/agent-installation teleport
$ cp -R teleport-clone/examples/terraform-starter/azure cloud
  1. 이전 단계에서 다운로드한 하위 모듈을 구성하는 다음 내용으로 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      = "(=teleport.version=)"
}

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      = "(=teleport.version=)"
}

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      = "(=teleport.version=)"
}

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      = "(=teleport.version=)"
}

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      = "(=teleport.version=)"
}

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      = "(=teleport.version=)"
}

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 조인 토큰과 함께 Teleport SSH 서비스를 실행하고, agent_labels에 지정된 키/값 쌍으로 에이전트에 레이블을 지정합니다. 이 구성은 모든 설치 스크립트를 agent_deployment 모듈에 전달하여 가상 머신에서 실행하고, 스크립트당 하나의 VM을 시작합니다.

Teleport 사용량이 증가함에 따라 이 수를 늘려 각 에이전트의 부하를 줄일 수 있습니다.

agent.tfagent_installation_devagent_installation_prod 블록을 다음과 같이 편집합니다:

  1. proxy_service_address를 Teleport Proxy 서비스의 호스트와 HTTPS 포트로 설정합니다, 예: mytenant.teleport.sh:443.

    Tip

포트를 반드시 포함하세요.

  1. teleport_edition이 Teleport 에디션과 일치하는지 확인합니다. oss, cloud, 또는 enterprise로 설정합니다. 기본값은 oss입니다.

  2. 필요한 경우 teleport_version 값을 에이전트에서 실행하려는 Teleport 버전으로 변경합니다. Teleport 클러스터와 동일한 메이저 버전이거나 하나 이전 메이저 버전이어야 합니다.

agent.tfmodule "agent_deployment" 블록을 다음과 같이 편집합니다:

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

    insecure_direct_access=true
    
  2. 클라우드 프로바이더에 따라 나머지 입력 변수를 설정합니다:

  3. region을 Teleport 에이전트를 배포할 AWS 리전으로 설정합니다, 예: us-east-1.

  4. 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. 모듈은 public_key_path를 유효성 검사 통과에 사용합니다. Azure VM은 최소 2048비트의 RSA 공개 키를 포함해야 합니다. 모듈이 VM을 배포하면 cloud-init 스크립트가 공개 키를 제거하고 OpenSSH를 비활성화합니다. 이 입력을 유효한 SSH 공개 키 경로로 설정합니다.

  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
    

4/7단계. 역할 기반 접근 제어 구성#

Teleport 에이전트 배포를 구성한 후, 역할 기반 접근 제어를 구성하여 Teleport 사용자가 필요한 인프라 리소스에만 접근할 수 있도록 합니다:

  1. 사용자가 조직의 ID 프로바이더(IdP)를 통해 Teleport에 인증할 수 있도록 설정하므로, 모듈은 조직이 서비스와 통신하는 데 OIDC 또는 SAML을 사용하는지에 따라 달라집니다:

$ cp -R teleport-clone/examples/terraform-starter/env_role env_role
$ cp -R teleport-clone/examples/terraform-starter/oidc oidc
$ cp -R teleport-clone/examples/terraform-starter/env_role env_role
$ cp -R teleport-clone/examples/terraform-starter/saml saml

프로젝트 디렉터리에 두 개의 새 모듈이 포함됩니다:

이름 설명
env_role 특정 env 레이블이 있는 리소스에 대한 접근 권한을 부여하는 Teleport 역할 모듈.
oidc OIDC 인증 커넥터를 구성하고 사용자가 이를 통해 인증하도록 요구하는 Teleport 리소스.
이름 설명
env_role 특정 env 레이블이 있는 리소스에 대한 접근 권한을 부여하는 Teleport 역할 모듈.
saml SAML 인증 커넥터를 구성하고 사용자가 이를 통해 인증하도록 요구하는 Teleport 리소스.
  1. 다음 module 블록을 포함하는 rbac.tf 파일을 만듭니다:

module "oidc" {
  source               = "./oidc"
  oidc_claims_to_roles = []
  oidc_client_id       = ""
  oidc_connector_name  = "Log in with OIDC"
  oidc_redirect_url    = ""
  oidc_secret          = ""
  teleport_domain      = ""
}

module "prod_role" {
  source        = "./env_role"
  env_label     = "prod"
  principals    = {}
  request_roles = []
}

module "dev_role" {
  source        = "./env_role"
  env_label     = "dev"
  principals    = {}
  request_roles = [module.prod_role.role_name]
}
module "saml" {
  source                   = "./saml"
  saml_connector_name      = "Log in with SAML"
  saml_attributes_to_roles = []
  saml_acs                 = ""
  saml_entity_descriptor   = ""
  teleport_domain          = ""
}

module "prod_role" {
  source        = "./env_role"
  env_label     = "prod"
  principals    = {}
  request_roles = []
}

module "dev_role" {
  source        = "./env_role"
  env_label     = "dev"
  principals    = {}
  request_roles = [module.prod_role.role_name]
}

다음으로, 두 하위 모듈을 구성하는 방법을 보여주고 적용되는 Terraform 리소스를 안내합니다.

5/7단계. 역할 주체 구성#

1단계에서 선언한 prod_roledev_role 모듈은 함께 세 가지 Teleport 역할을 만듭니다:

역할 설명
prod_access env:prod 레이블이 있는 인프라 리소스에 대한 접근을 허용합니다.
dev_access env:dev 레이블이 있는 인프라 리소스에 대한 접근 및 prod_access 역할에 대한 Access Requests를 허용합니다.
prod_reviewer prod_access 역할에 대한 Access Requests 검토를 허용합니다.

Teleport 사용자가 인프라의 리소스에 연결할 때, 운영 체제 로그인 또는 Kubernetes 사용자와 같은 주체를 가정하여 해당 리소스와 상호작용합니다. 이 단계에서는 인프라의 주체에 대한 접근 권한을 부여하도록 prod_roledev_role 모듈을 구성합니다.

rbac.tf에서 prod_roledev_role 블록을 편집하여 principals 필드에 아래 예시와 유사한 매핑을 포함합니다. 아래의 키 목록을 사용하여 주체를 구성합니다.

module "prod_role" {
  principals = {
    KEY = "value"
  }
  // ...
}

// ...
설명
aws_role_arns AWS API에 인증할 때 사용자가 접근할 수 있는 AWS 역할 ARN.
azure_identities Azure API에 인증할 때 사용자가 접근할 수 있는 Azure ID.
db_names 데이터베이스 서버 내에서 사용자가 접근할 수 있는 데이터베이스 이름.
db_roles 데이터베이스 서버에 인증할 때 사용자가 접근할 수 있는 데이터베이스 역할.
db_users 데이터베이스 서버에 인증할 때 사용자가 접근할 수 있는 데이터베이스 사용자.
gcp_service_accounts Google Cloud API에 인증할 때 사용자가 접근할 수 있는 Google Cloud 서비스 계정.
kubernetes_groups Teleport Kubernetes 서비스가 사용자의 요청을 프록시할 때 가장할 수 있는 Kubernetes 그룹.
kubernetes_users Teleport Kubernetes 서비스가 사용자의 요청을 프록시할 때 가장할 수 있는 Kubernetes 사용자.
logins Linux 서버에 인증할 때 사용자가 접근할 수 있는 운영 체제 로그인.
windows_desktop_logins Windows 데스크톱에 인증할 때 사용자가 접근할 수 있는 운영 체제 로그인.

예를 들어, 다음 구성은 dev_access 역할을 가진 사용자가 Linux 호스트에서 dev 로그인과 Kubernetes의 developers 그룹을 가정할 수 있도록 합니다. prod 사용자는 더 많은 권한을 가지며 root 로그인과 system:masters Kubernetes 그룹을 가정할 수 있습니다:

module "dev_role" {
  principals = {
    logins            = ["dev"]
    kubernetes_groups = ["developers"]
  }
  // ...
}

module "prod_role" {
  principals = {
    logins            = ["root"]
    kubernetes_groups = ["system:masters"]
  }
  // ...
}

6/7단계. [선택사항] Single Sign-On 커넥터 구성#

이 단계에서는 조직의 IdP를 통한 인증을 활성화하도록 Terraform 모듈을 구성합니다. 지침에 따라 1단계에서 선언한 saml 또는 oidc 모듈을 구성합니다.

Tip

Single Sign-On 사용자 대신 로컬 Teleport 사용자에게 dev_accessprod_access 역할을 할당하려면 지금 이 단계를 건너뛸 수 있습니다. 이를 위해 다음을 할 수 있습니다:

이 단계를 건너뛰려면 Terraform 구성에서 module "saml" 또는 module "oidc" 블록을 제거해야 합니다.

  1. 리디렉션 URL(OIDC의 경우) 또는 어설션 소비자 서비스(SAML의 경우)를 구성합니다:

oidc_redirect_urlhttps://example.teleport.sh:443/v1/webapi/oidc/callback으로 설정하고, example.teleport.sh를 Teleport 클러스터의 도메인 이름으로 교체합니다.

Teleport 클러스터를 신뢰 당사자로 등록할 때 IdP에 구성한 URL과 oidc_redirect_url이 일치하는지 확인합니다.

saml_acshttps://example.teleport.sh:443/v1/webapi/saml/acs로 설정하고, example.teleport.sh를 Teleport 클러스터의 도메인 이름으로 교체합니다.

Teleport 클러스터를 신뢰 당사자로 등록할 때 IdP에 구성한 URL과 saml_acs가 일치하는지 확인합니다.

  1. Teleport를 신뢰 당사자로 등록한 후, ID 프로바이더는 인증 커넥터를 구성하는 데 사용할 정보를 출력합니다. 프로바이더 유형에 따라 정보를 입력합니다:

IdP가 반환한 클라이언트 ID와 시크릿으로 oidc_client_idoidc_secret을 채웁니다.

IdP의 SAML 엔티티 디스크립터가 포함된 XML 문서의 내용으로 saml_entity_descriptor를 설정합니다.

  1. teleport_domain을 Teleport Proxy 서비스의 도메인 이름으로 설정합니다. 스킴이나 경로 없이, 예: example.teleport.sh. 하위 모듈은 이를 사용하여 로컬 사용자에 대한 WebAuthn을 구성합니다. 이렇게 하면 Single Sign-On 인증 커넥터 문제를 해결해야 하는 경우 로컬 사용자로 인증할 수 있습니다.

  2. 인증 커넥터에 대한 역할 매핑을 구성합니다. 사용자가 조직의 IdP를 통해 Teleport에 인증하면, Teleport는 커넥터의 역할 매핑 구성을 기반으로 사용자에게 역할을 할당합니다:

이 예시에서 developers 값을 가진 group 클레임이 있는 사용자는 dev_access 역할을 받고, admins 값을 가진 group 클레임이 있는 사용자는 prod_reviewer 역할을 받습니다:

     oidc_claims_to_roles = [
       {
         claim = "group"
         value = "developers"
         roles = [
           module.dev_role.role_name
         ]
       },
       {
         claim = "group"
         value = "admins"
         roles = module.dev_role.reviewer_role_names
       }
     ]

oidc_claims_to_roles의 각 항목의 claim 값을 IdP에 구성한 OIDC 클레임 이름과 일치하도록 편집합니다.

이 예시에서 developers 값을 가진 group 속성이 있는 사용자는 dev_access 역할을 받고, admins 값을 가진 group 속성이 있는 사용자는 prod_reviewer 역할을 받습니다:

     saml_attributes_to_roles = [
       {
         name  = "group"
         value = "developers"
         roles = [
           module.dev_role.role_name
         ]
       },
       {
         name  = "group"
         value = "admins"
         roles = module.dev_role.reviewer_role_names
       }
     ]

7/7단계. 적용 및 확인#

이 단계에서는 데모 클러스터에 Terraform 구성을 적용하여 예상대로 작동하는지 확인합니다.

Terraform 구성 적용#

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

  1. Terraform 프로젝트 디렉터리로 이동하고 다음 명령을 실행합니다. eval 명령은 쉘의 환경 변수를 Teleport Terraform 프로바이더의 자격 증명으로 설정합니다:

    $ eval "$(tctl terraform env)"
    🔑 Detecting if MFA is required
    This is an admin-level action and requires MFA to complete
    Tap any security key
    Detected security key tap
    ⚙️ Creating temporary bot "tctl-terraform-env-82ab1a2e" and its token
    🤖 Using the temporary bot to obtain certificates
    🚀 Certificates obtained, you can now use Terraform in this terminal for 1h0m0s
    
  2. 조직의 표준 방식을 사용하여 클라우드 프로바이더 자격 증명을 Terraform에서 사용할 수 있도록 합니다.

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

    $ terraform init
    $ terraform apply
    

에이전트 배포 확인#

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

$ tsh ls role=agent-pool
Node Name                  Address    Labels
-------------------------- ---------- ---------------
ip-10-1-1-187.ec2.internal ⟵ Tunnel   role=agent-pool
ip-10-1-1-24.ec2.internal  ⟵ Tunnel   role=agent-pool

접근 제어 확인#

  1. 브라우저에서 Teleport Web UI를 열고 인증 커넥터에서 역할에 매핑한 값이 할당된 groups 특성을 가진 IdP 사용자로 Teleport에 로그인합니다. 사용자에게 dev_access 역할이 있어야 합니다.

    Tip

인증 커넥터를 사용하여 로그인할 때 오류가 발생하면, Teleport 감사 로그를 볼 수 있는 권한이 있는 로컬 사용자로 로그인합니다. 이는 프리셋 auditor 역할에서 사용할 수 있습니다. "SSO Login" 유형과 관련된 이벤트에서 오류 메시지를 확인합니다.

  1. Web UI를 통해 prod_access 역할에 대한 접근을 요청합니다. "Access Requests" 탭을 방문하고 "New Request"를 클릭합니다.

  2. Web UI에서 로그아웃하고, prod_access 역할에 매핑한 그룹의 사용자로 로그인합니다. "Access Requests" 탭에서 생성한 Access Request를 보고 해결할 수 있어야 합니다.

추가 읽기: 모듈 작동 방식#

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

설정을 세분화하고 환경에 가장 적합한 재사용 가능한 인터페이스를 선택하기 위해 이러한 구성을 복사하고 사용자 지정하는 것을 권장합니다.

조인 토큰#

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

<div class="admonition note"><div class="admonition-title">Note</div><p>이 섹션의 내용은 원문 문서를 참조하세요. (<code>token.tf</code>)</p></div>

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

사용자 데이터 스크립트#

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

<div class="admonition note"><div class="admonition-title">Note</div><p>이 섹션의 내용은 원문 문서를 참조하세요. (<code>userdata</code>)</p></div>

구성은 각 인스턴스의 Teleport SSH 서비스에 role: agent-pool 레이블을 추가합니다. 이렇게 하면 나중에 에이전트 풀의 호스트에 더 쉽게 접근할 수 있습니다. 모듈의 agent_labels 입력을 사용하여 구성한 레이블도 추가합니다.

스크립트는 시작 시 OpenSSH를 비활성화하고 권한 있는 공개 키를 삭제하여 에이전트 인스턴스에 접근하는 유일한 옵션으로 Teleport를 만듭니다.

가상 머신 인스턴스#

terraform-starter의 각 클라우드별 하위 모듈은 클라우드 프로바이더에 가상 머신 인스턴스를 배포하기 위한 리소스를 선언합니다:

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

<div class="admonition note"><div class="admonition-title">Note</div><p>이 섹션의 내용은 원문 문서를 참조하세요. (<code>ec2-instance.tf</code>)</p></div>

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

<div class="admonition note"><div class="admonition-title">Note</div><p>이 섹션의 내용은 원문 문서를 참조하세요. (<code>gcp-instance.tf</code>)</p></div>

azure-instance.tfteleport_provision_token 리소스를 사용하여 Teleport 에이전트를 실행하는 Azure 가상 머신 리소스와 각 인스턴스에 필요한 네트워크 인터페이스를 선언합니다.

Azure VM 인스턴스는 사용자 계정이 필요하지만, 이 모듈은 유효성 검사를 통과하기 위해 임시 계정을 선언하고 Teleport를 사용하여 인스턴스에 대한 접근을 활성화합니다:

<div class="admonition note"><div class="admonition-title">Note</div><p>이 섹션의 내용은 원문 문서를 참조하세요. (<code>azure-instance.tf</code>)</p></div>

env_access 역할#

env_role 하위 모듈은 env 레이블이 있는 Teleport 보호 리소스에 접근할 수 있는 Teleport 역할을 만듭니다:

<div class="admonition note"><div class="admonition-title">Note</div><p>이 섹션의 내용은 원문 문서를 참조하세요. (<code>env_role.tf</code>)</p></div>

역할은 사용자 구성 env 레이블이 있는 애플리케이션, 데이터베이스, Linux 서버, Kubernetes 클러스터, Windows 데스크톱에 접근할 수 있는 allow 규칙을 하드코딩합니다.

인프라에서 사용 가능한 주체를 예측할 수 없으므로, 이 역할은 aws_role_arns, logins 및 기타 주체 관련 역할 속성을 사용자가 구성할 수 있도록 남겨둡니다.

역할은 또한 request_roles 입력 변수에 구성된 역할에 대한 접근을 요청할 수 있는 allow 규칙을 구성합니다.

output은 이 역할과 인증 커넥터 간의 의존성 관계를 만들 수 있도록 역할 이름을 출력합니다.

env_access_reviewer 역할#

env_access 역할의 var.request_roles가 비어 있지 않으면, env_role 모듈은 해당 역할을 검토할 수 있는 역할을 만듭니다. 이는 권한을 더 구성 가능하게 만들기 위한 별도의 역할입니다:

<div class="admonition note"><div class="admonition-title">Note</div><p>이 섹션의 내용은 원문 문서를 참조하세요. (<code>reviewer.tf</code>)</p></div>

env_access 역할과 마찬가지로, 인증 커넥터와의 의존성 관계를 만들기 위해 env_access_reviewer 역할의 이름을 출력하는 출력이 있습니다.

인증 커넥터 구성#

인증 커넥터 리소스는 최소화되어 있습니다. Teleport OIDC 및 SAML 메시지를 보내고 받는 데 필요한 속성을 제공하는 것 외에도, 커넥터는 사용자 제공 값을 기반으로 역할 매핑을 구성합니다:

<div class="admonition note"><div class="admonition-title">Note</div><p>이 섹션의 내용은 원문 문서를 참조하세요. (<code>oidc_connector.tf</code>)</p></div>

<div class="admonition note"><div class="admonition-title">Note</div><p>이 섹션의 내용은 원문 문서를 참조하세요. (<code>saml.tf</code>)</p></div>

역할 매핑 입력이 복합 데이터 유형이므로, oidcsaml 하위 모듈의 입력 변수를 선언할 때 복잡한 유형 정의를 추가합니다:

<div class="admonition note"><div class="admonition-title">Note</div><p>이 섹션의 내용은 원문 문서를 참조하세요. (<code>inputs.tf</code>)</p></div>

<div class="admonition note"><div class="admonition-title">Note</div><p>이 섹션의 내용은 원문 문서를 참조하세요. (<code>inputs.tf</code>)</p></div>

각 인증 커넥터에 대해 커넥터를 활성화하는 클러스터 인증 기본 설정을 선언합니다. 클러스터 인증 기본 설정은 Single Sign-On 프로바이더 문제를 해결해야 하는 경우를 대비하여 WebAuthn을 사용한 로컬 사용자 로그인을 안전한 대안으로 활성화합니다.

Teleport Terraform 프로바이더 시작하기

원문 보기
요약

이 가이드는 프로덕션 환경에서 Teleport 리소스를 관리하는 Terraform 모듈의 예제를 제공합니다. 이 가이드에서는 두 가지 목적을 수행하는 Terraform 모듈 사용 방법을 보여줍니다: Teleport 에이전트를 클러스터에 연결하고 인프라 리소스에 대한 역할 기반 접근 제어를 구성합니다.

이 가이드는 프로덕션 환경에서 Teleport 리소스를 관리하는 Terraform 모듈의 예제를 제공합니다. 이 가이드를 통해 일반적인 Teleport 설정 작업을 완료하기 위해 Terraform으로 관리해야 할 Teleport 리소스를 이해할 수 있습니다. 예제 모듈을 완전한 Teleport 클러스터 리소스 관리의 시작점으로 활용할 수 있습니다.

작동 방식#

이 가이드에서는 두 가지 목적을 수행하는 Terraform 모듈 사용 방법을 보여줍니다: Teleport 에이전트를 클러스터에 연결하고 인프라 리소스에 대한 역할 기반 접근 제어를 구성합니다.

Teleport 에이전트 연결#

에이전트는 인프라 리소스를 프록시하기 위해 하나 이상의 Teleport 서비스를 실행하도록 구성된 Teleport 인스턴스입니다(Teleport 에이전트 소개 참조). Teleport 에이전트를 클러스터에 연결하는 방법에는 여러 가지가 있으며, 이에 대해서는 클러스터에 서비스 연결 가이드에서 설명합니다. 이 가이드에서는 조인 토큰 방식을 사용합니다. 운영자가 Auth 서비스에 보안 토큰을 저장하고, 에이전트가 클러스터에 참여하기 위해 토큰을 제시합니다.

Terraform 모듈은 가상 머신 인스턴스에 Teleport 에이전트 풀을 배포하여 Linux 서버, 데이터베이스, Kubernetes 클러스터와 같은 리소스를 등록합니다. 그런 다음 Terraform으로 동적 인프라 리소스를 선언하거나 각 에이전트에 제공되는 구성 파일을 변경할 수 있습니다.

역할 기반 접근 제어 구성#

모듈은 또한 Teleport 역할 기반 접근 제어를 구성하여 리소스에 대한 다양한 수준의 접근을 제공합니다. Teleport Identity Governance에서 제공하는 Access Requests도 구성하여 사용자가 기본적으로 더 낮은 권한의 역할로 인증하되 더 높은 권한의 역할에 대한 접근을 요청할 수 있도록 합니다. 인증 커넥터를 통해 사용자가 Single Sign-On 프로바이더를 사용하여 Teleport에 인증할 수 있습니다.

사전 요구사항#

  • 실행 중인 Teleport (v16.2.0 이상) 클러스터. 없는 경우 시작하기를 참조하세요.
Tip

이 가이드는 새로운 Teleport 데모 클러스터에서 따라하는 것을 권장합니다. 설정에 익숙해진 후, 이 가이드의 교훈을 인프라 보호에 적용하세요. 다음을 사용하여 데모 클러스터를 시작할 수 있습니다:

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

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

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

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

  • [선택사항] Single Sign-On 인증 커넥터를 추가하는 경우, OIDC 또는 SAML을 지원하는 ID 프로바이더. 다음 중 하나가 있어야 합니다:

    • 조직에서 SAML 속성 또는 OIDC 클레임을 수정할 수 있는 권한.
    • 두 가지 수준의 접근에 매핑하려는 기존 사용자 그룹: dev 리소스에 연결하는 기능; 그리고 prod 접근에 대한 Access Requests를 검토하는 기능.
  • [선택사항] Single Sign-On 인증 커넥터를 추가하는 경우, Teleport 클러스터를 위해 IdP에 등록된 앱. 다음 가이드는 SAML 또는 OIDC 인증 커넥터를 지원하도록 IdP를 설정하는 방법을 보여줍니다. 링크된 섹션만 읽으세요. 이 가이드는 Terraform 대신 tctl을 사용하여 인증 커넥터를 관리한다고 가정합니다:

  • 문제 해결을 위해 프리셋 editorauditor 역할을 가진 로컬 사용자로 이 가이드의 설정 단계를 완료하는 것을 권장합니다. 프로덕션 환경에서는 권한이 낮은 사용자를 사용하여 이 가이드의 교훈을 적용할 수 있습니다.

  • Terraform v[terraform.version] 이상.

1/7단계. Terraform 모듈 가져오기#

terraform-starter 모듈을 구성하려면, GitHub에서 gravitational/teleport 저장소를 클론하고 하위 모듈을 프로젝트 디렉터리에 복사합니다. 이 가이드를 완료하고 설정에 익숙해진 후, Terraform 구성을 수정하여 프로덕션 인프라를 수용할 수 있습니다.

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

  2. Teleport 코드 저장소를 가져오고 이 프로젝트의 예제 Terraform 구성을 현재 작업 디렉터리에 복사합니다.

    $ git clone --depth=1 https://github.com/gravitational/teleport teleport-clone --branch=branch/v(=teleport.major_version=)
    

2/7단계. 프로바이더 구성 추가#

이 단계에서는 Teleport 클러스터와 클라우드 프로바이더에 대한 terraform-starter 모듈을 구성합니다.

Terraform 프로젝트 디렉터리에서, Teleport 에이전트를 배포하려는 클라우드 프로바이더에 따라 provider.tf 파일에 다음 내용이 포함되어 있는지 확인합니다:

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

    teleport = {
      source  = "terraform.releases.teleport.dev/gravitational/teleport"
      version = "~> (=teleport.major_version=).0"
    }
  }
}

provider "aws" {
  region = AWS_REGION
}

provider "teleport" {
  # Teleport Enterprise (Cloud) 테넌트 URL의 host:port를 가리키도록 addr을 업데이트하세요
  addr               = PROXY_SERVICE_ADDRESS
}

다음 플레이스홀더를 교체합니다:

플레이스홀더
AWS_REGION 에이전트를 배포할 AWS 리전, 예: us-east-2
PROXY_SERVICE_ADDRESS Teleport 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 = "~> (=teleport.major_version=).0"
    }
  }
}

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

provider "teleport" {
  # Teleport Enterprise (Cloud) 테넌트 URL의 host:port를 가리키도록 addr을 업데이트하세요
  addr               = PROXY_SERVICE_ADDRESS
}

다음 플레이스홀더를 교체합니다:

플레이스홀더
GOOGLE_CLOUD_PROJECT 에이전트를 배포할 Google Cloud 프로젝트.
GOOGLE_CLOUD_REGION 에이전트를 배포할 Google Cloud 리전.
PROXY_SERVICE_ADDRESS Teleport 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 = "~> (=teleport.major_version=).0"
    }
  }
}

provider "teleport" {
  # Teleport Cloud 테넌트 URL의 host:port를 가리키도록 addr을 업데이트하세요
  addr               = PROXY_SERVICE_ADDRESS
}

provider "azurerm" {
  features {}
}

다음 플레이스홀더를 교체합니다:

플레이스홀더
PROXY_SERVICE_ADDRESS Teleport Proxy 서비스의 호스트와 포트, 예: example.teleport.sh:443

3/7단계. 에이전트 배포 구성#

Teleport 에이전트를 배포하도록 Terraform 프로젝트를 구성합니다:

  1. 클라우드 프로바이더에 맞는 하위 모듈을 cloud라는 서브디렉터리에 복사하고, Teleport 리소스에 대한 HCL 구성을 teleport라는 서브디렉터리에 복사합니다:

$ cp -R teleport-clone/examples/terraform-starter/agent-installation teleport
$ cp -R teleport-clone/examples/terraform-starter/aws cloud
$ cp -R teleport-clone/examples/terraform-starter/agent-installation teleport
$ cp -R teleport-clone/examples/terraform-starter/gcp cloud
$ cp -R teleport-clone/examples/terraform-starter/agent-installation teleport
$ cp -R teleport-clone/examples/terraform-starter/azure cloud
  1. 이전 단계에서 다운로드한 하위 모듈을 구성하는 다음 내용으로 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      = "(=teleport.version=)"
}

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      = "(=teleport.version=)"
}

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      = "(=teleport.version=)"
}

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      = "(=teleport.version=)"
}

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      = "(=teleport.version=)"
}

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      = "(=teleport.version=)"
}

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 조인 토큰과 함께 Teleport SSH 서비스를 실행하고, agent_labels에 지정된 키/값 쌍으로 에이전트에 레이블을 지정합니다. 이 구성은 모든 설치 스크립트를 agent_deployment 모듈에 전달하여 가상 머신에서 실행하고, 스크립트당 하나의 VM을 시작합니다.

Teleport 사용량이 증가함에 따라 이 수를 늘려 각 에이전트의 부하를 줄일 수 있습니다.

agent.tfagent_installation_devagent_installation_prod 블록을 다음과 같이 편집합니다:

  1. proxy_service_address를 Teleport Proxy 서비스의 호스트와 HTTPS 포트로 설정합니다, 예: mytenant.teleport.sh:443.

    Tip

포트를 반드시 포함하세요.

  1. teleport_edition이 Teleport 에디션과 일치하는지 확인합니다. oss, cloud, 또는 enterprise로 설정합니다. 기본값은 oss입니다.

  2. 필요한 경우 teleport_version 값을 에이전트에서 실행하려는 Teleport 버전으로 변경합니다. Teleport 클러스터와 동일한 메이저 버전이거나 하나 이전 메이저 버전이어야 합니다.

agent.tfmodule "agent_deployment" 블록을 다음과 같이 편집합니다:

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

    insecure_direct_access=true
    
  2. 클라우드 프로바이더에 따라 나머지 입력 변수를 설정합니다:

  3. region을 Teleport 에이전트를 배포할 AWS 리전으로 설정합니다, 예: us-east-1.

  4. 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. 모듈은 public_key_path를 유효성 검사 통과에 사용합니다. Azure VM은 최소 2048비트의 RSA 공개 키를 포함해야 합니다. 모듈이 VM을 배포하면 cloud-init 스크립트가 공개 키를 제거하고 OpenSSH를 비활성화합니다. 이 입력을 유효한 SSH 공개 키 경로로 설정합니다.

  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
    

4/7단계. 역할 기반 접근 제어 구성#

Teleport 에이전트 배포를 구성한 후, 역할 기반 접근 제어를 구성하여 Teleport 사용자가 필요한 인프라 리소스에만 접근할 수 있도록 합니다:

  1. 사용자가 조직의 ID 프로바이더(IdP)를 통해 Teleport에 인증할 수 있도록 설정하므로, 모듈은 조직이 서비스와 통신하는 데 OIDC 또는 SAML을 사용하는지에 따라 달라집니다:

$ cp -R teleport-clone/examples/terraform-starter/env_role env_role
$ cp -R teleport-clone/examples/terraform-starter/oidc oidc
$ cp -R teleport-clone/examples/terraform-starter/env_role env_role
$ cp -R teleport-clone/examples/terraform-starter/saml saml

프로젝트 디렉터리에 두 개의 새 모듈이 포함됩니다:

이름 설명
env_role 특정 env 레이블이 있는 리소스에 대한 접근 권한을 부여하는 Teleport 역할 모듈.
oidc OIDC 인증 커넥터를 구성하고 사용자가 이를 통해 인증하도록 요구하는 Teleport 리소스.
이름 설명
env_role 특정 env 레이블이 있는 리소스에 대한 접근 권한을 부여하는 Teleport 역할 모듈.
saml SAML 인증 커넥터를 구성하고 사용자가 이를 통해 인증하도록 요구하는 Teleport 리소스.
  1. 다음 module 블록을 포함하는 rbac.tf 파일을 만듭니다:

module "oidc" {
  source               = "./oidc"
  oidc_claims_to_roles = []
  oidc_client_id       = ""
  oidc_connector_name  = "Log in with OIDC"
  oidc_redirect_url    = ""
  oidc_secret          = ""
  teleport_domain      = ""
}

module "prod_role" {
  source        = "./env_role"
  env_label     = "prod"
  principals    = {}
  request_roles = []
}

module "dev_role" {
  source        = "./env_role"
  env_label     = "dev"
  principals    = {}
  request_roles = [module.prod_role.role_name]
}
module "saml" {
  source                   = "./saml"
  saml_connector_name      = "Log in with SAML"
  saml_attributes_to_roles = []
  saml_acs                 = ""
  saml_entity_descriptor   = ""
  teleport_domain          = ""
}

module "prod_role" {
  source        = "./env_role"
  env_label     = "prod"
  principals    = {}
  request_roles = []
}

module "dev_role" {
  source        = "./env_role"
  env_label     = "dev"
  principals    = {}
  request_roles = [module.prod_role.role_name]
}

다음으로, 두 하위 모듈을 구성하는 방법을 보여주고 적용되는 Terraform 리소스를 안내합니다.

5/7단계. 역할 주체 구성#

1단계에서 선언한 prod_roledev_role 모듈은 함께 세 가지 Teleport 역할을 만듭니다:

역할 설명
prod_access env:prod 레이블이 있는 인프라 리소스에 대한 접근을 허용합니다.
dev_access env:dev 레이블이 있는 인프라 리소스에 대한 접근 및 prod_access 역할에 대한 Access Requests를 허용합니다.
prod_reviewer prod_access 역할에 대한 Access Requests 검토를 허용합니다.

Teleport 사용자가 인프라의 리소스에 연결할 때, 운영 체제 로그인 또는 Kubernetes 사용자와 같은 주체를 가정하여 해당 리소스와 상호작용합니다. 이 단계에서는 인프라의 주체에 대한 접근 권한을 부여하도록 prod_roledev_role 모듈을 구성합니다.

rbac.tf에서 prod_roledev_role 블록을 편집하여 principals 필드에 아래 예시와 유사한 매핑을 포함합니다. 아래의 키 목록을 사용하여 주체를 구성합니다.

module "prod_role" {
  principals = {
    KEY = "value"
  }
  // ...
}

// ...
설명
aws_role_arns AWS API에 인증할 때 사용자가 접근할 수 있는 AWS 역할 ARN.
azure_identities Azure API에 인증할 때 사용자가 접근할 수 있는 Azure ID.
db_names 데이터베이스 서버 내에서 사용자가 접근할 수 있는 데이터베이스 이름.
db_roles 데이터베이스 서버에 인증할 때 사용자가 접근할 수 있는 데이터베이스 역할.
db_users 데이터베이스 서버에 인증할 때 사용자가 접근할 수 있는 데이터베이스 사용자.
gcp_service_accounts Google Cloud API에 인증할 때 사용자가 접근할 수 있는 Google Cloud 서비스 계정.
kubernetes_groups Teleport Kubernetes 서비스가 사용자의 요청을 프록시할 때 가장할 수 있는 Kubernetes 그룹.
kubernetes_users Teleport Kubernetes 서비스가 사용자의 요청을 프록시할 때 가장할 수 있는 Kubernetes 사용자.
logins Linux 서버에 인증할 때 사용자가 접근할 수 있는 운영 체제 로그인.
windows_desktop_logins Windows 데스크톱에 인증할 때 사용자가 접근할 수 있는 운영 체제 로그인.

예를 들어, 다음 구성은 dev_access 역할을 가진 사용자가 Linux 호스트에서 dev 로그인과 Kubernetes의 developers 그룹을 가정할 수 있도록 합니다. prod 사용자는 더 많은 권한을 가지며 root 로그인과 system:masters Kubernetes 그룹을 가정할 수 있습니다:

module "dev_role" {
  principals = {
    logins            = ["dev"]
    kubernetes_groups = ["developers"]
  }
  // ...
}

module "prod_role" {
  principals = {
    logins            = ["root"]
    kubernetes_groups = ["system:masters"]
  }
  // ...
}

6/7단계. [선택사항] Single Sign-On 커넥터 구성#

이 단계에서는 조직의 IdP를 통한 인증을 활성화하도록 Terraform 모듈을 구성합니다. 지침에 따라 1단계에서 선언한 saml 또는 oidc 모듈을 구성합니다.

Tip

Single Sign-On 사용자 대신 로컬 Teleport 사용자에게 dev_accessprod_access 역할을 할당하려면 지금 이 단계를 건너뛸 수 있습니다. 이를 위해 다음을 할 수 있습니다:

이 단계를 건너뛰려면 Terraform 구성에서 module "saml" 또는 module "oidc" 블록을 제거해야 합니다.

  1. 리디렉션 URL(OIDC의 경우) 또는 어설션 소비자 서비스(SAML의 경우)를 구성합니다:

oidc_redirect_urlhttps://example.teleport.sh:443/v1/webapi/oidc/callback으로 설정하고, example.teleport.sh를 Teleport 클러스터의 도메인 이름으로 교체합니다.

Teleport 클러스터를 신뢰 당사자로 등록할 때 IdP에 구성한 URL과 oidc_redirect_url이 일치하는지 확인합니다.

saml_acshttps://example.teleport.sh:443/v1/webapi/saml/acs로 설정하고, example.teleport.sh를 Teleport 클러스터의 도메인 이름으로 교체합니다.

Teleport 클러스터를 신뢰 당사자로 등록할 때 IdP에 구성한 URL과 saml_acs가 일치하는지 확인합니다.

  1. Teleport를 신뢰 당사자로 등록한 후, ID 프로바이더는 인증 커넥터를 구성하는 데 사용할 정보를 출력합니다. 프로바이더 유형에 따라 정보를 입력합니다:

IdP가 반환한 클라이언트 ID와 시크릿으로 oidc_client_idoidc_secret을 채웁니다.

IdP의 SAML 엔티티 디스크립터가 포함된 XML 문서의 내용으로 saml_entity_descriptor를 설정합니다.

  1. teleport_domain을 Teleport Proxy 서비스의 도메인 이름으로 설정합니다. 스킴이나 경로 없이, 예: example.teleport.sh. 하위 모듈은 이를 사용하여 로컬 사용자에 대한 WebAuthn을 구성합니다. 이렇게 하면 Single Sign-On 인증 커넥터 문제를 해결해야 하는 경우 로컬 사용자로 인증할 수 있습니다.

  2. 인증 커넥터에 대한 역할 매핑을 구성합니다. 사용자가 조직의 IdP를 통해 Teleport에 인증하면, Teleport는 커넥터의 역할 매핑 구성을 기반으로 사용자에게 역할을 할당합니다:

이 예시에서 developers 값을 가진 group 클레임이 있는 사용자는 dev_access 역할을 받고, admins 값을 가진 group 클레임이 있는 사용자는 prod_reviewer 역할을 받습니다:

     oidc_claims_to_roles = [
       {
         claim = "group"
         value = "developers"
         roles = [
           module.dev_role.role_name
         ]
       },
       {
         claim = "group"
         value = "admins"
         roles = module.dev_role.reviewer_role_names
       }
     ]

oidc_claims_to_roles의 각 항목의 claim 값을 IdP에 구성한 OIDC 클레임 이름과 일치하도록 편집합니다.

이 예시에서 developers 값을 가진 group 속성이 있는 사용자는 dev_access 역할을 받고, admins 값을 가진 group 속성이 있는 사용자는 prod_reviewer 역할을 받습니다:

     saml_attributes_to_roles = [
       {
         name  = "group"
         value = "developers"
         roles = [
           module.dev_role.role_name
         ]
       },
       {
         name  = "group"
         value = "admins"
         roles = module.dev_role.reviewer_role_names
       }
     ]

7/7단계. 적용 및 확인#

이 단계에서는 데모 클러스터에 Terraform 구성을 적용하여 예상대로 작동하는지 확인합니다.

Terraform 구성 적용#

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

  1. Terraform 프로젝트 디렉터리로 이동하고 다음 명령을 실행합니다. eval 명령은 쉘의 환경 변수를 Teleport Terraform 프로바이더의 자격 증명으로 설정합니다:

    $ eval "$(tctl terraform env)"
    🔑 Detecting if MFA is required
    This is an admin-level action and requires MFA to complete
    Tap any security key
    Detected security key tap
    ⚙️ Creating temporary bot "tctl-terraform-env-82ab1a2e" and its token
    🤖 Using the temporary bot to obtain certificates
    🚀 Certificates obtained, you can now use Terraform in this terminal for 1h0m0s
    
  2. 조직의 표준 방식을 사용하여 클라우드 프로바이더 자격 증명을 Terraform에서 사용할 수 있도록 합니다.

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

    $ terraform init
    $ terraform apply
    

에이전트 배포 확인#

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

$ tsh ls role=agent-pool
Node Name                  Address    Labels
-------------------------- ---------- ---------------
ip-10-1-1-187.ec2.internal ⟵ Tunnel   role=agent-pool
ip-10-1-1-24.ec2.internal  ⟵ Tunnel   role=agent-pool

접근 제어 확인#

  1. 브라우저에서 Teleport Web UI를 열고 인증 커넥터에서 역할에 매핑한 값이 할당된 groups 특성을 가진 IdP 사용자로 Teleport에 로그인합니다. 사용자에게 dev_access 역할이 있어야 합니다.

    Tip

인증 커넥터를 사용하여 로그인할 때 오류가 발생하면, Teleport 감사 로그를 볼 수 있는 권한이 있는 로컬 사용자로 로그인합니다. 이는 프리셋 auditor 역할에서 사용할 수 있습니다. "SSO Login" 유형과 관련된 이벤트에서 오류 메시지를 확인합니다.

  1. Web UI를 통해 prod_access 역할에 대한 접근을 요청합니다. "Access Requests" 탭을 방문하고 "New Request"를 클릭합니다.

  2. Web UI에서 로그아웃하고, prod_access 역할에 매핑한 그룹의 사용자로 로그인합니다. "Access Requests" 탭에서 생성한 Access Request를 보고 해결할 수 있어야 합니다.

추가 읽기: 모듈 작동 방식#

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

설정을 세분화하고 환경에 가장 적합한 재사용 가능한 인터페이스를 선택하기 위해 이러한 구성을 복사하고 사용자 지정하는 것을 권장합니다.

조인 토큰#

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

<div class="admonition note"><div class="admonition-title">Note</div><p>이 섹션의 내용은 원문 문서를 참조하세요. (<code>token.tf</code>)</p></div>

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

사용자 데이터 스크립트#

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

<div class="admonition note"><div class="admonition-title">Note</div><p>이 섹션의 내용은 원문 문서를 참조하세요. (<code>userdata</code>)</p></div>

구성은 각 인스턴스의 Teleport SSH 서비스에 role: agent-pool 레이블을 추가합니다. 이렇게 하면 나중에 에이전트 풀의 호스트에 더 쉽게 접근할 수 있습니다. 모듈의 agent_labels 입력을 사용하여 구성한 레이블도 추가합니다.

스크립트는 시작 시 OpenSSH를 비활성화하고 권한 있는 공개 키를 삭제하여 에이전트 인스턴스에 접근하는 유일한 옵션으로 Teleport를 만듭니다.

가상 머신 인스턴스#

terraform-starter의 각 클라우드별 하위 모듈은 클라우드 프로바이더에 가상 머신 인스턴스를 배포하기 위한 리소스를 선언합니다:

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

<div class="admonition note"><div class="admonition-title">Note</div><p>이 섹션의 내용은 원문 문서를 참조하세요. (<code>ec2-instance.tf</code>)</p></div>

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

<div class="admonition note"><div class="admonition-title">Note</div><p>이 섹션의 내용은 원문 문서를 참조하세요. (<code>gcp-instance.tf</code>)</p></div>

azure-instance.tfteleport_provision_token 리소스를 사용하여 Teleport 에이전트를 실행하는 Azure 가상 머신 리소스와 각 인스턴스에 필요한 네트워크 인터페이스를 선언합니다.

Azure VM 인스턴스는 사용자 계정이 필요하지만, 이 모듈은 유효성 검사를 통과하기 위해 임시 계정을 선언하고 Teleport를 사용하여 인스턴스에 대한 접근을 활성화합니다:

<div class="admonition note"><div class="admonition-title">Note</div><p>이 섹션의 내용은 원문 문서를 참조하세요. (<code>azure-instance.tf</code>)</p></div>

env_access 역할#

env_role 하위 모듈은 env 레이블이 있는 Teleport 보호 리소스에 접근할 수 있는 Teleport 역할을 만듭니다:

<div class="admonition note"><div class="admonition-title">Note</div><p>이 섹션의 내용은 원문 문서를 참조하세요. (<code>env_role.tf</code>)</p></div>

역할은 사용자 구성 env 레이블이 있는 애플리케이션, 데이터베이스, Linux 서버, Kubernetes 클러스터, Windows 데스크톱에 접근할 수 있는 allow 규칙을 하드코딩합니다.

인프라에서 사용 가능한 주체를 예측할 수 없으므로, 이 역할은 aws_role_arns, logins 및 기타 주체 관련 역할 속성을 사용자가 구성할 수 있도록 남겨둡니다.

역할은 또한 request_roles 입력 변수에 구성된 역할에 대한 접근을 요청할 수 있는 allow 규칙을 구성합니다.

output은 이 역할과 인증 커넥터 간의 의존성 관계를 만들 수 있도록 역할 이름을 출력합니다.

env_access_reviewer 역할#

env_access 역할의 var.request_roles가 비어 있지 않으면, env_role 모듈은 해당 역할을 검토할 수 있는 역할을 만듭니다. 이는 권한을 더 구성 가능하게 만들기 위한 별도의 역할입니다:

<div class="admonition note"><div class="admonition-title">Note</div><p>이 섹션의 내용은 원문 문서를 참조하세요. (<code>reviewer.tf</code>)</p></div>

env_access 역할과 마찬가지로, 인증 커넥터와의 의존성 관계를 만들기 위해 env_access_reviewer 역할의 이름을 출력하는 출력이 있습니다.

인증 커넥터 구성#

인증 커넥터 리소스는 최소화되어 있습니다. Teleport OIDC 및 SAML 메시지를 보내고 받는 데 필요한 속성을 제공하는 것 외에도, 커넥터는 사용자 제공 값을 기반으로 역할 매핑을 구성합니다:

<div class="admonition note"><div class="admonition-title">Note</div><p>이 섹션의 내용은 원문 문서를 참조하세요. (<code>oidc_connector.tf</code>)</p></div>

<div class="admonition note"><div class="admonition-title">Note</div><p>이 섹션의 내용은 원문 문서를 참조하세요. (<code>saml.tf</code>)</p></div>

역할 매핑 입력이 복합 데이터 유형이므로, oidcsaml 하위 모듈의 입력 변수를 선언할 때 복잡한 유형 정의를 추가합니다:

<div class="admonition note"><div class="admonition-title">Note</div><p>이 섹션의 내용은 원문 문서를 참조하세요. (<code>inputs.tf</code>)</p></div>

<div class="admonition note"><div class="admonition-title">Note</div><p>이 섹션의 내용은 원문 문서를 참조하세요. (<code>inputs.tf</code>)</p></div>

각 인증 커넥터에 대해 커넥터를 활성화하는 클러스터 인증 기본 설정을 선언합니다. 클러스터 인증 기본 설정은 Single Sign-On 프로바이더 문제를 해결해야 하는 경우를 대비하여 WebAuthn을 사용한 로컬 사용자 로그인을 안전한 대안으로 활성화합니다.