ABC Keamanan ing Kubernetes: Authentication, Wewenang, Auditing

ABC Keamanan ing Kubernetes: Authentication, Wewenang, Auditing

Cepet utawa mengko, ing operasi sistem apa wae, masalah keamanan muncul: njamin otentikasi, pamisahan hak, audit lan tugas liyane. Wis digawe kanggo Kubernetes akeh solusi, sing ngijini sampeyan kanggo entuk selaras karo standar malah ing lingkungan banget nuntut... Materi padha pengabdian kanggo aspèk dhasar saka keamanan dipun ginakaken ing mekanisme dibangun ing K8s. Kaping pisanan, bakal migunani kanggo wong-wong sing wiwit kenal karo Kubernetes - minangka titik wiwitan kanggo sinau babagan masalah keamanan.

Otentikasi

Ana rong jinis pangguna ing Kubernetes:

  • Akun Layanan - akun sing dikelola dening Kubernetes API;
  • pangguna — Pangguna "normal" sing dikelola dening eksternal, layanan independen.

Bentenipun utama ing antarane jinis iki yaiku kanggo Akun Layanan ana obyek khusus ing API Kubernetes (sing diarani - ServiceAccounts), sing disambungake menyang ruang jeneng lan sakumpulan data wewenang sing disimpen ing kluster ing obyek saka jinis Rahasia. Pangguna kasebut (Akun Layanan) utamane dimaksudake kanggo ngatur hak akses menyang API Kubernetes proses sing mlaku ing kluster Kubernetes.

Pangguna Biasa ora duwe entri ing API Kubernetes: kudu dikelola kanthi mekanisme eksternal. Iki ditrapake kanggo wong utawa proses sing manggon ing njaba kluster.

Saben panjalukan API digandhengake karo Akun Layanan, Panganggo, utawa dianggep anonim.

Data otentikasi pangguna kalebu:

  • Jeneng - jeneng pangguna (sensitif cilik!);
  • UID - string identifikasi pangguna sing bisa diwaca mesin sing "luwih konsisten lan unik tinimbang jeneng panganggo";
  • Groups - dhaptar klompok sing dadi pangguna pangguna;
  • Tambahan - lapangan tambahan sing bisa digunakake dening mekanisme wewenang.

Kubernetes bisa nggunakake akeh mekanisme otentikasi: sertifikat X509, Token Bearer, proxy otentikasi, Otentikasi Dasar HTTP. Nggunakake mekanisme kasebut, sampeyan bisa ngetrapake skema wewenang sing akeh: saka file statis kanthi sandhi menyang OpenID OAuth2.

Kajaba iku, sampeyan bisa nggunakake sawetara skema wewenang bebarengan. Kanthi gawan, kluster nggunakake:

  • token akun layanan - kanggo Akun Layanan;
  • X509 - kanggo Pangguna.

Pitakonan babagan ngatur ServiceAccounts ngluwihi ruang lingkup artikel iki, nanging kanggo wong-wong sing pengin ngerti masalah iki kanthi luwih rinci, aku nyaranake miwiti karo kaca dokumentasi resmi. Kita bakal nliti masalah babagan cara kerja sertifikat X509.

Sertifikat kanggo pangguna (X.509)

Cara klasik nggarap sertifikat kalebu:

  • generasi kunci:
    mkdir -p ~/mynewuser/.certs/
    openssl genrsa -out ~/.certs/mynewuser.key 2048
  • nggawe panjalukan sertifikat:
    openssl req -new -key ~/.certs/mynewuser.key -out ~/.certs/mynewuser.csr -subj "/CN=mynewuser/O=company"
  • ngolah panjalukan sertifikat nggunakake tombol CA cluster Kubernetes, entuk sertifikat pangguna (kanggo entuk sertifikat, sampeyan kudu nggunakake akun sing nduweni akses menyang kunci CA cluster Kubernetes, sing minangka standar dumunung ing /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
  • nggawe file konfigurasi:
    • gambaran kluster (nemtokake alamat lan lokasi file sertifikat CA kanggo instalasi kluster tartamtu):
      kubectl config set-cluster kubernetes --certificate-authority=/etc/kubernetes/pki/ca.crt --server=https://192.168.100.200:6443
    • utawa carane oraopsi sing disaranake - sampeyan ora kudu nemtokake sertifikat root (banjur kubectl ora bakal mriksa bener saka api-server kluster):
      kubectl config set-cluster kubernetes  --insecure-skip-tls-verify=true --server=https://192.168.100.200:6443
    • nambahake pangguna menyang file konfigurasi:
      kubectl config set-credentials mynewuser --client-certificate=.certs/mynewuser.crt  --client-key=.certs/mynewuser.key
    • nambah konteks:
      kubectl config set-context mynewuser-context --cluster=kubernetes --namespace=target-namespace --user=mynewuser
    • tugas konteks standar:
      kubectl config use-context mynewuser-context

Sawise manipulasi ndhuwur, ing file .kube/config config kaya iki bakal digawe:

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

Kanggo luwih gampang nransfer konfigurasi ing antarane akun lan server, migunani kanggo ngowahi nilai tombol ing ngisor iki:

  • certificate-authority
  • client-certificate
  • client-key

Kanggo nindakake iki, sampeyan bisa ngodhe file sing ditemtokake ing nggunakake base64 lan ndhaftar ing konfigurasi, nambah suffix ing jeneng tombol. -data, i.e. wis nampa certificate-authority-data lan kaya.

Sertifikat karo kubeadm

Kanthi release Kubernetes 1.15 nggarap sertifikat wis dadi luwih gampang thanks kanggo versi alpha support ing utilitas kubeadm. Contone, iki bisa uga katon kaya nggawe file konfigurasi nganggo tombol pangguna:

kubeadm alpha kubeconfig user --client-name=mynewuser --apiserver-advertise-address 192.168.100.200

NB: Dibutuhake alamat pariwara bisa ditemokake ing konfigurasi api-server, sing minangka standar dumunung ing /etc/kubernetes/manifests/kube-apiserver.yaml.

Konfigurasi sing diasilake bakal dadi output menyang stdout. Perlu disimpen ing ~/.kube/config akun pangguna utawa menyang file sing ditemtokake ing variabel lingkungan KUBECONFIG.

Dig Deeper

Kanggo sing pengin ngerti masalah sing diterangake luwih jero:

Wewenang

Akun sah standar ora duwe hak kanggo operate ing kluster. Kanggo menehi ijin, Kubernetes ngetrapake mekanisme wewenang.

Sadurunge versi 1.6, Kubernetes nggunakake jinis wewenang sing diarani ABAC (Kontrol akses adhedhasar atribut). Rincian babagan iki bisa ditemokake ing dokumentasi resmi. Pendekatan iki saiki dianggep warisan, nanging sampeyan isih bisa nggunakake bebarengan karo jinis otentikasi liyane.

Cara saiki (lan luwih fleksibel) kanggo mbagi hak akses menyang kluster diarani RBAC (Kontrol akses adhedhasar peran). Wis diumumake stabil wiwit versi Kubernetes 1.8. RBAC ngleksanakake model hak kang kabeh sing ora tegas diijini dilarang.
Kanggo ngaktifake RBAC, sampeyan kudu miwiti Kubernetes api-server karo parameter --authorization-mode=RBAC. Parameter disetel ing manifes kanthi konfigurasi api-server, sing minangka standar dumunung ing sadawane dalan /etc/kubernetes/manifests/kube-apiserver.yaml, ing bagean command. Nanging, RBAC wis diaktifake kanthi standar, mula sampeyan ora perlu kuwatir: sampeyan bisa verifikasi iki kanthi nilai authorization-mode (ing sing wis kasebut kube-apiserver.yaml). Miturut cara, ing antarane makna kasebut bisa uga ana jinis wewenang liyane (node, webhook, always allow), nanging kita bakal ninggalake pertimbangan ing njaba ruang lingkup materi.

Miturut cara, kita wis diterbitake artikel kanthi katrangan sing cukup rinci babagan prinsip lan fitur nggarap RBAC, mula aku bakal mbatesi aku kanthi ringkes babagan dhasar lan conto.

Entitas API ing ngisor iki digunakake kanggo ngontrol akses ing Kubernetes liwat RBAC:

  • Role и ClusterRole - peran sing njlèntrèhaké hak akses:
  • Role ngijini sampeyan kanggo njlèntrèhaké hak ing namespace;
  • ClusterRole - ing kluster, kalebu obyek khusus kluster kayata simpul, url non-sumber daya (yaiku ora ana hubungane karo sumber daya Kubernetes - contone, /version, /logs, /api*);
  • RoleBinding и ClusterRoleBinding - digunakake kanggo naleni Role и ClusterRole menyang pangguna, grup pangguna utawa ServiceAccount.

Entitas RoleBinding lan RoleBinding diwatesi dening namespace, yaiku. kudu ana ing papan jeneng sing padha. Nanging, RoleBinding bisa ngrujuk ClusterRole, sing ngidini sampeyan nggawe set ijin umum lan ngontrol akses nggunakake.

Peran nggambarake hak nggunakake set aturan sing ngemot:

  • kelompok API - ndeleng dokumentasi resmi dening apiGroups lan output kubectl api-resources;
  • sumber daya (Sumber daya: pod, namespace, deployment lan liya-liyane.);
  • Tembung kriya (tembung kriya: set, update lsp).
  • jeneng sumber daya (resourceNames) - kanggo kasus nalika sampeyan kudu nyedhiyani akses menyang sumber tartamtu, lan ora kanggo kabeh sumber daya saka jinis iki.

Analisis wewenang sing luwih rinci ing Kubernetes bisa ditemokake ing kaca kasebut dokumentasi resmi. Nanging (utawa luwih, saliyane iki), aku bakal menehi conto sing nggambarake karyane.

Conto entitas RBAC

Prasaja Role, sing ngidini sampeyan entuk dhaptar lan status pod lan ngawasi ing ruang jeneng 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"]

Conto: ClusterRole, sing ngidini sampeyan entuk dhaptar lan status pod lan ngawasi kabeh klompok kasebut:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  # секции "namespace" нет, так как ClusterRole задействует весь кластер
  name: secret-reader
rules:
- apiGroups: [""]
  resources: ["secrets"]
  verbs: ["get", "watch", "list"]

Conto: RoleBinding, sing ngidini pangguna mynewuser "maca" pods ing namespace 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

Audit acara

Secara skematis, arsitektur Kubernetes bisa diwakili kaya ing ngisor iki:

ABC Keamanan ing Kubernetes: Authentication, Wewenang, Auditing

Komponen kunci Kubernetes sing tanggung jawab kanggo ngolah panjaluk yaiku api-server. Kabeh operasi ing kluster ngliwati. Sampeyan bisa maca luwih lengkap babagan mekanisme internal kasebut ing artikel "Apa sing kedadeyan ing Kubernetes nalika sampeyan mbukak kubectl run?".

Audit sistem minangka fitur menarik ing Kubernetes, sing dipateni kanthi standar. Ngidini sampeyan mlebu kabeh telpon menyang API Kubernetes. Minangka sampeyan bisa ngira, kabeh tumindak sing ana gandhengane karo ngawasi lan ngganti kahanan kluster ditindakake liwat API iki. Katrangan sing apik babagan kemampuane bisa ditemokake (kaya biasane) ing dokumentasi resmi k8s. Sabanjure, aku bakal nyoba nyritakake topik kasebut kanthi basa sing luwih gampang.

Supaya kanggo ngaktifake audit, kita kudu ngliwati telung parameter sing dibutuhake menyang wadhah ing api-server, sing diterangake kanthi luwih rinci ing ngisor iki:

  • --audit-policy-file=/etc/kubernetes/policies/audit-policy.yaml
  • --audit-log-path=/var/log/kube-audit/audit.log
  • --audit-log-format=json

Saliyane telung parameter sing dibutuhake, ana akeh setelan tambahan sing ana gandhengane karo audit: saka rotasi log nganti deskripsi webhook. Tuladha paramèter rotasi log:

  • --audit-log-maxbackup=10
  • --audit-log-maxsize=100
  • --audit-log-maxage=7

Nanging kita ora bakal ngrembug kanthi luwih rinci - sampeyan bisa nemokake kabeh rincian dokumentasi kube-apiserver.

Kaya sing wis kasebut, kabeh paramèter disetel ing manifest kanthi konfigurasi api-server (kanthi standar /etc/kubernetes/manifests/kube-apiserver.yaml), ing bagean command. Ayo bali menyang 3 parameter sing dibutuhake lan analisa:

  1. audit-policy-file - path menyang file YAML sing njlèntrèhaké kabijakan audit. Kita bakal bali menyang isine mengko, nanging saiki aku bakal nyathet yen file kasebut kudu bisa diwaca dening proses api-server. Mulane, kudu dipasang ing wadhah, sing bisa ditambahake kode ing ngisor iki menyang bagean konfigurasi sing cocog:
      volumeMounts:
        - mountPath: /etc/kubernetes/policies
          name: policies
          readOnly: true
      volumes:
      - hostPath:
          path: /etc/kubernetes/policies
          type: DirectoryOrCreate
        name: policies
  2. audit-log-path - path menyang file log. Path kasebut uga kudu bisa diakses kanggo proses server api, mula kita nerangake babagan pemasangan kanthi cara sing padha:
      volumeMounts:
        - mountPath: /var/log/kube-audit
          name: logs
          readOnly: false
      volumes:
      - hostPath:
          path: /var/log/kube-audit
          type: DirectoryOrCreate
        name: logs
  3. audit-log-format - format log audit. Default punika json, nanging format teks warisan uga kasedhiya (legacy).

Kebijakan Audit

Saiki babagan file kasebut sing nggambarake kabijakan logging. Konsep pisanan saka kabijakan audit yaiku level, tingkat logging. Padha kaya ing ngisor iki:

  • None - aja mlebu log;
  • Metadata - metadata panyuwunan log: pangguna, wektu panyuwunan, sumber daya target (pod, namespace, lsp), jinis tumindak (kriya), lsp;
  • Request - metadata log lan badan panyuwunan;
  • RequestResponse - metadata log, awak panjalukan lan awak respon.

Loro tingkat pungkasan (Request и RequestResponse) aja nyathet panjalukan sing ora ngakses sumber daya (akses menyang url non-sumber daya).

Uga kabeh panjalukan liwat sawetara tahapan:

  • RequestReceived - tataran nalika panjalukan ditampa dening prosesor lan durung ditularake luwih lanjut ing rantai prosesor;
  • ResponseStarted - header respon dikirim, nanging sadurunge awak respon dikirim. Digawe kanggo pitakon sing wis suwe (contone, watch);
  • ResponseComplete - awak respon wis dikirim, ora ana informasi liyane sing bakal dikirim;
  • Panic - acara digawe nalika kahanan ora normal dideteksi.

Kanggo ngliwati langkah apa wae sing bisa digunakake omitStages.

Ing file kabijakan, kita bisa njlèntrèhaké sawetara bagean kanthi tingkat logging sing beda. Aturan sing cocog pisanan sing ditemokake ing deskripsi kebijakan bakal ditrapake.

Daemon kubelet ngawasi owah-owahan ing manifes kanthi konfigurasi api-server lan, yen ana sing dideteksi, miwiti maneh wadhah nganggo api-server. Nanging ana rincian penting: owah-owahan ing file privasi bakal dilirwakaké dening iku. Sawise nggawe owah-owahan ing file kebijakan, sampeyan kudu miwiti maneh api-server kanthi manual. Wiwit api-server diwiwiti minangka polong statis, tim kubectl delete ora bakal nimbulaké kanggo miwiti maneh. Sampeyan kudu nindakake kanthi manual docker stop ing kube-masters, ing ngendi kabijakan audit wis diganti:

docker stop $(docker ps | grep k8s_kube-apiserver | awk '{print $1}')

Nalika ngaktifake audit, penting kanggo elinga beban ing kube-apiserver mundhak. Utamane, konsumsi memori kanggo nyimpen konteks request mundhak. Log diwiwiti mung sawise header respon dikirim. Beban uga gumantung marang konfigurasi kabijakan audit.

Tuladha kawicaksanan

Ayo ndeleng struktur file kebijakan nggunakake conto.

Punika file prasaja policykanggo log kabeh ing tingkat Metadata:

apiVersion: audit.k8s.io/v1
kind: Policy
rules:
- level: Metadata

Ing kabijakan sampeyan bisa nemtokake dhaptar pangguna (Users и ServiceAccounts) lan grup pangguna. Contone, iki carane kita bakal nglirwakake pangguna sistem, nanging log kabeh liyane ing tingkat 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

Sampeyan uga bisa njlèntrèhaké target:

  • spasi jeneng (namespaces);
  • Tembung kriya (tembung kriya: get, update, delete lan liya-liyane);
  • sumber daya (Sumber daya, yaiku: pod, configmaps etc.) lan kelompok sumber daya (apiGroups).

Ati-ati! Grup sumber daya lan sumber daya (grup API, yaiku apiGroups), uga versi sing diinstal ing kluster, bisa dipikolehi nggunakake perintah:

kubectl api-resources
kubectl api-versions

Kabijakan audit ing ngisor iki diwenehake minangka demonstrasi praktik paling apik ing Dokumentasi Alibaba Cloud:

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

Conto liyane sing apik babagan kabijakan audit yaiku profil digunakake ing GCE.

Kanggo cepet nanggapi acara audit, bisa uga describe webhook. Jeksa Agung bisa ngetokake iki dijamin ing dokumentasi resmi, Aku bakal ninggalake iku njaba orane katrangan saka artikel iki.

Hasil

Artikel kasebut nyedhiyakake ringkesan mekanisme keamanan dhasar ing kluster Kubernetes, sing ngidini sampeyan nggawe akun panganggo sing dipersonalisasi, misahake hak-hake, lan ngrekam tumindake. Muga-muga bisa migunani kanggo wong-wong sing ngadhepi masalah kasebut ing teori utawa ing praktik. Aku uga menehi saran supaya sampeyan maca dhaptar bahan liyane babagan topik keamanan ing Kubernetes, sing diwenehake ing "PS" - mbok menawa ing antarane sampeyan bakal nemokake rincian sing dibutuhake babagan masalah sing cocog karo sampeyan.

PS

Waca uga ing blog kita:

Source: www.habr.com

Add a comment