Teleport의 역할 기반 접근 제어(RBAC) 시스템을 사용하여 Teleport에 연결된 리눅스 서버에 대한 세분화된 권한을 설정할 수 있습니다.
정책의 예는 *서버 관리자는 모든 것에 접근할 수 있고, QA 팀과 엔지니어는 스테이징 서버에 대한 전체 접근 권한을 가지며, 엔지니어는 비상시에 프로덕션 서버에 임시 접근할 수 있습니다.*입니다.
Teleport 역할 및 예제에 대한 보다 일반적인 설명은 Access Controls guides를 참조하세요. 이 섹션은 Teleport에 연결된 서버에 대한 RBAC 구성을 중점적으로 다루고 있습니다.
역할 구성
Teleport의 "role" 리소스는 서버 접근을 제한하기 위한 다음 도구를 제공합니다:
kind: role
version: v5
metadata:
name: developer
spec:
allow:
# logins 배열은 사용자가 허용되는 OS/UNIX 로그인 정의합니다.
# 이 필드에서는 문자열과 템플릿 변수가 모두 지원됩니다.
logins: [ubuntu, debian, '{{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)
# 위의 목록 예제는 다음과 같이 표현할 수 있습니다:
'reg': '^us-west-1|eu-central-1$'
# 생성된 사용자가 추가될 호스트 그룹 목록입니다. 존재하지 않는 모든 그룹이
# 생성됩니다. create_host_user_mode가 'off'가 아닌 경우에만 적용됩니다.
host_groups: [ubuntu, nginx, other]
# 사용자를 sudoers 그룹에 할당합니다.
host_sudoers:
- 'ALL=(ALL) NOPASSWD: ALL'
# root 사용자 접근을 거부합니다.
deny:
logins:
- root
거부 규칙은 탐욕적으로 일치합니다. 위의 예에서, "root" 서버 사용자 계정을 사용하려는 서버 세션은 거부됩니다.
템플릿 변수
Teleport의 다른 리소스 접근을 위한 역할 필드와 비슷하게, 서버와 관련된 필드는 템플릿 변수를 지원합니다.
{{external.xyz}}
형식의 변수는 외부 SSO
제공자로부터 값을 가져와 교체됩니다. OIDC 로그인의 경우, {{external.xyz}}
는 "xyz" 클레임을 의미하고,
SAML 로그인의 경우 {{external.xyz}}
는 "xyz" 어설션을 의미합니다.
예를 들어, 허용된 서버 환경 유형과 사용자의 Okta environments
및
allowedlogins
어설션에서 허용된 로그인을 할당하고자 할 때 역할은 다음과 같을 수 있습니다:
spec:
allow:
node_labels:
- env: '{{external.environments}}'
logins:
- '{{external.allowedlogins}}'
{{internal.logins}}
변수는 로컬 사용자에게 적용되며
Teleport 신뢰 클러스터와 함께 작동합니다. 신뢰 클러스터는 루트 Teleport 클러스터에서
다른 Teleport 클러스터에 연결할 수 있도록 허용합니다.
이들 Teleport 클러스터는 리프 클러스터로 식별되며, 루트 Teleport 클러스터를 신뢰하여 연결을 허용합니다.
예를 들어, 루트 클러스터의 사용자가 다음 역할을 가질 경우,
로컬 사용자로서 jeff
로그인 특성을 가질 수 있으므로 두 개의 로그인을 가지게 됩니다:
jeff
와 ubuntu
.
spec:
allow:
logins: ['{{internal.logins}}', ubuntu]
리프 클러스터의 역할은 사용자의 허용된 서버 계정 및 이름을 사용하도록 설정할 수 있습니다.
리프 클러스터는 {{internal.logins}}
템플릿 변수가 사용될 때 루트 클러스터에서 허용된 로그인을 포함합니다.
spec:
allow:
logins: ["{{internal.logins}}"]
Teleport 역할의 변수 확장 작동 방식에 대한 전체 세부정보는 Teleport Access Controls Reference를 참조하세요.
서버 역할 옵션
위에서 설명한 allow
및 deny
섹션은 허용된 서버와 로그인을 제어하는 데 사용됩니다.
역할 옵션은 지정된 역할을 가진 사용자가 사용할 수 있는 Teleport 기능을 제공합니다.
이러한 옵션은 서버 접근에 적용됩니다.
spec:
allow:
#....
options:
# 이 역할이 사용자의 자동 프로비저닝을 지원하는지 제어합니다.
# 옵션: keep (세션 종료 시 사용자 유지), insecure-drop (세션 종료 시 사용자 제거),
# 및 off (호스트 사용자 생성 비활성화)
create_host_user_mode: keep
# 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은 사용자가 오프너 SSH 클라이언트와
# 서버를 통해 X11 포워딩을 사용할 수 있도록 허용합니다.
permit_x11_forwarding: true
# Enterprise 전용 max_connections 필드는 클러스터 내에서의 동시 세션 수를 제한합니다.
# 이 설정은 Teleport 성능을 저하시킬 수 있습니다.
max_connections: 2
# 세션 기록 실패(예: 디스크 오류) 발생 시 Teleport의 처리 방식 정의합니다.
# 값은 `best_effort` 또는 `strict`로 설정할 수 있습니다.
# `strict`로 설정된 경우 세션이 즉시 종료됩니다. `best_effort`로 설정하면 세션은 종료되지 않으며 기록이 비활성화됩니다.
record_session:
# 선택 사항: 프로토콜별 모드가 설정되지 않을 때 사용할 기본 세션 기록 모드입니다.
default: best_effort|strict
# 선택 사항: SSH 세션에 대한 세션 기록 모드입니다.
# 설정하지 않으면 기본 설정된 값을 사용합니다.
ssh: best_effort|strict
# 새로운 세션을 시작하기 위해 추가 MFA 탭이 필요합니다.
# 선택 사항: 기본값은 false입니다.
require_session_mfa: true
# Enterprise 전용: 활성화 시 로그인에 사용된 소스 IP가 사용자
# 인증서에 포함되어, 손상된 인증서가 다른 네트워크에서 사용되는 것을 방지합니다. 기본값은 false입니다.
pin_source_ip: true
# 사용자 SSH 키에 포함될 이름 및 관련 값 목록을 지정합니다.
# 키 유형은 "ssh"만 가능하고 모드는 "extension"만 가능합니다.
# 이름과 값 필드는 임의의 문자열로 설정할 수 있으며 값 필드는
# 변수 보간을 지원합니다.
cert_extensions:
- type: ssh
mode: extension
name: login@github.com
value: "{{ external.github_login }}"