hongkunyoo / blog-comments

blog comments for utteranc.es
1 stars 0 forks source link

k8s 인증 완벽이해 #5 - Proxy 인증 | 커피고래의 노트 #30

Open utterances-bot opened 2 years ago

utterances-bot commented 2 years ago

k8s 인증 완벽이해 #5 - Proxy 인증 | 커피고래의 노트

쿠버네티스 인증 완벽 이해 시리즈 5탄, Proxy를 통한 쿠버네티스 인증에 대해서 살펴보는 시간을 가져 보겠습니다.

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

taekou commented 2 years ago

아래와 같이 파일이 있음에도 불구하고 에러가 발생하는데 혹 잘못 설정한 부분이 있을까요?

root@master:~/temp/ProxyAuth# docker run -p 8443:443 -v $(pwd):/etc/nginx/conf.d nginx
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: /etc/nginx/conf.d/default.conf differs from the packaged version
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2021/07/22 08:38:59 [emerg] 1#1: cannot load certificate "/etc/kubernetes/pki/front-proxy-client.crt": BIO_new_file() failed (SSL: error:02001002:system library:fopen:No such file or directory:fopen('/etc/kubernetes/pki/front-proxy-client.crt','r') error:2006D080:BIO routines:BIO_new_file:no such file)
nginx: [emerg] cannot load certificate "/etc/kubernetes/pki/front-proxy-client.crt": BIO_new_file() failed (SSL: error:02001002:system library:fopen:No such file or directory:fopen('/etc/kubernetes/pki/front-proxy-client.crt','r') error:2006D080:BIO routines:BIO_new_file:no such file)
root@master:~/temp/ProxyAuth# ls -al /etc/kubernetes/pki/front-proxy-client.crt
-rw-r--r-- 1 root root 1103  4월  2 16:59 /etc/kubernetes/pki/front-proxy-client.crt

==============================================================================

root@master:~/temp/ProxyAuth# cat default.conf
server {
    listen 443 ssl;
    server_name localhost;

    # Proxy Server Cert
    ssl_certificate      /etc/nginx/conf.d/server.pem;
    ssl_certificate_key  /etc/nginx/conf.d/server-key.pem;

    # Proxy auth
    auth_basic "basic auth";
    auth_basic_user_file /etc/nginx/conf.d/auth;

    location / {
      proxy_pass https://192.168.137.10:6443;

      # Proxy Client Cert
      proxy_ssl_certificate         /etc/kubernetes/pki/front-proxy-client.crt;
      proxy_ssl_certificate_key     /etc/kubernetes/pki/front-proxy-client.key;

      # Proxy header
      proxy_set_header X-Remote-User $remote_user;
      proxy_set_header X-Remote-Group system:masters;

      # API server CA
      proxy_ssl_trusted_certificate /etc/kubernetes/pki/ca.crt;
      proxy_ssl_name                kubernetes;
      proxy_ssl_verify              on;

    }
}
hongkunyoo commented 2 years ago

@taekou 님, root@master가 host 서버인거죠? 그렇다면 아마 볼륨 마운트가 안되어 있어서 그런 것 같습니다. 다음과 같이 한번 실행해 보시겠어요?

docker run -p 8443:443 -v /etc/kubernetes:/etc/kubernetes -v $(pwd):/etc/nginx/conf.d nginx
skyoo2003 commented 6 months ago

안녕하세요! 프록시 인증 방식 적용에 참고가 되었습니다. 감사합니다 !

다만, 한가지 문의사항이 있습니다. kubeconfig의 user에 username, password를 설정하고 kubectl 명령을 실행하면 프록시 서버로 Authorization 헤더가 전달 안되는 것으로 보이는데요. 혹시, 관련해서 해결 방법이 있을까요?

테스트한 내용은 아래와 같습니다.

첫 번째는 kubectl 요청이고, 두 번째는 curl 요청으로 남은 nginx access log 입니다. 타임스탬프 왼쪽에 $remote_user 를 로깅하고 있는데, 첫 번째는 전달 받은게 없고, 두 번째 요청만 계정 이름이 전달 되었습니다.

1.1.1.1 - - [16/Jan/2024:21:21:06 +0900] "GET /api/v1/namespaces/kube-system/services?labelSelector=kubernetes.io%2Fcluster-service%3Dtrue HTTP/1.1" 200 95 "-" "kubectl/v1.26.12 (darwin/arm64) kubernetes/df63cd7" "-"
1.1.1.1 - user [16/Jan/2024:21:22:01 +0900] "GET /api/v1/namespaces/default/pods?limit=500 HTTP/1.1" 200 116 "-" "curl/8.1.2" "-"

kubectl 명령에서 사용한 kubeconfig 파일은 아래와 같습니다.

apiVersion: v1
kind: Config
clusters:
- cluster:
    server: http://<PROXY_ADDR>
  name: kubernetes
contexts:
- context:
    cluster: kubernetes
    user: user
  name: user@kubernetes
users:
- name: user
  user:
    username: user
    password: passwd
current-context: user@kubernetes
preferences: {}

curl로 테스트한 명령은 아래와 같습니다.

curl -v -H "Authorization: Basic $(echo -n user:passwd | base64)" 'http://<PROXY_ADDR>/api/v1/namespaces/default/pods?limit=500'
hongkunyoo commented 5 months ago

안녕하세요. @skyoo2003 님. 아마도 https 설정이 안되어서 그런게 아닐까 의심되는데요. 이렇게 한번 실행해 보시겠어요?

apiVersion: v1
kind: Config
clusters:
- cluster:
    insecure-skip-tls-verify: true        # 추가
    server: https://<PROXY_ADDR>   # http --> https
  name: kubernetes
contexts:
- context:
    cluster: kubernetes
    user: user
  name: user@kubernetes
users:
- name: user
  user:
    username: user
    password: passwd
current-context: user@kubernetes
preferences: {}

아울러 실행하실 때 -v 9 옵션을 추가해주시면 조금 더 상세한 정보가 나옵니다.

kubectl cluster-info -v 9
# xxx loader.go:395] Config loaded from file:  kubeconfig
# xxx round_trippers.go:466] curl -v -XGET  -H "User-Agent: kubectl/v1.28.3 (xx) kubernetes/a8a1abc" -H "Accept: application/json;g=apidiscovery.k8s.io;v=v2beta1;as=APIGroupDiscoveryList,application/json" -H "Authorization: Basic <masked>" 'https://xxx/api?timeout=32s'

Authorization: Basic <masked> 가 출력되는지 확인