인포레터에서 최신 DevOps 트렌드를 격주로 만나보세요!
Teleport 사용자 가장
때때로 사용자는 비인터랙티브 사용자, 예를 들어 CI/CD 시스템을 위해 단기 인증서를 생성해야 할 필요가 있습니다. Teleport와 상호작용하는 프로그램은 자체 인증을 생성해야 할 필요가 있을 수도 있습니다. Teleport의 사용자 가장 기능을 통해 사용자는 다른 사용자와 역할을 위한 단기 인증서를 생성할 수 있습니다.
인터랙티브 사용자 Alice가 비인터랙티브 CI/CD 사용자 Jenkins와 보안 스캐너를 위한 자격 증명을 어떻게 생성할 수 있는지 알아보겠습니다.
사전 요구 사항
-
실행 중인 Teleport 클러스터 버전 17.0.0-dev 이상. Teleport를 시작하려면 가입하여 무료 평가판을 이용하거나 데모 환경 설정 방법을 확인하십시오.
-
tctl
관리자 도구와tsh
클라이언트 도구.tctl
및tsh
다운로드 방법에 대한 지침은 설치를 방문하십시오.
- 연결이 가능한지 확인하기 위해
tsh login
으로 로그인한 다음, 현재 자격 증명을 사용하여tctl
명령어를 실행할 수 있는지 확인하십시오. 예를 들어:클러스터에 연결할 수 있고tsh login --proxy=teleport.example.com --user=email@example.comtctl 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
라는 인터랙티브 사용자와 사용자 가장 역할을 할당하여 alice
가 jenkins
를 가장할 수 있도록 합니다.
접근 역할
또한, 사용자가 클러스터에 접근할 수 있도록 사전 설정된 access
역할을
할당합니다. Alice의 편의를 위해서입니다.
tctl users add alice --roles=impersonator,access
3/3단계: 사용자 가장을 사용하여 인증서 발급
Alice는 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
Alice가 키를 사용할 수 있는 예시는 다음과 같습니다:
이 세션을 위한 새로운 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 리프 클러스터를 가리키도록 변경될 수 있습니다. 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.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"])
사용자 특성은 일반적으로 외부 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 의 레이블 값입니다. |
더 자세한 언어 설명은 우리의 프레디케이트 언어 가이드를 확인하세요.