Kubernetes, включение RBAC на namespace

Создадим namespace artur, доступ к которому будем разрешать пользователю artur:

# kubectl create namespace artur

Как создавать пользователя было описано тут.

Создаём файл с описанием role и rolebindig — 01. yaml следующего содержания:

---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      namespace: artur # namespace к которому применяются огранияения
      name: artur-role
    rules:
    - apiGroups: [""] # "" indicates the core API group
      resources: ["pods", "services", "replicationcontrollers"]
      verbs: ["create", "get", "update", "list", "delete"]
    - apiGroups: [""]
      resources: ["pods/log"]
      verbs: ["get", "list"]
    - apiGroups: [""]
      resources: ["pods/exec"]
      verbs: ["create"]
    - apiGroups: ["apps"]
      resources: ["deployments","daemonsets","replicasets","statefulsets"]
      verbs: ["create", "get", "update", "patch", "list", "delete", "deploy"]
    - apiGroups: ["autoscaling"]
      resources: ["horizontalpodautoscalers"]
      verbs: ["create", "get", "update", "list", "delete"]
   - apiGroups: ["batch"]
     resources: ["jobs","cronjobs"]
     verbs: ["create", "get", "update", "list", "delete"]
--- apiVersion: rbac.authorization.k8s.io/v1 
kind: RoleBinding 
metadata:
 name: artur-rb
 namespace: artur
subjects: 
- kind: User
  name: artur
  apiGroup: rbac.authorization.k8s.io 
roleRef:
 kind: Role
 name: artur-role
 apiGroup: rbac.authorization.k8s.io

Создаем роли и биндинги в кубернетес.

# cubectl apply -f 01.yaml

Всё, что тут написано — это художественная обработка материалов доброго человека.

Kubernetes, доступ по сертификату пользователя

В принципе — это шпаргалка, что бы не забыть как все на самом деле происходит 🙂

Создание SSL ключа и сертификата пользователя

Создаём временную директорию:

# mkdir tmp
# cd tmp

Генерируем SSL ключ пользователя:

# openssl genrsa -out artur.key 4096

Создаём конфигурационный файл для openssl — csr.cnf следующего содержания:

[ req ]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn

[ dn ]
CN = artur
O = dev

[ v3_ext ]
authorityKeyIdentifier=keyid,issuer:always
basicConstraints=CA:FALSE
keyUsage=keyEncipherment,dataEncipherment
extendedKeyUsage=serverAuth,clientAuth

Генерируем запрос на сертификат:

# openssl req -config csr.cnf -new -key artur.key -nodes -out artur.csr

Формируем запрос на сертификат в формате base64 и помещаем его в переменную среды окружения:

# export BASE64_CSR=$(cat artur.csr | base64 | tr -d '\n')

Создаём yaml файл csr.yaml с запросом на подпись следующего содержания:

    apiVersion: certificates.k8s.io/v1beta1
    kind: CertificateSigningRequest
    metadata:
      name: artur_csr
    spec:
      groups:
      - system:authenticated
      request: ${BASE64_CSR}
      usages:
      - digital signature
      - key encipherment
      - server auth
      - client auth

Помещаем запрос в кубернетес:

# cat csr.yaml | envsubst | kubectl apply -f -

Контролируем наличие запроса:

# kubectl get csr

Подписываем и генерируем сертификат:

# kubectl certificate approve artur_csr

Копируем во временную директорию файл ~/.kube/config и в разделе users удаляем из него строки client-certificate-data и client-key-data.

Добавляем в config строку с сертификатом клиента в формате base64:

# echo "client-certificate-data: $(kubectl get csr artur_csr -o jsonpath={.status.certificate})" >> config

В редакторе делаем правильное выравнивание строки. Также везде меняем пользователя на artur.

Добавляем в config файл ключ пользователя в формате base64:

# kubectl --kubeconfig ./config config set-credentials artur --client-key=artur.key --embed-certs=true

Смотрим получившийся конфигурационный файл:

# kubectl --kubeconfig ./config config view
apiVersion: v1
    clusters:
    - cluster:
        certificate-authority-data: DATA+OMITTED
        server: https://192.168.0.45:6443
      name: cluster.local
    contexts:
    - context:
        cluster: cluster.local
        user: artur
      name: artur@cluster.local
    current-context: artur@cluster.local
    kind: Config
    preferences: {}
    users:
    - name: artur
      user:
        client-certificate-data: REDACTED
        client-key-data: REDACTED

Передаём файл config пользователю или копируем его в директорию ~/.kube пользователя.

Шпаргалка сделана по мотивам записок доброго человека.