Поддержка подстановочных знаков в Workload Identity Federation
В настоящее время я тестирую это действие Github для аутентификации с ресурсами gcloud с использованием Workload Identity Federation.
Я создал поставщика удостоверений рабочей нагрузки с настраиваемым
repository_ref
сопоставление атрибутов репозитория Github и ветки, из которой использовалось действие Github:
gcloud iam workload-identity-pools providers create-oidc "my-provider" \
--project="${PROJECT_ID}" \
--location="global" \
--workload-identity-pool="my-pool" \
--display-name="Demo provider" \
--attribute-mapping="google.subject=assertion.sub,attribute.repository_owner=assertion.repository_owner,attribute.repository_ref=assertion.repository:assertion.ref" \
--attribute-condition="attribute.repository_owner=username" \
--issuer-uri="https://token.actions.githubusercontent.com"
При предоставлении прав на олицетворение учетной записи службы я могу затем использовать эту команду, чтобы гарантировать, что действие Github запускается из
my_repo
репозиторий
master
ветвь:
gcloud iam service-accounts add-iam-policy-binding "my-service-account@${PROJECT_ID}.iam.gserviceaccount.com" \
--role="roles/iam.workloadIdentityUser" \
--member="principalSet://iam.googleapis.com/${WORKLOAD_IDENTITY_POOL_ID}/attribute.repository_ref/username/my_repo:refs/heads/master"
Хотя это отлично работает для соответствия точному имени ветки, я также хотел бы использовать то же самое для предоставления аутентификации при создании всех тегов с использованием подстановочного знака:
gcloud iam service-accounts add-iam-policy-binding "my-service-account@${PROJECT_ID}.iam.gserviceaccount.com" \
--role="roles/iam.workloadIdentityUser" \
--member="principalSet://iam.googleapis.com/${WORKLOAD_IDENTITY_POOL_ID}/attribute.repository_ref/username/my_repo:refs/tags/*"
На данный момент это не работает. Есть ли планы поддержать это? И есть ли альтернатива, которую я мог бы использовать на данный момент?
Спасибо
2 ответа
Подстановочные знаки AFAIK не поддерживаются.
Попробуйте вместо этого:
--member="principalSet://iam.googleapis.com/${WORKLOAD_IDENTITY_POOL_ID}/attribute.repository/username/my_repo"
Вы можете создать сопоставление, используя регулярное выражениеmatch
функцию (используя ее как атрибут «флаг»), а затем разрешите доступ, когда атрибут флага имеет значение «истина».
В моем случае, например, я добавил следующее сопоставление:attribute.is_version_tag_push
"="assertion.ref.matches(R"^refs/tags/v(\d+\.)?(\d+\.)?(\*|\d+)$") ? "true" : "false"
Примечание. Я создал его с помощью консоли GCP, поэтому вам, вероятно, придется экранировать символы кавычек при использовании команды gcloud.
(т. е. поле будет «истина», когда я добавлю тег с помощьюv*.*.*
шаблон и «ложь» в противном случае)
И затем я установил следующееprincipalSet
на сервисный аккаунт:principalSet://iam.googleapis.com/projects/<PROJECT_ID>/locations/global/workloadIdentityPools/<POOL_ID>/attribute.is_version_tag_push/true
.
Кроме того, особенно в вашем случае, если вы хотите разрешить доступ для любого нажатия тега, вы можете просто использовать командуref_type
Поле Github (может бытьbranch
илиtag
, смотря что нажали)
Некоторые ресурсы, которые могут быть полезны:
- Возможности сопоставления рабочей нагрузки Google
- Документация по выражениям CEL (используется при сопоставлении полей)
- Синтаксис re2 (синтаксис регулярных выражений, используемый CEL)
- Regex 101 (выберите Golang, чтобы проверить синтаксис re2 вашего выражения)
- Доступные атрибуты токена Github
- Атрибуты Github — 2