2025. 2. 7. 00:54ㆍContainer/kubernetes
줄여서 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
'Container > kubernetes' 카테고리의 다른 글
| Kubernetes 현재 사용중인 Context의 기본 네임스페이스 변경하기 (0) | 2025.02.19 |
|---|---|
| kubernetes 커맨드 모음 ( command ) (0) | 2021.05.27 |
| 쿠버네티스 ( kubernetes ) - 컨트롤러( Controller ) (0) | 2021.05.25 |
| 쿠버네티스 ( kubernetes ) - 서비스( Service )와 클러스터 네트워크 (0) | 2021.05.25 |
| 쿠버네티스 ( kubernetes ) - 파드( Pod ) (0) | 2021.05.25 |