Bagikan melalui


Amankan kluster mandiri di Windows dengan menggunakan sertifikat X.509

Artikel ini menjelaskan cara mengamankan komunikasi antara berbagai node kluster Windows mandiri Anda. Ini juga menjelaskan cara mengautentikasi klien yang terhubung ke kluster ini dengan menggunakan sertifikat X.509. Autentikasi memastikan bahwa hanya pengguna yang berwenang yang dapat mengakses kluster dan aplikasi yang diterapkan dan melakukan tugas manajemen. Keamanan sertifikat harus diaktifkan pada kluster ketika kluster dibuat.

Untuk informasi selengkapnya tentang keamanan kluster, seperti keamanan node-ke-node, keamanan klien-ke-node, dan kontrol akses berbasis peran, lihat Skenario keamanan kluster.

Sertifikat mana yang Anda butuhkan?

Untuk memulainya, unduh paket Service Fabric for Windows Server ke salah satu node di kluster Anda. Dalam paket yang diunduh, Anda menemukan file ClusterConfig.X509.MultiMachine.json. Buka file, dan tinjau bagian untuk keamanan di bawah bagian properti:

"security": {
    "metadata": "The Credential type X509 indicates this cluster is secured by using X509 certificates. The thumbprint format is d5 ec 42 3b 79 cb e5 07 fd 83 59 3c 56 b9 d5 31 24 25 42 64.",
    "ClusterCredentialType": "X509",
    "ServerCredentialType": "X509",
    "CertificateInformation": {
        "ClusterCertificate": {
            "Thumbprint": "[Thumbprint]",
            "ThumbprintSecondary": "[Thumbprint]",
            "X509StoreName": "My"
        },        
        "ClusterCertificateCommonNames": {
            "CommonNames": [
            {
                "CertificateCommonName": "[CertificateCommonName]",
                "CertificateIssuerThumbprint": "[Thumbprint1,Thumbprint2,Thumbprint3,...]"
            }
            ],
            "X509StoreName": "My"
        },
        "ClusterCertificateIssuerStores": [
            {
                "IssuerCommonName": "[IssuerCommonName]",
                "X509StoreNames" : "Root"
            }
        ],
        "ServerCertificate": {
            "Thumbprint": "[Thumbprint]",
            "ThumbprintSecondary": "[Thumbprint]",
            "X509StoreName": "My"
        },
        "ServerCertificateCommonNames": {
            "CommonNames": [
            {
                "CertificateCommonName": "[CertificateCommonName]",
                "CertificateIssuerThumbprint": "[Thumbprint1,Thumbprint2,Thumbprint3,...]"
            }
            ],
            "X509StoreName": "My"
        },
        "ServerCertificateIssuerStores": [
            {
                "IssuerCommonName": "[IssuerCommonName]",
                "X509StoreNames" : "Root"
            }
        ],
        "ClientCertificateThumbprints": [
            {
                "CertificateThumbprint": "[Thumbprint]",
                "IsAdmin": false
            },
            {
                "CertificateThumbprint": "[Thumbprint]",
                "IsAdmin": true
            }
        ],
        "ClientCertificateCommonNames": [
            {
                "CertificateCommonName": "[CertificateCommonName]",
                "CertificateIssuerThumbprint": "[Thumbprint1,Thumbprint2,Thumbprint3,...]",
                "IsAdmin": true
            }
        ],
        "ClientCertificateIssuerStores": [
            {
                "IssuerCommonName": "[IssuerCommonName]",
                "X509StoreNames": "Root"
            }
        ]
        "ReverseProxyCertificate": {
            "Thumbprint": "[Thumbprint]",
            "ThumbprintSecondary": "[Thumbprint]",
            "X509StoreName": "My"
        },
        "ReverseProxyCertificateCommonNames": {
            "CommonNames": [
                {
                "CertificateCommonName": "[CertificateCommonName]"
                }
            ],
            "X509StoreName": "My"
        }
    }
},

Bagian ini menjelaskan sertifikat yang Anda butuhkan untuk mengamankan kluster Windows mandiri Anda. Jika Anda menentukan sertifikat kluster, tetapkan nilai ClusterCredentialType ke X509. Jika Anda menentukan sertifikat server untuk koneksi luar, atur Jenis ServerCredential ke X509. Meskipun tidak wajib, kami sarankan Anda memiliki kedua sertifikat ini untuk kluster yang diamankan dengan benar. Jika Anda mengatur nilai-nilai ini ke X509, Anda juga harus menentukan sertifikat yang sesuai atau Service Fabric memberikan pengecualian. Dalam beberapa skenario, Anda mungkin hanya ingin menentukan ClientCertificateThumbprints atau ReverseProxyCertificate. Dalam skenario tersebut, Anda tidak perlu mengatur ClusterCredentialType atau ServerCredentialType ke X509.

Catatan

Thumbprint adalah identitas utama sertifikat. Untuk mengetahui thumbprint sertifikat yang Anda buat, lihat Mengambil thumbprint sertifikat.

Tabel berikut ini mencantumkan sertifikat yang Anda perlukan pada penyiapan kluster Anda:

Pengaturan CertificateInformation Deskripsi
ClusterCertificate Disarankan untuk lingkungan pengujian. Sertifikat ini diperlukan untuk mengamankan komunikasi antara node pada kluster. Anda dapat menggunakan dua sertifikat berbeda, primer dan sekunder, untuk peningkatan. Atur thumbprint sertifikat utama di bagian Thumbprint dan yang sekunder dalam variabel ThumbprintSecondary.
ClusterCertificateCommonNames Disarankan untuk lingkungan produksi. Sertifikat ini diperlukan untuk mengamankan komunikasi antara node pada kluster. Anda dapat menggunakan satu atau dua nama umum sertifikat kluster. CertificateIssuerThumbprint sesuai dengan thumbprint penerbit sertifikat ini. Jika lebih dari satu sertifikat dengan nama umum yang sama digunakan, Anda dapat menentukan beberapa thumbprint penerbit.
ClusterCertificateIssuerStores Disarankan untuk lingkungan produksi. Sertifikat ini sesuai dengan penerbit sertifikat kluster. Anda dapat memberikan nama umum penerbit dan nama penyimpanan yang sesuai di bawah bagian ini alih-alih menentukan thumbprint penerbit di bawah ClusterCertificateCommonNames. Hal ini memudahkan sertifikat penerbit kluster rollover. Beberapa penerbit dapat ditentukan jika lebih dari satu sertifikat kluster digunakan. IssuerCommonName kosong memungkinkan semua sertifikat di penyimpanan yang sesuai yang ditentukan di bawah X509StoreNames.
ServerCertificate Disarankan untuk lingkungan pengujian. Sertifikat ini disajikan kepada klien ketika mencoba menyambungkan ke kluster ini. Untuk kenyamanan, Anda dapat memilih untuk menggunakan sertifikat yang sama untuk ClusterCertificate dan ServerCertificate. Anda dapat menggunakan dua sertifikat server yang berbeda, primer dan sekunder, untuk peningkatan. Atur thumbprint sertifikat utama di bagian Thumbprint dan yang sekunder dalam variabel ThumbprintSecondary.
ServerCertificateCommonNames Disarankan untuk lingkungan produksi. Sertifikat ini disajikan kepada klien ketika mencoba menyambungkan ke kluster ini. CertificateIssuerThumbprint sesuai dengan thumbprint penerbit sertifikat ini. Jika lebih dari satu sertifikat dengan nama umum yang sama digunakan, Anda dapat menentukan beberapa thumbprint penerbit. Untuk kenyamanan, Anda dapat memilih untuk menggunakan sertifikat yang sama untuk ClusterCertificateCommonNames dan ServerCertificateCommonNames. Anda bisa menggunakan satu atau dua nama umum sertifikat server.
ServerCertificateIssuerStores Disarankan untuk lingkungan produksi. Sertifikat ini sesuai dengan penerbit sertifikat server. Anda bisa menyediakan nama umum penerbit dan nama penyimpanan terkait di bawah bagian ini alih-alih menentukan thumbprint penerbit di bawah ServerCertificateCommonNames. Hal ini memudahkan sertifikat penerbit server rollover. Beberapa penerbit dapat ditentukan jika lebih dari satu sertifikat server digunakan. IssuerCommonName kosong memungkinkan semua sertifikat di penyimpanan yang sesuai yang ditentukan di bawah X509StoreNames.
ClientCertificateThumbprints Instal kumpulan sertifikat ini pada klien yang diautentikasi. Anda dapat memiliki sejumlah sertifikat klien yang berbeda yang terinstal pada mesin yang ingin Anda izinkan akses ke kluster. Atur thumbprint setiap sertifikat dalam variabel CertificateThumbprint. Jika Anda mengatur IsAdmin ke true, klien dengan sertifikat ini diinstal di atasnya dapat melakukan aktivitas manajemen administrator pada kluster. Jika IsAdmin false, klien dengan sertifikat ini dapat melakukan tindakan yang hanya diizinkan untuk hak akses pengguna, biasanya baca-saja. Untuk informasi selengkapnya, lihat kontrol akses berbasis peran Service Fabric.
ClientCertificateCommonNames Tetapkan nama umum sertifikat klien pertama untuk CertificateCommonName. CertificateIssuerThumbprint adalah thumbprint untuk penerbit sertifikat ini. Untuk mempelajari selengkapnya tentang nama umum dan penerbit, lihat Bekerja dengan sertifikat.
ClientCertificateIssuerStores Disarankan untuk lingkungan produksi. Sertifikat ini sesuai dengan penerbit sertifikat klien (peran admin dan non-admin). Anda dapat memberikan nama umum penerbit dan nama penyimpanan terkait di bawah bagian ini alih-alih menentukan thumbprint penerbit di bawah ClientCertificateCommonNames. Ini memudahkan untuk meluncurkan sertifikat penerbit klien. Beberapa penerbit dapat ditentukan jika lebih dari satu sertifikat klien digunakan. IssuerCommonName kosong memungkinkan semua sertifikat di penyimpanan yang sesuai yang ditentukan di bawah X509StoreNames.
ReverseProxyCertificate Disarankan untuk lingkungan pengujian. Sertifikat opsional ini dapat ditentukan jika Anda ingin mengamankan proksi terbalik Anda. Pastikan reverseProxyEndpointPort diatur dalam nodeTypes jika Anda menggunakan sertifikat ini.
ReverseProxyCertificateCommonNames Disarankan untuk lingkungan produksi. Sertifikat opsional ini dapat ditentukan jika Anda ingin mengamankan proksi terbalik Anda. Pastikan reverseProxyEndpointPort diatur dalam nodeTypes jika Anda menggunakan sertifikat ini.

Berikut adalah contoh konfigurasi kluster di mana kluster, server, dan sertifikat klien telah disediakan. Untuk sertifikat cluster/server/reverseProxy, thumbprint dan nama umum tidak dapat dikonfigurasi bersama untuk jenis sertifikat yang sama.

{
   "name": "SampleCluster",
   "clusterConfigurationVersion": "1.0.0",
   "apiVersion": "10-2017",
   "nodes": [{
       "nodeName": "vm0",
       "metadata": "Replace the localhost below with valid IP address or FQDN",
       "iPAddress": "10.7.0.5",
       "nodeTypeRef": "NodeType0",
       "faultDomain": "fd:/dc1/r0",
       "upgradeDomain": "UD0"
   }, {
       "nodeName": "vm1",
       "metadata": "Replace the localhost with valid IP address or FQDN",
       "iPAddress": "10.7.0.4",
       "nodeTypeRef": "NodeType0",
       "faultDomain": "fd:/dc1/r1",
       "upgradeDomain": "UD1"
   }, {
       "nodeName": "vm2",
       "iPAddress": "10.7.0.6",
       "metadata": "Replace the localhost with valid IP address or FQDN",
       "nodeTypeRef": "NodeType0",
       "faultDomain": "fd:/dc1/r2",
       "upgradeDomain": "UD2"
   }],
   "properties": {
       "diagnosticsStore": {
       "metadata":  "Please replace the diagnostics store with an actual file share accessible from all cluster machines.",
       "dataDeletionAgeInDays": "7",
       "storeType": "FileShare",
       "IsEncrypted": "false",
       "connectionstring": "c:\\ProgramData\\SF\\DiagnosticsStore"
       },
       "security": {
           "metadata": "The Credential type X509 indicates this cluster is secured by using X509 certificates. The thumbprint format is d5 ec 42 3b 79 cb e5 07 fd 83 59 3c 56 b9 d5 31 24 25 42 64.",
           "ClusterCredentialType": "X509",
           "ServerCredentialType": "X509",
           "CertificateInformation": {
               "ClusterCertificateCommonNames": {
                 "CommonNames": [
                   {
                     "CertificateCommonName": "myClusterCertCommonName"
                   }
                 ],
                 "X509StoreName": "My"
               },
               "ClusterCertificateIssuerStores": [
                   {
                       "IssuerCommonName": "ClusterIssuer1",
                       "X509StoreNames" : "Root"
                   },
                   {
                       "IssuerCommonName": "ClusterIssuer2",
                       "X509StoreNames" : "Root"
                   }
               ],
               "ServerCertificateCommonNames": {
                 "CommonNames": [
                   {
                     "CertificateCommonName": "myServerCertCommonName",
                     "CertificateIssuerThumbprint": "7c fc 91 97 13 16 8d ff a8 ee 71 2b a2 f4 62 62 00 03 49 0d"
                   }
                 ],
                 "X509StoreName": "My"
               },
               "ClientCertificateThumbprints": [{
                   "CertificateThumbprint": "c4 c18 8e aa a8 58 77 98 65 f8 61 4a 0d da 4c 13 c5 a1 37 6e",
                   "IsAdmin": false
               }, {
                   "CertificateThumbprint": "71 de 04 46 7c 9e d0 54 4d 02 10 98 bc d4 4c 71 e1 83 41 4e",
                   "IsAdmin": true
               }]
           }
       },
       "reliabilityLevel": "Bronze",
       "nodeTypes": [{
           "name": "NodeType0",
           "clientConnectionEndpointPort": "19000",
           "clusterConnectionEndpointPort": "19001",
           "leaseDriverEndpointPort": "19002",
           "serviceConnectionEndpointPort": "19003",
           "httpGatewayEndpointPort": "19080",
           "applicationPorts": {
               "startPort": "20001",
               "endPort": "20031"
           },
           "ephemeralPorts": {
               "startPort": "20032",
               "endPort": "20062"
           },
           "isPrimary": true
       }
        ],
       "fabricSettings": [{
           "name": "Setup",
           "parameters": [{
               "name": "FabricDataRoot",
               "value": "C:\\ProgramData\\SF"
           }, {
               "name": "FabricLogRoot",
               "value": "C:\\ProgramData\\SF\\Log"
           }]
       }]
   }
}

Rollover sertifikat

Saat Anda menggunakan nama umum sertifikat alih-alih thumbprint, rollover sertifikat tidak memerlukan peningkatan konfigurasi kluster. Untuk peningkatan thumbprint penerbit, pastikan daftar thumbprint baru bersinggungan dengan daftar lama. Anda pertama-tama harus melakukan peningkatan konfigurasi dengan thumbprint penerbit baru, lalu menginstal sertifikat baru (sertifikat kluster/server dan sertifikat penerbit) di penyimpanan. Simpan sertifikat penerbit lama di penyimpanan sertifikat setidaknya selama dua jam setelah Anda menginstal sertifikat penerbit baru. Jika Anda menggunakan penyimpanan penerbit, maka tidak perlu melakukan peningkatan konfigurasi untuk rollover sertifikat penerbit. Instal sertifikat penerbit baru dengan tanggal kedaluwarsa terakhir di penyimpanan sertifikat yang sesuai dan hapus sertifikat penerbit lama setelah beberapa jam.

Memperoleh sertifikat X.509

Untuk mengamankan komunikasi dalam kluster, pertama-tama Anda harus mendapatkan sertifikat X.509 untuk node kluster Anda. Selain itu, untuk membatasi koneksi ke kluster ini ke mesin/pengguna resmi, Anda perlu mendapatkan dan menginstal sertifikat untuk mesin klien.

Untuk kluster yang menjalankan beban kerja produksi, gunakan sertifikat X.509 yang ditandatangani otoritas sertifikat (CA)untuk mengamankan kluster. Untuk informasi selengkapnya tentang cara mendapatkan sertifikat ini, lihat Cara mendapatkan sertifikat.

Ada sejumlah properti yang harus memiliki sertifikat agar berfungsi dengan baik:

  • Penyedia sertifikat harus menjadi Microsoft Enhanced RSA dan AES Cryptographic Provider

  • Saat membuat kunci RSA, pastikan kuncinya adalah 2048 bit.

  • Ekstensi Penggunaan Kunci memiliki nilai Digital Signature, Key Encipherment (a0)

  • Ekstensi Penggunaan Kunci yang Disempurnakan memiliki nilai Server Authentication (OID: 1.3.6.1.5.5.7.3.1) dan Client Authentication (OID: 1.3.6.1.5.5.7.3.2)

Untuk kluster yang Anda gunakan untuk tujuan pengujian, Anda dapat memilih untuk menggunakan sertifikat yang ditandatangani sendiri.

Untuk pertanyaan tambahan, lihat pertanyaan sertifikat yang sering diajukan.

Membuat sertifikat yang ditandatangani sendiri

Salah satu cara untuk membuat sertifikat yang ditandatangani sendiri yang dapat diamankan dengan benar adalah dengan menggunakan skrip CertSetup.ps1 di folder SDK Service Fabric di direktori C:\Program Files\Microsoft SDKs\Service Fabric\ClusterSetup\Secure. Edit file ini untuk mengubah nama default sertifikat. (Cari nilai CN=ServiceFabricDevClusterCert.) Jalankan skrip ini sebagai .\CertSetup.ps1 -Install.

Sekarang ekspor sertifikat ke file .pfx dengan kata sandi yang dilindungi. Pertama, dapatkan thumbprint sertifikat.

  1. Dari menu Mulai, jalankan Kelola sertifikat komputer.

  2. Masuk ke folder Komputer Lokal\Pribadi, dan temukan sertifikat yang Anda buat.

  3. Klik ganda sertifikat untuk membukanya, pilih tab Detail, dan gulir ke bawah ke kolom Thumbprint.

  4. Hapus spasi, dan salin nilai thumbprint ke dalam perintah PowerShell berikut ini.

  5. Ubah nilai String menjadi kata sandi aman yang sesuai untuk melindunginya, dan jalankan yang berikut ini di PowerShell:

    $pswd = ConvertTo-SecureString -String "1234" -Force –AsPlainText
    Get-ChildItem -Path cert:\localMachine\my\<Thumbprint> | Export-PfxCertificate -FilePath C:\mypfx.pfx -Password $pswd
    
  6. Untuk melihat detail sertifikat yang terinstal di mesin, jalankan perintah PowerShell berikut ini:

    $cert = Get-Item Cert:\LocalMachine\My\<Thumbprint>
    Write-Host $cert.ToString($true)
    

Atau, jika Anda memiliki langganan Azure, ikuti langkah-langkah dalam Membuat kluster Service Fabric dengan menggunakan Azure Resource Manager.

Instal sertifikat

Setelah memiliki sertifikat, Anda dapat menginstalnya pada node kluster. Node Anda harus menginstal Windows PowerShell 3.x terbaru. Ulangi langkah-langkah ini pada setiap node untuk sertifikat kluster dan server dan sertifikat sekunder apa pun.

  1. Salin file atau file .pfx ke node.

  2. Buka jendela PowerShell sebagai administrator, dan masukkan perintah berikut ini. Ganti $pswd dengan kata sandi yang Anda gunakan untuk membuat sertifikat ini. Ganti $PfxFilePath dengan jalur lengkap .pfx yang disalin ke node ini.

    $pswd = "1234"
    $PfxFilePath ="C:\mypfx.pfx"
    Import-PfxCertificate -Exportable -CertStoreLocation Cert:\LocalMachine\My -FilePath $PfxFilePath -Password (ConvertTo-SecureString -String $pswd -AsPlainText -Force)
    
  3. Sekarang atur kontrol akses pada sertifikat ini sehingga proses Service Fabric, yang berjalan di bawah akun Layanan Jaringan, dapat menggunakannya dengan menjalankan skrip berikut. Berikan thumbprint sertifikat dan LAYANAN JARINGAN untuk akun layanan. Anda dapat memeriksa bahwa ACL pada sertifikat sudah benar dengan membuka sertifikat di Mulai>Kelola sertifikat komputer dan melihat Semua Tugas>Kelola Kunci Pribadi.

    param
    (
    [Parameter(Position=1, Mandatory=$true)]
    [ValidateNotNullOrEmpty()]
    [string]$pfxThumbPrint,
    
    [Parameter(Position=2, Mandatory=$true)]
    [ValidateNotNullOrEmpty()]
    [string]$serviceAccount
    )
    
    $cert = Get-ChildItem -Path cert:\LocalMachine\My | Where-Object -FilterScript { $PSItem.ThumbPrint -eq $pfxThumbPrint; }
    
    # Specify the user, the permissions, and the permission type
    $permission = "$($serviceAccount)","FullControl","Allow" # "NT AUTHORITY\NetworkService" is the service account
    $accessRule = New-Object -TypeName System.Security.AccessControl.FileSystemAccessRule -ArgumentList $permission
    
    # Location of the machine-related keys
    $keyPath = Join-Path -Path $env:ProgramData -ChildPath "\Microsoft\Crypto\RSA\MachineKeys"
    $keyName = $cert.PrivateKey.CspKeyContainerInfo.UniqueKeyContainerName
    $keyFullPath = Join-Path -Path $keyPath -ChildPath $keyName
    
    # Get the current ACL of the private key
    $acl = (Get-Item $keyFullPath).GetAccessControl('Access')
    
    # Add the new ACE to the ACL of the private key
    $acl.SetAccessRule($accessRule)
    
    # Write back the new ACL
    Set-Acl -Path $keyFullPath -AclObject $acl -ErrorAction Stop
    
    # Observe the access rights currently assigned to this certificate
    get-acl $keyFullPath| fl
    
  4. Ulangi langkah-langkah sebelumnya untuk setiap sertifikat server. Anda juga dapat menggunakan langkah-langkah ini untuk menginstal sertifikat klien pada mesin yang ingin Anda izinkan akses ke kluster.

Membuat kluster aman

Setelah mengonfigurasi bagian keamanan dari file ClusterConfig.X509.MultiMachine.json, Anda dapat melanjutkan ke bagian Buat kluster untuk mengonfigurasi node dan membuat kluster mandiri. Ingatlah untuk menggunakan file ClusterConfig.X509.MultiMachine.json saat Anda membuat kluster. Misalnya, perintah Anda mungkin terlihat seperti berikut ini:

.\CreateServiceFabricCluster.ps1 -ClusterConfigFilePath .\ClusterConfig.X509.MultiMachine.json

Setelah Anda memiliki kluster Windows mandiri aman berhasil berjalan dan telah mengatur klien yang diautentikasi untuk menyambungkannya, ikuti langkah-langkah di bagian Sambungkan ke kluster menggunakan PowerShell untuk menyambungkannya. Contohnya:

$ConnectArgs = @{  ConnectionEndpoint = '10.7.0.5:19000';  X509Credential = $True;  StoreLocation = 'LocalMachine';  StoreName = "MY";  ServerCertThumbprint = "057b9544a6f2733e0c8d3a60013a58948213f551";  FindType = 'FindByThumbprint';  FindValue = "057b9544a6f2733e0c8d3a60013a58948213f551"   }
Connect-ServiceFabricCluster $ConnectArgs

Anda kemudian dapat menjalankan perintah PowerShell lainnya untuk bekerja dengan kluster ini. Misalnya, Anda dapat menjalankan Get-ServiceFabricNode untuk menampilkan daftar node pada kluster aman ini.

Untuk menghapus kluster, sambungkan ke node pada kluster tempat Anda mengunduh paket Service Fabric, buka baris perintah, dan buka folder paket. Sekarang jalankan perintah berikut:

.\RemoveServiceFabricCluster.ps1 -ClusterConfigFilePath .\ClusterConfig.X509.MultiMachine.json

Catatan

Konfigurasi sertifikat yang salah mungkin mencegah kluster muncul selama penyebaran. Untuk mendiagnosis sendiri masalah keamanan, lihat di grup Penampil Peristiwa Aplikasi dan Layanan Logs>Microsoft-Service Fabric.