Exercise 15.2: Authentication and Authorization

  1. CP 노드에 연결된 터미널로 이동

  2. Namespace 생성

    {
        kubectl create ns development 
        kubectl create ns production
    }
  3. Pod 생성

    {
        kubectl run app-dev --image=nginx -n development
        kubectl run app-prod --image=nginx -n production
    }
  4. 현재 설정된 Context 확인 - 클러스터, 인증, 네임스페이스 정보

    kubectl config get-contexts
  5. John 유저가 사용할 Private Key 키 생성

    openssl genrsa -out john.key 2048
  6. Certificate Signing Request (CSR) 생성

    {
        touch $HOME/.rnd
        openssl req -new -key john.key -out john.csr \
        -subj "/CN=john/O=development"
    }
  7. Certificate 생성

    sudo openssl x509 -req -in john.csr \
    -CA /etc/kubernetes/pki/ca.crt \
    -CAkey /etc/kubernetes/pki/ca.key \
    -CAcreateserial \
    -out john.crt -days 45
  8. 위에서 생성한 인증서 리뷰

    openssl x509 -in john.crt -text -noout
  9. ~/.kube/config 에 명시된 인증서 리뷰

    grep client-cert $HOME/.kube/config |cut -d" " -f 6 \
    | base64 -d | openssl x509 -text -noout -in -
  10. 위에서 생성한 인증서 검증

    openssl verify -CAfile /etc/kubernetes/pki/ca.crt john.crt
  11. ~/.kube/config 에 명시된 인증서 검증

    grep client-cert $HOME/.kube/config |cut -d" " -f 6 | base64 -d \
    | openssl verify -CAfile /etc/kubernetes/pki/ca.crt
  12. 현재 설정된 kubeconfig에 위에서 생성한 인증서 반영

    kubectl config set-credentials john \
    --client-certificate=/root/john.crt \
    --client-key=/root/john.key
  13. 이전 실습에서 복사해놓은 kubeconfig 파일과 새로 업데이트된 kubeconfig 파일 비교

    diff cluster-api-config .kube/config -y
  14. Context 생성

    kubectl config set-context john-dev \
    --cluster=kubernetes \
    --namespace=development \
    --user=john
  15. 위에서 생성한 Context를 이용해서 Context에 설정된 Namespace에 있는 Pod 확인

    kubectl --context=john-dev get pods
  16. 생성된 Context 목록 확인

    kubectl config get-contexts
  17. 이전 실습에서 복사해놓은 kubeconfig 파일과 새로 업데이트된 kubeconfig 파일 다시 비교

    diff cluster-api-config .kube/config -y
  18. Role 생성

    cat <<EOF | kubectl create -f -
    kind: Role
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: workload-full-access
      namespace: development
    rules:
    - apiGroups: ["", "extensions", "apps"]
      resources: ["deployments", "replicasets", "pods"]
      verbs: ["list", "get", "watch", "create", "update", "patch", "delete"]
    EOF
  19. RoleBinding 생성

    cat <<EOF | kubectl create -f -
    kind: RoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: workload-full-access-to-john
      namespace: development
    subjects:
    - kind: User
      name: john
      apiGroup: ""
    roleRef:
      kind: Role
      name: workload-full-access
      apiGroup: ""
    EOF
  20. john-dev Context를 이용해서 Context에 설정된 Namespace에 있는 Pod 확인

    kubectl --context=john-dev get pods
  21. john-dev Context를 이용해서 Context에 설정된 Namespace에 Deployment 생성

    kubectl --context=john-dev \
    create deployment nginx --image=nginx
  22. john-dev Context를 이용해서 Context에 설정된 Namespace에 있는 Pod 확인

    kubectl --context=john-dev get pods
  23. john-dev Context를 이용해서 Context에 설정된 Namespace에 Deployment 삭제

    kubectl --context=john-dev delete deploy nginx
  24. ClusterRole 생성

    cat <<EOF | kubectl create -f -
    kind: ClusterRole
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: workload-readonly-access
    rules:
    - apiGroups: ["", "extensions", "apps"]
      resources: ["deployments", "replicasets", "pods"]
      verbs: ["get", "list", "watch"]
    EOF
  25. RoleBinding 생성

    cat <<EOF | kubectl create -f -
    kind: RoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: workload-readonly-access-to-dev-group
      namespace: production        
    subjects:
    - kind: Group
      name: development
      apiGroup: ""
    roleRef:
      kind: ClusterRole
      name: workload-readonly-access                
      apiGroup: ""
    EOF
  26. Context 생성

    kubectl config set-context john-prod \
    --cluster=kubernetes \
    --namespace=production \
    --user=john
  27. john-prod Context를 이용해서 Context에 설정된 Namespace에 있는 Pod 확인

    kubectl --context=john-prod get pods
  28. john-prod Context를 이용해서 Context에 설정된 kube-system Namespace에 있는 Pod 확인

    kubectl --context=john-prod get pods -n kube-system
  29. john-prod Context를 이용해서 Context에 설정된 Namespace에 Deployment 생성

    kubectl --context=john-prod \
    create deployment nginx --image=nginx
  30. workload-readonly-access Role에 부여된 권한 확인

    kubectl describe clusterrole workload-readonly-access
  31. John 유저가 development 네임스페이스에서 할수 있는 Action 목록 확인

    kubectl auth can-i --as john --list -n development
  32. John 유저가 production 네임스페이스에서 할수 있는 Action 목록 확인

    kubectl auth can-i --as john --list -n production
  33. John 유저가 속한 그룹이 production 네임스페이스에서 할수 있는 Action 목록 확인

    kubectl auth can-i --as john --as-group development --list -n production
  34. John 유저가 production 네임스페이스에 Deployment를 생성할수 있는지 확인

    kubectl auth can-i --as john --as-group development \
    create deploy -n production
  35. John 유저가 production 네임스페이스에 있는 Deployment 정보를 볼수있는지 확인

    kubectl auth can-i --as john --as-group development \
    get deploy -n production 
  36. 리소스 삭제

    kubectl delete ns development production

Last updated