Не удалось пройти аутентификацию в серверной части Cloud IAP из HTTP-запроса Cloud Tasks

Я пытаюсь использовать HTTP-запросы Cloud Tasks для доступа к конечной точке Kubernetes за балансировщиком нагрузки HTTPS, защищенным Cloud IAP.

Конечная точка работает, используя любую учетную запись компании Gsuite, как и должно быть, но когда выполняется облачная задача, это журнал Cloud Audit - Data Access (отображаются только важные части)

authenticationInfo: {
}
authorizationInfo: [
  0: {
    permission: "iap.webServiceVersions.accessViaIAP"     
    resource: "projects/<PROJECT_NUMBER>/iap_web/compute/services/<SERVICE_NUMBER>/versions/bs_0"     
    resourceAttributes: {
      service: "iap.googleapis.com"      
      type: "iap.googleapis.com/WebServiceVersion"      
    }
  }
]

status: {
  code: 7    
  message: "PERMISSION_DENIED"    
}

Я использую учетную запись службы вычислительного механизма для создания задачи, поэтому я предоставил этой учетной записи соответствующие разрешения:

сервисный аккаунт вычислительного механизма iam

Когда я создаю задачу, я добавляю адрес электронной почты соответствующей учетной записи службы OIDC в ​​HTTP-запрос.

'oidc_token': {'service_account_email': <PROJECT_NUMBER>[email protected]}}

Я также проверил HTTP-запрос Cloud Tasks на другой конечной точке, и токен носителя аутентификации присутствует.

Я действительно понятия не имею, как заставить это работать. Спасибо за помощь


person Federico Ferri    schedule 21.11.2019    source источник


Ответы (1)


Я обнаружил проблему, OIDC нужна была определенная аудитория для работы с Cloud IAP.

Требуемая аудитория - это идентификатор клиента IAP, который можно найти в API и службах> Учетные данные в разделе идентификаторы клиента OAuth 2.0 с именем, начинающимся с IAP.

Учетные данные OAuth

В качестве примера приведен код Python для добавления задачи, доступ которой может быть предоставлен через Cloud IAP.

# This is the important part, the audience filed is very important! 
oidc_token = {'service_account_email': <PROJECT_NUMBER>[email protected], 'audience': <PROJECT_NUMBER>-<NUMBER_GENERATED_AUTOMATICALLY_BY_IAP>.apps.googleusercontent.com}

http_request = {'http_method': 'POST', 'url': url, 'body': json.dumps(payload).encode(), 'headers': headers, 'oidc_token': oidc_token}
task['schedule_time'] = timestamp
created_task = client.create_task(parent, {'http_request': http_request})
person Federico Ferri    schedule 21.11.2019