인포레터에서 최신 DevOps 트렌드를 격주로 만나보세요!
Teleport 자원
이 참조 가이드는 Teleport로 관리할 수 있는 동적 자원 목록을 제공합니다. 동적 자원에 대한 자세한 내용은 동적 자원 사용하기 가이드를 참조하세요.
tctl
로 동적 자원을 적용하는 예시:
모든 커넥터 목록 보기:
tctl get connectors"okta"라는 SAML 커넥터 덤프:
tctl get saml/okta"okta"라는 SAML 커넥터 삭제:
tctl rm saml/okta"gworkspace"라는 OIDC 커넥터 삭제:
tctl rm oidc/gworkspace"myteam"라는 github 커넥터 삭제:
tctl rm github/myteam"admin"이라는 로컬 사용자 삭제:
tctl rm users/admin모든 장치 표시:
tctl get devices특정 장치 가져오기:
tctl get devices/<asset-tag>클러스터 인증 기본 설정 가져오기:
tctl get cluster_auth_preference
Note
tctl get connectors
가 모든 커넥터를 보여주지만, 개별 커넥터를 작업할 때는
saml
또는 oidc
와 같은 올바른 kind
를 사용해야 합니다. 각 커넥터의
kind
는 tctl get connectors
의 YAML 출력 상단에서 확인할 수 있습니다.
동적 자원 목록
현재 tctl
을 통해 노출된 자원의 목록은 다음과 같습니다:
자원 종류 | 설명 |
---|---|
user | 내부 Teleport 사용자 DB의 사용자 레코드. |
role | 인터랙티브 및 비인터랙티브 사용자에 의해 가정된 역할. |
connector | SAML, OIDC 및 GitHub에 대한 단일 로그인 (SSO) 인증 커넥터. |
node | 등록된 SSH 노드. 같은 기록은 tctl nodes ls 를 통해 표시됩니다. |
windows_desktop | 등록된 Windows 데스크탑. |
cluster | 신뢰된 클러스터. 클러스터 연결에 대한 자세한 내용은 여기에서 확인하십시오. |
login_rule | 로그인 규칙, 자세한 내용은 로그인 규칙 가이드를 참조하세요. |
device | Teleport 신뢰 장치, 자세한 내용은 장치 신뢰 가이드를 참조하세요. |
ui_config | Proxy 서비스에서 제공하는 웹 UI의 구성. |
vnet_config | 클러스터의 VNet 옵션에 대한 구성. |
cluster_auth_preference | 클러스터의 인증 기본 설정에 대한 구성. |
database_object_import_rule | 데이터베이스 객체 가져오기 규칙. |
사용자
Teleport는 리소스로 표현되는 인터랙티브 로컬 사용자, 비인터랙티브 로컬 사용자(봇) 및 단일 로그인 사용자를 지원합니다.
kind: user
version: v2
metadata:
name: joe
spec:
# roles는 이 사용자에게 할당된 역할의 목록입니다.
roles:
- admin
# status는 예를 들어 사용자가 미리 정의된 로그인 실패 시도 횟수를 초과할 경우
# Teleport 시스템에서 일시적으로 잠금 설정을 합니다.
status:
is_locked: false
lock_expires: 0001-01-01T00:00:00Z
locked_time: 0001-01-01T00:00:00Z
# traits는 사용자 리소스에 할당된 키-값 쌍 목록입니다.
# Traits는 역할 템플릿에서 변수로 사용될 수 있습니다.
traits:
logins:
- joe
- root
# expires가 비어 있지 않으면 리소스의 자동 만료를 설정합니다.
expires: 0001-01-01T00:00:00Z
# created_by는 이 사용자 리소스의 작성자 신원을 추적하는 시스템 속성입니다.
created_by:
time: 0001-01-01T00:00:00Z
user:
name: builtin-Admin
역할
인터랙티브 및 비인터랙티브 사용자(봇)는 하나 이상의 역할을 가집니다.
역할은 데이터베이스, SSH 서버, Kubernetes 클러스터, 웹 서비스 및 애플리케이션과 Windows 데스크톱에 대한 접근을 관리합니다.
kind: 역할
version: v7
metadata:
name: 예제
description: 이것은 예제 역할입니다.
spec:
# 사용자에게 여러 개의 비기본 충돌 옵션이 있는 경우 연결 옵션을 지정합니다.
# 텔레포트는 가장 허용되지 않는 값을 선택합니다.
options:
# max_session_ttl은 이 역할이 부여된 사용자에게 발급된 인증서의 TTL(존재 시간)을 정의합니다.
max_session_ttl: 8h
# forward_agent는 SSH 에이전트 전달이 허용되는지를 제어합니다.
forward_agent: true
# port_forwarding은 SSH에 대해 TCP 포트 포워딩이 허용되는지를 제어합니다.
port_forwarding: true
# ssh_file_copy는 파일 복사(SCP/SFTP)가 허용되는지를 제어합니다.
# 기본값은 true입니다.
ssh_file_copy: false
# client_idle_timeout은 클러스터 노드에 대한 SSH 세션이
# 클라이언트(유휴 클라이언트)로부터 활동이 없을 경우 강제로 종료되는지를 결정합니다.
# 글로벌 클러스터 설정을 무시합니다. 예: '30m', '1h' 또는 '1h30m'
client_idle_timeout: never
# 인증서가 활성 세션 중에 만료될 경우 클라이언트를 강제로 연결 해제할지를 결정합니다.
# 글로벌 클러스터 설정을 무시합니다.
disconnect_expired_cert: no
# max_sessions는 단일 연결을 통해 설정할 수 있는 세션 채널의 총 수입니다.
# 10으로 설정하면 OpenSSH 기본 동작과 일치합니다.
# (기업 전용)
max_sessions: 10
# 개선된 기록은 BPF 기반 세션 기록기에서 기록되는 이벤트를 정의합니다.
enhanced_recording:
- command
- disk
- network
# permit_x11_forwarding은 사용자가 openssh 클라이언트와 서버를 통해 X11 포워딩을 사용할 수 있도록 허용합니다.
permit_x11_forwarding: true
# device_trust_mode는 이 역할의 할당된 사용자의 인증된 장치 접근을 강제합니다.
device_trust_mode: optional|required|off
# require_session_mfa는 이 역할의 모든 할당된 사용자에 대해 세션당 MFA를 요구합니다.
require_session_mfa: true
# mfa_verification_interval은 선택적으로 연속 MFA 검증 사이에 경과할 수 있는 최대 기간을 정의합니다.
# 이 변수는 사용자가 주기적으로 자신의 신원을 검증하라는 프롬프트를 받을 수 있도록 하여,
# tsx 프록시 * 파생물을 사용할 때 재인증 없이 오랜 세션을 방지하여 보안을 강화합니다.
mfa_verification_interval: 1h
# lock은 이 역할을 가진 사용자의 잠금 모드를 설정합니다.
# 유효한 값은 'strict' 또는 'best_effort'입니다.
lock: strict
# 기업 전용 request_access 필드는 'optional', 'always' 또는 'reason'입니다. 항상 또는 이유로 설정하면,
# 이는 tsh 또는 웹 UI 클라이언트에 액세스 요청을 항상 생성하도록 지시합니다. 'reason'으로 설정하면
# 사용자가 액세스 요청을 생성하는 이유를 제출해야 합니다.
request_access: reason
# 'request_prompt' 필드를 사용하여 사용자가 요청 이유 필드에 무엇을 제출해야 하는지를 알려줄 수 있습니다.
request_prompt: 티켓 ID를 제공해 주세요
# 기업 전용 max_connections 필드는 클러스터 내의 동시 세션 수를 제한합니다.
# 이 설정은 Teleport 성능을 저하시키므로 클러스터 전반에 걸쳐 연결을 추적해야 합니다.
max_connections: 2
# 사용자당 동시 Kubernetes 세션 수 제한
max_kubernetes_connections: 1
# Teleport가 세션 기록 실패(예: 디스크 오류)에 어떻게 대처하는지를 정의합니다.
# 값은 'best_effort' 또는 'strict'로 설정할 수 있습니다. 'strict'로 설정하면 세션이 즉시 종료됩니다.
# 'best_effort'로 설정하면 세션이 종료되지 않고 기록이 비활성화됩니다. 구성은 서비스별로 수행됩니다.
# (현재는 'ssh'만 지원됨).
record_session:
# 사용자의 데스크탑 세션을 기록할지 여부를 지정합니다.
# 데스크탑 세션 기록은 하나 이상의 사용자의 역할이 기록을 활성화한 경우에만 가능합니다.
# 지정하지 않으면 기본값은 true입니다.
# auth_service.session_recording이 teleport.yaml(인증 서비스)에서 'off'로 설정되어 있거나,
# 클러스터의 session_recording_config 리소스가 'mode: off'로 설정되어 있으면 데스크탑 세션은 절대 기록되지 않습니다.
desktop: true
# 선택 사항: 프로토콜 특정 모드가 설정되지 않을 경우 사용할 기본 세션 기록 모드입니다.
default: best_effort|strict
# 선택 사항: SSH 세션(텔레포트 서버 접근)에 대한 세션 기록 모드입니다. 설정되지 않은 경우 기본값이 사용됩니다.
ssh: best_effort|strict
# 클립보드 공유가 원격 데스크탑과 함께 허용되어야 하는지 여부를 지정합니다.
# (지원되는 브라우저가 필요합니다). 지정하지 않으면 기본값은 true입니다.
# 사용자의 역할 중 하나라도 클립보드를 비활성화했다면 비활성화됩니다.
desktop_clipboard: true
# 로컬 머신에서 원격 데스크탑으로 디렉터리 공유가 허용되어야 하는지 여부를 지정합니다.
# (지원되는 브라우저가 필요합니다). 지정하지 않으면 기본값은 true입니다.
# 사용자의 역할 중 하나라도 디렉터리 공유를 비활성화했다면 비활성화됩니다.
desktop_directory_sharing: true
# 기업 전용: 활성화되면 로그인에 사용된 소스 IP가 사용자 인증서에 포함되어,
# 손상된 인증서가 다른 네트워크에서 사용되지 않도록 합니다. 기본값은 false입니다.
pin_source_ip: true
# 사용자 SSH 키에 포함될 이름 및 관련 값 목록을 지정합니다.
# 키 타입은 'ssh'로만 가능하며 모드는 'extension'으로만 가능합니다.
# 이름 및 값 필드는 임의의 문자열이 될 수 있으며, 값 필드는 변수 보간을 지원합니다.
cert_extensions:
- type: ssh
mode: extension
name: login@github.com
value: '{{ external.github_login }}'
# 이 역할이 SSH 사용자의 자동 프로비저닝을 지원하는지 여부를 제어합니다.
# 옵션: keep (세션 종료 시 사용자 유지), insecure-drop (세션 종료 시 사용자 제거),
# off (호스트 사용자 생성 비활성화)
create_host_user_mode: keep
# 자동 프로비전된 SSH 사용자의 기본 셸을 설정합니다. 셸에 대한 절대 경로 또는 시스템 PATH를 통해
# 도달할 수 있는 이름 모두 유효한 값입니다. create_host_user_mode가 off로 설정되지 않을 경우에만 적용됩니다.
create_host_user_default_shell: bash
# 이 역할이 자동 데이터베이스 사용자 프로비저닝을 요구해야 하는지 여부를 제어합니다.
# 옵션: off (데이터베이스 사용자 자동 프로비저닝 비활성화), keep (세션 종료 시 사용자를 비활성화하여 역할 삭제 및 잠금),
# best_effort_drop (세션 종료 시 사용자를 삭제하려고 시도하며, 실패할 경우 비활성화됩니다).
create_db_user_mode: keep
# ID 공급자 접근을 위한 역할 별 옵션을 지정합니다.
idp:
# SAML ID 공급자 접근을 위한 역할 별 옵션을 지정합니다.
saml:
# 이 역할이 SAML ID 공급자에 대한 접근 권한이 있는지를 지정합니다.
# 기본값은 true입니다.
enabled: true
# allow 섹션은 이 역할의 사용자가 허용되는 리소스/동사 조합 목록을 선언합니다.
# 기본적으로 아무것도 허용되지 않습니다.
allow:
# logins 배열은 사용자가 사용할 수 있도록 허용된 OS/UNIX 로그인입니다.
# 이 필드에서는 문자열과 템플릿 변수가 모두 지원됩니다.
logins: [root, '{{internal.logins}}']
# Windows 로그인은 사용자에게 데스크탑 세션에 대해 허용됩니다.
windows_desktop_logins: [Administrator, '{{internal.logins}}']
# node_labels: 이 역할을 가진 사용자는 아래와 일치하는 레이블을 가진 SSH 노드에 연결할 수 있습니다.
node_labels:
# 리터럴 문자열:
'env': 'test'
# 와일드카드('*')는 모든 노드를 의미합니다.
'*': '*'
# 대안 옵션 목록:
'region': ['us-west-1', 'eu-central-1']
# 정규 표현식은 ^로 시작하고 $로 끝납니다.
# 텔레포트는 Go의 정규 표현식 구문을 사용합니다:
# https://github.com/google/re2/wiki/Syntax
# 위의 목록 예는 다음과 같이 표현할 수 있습니다:
# 'region': '^us-west-1|eu-central-1$'
'reg': '^us-west-1|eu-central-1$'
# 생성된 사용자가 추가될 호스트 그룹 목록입니다. 존재하지 않는 그룹은 생성됩니다.
# create_host_user_mode가 'off'가 아닐 경우에만 적용됩니다.
host_groups: [ubuntu, nginx, other]
# `/etc/sudoers.d` 에 생성된 임시 sudoers 파일에 포함될 항목 목록입니다.
# 세션 종료 시 기록은 제거됩니다.
host_sudoers: [
# 이 줄은 로그인 사용자가 root 권한으로 `systemctl restart nginx.service` 를 실행할 수 있도록 허용합니다.
# sudoers 항목은 로그인한 사용자 이름으로 접두사가 붙습니다.
"ALL = (root) NOPASSWD: /usr/bin/systemctl restart nginx.service"
]
# kubernetes_groups는 이 역할을 가진 사용자가 수임할 Kubernetes 그룹을 지정합니다.
# 'external' 속성 집합을 통해 SAML/OIDC 특성을 참조할 수 있습니다.
# 이를 통해 ID 관리자의 Kubernetes 그룹 멤버십을 지정할 수 있습니다:
kubernetes_groups: ['system:masters', '{{external.trait_name}}']
# kubernetes_users는 이 역할이 수임할 수 있는 kubernetes 사용자 목록입니다.
kubernetes_users: ['IAM#{{external.foo}};']
# kubernetes_labels: 이 역할을 가진 사용자는 아래와 일치하는 레이블을 가진 k8s 클러스터에 연결할 수 있습니다.
kubernetes_labels:
# 사용자는 프로덕션 환경에만 접근할 수 있습니다.
'env': 'prod'
# 사용자는 us-west의 모든 지역에 접근할 수 있습니다. 예: us-west-1, us-west-2
'region': 'us-west-*'
# 정규 표현식은 ^로 시작하고 $로 끝납니다.
# 텔레포트는 Go의 정규 표현식 구문을 사용합니다:
# https://github.com/google/re2/wiki/Syntax
# 위의 목록 예는 다음과 같이 표현할 수 있습니다:
# 'region': '^us-west-1|eu-central-1$'
'cluster_name': '^us.*\.example\.com$'
# kubernetes_resources는 이 역할을 가진 사용자가 접근할 수 있는 Kubernetes 리소스를 나타냅니다.
kubernetes_resources:
# 리소스 종류. 텔레포트는 현재 다음을 지원합니다:
# - * (모든 리소스)
# - pod
# - secret
# - configmap
# - namespace
# - service
# - serviceaccount
# - kube_node
# - persistentvolume
# - persistentvolumeclaim
# - deployment
# - replicaset
# - statefulset
# - daemonset
# - clusterrole
# - kube_role
# - clusterrolebinding
# - rolebinding
# - cronjob
# - job
# - certificatesigningrequest
# - ingress
- kind: '*'
# 리소스에 접근을 허용할 Kubernetes 네임스페이스의 이름입니다.
# 와일드카드 '*'는 임의의 문자열 시퀀스를 의미합니다.
# 값이 '^'로 시작하고 '$'로 끝나면 Kubernetes 서비스는 이를 정규 표현식으로 처리합니다.
namespace: '*'
# 접근을 허용할 리소스의 이름입니다.
# 와일드카드 '*'는 임의의 문자열 시퀀스를 의미합니다.
# 값이 '^'로 시작하고 '$'로 끝나면 Kubernetes 서비스는 이를 정규 표현식으로 처리합니다.
name: '^nginx-[a-z0-9-]+$'
# 사용자가 리소스에 대해 수행할 수 있는 동작입니다.
# 텔레포트는 현재 다음을 지원합니다:
# - * (모든 동작)
# - get
# - list
# - watch
# - create
# - update
# - patch
# - delete
# - deletecollection
# - exec - 사용자가 pod 내에서 명령을 실행할 수 있도록 허용합니다.
# - portforward - 사용자가 pod에서 포트를 포워딩할 수 있도록 허용합니다.
verbs: ['*']
# Functions는 변수를 변환합니다.
db_users: ['{{email.local(external.email)}}']
db_names: ['{{external.db_names}}']
db_labels:
'env': '{{regexp.replace(external.env, "^(staging)$", "$1")}}'
# 부여할 데이터베이스 역할 목록입니다. 'db_permissions'와 상호 배타적입니다.
db_roles: ['{{external.db_roles}}']
# 모든 테이블에 대해 가능한 모든 Postgres 권한을 부여합니다.
# 부여할 데이터베이스 권한 목록입니다. 'db_roles'와 상호 배타적입니다.
db_permissions:
- match:
object_kind: table
permissions:
- SELECT
- INSERT
- UPDATE
- DELETE
- TRUNCATE
- REFERENCES
- TRIGGER
# app_labels: 이 역할을 가진 사용자는 아래와 일치하는 레이블을 가진 애플리케이션에 연결할 수 있습니다.
app_labels:
# 사용자는 프로덕션 환경에만 접근할 수 있습니다.
'env': 'prod'
# 사용자는 us-west의 모든 지역에 접근할 수 있습니다. 예: us-west-1, us-west-2
'region': 'us-west-*'
# 정규 표현식은 ^로 시작하고 $로 끝납니다.
# 텔레포트는 Go의 정규 표현식 구문을 사용합니다:
# https://github.com/google/re2/wiki/Syntax
# 위의 목록 예는 다음과 같이 표현할 수 있습니다:
# 'region': '^us-west-1|eu-central-1$'
'cluster_name': '^us.*\.example\.com$'
# group_labels: 이 역할을 가진 사용자는 기본 사용자 그룹에 대한 권한을 부여받습니다.
# Okta 서비스와 같은 서비스는 이러한 권한을 사용하여 외부 서비스에 대한 접근을 허용할 수 있습니다.
group_labels:
# 사용자는 프로덕션 관련 그룹에 대한 그룹 소속을 부여받습니다.
'env': 'prod'
# cluster_labels: 이 역할을 가진 사용자는 아래와 일치하는 레이블을 가진 원격 클러스터에 연결할 수 있습니다.
cluster_labels:
'env': 'prod'
# node_labels_expression은 node_labels와 동일한 목적을 가지지만,
# 커스텀 로직을 구성하기 위해 조건부 표현식을 지원합니다.
# 이 역할을 가진 사용자는 스테이징 환경에 있거나 사용자 자신의 팀 중 하나에 속하는 노드에 접근할 수 있습니다.
node_labels_expression: |
labels["env"] == "staging" ||
contains(user.spec.traits["teams"] , labels["team"])
# 아래와 같은 <kind>_labels_expression 필드는 <kind>_labels 필드의 동일한 목적을 가지지만,
# 레이블 일치자 대신 조건부 표현식을 지원합니다.
app_labels_expression: 'labels["env"] == "staging"'
cluster_labels_expression: 'labels["env"] == "staging"'
kubernetes_labels_expression: 'labels["env"] == "staging"'
db_labels_expression: 'labels["env"] == "staging"'
db_service_labels_expression: 'labels["env"] == "staging"'
windows_desktop_labels_expression: 'labels["env"] == "staging"'
group_labels_expression: 'labels["env"] == "staging"'
# aws_role_arns는 이 역할을 가진 사용자가 AWS 콘솔에 접근할 때 AWS 역할을 수임할 수 있도록 허용합니다.
# UI 또는 AWS API를 사용하여 CLI
aws_role_arns:
- 'arn:aws:iam::1234567890:role/ec2-read-only'
- 'arn:aws:iam::1234567890:role/ec2-full-access'
- 'arn:aws:iam::0987654321:role/example-role'
# Identity Center 통합을 위한 AWS 계정 및 권한 세트 바인딩
account_assignments:
- # AWS identity center 계정 ID
account: "<account_id>"
# AWS에서의 권한 세트 이름
name: AdministratorAccess
# 권한 세트 ARN
permission_set: arn:aws:sso:::permissionSet/ssoins-1234/ps-5678 # 권한 세트 ARN
# impersonate를 사용하면 이 역할을 가진 사용자가 아래 표현과 일치하는 다른 사용자 및 역할의 이름으로 인증서를 발급할 수 있습니다.
impersonate:
users: ['*']
roles: ['jenkins']
# where는 선택적 조건부로, 사용자와 역할의 일치를 더욱 제한하는 조건입니다.
where: >
contains(user.spec.traits["group"], impersonate_role.metadata.labels["group"]) &&
contains(user.spec.traits["group"], impersonate_user.metadata.labels["group"])
# review_requests는 이 역할을 가진 사용자가 액세스 요청을 승인 또는 거부할 수 있도록 허용합니다. (기업 전용)
review_requests:
# 리뷰어는 여기에 나열된 역할에 대한 액세스 요청을 보고 승인 또는 거부할 수 있습니다.
roles: ['dbadmin']
# 리뷰어는 리소스 접근 요청을 검토할 때 preview_as_roles에 나열된 역할에 대해 접근 가능한 리소스에 대한 세부 정보를 미리 볼 수 있습니다.
preview_as_roles: ['dbadmin']
# request는 사용자가 아래 표현과 일치하는 역할을 요청할 수 있도록 허용합니다.
request:
# 'roles' 목록은 리터럴과 와일드카드 일치자를 혼합할 수 있습니다.
roles: ['common', 'dev-*']
# 'search_as_roles'는 사용자에게 나열된 역할에 의해 접근할 수 있는 리소스를 검색하고 요청할 수 있도록 허용합니다. (기업 전용)
search_as_roles: ['access']
# 'kubernetes_resources'는 사용자가 어떤 종류의 Kubernetes 리소스를 요청할 수 있는지를 제한합니다. 아래 예에서는 사용자가 오직 Kubernetes 네임스페이스만 요청할 수 있습니다.
# 기본값(아무것도 정의되지 않을 경우)은 모든 Kubernetes 리소스나 전체 클러스터에 대한 접근 요청을 허용합니다.
kubernetes_resources:
- kind: "namespace"
# thresholds는 승인자 및 거부자의 최소 수를 지정합니다.
# 기본값은 모두 1입니다. (기업 전용)
thresholds:
# 최소 두 명의 적격 승인자와 최소 한 명의 거부자가 필요합니다.
- approve: 2
deny: 1
# max_duration은 사용자가 역할에 대한 접근 요청을 할 수 있는 최대 기간을 지정합니다.
# 기간은 초(s), 분(m), 시간(h) 또는 일(d)으로 지정할 수 있습니다. 예: 4d, 10h, 30m, 60s.
# 최대 기간은 14일입니다.
max_duration: 7d
# 'claims_to_roles' 매핑은 OIDC 커넥터에서와 동일하게 작동하지만,
# 매핑되는 역할도 일치자일 수 있는 추가 이점이 있습니다.
#
# 이 예제는 사용자의 클레임에서 동적 매핑을 허용하는 텔레포트의 정규 표현식 지원을 활용합니다.
# 아래 매핑은 'projects: product-(.*)'와 일치하는 클레임을 가진 사용자가 '$1-admin'에 해당하는 역할을 요청할 수 있음을 나타냅니다.
# 예: 'projects: product-foo' 클레임은 사용자가 'foo-admin' 역할을 요청할 수 있게 합니다.
claims_to_roles:
- claim: 'projects'
# 선행 'product-'가 있는 모든 그룹 이름과 일치합니다.
value: '^product-(.*)$'
# 값 캡처에서 역할 이름을 생성합니다.
roles: ['$1-admin']
# 텔레포트는 보류 중인 액세스 요청에 주석을 첨부할 수 있습니다. 이러한
# 주석은 리터럴일 수 있으며, 변수 보간 표현식이 될 수 있으며,
# 효과적으로 외부 ID 공급자에서 플러그인 시스템으로 선택된 클레임을 전파하는 수단을 생성합니다.
annotations:
foo: ['bar']
groups: ['{{external.groups}}']
# Moderated Sessions 정책은 세션을 시작하는 데 필요한 요구 사항을 정의합니다.
require_session_join:
# 정책의 이름을 정의합니다. 이름은 로그 및 조직/분류의 식별자로만 사용됩니다.
- name: 감사인 감독
# 정책의 요구 사용자 수에 대한 필드를 정의하는 RBAC 조건을 지정합니다.
filter: 'contains(user.spec.roles, 'auditor')'
# 이 정책이 적용되는 세션 종류.
kinds: ['k8s', 'ssh']
# 정책에 대해 카운트되기 위해 참가자가 가져야 하는 참가자 모드의 목록입니다.
modes: ['moderator']
# 정책을 충족하기 위해 필터 표현식에 부합해야 하는 최소 사용자 수입니다.
count: 1
# 정책이 더 이상 충족되지 않을 경우, 모더레이터가 세션을 떠났을 때 취할 조치입니다.
# 이는 'terminate' 또는 'pause'일 수 있습니다. 비어 있거나 알 수 없는 값은 'terminate'로 기본 설정됩니다.
on_leave: 'terminate'
# Moderated Sessions 정책은 세션에 참여할 수 있는 능력을 정의합니다.
join_sessions:
# 정책의 이름을 정의합니다. 이름은 로그 및 조직/분류를 위한 식별자로만 사용됩니다.
- name: 감사인 감독
# 이러한 역할을 가진 다른 사용자가 생성한 세션에 참여할 수 있습니다.
roles : ['prod-access']
# 이 정책이 적용되는 다양한 세션 종류.
kinds: ['k8s', 'ssh']
# 역할이 참가자로서 세션에 참여할 수 있는 방식의 목록입니다.
modes: ['moderator', 'observer']
# spiffe는 역할을 가진 사용자가 요청할 수 있는 SPIFFE ID 목록입니다.
# 요청이 spiffe 목록 내의 한 블록과 일치하는 한, 인증서가 발급됩니다.
spiffe:
# 요청할 수 있는 SPIFFE ID의 경로입니다. 이 필드는
# 각 블록에 대해 필수입니다. 앞에 슬래시가 있어야 하며
# 후행 슬래시는 포함되어서는 안 됩니다.
- path: "/svc/foo"
# 사용자 요청에 SPIFFE ID와 함께 포함될 수 있는 IP SAN입니다.
# 이 블록의 필드는 선택적이며 생략하면
# 사용자가 IP SAN과 함께 SVID를 요청할 수 없습니다.
ip_sans: ["10.0.0.100/32"]
# 사용자 요청에 SPIFFE ID와 함께 포함될 수 있는 DNS SAN입니다.
# 이 블록의 필드는 선택적이며 생략하면
# 사용자가 DNS SAN과 함께 SVID를 요청할 수 없습니다.
#
# '*' 와일드카드 문자는 임의의 수의
# 모든 문자를 나타내는 데 사용됩니다. 예를 들어, '*.example.com'은
# 'foo.example.com'과 일치합니다.
dns_sans: ["foo.svc.example.com"]
# rules는 이 역할을 가진 사용자가 아래 조건과 일치하는 다른 리소스를 수정할 수 있도록 허용합니다.
# 지원되는 리소스:
# role - 역할 리소스
# user - 사용자 리소스
#
# auth_connector - 모든 인증 커넥터 리소스
# oidc - OIDC 커넥터 리소스
# saml - 커넥터 리소스
# github - GitHub 커넥터 리소스
#
# trusted_cluster - 신뢰할 수 있는 클러스터 리소스
# remote_cluster - 원격 클러스터 리소스
#
# access_request - 액세스 요청 리소스
# access_plugin_data - 액세스 요청 플러그인 데이터를 수정할 수 있는 권한
#
# session - 세션 재생 기록
# session_tracker - 활성 세션
# ssh_session - 활성 세션 페이지 보기를 허용합니다.
# instance - 텔레포트 인스턴스
# event - 구조화된 감사 로그 이벤트
#
#
# lock - 잠금 리소스
# network_restrictions - SSH 세션에 대한 제한 사항
#
# auth_server - 인증 서비스 리소스
# proxy - 프록시 서비스 리소스
# node - SSH 노드 리소스
# app - 애플리케이션 리소스
# db - 데이터베이스 리소스
# kube_cluster - Kubernetes 클러스터 리소스
# token - 프로비전 토큰 리소스
# cert_authority - 인증 기관 리소스
#
# cluster_name - 클러스터 이름을 포함하는 리소스입니다.
# cluster_config - 클러스터 수준 구성 보관 리소스
# cluster_auth_preference - 이 클러스터에 대한 인증 유형
# session_recording_config - 세션 기록 구성에 대한 리소스
# cluster_audit_config - 클러스터 감사 구성 보관 리소스
# cluster_networking_config - 클러스터 네트워킹 구성 보관 리소스
rules:
- resources: [role]
verbs: [list, create, read, update, delete]
- resources: [auth_connector]
verbs: [list, create, read, update, delete]
- resources: [session]
verbs: [list, read]
- resources: [trusted_cluster]
verbs: [list, create, read, update, delete]
- resources: [event]
verbs: [list, read]
- resources: [user]
verbs: [list, create, read, update, delete]
- resources: [token]
verbs: [list, create, read, update, delete]
# deny 섹션은 'allow' 섹션과 동일한 형식을 사용합니다.
# deny 규칙은 항상 allow 규칙을 무시합니다.
deny: {}
역할 버전
Teleport 역할 리소스의 5, 6 및 7 버전은 Kubernetes 리소스에 접근할 때 서로 다른 동작을 보입니다.
Kubernetes 접근 권한을 부여하지 않는 역할은 세 가지 버전에서 동등합니다.
역할 v5 및 v6는 포드에 대한 작업(예: 실행)을 제한할 수만 있습니다.
역할 v7은 모든 일반 리소스 종류를 제한하는 것을 지원합니다(전체 목록은 kubernetes_resource
문서 참조).
kubernetes_resource
가 설정되어 있지 않을 때:
- 역할 v5 및 v7은 기본적으로 모든 접근을 허용합니다.
- 역할 v6은 기본적으로 포드 실행을 차단하며, 이는 사용자의 경험을 개선하기 위해 역할 v7에서 되돌려졌습니다.
허용 규칙 | 역할 v5 | 역할 v6 | 역할 v7 |
---|---|---|---|
kubernetes_groups: | ❌ 접근 없음 | ❌ 접근 없음 | ❌ 접근 없음 |
kubernetes_groups: | ✅ dev 클러스터에 대한 전체 접근 | ❌ 포드에서 exec 할 수 없음 ✅ 기타 리소스(예: secrets )에는 접근 가능 | ✅ dev 클러스터에 대한 전체 접근 |
kubernetes_groups: | ✅ foo 에서 포드에 exec 가능 ✅ 모든 네임스페이스의 secrets 에 접근 가능. ❌ 다른 네임스페이스에서 exec 할 수 없음 | ✅ foo 에서 포드에 exec 가능 ✅ 모든 네임스페이스의 secrets 에 접근 가능. ❌ 다른 네임스페이스에서 exec 할 수 없음 | ✅ foo 에서 포드에 exec 가능 ❌ 모든 네임스페이스의 secrets 에 접근 불가 ❌ 다른 네임스페이스에서 exec 할 수 없음 |
kubernetes_groups: | ⚠️ 지원되지 않음 | ⚠️ 지원되지 않음 | ✅ foo 에서 포드에 exec 가능 ✅ foo 의 secrets 에 접근 가능 ❌ 다른 네임스페이스에서 exec 할 수 없음 ❌ 다른 네임스페이스의 secrets 에 접근 불가 ❌ foo 의 configmaps 에 접근 불가 |
kubernetes_groups: | ⚠️ 지원되지 않음 | ⚠️ 지원되지 않음 | ✅ foo 네임스페이스에 대한 전체 접근 ❌ 다른 네임스페이스 접근 불가 |
Windows 데스크톱
대부분의 경우, Teleport는 구성 파일의 정적 호스트 또는 LDAP 기반 검색을 통해 자동으로 windows_desktop
리소스를 등록합니다.
그러나 tctl
을 사용하여 windows_desktop
리소스를 수동으로 관리할 수도 있습니다.
이는 Active Directory 도메인에 가입되지 않은 호스트의 인벤토리를 관리하는 데 유용할 수 있습니다.
이러한 방식으로 데스크톱을 등록할 때 유의해야 할 몇 가지 중요한 사항이 있습니다:
- 데스크톱의
addr
은 호스트 이름 또는 IP 주소일 수 있으며, RDP 포트(일반적으로 3389)를 포함해야 합니다. - 데스크톱의
host_id
는 호스트에 원격 데스크톱 연결을 프록시할 수 있는windows_desktop_service
의 이름으로 설정해야 합니다. 그러한 서비스가 여러 개 있는 경우, 다른host_id
값을 가진 여러windows_desktop
리소스를 생성할 수 있습니다. - 로컬 Windows 사용자로 데스크톱에 로그인할 의도가 있는 경우
non_ad: true
를 설정해야 합니다. Active Directory 사용자로 로그인할 의도가 있는 경우non_ad
를 설정하지 않거나 false로 남겨 두고,domain
필드에 Active Directory 도메인을 지정해야 합니다.
kind: windows_desktop
metadata:
name: desktop-without-ad
labels:
foo: bar
baz: quux
spec:
host_id: 307e091b-7f6b-42e0-b78d-3362ad10b55d
addr: 192.168.1.153:3389
domain: ""
non_ad: true
# 선택 사항 - 모든 세션이 동일한 화면 크기를 사용하도록 보장합니다,
# 브라우저 창의 크기와 상관없이.
# 브라우저 창의 크기를 사용하려면 비워 두십시오.
screen_size:
width: 1024
height: 768
version: v3
로그인 규칙
로그인 규칙에는 로그인 시 SSO 사용자 특성을 변환하는 로직이 포함되어 있습니다.
kind: login_rule
version: v1
metadata:
# name은 클러스터에서 Login Rule의 고유한 이름입니다.
name: example
# expires는 선택 사항이며 배포된 로그인 규칙에 대해서는 일반적으로 설정하지 않아야 하지만,
# 새로운 로그인 규칙을 테스트할 때는 잠재적으로 클러스터에서 잠길 수 있는 것을 방지하기 위해
# 가까운 미래에 만료 시간을 설정하는 것이 유용할 수 있습니다.
# expires: "2023-01-31T00:00:00-00:00"
spec:
# priority는 클러스터 내에서 여러 로그인 규칙의 평가 순서를 정하는 데 사용될 수 있습니다.
#
# 숫자가 낮은 우선 순위를 가진 로그인 규칙이 먼저 적용되고,
# 그 다음으로 증가하는 순서의 우선 순위를 가진 규칙이 적용됩니다. 동점일 경우,
# 같은 우선 순위를 가진 로그인 규칙은 이름의 사전적 정렬에 의해 정렬됩니다.
#
# 기본 값은 0이며 지원되는 범위는 -2147483648에서 2147483647까지 입니다.
# (포함).
priority: 0
# 설정된 경우, traits_map은 클러스터에 로그인하는 모든 사용자의 특성을 결정합니다.
#
# 이것은 키가 최종 특성 키가 되는 정적 문자열이어야 하며, 값은 각 문자열 집합으로 평가되어야 하는
# 조건 표현식 목록입니다. 최종 특성은 해당 특성 키의 모든 조건 표현식으로부터 얻어진 문자열 집합의 합집합으로 설정됩니다.
#
# traits_map은 원하는 특성의 전체 세트를 포함해야 합니다. 여기에서 찾을 수 없는 외부 특성은 사용자의 인증서에 포함되지 않습니다.
#
# traits_map 또는 traits_expression 중 하나만 설정되어야 합니다.
traits_map:
groups:
- external.groups
logins:
- strings.lower(external.username)
# traits_expression은 단일 조건 표현식을 포함하는 문자열로,
# 사전을 평가해야 합니다. 로그인 중 모든 사용자의 특성을 설정합니다.
#
# traits_map 또는 traits_expression 중 하나만 설정되어야 합니다.
traits_expression: |
external.put("logins", strings.lower(external.logins))
데이터베이스 객체 가져오기 규칙
데이터베이스 객체 가져오기 규칙은 Teleport로 가져온 데이터베이스 객체에 적용될 레이블을 정의합니다.
자세한 내용은 데이터베이스 액세스 제어를 참조하십시오.
kind: db_object_import_rule
metadata:
name: my_custom_rule
spec:
# 우선 순위는 규칙의 중요도를 결정하며, 숫자가 낮을수록 우선 순위가 낮음을 나타냅니다.
# 충돌의 경우, 두 규칙이 동일한 레이블을 적용할 때,
# 더 높은 우선 순위를 가진 규칙에서 적용된 레이블이 승리합니다.
priority: 123
# database_labels는 이 규칙의 범위에 있는 데이터베이스 자원을 지정하는 필터입니다.
database_labels:
- name: 'env'
values:
- 'test'
- 'staging'
- name: 'dept'
values:
- '*'
# 매핑의 각각은 일치할 경우 데이터베이스 객체에 적용되는 레이블 세트를 소개합니다.
# 레이블이 없는 데이터베이스 객체는 가져오지 않습니다.
mappings:
- add_labels:
# 다음 속성이 지원됩니다; 'obj'는 '데이터베이스 객체'를 나타냅니다.
database: '{{obj.database}}'
object_kind: '{{obj.object_kind}}'
name: '{{obj.name}}'
protocol: '{{obj.protocol}}'
schema: '{{obj.schema}}'
database_service_name: '{{obj.database_service_name}}'
# 고정 문자열을 사용하거나 템플릿과 혼합할 수 있습니다.
fixed: const_value
template: 'foo-{{obj.name}}'
# match는 가져올 객체를 추가합니다; 비어 있을 수 없습니다.
match:
# 모든 테이블 이름의 목록
table_names:
- 'fixed_table_name'
- 'partial_wildcard_*'
# scope는 가져오기의 범위를 줄입니다; 비어 있을 수 있습니다.
scope:
database_names:
- Widget*
schema_names:
- public
- secret
# 추가 매핑은 여기에서 추가할 수 있습니다.
- add_labels:
confidential: true
match:
table_names:
- '*'
scope:
schema_names:
- secret
version: v1
장치
장치는 신뢰할 수 있는 장치를 식별하는 정보를 포함합니다.
kind: device
version: v1
metadata:
# name is a unique random identifier for the device in the cluster.
name: 5ff09619-527c-4a17-973f-cd9cd5c93990
spec:
# asset_tag is a user controlled identifier for the device. This is usually a device serial number.
asset_tag: HD6M74XNCK
# collected_data is a list of data recently collected from the device.
# Each list item is an object containing event and device metadata..
collected_data:
# collect_time is the device-recorded timestamp of when the data was collected.
- collect_time: "2023-02-22T21:04:26.312862Z"
# os_type is the operating system type of the device.
os_type: macos
# record_time is the Teleport-recorded timestamp of when the data was received.
record_time: "2023-02-22T21:04:26.396471Z"
# serial_number is the serial number of the device, usually matching the asset tag.
serial_number: HD6M74XNCK
# create_time is a timestamp of when the device was created and enrolled with Teleport.
create_time: "2023-02-22T21:04:20.87721Z"
# update_time is a timestamp of when the device was last updated.
update_time: "2023-02-22T21:04:26.396471Z"
# os_type is the operating system type of the device.
# This must be one of "linux", "windows", or "macos".
os_type: macos
# credential is the device credential used by the device to authenticate with Teleport.
credential:
# id is the unique identifier of the credential.
id: ebe41e2b-5dbb-40a0-82fb-cded7d3373dd
# public_key_der is the base64-encoded DER-formatted public part of the asymmetric keypair used to verify authenticity.
public_key_der: MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEhO73Q5+DWIg9nXFc/Nv38cI9iog9nnlwDmdtZXBtRNc6P0WajDG3cWn3NWttkHTKDSxywOOmupliKA8q1VxvfQ==
# enroll_status is the current enrollment status of the device.
# This must be one of "enrolled", "not_enrolled", or "unspecified".
enroll_status: enrolled
UI 구성
프록시 서비스에 의해 제공되는 웹 UI에 대한 전역 구성 옵션입니다. 이 리소스는 기본으로 설정되지 않으며, 따라서 이 리소스가 설정되기 전에 tctl get ui
를 사용하면 오류가 발생합니다.
kind: ui_config
version: v1
metadata:
name: ui-config
spec:
# 터미널에서 스크롤백의 양입니다. 스크롤백은 초기
# 뷰포트를 넘어서 스크롤할 때 유지되는 행의 수입니다.
# 세션 기록 보기에는 적용되지 않습니다.
scrollback_lines: 1000
# 웹 UI 리소스 페이지에 어떤 리소스를 보여줄 것인지에 대한 설정입니다. 사용자가
# 접근할 수 있는 리소스와 사용자가 접근을 요청할 수 있는 리소스입니다. 기본적으로 두 유형이
# 포함됩니다. 사용자가 접근할 수 있는 리소스만 보려면
# 이 값을 "accessible_only"로 설정하십시오.
show_resources: 'requestable'
VNet 구성
이 클러스터의 리소스에 대한 연결을 설정할 때 VNet이 사용해야 하는 클러스터별 옵션입니다.
자세한 내용은 VNet를 참조하십시오.
kind: vnet_config
version: v1
metadata:
name: vnet-config
spec:
# 리소스에 IP 주소를 할당할 때 사용할 범위입니다.
# 최종 사용자 장치에 배포된 다른 소프트웨어와 충돌할 경우 변경할 수 있습니다.
# 기본값은 "100.64.0.0/10"입니다.
ipv4_cidr_range: "100.64.0.0/10"
# VNet이 DNS 쿼리를 캡처해야 하는 추가 DNS 영역입니다.
# TCP 앱이 custom public_addr를 사용하는 경우 설정합니다.
# 상기 링크된 가이드에 따라 도메인에 DNS TXT 레코드를 설정해야 합니다.
# 기본값은 비어 있습니다.
custom_dns_zones:
- suffix: company.test
클러스터 유지 관리 구성
자동 업데이트에 등록된 에이전트에 대한 전역 구성 옵션입니다.
kind: cluster_maintenance_config
spec:
agent_upgrades:
# 유지 관리 창의 시작 시간 (UTC).
# 유지 관리 창은 1시간 동안 지속됩니다.
utc_start_hour: 2
# 유지 관리가 허용되는 주간
# 가능한 값은:
# - 짧은 이름: Sun, Mon, Tue, Wed, Thu, Fri, Sat
# - 긴 이름: Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday
weekdays:
- Mon
- Wed
- Fri
클러스터 인증 기본 설정
인증을 위한 전역 클러스터 구성 옵션입니다.
metadata:
name: cluster-auth-preference
spec:
# 사용할 두 번째 요소의 유형을 설정합니다.
# 가능한 값: "on", "otp" 및 "webauthn"
# "on" 이 설정되면 모든 MFA 프로토콜이 지원됩니다.
second_factor: "otp"
# OIDC 또는 SAML 커넥터의 이름. 이 설정이 없으면 백엔드의 첫 번째 커넥터가 사용됩니다.
connector_name: ""
# webauthn 는 서버 측 웹 인증 지원에 대한 설정입니다.
webauthn:
# rp_id 는 신뢰하는 당사자의 ID입니다.
# Teleport 설치의 도메인 이름으로 설정해야 합니다.
#
# 중요: rp_id는 클러스터 수명 동안 절대 변경되어서는 안 됩니다.
# 이는 WebAuthn 장치의 등록 데이터에 기록되기 때문입니다. 만약
# rp_id 가 변경되면 모든 기존 WebAuthn 키 등록이 무효가 되고
# WebAuthn을 두 번째 요소로 사용하는 모든 사용자는
# 다시 등록해야 합니다.
rp_id: teleport.example.com
# PEM 형식의 장치 인증 CA 허용 목록입니다.
# 존재할 경우, 여기에서 지정된 인증서와 일치하는
# 장치만 등록할 수 있습니다 (기존 등록은
# 변경되지 않습니다).
# `attestation_denied_cas` 와 함께 제공되면, 둘 다
# 조건이 참이어야 등록이 허용됩니다 (장치
# 반드시 허용된 CA와 일치해야 하고, 거부된 CA와는
# 일치하지 않아야 합니다).
# 기본적으로 모든 장치가 허용됩니다.
attestation_allowed_cas: []
# PEM 형식의 장치 인증 CA 거부 목록입니다.
# 존재할 경우, 여기에서 지정된 인증서와 일치하지 않는
# 장치만 등록할 수 있습니다 (기존 등록은
# 변경되지 않습니다).
attestation_denied_cas: []
# 사용자 로그인 세션에 대해 세션별 MFA 또는 PIV 하드웨어 키 제한을 수행합니다.
# 가능한 값: true, false, "hardware_key", "hardware_key_touch".
# 기본값은 false입니다.
require_session_mfa: false
# 만료된 클라이언트 인증서로 연결된 연결을 끊을지 여부를 설정합니다.
disconnect_expired_cert: false
# 헤드리스 인증이 허용될지 여부를 설정합니다.
# 헤드리스 인증은 WebAuthn을 요구합니다.
# 웹 인증이 구성되면 기본값은 true입니다.
allow_headless: false
# 로컬 인증이 다른 어떤 인증 유형과 함께 활성화될지 여부를 설정합니다.
allow_local_auth: true
# 비밀번호 없는 인증이 허용될지 여부를 설정합니다.
# Webauthn 이 작업에 필요합니다.
allow_passwordless: false
# 클러스터에 대한 오늘의 메시지를 설정합니다.
message_of_the_day: ""
# idp는 Teleport 내에서 IdP에 액세스하는 것과 관련된 옵션 세트입니다. Teleport Enterprise가 필요합니다.
idp:
# Teleport SAML IdP와 관련된 옵션입니다.
saml:
# Teleport SAML IdP에 대한 액세스를 활성화합니다.
enabled: true
# locking_mode는 클러스터 전체의 기본 잠금 모드입니다.
# 가능한 값: "strict" 또는 "best_effort"
locking_mode: best_effort
# default_session_ttl은 이 클러스터에서 사용자에게 발급된 인증서의 기본 TTL(유효 시간)을 정의합니다.
default_session_ttl: "12h"
# 이 클러스터에서 사용할 인증 유형입니다.
# 가능한 값: "local", "oidc", "saml" 및 "github"
type: local
version: v2
봇
봇 리소스는 머신 ID 봇 식별자 및 해당 접근 권한을 정의합니다.
자세한 내용은 머신 ID 구성 참조에서 확인하십시오.
kind: bot
version: v1
metadata:
# name은 클러스터에서 봇을 식별하기 위한 고유 식별자입니다.
name: robot
spec:
# roles는 봇이 자격 증명을 생성할 수 있는 역할 목록입니다.
roles:
- editor
# traits는 Bot 사용자에게 적용되는 특성을 제어합니다. 이러한 것은
# 역할 템플릿 시스템에 제공되며, 새로운 역할을 생성하지 않고도 특정 Bot에
# 특정 리소스에 대한 접근을 부여하는 데 사용할 수 있습니다.
traits:
- name: logins
values:
- root