====== 20. Безопасность в кластере ======
====== Аутентификация======
В разрезе аутентификации Kubernetes оперирует не пользовательскими аккаунтами, а служебными УЗ Service Accounts.
kubectl create serviceaccount sa1
kubectl get serviceaccount
В качестве аутентификаторов могут выступать:
* имя пользователя и статический пароль;
* имя пользователя и токен;
* сертификат;
* сторонний сервис аутентификации (ldap, kerberos, etc).
===== Парольная аутентификация=====
Что бы указать kube-apiserver.service на необходимость использования статических паролей, необходимо передать в параметрах запуска ключ --basic-auth-file=user-details.csv с файлом, содержащим список вида password, username, userid, group*:
P@ssw0rd1,user1,u0001,group1
P@ssw0rd2,user2,u0002,group2
P@ssw0rd3,user3,u0003,group3
Для аутентификации: curl -v -k https://master-node-ip:6443/api/v1/pods -u "user1:P@ssw0rd1"
===== Аутентификация по токену =====
Аналогично для файла с токенами --token-auth-file=user-details.csv:
9OSR4OYO6QwM7cfg6sKcerCyiVC6xnFZ,user1,u0001,group1
yDLmsJptxat04MUvuFdBw2CFWwv2ogcr,user2,u0002,group2
IonP8eYFUEfsZJDflyiRVSoMeDJSpBcq,user3,u0003,group3
Для аутентификации: curl -v -k https://master-node-ip:6443/api/v1/pods --header "Authorization: Bearer 9OSR4OYO6QwM7cfg6sKcerCyiVC6xnFZ"
===== Аутентификация по сертификату =====
Для аутентификации по сертификату, необходимо наличие сертификата подписанного доверенным CA, а так же, что бы в Subject Name был указан аттрибут system:masters
openssl genrsa -out admin.key 2048
openssl req -new -key admin.key -subj "/CN=kube-admin/O=system:masters" -out admin.csr
openssl x509 -req -in admin.csr -CA ca.crt -CAkey ca.key -out admin.crt
Для аутентификации: curl https://master-node-ip:6443/api/v1/pods --key admin.key --cert admin.crt --cacert ca.crt
===== Создание сертификата пользователя при помощи Certificate API =====
openssl genrsa -out new_admin.key 2048
openssl req -new -key new_admin.key -subj "/CN=New Admin,O=system:masters" -out new_admin.csr
cat new_admin.csr | base64
apiVersion: certificates.k8s.io/v1beta1
kind: CertificateSigningRequest
metadata:
name: New Admin
spec:
groups:
- system:masters
- system:authenticated
usages:
- digital signature
- key encipherment
- client auth
request:
LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KTUlJQ1dUQ0NBVUVDQVFBd0ZERVNN
QkFHQTFVRUF3d0pUbVYzSUVGa2JXbHVNSUlCSWpBTkJna3Foa2lHOXcwQgpBUUVGQUFPQ0FROEFN
SUlCQ2dLQ0FRRUF3bS94SWphM3JGNjk4aU4xUlpFWEkvYTVteG93V0ZLWW83STBvMFc0ClBueW1K
cVFqZEVIN21VM1d0ZnBPMm9PQWRMSUdTQXVockFpeExmNklNaHU3QzVCMWRuaTBDSFd5dUdBQ1FI
eXoKNEdjdjRZREVQajVoYkt3Z3ozWkFteG94OHE2VjZCNVNnZ0RvaXo4RytVeDJLSGFFZ3RjN1NK
ZXVTbStCZ2RuNwpWMldDbVFHaWcrUXRPS0w2L1NBdTJCdG1ML201V05CVm9IdWVmTmZNZEJOVWFC
K0dYYURtaWRoZmhnVXl6UVNHCnp4RGgvbTJmZUs1RjNrUXN5T3NCVGdVbElDVG9ydnlZOURFTDdF
bXUra0NFT0kzcXhmU1Q0WHNGZDI4aW9LS0cKSEt3c2R1MWE5OUMwVXR6QXRvRzVVbEZBS28zK2pO
ODBEbWxBS2JReEtlQ3lId0lEQVFBQm9BQXdEUVlKS29aSQpodmNOQVFFTEJRQURnZ0VCQUJjUGR6
UjhlRnNqZzlUT3Fsd2I4WkZsd3MwbDNhdG1QdFRSaUZqQnpudjRoem95Ck1BNG9TWkNhdVN2akdY
Z2VSclpDdG9iZkpPemxRMGI1bTlic2tPNWl3Wnk0WGg5Q3lMTStnTUFkWlhkSk9uaWYKOHNBYzVq
b1hOY0ZmMDRJOEZtZTZDV0RPVnBEbW1peVM2bFNiVHpwU1NIbEluU3BuV1RRSzFDVGVYeXNIaXds
SgplVDFKMy9yM0dOQTk0eE1TN3VFTVM2VTR2dW1RcEx2UG9KSW5rL3NMeGRUa1BuTEJmQXl3N1ZX
V04wNmRGZHJXClllTkhTcVVBRFBQYWR1TWlsc3lnZmdjR3RMZGZnc2tpNlBjTENrbTBKY2RINXVq
MytCcWlDaEdlQjZtbTgwQVgKTnJMTHZDOVRkVTBlN0Uvek1KQ1Z0V2lVbGlIOFNET3dyVVlzaWtJ
PQotLS0tLUVORCBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0K
kubectl get csr
kubectl certificate approve new_admin
kubectl get csr new_admin -o yaml
echo "coded certificate" | base64 --decode > new_admin.crt
===== RBAC =====
==== Создание роли ====
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: pod-reader
rules:
- apiGroups: [""] #
resources: ["pods"]
verbs: ["get", "watch", "list"]
- apiGroups: [""] #
resources: ["ConfigMap"]
verbs: ["get", "create"]
==== Биндинг роли к конкретному пользователю ====
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: pod-reader-binding
namespace: default
subjects:
# You can specify more than one "subject"
- kind: User
name: jane # "name" is case sensitive
apiGroup: rbac.authorization.k8s.io
roleRef:
# "roleRef" specifies the binding to a Role / ClusterRole
kind: Role #this must be Role or ClusterRole
name: pod-reader # this must match the name of the Role or ClusterRole you wish to bind to
apiGroup: rbac.authorization.k8s.io
==== Просмотр сведений RBAC ====
kubectl get roles
kubectl get rolebindings
kubectl describe role developer
kubectl describe rolebinding dev-users-rolebinding
==== Проверка доступа ====
kubectl auth can-i create deployments
kubectl auth can-i delete nodes
kubectl auth can-i create pods --as sample-user
===== Кластерные роли =====
Кластерные роли, в отличие от обычных, не привязаны к ресурсам в определенном namespace.
==== Кластерная роль ====
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: cluster-administrator
rules:
- apiGroups: [""]
resources: ["nodes"]
verbs: ["list","get","create","delete"]
==== Привязка кластерной роли к пользователю ====
apiVersion: rbac.authorization.k8s.io/v1
# This cluster role binding allows anyone in the "manager" group to read secrets in any namespace.
kind: ClusterRoleBinding
metadata:
name: cluster-admin-role-binding
subjects:
- kind: User
name: cluster-administrator # Name is case sensitive
apiGroup: rbac.authorization.k8s.io
- kind: Group
name: cluster-admins # Name is case sensitive
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: cluster-administrator
apiGroup: rbac.authorization.k8s.io
===== Service Accounts =====
По умолчанию в каждом namespace уже существует ServiceAccount с именем default, который автоматически цепляется каждым создаваемым Pod'ом. При этом, default аккаунт сильно порезан в правах.
Создать ServiceAccount
kubectl create serviceaccount test-sa
Получить список ServiceAccount'ов
kubectl get serviceaccount
Вывести полную информацию о ServiceAccount'е
kubectl describe serviceaccount test-sa
Получить токен безопасности определенного ServiceAccount'а
kubectl describe secret test-sa-token-kbbdm
Применить ServiceAccount к поду:
apiVersion: v1
kind: Pod
metadata:
name: simplePod
spec:
containers:
- name: simplePod
image: simplePod
serviceAccountName: simplePod-sa