https://kubernetes.io/docs/tasks/configure-pod-container/security-context/
ํฌ๋ ๋๋ ์ปจํ ์ด๋์ ๋ํ ๊ถํ ๋ฐ ์ก์ธ์ค ์ ์ด ์ค์ ์ ์ ์ํฉ๋๋ค.
- ์์์ ์ ๊ทผ ์ ์ด: ํ์ผ๊ณผ ๊ฐ์ ๊ฐ์ฒด์ ๋ํ ์ ๊ทผ ๊ถํ์ ์ฌ์ฉ์ ID(UID)์ ๊ทธ๋ฃน ID(GID)๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ฒฐ์ ๋ฉ๋๋ค .
- SELinux(๋ณด์ ๊ฐํ Linux) : ๊ฐ์ฒด์ ๋ณด์ ๋ ์ด๋ธ์ด ํ ๋น๋ฉ๋๋ค.
- ํน๊ถ ๋๋ ๋นํน๊ถ์ผ๋ก ์คํ๋ฉ๋๋ค.
- Linux ๊ธฐ๋ฅ : ํ๋ก์ธ์ค์ ์ผ๋ถ ๊ถํ์ ๋ถ์ฌํ์ง๋ง ๋ฃจํธ ์ฌ์ฉ์์ ๋ชจ๋ ๊ถํ์ ๋ถ์ฌํ์ง๋ ์์ต๋๋ค.
- AppArmor : ํ๋ก๊ทธ๋จ ํ๋กํ์ ์ฌ์ฉํ์ฌ ๊ฐ๋ณ ํ๋ก๊ทธ๋จ์ ๊ธฐ๋ฅ์ ์ ํํฉ๋๋ค.
- Seccomp : ํ๋ก์ธ์ค์ ์์คํ ํธ์ถ์ ํํฐ๋งํฉ๋๋ค.
- readOnlyRootFilesystem: ์ปจํ ์ด๋์ ๋ฃจํธ ํ์ผ ์์คํ ์ ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ๋ง์ดํธํฉ๋๋ค.
apiVersion: v1
kind: Pod
metadata:
name: security-context-demo
spec:
securityContext:
runAsUser: 1000 # ์ปจํ
์ด๋ UID
runAsGroup: 3000 # ์ปจํ
์ด๋ GID
fsGroup: 2000 # ๋ณด์กฐ์ ๊ทธ๋ฃน
volumes:
- name: sec-ctx-vol
emptyDir: {}
containers:
- name: sec-ctx-demo
image: busybox:1.28
command: [ "sh", "-c", "sleep 1h" ]
volumeMounts:
- name: sec-ctx-vol
mountPath: /data/demo
securityContext:
allowPrivilegeEscalation: false
allowPrivilegeEscalation
: ํ๋ก์ธ์ค๊ฐ ์์ ํ๋ก์ธ์ค๋ณด๋ค ๋ ๋ง์ ๊ถํ์ ์ป์ ์ ์๋์ง ์ฌ๋ถ๋ฅผ ์ ์ดํฉ๋๋ค. no_new_privs ์ด bool์ ํ๋๊ทธ๊ฐ ์ปจํ ์ด๋ ํ๋ก์ธ์ค์ ์ค์ ๋๋์ง ์ฌ๋ถ๋ฅผ ์ง์ ์ ์ดํฉ๋๋ค.
allowPrivilegeEscalation์ปจํ ์ด๋๊ฐ ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์๋ ํญ์ true์ ๋๋ค.
- true์ผ ๊ฒฝ์ฐ ํน๊ถ ๋ชจ๋๋ก ์คํ๋๊ฑฐ๋
- CAP_SYS_ADMIN์ ๊ฐ์ง
- false: ๋ถ๋ชจํ๋ก์ธ์ค๋ณด๋ค ๊ถํ์ ๋ ๊ฐ์ง ๋ชปํ๋๋กํจ, Privileage Escalation ์ ๋ฐฉ์งํจ
apiVersion: v1
kind: Pod
metadata:
name: security-context-demo-2
spec:
securityContext:
runAsUser: 1000
containers:
- name: sec-ctx-demo-2
image: gcr.io/google-samples/node-hello:1.0
securityContext:
runAsUser: 2000 # ํด๋น ์ปจํ
์ด๋์์ ์ฐ์ ์์ ๋ ๋์
allowPrivilegeEscalation: false
spec.containers.securityContext : ์ปจํ ์ด๋ ๋ด๋ถ UID
spec.seucirtyContext: ํ๋ ๋ด๋ถ UID
apiVersion: v1
kind: Pod
metadata:
name: security-context-demo-4
spec:
containers:
- name: sec-ctx-4
image: gcr.io/google-samples/node-hello:1.0
securityContext:
capabilities:
add: ["NET_ADMIN", "SYS_TIME"]
๋ด๋ถ ์ปจํ ์ด๋ ๊ถํ ๋ถ์ฌ :
capabilities
์ธ๋ถ์์ ํ๋ ๋ด๋ถ ๋๋ ์ปจํ ์ด๋์ ์ ๊ทผํ์ ๋, ๋ด๋ถ์์ ๋์ ๊ฐ๋ฅํ ๋ฒ์๋ฅผ ์ฌ์ ์ ์ ํด๋ UID๋ฑ ์ ์ ๊ถํ ์ค์ ์ ์ ํํ์ฌ ๋ด๋ถ์ ๊ณต๊ฒฉ ๋ฐ ํผํด๋ฅผ ๋ฐฉ์ง ๊ฐ๋ฅํ๋ค.
https://kubernetes.io/ko/docs/concepts/services-networking/network-policies/
๋คํธ์ํฌ ์ ์ฑ ์ ํตํด ํ๋๊ฐ ํต์ ์ค์
- ๋คํธ์ํฌ ๋ด์ ์กด์ฌํ๋ ์๋ํฌ์ธํธ ํ๋๊ฐ์ ํต์ ๋ฐฉ๋ฒ์๋ง ์ ์ฉ
- ํ์ฉ๋๋ ๋ค๋ฅธ ํ๋(์์ธ: ํ๋๋ ์์ ์ ๋ํ ์ ๊ทผ์ ์ฐจ๋จํ ์ ์์)
- ํ์ฉ๋๋ ๋ค์์คํ์ด์ค
- IP ๋ธ๋ก(์์ธ: ํ๋ ๋๋ ๋ ธ๋์ IP ์ฃผ์์ ๊ด๊ณ์์ด ํ๋๊ฐ ์คํ ์ค์ธ ๋ ธ๋์์ ํธ๋ํฝ์ ํญ์ ํ์ฉ๋จ)
- ํ๋์ ํ์ฉ๋๋ ํธ๋ํฝ ๊ท์น์ ์ ์ ๋ฐ ์ ํ
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: default
spec:
podSelector: # ์ ์ฑ
์ ์ ์ฉํ ํ๋
matchLabels:
role: db
policyTypes:
- Ingress
- Egress
ingress: # role: db์ธ ํ๋์ ์ ์ฉํ ์ธ๊ทธ๋ ์ค ํ์ดํธ๋ฆฌ์คํธ
- from:
- ipBlock:
cidr: 172.17.0.0/16
except:
- 172.17.1.0/24
- namespaceSelector: #๋ค์์คํ์ด์ค์ ํ ๋น๋ ๋ ์ด๋ธ
matchLabels:
project: myproject
- podSelector: # ํน์ ํ ํฌ๋์ ํ ๋น๋ ๋ ์ด๋ธ ๋งค์น
matchLabels:
role: frontend
ports:
- protocol: TCP
port: 6379
egress: # ์ธ๋ถ๋ก ๋๊ฐ๋ ํต์ ์ ์ ํ์ํค๋๋ก ์ค์ (ingress์ ์กฐ๊ฑด ๋์ผ)
- to:
- ipBlock:
cidr: 10.0.0.0/24
ports:
- protocol: TCP
port: 5978
๋๊ฐ๋ ํธ๋ํฝ์ ๋ํ ์ ์ฑ ์ค์
๊ฐ ๋คํธ์ํฌํด๋ฆฌ์์๋ ํ์ดํธ๋ฆฌ์คํธ egress ๊ท์น์ด ํฌํจ๋ ์ ์๋ค. ๊ฐ ๊ท์น์ to ์ ports ๋ถ๋ถ๊ณผ ๋ชจ๋ ์ผ์นํ๋ ํธ๋ํฝ์ ํ์ฉํ๋ค.
(ํ์ดํธ๋ฆฌ์คํธ - ๋ธ๋๋ฆฌ์คํธ์ ๋ฐ๋)
- namespace๊ฐ defualt ์ด๊ณ
- role=db ๋ ์ด๋ธ์ ๊ฐ์ง ๋ชจ๋ ํ๋์์ TCPํฌํธ 5978 ์ CIDR 10.0.0.0/24 ๋ก์ ์ฐ๊ฒฐ์ ํ์ฉํจ
๋ค์ด์ค๋ ํธ๋ํฝ์ ๋ํ ์ ์ฑ ์ค์
๊ฐ ๋คํธ์ํฌํด๋ฆฌ์์๋ ํ์ดํธ๋ฆฌ์คํธ ingress ๊ท์น ๋ชฉ๋ก์ด ํฌํจ๋ ์ ์๋ค. ๊ฐ ๊ท์น์ from ๊ณผ ports ๋ถ๋ถ๊ณผ ๋ชจ๋ ์ผ์นํ๋ ํธ๋ํฝ์ ํ์ฉํ๋ค.
"role=db" ๋ ์ด๋ธ์ ์ฌ์ฉํ๋ "default" ๋ค์์คํ์ด์ค์ ๋ชจ๋ ํ๋์ ๋ํด์ TCP ํฌํธ 6379๋ก์ ์ฐ๊ฒฐ์ ํ์ฉํ๋ค. ์ธ๊ทธ๋ ์ค์ ํ์ฉ ํ ๋์์ ๋ค์๊ณผ ๊ฐ๋ค.
- ์๋๋ ๋ชจ๋ ํ๋๋ผ๋ ๋ง์กฑํ๋ฉด ํต๊ณผ๋จ (or์ฐ์ฐ)
- "role=frontend" ๋ ์ด๋ธ์ด ์๋ "default" ๋ค์์คํ์ด์ค์ ๋ชจ๋ ํ๋(ingress ๋์ํฌ๋)
- ๋ค์์คํ์ด์ค์ "project=myproject" ๋ฅผ ๋ ์ด๋ธ๋ก ๊ฐ์ง๋ ๋ชจ๋ ํ๋(ingress ์์ฒญํฌ๋)
- 172.17.0.0โ172.17.0.255 ์ 172.17.2.0โ172.17.255.255 ์ ๋ฒ์๋ฅผ ๊ฐ์ง๋ IP ์ฃผ์(์: 172.17.0.0/16 ์ ์ฒด์์ 172.17.1.0/24 ๋ฅผ ์ ์ธ)
or ์ฐ์ฐ ํ์ฉ -> group3 ์๋ ๋ง์๋จ๋๋ฐ group2์์ ํ์ฉํ๋ฉด ํต์ ๊ฐ๋ฅ
https://kubernetes.io/ko/docs/tasks/debug/debug-cluster/audit/
์ฟ ๋ฒ๋คํฐ์ค ๊ฐ์ฌ(auditing)๋ ํด๋ฌ์คํฐ์ ์์ ์์๋ฅผ ๋ฌธ์ํํ๋ ๋ณด์ ๊ด๋ จ ์๊ฐ๋ณ ๋ ์ฝ๋ ์ธํธ๋ฅผ ์ ๊ณตํ๋ค. ํด๋ฌ์คํฐ๋ ์ฌ์ฉ์, ์ฟ ๋ฒ๋คํฐ์ค API๋ฅผ ์ฌ์ฉํ๋ ์ ํ๋ฆฌ์ผ์ด์ ๋ฐ ์ปจํธ๋กค ํ๋ ์ธ ์์ฒด์์ ์์ฑ๋ ํ๋์ ๊ฐ์ฌํ๋ค.
๊ฐ์ฌ๋ฅผ ํตํด ํด๋ฌ์คํฐ ๊ด๋ฆฌ์๋ ๋ค์ ์ง๋ฌธ์ ๋ตํ ์ ์๋ค.
- ๋ฌด์จ ์ผ์ด ์ผ์ด๋ฌ๋์ง?
- ์ธ์ ์ผ์ด๋ ์ผ์ธ์ง?
- ๋๊ฐ ์์ํ๋์ง?
- ์ด๋ค ์ผ์ด ์์๋์ง?
- ์ด๋์ ๊ด์ฐฐ๋์๋์ง?
- ์ด๋์๋ถํฐ ์์๋์๋์ง?
- ๊ทธ๋์ ์ด๋๊น์ง ๊ฐ๋์ง?
๊ฐ์ฌ ๊ธฐ๋ก์ kube-apiserver ์ปดํฌ๋ํธ ๋ด์์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ์์ํ๋ค. ์คํ์ ๊ฐ ๋จ๊ณ์์ ๊ฐ ์์ฒญ์ ๊ฐ์ฌ ์ด๋ฒคํธ๋ฅผ ์์ฑํ๊ณ , ๊ฐ์ฌ ์ด๋ฒคํธ๋ ํน์ ์ ์ฑ ์ ๋ฐ๋ผ ์ฌ์ ์ฒ๋ฆฌ๋๊ณ ๋ฐฑ์๋์ ๊ธฐ๋ก๋๋ค. ์ ์ฑ ์ ๊ธฐ๋ก๋ ๋ด์ฉ์ ๊ฒฐ์ ํ๊ณ ๋ฐฑ์๋๋ ๊ธฐ๋ก์ ์ ์งํ๋ค. ํ์ฌ ๋ฐฑ์๋ ๊ตฌํ์๋ ๋ก๊ทธ ํ์ผ ๋ฐ ์นํ ์ด ํฌํจ๋๋ค.
๊ฐ ์์ฒญ๋ค์ ์ฐ๊ด๋ ๋จ๊ณ(stage) ์ ํจ๊ป ๊ธฐ๋ก๋ ์ ์๋ค. ์ ์๋ ๋จ๊ณ๋ ๋ค์๊ณผ ๊ฐ๋ค.
RequestReceived
- ๊ฐ์ฌ ํธ๋ค๋ฌ๊ฐ ์์ฒญ์ ์์ ํ ์งํ, ๊ทธ๋ฆฌ๊ณ ํธ๋ค๋ฌ ์ฒด์ธ์ผ๋ก ์์๋๊ธฐ ์ ์ ์์ฑ๋๋ ์ด๋ฒคํธ์ ๋ํ ๋จ๊ณ์ด๋ค.ResponseStarted
- ์๋ต ํค๋๋ ์ ์ก๋์์ง๋ง, ์๋ต ๋ณธ๋ฌธ(body)์ ์ ์ก๋๊ธฐ ์ ์ธ ๋จ๊ณ์ด๋ค. ์ด ๋จ๊ณ๋ ์ค๋ ์คํ๋๋ ์์ฒญ(์: watch)์ ๋ํด์๋ง ์์ฑ๋๋ค.ResponseComplete
- ์๋ต ๋ด์ฉ์ด ์๋ฃ๋์์ผ๋ฉฐ, ๋ ์ด์ ๋ฐ์ดํธ๊ฐ ์ ์ก๋์ง ์์ ๋์ ๋จ๊ณ์ด๋ค.Panic
- ํจ๋์ด ๋ฐ์ํ์ ๋ ์์ฑ๋๋ ์ด๋ฒคํธ์ด๋ค.๊ฐ์ฌ ๋ก๊น ๊ธฐ๋ฅ์ ๊ฐ์ฌ์ ํ์ํ ์ผ๋ถ ์ปจํ ์คํธ๊ฐ ์์ฒญ๋ง๋ค ์ ์ฅ๋๊ธฐ ๋๋ฌธ์ API ์๋ฒ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ฆ๊ฐ์ํจ๋ค. ๋ฉ๋ชจ๋ฆฌ ์๋น๋์ ๊ฐ์ฌ ๋ก๊น ๊ตฌ์ฑ์ ๋ฐ๋ผ ๋ค๋ฅด๋ค.
๊ฐ์ฌ ์ ์ฑ ์ ๊ธฐ๋กํด์ผ ํ๋ ์ด๋ฒคํธ์ ํฌํจํด์ผ ํ๋ ๋ฐ์ดํฐ์ ๋ํ ๊ท์น์ ์ ์ํ๋ค. ๊ฐ์ฌ ์ ์ฑ ์ค๋ธ์ ํธ ๊ตฌ์กฐ๋ audit.k8s.io API ๊ทธ๋ฃน์ ์ ์๋์ด ์๋ค. ์ด๋ฒคํธ๊ฐ ์ฒ๋ฆฌ๋๋ฉด ๊ท์น ๋ชฉ๋ก๊ณผ ์์๋๋ก ๋น๊ต๋๋ค. ์ฒซ๋ฒ์งธ ์ผ์น ๊ท์น์ ์ด๋ฒคํธ์ ๊ฐ์ฌ ์์ค(audit level)์ ์ค์ ํ๋ค.
None
- ์ด ๊ท์น์ ํด๋น๋๋ ์ด๋ฒคํธ๋ ๋ก๊น ํ์ง ์๋๋ค.Metadata
- ์์ฒญ ๋ฉํ๋ฐ์ดํฐ(์์ฒญํ๋ ์ฌ์ฉ์, ํ์์คํฌํ, ๋ฆฌ์์ค, ๋์ฌ(verb) ๋ฑ)๋ ๋ก๊น ํ์ง๋ง ์์ฒญ/์๋ต ๋ณธ๋ฌธ์ ๋ก๊น ํ์ง ์๋๋ค.Request
- ์ด๋ฒคํธ ๋ฉํ๋ฐ์ดํฐ ๋ฐ ์์ฒญ ๋ณธ๋ฌธ์ ๋ก๊น ํ์ง๋ง ์๋ต ๋ณธ๋ฌธ์ ๋ก๊น ํ์ง ์๋๋ค. ๋ฆฌ์์ค ์ธ์ ์์ฒญ์๋ ์ ์ฉ๋์ง ์๋๋ค.RequestResponse
- ์ด๋ฒคํธ ๋ฉํ๋ฐ์ดํฐ ๋ฐ ์์ฒญ/์๋ต ๋ณธ๋ฌธ์ ๋ก๊น ํ๋ค. ๋ฆฌ์์ค ์ธ์ ์์ฒญ์๋ ์ ์ฉ๋์ง ์๋๋ค.--audit-policy-file ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ฑ ์ด ํฌํจ๋ ํ์ผ์ kube-apiserver์ ์ ๋ฌํ ์ ์๋ค. ํ๋๊ทธ๋ฅผ ์๋ตํ๋ฉด ์ด๋ฒคํธ๊ฐ ๊ธฐ๋ก๋์ง ์๋๋ค. ๊ฐ์ฌ ์ ์ฑ ํ์ผ์ rules ํ๋๊ฐ ๋ฐ๋์ ์ ๊ณต๋์ด์ผ ํ๋ค. ๊ท์น์ด ์๋(0๊ฐ์ธ) ์ ์ฑ ์ ์ ์ ํ์ง ์์(illegal) ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋๋ค.
audit/audit-policy.yaml
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"
๊ฐ์ฌ ๋ฐฑ์๋๋ ๊ฐ์ฌ ์ด๋ฒคํธ๋ฅผ ์ธ๋ถ ์ ์ฅ์์ ์ ์งํ๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก kube-apiserver๋ ๋ ๊ฐ์ง ๋ฐฑ์๋๋ฅผ ์ ๊ณตํ๋ค.
- ์ด๋ฒคํธ๋ฅผ ํ์ผ ์์คํ ์ ๊ธฐ๋กํ๋ ๋ก๊ทธ ๋ฐฑ์๋
- ์ด๋ฒคํธ๋ฅผ ์ธ๋ถ HTTP API๋ก ๋ณด๋ด๋ Webhook ๋ฐฑ์๋
--audit-policy-file ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ฑ ์ด ํฌํจ๋ ํ์ผ์ kube-apiserver์ ์ ๋ฌํ ์ ์๋ค. ํ๋๊ทธ๋ฅผ ์๋ตํ๋ฉด ์ด๋ฒคํธ๊ฐ ๊ธฐ๋ก๋์ง ์๋๋ค. ๊ฐ์ฌ ์ ์ฑ ํ์ผ์ rules ํ๋๊ฐ ๋ฐ๋์ ์ ๊ณต๋์ด์ผ ํ๋ค. ๊ท์น์ด ์๋(0๊ฐ์ธ) ์ ์ฑ ์ ์ ์ ํ์ง ์์(illegal) ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋๋ค.
๋ก๊ทธ ๋ฐฑ์๋๋ ๊ฐ์ฌ์ด๋ฒคํธ๋ฅผ JSONlines ํ์์ผ๋ก ํ์ผ์ ๊ธฐ๋กํ๋ค. ๋ค์์ kube-apiserver ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ก๊ทธ ๊ฐ์ฌ ๋ฐฑ์๋๋ฅผ ๊ตฌ์ฑํ ์ ์๋ค.
--audit-log-path
๋ ๋ก๊ทธ ๋ฐฑ์๋๊ฐ ๊ฐ์ฌ ์ด๋ฒคํธ๋ฅผ ์ฐ๋ ๋ฐ ์ฌ์ฉํ๋ ๋ก๊ทธ ํ์ผ ๊ฒฝ๋ก๋ฅผ ์ง์ ํ๋ค. ์ด ํ๋๊ทธ๋ฅผ ์ง์ ํ์ง ์์ผ๋ฉด ๋ก๊ทธ ๋ฐฑ์๋๊ฐ ๋นํ์ฑํ๋๋ค. - ๋ ํ์ค ์ถ๋ ฅ์ ์๋ฏธํ๋ค.--audit-log-maxage
๋ ์ค๋๋ ๊ฐ์ฌ ๋ก๊ทธ ํ์ผ์ ๋ณด๊ดํ ์ต๋ ์ผ์๋ฅผ ์ ์ํ๋ค.--audit-log-maxbackup
์ ๋ณด๊ดํ ๊ฐ์ฌ ๋ก๊ทธ ํ์ผ์ ์ต๋ ์๋ฅผ ์ ์ํ๋ค.--audit-log-maxsize
๋ ๊ฐ์ฌ ๋ก๊ทธ ํ์ผ์ด ๋กํ ์ดํธ ๋๊ธฐ ์ ์ ์ต๋ ํฌ๊ธฐ(MB)๋ฅผ ์ ์ํ๋ค.
ํด๋ฌ์คํฐ์ ์ปจํธ๋กค ํ๋ ์ธ์ด kube-apiserver๋ฅผ ํ๋๋ก ์คํํ๋ ๊ฒฝ์ฐ ๊ฐ์ฌ ๋ ์ฝ๋๊ฐ ์ง์๋๋๋ก ์ ์ฑ ํ์ผ ๋ฐ ๋ก๊ทธ ํ์ผ์ ์์น์ hostPath ๋ฅผ ๋ง์ดํธ ํด์ผํ๋ค. ์๋ฅผ ๋ค๋ฉด
/etc/kubernetes/manifests/kube-apiserver.yaml
--audit-policy-file=/etc/kubernetes/pki/audit.conf --audit-log-path=/var/log/audit.log
/etc/kubernetes/manifests/kube-apiserver.yaml
... 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
https://aquasecurity.github.io/trivy/v0.46/
๋์ปค ์ด๋ฏธ์ง/ ์ปจํ ์ด๋ ๋ด๋ถ์ ๋ชจ๋์ ์ฝ์ด์ ํด๋น ๋ชจ๋๋ค์ ์ทจ์ฝ์ ์ ๋ฐ์ดํฐ ๋ฒ ์ด์ค๋ก ๊ฐ์ ธ์์ ๋ชจ๋ํฐ๋ง
https://aquasecurity.github.io/trivy/v0.46/docs/target/container_image/
์ฟ ๋ฒ๋คํฐ์ค ๋ณด์ ์ ๊ฒ ๋ฒค์น๋งํฌ: https://www.cisecurity.org/
https://aquasecurity.github.io/kube-bench/v0.6.15/
curl -L https://github.com/aquasecurity/kube-bench/releases/download/v0.6.2/kube-bench_0.6.2_linux_amd64.deb -o kube-bench_0.6.2_linux_amd64.deb
sudo apt install ./kube-bench_0.6.2_linux_amd64.deb -f
git clone https://github.com/aquasecurity/kube-bench.git
cd kube-bench
./kube-bench --config-dir `pwd`/cfg --config `pwd`/cfg/config.yaml
: configuration ๋๋ ํฐ๋ฆฌ ๋ฐ ํ์ผ ์ค์ (ํ์ฌ ํ๊ฒฝ์ ๋ฐ๋ฅธ ๋์ ์ ์๋ ํ์ผ)
ํน์ ์ด๋ฒคํธ ํ์ง ๊ฐ๋ฅ
- kubernetes ์ํ ํ์ง ์์ง
- ๋ฐํ์ ๋ณด์ ํ๋ก์ ํธ (๋ฐํ์์์ ๋์ํ๋ ๊ฒ์ ์ค์๊ฐ์ผ๋ก ๋ชจ๋ํฐ๋ง)
https://falco.org/ko/docs/installation/
https://falco.org/ko/docs/getting-started/falco-kubernetes-quickstart/
https://falco.org/ko/docs/reference/rules/supported-fields/
systemctl start falco
systemctl status falco
systemctl restart falco
/etc/falco/falco.yaml
: falco ์ค์ ํ์ผ
cat /var/log/events.log | grep falco
vi /etc/falco/falco_rules.yaml
vi /etc/falco/faco_rules.local.yaml
: ์ฌ์ฉ์ ์ ์ ๋ฃฐ