Kubernetes 인증 및 권한 수여 작업 전 공략: 액세스 제어 의 Service Account

이것 은 본 시리즈 의 마지막 글 입 니 다. 앞에서 우 리 는 방문 통제 중의 기본 개념 과 신분 인증 과 권한 수여 의 구체 적 인 조작 을 알 게 되 었 습 니 다. 본 고 는 방문 통제 중의 service account 를 더욱 잘 알 게 될 것 입 니 다.
 
Kubernetes 에는 사용자 와 service account 라 는 개념 이 있어 자원 에 접근 할 수 있 습 니 다.사용 자 는 키 와 인증서 와 연결 되 어 API 요청 을 검증 하 는 데 사 용 됩 니 다. 클 러 스 터 외부 에서 요청 한 모든 인증 을 위 한 설정 방안 을 사용 합 니 다.가장 흔 한 방안 은 X. 509 인증 서 를 통 해 인증 요청 을 하 는 것 이다.인증서 생 성 및 사용자 와 연 결 된 인증서 에 대한 정 보 는 Kubernetes 인증 튜 토리 얼 을 참조 하 십시오.
 
Kubernetes 는 데이터베이스 나 사용자, 비밀 번 호 를 유지 하지 않 는 설정 파일 을 기억 하 십시오.반면 집단 밖에서 관 리 를 원 하고 있다.인증 모듈 의 개념 을 통 해 Kubernetes 는 OpenID 나 Active Directory 와 같은 제3자 에 게 인증 을 위임 할 수 있다.
 
X. 509 인증 서 는 인증 의 외부 요청 에 사용 할 수 있 지만 service account 는 클 러 스 터 에서 실행 되 는 프로 세 스 를 검증 하 는 데 사용 할 수 있 습 니 다.또한, service account 는 API server 내부 호출 을 하 는 pod 와 연 결 됩 니 다.
 
Kubernetes 설치 마다 실행 중인 pod 와 연 결 된 기본 service account 가 있 습 니 다.이와 유사 하 게 pod 가 내부 API 서버 점 을 호출 할 수 있 도록 Kubernetes 라 는 ClusterIP 서비스 가 있 습 니 다. 기본 service account 와 함께 내부 프로 세 스 가 API 점 을 호출 할 수 있 도록 합 니 다. 
kubectl get serviceAccounts

 
NAME      SECRETS   AGE
default   1         122m

 
 kubectl get svc

 
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1            443/TCP   123m

 
이 service account 는 모든 pod 내부 에 설 치 된 secret 를 가리 키 고 있 습 니 다.이 시 크 릿 은 API 서버 에 필요 한 토 큰 을 포함 하고 있 습 니 다. 
kubectl get secret

 
NAME                  TYPE                                  DATA   AGE
default-token-4rpmv   kubernetes.io/service-account-token   3      123m

 
우리 가 pod 를 예약 하고 방문 하기 시 작 했 을 때 모든 것 이 밝 아 졌 다.우 리 는 curl 명령 을 사용 하여 Busy Box 기반 pod 를 시작 할 것 입 니 다. 
kubectl run -i --tty --rm curl-tns --image=radial/busyboxplus:curl
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
If you don't see a command prompt, try pressing enter.
[ root@curl-tns-56c6d54585-6v2xp:/ ]$

 
Busy Box 셸 에 있 을 때 API Server 터미널 에 접근 하려 고 합 니 다. 
[ root@curl-tns-56c6d54585-6v2xp:/ ]$ curl https://kubernetes:8443/api

 
인증 토 큰 이 부족 해 결과 가 나 오지 않 습 니 다.HTTP 머리 에 박 을 수 있 는 토 큰 을 어떻게 검색 하 는 지 보 여 줍 니 다.
 
앞서 논의 한 바 와 같이 토 큰 은 시 크 릿 으로 pod 에 설치 되 어 있 습 니 다.영 패 를 찾 으 려 면/var/run/secrets/kubernetes. io/serviceaccount 를 보십시오. 
[ root@curl-tns-56c6d54585-6v2xp:/ ]$ cd /var/run/secrets/kubernetes.io/serviceaccount

 
[ root@curl-tns-56c6d54585-6v2xp:/tmp/secrets/kubernetes.io/serviceaccount ]$ ls
ca.crt     namespace  token

 
curl 명령 을 간소화 하기 위해 환경 변 수 를 설정 합 니 다. 
CA_CERT=/var/run/secrets/kubernetes.io/serviceaccount/ca.crt
TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
NAMESPACE=$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace)

 
다음 curl 명령 은 기본 네 임 스페이스 에서 서 비 스 를 요청 합 니 다.API 서버 에서 응답 을 받 을 수 있 는 지 살 펴 보 자. 
[ root@curl-tns-56c6d54585-6v2xp:~ ]$ curl --cacert $CA_CERT -H "Authorization: Bearer $TOKEN" "https://kubernetes/api/v1/namespaces/$NAMESPACE/services/"

 
{
  "kind": "Status",
  "apiVersion": "v1",
  "metadata": {

  },
  "status": "Failure",
  "message": "services is forbidden: User \"system:serviceaccount:default:default\" cannot list resource \"services\" in API group \"\" in the namespace \"default\"",
  "reason": "Forbidden",
  "details": {
    "kind": "services"
  },
  "code": 403
}

 
그러나 기본 service account 는 같은 네 임 스페이스 에 있 는 서 비 스 를 검색 할 수 있 는 충분 한 권한 이 없습니다.
 
Kubernetes 는 폐쇄 적 이 고 개방 적 인 관례 에 따라 기본 적 인 상황 에서 사용자 와 service account 에 권한 이 없다 는 것 을 기억 하 십시오.
 
이 요청 을 만족 시 키 기 위해 서 는 기본 service account 와 적당 한 캐릭터 를 연결 하 는 캐릭터 바 인 딩 을 만들어 야 합 니 다.이 단 계 는 우리 가 캐릭터 를 Bob 에 연결 하 는 방식 과 유사 하 며 후 자 는 그 에 게 pod 를 열거 할 수 있 는 권한 을 부여 합 니 다.
 
pod 를 종료 하고 다음 명령 을 실행 합 니 다. 기본 service account 에 캐릭터 바 인 딩 을 만 듭 니 다. 
kubectl create rolebinding default-view \
  --clusterrole=view \
  --serviceaccount=default:default \
  --namespace=default

 
 rolebinding.rbac.authorization.k8s.io/default-view created

 
이 명령 은 기본 service account 를 클 러 스 터 캐릭터 보기 와 연결 합 니 다. 이 캐릭터 보 기 는 pod 가 자원 을 표시 할 수 있 도록 합 니 다.
 
궁금 하 다 면 사용 가능 한 모든 클 러 스 터 역할 을 보고 싶 습 니 다. 명령 실행: kubectl get clusterroles.
 
Busy Box pod 를 다시 시작 하고 API Server 에 접근 합 니 다. 
kubectl run -i --tty --rm curl-tns --image=radial/busyboxplus:curl

 
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
If you don't see a command prompt, try pressing enter.
[ root@curl-tns-56c6d54585-2cx44:/ ]$

 
CA_CERT=/var/run/secrets/kubernetes.io/serviceaccount/ca.crt
TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
NAMESPACE=$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace)

 
curl --cacert $CA_CERT -H "Authorization: Bearer $TOKEN" "https://kubernetes/api/v1/namespaces/$NAMESPACE/services/"

 
{
  "kind": "ServiceList",
  "apiVersion": "v1",
  "metadata": {
    "selfLink": "/api/v1/namespaces/default/services/",
    "resourceVersion": "11076"
  },
  "items": [
    {
      "metadata": {
        "name": "kubernetes",
        "namespace": "default",
        "selfLink": "/api/v1/namespaces/default/services/kubernetes",
        "uid": "b715a117-6be1-4de0-8830-45bddcda701c",
        "resourceVersion": "151",
        "creationTimestamp": "2019-08-13T09:45:27Z",
        "labels": {
          "component": "apiserver",
          "provider": "kubernetes"
        }
      },
      "spec": {
        "ports": [
          {
            "name": "https",
            "protocol": "TCP",
            "port": 443,
            "targetPort": 8443
          }
        ],
        "clusterIP": "10.96.0.1",
        "type": "ClusterIP",
        "sessionAffinity": "None"
      },
      "status": {
        "loadBalancer": {

        }
      }
    }
  ]
}

 
RBAC 가 pod 로 어떻게 확장 되 는 지 확인 하기 위해 서 기본 service account 에 다른 바 인 딩 을 만 들 수 있 습 니 다.
 
Kubernetes 인증 과 권한 수여 시리즈 에 관 한 글 은 여기 서 끝 났 습 니 다. 저 희 는 인증, 권한 수여 와 Service account 의 기본 개념 에 대해 논 의 했 습 니 다. 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기