ProHoster > Blog > башкаруу > Kubernetes коопсуздук ABC: аутентификация, авторизация, аудит
Kubernetes коопсуздук ABC: аутентификация, авторизация, аудит
Эртеби-кечпи, кандайдыр бир системанын иштешинде коопсуздук маселеси келип чыгат: аутентификацияны камсыз кылуу, укуктарды бөлүү, аудит жана башка милдеттер. Kubernetes үчүн мурунтан эле түзүлгөн көптөгөн чечимдер, бул өтө талап кылынган шарттарда да стандарттарга ылайык келүүгө мүмкүндүк берет... Ошол эле материал K8s орнотулган механизмдеринин алкагында ишке ашырылган коопсуздуктун негизги аспектилерине арналган. Биринчиден, бул Kubernetes менен тааныша баштагандар үчүн пайдалуу болот - коопсуздукка байланыштуу маселелерди изилдөө үчүн баштапкы чекит катары.
тастыктоо
Kubernetesте колдонуучулардын эки түрү бар:
Кызмат эсептери — Kubernetes API тарабынан башкарылуучу эсептер;
Users — «кадимки» колдонуучулар тышкы, көз карандысыз кызматтар тарабынан башкарылат.
Бул типтердин негизги айырмасы - Кызмат эсептери үчүн Kubernetes API'де атайын объекттер бар (алар мындай деп аталат - ServiceAccounts), алар аттар мейкиндигине жана Жашыруун түрдөгү объекттерде кластерде сакталган авторизация маалыматтарынын топтомуна байланган. Мындай колдонуучулар (Кызмат каттоо эсептери) биринчи кезекте Kubernetes кластеринде иштеген процесстердин Kubernetes API'сине кирүү укуктарын башкарууга арналган.
Жөнөкөй колдонуучуларда Kubernetes API'де жазуулар жок: алар тышкы механизмдер менен башкарылууга тийиш. Алар кластерден тышкары жашаган адамдарга же процесстерге арналган.
Ар бир API сурамы Кызмат каттоо эсеби, Колдонуучу менен байланышкан же анонимдүү деп эсептелет.
Колдонуучунун аутентификация маалыматтары төмөнкүлөрдү камтыйт:
колдонуучунун аты — колдонуучунун аты (регистрации сезимтал!);
UID - "колдонуучунун атына караганда ырааттуураак жана уникалдуу" болгон машинада окулуучу колдонуучуну идентификациялоо саптары;
топтор — колдонуучу таандык болгон топтордун тизмеси;
кошумча — авторизациялоо механизми тарабынан колдонулушу мүмкүн болгон кошумча талаалар.
Kubernetes аутентификациянын көп сандагы механизмдерин колдоно алат: X509 сертификаттары, алып жүрүүчү токендери, аныктыгын текшерүүчү прокси, HTTP Basic Auth. Бул механизмдерди колдонуу менен сиз көптөгөн авторизация схемаларын ишке ашыра аласыз: сырсөздөрү бар статикалык файлдан OpenID OAuth2ге чейин.
Мындан тышкары, бир эле учурда бир нече авторизация схемаларын колдонууга болот. Демейки боюнча, кластер төмөнкүлөрдү колдонот:
кызмат эсебинин белгилери - Кызмат эсептери үчүн;
X509 - колдонуучулар үчүн.
ServiceAccounts башкаруу жөнүндө суроо бул макаланын чегинен тышкары, бирок бул маселе менен кененирээк таанышууну каалагандар үчүн, мен баштоону сунуштайм расмий документ баракчалары. Биз X509 күбөлүктөрү кандай иштээрин карап чыгабыз.
Колдонуучулар үчүн сертификаттар (X.509)
Сертификаттар менен иштөөнүн классикалык ыкмасы төмөнкүлөрдү камтыйт:
Kubernetes кластеринин CA ачкычтарын колдонуу менен сертификат суроо-талабын иштеп чыгуу, колдонуучунун сертификатын алуу (сертификат алуу үчүн сиз демейки боюнча төмөнкү жерде жайгашкан Kubernetes кластеринин CA ачкычына кирүү мүмкүнчүлүгү бар каттоо эсебин колдонушуңуз керек. /etc/kubernetes/pki/ca.key):
Конфигурацияны каттоо эсептери менен серверлердин ортосунда өткөрүп берүүнү жеңилдетүү үчүн, төмөнкү баскычтардын маанилерин түзөтүү пайдалуу:
certificate-authority
client-certificate
client-key
Бул үчүн, сиз аларда көрсөтүлгөн файлдарды base64 аркылуу коддоп, аларды конфигурацияда каттай аласыз, бул баскычтардын атына суффикс кошуп. -data, б.а. алган certificate-authority-data ж.б.
kubeadm менен сертификаттар
Чыгарылышы менен Кубернеттер 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 документтеринде сертификаттар менен иштөө боюнча;
Демейки ыйгарым укуктуу эсеп кластерде иштөөгө укуктарга ээ эмес. Уруксаттарды берүү үчүн, Kubernetes авторизациялоо механизмин ишке ашырат.
1.6 версиясына чейин Kubernetes аттуу авторизация түрүн колдонгон ABAC (Атрибутка негизделген кирүүнү башкаруу). Бул тууралуу толук маалымат таба аласыз расмий документтер. Бул ыкма учурда эски деп эсептелет, бирок сиз аны дагы эле башка аутентификация түрлөрү менен бирге колдоно аласыз.
Кластерге кирүү укуктарын бөлүштүрүүнүн учурдагы (жана ийкемдүү) жолу деп аталат RBAC (Ролдун негизинде кирүү башкаруу). Ал версиядан бери туруктуу деп жарыяланды Кубернеттер 1.8. RBAC ачык уруксат берилбеген нерселердин бардыгына тыюу салынган укук моделин ишке ашырат. RBAC иштетүү үчүн, сиз Kubernetes api-серверин параметр менен башташыңыз керек --authorization-mode=RBAC. Параметрлер манифестте api-сервер конфигурациясы менен коюлган, ал демейки боюнча жолдун боюнда жайгашкан. /etc/kubernetes/manifests/kube-apiserver.yaml, бөлүмдө command. Бирок, RBAC мурунтан эле демейки боюнча иштетилген, ошондуктан, балким, сиз бул жөнүндө кабатыр болбоңуз: муну мааниси менен текшере аласыз authorization-mode (буга чейин айтылган kube-apiserver.yaml). Айтмакчы, анын маанилеринин арасында авторизациянын башка түрлөрү да болушу мүмкүн (node, webhook, always allow), бирок биз алардын кароосун материалдын чегинен тышкары калтырабыз.
Баса, биз буга чейин жарыялаганбыз макала RBAC менен иштөөнүн принциптерин жана өзгөчөлүктөрүн кыйла деталдуу баяндоо менен, мындан ары мен негиздер менен мисалдардын кыскача тизмеси менен чектелет.
RBAC аркылуу Kubernetes'те кирүү мүмкүнчүлүгүн көзөмөлдөө үчүн төмөнкү API объекттери колдонулат:
Role и ClusterRole - мүмкүндүк алуу укуктарын сүрөттөө үчүн кызмат кылган ролдор:
Role аттар мейкиндигиндеги укуктарды сүрөттөөгө мүмкүндүк берет;
ClusterRole - кластердин ичинде, анын ичинде түйүндөр, ресурстук эмес URL даректери сыяктуу кластерге тиешелүү объекттерге (б.а. Kubernetes ресурстарына тиешеси жок - мисалы, /version, /logs, /api*);
RoleBinding и ClusterRoleBinding - байлоо үчүн колдонулат Role и ClusterRole колдонуучуга, колдонуучу тобуна же ServiceAccount.
Role жана RoleBinding объекттери аттар мейкиндиги менен чектелген, б.а. бирдей аталыш мейкиндигинде болушу керек. Бирок, RoleBinding ClusterRoleге шилтеме жасай алат, ал сизге жалпы уруксаттардын топтомун түзүүгө жана аларды колдонуу менен кирүүнү көзөмөлдөөгө мүмкүндүк берет.
Ролдор төмөнкүлөрдү камтыган эрежелердин топтомун колдонуу менен укуктарды сүрөттөйт:
API топтору - караңыз расмий документтер apiGroups жана чыгаруу боюнча kubectl api-resources;
ресурстар (ресурстары: 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 компоненти болуп саналат api-сервер. Кластердеги бардык операциялар ал аркылуу өтөт. Бул ички механизмдер тууралуу кененирээк макаладан окуй аласыз "kubectl иштеткенде, Kubernetesте эмне болот?«.
Системанын аудити демейки боюнча өчүрүлгөн Kubernetesтин кызыктуу өзгөчөлүгү. Ал бардык чалууларды Kubernetes API'ге киргизүүгө мүмкүндүк берет. Сиз ойлогондой, мониторинг жана кластердин абалын өзгөртүү менен байланышкан бардык аракеттер ушул API аркылуу аткарылат. Анын мүмкүнчүлүктөрүнүн жакшы сүрөттөлүшүн (адаттагыдай эле) табууга болот расмий документтер K8s. Андан ары мен теманы жөнөкөй тилде берүүгө аракет кылам.
Ошентип, аудитти иштетүү үчүн, биз api-сервердеги контейнерге үч талап кылынган параметрди өткөрүп беришибиз керек, алар төмөндө кеңири сүрөттөлөт:
Бул үч керектүү параметрден тышкары, аудитке байланыштуу көптөгөн кошумча орнотуулар бар: журналды айлантуудан вебхук сүрөттөмөлөрүнө чейин. Журналды айлантуу параметрлеринин мисалы:
--audit-log-maxbackup=10
--audit-log-maxsize=100
--audit-log-maxage=7
Бирок биз аларга кененирээк токтолбойбуз - бардык чоо-жайын бул жерден таба аласыз kube-apiserver документтери.
Жогоруда айтылгандай, бардык параметрлер манифестте 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-мастерлерде:
Аудитти иштетүүдө муну эстен чыгарбоо керек кубе-аписервердеги жүк көбөйөт. Атап айтканда, суроо-талап контекстти сактоо үчүн эстутум керектөө көбөйөт. Каттоо жооптун аталышы жөнөтүлгөндөн кийин гана башталат. Жүктөө аудит саясатынын конфигурациясынан да көз каранды.
Саясаттын мисалдары
Мисалдарды колдонуу менен саясат файлдарынын структурасын карап көрөлү.
Бул жерде жөнөкөй файл policyденгээлде баарын журналга Metadata:
Саясатта сиз колдонуучулардын тизмесин көрсөтө аласыз (Users и ServiceAccounts) жана колдонуучулар топтору. Мисалы, биз системанын колдонуучуларын этибарга албайбыз, бирок калгандарынын баарын өз деңгээлинде киргизебиз Request:
этиштер (этиштер: get, update, delete жана башкалар);
ресурстар (ресурстары, Атап айтканда: pod, configmaps ж.б.) жана ресурстук топтор (apiGroups).
Көңүл буруңуздар! Ресурстарды жана ресурстук топторду (API топтору, б.а. apiGroups), ошондой эле алардын кластерде орнотулган версияларын төмөнкү буйруктар аркылуу алууга болот:
Аудиттик окуяларга тез жооп берүү үчүн, мүмкүн вебхукту сүрөттөп бериңиз. Бул маселе камтылган расмий документтер, Мен аны бул макаланын чегинен тышкары калтырам.
натыйжалары
Макалада жекелештирилген колдонуучу каттоо эсептерин түзүүгө, алардын укуктарын бөлүүгө жана алардын аракеттерин жазууга мүмкүндүк берген Kubernetes кластерлериндеги негизги коопсуздук механизмдерине сереп берилген. Бул теориялык же практикалык жактан ушундай маселелерге туш болгондорго пайдалуу болот деп ишенем. Мен ошондой эле "PS"те берилген Kubernetesтеги коопсуздук темасы боюнча башка материалдардын тизмесин окууну сунуштайм - балким, алардын арасында сиз үчүн тиешелүү болгон көйгөйлөр боюнча керектүү маалыматтарды таба аласыз.