ProHoster > Blog > İdarə > Kubernetesdə Təhlükəsizlik ABC: Doğrulama, Avtorizasiya, Audit
Kubernetesdə Təhlükəsizlik ABC: Doğrulama, Avtorizasiya, Audit
Gec-tez hər hansı bir sistemin işində təhlükəsizlik məsələsi yaranır: autentifikasiyanın təmin edilməsi, hüquqların ayrılması, audit və digər tapşırıqlar. Artıq Kubernetes üçün yaradılmışdır çoxlu həllər, hətta çox tələbkar mühitlərdə də standartlara uyğunluğa nail olmağa imkan verir... Eyni material K8-lərin daxili mexanizmləri çərçivəsində həyata keçirilən təhlükəsizliyin əsas aspektlərinə həsr olunub. İlk növbədə, Kubernetes ilə tanış olmağa başlayanlar üçün faydalı olacaq - təhlükəsizliklə bağlı məsələləri öyrənmək üçün başlanğıc nöqtəsi kimi.
İdentifikasiyası
Kubernetes-də iki növ istifadəçi var:
Xidmət Hesabları — Kubernetes API tərəfindən idarə olunan hesablar;
İstifadəçilər — xarici, müstəqil xidmətlər tərəfindən idarə olunan “normal” istifadəçilər.
Bu növlər arasındakı əsas fərq ondan ibarətdir ki, Xidmət Hesabları üçün Kubernetes API-də xüsusi obyektlər mövcuddur (onlara belə deyilir - ServiceAccounts), sirlər tipli obyektlərdə klasterdə saxlanılan ad sahəsinə və icazə məlumat dəstinə bağlıdır. Belə istifadəçilər (Xidmət Hesabları) ilk növbədə Kubernetes klasterində işləyən proseslərin Kubernetes API-yə giriş hüquqlarını idarə etmək üçün nəzərdə tutulub.
Adi İstifadəçilərin Kubernetes API-də girişləri yoxdur: onlar xarici mexanizmlər tərəfindən idarə edilməlidir. Onlar klasterdən kənarda yaşayan insanlar və ya proseslər üçün nəzərdə tutulub.
Hər bir API sorğusu ya Xidmət Hesabı, İstifadəçi ilə əlaqələndirilir və ya anonim hesab olunur.
İstifadəçi adı — istifadəçi adı (hərflərə həssasdır!);
UID - “istifadəçi adından daha ardıcıl və unikal olan” maşın tərəfindən oxuna bilən istifadəçi identifikasiyası sətri;
Qruplar — istifadəçinin aid olduğu qrupların siyahısı;
əlavə — avtorizasiya mexanizmi tərəfindən istifadə edilə bilən əlavə sahələr.
Kubernetes çoxlu sayda autentifikasiya mexanizmlərindən istifadə edə bilər: X509 sertifikatları, Taşıyıcı tokenləri, autentifikasiya edən proksi, HTTP Əsas Doğrulama. Bu mexanizmlərdən istifadə edərək çoxlu sayda avtorizasiya sxemlərini həyata keçirə bilərsiniz: parolları olan statik fayldan OpenID OAuth2-ə qədər.
Üstəlik, eyni vaxtda bir neçə avtorizasiya sxemindən istifadə etmək mümkündür. Varsayılan olaraq, klaster istifadə edir:
xidmət hesabı nişanları - Xidmət Hesabları üçün;
X509 - İstifadəçilər üçün.
ServiceAccounts-un idarə edilməsi ilə bağlı sual bu məqalənin əhatə dairəsindən kənardadır, lakin bu məsələ ilə daha ətraflı tanış olmaq istəyənlər üçün məndən başlamağı məsləhət görürəm. rəsmi sənəd səhifələri. X509 sertifikatlarının necə işlədiyi məsələsini daha yaxından nəzərdən keçirəcəyik.
İstifadəçilər üçün sertifikatlar (X.509)
Sertifikatlarla işləməyin klassik üsuluna aşağıdakılar daxildir:
Kubernetes klaster CA açarlarından istifadə edərək sertifikat sorğusunun işlənməsi, istifadəçi sertifikatının əldə edilməsi (sertifikat əldə etmək üçün siz Kubernetes klaster CA açarına girişi olan hesabdan istifadə etməlisiniz, o, standart olaraq /etc/kubernetes/pki/ca.key):
Hesablar və serverlər arasında konfiqurasiyanın ötürülməsini asanlaşdırmaq üçün aşağıdakı düymələrin dəyərlərini redaktə etmək faydalıdır:
certificate-authority
client-certificate
client-key
Bunu etmək üçün, siz base64 istifadə edərək, onlarda göstərilən faylları kodlaya və düymələrin adına şəkilçi əlavə edərək konfiqurasiyada qeyd edə bilərsiniz. -data, yəni. almış certificate-authority-data və s.
kubeadm ilə sertifikatlar
Buraxılış ilə Kubernetes 1.15 -də dəstəyinin alfa versiyası sayəsində sertifikatlarla işləmək xeyli asanlaşıb kubeadm yardım proqramı. Məsələn, istifadəçi düymələri ilə konfiqurasiya faylı yaratmaq indi belə görünə bilər:
kubeadm alpha kubeconfig user --client-name=mynewuser --apiserver-advertise-address 192.168.100.200
NB: Tələb olunur reklam ünvanı api-server konfiqurasiyasında tapıla bilər, bu da standart olaraq yerləşir /etc/kubernetes/manifests/kube-apiserver.yaml.
Nəticə konfiqurasiya stdout-a çıxarılacaq. Onu saxlamaq lazımdır ~/.kube/config istifadəçi hesabına və ya mühit dəyişənində göstərilən fayla KUBECONFIG.
Dərin qazmaq
Daha ətraflı təsvir olunan məsələləri anlamaq istəyənlər üçün:
ayrı məqalə rəsmi Kubernetes sənədlərində sertifikatlarla işləmək üzrə;
Defolt səlahiyyətli hesabın klasterdə işləmək hüququ yoxdur. İcazələr vermək üçün Kubernetes avtorizasiya mexanizmini tətbiq edir.
1.6 versiyasından əvvəl Kubernetes adlı avtorizasiya növündən istifadə edirdi ABAC (Atribut əsaslı giriş nəzarəti). Bununla bağlı təfərrüatları burada tapa bilərsiniz rəsmi sənədlər. Bu yanaşma hazırda miras sayılır, lakin siz onu hələ də digər autentifikasiya növləri ilə birlikdə istifadə edə bilərsiniz.
Klasterə giriş hüquqlarının bölünməsinin cari (və daha çevik) yolu adlanır RBAC (Rol əsaslı giriş nəzarəti). Versiyadan bəri stabil elan edilmişdir Kubernetes 1.8. RBAC açıq şəkildə icazə verilməyən hər şeyin qadağan edildiyi hüquq modelini həyata keçirir. RBAC-ı aktivləşdirmək üçün, parametrlə Kubernetes api-serverini işə salmalısınız --authorization-mode=RBAC. Parametrlər, standart olaraq yol boyunca yerləşən api-server konfiqurasiyası ilə manifestdə təyin olunur. /etc/kubernetes/manifests/kube-apiserver.yaml, bölməsində command. Bununla belə, RBAC artıq defolt olaraq aktivdir, buna görə də çox güman ki, bu barədə narahat olmamalısınız: bunu dəyərlə yoxlaya bilərsiniz authorization-mode (artıq qeyd olunanda kube-apiserver.yaml). Yeri gəlmişkən, onun mənaları arasında icazənin başqa növləri də ola bilər (node, webhook, always allow), lakin biz onların nəzərdən keçirilməsini materialın əhatə dairəsindən kənarda qoyacağıq.
Yeri gəlmişkən, biz artıq dərc etmişik Məqalə RBAC ilə işləməyin prinsipləri və xüsusiyyətlərinin kifayət qədər ətraflı təsviri ilə, buna görə də daha sonra özümü əsasların və nümunələrin qısa siyahısı ilə məhdudlaşdıracağam.
Aşağıdakı API obyektləri RBAC vasitəsilə Kubernetes-də girişi idarə etmək üçün istifadə olunur:
Role и ClusterRole — giriş hüquqlarını təsvir etməyə xidmət edən rollar:
Role ad məkanında hüquqları təsvir etməyə imkan verir;
ClusterRole - çoxluq daxilində, o cümlədən qovşaqlar, qeyri-resurs URL-ləri (yəni Kubernetes resursları ilə əlaqəli olmayan) kimi klasterə aid obyektlərə - məsələn, /version, /logs, /api*);
RoleBinding и ClusterRoleBinding - bağlamaq üçün istifadə olunur Role и ClusterRole istifadəçiyə, istifadəçi qrupuna və ya ServiceAccount-a.
Rol və Rol Bağlama obyektləri ad sahəsi ilə məhdudlaşır, yəni. eyni ad məkanında olmalıdır. Bununla belə, RoleBinding ClusterRole-a istinad edə bilər ki, bu da sizə ümumi icazələr dəsti yaratmağa və onlardan istifadə edərək girişi idarə etməyə imkan verir.
Rollar aşağıdakıları ehtiva edən qaydalar toplusundan istifadə edərək hüquqları təsvir edir:
API qrupları - bax rəsmi sənədlər apiGroups və çıxış tərəfindən kubectl api-resources;
resursları (resursları: pod, namespace, deployment və s.);
Fe'llər (fe'llər: set, update və s.).
resurs adları (resourceNames) - bu tip bütün resurslara deyil, müəyyən bir mənbəyə çıxış təmin etməyiniz lazım olduğu halda.
Kubernetes-də avtorizasiyanın daha ətraflı təhlilini səhifədə tapa bilərsiniz rəsmi sənədlər. Bunun əvəzinə (daha doğrusu, buna əlavə olaraq) onun işini göstərən nümunələr verəcəyəm.
RBAC müəssisələrinin nümunələri
Sadə Role, bu sizə podların siyahısını və statusunu əldə etməyə və ad məkanında onlara nəzarət etməyə imkan verir target-namespace:
Misal ClusterRole, bu sizə podların siyahısını və statusunu əldə etməyə və bütün klasterdə onlara nəzarət etməyə imkan verir:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
# секции "namespace" нет, так как ClusterRole задействует весь кластер
name: secret-reader
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get", "watch", "list"]
Misal RoleBindingistifadəçiyə imkan verir mynewuser ad məkanında podları "oxumaq" 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
Hadisə auditi
Sxematik olaraq, Kubernetes arxitekturasını aşağıdakı kimi təqdim etmək olar:
Sorğuların işlənməsi üçün cavabdeh olan əsas Kubernetes komponentidir api-server. Klasterdəki bütün əməliyyatlar ondan keçir. Bu daxili mexanizmlər haqqında daha çox məqalədə oxuya bilərsiniz "Kubernetes-də kubectl run-u işlədəndə nə baş verir?.
Sistem auditi Kubernetes-də defolt olaraq qeyri-aktiv olan maraqlı bir xüsusiyyətdir. Bütün zəngləri Kubernetes API-yə daxil etməyə imkan verir. Təxmin etdiyiniz kimi, klasterin vəziyyətinin monitorinqi və dəyişdirilməsi ilə bağlı bütün hərəkətlər bu API vasitəsilə həyata keçirilir. Onun imkanlarının yaxşı təsvirini (hər zamankı kimi) tapa bilərsiniz rəsmi sənədlər K8s. Sonra mövzunu daha sadə dildə təqdim etməyə çalışacağam.
Belə ki, auditin aparılmasına imkan yaratmaq, api-serverdəki konteynerə üç tələb olunan parametri ötürməliyik, bunlar aşağıda daha ətraflı təsvir edilmişdir:
Bu üç zəruri parametrə əlavə olaraq, auditlə bağlı bir çox əlavə parametrlər var: jurnalın fırlanmasından veb-hook təsvirlərinə qədər. Günlük fırlanma parametrlərinə nümunə:
--audit-log-maxbackup=10
--audit-log-maxsize=100
--audit-log-maxage=7
Ancaq biz onların üzərində daha ətraflı dayanmayacağıq - bütün təfərrüatları burada tapa bilərsiniz kube-apiserver sənədləri.
Artıq qeyd edildiyi kimi, bütün parametrlər api-server konfiqurasiyası ilə manifestdə qurulur (standart olaraq /etc/kubernetes/manifests/kube-apiserver.yaml), bölməsində command. Gəlin 3 tələb olunan parametrə qayıdaq və onları təhlil edək:
audit-policy-file — audit siyasətini təsvir edən YAML faylına gedən yol. Onun məzmununa daha sonra qayıdacağıq, lakin hələlik qeyd edim ki, fayl api-server prosesi tərəfindən oxunaqlı olmalıdır. Buna görə də, onu konteynerin içərisinə quraşdırmaq lazımdır, bunun üçün konfiqurasiyanın müvafiq bölmələrinə aşağıdakı kodu əlavə edə bilərsiniz:
audit-log-path — log faylına gedən yol. Yol həmçinin api-server prosesi üçün əlçatan olmalıdır, ona görə də onun quraşdırılmasını eyni şəkildə təsvir edirik:
audit-log-format — audit jurnalının formatı. Defoltdur json, lakin köhnə mətn formatı da mövcuddur (legacy).
Audit Siyasəti
İndi giriş siyasətini təsvir edən qeyd olunan fayl haqqında. Audit siyasətinin ilk konsepsiyası belədir level, giriş səviyyəsi. Onlar aşağıdakılardır:
None - qeydiyyatdan keçməyin;
Metadata — sorğunun metadatasını qeyd edin: istifadəçi, sorğu vaxtı, hədəf resurs (pod, ad sahəsi və s.), fəaliyyət növü (fel) və s.;
Request — log metadata və sorğu orqanı;
RequestResponse — log metadata, sorğu orqanı və cavab orqanı.
Son iki səviyyə (Request и RequestResponse) resurslara daxil olmayan sorğuları daxil etməyin (resurs olmayan URL-lərə giriş).
Həm də bütün sorğular keçir bir neçə mərhələdə:
RequestReceived — sorğunun prosessor tərəfindən qəbul edildiyi və prosessorlar zənciri üzrə hələ də ötürülmədiyi mərhələ;
ResponseStarted — cavab başlıqları göndərilir, lakin cavab orqanı göndərilməzdən əvvəl. Uzun müddət davam edən sorğular üçün yaradılmışdır (məsələn, watch);
ResponseComplete — cavab orqanı göndərilib, artıq məlumat göndərilməyəcək;
Panic — hadisələr anormal vəziyyət aşkar edildikdə yaranır.
İstifadə edə biləcəyiniz addımları atlamaq üçün omitStages.
Siyasət faylında biz müxtəlif qeyd səviyyələri olan bir neçə bölməni təsvir edə bilərik. Siyasət təsvirində tapılan ilk uyğunluq qaydası tətbiq olunacaq.
Kubelet demonu api-server konfiqurasiyası ilə manifestdəki dəyişiklikləri izləyir və aşkar edilərsə, konteyneri api-server ilə yenidən işə salır. Ancaq vacib bir detal var: siyasət faylındakı dəyişikliklər onun tərəfindən nəzərə alınmayacaq. Siyasət faylında dəyişikliklər etdikdən sonra api-serverini əl ilə yenidən başlatmalısınız. api-server kimi işə salındığından statik pod, komanda kubectl delete yenidən başlamasına səbəb olmayacaq. Bunu əl ilə etməli olacaqsınız docker stop audit siyasətinin dəyişdirildiyi kube-masterlərdə:
Auditi aktivləşdirərkən bunu yadda saxlamaq vacibdir kube-apiserverə yük artır. Xüsusilə, sorğu kontekstini saxlamaq üçün yaddaş istehlakı artır. Giriş yalnız cavab başlığı göndərildikdən sonra başlayır. Yük həmçinin audit siyasətinin konfiqurasiyasından asılıdır.
Siyasət nümunələri
Nümunələrdən istifadə edərək siyasət fayllarının strukturuna baxaq.
Budur sadə bir fayl policyhər şeyi səviyyədə qeyd etmək Metadata:
Siyasətdə istifadəçilərin siyahısını müəyyən edə bilərsiniz (Users и ServiceAccounts) və istifadəçi qrupları. Məsələn, bu şəkildə sistem istifadəçilərini nəzərə almayacağıq, lakin hər şeyi səviyyədə qeyd edəcəyik Request:
Fe'llər (fe'llər: get, update, delete və qeyriləri);
resursları (resurslarıKimi aşağıdakılardır: pod, configmaps və s.) və resurs qrupları (apiGroups).
Diqqət edin! Resurslar və resurs qrupları (API qrupları, yəni apiGroups), həmçinin onların klasterdə quraşdırılmış versiyaları əmrlərdən istifadə etməklə əldə edilə bilər:
kubectl api-resources
kubectl api-versions
Aşağıdakı audit siyasəti ən yaxşı təcrübələrin nümayişi kimi təqdim olunur Alibaba Cloud sənədləri:
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 hadisələrinə tez reaksiya vermək mümkündür webhook təsvir edin. Bu məsələ əhatə olunur rəsmi sənədlər, bu məqalənin əhatə dairəsindən kənarda buraxacağam.
Nəticələri
Məqalə Kubernetes klasterlərində fərdiləşdirilmiş istifadəçi hesabları yaratmağa, onların hüquqlarını ayırmağa və hərəkətlərini qeyd etməyə imkan verən əsas təhlükəsizlik mexanizmlərinin icmalı təqdim edir. Ümid edirəm ki, nəzəri və ya praktiki olaraq belə problemlərlə üzləşənlər üçün faydalı olar. "PS"-də verilən Kubernetes-də təhlükəsizlik mövzusunda digər materialların siyahısını oxumağı da tövsiyə edirəm - bəlkə də onların arasında sizə aid olan problemlər haqqında lazımi təfərrüatları tapa bilərsiniz.