Глава 4. Применение принципа наименьших прав в Kubernetes

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

В этой главе мы сначала введём сам принцип наименьших полномочий. Учитывая сложность Kubernetes, мы вначале рассмотрим сами предметы Kubernetes, а затем те полномочия, которые доступны этим субъектам. Далее мы обсудим все полномочия объектов Kubernetes и возможные способы их ограничения. Основная цель данной главы состоит в том чтобы помочь вам разобраться с несколькими критически важными понятиями, такими как принцип наименьших полномочий и RBAC (Role-Based Access Control, Управление доступом на основе ролей). В этой главе мы поговорим о различных объектах Kubernetes, таких как пространства имён, учётные записи служб, Роли и Привязке Ролей, а также о функциональных возможностях безопасности Kubernetes, например, контексте безопасности, Политике безопасности пода, а также Сетевой политике, которые могут применяться для усиления реализации основного принципа наименьших полномочий в вашем кластере Kubernetes.

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

  • Принцип наименьших полномочий

  • Субъекты Kubernetes принципа наименьших полномочий

  • Рабочие потоки Kubernetes принципа наименьших полномочий

Принцип наименьших прав

Привилегия - это право (authority) выполнять такое действие как доступ к некому ресурсу или обработка каких- то данных. Принцип наименьших полномочий состоит той идее, что всякий субъект, пользователь, программа, процесс и тому подобное должны обладать лишь минимумом необходимых полномочий для выполнения такой функции. Скажем, Алиса, обычные пользователь Linux, имеет возможность создать некий файл в своём домашнем каталоге. Иначе говоря, Алиса, по крайней мере, обладает полномочиями на создание файлов в её домашнем каталоге. Тем не менее, Алиса может быть не способной создавать файл в каталоге иного пользователя, ибо она не обладает привилегией или полномочиями на выполнение этого. Когда никакая повседневная задача Алисы действительно не пользуется привилегией создания файла в таком домашнем каталоге, но она обладает такими полномочиями, это означает что администратор данной машины не соблюдает принцип наименьших полномочий. В данном разделе мы сначала введём понятие модели авторизации (получения прав доступа), на основе которой и появилась концепция наименьших привилегий, а затем поговорим об основных преимуществах реализации такого понятия наименьших прав.

Модель авторизации

Когда мы говорим о наименьших привилегиях, в большинстве случаев мы ведём разговор в контексте авторизации и в различных средах будут различные модели получения прав доступа (авторизации). Например, в Linux и межсетевых экранах широко применяются ACL (Access Control List , Списки управления доступом), в то время как в системах баз данных используется RBAC. Определение политик авторизации восходит к соответствующему администратору среды чтобы гарантировать наименьшие права на основании доступной в этой системе модели авторизации. Приводимый ниже перечень даёт определения некоторым распространённым моделям авторизации:

  • ACL: Некий ACL определяет список полномочий, ассоциированных с объектами. Он определяет каким субъектам предоставляется доступ к объектам, а также какие операции дозволены для данных объектов. Например, полномочия файла -rw это доступ только на чтение запись (read-write-only) владельцем файла.

  • RBAC: Данное принятие решения на предоставление прав основывается на роли субъекта, который содержится в некой группе полномочий или привилегий. Например, в Linux некий пользователь добавляется в различные группы (такие как stuff) для предоставления доступа к некоторым папкам вместо индивидуального предоставления доступа к папкам в соответствующей файловой системе.

  • Attribute-Based Access Control (ABAC): Это принятие решения на доступ основывается на неких атрибутах субъекта, таких как метки или свойства. Основанное на атрибуте правило проверяет атрибуты пользователя, например, user.id="12345" user.project="project" и user.status="active" для того чтобы решить способен ли некий пользователь выполнять какую- то задачу.

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

Премии принципа наименьших прав

Хотя и может потребоваться достаточно значительное время чтобы осознать чем являются минимальные привилегии для субъекта при осуществлении своих функций, собственно вознаграждения также важны,когда в вашей среде реализован принцип наименьших полномочий:

  • Лучшая безопасность: Внутри угроз, распространение вредоносного ПО, ответвляющих перемещений и тому подобного можно снижать риски при помощи реализации принципа наименьших прав. Утечка Эдварда Сноудена случилась по причине отсутствия наименьших привилегий.

  • Лучшая стабильность: Принимая во внимание что всем субъектам предоставлены исключительно необходимые права, действия субъектов становятся более предсказуемыми. В свою очередь, повышается стабильность системы.

  • Улучшенная читабельность аудита: С учётом того, что всем субъектам предоставлены только необходимые полномочия, впечатляюще снижается сфера аудита. Кроме того, большое число нормативных актов требует реализации принципа наименьших прав в качестве требования соответствия им.

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

Наименьшие права субъектов Kubernetes

Учётные записи служб, пользователи и группы Kubernetes для управления объектами взаимодействуют с kube-apiserver. При включённом RBAC различные пользователи или учётные записи служб могут обладать различными полномочиями для работы с объектами Kubernetes. К примеру, пользователи из группы system:master обладают предоставленной им ролью cluster-admin, что означает, что они способны управлять всем кластером Kubernetes целиком, в то время как пользователи из группы system:kube-proxy могут выполнять доступ только к тем ресурсам, которые необходимы компоненту kube-proxy. Прежде всего, давайте вкратце обсудим что представляет собой RBAC.

Введение в RBAC

Как уже обсуждалось ранее, RBAC это модель регулировки доступа к ресурсам на основе ролей предоставления пользователям или группам. Начиная с версии 1.6 и далее RBAC в Kubernetes включён по умолчанию. Вплоть до версии 1.6 RBAC можно было включать запуская сервер API (Application Programming Interface) с флагом --authorization-mode=RBAC. RBAC упрощает динамическую настройку политик полномочий при помощи сервера API.

Центральные элементы RBAC включают в свой состав следующее:

  1. Субъект (Subject): Учётные записи служб, пользователи или групп, запрашивающие доступ к API Kubernetes.

  2. Ресурсы (Resources): Объекты Kubernetes, к которым требуется доступ со стороны определённого субъекта.

  3. Глаголы (Verbs): Различные типы доступа необходимого субъекту в неком ресурсе - например, создание, обновление, перечисление, удаление (create, update, list, delete).

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

Учётные записи служб, пользователи и группы

Kubernetes поддерживает три типа следующих субъектов:

  • Обычные пользователи (Regular users): Эти пользователи создаются администраторами кластера. Они не имеют соответствующих объектов в самой экосистеме Kubernetes. Администраторы кластера обычно создают пользователей при помощи LDAP (Lightweight Directory Access Protocol), AD (Active Directory) или частных ключей.

  • Учётные записи служб (Service accounts): Поды аутентифицируются (получают права доступа) к соответствующему объекту kube-apiserver при помощи учётной записи службы. Учётные записи служб создаются при помощи вызовов API. Они ограничены пространствами имён и имеют связанные с ними полномочия (credentials), хранящиеся в виде secrets (секретов). По умолчанию поды получают права доступа как учётные записи службы default.

  • Анонимные пользователи (Anonymous users): Всякий запрос, который не привязан ни к обычному пользователю, ни к учётной записи службы, ассоциируется с неким анонимным пользователем.

Администраторы кластера могут создавать новые учётные записи служб, подлежащие ассоциации с подами выполняя такую команду:


$ kubectl create serviceaccount new_account
		

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

Роль

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

Роль ограничена пространством имён. С другой стороны, ClusterRole работает на уровне кластера. Пользователи могут создавать некую ClasterRole, которая распространяется по всему кластеру целиком. ClusterRole может применяться в качестве посредника доступа к ресурсам, которые разбросаны по кластеру, таким как узлы, проверки жизнеспособности, также объектов пространства имён, например, подов по множеству пространств имён. Вот некий простой пример определения роли:


kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: default
  name: role-1
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get"]
 	   

Это простое правило допускает операции get переполнять ресурсы подов в установленном по умолчании пространстве имён. Эта роль может быть создана при помощи kubectl выполнением такой команды:


$ kubectl apply -f role.yaml
		

Пользователь способен создавать или изменять некую роль только когда истинно одно из следующего:

  • Этот пользователь обладает всеми полномочиями, содержащимися в данной роли в той же самой сфере (ограниченной пространством имён или для всего кластера).

  • Данный пользователь связан с некой эскалируемой ролью в данной сфере.

Это препятствует выполнению атак эскалации полномочий пользователям через изменение ролей и полномочий.

Привязка роли

Объект RoleBinding применяется для ассоциации некой роли с субъектами. Аналогично ClusterRole, ClusterRoleBinding способна предоставлять некий набор полномочий субъектам по пространствам имён. Давайте рассмотрим пару примеров:

  1. Создать объект RoleBinding для ассоциации с ролью кластера custom-clusterole к учётной записи demo-sa службы в пространстве имён по умолчанию, например, так:

    
    $ kubectl create rolebinding new-rolebinding-sa \
         --clusterrole=custom-clusterrole \
         --serviceaccount=default:demo-sa
    		
  2. Создать объект RoleBinding для его ассоциации с ролью кластера custom-clusterrole к группе group-1 подобно следующему:

    
    $ kubectl create rolebinding new-rolebinding-group \
         --clusterrole=custom-clusterrole \
         --group=group-1 \
         --namespace=namespace-1
    		

RoleBinding связывает объект с субъектами и делает возможным повторное применение, а также упрощает управление.

Пространства имён Kubernetes

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

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

  • Они позволяют различным приложениям, командам и пользователям работать в одном и том же кластере.

  • Они делают возможным администраторам кластера использовать квоты ресурсов пространства имён для своих приложений.

  • Они применяют политики RBAC для контроля доступа к особым ресурсам внутри пространств имён. RoleBinding помогает администраторам кластера управлять предоставлением полномочий пользователям внутри определённого пространства имён.

  • Они делают возможным сетевую сегментацию при помощи сетевой политики, задаваемой в данном пространстве имён. По умолчанию все поды могут взаимодействовать друг с другом по различным пространствам имён.

По умолчанию, Kubernetes обладает тремя различными пространствами имён. Для их просмотра выполните такую команду:


$ kubectl get namespace
NAME          STATUS    AGE
default       Active    1d
kube-system   Active    1d
kube-public   Active    1d
		

Эти три пространства имён описываются так:

  • default: Пространство имён для ресурсов, которые не являются частью никаких прочих пространств имён.

  • kube-system: Пространство имён для объектов, создаваемых Kubernetes, таких как kube-apiserver, kube-scheduler, controller-manager и coredns.

  • kube-public: ресурсы внутри этого пространства имён доступны всем. По умолчанию в этом пространстве имён не будет создаваться ничего.

Давайте посмотрим как создавать пространство имён.

 

Создание пространства имён

Некое новое пространство имён в Kubernetes можно создать с помощью такой команды:


$ kubectl create namespace test
		

После того как пространство имён создано, пространству имён могут назначаться объекты с применением свойства namespace следующим образом:


$ kubectl apply --namespace=test -f pod.yaml
		

К объектам внутри определённого пространства имён можно осуществлять доступ при помощи свойства namespace так:


$ kubectl get pods --namespace=test
		

В Kubernetes не все объекты ограничены в пространствах имён. Объекты нижнего уровня, такие как Nodes и persistentVolumes перекрываются по пространствам имён.

Обёртывание наименьшими полномочиями субъектов Kubernetes

На данный момент вы должны быть знакомыми с понятиями ClusterRole/Role, ClusterRoleBinding/RoleBinding, учётными записями служб и пространствами имён. Для реализации наименьших полномочий субъектам Kubernetes, прежде чем вы создаёте в Kubernetes некий объект Role или RoleBinding, вы можете задать себе приводимые ниже вопросы:

  • Требуются ли субъекту полномочия для некого пространства имён, или по пространствам имён?

    Это важно по причине того, что как только этот субъект получит полномочия уровня кластера, он станет способен применять эти права по всем пространствам имён.

  • Должны ли эти права предоставляться некому пользователю, группе или учётной записи службы?

    Когда мы предоставляем некую роль группе, это подразумевает, что все пользователи в этой группе автоматически получат такие полномочия данной вновь предоставленной роли. Будьте уверены, что вы осознаёте такое воздействие прежде чем предоставлять некую роль группе. Затем, некий пользователь в Kubernetes предназначается для людей, в то время как учётная запись службы идёт под микрослужбы в подах. Убедитесь что вы понимаете за что отвечает конкретный пользователь Kubernetes и назначайте права должным образом. Кроме того, имейте в виду, что некоторым микрослужбам и вовсе не требуются никакие полномочия, поскольку они не взаимодействуют ни с kube-apiserver, ни с объектами Kubernetes напрямую.

  • К каким именно ресурсам требуется доступ для данного субъекта?

    При создании некой роли, когда вы не задаёте конкретный ресурс, либо устанавливаете в поле resourceNames значение *, это подразумевает, что доступ предоставляется ко всем ресурсам данного типа ресурсов. Если вы знаете к ресурсу с каким именно названием собирается выполнять доступ данный субъект, при сздании рли определяёте название этого ресурса.

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

Наименьшие права для рабочих нагрузок Kubernetes

Обычно будет иметься некая учётная запись службы (default), ассоциируемая с рабочей нагрузкой Kubernetes. Тем самым, процесс внутри пода имеет возможность взаимодействия с kube-apiserver при помощи токена (маркера) этой учётной записи службы. DevOps должны тщательно предоставлять необходимые права такой учётной записи службы исходя из целей наименьших полномочий. Мы уже обсуждали это в своём предыдущем разделе.

Помимо доступа kube-apiserver к работе с объектами Kubernets, процессы в поде способны также получать также доступ к ресурсам в своих узлах исполнителей и прочим подам/ микрослужбам и прочим подам/ микрослужбам в своих кластерах (как это рассматривалось в Главе 2, Построение сетевой среды Kubernetes). В этом разделе мы поговорим относительно реализации наименьших полномочий доступа к системным ресурсам, сетевым ресурсам и ресурсам приложения.

Наименьшие права для доступа к ресурсам системы

Напомним, что некая запущенная внутри какого- то контейнера микрослужба ничто иное, как процесс в узле исполнителя, изолированный в своём собственном пространстве имён. Некци под или контейнер может осуществлять доступ к ресурсам различных типов в своём узле исполнителя на основании установленной конфигурации. Это контролируется его контекстом безопасности, который может настраиваться как на уровне своего пода, так и на уровне самого контейнера. Настройка контекста безопасности соответствующего пода/ контейнера должна иметься в перечне задач самих разработчиков (при помощи проектирования безопасности и его пересмотра), в то время как политики безопасности - иной способ ограничения доступа пода/ контейнера к ресурсам системы на уровне самого кластера - должны присутствовать в списке задач для выполнения DevOps. Давайте взглянем на основные понятия контекста безопасности, политики безопасности пода и управления ограничениями ресурсов.

 

Контекст безопасности

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

  • Discretionary Access Control (DAC) (Допускающий свободу действий контроль доступа): Настраивает какой именно UID (user ID) или GID (group ID) привязывать к основному процессу в этом контейнере, будет ли корневая файловая система этого контейнера доступной только на чтение и тому подобное. Настоятельно не рекомендуется запускать в контейнерах вашу микрослужбу от имени пользователя root (UID = 0). Сам смысл безопасности состоит в том, что если некто воспользуется и контейнер выйдет в свой хост, такой злоумышленник немедленно получит права пользователя root в самом хосте.

  • Security Enhanced Linux (SELinux): Настраивает контекст безопасности SELinux, который задаёт значение метки уровня, метки роли, метки типа и метки пользователя для подов или контейнеров. При назначенных значениях меток SELinux, поды и контейнеры могут ограничиваться в смысле способности доступа к ресурсам, в особенности к томам в соответствующем узле.

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

  • Возможности Linux: Служат для настройки возможностей Linux для контейнеров. Различные возможности Linux позволяют основному процессу внутри своего контейнера выполнять различные действия или осуществлять доступ к различным ресурсам в своём узле. Например, CAP_AUDIT_WRITE позволяет своему процессу выполнять записи в журнал аудита своего ядра, в то время как CAP_SYS_ADMIN делает возможным для своего процесса выполнение некого диапазона административных операций.

  • AppArmor: Настраивает профиль AppArmor для подов или контейнеров. Некий профиль AppArmor обычно задаёт какими возможностями Linux владеет данный процесс, к каким сетевым ресурсам и файлам может выполнять доступ этот контейнер и тому подобное.

  • Secure Computing Mode (seccomp) (режим безопасных вычислений): Настраивает профиль seccomp для подов или контейнеров. Профиль seccomp обычно определяет некий белый перечень системных вызовов, которые допустимо исполнять и чёрный список системных вызовов, которые будут блокироваться для выполнения внутри соответствующего пода или контейнера.

  • AllowPrivilegeEscalation: Служит для настройки того, допустимо или нет процессу получать больше прав, нежели чем у его родительского процесса. Обратите внимание, что AllowPrivilegeEscalation всегда установлен в true, когда его контейнер либо запускается как привилегированный, либо обладает возможностью CAP_SYS_ADMIN.

Мы дополнительно обсудим контекст безопасности в Главе 8, Безопасность Подов Kubernetes.

 

Политика безопасности пода

Соответствующая PodSecurityPolicy это некий ресурс кластера Kubernetes, который управляет атрибутами спецификации пода, относящимися к безопасности. Она определяет некий набор правил. Когда следует создавать поды в соответствующем кластере Kubernetes, эти поды должны выполнять те правила, которые задаются PodSecurityPolicy или же им будет отказано в старте. PodSecurityPolicy контролирует или применяет следующие атрибуты:

  • Допуск запуска привилегированного контейнера

  • Разрешение использования пространств имён уровня хоста

  • Разрешение на применение портов хоста

  • Позволение применения различных типов томов

  • Разрешение лоступа к файловой системе своего хоста

  • Требование для контейнеров запуска с доступной только на чтение корневой файловой системой

  • Ограничение идентификаторов пользователя и групп для контейнеров

  • Ограничение эскалации полномочий контейнера

  • Ограничение возможностей Linux контейнера

  • Требование применения контекста безопасности SELinux

  • Применение к подам профилей seccomp и AppArmor

  • Ограничения на sysctls, которые может применять некий под

  • Допуск применения типа монтирования proc

  • Ограничение некой FSGroup для томов

Мы дополнительно обсудим PodSecurityPolicy в Главе 8, Безопасность Подов Kubernetes. В целом контроль PodSecurityPolicy реализуется в виде некого контроллера доступа. Вы также можете создавать свой собственный контроллер доступа для применения своей собственной политики предоставления прав (authorization) собственным рабочим потокам. Другим хорошим претендентом для реализации вашей собственной политики наименьших полномочий является OPA (Open Policy Agent, Агент открытой политики). Мы дополнительно рассмотрим OPA в Главе 7, Аутентификация, авторизация и контроль доступа.

Теперь же давайте взглянем на механизм управления пределами ресурсов в Kubernetes, поскольку вы можете не захотеть чтобы ваши микрослужбы поглощали в системе все имеющиеся ресурсы, такие как Central Processing Unit (CPU) и оперативная память.

 

Контроль ограничения ресурса

По умолчанию некий отдельный контейнер может использовать так много памяти и ресурсов ЦПУ, солько имеется в узле. Некий контейнер с запущенным исполняемым файлов криптомайнинга запросто способен потребить все ресурсы ЦПУ в том узле, который он совместно использует с прочими подами. Всегда достойным практическим примером является установка запросов и пределов ресурсов для рабочих нагрузок. Запрос ресурса оказывает влияние на то какому узлу установленный планировщик будет назначать такие поды. Во избежание отселения или прекращения для вашей рабочей нагрузки всегда безопасно назначать большие запросы и ограничения. Однако имейте в виду, что если вы установите слишком высокий запрос или предел для ресурса, это приведёт к утрате в вашем кластере ресурсов, а выделенные вашей рабочей нагрузке ресурсы могут использоваться не полностью. Мы дополнительно обсудим эту тему в Главе 10, Мониторинг и управление в реальном времени ресурсами кластера Kubernetes.

Обёртывание наименьшими правами для доступа к ресурсам системы

Когда поды или контейнеры запускаются в привилегированном режиме, в отличии от подов или контейнеров в не привилегированном режиме, они обладают теми же самыми полномочиями, которые имеются у пользователей с правами администратора в неком узле. Когда ваша рабочая нагрузка запускается в привилегированном режиме, в чём именно смысл этого? Когда некий под способен выполнять доступ к пространству имён хоста, этот пост сможет получать доступ к таким ресурсам, как сетевой стек, процесс и IPC (Interprocess Communication) на уровне своего хоста. Но нужно ли вам в самом деле предоставлять доступ к пространству имён уровня хоста или устанавливать привилегированный режим для ваших подов или контейнеров? Кроме того, когда вам известно какие возможности требуются для ваших процессов в их контейнерах, было бы лучше отбросить такие ненужные права. И сколько памяти и ЦПУ достаточно для того чтобы ваша рабочая нагрузка была полностью функциональной? Задумайтесь, пожалуйста, об этих вопросах для целей реализации основного принципа наименьших полномочий под свои рабочии нагрузки Kubernetes. Надлежащим образом устанавливайте запросы и пределы ресурсов, применяйте контекст безопансоти для своих рабочих нагрузок и применяйте для своего кластера PodSecurityPolicy. Всё это поспособствует гарантии наименьших полномочий для ваших рабочих нагрузок при доступе к ресурсам системы.

Наименьшие права для доступа к сетевым ресурсам

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

Допустим, одна из ваших рабочих нагрузок (Под X) в пространстве имён X требуется обладать доступом только к другой Микрослужбе A в пространстве имён NS1; между тем, в пространстве имён NS2 имеется Микрослужба B . Обе микрослужбы, и A, и B выставляют свои терминалы (endpoints) RESTful (Representational State Transfer, Передачи состояния представления).По умолчанию ваша рабочая нагрузка способна получать доступ и к Микрослужбе A, и к Микрослужбе B в предположении что нет никакой аутентификации и авторизации на уровне своих микрослужб, а также не применяются никакие политики в пространствах имён NS1 и NS2, давайте взглянем на следующую схему, иллюстрирующую это:

 

Рисунок 4-1


Сетевой доступ без сетевой политики

На предыдущей схеме Под X способен получать доступ к обеим микрослужбам, хотя они располагаются в различных пространствах имён. Заметьте, что Поду X требуется доступ только к Микрослужбе A в пространстве имён NS1. Итак, есть ли нечто, что мы можем сделать для ограничения доступа Пода X Микрослужбе A для достижения наименьших полномочий? Да: может помочь сетевая политика Kubernetes. Мы рассмотрим сетевые политики в Главе 5, Настройка границ безопасности Kubernetes. В общем, сетевая политика Kubernetes определяет правила того, как некой группе подов допускается взаимодействовать друг с другом и прочими сетевыми терминалами. Вы можете определять для ваших рабочих нагрузок как входящие (ingress) правила, так и исходящие (egress) правила.

[Замечание]Замечание

Входящие (ingress) правила: Правила для определения того, каким источникам разрешается взаимодействие с теми подами, которые пребывают под защитой такой сетевой политики.

Исходящие (egress) правила: Правила для определения того, каким получателям разрешается взаимодействие с теми подами, которые пребывают под защитой такой сетевой политики.

В нашем следующем примере, для реализации нашего принципа наименьших полномочий в Поде X, вам потребуется определить сетевую политику в Пространстве имён X с неким исходящим правилом, предписывающим что разрешён только доступ к Микрослужбе A:

 

Рисунок 4-1


Сетевая политика блокирует доступ к микрослужбе B

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

Наименьшие права для доступа к ресурсам приложения

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

Выводы

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

Kubernetes предлагает встроенный контроль безопасности для реализации рассмотренного принципа наименьших полномочий. Обратите внимание, что это некий процесс от разработки вплоть до развёртывания: разработчики приложения должны сотрудничать с архитекторами безопасности для проектирования наименьших полномочий учётным записям служб, ассоциированных с этим приложением, а также минимальных возможностей и надлежащего выделения ресурсов. На протяжении развёртывания, DevOps должны рассмотреть применение PodSecurityPolicy и сетевой политики для использования преимуществ наименьших полномочий по всему кластеру целиком.

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

Вопросы

  1. Что представляет собой объект Role в Kubernetes?

  2. Что представляет собой объект RoleBinding в Kubernetes?

  3. В чём состоит основное отличие между объектами RoleBinding и ClusterRoleBinding?

  4. По умолчанию, некий под не способен получать доступ к пространству имён уровня хоста. Назовите несколько настроек, которые позволяют подам выполнять доступ в пространствам имён уровня хоста.

  5. Если вы желаете ограничить доступ пода к внешним сетевым ресурсам (например, к внутренней сетевой среде или в Интернету), что мы можем сделать?

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

Вы могли отметить, что некоторые из механизмов контроля безопасности, о которых мы говорили в этой главе, существуют уже давно: MCS/MLS (Multi-Category Security/ Multi-Level Security) SELinux, AppArmor, seccomp, возможности Linux и тому подобное. Уже имеется большое число книг и статей, представляющих введение в эти технологии. Я бы посоветовал вам взглянуть на следующие материалы, чтобы лучше разобраться с тем как их применять для достижения нашей цели наименьших полномочий в Kubernetes:

SELinux MCS: https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/5/html/deployment_guide/sec-mcs-getstarted

AppArmor: https://ubuntu.com/server/docs/security-apparmor

Возможности Linux: http://man7.org/linux/man-pages/man7/capabilities.7.html

Помощь в определении предоставления прав RBAC: https://github.com/liggitt/audit2rbac