이쿠의 슬기로운 개발생활

함께 성장하기 위한 보안 개발자 EverNote 내용 공유

클라우드/Kubernetes

20. Kubernetes 인증 ( Proxy )

이쿠우우 2020. 8. 29. 19:16
반응형

Kubernetes Proxy 인증

 

 


Kubernetes 인증 관련 글 이동 

1. Kubernetes 인증 ( Authentication ) 이론
2. Kubernetes 인증 ( Basic Authentication )
3. Kubernetes 인증 ( TLS )
4. Kubernetes 인증 ( Bearer Token )
5. Kubernetes 인증 ( Webhook )
6. Kubernetes 인증 ( Webhook 외부 인증 연동 )
7. Kubernetes 인증 ( Webhook 외부 인증 LDAP )
8. Kubernetes 인증 ( Proxy )


 

 

 

참고) 환경

 

Proxy Server

 OS = CentOS 7

 리눅스 커널 버전 : Linux 3.10.0-1062.el7.x86_64

 

Master Node server

 OS = CentOS 7

 리눅스 커널 버전 : Linux 3.10.0-1062.el7.x86_64

 docker version : 1.13.1

 api verison : 1.26

 

Worker Node server

 OS = CentOS 7

 리눅스 커널 버전 : Linux 3.10.0-1062.el7.x86_64

 docker version : 1.13.1

 api verison : 1.26

 

Kubernetes version

 1.18

 

 


 

Nginx Proxy 인증 Server 구축 및 적용

 

 

[ 목표 ]

Proxy 인증 Server를 생성해서

Proxy을 통해 Kubernetes와 연동하는 형태로

kubernetes 인증 서버를 구성.

 


 

 

1. Proxy Server란?

 

Proxy = '대리'라는 의미

Client와 Server간 통신에 있어서 가운데에서 중계 기능을 수행하는 것으로

Client의 요청을 받아 중계하는 서버 역할을 수행.

 

[Proxy 인증 Server 장점]

1. API 서버 보안 강화

API 서버의 주소를 사용자로부터 직접적으로 노출시키지 않기 때문에 

API 서버의 보안 측면이 강화됨.

 

2. API 서버 추상화

사용자는 Proxy 서버의 IP만 알고 있기 때문에 

앞서 얘기한 보안 측면과 더불어 API 서버의 주소가 바뀌게 되더라도 

사용자 입장에서는 변경점 없이 동일한 IP로 접근을 할 수 있음.

 

2. 가용성 증대

Proxy 서버가 API 서버 앞단에 위치하며 LoadBalancer 역할까지 수행할 수도 있음. 

복수의 API 서버를 Proxy 서버 뒤에 놓게 되면 부하 분산 효과와 더불어 가용성을 증대시킬 수 있음

 

3. 트래픽 모니터링

사용자가 항상 Proxy 서버를 거치기 때문에 Proxy 서버에 

적절한 모니터링 기능을 탑재한다면 API 서버 호출량 및 트래픽 등을 확인할 수 있음

 

 

 


 

 

2. Kubernetes Proxy 인증 설정 작업

(Kubernetes Master Node 에서 작업)

 

2.1. kubernetes API Server 설정

 

kubernets API Server default 설정 그대로 사용하면 되지만

한번 더 확인

 

[명령어]

cd /etc/kubernetes/manifests

vi kube-apiserver.yaml

 

 

추가 후  적용 명령어 : kubeadm init --config kube-apiserver.yaml

 또는

kubectl apply -f /etc/kubernetes/manifests/kube-apiserver.yaml

적용 후 

kubectl get all -n kube-system 으로 상태 확인.

 

2.2. 설정 설명

 

2.2.1. API 서버 Cert 설정

--tls-cert-file:   API 서버의 인증서

--tls-private-key-file:   API 서버 인증서 개인키

 

2.2.2. Client CA 설정

--requestheader-client-ca-file:   클라이언트 인증서를 확인할 CA 인증서

--requestheader-allowed-names:   CA를 통해 검증된 인증서 중 특정 이름을 가진 인증서만 선별하여 허용 가능.

 

2.2.3. Proxy Header 설정

--requestheader-username-headers:   kubernetes 사용자로 식별할 헤더 이름 설정

--requestheader-group-headers:   kuberentes  그룹으로 식별할 헤더 이름 설정

--requestheader-extra-headers-prefix:   그 외 추가 헤더 이름 설정

 

 

 


 

 

 

3. Nginx Proxy 인증 Server 구축

(Proxy 구축할 서버에서 작업)

 

Proxy Server는  container로 실행.

docker 가 설치 되어있는 서버에서 진행.

 

3.1. Nginx Proxy Server 구축을 위해 Nginx 이미지 pull

 

[명령어]

docker pull nginx

 

3.2.  Nginx 컨테이너 실행 후 컨테이너 들어가서 기본 tool download

 

[nginx를 https port로 접근하도록 실행]

docker run -d -it --name ProxyAuthServer -p 8443:443 [nginx 이미지 id]

 

[실행시킨 docker 안으로 들어가기]

docker exec -it [컨테이너 id] /bin/bash

 

[기본 tool download]

apt-get update

apt-get install -y vim

apt-get install -y net-tools

apt-get install -y apache2-utils jq

apt-get install -y curl

 

 

 

3.3.  htpasswd tool로  id, password 생성

 

사용자가 Proxy Server에 접근하는 인증 용도로

Basic Authentication 방법을 사용

참고 : Proxy Server 접근 인증 방법으로는 LDAP 등 다양한 방법 적용 가능

 

[명령어]

htpasswd -cb [생성할 디렉터리 경로] [ID] [Password]

예) htpasswd -cb /etc/nginx/conf.d/iksoon_auth iksoon qwer1234

 

 

[계정을 추가하고 싶다면?]

htpasswd 명령으로 계정을 추가한 뒤

동일한 파일에 추가하면 계정 여러 개를 사용할 수 있음

 

 

3.4. Nginx Container에 인증서 복사

 

[kubernetes master node]

/etc/kubernetes/pki 경로에 있는

  • ca.crt
  • apiserver.crt
  • apiserver.key
  • front-proxy-client.crt 
  • front-proxy-client.key 

5개 파일을 복사.

 

[Nginx Proxy Server]

/etc/nginx/conf.d 디렉터리에 복사해놓음

 

 

3.5.  Nginx 설정 파일 편집

 

/etc/nginx/conf.d/default.conf 파일 편집

 

 

[설정 추가]

 server {
 
    # [ https로만 접근 가능하게 설정 ]
    listen  443 ssl;  
    server_name  localhost;
 
    # [ Nginx Proxy Server HTTPS 설정 ]
    # Kubernetes Master Node의 apiserver 인증서를 사용
    ssl_certificate      /etc/nginx/conf.d/apiserver.crt;  # Proxy Server 인증서 설정
    ssl_certificate_key  /etc/nginx/conf.d/apiserver.key;  # Proxy Server 인증서의 개인키 설정
 
 
    # [ Proxy Access authentication ]
    # Client 가 Proxy Server에 접속할 때 사용하는 인증 방식 설정
    # 아래의 설정은 Basic Authentication 방식을 사용했지만 
    # LDAP 등 다양한 인증 기능 적용 가능.
    auth_basic "iksoonAuthTest";    # 사용자 검증을 위해 Basic Auth 방식 사용
    auth_basic_user_file /etc/nginx/conf.d/iksoon_auth; # 상위 htpasswd로 생성했던 파일 경로를 넣어줌
 
 
    location / {
        # [ Kubernetes Master Node 주소 설정]
        proxy_pass https://192.168.133.128:6443;  
 
        # [ Proxy Server 가 kubernetes에 접근하기 위한 인증서 설정 ]
        # Kubernetes Master Node의 front-proxy-client 인증서를 사용
        proxy_ssl_certificate     /etc/nginx/conf.d/front-proxy-client.crt;
        proxy_ssl_certificate_key /etc/nginx/conf.d/front-proxy-client.key;
 
        # [ Proxy Pass Header 설정 ]
        # $remode_user로 설정 시 kubeconfig 파일 등에 명시한 User의 name 이 전달됨
        # $remode_user로 사용하지 않고 직접 계정을 넣어줘도 정상 동작함.
        proxy_set_header X-Remote-User $remote_user;  # K8S API Server에 전달할 사용자 식별 (RBAC 설정과 매칭 됨)
        # 그룹을 system:master로 설정하면 관리자 권한을 부여함
        # 해당 설정을 사용하지 않고 User만 전달하면 해당 User이름과 동일한 Rolebinding 적용 가능
        proxy_set_header X-Remote-Group system:masters; # K8S API Server에 전달할 그룹 식별
 
        # [ API Server CA ] 
        # API 서버의 인증서를 검증하기 위해 API 서버 인증키를 발급한 CA 인증서를 설정
        # API 서버의 검증할 인증서 이름을 설정. (API 서버의 SAN (Subject Alternative Name)을 입력)
        proxy_ssl_trusted_certificate /etc/nginx/conf.d/ca.crt;
        proxy_ssl_name                kubernetes;
        proxy_ssl_verify              on;  # 서버 인증서 검증을 활성화. (default는 비활성화)
    }


    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

 

 

 

 

 

3.6. nginx 재시작해서 설정 적용

 

service nginx restart

명령을 하면 컨테이너가 종료될 것임.

 

docker ps -a 

명령으로 정지된 container id 확인 후

 

docker start [container id]

명령으로 container 시작하면 상위의 설정이 적용돼서 nginx 가 시작됨

 

 

 


 

4. Client에서 접속 테스트

(kubectl 명령으로 붙고자 하는 Client에서 작업)

 

 

4.1.  Proxy Server로 접근하고자 하는 Client 도메인 설정 편집

 

[주의]

한 가지 주의해야 할 점은 server의 인증서가 kubernetes 전용으로 만들어졌기 때문에 

localhost로 인증을 할 수 없음.

이를 우회하고자 Client에서 /etc/hosts 파일 수정 작업이 필요함.

proxy server 접속 주소를 /etc/hosts 파일에서 kuberentes로 설정.

테스트 환경은 proxy server 가 127.0.0.1 이므로 아래와 같이 설정

 

[vi /etc/hosts]

127.0.0.1 kubernetes

 

 

4.2. crul 명령으로 접속 Test

 

[접속 test 명령어]

curl --cacert ca.crt -v -H "Authorization: Basic $(echo -n iksoon:qwer1234 | base64)" https://kubernetes:8443/api

 

[ --cacert ca.crt ]

Nginx Proxy Server의 HTTPS 설정에 사용된 apiserver.crt 인증서는

kubernetes master node의 인증서를 사용했으므로

apiserver.crt 인증서와 발급기관이 동일하거나 인증 체인에 속해있는 인증서를 사용해서 접근해야 

신원확인이 가능해서 

kubernetes master node의 /etc/kubernetes/pki 경로에 있는 ca.crt 인증서를 사용해서 

Proxy Server로 접근함

 

 

[성공 시 결과]

 

[ 실패 시 결과 ]

 

 

 

4.3. kubectl 명령으로 접속 test

 

kubectl을 사용할 client kubeconfig 파일 환경변수 설정 작업 진행

export KUBECONFIG="kubeconfig 파일 경로"

 

[ kubeconfig.conf 파일 예시 ]

apiVersion: v1
kind: Config
clusters:
- cluster:
    insecure-skip-tls-verify: true
    server: https://kubernetes:8443  # Proxy Server IP:Port 설정 
    # https접속에 사용한 인증서가 kubernetes master node의 apiserver.crt 이므로
    # IP는 무조건 kubernetes로 설정되어야 정상 접속 가능함
  name: kubernetes
contexts:
- context:
    cluster: kubernetes
    user: iksoon
  name: iksoon-test@kubernetes
current-context: iksoon-test@kubernetes
users:
- name: iksoon
  user:
    username: iksoon 
    password: qwer1234

 

 

kubeconfig.conf로  KUBECONFIG 환경변수가 설정되어 있어서

kubectl 명령하면 default로 KUBECONFIG 경로를 참조해서 동작함

 

[결과 확인]

 

 

 

 

 


제 글을 복사할 시 출처를 명시해주세요.
글에 오타, 오류가 있다면 댓글로 알려주세요! 바로 수정하겠습니다!


 

 

 

 

 

 

 

 

참고

https://coffeewhale.com/kubernetes/authentication/proxy/2020/05/06/auth05/

https://coffeewhale.com/kubernetes/authentication/x509/2020/05/02/auth01/

https://docs.docker.com/registry/recipes/nginx/

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형