Применение политик OPA для учетной записи ServiceAccount через Gatekeeper в kubernetes
Мы пытаемся заменить наши существующие PSP в kubernetes политиками OPA с помощью Gatekeeper. Я использую шаблоны по умолчанию, предоставленные Gatekeeper https://github.com/open-policy-agent/gatekeeper-library/tree/master/library/pod-security-policy , и определил соответствующие ограничения.
Однако я не могу понять, как применить политику к конкретному
ServiceAccount
. Например. как определить
allow-privilege-escalation
только для ServiceAccount с именем awsnode?
В PSP я создаю роль/кластерную роль для необходимых
podsecuritypolicies
и создайте привязку RoleBinding, чтобы позволить awsnode ServiceAccount использовать требуемый PSP. Я изо всех сил пытаюсь понять, как добиться того же, используя политики OPA Gatekeeper?
Спасибо.
1 ответ
Я думаю, что возможное решение для применения политики OPA Gatekeeper (ConstraintTemplate) к конкретному ServiceAccount состоит в том, чтобы код политики OPA/Rego отражал эту логику фильтрации/выбора. Поскольку вы сказали, что используете уже существующие политики из библиотеки привратника, возможно, вам не подходит изменение кода политики. Но если изменить его можно , я думаю, что ваша политика OPA/Rego может учитывать поле serviceAccount модуля. Имейте в виду, что при использовании OPA Gatekeeper вводом кода политики Rego является весь запрос на допуск, включая спецификацию модуля (при условии, что вы пытаетесь проверить создание модуля).
Таким образом, часть входных данных для кода политики Rego может выглядеть примерно так:
"spec": {
"volumes": [... ],
"containers": [
{
"name": "apache",
"image": "docker.io/apache:latest",
"ports": [... ],
"env": [... ],
"resources": {},
"volumeMounts": [... ],
"imagePullPolicy": "IfNotPresent",
"securityContext": {... }
}
],
"restartPolicy": "Always",
"terminationGracePeriodSeconds": 30,
"dnsPolicy": "ClusterFirst",
"serviceAccountName": "apache-service-account",
"serviceAccount": "apache-service-account",
Таким образом, ссылки на повышение привилегий в библиотеке-привратникеinput.review.object.spec.containers
и находит массив контейнеров типа "apache". Точно так же вы можете изменить код политики, чтобы он ссылался наinput.review.object.spec.serviceAccount
и найдите «apache-service-account». Оттуда нужно использовать эту информацию, чтобы убедиться, что правило «нарушение» соответствует только в том случае, если учетная запись службы является той, к которой вы хотите применить.
Кроме того, можно взять ожидаемое имя учетной записи службы и сделать его параметром ConstraintTemplate , чтобы сделать вашу новую политику более гибкой/удобной.
Надеюсь это поможет!