Kubernetes 인증 메서드

Kubernetes 인증 메서드 (Kubernetes Auth Method)

kubernetes 인증 메서드 유형이 Kubernetes 서비스 계정 토큰을 사용해 Consul에 인증하는 방법을 설명하는 문서예요. 이 인증 방식으로 Kubernetes 파드에 Consul 토큰을 쉽게 도입할 수 있어요.

출처: 문서

본문

참고 1.5.0+: 이 기능은 Consul 버전 1.5.0 이상에서 사용할 수 있습니다.

kubernetes 인증 메서드 유형을 사용하면 Kubernetes 서비스 계정 토큰을 사용해 Consul에 인증할 수 있습니다. 이 인증 방식은 Kubernetes 파드에 Consul 토큰을 도입하는 것을 쉽게 만듭니다.

이 페이지는 일반적인 Kubernetes 및 기본 인증 메서드 문서에 설명된 개념에 대한 지식을 전제로 합니다.

구성 매개변수 (Config Parameters)

kubernetes 유형의 인증 메서드를 올바르게 구성하려면 다음 인증 메서드 Config 매개변수가 필요합니다:

  • Host (string: <required>) - Kubernetes API 서버의 베이스에 대한 호스트 문자열, host:port 쌍 또는 URL이어야 합니다.
  • CACert (string: <required>) - Kubernetes API와 통신하는 데 사용되는 TLS 클라이언트가 사용하는 PEM 인코딩 CA 인증서입니다. 참고: 모든 줄은 줄바꿈(\n)으로 끝나야 합니다. 설정하지 않으면 시스템 인증서가 사용됩니다.
  • ServiceAccountJWT (string: <required>) - 로그인 중 애플리케이션 JWT를 검증하기 위해 Consul 리더가 사용하는 서비스 계정 토큰(JWT)입니다.
  • MapNamespaces (bool: <false>) Enterprise - Consul 1.8.0에서 네임스페이스 규칙을 위해 더 이상 사용되지 않습니다. 인증 메서드가 인증 메서드 자체 네임스페이스에서 토큰을 만드는 대신 Kubernetes 네임스페이스를 Consul 네임스페이스로 매핑하려고 시도해야 하는지 여부를 나타냅니다. 네임스페이스 매핑은 인증 메서드가 default 네임스페이스 내에 있어야 합니다.
  • ConsulNamespacePrefix (string: <optional>) Enterprise - Consul 1.8.0에서 더 이상 사용되지 않습니다. MapNamespaces가 활성화되면 이 값이 Kubernetes 네임스페이스 앞에 붙어 새 토큰을 만들 Consul 네임스페이스를 결정합니다.
  • ConsulNamespaceOverrides (map: <string:string>) Enterprise - Consul 1.8.0에서 더 이상 사용되지 않습니다. 이 필드는 Kubernetes 네임스페이스 이름의 Consul 네임스페이스 이름에 대한 매핑입니다. Kubernetes 네임스페이스가 이 맵에 있으면 ConsulNamespacePrefix를 추가하지 않고 값이 사용됩니다. 맵의 값이 ""이면 대체 네임스페이스를 결정하려 시도하는 대신 인증 메서드 네임스페이스가 사용됩니다.

예시 구성 (Sample Config)

{
    "Name": "example-k8s-auth",
    "Type": "kubernetes",
    "Description": "Example JWT auth method",
    "Config": {
        "Host": "https://192.0.2.42:8443",
        "CACert": "-----BEGIN CERTIFICATE-----\n...-----END CERTIFICATE-----\n",
        "ServiceAccountJWT": "eyJhbG...IiJ9..."
    }
}

RBAC

구성된 ServiceAccountJWT에 해당하는 Kubernetes 서비스 계정은 두 Kubernetes API에 접근할 수 있어야 합니다:

  • TokenReview - Kubernetes는 --service-account-lookup로 실행되어야 합니다. 이는 Kubernetes 1.7에서 기본값이 true이지만, 이전 버전은 Kubernetes API 서버가 이 설정으로 시작되도록 해야 합니다.
  • ServiceAccount

다음은 consul-auth-method-example이라는 서비스 계정에 필요한 권한을 부여하는 예시 RBAC 구성 스니펫입니다:

---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: review-tokens
  namespace: default
subjects:
  - kind: ServiceAccount
    name: consul-auth-method-example
    namespace: default
roleRef:
  kind: ClusterRole
  name: system:auth-delegator
  apiGroup: rbac.authorization.k8s.io
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: service-account-getter
  namespace: default
rules:
  - apiGroups: ['']
    resources: ['serviceaccounts']
    verbs: ['get']
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: get-service-accounts
  namespace: default
subjects:
  - kind: ServiceAccount
    name: consul-auth-method-example
    namespace: default
roleRef:
  kind: ClusterRole
  name: service-account-getter
  apiGroup: rbac.authorization.k8s.io

Kubernetes 인증 세부 사항 (Kubernetes Authentication Details)

처음에 Consul 리더에 제공된 ServiceAccountJWT는 제공된 JWT를 검증하기 위해 TokenReview API를 사용합니다. serviceaccount.namespace, serviceaccount.name, serviceaccount.uid의 신뢰된 속성은 서비스 계정 메타데이터에서 직접 채워집니다.

Consul 리더는 추가 쿼리를 수행합니다 (이번에는 ServiceAccount API로) ServiceAccount 객체에 consul.hashicorp.com/service-name 어노테이션이 존재하는지 확인합니다. 찾으면 그 값이 어떤 바인딩 규칙을 평가하는 목적으로 신뢰된 속성 serviceaccount.name을 재정의합니다.

신뢰된 ID 속성 (Trusted Identity Attributes)

인증 단계는 바인딩 규칙 선택자와 바인드 이름 보간에 사용할 다음 신뢰된 ID 속성을 반환합니다.

속성 지원되는 선택자 연산 보간 가능
serviceaccount.namespace Equal, Not Equal, In, Not In, Matches, Not Matches yes
serviceaccount.name Equal, Not Equal, In, Not In, Matches, Not Matches yes
serviceaccount.uid Equal, Not Equal, In, Not In, Matches, Not Matches yes

더 알아보기 (Learn more)