Infograb logo
2부: Terraform으로 Teleport RBAC 구성하기

이 가이드는 Teleport Terraform 입문서의 두 번째 부분입니다. Terraform 입문서의 범위와 목적에 대한 개요를 읽어보시기 바랍니다.

이 시리즈의 1부에서는 Terraform을 사용하여 Teleport 에이전트를 배포하여 인프라 리소스를 Teleport 클러스터에 등록하는 방법을 보여주었습니다. 에이전트를 구성하면서 환경에 따라 dev에 해당하는 레이블을 붙인 에이전트와 prod에 해당하는 에이전트를 각각 설정하였습니다.

이 가이드에서는 최소 권한 원칙을 구현하기 위해 devprod 레이블을 가진 리소스에 대한 액세스를 관리하도록 Teleport 클러스터를 구성하게 됩니다.

작동 원리

이 가이드는 다음을 생성하는 방법을 보여줍니다:

  • prod 리소스에 접근할 수 있는 역할.
  • dev 리소스에 접근하고 prod 리소스에 대한 액세스를 요청할 수 있는 역할.
  • 사용자가 조직의 ID 제공자에 로그인하고 자동으로 dev 리소스에 액세스할 수 있도록 허용하는 인증 연결기.

이 설정에서 prod 리소스에 접근할 수 있는 유일한 방법은 액세스 요청을 통해 이루어지며, 공격자가 타격할 수 있는 prod 리소스를 접근하기 위한 지속적인 자격 증명은 존재하지 않습니다.

전제 조건

이 가이드는 파트 1: Terraform으로 인프라 등록하기를 완료했음을 전제로 합니다.

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

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

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

  • devprod 레이블이 포함된 Teleport에 등록된 리소스. 이러한 리소스를 Terraform을 사용하여 1부에서 등록하는 방법을 보여줍니다.
  • OIDC 또는 SAML을 지원하는 ID 제공자. 다음 중 하나가 있어야 합니다:
    • 조직에서 SAML 속성 또는 OIDC 클레임을 수정할 수 있는 능력.
    • 두 가지 수준의 액세스를 매핑하여 사용하고자 하는 기존 사용자 그룹: dev 리소스에 연결할 수 있는 능력과 prod 액세스를 위한 액세스 요청을 검토할 수 있는 능력.
Tip

이 가이드를 1부에서 사용한 동일한 Teleport 데모 클러스터에서 따르는 것을 권장합니다. 설정에 익숙해지면 이 가이드의 교훈을 적용하여 Terraform으로 RBAC를 관리할 수 있습니다.

  • 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 명령어를 실행할 수도 있습니다.
  • 문제 해결을 돕기 위해, 이 가이드의 설정 단계를 미리 정해진 editorauditor 역할이 있는 로컬 사용자로 수행할 것을 권장합니다. 생산 환경에서는 이 가이드의 교훈을 사용자 권한이 적은 계정으로 적용할 수 있습니다.

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

이 단계에서는 Teleport RBAC 관리를 시작하는 방법을 보여주는 Terraform 모듈을 다운로드합니다. 이러한 모듈은 Teleport Terraform 리소스가 함께 작동하여 Teleport 역할 및 인증 연결기를 관리할 수 있게 해주는 최소한의 예제입니다.

이 가이드를 완료하고 설정에 익숙해진 후에는 생산 환경에 맞게 Terraform 구성을 수정해야 합니다.

  1. 루트 Terraform 모듈에 대한 파일을 정리한 디렉토리로 이동합니다.

  2. Teleport 코드 리포지토리를 가져오고 현재 작업 디렉토리에 이 프로젝트를 위한 예제 Terraform 구성을 복사합니다.

    사용자가 조직의 ID 제공자(IdP)를 통해 Teleport에 인증하도록 허용할 것이므로, 모듈은 조직이 OIDC 또는 SAML을 사용하여 서비스와 통신하는지 여부에 따라 다릅니다:

    git clone --depth=1 https://github.com/gravitational/teleport teleport-clone
    cp -R teleport-clone/examples/terraform-starter/env_role env_role
    cp -R teleport-clone/examples/terraform-starter/oidc oidc
    rm -rf teleport-clone
    git clone --depth=1 https://github.com/gravitational/teleport teleport-clone
    cp -R teleport-clone/examples/terraform-starter/env_role env_role
    cp -R teleport-clone/examples/terraform-starter/saml saml
    rm -rf teleport-clone

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

    이름설명
    env_role특정 env 레이블이 있는 리소스에 대한 액세스를 부여하는 Teleport 역할을 위한 모듈.
    oidcOIDC 인증 연결기를 구성하 고 사용자가 인증할 수 있도록 요구하는 Teleport 리소스.
    이름설명
    env_role특정 env 레이블이 있는 리소스에 대한 액세스를 부여하는 Teleport 역할을 위한 모듈.
    samlSAML 인증 연결기를 구성하고 사용자가 인증하도록 요구하는 Teleport 리소스.
  3. 다음 module 블록이 포함된 rbac.tf라는 파일을 만듭니다:

    module "oidc" {
      source               = "./oidc"
      oidc_claims_to_roles = []
      oidc_client_id       = ""
      oidc_connector_name  = "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      = "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 리소스를 안내합니다.

2단계/4. 역할 주체 구성

1단계에서 선언한 prod_roledev_role 모듈은 세 가지 Teleport 역할을 생성합니다:

역할설명
prod_accessenv:prod 레이블이 있는 인프라 리소스에 대한 액세스를 허용합니다.
dev_accessenv:dev 레이블이 있는 인프라 리소스와 prod_access 역할에 대한 액세스 요청을 허용합니다.
prod_reviewerprod_access 역할에 대한 액세스 요청을 검토할 수 있는 권한을 부여합니다.

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_groupsTeleport 데이터베이스 서비스가 사용자 요청을 프록시할 때 가장하는 Kubernetes 그룹들.
kubernetes_usersTeleport 데이터베이스 서비스가 사용자 요청을 프록시할 때 가장하는 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"]
  }
  // ...
}

3단계/4. [선택적] 싱글 사인온 연결기 구성

이 단계에서는 조직의 IdP를 통한 인증을 활성화하기 위해 Terraform 모듈을 구성합니다. 1단계에서 선언한 saml 또는 oidc 모듈을 구성하는 방법을 안내합니다.

Tip

현재 단계에서 dev_accessprod_access 역할을 싱글 사인온 사용자가 아닌 로컬 Teleport 사용자에게 할당하는 경우 이 단계를 건너뛸 수 있습니다. 그렇게 하려면:

  • 기존 teleport_user 리소스를 가져와서 dev_accessprod_access 역할이 포함되도록 수정합니다 (참고: 문서).
  • 역할이 포함된 새 teleport_user 리소스를 생성합니다 (문서).

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

  1. ID 제공자에 의존하는 당사의 Teleport 클러스터를 등록합니다. 지침은 ID 제공자에 따라 다릅니다.

    다음 가이드에서는 SAML 또는 OIDC 인증 연결기를 지원하도록 IdP를 설정하는 방법을 보여줍니다. 링크된 섹션만 읽으세요, 이러한 가이드는 Terraform 대신 tctl를 사용하여 인증 연결기를 관리한다고 가정합니다:

  2. 리디렉션 URL(OIDC의 경우) 또는 승인 소비자 서비스(SAML의 경우)를 구성합니다.

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

    oidc_redirect_url이 IdP와의 등록 시 Teleport 클러스터를 의존하는 데 포맷에 맞는지 확인합니다.

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

    saml_acs가 IdP와의 등록 시 Teleport 클러스터와 일치하는지 확인합니다.

  3. Teleport를 의존하는 파트너로 등록한 후, ID 제공자는 인증 연결기를 구성하는데 사용할 정보를 출력하게 됩니다. 제공자 유형에 따라 정보를 채우십시오:

    oidc_client_idoidc_secret에 ID 제공자가 반환한 클라이언트 ID 및 비밀을 입력합니다.

    saml_entity_descriptor를 ID 제공자의 SAML 엔티티 설명자 XML 문서의 내용으로 지정합니다.

  4. teleport_domain을 Teleport Proxy Service의 도메인 이름으로 할당합니다. 스킴이나 경로는 필요 없습니다, 예: example.teleport.sh. 자식 모듈은 이를 사용하여 로컬 사용자를 위한 WebAuthn을 구성합니다. 이렇게 하면 SSO 인증 연결기를 문제 해결해야 할 경우, 로컬 사용자로 인증할 수 있습니다.

  5. 인증 연결기의 역할 매핑을 구성합니다. 사용자가 조직의 IdP를 통해 Teleport에 인증할 경우 Teleport는 커넥터의 역할 매핑 구성에 따라 사용자에게 역할을 할당합니다:

    이 예시에서, group 클레임에 developers 값이 있는 경우 사용자는 dev_access 역할을 받으며, group 클레임에 admins 값을 가진 사용자는 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 클레임의 이름에 맞게 편집하세요.

    이 예시에서, group 속성에 developers 값이 있는 사용자는 dev_access 역할을 받고, group 속성에 admins 값이 있는 사용자는 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
           }
         ]
    

4단계/4. 변경사항 적용 및 검증

이 단계에서는 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. 웹 브라우저에서 Teleport 웹 UI를 열고 IDP에서 groups 특성이 매핑된 값으로 Teleport에 로그인합니다. 사용자는 dev_access 역할을 가져야 합니다.

    인증 연결기를 사용하여 로그인하는 중 오류 메시지가 발생하면, 해당 권한으로 Teleport 감사 로그를 볼 수 있는 로컬 사용자로 로그인하세요. 이 사용자는 미리 정해진 auditor 역할에서 사용할 수 있는 권한을 가지고 있습니다. "SSO 로그인" 유형과 관련된 이벤트에서 오류 메시지를 확인하세요.

  5. 웹 UI에서 prod_access 역할에 대한 액세스를 요청합니다. "액세스 요청" 탭으로 이동하여 "새 요청"을 클릭합니다.

  6. 웹 UI에서 로그아웃한 후, prod_access 역할에 매핑된 그룹의 사용자로 로그인합니다. "액세스 요청" 탭에서 생성한 액세스 요청을 볼 수 있고 이를 해결할 수 있어야 합니다.

추가 읽기: 모듈 작동 원리

이 섹션에서는 env_role, saml, 및 oidc 자식 모듈이 관리하는 리소스를 설명합니다. 설정을 세분화하고 환경에 대해 가장 적합한 재사용 인터페이스를 선택하기 위해 이러한 구성을 복사하고 사용자 지정하는 것을 권장합니다.

env_access 역할

env_role 자식 모듈은 env 레이블이 있는 Teleport 보호 리소스에 접근할 수 있는 Teleport 역할을 생성합니다:

(!examples/terraform-starter/env_role/env_role.tf!)

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

사용자의 인프라에서 어떤 주체가 사용 가능한지 예측할 수 없기 때문에 이 역할은 사용자가 구성할 수 있도록 aws_role_arns, logins 및 기타 주체 관련 역할 속성을 남깁니다.

역할은 또한 request_roles 입력 변수에서 구성된 역할에 대한 액세스를 요청할 수 있도록 하는 allow 규칙을 구성합니다.

출력값은 역할의 이름을 인쇄하여 인증 연결기와의 종속성 관계를 생성할 수 있도록 합니다.

env_access_reviewer 역할

env_access 역할의 var.request_roles가 비어 있지 않은 경우, env_role 모듈은 이러한 역할을 검토할 수 있는 역할을 생성합니다. 이는 권한을 보다 조합하여 사용할 수 있도록 하기 위해 분리된 역할입니다:

(!examples/terraform-starter/env_role/reviewer.tf!)

env_access 역할과 마찬가지로 이 역할의 이름을 인쇄하는 출력값이 있어 인증 연결기와의 종속성 관계를 생성할 수 있습니다.

인증 연결기 구성

인증 연결기 리소스는 최소한입니다. Teleport OIDC 및 SAML 메시지를 주고받는 데 필요한 속성을 제공하기 외에, 커넥터는 사용자 제공 값을 기반으로 역할 매핑을 구성합니다:

(!examples/terraform-starter/oidc/oidc_connector.tf!)
(!examples/terraform-starter/saml/saml.tf!)

역할 매핑 입력이 복합 데이터 유형이기 때문에, oidcsaml 자식 모듈의 입력 변수를 선언할 때 복잡한 유형 정의를 추가합니다:

(!examples/terraform-starter/oidc/inputs.tf!)
(!examples/terraform-starter/saml/inputs.tf!)

각 인증 연결기에 대해 커넥터를 활성화하는 클러스터 인증 선호도를 선언합니다. 클러스터 인증 선호도는 싱글 사인온 공급자를 문제 해결하는 경우 로컬 사용자 로그인을 위한 WebAuthn을 안전한 백업으로 활성화합니다.

(!examples/terraform-starter/oidc/auth_pref.tf!)
(!examples/terraform-starter/saml/auth_pref.tf!)

다음 단계

이제 Terraform 데모 클러스터에서 RBAC을 구성했으므로, 포괄적인 Terraform 공급자 참조를 읽어보며 설정을 세부 조정하세요.

Teleport 원문 보기