Рубрики
Без рубрики

Защищенные приложения для консоли Python с Adure AD

На прошлой неделе во время нашего обычного потока мы посмотрели, как защитить приложение Python Console (Daemon / Service) … помеченные Python, Azure, Безопасность.

На прошлой неделе во время нашего обычного потока мы смотрели, как защитить приложение Python Console (Daemon/Service) с Azure Active Directory и приобрести токен, чтобы вызвать API ниже по течению/вверх по течению. Если вы хотите посмотреть, как мы строим, живут по дерганию, вы можете посмотреть наше видео на YouTube

Создайте регистрации Azure AD приложений

Давайте ярлык все это и используйте удивительный .NET Интерактивный ноутбук для провода вверх и настроить наши 2 регистрации приложений. Ноутбук проверяется в репо GitHub. Вам нужно будет настроить свой VS-код, чтобы запустить его, но он должен быть довольно объяснен и предоставляет вам шаги, которые прогуляются к вам процессу. Таким образом, ноутбук будет:

  1. Создайте регистрацию API App
  2. Назначить роль заявки
  3. Создайте директор услуг для приложения API
  4. Создайте регистрацию клиентского приложения для нашего приложения Python Console
  5. Создайте секрет клиента для аутентификации приложения Console к AAD (поток клиентских учетных данных)

API .NET

Для целей этого блога я создал API .NET 5, который извлекает данные из OpenWeatherMap API. Вы можете создать бесплатную учетную запись или изменить код, чтобы вернуть любые другие данные (данные не точка здесь)

Что касается погоды API, я нахожу это отличным сервисом для работы с реальными API и данные, даже для целей данных.

API использует последний Microsoft. Личность. Web .NET Библиотека для провода аутентификации и авторизации. Есть 4 основных компонента

  • Настройки конфигурации AAD
  • Настройки аутентификации API в промежуточном программе
  • Политика для обработки объема и ролевой авторизации
  • Применение политики в контроллер API

Я добавил Кодетур Это идет вас через шаги.

Пойдем….

Открыть appsettings.json и добавьте следующие параметры:

"AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "ClientId": "",
    "Domain": ".onmicrosoft.com",
    "TenantId": ""
  },

Установите необходимый пакет Nuget:

dotnet add package microsoft.identity.web

Открыть startup.cs и обновить Configureservices () Способ со следующим кодом:

var ScopeClaim = "http://schemas.microsoft.com/identity/claims/scope";
var ExpectedRole = "access_as_application";
services.AddMicrosoftIdentityWebApiAuthentication(Configuration);
services.AddAuthorization(options => options.AddPolicy(
    "AllowedAccess",
    policyBuilder => policyBuilder.RequireAssertion(
          context 
          => context.User.IsInRole(ExpectedRole)
          || context.User.HasClaim(ScopeClaim,"access_as_user"))
    ));
services.AddControllers();
services.AddCors(options =>
    {
        options.AddPolicy(name: MyAllowSpecificOrigins,
               builder =>
               {
                  builder
                       .AllowAnyOrigin()
                       .AllowAnyMethod()
                       .AllowAnyHeader();
               });
    });
services.AddSwaggerGen(c =>
{
    c.SwaggerDoc("v1", new OpenApiInfo { Title = "API", Version = "v1" });
});

Вам нужно будет изменить следующее:

  • Имя политики (необязательно)
  • Представленная конструкция (должна соответствовать названию роли, которое вы определены в .NET Ноутбук)
  • Настройки CORS (прямо сейчас это широко открыты – не будь меня)

В Настроить () Метод, убедитесь, что вы добавите приложение. UseAuthentication () до киноавторизации () вызов

Наконец, откройте WeatherForCastcontroller.cs и добавьте следующее действие:

[HttpGet]
[Authorize(Policy="AllowedAccess")]
public async Task Get(string city)
{
    var context = this.HttpContext;
    var url = $"http://api.openweathermap.org/data/2.5/weather?q={city}&appid={configuration["WeatherApiKey"]}";
    var client = new HttpClient();
    var response = await client.GetStringAsync(url);

    return response;
}

На данный момент у нас есть все аутентификация и авторизация. Тем не менее, доступ к 3-м вечеринке погоды API требует ключа. У нас есть несколько вариантов:

  • Храните его в .NET Секреты (доступны только локально и хранятся в чистоте текст под профилем пользователя)
  • Храните его в переменных env (очистить текст, так что не безопасно и доступно только локально)
  • Добавьте его в appsettings.json (большая нет – нет, так как это наименее безопасные варианты)
  • Используйте Azure Key Vault и заблокируйте все, как должно быть.

Добавление хранилища Azure Key к нашему API

Ключевым хранилищем является безусловно, лучший способ хранить конфиденциальную информацию, которая должна использоваться нашей заявкой. Такие, такие как соединительные строки, пароли, секреты, ключи API и т. Д., Идеально подходят для ключевых секретов хранилища.

Давайте создадим ключ. Откройте Azure CLI, затем введите следующее

az login
az group create --name "" -l ""
az keyvault create --name "" --resource-group "" --location ""

Для аутентификации и использования Lazure Key Vault на местном уровне мы создадим руководитель службы Azure AD. При работе в производстве мы будем использовать управленческие тождества Azure. Эта настройка позволяет нашему коду запустить нигде, без изменения конфигурации или изменения кода!

В Azure CLI создайте руководитель обслуживания и придайте ему соответствующую роль и объем

az ad sp create-for-rbac --role Reader --scopes 

Далее обязательно войдите в систему с этим пользователем в Azure CLI

az login --service-principal -u http:// -p  --tenant 

Наконец, нам нужно обеспечить, чтобы эта служба была принципиальной учетной записью имеет правильную политику доступа в ключевом хранилище. Мы также можем использовать Azure CLI для этого. Вам необходимо использовать следующую команду не работает:

az keyvault set-policy -n  --secret-permissions get list --object-id 

Примечание. Документы говорят, что вам нужно использовать объект I. D принципала службы, но я не смог заставить его работать. Работал, как только я изменил команду, чтобы использовать идентификатор приложения ** ((директора услуг

Вам нужно будет запустить эту команду в качестве Azure Tool/владелец

Если вы хотите сделать это в портале, перейдите в Key Vault -> Политика доступа и выберите Добавить политику доступа Отказ Выберите секреты, список и получите разрешения и добавьте вопрос SP. Не забудьте нажать Сохранить Кнопка, как политика не вступит в силу, пока вы не сделаете это.

Интеграция Azure Key Vault в .NET API.

ASP.NET 5 имеет расширение конфигурации, которое работает напрямую с Vault Key Azure через SDKS Azure. Откройте терминал и добавьте следующую пакет Nuget

dotnet add package Azure.Extensions.AspNetCore.Configuration.Secrets

Далее, открыть Program.cs и обновить Createhostbuilder () Способ со следующим кодом:

public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureAppConfiguration((context, config) =>
                {
                        var builtConfig = config.Build();
                        config.AddAzureKeyVault( new Uri("https://cm-identity-kv.vault.azure.net"),
                            //new DefaultAzureCredential());
                            new ChainedTokenCredential(
                                new AzureCliCredential(),
                                new ManagedIdentityCredential()
                        )); 
                })
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup();
                    webBuilder.UseUrls("http://localhost:8080");
                });

Этот код будет искать настройки в appsettings.json И попробуйте сопоставить их на Azure Key Secrets Secrets. Это означает, что нам нужно добавить пустую настройку в нашем коде. Открыть appsettings.json И добавьте это: "HeatheraPikey": "" "

В Vault Key Azure нам нужно создать новый секрет с тем же именем и фактическим ключом API OpenWeatherMap в качестве значения. До тех пор, пока эти два матча код сможет разрешить настройки и заполнить ASP.NET Конфигурация объект.

Если разрешения или что-то еще не правы, приложение API бросит исключение при запуске и не сможет продолжить, пока вы не будете не допущены никаких нерешенных проблем.

Создайте приложение Python Console (Daemon), чтобы позвать нашу API

Приложение Console Python попытается получить доступ к API без присмотра. Это означает, что аутентификация для Azure AD произойдет без вмешательства пользователя. Мы воспользуемся потоком учетных данных клиента (OAUTH2) для достижения этого. Microsoft Identity предоставляет официальную библиотеку для Python: MSAL, и мы воспользуемся этим, чтобы получить токен доступа, чтобы позвонить нашему API.

Давайте получим кодирование.

Сначала создайте требования .txt Файл и добавьте следующие зависимости:

msal>=1.12.0
requests>=2.25.1
azure-identity>=1.6.0
azure-keyvault-secrets>=4.3.0

Далее создайте новый файл для хранения наших настроек приложения config.json. . Добавьте следующий код и заполните его со значениями, которые вы получили от Runing Client App Recort App, используя .NET Ноутбук.

{
    "authority": "https://login.microsoftonline.com/",
    "client_id": "",
    "scope": ["api://855dac46-661b-4463-97cf-d57a190bf2ed/.default"],
    "vault_url": "https://.vault.azure.net"
}

Обратите внимание на Область здесь. Мы используем роль приложения, настроенной в нашей регистрации приложения, но вместо этого используя значение, как есть, мы заменяем фактическое имя роли .default Отказ Это необходимо, поскольку мы используем поток учетных данных клиента и, следовательно, нет возможности согласиться с разрешениями. Вы можете прочитать все о .default здесь .

Теперь мы можем написать какой-то код. Создать Console.py Файл и добавьте следующий код:

import json

import requests
import msal
from azure.identity import ChainedTokenCredential, AzureCliCredential, ManagedIdentityCredential
from azure.keyvault.secrets import SecretClient

jsondata = open("config.json","r")
config = json.load(jsondata)

credential = ChainedTokenCredential(AzureCliCredential(),ManagedIdentityCredential())
secret_client = SecretClient(config["vault_url"], credential=credential)
aad_client_secret = secret_client.get_secret("AadClientSecret")

app = msal.ConfidentialClientApplication(
    client_id=config["client_id"],
    client_credential=aad_client_secret.value,
    authority=config["authority"],
)

result = None

result = app.acquire_token_silent(config["scope"], account=None)

if not result:
    result = app.acquire_token_for_client(scopes=config["scope"])

if "error" in result:
   print(result["error_description"])

if "access_token" in result:
    session = requests.sessions.Session()
    session.headers.update({'Authorization': f'Bearer {result["access_token"]}'})
    response = session.get("http://localhost:8080/weatherforecast?city=London")
    if response.status_code == 200 :
        print(response.content)
    else:
        print(f'Request failed. Response code: {response.status_code}, reason: {response.reason}')

Сначала мы используем Azure SDK для аутентификации и извлечения секрет клиента регистрации Adure Ad App Registration от Key Vault. Затем мы создали MSAL Client, чтобы получить токен доступа от Azure AD и позвонить нашему защищенному API.

Теперь мы можем запустить наш код до конца. Сначала раскрутите API с Dotnet Run Отказ Затем настройте приложение Python Console и запустите его. Имейте в виду, что инструкции по настройке виртуальной среды отличаются по всему ОС. В Windows откройте консоль и введите:

py -m venv .venv
.venv/scripts/activate
pip install -r requirements.txt

Теперь мы можем запустить и позвонить в код Python с:

py console.exe

Если все работало, как ожидалось, вам следует представить следующее:

Успех!

Покажи мне код

Вы можете найти полный исходный код на Гадость

Резюме

Этот пост блога был особенным по многим причинам. Во-первых, это первый раз, когда мы использовали роли приложений. Это связано с тем, что приложения консоли, вызывающие API, надежно не могут использовать делегированные разрешения. Нам также пришлось использовать специальные /.дефолт Область применения из-за того, что нет пользователей в интерактивном согласии на необходимые разрешения. Наконец, поскольку мы использовали использование потока учетных данных клиента, мы добавили Vault Key Azure для безопасной конфиденциальной информации.

Позднее мы увидим, как использовать Azure KeyVault для создания и хранения сертификата вместо учетных данных для аутентификации против Adure AD и добавить еще один слой безопасности для нашего решения.

Оригинал: “https://dev.to/425show/secure-python-console-apps-with-azure-ad-54fo”