์ฟ ๋ฒ๋คํฐ์ค์๋ Audit ์ด๋ผ๋ ๊ธฐ๋ฅ์ด ์์ต๋๋ค. ๋ค๋ค ๋์น ์ฑ์ จ๊ฒ ์ง๋ง, Kube Api Server ์ ์ด๋ค API ๋ฅผ ํธ์ถํ๋์ง ๊ฐ์ํ๋ ๊ธฐ๋ฅ์ด์ฃ .
์ฟ ๋ฒ๋คํฐ์ค๋ฅผ ์ค์นํ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณต ๋์ง ์๊ธฐ ๋๋ฌธ์ ์ถ๊ฐ์ ์ผ๋ก Audit ๊ธฐ๋ฅ์ ํ์ฑํ ํด์ฃผ์ด์ผ ํฉ๋๋ค.
๊ทธ๋์ ์ด๋ฒ ๊ธ์์๋ Audit ๊ธฐ๋ฅ์ ํ์ฑํํด์ ๋๊ฐ, ์ด๋ค ํ์๋ก, ์ด๋ค ๋ฆฌ์์ค๋ฅผ ํธ์ถ ํ๋์ง ๊ฐ์ํด๋ณด๊ฒ ์ต๋๋ค!
๋ ์ธ ๋๋์ฝ๋!
Audit ๊ธฐ๋ฅ ํ์ฑํ
control plane & data plane v1.26.1 ์์ ์งํ๋์์ต๋๋ค
์ฟ ๋ฒ๋คํฐ์ค ๊ณต์ ๋ฌธ์๋ฅผ ์ด๋ํ ํ Audit ์ ๊ฒ์ํด์ค๋๋ค. ๊ทธ๋ฆฌ๊ณ ํด๋ฆญํด์ ๋ฌธ์๋ฅผ ํ์ธํฉ๋๋ค.
๋ฐ์ผ๋ก ์ญ์ญ ๋ด๋ ค์ ๋ก๊ทธ ๋ฐฑ์๋ ์น์ ์ผ๋ก ์ด๋ํฉ๋๋ค.
/etc/kubernetes/manifests/kube-apiserver.yaml ์ ์๋์ ๊ฐ์ด ์ถ๊ฐํฉ๋๋ค.
--audit-policy-file=/etc/kubernetes/audit-policy.yaml
--audit-log-path=/var/log/kubernetes/audit/audit.log
์ด์ธ ์ถ๊ฐ ์ต์ ์ ์ค ์ ์์ต๋๋ค.
--audit-policy-file=/etc/kubernetes/audit-policy.yaml
--audit-log-path=/var/log/kubernetes/audit/audit.log
--audit-log-maxage=10 # 10์ผ๊น์ง๋ง ๋ณด๊ด
--audit-log-maxbackup=10 # ์ต๋ 10๊ฐ์ ํ์ผ๋ง ๋ณด๊ด
--audit-log-maxsize=10 # ๋กํ
์ดํธ ๋๊ธฐ ์ ์ต๋ ํฌ๊ธฐ๋ 10MB
- --audit-log-path ๋ ๋ก๊ทธ ๋ฐฑ์๋๊ฐ ๊ฐ์ฌ ์ด๋ฒคํธ๋ฅผ ์ฐ๋ ๋ฐ ์ฌ์ฉํ๋ ๋ก๊ทธ ํ์ผ ๊ฒฝ๋ก๋ฅผ ์ง์ ํ๋ค. ์ด ํ๋๊ทธ๋ฅผ ์ง์ ํ์ง ์์ผ๋ฉด ๋ก๊ทธ ๋ฐฑ์๋๊ฐ ๋นํ์ฑํ๋๋ค. - ๋ ํ์ค ์ถ๋ ฅ์ ์๋ฏธํ๋ค.
- --audit-log-maxage ๋ ์ค๋๋ ๊ฐ์ฌ ๋ก๊ทธ ํ์ผ์ ๋ณด๊ดํ ์ต๋ ์ผ์๋ฅผ ์ ์ํ๋ค.
- --audit-log-maxbackup ์ ๋ณด๊ดํ ๊ฐ์ฌ ๋ก๊ทธ ํ์ผ์ ์ต๋ ์๋ฅผ ์ ์ํ๋ค.
- --audit-log-maxsize ๋ ๊ฐ์ฌ ๋ก๊ทธ ํ์ผ์ด ๋กํ ์ดํธ ๋๊ธฐ ์ ์ ์ต๋ ํฌ๊ธฐ(MB)๋ฅผ ์ ์ํ๋ค.
๊ทธ๋ฐ ๋ค์ ๋ณผ๋ฅจ์ ๋ง์ดํธ๋ฅผ ํด์ค๋๋ค.
...
volumeMounts:
- mountPath: /etc/kubernetes/audit-policy.yaml
name: audit
readOnly: true
- mountPath: /var/log/kubernetes/audit/
name: audit-log
readOnly: false
๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง์ผ๋ก HostPath ๋ฅผ ๊ตฌ์ฑํฉ๋๋ค.
...
volumes:
- name: audit
hostPath:
path: /etc/kubernetes/audit-policy.yaml
type: File
- name: audit-log
hostPath:
path: /var/log/kubernetes/audit/
type: DirectoryOrCreate
HostPath ๋ก ๊ตฌ์ฑํจ์ผ๋ก์จ ํธ์คํธ(control plane) ์ ์กด์ฌํ๋ audit-policy.yaml ์ kube-apiserver container ์ ์ ๋ฌํด์ฃผ๊ณ , kube-apiserver container ์์ ์์ฑ๋๋ audit.log ๋ฅผ ํธ์คํธ์ ์์ฑ๋๊ฒ ํฉ๋๋ค.
๊ทผ๋ฐ ์๋ง ์ด๋๋ก ์คํํ๋ฉด kube-apiserver ์์ ์๋ฌ๊ฐ ๋ฐ์ํ ๊ฒ์ ๋๋ค. ์๋ ์ฐ๋ฆฌ๋ audit-policy.yaml ์ ๋ง๋ ์ ์ด ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๊ทธ๋ผ audit-policy.yaml ์ ๋ง๋ค์ด ๋ณด์ฃ !
audit-policy.yaml ์์ฑํ๊ธฐ
audit-policy ์๋ ์ค์ํ ๊ฐ๋ 2๊ฐ์ง๊ฐ ์์ต๋๋ค.
ํ๋๋ ๊ฐ์ฌ ๋จ๊ณ(audit stage), ๋ค๋ฅธ ํ๋๋ ๊ฐ์ฌ ์์ค(audit level) ์ ๋๋ค.
๊ฐ์ฌ ๋จ๊ณ(audit stage)
- RequestReceived - ๊ฐ์ฌ ํธ๋ค๋ฌ๊ฐ ์์ฒญ์ ์์ ํ ์งํ, ๊ทธ๋ฆฌ๊ณ ํธ๋ค๋ฌ ์ฒด์ธ์ผ๋ก ์์๋๊ธฐ ์ ์ ์์ฑ๋๋ ์ด๋ฒคํธ์ ๋ํ ๋จ๊ณ์ด๋ค.
- ResponseStarted - ์๋ต ํค๋๋ ์ ์ก๋์์ง๋ง, ์๋ต ๋ณธ๋ฌธ(body)์ ์ ์ก๋๊ธฐ ์ ์ธ ๋จ๊ณ์ด๋ค. ์ด ๋จ๊ณ๋ ์ค๋ ์คํ๋๋ ์์ฒญ(์: watch)์ ๋ํด์๋ง ์์ฑ๋๋ค.
- ResponseComplete - ์๋ต ๋ด์ฉ์ด ์๋ฃ๋์์ผ๋ฉฐ, ๋ ์ด์ ๋ฐ์ดํธ๊ฐ ์ ์ก๋์ง ์์ ๋์ ๋จ๊ณ์ด๋ค.
- Panic - ํจ๋์ด ๋ฐ์ํ์ ๋ ์์ฑ๋๋ ์ด๋ฒคํธ์ด๋ค.
๊ฐ์ฌ ์์ค(audit level)
- None - ์ด ๊ท์น์ ํด๋น๋๋ ์ด๋ฒคํธ๋ ๋ก๊น ํ์ง ์๋๋ค.
- Metadata - ์์ฒญ ๋ฉํ๋ฐ์ดํฐ(์์ฒญํ๋ ์ฌ์ฉ์, ํ์์คํฌํ, ๋ฆฌ์์ค, ๋์ฌ(verb) ๋ฑ)๋ ๋ก๊น ํ์ง๋ง ์์ฒญ/์๋ต ๋ณธ๋ฌธ์ ๋ก๊น ํ์ง ์๋๋ค.
- Request - ์ด๋ฒคํธ ๋ฉํ๋ฐ์ดํฐ ๋ฐ ์์ฒญ ๋ณธ๋ฌธ์ ๋ก๊น ํ์ง๋ง ์๋ต ๋ณธ๋ฌธ์ ๋ก๊น ํ์ง ์๋๋ค. ๋ฆฌ์์ค ์ธ์ ์์ฒญ์๋ ์ ์ฉ๋์ง ์๋๋ค.
- RequestResponse - ์ด๋ฒคํธ ๋ฉํ๋ฐ์ดํฐ ๋ฐ ์์ฒญ/์๋ต ๋ณธ๋ฌธ์ ๋ก๊น ํ๋ค. ๋ฆฌ์์ค ์ธ์ ์์ฒญ์๋ ์ ์ฉ๋์ง ์๋๋ค.
์ ์๋ก๋ง ๋ด์๋ ํฌ๊ฒ ์ดํดํ๊ธฐ์๊ฐ ํ๋ค๊ฒ๋๋ค. ์ ๋ ์ด๋ ๊ฒ๋ง ๋ด์๋ ์ดํด๊ฐ ์๊ฐ๋๋ค..
๊ทธ๋ผ ๊ณต์ ๋ฌธ์์ ๋์์๋ ์์ ๋ฅผ ํ๋ฒ ๋ณด์ฃ ! ์ข ๋ ์ดํด๊ฐ ์ฌ์ธ ๊ฒ๋๋ค!
apiVersion: audit.k8s.io/v1 # ํ์์ฌํญ์.
kind: Policy
# Request Received ๋จ๊ณ์ ๋ชจ๋ ์์ฒญ์ ๋ํด ๊ฐ์ฌ ์ด๋ฒคํธ๋ฅผ ์์ฑํ์ง ์์.
omitStages:
- "RequestReceived"
rules:
# RequestResponse ์์ค์์ ํ๋ ๋ณ๊ฒฝ ์ฌํญ ๊ธฐ๋ก
- level: RequestResponse
resources:
- group: ""
# ๋ฆฌ์์ค "ํ๋" ๊ฐ RBAC ์ ์ฑ
๊ณผ ๋ถํฉํ๋ ํ๋์ ํ์ ๋ฆฌ์์ค์ ๋ํ
# ์์ฒญ๊ณผ ์ผ์นํ์ง ์์.
resources: ["pods"]
# ๋ฉํ๋ฐ์ดํฐ ์์ค์์ "pods/log", "pods/status"๋ฅผ ๊ธฐ๋กํจ.
- level: Metadata
resources:
- group: ""
resources: ["pods/log", "pods/status"]
# "controller-leader" ๋ผ๋ ์ปจํผ๊ทธ๋งต์ ์์ฒญ์ ๊ธฐ๋กํ์ง ์์."
- level: None
resources:
- group: ""
resources: ["configmaps"]
resourceNames: ["controller-leader"]
# ์๋ํฌ์ธํธ ๋๋ ์๋น์ค์ "system:kube-proxy"์ ์ํ ๊ฐ์ ์์ฒญ ๊ธฐ๋กํ์ง ์์.
- level: None
users: ["system:kube-proxy"]
verbs: ["watch"]
resources:
- group: "" # ํต์ฌ API ๊ทธ๋ฃน
resources: ["endpoints", "services"]
# ์ธ์ฆ๋ ์์ฒญ์ ํน์ ๋ฆฌ์์ค๊ฐ ์๋ URL ๊ฒฝ๋ก์ ๊ธฐ๋กํ์ง ์์.
- level: None
userGroups: ["system:authenticated"]
nonResourceURLs:
- "/api*" # ์์ผ๋์นด๋ ๋งค์นญ(wildcard matching).
- "/version"
# kube-system์ ์ปจํผ๊ทธ๋งต ๋ณ๊ฒฝ ์ฌํญ์ ์์ฒญ ๋ณธ๋ฌธ์ ๊ธฐ๋กํจ.
- level: Request
resources:
- group: "" # ํต์ฌ API ๊ทธ๋ฃน
resources: ["configmaps"]
# ์ด ์ ์ฑ
์ "kube-system" ๋ค์์คํ์ด์ค์ ๋ฆฌ์์ค์๋ง ์ ์ฉ๋จ.
# ๋น ๋ฌธ์์ด "" ์ ๋ค์์คํ์ด์ค๊ฐ ์๋ ๋ฆฌ์์ค๋ฅผ ์ ํํ๋๋ฐ ์ฌ์ฉํ ์ ์์.
namespaces: ["kube-system"]
# ๋ฉํ๋ฐ์ดํฐ ์์ค์์ ๋ค๋ฅธ ๋ชจ๋ ๋ค์์คํ์ด์ค์ ์ปจํผ๊ทธ๋งต๊ณผ ์ํฌ๋ฆฟ ๋ณ๊ฒฝ ์ฌํญ์ ๊ธฐ๋กํจ.
- level: Metadata
resources:
- group: "" # ํต์ฌ API ๊ทธ๋ฃน
resources: ["secrets", "configmaps"]
# ์์ฒญ ์์ค์์ ์ฝ์ด ๋ฐ ํ์ฅ์ ์๋ ๋ค๋ฅธ ๋ชจ๋ ๋ฆฌ์์ค๋ฅผ ๊ธฐ๋กํจ.
- level: Request
resources:
- group: "" # ํต์ฌ API ๊ทธ๋ฃน
- group: "extensions" # ๊ทธ๋ฃน์ ๋ฒ์ ์ ๊ธฐ์ฌํ๋ฉด ์ ๋๋ค.
# ๋ฉํ๋ฐ์ดํฐ ์์ค์์ ๋ค๋ฅธ ๋ชจ๋ ์์ฒญ์ ๊ธฐ๋กํ๊ธฐ ์ํ ๋ชจ๋ ์์ง ์ ์ฑ
.
- level: Metadata
# ์ด ์ ์ฑ
์ ํด๋นํ๋ ๊ฐ์์์ ๊ฐ์ ์ฅ๊ธฐ ์คํ ์์ฒญ์
# RequestReceived์์ ๊ฐ์ฌ ์ด๋ฒคํธ๋ฅผ ์์ฑํ์ง ์์.
omitStages:
- "RequestReceived"
์์ ์ ์์ด ๊ฝค๋ ๋ฐฉ๋ํ๋ ์ค์ํ๋ค๊ณ ์๊ฐํ๋ ํฌ์ธํธ๋ง ์ถ๋ ค๋ดค์ต๋๋ค.
apiVersion: audit.k8s.io/v1 # ํ์์ฌํญ์.
kind: Policy
# Request Received ๋จ๊ณ์ ๋ชจ๋ ์์ฒญ์ ๋ํด ๊ฐ์ฌ ์ด๋ฒคํธ๋ฅผ ์์ฑํ์ง ์์.
omitStages:
- "RequestReceived"
rules:
# ์ฒซ๋ฒ์งธ ๋ฃฐ
# RequestResponse ์์ค์์ ํ๋ ๋ณ๊ฒฝ ์ฌํญ ๊ธฐ๋ก
- level: RequestResponse
resources:
- group: ""
resources: ["pods"]
# ๋๋ฒ์งธ ๋ฃฐ
# RequestResponse ์์ค์์ ํ๋ ๋ณ๊ฒฝ ์ฌํญ ๊ธฐ๋ก
- level: RequestResponse
verbs: ["get", "watch", "list"]
resources:
- group: ""
resources: ["pods"]
# ์ธ๋ฒ์งธ ๋ฃฐ
# ๋ฉํ๋ฐ์ดํฐ ์์ค์์ ๋ค๋ฅธ ๋ชจ๋ ๋ค์์คํ์ด์ค์ ์ปจํผ๊ทธ๋งต๊ณผ ์ํฌ๋ฆฟ ๋ณ๊ฒฝ ์ฌํญ์ ๊ธฐ๋กํจ.
- level: Metadata
resources:
- group: "" # ํต์ฌ API ๊ทธ๋ฃน
resources: ["secrets", "configmaps"]
# ๋ค๋ฒ์งธ ๋ฃฐ
- level: None
.omitStage ๋ก RequestReceived ๋ฅผ ์ ์ธํ๊ธฐ ๋๋ฌธ์ ์ด policy ๋ ์ด๋ค ๋ฃฐ์ด๋ RequestReceived ๋จ๊ณ์์ ๋ก๊ทธ๋ฅผ ์์ฑํ์ง ์์ต๋๋ค. ์ฆ, ํธ๋ค๋ฌ ์ฒด์ธ์ผ๋ก ์์๋๊ธฐ ์ ์ ์์ฑ๋๋ ์ด๋ฒคํธ๋ ์์ฑํ์ง ์์ฃ .
๊ทธ๋ผ ์ด์ ์ฐจ๋ก๋๋ก ๋ฃฐ์ ํ์ธํด๋ณด์ฃ .
์ฒซ๋ฒ์งธ ๋ฃฐ
# RequestResponse ์์ค์์ ํ๋ ๋ณ๊ฒฝ ์ฌํญ ๊ธฐ๋ก
- level: RequestResponse
resources:
- group: ""
resources: ["pods"]
RequestResponse ๋ ๋ฒจ ์ด๊ธฐ ๋๋ฌธ์ ์ด๋ฒคํธ์ ๋ฉํ๋ฐ์ดํฐ, ์์ฒญ/์๋ต ๋ชจ๋ ๋ก๊น ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ก๊น ๋๋ ๋์์ pods ์ ๋๋ค.
์๋ฅผ ๋ค์ด ๋๊ตฐ๊ฐ kubectl get pods ๋ฅผ ํ์ ๊ฒฝ์ฐ ์ด ์ด๋ฒคํธ์ ๋ํ ๋ก๊น ์ด ์ ๋ถ ๊ธฐ๋ก๋ฉ๋๋ค.
๋๊ฐ ํ๋์ง, ์ด๋ค ํ์๋ฅผ ํ๋์ง, ์ด๋ค ์ผ์ด ์์๋์ง ๋ฑ pods ์ ๋ํ ์ ๋ถ๋ฅผ ๊ธฐ๋กํฉ๋๋ค.
๋๋ฒ์งธ ๋ฃฐ
# ๋๋ฒ์งธ ๋ฃฐ
# RequestResponse ์์ค์์ ํ๋ ๋ณ๊ฒฝ ์ฌํญ ๊ธฐ๋ก
- level: RequestResponse
verbs: ["get", "watch", "list"]
resources:
- group: ""
resources: ["pods"]
๋ง์ฐฌ๊ฐ์ง๋ก RequestResponse ๋ ๋ฒจ ์ด๊ธฐ ๋๋ฌธ์ ์ด๋ฒคํธ์ ๋ฉํ๋ฐ์ดํฐ, ์์ฒญ/์๋ต ๋ชจ๋ ๋ก๊น ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ก๊น ๋๋ ๋์์ pods ์ด๋, get, watch, list ์ ๋ํด์๋ง ๊ธฐ๋กํฉ๋๋ค.
์ฆ, create, update ๋ฑ์ ๋ํ ๊ธฐ๋ก์ ์งํ๋์ง ์์ต๋๋ค.
๋์น ์ฑ์ ๋ถ๋ ๊ณ์ ์ง๋ง ์ด๋ ๊ฒ policy ๋ฅผ ์์ฑํ ๊ฒฝ์ฐ ์ฒซ๋ฒ์งธ ๋ฃฐ์ ๊ฒฐ๊ตญ ๋๋ฒ์งธ ๋ฃฐ์ ์ํด ์ ํ๋ฉ๋๋ค.
์๋๋ฉด ์ฒซ๋ฒ์งธ ๋ฃฐ์์ pods ์ verbs ์ ๋ํด ์ ๋ถ ํ์ฉํ์ง๋ง, ๋๋ฒ์งธ ๋ฃฐ์์ pods ์ verbs ๋ฅผ ์ ํํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ธ๋ฒ์งธ ๋ฃฐ
# ์ธ๋ฒ์งธ ๋ฃฐ
# ๋ฉํ๋ฐ์ดํฐ ์์ค์์ ๋ค๋ฅธ ๋ชจ๋ ๋ค์์คํ์ด์ค์ ์ปจํผ๊ทธ๋งต๊ณผ ์ํฌ๋ฆฟ ๋ณ๊ฒฝ ์ฌํญ์ ๊ธฐ๋กํจ.
- level: Metadata
resources:
- group: "" # ํต์ฌ API ๊ทธ๋ฃน
resources: ["secrets", "configmaps"]
Metadata ๋ ๋ฒจ์ด๊ธฐ ๋๋ฌธ์ ์์ฒญ ๋ฉํ๋ฐ์ดํฐ(์์ฒญํ๋ ์ฌ์ฉ์, ํ์์คํฌํ, ๋ฆฌ์์ค, ๋์ฌ(verb) ๋ฑ)๋ง ๋ก๊น ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋์์ secrets, configmaps ์ ๋๋ค.
์ฆ, kubectl get secrets, kubectl edit configmaps ๋ฑ ๋ชจ๋ ํ์๊ฐ ๊ธฐ๋ก๋ฉ๋๋ค.
๋ค๋ฒ์งธ ๋ฃฐ
# ๋ค๋ฒ์งธ ๋ฃฐ
- level: None
Audit ์ policy ์ ํน๋ณํ ๋ช ์ํ์ง ์์ผ๋ฉด ๋ค ํ์ฉ๋ฉ๋๋ค.
์๋ฅผ ๋ค์ด ์ policy ๋ก ๋ดค์ ๋ deployments, pvc ๋ฑ ๋ช ์๋์ง ์๋ ๋ฆฌ์์ค๋ verbs ์ ๋ํ ํ์๋ ์ ๋ถ ๋ก๊น ๋์ฃ .
๋ฐ๋ผ์ ๋ค๋ฒ์งธ ๋ฃฐ ์ฒ๋ผ ๋ช ์ํ์ง ์์ ๋ฃฐ์ ๋ํด์๋ ๋ก๊น ๋๋ ๊ฑธ ๋ง์ ์ ์์ต๋๋ค.
๋๋ต์ ์ผ๋ก audit-policy.yaml ์ ๋ํด ์์๋ณด์๊ณ ์ด๋ฒ์ ์ค์ ๋ก ์ฟ ๋ฒ๋คํฐ์ค์ ์ ์ฉํด๋ณด์ฃ !
์ง๋ ๋ฐค ๋๊ฐ ํ ์ง์ ์๊ณ ์๋ค!
์ค์ต์ ์ํ ์ํฉ์ ๊ฐ์ ํด๋ณด์ฃ !
์๋น์ค๋ฅผ ๊ตฌ์ฑํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฟ ๋ฒ๋คํฐ์ค ํ๊ฒฝ์์ ๊ตฌ๋๋๊ณ ์์ต๋๋ค.
์๋น์ค์ ๋ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ํ ํ๋๋ก ์คํ๋๊ณ ์์ฃ . ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํ ์ ๋ณด๋ ์ํฌ๋ฆฟ์ผ๋ก ๋ฐฐํฌ๋์ด์๊ตฌ์.
๊ทธ๋ฐ๋ฐ!
์ง๋ ๋ฐค ๋๊ตฐ๊ฐ ์๋น์ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋น๋ฐ๋ฒํธ๋ฅผ ์์๋ด๊ธฐ ์ํด ์ํฌ๋ฆฟ์ ์ ๊ทผ์ ํ ์ฌ์ค์ ์๊ฒ๋์์ต๋๋ค.
Audit ๊ธฐ๋ฅ์ ํตํด์ ๋๊ฐ ์ํฌ๋ฆฟ์ ์ ๊ทผ์ ์๋ํ๋์ง ์์๋ด ๋ณด๊ณ ์ ํฉ๋๋ค.
์ฐ์ Audit ๋ฅผ ํ์ฑํด๋ด ์๋ค.
/etc/kubernetes/audit-policy.yaml ์ ๋ง๋ค์ด ์ค์๋ค.
apiVersion: audit.k8s.io/v1
kind: Policy
rules:
- level: Metadata
resources:
- group: ""
resources: ["secrets"]
- level: None
secrets ์๋ง ๊ด์ฌ์ด ์๊ธฐ ๋๋ฌธ์ ๋๋จธ์ง ๋ฆฌ์์ค์ ๋ํด์๋ None ์ฒ๋ฆฌํด์ค๋๋ค.
๊ทธ๋ฐ ๋ค์ /etc/kubernetes/manifest/kube-apiserver.yaml ์ ์๋ ์ต์ ๋ค์ ์ถ๊ฐํด์ค๋๋ค.
...
--audit-policy-file=/etc/kubernetes/audit-policy.yaml
--audit-log-path=/var/log/kubernetes/audit/audit.log
...
volumeMounts:
- mountPath: /etc/kubernetes/audit-policy.yaml
name: audit
readOnly: true
- mountPath: /var/log/kubernetes/audit/
name: audit-log
readOnly: false
...
volumes:
- name: audit
hostPath:
path: /etc/kubernetes/audit-policy.yaml
type: File
- name: audit-log
hostPath:
path: /var/log/kubernetes/audit/
type: DirectoryOrCreate
kube-apiserver ๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์ฌ์์๋์๋ค๋ฉด, /var/log/kubernetes/audit ์ audit.log ํ์ผ์ด ์์ฑ๋์ด ์์ ๊ฑฐ๊ณ , ๋ก๊ทธ ๋ด์ฉ์ด ์ ํ์์ ๊ฒ๋๋ค.
secrets ๊ด๋ จ๋ ๋ฉํ๋ฐ์ดํฐ๋ง ๋ก๊ทธ์ ์ ์ฅ๋๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. ๋ํ ๋ค์ํ stage ์์ ์งํ๋ฉ๋๋ค.
๊ทธ๋ผ ๊ณผ์ฐ ๋๊ฐ db secrets ์ ์ ๊ทผ์ ํ๋์ง ์ฐพ์๋ณด์ฃ !
cat /var/log/kubernetes/audit/audit.log | grep db | jq
์ํ! ๋ฒ์ธ์ ์ฐพ์์ต๋๋ค!
๋ฒ์ธ์ ๋ฐ๋ก myuser ์๊ตฐ์.
myuser ์ด ๊ฐ์ง Role ์ ์ ํํด์ผ๊ฒ ์ด์!!
์ค๋์ ์ด๋ ๊ฒ ์ฟ ๋ฒ๋คํฐ์ค์ Audit ๊ธฐ๋ฅ์ ์์๋ดค์ต๋๋ค.
EKS ๊ฐ์ ๊ฒฝ์ฐ ์ ์ ํ ๋ Audit ์ค์ ์ ํ ์ ์์ผ๋ฉฐ, cloud watch ์์ ํ์ธํ ์ ์๋๋ก ์ง์ํฉ๋๋ค.
๊ทธ๋ฌ๋ฉด ์ค๋์ ์ฌ๊ธฐ๊น์ง!