Глава 5. Настройка границ безопасности Kubernetes

Границы безопасности отделяют домены безопасности, в которых некое множество логических элементов совместно используют одни и те же интересы безопасности и уровни доступа, в то время как границы доверенных отношений выступают некой разделительной линией, по которой исполнение программы и изменения данные меняют уровень доверия. Управления в установленных границах безопасноти обеспечивают что перемещающееся между границами выполнение не превышает устновленный уровень доверия без надлежащего утверждения. При перемещении данных и исполнения между через границы без надлежащих мер контроля проявляются уязвимости.

В этой главе мы обсудим собственно важность безопасности и граиц доверительных отношений. Вначале мы сосредоточимся на введении для прояснения всей возможной путаницы между безопасностью и границами доверительных отношений. Далее мы пройдёмся по доменам безопасности и границам безопасности внутри экосистеме Kubernetes. Наконц, мы рассмотрим некотрые функциональные возможности Kubernetes, которые расширяют границы безопасности для развёрнутого в Kubernetes приложения.

Вы должны понимать основные понятия домена безопасности и грниц безопасности, а также разбираться в тех границах безопасности, которые выстраиваются вокруг Kubernetes на основании лежащей в основе технологии контейнера, а также за счёт встроенных функциональных возможностей безопасности, например, PodSecurityPolicy и NetworkPolicy.

В этой главе мы рассмотрим следующие вопросы:

  • Введение в границы безопасности

  • Сопоставление границ безопасности и границ доверительных отношений

  • Домены безопасности Kubernetes

  • Логические элементы Kubernetes в качестве границ безопасности

  • Границы безопасности на системном уровне

  • Границы безопасности на сетевом уровне

Введение в границы безопасности

Границы безопасности присутствуют на уровне данных, сетевом уровне и системном уровне. Границы безопасности щависят от технологий, которые используются соответствующим подразделением ИТ или командой инфраструктуры. Например, когда команды используют виртуальные машины для управления их приложениями - границы для виртуальных машин пролегают в гипервизоре. Гипервизоры обеспечивают, что запускаемы в некой виртуальной машине код не выходит из соответствующей виртуальной машины и не воздействуют н сам физический узел. Компании начинают осваивать микрослужбы и применять оркестрторы для управления своими приложениями, одной из границ безопасности являются контейнеры. Тем не менее, по сравнению с гипервизорами, контейнеры не предоставляют строгие границы безопасности и не стремятся к этому. Контейнеры устанавливают ограничения на уровне приложения, но не препятствуют злоумышленникам обходить эти ограничения на уровне ядра.

На сетевом уровне, обычно межсетевые экраны предоставляют сильные границы безопасности приложениям. В архитектуре микрослужб Поды в Kubernetes способны взаимодействовать с прочими. Сетевые политики используются для ограничения взаимодействия между Подами и Службами.

Границы безопасности на уровне данных хорошо известны. Ядра ограничивают доступ на запись к каталогам system или bin только для пользователей root или system это простейший пример границ безопасности на уровне данных. В заключаемых в контейнеры средах, chroot препятствует вмешательству контейнеров в файловые системы прочих контейнеров. Kubernetes реструктурирует развёртывание приложения таким образом, что строгие границы безопасности могут применться как на сетевом уровне, так и на системном уровнях.

Сопоставление границ безопасности и границ доверия

Границы безопасности и границы доверительных отношений часто применяются в качестве синонимов. Несмотря на их схожесть, у этих двух понятий имеется небольшое отличие. Границы доверительных отношений пролегают там, где система изменяет свой уровень доверия. Приведение в исполнение границ доверия, это когда инструкциям для их осуществления требуются различные привилегии. Например, выполняющий код из /bin сервер баз данных выступает примером пересекающего границы доверия исполнения. Точно также, граница доверительного отношения к данным пролегают там, где данные перемещаются между логическими элементами с различными уровнями доверия. Вставвляемые конечным пользователем в обладающую доверием базу данных является примером пересечения данными границ доверительных отношений.

В то время как граница безопасности это некий пункт демаркации между различными областями (доменами) безопасности, домен безопасности это набор логических элементов, которые пребывают внутри одного и того же уровня доступа. Например, в традиционной веб архитектуре ориентированные на пользователя приложения выступают частью домена безопасности, а внутренняя сетевая среда это часть другого домена безопасности. Границы безопасности обладают связанным с ними контролем доступа. Представляйте себе границы доверия как стену, а ограничение безопасности как некий забор вокруг этой стены.

Важно выяволять границы безопасности и доверительных отношений. Это способствует обеспечению надлежащщей проверки инструкций и данных до того как они покинут установленниые границы. В Kubernetes компоненты и объекты выходят за различные границы безопасности. Важно осознавать эти границы для внедрения планов снижения рисков при пересечении злоумышленниками границ безопасности. CVE-2018-1002105 является ярким примером атаки, вызванной отсутствиемроверки границ доверительных отношений; обработка посреднического (прокси) запроса на сервере API сделала возможным для не имеющего аутентификации пользователя заполучить права администратора в этом кластере. Точно так же CVE-2018-18264 сделала возможным пользователям пропускать процесс аутентификации в инструментальной панели для того чтобы позволять пользователям без аутентификации осуществлять доступ к конфиденциальным сведениям кластера.

Давайте рассмотрим различные области безопасности Kubernetes.

Домены безопасности Kubernetes

В широком плане кластер Kubernetes можно подразделить на три области безопасности:

  • Компоненты хозяина Kubernetes: Компоненты хозяина Kubernetes определяют плокость управления для экосистемы всего Kubernetes. Эти компоненты хозяина отвечают за решения, необходимые для гладкой работы всего кластера, например, планирование. Компоненты хозяина включают kube-apiserver, etcd, диспетчер kube-controller, сервер DNS и kube-scheduler. Некая брешь в компонентах хозяина кластера способна скомпрометировать весь кластер Kubernetes целиком.

  • Компоненты исполнителя Kubernetes: Компоненты исполнителя Kubernetes разворачиваются во всех узлах исполнителей и обеспечивают чёткую работу Подов и контейнеров.Компоненты исполнителя Kubernetes для взаимодействия с компонентами их хозяина применяют авторизацию и туннели TLS. Кластер способен продолжть работу со скомпрометированными компонентами исполнителя. Это аналогично некому мошеннеческому узлу внутри данной среды, который можно удалить из данного кластера после его выявления.

  • Объекты Kubernetes: Объекты Kubernetes являются постоянно хрнимыми логическими элементами, которые представляют значение состояния своего кластера: развёрнутые приложения, тома, а также пространства имён. Объекты Kubernetes включают в свой состав Поды, Службы, тома и пространства имён. Они разворачиваются разрботчиками или DevOps. Описания объектов задают дополнительные границы безопасности для объектов: определением какого- то Пода с неким Контекстом безопасности, сетевыми правилами для взаимодействия с прочими Подами и прочее.

Такое подразделение областей безопасности на верхнем уровне должно помочь вам сосредоточиться на самых ключевых средствах. Имейте в виду, мы приступаем к рассмотрению логических элементов Kubernetes и того как возводить вокруг них границы безопасности.

Логические элементы Kubernetes в качестве границ безопасности

В кластере Kubernetes те логические элементы Kubernetes (объекты и компоненты), с которыми вы взаимодействуете обладают своими собственными встроенными границами безопасности. Эти границы безопасности приосходят из самой архитектуры или реализации таких логических элементов. Важно осознавать те границы безопасности, которые воздвигаются внутри или вокруг них:

  • Контейнеры: Контейнеры это основные компоненты внутри кластера Kubernetes. некий контейнер предоставляет минимальную изоляцию своему приложению при помощи cgroup, пространств имён Linux, профилей AppArmor и профиля seccomp для того приложения, которое запущено внутри этого контейнера.

  • Поды: Под это коллекция из одного или более контейнеров. По сравнению с контейнерами поды изолируют дополнительные ресурсы, такие как сетевая среда и IPC. Такие функциональные возможности как SecurityContext, NetworkPolicy и PodSecurityPolicy работают на уровне пода для обеспечения более высокого уровня изоляции.

  • Узлы: Узлы в Kubernetes также некая граница безопасности. Полы могут определяться как запускаемые в определённых узлах с применением nodeSelectors. Ядра и гипервизоры усиливают контроль безопасности для запускаемых в таких узлах подов. Такие функциональные возможнсоти как AppArmor и SELinux могут способствовать улучшению положения безопасности совместно с прочими ориентированными на хосты механизмами.

  • Кластер: Кластер это некая коллекция подов, контейнеров и служб и соответствующих компонентов в узле хозяина или в узлах исполнителей. Кластер предоставлят сильное ограничение безопасности. Запущенные внутри некого кластера поды и контейнеры изолируются от прочих кластеров на сетевом и системном уровнях.

  • Пространства имён: Пространства имён это виртуальные кластеры, которые изолируют поды и службы. Для управления за использованием ресурсов и над атаками отказа в обслуживании (DoS, denial-of-service) контроллер доступа LimitRanger применяется на уровне пространства имён. К уровню пространства имён могут применяться сетевые политики.

  • Сервер API Kubernetes: Сервер API Kubernetes взаимодействует со всеми компонентами Kubernetes, включая etcd, controller-manager и kubelet, которые используются администраторами кластера для настройки кластера. Он выступает посредником во взаимодействии с компонентами хозяина, а потому администраторам кластера не приходится напрямую взаимодействовать с компонентами кластера.

Мы уже обсуждали три различных субъекта угроз в Главе 3, Моделирование угроз: Привилегированные злоумышленники, внутренние злоумышленники и конечные пользователи. Эти субъекты угроз способны также взаимодействовать со всеми предыдущими логическими элементами Kubernetes. Мы рассмотрим с каими из ограничений безопасности сталкиваются эти злоумышленники:

  • Конечные пользователи: Конечные пользователи взаимодействую либо с элементом входа (ingress), либо с выставляемыми службами Kubernetes, или же напрямую с открытыми в соответствующем узле портами. Для такого конечного пользователя защиту кластера от компрометации предоставляют узлы, Поды, kube-apiserver и внешние межсетевые экраны.

  • Внутренние злоумышленники: Внутренние злоумышленники обладают доступом к подам и контейнерам. Эскалации полномочий или компрометации всего кластера препятствуют пространства имён и управление доступом, усиленное kube-apiserver. Боковым перемещениям могут препятствовать сетевые политики и контроль RBAC.

  • Привилегированные злоумышленники: единственным защищающим компоненты хозяина от их компрометации привилегированными злоумышленниками ограничением выступает kube-apiserver. Когда привилегированнный злоумышленник скомпрометировал kube-apiserver, игра окончена.

В этом разделе мы рассмотрели ограничения безопасности с точки зрения пользователя и показали вам как возводятся границы безопасности в соответствующей экосистеме Kubernetes. Далее давайте рассмотрим ограничения безопасности на общем системном уровне, с точки зрения микрослужб.

Границы безопасности на уровне самой системы

Микрослужбы исполняются внутри Подов, причём Полы планируются к запуску в узлах исполнителей в кластере. В своих предыдущих главах мы уже делали акцент на то, что некий контейнер это какой- то процесс, которому назначены выделенные пространства имён Linux. Контейнер или Под потребляют все необходимые им ресурсы, предоставляемые соответствующим узлом исполнителя. А потому важно осознавать ограничения безопасности с точки зрения самой системы и то как их возводить. В этом разделе мы обсудим построение границ безопасности поверх пространтсв имён Linux и возможности Linux совместно с микрослужбами.

Пространства имён Linux в качестве границ безопасности

Пространства имён Linux являются функциональной возможностью самого ядра Linux для разбиения ресурсов на части с целью их изоляции. Обладая выделенными им пространствами имён, некий набор процессов наблюдает один набор ресурсов, в то время как другой набор процессов видит иной набор ресурсов. Мы уже вводили пространства имён Linux в Главе 2, Построение сетевой среды Kubernetes {Прим. пер.: более углублённо стреоние пространств имён рассматривается в только что выполненном нами переводе книги Шашанка Мохана Джейна Контейнеры Linux и Виртуализация: с точки зрения ядра, Apress, октябрь 2020}. По умолчанию, каждый Под обладает своим собственным сетевым пространством имён и пространтсвом имён IPC. Всякий контейнер внутри того же самомого пода облдает своим собственным пространством имён PID с тем, чтобы прочие контейнеры не были осведомлены относительно прочих запущенных внутри этого Пода контейнерах. Аналогично, некий Под не осведомлён о прочих имеющихся в том же самом узле исполнителя Подах.

В целом, установки по умолчанию предлагают для микрослужб достаточно неплохую изоляцию со стороны безопасности. Тем не менее, для рабочих потоков Kubernetes в определении конкретного Пода имеется возможность более специфичного выполенния настроек пространства имён самого хоста. При включении таких настроек соответствующая микрослужба пользуется пространствами имён уровня хоста:

  • HostNetwork: Соответствующий Под применяет сетевое пространство имён своего хоста.

  • HostIPC: Этот Под применяет пространство имён IPC своего хоста.

  • HostPID: Определяемый Под использует пространство имён PID своего хоста.

  • shareProcessNamespace: Все контейнеры внутри обдного и того же Поа будут совместно применять единое пространство имён PID.

Когда вы попытаетесь настроить свой рабочий поток на использование пространств имён хоста, задаёте себе такой вопрос: зачем вам приходится делать это? При применении пространства имён хоста поды получают полные сведения о действиях прочих подов в том же самом узде исполнителя, но это также зависит и от того какие возможности Linux назначаются такому контейнеру. В общем, всё дело в том, что вы разоружаете ограничения безопасности прочих микрослужб. Позвольте мне привести быстрый пример. Вот перечень процессов, видимых внутри некого контейнера:


root@nginx-2:/# ps aux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.1  0.0  32648  5256 ?        Ss   23:47   0:00 nginx: master process nginx -g daemon off;
nginx          6  0.0  0.0  33104  2348 ?        S    23:47   0:00 nginx: worker process
root           7  0.0  0.0  18192  3248 pts/0    Ss   23:48   0:00 bash
root          13  0.0  0.0  36636  2816 pts/0    R+   23:48   0:00 ps aux
 	   

Как вы можете видеть, изнутри нашего контейнера nginx в прочих контейнерах видны только процесс nginx и процесс bash. Этот под nginx не пользуется пространством имён PID хоста. Давайте рассмотрим что происходит когда под пользуется прострнством имён PID хоста:


root@gke-demo-cluster-default-pool-c9e3510c-tfgh:/# ps axu
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.2  0.0  99660  7596 ?        Ss   22:54   0:10 /usr/lib/systemd/systemd noresume noswap cros_efi
root          20  0.0  0.0      0     0 ?        I<   22:54   0:00 [netns]
root          71  0.0  0.0      0     0 ?        I    22:54   0:01 [kworker/u4:2]
root         101  0.0  0.1  28288  9536 ?        Ss   22:54   0:01 /usr/lib/systemd/systemd-journald
201          293  0.2  0.0  13688  4068 ?        Ss   22:54   0:07 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile
274          297  0.0  0.0  22520  4196 ?        Ss   22:54   0:00 /usr/lib/systemd/systemd-networkd
root         455  0.0  0.0      0     0 ?        I    22:54   0:00 [kworker/0:3]
root        1155  0.0  0.0   9540  3324 ?        Ss   22:54   0:00 bash /home/kubernetes/bin/health-monitor.sh container-runtime
root        1356  4.4  1.5 1396748 118236 ?      Ssl  22:56   2:30 /home/kubernetes/bin/kubelet --v=2 --cloud-provider=gce --experimental
root        1635  0.0  0.0 773444  6012 ?        Sl   22:56   0:00 containerd-shim -namespace moby -workdir /var/lib/containerd/io.contai
root        1660  0.1  0.4 417260 36292 ?        Ssl  22:56   0:03 kube-proxy --master=https://35.226.122.194 --kubeconfig=/var/lib/kube-
root        2019  0.0  0.1 107744  7872 ?        Ssl  22:56   0:00 /ip-masq-agent --masq-chain=IP-MASQ --nomasq-all-reserved-ranges
root        2171  0.0  0.0  16224  5020 ?        Ss   22:57   0:00 sshd: gke-1a5c3c1c4d5b7d80adbc [priv]
root        3203  0.0  0.0   1024     4 ?        Ss   22:57   0:00 /pause
root        5489  1.3  0.4  48008 34236 ?        Sl   22:57   0:43 calico-node -felix
root        6988  0.0  0.0  32648  5248 ?        Ss   23:01   0:00 nginx: master process nginx -g daemon off;
nginx       7009  0.0  0.0  33104  2584 ?        S    23:01   0:00 nginx: worker process
 	   

Наш предыдущий вывод отображает все запущенные в узле исполнителя процессы из контейнера nginx. Помимо этих процессов имеются системные процессы, такие как sshd, kubelet, kube-proxy и тому подобные. Помимо применения этим Подом пространства имён своего хоста, вы способны отправлять сигналы в прочие процессы микрослужб, например, SIGKILL для уничтожения некого процесса.

Возможности Linux как границы безопасности

Возможности Linux это некое понятие, вовлекаемое из проверки полномочий традиционного Linux: привилегированные и без привилегий. Привилегированные процессы обходят все проверки полномочий ядра. Далее Linux подразделяет ассоциируемые с суперпользовтелями Linux полномочия на отличающиеся элементы - возможности Linux. Имеются относящиеся к сетевой среде возможности, такие как CAP_NET_ADMIN, CAP_NET_BIND_SERVICE, CAP_NET_BROADCAST и CAP_NET_RAW. А также связанные с аудитом возможности: CAP_AUDIT_CONTROL, CAP_AUDIT_READ и CAP_AUDIT_WRITE. Естественно, всё ещё существуют и возможности подобные администрированию: CAP_SYS_ADMIN.

Как это уже упоминалось в Главе 4, Применение принципа наименьших прав в Kubernetes, вы имеете возможность настройки возможностей Linux для уонтейнеров в неком поде. Вот список устанавливаемых по умолчанию возможностей, которые выделяются контейнерам в кластерах Kubernetes:

  • CAP_SETPCAP

  • CAP_MKNOD

  • CAP_AUDIT_WRITE

  • CAP_CHOWN

  • CAP_NET_RAW

  • CAP_DAC_OVERRIDE

  • CAP_FOWNER

  • CAP_FSETID

  • CAP_KILL

  • CAP_SETGID

  • CAP_SETUID

  • CAP_NET_BIND_SERVICE

  • CAP_SYS_CHROOT

  • CAP_SETFCAP

Для большинства имеющихся микрослужб этих возможностей должно быть вполне достаточно чтобы они выполняли своих повседневных задач. Вам надлежит отказаться от всех этих возможностей и добавить лишь необходимые. Как и в слцчае с пространством имён хоста, предоставление избыточных возможностей способно разоружать установленные ограничения безопасности прочих микрослужб. Вот некий образец вывода при исполнении в контейнере команды tcpdump:


root@gke-demo-cluster-default-pool-c9e3510c-tfgh:/# tcpdump -i cali01fb9a4e4b4 -v
tcpdump: listening on cali01fb9a4e4b4, link-type EN10MB (Ethernet), capture size 262144 bytes
23:18:36.604766 IP (tos 0x0, ttl 64, id 27472, offset 0, flags [DF], proto UDP (17), length 86)
    10.56.1.14.37059 > 10.60.0.10.domain: 35359+ A? www.google.com.default.svc.cluster.local. (58)
23:18:36.604817 IP (tos 0x0, ttl 64, id 27473, offset 0, flags [DF], proto UDP (17), length 86)
    10.56.1.14.37059 > 10.60.0.10.domain: 35789+ AAAA? www.google.com.default.svc.cluster.local. (58)
23:18:36.606864 IP (tos 0x0, ttl 62, id 8294, offset 0, flags [DF], proto UDP (17), length 179)
    10.60.0.10.domain > 10.56.1.14.37059: 35789 NXDomain 0/1/0 (151)
23:18:36.606959 IP (tos 0x0, ttl 62, id 8295, offset 0, flags [DF], proto UDP (17), length 179)
    10.60.0.10.domain > 10.56.1.14.37059: 35359 NXDomain 0/1/0 (151)
23:18:36.607013 IP (tos 0x0, ttl 64, id 27474, offset 0, flags [DF], proto UDP (17), length 78)
    10.56.1.14.59177 > 10.60.0.10.domain: 7489+ A? www.google.com.svc.cluster.local. (50)
23:18:36.607053 IP (tos 0x0, ttl 64, id 27475, offset 0, flags [DF], proto UDP (17), length 78)
    10.56.1.14.59177 > 10.60.0.10.domain: 7915+ AAAA? www.google.com.svc.cluster.local. (50)
 	   

Приведённый вывод отображает нам, что внутри контейнера имеется tcpdump, осуществляющий ожидание в своём сетевом интерфнйсе, cali01fb9a4e4b4, который был создан для сетевого взаимодействия другого пода. Имия предоставленными сетевое пространство им1н и CAP_NET_ADMIN, вы способны отслеживать сетевой обмен со всего узла исполнителя внутри контейнера. В целом, чем меньше возможностей предоставляется контейнерам, тем больше безопасности для ограничений прочих микрослужб.

Обёртывание границ безопасности на уровне самой системы

Выделенные пространства имён Linux и заданные по умолчанию пределы назначаемых контейнеру или Поду возмжностей Linux устанавливают неплохие ограничения безопасности для микрослужб. Тем не менее, пользовтелям всё ещё дозволяется настраивать пространства имён хоста или добавлять дополнительные возможности Linux в енкую рабочую нагрузку. Это разузорожит установленные для прочих запущенных в том же самом узле исполнителя границы безопасности. Вам следует осуществлять это очень внимательно. Обычно инструменты мониторинга или средства безопасности требуют доступа к пространствам имён хоста чтобы выполнять свои задания мониторинга или задания выявления. А потому настроятельно рекомендуется пользоваться PodSecurityPolicy для ограничения использования пространств имён хоста, а также избыточных возможнотей с тем, чтобы держать взаперти границы безопасности микрослужб.

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

Границы безопасности на сетевом уровне

Сетевая политика Kubernetes определяет необходимые правила для различных групп Подов, которым позволяется взаимодействие друг с другом. В нашей предыдущей главе мы кратко обсудили исходящие правила сетевой политики Kuberneted, которые могут применяться для усиления основного принципа наименьшихполномочий для микрослужб. В этом разделе мы продвинемся слегка далее в сетевые политики Kubernetes и сосредоточимся на его входящих правилах. Мы покажем как входящие правила сетевых политик способны помогать установлению границ доверительных отношений между микрослужбами.

Сетевые политики

Как это уже упоминалось в наших предыдущих главах, согласно требований имеющейся сетевой модели, Поды внутри кластера имеют возможность взаимодействия друг с другом. Но всё- таки, с точки зрения безопасности, вы можете пожелать ограничить свои микрослужбы на доступ всего лишь несколькими службами. Как мы можем достичь этого в Kubernetes? Давайте взглянем на следующий образец сетевой политики Kubernetes:


apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
  namespace: default
spec:
  podSelector:
    matchLabels:
      role: db
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - ipBlock:
        cidr: 172.17.0.0/16
        except:
        - 172.17.1.0/24
    - namespaceSelector:
        matchLabels:
          project: myproject
    - podSelector:
        matchLabels:
          role: frontend
    ports:
    - protocol: TCP
      port: 6379
  egress:
  - to:
    - ipBlock:
        cidr: 10.0.0.0/24
    ports:
    - protocol: TCP
      port: 5978
 	   

Наша политика NetworkPolicy носит название test-network-policy. Здесь неплохо будет перечислить несколько ключевых атрибутов из определения этой сетевой политики чтобы помочь вам разобраться с тем что собой представляют эти ограничения:

  • podSelector: Некая группировка Подов, к которой применяется данная политика на основании меток Подов.

  • ingress: Правила на вход, которые применяются к тем Подам, которые определены на самом верхнем уровне podSelector. Вот обсуждение различных элементов из ingress:

    • ipBlock: Диапазоны IP CIDR, которрым дозволено взаимодействовать с источниками на вход

    • namespaceSelector: Пространства имён, которые разрешены в качестве источников на вход на основании меток пространств имён

    • podSelector: Поды, которые допустимы как источники на вход на основании меток Подов

    • ports: Порты и протоколы, которые включены в качестве источников на вход для взаимодейcтвия с ними

  • egress: Исходящие правила, которые применимы к тем Подам, которые определены на самом верхнем уровне egress

    • ipBlock: Диапазоны IP CIDR, которрым дозволено взаимодействовать с получателем выхода

    • namespaceSelector: Пространства имён, которые разрешены в качестве получателя выхода на основании меток пространств имён

    • podSelector: Поды, которые допустимы как получателя выхода на основании меток Подов

    • ports: Порты и протоколы, которые включены в качестве получателя выхода для взаимодейcтвия с ними

Как правило, ipBlock используется для задания значения внешнего блока, с которым разрешено взаимодействовать этой микрослужбе в её кластере Kubernetes, в то время как селектор пространства имён и селектор Пода применяются для ограничения сетевых взаимодействий между микрослужбами в одном и том же кластере Kubernetes.

Для усиления границ доверительных отношений для микрослужб со стороны сетевой среды вы можете пожелать определить либо значения допустимого ipBlock извне, либо допустимые микрослужбы из определённого пространства имён. Ниже приводится ещё один пример для ограничения значения источника на вход определёнными Подами и пространствами имён при помощи namespaceSelector podSelector:


apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-good
spec:
  podSelector:
    matchLabels:
      app: web
  policyTypes:
  - Ingress
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          from: good
      podSelector:
        matchLabels:
          from: good
 	   

Обратите внимание, что перед podSelector нет никакого атрибута. Это означает, что источником на вход могут быть лишь поды с меткой from: good в значении пространства имён с меткой from: good. Такая сетевая поилитика защищает Полы с меткой app: web в установленном по умолчанию пространстве имён:

 

Рисунок 5-1


Сетевая политика ограничения обмена на вход метками Пода и пространтсва имён

В нашей приведённой выше схеме пространство имён good обладает значением метки from: good, в то время как пространтсво имён bad имеет значение метки from: bad. Это иллюстрирует что только Поды со значением метки from: good в своём пространстве имйн имеющем пометку from: good имеют возможность доступа к нашей службе nginx-web из пространства имён по умолчанию. Прочие Поды, вне зависимости от того будут ли они из пространства имён good, но без значения метки from: good, либо из прочих пространств имён, не смогут получать доступ к нашей службе nginx-web из пространства имён по умолчанию.

Выводы

В этой главе мы обсудили значение важности ограничений безопасности. Понимание установленных областей безопасности и границ безопасности внутри своей экосистемы Kubernetes помогает администраторам осознавать радиус подрыва при некоторой атаке и разрабатывать стратегии смягчения последствий для ограничения ущерба, наносимого в результате атаки. Знание логических элементов Kubernetes является отправной точкой для возведения границ безопасности. Понимание встроенных в сам системный уровени ограничений безопасности при помощи пространств имён Linux и его возможностей это следующий шаг. И последнее, но не по значимости, осознание сетевых политик также критически важно для построения сегментации безопасности в микрослужбах.

После этой главы вы должны усвоить все понятия области безопасности и границ безопасности. Вы также должны разбираться в доменах безопасности, общих логических элементах в Kubernetes, а также в границах безопасности, возводимых внутри и вокруг логических элементов Kubernetes. Вы должны осознавать всю важность применения встроенных функционльных возможностей безопасности, таких как PodSecurityPolicy и NetworkPolicy для тщательных возведения границ безопасности и настройки контекста безопасности рабочих нагрузок.

В своей следующей главе мы обсудим то как делать безопасными компоненты Kubernetes. В частности, имеется ряд подробностей настройки, которым вам надлежит уделять внимание.

Вопросы

  1. Что представляют собой домены безопасности в Kubernetes?

  2. Перечислите общие логические элементы Kubernetes, с которыми вы взаимодействуете.

  3. Как вы можете ограничить пользователю Kubernetes доступ к объектам в конкретном пространстве имён?

  4. Что означает разрешение hostPID для некого пода?

  5. Попробуйте настроить сетевую политику для защиты вашей службы, которая допускает в качестве источников на вход лишь определённые Поды.

Последующее чтение

Сетевые политики Kubernetes

CVE-2018-18264

CVE-2018-1002105

{Прим. пер.: наш перевод книги Шашанка Мохана Джейна Контейнеры Linux и Виртуализация: с точки зрения ядра, изданной Apress в октябре 2020}