VPC 환경에서 이용 가능합니다.
ncp-iam-authenticator를 사용하여 kubeconfig를 구성하면 ServiceAccount 토큰을 이용하여 권한 제어를 할 필요가 없습니다.
IAM 인증 사용자 관리를 확인해 주십시오.
Ncloud Kubernetes Service에서 제공하는 kubeconfig 인증 파일은 ncp-iam-authenticator를 통해 동작 하므로, 사용자가 Jenkins, Github Action과 같은 3rd-party 서비스를 사용하는 경우 일부 불편함이 발생할 수 있습니다. 해당 인증 파일은 사용자의 클러스터 권한을 대상 3rd-party 서비스에 부여하므로 보안 문제가 발생할 가능성이 있습니다. 이를 방지하기 위해 토큰을 사용한 kubeconfig 인증 파일을 생성하고, 필요한 권한만 부여하여 권한을 최소화함으로써 보안을 강화할 수 있습니다.
kubeconfig 파일의 토큰 값 변경
kubeconfig 파일의 토큰 값을 변경하여 클러스터 권한을 제한하는 방법을 예제를 통해 설명합니다.
kubeconfig 파일의 토큰 값을 변경하는 방법은 다음과 같습니다.
-
아래 명령어를 차례대로 실행하여 Namespace와 Service Account를 생성해 주십시오.
$ kubectl --kubeconfig $KUBE_CONFIG create ns hello-world
$ cat <<EOF | kubectl --kubeconfig $KUBE_CONFIG apply -f - apiVersion: v1 kind: ServiceAccount metadata: name: hello-user namespace: hello-world EOF
-
아래 명령어를 실행하여 Role과 Role Binding을 추가해 주십시오.
$ cat <<EOF | kubectl --kubeconfig $KUBE_CONFIG apply -f - apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: namespace: hello-world name: hello-role rules: - apiGroups: [""] resources: ["pods"] # Object 지정 verbs: ["get", "list", "watch", "create", "update", "patch", "delete"] # Action 제어 --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: namespace: hello-world name: hello-rb subjects: - kind: ServiceAccount name: hello-user namespace: hello-world roleRef: kind: Role name: hello-role apiGroup: rbac.authorization.k8s.io EOF
- Role의 resources, verbs에서 사용할 권한을 정의합니다. 위 코드 예시에서는 hello-world라는 네임스페이스의 Pod 리소스만 제어하도록 제한합니다.
-
아래 명령어를 실행하여 Service Account의 Secret을 생성해 주십시오.
$ cat <<EOF | kubectl --kubeconfig $KUBE_CONFIG apply -f - apiVersion: v1 kind: Secret metadata: name: hello-user-default namespace: hello-world annotations: kubernetes.io/service-account.name: hello-user type: kubernetes.io/service-account-token EOF
참고Kubernetes 1.24부터는 Service Account 생성 시 자동으로 default secret을 생성하지 않습니다. 사용하고 계신 버전이 1.24 이후인 경우 과정 3에서 관련 secret의 생성이 필요합니다. 이전 버전의 경우에는 자동으로 생성되므로 해당 과정을 진행하지 않아도 됩니다.
-
아래 명령어를 실행하여 Service Account의 토큰을 확인해 주십시오.
$ kubectl --kubeconfig $KUBE_CONFIG -n hello-world describe secret $(kubectl --kubeconfig $KUBE_CONFIG -n hello-world get secret | grep hello-user | awk '{print $1}')
-
ncp-iam-authenticator를 통해 클러스터의 kubeconfig 파일을 생성해 주십시오.
- ncp-iam-authenticator에 대한 자세한 내용은 관련 가이드 [IAM 인증 사용자 관리] 를 참고해 주십시오.
-
생성한 kubeconfig 파일을 복사하여 kubeconfig-token.yaml 파일로 저장한 후, 해당 파일의 user 부분 client-certificate-data, client-key-data 값을 아래와 같이 삭제해 주십시오.
$ cp kubeconfig.yaml kubeconfig-token.yaml $ vi kubeconfig-token.yaml apiVersion: v1 clusters: ... users: - name: kubernetes-admin user:
-
이전 단계에서 확인한 토큰 정보를 아래와 같이 user 값으로 추가해 주십시오.
$ cat kubeconfig-token.yaml apiVersion: v1 clusters: ... users: - name: kubernetes-admin user: token: eyJhbGciOiJSU... # Service Account Token 추가
권한 제어 확인
위 과정에서 생성한 kubeconfig-token.yaml 파일을 기준으로, 토큰을 이용하여 Kubernetes API 호출 시 정상적으로 권한을 제한하는지 확인하는 방법은 다음과 같습니다.
- 아래 명령어를 실행하여
kubeconfig-token.yaml
를 환경변수로 선언해 주십시오.$ export KUBE_CONFIG_TOKEN=kubeconfig-token.yaml
- 아래 명령어를 각각 실행하여 접근 여부를 확인해 주십시오.
- Pod 객체 조회 (접근 가능)
$ kubectl --kubeconfig $KUBE_CONFIG_TOKEN -n hello-world get pod
- Deployment 객체 조회 (접근 불가능)
$ kubectl --kubeconfig $KUBE_CONFIG_TOKEN -n hello-world get deploy
- 다른 네임스페이스 조회 (접근 불가능)
$ kubectl --kubeconfig $KUBE_CONFIG_TOKEN get pod