Infograb logo
워크로드 인증
미리보기

Teleport 워크로드 아이덴티티는 현재 미리보기 상태입니다. 이는 일부 기능이 누락될 수 있음을 의미합니다. 우리는 인증 파트너를 적극적으로 찾고 있으며, 여러분의 피드백을 들려주시면 좋겠습니다.

워크로드 인증은 tbot이 워크로드 API에 연결하고 인증서를 요청한 워크로드의 아이덴티티를 주장하는 과정입니다. 인증 과정에서 수집된 정보는 어떤 SPIFFE ID가 SVID에 인코딩되어 워크로드에 발급될지를 결정하는 데 사용됩니다.

워크로드 인증자는 이 인증을 수행하는 개별 구성 요소입니다. 그들은 워크로드의 프로세스 ID를 사용하여 플랫폼별 API에서 워크로드에 대한 정보를 수집합니다. 예를 들어, Kubernetes 워크로드 인증자는 해당 프로세스가 속한 Kubernetes 포드를 확인하기 위해 로컬 Kubelet API를 질의합니다.

인증 프로세스의 결과는 인증 메타데이터로 알려져 있습니다. 이 인증 메타데이터는 tbot의 워크로드 API 서비스에 대해 구성한 규칙에 의해 참조됩니다. 예를 들어, 특정 Kubernetes 네임스페이스에서 실행되고 있는 워크로드만 특정 SPIFFE ID를 발급받도록 명시할 수 있습니다.

또한, 이 메타데이터는 tbot이 SVID를 발급할 때 출력하는 로그 메시지에 포함됩니다. 이는 SVID의 발급을 감사하고 특정 SPIFFE ID가 워크로드에 발급된 이유를 이해하는 데 도움을 줍니다.

유닉스

유닉스 워크로드 인증자는 가장 기본적인 인증자로, 특정 유닉스 프로세스에 대한 SVID 발급을 다양한 기준에 따라 제한할 수 있게 해줍니다.

인증 메타데이터

다음 메타데이터는 유닉스 워크로드 인증자에 의해 생성되며, tbot의 워크로드 API 서비스에 대한 규칙 구성 시 사용 가능합니다:

필드설명
unix.attested워크로드가 유닉스 워크로드 인증자에 의해 인증되었음을 나타냅니다.
unix.pid인증된 워크로드의 프로세스 ID입니다.
unix.uid인증된 워크로드의 유효 사용자 ID입니다.
unix.gid인증된 워크로드의 유효 기본 그룹 ID입니다.

쿠버네티스

쿠버네티스 워크로드 인증자는 특정 쿠버네티스 워크로드에 대한 SVID 발급을 다양한 기준에 따라 제한할 수 있게 해줍니다.

먼저 지정된 프로세스 ID에 대한 포드 ID를 확인한 다음, 해당 포드에 대한 세부정보를 위해 로컬 Kubelet API를 질의하여 작동합니다.

인증 메타데이터

다음 메타데이터는 쿠버네티스 워크로드 인증자에 의해 생성되며, tbot의 워크로드 API 서비스에 대한 규칙 구성 시 사용 가능합니다:

필드설명
kubernetes.attested워크로드가 쿠버네티스 워크로드 인증자에 의해 인증되었음을 나타냅니다.
kubernetes.namespace쿠버네티스 포드의 네임스페이스입니다.
kubernetes.service_account쿠버네티스 포드의 서비스 계정입니다.
kubernetes.pod_name쿠버네티스 포드의 이름입니다.

배포 안내

쿠버네티스 워크로드 인증을 사용하려면 tbot이 데몬세트로 배포되어야 합니다. 이는 유닉스 도메인 소켓에 접근할 수 있는 것은 에이전트가 있는 동일 노드의 포드만 가능하기 때문입니다. 또한, 데몬세트는 에이전트가 다른 컨테이너 내의 프로세스에 대한 정보에 접근할 수 있도록 hostPID 속성을 true로 설정해야 합니다.

데몬세트는 Kubelet API를 질의할 수 있도록 서비스 계정이 할당되어야 합니다. 다음은 필요한 RBAC를 갖춘 역할의 예입니다:

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: tbot
rules:
  - resources: ["pods","nodes","nodes/proxy"]
    apiGroups: [""]
    verbs: ["get"]

워크로드 API 유닉스 도메인 소켓을 워크로드의 컨테이너에 매핑하는 방법은 두 가지가 있습니다:

  • tbot 데몬세트 및 연결해야 할 워크로드를 위한 hostPath 볼륨을 직접 구성합니다.
  • spiffe-csi-driver를 사용합니다.

필요한 쿠버네티스 리소스에 대한 예제 매니페스트:

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: tbot
rules:
  - resources: ["pods","nodes","nodes/proxy"]
    apiGroups: [""]
    verbs: ["get"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: tbot
subjects:
  - kind: ServiceAccount
    name: tbot
    namespace: default
roleRef:
  kind: ClusterRole
  name: tbot
  apiGroup: rbac.authorization.k8s.io
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: tbot
  namespace: default
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: tbot-config
  namespace: default
data:
  tbot.yaml: |
    version: v2
    onboarding:
      join_method: kubernetes
      # 생성한 조인 토큰의 이름으로 교체하세요.
      token: example-token
    storage:
      type: memory
    # Teleport Proxy Service의 주소로 설정해야 합니다.
    proxy_server: example.teleport.sh:443
    services:
      - type: spiffe-workload-api
        listen: unix:///run/tbot/sockets/workload.sock
        attestor:
          kubernetes:
            enabled: true
            kubelet:
              # Kubelet API 인증서의 검증을 건너뜁니다, 이는 보통 
              # 클러스터 CA에 의해 발급되지 않기 때문입니다.
              skip_verify: true
        # 발급하고자 하는 SPIFFE ID로 svid 항목을 교체하고,
        # 특정 쿠버네티스 워크로드로 제한하기 위해 `rules` 블록을 사용합니다.
        svids:
          - path: /my-service
            rules:
              - kubernetes:
                  namespace: default
                  service_account: example-sa
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: tbot
spec:
  selector:
      matchLabels:
        app: tbot
  template:
    metadata:
      labels:
        app: tbot
    spec:
      securityContext:
        runAsUser: 0
        runAsGroup: 0
      hostPID: true
      containers:
        - name: tbot
          image: public.ecr.aws/gravitational/tbot-distroless:16.2.0
          imagePullPolicy: IfNotPresent
          securityContext:
            privileged: true
          args:
            - start
            - -c
            - /config/tbot.yaml
            - --log-format
            - json
          volumeMounts:
            - mountPath: /config
              name: config
            - mountPath: /var/run/secrets/tokens
              name: join-sa-token
            - name: tbot-sockets
              mountPath: /run/tbot/sockets
              readOnly: false
          env:
            - name: TELEPORT_NODE_NAME
              valueFrom:
                fieldRef:
                  fieldPath: spec.nodeName
            - name: KUBERNETES_TOKEN_PATH
              value: /var/run/secrets/tokens/join-sa-token
      serviceAccountName: tbot
      volumes:
        - name: tbot-sockets
          hostPath:
            path: /run/tbot/sockets
            type: DirectoryOrCreate
        - name: config
          configMap:
            name: tbot-config
        - name: join-sa-token
          projected:
            sources:
              - serviceAccountToken:
                  path: join-sa-token
                  # 600초는 Kubernetes에서 지원하는 최소 값입니다. 
                  # 이 값을 사용하는 것이 좋습니다.
                  expirationSeconds: 600
                  # `example.teleport.sh`는 
                  # 여러분의 Teleport 클러스터 이름으로 교체해야 합니다.
                  audience: example.teleport.sh

다음 단계

Teleport 원문 보기