WorkloadIdentity 리소스
WorkloadIdentity 리소스는 워크로드에 발행할 수 있는 신원 자격 증명의 구조와 그것을 발행할 수 있는 워크로드에 대한 규칙을 정의하는 데 사용됩니다. Kubernetes 네임스페이스나 서비스 계정 이름과 같은 워크로드의 속성을 사용한 템플릿을 지원하며, 이를 통해 WorkloadIdentity 리소스를 여러 개별 워크로드에 범용적으로 사용할 수 있습니다.
WorkloadIdentity 리소스는 워크로드에 발행할 수 있는 신원 자격 증명의 구조와 그것을 발행할 수 있는 워크로드에 대한 규칙을 정의하는 데 사용됩니다.
Kubernetes 네임스페이스나 서비스 계정 이름과 같은 워크로드의 속성을 사용한 템플릿을 지원하며, 이를 통해 WorkloadIdentity 리소스를 여러 개별 워크로드에 범용적으로 사용할 수 있습니다.
구성#
kind: workload_identity
version: v1
metadata:
# WorkloadIdentity 리소스의 이름. 이 신원에 대한 자격 증명 발행을
# 직접 요청하는 데 사용할 수 있습니다.
name: my-workload
# 발행 요청 시 WorkloadIdentity 리소스를 그룹화하고 필터링하는 데
# 사용할 수 있는 키-값 레이블.
labels:
example: foo
spec:
# SPIFFE 호환 워크로드 신원 자격 증명 발행에 관련된 구성.
spiffe:
# 이 신원에 대해 발행되는 자격 증명에 포함될 SPIFFE ID의
# 경로 요소.
#
# 슬래시(`/`)로 시작해야 합니다.
#
# 필수. 템플릿을 지원합니다.
id: /foo/bar/{{ join.kubernetes.pod.name }}/{{ join.kubernetes.service_account.name }}
# hint 필드는 이 신원에 대해 발행된 자격 증명과 함께 워크로드에
# 문자열을 전달할 수 있게 합니다. 워크로드가 가질 수 있는 여러
# 신원을 구별하는 데 사용할 수 있습니다(예: `internal` vs `external`).
#
# 선택 사항. 템플릿을 지원합니다.
hint: An example hint
# X.509 자격 증명에 대한 그룹화된 구성.
x509:
# 이 WorkloadIdentity를 사용하여 발행된 X509-SVID에 포함되어야 할
# DNS 주체 대체 이름(SAN).
#
# 이 목록의 각 개별 요소는 템플릿을 지원하며, 템플릿 적용 후
# 유효한 DNS 이름이어야 합니다.
#
# 선택 사항. 제공되지 않으면 X.509 자격 증명에 DNS SAN이
# 포함되지 않습니다.
dns_sans:
- example.com
# 이 신원을 사용하여 발행된 X509 워크로드 신원 자격 증명의
# 주체 식별 이름을 제어합니다. 지정하지 않으면 빈 주체가
# 사용됩니다.
#
# 대부분의 경우 URI SAN에 인코딩된 SPIFFE ID를 사용하는 것이
# 권장됩니다. 그러나 X.509에 맞게 설계되었지만 SPIFFE/WIMSE는
# 지원하지 않는 레거시 시스템을 지원하기 위해 Subject DN이
# 필요할 수 있습니다.
subject_template:
# 주체 식별 이름의 일반 이름(CN - 2.5.4.3).
# 템플릿을 지원합니다. 제공되지 않으면 일반 이름이 생략됩니다.
common_name: my-common-name
# 주체 식별 이름의 조직(O - 2.5.4.10).
# 템플릿을 지원합니다. 제공되지 않으면 조직이 생략됩니다.
organization: my-organization
# 주체 식별 이름의 조직 단위(OU - 2.5.4.11).
# 템플릿을 지원합니다. 제공되지 않으면 조직 단위가 생략됩니다.
organizational_unit: my-organizational-unit
# 이 WorkloadIdentity를 사용하여 발행된 X509-SVID의 최대 TTL을
# 제어합니다. 's' 접미사와 함께 초 단위로 지정합니다.
#
# 이 값보다 큰 TTL로 X509-SVID가 요청되면, 반환되는 X509-SVID는
# 이 값의 TTL을 갖습니다.
#
# 기본값은 24시간(86400s)입니다. 최대값은 14일(1209600s)입니다.
maximum_ttl: 3600s
# JWT 자격 증명에 대한 그룹화된 구성.
jwt:
# JWT-SVID에 추가될 선택적 추가 클레임. 하위 객체나 배열의
# 문자열 값을 포함한 모든 문자열 값이 템플릿을 지원하는
# 임의 객체입니다.
extra_claims:
message: "Hello, {{strings.upper(user.name)}}!"
foo:
bar: ["baz", 1234, "{{user.bot_instance_id}}", true]
# 이 WorkloadIdentity를 사용하여 발행된 JWT-SVID의 최대 TTL을
# 제어합니다. 's' 접미사와 함께 초 단위로 지정합니다.
#
# 이 값보다 큰 TTL로 JWT-SVID가 요청되면, 반환되는 JWT-SVID는
# 이 값의 TTL을 갖습니다.
#
# 기본값은 24시간(86400s)입니다. 최대값은 24시간(86400s)입니다.
maximum_ttl: 300s
# 규칙은 이 WorkloadIdentity가 자격 증명 발행에 사용될 수 있는
# 시점을 제어합니다.
rules:
# allow 규칙이 지정된 경우, WorkloadIdentity가 자격 증명 발행에
# 사용되려면 최소 하나가 통과해야 합니다. 이는 규칙 간에 OR 관계를
# 효과적으로 생성합니다.
#
# allow 규칙이 지정되지 않은 경우, 역할 집합 내에 올바른
# workload_identity_labels를 가진 모든 워크로드에 WorkloadIdentity를
# 발행할 수 있습니다.
allow:
# 각 규칙은 조건 집합으로 구성됩니다. 규칙이 일치하는 것으로
# 간주되려면 모든 조건이 통과해야 합니다. 이는 조건 간에 AND 관계를
# 효과적으로 생성합니다.
#
# 사용 가능한 연산자에 대한 자세한 설명은 이 페이지의 "규칙"
# 섹션에서 확인할 수 있습니다.
- conditions:
- attribute: join.kubernetes.pod.name
eq:
value: my-pod
- attribute: join.kubernetes.namespace
not_eq:
value: kube-system
템플릿#
WorkloadIdentity 리소스는 특정 필드에서 템플릿을 지원하며, 이를 통해 증명된 속성으로 워크로드에 발행된 워크로드 신원 자격 증명의 요소를 커스터마이즈할 수 있습니다.
예를 들어, 템플릿을 사용하여 Kubernetes 네임스페이스와 서비스 계정 이름을 워크로드 신원 자격 증명의 SPIFFE ID에 삽입할 수 있습니다:
kind: workload_identity
version: v1
metadata:
name: my-kubernetes-workload
spec:
spiffe:
id: /k8s/{{ workload.kubernetes.namespace }}/{{ workload.kubernetes.service_account }}
서비스 계정 foo로 default 네임스페이스에서 실행 중인 워크로드에 대해 spiffe://example.teleport.sh/k8s/default/foo의 SPIFFE ID가 생성됩니다.
속성이 템플릿에 지정되면, 워크로드 신원 자격 증명이 발행되기 위해서는 해당 값이 워크로드의 속성에 존재해야 합니다. 예를 들어, workload.kubernetes.namespace가 템플릿에 사용된 경우, Kubernetes에서 실행되지 않는 워크로드에는 자격 증명이 발행되지 않습니다.
WorkloadIdentity 리소스 내에서 템플릿을 지원하는 필드는 다음과 같습니다:
spec.spiffe.idspec.spiffe.hintspec.spiffe.x509.dns_sansspec.spiffe.x509.subject_template.common_namespec.spiffe.x509.subject_template.organizationspec.spiffe.x509.subject_template.organizational_unitspec.spiffe.jwt.extra_claims
지원되는 속성의 전체 목록은 속성 참조 페이지에서 확인할 수 있습니다.
WorkloadIdentity 리소스의 필드는 템플릿에 Teleport의 술어 언어를 사용하여 strings.lower 및 regex.replace와 같은 텍스트 조작 함수를 적용할 수 있습니다.
규칙#
기본적으로 WorkloadIdentity 리소스는 WorkloadIdentity 리소스의 레이블과 일치하는 workload_identity_labels를 가진 역할을 보유한 사용자 또는 Bot이 자격 증명을 발행하는 데 사용할 수 있습니다.
그러나 규칙 메커니즘을 사용하여 워크로드의 속성을 기반으로 자격 증명 발행을 추가로 제한할 수 있습니다.
각 규칙은 술어 언어 표현식 또는 조건 집합으로 구성됩니다. 조건 형식을 사용할 경우, 규칙이 통과로 간주되기 위해서는 해당 규칙 내의 모든 조건이 통과해야 합니다. 여러 규칙을 지정하면, WorkloadIdentity 발행이 허용되기 위해 최소 하나의 규칙이 통과해야 합니다.
예를 들어, 서비스 계정 foo로 default 네임스페이스에서 실행 중인 워크로드에만 자격 증명 발행을 제한하려면:
kind: workload_identity
version: v1
metadata:
name: rules-example
spec:
spiffe:
id: /my-awesome-workload
rules:
allow:
- expression: workload.kubernetes.namespace == "default" && workload.kubernetes.service_account == "foo"
조건 형식으로 표현한 동일한 규칙:
kind: workload_identity
version: v1
metadata:
name: rules-example
spec:
spiffe:
id: /my-awesome-workload
rules:
allow:
- conditions:
- attribute: workload.kubernetes.namespace
eq:
value: default
- attribute: workload.kubernetes.service_account
eq:
value: foo
조건 연산자#
eq#
eq(equals, 동일)는 지정된 속성이 지정된 값과 같은지 확인합니다:
kind: workload_identity
version: v1
metadata:
name: rules-example
spec:
spiffe:
id: /my-awesome-workload
rules:
allow:
- conditions:
- attribute: workload.kubernetes.namespace
eq:
value: default
not_eq#
not_eq(not equals, 동일하지 않음)는 지정된 속성이 지정된 값과 같지 않은지 확인합니다:
kind: workload_identity
version: v1
metadata:
name: rules-example
spec:
spiffe:
id: /my-awesome-workload
rules:
allow:
- conditions:
- attribute: workload.kubernetes.namespace
not_eq:
value: default
in#
in(포함)은 지정된 속성이 지정된 값 중 하나와 같은지 확인합니다:
kind: workload_identity
version: v1
metadata:
name: rules-example
spec:
spiffe:
id: /my-awesome-workload
rules:
allow:
- conditions:
- attribute: workload.kubernetes.namespace
in:
values: [default, kube-system]
not_in#
not_in(미포함)은 지정된 속성이 지정된 값 중 어느 것과도 같지 않은지 확인합니다:
kind: workload_identity
version: v1
metadata:
name: rules-example
spec:
spiffe:
id: /my-awesome-workload
rules:
allow:
- conditions:
- attribute: workload.kubernetes.namespace
not_in:
values: [foo, bar]
형변환#
조건 형식을 사용하고 문자열이 아닌 속성(예: 불리언 또는 숫자)을 비교할 때, 속성 값은 문자열 표현으로 변환됩니다.
술어 언어를 사용할 때는 속성 값이 있는 그대로 비교됩니다.
코드형 인프라#
tctl로 관리할 수 있는 YAML 표현 외에도, WorkloadIdentity 리소스는 코드형 인프라 도구를 사용하여 관리할 수도 있습니다.
자세한 내용은 다음을 참조하세요:
