Dukungan KeyVaultReference untuk Aplikasi Service Fabric yang disebarkan Azure

Tantangan umum saat membangun aplikasi cloud adalah mengetahui cara mendistribusikan rahasia dengan aman ke aplikasi Anda dan mengelolanya. Dukungan Service Fabric KeyVaultReference memudahkannya. Setelah dikonfigurasi, Anda dapat mengacu pada URL rahasia yang disimpan dalam Key Vault dalam definisi aplikasi Anda dan Service Fabric akan menangani pengambilan rahasia tersebut dan mengaktifkan aplikasi Anda dengannya. Saat menggunakan fitur versi "yang dikelola SF", Service Fabric juga dapat memantau Key Vault Anda dan secara otomatis memicu peningkatan parameter aplikasi bergulir saat rahasia Anda berputar di brankas.

Opsi untuk mengirimkan rahasia ke aplikasi di Service Fabric

Cara klasik untuk mengirimkan rahasia ke aplikasi Service Fabric adalah dengan menyatakan Parameter Terenkripsi. Ini melibatkan enkripsi rahasia terhadap sertifikat enkripsi, dan meneruskan rahasia terenkripsi tersebut ke aplikasi Anda. Metode ini memiliki beberapa kelemahan: perlu mengelola sertifikat enkripsi, pemaparan rahasia dalam alur penyebaran, dan kurangnya visibilitas ke metadata rahasia yang disematkan pada aplikasi yang disebarkan. Demikian pula, memutar rahasia memerlukan penyebaran aplikasi. Kecuali Anda menjalankan kluster mandiri, kami tidak lagi merekomendasikan penggunaan parameter terenkripsi.

Opsi lain adalah menggunakan Referensi Penyimpanan Rahasia. Pengalaman ini memungkinkan manajemen pusat rahasia aplikasi Anda, visibilitas yang lebih baik ke metadata rahasia yang disebarkan, dan memungkinkan manajemen pusat sertifikat enkripsi. Beberapa mungkin lebih suka gaya manajemen rahasia ini saat menjalankan kluster Service Fabric mandiri.

Saran kami saat ini adalah mengurangi ketergantungan pada rahasia sedapat mungkin dengan menggunakan Identitas Terkelola untuk aplikasi Service Fabric. Identitas terkelola dapat digunakan untuk mengautentikasi langsung ke Azure Storage, Azure SQL, dan banyak lagi. Itu berarti tidak perlu mengelola kredensial terpisah saat mengakses layanan Azure yang mendukung autentikasi Microsoft Entra.

Jika tidak dapat menggunakan Identitas Terkelola sebagai klien, sebaiknya gunakan KeyVaultReferences. Anda harus menggunakan KeyVaultReferences daripada menggunakan Identitas Terkelola untuk langsung membuka Key Vault. KeyVaultReferences membantu meningkatkan ketersediaan aplikasi Anda karena memberlakukan perubahan rahasia terjadi selama peningkatan bergulir. Skalanya juga lebih baik karena rahasia disimpan dalam cache dan disajikan dari dalam kluster. Jika aplikasi Anda menggunakan Parameter Terenkripsi saat ini, hanya ada perubahan minimal yang diperlukan dalam kode aplikasi Anda untuk menggunakan KeyVaultReferences. Aplikasi Anda dapat terus membuat satu rahasia, dan agar rahasia itu sama selama masa proses.

Prasyarat

  • Identitas Terkelola untuk Aplikasi Service Fabric

    Dukungan Service Fabric KeyVaultReference menggunakan Identitas Terkelola aplikasi untuk mengambil rahasia atas nama aplikasi. Anda harus menyebarkan aplikasi melalui ARM dan menetapkannya sebagai identitas terkelola. Ikuti dokumen ini untuk mengaktifkan identitas terkelola aplikasi Anda.

  • Central Secrets Store (CSS).

    Central Secrets Store (CSS) adalah cache rahasia lokal terenkripsi Service Fabric. Fitur ini menggunakan CSS untuk melindungi dan mempertahankan rahasia setelah diambil dari Key Vault. Mengaktifkan layanan sistem ini diperlukan untuk menggunakan KeyVaultReferences. Ikuti dokumen ini untuk mengaktifkan dan mengonfigurasi CSS.

  • Memberikan izin akses identitas terkelola aplikasi ke Key Vault

    Buka dokumen ini untuk melihat cara memberikan akses identitas terkelola ke Key Vault. Selain itu, perhatikan bahwa jika Anda menggunakan identitas terkelola yang ditetapkan sistem, identitas terkelola hanya dibuat setelah penyebaran aplikasi. Hal ini dapat menciptakan kondisi berebut di mana aplikasi mencoba mengakses rahasia sebelum identitas dapat diberikan akses ke vault. Nama identitas yang ditetapkan sistem akan seperti {cluster name}/{application name}/{service name}.

KeyVaultReferences vs. ManagedKeyVaultReferences

Ide dasar KeyVaultReferences bukanlah menetapkan nilai parameter aplikasi Anda sebagai rahasia, namun menetapkannya ke URL Key Vault, yang selanjutnya akan diselesaikan ke nilai rahasia setelah aplikasi Anda diaktifkan. Di Key Vault, satu rahasia, misalnya, https://my.vault.azure.net/secrets/MySecret/ dapat memiliki beberapa versi, misalnya, https://my.vault.azure.net/secrets/MySecret/<oid1> dan <oid2>. Jika Anda menggunakan KeyVaultReference, nilainya harus menjadi referensi berversi (https://my.vault.azure.net/secrets/MySecret/<oid1>). Jika Anda memutar rahasia tersebut di brankas, misalnya, ke <oid2>, Anda harus memicu peningkatan aplikasi ke referensi baru. Jika Anda menggunakan ManagedKeyVaultReference, nilainya harus menjadi referensi tanpa versi (https://my.vault.azure.net/secrets/MySecret/). Service Fabric akan menyelesaikan instans <oid1> terbaru dan mengaktifkan aplikasi dengan rahasia tersebut. Jika Anda memutar rahasia di brankas ke <oid2>, Service Fabric akan otomatis memicu peningkatan parameter aplikasi untuk pindah ke <oid2> atas nama Anda.

Catatan

Dukungan KeyVaultReference (rahasia berversi) untuk Aplikasi Service Fabric Tersedia Secara Umum yang dimulai dengan Service Fabric versi 7.2 CU5. Sebaiknya tingkatkan ke versi ini sebelum menggunakan fitur ini.

Catatan

Dukungan ManagedKeyVaultReference (rahasia tanpa versi) untuk Aplikasi Service Fabric Tersedia Secara Umum dimulai dengan Service Fabric versi 9.0.

Menggunakan KeyVaultReferences di aplikasi Anda

KeyVaultReferences dapat digunakan

Sebagai variabel lingkungan

<EnvironmentVariables>
      <EnvironmentVariable Name="MySecret" Type="KeyVaultReference" Value="<KeyVaultURL>"/>
</EnvironmentVariables>
string secret =  Environment.GetEnvironmentVariable("MySecret");

Dipasang sebagai file ke dalam kontainer

  • Menambahkan bagian ke settings.xml

    Tentukan parameter MySecret dengan Jenis KeyVaultReference dan Nilai <KeyVaultURL>

    <Section Name="MySecrets">
        <Parameter Name="MySecret" Type="KeyVaultReference" Value="<KeyVaultURL>"/>
    </Section>
    
  • Buka bagian baru ApplicationManifest.xml di <ConfigPackagePolicies>

    <ServiceManifestImport>
        <Policies>
        <IdentityBindingPolicy ServiceIdentityRef="MyServiceMI" ApplicationIdentityRef="MyApplicationMI" />
        <ConfigPackagePolicies CodePackageRef="Code">
            <!--Linux container example-->
            <ConfigPackage Name="Config" SectionName="MySecrets" EnvironmentVariableName="SecretPath" MountPoint="/var/secrets"/>
            <!--Windows container example-->
            <!-- <ConfigPackage Name="Config" SectionName="dbsecrets" EnvironmentVariableName="SecretPath" MountPoint="C:\secrets"/> -->
        </ConfigPackagePolicies>
        </Policies>
    </ServiceManifestImport>
    
  • Gunakan rahasia dari kode layanan

    Setiap parameter yang tercantum di bagian <Section Name=MySecrets> akan menjadi file di bawah folder yang ditunjukkan oleh EnvironmentVariable SecretPath. Cuplikan kode C# di bawah ini menunjukkan cara membaca MySecret dari aplikasi Anda.

    string secretPath = Environment.GetEnvironmentVariable("SecretPath");
    using (StreamReader sr = new StreamReader(Path.Combine(secretPath, "MySecret"))) 
    {
        string secret =  sr.ReadToEnd();
    }
    

    Catatan

    MountPoint mengontrol folder tempat file yang berisi nilai rahasia akan dipasang.

Sebagai referensi ke kata sandi repositori kontainer

 <Policies>
      <ContainerHostPolicies CodePackageRef="Code">
        <RepositoryCredentials AccountName="MyACRUser" Type="KeyVaultReference" Password="<KeyVaultURL>"/>
      </ContainerHostPolicies>

Menggunakan ManagedKeyVaultReferences di aplikasi Anda

Pertama, Anda harus mengaktifkan pemantauan rahasia dengan meningkatkan definisi kluster Anda untuk menambahkan EnableSecretMonitoring pengaturan, selain konfigurasi CSS lain yang diperlukan:

"fabricSettings": [
    {
        "name": "CentralSecretService",     
        "parameters": [
            {
                "name": "EnableSecretMonitoring",
                "value": "true"
            },
            {
                "name":  "DeployedState",
                "value":  "enabled"
            },
            {
                "name" : "EncryptionCertificateThumbprint",
                "value": "<thumbprint>"
            },
            {
                "name":  "MinReplicaSetSize",
                "value":  "<size>"
            },
            {
                "name":  "TargetReplicaSetSize",
                "value":  "<size>"
            }
        ]
    }
],

Catatan

Default bisa menjadi true di masa mendatang

Setelah peningkatan kluster selesai, aplikasi pengguna Anda dapat ditingkatkan. Di mana pun KeyVaultReference dapat digunakan, ManagedKeyVaultReference juga dapat digunakan, misalnya,

    <Section Name="MySecrets">
        <Parameter Name="MySecret" Type="ManagedKeyVaultReference" Value="[MySecretReference]"/>
    </Section>

Perbedaan utama dalam menentukan ManagedKeyVaultReferences adalah bahwa mereka tidak dapat dikodekan secara permanen dalam manifes jenis aplikasi Anda. Mereka harus dinyatakan sebagai parameter Tingkat aplikasi, dan selanjutnya harus dikesampingkan dalam definisi aplikasi ARM Anda.

Berikut kutipan dari manifes yang dibentuk dengan baik

<?xml version="1.0" encoding="utf-8"?>
<ApplicationManifest ApplicationTypeName="MyAppType" ApplicationTypeVersion="1.0.0">
  <Parameters>
    <Parameter Name="MySecretReference" DefaultValue="" />
  </Parameters>
  <ServiceManifestImport>
    <EnvironmentOverrides CodePackageRef="Code">
      <EnvironmentVariable Name="MySecret" Value="[MySecretReference]" Type="ManagedKeyVaultReference" />
    </EnvironmentOverrides>
    <Policies>
      <IdentityBindingPolicy ServiceIdentityRef="MySvcIdentity" ApplicationIdentityRef="MyAppIdentity" />
    </Policies>
  </ServiceManifestImport>
  <Principals>
    <ManagedIdentities>
      <ManagedIdentity Name="MyAppIdentity" />
    </ManagedIdentities>
  </Principals>
</ApplicationManifest>

dan kutipan definisi sumber daya aplikasi:

{
    "type": "Microsoft.ServiceFabric/clusters/applications",
    "name": "MyApp",
    "identity": {
        "type" : "userAssigned",
        "userAssignedIdentities": {
            "[variables('userAssignedIdentityResourceId')]": {}
        }
    },
    "properties": {
        "parameters": {
            "MySecretReference": "https://my.vault.azure.net/secrets/MySecret/"
        },
        "managedIdentities": [
            {
            "name" : "MyAppIdentity",
            "principalId" : "<guid>"
            }
        ]
    }
}

Keduanya menyatakan ManagedKeyVaultReference sebagai parameter aplikasi, serta mengesampingkan bahwa parameter pada penyebaran diperlukan agar Service Fabric berhasil mengelola siklus hidup rahasia yang disebarkan.

Langkah berikutnya