Infograb logo
서버에 대한 접근 제어

Teleport의 역할 기반 접근 제어 (RBAC) 시스템을 사용하여 Teleport에 연결된 Linux 서버에 대한 세분화된 권한을 설정할 수 있습니다.

정책의 예는 서버 관리자는 모든 것에 접근할 수 있으며, 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의 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 environmentsallowedlogins 주장으로부터 허용된 서버 환경 유형 및 허용된 로그인을 할당하려는 경우 역할이 다음과 같이 보일 수 있습니다:

spec:
  allow:
    node_labels:
      - env: "{{external.environments}}"
    logins:
      - "{{external.allowedlogins}}"

{{internal.logins}} 변수는 로컬 사용자에게 적용되며 Teleport 신뢰 클러스터와 함께 작동합니다. 신뢰할 수 있는 클러스터는 초기 Teleport 클러스터에서 다른 Teleport 클러스터에 연결하는 것을 허용합니다. 그러한 Teleport 클러스터는 리프 클러스터로 식별되며, 루트 Teleport 클러스터를 신뢰함으로써 연결을 허용합니다.

예를 들어, 루트 클러스터의 사용자가 다음과 같은 역할을 가진다고 가정합니다. 로컬 사용자로서 jeff 라는 logins 특성을 가질 수 있으므로 두 개의 로그인, jeffubuntu 를 가집니다.

spec:
  allow:
    logins: ["{{internal.logins}}", ubuntu]

리프 클러스터의 역할은 사용자가 허용된 서버 계정 및 이름을 사용할 수 있도록 설정할 수 있습니다. 그런 다음, 리프 클러스터는 {{internal.logins}} 템플릿 변수를 사용할 때 루트 클러스터에서 허용된 동일한 로그인을 포함합니다.

spec:
  allow:
    logins: ["{{internal.logins}}"]

Teleport 역할에서 변수 확장이 어떻게 작동하는지에 대한 전체 내용은 Teleport Access Controls Reference를 참조하십시오.

서버 역할 옵션

위에서 설명한 allowdeny 섹션은 허용된 서버와 로그인 제어에 사용됩니다. 역할 옵션은 지정된 역할을 가진 사용자에게 제공되는 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은 사용자가 프록시를 통해 openssh
    # 클라이언트 및 서버와 함께 X11 포워딩을 사용할 수 있도록 허용합니다.
    permit_x11_forwarding: true
    # 엔터프라이즈 전용 max_connections 필드는 클러스터 내에서
    # 동시 세션의 한계를 설정합니다. 이 설정은 Teleport 성능을 저하시킵니다.
    # 클러스터 전체에서 연결을 추적해야 하기 때문입니다.
    max_connections: 2
    # Teleport가 세션 기록 실패(예: 디스크 오류)에 대해 어떻게 처리하는지를 정의합니다.
    # 설정할 수 있는 값은 `best_effort` 또는 `strict` 입니다. `strict` 로 설정하면
    # 세션이 즉시 종료됩니다. `best_effort` 로 설정하면 세션이 종료되지 않으며
    # 기록이 비활성화됩니다. 이 구성은 서비스별로 수행됩니다 (현재 `ssh` 만 지원됨).
    record_session:
      # 선택 사항: 프로토콜별 모드가 설정되지 않았을 때 사용할
      # 기본 세션 기록 모드입니다.
      default: best_effort|strict
      # 선택 사항: SSH 세션에 대한 세션 기록 모드입니다.
      # 설정되지 않은 경우, 기본적으로 설정된 값이 사용됩니다.
      ssh: best_effort|strict
    # 새로운 세션을 시작하기 위해 추가적인 MFA 탭을 요구합니다.
    # 선택 사항: 기본값은 false입니다.
    require_session_mfa: true
    # 엔터프라이즈 전용: 활성화되면 로그인에 사용된 원본 IP가 사용자
    # 인증서에 삽입되어 손상된 인증서가 다른 네트워크에서 사용되는 것을 방지합니다.
    # 기본값은 false입니다.
    pin_source_ip: true
    # 사용자 SSH 키에 포함될 이름과 연관된 값을 지정합니다.
    # 키 유형은 "ssh"만 가능하고 모드는 "extension"만 가능합니다.
    # 이름 및 값 필드는 임의의 문자열일 수 있으며 값 필드는
    # 변수 인터폴레이션을 지원합니다.
    cert_extensions:
      - type: ssh
        mode: extension
        name: login@github.com
        value: "{{ external.github_login }}"
Teleport 원문 보기