k8s 에서 1.24 이전 버전에는 service account secret token이 자동으로 생성 되었지만,
이후 버전 부터는 직접 생성하고 관리해주어야 한다.
특히 토큰에는 수명주기가 있으며 이를 관리해주어야 한다.
임시 기간 토큰 생성 및 영구 생성, Refresh를 통한 토큰 관리가 있다.
1. 임시 기간 토큰 생성
kubectl create token 명령어를 통해 토큰 생성이 가능하며, --duration 옵션을 통해 시간 지정 가능하다.
duration 옵션이 없을 경우 기본적으로 1시간으로 세팅된다.
또한, 해당 명령어로 토큰을 생성할 경우 생성할 때 조회 가능하고 더 이상 생성한 토큰에 대해 조회가 불가능하다.
# 임시 계정 생성
kubectl create sa temp-sa
# create token 명령어를 통해 임시 생성
kubectl create token temp-sa --duration 30m
# result
eyJhbGciOiJSUzI1NiIsImtpZCI6ImU1Mnp2SFpHYS1RN2dXaElkV0tEZC1nemlxeTFhdWQiGE5ZC1hM2E3LTQ4OGYtOTM3OS1iYzc0MGU1ZjUyMDkifX0sIm5iZiI6MTczNDQzOTY4MCwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50OmRlZmF1bHQ6dGVtcC1zYSJ9.Ya83wdlUMifQww_XUmK2rEfxkAMqueDT6QeYiQqwXlWYnUIq4YaCZDbo7XZz8xW3W-_efpx1-7n9dHkUMzk88LvCCS5C0S6J89hGGAI4T_nhyTfIhj4AbC_hhLdZR3b9pSuh7a0xY_CiD
{
"aud": [
"https://kubernetes.default.svc.cluster.local"
],
"exp": 1734441480,
"iat": 1734439680,
"iss": "https://kubernetes.default.svc.cluster.local",
"jti": "360425d7-587d-44ca-8633-67e5e07ac9e5",
"kubernetes.io": {
"namespace": "default",
"serviceaccount": {
"name": "temp-sa",
"uid": "34bd8a9d-a3a7-488f-9379-bc740e5f5209"
}
},
"nbf": 1734439680,
"sub": "system:serviceaccount:default:temp-sa"
}
2. 영구 토큰 생성
영구 토큰은 Service Account 생성 후 Secret을 따로 생성해주면 된다.
하지만, 권장하지는 않는다.
# 계정 생성
kubectl create sa permanent-sa
# secret 생성
vi secret.yaml
apiVersion: v1
kind: Secret
type: kubernetes.io/service-account-token
metadata:
name: permanent-sa-secret
annotations:
kubernetes.io/service-account.name: permanent-sa
# 적용
kubectl apply -f secret.yaml
# 조회
kubectl get secret
NAME TYPE DATA AGE
permanent-sa-secret kubernetes.io/service-account-token 3 4s
# 토큰 조회
kubectl describe secret apiVersion: v1
kind: Secret
type: kubernetes.io/service-account-token
metadata:
name: permanent-sa-secret
annotations:
kubernetes.io/service-account.name: permanent-apiVersion: v1
kind: Secret
type: kubernetes.io/service-account-token
metadata:
name: permanent-sa-secret
annotations:
kubernetes.io/service-account.name: permanent-sa
root@master:~/account# kubectl describe secret permanent-sa
Name: permanent-sa-secret
Namespace: default
Labels: <none>
Annotations: kubernetes.io/service-account.name: permanent-sa
kubernetes.io/service-account.uid: 349d3c79-1180-4cea-9357-5169a7a88d4c
Type: kubernetes.io/service-account-token
Data
====
token: eyJhbGciOiJSUzI1NiIsImtpZCI6ImU1Mnp2SFpHYS1RN2dXXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3V
ca.crt: 1107 bytes
namespace: 7 bytes
3. Service Account Mount를 통한 갱신
3.1 기본적인 Mount 를 통한 갱신
기본적으로 pod yaml 설정시 Service Account를 적용하게되면 1시간마다 토큰이 갱신된다.
(확인하려면 1시간 후 pod 에 접속해서 확인 가능, 공식문서에서도 1시간마다 kubelet이 갱신한다고 나와 있음)
# 토큰 생성
kubectl create sa auto-sa
# deploy.yaml 내 serviceAccount 적용
...
spec:
template:
spec:
serviceAccount: auto-sa
containers:
...
...
# 토큰 조회를 위해 pod 접속
kubectl exec -it stdout-node-869cff8b95-cxqf2 -- sh
# 경로
pwd
/var/run/secrets/kubernetes.io/serviceaccount
ls
ca.crt namespace token
# 토큰 조회
# 토큰이 변경되는걸 확인하려면 1시간 후에 해당 pod 접속해서 똑같이 확인하면 됨.
cat token
eyJhbGciOiJSUzI1NiIsImtpZCI6ImU1Mnp2SFpHYS1RN2dXaElkV0tEZC1nemlxeTFMclJubTVTaFhoVkZIY2sifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiXSwiZXhwIjoxNzY1OTc2NzIxLCJpYXQiOjE3MzQ0NDA3MjEsImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIiwianRpIjoiNjQ3ZDZmYWMtODc
3.2 Volume Project 를 통한 관리
위 방법 말고 Volume Project를 통한 시간 설정 및 갱신이 가능하다.
automountServiceAccountToken 옵션을 false 로 주어야하므로 yaml로 생성
기본적으로 ServiceAccount 생성시 true 로 생성 됨.
해당 예제는 2시간으로 설정
(2시간뒤 자동 갱신됨)
# automountServiceAccountToken 옵션을 false 로 주어야하므로 yaml로 생성
# 기본적으로 ServiceAccount 생성시 true 로 생성 됨.
vi passive-sa.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: passive-sa
namespace: default
automountServiceAccountToken: false
# deploy.yaml 내 serviceAccount volume project 적용
...
spec:
template:
spec:
serviceAccount: passive-sa
volumes:
- name: project-passive-sa
projected:
sources:
- serviceAccountToken:
path: passive-account-file
expirationSeconds: 7200
containers:
volumeMounts:
- mountPath: /tmp/token
name: project-passive-sa
...
# 토큰 조회를 위해 pod 접속
kubectl exec -it stdout-node-7fcc7ff87-tjfjf -- sh
# 경로
# 위에서 /tmp/token 에 설정했음
pwd
/tmp/token
# 위에서 passive-sa-file 로 설정했음
ls
passive-sa-file
# 토큰 조회
# 토큰이 변경되는걸 확인하려면 2시간으로 설정했으므로 2시간 후에 해당 pod 접속해서 똑같이 확인하면 됨.
cat passive-sa-file
eyJhbGciOiJSUzI1NiIsImtpZCI6ImU1Mnp2SFpHY
3.3 TokenRequest API 이용
API 호출용, 일반 Service Account 2개를 만들어, 하나는 Token 갱신을 위해 사용하는 방법으로 사용한다.
또는 하나의 계정을 통해 직접 갱신해서 사용한다.
pod 에 접속해서 아래 API를 호출하면된다.
curl -k --header "Authorization: Bearer token" https://kubernetes.default.svc/api/v1/namespaces/default/pods
참고 :
https://kubernetes.io/docs/reference/access-authn-authz/service-accounts-admin/
https://kubernetes.io/docs/concepts/security/service-accounts/
'Develop > k8s' 카테고리의 다른 글
k8s Audit Policy (k8s 감사 정책) (1) | 2024.12.21 |
---|---|
opensearch operator read only mode (0) | 2024.12.02 |
인증서 방식 계정 생성 (Certificates and Certificate Signing Requests) (0) | 2024.11.29 |
OpenSearch Operator Certificate 설정 (0) | 2024.11.28 |
Containerd x509: certificate signed by unknown authority 설정 (0) | 2024.11.19 |