Infograb logo
IaC를 이용한 사용자 및 역할 관리

이 가이드에서는 코드형 인프라(IaC)를 통해 사용자를 생성하고 그들에게 역할을 부여하는 방법을 보여줍니다. Teleport는 코드에서 자원을 동적으로 생성하는 세 가지 방법을 지원합니다:

  • Kubernetes에서 Teleport 리소스를 관리할 수 있는 Teleport Kubernetes Operator
  • Terraform을 통해 Teleport 리소스를 관리할 수 있는 Teleport Terraform Provider
  • 로컬 컴퓨터나 CI 환경에서 Teleport 리소스를 관리할 수 있는 tctl CLI

전제 조건

이 가이드를 따르려면 다음이 필요합니다:

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

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

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

다음 중 하나를 따라 실행되는 오퍼레이터가 필요합니다:

커스텀 리소스를 배포할 네임스페이스를 설정해야 합니다:

teleport-cluster Helm 차트를 통해 배포된 오퍼레이터의 경우

export OPERATOR_NAMESPACE="teleport-cluster"

독립 실행형 오퍼레이터의 경우

export OPERATOR_NAMESPACE="teleport-iac"

기능이 있는 Teleport Terraform 프로바이더가 필요합니다. Terraform 프로바이더 가이드를 참조하세요.

1/4 단계. 매니페스트 작성

이 단계에서는 Teleport에서 원하는 자원에 대한 설명을 포함한 텍스트 파일을 작성합니다. 이러한 파일은 매니페스트라고 하며, 사용할 IaC 도구에 따라 구문이 다릅니다.

이 매니페스트는 일반적으로 git과 같은 공유 버전 관리 시스템에서 버전 관리됩니다. 이를 통해 모든 변경 내용을 추적하고, Teleport의 자원을 변경하기 전에 표준 코드 리뷰 절차를 따르며, 필요할 경우 Teleport 인스턴스를 신속하게 재배포할 수 있습니다.

역할 매니페스트 작성

다음과 같은 2개의 역할을 생성합니다:

  • manager는 사용자 및 역할 나열, 감사 이벤트 및 세션 내용을 검토할 수 있습니다.
  • engineer는 개발 및 스테이징 서버에 접근할 수 있습니다.

다음 roles.yaml 파일을 생성합니다:

kind: role
version: v7
metadata:
  name: manager
spec:
  allow:
    rules:
      - resources: ['user', 'role']
        verbs: ['list','read']
      - resources: ['session', 'event']
        verbs: ['list', 'read']
---
kind: role
version: v7
metadata:
  name: engineer
spec:
  allow:
    logins: ['root', 'ubuntu', '{{internal.logins}}']
    node_labels:
      'env': ['test', 'staging']

다음 roles.yaml 파일을 생성합니다:

apiVersion: resources.teleport.dev/v1
kind: TeleportRoleV7
metadata:
  name: manager
spec:
  allow:
    rules:
      - resources: ['user', 'role']
        verbs: ['list','read']
      - resources: ['session', 'event']
        verbs: ['list', 'read']
---
apiVersion: resources.teleport.dev/v1
kind: TeleportRoleV7
metadata:
  name: engineer
spec:
  allow:
    logins: ['root', 'ubuntu', '{{internal.logins}}']
    node_labels:
      'env': ['test', 'staging']
Note

Kubernetes는 모든 커스텀 리소스 이름이 RFC 1123을 따르도록 검증하며, 이는 호스트 이름에 대한 사양을 포함합니다. لذا metadata.name 필드는 Teleport 리소스가 소문자 알파벳, 숫자, - 또는 .로 구성되고, 알파벳 숫자 문자로 시작하고 끝나야 합니다.

다음 roles.tf 파일을 생성합니다:

resource "teleport_role" "manager" {
  version = "v7"
  metadata = {
    name = "manager"
  }

  spec = {
    allow = {
      rules = [
        {
          resources = ["user", "role"]
          verbs     = ["list", "read"]
        },
        {
          resources = ["session", "event"]
          verbs     = ["list", "read"]
        }
      ]
    }
  }
}

resource "teleport_role" "engineer" {
  version = "v7"
  metadata = {
    name = "engineer"
  }

  spec = {
    allow = {
      logins = ["root", "ubuntu", "{{internal.logins}}"]
      node_labels = {
        env = ["test", "staging"]
      }
    }
  }
}

사용자 매니페스트 작성

다음과 같은 2명의 사용자를 생성합니다:

  • Bob, engineer 역할을 가진 엔지니어.
  • Alice, managerengineer 두 역할을 가진 엔지니어링 매니저.
Note

매니페스트에서 생성된 사용자는 로컬 사용자이며, 외부 SAML/OIDC/GitHub Identity Provider(IdP)에서 오는 사용자가 아닙니다.

자세한 내용은 사용자 유형 참조를 참조하세요.

다음 내용을 가진 users.yaml 파일을 생성합니다:

kind: user
version: v2
metadata:
  name: alice
spec:
  roles: ['manager', 'engineer']
---
kind: user
version: v2
metadata:
  name: bob
spec:
  roles: ['engineer']

다음 내용을 가진 users.yaml 파일을 생성합니다:

apiVersion: resources.teleport.dev/v2
kind: TeleportUser
metadata:
  name: alice
spec:
  roles: ['manager', 'engineer']
---
apiVersion: resources.teleport.dev/v2
kind: TeleportUser
metadata:
  name: bob
spec:
  roles: ['engineer']
Note

Kubernetes는 모든 커스텀 리소스 이름이 RFC 1123을 따르도록 검증하며, 이는 호스트 이름에 대한 사양을 포함합니다. لذا metadata.name 필드는 Teleport 리소스가 소문자 알파벳, 숫자, - 또는 .로 구성되고, 알파벳 숫자 문자로 시작하고 끝나야 합니다.

다음 내용을 가진 users.tf 파일을 생성합니다:

resource "teleport_user" "alice" {
  version = "v2"
  metadata = {
    name        = "alice"
  }

  spec = {
    # 역할 대신 Teleport_role 리소스 이름을 참조하면 사용자가 역할에
    # 의존한다는 것을 Terraform에 알려줍니다. 이로 인해,
    # Terraform은 먼저 역할을 생성하고,
    # 역할이 여전히 사용 중인 경우 역할을 제거하지 않도록 합니다(이는 Teleport에서는 불법입니다).
    roles = [
      teleport_role.manager.metadata.name,
      teleport_role.engineer.metadata.name,
    ]
  }
}

resource "teleport_user" "bob" {
  version = "v2"
  metadata = {
    name        = "bob"
  }

  spec = {
    roles = [teleport_role.engineer.metadata.name]
  }
}

2/4 단계. 모든 매니페스트 적용

tctl create -f roles.yaml
role 'manager' has been createdrole 'engineer' has been created
tctl create -f users.yaml
user "alice" has been createduser "bob" has been created
Note

사용자 리소스는 역할에 의존하므로, 사용자를 생성하기 전에 역할을 먼저 생성해야 합니다. 역할이 존재하지 않는 사용자는 유효하지 않으며 Teleport에서 거부될 수 있습니다.

kubectl apply -n "$OPERATOR_NAMESPACE" -f roles.yaml
teleportrolev7.resources.teleport.dev/manager createdteleportrolev7.resources.teleport.dev/engineer created
kubectl apply -n "$OPERATOR_NAMESPACE" -f users.yaml
teleportuser.resources.teleport.dev/alice createdteleportuser.resources.teleport.dev/bob created

생성된 Kubernetes 리소스를 나열합니다:

kubectl get teleportrolev7 -n "$OPERATOR_NAMESPACE"

NAME AGE

engineer 10m

manager 10m


kubectl get teleportusers -n "$OPERATOR_NAMESPACE"

NAME AGE

alice 10m

bob 10m

terraform plan
[...]Plan: 4 to add, 0 to change, 0 to destroy.
terraform apply
teleport_role.engineer: Creating...teleport_role.manager: Creating...teleport_role.engineer: Creation complete after 0s [id=engineer]teleport_role.manager: Creation complete after 0s [id=manager]teleport_user.bob: Creating...teleport_user.alice: Creating...teleport_user.bob: Creation complete after 0s [id=bob]teleport_user.alice: Creation complete after 0s [id=alice]
Apply complete! Resources: 4 added, 0 changed, 0 destroyed.

3/4 단계. 사용자가 생성되었는지 검증

이제 IaC 도구가 실행된 후, 사용자가 올바르게 생성되고 올바른 역할이 부여되었는지 확인합니다.

UI에 액세스할 수 있는 경우 Teleport 클러스터 웹 UI에 연결하여 관리 패널을 열고 "사용자" 탭을 선택합니다.

새로운 사용자 alicebob이 있어야 합니다.

tctl users ls
User Roles----------------------------- -------------------------@teleport-access-approval-bot @teleport-access-approveralice manager,engineerbob engineerbot-operator bot-operator

또는 다음 명령으로 사용자 세부 정보를 검사할 수 있습니다.

tctl get user/alice
kind: usermetadata: id: 1704849160091933780 labels: teleport.dev/origin: kubernetes name: alicespec: created_by: time: "2024-01-10T01:12:40.088581806Z" user: name: bot-operator expires: "0001-01-01T00:00:00Z" roles: - manager - engineer status: is_locked: false lock_expires: "0001-01-01T00:00:00Z" locked_time: "0001-01-01T00:00:00Z" recovery_attempt_lock_expires: "0001-01-01T00:00:00Z"version: v2

4/4 단계. 비밀번호 재설정 링크 만들기

이 시점에서 로컬 사용자가 Teleport에 생성되었습니다. 그러나 우리는 비밀번호나 추가 인증 요인을 지정하지 않았습니다. 사용자가 Teleport 등록을 완료하고 로그인할 수 있도록 비밀번호 재설정 링크를 발급해야 합니다.

사용자 재설정 링크에는 단일 사용량 만료 토큰이 포함됩니다. 이로 인해 다른 Teleport 리소스에 대한 선언적 접근 방식과 동일한 방법으로 매니페스트를 통해 생성할 수 없습니다. 사용자가 생성된 후 한 번 링크를 생성하고, 이를 안전하게 최종 사용자에게 보내야 비밀번호/MFA 등록을 완료할 수 있습니다.

옵션 1: CLI를 통한 재설정

tctl를 사용하여 사용자 비밀번호를 수동으로 재설정할 수 있습니다:

tctl users reset alice
User "alice" has been reset. Share this URL with the user to complete password reset, link is valid for 8h:https://teleport.example.com:443/web/reset/05b420fdc784597cbbb1d2ba65697cd8
NOTE: Make sure teleport.example.com:443 points at a Teleport proxy which users can access.

옵션 2: 사용자 재설정 자동화

사용자에게 재설정 링크를 안전하게 보낼 수 있는 방법이 있다면, 조직의 특정 요구에 맞춰 자동화를 구축할 수 있습니다. 예를 들면:

$ tctl users reset alice --format=json | \
    jq '"Sending an email to " + .spec.user +" that contains the link: " + .spec.url'

jq 명령을 실제로 링크를 안전한 채널로 전송하는 것으로 대체해야 합니다. 이 채널은 귀하의 조직에 따라 다릅니다. 일반적으로 다이렉트 메시지나 이메일입니다.

Terraform 사용자에게

Terraform 리소스 생성 시 사용자 정의 스크립트를 트리거할 수 있습니다. local-exec 프로비저너를 사용하세요.

resource "teleport_user" "bob" {
  version = v2
  metadata = {
    name = "bob"
  }

  spec = {
    roles = [teleport_role.engineer.metadata.name]
  }
  
  # 사용자 생성 시 리셋 플로우를 트리거하고 링크를 보내기 위한 
  provisioner "local-exec" {
    command = "tctl users reset alice --format=json | jq '\"Sending an email to \" + .spec.user +\" that contains the link: \" + .spec.url'"
  }
}

다음 단계

  • manager 역할을 가진 사용자에게 Access Lists를 통해 일부 engineers에게 프로덕션 서버 접근 권한을 부여할 수 있도록 허용합니다. 관리자는 정기적으로 부여된 접근 권한을 검토하고 정당화해야 합니다. AccessList 문서를 참조하여 기능에 대한 고급 설명을 확인하고, AccessList IaC 가이드에서 단계별 IaC AccessList 설정을 익혀보세요.
  • engineer 역할을 가진 사용자에게 프로덕션에 대한 임시 접근 요청을 허용하고, manager 역할을 가진 사용자가 요청을 검증하도록 합니다. Access Requests 문서를 참조하세요.
  • 모든 지원되는 필드는 사용자 리소스 참조역할 리소스 참조를 참조하여 확인할 수 있습니다.
Teleport 원문 보기