728x90

Kubernetes에서 서비스 어카운트란?

Kubernetes에서 서비스 어카운트(Service Account)는 클러스터 내의 애플리케이션이 Kubernetes API 서버와 상호작용할 수 있도록 인증 정보를 제공하는 역할을 함

보통 사용자가 직접 API 서버와 상호작용하기 위해 사용자 계정(User Account)을 사용하는 것과는 달리, 서비스 어카운트는 애플리케이션(즉, 파드)이 API 서버와 통신할 수 있도록 만들어진 특수한 계정임

Kubernetes 클러스터 내에서 파드가 실행 중일 때, 이 파드가 클러스터의 상태를 모니터링하거나 다른 리소스에 접근하기 위해서는 Kubernetes API 서버에 인증된 요청을 보내야 함

이를 가능하게 하는 것이 바로 서비스 어카운트 토큰(serviceAccountToken)

이 토큰을 통해 파드는 자신을 인증하고 필요한 작업을 수행할 수 있음

서비스 어카운트 토큰 자동 마운트

서비스 어카운트가 제공하는 토큰은 파드가 Kubernetes API에 접근할 때 중요한 역할을 하며, 이는 자동으로 파드에 마운트됨 Kubernetes에서는 기본적으로 파드가 생성될 때 서비스 어카운트의 토큰을 자동으로 마운트하도록 설정되어 있음

이 설정은 서비스어카운트나, 파드의 메타데이터에서 automountServiceAccountToken: true로 설정됨

apiVersion: v1
kind: ServiceAccount
metadata:
  name: example-account
automountServiceAccountToken: true
apiVersion: v1
kind: Pod
metadata:
  name: example-pod
spec:
  serviceAccountName: example-account
  automountServiceAccountToken: true
  ...

위와 같이 설정된 경우, Kubernetes는 파드 생성 시 서비스 어카운트 토큰을 파드의 파일 시스템에 Projected Volume을 통해 자동으로 주입함

이 토큰은 보통 /var/run/secrets/kubernetes.io/serviceaccount/token 경로에 파일로 저장됨

애플리케이션은 이 경로에 있는 토큰을 읽어 Kubernetes API 서버에 요청을 보낼 때 사용할 수 있음

서비스 어카운트 토큰의 만료와 갱신

Kubernetes 서비스 어카운트 토큰은 기본적으로 expirationSeconds 설정을 통해 토큰이 약 1시간 후에 만료되도록 구성됨

만료된 토큰은 더 이상 유효하지 않으므로 새로운 토큰이 필요함

다행히도, Kubernetes는 이 과정도 자동으로 처리함

즉, 파드에 마운트된 토큰이 만료되면, Kubernetes는 자동으로 새로운 토큰을 생성하고 기존 토큰이 저장된 경로(/var/run/secrets/kubernetes.io/serviceaccount/token)에 업데이트함

이를 통해 애플리케이션은 지속적으로 유효한 토큰을 사용하여 Kubernetes API에 접근할 수 있음

이렇게 자동으로 갱신되는 메커니즘 덕분에 관리자는 토큰 만료에 신경 쓰지 않아도 되고, 애플리케이션은 중단 없이 Kubernetes API 서버와 상호작용할 수 있음

 

아래 파이썬 코드를 실행하면 파드에 마운트 되어있는 서비스 어카운트 토큰을 이용하여 kubernetes api를 호출해 볼 수 있음

import ssl
from kubernetes import client, config

config = client.Configuration()

config.api_key['authorization'] = open('/var/run/secrets/kubernetes.io/serviceaccount/token').read()
config.api_key_prefix['authorization'] = 'Bearer'
config.host = 'https://kubernetes.default'
config.ssl_ca_cert = '/var/run/secrets/kubernetes.io/serviceaccount/ca.crt'
config.verify_ssl=True

api_client = client.CoreV1Api(client.ApiClient(config))
ret = api_client.list_namespaced_pod("example-namespace", watch=False)

print("Listing pods with their IPs:")
for i in ret.items:
    print(f"{i.status.pod_ip}\t{i.metadata.name}")

보안 관점에서의 서비스 어카운트 관리

서비스 어카운트 토큰이 Kubernetes 클러스터에서 중요한 역할을 하기 때문에 이를 안전하게 관리하는 것이 매우 중요함

보안 관점에서 중요한 원칙 중 하나는 최소 권한 원칙(Least Privilege Principle)

각 서비스 어카운트는 그들이 수행해야 할 작업에 필요한 최소한의 권한만을 가져야 함

Kubernetes에서는 Role, RoleBinding, ClusterRole, ClusterRoleBinding을 통해 각 서비스 어카운트에 부여된 권한을 제한할 수 있음

만약 특정 파드가 Kubernetes API에 접근할 필요가 없다면, automountServiceAccountToken: false로 설정하여 서비스 어카운트 토큰이 자동으로 마운트되지 않도록 설정하는 것이 좋음

728x90

+ Recent posts