인포레터에서 최신 DevOps 트렌드를 격주로 만나보세요!
IaC을 사용한 사용자 및 역할 관리
이 가이드에서는 인프라 자동화(IaC)를 통해 사용자를 생성하고 역할을 부여하는 방법을 살펴보겠습니다. Teleport는 코드에서 리소스를 동적으로 생성하는 세 가지 방법을 지원합니다:
- Kubernetes에서 Teleport 리소스를 관리할 수 있는 Teleport Kubernetes Operator
- Terraform을 통해 Teleport 리소스를 관리할 수 있는 Teleport Terraform Provider
- 로컬 컴퓨터 또는 CI 환경에서 Teleport 리소스를 관리할 수 있는
tctl
CLI
전제 조건
이 가이드를 따르기 위해서는 다음이 필요합니다:
다음 중 하나를 따라 운영 중인 오퍼레이터:
그리고 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,
manager
및engineer
두 가지 역할을 갖습니다.
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.yamlrole 'manager' has been createdrole 'engineer' has been createdtctl create -f users.yamluser "alice" has been createduser "bob" has been created
Note
사용자 리소스는 역할에 의존하므로, 사용자를 생성하기 전에 역할을 생성해야 합니다. 존재하지 않는 역할을 가진 사용자는 유효하지 않으며 Teleport에 의해 거부될 수 있습니다.
kubectl apply -n "$OPERATOR_NAMESPACE" -f roles.yamlteleportrolev7.resources.teleport.dev/manager createdteleportrolev7.resources.teleport.dev/engineer createdkubectl apply -n "$OPERATOR_NAMESPACE" -f users.yamlteleportuser.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 applyteleport_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" 탭을 선택합니다.
새로운 사용자 alice
와 bob
이 있어야 합니다.
tctl users lsUser Roles----------------------------- -------------------------@teleport-access-approval-bot @teleport-access-approveralice manager,engineerbob engineerbot-operator bot-operator대안으로 사용자의 세부정보를 검사하려면
tctl get user/alicekind: 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 aliceUser "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 문서를 참고하세요.