개발강의정리/DevOps

[데브옵스를 위한 쿠버네티스 마스터] 클러스터 유지와 보안, 트러블슈팅 - TLS 인증서를 활용한 유저 생성하기

nineDeveloper 2021. 1. 20.
728x90

TLS 인증서를 활용한 유저 생성하기


1. ca를 사용하여 직접 csr 승인하기

  • 개인 키 생성하기
    • 길이 2048 만큼의 개인 키 생성
$ openssl genrsa -out gasbugs.key 2048
  • private 키를 기반으로 인증서 서명 요청하기
    • CN: 사용자 이름
    • O: 그룹 이름
    • CA에게 csr 파일로 인증을 요청할 수 있음!
$ openssl req -new -key gasbugs.key -out gasbugs.csr -subj "/CN=gasbugs/O=boanproject"
  • Kubernetes 클러스터 인증 기관(CA) 사용이 요청을 승인해야 함
  • 내부에서 직접 승인하는 경우 pki 디렉토리에 있는 ca.key와 ca.crt를 사용하여 승인 가능
  • gasbugs.csr을 승인하여 최종 인증서인 gasbugs.crt를 생성
  • -days 옵션을 사용해 며칠간 인증서가 유효할 수 있는지 설정(예제에서는 500일)
$ openssl x509 -req -in gasbugs.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out gasbugs.crt -days 500

Signature ok
subject=CN = gasbugs, O = boanproject
Getting CA Private Key

2. 인증 사용을 위해 쿠버네티스에 crt를 등록

  • crt를 사용할 수 있도록 kubectl을 사용하여 등록
$ kubectl config set-credentials gasbugs --client-certificate=.certs/gasbugs.crt --client-key=.certs/gasbugs.key
$ kubectl config set-context gasbugs-context --cluster=kubernetes --user=gasbugs --namespace=office
  • 다음 명령을 사용하여 사용자 권한으로 실행 가능(지금은 사용자에게 권한을 할당하지 않아 실행되지는 않는다)
$ kubectl --context=gasbugs-context get pods
Error from server (Forbidden): pods is forbidden: User "gasbugs" cannot list resource "pods" in API group "" in the namespace "office"

실습

private key 만들기

$ openssl genrsa -out gasbugs.key 2048
Generating RSA private key, 2048 bit long modulus (2 primes)
.............+++++
......................................................................................................+++++
e is 65537 (0x010001)

생성된 키로 부터 csr 요청 문서 생성

$ openssl req -new -key gasbugs.key -out gasbugs.csr -subj "/CN=gasbugs/O=boanproject"

random seed 가 없을 경우 rnd 오류가 발생 아래와 같이 임의로 생성

$ echo password > .rnd

생성된 csr 요청 문서, key 확인

$ ls -la gasbugs.*
-rw-rw-r-- 1 server1 server1  920  1월 20 17:08 gasbugs.csr
-rw------- 1 server1 server1 1679  1월 20 17:06 gasbugs.key

csr 요청 문서 정보 text 로 출력
sign 을 안해서 인증기관 정보는 없음

$ openssl req -in gasbugs.csr -text
Certificate Request:
    Data:
        Version: 1 (0x0)
        Subject: CN = gasbugs, O = boanproject
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (2048 bit)
                Modulus:
                    00:d3:3a:60:a1:51:7b:1f:54:ef:e3:0c:b6:2b:c7:
                    3c:31:ae:34:a7:df:86:bf:72:07:61:e7:b5:bc:ae:
                    40:aa:8d:6c:46:b2:b6:eb:51:fb:d0:b1:e5:d5:09:
                    e4:f4:fc:1f:89:12:08:26:5f:f7:ae:1c:60:2c:17:
                    ...

발급한 csr 요청 문서를 CA 인증기관 Sign 처리 하여 crt 인증서 생성

$ sudo openssl x509 -req -in gasbugs.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out gasbugs.crt -days 365

Signature ok
subject=CN = gasbugs, O = boanproject
Getting CA Private Key

crt 인증서 작성된 것 확인
csr 요청 문서는 이제 필요없으므로 삭제해도됨

$ ls -la gasbugs.*
-rw-r--r-- 1 root    root    1021  1월 20 17:14 gasbugs.crt
-rw-rw-r-- 1 server1 server1  920  1월 20 17:08 gasbugs.csr
-rw------- 1 server1 server1 1679  1월 20 17:06 gasbugs.key

crt를 사용할 수 있도록 kubectl을 사용하여 user 등록

$ kubectl config set-credentials gasbugs --client-certificate=gasbugs.crt --client-key=gasbugs.key

User "gasbugs" set.

gasbugs@kubernetes 라는 user context 를 생성

$ kubectl config set-context gasbugs@kubernetes --cluster=kubernetes --user=gasbugs --namespace=office
Context "gasbugs@kubernetes" created.

gasbugs 유저로 로그인 및 사용설정

$ kubectl config use-context gasbugs@kubernetes
Switched to context "gasbugs@kubernetes".

현재는 gasbugs 유저에게 아무런 권한을 주지 않았으므로
gasbugs 라는 유저는 office 라는 네임스페이스에서 pods 목록을 볼 수 있는 권한이 없다고 나옴

$ kubectl get pod
Error from server (Forbidden): pods is forbidden: User "gasbugs" cannot list resource "pods" in API group "" in the namespace "office"

관리자 권한으로 다시 변경

$ kubectl config use-context kubernetes-admin@kubernetes
Switched to context "kubernetes-admin@kubernetes".

권한 변경 후 확인

$ kubectl get pod
NAME                      READY   STATUS    RESTARTS   AGE
http-go-568f649bb-crtcr   1/1     Running   1          22h

3. Kubernetes 서비스에 대한 TLS 인증서를 만드는 방법

  • CFSSL 다운로드 및 설치

  • 인증서 서명 요청(Certificate Signing Request) 작성

  • CSR yaml을 생성하고 다음 명령을 실행

  • CSR 요청 승인 (관리자 수행) approve 또는 deny
$ kubectl certificate approve my-svc.my-namespace
  • 승인된 CSR로부터 Certificate 다운로드
$ kubectl get csr my-svc.my-namespace -o jsonpath='{.status.certificate}' | base64 -- decode > server.crt

연습문제

  • dev1팀에 john이 참여했다
  • John을 위한 인증서를 만들고 승인해보자

create_k8s_user.sh 파일 생성

id=john
o_name=dev1

echo openssl genrsa -out $id.key 2048
openssl genrsa -out $id.key 2048

echo openssl req -new -key $id.key -out $id.csr -subj "/CN=$id/O=$o_name"
openssl req -new -key $id.key -out $id.csr -subj "/CN=$id/O=$o_name"

echo openssl x509 -req -in $id.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out $id.crt -days 365
openssl x509 -req -in $id.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out $id.crt -days 365

echo kubectl config set-credentials $id --client-certificate=$id.crt --client-key=$id.key
kubectl config set-credentials $id --client-certificate=$id.crt --client-key=$id.key

echo kubectl config set-context $id@kubernetes --cluster=kubernetes --namespace=$o_name --user=$id
kubectl config set-context $id@kubernetes --cluster=kubernetes --namespace=$o_name --user=$id

스크립트 수행

$ sudo ./create_k8s_user.sh
Generating RSA private key, 2048 bit long modulus (2 primes)
.........................................................+++++
.....+++++
e is 65537 (0x010001)
Signature ok
subject=CN = john, O = dev1
Getting CA Private Key
User "john" set.
Context "john@kubernetes" created.

john 유저로 로그인 및 사용설정

$ kubectl config use-context john@kubernetes
Switched to context "john@kubernetes".

현재는 john 유저에게 아무런 권한을 주지 않았으므로
john 라는 유저는 dev1 라는 네임스페이스에서 pods 목록을 볼 수 있는 권한이 없다고 나옴

$ kubectl get pod
Error from server (Forbidden): pods is forbidden: User "john" cannot list resource "pods" in API group "" in the namespace "dev1"

관리자 권한으로 다시 변경

$ kubectl config use-context kubernetes-admin@kubernetes
Switched to context "kubernetes-admin@kubernetes".

권한 변경 후 확인

$ kubectl get pod
NAME                      READY   STATUS    RESTARTS   AGE
http-go-568f649bb-crtcr   1/1     Running   1          22h
728x90

댓글

💲 추천 글