์กฐ๋ง๊ฐ ์์คํ
์ด์ ์ค์ ์ธ์ฆ ๋ณด์ฅ, ๊ถํ ๋ถ๋ฆฌ, ๊ฐ์ฌ ๋ฐ ๊ธฐํ ์์
๊ณผ ๊ฐ์ ๋ณด์ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. 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 ๊ด๋ฆฌ์ ๋ํ ์ง๋ฌธ์ ์ด ๋ฌธ์์ ๋ฒ์๋ฅผ ๋ฒ์ด๋ฉ๋๋ค. ํ์ง๋ง ์ด ๋ฌธ์ ์ ๋ํด ๋ ์์ธํ ์์๋ณด๊ณ ์ถ์ ๋ถ๋ค์ ๋ค์์ผ๋ก ์์ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ฌ์ฉ์์ฉ ์ธ์ฆ์(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
- ํด๋ฌ์คํฐ ์ค๋ช
(ํน์ ํด๋ฌ์คํฐ ์ค์น์ ๋ํ CA ์ธ์ฆ์ ํ์ผ์ ์ฃผ์ ๋ฐ ์์น ์ง์ ):
์์ ์กฐ์ ํ ํ์ผ์์ .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์ ์ฌ์ฉํ ์ธ์ฆ์
์ถ์์ ํจ๊ป
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 ๋ฌธ์์ ์ธ์ฆ์ ์์ ์ ๋ํด -
๋นํธ๋๋ฏธ์ ์ข์ ๊ธ , ์ธ์ฆ์ ๋ฐ๊ธ์ ์ค์ฉ์ ์ธ ๊ด์ ์์ ๋ค๋ฃจ๊ณ ์์ต๋๋ค. -
์ผ๋ฐ ๋ฌธ์ Kubernetes์ ์ธ์ฆ์ ๋ํด
๊ถํ ๋ถ์ฌ
๊ธฐ๋ณธ ์ธ์ฆ ๊ณ์ ์๋ ํด๋ฌ์คํฐ์์ ์๋ํ ์ ์๋ ๊ถํ์ด ์์ต๋๋ค. ๊ถํ์ ๋ถ์ฌํ๊ธฐ ์ํด Kubernetes๋ ๊ถํ ๋ถ์ฌ ๋ฉ์ปค๋์ฆ์ ๊ตฌํํฉ๋๋ค.
๋ฒ์ 1.6 ์ด์ ์๋ Kubernetes๊ฐ ๋ค์๊ณผ ๊ฐ์ ์ธ์ฆ ์ ํ์ ์ฌ์ฉํ์ต๋๋ค. ABAC (์์ฑ ๊ธฐ๋ฐ ์ก์ธ์ค ์ ์ด). ์ด์ ๋ํ ์์ธํ ๋ด์ฉ์ ๋ค์์์ ํ์ธํ ์ ์์ต๋๋ค.
ํด๋ฌ์คํฐ์ ๋ํ ์ก์ธ์ค ๊ถํ์ ๋ถํ ํ๋ ํ์ฌ์ (๊ทธ๋ฆฌ๊ณ ๋ ์ ์ฐํ) ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. 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
) ๊ทธ๋ฌ๋ ์ด์ ๋ํ ๊ณ ๋ ค๋ ์๋ฃ์ ๋ฒ์๋ฅผ ๋ฒ์ด๋๋๋ก ํ๊ฒ ์ต๋๋ค.
๊ทธ๊ฑด ๊ทธ๋ ๊ณ , ์ฐ๋ฆฌ๋ ์ด๋ฏธ ์ถํํ์ต๋๋ค
๋ค์ 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 ๊ตฌ์ฑ ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. API ์๋ฒ. ํด๋ฌ์คํฐ์ ๋ชจ๋ ์์
์ด ์ด๋ฅผ ํต๊ณผํฉ๋๋ค. "๋ผ๋ ๊ธฐ์ฌ์์ ์ด๋ฌํ ๋ด๋ถ ๋ฉ์ปค๋์ฆ์ ๋ํด ์์ธํ ์์๋ณผ ์ ์์ต๋๋ค.
์์คํ
๊ฐ์ฌ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋นํ์ฑํ๋์ด ์๋ Kubernetes์ ํฅ๋ฏธ๋ก์ด ๊ธฐ๋ฅ์
๋๋ค. Kubernetes API์ ๋ํ ๋ชจ๋ ํธ์ถ์ ๊ธฐ๋กํ ์ ์์ต๋๋ค. ์ง์ํ ์ ์๋ฏ์ด ํด๋ฌ์คํฐ ์ํ ๋ชจ๋ํฐ๋ง ๋ฐ ๋ณ๊ฒฝ๊ณผ ๊ด๋ จ๋ ๋ชจ๋ ์์
์ ์ด API๋ฅผ ํตํด ์ํ๋ฉ๋๋ค. ๊ทธ ๊ธฐ๋ฅ์ ๋ํ ์ข์ ์ค๋ช
์ (ํ์์ ๊ฐ์ด) ๋ค์์์ ์ฐพ์ ์ ์์ต๋๋ค.
๋ฐ๋ผ์, ๊ฐ์ฌ๋ฅผ ํ์ฑํํ๋ ค๋ฉด, ์๋์ ์์ธํ ์ค๋ช ๋ ์ธ ๊ฐ์ง ํ์ ๋งค๊ฐ๋ณ์๋ฅผ 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
๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ ์ด์ ๋ํด ๋ ์์ธํ ์ค๋ช
ํ์ง ์์ ๊ฒ์
๋๋ค. ๋ชจ๋ ์ธ๋ถ ์ฌํญ์ ๋ค์์์ ์ฐพ์ ์ ์์ต๋๋ค.
์ด๋ฏธ ์ธ๊ธํ๋ฏ์ด ๋ชจ๋ ๋งค๊ฐ๋ณ์๋ api-server ๊ตฌ์ฑ์ ์ฌ์ฉํ์ฌ ๋งค๋ํ์คํธ์ ์ค์ ๋ฉ๋๋ค(๊ธฐ๋ณธ์ ์ผ๋ก /etc/kubernetes/manifests/kube-apiserver.yaml
) ์น์
์์ command
. 3๊ฐ์ง ํ์ ๋งค๊ฐ๋ณ์๋ก ๋์๊ฐ์ ๋ถ์ํด ๋ณด๊ฒ ์ต๋๋ค.
-
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
-
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
-
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
๋ค์ ๊ฐ์ฌ ์ ์ฑ
์ ๋ชจ๋ฒ ์ฌ๋ก์ ๋ฐ๋ชจ๋ก ์ ๊ณต๋ฉ๋๋ค.
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
๊ฐ์ฌ ์ ์ฑ
์ ๋ ๋ค๋ฅธ ์ข์ ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๊ฐ์ฌ ์ด๋ฒคํธ์ ๋ํ ์ ์ํ ๋์์ด ๊ฐ๋ฅํฉ๋๋ค. ์นํ
์ค๋ช
. ์ด ๋ฌธ์ ๋ ๋ค์์์ ๋ค๋ฃน๋๋ค.
๊ฒฐ๊ณผ
์ด ๊ธฐ์ฌ์์๋ ๊ฐ์ธํ๋ ์ฌ์ฉ์ ๊ณ์ ์ ์์ฑํ๊ณ ๊ถํ์ ๋ถ๋ฆฌํ๋ฉฐ ์์ ์ ๊ธฐ๋กํ ์ ์๋ Kubernetes ํด๋ฌ์คํฐ์ ๊ธฐ๋ณธ ๋ณด์ ๋ฉ์ปค๋์ฆ์ ๋ํ ๊ฐ์๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด๋ก ์์ผ๋ก๋ ์ค์ ์ ์ผ๋ก ์ด๋ฐ ๋ฌธ์ ์ ์ง๋ฉดํ ์ฌ๋๋ค์๊ฒ ๋์์ด ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๋ํ "PS"์ ์ ๊ณต๋๋ Kubernetes ๋ณด์ ์ฃผ์ ์ ๋ํ ๋ค๋ฅธ ์๋ฃ ๋ชฉ๋ก์ ์ฝ์ด๋ณด๋ ๊ฒ์ด ์ข์ต๋๋ค. ์๋ง๋ ๊ทธ ์ค์์ ๊ทํ์ ๊ด๋ จ๋ ๋ฌธ์ ์ ๋ํด ํ์ํ ์ธ๋ถ ์ ๋ณด๋ฅผ ์ฐพ์ ์ ์์ ๊ฒ์ ๋๋ค.
PS
๋ธ๋ก๊ทธ์์๋ ์ฝ์ด๋ณด์ธ์.
- ยซ
33๊ฐ ์ด์์ Kubernetes ๋ณด์ ๋๊ตฌ "; - ยซ
๋ณด์ ์ ๋ฌธ๊ฐ๋ฅผ ์ํ Kubernetes ๋คํธ์ํฌ ์ ์ฑ ์๊ฐ "; - ยซ
Kubernetes์ RBAC ์ดํด "; - ยซ
9 Kubernetes ๋ณด์ ๋ชจ๋ฒ ์ฌ๋ก "; - ยซ
์ฟ ๋ฒ๋คํฐ์ค ํดํน์ ํผํด์๊ฐ ๋์ง ์๋ 11๊ฐ์ง ๋ฐฉ๋ฒ ".
์ถ์ฒ : habr.com