CFSSL 로 Kubernetes API 계정 생성하기

리눅스/PaaS|2024. 5. 14. 12:00
반응형

Kubernetes API 계정은 여러가지 방법으로 생성 가능하지만, 여기에서는 CFSSL 로 생성하는 방법을 다루었습니다.

 

 

1. CFSSL 설치

 

CFSSL 은 CloudFlare 에서 개발한 오픈 소스 도구로, 인증서와 인증 기관 (Certificate Authority, CA) 을 관리하기 위한 도구입니다.

CFSSL 명령 바이너리 파일을 다운로드 받습니다.

# CFSSL_VERSION="1.6.5"
# curl -L "https://github.com/cloudflare/cfssl/releases/download/v${CFSSL_VERSION}/cfssl_${CFSSL_VERSION}_linux_amd64" -o cfssl
# curl -L "https://github.com/cloudflare/cfssl/releases/download/v${CFSSL_VERSION}/cfssljson_${CFSSL_VERSION}_linux_amd64" -o cfssljson
# curl -L "https://github.com/cloudflare/cfssl/releases/download/v${CFSSL_VERSION}/cfssl-certinfo_${CFSSL_VERSION}_linux_amd64" -o cfssl-certinfo

 

파일에 실행권한을 주고 적절한 디렉토리로 이동 시킵니다.

# chmod +x cfssl*
# mv cfssl* /usr/local/bin/

 

설치된 CFSSL 버전을 확인합니다.

# cfssl version
Version: 1.6.5
Runtime: go1.22.0

 

 

2. 사용자 생성

 

공식 Document 참고 : https://kubernetes.io/docs/tasks/tls/managing-tls-in-a-cluster/

 

아래와 같이 Kubernetes API 에 접근할 계정 (sysdocu) 의 key 및 csr 파일을 생성합니다.

예제에서는 계정에 색상을 더했습니다. 다른 계정으로 사용할 분은 이름을 바꿔서 사용하시면 됩니다.

# openssl req -new -newkey rsa:4096 -nodes -keyout sysdocu.key -out sysdocu.csr -subj "/CN=sysdocu"

 

# cat <<EOF | kubectl apply -f -
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
  name: sysdocu
spec:
  groups:
  - system:authenticated
  request: $(cat sysdocu.csr | base64 | tr -d '\n')
  signerName: kubernetes.io/kube-apiserver-client
  usages:
    - client auth
EOF

 

CSR 을 생성하면 승인 대기 상태가 되므로, 아래와 같이 추가 명령으로 승인을 해주어야 합니다.
# kubectl certificate approve sysdocu

승인 (Approved) 은 되었는데, 발행 (Issued) 까지 되지 못한 경우에는 아래 작업을 계속 이어서 진행합니다.

# kubectl get csr
NAME      AGE    SIGNERNAME                            REQUESTOR   REQUESTEDDURATION   CONDITION
sysdocu   106m   kubernetes.io/kube-apiserver-client   admin       <none>              Approved

이제 CFSSL 을 이용하여 인증서를 발급받아야 합니다.

# cat <<EOF | cfssl gencert -initca - | cfssljson -bare ca
{
  "CN": "sysdocu",
  "key": {
    "algo": "rsa",
    "size": 4096
  }
}
EOF
2024/03/15 11:00:36 [INFO] generating a new CA key and certificate from CSR
2024/03/15 11:00:36 [INFO] generate received request
2024/03/15 11:00:36 [INFO] received CSR
2024/03/15 11:00:36 [INFO] generating key: rsa-4096
2024/03/15 11:00:37 [INFO] encoded CSR
2024/03/15 11:00:37 [INFO] signed certificate with serial number 540868796268120255911872831281879045817461391444

 

# vi server-signing-config.json

{
    "signing": {
        "default": {
            "usages": [
                "client auth"
            ],
            "expiry": "876000h",
            "ca_constraint": {
                "is_ca": false
            }
        }
    }
}

 

# kubectl get csr sysdocu -o jsonpath='{.spec.request}' | \
  base64 --decode | \
  cfssl sign -ca ca.pem -ca-key ca-key.pem -config server-signing-config.json - | \
  cfssljson -bare ca-signed-server
2024/03/15 11:02:49 [INFO] signed certificate with serial number 559793821146666936971756884293966902391849545829

 

인증서가 생성되었습니다.
# ls -al ca-signed-server.pem
-rw-r--r-- 1 root root 1172 Mar 15 11:02 ca-signed-server.pem

 

CSR 에 서명된 인증서를 입력합니다.
# kubectl get csr sysdocu -o json | \
  jq '.status.certificate = "'$(base64 ca-signed-server.pem | tr -d '\n')'"' | \
  kubectl replace --raw /apis/certificates.k8s.io/v1/certificatesigningrequests/sysdocu/status -f -

(결과 생략)


이제 CSR 에 인증서가 발행된 것을 확인할 수 있습니다.
# kubectl get csr -A
NAME      AGE    SIGNERNAME                            REQUESTOR   REQUESTEDDURATION   CONDITION
sysdocu   110m   kubernetes.io/kube-apiserver-client   admin       <none>              Approved,Issued

 

반응형

댓글()