Управление зашифрованными секретами в приложениях Service Fabric

В этом руководстве описаны шаги по управлению секретами в приложении Service Fabric. Секреты могут быть любой конфиденциальной информацией, например строки подключения к хранилищу, пароли или другие значения, которые не должны обрабатываться в виде обычного текста.

Использование зашифрованных секретов в приложении Service Fabric включает три шага.

  • Настройте сертификат шифрования и зашифруйте секреты.
  • Укажите зашифрованные секреты в приложении.
  • Расшифровать зашифрованные секреты из кода службы.

Настройка сертификата шифрования и шифрование секретов

Настройка сертификата шифрования и его использование для шифрования секретов зависит от Windows и Linux.

Указание зашифрованных секретов в приложении

На предыдущем шаге описывается шифрование секрета с помощью сертификата и создание строки в кодировке Base-64 для использования в приложении. Эту строку в кодировке base-64 можно указать как зашифрованный параметр в Settings.xml службы или в качестве зашифрованной переменной среды в ServiceManifest.xmlслужбы.

Укажите зашифрованный параметр в файле конфигурации Settings.xml вашей службы, указав атрибуты IsEncrypted и true.

<?xml version="1.0" encoding="utf-8" ?>
<Settings xmlns:xsd="https://www.w3.org/2001/XMLSchema" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/2011/01/fabric">
  <Section Name="MySettings">
    <Parameter Name="MySecret" IsEncrypted="true" Value="I6jCCAeYCAxgFhBXABFxzAt ... gNBRyeWFXl2VydmjZNwJIM=" />
  </Section>
</Settings>

Укажите зашифрованную переменную среды в файле ServiceManifest.xml службы с заданным атрибутом TypeEncrypted:

<CodePackage Name="Code" Version="1.0.0">
  <EnvironmentVariables>
    <EnvironmentVariable Name="MyEnvVariable" Type="Encrypted" Value="I6jCCAeYCAxgFhBXABFxzAt ... gNBRyeWFXl2VydmjZNwJIM=" />
  </EnvironmentVariables>
</CodePackage>

Секреты также должны быть включены в приложение Service Fabric, указав сертификат в манифесте приложения. Добавьте элемент SecretCertificate в ApplicationManifest.xml и добавьте отпечаток требуемого сертификата.

<ApplicationManifest … >
  ...
  <Certificates>
    <SecretsCertificate Name="MyCert" X509FindType="FindByThumbprint" X509FindValue="[YourCertThumbrint]"/>
  </Certificates>
</ApplicationManifest>

Примечание.

После активации приложения, указывающего SecretsCertificate, Service Fabric найдет соответствующий сертификат и предоставит идентичности, под которой выполняется приложение, полные разрешения для закрытого ключа сертификата. Service Fabric также будет отслеживать сертификат на изменения и повторно применять права доступа надлежащим образом. Чтобы обнаружить изменения в сертификатах, определённых общим именем, Service Fabric выполняет периодическую задачу, которая находит все соответствующие сертификаты и сравнивает их с кэшируемым списком отпечатков. При обнаружении нового отпечатка это означает, что сертификат по этому субъекту был продлен. Задача выполняется один раз в минуту на каждом узле кластера.

Хотя SecretsCertificate позволяет создавать декларации, ориентированные на субъект, обратите внимание, что зашифрованные параметры привязаны к паре ключей, использованной для их шифрования на клиенте. Необходимо убедиться, что исходный сертификат шифрования (или эквивалентный) соответствует объявлению на основе субъекта и что он установлен, включая соответствующий закрытый ключ, на каждом узле кластера, где может размещаться приложение. Все сертификаты, действительные на момент времени, соответствующие декларации, основанной на субъекте, и созданные с использованием той же пары ключей, что и исходный сертификат шифрования, считаются эквивалентными.

Внедрение секретов приложения в экземпляры приложений

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

Переопределяемые параметры в Settings.xml

Файл конфигурации Settings.xml позволяет переопределять параметры, которые можно предоставить во время создания приложения. MustOverride Используйте атрибут вместо предоставления значения для параметра:

<?xml version="1.0" encoding="utf-8" ?>
<Settings xmlns:xsd="https://www.w3.org/2001/XMLSchema" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/2011/01/fabric">
  <Section Name="MySettings">
    <Parameter Name="MySecret" IsEncrypted="true" Value="" MustOverride="true" />
  </Section>
</Settings>

Чтобы переопределить значения в Settings.xml, объявите параметр переопределения для службы в ApplicationManifest.xml:

<ApplicationManifest ... >
  <Parameters>
    <Parameter Name="MySecret" DefaultValue="" />
  </Parameters>
  <ServiceManifestImport>
    <ServiceManifestRef ServiceManifestName="Stateful1Pkg" ServiceManifestVersion="1.0.0" />
    <ConfigOverrides>
      <ConfigOverride Name="Config">
        <Settings>
          <Section Name="MySettings">
            <Parameter Name="MySecret" Value="[MySecret]" IsEncrypted="true" />
          </Section>
        </Settings>
      </ConfigOverride>
    </ConfigOverrides>
  </ServiceManifestImport>

Теперь значение можно указать в качестве параметра приложения при создании экземпляра приложения. Экземпляр приложения можно создать с помощью PowerShell или реализовать на C#, чтобы облегчить интеграцию в процесс сборки.

С помощью PowerShell параметр предоставляется New-ServiceFabricApplication команде в виде хэш-таблицы:

New-ServiceFabricApplication -ApplicationName fabric:/MyApp -ApplicationTypeName MyAppType -ApplicationTypeVersion 1.0.0 -ApplicationParameter @{"MySecret" = "I6jCCAeYCAxgFhBXABFxzAt ... gNBRyeWFXl2VydmjZNwJIM="}

Используя C#, параметры приложения указываются в ApplicationDescription как NameValueCollection.

FabricClient fabricClient = new FabricClient();

NameValueCollection applicationParameters = new NameValueCollection();
applicationParameters["MySecret"] = "I6jCCAeYCAxgFhBXABFxzAt ... gNBRyeWFXl2VydmjZNwJIM=";

ApplicationDescription applicationDescription = new ApplicationDescription(
    applicationName: new Uri("fabric:/MyApp"),
    applicationTypeName: "MyAppType",
    applicationTypeVersion: "1.0.0",
    applicationParameters: applicationParameters)
);

await fabricClient.ApplicationManager.CreateApplicationAsync(applicationDescription);

Расшифровка зашифрованных секретов из кода сервиса

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

// Access decrypted parameters from Settings.xml
ConfigurationPackage configPackage = FabricRuntime.GetActivationContext().GetConfigurationPackageObject("Config");
bool MySecretIsEncrypted = configPackage.Settings.Sections["MySettings"].Parameters["MySecret"].IsEncrypted;
if (MySecretIsEncrypted)
{
    SecureString MySecretDecryptedValue = configPackage.Settings.Sections["MySettings"].Parameters["MySecret"].DecryptValue();
}

// Access decrypted environment variables from ServiceManifest.xml
// Note: you do not have to call any explicit API to decrypt the environment variable.
string MyEnvVariable = Environment.GetEnvironmentVariable("MyEnvVariable");

Дальнейшие действия