- PVSM.RU - https://www.pvsm.ru -

В конце марта у фонда CNCF, помогающего развивать Open Source-проекты для облачных (cloud native) приложений, случилось двойное пополнение: в «песочницу» были [1] добавлены [2] OPA (Open Policy Agent) и SPIFFE (Secure Production Identity Framework For Everyone), которых роднит тема безопасности. Для чего же они могут пригодится?
Open Policy Agent [3] (GitHub [4]) — написанный на языке Go движок, предлагающий унифицированный способ использования политик, которые учитывают контекст и работают по всему стеку инфраструктуры, применяемой для облачных приложений.

Инициатива по созданию Open Policy Agent исходит от компании Netflix. Как рассказывали [5] её представители на CloudNativeCon US 2017, этот проект позволил решить проблему авторизации в масштабах крупного облачного окружения. Если вкратце, то инженеры компании хотели обеспечить стандартизированную (и простую) возможность определять и принудительно исполнять правила следующего вида: Субъект (identity, I) может/не может выполнять Операцию (operation, O) на Ресурсе (resource, R) — во всех возможных комбинациях во всей имеющейся экосистеме.
При этом, как легко догадаться, экосистема Netflix весьма разнообразна: в ней не один тип ресурсов (REST-интерфейсы, gRPC-методы, SSH, Kafka topics и т.п.), не один тип субъектов, а также множество используемых протоколов (HTTP/HTTPS, gRPC, свои бинарные), языков программирования (Java, Node.js, Python, Ruby)… Наконец, критичное требование ко всей этой системе — минимальная задержка: например, один узел кластера Kafka обрабатывает тысячи запросов в секунду, поэтому о прослойке, требующей для авторизации более 1 миллисекунды, и речи быть не могло.
Общая схема решения, к которому пришли в Netflix, получилась следующей:

А в более подробном представлении архитектура системы, использующей OPA, выглядит так (слайды взяты из этой презентации [6]):


Политики в OPA пишутся на высокоуровневом декларативном языке (он называется Rego) и загружаются через файловую систему или API. Сервисы передают ответственность за принятие решение по политикам запросом в движок Open Policy Agent, который просматривает политики и дополнительные данные, принимает решение по запросу и возвращает его клиенту. Интеграция приложения с OPA может быть реализована разными методами: sidecar-контейнер, демон на уровне хоста, библиотека. По уверениям авторов, для простых политик средняя задержка составляет около 0,2 мс.
Простейшая иллюстрация использования API от Open Policy Agent представлена в GitHub проекта [4]:
Пользователям можно просматривать свою зарплату и зарплату сотрудников, находящихся в их подчинении:
allow {
input.method = "GET"
input.path = ["salary", id]
input.user_id = id
}
allow {
input.method = "GET"
input.path = ["salary", id]
managers = data.management_chain[id]
id = managers[_]
}
Запрос: Может ли Боб посмотреть свою зарплату?
> input = {"method": "GET", "path": ["salary", "bob"], "user_id": "bob"}
> allow
true
Запрос: Цепочка менеджеров для Боба.
> data.management_chain["bob"]
[
"ken",
"janet"
]
Запрос: Может ли Элис посмотреть зарплату Боба?
> input = {"method": "GET", "path": ["salary", "bob"], "user_id": "alice"}
> allow
false
Запрос: Может ли Джанет посмотреть зарплату Боба?
> input = {"method": "GET", "path": ["salary", "bob"], "user_id": "janet"}
> allow
true
Подробности об устройстве OPA, равно как и о работе с этим движком, описаны в документации проекта [7]. Там же можно найти примеры интеграции с Admission Controllers в Kubernetes [8] (требуется версия K8s 1.9+ и включённый ValidatingAdmissionWebhook), с Docker [9] (требуется Docker Engine 1.11+) и с SSH [10] (используется плагин к Linux-PAM).
Авторы SPIFFE [11] (GitHub [12]) иначе подошли к проблеме аутентификации — они предлагают веб-сервисам фреймворк и набор стандартов, которые упраздняют саму потребность в аутентификации и авторизации на уровне приложений, а также в сложных конфигурациях списков доступа на уровне сети.
Основу SPIFFE составляют три компонента:
spiffe://trust-domain/path), выступающие в роли названия для сущности.Архитектура окружений, использующих предлагаемый в SPIFFE подход, представляется так:

Помимо собственно спецификаций, а также связанных с ними примеров и другой документации, хранящихся в основном репозитории [16] проекта, авторы подготовили эталонную реализацию своих базовых компонентов — SPIRE [17] (the SPIFFE Runtime Environment). Её код написан на языке Go и представляет собой связку из сервера и агента, которые представляют SPIFFE Workload API в действии, т.е. позволяют удостоверять программные системы (workloads, «рабочие нагрузки») и выдавать им SPIFFE IDs и SVIDs.
Workload API от SPIFFE схож с AWS EC2 Instance Metadata API и Google GCE Instance Metadata API в том смысле, что не требует от вызывающей стороны предварительного знания о субъекте или аутентификационного токена. Однако авторы отмечают и важные отличительные особенности своей разработки: 1) она запускается на множестве платформ, б) она позволяет идентифицировать запущенные сервисы не только на уровне процесса, но и на уровне ядра, что позволяет её использовать с планировщиками контейнеров вроде Kubernetes. Для минимизации последствий утечки/компрометации ключа все приватные ключи (и соответствующие сертификаты) живут недолго и подлежат частой (автоматизированной) ротации. Подробнее об архитектуре SPIRE можно почитать здесь [18].
Кроме того, у проекта есть библиотеки на Go (go-spiffe [19]) и C/C++ (C-SPIFFE [20]).
Работа над SPIFFE ведётся в рамках групп SIG (Special Interest Groups) по аналогии с Kubernetes. Среди возглавляющих их специалистов — сотрудники компаний Scytale (инициаторы и главные авторы проекта), Google, Pensando и Blend. В частности, функционируют группы, занимающиеся интеграцией SPIFFE с Kubernetes [21], gRPC [22] и AWS [23].
На сайте SPIFFE заявляется, что проект «находится на ранних этапах реализации и пока не готов для использования в production».
Читайте также в нашем блоге:
Автор: shurup
Источник [30]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/open-source/278172
Ссылки в тексте:
[1] были: https://www.cncf.io/blog/2018/03/29/cncf-to-host-open-policy-agent-opa/
[2] добавлены: https://www.cncf.io/blog/2018/03/29/cncf-to-host-the-spiffe-project/
[3] Open Policy Agent: https://www.openpolicyagent.org/
[4] GitHub: https://github.com/open-policy-agent/opa
[5] рассказывали: https://www.youtube.com/watch?v=R6tUNpRpdnY
[6] этой презентации: https://www.slideshare.net/TorinSandall/how-netflix-is-solving-authorization-across-their-cloud
[7] документации проекта: https://www.openpolicyagent.org/docs/how-does-opa-work.html
[8] Admission Controllers в Kubernetes: http://www.openpolicyagent.org/docs/kubernetes-admission-control.html
[9] Docker: http://www.openpolicyagent.org/docs/docker-authorization.html
[10] SSH: http://www.openpolicyagent.org/docs/ssh-and-sudo-authorization.html
[11] SPIFFE: https://spiffe.io/
[12] GitHub: https://github.com/spiffe
[13] The SPIFFE Identity and Verifiable Identity Document: https://github.com/spiffe/spiffe/blob/master/standards/SPIFFE-ID.md
[14] X.509 SVID: https://github.com/spiffe/spiffe/blob/master/standards/X509-SVID.md
[15] прототип: https://github.com/spiffe/spire/blob/master/proto/api/workload/workload.proto
[16] основном репозитории: https://github.com/spiffe/spiffe
[17] SPIRE: https://github.com/spiffe/spire
[18] здесь: https://spiffe.io/spire/
[19] go-spiffe: https://github.com/spiffe/go-spiffe
[20] C-SPIFFE: https://github.com/spiffe/c-spiffe
[21] Kubernetes: https://github.com/spiffe/spiffe/blob/master/community/sig-integration-k8s/README.md
[22] gRPC: https://github.com/spiffe/spiffe/blob/master/community/sig-integration-grpc/README.md
[23] AWS: https://github.com/spiffe/spiffe/blob/master/community/sig-integration-aws/README.md
[24] Путеводитель CNCF по решениям Open Source (и не только) для cloud native: https://habrahabr.ru/company/flant/blog/350928/
[25] Четыре релиза 1.0 от CNCF и главные анонсы про Kubernetes с KubeCon 2017: https://habrahabr.ru/company/flant/blog/344098/
[26] Rook — «самообслуживаемое» хранилище данных для Kubernetes: https://habrahabr.ru/company/flant/blog/348044/
[27] CoreDNS — DNS-сервер для мира cloud native и Service Discovery для Kubernetes: https://habrahabr.ru/company/flant/blog/331872/
[28] Container Networking Interface (CNI) — сетевой интерфейс и стандарт для Linux-контейнеров: https://habrahabr.ru/company/flant/blog/329830/
[29] Инфраструктура с Kubernetes как доступная услуга: https://habrahabr.ru/company/flant/blog/341760/
[30] Источник: https://habrahabr.ru/post/353808/?utm_campaign=353808
Нажмите здесь для печати.