X.509 sertifikalarını kullanarak Windows'da tek başına kümenin güvenliğini sağlama
Bu makalede, tek başına Windows kümenizin çeşitli düğümleri arasındaki iletişimin güvenliğini sağlama açıklanmaktadır. Ayrıca X.509 sertifikalarını kullanarak bu kümeye bağlanan istemcilerin kimliğini doğrulamayı da açıklar. Kimlik doğrulaması yalnızca yetkili kullanıcıların kümeye ve dağıtılan uygulamalara erişmesini ve yönetim görevlerini gerçekleştirmesini sağlar. Küme oluşturulduğunda kümede sertifika güvenliği etkinleştirilmelidir.
Düğümden düğüme güvenlik, istemciden düğüme güvenlik ve rol tabanlı erişim denetimi gibi küme güvenliği hakkında daha fazla bilgi için bkz. Küme güvenlik senaryoları.
Hangi sertifikalara ihtiyacınız var?
Başlangıç olarak , Windows Server için Service Fabric paketini kümenizdeki düğümlerden birine indirin. İndirilen pakette bir ClusterConfig.X509.MultiMachine.json dosyası bulunur. Dosyasını açın ve özellikler bölümünün altındaki güvenlik bölümünü gözden geçirin:
"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"
}
}
},
Bu bölümde, tek başına Windows kümenizin güvenliğini sağlamak için ihtiyacınız olan sertifikalar açıklanmaktadır. Bir küme sertifikası belirtirseniz ClusterCredentialType değerini X509 olarak ayarlayın. Dış bağlantılar için bir sunucu sertifikası belirtirseniz ServerCredentialType değerini X509 olarak ayarlayın. Zorunlu olmasa da, düzgün şekilde güvenli bir küme için bu sertifikaların her ikisine de sahip olmanız önerilir. Bu değerleri X509 olarak ayarlarsanız, karşılık gelen sertifikaları da belirtmeniz gerekir, aksi takdirde Service Fabric bir özel durum oluşturur. Bazı senaryolarda yalnızca ClientCertificateThumbprints veya ReverseProxyCertificate belirtmek isteyebilirsiniz. Bu senaryolarda ClusterCredentialType veya ServerCredentialType değerini X509 olarak ayarlamanız gerekmez.
Not
Parmak izi, sertifikanın birincil kimliğidir. Oluşturduğunuz sertifikaların parmak izini bulmak için bkz. Sertifikanın parmak izini alma.
Aşağıdaki tabloda, küme kurulumunuzda ihtiyacınız olan sertifikalar listelenir:
CertificateInformation ayarı | Açıklama |
---|---|
ClusterCertificate | Bir test ortamı için önerilir. Kümedeki düğümler arasındaki iletişimin güvenliğini sağlamak için bu sertifika gereklidir. Yükseltme için birincil ve ikincil olmak üzere iki farklı sertifika kullanabilirsiniz. Parmak izi bölümündeki birincil sertifikanın parmak izini ve ThumbprintSecondary değişkenlerinde ikincil sertifikanın parmak izini ayarlayın. |
ClusterCertificateCommonNames | Üretim ortamı için önerilir. Kümedeki düğümler arasındaki iletişimin güvenliğini sağlamak için bu sertifika gereklidir. Bir veya iki küme sertifikası ortak adını kullanabilirsiniz. CertificateIssuerThumbprint, bu sertifikayı verenin parmak izine karşılık gelir. Aynı ortak ada sahip birden fazla sertifika kullanılıyorsa, birden çok veren parmak izi belirtebilirsiniz. |
ClusterCertificateIssuerStores | Üretim ortamı için önerilir. Bu sertifika, küme sertifikasının verenine karşılık gelir. ClusterCertificateCommonNames altında veren parmak izini belirtmek yerine, bu bölümün altında verenin ortak adını ve karşılık gelen depo adını sağlayabilirsiniz. Bu, küme veren sertifikalarını devretmeyi kolaylaştırır. Birden fazla küme sertifikası kullanılıyorsa birden çok veren belirtilebilir. Boş bir IssuerCommonName, X509StoreNames altında belirtilen ilgili depolardaki tüm sertifikalara izin verir. |
ServerCertificate | Bir test ortamı için önerilir. Bu sertifika, bu kümeye bağlanmaya çalıştığında istemciye sunulur. Kolaylık olması için ClusterCertificate ve ServerCertificate için aynı sertifikayı kullanmayı seçebilirsiniz. Yükseltme için birincil ve ikincil olmak üzere iki farklı sunucu sertifikası kullanabilirsiniz. Parmak izi bölümündeki birincil sertifikanın parmak izini ve ThumbprintSecondary değişkenlerinde ikincil sertifikanın parmak izini ayarlayın. |
ServerCertificateCommonNames | Üretim ortamı için önerilir. Bu sertifika, bu kümeye bağlanmaya çalıştığında istemciye sunulur. CertificateIssuerThumbprint, bu sertifikayı verenin parmak izine karşılık gelir. Aynı ortak ada sahip birden fazla sertifika kullanılıyorsa, birden çok veren parmak izi belirtebilirsiniz. Kolaylık olması için ClusterCertificateCommonNames ve ServerCertificateCommonNames için aynı sertifikayı kullanmayı seçebilirsiniz. Bir veya iki sunucu sertifikası ortak adını kullanabilirsiniz. |
ServerCertificateIssuerStores | Üretim ortamı için önerilir. Bu sertifika, sunucu sertifikasının verenine karşılık gelir. ServerCertificateCommonNames altında veren parmak izini belirtmek yerine, bu bölümün altında verenin ortak adını ve karşılık gelen depo adını sağlayabilirsiniz. Bu, sunucu veren sertifikalarını devretmeyi kolaylaştırır. Birden çok sunucu sertifikası kullanılırsa birden çok veren belirtilebilir. Boş bir IssuerCommonName, X509StoreNames altında belirtilen ilgili depolardaki tüm sertifikalara izin verir. |
ClientCertificateThumbprints | Bu sertifika kümesini kimliği doğrulanmış istemcilere yükleyin. Kümeye erişime izin vermek istediğiniz makinelerde bir dizi farklı istemci sertifikası yüklü olabilir. CertificateThumbprint değişkenindeki her sertifikanın parmak izini ayarlayın. IsAdmin'i true olarak ayarlarsanız, bu sertifikanın yüklü olduğu istemci kümede yönetici yönetim etkinlikleri gerçekleştirebilir. IsAdmin false ise, bu sertifikaya sahip istemci yalnızca kullanıcı erişim hakları için izin verilen eylemleri gerçekleştirebilir( genellikle salt okunurdur). Roller hakkında daha fazla bilgi için bkz. Service Fabric rol tabanlı erişim denetimi. |
ClientCertificateCommonNames | CertificateCommonName için ilk istemci sertifikasının ortak adını ayarlayın. CertificateIssuerThumbprint, bu sertifikayı verenin parmak izidir. Ortak adlar ve veren hakkında daha fazla bilgi edinmek için bkz. Sertifikalarla çalışma. |
ClientCertificateIssuerStores | Üretim ortamı için önerilir. Bu sertifika, istemci sertifikasının verenine karşılık gelir (hem yönetici hem de yönetici olmayan roller). ClientCertificateCommonNames altında veren parmak izini belirtmek yerine, bu bölümün altında verenin ortak adını ve karşılık gelen depo adını sağlayabilirsiniz. Bu, istemci veren sertifikalarını devretmeyi kolaylaştırır. Birden fazla istemci sertifikası kullanılıyorsa birden çok veren belirtilebilir. Boş bir IssuerCommonName, X509StoreNames altında belirtilen ilgili depolardaki tüm sertifikalara izin verir. |
ReverseProxyCertificate | Bir test ortamı için önerilir. Ters ara sunucunuzun güvenliğini sağlamak istiyorsanız bu isteğe bağlı sertifika belirtilebilir. Bu sertifikayı kullanıyorsanız nodeTypes içinde reverseProxyEndpointPort değerinin ayarlandığından emin olun. |
ReverseProxyCertificateCommonNames | Üretim ortamı için önerilir. Ters ara sunucunuzun güvenliğini sağlamak istiyorsanız bu isteğe bağlı sertifika belirtilebilir. Bu sertifikayı kullanıyorsanız nodeTypes içinde reverseProxyEndpointPort değerinin ayarlandığından emin olun. |
Aşağıda küme, sunucu ve istemci sertifikalarının sağlandığı örnek bir küme yapılandırması verilmiştir. Küme/sunucu/reverseProxy sertifikaları için parmak izi ve ortak ad aynı sertifika türü için birlikte yapılandırılamaz.
{
"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"
}]
}]
}
}
Sertifika geçişi
Parmak izi yerine sertifika ortak adı kullandığınızda, sertifika geçişi için küme yapılandırma yükseltmesi gerekmez. Veren parmak izi yükseltmeleri için yeni parmak izi listesinin eski listeyle kesiştiğinden emin olun. Önce yeni veren parmak izleriyle bir yapılandırma yükseltmesi yapmanız ve ardından yeni sertifikaları (hem küme/sunucu sertifikası hem de veren sertifikaları) depoya yüklemeniz gerekir. Yeni veren sertifikasını yükledikten sonra eski veren sertifikayı sertifika deposunda en az iki saat tutun. Veren depoları kullanıyorsanız, veren sertifika geçişi için yapılandırma yükseltmesi yapılması gerekmez. Yeni veren sertifikasını ilgili sertifika deposuna son kullanma tarihiyle yükleyin ve birkaç saat sonra eski veren sertifikasını kaldırın.
X.509 sertifikalarını alma
Küme içindeki iletişimin güvenliğini sağlamak için öncelikle küme düğümleriniz için X.509 sertifikaları edinmeniz gerekir. Ayrıca, bu kümeyle bağlantıyı yetkili makinelerle/kullanıcılarla sınırlandırmak için istemci makineleri için sertifikalar edinmeniz ve yüklemeniz gerekir.
Üretim iş yüklerini çalıştıran kümeler için, kümenin güvenliğini sağlamak için sertifika yetkilisi (CA) imzalı X.509 sertifikası kullanın. Bu sertifikaları alma hakkında daha fazla bilgi için bkz. Sertifika alma.
Sertifikanın düzgün çalışması için sahip olması gereken bir dizi özellik vardır:
Sertifikanın sağlayıcısı Microsoft Enhanced RSA ve AES Şifreleme Sağlayıcısı olmalıdır
RSA anahtarı oluştururken anahtarın 2048 bit olduğundan emin olun.
Anahtar Kullanımı uzantısı, Dijital İmza, Anahtar Şifreleme (a0) değerine sahiptir
Gelişmiş Anahtar Kullanımı uzantısı, Sunucu Kimlik Doğrulaması (OID: 1.3.6.1.5.5.7.3.1) ve İstemci Kimlik Doğrulaması (OID: 1.3.6.1.5.5.7.3.2) değerlerine sahiptir
Test amacıyla kullandığınız kümeler için otomatik olarak imzalanan bir sertifika kullanmayı seçebilirsiniz.
Ek sorular için sık sorulan sertifika sorularına bakın.
İsteğe bağlı: Otomatik olarak imzalanan sertifika oluşturma
Doğru şekilde güvenli hale getirilebilen otomatik olarak imzalanan bir sertifika oluşturmanın bir yolu, C:\Program Files\Microsoft SDKs\Service Fabric\ClusterSetup\Secure dizinindeki Service Fabric SDK klasöründeki CertSetup.ps1 betiğini kullanmaktır. Sertifikanın varsayılan adını değiştirmek için bu dosyayı düzenleyin. (CN=ServiceFabricDevClusterCert değerini arayın.) Bu betiği olarak .\CertSetup.ps1 -Install
çalıştırın.
Şimdi sertifikayı korumalı parolayla bir .pfx dosyasına aktarın. İlk olarak sertifikanın parmak izini alın.
Başlat menüsünde Bilgisayar sertifikalarını yönet'i çalıştırın.
Yerel Bilgisayar\Kişisel klasörüne gidin ve oluşturduğunuz sertifikayı bulun.
Sertifikayı açmak için çift tıklayın, Ayrıntılar sekmesini seçin ve parmak izi alanına kadar aşağı kaydırın.
Boşlukları kaldırın ve parmak izi değerini aşağıdaki PowerShell komutuna kopyalayın.
String
Değeri korumak için uygun bir güvenli parolayla değiştirin ve PowerShell'de aşağıdakileri çalıştırın:$pswd = ConvertTo-SecureString -String "1234" -Force –AsPlainText Get-ChildItem -Path cert:\localMachine\my\<Thumbprint> | Export-PfxCertificate -FilePath C:\mypfx.pfx -Password $pswd
Makinede yüklü bir sertifikanın ayrıntılarını görmek için aşağıdaki PowerShell komutunu çalıştırın:
$cert = Get-Item Cert:\LocalMachine\My\<Thumbprint> Write-Host $cert.ToString($true)
Alternatif olarak, Azure aboneliğiniz varsa Azure Resource Manager kullanarak Service Fabric kümesi oluşturma bölümündeki adımları izleyin.
Sertifikaları yükleme
Sertifikalarınız olduktan sonra bunları küme düğümlerine yükleyebilirsiniz. Düğümlerinizde en son Windows PowerShell 3.x yüklü olmalıdır. Hem küme hem de sunucu sertifikaları ve ikincil sertifikalar için her düğümde bu adımları yineleyin.
.pfx dosyasını veya dosyalarını düğüme kopyalayın.
Yönetici olarak bir PowerShell penceresi açın ve aşağıdaki komutları girin. $pswd değerini bu sertifikayı oluşturmak için kullandığınız parolayla değiştirin. $PfxFilePath yerine bu düğüme kopyalanan .pfx dosyasının tam yolunu yazın.
$pswd = "1234" $PfxFilePath ="C:\mypfx.pfx" Import-PfxCertificate -Exportable -CertStoreLocation Cert:\LocalMachine\My -FilePath $PfxFilePath -Password (ConvertTo-SecureString -String $pswd -AsPlainText -Force)
Şimdi bu sertifikada erişim denetimini, Ağ Hizmeti hesabı altında çalışan Service Fabric işleminin aşağıdaki betiği çalıştırarak kullanabilmesi için ayarlayın. Hizmet hesabı için sertifikanın ve AĞ HİzMETİ'nin parmak izini sağlayın. Sertifikayı Bilgisayar sertifikalarını yönetmeyibaşlat'ta> açıp Tüm Görevler>Özel Anahtarları Yönet'e bakarak sertifikadaki ACL'lerin doğru olup olmadığını kontrol edebilirsiniz.
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
Her sunucu sertifikası için önceki adımları yineleyin. Kümeye erişim izni vermek istediğiniz makinelere istemci sertifikalarını yüklemek için de bu adımları kullanabilirsiniz.
Güvenli kümeyi oluşturma
ClusterConfig.X509.MultiMachine.json dosyasının güvenlik bölümünü yapılandırdıktan sonra, düğümleri yapılandırmak ve tek başına kümeyi oluşturmak için Küme oluşturma bölümüne geçebilirsiniz. Kümeyi oluştururken ClusterConfig.X509.MultiMachine.json dosyasını kullanmayı unutmayın. Örneğin, komutunuz aşağıdaki gibi görünebilir:
.\CreateServiceFabricCluster.ps1 -ClusterConfigFilePath .\ClusterConfig.X509.MultiMachine.json
Güvenli tek başına Windows kümesi başarıyla çalıştırıldıktan ve kimliği doğrulanmış istemcileri buna bağlanmak için ayarladıktan sonra, bağlanmak için PowerShell kullanarak kümeye bağlanma bölümündeki adımları izleyin. Örnek:
$ConnectArgs = @{ ConnectionEndpoint = '10.7.0.5:19000'; X509Credential = $True; StoreLocation = 'LocalMachine'; StoreName = "MY"; ServerCertThumbprint = "057b9544a6f2733e0c8d3a60013a58948213f551"; FindType = 'FindByThumbprint'; FindValue = "057b9544a6f2733e0c8d3a60013a58948213f551" }
Connect-ServiceFabricCluster $ConnectArgs
Daha sonra bu kümeyle çalışmak için diğer PowerShell komutlarını çalıştırabilirsiniz. Örneğin, bu güvenli kümedeki düğümlerin listesini göstermek için Get-ServiceFabricNode komutunu çalıştırabilirsiniz.
Kümeyi kaldırmak için Service Fabric paketini indirdiğiniz kümedeki düğüme bağlanın, bir komut satırı açın ve paket klasörüne gidin. Şimdi aşağıdaki komutu çalıştırın:
.\RemoveServiceFabricCluster.ps1 -ClusterConfigFilePath .\ClusterConfig.X509.MultiMachine.json
Not
Yanlış sertifika yapılandırması, dağıtım sırasında kümenin gelmesini engelleyebilir. Güvenlik sorunlarını kendi kendine tanılamak için Uygulamalar ve Hizmetler Günlükleri>Microsoft-Service Fabric Olay Görüntüleyicisi grubuna bakın.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin