- TCP/IP는 OSI 7 Layer 를 4개로 단순화 하여 구현
- TCP/IP는 3,4 계층을 중심으로 한 통신 프로토콜의 계층 집합
Istio TLS Option 설정하기
Permissive mTLS
Stict mTLS
https://m.blog.naver.com/freepsw/221974847879
그런데... 인증서는 뭐지? 또 어디 사용되는거지?
1. 쿠버네티스는 인증서와 토큰을 이용하여 사용자 인증을 한다고 하는데... 어떻게 처리되고 있는 것일까?
2. 위에서 봤던 TLS인증을 istio가 아닌 kubernetes에서 좀 더 살펴 보려고 한다.
인증서에 대한 카테고리
쿠버네티스의 인증 및 접근 제어 체계
Authentication: 접속한 사람의 신분을 시스템이 인증하는 단계입니다. (신분증 확인)
Authorization: 누가 어떤 권한을 가지고 어떤 행동을 할 수 있는지 확인하는 단계입니다. (view권한, create권한 등)
Admission Control: 인증과 권한확인 이후에 추가적으로 요청 내용에 대한 검증이나 요청 내용을 강제로 변경할 때 사용합니다.
그럼 TLS, SSL인증에 사용되는 X.509 Certificate에 대해서 알아보자.
PKI (Public key Infrastructure)
PKI 기술에 대한 3가지
1. Public Private Key : 각 키마다 고유의 역할을 가짐
2. Certificate - 인증서
3. CA (Certificate Authrity) - Certificate 인증해주는 공인 인증 기관
Certificate를 이용한 사용자 인증 방법
인증서 발급
TLS가 적용된 HTTPS 웹 서버 구성
Server Certificate 방법
HTTP 요청 : 실패
- curl http://localhost:8443/
HTTPS 요청 : 성공
- curl --cacert rootCA.pem https://localhost:8443/
Client Certificate 방법
HTTS 일반 요청 : 실패
- curl --cacert rootCA.pem https://localhost:8443/
HTTPS 클라이언트 인증서 포함 요청 : 성공
- curl --cacert rootCA.pem --cert client.pem --key client-key.pem https://localhost:8443/
그러면... 쿠버네티스에서 제공하는 인증서를 사용해 보자
kubeadm을 통해서 생성된 PKI를 이용한 서버 인증을 할수 있다.
kubernetes에서의 각 rootCA, 인증서, key의 위치는 어떤것일까?
rootCA : /etc/kubernetes/pki/ca.crt
server.pem : /etc/kubernetes/pki/apiserver.crt
server-key.pem : /etc/kubernetes/pki/apiserver.key
- 참고로 pem, crt, key는 위에 설명했듯이 확장자만 다른것이다.
client.pem : /etc/kubernetes/admin.conf안에 client-certificate-data가 있다.
client-key.pem : /etc/kubernetes/admin.conf안에 client-key-data가 있다.
이 정보들은 nginx를 사용한다면, 아래와 같이 들어갈 수 있다.
# $HOME/auth/default.conf
server {
listen 443 ssl;
server_name localhost;
ssl_certificate /etc/nginx/conf.d/k8s-server.pem;
ssl_certificate_key /etc/nginx/conf.d/k8s-server-key.pem;
ssl_verify_client on;
ssl_client_certificate /etc/nginx/conf.d/k8s-rootCA.pem;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
주의 사항
server 인증서가 kubernetes 전용으로 만들어졌기에 localhost로 인증이 안되기 때문에 local server로 테스트시 아래와 같은 설정이 필요하다.
sudo vi /etc/hosts
127.0.0.1 localhost
127.0.0.1 kubernetes # kubernetes --> 127.0.0.1로 매핑
curl --cacert k8s-rootCA.pem --cert k8s-client.pem --key k8s-client-key.pem https://kubernetes:8443/
쿠버네티스에 인증서는 어떻게 더 사용될까?
쿠버네티스에 인증서는 어디에 있을까?
위치 : /etc/kubernets/pki
xxxx@master-node:~$ ls /etc/kubernetes/pki/ -R | sed -e 's/:$//' -e 's/[^-][^\/]*\//--/g' -e 's/^/ /' -e 's/-/|/'
|-----
apiserver.crt - apiserver 인증서
apiserver.key - apiserver Key
apiserver-etcd-client.crt - apiserver에서 etcd사용을위한 client 인증서
apiserver-etcd-client.key - apiserver에서 etcd사용을위한 client Key
apiserver-kubelet-client.crt - apiserver에서 kubelet사용을 위한 client 인증서
apiserver-kubelet-client.key - apiserver에서 kubelet사용을 위한 client Key
ca.crt - 쿠버네티스 일반 CA
ca.key - 쿠버네티스 일반 CA key
front-proxy-ca.crt - kube-proxy에서 apiserver 확장했을때, kube-proxy에서 필요함
front-proxy-ca.key
front-proxy-client.crt
front-proxy-client.key
sa.key - 서비스 계정 관리 Private key
sa.pub - 서비스 계정 관리 Public key
etcd/ : forlder - etcd 관련 기능에 사용
ca.crt
ca.key
healthcheck-client.crt
healthcheck-client.key
peer.crt
peer.key
server.crt
server.key
그렇다면... 쿠버네티스의 CA를 이용하여 신규 인증서 발급을 할수 있겠네?
cat > k8s-new-client-csr.json <<EOF
{
"CN": "k8s-new-client",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"O": "system:masters"
}
]
}
EOF
# Organazation (O)을 system:masters 라고 지정의미는 쿠버네티스에서는 사용자를 user와 group으로 인식하는데 이때 Organazation (O) 영역을 group으로 인식
# system:masters 그룹은 쿠버네티스 마스터 그룹을 뜻하는 예약어
# k8s-new-client라는 유저가 마스터와 동일하게 모든 권한을 소유
# names.O property에 system:masters 설정
cfssl gencert \
-ca=k8s-rootCA.pem \ # 쿠버네티스 CA 인증서 사용
-ca-key=k8s-rootCA-key.pem \ # 쿠버네티스 CA key 사용
-config=rootCA-config.json \
-profile=root-ca \
k8s-new-client-csr.json | cfssljson -bare k8s-new-client
ls -l
k8s-new-client-csr.json # 신규 사용자 인증서 csr json
k8s-new-client.pem # 신규 사용자 인증서
k8s-new-client-key.pem # 신규 사용자 private key
# 기존 admin 사용자 kubeconfig 파일 복사
sudo cp /etc/kubernetes/admin.conf $HOME/kubeconfig
sudo chown $(id -u):$(id -g) $HOME/kubeconfig
# kubectl 신규 사용자 설정 - X.509
kubectl config --kubeconfig=$HOME/kubeconfig set-credentials x509 --client-certificate=k8s-new-client.pem --client-key=k8s-new-client-key.pem
kubectl config --kubeconfig=$HOME/kubeconfig set-context kubernetes-admin@kubernetes --user=x509
kubectl config --kubeconfig $HOME/kubeconfig view
# api 서버 주소 확인
kubectl cluster-info
# Kubernetes master is running at https://XXXX:XXX
# API 서버 주소 및 포트 설정
API_SERVER_ADDR=XXXX # 예시) localhost
API_SERVER_PORT=XXX # 예시) 6443
# curl - 신규 X.509 사용자 인증
curl --cacert k8s-rootCA.pem --cert k8s-new-client.pem --key k8s-new-client-key.pem https://$API_SERVER_ADDR:$API_SERVER_PORT/api
# kubectl - 신규 X.509 사용자 인증
kubectl --kubeconfig=$HOME/kubeconfig get pod -n kube-system
# 혹은 직접 파라미터를 이용하여 호출할 수도 있습니다.
kubectl get pod -n kube-system --client-certificate=k8s-new-client.pem --client-key=k8s-new-client-key.pem
https://coffeewhale.com/kubernetes/authentication/x509/2020/05/02/auth01/