Kubernetes ๋ณด์•ˆ์˜ ABC: ์ธ์ฆ, ๊ถŒํ•œ ๋ถ€์—ฌ, ๊ฐ์‚ฌ

Kubernetes ๋ณด์•ˆ์˜ ABC: ์ธ์ฆ, ๊ถŒํ•œ ๋ถ€์—ฌ, ๊ฐ์‚ฌ

์กฐ๋งŒ๊ฐ„ ์‹œ์Šคํ…œ ์šด์˜ ์ค‘์— ์ธ์ฆ ๋ณด์žฅ, ๊ถŒํ•œ ๋ถ„๋ฆฌ, ๊ฐ์‚ฌ ๋ฐ ๊ธฐํƒ€ ์ž‘์—…๊ณผ ๊ฐ™์€ ๋ณด์•ˆ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. Kubernetes์šฉ์œผ๋กœ ์ด๋ฏธ ์ƒ์„ฑ๋จ ๋งŽ์€ ์†”๋ฃจ์…˜์ด๋ฅผ ํ†ตํ•ด ๋งค์šฐ ๊นŒ๋‹ค๋กœ์šด ํ™˜๊ฒฝ์—์„œ๋„ ํ‘œ์ค€์„ ์ค€์ˆ˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. K8s์˜ ๋‚ด์žฅ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ๋‚ด์—์„œ ๊ตฌํ˜„๋˜๋Š” ๋ณด์•ˆ์˜ ๊ธฐ๋ณธ ์ธก๋ฉด์— ๋Œ€ํ•ด์„œ๋„ ๋™์ผํ•œ ์ž๋ฃŒ๊ฐ€ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ์šฐ์„ , ๋ณด์•ˆ ๊ด€๋ จ ๋ฌธ์ œ๋ฅผ ์—ฐ๊ตฌํ•˜๊ธฐ ์œ„ํ•œ ์ถœ๋ฐœ์ ์œผ๋กœ Kubernetes์— ์ต์ˆ™ํ•ด์ง€๊ธฐ ์‹œ์ž‘ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ธ์ฆ

Kubernetes์—๋Š” ๋‘ ๊ฐ€์ง€ ์œ ํ˜•์˜ ์‚ฌ์šฉ์ž๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์„œ๋น„์Šค ๊ณ„์ • โ€” Kubernetes API๋กœ ๊ด€๋ฆฌ๋˜๋Š” ๊ณ„์ •
  • ์‚ฌ์šฉ์ž โ€” ์™ธ๋ถ€์˜ ๋…๋ฆฝ์ ์ธ ์„œ๋น„์Šค์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜๋Š” "์ผ๋ฐ˜" ์‚ฌ์šฉ์ž์ž…๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์œ ํ˜• ๊ฐ„์˜ ์ฃผ์š” ์ฐจ์ด์ ์€ ์„œ๋น„์Šค ๊ณ„์ •์˜ ๊ฒฝ์šฐ Kubernetes API์— ํŠน์ˆ˜ ๊ฐœ์ฒด๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(์ด๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ˜ธ์ถœํ•จ). ServiceAccounts)์€ Secrets ์œ ํ˜•์˜ ๊ฐ์ฒด๋กœ ํด๋Ÿฌ์Šคํ„ฐ์— ์ €์žฅ๋œ ์ธ์ฆ ๋ฐ์ดํ„ฐ ์„ธํŠธ์™€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์‚ฌ์šฉ์ž(์„œ๋น„์Šค ๊ณ„์ •)๋Š” ์ฃผ๋กœ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‹คํ–‰๋˜๋Š” ํ”„๋กœ์„ธ์Šค์˜ Kubernetes API์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ผ๋ฐ˜ ์‚ฌ์šฉ์ž๋Š” Kubernetes API์— ํ•ญ๋ชฉ์ด ์—†์œผ๋ฉฐ ์™ธ๋ถ€ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํ†ตํ•ด ๊ด€๋ฆฌ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ ์™ธ๋ถ€์— ๊ฑฐ์ฃผํ•˜๋Š” ์‚ฌ๋žŒ์ด๋‚˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ฐ API ์š”์ฒญ์€ ์„œ๋น„์Šค ๊ณ„์ •, ์‚ฌ์šฉ์ž์™€ ์—ฐ๊ฒฐ๋˜๊ฑฐ๋‚˜ ์ต๋ช…์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์ธ์ฆ ๋ฐ์ดํ„ฐ์—๋Š” ๋‹ค์Œ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

  • ID / Username โ€” ์‚ฌ์šฉ์ž ์ด๋ฆ„(๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„!);
  • UID - "์‚ฌ์šฉ์ž ์ด๋ฆ„๋ณด๋‹ค ๋” ์ผ๊ด€๋˜๊ณ  ๊ณ ์œ ํ•œ" ๊ธฐ๊ณ„ ํŒ๋… ๊ฐ€๋Šฅํ•œ ์‚ฌ์šฉ์ž ์‹๋ณ„ ๋ฌธ์ž์—ด
  • ๊ทธ๋ฃน โ€” ์‚ฌ์šฉ์ž๊ฐ€ ์†ํ•œ ๊ทธ๋ฃน ๋ชฉ๋ก
  • ์—ฌ๋ถ„์˜ โ€” ์ธ์ฆ ๋ฉ”์ปค๋‹ˆ์ฆ˜์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ถ”๊ฐ€ ํ•„๋“œ์ž…๋‹ˆ๋‹ค.

Kubernetes๋Š” X509 ์ธ์ฆ์„œ, Bearer ํ† ํฐ, ์ธ์ฆ ํ”„๋ก์‹œ, HTTP ๊ธฐ๋ณธ ์ธ์ฆ ๋“ฑ ๋‹ค์–‘ํ•œ ์ธ์ฆ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋ฉด ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ํฌํ•จ๋œ ์ •์  ํŒŒ์ผ๋ถ€ํ„ฐ OpenID OAuth2๊นŒ์ง€ ๋‹ค์–‘ํ•œ ์ธ์ฆ ์ฒด๊ณ„๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ์—ฌ๋Ÿฌ ์ธ์ฆ ์ฒด๊ณ„๋ฅผ ๋™์‹œ์— ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ํด๋Ÿฌ์Šคํ„ฐ๋Š” ๋‹ค์Œ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • ์„œ๋น„์Šค ๊ณ„์ • ํ† ํฐ - ์„œ๋น„์Šค ๊ณ„์ •์šฉ
  • X509 - ์‚ฌ์šฉ์ž์šฉ.

ServiceAccounts ๊ด€๋ฆฌ์— ๋Œ€ํ•œ ์งˆ๋ฌธ์€ ์ด ๋ฌธ์„œ์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ณ  ์‹ถ์€ ๋ถ„๋“ค์€ ๋‹ค์Œ์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๊ณต์‹ ๋ฌธ์„œ ํŽ˜์ด์ง€. X509 ์ธ์ฆ์„œ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์— ๋Œ€ํ•œ ๋ฌธ์ œ๋ฅผ ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž์šฉ ์ธ์ฆ์„œ(X.509)

์ธ์ฆ์„œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ํ‚ค ์ƒ์„ฑ:
    mkdir -p ~/mynewuser/.certs/
    openssl genrsa -out ~/.certs/mynewuser.key 2048
  • ์ธ์ฆ์„œ ์š”์ฒญ ์ƒ์„ฑ:
    openssl req -new -key ~/.certs/mynewuser.key -out ~/.certs/mynewuser.csr -subj "/CN=mynewuser/O=company"
  • Kubernetes ํด๋Ÿฌ์Šคํ„ฐ CA ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์ฆ์„œ ์š”์ฒญ ์ฒ˜๋ฆฌ, ์‚ฌ์šฉ์ž ์ธ์ฆ์„œ ์–ป๊ธฐ(์ธ์ฆ์„œ๋ฅผ ์–ป์œผ๋ ค๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹ค์Œ ์œ„์น˜์— ์žˆ๋Š” Kubernetes ํด๋Ÿฌ์Šคํ„ฐ CA ํ‚ค์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” ๊ณ„์ •์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. /etc/kubernetes/pki/ca.key):
    openssl x509 -req -in ~/.certs/mynewuser.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out ~/.certs/mynewuser.crt -days 500
  • ๊ตฌ์„ฑ ํŒŒ์ผ ์ƒ์„ฑ:
    • ํด๋Ÿฌ์Šคํ„ฐ ์„ค๋ช…(ํŠน์ • ํด๋Ÿฌ์Šคํ„ฐ ์„ค์น˜์— ๋Œ€ํ•œ CA ์ธ์ฆ์„œ ํŒŒ์ผ์˜ ์ฃผ์†Œ ๋ฐ ์œ„์น˜ ์ง€์ •):
      kubectl config set-cluster kubernetes --certificate-authority=/etc/kubernetes/pki/ca.crt --server=https://192.168.100.200:6443
    • ์•„๋‹ˆ๋ฉด ์–ด๋–ป๊ฒŒ ์•„๋‹ˆ๊ถŒ์žฅ ์˜ต์…˜ - ๋ฃจํŠธ ์ธ์ฆ์„œ๋ฅผ ์ง€์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค(๊ทธ๋Ÿฌ๋ฉด kubectl์€ ํด๋Ÿฌ์Šคํ„ฐ์˜ API ์„œ๋ฒ„์˜ ์ •ํ™•์„ฑ์„ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค):
      kubectl config set-cluster kubernetes  --insecure-skip-tls-verify=true --server=https://192.168.100.200:6443
    • ๊ตฌ์„ฑ ํŒŒ์ผ์— ์‚ฌ์šฉ์ž ์ถ”๊ฐ€:
      kubectl config set-credentials mynewuser --client-certificate=.certs/mynewuser.crt  --client-key=.certs/mynewuser.key
    • ์ปจํ…์ŠคํŠธ ์ถ”๊ฐ€:
      kubectl config set-context mynewuser-context --cluster=kubernetes --namespace=target-namespace --user=mynewuser
    • ๊ธฐ๋ณธ ์ปจํ…์ŠคํŠธ ํ• ๋‹น:
      kubectl config use-context mynewuser-context

์œ„์˜ ์กฐ์ž‘ ํ›„ ํŒŒ์ผ์—์„œ .kube/config ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ์„ฑ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

apiVersion: v1
clusters:
- cluster:
    certificate-authority: /etc/kubernetes/pki/ca.crt
    server: https://192.168.100.200:6443
  name: kubernetes
contexts:
- context:
    cluster: kubernetes
    namespace: target-namespace
    user: mynewuser
  name: mynewuser-context
current-context: mynewuser-context
kind: Config
preferences: {}
users:
- name: mynewuser
  user:
    client-certificate: /home/mynewuser/.certs/mynewuser.crt
    client-key: /home/mynewuser/.certs/mynewuser.key

๊ณ„์ •๊ณผ ์„œ๋ฒ„ ๊ฐ„์— ๊ตฌ์„ฑ์„ ๋” ์‰ฝ๊ฒŒ ์ „์†กํ•˜๋ ค๋ฉด ๋‹ค์Œ ํ‚ค์˜ ๊ฐ’์„ ํŽธ์ง‘ํ•˜๋Š” ๊ฒƒ์ด ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • certificate-authority
  • client-certificate
  • client-key

์ด๋ ‡๊ฒŒ ํ•˜๋ ค๋ฉด base64๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ง€์ •๋œ ํŒŒ์ผ์„ ์ธ์ฝ”๋”ฉํ•˜๊ณ  ๊ตฌ์„ฑ์— ๋“ฑ๋กํ•œ ๋‹ค์Œ ํ‚ค ์ด๋ฆ„์— ์ ‘๋ฏธ์‚ฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. -data, ์ฆ‰. ๋ฐ›์€ certificate-authority-data ๊ธฐํƒ€

kubeadm์„ ์‚ฌ์šฉํ•œ ์ธ์ฆ์„œ

์ถœ์‹œ์™€ ํ•จ๊ป˜ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค 1.15 ์•ŒํŒŒ ๋ฒ„์ „ ์ง€์› ๋•๋ถ„์— ์ธ์ฆ์„œ ์ž‘์—…์ด ํ›จ์”ฌ ์‰ฌ์›Œ์กŒ์Šต๋‹ˆ๋‹ค. kubeadm ์œ ํ‹ธ๋ฆฌํ‹ฐ. ์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋Š” ๋ชจ์Šต์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

kubeadm alpha kubeconfig user --client-name=mynewuser --apiserver-advertise-address 192.168.100.200

NB: ํ•„์ˆ˜์˜ ๊ด‘๊ณ  ์ฃผ์†Œ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹ค์Œ ์œ„์น˜์— ์žˆ๋Š” api-server ๊ตฌ์„ฑ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. /etc/kubernetes/manifests/kube-apiserver.yaml.

๊ฒฐ๊ณผ ๊ตฌ์„ฑ์€ stdout์œผ๋กœ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ์œ„์น˜์— ์ €์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ~/.kube/config ์‚ฌ์šฉ์ž ๊ณ„์ • ๋˜๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ์ง€์ •๋œ ํŒŒ์ผ KUBECONFIG.

๋” ๊นŠ์ด ํŒŒ๊ณ ๋“ค๋‹ค

์„ค๋ช…๋œ ๋ฌธ์ œ๋ฅผ ๋” ์ž์„ธํžˆ ์ดํ•ดํ•˜๊ณ  ์‹ถ์€ ๋ถ„๋“ค์„ ์œ„ํ•ด:

๊ถŒํ•œ ๋ถ€์—ฌ

๊ธฐ๋ณธ ์ธ์ฆ ๊ณ„์ •์—๋Š” ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๊ธฐ ์œ„ํ•ด Kubernetes๋Š” ๊ถŒํ•œ ๋ถ€์—ฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

๋ฒ„์ „ 1.6 ์ด์ „์—๋Š” Kubernetes๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ธ์ฆ ์œ ํ˜•์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ABAC (์†์„ฑ ๊ธฐ๋ฐ˜ ์•ก์„ธ์Šค ์ œ์–ด). ์ด์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋‹ค์Œ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณต์‹ ๋ฌธ์„œ. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ ํ˜„์žฌ ๋ ˆ๊ฑฐ์‹œ๋กœ ๊ฐ„์ฃผ๋˜์ง€๋งŒ ๋‹ค๋ฅธ ์ธ์ฆ ์œ ํ˜•๊ณผ ํ•จ๊ป˜ ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํด๋Ÿฌ์Šคํ„ฐ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ„ํ• ํ•˜๋Š” ํ˜„์žฌ์˜ (๊ทธ๋ฆฌ๊ณ  ๋” ์œ ์—ฐํ•œ) ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. RBAC (์—ญํ•  ๊ธฐ๋ฐ˜ ์•ก์„ธ์Šค ์ œ์–ด). ๋ฒ„์ „ ์ดํ›„ ์•ˆ์ •์ ์œผ๋กœ ์„ ์–ธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค 1.8. RBAC๋Š” ๋ช…์‹œ์ ์œผ๋กœ ํ—ˆ์šฉ๋˜์ง€ ์•Š์€ ๋ชจ๋“  ๊ฒƒ์„ ๊ธˆ์ง€ํ•˜๋Š” ๊ถŒ๋ฆฌ ๋ชจ๋ธ์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.
RBAC๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด, ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Kubernetes API ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. --authorization-mode=RBAC. ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฒฝ๋กœ๋ฅผ ๋”ฐ๋ผ ์œ„์น˜ํ•˜๋Š” api-server ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋งค๋‹ˆํŽ˜์ŠคํŠธ์— ์„ค์ •๋ฉ๋‹ˆ๋‹ค. /etc/kubernetes/manifests/kube-apiserver.yaml, ์„น์…˜์—์„œ command. ๊ทธ๋Ÿฌ๋‚˜ RBAC๋Š” ์ด๋ฏธ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ๊ฑฑ์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ฐ’์œผ๋กœ ์ด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. authorization-mode (์ด๋ฏธ ์–ธ๊ธ‰ํ•œ ๋ถ€๋ถ„์—์„œ kube-apiserver.yaml). ๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ , ๊ทธ ์˜๋ฏธ ์ค‘์—๋Š” ๋‹ค๋ฅธ ์œ ํ˜•์˜ ์ธ์ฆ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(node, webhook, always allow) ๊ทธ๋Ÿฌ๋‚˜ ์ด์— ๋Œ€ํ•œ ๊ณ ๋ ค๋Š” ์ž๋ฃŒ์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ , ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ์ถœํŒํ–ˆ์Šต๋‹ˆ๋‹ค ัั‚ะฐั‚ัŒัŽ RBAC ์ž‘์—…์˜ ์›๋ฆฌ์™€ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ์ƒ๋‹นํžˆ ์ž์„ธํžˆ ์„ค๋ช…ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋” ๋‚˜์•„๊ฐ€ ๊ธฐ๋ณธ ์‚ฌํ•ญ๊ณผ ์˜ˆ์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ๋ชฉ๋ก์œผ๋กœ ์ œํ•œํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ API ์—”ํ„ฐํ‹ฐ๋Š” RBAC๋ฅผ ํ†ตํ•ด Kubernetes์˜ ์•ก์„ธ์Šค๋ฅผ ์ œ์–ดํ•˜๋Š” โ€‹โ€‹๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

  • Role ะธ ClusterRole โ€” ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ์„ค๋ช…ํ•˜๋Š” ์—ญํ• :
  • Role ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋‚ด์˜ ๊ถŒ๋ฆฌ๋ฅผ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ClusterRole - ๋…ธ๋“œ, ๋น„๋ฆฌ์†Œ์Šค URL(์ฆ‰, Kubernetes ๋ฆฌ์†Œ์Šค์™€ ๊ด€๋ จ๋˜์ง€ ์•Š์€ URL)๊ณผ ๊ฐ™์€ ํด๋Ÿฌ์Šคํ„ฐ๋ณ„ ๊ฐœ์ฒด๋ฅผ ํฌํ•จํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด - ์˜ˆ: /version, /logs, /api*);
  • RoleBinding ะธ ClusterRoleBinding - ๋ฐ”์ธ๋”ฉ์— ์‚ฌ์šฉ Role ะธ ClusterRole ์‚ฌ์šฉ์ž, ์‚ฌ์šฉ์ž ๊ทธ๋ฃน ๋˜๋Š” ServiceAccount์—.

Role ๋ฐ RoleBinding ์—”ํ„ฐํ‹ฐ๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์˜ํ•ด ์ œํ•œ๋ฉ๋‹ˆ๋‹ค. ๋™์ผํ•œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋‚ด์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ RoleBinding์€ ClusterRole์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๋ฅผ ํ†ตํ•ด ์ผ๋ฐ˜ ๊ถŒํ•œ ์ง‘ํ•ฉ์„ ์ƒ์„ฑํ•˜๊ณ  ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•ก์„ธ์Šค๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ญํ• ์€ ๋‹ค์Œ์„ ํฌํ•จํ•˜๋Š” ๊ทœ์น™ ์„ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ถŒํ•œ์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

  • API ๊ทธ๋ฃน - ์ฐธ์กฐ ๊ณต์‹ ๋ฌธ์„œ apiGroups ๋ฐ ์ถœ๋ ฅ๋ณ„ kubectl api-resources;
  • ์ž์› (์ž์›: pod, namespace, deployment ๋“ฑ๋“ฑ.);
  • ๋™์‚ฌ(๋™์‚ฌ: set, update ๋“ฑ).
  • ๋ฆฌ์†Œ์Šค ์ด๋ฆ„(resourceNames) - ์ด ์œ ํ˜•์˜ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๊ฐ€ ์•„๋‹Œ ํŠน์ • ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

Kubernetes์˜ ๊ถŒํ•œ ๋ถ€์—ฌ์— ๋Œ€ํ•œ ๋” ์ž์„ธํ•œ ๋ถ„์„์€ ํŽ˜์ด์ง€์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณต์‹ ๋ฌธ์„œ. ๋Œ€์‹ ์—(๋˜๋Š” ์ด์— ์ถ”๊ฐ€ํ•˜์—ฌ) ๊ทธ๋…€์˜ ์ž‘์—…์„ ์„ค๋ช…ํ•˜๋Š” ์˜ˆ๋ฅผ ์ œ์‹œํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

RBAC ์—”ํ„ฐํ‹ฐ์˜ ์˜ˆ

๋‹จ์ˆœํ•œ Role, Pod์˜ ๋ชฉ๋ก๊ณผ ์ƒํƒœ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ ๋ชจ๋‹ˆํ„ฐ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. target-namespace:

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: target-namespace
  name: pod-reader
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "watch", "list"]

์˜ˆ ClusterRole, Pod์˜ ๋ชฉ๋ก๊ณผ ์ƒํƒœ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ํด๋Ÿฌ์Šคํ„ฐ ์ „์ฒด์—์„œ ๋ชจ๋‹ˆํ„ฐ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  # ัะตะบั†ะธะธ "namespace" ะฝะตั‚, ั‚ะฐะบ ะบะฐะบ ClusterRole ะทะฐะดะตะนัั‚ะฒัƒะตั‚ ะฒะตััŒ ะบะปะฐัั‚ะตั€
  name: secret-reader
rules:
- apiGroups: [""]
  resources: ["secrets"]
  verbs: ["get", "watch", "list"]

์˜ˆ RoleBinding, ์ด๋Š” ์‚ฌ์šฉ์ž๊ฐ€ mynewuser ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ "์ฝ๊ธฐ" Pod my-namespace:

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: read-pods
  namespace: target-namespace
subjects:
- kind: User
  name: mynewuser # ะธะผั ะฟะพะปัŒะทะพะฒะฐั‚ะตะปั ะทะฐะฒะธัะธะผะพ ะพั‚ ั€ะตะณะธัั‚ั€ะฐ!
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role # ะทะดะตััŒ ะดะพะปะถะฝะพ ะฑั‹ั‚ัŒ โ€œRoleโ€ ะธะปะธ โ€œClusterRoleโ€
  name: pod-reader # ะธะผั Role, ั‡ั‚ะพ ะฝะฐั…ะพะดะธั‚ัั ะฒ ั‚ะพะผ ะถะต namespace,
                   # ะธะปะธ ะธะผั ClusterRole, ะธัะฟะพะปัŒะทะพะฒะฐะฝะธะต ะบะพั‚ะพั€ะพะน
                   # ั…ะพั‚ะธะผ ั€ะฐะทั€ะตัˆะธั‚ัŒ ะฟะพะปัŒะทะพะฒะฐั‚ะตะปัŽ
  apiGroup: rbac.authorization.k8s.io

์ด๋ฒคํŠธ ๊ฐ์‚ฌ

๊ฐœ๋žต์ ์œผ๋กœ Kubernetes ์•„ํ‚คํ…์ฒ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œํ˜„๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Kubernetes ๋ณด์•ˆ์˜ ABC: ์ธ์ฆ, ๊ถŒํ•œ ๋ถ€์—ฌ, ๊ฐ์‚ฌ

์š”์ฒญ ์ฒ˜๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ํ•ต์‹ฌ Kubernetes ๊ตฌ์„ฑ ์š”์†Œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. API ์„œ๋ฒ„. ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ชจ๋“  ์ž‘์—…์ด ์ด๋ฅผ ํ†ต๊ณผํ•ฉ๋‹ˆ๋‹ค. "๋ผ๋Š” ๊ธฐ์‚ฌ์—์„œ ์ด๋Ÿฌํ•œ ๋‚ด๋ถ€ ๋ฉ”์ปค๋‹ˆ์ฆ˜์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.kubectl run์„ ์‹คํ–‰ํ•˜๋ฉด Kubernetes์—์„œ๋Š” ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ•˜๋‚˜์š”?".

์‹œ์Šคํ…œ ๊ฐ์‚ฌ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋น„ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๋Š” Kubernetes์˜ ํฅ๋ฏธ๋กœ์šด ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. Kubernetes API์— ๋Œ€ํ•œ ๋ชจ๋“  ํ˜ธ์ถœ์„ ๊ธฐ๋กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง์ž‘ํ•  ์ˆ˜ ์žˆ๋“ฏ์ด ํด๋Ÿฌ์Šคํ„ฐ ์ƒํƒœ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ๋ณ€๊ฒฝ๊ณผ ๊ด€๋ จ๋œ ๋ชจ๋“  ์ž‘์—…์€ ์ด API๋ฅผ ํ†ตํ•ด ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ๊ทธ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์ข‹์€ ์„ค๋ช…์€ (ํ‰์†Œ์™€ ๊ฐ™์ด) ๋‹ค์Œ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณต์‹ ๋ฌธ์„œ K8s. ๋‹ค์Œ์—๋Š” ์ข€ ๋” ๊ฐ„๋‹จํ•œ ์–ธ์–ด๋กœ ์ฃผ์ œ๋ฅผ ์ œ์‹œํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ, ๊ฐ์‚ฌ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด, ์•„๋ž˜์— ์ž์„ธํžˆ ์„ค๋ช…๋œ ์„ธ ๊ฐ€์ง€ ํ•„์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ api-server์˜ ์ปจํ…Œ์ด๋„ˆ์— ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • --audit-policy-file=/etc/kubernetes/policies/audit-policy.yaml
  • --audit-log-path=/var/log/kube-audit/audit.log
  • --audit-log-format=json

์ด๋Ÿฌํ•œ ์„ธ ๊ฐ€์ง€ ํ•„์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ์™ธ์—๋„ ๋กœ๊ทธ ํšŒ์ „๋ถ€ํ„ฐ ์›นํ›… ์„ค๋ช…๊นŒ์ง€ ๊ฐ์‚ฌ์™€ ๊ด€๋ จ๋œ ๋งŽ์€ ์ถ”๊ฐ€ ์„ค์ •์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋กœ๊ทธ ํšŒ์ „ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์˜ˆ:

  • --audit-log-maxbackup=10
  • --audit-log-maxsize=100
  • --audit-log-maxage=7

๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ์ด์— ๋Œ€ํ•ด ๋” ์ž์„ธํžˆ ์„ค๋ช…ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ์„ธ๋ถ€ ์‚ฌํ•ญ์€ ๋‹ค์Œ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. kube-apiserver ๋ฌธ์„œ.

์ด๋ฏธ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ๋ชจ๋“  ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” api-server ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋งค๋‹ˆํŽ˜์ŠคํŠธ์— ์„ค์ •๋ฉ๋‹ˆ๋‹ค(๊ธฐ๋ณธ์ ์œผ๋กœ /etc/kubernetes/manifests/kube-apiserver.yaml) ์„น์…˜์—์„œ command. 3๊ฐ€์ง€ ํ•„์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋Œ์•„๊ฐ€์„œ ๋ถ„์„ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  1. audit-policy-file โ€” ๊ฐ์‚ฌ ์ •์ฑ…์„ ์„ค๋ช…ํ•˜๋Š” YAML ํŒŒ์ผ์˜ ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ๊ทธ ๋‚ด์šฉ์œผ๋กœ ๋Œ์•„๊ฐ€๊ฒ ์ง€๋งŒ ์ง€๊ธˆ์€ api-server ํ”„๋กœ์„ธ์Šค์—์„œ ํŒŒ์ผ์„ ์ฝ์„ ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์— ๋งˆ์šดํŠธํ•ด์•ผ ํ•˜๋ฉฐ, ์ด๋ฅผ ์œ„ํ•ด ๊ตฌ์„ฑ์˜ ์ ์ ˆํ•œ ์„น์…˜์— ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
      volumeMounts:
        - mountPath: /etc/kubernetes/policies
          name: policies
          readOnly: true
      volumes:
      - hostPath:
          path: /etc/kubernetes/policies
          type: DirectoryOrCreate
        name: policies
  2. audit-log-path โ€” ๋กœ๊ทธ ํŒŒ์ผ์˜ ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค. ๊ฒฝ๋กœ๋Š” api-server ํ”„๋กœ์„ธ์Šค์—์„œ๋„ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋ฏ€๋กœ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ๋งˆ์šดํŠธ๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.
      volumeMounts:
        - mountPath: /var/log/kube-audit
          name: logs
          readOnly: false
      volumes:
      - hostPath:
          path: /var/log/kube-audit
          type: DirectoryOrCreate
        name: logs
  3. audit-log-format โ€” ๊ฐ์‚ฌ ๋กœ๊ทธ ํ˜•์‹. ๊ธฐ๋ณธ๊ฐ’์€ json์ด์ง€๋งŒ ๊ธฐ์กด ํ…์ŠคํŠธ ํ˜•์‹๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(legacy).

๊ฐ์‚ฌ ์ •์ฑ…

์ด์ œ ๋กœ๊น… ์ •์ฑ…์„ ์„ค๋ช…ํ•˜๋Š” ์–ธ๊ธ‰๋œ ํŒŒ์ผ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์‚ฌ์ •์ฑ…์˜ ์ฒซ ๋ฒˆ์งธ ๊ฐœ๋…์€ level, ๋กœ๊น… ์ˆ˜์ค€. ๊ทธ๊ฒƒ๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  • None - ๊ธฐ๋กํ•˜์ง€ ๋งˆ์„ธ์š”.
  • Metadata โ€” ๋กœ๊ทธ ์š”์ฒญ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ: ์‚ฌ์šฉ์ž, ์š”์ฒญ ์‹œ๊ฐ„, ๋Œ€์ƒ ๋ฆฌ์†Œ์Šค(ํฌ๋“œ, ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋“ฑ), ์ž‘์—… ์œ ํ˜•(๋™์‚ฌ) ๋“ฑ
  • Request โ€” ๋กœ๊ทธ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ฐ ์š”์ฒญ ๋ณธ๋ฌธ
  • RequestResponse โ€” ๋กœ๊ทธ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ, ์š”์ฒญ ๋ณธ๋ฌธ ๋ฐ ์‘๋‹ต ๋ณธ๋ฌธ.

๋งˆ์ง€๋ง‰ ๋‘ ๋ ˆ๋ฒจ(Request ะธ RequestResponse) ๋ฆฌ์†Œ์Šค์— ์•ก์„ธ์Šคํ•˜์ง€ ์•Š์€ ์š”์ฒญ(์†Œ์œ„ ๋ฆฌ์†Œ์Šค๊ฐ€ ์•„๋‹Œ URL์— ๋Œ€ํ•œ ์•ก์„ธ์Šค)์„ ๊ธฐ๋กํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ๋ชจ๋“  ์š”์ฒญ์ด ํ†ต๊ณผ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๋‹จ๊ณ„:

  • RequestReceived - ์š”์ฒญ์ด ํ”„๋กœ์„ธ์„œ์— ์˜ํ•ด ์ˆ˜์‹ ๋˜์—ˆ์ง€๋งŒ ์•„์ง ํ”„๋กœ์„ธ์„œ ์ฒด์ธ์„ ๋”ฐ๋ผ ๋” ์ด์ƒ ์ „์†ก๋˜์ง€ ์•Š์€ ๋‹จ๊ณ„
  • ResponseStarted โ€” ์‘๋‹ต ํ—ค๋”๊ฐ€ ์ „์†ก๋˜์ง€๋งŒ ์‘๋‹ต ๋ณธ๋ฌธ์ด ์ „์†ก๋˜๊ธฐ ์ „์ž…๋‹ˆ๋‹ค. ์žฅ๊ธฐ ์‹คํ–‰ ์ฟผ๋ฆฌ๋ฅผ ์œ„ํ•ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค(์˜ˆ: watch);
  • ResponseComplete โ€” ์‘๋‹ต ๋ณธ๋ฌธ์ด ์ „์†ก๋˜์—ˆ์œผ๋ฏ€๋กœ ๋” ์ด์ƒ ์ •๋ณด๊ฐ€ ์ „์†ก๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • Panic โ€” ๋น„์ •์ƒ์ ์ธ ์ƒํ™ฉ์ด ๊ฐ์ง€๋˜๋ฉด ์ด๋ฒคํŠธ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋‹จ๊ณ„๋ฅผ ๊ฑด๋„ˆ๋›ฐ๋ ค๋ฉด omitStages.

์ •์ฑ… ํŒŒ์ผ์—์„œ๋Š” ๋‹ค์–‘ํ•œ ๋กœ๊น… ์ˆ˜์ค€์„ ๊ฐ€์ง„ ์—ฌ๋Ÿฌ ์„น์…˜์„ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ •์ฑ… ์„ค๋ช…์— ์žˆ๋Š” ์ฒซ ๋ฒˆ์งธ ์ผ์น˜ ๊ทœ์น™์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

kubelet ๋ฐ๋ชฌ์€ api-server ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋งค๋‹ˆํŽ˜์ŠคํŠธ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ , ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๊ฐ์ง€๋˜๋ฉด api-server๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ค‘์š”ํ•œ ์„ธ๋ถ€ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ •์ฑ… ํŒŒ์ผ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค.. ์ •์ฑ… ํŒŒ์ผ์„ ๋ณ€๊ฒฝํ•œ ํ›„์—๋Š” API ์„œ๋ฒ„๋ฅผ ์ˆ˜๋™์œผ๋กœ ๋‹ค์‹œ ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. API ์„œ๋ฒ„๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹œ์ž‘๋˜์—ˆ์œผ๋ฏ€๋กœ ์ •์  ํฌ๋“œ, ํŒ€ kubectl delete ๋‹ค์‹œ ์‹œ์ž‘๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์ˆ˜๋™์œผ๋กœ ํ•˜์…”์•ผ ํ•  ๊ฒ๋‹ˆ๋‹ค docker stop kube-masters์—์„œ ๊ฐ์‚ฌ ์ •์ฑ…์ด ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

docker stop $(docker ps | grep k8s_kube-apiserver | awk '{print $1}')

๊ฐ์‚ฌ๋ฅผ ํ™œ์„ฑํ™”ํ•  ๋•Œ ๋‹ค์Œ ์‚ฌํ•ญ์„ ๊ธฐ์–ตํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. kube-apiserver์˜ ๋ถ€ํ•˜๊ฐ€ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.. ํŠนํžˆ ์š”์ฒญ ์ปจํ…์ŠคํŠธ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์†Œ๋น„๊ฐ€ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์‘๋‹ต ํ—ค๋”๊ฐ€ ์ „์†ก๋œ ํ›„์—๋งŒ ๋กœ๊น…์ด ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ๋ถ€ํ•˜๋Š” ๊ฐ์‚ฌ ์ •์ฑ… ๊ตฌ์„ฑ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

์ •์ฑ…์˜ ์˜ˆ

์˜ˆ์ œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •์ฑ… ํŒŒ์ผ์˜ ๊ตฌ์กฐ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ๊ฐ„๋‹จํ•œ ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. policy๋ ˆ๋ฒจ์˜ ๋ชจ๋“  ๊ฒƒ์„ ๊ธฐ๋กํ•˜๋ ค๋ฉด Metadata:

apiVersion: audit.k8s.io/v1
kind: Policy
rules:
- level: Metadata

์ •์ฑ…์—์„œ ์‚ฌ์šฉ์ž ๋ชฉ๋ก์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(Users ะธ ServiceAccounts) ๋ฐ ์‚ฌ์šฉ์ž ๊ทธ๋ฃน. ์˜ˆ๋ฅผ ๋“ค์–ด, ์‹œ์Šคํ…œ ์‚ฌ์šฉ์ž๋ฅผ ๋ฌด์‹œํ•˜๊ณ  ๊ทธ ๋ฐ–์˜ ๋ชจ๋“  ํ•ญ๋ชฉ์„ ํ•ด๋‹น ์ˆ˜์ค€์— ๊ธฐ๋กํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. Request:

apiVersion: audit.k8s.io/v1
kind: Policy
rules:
  - level: None
    userGroups:
      - "system:serviceaccounts"
      - "system:nodes"
    users:
      - "system:anonymous"
      - "system:apiserver"
      - "system:kube-controller-manager"
      - "system:kube-scheduler"
  - level: Request

๋Œ€์ƒ์„ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

  • ๋„ค์ž„์ŠคํŽ˜์ด์Šค(namespaces);
  • ๋™์‚ฌ(๋™์‚ฌ: get, update, delete ๋‹ค๋ฅธ ์‚ฌ๋žŒ);
  • ์ž์› (์ž์›, ๋‹ค์Œ๊ณผ ๊ฐ™์ด : pod, configmaps ๋“ฑ) ๋ฐ ๋ฆฌ์†Œ์Šค ๊ทธ๋ฃน(apiGroups).

์ฃผ์˜! ๋ฆฌ์†Œ์Šค ๋ฐ ๋ฆฌ์†Œ์Šค ๊ทธ๋ฃน(API ๊ทธ๋ฃน, ์ฆ‰ apiGroups)๊ณผ ํด๋Ÿฌ์Šคํ„ฐ์— ์„ค์น˜๋œ ํ•ด๋‹น ๋ฒ„์ „์€ ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

kubectl api-resources
kubectl api-versions

๋‹ค์Œ ๊ฐ์‚ฌ ์ •์ฑ…์€ ๋ชจ๋ฒ” ์‚ฌ๋ก€์˜ ๋ฐ๋ชจ๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. Alibaba Cloud ๋ฌธ์„œ:

apiVersion: audit.k8s.io/v1beta1
kind: Policy
# ะะต ะปะพะณะธั€ะพะฒะฐั‚ัŒ ัั‚ะฐะดะธัŽ RequestReceived
omitStages:
  - "RequestReceived"
rules:
  # ะะต ะปะพะณะธั€ะพะฒะฐั‚ัŒ ัะพะฑั‹ั‚ะธั, ัั‡ะธั‚ะฐัŽั‰ะธะตัั ะผะฐะปะพะทะฝะฐั‡ะธั‚ะตะปัŒะฝั‹ะผะธ ะธ ะฝะต ะพะฟะฐัะฝั‹ะผะธ:
  - level: None
    users: ["system:kube-proxy"]
    verbs: ["watch"]
    resources:
      - group: "" # ัั‚ะพ api group ั ะฟัƒัั‚ั‹ะผ ะธะผะตะฝะตะผ, ะบ ะบะพั‚ะพั€ะพะผัƒ ะพั‚ะฝะพััั‚ัั
                  # ะฑะฐะทะพะฒั‹ะต ั€ะตััƒั€ัั‹ Kubernetes, ะฝะฐะทั‹ะฒะฐะตะผั‹ะต โ€œcoreโ€
        resources: ["endpoints", "services"]
  - level: None
    users: ["system:unsecured"]
    namespaces: ["kube-system"]
    verbs: ["get"]
    resources:
      - group: "" # core
        resources: ["configmaps"]
  - level: None
    users: ["kubelet"]
    verbs: ["get"]
    resources:
      - group: "" # core
        resources: ["nodes"]
  - level: None
    userGroups: ["system:nodes"]
    verbs: ["get"]
    resources:
      - group: "" # core
        resources: ["nodes"]
  - level: None
    users:
      - system:kube-controller-manager
      - system:kube-scheduler
      - system:serviceaccount:kube-system:endpoint-controller
    verbs: ["get", "update"]
    namespaces: ["kube-system"]
    resources:
      - group: "" # core
        resources: ["endpoints"]
  - level: None
    users: ["system:apiserver"]
    verbs: ["get"]
    resources:
      - group: "" # core
        resources: ["namespaces"]
  # ะะต ะปะพะณะธั€ะพะฒะฐั‚ัŒ ะพะฑั€ะฐั‰ะตะฝะธั ะบ read-only URLs:
  - level: None
    nonResourceURLs:
      - /healthz*
      - /version
      - /swagger*
  # ะะต ะปะพะณะธั€ะพะฒะฐั‚ัŒ ัะพะพะฑั‰ะตะฝะธั, ะพั‚ะฝะพััั‰ะธะตัั ะบ ั‚ะธะฟัƒ ั€ะตััƒั€ัะพะฒ โ€œัะพะฑั‹ั‚ะธัโ€:
  - level: None
    resources:
      - group: "" # core
        resources: ["events"]
  # ะ ะตััƒั€ัั‹ ั‚ะธะฟะฐ Secret, ConfigMap ะธ TokenReview ะผะพะณัƒั‚ ัะพะดะตั€ะถะฐั‚ัŒ  ัะตะบั€ะตั‚ะฝั‹ะต ะดะฐะฝะฝั‹ะต,
  # ะฟะพัั‚ะพะผัƒ ะปะพะณะธั€ัƒะตะผ ั‚ะพะปัŒะบะพ ะผะตั‚ะฐะดะฐะฝะฝั‹ะต ัะฒัะทะฐะฝะฝั‹ั… ั ะฝะธะผะธ ะทะฐะฟั€ะพัะพะฒ
  - level: Metadata
    resources:
      - group: "" # core
        resources: ["secrets", "configmaps"]
      - group: authentication.k8s.io
        resources: ["tokenreviews"]
  # ะ”ะตะนัั‚ะฒะธั ั‚ะธะฟะฐ get, list ะธ watch ะผะพะณัƒั‚ ะฑั‹ั‚ัŒ ั€ะตััƒั€ัะพั‘ะผะบะธะผะธ; ะฝะต ะปะพะณะธั€ัƒะตะผ ะธั…
  - level: Request
    verbs: ["get", "list", "watch"]
    resources:
      - group: "" # core
      - group: "admissionregistration.k8s.io"
      - group: "apps"
      - group: "authentication.k8s.io"
      - group: "authorization.k8s.io"
      - group: "autoscaling"
      - group: "batch"
      - group: "certificates.k8s.io"
      - group: "extensions"
      - group: "networking.k8s.io"
      - group: "policy"
      - group: "rbac.authorization.k8s.io"
      - group: "settings.k8s.io"
      - group: "storage.k8s.io"
  # ะฃั€ะพะฒะตะฝัŒ ะปะพะณะธั€ะพะฒะฐะฝะธั ะฟะพ ัƒะผะพะปั‡ะฐะฝะธัŽ ะดะปั ัั‚ะฐะฝะดะฐั€ั‚ะฝั‹ั… ั€ะตััƒั€ัะพะฒ API
  - level: RequestResponse
    resources:
      - group: "" # core
      - group: "admissionregistration.k8s.io"
      - group: "apps"
      - group: "authentication.k8s.io"
      - group: "authorization.k8s.io"
      - group: "autoscaling"
      - group: "batch"
      - group: "certificates.k8s.io"
      - group: "extensions"
      - group: "networking.k8s.io"
      - group: "policy"
      - group: "rbac.authorization.k8s.io"
      - group: "settings.k8s.io"
      - group: "storage.k8s.io"
  # ะฃั€ะพะฒะตะฝัŒ ะปะพะณะธั€ะพะฒะฐะฝะธั ะฟะพ ัƒะผะพะปั‡ะฐะฝะธัŽ ะดะปั ะฒัะตั… ะพัั‚ะฐะปัŒะฝั‹ั… ะทะฐะฟั€ะพัะพะฒ
  - level: Metadata

๊ฐ์‚ฌ ์ •์ฑ…์˜ ๋˜ ๋‹ค๋ฅธ ์ข‹์€ ์˜ˆ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. GCE์—์„œ ์‚ฌ์šฉ๋˜๋Š” ํ”„๋กœํ•„.

๊ฐ์‚ฌ ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ ์‹ ์†ํ•œ ๋Œ€์‘์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์›นํ›… ์„ค๋ช…. ์ด ๋ฌธ์ œ๋Š” ๋‹ค์Œ์—์„œ ๋‹ค๋ฃน๋‹ˆ๋‹ค. ๊ณต์‹ ๋ฌธ์„œ, ์ด ๊ธฐ์‚ฌ์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ

์ด ๊ธฐ์‚ฌ์—์„œ๋Š” ๊ฐœ์ธํ™”๋œ ์‚ฌ์šฉ์ž ๊ณ„์ •์„ ์ƒ์„ฑํ•˜๊ณ  ๊ถŒํ•œ์„ ๋ถ„๋ฆฌํ•˜๋ฉฐ ์ž‘์—…์„ ๊ธฐ๋กํ•  ์ˆ˜ ์žˆ๋Š” Kubernetes ํด๋Ÿฌ์Šคํ„ฐ์˜ ๊ธฐ๋ณธ ๋ณด์•ˆ ๋ฉ”์ปค๋‹ˆ์ฆ˜์— ๋Œ€ํ•œ ๊ฐœ์š”๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋ก ์ƒ์œผ๋กœ๋‚˜ ์‹ค์ œ์ ์œผ๋กœ ์ด๋Ÿฐ ๋ฌธ์ œ์— ์ง๋ฉดํ•œ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋„์›€์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๋˜ํ•œ "PS"์— ์ œ๊ณต๋˜๋Š” Kubernetes ๋ณด์•ˆ ์ฃผ์ œ์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ์ž๋ฃŒ ๋ชฉ๋ก์„ ์ฝ์–ด๋ณด๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๊ทธ ์ค‘์—์„œ ๊ท€ํ•˜์™€ ๊ด€๋ จ๋œ ๋ฌธ์ œ์— ๋Œ€ํ•ด ํ•„์š”ํ•œ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

PS

๋ธ”๋กœ๊ทธ์—์„œ๋„ ์ฝ์–ด๋ณด์„ธ์š”.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€