Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этом руководстве описаны шаги по управлению секретами в приложении Service Fabric. Секреты могут быть любой конфиденциальной информацией, например строки подключения к хранилищу, пароли или другие значения, которые не должны обрабатываться в виде обычного текста.
Использование зашифрованных секретов в приложении Service Fabric включает три шага.
- Настройте сертификат шифрования и зашифруйте секреты.
- Укажите зашифрованные секреты в приложении.
- Расшифровать зашифрованные секреты из кода службы.
Настройка сертификата шифрования и шифрование секретов
Настройка сертификата шифрования и его использование для шифрования секретов зависит от Windows и Linux.
- Настройте сертификат шифрования и зашифруйте секреты в кластерах 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");
Дальнейшие действия
- Хранилище секретов Service Fabric
- Дополнительные сведения о безопасности приложений и служб