Central Secret Service di Azure Service Fabric

Central Secret Service (CSS), juga dikenal sebagai Central Secret Store, adalah layanan sistem Service Fabric yang dimaksudkan untuk melindungi rahasia dalam kluster. CSS memudahkan pengelolaan rahasia untuk aplikasi SF, menghilangkan ketergantungan akan parameter terenkripsi.

Central Secret Service adalah cache rahasia dalam kluster replika yang tahan lama; rahasia yang disimpan dalam CSS dienkripsi saat tidak aktif untuk sertifikat enkripsi yang disediakan pelanggan. CSS menyediakan API klien untuk pengelolaan rahasia, dapat diakses oleh entitas yang mengautentikasi sebagai kluster, atau pengguna admin kluster. Model aplikasi runtime Service Fabric terintegrasi dengan CSS, yang mengizinkan pernyataan parameter aplikasi sebagai referensi rahasia CSS.

CSS juga berperan penting dalam provisi rahasia aplikasi yang dinyatakan sebagai URI rahasia KeyVault, yang dikombinasikan dengan Identitas Terkelola untuk Aplikasi Service Fabric yang disebarkan Azure.

Central Secret Service tidak dimaksudkan untuk menjadi pengganti layanan pengelolaan rahasia eksternal khusus, seperti Azure Key Vault.

Catatan

Saat mengaktifkan CSS pada kluster SF yang menjalankan versi yang lebih lama dari 7.1. CU3, aktivasi dapat gagal dan meninggalkan CSS dalam keadaan tidak sehat secara permanen jika kluster dikonfigurasi untuk autentikasi Windows atau jika EncryptionCertificateThumbprint dinyatakan salah atau sertifikat yang sesuai tidak diinstal. Dalam kedua kasus, disarankan untuk meningkatkan kluster ke versi runtime SF yang lebih baru dari 7.1. CU3 sebelum melanjutkan.

Mengaktifkan Central Secret Service

Untuk mengaktifkan Central Secret Service, perbarui konfigurasi kluster seperti yang dijelaskan di bawah. Sebaiknya Anda menggunakan sertifikat enkripsi yang berbeda dengan sertifikat kluster Anda. Sertifikat ini harus diinstal pada semua simpul.

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

Catatan

Pengaturan konfigurasi "DeployedState", yang digunakan dalam Service Fabric versi 8.0, adalah mekanisme yang disukai untuk mengaktifkan atau menonaktifkan CSS; fungsi ini dilayani dalam versi sebelumnya oleh pengaturan konfigurasi "IsEnabled", yang sekarang dianggap usang.

Model rahasia Central Secret Service

Central Secret Service API mengekspos dua jenis: sumber daya rahasia, dan versi rahasia. Secara konseptual, jenis sumber daya rahasia mewakili keluarga versi satu rahasia yang digunakan untuk tujuan tertentu; contohnya meliputi: string koneksi, kata sandi, sertifikat titik akhir. Objek dari jenis sumber daya rahasia berisi metadata yang terkait dengan rahasia tersebut, khususnya jenis konten, dan deskripsi. Jenis versi rahasia mewakili contoh tertentu dari rahasia terkaitnya, dan menyimpan teks biasa rahasia (dienkripsi); lanjut dengan contoh di atas, versi rahasia berisi nilai kata sandi saat ini, objek sertifikat yang valid hingga akhir bulan dll. Setelah memperbarui rahasia ini, versi rahasia baru harus dibuat (dan ditambahkan ke CSS).

Dengan merumuskan, berikut beberapa aturan yang diimplementasikan dan diberlakukan dalam implementasi CSS:

  • Sumber daya rahasia mungkin tidak atau memiliki beberapa versi
  • Setiap versi rahasia adalah turunan dari sumber daya rahasia tertentu; versi mungkin hanya memiliki satu sumber daya induk
  • Setiap versi rahasia dapat dihapus, tanpa memengaruhi versi lain dari rahasia yang sama
  • Jika sumber daya rahasia dihapus, semua versinya akan dihapus
  • Nilai versi rahasia tidak dapat diubah

Menyatakan sumber daya rahasia

Anda dapat membuat sumber daya rahasia dengan menggunakan REST API.

Catatan

Jika kluster menggunakan autentikasi Windows tanpa sertifikat HttpGateway, permintaan REST akan dikirim melalui saluran HTTP yang tidak aman. Untuk mengaktifkan TLS untuk saluran ini, penentuan kluster harus diperbarui untuk menetapkan sertifikat server gateway http.

Untuk membuat sumber daya rahasia supersecret dengan menggunakan REST API, buat permintaan PUT ke https://<clusterfqdn>:19080/Resources/Secrets/supersecret?api-version=6.4-preview. Anda perlu mengautentikasi menggunakan sertifikat kluster atau sertifikat klien admin untuk membuat sumber daya rahasia.

$json = '{"properties": {"kind": "inlinedValue", "contentType": "text/plain", "description": "supersecret"}}'
Invoke-WebRequest  -Uri https://<clusterfqdn>:19080/Resources/Secrets/supersecret?api-version=6.4-preview -Method PUT -CertificateThumbprint <CertThumbprint> -Body $json

Mengatur nilai rahasia

Gunakan skrip berikut untuk menggunakan REST API untuk mengatur nilai rahasia.

$Params = '{"properties": {"value": "mysecretpassword"}}'
Invoke-WebRequest -Uri https://<clusterfqdn>:19080/Resources/Secrets/supersecret/values/ver1?api-version=6.4-preview -Method PUT -Body $Params -CertificateThumbprint <ClusterCertThumbprint>

Memeriksa nilai rahasia

Invoke-WebRequest -CertificateThumbprint <ClusterCertThumbprint> -Method POST -Uri "https:<clusterfqdn>/Resources/Secrets/supersecret/values/ver1/list_value?api-version=6.4-preview"

Menggunakan rahasia dalam aplikasi Anda

Aplikasi dapat menggunakan rahasia dari CSS dengan menyatakannya sebagai variabel lingkungan, atau dengan menentukan jalur tempat teks biasa rahasia harus diserialisasikan. Ikuti langkah-langkah ini untuk mereferensikan rahasia CSS:

  1. Tambahkan bagian di file settings.xml dengan cuplikan berikut. Perhatikan di sini bahwa nilainya dalam format {secretname:version}.
     <Section Name="testsecrets">
      <Parameter Name="TopSecret" Type="SecretsStoreRef" Value="supersecret:ver1"/
     </Section>
  1. Impor bagian di ApplicationManifest.xml.
<ServiceManifestImport>
<ServiceManifestRef ServiceManifestName="testservicePkg" ServiceManifestVersion="1.0.0" />
<ConfigOverrides />
<Policies>
 <ConfigPackagePolicies CodePackageRef="Code">
   <ConfigPackage Name="Config" SectionName="testsecrets" EnvironmentVariableName="SecretPath" />
   </ConfigPackagePolicies>
</Policies>
</ServiceManifestImport>

Contoh 1: Pasang rahasia ke kontainer. Satu-satunya perubahan yang diperlukan untuk membuat rahasia tersedia di dalam kontainer adalah specify ke titik pemasangan di <ConfigPackage>. Cuplikan berikut adalah modifikasi ApplicationManifest.xml.

   <ServiceManifestImport>
       <ServiceManifestRef ServiceManifestName="testservicePkg" ServiceManifestVersion="1.0.0" />
       <ConfigOverrides />
       <Policies>
         <ConfigPackagePolicies CodePackageRef="Code">
           <ConfigPackage Name="Config" SectionName="testsecrets" MountPoint="C:\secrets" EnvironmentVariableName="SecretPath" />
           <!-- Linux Container
            <ConfigPackage Name="Config" SectionName="testsecrets" MountPoint="/mnt/secrets" EnvironmentVariableName="SecretPath" />
           -->
         </ConfigPackagePolicies>
       </Policies>
     </ServiceManifestImport>

Rahasia tersedia di bagian titik pemasangan dalam kontainer Anda.

Contoh 2: Mengikat rahasia ke variabel lingkungan proses dengan menentukan Type='SecretsStoreRef. Cuplikan berikut adalah contoh cara mengikat supersecret versi ver1 ke variabel lingkungan MySuperSecret di ServiceManifest.xml.

   <EnvironmentVariables>
     <EnvironmentVariable Name="MySuperSecret" Type="SecretsStoreRef" Value="supersecret:ver1"/>
   </EnvironmentVariables>

Variabel lingkungan SecretPath akan mengarah ke direktori tempat semua rahasia disimpan. Setiap parameter yang tercantum di bagian testsecrets disimpan dalam file terpisah. Aplikasi kini dapat menggunakan rahasia sebagai berikut:

secretValue = IO.ReadFile(Path.Join(Environment.GetEnvironmentVariable("SecretPath"),  "TopSecret"))

Memutar Sertifikat Enkripsi Central Secret Service

Perlu diperhatikan bahwa sertifikat tetap valid untuk dekripsi di luar masa kedaluwarsa. Saat ini, kami sarankan untuk terus memprovisi sertifikat enkripsi sebelumnya setelah rotasi, untuk mengurangi kemungkinan penguncian. Memutar sertifikat enkripsi CSS memerlukan langkah-langkah berikut:

  1. Provisikan sertifikat baru untuk setiap simpul kluster. Saat ini, jangan menghapus/melanjutkan provisi sertifikat enkripsi sebelumnya.
  2. Mulai peningkatan konfigurasi kluster untuk mengubah nilai EncryptionCertificateThumbprint ke thumbprint SHA-1 sertifikat baru. Setelah peningkatan selesai, CSS akan mulai mengenkripsi ulang konten yang ada ke sertifikat enkripsi baru. Semua rahasia yang ditambahkan ke CSS setelah titik ini akan dienkripsi langsung ke sertifikat enkripsi baru. Karena konvergensi untuk memiliki semua rahasia yang dilindungi oleh sertifikat baru tidak sinkron, sertifikat enkripsi sebelumnya tetap harus diinstal di semua simpul, dan tersedia untuk CSS.

Menghapus Central Secret Service dari kluster Anda

Penghapusan Central Secret Service yang aman dari kluster memerlukan dua peningkatan. Peningkatan pertama secara fungsional menonaktifkan CSS, sementara peningkatan kedua menghapus layanan dari penentuan kluster, yang mencakup penghapusan permanen kontennya. Proses dua tahap ini mencegah penghapusan layanan yang tidak disengaja, dan membantu memastikan bahwa tidak ada ketergantungan tak berinduk pada CSS selama proses penghapusan. Fitur ini tersedia mulai dari SF versi 8.0 dan seterusnya.

Langkah 1: Perbarui CSS DeployedState ke menghapus

Tingkatkan penentuan kluster dari "IsEnabled" = "true" atau dari "DeployedState" = "enabled" ke

{
    "name":  "DeployedState",
    "value":  "removing"
}

Setelah Central Secret Service memasuki status tersebar Removing, semua panggilan API rahasia yang masuk akan ditolak, baik panggilan REST langsung atau melalui aktivasi layanan yang mencakup SecretStoreRefs atau KeyVaultReferences. Setiap aplikasi atau komponen dalam kluster yang masih bergantung pada CSS pada saat ini akan masuk ke status Peringatan. Jika hal ini terjadi, peningkatan ke status tersebar Removing harus digulirkan kembali; jika peningkatan tersebut telah berhasil, peningkatan baru harus dimulai untuk mengubah CSS kembali ke DeployedState = Enabled. Jika Central Secret Service menerima permintaan saat dalam keadaan tersebar Removing, HTTP Kode 401 (tidak sah) akan ditampilkan dan menempatkan dirinya dalam status kesehatan Peringatan.

Langkah 2: Perbarui CSS DeployedState ke nonaktif

Tingkatkan penentuan kluster dari "DeployedState" = "removing" ke

{
    "name":  "DeployedState",
    "value":  "disabled"
}

Central Secret Service tidak akan lagi dijalankan dalam kluster, dan tidak akan tercantum dalam daftar layanan sistem. Konten CSS hilang dan tidak dapat diambil.

Langkah berikutnya