This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
безопасность_в_kubernetes [2025/10/28 10:59] val [Безопасность в Kubernetes] |
— (current) | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== Безопасность в Kubernetes ====== | ||
| - | * [[https://habr.com/ru/articles/779190/|Как работает аутентификация в Kubernetes: ServiceAccount и RBAC]] | ||
| - | * [[https://medium.com/@muppedaanvesh/a-hand-on-guide-to-kubernetes-rbac-with-a-user-creation-%EF%B8%8F-1ad9aa3cafb1|A Hands-On Guide to Kubernetes RBAC With a User Creation]] | ||
| - | * [[https://medium.com/@ManagedKube/kubernetes-rbac-port-forward-4c7eb3951e28|Kubernetes RBAC Port Forward]] | ||
| - | |||
| - | ===== Реклама ===== | ||
| - | |||
| - | * Kubernetes — это решение, превращающее Linux сервера в кластер, и, как Linux является многопользовательской, многозадачной операционной системой, так и Kubernetes позволяет множеству пользователей и приложений работать в одном кластере безопасно разделяя его ресурсы | ||
| - | * На нашем вебинаре Вы узнаете как настраивать права доступа в Kubernetes на примерах практических, полезных задач | ||
| - | |||
| - | |||
| - | ===== Техническое задание ===== | ||
| - | |||
| - | * Создать учетную запись пользователя с необходимыми правами и файл конфигурации для подключения младшего системного администратора к Web ресурсам Kubernetes | ||
| - | * Создать учтённую запись для сервиса с необходимыми правами для запуска приложений в Kubernetes | ||
| - | |||
| - | ===== Запись вебинара ===== | ||
| - | |||
| - | * Тэги: | ||
| - | |||
| - | ===== Шаг 1. Что у нас есть для начала ===== | ||
| - | |||
| - | * [[Система Kubernetes]] | ||
| - | * [[Сервис Keycloak#rancher local-path-provisioner]] и [[Сервис PostgreSQL#CloudNativePG]] кластер PostgreSQL | ||
| - | * Сервис Keycloak в [[Сервис Keycloak#Kubernetes]] | ||
| - | * Cloud native distributed block storage for Kubernetes [[Сервис Keycloak#longhorn]] | ||
| - | |||
| - | * Linux [[Инсталяция системы в конфигурации Desktop]] | ||
| - | ===== Шаг 2. Создание учетной записи ===== | ||
| - | |||
| - | * [[Управление учетными записями в Linux#Создание тестового набора учетных записей]] | ||
| - | * [[Пакет OpenSSL#Создание пользовательского сертификата, подписанного CA]] | ||
| - | |||
| - | <code> | ||
| - | user2@server:~$ cat user2.req | base64 -w0 | ||
| - | </code> | ||
| - | * [[https://stackoverflow.com/questions/75735249/what-do-the-values-in-certificatesigningrequest-spec-usages-mean|What do the values in CertificateSigningRequest.spec.usages mean?]] | ||
| - | <code> | ||
| - | kube1:~/users# kubectl explain csr.spec.usages | ||
| - | |||
| - | kube1:~/users# cat user2.req.yaml | ||
| - | apiVersion: certificates.k8s.io/v1 | ||
| - | kind: CertificateSigningRequest | ||
| - | metadata: | ||
| - | name: user2 | ||
| - | spec: | ||
| - | request: LS0t...S0tCg== | ||
| - | signerName: kubernetes.io/kube-apiserver-client | ||
| - | expirationSeconds: 8640000 # 100 * one day | ||
| - | usages: | ||
| - | # - digital signature | ||
| - | # - key encipherment | ||
| - | - client auth | ||
| - | |||
| - | kube1:~/users# kubectl apply -f user2.req.yaml | ||
| - | |||
| - | kube1:~/users# kubectl describe csr/user2 | ||
| - | |||
| - | kube1:~/users# kubectl certificate approve user2 | ||
| - | |||
| - | kube1:~/users# kubectl get csr | ||
| - | |||
| - | kube1:~/users# kubectl get csr/user2 -o yaml | ||
| - | |||
| - | kube1:~/users# kubectl get csr/user2 -o jsonpath="{.status.certificate}" | base64 -d | tee user2.crt | ||
| - | |||
| - | |||
| - | user2@server:~$ scp root@kube1:users/user2.crt . | ||
| - | </code> | ||
| - | * [[Система Kubernetes#Инструмент командной строки kubectl]] | ||
| - | <code> | ||
| - | user2@server:~$ kubectl config set-cluster cluster.local --insecure-skip-tls-verify=true --server=https://192.168.13.221:6443 | ||
| - | |||
| - | user2@server:~$ cat .kube/config | ||
| - | |||
| - | user2@server:~$ kubectl config set-credentials user2 --client-certificate=user2.crt --client-key=user2.key --embed-certs=true | ||
| - | |||
| - | user2@server:~$ kubectl config set-context default-context --cluster=cluster.local --user=user2 | ||
| - | |||
| - | user2@server:~$ kubectl config use-context default-context | ||
| - | |||
| - | user2@server:~$ kubectl auth whoami | ||
| - | |||
| - | user2@server:~$ kubectl get pods | ||
| - | Error from server (Forbidden) | ||
| - | </code> | ||
| - | |||
| - | ===== Шаг 3. Предоставление доступа к services/proxy в Namespace ===== | ||
| - | <code> | ||
| - | kube1:~/users# cat lh-svc-proxy-role.yaml | ||
| - | </code><code> | ||
| - | apiVersion: rbac.authorization.k8s.io/v1 | ||
| - | kind: Role | ||
| - | metadata: | ||
| - | namespace: longhorn-system | ||
| - | name: lh-svc-proxy-role | ||
| - | rules: | ||
| - | - apiGroups: [""] | ||
| - | resources: ["services/proxy"] | ||
| - | verbs: ["get"] | ||
| - | </code><code> | ||
| - | kube1:~/users# cat user2-lh-svc-proxy-rolebinding.yaml | ||
| - | </code><code> | ||
| - | apiVersion: rbac.authorization.k8s.io/v1 | ||
| - | kind: RoleBinding | ||
| - | metadata: | ||
| - | name: user2-lh-svc-proxy-rolebinding | ||
| - | namespace: longhorn-system | ||
| - | subjects: | ||
| - | - kind: User | ||
| - | name: user2 | ||
| - | apiGroup: rbac.authorization.k8s.io | ||
| - | roleRef: | ||
| - | kind: Role | ||
| - | name: lh-svc-proxy-role | ||
| - | apiGroup: rbac.authorization.k8s.io | ||
| - | </code><code> | ||
| - | kube1:~/users# kubectl apply -f lh-svc-proxy-role.yaml,user2-lh-svc-proxy-rolebinding.yaml | ||
| - | |||
| - | student@client1:~$ kubectl proxy | ||
| - | |||
| - | student@client1:~$ curl http://localhost:8001/api/v1/namespaces/longhorn-system/services/longhorn-frontend:80/proxy/ | ||
| - | </code> | ||
| - | ===== Шаг 4. Предоставление доступа к services/port-forward в Namespace ===== | ||
| - | <code> | ||
| - | kube1:~/users# cat user2-pg-svc-pfw-rolebinding.yaml | ||
| - | apiVersion: rbac.authorization.k8s.io/v1 | ||
| - | kind: RoleBinding | ||
| - | metadata: | ||
| - | name: user2-pg-svc-pfw-rolebinding | ||
| - | namespace: my-pgcluster-ns | ||
| - | subjects: | ||
| - | - kind: User | ||
| - | name: user2 | ||
| - | apiGroup: rbac.authorization.k8s.io | ||
| - | roleRef: | ||
| - | kind: Role | ||
| - | name: pg-svc-pfw-role | ||
| - | apiGroup: rbac.authorization.k8s.io | ||
| - | kube1:~/users# cat pg-svc-pfw-role.yaml | ||
| - | apiVersion: rbac.authorization.k8s.io/v1 | ||
| - | kind: Role | ||
| - | metadata: | ||
| - | namespace: my-pgcluster-ns | ||
| - | name: pg-svc-pfw-role | ||
| - | rules: | ||
| - | - apiGroups: [""] | ||
| - | resources: ["services"] | ||
| - | verbs: ["get"] | ||
| - | - apiGroups: [""] | ||
| - | resources: ["pods"] | ||
| - | verbs: ["get", "list"] | ||
| - | - apiGroups: [""] | ||
| - | resources: ["pods/portforward"] | ||
| - | verbs: ["create"] | ||
| - | </code><code> | ||
| - | kube1:~/users# kubectl apply -f pg-svc-pfw-role.yaml,user2-pg-svc-pfw-rolebinding.yaml | ||
| - | |||
| - | student@client1:~$ kubectl port-forward -n my-pgcluster-ns services/my-pgcluster-rw 5432:5432 | ||
| - | |||
| - | student@client1:~$ psql postgres://keycloak:strongpassword@127.0.0.1:5432/postgres | ||
| - | </code> | ||
| - | |||
| - | ===== Шаг 5. Предоставление доступа к services/port-forward в Cluster ===== | ||
| - | <code> | ||
| - | |||
| - | </code> | ||
| - | |||
| - | ===== Черновик ===== | ||
| - | |||
| - | * https://www.container-security.site/security_research/node_proxy.html | ||