Infograb logo
텔레포트 사용자 가장

때때로 사용자는 비대화형 사용자를 위한 단기 인증서를 생성해야 할 필요가 있습니다. 예를 들어, CI/CD 시스템을 위한 것입니다. 텔레포트와 상호작용하는 프로그램은 자체 인증을 생성해야 할 수도 있습니다. 텔레포트의 가장 기능은 사용자와 로봇이 다른 사용자 및 역할을 위해 단기 인증서를 생성할 수 있게 해줍니다.

대화형 사용자 앨리스가 비대화형 CI/CD 사용자 젠킨스와 보안 스캐너를 위한 자격 증명을 생성하는 방법을 살펴보겠습니다.

필수 조건

  • 실행 중인 Teleport 클러스터 버전 이상. Teleport를 시작하려면, 가입하기 위해 무료 평가판에 등록하거나 데모 환경 설정하기를 참조하세요.

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

    tctltsh 다운로드에 대한 지침은 설치를 방문하세요.

  • 당신의 Teleport 클러스터에 연결할 수 있는지 확인하려면, tsh login으로 로그인한 다음 현재 자격 증명을 사용하여 tctl 명령어를 실행할 수 있는지 확인하십시오. 예를 들어:
    tsh login --proxy=teleport.example.com --user=email@example.com
    tctl status

    클러스터 teleport.example.com

    버전 16.2.0

    CA 핀 sha256:abdc1245efgh5678abdc1245efgh5678abdc1245efgh5678abdc1245efgh5678

    클러스터에 연결하고 tctl status 명령어를 실행할 수 있다면, 현재 자격 증명을 사용하여 작업대에서 후속 tctl 명령어를 실행할 수 있습니다. 자신의 Teleport 클러스터를 호스팅하는 경우, Teleport 인증 서비스를 호스팅하는 컴퓨터에서 전체 권한으로 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 섹션은 이 역할의 사용자에게 허용되는 리소스/동작 조합 목록을 선언합니다.
  # 기본적으로 아무 것도 허용되지 않습니다.
  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 섹션은 이 역할의 사용자에게 허용되는 리소스/동작 조합 목록을 선언합니다.
  # 기본적으로 아무 것도 허용되지 않습니다.
  allow:
    impersonate:
      users: ['jenkins']
      roles: ['jenkins']

  # deny 섹션은 'allow' 섹션과 동일한 형식을 사용합니다.
  # 거부 규칙은 항상 허용 규칙을 덮어씁니다.
  deny:
    node_labels:
      '*': '*'

role 리소스를 생성합니다:

tctl create -f impersonator.yaml

이제 앨리스를 만든 다음, impersonator 역할을 할당하여 앨리스가 jenkins를 가장할 수 있도록 합니다.

접근 역할

우리는 또한 사용자가 클러스터에 접근할 수 있도록 해주는 사전 설정된 access 역할을 앨리스에게 할당합니다.

tctl users add alice --roles=impersonator,access

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

앨리스는 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

앨리스가 키를 사용하는 방법의 예는 다음과 같습니다:

이 세션을 위한 새 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는 가장된 사용자가 제한된 범위의 인증서로 인증서를 갱신할 수 있도록 허용합니다.

동적 가장

때때로 시스템에 의해 생성될 역할을 미리 모르기 때문에, 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")

  # deny 섹션은 'allow' 섹션과 동일한 형식을 사용합니다.
  # 거부 규칙은 항상 허용 규칙을 덮어씁니다.
  deny:
    node_labels:
      '*': '*'

리소스를 생성합니다:

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"])

  # deny 섹션은 'allow' 섹션과 동일한 형식을 사용합니다.
  # 거부 규칙은 항상 허용 규칙을 덮어씁니다.
  deny:
    node_labels:
      '*': '*'

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

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"]로컬 또는 SSO 사용자에서 'group' 특성이 포함된 특성 목록, 'group' 특성은 일반적으로 외부 ID 공급자에서 가져옵니다
impersonate_role.metadata.labels["<label key>"]가장할 역할에서 레이블에 부여된 레이블 값
impersonate_user.metadata.labels["<label key>"]가장할 사용자에서 레이블에 부여된 레이블 값

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

Teleport 원문 보기