서버 액세스 제어
Teleport의 역할 기반 접근 제어(RBAC) 시스템을 사용하여 Teleport에 연결된 Linux 서버에 대한 인증 권한을 세분화하여 설정할 수 있습니다. 정책의 예시로는, 서버 관리자는 모든 것에 접근할 수 있고, QA 팀과 엔지니어는 스테이징 서버에 대한 전체 접근 권한을 가지며, 엔지니어는 긴급 상황 시 프로덕션 서버에 대한 임시 접근 권한을 얻을 수 있다 와 같은 정책이 있습니다.
Teleport의 역할 기반 접근 제어(RBAC) 시스템을 사용하여 Teleport에 연결된 Linux 서버에 대한 인증 권한을 세분화하여 설정할 수 있습니다.
정책의 예시로는, 서버 관리자는 모든 것에 접근할 수 있고, QA 팀과 엔지니어는 스테이징 서버에 대한 전체 접근 권한을 가지며, 엔지니어는 긴급 상황 시 프로덕션 서버에 대한 임시 접근 권한을 얻을 수 있다 와 같은 정책이 있습니다.
Teleport 역할에 대한 일반적인 설명과 예시는 액세스 제어 가이드를 참조하세요. 이 섹션은 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의 regexp 문법을 사용합니다 (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 신뢰할 수 있는 클러스터(trusted clusters)와 함께 작동합니다. 신뢰할 수 있는 클러스터를 통해 루트 Teleport 클러스터에서 다른 Teleport 클러스터에 연결된 리소스로 연결할 수 있습니다. 리프 클러스터로 식별되는 해당 Teleport 클러스터는 루트 Teleport 클러스터를 신뢰함으로써 연결을 허용합니다.
예를 들어, 루트 클러스터의 사용자가 다음과 같은 역할을 가지고 있다고 가정합니다. 로컬 사용자로서 jeff라는 logins 트레이트를 가질 수 있으므로 jeff와 ubuntu 두 가지 로그인을 갖습니다.
spec:
allow:
logins: ['{{internal.logins}}', ubuntu]
리프 클러스터의 역할은 사용자의 허용된 서버 계정과 이름을 사용하도록 설정할 수 있습니다. {{internal.logins}} 템플릿 변수를 사용하면 리프 클러스터는 루트 클러스터에서 허용된 동일한 로그인을 포함합니다.
spec:
allow:
logins: ["{{internal.logins}}"]
Teleport 역할에서 변수 확장이 작동하는 방식에 대한 자세한 내용은 액세스 제어 레퍼런스를 참조하세요.
서버 역할 옵션#
위에서 설명한 allow 및 deny 섹션은 허용된 서버와 로그인을 제어하는 데 사용됩니다. 역할 옵션은 지정된 역할을 가진 사용자가 사용할 수 있는 Teleport 기능을 제공합니다. 이러한 옵션은 서버 액세스에 적용됩니다.
spec:
allow:
#....
options:
# 자동으로 프로비저닝된 SSH 사용자의 기본 셸을 설정합니다. 셸의 절대 경로 또는
# 시스템 PATH를 통해 접근 가능한 이름 모두 유효한 값입니다. create_host_user_mode가
# off로 설정되지 않은 경우에만 적용됩니다.
create_host_user_default_shell: bash
# 이 역할이 사용자 자동 프로비저닝을 지원하는지 여부를 제어합니다.
# 옵션: keep (세션 종료 시 사용자 유지), insecure-drop (세션 종료 시 사용자 제거),
# off (호스트 사용자 생성 비활성화)
create_host_user_mode: keep
# forward_agent는 SSH 에이전트 포워딩 허용 여부를 제어합니다
forward_agent: true
# ssh_port_forwarding은 SSH를 통해 허용되는 TCP 포트 포워딩 모드를 제어합니다. 이는
# 원격 및 로컬 포트 포워딩 모드를 구분하지 않았던 더 이상 사용되지 않는 port_forwarding
# 필드를 대체합니다. 레거시 port_forwarding 필드를 활성화하여 포워딩을 허용하는 기존
# 역할이 있는 경우 ssh_port_forwarding에 구성된 포워딩 제어가 무시됩니다.
ssh_port_forwarding:
# 원격 포트 포워딩 동작을 구성합니다
remote:
enabled: true
# 로컬 포트 포워딩 동작을 구성합니다
local:
enabled: 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: false
# max_sessions는 단일 연결을 통해 설정할 수 있는 세션 채널의 총 수입니다.
# 10으로 설정하면 OpenSSH 기본 동작과 일치합니다.
max_sessions: 10
# BPF 기반 세션 레코더가 기록하는 이벤트를 정의합니다.
enhanced_recording:
- command
- disk
- network
# permit_x11_forwarding은 사용자가 프록시를 통해 openssh 클라이언트 및
# 서버에서 X11 포워딩을 사용할 수 있도록 허용합니다
permit_x11_forwarding: true
# Enterprise 전용 max_connections 필드는 클러스터 내 동시 세션 수에 제한을 설정합니다.
# 이 설정은 클러스터 전체에서 연결을 추적해야 하므로 Teleport 성능을 저하시킵니다.
max_connections: 2
# 디스크 가득 참 오류와 같은 세션 녹화 실패를 Teleport가 처리하는 방법을 정의합니다.
# 값은 `best_effort` 또는 `strict`로 설정할 수 있습니다. `strict`로 설정하면
# 세션이 즉시 종료됩니다. `best_effort`로 설정하면 세션이 종료되지 않고 녹화가
# 비활성화됩니다. 구성은 서비스별로 수행됩니다(현재는 `ssh`만 지원).
record_session:
# 선택 사항: 프로토콜별 모드가 설정되지 않은 경우 사용할 기본 세션 녹화 모드.
default: best_effort|strict
# 선택 사항: SSH 세션에 대한 세션 녹화 모드.
# 설정하지 않으면 default에 설정된 값이 사용됩니다.
ssh: best_effort|strict
# 새 세션을 시작하려면 추가 MFA 탭이 필요합니다.
# 선택 사항: 기본값은 false입니다.
require_session_mfa: true
# Enterprise 전용: 활성화하면 로그인에 사용된 소스 IP가 사용자 인증서에 포함되어
# 손상된 인증서가 다른 네트워크에서 사용되는 것을 방지합니다.
# 기본값은 false입니다.
pin_source_ip: true
# 사용자 SSH 키에 포함될 이름 및 관련 값 목록을 지정합니다.
# 키 유형은 "ssh"만 가능하고 모드는 "extension"만 가능합니다.
# name 및 value 필드는 임의의 문자열이 될 수 있으며 value 필드는
# 변수 보간을 지원합니다.
cert_extensions:
- type: ssh
mode: extension
name: login@github.com
value: "{{ external.github_login }}"
