Узнайте, как Managed Identity и Key Vault защищают ваши Azure-сервисы. Практические примеры и советы для собеседований. Читайте и применяйте!
В предыдущих частях мы разобрали, как перемещать данные и оркестрировать процессы. Но на собеседовании вас обязательно спросят: как это всё защитить? Эта статья закрывает пробел, связывая безопасность с уже знакомыми сервисами: Service Bus, Function Apps и Logic Apps. Вы узнаете, как Managed Identity и Key Vault радикально упрощают управление секретами и делают вашу архитектуру по-настоящему безопасной.
Managed Identity — это функция Azure, которая даёт ресурсу (Function App, Logic App, VM) автоматически управляемую учётную запись в Azure AD. Это позволяет ресурсу аутентифицироваться в других сервисах Azure без хранения паролей, строк подключения или сертификатов в коде.
Представьте, что у каждого сотрудника отеля есть личный бейдж для входа, а не общий физический ключ, который можно потерять или скопировать. Бейдж привязан к конкретному сотруднику, его можно отозвать индивидуально, и никому не нужно заботиться о защите общего ключа.
// Включение system-assigned identity в портале Azure:
// Function App -> Identity -> System assigned -> Вкл -> Сохранить
// Использование в C#: DefaultAzureCredential автоматически
// обнаруживает и использует Managed Identity при работе в Azure.
using Azure.Identity;
using Azure.Security.KeyVault.Secrets;
var client = new SecretClient(
new Uri("https://your-vault.vault.azure.net/"),
new DefaultAzureCredential()
);
KeyVaultSecret secret = await client.GetSecretAsync("SqlConnectionString");
// В этом коде нет ни пароля, ни строки подключения.
// Managed Identity Function App и есть учётные данные.
// Назначение прав: Azure RBAC, а не хранимый ключ.
// Key Vault -> Управление доступом (IAM) -> Добавить назначение ролей.
// Роль: Key Vault Secrets User
// Назначить: Managed Identity вашей Function AppКомпромисс: Managed Identity действительно почти всегда лучше, чем хранимый секрет для аутентификации Azure-сервисов. Ограничение — он работает только для аутентификации в Azure или сервисах, поддерживающих Azure AD. Если сторонний API принимает только API-ключ, его всё равно придётся где-то хранить — и тут на помощь приходит Key Vault.
Связь с предыдущими частями: Function App с триггером Service Bus может аутентифицироваться в Service Bus через Managed Identity, а не через строку подключения Shared Access Signature. Тот же паттерн применяется при записи в Azure SQL или вызове другой Function App из Logic Apps. Каждый переход между сервисами в ваших конвейерах — кандидат на использование Managed Identity.
Azure Key Vault — это управляемый сервис для безопасного хранения секретов, ключей шифрования и сертификатов. В связке с Managed Identity он закрывает те случаи, когда секрет нельзя устранить полностью.
Представьте банковское хранилище: ваше приложение имеет ключ-карту (Managed Identity), которая позволяет войти и запросить конкретный секрет, но само приложение не хранит секрет.
Managed Identity устраняет необходимость хранить строки подключения Azure SQL (при использовании Azure AD auth), строки подключения Service Bus (при RBAC) и ключи доступа к Storage (при RBAC). Но в Key Vault всё ещё должны жить: API-ключ партнёра (Salesforce или ServiceNow не знают, что такое Managed Identity), секрет подписи вебхука стороннего сервиса и любые учётные данные для систем вне Azure.
// Ссылка на Key Vault в конфигурации App Service —
// для этого паттерна не нужен SDK.
// App Service -> Конфигурация -> Параметры приложения
// Имя: SalesforceApiKey
// Значение: @Microsoft.KeyVault(SecretUri=https://your-vault.vault.azure.net/secrets/SalesforceApiKey/)
// Читается как обычная настройка:
var apiKey = builder.Configuration["SalesforceApiKey"];
// App Service автоматически разрешает ссылку на Key Vault
// при запуске, используя СВОЮ СОБСТВЕННУЮ Managed Identity
// для аутентификации в Key Vault — два понятия работают вместе.Компромисс: Key Vault имеет реальные затраты за операцию и ограничения по скорости. Он для настоящих секретов, а не для общих настроек вроде размера страницы или флагов функций — те должны жить в обычной конфигурации App Service.
Связь с предыдущими частями: В сценарии из части 2, где Logic App опрашивает REST API партнёра, API-ключ партнёра — именно тот секрет, который должен храниться в Key Vault. Managed Identity не может его устранить, так как партнёрская система не имеет понятия об Azure AD.
VNet Integration позволяет PaaS-сервисам Azure (Function Apps, Logic Apps Standard, App Service) отправлять исходящий трафик через виртуальную сеть, а не через публичный интернет. Это значит, что они могут достигать ресурсов, которые принимают трафик только из частной сети.
Представьте разницу между отправкой письма через публичную почту и использованием внутреннего курьера между двумя зданиями на охраняемой территории. Пункт назначения может быть вообще недоступен для публичной почты — только частный маршрут туда ведёт.
Без VNet Integration Function App достигает Azure SQL через публичный интернет, и брандмауэр Azure SQL должен разрешать доступ с какого-то публичного IP-диапазона. С VNet Integration Function App идёт к Azure SQL через приватный маршрут VNet, а Azure SQL можно настроить на отклонение всего публичного трафика.
// Включение VNet Integration в портале Azure:
// Function App -> Сеть -> VNet Integration -> Добавить VNet
// Выберите существующую VNet и делегированную подсеть.
// Это влияет на ИСХОДЯЩИЕ вызовы из Function App —
// вызовы к Azure SQL, Service Bus, Key Vault и другим сервисам
// теперь могут идти через VNet, если те также настроены
// на приём приватного трафика (через Private Endpoints).Компромисс: VNet Integration требует тарифного плана Premium или выше для App Service / Function App. Он недоступен на уровне Consumption, так что это реальное решение по стоимости и архитектуре, а не просто галочка.
Связь с предыдущими частями: Function App, обрабатывающая чувствительные данные заказов из сценариев части 2, может использовать VNet Integration для доступа к Azure SQL полностью приватно. Даже если HTTP-эндпоинт Function App будет скомпрометирован, злоумышленник не сможет достучаться до базы данных через публичный интернет — такого пути просто не существует.
Обе функции позволяют трафику из VNet достигать PaaS-сервисов Azure более прямым путём, чем через публичный интернет, но работают они принципиально по-разному. Их путают на собеседованиях чаще всего.
Service Endpoint — трафик идёт на публичный IP-адрес сервиса, но по оптимизированному маршруту. Сервис можно настроить на приём трафика только из определённых подсетей VNet. У сервиса остаются публичный IP и публичное DNS-имя, а брандмауэр (например, Azure SQL) ограничивает доступ.
Private Endpoint — сервис Azure получает настоящий приватный IP-адрес внутри вашей VNet. DNS-резолвинг сервиса из VNet теперь даёт приватный IP, а не публичный. Сервис можно настроить на полный отказ от публичного трафика — не просто ограничение по источнику, а отсутствие публичного пути в принципе.
Представьте Service Endpoint как VIP-полосу на входе в публичное здание: вы приходите к тому же зданию, но через отдельную дверь. Private Endpoint — это когда здание целиком перенесли на охраняемую территорию, и публичного входа больше не существует.
// Настройка Private Endpoint в портале Azure:
// Azure SQL Server -> Сеть -> Приватный доступ
// -> Создать Private Endpoint -> выбрать VNet + подсеть
// После этого DNS-имя SQL-сервера резолвится в ПРИВАТНЫЙ IP
// (например, 10.0.1.5) при запросе из VNet, а не в публичный.
// Затем можно включить "Запретить публичный сетевой доступ" —
// сервер становится недоступен из интернета полностью,
// независимо от правил брандмауэра, так как публичного пути нет.Компромисс: Private Endpoints стоят дороже (почасовая оплата за каждый эндпоинт) и добавляют сложности с DNS — часто требуется Private DNS Zone. Service Endpoints проще и бесплатны, но дают более слабую границу безопасности, так как сервис технически остаётся публично достижимым.
Связь с предыдущими частями: Service Bus, Azure SQL и Key Vault — каждая точка выхода и зависимости в конвейерах из частей 1 и 2 — могут быть настроены с Private Endpoint. Это значит, что весь конвейер можно перестроить так, чтобы он не касался публичного интернета ни на одном внутреннем шаге, а публично доступной оставалась только точка входа (например, APIM).
Сетевая группа безопасности (NSG) — это набор правил брандмауэра, применяемых на уровне подсети или отдельного сетевого интерфейса. Они контролируют входящий и исходящий трафик по IP-адресу источника и назначения, порту и протоколу.
Представьте пост охраны в здании со списком: кто может войти, через какую дверь и с чем. Трафик, не соответствующий явному разрешающему правилу и не подпадающий под правило запрета с более высоким приоритетом, просто не проходит.
Ключевые концепции NSG, которые нужно знать точно:
// Пример правила NSG (концептуально, через портал или CLI)
Priority: 100
Name: Allow-HTTPS-Inbound
Direction: Inbound
Source: Internet
Destination: 10.0.1.0/24 (конкретная подсеть)
Port: 443
Protocol: TCP
Action: Allow
Priority: 200
Name: Deny-All-Other-Inbound
Direction: Inbound
Source: *
Destination: *
Port: *
Protocol: *
Action: DenyКомпромисс: NSG — это базовый уровень безопасности, но они не заменяют Private Endpoints. Они работают на уровне сети, а не приложения, и их легко misconfigure. Однако это обязательный элемент защиты периметра.
Начните с аудита ваших существующих Azure-ресурсов. Найдите все места, где в коде или конфигурации хранятся строки подключения или ключи. Замените их на Managed Identity, где это возможно. Для секретов, которые нельзя устранить, создайте Key Vault и перенесите их туда. Затем настройте VNet Integration для критичных Function Apps и добавьте Private Endpoints для Azure SQL и Service Bus. Наконец, убедитесь, что NSG настроены на принцип «запрещено всё, что не разрешено явно». Эти шаги кардинально повысят безопасность вашей архитектуры.
Хочешь закрепить знания на практике?
Решай задачи на Algolit — интерактивная платформа для обучения
Начать бесплатно →