Π Π°Π½ΠΎ ΠΈΠ»ΠΈ ΠΏΠΎΠ·Π΄Π½ΠΎ Π² ΡΠΊΡΠΏΠ»ΡΠ°ΡΠ°ΡΠΈΠΈ Π»ΡΠ±ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ Π²ΡΡΠ°ΡΡ Π²ΠΎΠΏΡΠΎΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ: ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ, ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΏΡΠ°Π², Π°ΡΠ΄ΠΈΡΠ° ΠΈ Π΄ΡΡΠ³ΠΈΡ
Π·Π°Π΄Π°Ρ. ΠΠ»Ρ Kubernetes ΡΠΆΠ΅ ΡΠΎΠ·Π΄Π°Π½ΠΎ
ΠΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ
Π Kubernetes Π΅ΡΡΡ Π΄Π²Π° ΡΠΈΠΏΠ° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ:
- Service Accounts β Π°ΠΊΠΊΠ°ΡΠ½ΡΡ, ΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌΡΠ΅ Kubernetes API;
- Users β Β«Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΡΠ΅Β» ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΠΈ, ΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌΡΠ΅ Π²Π½Π΅ΡΠ½ΠΈΠΌΠΈ, Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΡΠΌΠΈ ΡΠ΅ΡΠ²ΠΈΡΠ°ΠΌΠΈ.
ΠΡΠ½ΠΎΠ²Π½ΠΎΠ΅ ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΡΡΠΈΡ
ΡΠΈΠΏΠΎΠ² Π² ΡΠΎΠΌ, ΡΡΠΎ Π΄Π»Ρ Service Accounts ΡΡΡΠ΅ΡΡΠ²ΡΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ Π² Kubernetes API (ΠΎΠ½ΠΈ ΡΠ°ΠΊ ΠΈ Π½Π°Π·ΡΠ²Π°ΡΡΡΡ β ServiceAccounts
), ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΡΠΈΠ²ΡΠ·Π°Π½Ρ ΠΊ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Ρ ΠΈΠΌΡΠ½ ΠΈ Π½Π°Π±ΠΎΡΡ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΎΠ½Π½ΡΡ
Π΄Π°Π½Π½ΡΡ
, Ρ
ΡΠ°Π½ΡΡΠΈΡ
ΡΡ Π² ΠΊΠ»Π°ΡΡΠ΅ΡΠ΅ Π² ΠΎΠ±ΡΠ΅ΠΊΡΠ°Ρ
ΡΠΈΠΏΠ° Secrets. Π’Π°ΠΊΠΈΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΠΈ (Service Accounts) ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Ρ Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌ Π΄Π»Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΏΡΠ°Π²Π°ΠΌΠΈ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ Kubernetes API ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ², ΡΠ°Π±ΠΎΡΠ°ΡΡΠΈΡ
Π² ΠΊΠ»Π°ΡΡΠ΅ΡΠ΅ Kubernetes.
ΠΠ±ΡΡΠ½ΡΠ΅ ΠΆΠ΅ Users Π½Π΅ ΠΈΠΌΠ΅ΡΡ Π·Π°ΠΏΠΈΡΠ΅ΠΉ Π² Kubernetes API: ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈΠΌΠΈ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΡΡΡΡ Π²Π½Π΅ΡΠ½ΠΈΠΌΠΈ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠ°ΠΌΠΈ. ΠΠ½ΠΈ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Ρ Π΄Π»Ρ Π»ΡΠ΄Π΅ΠΉ ΠΈΠ»ΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ², ΠΆΠΈΠ²ΡΡΠΈΡ Π²Π½Π΅ ΠΊΠ»Π°ΡΡΠ΅ΡΠ°.
ΠΠ°ΠΆΠ΄ΡΠΉ Π·Π°ΠΏΡΠΎΡ ΠΊ API ΠΏΡΠΈΠ²ΡΠ·Π°Π½ Π»ΠΈΠ±ΠΎ ΠΊ Service Account, Π»ΠΈΠ±ΠΎ ΠΊ User, Π»ΠΈΠ±ΠΎ ΡΡΠΈΡΠ°Π΅ΡΡΡ Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΡΠΌ.
ΠΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΎΠ½Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π²ΠΊΠ»ΡΡΠ°ΡΡ Π² ΡΠ΅Π±Ρ:
- Username β ΠΈΠΌΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ (Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΡΠ΅Π³ΠΈΡΡΡΠ°!);
- UID β ΠΌΠ°ΡΠΈΠ½Π½ΠΎ-ΡΠΈΡΠ°Π΅ΠΌΠ°Ρ ΡΡΡΠΎΠΊΠ° ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, ΠΊΠΎΡΠΎΡΠ°Ρ Β«Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΠ½ΡΠΈΡΡΠ΅Π½ΡΠ½Π° ΠΈ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½Π°, ΡΠ΅ΠΌ ΠΈΠΌΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΒ»;
- Groups β ΡΠΏΠΈΡΠΎΠΊ Π³ΡΡΠΏΠΏ, ΠΊ ΠΊΠΎΡΠΎΡΡΠΌ ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ;
- Extra β Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΏΠΎΠ»Ρ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½Ρ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠΎΠΌ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ.
Kubernetes ΠΌΠΎΠΆΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π±ΠΎΠ»ΡΡΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠΎΠ² Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ: ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΡ X509, Bearer-ΡΠΎΠΊΠ΅Π½Ρ, Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΡΠΈΡΡΡΡΠΈΠΉ ΠΏΡΠΎΠΊΡΠΈ, HTTP Basic Auth. ΠΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΡΡΠΈΡ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ Π±ΠΎΠ»ΡΡΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΡ Π΅ΠΌ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ: ΠΎΡ ΡΡΠ°ΡΠΈΡΠ½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° Ρ ΠΏΠ°ΡΠΎΠ»ΡΠΌΠΈ Π΄ΠΎ OpenID OAuth2.
ΠΠΎΠ»Π΅Π΅ ΡΠΎΠ³ΠΎ, Π΄ΠΎΠΏΡΡΠΊΠ°Π΅ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΡΡ Π΅ΠΌ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ. ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π² ΠΊΠ»Π°ΡΡΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ:
- service account tokens β Π΄Π»Ρ Service Accounts;
- X509 β Π΄Π»Ρ Users.
ΠΠΎΠΏΡΠΎΡ ΠΏΡΠΎ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ 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"
- ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ Π·Π°ΠΏΡΠΎΡΠ° Π½Π° ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΠΊΠ»ΡΡΠ΅ΠΉ CA ΠΊΠ»Π°ΡΡΠ΅ΡΠ° Kubernetes, ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ (Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ° Π½ΡΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ΅ΡΠ½ΡΡ Π·Π°ΠΏΠΈΡΡ, ΠΈΠΌΠ΅ΡΡΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ ΠΊΠ»ΡΡΡ ΡΠ΅Π½ΡΡΠ° ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΠΊΠ»Π°ΡΡΠ΅ΡΠ° Kubernetes, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π½Π°Ρ
ΠΎΠ΄ΠΈΡΡΡ Π²
/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-server ΠΊΠ»Π°ΡΡΠ΅ΡΠ°):
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: Π’ΡΠ΅Π±ΡΠ΅ΠΌΡΠΉ advertise address ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π² ΠΊΠΎΠ½ΡΠΈΠ³Π΅ api-server, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ Π² /etc/kubernetes/manifests/kube-apiserver.yaml
.
Π Π΅Π·ΡΠ»ΡΡΠΈΡΡΡΡΠΈΠΉ ΠΊΠΎΠ½ΡΠΈΠ³ Π±ΡΠ΄Π΅Ρ Π²ΡΠ²Π΅Π΄Π΅Π½ Π² stdout. ΠΠ³ΠΎ Π½ΡΠΆΠ½ΠΎ ΡΠΎΡ
ΡΠ°Π½ΠΈΡΡ Π² ~/.kube/config
ΡΡΠ΅ΡΠ½ΠΎΠΉ Π·Π°ΠΏΠΈΡΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΈΠ»ΠΈ ΠΆΠ΅ Π² ΡΠ°ΠΉΠ», ΡΠΊΠ°Π·Π°Π½Π½ΡΠΉ Π² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ KUBECONFIG
.
ΠΠΎΠΏΠ½ΡΡΡ Π³Π»ΡΠ±ΠΆΠ΅
ΠΠ»Ρ ΠΆΠ΅Π»Π°ΡΡΠΈΡ ΡΡΠ°ΡΠ΅Π»ΡΠ½Π΅Π΅ ΡΠ°Π·ΠΎΠ±ΡΠ°ΡΡΡΡ Π² ΠΎΠΏΠΈΡΠ°Π½Π½ΡΡ Π²ΠΎΠΏΡΠΎΡΠ°Ρ :
-
ΠΎΡΠ΄Π΅Π»ΡΠ½Π°Ρ ΡΡΠ°ΡΡΡ ΠΏΠΎ ΡΠ°Π±ΠΎΡΠ΅ Ρ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠ°ΠΌΠΈ Π² ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΠΎΠΉ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ Kubernetes; -
Ρ ΠΎΡΠΎΡΠ°Ρ ΡΡΠ°ΡΡΡ ΠΎΡ Bitnami , Π² ΠΊΠΎΡΠΎΡΠΎΠΉ Π²ΠΎΠΏΡΠΎΡ ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠΎΠ² Π·Π°ΡΡΠΎΠ½ΡΡ Ρ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΡΠΎΡΠΎΠ½Ρ. -
ΠΎΠ±ΡΠ°Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ ΠΏΠΎ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ Π² Kubernetes.
ΠΠ²ΡΠΎΡΠΈΠ·Π°ΡΠΈΡ
ΠΠ²ΡΠΎΡΠΈΠ·ΠΎΠ²Π°Π½Π½Π°Ρ ΡΡΠ΅ΡΠ½Π°Ρ Π·Π°ΠΏΠΈΡΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ ΠΏΡΠ°Π² Π½Π° Π΄Π΅ΠΉΡΡΠ²ΠΈΡ Π² ΠΊΠ»Π°ΡΡΠ΅ΡΠ΅. ΠΠ»Ρ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠΉ Π² Kubernetes ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ.
ΠΠΎ Π²Π΅ΡΡΠΈΠΈ 1.6 Π² Kubernetes ΠΏΡΠΈΠΌΠ΅Π½ΡΠ»ΡΡ ΡΠΈΠΏ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ, Π½Π°Π·ΡΠ²Π°Π΅ΠΌΡΠΉ ABAC (Attribute-based access control). ΠΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠΈ ΠΎ Π½ΡΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ Π²
ΠΠΊΡΡΠ°Π»ΡΠ½ΡΠΉ ΠΆΠ΅ (ΠΈ Π±ΠΎΠ»Π΅Π΅ Π³ΠΈΠ±ΠΊΠΈΠΉ) ΡΠΏΠΎΡΠΎΠ± ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΏΡΠ°Π² Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΠΊΠ»Π°ΡΡΠ΅ΡΡ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ RBAC (
Π§ΡΠΎΠ±Ρ Π²ΠΊΠ»ΡΡΠΈΡΡ RBAC, Π½ΡΠΆΠ½ΠΎ Π·Π°ΠΏΡΡΡΠΈΡΡ Kubernetes api-server Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠΌ --authorization-mode=RBAC
. ΠΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π²ΡΡΡΠ°Π²Π»ΡΡΡΡΡ Π² ΠΌΠ°Π½ΠΈΡΠ΅ΡΡΠ΅ Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠ΅ΠΉ api-server, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π½Π°Ρ
ΠΎΠ΄ΠΈΡΡΡ ΠΏΠΎ ΠΏΡΡΠΈ /etc/kubernetes/manifests/kube-apiserver.yaml
, Π² ΡΠ΅ΠΊΡΠΈΠΈ command
. ΠΠΏΡΠΎΡΠ΅ΠΌ, ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ RBAC ΠΈ ΡΠ°ΠΊ Π²ΠΊΠ»ΡΡΠ΅Π½, ΠΏΠΎΡΡΠΎΠΌΡ ΡΠΊΠΎΡΠ΅Π΅ Π²ΡΠ΅Π³ΠΎ Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡΡΡΡ ΠΎΠ± ΡΡΠΎΠΌ Π½Π΅ ΡΡΠΎΠΈΡ: ΡΠ±Π΅Π΄ΠΈΡΡΡΡ Π² ΡΡΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ authorization-mode
(Π² ΡΠΆΠ΅ ΡΠΏΠΎΠΌΡΠ½ΡΡΠΎΠΌ kube-apiserver.yaml
). Π ΡΠ»ΠΎΠ²Ρ, ΡΡΠ΅Π΄ΠΈ Π΅Π³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ ΠΌΠΎΠ³ΡΡ ΠΎΠΊΠ°Π·Π°ΡΡΡΡ ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ ΡΠΈΠΏΡ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ (node
, webhook
, always allow
), Π½ΠΎ ΠΈΡ
ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½ΠΈΠ΅ ΠΎΡΡΠ°Π²ΠΈΠΌ Π·Π° ΡΠ°ΠΌΠΊΠ°ΠΌΠΈ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»Π°.
Π ΡΠ»ΠΎΠ²Ρ, ΠΌΡ ΡΠΆΠ΅ ΠΏΡΠ±Π»ΠΈΠΊΠΎΠ²Π°Π»ΠΈ
ΠΠ»Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Π΄ΠΎΡΡΡΠΏΠΎΠΌ Π² Kubernetes ΡΠ΅ΡΠ΅Π· RBAC ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΡΡΡΠ½ΠΎΡΡΠΈ API:
-
Role
ΠΈClusterRole
β ΡΠΎΠ»ΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ»ΡΠΆΠ°Ρ Π΄Π»Ρ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ ΠΏΡΠ°Π² Π΄ΠΎΡΡΡΠΏΠ°: -
Role
ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΎΠΏΠΈΡΠ°ΡΡ ΠΏΡΠ°Π²Π° Π² ΡΠ°ΠΌΠΊΠ°Ρ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π° ΠΈΠΌΡΠ½; -
ClusterRole
β Π² ΡΠ°ΠΌΠΊΠ°Ρ ΠΊΠ»Π°ΡΡΠ΅ΡΠ°, Π² ΡΠΎΠΌ ΡΠΈΡΠ»Π΅ ΠΊ ΠΊΠ»Π°ΡΡΠ΅Ρ-ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΡΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌ ΡΠΈΠΏΠ° ΡΠ·Π»ΠΎΠ², non-resources urls (Ρ.Π΅. Π½Π΅ ΡΠ²ΡΠ·Π°Π½Π½ΡΡ Ρ ΡΠ΅ΡΡΡΡΠ°ΠΌΠΈ Kubernetes β Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ,/version
,/logs
,/api*
); -
RoleBinding
ΠΈClusterRoleBinding
β ΡΠ»ΡΠΆΠΈΡ Π΄Π»Ρ ΠΏΡΠΈΠ²ΡΠ·ΠΊΠΈRole
ΠΈClusterRole
ΠΊ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, Π³ΡΡΠΏΠΏΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ ΠΈΠ»ΠΈ ServiceAccount.
Π‘ΡΡΠ½ΠΎΡΡΠΈ Role ΠΈ RoleBinding ΡΠ²Π»ΡΡΡΡΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π½ΡΠΌΠΈ namespaceβΠΎΠΌ, Ρ.Π΅. Π΄ΠΎΠ»ΠΆΠ½Ρ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡΡ Π² ΠΏΡΠ΅Π΄Π΅Π»Π°Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π° ΠΈΠΌΠ΅Π½. ΠΠ΄Π½Π°ΠΊΠΎ RoleBinding ΠΌΠΎΠΆΠ΅Ρ ΡΡΡΠ»Π°ΡΡΡΡ Π½Π° ClusterRole, ΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠΎΠ·Π΄Π°ΡΡ Π½Π°Π±ΠΎΡ ΡΠΈΠΏΠΎΠ²ΡΡ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠΉ ΠΈ ΡΠΏΡΠ°Π²Π»ΡΡΡ Π΄ΠΎΡΡΡΠΏΠΎΠΌ Ρ ΠΈΡ ΠΏΠΎΠΌΠΎΡΡΡ.
Π ΠΎΠ»ΠΈ ΠΎΠΏΠΈΡΡΠ²Π°ΡΡ ΠΏΡΠ°Π²Π° ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ Π½Π°Π±ΠΎΡΠΎΠ² ΠΏΡΠ°Π²ΠΈΠ», ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΡ :
- Π³ΡΡΠΏΠΏΡ API β ΡΠΌ.
ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΡΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ ΠΏΠΎ apiGroups ΠΈ Π²ΡΠ²ΠΎΠ΄kubectl api-resources
; - ΡΠ΅ΡΡΡΡΡ (resources:
pod
,namespace
,deployment
ΠΈ Ρ.ΠΏ.); - Π³Π»Π°Π³ΠΎΠ»Ρ (verbs:
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-server. ΠΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π½Π°Π΄ ΠΊΠ»Π°ΡΡΠ΅ΡΠΎΠΌ ΠΏΡΠΎΡ
ΠΎΠ΄ΡΡ ΡΠ΅ΡΠ΅Π· Π½Π΅Π³ΠΎ. ΠΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅ ΠΎΠ± ΡΡΠΈΡ
Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΡ
ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΠΌΠ°Ρ
ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΈΡΠ°ΡΡ Π² ΡΡΠ°ΡΡΠ΅ Β«
ΠΡΠ΄ΠΈΡ ΡΠΈΡΡΠ΅ΠΌΡ β ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½Π°Ρ ΡΠΈΡΠ° Π² 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
ΠΠΎΠΌΠΈΠΌΠΎ ΡΡΠΈΡ ΡΡΡΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ², ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ Π½Π°ΡΡΡΠΎΠ΅ΠΊ, ΠΎΡΠ½ΠΎΡΡΡΠΈΡ ΡΡ ΠΊ Π°ΡΠ΄ΠΈΡΡ: ΠΎΡ ΡΠΎΡΠ°ΡΠΈΠΈ Π»ΠΎΠ³ΠΎΠ² Π΄ΠΎ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠΉ webhook. ΠΡΠΈΠΌΠ΅Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΡΠΎΡΠ°ΡΠΈΠΈ Π»ΠΎΠ³ΠΎΠ²:
-
--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-ΡΠ°ΠΉΠ»Π° Ρ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ΠΌ ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠΈ (policy) Π°ΡΠ΄ΠΈΡΠ°. Π Π΅Π³ΠΎ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠΌΡ ΠΌΡ Π΅ΡΡ Π²Π΅ΡΠ½ΡΠΌΡΡ, Π° ΠΏΠΎΠΊΠ° Π·Π°ΠΌΠ΅ΡΡ, ΡΡΠΎ ΡΠ°ΠΉΠ» Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠΌ 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βa, ΠΏΠΎΡΡΠΎΠΌΡ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ ΠΎΠΏΠΈΡΡΠ²Π°Π΅ΠΌ Π΅Π³ΠΎ ΠΌΠΎΠ½ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅: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
).
ΠΠΎΠ»ΠΈΡΠΈΠΊΠ° Π°ΡΠ΄ΠΈΡΠ°
Π’Π΅ΠΏΠ΅ΡΡ ΠΎΠ± ΡΠΏΠΎΠΌΡΠ½ΡΡΠΎΠΌ ΡΠ°ΠΉΠ»Π΅ Ρ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ΠΌ ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠΈ Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΡ. ΠΠ΅ΡΠ²ΠΎΠ΅ ΠΏΠΎΠ½ΡΡΠΈΠ΅ audit policy β ΡΡΠΎ level
, ΡΡΠΎΠ²Π΅Π½Ρ Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΡ. ΠΠ½ΠΈ Π±ΡΠ²Π°ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌΠΈ:
-
None
β Π½Π΅ Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°ΡΡ; -
Metadata
β Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°ΡΡ ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΠ΅ Π·Π°ΠΏΡΠΎΡΠ°: ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, Π²ΡΠ΅ΠΌΡ Π·Π°ΠΏΡΠΎΡΠ°, ΡΠ΅Π»Π΅Π²ΠΎΠΉ ΡΠ΅ΡΡΡΡ (pod, namespace ΠΈ Ρ.ΠΏ.), ΡΠΈΠΏ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ (verb) ΠΈ Ρ.ΠΏ.; -
Request
β Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°ΡΡ ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΠ΅ ΠΈ ΡΠ΅Π»ΠΎ Π·Π°ΠΏΡΠΎΡΠ°; -
RequestResponse
β Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°ΡΡ ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΠ΅, ΡΠ΅Π»ΠΎ Π·Π°ΠΏΡΠΎΡΠ° ΠΈ ΡΠ΅Π»ΠΎ ΠΎΡΠ²Π΅ΡΠ°.
ΠΠΎΡΠ»Π΅Π΄Π½ΠΈΠ΅ Π΄Π²Π° ΡΡΠΎΠ²Π½Ρ (Request
ΠΈ RequestResponse
) Π½Π΅ Π»ΠΎΠ³ΠΈΡΡΡΡ Π·Π°ΠΏΡΠΎΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π΅ ΠΎΠ±ΡΠ°ΡΠ°Π»ΠΈΡΡ ΠΊ ΡΠ΅ΡΡΡΡΠ°ΠΌ (ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΡ ΠΊ ΡΠ°ΠΊ Π½Π°Π·ΡΠ²Π°Π΅ΠΌΡΠΌ non-resources urls).
Π’Π°ΠΊΠΆΠ΅ Π²ΡΠ΅ Π·Π°ΠΏΡΠΎΡΡ ΠΏΡΠΎΡ ΠΎΠ΄ΡΡ ΡΠ΅ΡΠ΅Π· Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΡΠ°Π΄ΠΈΠΉ:
-
RequestReceived
β ΡΡΠ°ΠΏ, ΠΊΠΎΠ³Π΄Π° Π·Π°ΠΏΡΠΎΡ ΠΏΠΎΠ»ΡΡΠ΅Π½ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠΌ ΠΈ Π΅ΡΡ Π½Π΅ ΠΏΠ΅ΡΠ΅Π΄Π°Π½ Π΄Π°Π»ΡΡΠ΅ ΠΏΠΎ ΡΠ΅ΠΏΠΎΡΠΊΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ²; -
ResponseStarted
β Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ ΠΎΡΠ²Π΅ΡΠ° ΠΎΡΠΏΡΠ°Π²Π»Π΅Π½Ρ, Π½ΠΎ ΠΏΠ΅ΡΠ΅Π΄ ΠΎΡΠΏΡΠ°Π²ΠΊΠΎΠΉ ΡΠ΅Π»Π° ΠΎΡΠ²Π΅ΡΠ°. ΠΠ΅Π½Π΅ΡΠΈΡΡΠ΅ΡΡΡ Π΄Π»Ρ Π΄Π»ΠΈΡΠ΅Π»ΡΠ½ΡΡ Π·Π°ΠΏΡΠΎΡΠΎΠ² (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ,watch
); -
ResponseComplete
β ΡΠ΅Π»ΠΎ ΠΎΡΠ²Π΅ΡΠ° ΠΎΡΠΏΡΠ°Π²Π»Π΅Π½ΠΎ, Π±ΠΎΠ»ΡΡΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎΡΠΏΡΠ°Π²Π»ΡΡΡΡΡ Π½Π΅ Π±ΡΠ΄Π΅Ρ; -
Panic
β ΡΠΎΠ±ΡΡΠΈΡ Π³Π΅Π½Π΅ΡΠΈΡΡΡΡΡΡ, ΠΊΠΎΠ³Π΄Π° ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½Π° Π½Π΅ΡΡΠ°ΡΠ½Π°Ρ ΡΠΈΡΡΠ°ΡΠΈΡ.
ΠΠ»Ρ ΠΏΡΠΎΠΏΡΡΠΊΠ° ΠΊΠ°ΠΊΠΈΡ
-Π»ΠΈΠ±ΠΎ ΡΡΠ°Π΄ΠΈΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ omitStages
.
Π ΡΠ°ΠΉΠ»Π΅ ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠΈ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠΏΠΈΡΠ°ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ΅ΠΊΡΠΈΠΉ Ρ ΡΠ°Π·Π½ΡΠΌΠΈ ΡΡΠΎΠ²Π½ΡΠΌΠΈ Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΡ. ΠΡΠΈΠΌΠ΅Π½ΡΡΡΡΡ Π±ΡΠ΄Π΅Ρ ΠΏΠ΅ΡΠ²ΠΎΠ΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡΠ΅Π΅ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ, Π½Π°ΠΉΠ΄Π΅Π½Π½ΠΎΠ΅ Π² ΠΎΠΏΠΈΡΠ°Π½ΠΈΠΈ policy.
ΠΠ΅ΠΌΠΎΠ½ kubelet ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π΅Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΌΠ°Π½ΠΈΡΠ΅ΡΡΠ° Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠ΅ΠΉ api-server ΠΈ ΠΏΡΠΈ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ΠΈΠΈ ΡΠ°ΠΊΠΎΠ²ΡΡ
ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΡΡΠΊΠ°Π΅Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ Ρ api-server. ΠΠΎ Π΅ΡΡΡ Π²Π°ΠΆΠ½Π°Ρ Π΄Π΅ΡΠ°Π»Ρ: ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² ΡΠ°ΠΉΠ»Π΅ policy Π±ΡΠ΄ΡΡ ΠΈΠΌ ΠΈΠ³Π½ΠΎΡΠΈΡΠΎΠ²Π°ΡΡΡΡ. ΠΠΎΡΠ»Π΅ Π²Π½Π΅ΡΠ΅Π½ΠΈΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² ΡΠ°ΠΉΠ» policy ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΡΡΡΠΈΡΡ api-server Π²ΡΡΡΠ½ΡΡ. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ api-server Π·Π°ΠΏΡΡΠ΅Π½ ΠΊΠ°ΠΊ kubectl delete
Π½Π΅ ΠΏΡΠΈΠ²Π΅Π΄ΡΡ ΠΊ Π΅Π³ΠΎ ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΡΡΠΊΡ. ΠΡΠΈΠ΄Π΅ΡΡΡ Π²ΡΡΡΠ½ΡΡ ΡΠ΄Π΅Π»Π°ΡΡ docker stop
Π½Π° kube-masterβΠ°Ρ
, Π³Π΄Π΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π° ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠ° Π°ΡΠ΄ΠΈΡΠ°:
docker stop $(docker ps | grep k8s_kube-apiserver | awk '{print $1}')
ΠΡΠΈ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΈ Π°ΡΠ΄ΠΈΡΠ° Π²Π°ΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ½ΠΈΡΡ, ΡΡΠΎ Π½Π° kube-apiserver ΠΏΠΎΠ²ΡΡΠ°Π΅ΡΡΡ Π½Π°Π³ΡΡΠ·ΠΊΠ°. Π ΡΠ°ΡΡΠ½ΠΎΡΡΠΈ, ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅ΡΡΡ ΠΏΠΎΡΡΠ΅Π±Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡΠΈ Π΄Π»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° Π·Π°ΠΏΡΠΎΡΠΎΠ². ΠΠ°ΠΏΠΈΡΡ Π² Π»ΠΎΠ³ Π½Π°ΡΠΈΠ½Π°Π΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠ»Π΅ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° ΠΎΡΠ²Π΅ΡΠ°. Π’Π°ΠΊΠΆΠ΅ Π½Π°Π³ΡΡΠ·ΠΊΠ° Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠΈ Π°ΡΠ΄ΠΈΡΠ°.
ΠΡΠΈΠΌΠ΅ΡΡ ΠΏΠΎΠ»ΠΈΡΠΈΠΊ
Π Π°Π·Π±Π΅ΡΡΠΌ ΡΡΡΡΠΊΡΡΡΡ ΡΠ°ΠΉΠ»ΠΎΠ² policy Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠ°Ρ .
ΠΠΎΡ ΠΏΡΠΎΡΡΠΎΠΉ ΡΠ°ΠΉΠ» policy
, ΡΡΠΎΠ±Ρ Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°ΡΡ Π²ΡΡ Π½Π° ΡΡΠΎΠ²Π½Π΅ Metadata
:
apiVersion: audit.k8s.io/v1
kind: Policy
rules:
- level: Metadata
Π policy ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ ΠΏΠ΅ΡΠ΅ΡΠ΅Π½Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ (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
); - Π³Π»Π°Π³ΠΎΠ»Ρ (verbs:
get
,update
,delete
ΠΈ ΠΏΡΠΎΡΠΈΠ΅); - ΡΠ΅ΡΡΡΡΡ (resources, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ:
pod
,configmaps
ΠΈ Ρ.ΠΏ.) ΠΈ Π³ΡΡΠΏΠΏΡ ΡΠ΅ΡΡΡΡΠΎΠ² (apiGroups
).
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅! Π Π΅ΡΡΡΡΡ ΠΈ Π³ΡΡΠΏΠΏΡ ΡΠ΅ΡΡΡΡΠΎΠ² (Π³ΡΡΠΏΠΏΡ API, Ρ.Π΅. apiGroups), Π° ΡΠ°ΠΊΠΆΠ΅ ΠΈΡ Π²Π΅ΡΡΠΈΠΈ, ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΡΠ΅ Π² ΠΊΠ»Π°ΡΡΠ΅ΡΠ΅, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΠΊΠΎΠΌΠ°Π½Π΄:
kubectl api-resources
kubectl api-versions
Π‘Π»Π΅Π΄ΡΡΡΠΈΠΉ audit policy ΠΏΡΠΈΠ²Π΅Π΄ΡΠ½ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΠΈ Π»ΡΡΡΠΈΡ
ΠΏΡΠ°ΠΊΡΠΈΠΊ Π²
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
ΠΡΡΠ³ΠΎΠΉ Ρ
ΠΎΡΠΎΡΠΈΠΉ ΠΏΡΠΈΠΌΠ΅Ρ audit policy β
ΠΠ»Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π½Π° ΡΠΎΠ±ΡΡΠΈΡ Π°ΡΠ΄ΠΈΡΠ° Π΅ΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΎΠΏΠΈΡΠ°ΡΡ webhook. ΠΡΠΎΡ Π²ΠΎΠΏΡΠΎΡ ΡΠ°ΡΠΊΡΡΡ Π²
ΠΡΠΎΠ³ΠΈ
Π ΡΡΠ°ΡΡΠ΅ Π΄Π°Π½ ΠΎΠ±Π·ΠΎΡ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠΎΠ² Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ Π² ΠΊΠ»Π°ΡΡΠ΅ΡΠ°Ρ Kubernetes, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΡ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΠΏΠ΅ΡΡΠΎΠ½ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΡΡΠ΅ΡΠ½ΡΠ΅ Π·Π°ΠΏΠΈΡΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΠΌ, ΡΠ°Π·Π΄Π΅Π»ΡΡΡ ΠΈΡ ΠΏΡΠ°Π²Π°, Π° ΡΠ°ΠΊΠΆΠ΅ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΈΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ. ΠΠ°Π΄Π΅ΡΡΡ, ΠΎΠ½ ΠΏΡΠΈΠ³ΠΎΠ΄ΠΈΡΡΡ ΡΠ΅ΠΌ, ΠΊΡΠΎ ΡΡΠΎΠ»ΠΊΠ½ΡΠ»ΡΡ Ρ ΡΠ°ΠΊΠΈΠΌΠΈ Π²ΠΎΠΏΡΠΎΡΠ°ΠΌΠΈ Π² ΡΠ΅ΠΎΡΠΈΠΈ ΠΈΠ»ΠΈ ΡΠΆΠ΅ Π½Π° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ΅. Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΡ ΡΠ°ΠΊΠΆΠ΅ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡΡΡΡ ΡΠΎ ΡΠΏΠΈΡΠΊΠΎΠΌ Π΄ΡΡΠ³ΠΈΡ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»ΠΎΠ² ΠΏΠΎ ΡΠ΅ΠΌΠ΅ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ Π² Kubernetes, ΡΡΠΎ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ Π² Β«P.S.Β», β Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΡΡΠ΅Π΄ΠΈ Π½ΠΈΡ Π²Ρ Π½Π°ΠΉΠ΄ΡΡΠ΅ Π½ΡΠΆΠ½ΡΠ΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠΈ ΠΏΠΎ Π°ΠΊΡΡΠ°Π»ΡΠ½ΡΠΌ Π΄Π»Ρ Π²Π°Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°ΠΌ.
P.S.
Π§ΠΈΡΠ°ΠΉΡΠ΅ ΡΠ°ΠΊΠΆΠ΅ Π² Π½Π°ΡΠ΅ΠΌ Π±Π»ΠΎΠ³Π΅:
- Β«
33+ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ° Π΄Π»Ρ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ Kubernetes Β»; - Β«
ΠΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² ΡΠ΅ΡΠ΅Π²ΡΠ΅ ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠΈ Kubernetes Π΄Π»Ρ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΡΡΠΎΠ² ΠΏΠΎ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ Β»; - Β«
ΠΠΎΠ½ΠΈΠΌΠ°Π΅ΠΌ RBAC Π² Kubernetes Β»; - Β«
9 Π»ΡΡΡΠΈΡ ΠΏΡΠ°ΠΊΡΠΈΠΊ ΠΏΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ Π² Kubernetes Β»; - Β«
11 ΡΠΏΠΎΡΠΎΠ±ΠΎΠ² (Π½Π΅) ΡΡΠ°ΡΡ ΠΆΠ΅ΡΡΠ²ΠΎΠΉ Π²Π·Π»ΠΎΠΌΠ° Π² Kubernetes Β».
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com