kuberentes CertificateSigningRequest란?

2025. 2. 7. 00:54Container/kubernetes

728x90
반응형
반응형

 

줄여서 CSR은 인증 서명 요청으로 인증서 발급을 위한 필요한 정보를 담고있는 인증서 신청 형식 데이터이다.

해당 csr를 통해 kube-apiserver와 통신을 위해 인증서 서명을 받고 서명이 완료된 키값으로 api-server와 통신할 수있게 도와준다..

포함되는 내용은 : 개인키(Private Key) + 공개키(Public Key) + 도메인에 대한 정보

 

이걸 왜? 그럼 k8s에서 만들어야하나? 계정 관리를 위해 만들어야함 

 

만약에 큰 회사라면 developer랑 admin 등 권한등이 있을탠데.. Keycloak을 통한 sso연동을 k8s와 하지 않는다면.. 필요한 조건이다. 물론.. 이러한 조건 모두 다 수동이라는 단점이있지만.... 보안상 어떤식의 흐름으로 흘러가는지 알면 좋다.

 

순서는 아래와 같다...

 

 

 

요약하자면...

1. Openssl로 Key를 만듭니다.
2. CSR를 yaml파일과 kubectl로 만듭니다.
3. 해당 CSR파일 kubectl certificate approve를 통하여 승인 및 crt파일 생성

4. Role과 RoleBinding을 진행합니다. ( https://kubernetes.io/docs/reference/access-authn-authz/certificate-signing-requests)
4. kubeconfig을 만들고 context를 생성합니다.

 

이와 같은 순서대로 진행해보고자 합니다.

1. openssl을 통한 key 생성

openssl genrsa -out ross.key 2048
openssl req -new -key ross.key -out ross.csr # only set Common Name = ross

 

2. CSR을 통한 CertificateSigningRequest 진행

먼저 생성한 ross.csr을  base64로 인코딩해준다. 해당 값은 인코딩 후 저장해놓는다..

cat ross.csr | base64 | tr -d "\n"
LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KTUlJQ2lqQ0NBWElDQVFBd1JURUxNQWtHQTFVRUJoTUNRVlV4RXpBUkJnTlZCQWdNQ2xOdmJXVXRVM1JoZEdVeApJVEFmQmdOVkJBb01HRWx1ZEdWeWJtVjBJRmRwWkdkcGRITWdVSFI1SUV4MFpEQ0NBU0l3RFFZSktvWklodmNOCkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFMaHpxcWZGejRyWml5blJUd0M0amJYTnc0OGNOTk96YW5ZMHByWTQKb096OVMwb01lMHFQNGJGNzVLSnBjODFyaXBiYzRVR29iY1lrUlFuZHRaYnFSZFIvakplVWNYcW1XQTdwcEx4Tgo2RmNvWjRMUmJjSGgvQ0EzRndJOVpRK3JEMDdnTUtRS0ZDdmZIMG9ZMGRVM1NaTFhFa252V1IxMEhBemY3alArCml0YkxFd2RLM0lmYzZNOGFmTURaalh1ZWxNUU50ZlgvU0N1MkJvbmgxSzFBZnZDa2UzdkNpR3NKZ2xuR2VmMmEKeGFyVGJwOENWRXdkNTk0NDRqSGxnZTRyOXQveHNUbTFQYWhya2g0cjU5UFg3R2c0RHg3SklESFBHZkFEUEdDLwp6SGFIQjIxS0srb2FMaXVNa1RaZmtjQW93dmNhTUJWTFM0VTNESWZLN29iZGVFOENBd0VBQWFBQU1BMEdDU3FHClNJYjNEUUVCQ3dVQUE0SUJBUUF1OFlpQm44SHlyVUNuTzQ4c0xpcWp4VVJBYXVSNGpaU0V4SW9hK2RmR2Z5V0kKUUtqYXhvaUVSU3JBTEMxOWl4cHV2SWpUQXIrUkl6VzVaclJSN2MxY2Y3TVF1YjA5TzNXajQrN3kyVFZtY2xJRwo0eWIrUXZIenkrbFh5S0VqZ1MxZWVXRWQ5UmlwWi82czd0TitDQWYvVmRiZ1ZMdXpUR2IzNTUwVzkzQXJMRWxECm9uaDhVWUJPK3ZPVEV4MHgyTHcvaVRuV1QzMFppMVpQUWpLSjNkNTMvYkxvODBFUnVVK0ZONGlhQlNnanF5em0Kc2dWdTNlbEs1T2hkTGE0OGYrZEpnZlQ5RXdORUQ4Q0RHRFErT29OcDZvYlRDc1RMR1lrYzBoRDNjWkFXMHhqcQp1dlBkZ0hISDE3eTl3SFUwTElUVXRMaGZCc3pPWXNibVZ5MExmNEdRCi0tLS0tRU5EIENFUlRJRklDQVRFIFJFUVVFU1QtLS0tLQo

 

해당 값은  아래 certificateSigningRequest의 Request 값에 넣어서 사용한다.

cat <<EOF | kubectl apply -f -
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
  name: ross
spec:
  request: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KTUlJQ2lqQ0NBWElDQVFBd1JURUxNQWtHQTFVRUJoTUNRVlV4RXpBUkJnTlZCQWdNQ2xOdmJXVXRVM1JoZEdVeApJVEFmQmdOVkJBb01HRWx1ZEdWeWJtVjBJRmRwWkdkcGRITWdVSFI1SUV4MFpEQ0NBU0l3RFFZSktvWklodmNOCkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFMaHpxcWZGejRyWml5blJUd0M0amJYTnc0OGNOTk96YW5ZMHByWTQKb096OVMwb01lMHFQNGJGNzVLSnBjODFyaXBiYzRVR29iY1lrUlFuZHRaYnFSZFIvakplVWNYcW1XQTdwcEx4Tgo2RmNvWjRMUmJjSGgvQ0EzRndJOVpRK3JEMDdnTUtRS0ZDdmZIMG9ZMGRVM1NaTFhFa252V1IxMEhBemY3alArCml0YkxFd2RLM0lmYzZNOGFmTURaalh1ZWxNUU50ZlgvU0N1MkJvbmgxSzFBZnZDa2UzdkNpR3NKZ2xuR2VmMmEKeGFyVGJwOENWRXdkNTk0NDRqSGxnZTRyOXQveHNUbTFQYWhya2g0cjU5UFg3R2c0RHg3SklESFBHZkFEUEdDLwp6SGFIQjIxS0srb2FMaXVNa1RaZmtjQW93dmNhTUJWTFM0VTNESWZLN29iZGVFOENBd0VBQWFBQU1BMEdDU3FHClNJYjNEUUVCQ3dVQUE0SUJBUUF1OFlpQm44SHlyVUNuTzQ4c0xpcWp4VVJBYXVSNGpaU0V4SW9hK2RmR2Z5V0kKUUtqYXhvaUVSU3JBTEMxOWl4cHV2SWpUQXIrUkl6VzVaclJSN2MxY2Y3TVF1YjA5TzNXajQrN3kyVFZtY2xJRwo0eWIrUXZIenkrbFh5S0VqZ1MxZWVXRWQ5UmlwWi82czd0TitDQWYvVmRiZ1ZMdXpUR2IzNTUwVzkzQXJMRWxECm9uaDhVWUJPK3ZPVEV4MHgyTHcvaVRuV1QzMFppMVpQUWpLSjNkNTMvYkxvODBFUnVVK0ZONGlhQlNnanF5em0Kc2dWdTNlbEs1T2hkTGE0OGYrZEpnZlQ5RXdORUQ4Q0RHRFErT29OcDZvYlRDc1RMR1lrYzBoRDNjWkFXMHhqcQp1dlBkZ0hISDE3eTl3SFUwTElUVXRMaGZCc3pPWXNibVZ5MExmNEdRCi0tLS0tRU5EIENFUlRJRklDQVRFIFJFUVVFU1QtLS0tLQo=
  signerName: kubernetes.io/kube-apiserver-client
  expirationSeconds: 86400  # one day
  usages:
  - client auth
EOF
  • usage : client auth를 명시해줘야한다.
  • expirationSeconds : 만료 기간이다. 86400은 하루다.. (seconds로 사용된다.)
  • request : csr파일을 base64로 인코딩한 값을 넣어준다.

 

3. CSR 승인 및 CRT 생성

생성한 csr을 조회후 해당 csr을 승인해준다.

# csr 조회
kubectl get csr
# csr 승인
kubectl certificate approve ross

 

승인되면 kube-apiserver에 인증된 인증값을 status로 뽑아 crt로 저장하면된다.

# crt 만들기
kubectl get csr ross -o jsonpath='{.status.certificate}'| base64 -d > ross.crt
# 인증서 조회
ls
ross.crt ross.key ross.csr

 

4. User가 사용할 Role 과 Rolebindng 생성

ross라는 유저를 사용할 권한을 생성해준다. 해당 유저의 role은 pod의 조회,생성,삭제,업데이트의 권한을 생성하고 bindingrole까지 만든다.

# role 생성
kubectl create role developer --verb=create --verb=get --verb=list --verb=update --verb=delete --resource=pods

# rolebinding 
kubectl create rolebinding developer-binding-myuser --role=developer --user=ross

 

5. User에 대한 kubeconfig 생성

set-credentials를 통해 k8s을 접속하고자하는 user를 생성한다. 해당 유저는 .kube/config 파일에 user에 들어가게 된다.

$ kubectl config set-credentials rossUser --client-key=ross.key --client-certificate=ross.crt --embed-certs=true

# user 조회
$ kubectl config get-users
rossUser

 

그리고 해당 유저를 접속하고자 하는 cluster를 셋팅해준다. 그러면 .kube/config안의 context 가 생성되고 사용조건을 갖추게 된다.

$ kubectl config set-context ross --cluster=kubernetes --user=rossUser

# contexts조회
$ kubectl config get-contexts
CURRENT   NAME       CLUSTER               AUTHINFO         NAMESPACE
*         icnp       kuberenetes         kuberenetes-admin
          ross       kuberenetes         rossUser

 

이후 config 해당 유저를 사용하고자하면 config를 변경해주면된다.

$ kubectl config use-context ross

 

 

참고 :  https://kubernetes.io/docs/reference/access-authn-authz/certificate-signing-requests/#create-private-key

728x90
반응형