Kubernetes rbac analyses
Krane - это простой инструмент статического анализа Kubernetes RBAC. Он определяет потенциальные риски безопасности в дизайне RBAC K8S и вносит предложения о том, как их смягчить. Dashboard Krane представляет текущую осадку безопасности RBAC и позволяет вам перемещаться по его определению.
Вы можете начать работу с Krane, установив его через Helm Dicart в вашем целевом кластере Kubernetes или запустив его локально с Docker.
Предполагается, что у вас установлен Helm CLI на вашей машине.
$ helm repo add appvia https://appvia.github.io/krane
$ helm repo update
$ helm install krane appvia/krane --namespace krane --create-namespaceСледите за выводом установки Helm Destration о том, как приборной панели порта.
Предполагается, что у вас есть Docker, работающий на вашей локальной машине. Установите Docker-Compose, если вы еще этого не сделали.
Кран зависит от повторного графа. Стек docker-compose определяет все, что требуется для создания и запуска Krane Service на местном уровне. Это также позаботится о его зависимости RedIsGraph.
docker-compose up -d
Изображение Krane Docker будет предварительно построено автоматически, если еще не присутствует на локальной машине.
Обратите внимание, что при запуске docker-compose Locally Krane не запускает отчет RBAC и приборной панели автоматически. Вместо этого контейнер будет спать по умолчанию в течение 24 часов - это значение можно скорректировать в docker-compose.override.yml . Exec в запущенный контейнер Krane для запуска команд. Local docker-compose также установит конфигурацию Kube ( ~/.kube/config ) внутри контейнера, позволяя вам запускать отчеты против любых кластеров Kubernetes, к которым у вас уже есть доступ.
Exec в работает контейнер Krane.
docker-compose exec krane bash Оказавшись в контейнере, вы можете начать использовать команды krane . Попробуйте krane -help .
krane -hЧтобы проверить, какие услуги работают, и связанные порты:
docker-compose ps
Чтобы остановить Krane и его службы зависимости:
docker-compose down
$ krane --help
NAME:
krane
DESCRIPTION:
Kubernetes RBAC static analysis & visualisation tool
COMMANDS:
dashboard Start K8s RBAC dashboard server
help Display global or [command] help documentation
report Run K8s RBAC report
GLOBAL OPTIONS:
-h, --help
Display help documentation
-v, --version
Display version information
-t, --trace
Display backtrace when an error occurs
AUTHOR:
Marcin Ciszak <[email protected]> - Appvia Ltd <appvia.io>
kubectlЧтобы запустить отчет против работающего кластера, вы должны предоставить контекст Kubectl
krane report -k <context>
Вы также можете передать флаг -c <cluster-name> , если планируете запустить инструмент против нескольких кластеров и индексного графа RBAC отдельно для каждого имени кластера.
Чтобы запустить отчет против локальных файлов RBAC YAML/JSON, предоставьте путь каталога
krane report -d </path/to/rbac-directory>
Примечание: Krane ожидает следующих файлов (в формате YAML или JSON), которые будут присутствовать в указанном пути каталога:
Если политики безопасности POD не используются, вы можете обойти ожидание выше, создав файл psp вручную со следующим контентом:
{
"items" : []
} Примечание, PodSecurityPolicy была устарела в Kubernetes V1.21 и удален из Kubernetes в V1.25.
Для запуска отчета из контейнера, работающего в Kubernetes Cluster
krane report --incluster
Примечание. Сервисная учетная запись, используемая Krane , потребует доступа к ресурсам RBAC. Смотрите предпосылки для деталей.
Чтобы подтвердить определение RBAC как шаг в конвейере CI/CD
krane report --ci -d </path/to/rbac-directory>
Примечание: Krane ожидает, что для файлов ресурсов RBAC будет выполнено определенные соглашения об именах. См. Раздел выше. Чтобы запустить команды krane , рекомендуется, чтобы CI Executor ссылается на Quay.io/appvia/krane:latest Docker Image.
Режим CI включен флаг --ci . Krane вернет не нулевой код состояния вместе с деталями нарушения правил риска, когда будет обнаружен одна или несколько опасностей.
Чтобы просмотреть дерево Facets RBAC, сетевой график и последних результатов отчетов, вам нужно сначала запустить сервер Dashboard.
krane dashboard
Cluster Flag -c <cluster-name> может быть передан, если вы хотите запустить приборную панель против определенного имени кластера. Панель инструментов будет искать данные, связанные с указанным именем кластера, которое кэшируется в файловой системе.
Команда выше запустит локальный веб -сервер на порту 8000 по умолчанию и отобразит ссылку на приборную панель.
Индексы Krane RBAC ведут в Redisgraph. Это позволяет нам эффективно запросить сеть зависимостей и просто использовать подмножество CypherQL, поддерживаемого RedIsgraph.
Следующие узлы создаются на графике для соответствующих объектов RBAC:
Psp - узел PSP, содержащий атрибуты вокруг политики безопасности POD. Применимо только при работе с K8S <1,25.Rule - Узел правила представляет правило контроля доступа вокруг ресурсов Kubernetes.Role - Ролевой узел представляет собой данную роль или кластеррол. kind атрибут определяет тип роли.Subject - субъект представляет всех возможных участников в кластере ( kind : пользователь, группа и ServiceAccount)Namespace - Kubernetes пространство имен. :SECURITY - определяет связь между правилом и узлами PSP. Применимо только при работе с K8S <1,25.:GRANT - определяет связь между роли и правилом, связанным с этой ролью.:ASSIGN - определяет связь между актером (субъектом) и заданной ролью/кластером (ролевой узел).:RELATION - определяет связь между двумя разными узлами актера (субъект).:SCOPE - определяет связь между роли и узлами пространства имен.:ACCESS - определяет связь между субъектом и узлами пространства имен.:AGGREGATE -определяет связь между кластерами (один кластеррол агрегирует другую) A-(aggregates)->B:COMPOSITE -определяет связь между кластерами (один кластеррол может быть агрегирован в другом) A<-(is a composite of)-B Все края являются двунаправленными, что означает, что график может быть запрошен в любом направлении. Только исключения :AGGREGATE и :COMPOSITE отношения, которые являются однонаправленными, хотя и связаны с одинаковыми краевыми узлами.
Чтобы напрямую запросить график, вы можете выполнить в работающий контейнер redisgraph , запустите redis-cli и запустите свои произвольные запросы. Следуйте официальным инструкциям для примеров команд.
Вы также можете запросить график из консоли Krane . Сначала выполните запуск krane Container, затем
# Start Krane console - this will open interactive ruby shell with Krane code preloaded
console
# Instantiate Graph client
graph = Krane :: Clients :: RedisGraph . client cluster : 'default'
# Run arbitrary CypherQL query against indexed RBAC Graph
res = graph . query ( %Q(
MATCH (r:Rule {resource: "configmaps", verb: "update"})<-[:GRANT]-(ro:Role)<-[:ASSIGN]-(s:Subject)
RETURN s.kind as subject_kind, s.name as subject_name, ro.kind as role_kind, ro.name as role_name) )
# Print the results
res . print_resultset # Results...
+----------------+--------------------------------+-----------+------------------------------------------------+
| subject_kind | subject_name | role_kind | role_name |
+----------------+--------------------------------+-----------+------------------------------------------------+
| ServiceAccount | bootstrap-signer | Role | system:controller:bootstrap-signer |
| User | system:kube-controller-manager | Role | system::leader-locking-kube-controller-manager |
| ServiceAccount | kube-controller-manager | Role | system::leader-locking-kube-controller-manager |
| User | system:kube-scheduler | Role | system::leader-locking-kube-scheduler |
| ServiceAccount | kube-scheduler | Role | system::leader-locking-kube-scheduler |
+----------------+--------------------------------+-----------+------------------------------------------------+
Примечание. Пример запроса выше выберет всех субъектов с назначенными ролями/кластерами, предоставляющими доступ к update configmaps .
Правила риска RBAC определяются в файле правил. Структура каждого правила в значительной степени является самоэкспланирующей. Встроенный набор может быть расширен / переопределен, добавив дополнительные пользовательские правила в файл правил Cutom.
Макросы представляют собой «контейнеры» для набора общих/общих атрибутов и ссылки на один или несколько правил риска. Если вы решите использовать макрос в заданном правиле риска, вам нужно будет ссылаться на него по имени, например macro: <macro-name> . Обратите внимание, что атрибуты, определенные в указанном macro будут иметь приоритет над теми же атрибутами, определенными на уровне правила.
Макро может содержать любые из следующих атрибутов:
query - запрос Redisgraph. Имеет приоритет над template . Требуется, чтобы writer был определен.writer - Писатель - это рубиновое выражение, используемое для форматирования набора результатов query . У писателя есть приоритет над template .template - встроенное имя запроса/писателя. Если query & writer не указаны, то выбранный генератор запросов будет использоваться вместе с соответствующим писателем. Правило может содержать любой из следующих атрибутов:
id [требуется] идентификатор правила является уникальным идентификатором правила.
group_title [требуется] заголовок, применяя все элементы, попадающие под эту проверку риска.
severity [требуется] тяжесть, как одно из: опасность: предупреждение:: Информация.
info [требуется] текстовая информация о проверке и предложениях о том, как смягчить риск.
query [conditonal] redisgraph Query.
template . Требуется, чтобы writer был определен. writer [Conditonal] писатель - это рубиновое выражение, используемое для форматирования набора результатов запроса.
template . Требует, чтобы query был определен. template [conditonal] встроенный запрос/писательский шаблон. Если query & writer не указаны, то выбранный генератор запросов будет использоваться вместе с соответствующим писателем.
Некоторые встроенные шаблоны требуют, чтобы атрибут match_rules был указан на индивидуальном уровне правил, чтобы построить правильный запрос. Шаблоны в настоящее время требуют этого:
match_rules . Сгенерированный графический запрос возвращает следующие столбцы: match_rules [conditonal] требуется, когда template полагается на правила соответствия, чтобы построить запрос.
match_rules :
- resources : ['cronjobs']
verbs : ['update'] custom_params [Необязательно] Список пользовательских пар клавиш, которые будут оценены и заменены в query и представление writer .
custom_params :
- attrA : valueA
- attrB : valueB{{attrA}} и {{attrB}} будут заменены на valueA и valueB соответственно. threshold [необязательное] числовое значение. При определении это станет доступным в виде шаблона заполнителя {{threshold}} в выражении writer .
macro [необязательно] Ссылка на общие параметры, определенные в названном макросе.
disabled [необязательно] При установке true он отключит данное правило и исключит его из оценки. По умолчанию все правила включены.
- id : verbose-rule-example
group_title : Example rule
severity : :danger
info : Risk description and instructions on how to mitigate it goes here
query : |
MATCH
(s:Subject)-[:ACCESS]->(ns:Namespace)
WHERE
NOT s.name IN {{whitelist_subject_names}}
RETURN
s.kind as subject_kind,
s.name as subject_name,
COLLECT(ns.name) as namespace_names
ORDER BY
subject_kind,
subject_name,
namespace_names DESC
threshold : 2
writer : |
if result.namespace_names.count > {{threshold}}
"#{result.subject_kind} #{result.subject_name} can access namespaces: #{result.namespace_names.join(', ')}"
end
disabled : true Приведенный выше пример явно определяет query на график, который используется для оценки риска RBAC, и выражение writer , используемое для форматирования набора результатов запроса. Запрос просто выбирает все Subjects (за исключением белого списка) и Namespaces к которым они имеют доступ. Обратите внимание, что набор результатов будет включать только Subjects , имеющие доступ к более чем 2 пространствам имен (замеченное threshold значение там?). Выражение последнего writer будет отражено в виде форматированного вывода элемента результата.
writer может получить доступ к элементу набора результатов через объект result с методами, соответствующими элементам, возвращаемым запросом, например, result.subject_kind , result.subject_name и т. Д.
Примечание:
{{threshold}} Заполнитель в выражении writer будет заменен значением ключевого слова threshold .{{whitelist_subject_names}} представляет собственное поле, которое будет интерполировано с значениями белых списков, определенных для данного id правила. Если имя поля заполнителя не определена в белом списке, оно будет заменено пустым массивом [''] по умолчанию. Узнайте больше о белом списке ниже. Встроенные шаблоны значительно упрощают определение правила риска, однако они предназначены для извлечения конкретного вида информации и могут не подходить для ваших пользовательских правил. Если вы обнаружите, что повторно используете те же выражения query или writer по нескольким правилам, вам следует рассмотреть возможность извлечения их на macro и ссылаться на его в своих пользовательских правилах, чтобы их высохнуть.
- id : risky-any-verb-secrets
group_title : Risky Roles/ClustersRoles allowing all actions on secrets
severity : :danger
info : Roles/ClusterRoles allowing all actions on secrets. This might be dangerous. Review listed Roles!
template : risky-role
match_rules :
- resources : ['secrets']
verbs : ['*'] Пример выше показывает одно из встроенных правил. Он ссылается на risky-role шаблон, который при обработке будет расширять правило, внедряя query и выражения writer до триггеров оценки правила. match_rules будет использоваться для создания соответствующего запроса на совпадение.
Необязательный белый список содержит набор пользовательских имен атрибутов и соответствующие (белые) значения.
Имена атрибутов и их значения произвольны. Они определены в файле белого списка и разделены на три отдельных раздела:
global - область высокого уровня. Пользовательские атрибуты, определенные здесь, будут применяться ко всем правилам риска независимо от имени кластера.common - пользовательские атрибуты будут охвачены конкретным id правила риска независимо от имени кластера.cluster (с вложенным списком имен кластеров) - Пользовательские атрибуты будут применяться к конкретному id правила риска для данного имени кластера. Каждое правило риска после оценки будет пытаться интерполировать всех заполнителей параметров, используемых в query , например {{your_whitelist_attribute_name}} . Если имя параметра заполнителя (то есть имя между двойными вьющимися кронштейнами) соответствует любому из имен атрибутов в белом списке для этого id правила риска, оно будет заменено своим расчетным значением. Если для данного заполнителя не найдено значений, он будет заменен [''] .
Пример белого списка ниже создает следующее сопоставление placeholder-key => value для правила риска с соответствием значения атрибута id «Некоторый риск-идентификатор»
{{whitelist_role_names}} => ['acp:prometheus:operator']
{{whitelist_subject_names}} => ['privileged-psp-user', 'another-user']
Приведенные выше клавиши заполнителей при использовании в запросах на пользовательский график будут заменены их соответствующими значениями при оценке правила риска.
Пример:
---
rules :
global : # global scope - applies to all risk rule and cluster names
whitelist_role_names : # custom attribute name
- acp:prometheus:operator # custom attribute values
common : # common scope - applies to specific risk rule id regardless of cluster name
some-risk-rule-id : # this corresponds to risk rule id defined in config/rules.yaml
whitelist_subject_names : # custom attribute name
- privileged-psp-user # custom attribute values
cluster : # cluster scope - applies to speciifc risk rule id and cluster name
default : # example cluster name
some-risk-rule-id : # risk rule id
whitelist_subject_names : # custom attribute nane
- another-user # custom attribute values Кран может быть развернут в локальных или удаленных кластерах Kubernetes.
Cubernetes пространство имен, учетная запись сервиса вместе с соответствующим RBAC должна присутствовать в кластере. См. Предварительные условия для справки.
По умолчанию krane entrypoint выполняет Bin/Incluster-Run, который ожидает, что экземпляр Redisgraph станет доступным до запуска цикла отчета RBAC и веб-сервера DANSBOARD .
Вы можете контролировать определенные аспекты выполнения кластера со следующими переменными среды:
KRANE_REPORT_INTERVAL - определяет интервал за секунды для отчета о статическом анализе RBAC. По умолчанию: 300 (в секундах, то есть 5 минут).KRANE_REPORT_OUTPUT - Определяет формат вывода отчета о рисках RBAC. Возможные значения :json , :yaml ,: :none . По умолчанию :: :json .Прежде чем мы начнем, вам понадобятся следующие инструменты:
Установите Helm Dicart:
$ helm repo add appvia https://appvia.github.io/krane
$ helm repo update
$ helm install krane appvia/krane --namespace krane --create-namespaceСм. Falie.yaml File для получения подробной информации о других параметрах и параметрах.
kubectl create
--context < docker-desktop >
--namespace krane
-f k8s/redisgraph-service.yaml
-f k8s/redisgraph-deployment.yaml
-f k8s/krane-service.yaml
-f k8s/krane-deployment.yamlОбратите внимание, что сервис Dashboard Krane не выявляется по умолчанию!
kubectl port-forward svc/krane 8000
--context= < docker-desktop >
--namespace=krane
# Open Krane dashboard at http://localhost:8000Вы можете найти пример манифестов развертывания в каталоге K8S.
Измените манифесты по мере необходимости для вашего развертывания, чтобы вы ссылались на правильную версию изображения Krane Docker в его файле развертывания. См. Реестр Krane Docker для доступных тегов или просто используйте latest .
Если ваш кластер K8S поставляется со встроенной поддержкой контроллера Compose-on-kubernetes ( docker-desktop поддерживает его по умолчанию), то вы можете развернуть Krane и его зависимости с помощью одной команды стека Docker:
docker stack deploy
--orchestrator kubernetes
--namespace krane
--compose-file docker-compose.yml
--compose-file docker-compose.k8s.yml kraneПРИМЕЧАНИЕ. Убедитесь, что ваш текущий контекст Kube устанавливается правильно перед выполнением вышеуказанной команды!
Стек приложений должен быть теперь развернут в кластере Kubernetes, и все услуги готовы и выставлены. Обратите внимание, что Krane автоматически запустит свой цикл отчетов и сервер приборной панели.
docker stack services --orchestrator kubernetes --namespace krane kraneКоманда выше даст следующий выход:
ID NAME MODE REPLICAS IMAGE PORTS
0de30651-dd5 krane_redisgraph replicated 1/1 redislabs/redisgraph:1.99.7 *:6379->6379/tcp
aa377a5f-62b krane_krane replicated 1/1 quay.io/appvia/krane:latest *:8000->8000/tcp
Проверьте свою позицию в области безопасности Kubernetes Cluster RBAC, посетив http: // localhost: 8000.
Обратите внимание, что для удаленных развертываний кластера вам, вероятно, понадобится сначала для портового обслуживания Krane
kubectl --context=my-remote-cluster --namespace=krane port-forward svc/krane 8000Удалить стек
docker stack rm krane
--orchestrator kubernetes
--namespace kraneКрейн уведомит вас о обнаруженных аномалиях средней и высокой степени тяжести посредством его слабой интеграции.
Чтобы включить уведомления, укажите Slack webhook_url & channel в файле config/config.yaml, или, альтернативно, установите переменные среды SLACK_WEBHOOK_URL и SLACK_CHANNEL . Переменные среды будут иметь приоритет по сравнению с значениями файлов конфигурации.
В этом разделе описываются шаги для обеспечения местного развития.
Установить зависимости кода Krane с
./bin/setup Кран зависит от повторного графа. docker-compose -это самый быстрый способ использовать зависимости Krane на локальном уровне.
docker-compose up -d redisgraphЧтобы осмотреть услуги RedIsGraph истекает:
docker-compose psЧтобы остановить услуги:
docker-compose downНа этом этапе вы должны иметь возможность изменять кодовую базу Krane и результаты тестирования, вызывая команды в локальной оболочке.
$ ./bin/krane --help # to get help
$ ./bin/krane report -k docker-desktop # to generate your first report for
# local docker-desktop k8s cluster
...Чтобы включить режим локальной разработки пользовательского интерфейса Dashboard
$ cd dashboard
$ npm install
$ npm startЭто автоматически запустит сервер мониторинга, откроет браузер по умолчанию и будет просмотреть изменения исходных файлов.
Крайн приходит в предварительный конфигурацию для улучшения опыта разработчика с Skaffold. Итерация в проекте и проверка приложения, запустив весь стек в локальном или удаленном кластере Kubernetes, стало проще. Горячая нагрузка кода позволяет автоматически распространяться локальные изменения в работающий контейнер для более быстрого жизненного цикла разработки.
skaffold dev --kube-context docker-desktop --namespace krane --port-forwardЗапустить тесты локально с
bundle exec rspecМы приветствуем любой вклад сообщества! Посмотрите на наше руководство по вкладу для получения дополнительной информации о том, как начать. Если вы используете Krane , найдите его полезным или, как правило, заинтересованы в безопасности Kubernetes, пожалуйста, сообщите нам об этом, снимаясь в главных ролях и смотрев это репо. Спасибо!
Присоединяйтесь к обсуждению нашего сообщества.
Крейн - это общественный проект, и мы приветствуем ваш вклад. Чтобы сообщить об ошибке, предложите улучшение или запросите новую функцию, пожалуйста, откройте проблему GitHub. Обратитесь к нашему руководству поступающего для получения дополнительной информации о том, как вы можете помочь.
Смотрите нашу дорожную карту для получения подробной информации о наших планах по проекту.
Автор: Marcin Ciszak [email protected]
Copyright (C) 2019-2020 Appvia Ltd
Этот проект распространяется по лицензии Apache, версия 2.0.