ProHoster > Блог > администрация > Азбуката на сигурността в Kubernetes: удостоверяване, оторизация, одит
Азбуката на сигурността в Kubernetes: удостоверяване, оторизация, одит
Рано или късно при работата на всяка система възниква въпросът за сигурността: осигуряване на удостоверяване, разделяне на правата, одит и други задачи. Вече е създаден за Kubernetes много решения, които ви позволяват да постигнете съответствие със стандартите дори в много взискателни среди ... Същият материал е посветен на основните аспекти на сигурността, реализирани в рамките на вградените механизми на K8s. На първо място, ще бъде полезно за тези, които започват да се запознават с Kubernetes - като отправна точка за изучаване на въпроси, свързани със сигурността.
заверка
В Kubernetes има два типа потребители:
Сервизни акаунти - акаунти, управлявани от Kubernetes API;
Потребители - "нормални" потребители, управлявани от външни, независими услуги.
Основната разлика между тези типове е, че има специални обекти за акаунти за услуги в API на Kubernetes (те се наричат така - ServiceAccounts), които са обвързани с пространство от имена и набор от данни за оторизация, съхранени в клъстера в обекти от тип Secrets. Такива потребители (сервизни акаунти) са предназначени главно за управление на правата за достъп до Kubernetes API на процеси, изпълнявани в Kubernetes клъстер.
Обикновените потребители, от друга страна, нямат записи в Kubernetes API: те трябва да се управляват от външни механизми. Те са предназначени за хора или процеси, живеещи извън клъстера.
Всяка заявка за API е свързана или с акаунт за услуга, или с потребител, или се счита за анонимна.
Данните за удостоверяване на потребителя включват:
Потребител — потребителско име (малки и малки букви!);
UID - машинночетим потребителски идентификационен низ, който е "по-последователен и уникален от потребителско име";
Групи — списък на групите, към които принадлежи потребителят;
екстра - допълнителни полета, които могат да се използват от механизма за оторизация.
Kubernetes може да използва голям брой механизми за удостоверяване: X509 сертификати, токени на носителя, прокси за удостоверяване, HTTP Basic Auth. Използвайки тези механизми, можете да приложите голям брой схеми за оторизация: от файл със статична парола до OpenID OAuth2.
Освен това могат да се използват едновременно множество схеми за оторизация. По подразбиране клъстерът използва:
токени за сервизен акаунт - за Сервизни акаунти;
X509 - за потребители.
Въпросът за управлението на ServiceAccounts е извън обхвата на тази статия и за тези, които желаят да научат повече за този проблем, препоръчвам да започнете с страници с официална документация. Ще разгледаме по-отблизо издаването на сертификати X509.
Сертификати за потребители (X.509)
Класическият начин за работа със сертификати включва:
обработка на заявката за сертификат с помощта на CA ключовете на Kubernetes клъстера, получаване на потребителски сертификат (за да получите сертификат, трябва да използвате акаунт, който има достъп до ключа на Kubernetes клъстер CA, който по подразбиране се намира в /etc/kubernetes/pki/ca.key):
За да се улесни прехвърлянето на конфигурацията между акаунти и сървъри, е полезно да редактирате стойностите на следните ключове:
certificate-authority
client-certificate
client-key
За да направите това, можете да кодирате посочените в тях файлове с помощта на base64 и да ги регистрирате в конфигурацията, като добавите суфикса към името на ключовете -data, т.е. получени certificate-authority-data и т.н.
Сертификати с kubeadm
С освобождаване Kubernetes 1.15 работата със сертификати стана много по-лесна благодарение на алфа версията на поддръжката му в помощна програма kubeadm. Например, ето как може да изглежда сега генерирането на конфигурационен файл с потребителски ключове:
kubeadm alpha kubeconfig user --client-name=mynewuser --apiserver-advertise-address 192.168.100.200
NB: Задължително адрес за реклама може да се види в конфигурацията на api-сървъра, която се намира по подразбиране в /etc/kubernetes/manifests/kube-apiserver.yaml.
Получената конфигурация ще бъде отпечатана на stdout. Трябва да се съхранява ~/.kube/config потребителски акаунт или към файл, посочен в променлива на средата KUBECONFIG.
Копайте по-дълбоко
За тези, които искат да разгледат по-отблизо описаните проблеми:
отделна статия относно работата със сертификати в официалната документация на Kubernetes;
добра статия от Bitnami, в който въпросът за удостоверенията е засегнат от практическа гледна точка.
Упълномощеният акаунт по подразбиране няма права да действа върху клъстера. За да предостави разрешения, Kubernetes прилага механизъм за оторизация.
Преди версия 1.6 Kubernetes използва тип оторизация, наречен ABAC (Контрол на достъпа, базиран на атрибути). Подробности за него можете да намерите в официална документация. Понастоящем този подход се счита за наследен, но все пак можете да го използвате едновременно с други типове оторизация.
Действителният (и по-гъвкав) начин за разделяне на правата за достъп до клъстер се нарича RBAC (Ролев контрол на достъпа). Той е обявен за стабилен от версията Kubernetes 1.8. RBAC прилага модел на права, който забранява всичко, което не е изрично разрешено. За да активирате RBAC, трябва да стартирате api-сървър на Kubernetes с параметъра --authorization-mode=RBAC. Параметрите са зададени в манифеста с конфигурацията на api-сървъра, която по подразбиране се намира по пътя /etc/kubernetes/manifests/kube-apiserver.yaml, в раздел command. По подразбиране обаче RBAC вече е активиран, така че най-вероятно не трябва да се притеснявате за това: можете да проверите това чрез стойността authorization-mode (във вече споменатото kube-apiserver.yaml). Между другото, сред неговите стойности може да има и други видове разрешение (node, webhook, always allow), но ще оставим тяхното разглеждане извън обхвата на материала.
Между другото, вече сме публикували Статия с доста подробна история за принципите и характеристиките на работа с RBAC, така че по-нататък ще се огранича до кратко изброяване на основите и примерите.
Следните API обекти се използват за контролиране на достъпа до Kubernetes чрез RBAC:
Role и ClusterRole - роли, които служат за описание на правата за достъп:
Role ви позволява да опишете правата в рамките на пространството от имена;
ClusterRole - в рамките на клъстера, включително към специфични за клъстера обекти като възли, URL адреси без ресурси (т.е. несвързани с ресурси на Kubernetes - например, /version, /logs, /api*);
RoleBinding и ClusterRoleBinding - използва се за подвързване Role и ClusterRole към потребител, потребителска група или ServiceAccount.
Обектите Role и RoleBinding са обвързани с пространство от имена, т.е. трябва да бъде в същото пространство от имена. Въпреки това, RoleBinding може да се отнася до ClusterRole, което ви позволява да създадете набор от общи разрешения и да контролирате достъпа с тях.
Ролите описват права с помощта на набори от правила, съдържащи:
ресурси (ресурси: pod, namespace, deployment и др.);
глаголи (глаголи: set, update и други подобни).
имена на ресурси (resourceNames) - за случая, когато трябва да предоставите достъп до конкретен ресурс, а не до всички ресурси от този тип.
По-подробна разбивка на оторизацията в Kubernetes може да бъде намерена на страницата официална документация. Вместо това (или по-скоро в допълнение към това) ще дам примери, които илюстрират работата му.
Примери за RBAC обект
прост Role, което ви позволява да получите списък и състояние на подове и да ги следите в пространството на имената target-namespace:
Пример ClusterRole, което ви позволява да получите списък и състояние на подове и да ги наблюдавате в целия клъстер:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
# секции "namespace" нет, так как ClusterRole задействует весь кластер
name: secret-reader
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get", "watch", "list"]
Пример RoleBinding, което позволява на потребителя mynewuser "чете" подове в пространството на имената 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
Одит на събития
Схематично архитектурата на Kubernetes може да бъде представена по следния начин:
Ключовият компонент на Kubernetes, отговорен за обработката на заявките, е − api-сървър. През него минават всички операции на клъстера. Можете да прочетете повече за тези вътрешни механизми в статията "Какво се случва в Kubernetes, когато стартирате kubectl run?".
Системният одит е интересна функция в Kubernetes, която е деактивирана по подразбиране. Тя ви позволява да регистрирате всички обаждания към Kubernetes API. Както можете да предположите, всички действия, свързани с контрола и промяната на състоянието на клъстера, се извършват чрез този API. Добро описание на неговите възможности (както обикновено) можете да намерите в официална документация K8s. По-нататък ще се опитам да обясня темата по по-прост начин.
По този начин, за да се даде възможност за одит, трябва да предадем три необходими параметъра към контейнера в api-сървъра, които са описани по-подробно по-долу:
В допълнение към тези три задължителни параметъра има много допълнителни настройки, свързани с одита: от ротация на регистрационни файлове до описания на webhook. Пример за параметри за ротация на трупи:
Както вече споменахме, всички параметри са зададени в манифеста с конфигурацията на api-сървъра (по подразбиране /etc/kubernetes/manifests/kube-apiserver.yaml), в раздела command. Нека се върнем към 3-те необходими параметъра и да ги анализираме:
audit-policy-file - пътят до YAML файла с описание на политиката (политиката) на одита. Ще се върнем към съдържанието му, но засега ще отбележа, че файлът трябва да може да се чете от процеса на api-сървъра. Следователно трябва да го монтирате вътре в контейнера, за което можете да добавите следния код към съответните раздели на конфигурацията:
audit-log-format — формат на одитния журнал. По подразбиране е json, но наследеният текстов формат също е наличен (legacy).
Политика за одит
Сега за споменатия файл с описание на политиката за регистриране. Първата концепция за одитна политика е level, ниво на регистриране. Те са както следва:
None - не влизайте в лог;
Metadata — метаданни за заявка за регистриране: потребител, време на заявка, целеви ресурс (под, пространство от имена и т.н.), тип действие (глагол) и т.н.;
Request - метаданни на регистрационния файл и тяло на заявката;
RequestResponse - метаданни на регистрационния файл, тяло на заявката и тяло на отговора.
Последните две ниваRequest и RequestResponse) не регистрирайте заявки, които не са имали достъп до ресурси (препратки към така наречените url адреси без ресурси).
Освен това всички заявки преминават няколко етапа:
RequestReceived - етапът, когато заявката е получена от манипулатора и все още не е прехвърлена по-нататък по веригата от манипулатори;
ResponseStarted - Заглавките на отговора се изпращат, но преди да бъде изпратено тялото на отговора. Генерирани за продължителни заявки (напр. watch);
ResponseComplete - тялото за отговор е изпратено, повече информация няма да бъде изпращана;
Panic — Събития се генерират, когато се открие необичайна ситуация.
За да пропуснете всеки етап, можете да използвате omitStages.
Във файла на правилата можем да опишем няколко секции с различни нива на регистриране. Ще бъде приложено първото съответстващо правило, намерено в описанието на правилата.
Демонът kubelet следи за промяна в манифеста с конфигурацията на api-сървъра и, ако има такава, рестартира контейнера на api-сървъра. Но има важна подробност: промените във файла на правилата ще бъдат игнорирани. След като направите промени във файла с политики, ще трябва да рестартирате api-сървъра ръчно. Тъй като api-сървърът се стартира като статичен под, екип kubectl delete няма да го рестартира. Ще трябва да го направите ръчно docker stop на kube-masters, където политиката за одит е променена:
Когато активирате одита, важно е да запомните това натоварването се увеличава на kube-apiserver. По-специално, потреблението на памет за съхраняване на контекста на заявката се увеличава. Регистрирането започва само след изпращане на заглавката на отговора. Натоварването също зависи от конфигурацията на политиката за одит.
Примери за политики
Нека анализираме структурата на файловете с политики, използвайки примери.
Ето един прост файл policyда регистрирате всичко на ниво Metadata:
В правилата можете да посочите списък с потребители (Users и ServiceAccounts) и потребителски групи. Например, по този начин ще игнорираме системните потребители, но ще регистрираме всичко останало на ниво Request:
ресурси (ресурси, Както следва: pod, configmaps и т.н.) и групи ресурси (apiGroups).
Забележка! Ресурси и групи ресурси (API групи, т.е. apiGroups), както и техните версии, инсталирани в клъстера, могат да бъдат получени с помощта на командите:
За бърз отговор на одитни събития е възможно да се опишете webhook. Този въпрос е обхванат в официална документацияЩе го оставя извън обхвата на тази статия.
Резултати от
Статията предоставя преглед на основните механизми за сигурност в клъстерите на Kubernetes, които позволяват създаване на персонализирани потребителски акаунти, разделяне на техните права и регистриране на техните действия. Надявам се, че ще бъде полезно за тези, които се сблъскват с подобни проблеми на теория или вече на практика. Също така препоръчвам да се запознаете със списъка с други материали по темата за сигурността в Kubernetes, който е даден в „PS“, може би сред тях ще намерите необходимите подробности за проблемите, които са от значение за вас.