Sdílet prostřednictvím


Zabezpečení samostatného clusteru ve Windows pomocí certifikátů X.509

Tento článek popisuje, jak zabezpečit komunikaci mezi různými uzly samostatného clusteru Windows. Popisuje také, jak ověřovat klienty, kteří se připojují k tomuto clusteru pomocí certifikátů X.509. Ověřování zajišťuje, že ke clusteru a nasazené aplikace mají přístup jenom autorizovaní uživatelé a budou moct provádět úlohy správy. Při vytváření clusteru by mělo být v clusteru povolené zabezpečení certifikátu.

Další informace o zabezpečení clusteru, jako je zabezpečení mezi uzly, zabezpečení mezi klienty a uzly a řízení přístupu na základě role, najdete ve scénářích zabezpečení clusteru.

Jaké certifikáty potřebujete?

Začněte tím, že si stáhnete balíček Service Fabric pro Windows Server do jednoho z uzlů v clusteru. Ve staženém balíčku najdete soubor ClusterConfig.X509.MultiMachine.json. Otevřete soubor a zkontrolujte část zabezpečení v oddílu vlastností:

"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"
        }
    }
},

Tato část popisuje certifikáty, které potřebujete k zabezpečení samostatného clusteru s Windows. Pokud zadáte certifikát clusteru, nastavte hodnotu ClusterCredentialType na X509. Pokud zadáte certifikát serveru pro vnější připojení, nastavte ServerCredentialType na X509. I když to není povinné, doporučujeme mít oba tyto certifikáty pro řádně zabezpečený cluster. Pokud nastavíte tyto hodnoty na X509, musíte také zadat odpovídající certifikáty nebo Service Fabric vyvolá výjimku. V některých scénářích můžete chtít zadat pouze clientCertificateThumbprints nebo ReverseProxyCertificate. V těchto scénářích nemusíte nastavovat typ ClusterCredentialType ani ServerCredentialType na X509.

Poznámka:

Kryptografický otisk je primární identita certifikátu. Pokud chcete zjistit kryptografický otisk certifikátů, které vytvoříte, přečtěte si téma Načtení kryptografického otisku certifikátu.

Následující tabulka uvádí certifikáty, které potřebujete v nastavení clusteru:

Nastavení CertificateInformation Popis
ClusterCertificate Doporučuje se pro testovací prostředí. Tento certifikát je nutný k zabezpečení komunikace mezi uzly v clusteru. K upgradu můžete použít dva různé certifikáty, primární a sekundární certifikáty. Nastavte kryptografický otisk primárního certifikátu v části Kryptografický otisk a sekundární v proměnných ThumbprintSecondary.
ClusterCertificateCommonNames Doporučuje se pro produkční prostředí. Tento certifikát je nutný k zabezpečení komunikace mezi uzly v clusteru. Můžete použít jeden nebo dva společné názvy certifikátů clusteru. CertificateIssuerThumbprint odpovídá kryptografickému otisku vystavitele tohoto certifikátu. Pokud se používá více než jeden certifikát se stejným běžným názvem, můžete zadat několik kryptografických otisků vystavitele.
ClusterCertificateIssuerStores Doporučuje se pro produkční prostředí. Tento certifikát odpovídá vystavitelu certifikátu clusteru. V této části můžete zadat běžný název vystavitele a odpovídající název úložiště místo zadání kryptografického otisku vystavitele v části ClusterCertificateCommonNames. Díky tomu je snadné převést certifikáty vystavitele clusteru. Pokud se použije více než jeden certifikát clusteru, můžete zadat více vystavitelů. Prázdný IssuerCommonName umožňuje všechny certifikáty v odpovídajících úložištích zadaných v X509StoreNames.
ServerCertificate Doporučuje se pro testovací prostředí. Tento certifikát se klientovi zobrazí při pokusu o připojení k tomuto clusteru. Pro usnadnění přístupu můžete použít stejný certifikát pro ClusterCertificate a ServerCertificate. Pro upgrade můžete použít dva různé certifikáty serveru, primární a sekundární. Nastavte kryptografický otisk primárního certifikátu v části Kryptografický otisk a sekundární v proměnných ThumbprintSecondary.
ServerCertificateCommonNames Doporučuje se pro produkční prostředí. Tento certifikát se klientovi zobrazí při pokusu o připojení k tomuto clusteru. CertificateIssuerThumbprint odpovídá kryptografickému otisku vystavitele tohoto certifikátu. Pokud se používá více než jeden certifikát se stejným běžným názvem, můžete zadat několik kryptografických otisků vystavitele. Pro usnadnění přístupu můžete použít stejný certifikát pro ClusterCertificateCommonNames a ServerCertificateCommonNames. Můžete použít jeden nebo dva společné názvy certifikátů serveru.
ServerCertificateIssuerStores Doporučuje se pro produkční prostředí. Tento certifikát odpovídá vystavitelu certifikátu serveru. V této části můžete zadat běžný název vystavitele a odpovídající název úložiště místo zadání kryptografického otisku vystavitele v části ServerCertificateCommonNames. Díky tomu můžete snadno převést certifikáty vystavitele serveru. Pokud se používá více než jeden certifikát serveru, můžete zadat více vystavitelů. Prázdný IssuerCommonName umožňuje všechny certifikáty v odpovídajících úložištích zadaných v X509StoreNames.
ClientCertificateThumbprints Nainstalujte tuto sadu certifikátů na ověřené klienty. Na počítačích, ke kterým chcete povolit přístup ke clusteru, můžete mít nainstalovaných několik různých klientských certifikátů. Nastavte kryptografický otisk každého certifikátu v proměnné CertificateThumbprint. Pokud nastavíte isAdmin na hodnotu true, klient s tímto certifikátem nainstalovaný v něm může provádět aktivity správy správce v clusteru. Pokud je IsAdmin false, klient s tímto certifikátem může provádět akce povolené pouze pro uživatelská přístupová práva, obvykle jen pro čtení. Další informace o rolích najdete v tématu Řízení přístupu na základě role Service Fabric.
ClientCertificateCommonNames Nastavte běžný název prvního klientského certifikátu pro CertificateCommonName. CertificateIssuerThumbprint je kryptografický otisk vystavitele tohoto certifikátu. Další informace o běžných názvech a vystavitele najdete v tématu Práce s certifikáty.
ClientCertificateIssuerStores Doporučuje se pro produkční prostředí. Tento certifikát odpovídá vystavitelu klientského certifikátu (role správce i role bez oprávnění správce). V této části můžete zadat běžný název vystavitele a odpovídající název úložiště místo zadání kryptografického otisku vystavitele v části ClientCertificateCommonNames. Díky tomu je snadné převést certifikáty vystavitele klientů. Pokud se používá více klientských certifikátů, můžete zadat více vystavitelů. Prázdný IssuerCommonName umožňuje všechny certifikáty v odpovídajících úložištích zadaných v X509StoreNames.
ReverseProxyCertificate Doporučuje se pro testovací prostředí. Tento volitelný certifikát je možné zadat, pokud chcete zabezpečit reverzní proxy server. Pokud používáte tento certifikát, ujistěte se, že reverseProxyEndpointPort je nastaven v nodeTypes.
ReverseProxyCertificateCommonNames Doporučuje se pro produkční prostředí. Tento volitelný certifikát je možné zadat, pokud chcete zabezpečit reverzní proxy server. Pokud používáte tento certifikát, ujistěte se, že reverseProxyEndpointPort je nastaven v nodeTypes.

Tady je příklad konfigurace clusteru, kde byly poskytnuty certifikáty clusteru, serveru a klienta. U certifikátů clusteru, serveru nebo reverseProxy není možné kryptografický otisk a běžný název nakonfigurovat společně pro stejný typ certifikátu.

{
   "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"
           }]
       }]
   }
}

Vrácení certifikátu

Pokud místo kryptografického otisku použijete běžný název certifikátu, nevyžaduje se upgrade konfigurace clusteru. U upgradů kryptografického otisku vystavitele se ujistěte, že se nový seznam kryptografických otisků protíná se starým seznamem. Nejprve musíte provést upgrade konfigurace s novými kryptografickými otisky vystavitele a pak nainstalovat nové certifikáty (certifikáty clusteru/serveru i vystavitele) v úložišti. Ponechte starý certifikát vystavitele v úložišti certifikátů alespoň dvě hodiny po instalaci nového certifikátu vystavitele. Pokud používáte úložiště vystavitelů, není nutné provést upgrade konfigurace pro převod certifikátu vystavitele. Nainstalujte nový certifikát vystavitele s druhým datem vypršení platnosti v odpovídajícím úložišti certifikátů a po několika hodinách odeberte starý certifikát vystavitele.

Získání certifikátů X.509

Pokud chcete zabezpečit komunikaci v rámci clusteru, musíte nejprve získat certifikáty X.509 pro uzly clusteru. Pokud chcete navíc omezit připojení k tomuto clusteru na autorizované počítače nebo uživatele, musíte získat a nainstalovat certifikáty pro klientské počítače.

Pro clustery, na kterých běží produkční úlohy, použijte certifikát X.509 podepsaný certifikační autoritou k zabezpečení clusteru. Další informace o tom, jak tyto certifikáty získat, naleznete v tématu Jak získat certifikát.

Aby mohl certifikát správně fungovat, musí mít několik vlastností:

  • Zprostředkovatel certifikátu musí být Microsoft Enhanced RSA a kryptografický zprostředkovatel AES.

  • Při vytváření klíče RSA se ujistěte, že je klíč 2048 bitů.

  • Rozšíření Použití klíče má hodnotu digitálního podpisu, šifrování klíče (a0)

  • Rozšíření Rozšířené použití klíče má hodnoty ověřování serveru (OID: 1.3.6.1.5.5.7.3.1) a ověřování klienta (OID: 1.3.6.1.5.5.7.3.2)

Pro clustery, které používáte pro testovací účely, můžete použít certifikát podepsaný svým držitelem.

Další dotazy najdete v nejčastějších dotazech k certifikátu.

Volitelné: Vytvoření certifikátu podepsaného svým držitelem

Jedním ze způsobů, jak vytvořit certifikát podepsaný svým držitelem, který je možné správně zabezpečit, je použít skript CertSetup.ps1 ve složce Service Fabric SDK v adresáři C:\Program Files\Microsoft SDKs\Service Fabric\ClusterSetup\Secure. Upravte tento soubor a změňte výchozí název certifikátu. (Vyhledejte hodnotu CN=ServiceFabricDevClusterCert.) Spusťte tento skript jako .\CertSetup.ps1 -Install.

Teď exportujte certifikát do souboru .pfx s chráněným heslem. Nejprve získejte kryptografický otisk certifikátu.

  1. V nabídce Start spusťte příkaz Spravovat certifikáty počítače.

  2. Přejděte do složky Místní počítač\Osobní a vyhledejte certifikát, který jste vytvořili.

  3. Poklikáním otevřete certifikát, vyberte kartu Podrobnosti a posuňte se dolů k poli Kryptografický otisk .

  4. Odeberte mezery a zkopírujte hodnotu kryptografického otisku do následujícího příkazu PowerShellu.

  5. String Změňte hodnotu na vhodné zabezpečené heslo, abyste ho ochránili, a spusťte v PowerShellu následující:

    $pswd = ConvertTo-SecureString -String "1234" -Force –AsPlainText
    Get-ChildItem -Path cert:\localMachine\my\<Thumbprint> | Export-PfxCertificate -FilePath C:\mypfx.pfx -Password $pswd
    
  6. Pokud chcete zobrazit podrobnosti o certifikátu nainstalovaném na počítači, spusťte následující příkaz PowerShellu:

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

Případně pokud máte předplatné Azure, postupujte podle kroků v tématu Vytvoření clusteru Service Fabric pomocí Azure Resource Manageru.

Instalace certifikátů

Jakmile budete mít certifikáty, můžete je nainstalovat na uzly clusteru. Uzly musí mít nainstalované nejnovější prostředí Windows PowerShell 3.x. Tento postup opakujte na každém uzlu pro certifikáty clusteru i serveru a všechny sekundární certifikáty.

  1. Zkopírujte soubor .pfx nebo soubory do uzlu.

  2. Otevřete okno PowerShellu jako správce a zadejte následující příkazy. Nahraďte $pswd heslem, které jste použili k vytvoření tohoto certifikátu. Nahraďte $PfxFilePath úplnou cestou souboru .pfx zkopírovaného do tohoto uzlu.

    $pswd = "1234"
    $PfxFilePath ="C:\mypfx.pfx"
    Import-PfxCertificate -Exportable -CertStoreLocation Cert:\LocalMachine\My -FilePath $PfxFilePath -Password (ConvertTo-SecureString -String $pswd -AsPlainText -Force)
    
  3. Teď nastavte řízení přístupu k tomuto certifikátu tak, aby proces Service Fabric, který běží pod účtem síťové služby, ho mohl použít spuštěním následujícího skriptu. Zadejte kryptografický otisk certifikátu a síťové služby pro účet služby. Seznamy ACL v certifikátu můžete zkontrolovat tak, že certifikát otevřete v okně Spustit>správu certifikátů počítače a podíváte se na všechny úlohy, které>spravují privátní klíče.

    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. Opakujte předchozí kroky pro každý certifikát serveru. Pomocí těchto kroků můžete také nainstalovat klientské certifikáty na počítače, které chcete povolit přístup ke clusteru.

Vytvoření zabezpečeného clusteru

Jakmile nakonfigurujete oddíl zabezpečení souboru ClusterConfig.X509.MultiMachine.json, můžete pokračovat v části Vytvoření clusteru a nakonfigurovat uzly a vytvořit samostatný cluster. Při vytváření clusteru nezapomeňte použít soubor ClusterConfig.X509.MultiMachine.json. Váš příkaz může vypadat například takto:

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

Po úspěšném spuštění zabezpečeného samostatného clusteru s Windows a nastavení ověřených klientů pro připojení k němu postupujte podle kroků v části Připojení ke clusteru pomocí PowerShellu a připojte se k němu. Příklad:

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

Pak můžete spustit další příkazy PowerShellu pro práci s tímto clusterem. Můžete například spustit Get-ServiceFabricNode a zobrazit seznam uzlů v tomto zabezpečeném clusteru.

Pokud chcete cluster odebrat, připojte se k uzlu v clusteru, do kterého jste stáhli balíček Service Fabric, otevřete příkazový řádek a přejděte do složky balíčku. Teď spusťte následující příkaz:

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

Poznámka:

Nesprávná konfigurace certifikátu může zabránit tomu, aby cluster během nasazování přišel. Pokud chcete sami diagnostikovat problémy se zabezpečením, podívejte se do skupiny Prohlížeč událostí protokoly>aplikací a služeb Microsoft-Service Fabric.