쿠버네티스 접근제어 체계
- Authentication : 접속한 사람의 신분을 시스템이 인증하는 단계 -> 신분증 확인
- Authorization : 어떤 권한을 가지고 어떤 행동을 할 수 있는지 확인하는 단계 -> 사용자별 권한 확인
- Admission Control : 인증과 권한확인 이후에 추가적인 요청내용에 대한 검증 또는 요청 내용 강제 변경
이러한 접근체계중 Authentication을 주제로 포스팅
쿠버네티스 API 서버에 접근(Authentication)하는 3가지 방법
- X509 Client Certs
- kubectl
- ServiceAccount
1. X509 Client Certs
쿠버네티스 클러스터에는 6443 포트로 API 서버가 열려있음
사용자가 이곳으로 https 접근하는 방법이며 Kubernetes 설치 시, kubeconfig 파일 안의 인증서 내용으로 접근
- kubeconfig에 Client crt, Client Key를 사용자가 복사하여 Kubernetes API Server에 접근 가능
- 이러한 인증서가 만들어지는 과정
- 이러한 kubeconfig는 kubectl이 설치되면서 내부에 복사됨
- 이러한 kubectl내부에 복사된 kubeconfig를 이용하여 kubectl에서 Kubernetes API Server에 접근하여 리소스 조회가 가능
- kubectl에 accept-hosts기능으로 8001 포트를 열어두면 외부에서도 https로 접근 가능
- kubectl 내부에 Kubeconfig로 인증서를 가지고 있기 때문에 사용자는 아무런 인증없이 접근 가능
2. kubectl
외부 서버에 kubectl를 설치하여 멀티 클러스터에 접근
- 사전에 각 cluster에 대한 kubeconfig가 외부서버의 kubectl에 존재해야함
- 사용자는 외부서버의 kubectl에 존재하는 kubeconfig를 통해 원하는 클러스터에 접근 가능
- kubeconfig의 내용 및 접근 방법
- kubeconfig내의 항목
- clusters : 클러스터를 등록
- users : 사용자 등록
- contexts : clusters와 users를 연결, 이렇게 연결된 contexts를 이용해 사용자가 접근가능
3. ServiceAccount
네임 스페이스 내부의 Secret의 token 값으로 사용자가 API Server에 접근 가능한 방법
- Namespace 생성 시, 자동적으로 ServiceAccount가 생성됨
- 이러한 ServiceAccount에는 Secret이 존재
- 내부에 CA crt와 token 값이 존재
- 네임 스페이스 내부에 Pod를 생성하면 ServiceAccount와 연결되며, Pod는 Secret의 token값을 통해 API Server에 접근 가능
실습
1. X509 Client Certs
클라이언트 인증서를 복사하여 txt에 저장
grep 'client-certificate-data' /etc/kubernetes/admin.conf | head -n 1 | awk '{print $2}' | base64 -d
클라이언트 키를 복사하여 txt에 저장
grep 'client-key-data' /etc/kubernetes/admin.conf | head -n 1 | awk '{print $2}' | base64 -d
https 요청
PostMan을 이용하여 호출, node list 조회
-> 아직 인증서 및 키에대한 정보가 없기 때문에 접근 불가
정상적인 호출이 가능하게 하는 설정
# postman
Settings > General > SSL certificate verification > OFF
Settings > Certificates > Client Certificates > Host, CRT file, KEY file 설정 및 등록
# curl
curl -k --key ./Client.key --cert ./Client.crt https://192.168.56.30:6443/api/v1/nodes
https 호출(nodelist 조회) 재시도
- 정상적으로 조회/호출 가능
kubectl로 Proxy 띄우기
'^*$' -> 어떠한 호스트에서도 접근 가능(특정 호스트를 지정하는 것도 가능)
nohup kubectl proxy --port=8001 --address=192.168.56.30 --accept-hosts='^*$' >/dev/null 2>&1 &
post man으로 8001 포트로 조회하면 위의 6443포트와 동일한 결과가 출력됨
-> 인증서 없이 외부에서 클러스터 접근 가능
2. ServiceAccount
네임 스페이스 생성
kubectl create ns nm-01
ServiceAccount, Secret 확인
# ServiceAccount 확인
kubectl describe -n nm-01 serviceaccounts
# Secret 확인
kubectl describe -n nm-01 secrets
Pod 생성
cat <<EOF | kubectl create -f -
apiVersion: v1
kind: Pod
metadata:
name: pod-1
namespace: nm-01
labels:
app: pod
spec:
containers:
- name: container
image: kubetm/app
EOF
https 호출 준비
post man의 Authorization에 Bearer to Token으로 Token에 Secret의 Tocken 값 입력
https로 API 호출
-> Secret의 Token값을 이용하여 외부에서 API Server에 접근 가능함
'CICD' 카테고리의 다른 글
[Kubernetes] StatefulSet(Controller) (0) | 2022.02.08 |
---|---|
[Kubernetes] RBAC, Role, RoleBinding(Authorization) (0) | 2022.01.30 |
[Kubernetes] Dynamic Provioning, RelcaimPoicy(Volume) (0) | 2022.01.22 |
[Kubernetes] Headless, Endpoint, ExternalName(Service) (1) | 2022.01.22 |
[Kubernetes] Node Scheduling(Pod) (0) | 2022.01.20 |
댓글