때때로 사용자는 비대화형 사용자를 위한 단기 인증서를 생성해야 할 필요가 있습니다. 예를 들어, CI/CD 시스템을 위한 것입니다. 텔레포트와 상호작용하는 프로그램은 자체 인증을 생성해야 할 수도 있습니다. 텔레포트의 가장 기능은 사용자와 로봇이 다른 사용자 및 역할을 위해 단기 인증서를 생성할 수 있게 해줍니다.
대화형 사용자 앨리스가 비대화형 CI/CD 사용자 젠킨스와 보안 스캐너를 위한 자격 증명을 생성하는 방법을 살펴보겠습니다.
필수 조건
-
실행 중인 Teleport 클러스터 버전 이상. Teleport를 시작하려면, 가입하기 위해 무료 평가판에 등록하거나 데모 환경 설정하기를 참조하세요.
-
tctl
관리 도구와tsh
클라이언트 도구.tctl
과tsh
다운로드에 대한 지침은 설치를 방문하세요.
- 당신의 Teleport 클러스터에 연결할 수 있는지 확인하려면,
tsh login
으로 로그인한 다음 현재 자격 증명을 사용하여tctl
명령어를 실행할 수 있는지 확인하십시오. 예를 들어:클러스터에 연결하고tsh login --proxy=teleport.example.com --user=email@example.comtctl 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=localtctl auth sign --user=jenkins --format=openssh --out=jenkins --ttl=240h
tsh login --proxy=mytenant.teleport.sh --user=alice --auth=localtctl auth sign --user=jenkins --format=openssh --out=jenkins --ttl=240h
앨리스가 키를 사용하는 방법의 예는 다음과 같습니다:
이 세션을 위한 새 SSH 에이전트를 시작합니다
eval $(ssh-agent)인증서를 에이전트에 추가합니다
ssh-add jenkinsjenkins로 노드에 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.yamltctl 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>"] | 가장할 사용자에서 레이블에 부여된 레이블 값 |
자세한 설명은 우리의 프레디케이트 언어 가이드를 확인하세요.