X.509 : PKI(Public Key Infrastructure) 기술 중 널리 알려진 표준 포맷
kubernetes 내부 component간 통신에 사용
사용자가 api-server에 접근하기 위해 사용하는 kubeconfig의 기본 설정
# kubeconfig
apiVersion: v1
kind: Config
clusters:
cluster:
certificate-authority-data: !@#
server: https://172.31.33.7:6443
name: kubernetes
users:
name: kubernetes-admin
user:
client-certificate-data: !@#
client-key-data: !@#
contexts:
context:
…
…
…
네트워크를 통해 주고받는 데이터를 누군가 훔쳐볼 수 없게하는 암호화
openssl genrsa -out sa.key 1024 # aws ubuntu에는 openssl이 내장되어있음
openssl rsa -in sa.key -out sa.pub -pubout # public키와 복호화가되게끔해줘
# private 키가 털리면 복호화할수없음
지문과 서명,(디지서트에서 서명해주는부분)
curl naver.com
curl 아이피 주소
# 이렇게 쳤을때 값이 다르다 다른 이유
# 사기를 방지? 서버도메인을 TLS 에 담고있다 그래서 다르다
HTTP에 인증서를 이용한 상호 신뢰 검증과 암호화 통신을 더한 것
핸드셰이크는 클라이언트와 서버간의 메세지 교환이며, HTTPS 웹에 처음 커넥션할 때 진행된다. 핸드셰이크의 단계는 클라이언트와 서버에서 지원하는 암호화 알고리즘, 키 교환 알고리즘에 따라 달라진다. 일반적으로는 RSA 키 교환 알고리즘이 사용된다.
RSA 키 교환 알고리즘 순서
openssl x509 -in apiserver.crt -noout -text
CN 이 쿠버네티스다 # 각기 다 다른걸만듬
# CN은 인증서이다 .
Subject: # tls-handshake 방식을 따라하는것.
X509v3 Subject Alternative Name:
DNS:kubernetes, DNS:kubernetes.default, DNS:kubernetes.default.svc, DNS:kubernetes.default.svc.cluster.local, DNS:""
Signature Algorithm: sha256WithRSAEncryption
89:46:01:4d:f7:e1:47:1d:85:c9:e1:4d:54:9c:31:a4:04:d9:
7a:18:eb:f1:6e:78:20:e4:39:c5:ed:24:be:2c:45:7c:ec:c2:
8e:0f:47:1a:fe:fb:6d:eb:d7:2e:85:c9:6a:b8:7a:47:ff:7f:
68:4d:39:df:43:07:ba:1a:37:d7:cf:40:0d:ca:8e:83:cb:df:
43:cf:e5:76:21:c7:97:42:e1:36:b4:91:ec:f2:a7:c7:40:88:
d1:5b:3d:d4:99:3c:b1:ca:e4:78:25:97:f3:86:c2:43:dd:5a:
b3:23:3d:9a:09:0d:4a:5f:bb:23:3e:12:23:a4:df:ec:f3:e5:
17:e6:fc:1e:68:51:6f:72:c3:02:e9:e4:ea:69:ee:0f:24:e5:
42:aa:ca:11:4d:1a:42:c7:e7:b1:02:f9:93:f4:4a:a8:6c:c5:
95:4c:be:ae:99:ca:cb:86:8c:88:7d:a7:28:b8:b5:00:f4:cd:
cd:1b:3c:e0:f7:c3:01:c0:a9:3e:a8:be:de:80:5b:14:21:c8:
8b:1b:bb:95:5c:59:87:07:43:d3:df:74:da:35:d5:40:bb:08:
6b:65:86:05:d7:d6:50:7c:20:17:04:35:dd:26:ce:b3:71:a8:
28:f5:bb:20:76:4f:aa:10:9a:f5:c0:0f:e2:30:d0:f8:05:ab:
74:80:33:d8
# 쿠버네티스에서는 SANS가 안맞으면 실행이안된다
clusters:
- cluster:
certificate-authority-data
# 필요한이유 : 쿠버네티스 CA인증서이다. 원래 기존의 RootCA이지만 쿠버네티스가 만듬
# RootCA가 퍼블릭키 를 확인하면서 검증을하는데 쿠버네티스는 쿠버네티스가 CA를만듬
client-certificate-data: # 인증서 ... .. 무수히많은데이터 base64로 인코딩 된 데이터
client-key-data: # private key에 해당하는 부분 무수히많은데이터 base64로 인코딩 된 데이터
# 무수히많은 데이터 ..
# ca.crt 와 ca.key가 있어야 인증서를 만들수있다 .
cd /home/ubuntu/kjh/pki
# Generate private key for user
openssl genrsa -out kjh.key 2048
# Generate CSR for user. Note the OU.
openssl req -new -key kjh.key -subj "/CN=kjh/O= " -out kjh.csr
# Sign certificate for user using CA servers private key
openssl x509 -req -in kjh.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out kjh.crt -days 365
# 확인
openssl x509 -in kjh.crt -noout -text
{
kubectl config set-cluster k8s-tls-example \
--certificate-authority=ca.crt \ # 인증서를 인증하고싶으면 ca.crt를 이용해서 복호화해
--embed-certs=true \ # 인증서가 복사되도 인증되게할꺼냐
--server=https://host:6443 \ # 접근할려는 엔드포인트는 이거다
--kubeconfig=kjh.kubeconfig # 이러한 정보를 kubeconfig라는 파일에 해라
kubectl config set-credentials kjh \
--client-certificate=kjh.crt \
--client-key=kjh.key \
--embed-certs=true \
--kubeconfig=kjh.kubeconfig
kubectl config set-context tls-context \ # 어떤 유저를 넣을건데 ?
--cluster=k8s-tls-example \
--user=kjh \
--kubeconfig=kjh.kubeconfig
kubectl config use-context tls-context --kubeconfig=kjh.kubeconfig # 이tls는 kjh.kubeconfig파일을 사용해라
}
# base64 로 열어서 디버깅을해서 이 인증서가 맞는지 여부 판단하기 (잘됟던 쿠버네티스가 안된다하면)
root@~: kubectl get nodes --kubeconfig kjh.kubeconfig
Error from server (Forbidden): nodes is forbidden:
User "kjh" cannot list resource "nodes" in API group "" at the cluster scope
# 인증이 되었는데, 인가가 아직 안되었어 (권한이없다 ? ) 이유 : 어떠한 role도 부여한적이없기때문에
kubectl get clusterrole # clusterrole 종류
kubectl get clusterrole cluster-admin -o yaml # 어드민에대한 정보를 yaml로보고싶어
kubectl get clusterrolebinding cluster-admin -o yaml
# cluster role 에대해서 부여를 하는곳 마스터그룹에 속한 사용자들한테
oleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole # 모든 api 모든 리소스 모든 verb
name: cluster-admin
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: Group
name: system:masters
# 클러스터 롤이 생김
cat << EOF | kubectl apply -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: kjh-test
rules:
- apiGroups:
- '*'
resources:
- '*'
verbs: # update fetch delete는 못한다
- get
- list
- nonResourceURLs:
- '*'
verbs:
- get
- list
EOF
cat << EOF | kubectl apply -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: kjh-test
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: kjh-test
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: User
name: kjh
EOF
# 하고나서 아까 안되던 에러부분이 다시 잘됨
kubectl get nodes --kubeconfig kjh.kubeconfig # 정상작동
kubectl label nodes kjh-kubeadm-master-1 {{ id }}=mine --overwrite --kubeconfig {{ id }}.kubeconfig
# kjh 라벨을 붙일려고 이렇게 작성을 했는데 이렇게 작성할경우 또 forbidden 으로 뜬다
# 이유 verb에서 get , list 만 넣었기때문에
cat << EOF | kubectl apply -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: kjh-test
rules:
- apiGroups:
- '*'
resources:
- '*'
verbs:
- get
- patch
- list
- nonResourceURLs:
- '*'
verbs:
- get
- list
EOF
# 이후
kubeconfig kjh.kubeconfig --overwrite
# 정상작동
kubectl get nodes --show-labels
# 이거를 갖고있는사람은
cat << EOF | kubectl apply -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: kjh-test
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: kjh-test
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: User
name: kjh
- kind: ServiceAccount
name: kjh-test
namespace: default
EOF
{
kubectl config set-cluster k8s-tls-example \
--certificate-authority=ca.crt \
--embed-certs=true \
--server=https://hody:6443 \
--kubeconfig=kjh-token.kubeconfig
kubectl config set-credentials kjh-token \
--token={{ decodedToken }}2) \ # secret 웹토큰을 집어넣으면됨 (2)
--kubeconfig=kjh-token.kubeconfig
kubectl config set-context token-context \
--cluster=k8s-tls-example \
--user=kjh-token \
--kubeconfig={{ id }}-token.kubeconfig
kubectl config use-context token-context --kubeconfig={{ id }}-token.kubeconfig
}
#(2)
echo $(kubectl get secret $(kubectl get secret | grep kjh-test | awk '{print $1}' ) -o json|jq -r .data.token) | base64 --decode && echo
-------------
kubectl get sa kjh-test -o yaml
보여진 yaml 에서 secret 값 복사
kubectl get secret kjh-test-token-wlhd5 -o yaml # secret에대한 상세정보 토큰 등등
echo 토큰 | base64 -d => jwt 토큰
{
kubectl config set-cluster k8s-tls-example \
--certificate-authority=ca.crt \
--embed-certs=true \
--server=https://host:6443 \
--kubeconfig=kjh-token.kubeconfig
kubectl config set-credentials kjh-token \
--token=eyJhbGciOiJSUzI1NiIsImtpZCI6IlpSLU13cGVFbTIyWDZXak9UNF94M3FKZTAzQTBIbVlsQm83UFYzU3Z5TVkifQ \
--kubeconfig=kjh-token.kubeconfig
kubectl config set-context token-context \
--cluster=k8s-tls-example \
--user=kjh-token \
--kubeconfig=kjh-token.kubeconfig
kubectl config use-context token-context --kubeconfig=kjh-token.kubeconfig
}
eyJhbGciOiJSUzI1NiIsImtpZCI6IlpSLU13cGVFbTIyWDZXak9UNF94M3FKZTAzQ...
echo $(kubectl get secret $(kubectl get secret | grep kjh-test | awk '{print $1}' ) -o json|jq -r .data.token) | base64 --decode && echo
kubectl get nodes --kubeconfig={{ id }}-token.kubeconfig
kubectl get nodes --kubeconfig=kjh-token.kubeconfig
# 잘되는지 하번보자