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

이 가이드에서는 인프라 자동화(IaC)를 통해 사용자를 생성하고 역할을 부여하는 방법을 살펴보겠습니다. Teleport는 코드에서 리소스를 동적으로 생성하는 세 가지 방법을 지원합니다:

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

전제 조건

이 가이드를 따르기 위해서는 다음이 필요합니다:

  • 실행 중인 Teleport 클러스터 버전 17.0.0-dev 이상. Teleport를 시작하려면 가입하여 무료 평가판을 이용하거나 데모 환경 설정 방법을 확인하십시오.

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

    tctltsh 다운로드 방법에 대한 지침은 설치를 방문하십시오.

다음 중 하나를 따라 운영 중인 오퍼레이터:

그리고 CustomResources를 배포할 네임스페이스를 설정해야 합니다:

`teleport-cluster` Helm 차트로 배포한 오퍼레이터의 경우

export OPERATOR_NAMESPACE="teleport-cluster"

독립형 오퍼레이터의 경우

export OPERATOR_NAMESPACE="teleport-iac"

Terraform provider 가이드를 따라 기능하는 Teleport Terraform provider.

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을 준수하는지 확인하며, 여기에는 호스트 이름에 대한 규격이 포함됩니다. 따라서 오퍼레이터가 제어하는 Teleport 리소스의 metadata.name 필드는 소문자 영숫자, - 또는 ., 그리고 영숫자 문자로 시작하고 끝나야 합니다.

다음 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 ID 공급자(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을 따르도록 검증합니다. 이는 호스트 이름에 대한 사양을 포함합니다. 이로 인해, 운영자가 제어하는 Teleport 리소스의 metadata.name 필드는 소문자 알파벳 문자, - 또는 .로 구성되고 알파벳 문자가 처음과 끝에 와야 합니다.

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에 연결하고, 관리 패널을 열어 "Users" 탭을 선택합니다.

새로운 사용자 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: teleport.example.com:443가 사용자가 접근할 수 있는 Teleport 프록시를 가리키는지 확인하십시오.

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

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

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

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

Terraform 사용자를 위한 팁

로컬 실행(provisioner)으로 Terraform 리소스 생성 시 사용자 정의 스크립트를 트리거할 수 있습니다.

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 역할을 가진 사용자가 일부 engineers 에게 Access Lists를 통해 프로덕션 서버에 대한 접근 권한을 부여할 수 있도록 허용합니다. 매니저는 부여된 접근 권한을 정기적으로 정당화하고 검토해야 합니다.
    기능에 대한 개요 설명은 AccessList 문서를 참고하시고, IaC AccessList 설정에 대한 단계별 가이드는 AccessList IaC 가이드를 참고하세요.

  • engineer 역할을 가진 사용자가 프로덕션에 대한 임시 접근 요청을 할 수 있도록 하고, manager 역할을 가진 사용자가 요청을 검증합니다.
    요청에 대한 자세한 내용은 Access Requests 문서를 참고하세요.

  • 사용자 리소스역할 리소스의 참고 자료에서 모든 지원되는 필드를 확인할 수 있습니다.

Teleport 원문 보기