- 인쇄
- PDF
클러스터 권한 제어
- 인쇄
- PDF
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