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 다운로드 및 설치
- cfssl 도구는 https://pkg.cfssl.org/에서 다운로드
인증서 서명 요청(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
'개발강의정리 > DevOps' 카테고리의 다른 글
[데브옵스를 위한 쿠버네티스 마스터] 클러스터 유지와 보안, 트러블슈팅 - RBAC를 활용한 롤 기반 엑세스 컨트롤 (0) | 2021.01.22 |
---|---|
[데브옵스를 위한 쿠버네티스 마스터] 클러스터 유지와 보안, 트러블슈팅 - kube config 파일을 사용한 인증 (0) | 2021.01.20 |
[데브옵스를 위한 쿠버네티스 마스터] 클러스터 유지와 보안, 트러블슈팅 - TLS 인증서를 활용한 통신 이해 (0) | 2021.01.20 |
[데브옵스를 위한 쿠버네티스 마스터] 클러스터 유지와 보안, 트러블슈팅 - Accounts (0) | 2021.01.20 |
[데브옵스를 위한 쿠버네티스 마스터] 클러스터 유지와 보안, 트러블슈팅 - 보안을 위한 다양한 리소스 (0) | 2021.01.20 |
댓글