Поддержка подстановочных знаков в 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, смотря что нажали)

Некоторые ресурсы, которые могут быть полезны:

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