Infograb logo
Teleport 사용자 가장

때때로 사용자는 비인터랙티브 사용자, 예를 들어 CI/CD 시스템을 위해 단기 인증서를 생성해야 할 필요가 있습니다. Teleport와 상호작용하는 프로그램은 자체 인증을 생성해야 할 필요가 있을 수도 있습니다. Teleport의 사용자 가장 기능을 통해 사용자는 다른 사용자와 역할을 위한 단기 인증서를 생성할 수 있습니다.

인터랙티브 사용자 Alice가 비인터랙티브 CI/CD 사용자 Jenkins와 보안 스캐너를 위한 자격 증명을 어떻게 생성할 수 있는지 알아보겠습니다.

사전 요구 사항

  • 실행 중인 Teleport 클러스터 버전 17.0.0-dev 이상. Teleport를 시작하려면 가입하여 무료 평가판을 이용하거나 데모 환경 설정 방법을 확인하십시오.

  • tctl 관리자 도구와 tsh 클라이언트 도구.

    tctltsh 다운로드 방법에 대한 지침은 설치를 방문하십시오.

  • 연결이 가능한지 확인하기 위해 tsh login 으로 로그인한 다음, 현재 자격 증명을 사용하여 tctl 명령어를 실행할 수 있는지 확인하십시오. 예를 들어:
    tsh login --proxy=teleport.example.com --user=email@example.com
    tctl status

    클러스터 teleport.example.com

    버전 17.0.0-dev

    CA 핀 sha256:abdc1245efgh5678abdc1245efgh5678abdc1245efgh5678abdc1245efgh5678

    클러스터에 연결할 수 있고 tctl status 명령어를 실행할 수 있다면, 현재 자격 증명을 사용하여 워크스테이션에서 후속 tctl 명령어를 실행할 수 있습니다.
    자신의 Teleport 클러스터를 호스팅하는 경우, Teleport Auth Service를 호스팅하는 컴퓨터에서 전체 권한으로 tctl 명령어를 실행할 수도 있습니다.

1/3단계: CI/CD 사용자 및 해당 역할 생성

먼저, jenkins 라는 역할을 생성하겠습니다. 이 역할에 발급된 인증서의 기간을 제한하는 max_session_ttl 매개 변수를 주목하세요. 일반적으로 TTL이 짧을수록 좋습니다.

또한 jenkins 라는 이름의 사용자를 생성하고 해당 역할을 사용자에게 할당합니다.

이 파일을 jenkins.yaml 로 저장하세요:

kind: role
version: v5
metadata:
  name: jenkins
spec:
  # 사용자 세션에 사용되는 SSH 옵션
  options:
    # max_session_ttl은 이 역할을 가진 사용자에게 발급된 SSH 인증서의
    # TTL(유효 기간)을 정의합니다.
    max_session_ttl: 240h

  # 허용 섹션은 이 역할의 사용자가 사용할 수 있는 리소스/동작 조합의 목록을
  # 선언합니다. 기본적으로 아무 것도 허용되지 않습니다.
  allow:
    logins: ["jenkins"]
    node_labels:
      "*": "*"
---
kind: user
version: v2
metadata:
  name: jenkins
spec:
  roles: ["jenkins"]

리소스를 생성합니다:

tctl create -f jenkins.yaml

2/3단계: 사용자 가장 역할 생성

다음으로, impersonator 라는 역할을 생성하겠습니다. 이 역할이 있는 사용자는 jenkins 사용자와 역할을 가장할 수 있습니다.

이 역할 정의를 impersonator.yaml 로 저장하세요:

kind: role
version: v5
metadata:
  name: impersonator
spec:
  # 사용자 세션에 사용되는 SSH 옵션
  options:
    # max_session_ttl은 이 역할을 가진 사용자에게 발급된 SSH 인증서의
    # TTL(유효 기간)을 정의합니다.
    max_session_ttl: 10h

  # 허용 섹션은 이 역할의 사용자가 사용할 수 있는 리소스/동작 조합의 목록을
  # 선언합니다. 기본적으로 아무 것도 허용되지 않습니다.
  allow:
    impersonate:
      users: ["jenkins"]
      roles: ["jenkins"]

role 리소스를 생성합니다:

tctl create -f impersonator.yaml

그 다음, alice 라는 인터랙티브 사용자와 사용자 가장 역할을 할당하여 alicejenkins 를 가장할 수 있도록 합니다.

접근 역할

또한, 사용자가 클러스터에 접근할 수 있도록 사전 설정된 access 역할을 할당합니다. Alice의 편의를 위해서입니다.

tctl users add alice --roles=impersonator,access

3/3단계: 사용자 가장을 사용하여 인증서 발급

Alice는 tsh 를 사용하여 로그인하고 jenkins 를 위한 인증서를 발급할 수 있습니다:

tsh login --proxy=proxy.example.com --user=alice --auth=local
tctl auth sign --user=jenkins --format=openssh --out=jenkins --ttl=240h
tsh login --proxy=mytenant.teleport.sh --user=alice --auth=local
tctl auth sign --user=jenkins --format=openssh --out=jenkins --ttl=240h

Alice가 키를 사용할 수 있는 예시는 다음과 같습니다:

이 세션을 위한 새로운 SSH 에이전트 시작

eval $(ssh-agent)

에이전트에 인증서 추가

ssh-add jenkins

jenkins로 노드에 SSH 접속

ssh -J jenkins@teleport.localhost:3023 -p 3022 jenkins@127.0.0.1
감사

Teleport의 session.start 이벤트는 jenkins 를 가장하는 alice 가 수행한 작업을 캡처합니다. session.start event:session.start impersonator:alice login:jenkins user:jenkins jenkins 에 대해 발급된 SSH 인증서에는 가장하는 사람인 alice 에 대한 정보가 포함되어 있습니다.

고급

임시 대리 규칙

예기치 않은 결과를 방지하기 위해, Teleport는 다음과 같은 임시 대리 규칙을 정의합니다:

  • 비록 앨리스의 max_session_ttl 이 10시간이지만, jenkins 역할이 허용되기 때문에 240시간의 더 긴 TTL을 가진 인증서를 발급할 수 있습니다. 임시 대리를 통해 발급된 인증서의 TTL은 임시 대리하는 역할의 최대 TTL로 연장됩니다.
  • jenkins 역할이 다른 일부 역할을 임시 대리할 수 있다고 해도, 앨리스는 이 권한을 사용할 수 없습니다. Teleport는 재귀적 임시 대리를 방지합니다.
  • 앨리스는 동일한 TTL을 가진 새로운 jenkins 인증서를 가져올 수 있지만, 메타데이터가 업데이트되어야 하며, 예를 들어 다른 Teleport 리프 클러스터를 가리키도록 변경될 수 있습니다. Teleport는 임시 대리된 사용자가 인증서를 더 제한된 범위로 갱신할 수 있도록 허용합니다.

동적 임시 대리

가끔 시스템에서 어떤 역할이 생성될지 미리 알 수 없는 경우가 있습니다.

where 조건을 사용하여 한 역할이 레이블이 일치하는 다른 역할을 임시 대리할 수 있도록 허용할 수 있습니다.

예를 들어, group: security 레이블이 있는 모든 사용자 또는 역할을 임시 대리할 수 있는 security-impersonator 역할을 정의하고 싶다고 가정해 보겠습니다. 다음 역할 정의로 이를 달성할 수 있습니다:

kind: role
version: v5
metadata:
  name: security-impersonator
spec:
  options:
    max_session_ttl: 10h

  # security-impersonator는 'group: security' 레이블이 있는 모든 사용자 또는 역할을 임시 대리할 수 있습니다.
  allow:
    impersonate:
      users: ["*"]
      roles: ["*"]
      where: >
        equals(impersonate_role.metadata.labels["group"], "security") && 
        equals(impersonate_user.metadata.labels["group"], "security")

리소스를 생성합니다:

tctl create -f security-impersonator.yaml
tctl users update alice --set-roles=security-impersonator,access

이제 앨리스는 group: security 레이블이 있는 모든 역할과 사용자를 임시 대리할 수 있습니다.

이제 보안 스캐닝 도구를 위한 다른 머신 사용자를 생성해야 한다고 가정해 보겠습니다. 다음 템플릿을 사용하여 사용자와 역할 security-scanner 를 생성합니다:

kind: role
version: v5
metadata:
  name: security-scanner
  labels:
    group: security
spec:
  options:
    max_session_ttl: 10h

  allow:
    logins: ["root"]
    node_labels:
      "*": "*"
---
kind: user
version: v2
metadata:
  name: security-scanner
  labels:
    group: security
spec:
  roles: ["security-scanner"]

비록 이 역할이 앨리스의 사용자가 구성된 후에 생성되었지만, group: security 레이블이 붙어 있기 때문에 앨리스는 security-scanner 사용자에 대해 인증서를 발급할 수 있습니다.

tctl auth sign --user=security-scanner --format=openssh --out=security-scanner --ttl=10h

사용자 특성 일치

사용자 특성과 일치하여 임시 대리 규칙을 정의할 수도 있습니다.

여기서 우리는 security-impersonator 역할을 업데이트하여 임시 대리할 사용자 또는 역할의 레이블과 같은 값을 포함하는 group 사용자 특성을 가진 모든 다른 사용자 또는 역할을 임시 대리할 수 있도록 허용했습니다:

kind: role
version: v5
metadata:
  name: security-impersonator
spec:
  options:
    max_session_ttl: 10h

  allow:
    impersonate:
      users: ["*"]
      roles: ["*"]
      where: >
        contains(user.spec.traits["group"], impersonate_role.metadata.labels["group"]) && 
        contains(user.spec.traits["group"], impersonate_user.metadata.labels["group"])

사용자 특성은 일반적으로 외부 ID 공급자로부터 오지만, 우리는 앨리스의 계정을 수동으로 업데이트하여 로컬 사용자 alice 로 테스트할 수 있습니다.

kind: user
version: v2
metadata:
  name: alice
spec:
  traits:
    group: ["security", "devops"]
  roles:
    - security-impersonator
    - access

앨리스의 group 특성이 security 를 포함하고, security-scanner 사용자가 group: security 레이블을 가지므로, 앨리스는 보안 스캐너를 임시 대리할 수 있습니다.

앨리스는 새로 업데이트된 특성을 얻기 위해 다시 로그인해야 합니다:

앨리스가 다시 로그인하면 업데이트된 역할로 새로운 인증서를 받게 됩니다.

tsh login --proxy=teleport.example.com --user=alice --auth=local

앨리스는 이제 보안 스캐너를 위한 인증서를 받을 수 있습니다.

tctl auth sign --user=security-scanner --format=openssh --out=security-scanner --ttl=10h

앨리스가 다시 로그인하면 업데이트된 역할로 새로운 인증서를 받게 됩니다.

tsh login --proxy=mytenant.teleport.sh --user=alice --auth=local

앨리스는 이제 보안 스캐너를 위한 인증서를 받을 수 있습니다.

tctl auth sign --user=security-scanner --format=openssh --out=security-scanner --ttl=10h

필터 필드

이 가이드 내의 where 조건에 사용되는 필드에 대한 설명입니다.

필드설명
user.spec.traits["group"]group 특성이 일반적으로 외부 ID 제공자에서 오는 로컬 또는 SSO 사용자로부터의 특성 목록입니다.
impersonate_role.metadata.labels["<label key>"]역할을 가장할 때 주어진 레이블 key 의 레이블 값입니다.
impersonate_user.metadata.labels["<label key>"]사용자를 가장할 때 주어진 레이블 key 의 레이블 값입니다.

더 자세한 언어 설명은 우리의 프레디케이트 언어 가이드를 확인하세요.

Teleport 원문 보기