Bagikan melalui


Kelola rahasia terenkripsi dalam aplikasi Service Fabric

Panduan ini memandu Anda melalui langkah-langkah mengelola rahasia dalam aplikasi Service Fabric. Rahasia dapat berupa informasi sensitif apa pun, seperti string koneksi penyimpanan, kata sandi, atau nilai lain yang tidak boleh ditangani dalam teks biasa.

Menggunakan rahasia terenkripsi dalam aplikasi Service Fabric melibatkan tiga langkah:

  • Siapkan sertifikat enkripsi dan enkripsi rahasia.
  • Tentukan rahasia terenkripsi dalam aplikasi.
  • Dekripsi rahasia terenkripsi dari kode layanan.

Siapkan sertifikat enkripsi dan enkripsi rahasia

Menyiapkan sertifikat enkripsi dan menggunakannya untuk mengenkripsi rahasia bervariasi antara Windows dan Linux.

Tentukan rahasia terenkripsi dalam aplikasi

Langkah sebelumnya menjelaskan cara mengenkripsi rahasia dengan sertifikat dan menghasilkan string bersandi dasar 64 untuk digunakan dalam aplikasi. String bersandi base-64 ini dapat ditentukan sebagai parameter terenkripsi dalam Settings.xml atau sebagai variabel lingkungan terenkripsi dalam ServiceManifest.xml.

Tentukan parameter terenkripsi dalam file konfigurasi Settings.xml layanan Anda dengan atribut IsEncrypted yang diatur ke 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>

Tentukan variabel lingkungan terenkripsi dalam file ServiceManifest.xml layanan Anda dengan atribut Type yang diatur ke Encrypted:

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

Rahasia juga harus disertakan dalam aplikasi Service Fabric Anda dengan menentukan sertifikat dalam manifes aplikasi. Tambahkan elemen SecretsCertificate ke ApplicationManifest.xml dan sertakan thumbprint sertifikat yang diinginkan.

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

Catatan

Setelah mengaktifkan aplikasi yang menentukan SecretsCertificate, Service Fabric akan menemukan sertifikat yang cocok, dan memberikan identitas yang dijalankan aplikasi dengan izin penuh ke kunci pribadi sertifikat. Service Fabric juga akan memantau sertifikat untuk perubahan, dan menerapkan kembali izin yang sesuai. Untuk mendeteksi perubahan sertifikat yang dideklarasikan dengan nama umum, Service Fabric menjalankan tugas berkala yang menemukan semua sertifikat yang cocok, dan membandingkannya dengan daftar thumbprint yang disimpan dalam cache. Ketika thumbprint baru terdeteksi, itu berarti sertifikat dari subjek tersebut telah diperbarui. Tugas berjalan satu kali per menit di setiap node klaster.

Meskipun SecretsCertificate mengizinkan deklarasi berbasis subjek, perhatikan bahwa pengaturan terenkripsi terkait dengan pasangan kunci yang digunakan untuk mengenkripsi setelan pada klien. Anda harus memastikan bahwa sertifikat enkripsi asli (atau yang setara) cocok dengan deklarasi berbasis subjek, dan bahwa itu diinstal, termasuk kunci pribadi yang sesuai, pada setiap node cluster yang dapat menghosting aplikasi. Semua sertifikat yang valid sepanjang waktu yang cocok dengan deklarasi berbasis subjek dan dibuat dari pasangan kunci yang sama dengan sertifikat enkripsi asli dianggap setara.

Masukkan rahasia aplikasi ke dalam instans aplikasi

Idealnya, penyebaran ke lingkungan yang berbeda harus seotomatis mungkin. Ini dapat dicapai dengan melakukan enkripsi rahasia di lingkungan build dan memberikan rahasia terenkripsi sebagai parameter saat membuat instans aplikasi.

Gunakan parameter yang dapat diambil alih di Settings.xml

File konfigurasi Settings.xml memungkinkan parameter yang dapat diambil alih yang dapat diberikan pada waktu pembuatan aplikasi. Gunakan atribut MustOverride alih-alih memberikan nilai untuk parameter:

<?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>

Untuk mengganti nilai di Settings.xml, deklarasikan parameter yang dapat diambil alih untuk layanan di 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>

Sekarang nilainya dapat ditetapkan sebagai parameter aplikasi saat membuat instans aplikasi. Membuat instans aplikasi dapat ditulis menggunakan PowerShell, atau ditulis dalam C#, untuk integrasi yang mudah dalam proses build.

Menggunakan PowerShell, parameter diberikan ke perintah New-ServiceFabricApplication sebagai tabel hash:

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

Menggunakan C#, parameter aplikasi ditentukan dalam ApplicationDescription sebagai 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);

Dekripsi rahasia terenkripsi dari kode layanan

API untuk mengakses parameter dan variabel lingkungan memungkinkan dekripsi yang mudah untuk nilai terenkripsi. Karena string terenkripsi berisi informasi tentang sertifikat yang digunakan untuk enkripsi, Anda tidak perlu menentukan sertifikat secara manual. Sertifikat hanya perlu diinstal pada node tempat layanan berjalan.

// 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");

Langkah berikutnya