Применение политик 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 , чтобы сделать вашу новую политику более гибкой/удобной.

Надеюсь это поможет!

Другие вопросы по тегам