Да, основная причина всех проблем безопасности заключается в том, что назначение роли участника-участника службы находится на уровне / уровне подписки, что позволяет ему нанести существенный ущерб, особенно если несколько приложений развернуты в одной и той же подписке (например, удалить любой ресурс). группа).
Один из подходов будет:
- Предоставление одна группа ресурсов для хранилища ключей Azure, специфичного для приложения и региона (последнее в случае географически распределенных приложений).
- Подготовьте хранилище ключей Azure в группе ресурсов, созданной на предыдущем шаге.
В нашем случае Управление безопасности отвечало за первые 2 шага, где они отслеживали (например, электронную почту, текстовые сообщения и т. Д.) Любые изменения в хранилище ключей Azure (например, добавляли новые ключи / секреты / сертификаты). / удалено / изменено, изменения разрешений и т. д.).
- Предоставление второй группы ресурсов , которая будет служить контейнером для компонентов приложения (например, функции Azure, SQL Server / базы данных Azure, пространства имен / очередей служебной шины Azure и т. Д.).
- Создайте участника службы и назначьте роль участника для
только группа ресурсов приложения , например:
scope =
/subscriptions/{Subscription Id}/resourceGroups/{Resource Group
Name}
Найдите пример сценария PS для предоставления субъекту службы настраиваемой области в https://github.com/evandropaula/Azure/blob/master/ServicePrincipal/PS/Create-ServicePrincipal.ps1.
- Предоставьте соответствующие разрешения для участника службы в Azure.
Ключ Vault. В нашем случае мы решили иметь отдельный Сервис
Основные учетные записи для развертывания ( разрешения на чтение / запись для ключей / секретов / сертификатов) и времени выполнения ( только для чтения разрешения для ключей / секретов / сертификатов);
Найдите пример сценария PS для установки разрешения участника службы для хранилища ключей Azure на https://github.com/evandropaula/Azure/blob/master/KeyVault/PS/Set-ServicePrincipalPermissions.ps1.
С учетом вышесказанного, при таком подходе есть много неудобств, таких как:
- Процесс (например, через runbook) для предоставления хранилища ключей Azure (включая его группу ресурсов) и группы ресурсов приложения будет находиться вне основного шаблона Terraform, отвечающего за компоненты приложения, что требует координации с различными командами / процессами / инструменты / и т.д.
- Живой сайт с подключением часто включает координацию между несколькими командами для обеспечения достижения целей RTO и MTTM (Среднее время для смягчения).
- Принципал службы сможет удалить группу ресурсов приложения, когда будет выполнено terraform destroy , но не сможет воссоздать при работе терраформ применяется после этого из-за отсутствия разрешения на уровне подписки / области действия. Вот ошибка:
provider.azurerm: Unable to list provider registration status, it is possible that this is due to invalid credentials or the service principal does not have permission to use the Resource Manager API, Azure error: resources.ProvidersClient#List: Failure responding to request: StatusCode=403 -- Original Error: autorest/azure: Service returned an error. Status=403 Code="AuthorizationFailed" Message="The client '' with object id '' does not have authorization to perform action 'Microsoft.Resources/subscriptions/providers/read' over scope '/subscriptions/{Subscription Id}'.".
Да, я знаю, это длинный ответ, но эта тема обычно требует множества межгрупповых обсуждений / мозгового штурма, чтобы убедиться, что меры безопасности, установленные Службой безопасности, выполнены, производительность разработчика не пострадала до такой степени, что это повлияет на графики выпуска и достижения целей RTO / MTTM. Надеюсь, это немного поможет!