이 참조 가이드는 텔레포트를 사용하여 관리할 수 있는 동적 리소스를 나열합니다. 동적 리소스에 대한 자세한 내용은 동적 리소스 사용 가이드를 참조하세요.
tctl
을 사용한 동적 리소스 적용 예시:
모든 커넥터 목록 보기:
tctl get connectors"okta"라는 SAML 커넥터 덤프:
tctl get saml/okta"okta"라는 SAML 커넥터 삭제:
tctl rm saml/okta"gworkspace"라는 OIDC 커넥터 삭제:
tctl rm oidc/gworkspace"myteam"이라는 깃허브 커넥터 삭제:
tctl rm github/myteam"admin"이라는 로컬 사용자 삭제:
tctl rm users/admin모든 장치 보기:
tctl get devices특정 장치 가져오기:
tctl get devices/<asset-tag>클러스터 인증 기본 설정 가져오기
tctl get cluster_auth_preference
tctl get connectors
명령어는 모든 커넥터를 보여주지만, 개별 커넥터 작업 시에는 반드시 올바른 kind
(예: saml
또는 oidc
)를 사용해야 합니다. tctl get connectors
의 YAML 출력 상단에서 각 커넥터의 kind
를 확인할 수 있습니다.
동적 리소스 목록
현재 tctl
를 통해 노출된 리소스 목록은 다음과 같습니다:
리소스 종류 | 설명 |
---|---|
user | 내부 텔레포트 사용자 데이터베이스의 사용자 기록입니다. |
role | 대화형 및 비대화형 사용자(봇)가 맡는 역할입니다. |
connector | SAML, OIDC 및 GitHub에 대한 싱글 사인온(SSO) 인증 연결기입니다. |
node | 등록된 SSH 노드입니다. 동일한 기록이 tctl nodes ls 를 통해 표시됩니다. |
windows_desktop | 등록된 윈도우 데스크톱입니다. |
cluster | 신뢰할 수 있는 클러스터입니다. 클러스터를 연결하는 데 대한 자세한 내용은 여기를 참조하세요. |
login_rule | 로그인 규칙입니다. 자세한 정보는 로그인 규칙 가이드를 참조하세요. |
device | 텔레포트 신뢰할 수 있는 장치입니다. 자세한 정보는 장치 신뢰 가이드를 참조하세요. |
ui_config | 프록시 서비스에서 제공하는 웹 UI의 구성입니다. |
vnet_config | 클러스터의 VNet 옵션 구성입니다. |
cluster_auth_preference | 클러스터의 인증 기본 설정 구성입니다. |
database_object_import_rule | 데이터베이스 객체 가져오기 규칙입니다. |
사용자
텔레포트는 대화형 로컬 사용자, 비대화형 로컬 사용자(봇) 및 리소스로 표현되는 싱글 사인온 사용자를 지원합니다.
kind: user
version: v2
metadata:
name: joe
spec:
# roles는 이 사용자에게 할당된 역할 목록입니다.
roles:
- admin
# status는 텔레포트 시스템에서 사용자를 일시적으로 잠급니다.
# 예를 들어 사용자가 미리 정의된 실패 로그인 시도 횟수를 초과할 때입니다.
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 클러스터, 웹 서비스 및 애플리케이션, 윈도우 데스크톱에 대한 접근을 관리합니다.
kind: role
version: v7
metadata:
name: example
description: This is an example role.
spec:
# 옵션은 연결을 지정하며, 사용자가 여러 개의 비기본
# 충돌 옵션을 가지고 있을 경우, teleport는 가장 제한적인 값을 선택합니다.
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 검증 사이에 경과할 수 있는 최대 기간을 정의합니다.
# 이 변수는 사용자가 주기적으로 자신의 신원을 확인하도록 유도하여
# 장기적인 재인증 없이는 만료되는 세션을 방지하여 보안을 강화하는 데 사용됩니다.
mfa_verification_interval: 1h
# lock은 이 역할의 사용자에 대한 잠금 모드를 설정합니다.
# 유효한 값은 'strict' 또는 'best_effort'입니다.
lock: strict
# 기업 전용 request_access 필드는 'optional', 'always' 또는 'reason'입니다. 항상 또는 reason으로 설정할 경우,
# tsh 또는 웹 UI 클라이언트에 각각 Access Request를 항상 생성하도록 지시합니다. 'reason'로 설정할 경우,
# 사용자는 Access Request를 생성하는 이유를 표시해야 합니다.
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(Auth Service)에서 'off'로 설정된 경우
# 또는 클러스터의 session_recording_config 리소스가 'mode: off'로 설정된 경우
# 데스크톱 세션은 결코 기록되지 않습니다.
desktop: true
# 선택 사항: 프로토콜별 모드가 설정되지 않은 경우 사용할 기본 세션 기록 모드입니다.
default: best_effort|strict
# 선택 사항: SSH 세션의 세션 기록 모드입니다(Телепорт 서버 접근).
# 설정되지 않은 경우, 기본값에 설정된 값이 사용됩니다.
ssh: best_effort|strict
# 원격 데스크톱과의 클립보드 공유가 허용되는지를 지정합니다.
# 기본값은 지정되지 않았을 경우 true입니다.
# 사용자의 역할 중 하나라도 클립보드를 비활성화하면 비활성화됩니다.
desktop_clipboard: 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
# 이 역할이 자동 데이터베이스 사용자 프로비저닝을 요구하는지를 제어합니다.
# 옵션: 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']
# 정규 표현식은 ^로 시작하고 $로 끝납니다.
# Teleport는 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`를 실행할 수 있도록 허용합니다.
"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-*'
# 정규 표현식은 ^로 시작하고 $로 끝납니다.
# Teleport는 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:
# 리소스 종류. Teleport는 현재 지원하는 종류:
# - * (모든 리소스)
# - 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-]+$'
# 사용자가 리소스에서 수행할 수 있는 동사입니다.
# Teleport는 현재 지원하는 동사:
# - * (모든 동사)
# - 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-*'
# 정규 표현식은 ^로 시작하고 $로 끝납니다.
# Teleport는 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 콘솔에
# UI를 사용하거나 CLI를 사용하여 AWS API에 접근할 때 AWS 역할을 맡을 수 있도록 허용합니다.
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'
# impersonate는 이 역할을 가진 사용자가 아래 표현과 일치하는
# 다른 사용자와 역할을 대신하여 인증서를 발급할 수 있도록 허용합니다.
impersonate:
users: ['*']
roles: ['jenkins']
# where는 선택적인 where 조건입니다.
# 일치하는 사용자와 역할의 범위를 더욱 제한합니다.
where: >
contains(user.spec.traits["group"], impersonate_role.metadata.labels["group"]) &&
contains(user.spec.traits["group"], impersonate_user.metadata.labels["group"])
# review_requests는 이 역할을 보유한 사용자가
# Access Requests를 승인 또는 거부할 수 있도록 허용합니다(기업 전용).
review_requests:
# 리뷰어는 여기 나열된 모든 역할에 대해 접근 요청을 보고 승인하거나 거부할 수 있습니다.
roles: ['dbadmin']
# 리뷰어는 리소스 접근 요청을 검토할 때
# 여기 나열된 역할이 액세스할 수 있는 리소스에 대한 세부 정보를 미리 볼 수 있습니다.
preview_as_roles: ['dbadmin']
# request는 사용자가 아래 표현과 일치하는 역할을 요청할 수 있도록 허용합니다.
request:
# 'roles' 목록은 리터럴과 와일드카드 일치기의 조합이 될 수 있습니다.
roles: ['common', 'dev-*']
# 'search_as_roles'는 사용자가 접근할 수 있는 리소스를 검색하고 요청할 수 있게 허용합니다.
# (기업 전용)
search_as_roles: ['access']
# 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 커넥터와 동일하게 작동하며,
# 매핑되는 역할이 또한 매처일 수 있다는 추가 이점이 있습니다.
#
# 이 예시는 Teleport의 정규 표현식 지원을 활용하여,
# 클레임에서 동적 매핑을 가능하게 합니다. 아래 매핑은 사용자가
# 'projects: product-(.*)'에 해당하는 클레임을 가질 경우,
# '$1-admin'과 매칭되는 역할을 요청할 수 있게 합니다.
# 예: 'projects: product-foo' 클레임은 사용자가
# 'foo-admin' 역할을 요청할 수 있게 합니다.
claims_to_roles:
- claim: 'projects'
# 접두사가 'product-'인 모든 그룹 이름과 일치합니다.
value: '^product-(.*)$'
# 값 캡처에서 역할 이름을 생성합니다.
roles: ['$1-admin']
# Teleport는 보류 중인 Access Requests에 주석을 첨부할 수 있습니다.
# 이러한 주석은 리터럴이거나 변수 보간 표현일 수 있으며,
# 효과적으로 선택된 클레임을 외부 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"
# 사용자 요청 시 SVID에 포함될 IP SAN입니다.
# 이 필드는 선택 사항이며 생략할 경우,
# 사용자가 IP SAN이 포함된 SVID를 요청할 수 없습니다.
ip_sans: ["10.0.0.100/32"]
# 사용자 요청 시 SVID에 포함될 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 - Teleport 인스턴스
# event - 구조적 감사 로깅 이벤트
#
#
# lock - 잠금 리소스.
# network_restrictions - SSH 세션에 대한 제한
#
# auth_server - Auth 서비스 리소스
# 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: {}
역할 버전
텔레포트 역할 리소스의 버전 5, 6 및 7은 Kubernetes 리소스에 접근할 때 서로 다른 동작을 보입니다.
Kubernetes 접근을 부여하지 않는 역할은 세 가지 버전에서 동일합니다.
역할 v5 및 v6는 포드에서의 작업을 제한할 수만 있습니다(예: 포드 내에서 실행). 역할 v7은 모든 일반 리소스 종류를 제한할 수 있습니다. (전체 목록은 kubernetes_resource 문서를 참조하세요).
kubernetes_resource
가 설정되지 않은 경우:
- 역할 v5 및 v7은 기본적으로 모든 접근을 부여합니다.
- 역할 v6은 기본적으로 포드 실행을 차단합니다. 이는 사용자 경험을 개선하기 위해 역할 v7에 의해 되돌려졌습니다.
허용 규칙 | 역할 v5 | 역할 v6 | 역할 v7 |
---|---|---|---|
kubernetes_groups: | ❌ 접근 불가 | ❌ 접근 불가 | ❌ 접근 불가 |
kubernetes_groups: | ✅ dev 클러스터에 대한 전체 접근 | ❌ 포드 내에서 실행 불가 ✅ 다른 리소스( secrets 등)에 대한 접근 가능 | ✅ dev 클러스터에 대한 전체 접근 |
kubernetes_groups: | ✅ foo 내 포드 실행 가능 ✅ 모든 네임스페이스의 secrets 접근 가능.❌ 다른 네임스페이스에서 실행 불가 | ✅ foo 내 포드 실행 가능 ✅ 모든 네임스페이스의 secrets 접근 가능.❌ 다른 네임스페이스에서 실행 불가 | ✅ foo 내 포드 실행 가능 ❌ 모든 네임스페이스의 secrets 에 접근 불가 ❌ 다른 네임스페이스에서 실행 불가 |
kubernetes_groups: | ⚠️ 지원되지 않음 | ⚠️ 지원되지 않음 | ✅ foo 내 포드 실행 가능 ✅ foo 내 secrets 접근 가능 ❌ 다른 네임스페이스에서 실행 불가 ❌ 다른 네임스페이스의 secrets 접근 불가 ❌ foo 내 configmaps 접근 불가 |
kubernetes_groups: | ⚠️ 지원되지 않음 | ⚠️ 지원되지 않음 | ✅ foo 네임스페이스 내 전체 접근 가능 ❌ 다른 네임스페이스 접근 불가 |
윈도우 데스크톱
대부분의 경우, 텔레포트는 구성 파일의 정적 호스트 또는 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) Active Directory 도메인을domain
필드에 지정하세요.
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은 클러스터 내에서 로그인 규칙의 고유 이름입니다.
name: example
# expires는 선택 사항이며 배포된 로그인 규칙에는 일반적으로 설정하지 않아야 하지만,
# 새로운 로그인 규칙을 테스트할 때 빠른 시간 내에 만료 시간을 설정하는 것이 유용할 수 있습니다
# 잠재적으로 텔레포트 클러스터에서 자신을 잠그는 것을 방지합니다.
# expires: "2023-01-31T00:00:00-00:00"
spec:
# priority는 클러스터 내에서 여러 로그인 규칙의 평가 순서를 정하는 데 사용될 수 있습니다.
#
# 우선순위 번호가 낮은 로그인 규칙이 먼저 적용되며, 그 다음은 우선순위가 증가하는 순서로 적용됩니다.
# 동점의 경우, 동일한 우선순위를 가진 로그인 규칙은 이름의 사전 정렬로 정렬됩니다.
#
# 기본값은 0이며, 지원되는 범위는 -2147483648에서 2147483647까지
# (포함)입니다.
priority: 0
# 설정된 경우, traits_map은 클러스터에 로그인하는 모든 사용자의 특성을 결정합니다.
#
# 이것은 YAML 맵으로, 키는 최종 특성 키가 될 정적 문자열이어야 하며,
# 값은 각각 문자열 집합으로 평가해야 하는 여러 프레디케이트 표현식 목록입니다.
# 최종 특성은 해당 특성 키의 모든 프레디케이트 표현식의 결과 문자열 집합의 합집합으로 설정됩니다.
#
# traits_map은 원하는 특성의 전체 집합을 포함해야 합니다. 여기서 찾을 수 없는 외부
# 특성은 사용자의 인증서에 포함되지 않습니다.
#
# traits_map 또는 traits_expression 중 하나는 반드시 설정되어야 합니다.
traits_map:
groups:
- external.groups
logins:
- strings.lower(external.username)
# traits_expression은 단일 프레디케이트 표현식을 보유하는 문자열로, 이는 dict로 평가되어야 합니다.
# 이것은 로그인 중 모든 사용자의 특성을 설정합니다.
#
# traits_map 또는 traits_expression 중 하나는 반드시 설정되어야 합니다.
traits_expression: |
external.put("logins", strings.lower(external.logins))
데이터베이스 객체 가져오기 규칙
데이터베이스 객체 가져오기 규칙은 텔레포트에 가져온 데이터베이스 객체에 적용될 레이블을 정의합니다.
자세한 내용은 데이터베이스 접근 제어를 참조하세요.
kind: db_object_import_rule
metadata:
name: my_custom_rule
spec:
# Priority determines how important the rule is, with lower number indicating lower priority.
# In case of conflicts, when the same label is applied by two rules,
# the label applied by rule with higher priority wins.
priority: 123
# database_labels is a filter specifying which database resources are in scope of this rule.
database_labels:
- name: 'env'
values:
- 'test'
- 'staging'
- name: 'dept'
values:
- '*'
# Each mapping, if matched, introduces a set of labels applied to database object.
# Database objects without labels are not imported.
mappings:
- add_labels:
# the following properties are supported; 'obj' stands for 'database object'.
database: '{{obj.database}}'
object_kind: '{{obj.object_kind}}'
name: '{{obj.name}}'
protocol: '{{obj.protocol}}'
schema: '{{obj.schema}}'
database_service_name: '{{obj.database_service_name}}'
# you may use fixed strings or mix with templates
fixed: const_value
template: 'foo-{{obj.name}}'
# match adds objects to be imported; it cannot be empty.
match:
# list of all table names
table_names:
- 'fixed_table_name'
- 'partial_wildcard_*'
# scope reduces scope of import; it may be empty.
scope:
database_names:
- Widget*
schema_names:
- public
- secret
# Additional mappings can be added here.
- add_labels:
confidential: true
match:
table_names:
- '*'
scope:
schema_names:
- secret
version: v1
장치
장치는 신뢰할 수 있는 장치를 식별하는 정보를 포함합니다.
kind: device
version: v1
metadata:
# name은 클러스터에서 장치에 대한 고유한 무작위 식별자입니다.
name: 5ff09619-527c-4a17-973f-cd9cd5c93990
spec:
# asset_tag는 사용자가 제어하는 장치에 대한 식별자입니다. 이는 일반적으로 장치 일련 번호입니다.
asset_tag: HD6M74XNCK
# collected_data는 장치에서 최근 수집된 데이터의 목록입니다.
# 각 목록 항목은 이벤트 및 장치 메타데이터를 포함하는 객체입니다.
collected_data:
# collect_time은 데이터가 수집된 시점의 장치 기록 타임스탬프입니다.
- collect_time: "2023-02-22T21:04:26.312862Z"
# os_type은 장치의 운영 체제 유형입니다.
os_type: macos
# record_time은 데이터가 수신된 시점의 Teleport 기록 타임스탬프입니다.
record_time: "2023-02-22T21:04:26.396471Z"
# serial_number는 장치의 일련 번호이며, 일반적으로 asset_tag와 일치합니다.
serial_number: HD6M74XNCK
# create_time은 장치가 생성되어 Teleport에 등록된 시점의 타임스탬프입니다.
create_time: "2023-02-22T21:04:20.87721Z"
# update_time은 장치가 마지막으로 업데이트된 시점의 타임스탬프입니다.
update_time: "2023-02-22T21:04:26.396471Z"
# os_type은 장치의 운영 체제 유형입니다.
# 이는 "linux", "windows" 또는 "macos" 중 하나여야 합니다.
os_type: macos
# credential은 장치가 Teleport에 인증하기 위해 사용하는 장치 자격 증명입니다.
credential:
# id는 자격 증명의 고유 식별자입니다.
id: ebe41e2b-5dbb-40a0-82fb-cded7d3373dd
# public_key_der는 진위를 검증하는 데 사용되는 비대칭 키 쌍의 base64 인코딩된 DER 형식의 공개 키 부분입니다.
public_key_der: MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEhO73Q5+DWIg9nXFc/Nv38cI9iog9nnlwDmdtZXBtRNc6P0WajDG3cWn3NWttkHTKDSxywOOmupliKA8q1VxvfQ==
# enroll_status는 장치의 현재 등록 상태입니다.
# 이는 "enrolled", "not_enrolled" 또는 "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: 클러스터_유지보수_구성
spec:
agent_upgrades:
# 유지보수 창 시작 시간 (UTC).
# 유지보수 창은 1시간 지속됩니다.
utc_start_hour: 2
# 유지보수가 허용되는 요일
# 가능한 값은:
# - 짧은 이름: Sun, Mon, Tue, Wed, Thu, Fri, Sat
# - 긴 이름: Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday
weekdays:
- 월요일
- 수요일
- 금요일
클러스터 인증 기본 설정
인증을 위한 클러스터의 전역 구성 옵션입니다.
metadata:
name: cluster-auth-preference
spec:
# 사용할 두 번째 요소의 유형을 설정합니다.
# 가능한 값: "on", "otp" 및 "webauthn"
# "on"이 설정된 경우 모든 MFA 프로토콜이 지원됩니다.
second_factor: "otp"
# OIDC 또는 SAML 커넥터의 이름입니다. 설정되지 않으면 백엔드의 첫 번째 커넥터가 사용됩니다.
connector_name: ""
# webauthn은 서버 측 Web 인증 지원에 대한 설정입니다.
webauthn:
# rp_id는 Relying Party의 ID입니다.
# 텔레포트 설치의 도메인 이름으로 설정해야 합니다.
#
# 중요: 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을 필요로 합니다.
# webauthn이 구성된 경우 기본값은 true입니다.
allow_headless: false
# 다른 인증 유형과 함께 로컬 인증이 활성화될지 설정합니다.
allow_local_auth: true
# 비밀번호 없는 인증이 허용될지 설정합니다.
# 작동하려면 Webauthn이 필요합니다.
allow_passwordless: false
# 클러스터의 하루 메시지를 설정합니다.
message_of_the_day: ""
# idp는 텔레포트 내에서 IdPs에 접근하는 것과 관련된 옵션 집합입니다. 텔레포트 엔터프라이즈가 필요합니다.
idp:
# 텔레포트 SAML IdP에 대한 접근을 활성화합니다.
saml:
# 텔레포트 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: 봇
version: v1
metadata:
# 이름은 클러스터에서 봇의 고유 식별자입니다.
name: 로봇
spec:
# 역할은 봇이 자격 증명을 생성할 수 있는 역할 목록입니다.
roles:
- 편집자
# 특성은 봇 사용자에게 적용되는 특성을 제어합니다. 이러한 특성은
# 역할 템플릿 시스템에 제공되며, 새로운 역할을 생성하지 않고
# 특정 봇에 특정 리소스에 대한 액세스를 부여하는 데 사용할 수 있습니다.
traits:
- name: 로그인
values:
- 루트