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 s Windows. Popisuje také, jak ověřovat klienty, kteří se připojují k tomuto clusteru pomocí certifikátů X.509. Ověřování zajišťuje, aby ke clusteru a nasazených aplikacím a provádění úloh správy mohli přistupovat jenom oprávnění uživatelé. Při vytváření clusteru by mělo být v clusteru povolené zabezpečení certifikátů.

Další informace o zabezpečení clusteru, jako je zabezpečení mezi uzly, zabezpečení typu klient-uzel a řízení přístupu na základě role, najdete v tématu Scénáře 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é balíčku najdete soubor ClusterConfig.X509.MultiMachine.json. Otevřete soubor a zkontrolujte zabezpečení v části vlastnosti:

"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 externí připojení, nastavte ServerCredentialType na X509. I když to není povinné, doporučujeme mít oba tyto certifikáty pro správně 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 ClusterCredentialType nebo ServerCredentialType na X509.

Poznámka

Kryptografický otisk je primární identita certifikátu. Informace o kryptografickém otisku certifikátů, které vytvoříte, najdete v tématu Načtení kryptografického otisku certifikátu.

V následující tabulce jsou uvedeny certifikáty, které potřebujete pro nastavení clusteru:

Nastavení CertificateInformation Popis
ClusterCertificate Doporučeno pro testovací prostředí. Tento certifikát se vyžaduje k zabezpečení komunikace mezi uzly v clusteru. K upgradu můžete použít dva různé certifikáty, primární a sekundární. Nastavte kryptografický otisk primárního certifikátu v části Kryptografický otisk a kryptografický otisk sekundárního v proměnných ThumbprintSecondary.
ClusterCertificateCommonNames Doporučeno pro produkční prostředí. Tento certifikát se vyžaduje k zabezpečení komunikace mezi uzly v clusteru. Můžete použít jeden nebo dva běž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 více kryptografických otisků vystavitele.
ClusterCertificateIssuerStores Doporučeno pro produkční prostředí. Tento certifikát odpovídá vystaviteli 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 určení kryptografického otisku vystavitele v části ClusterCertificateCommonNames. To usnadňuje vrácení certifikátů vystavitelů clusteru. Pokud se používá více než jeden certifikát clusteru, je možné 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čeno pro testovací prostředí. Tento certifikát se klientovi zobrazí, když se pokusí připojit k tomuto clusteru. Pro usnadnění přístupu můžete použít stejný certifikát pro ClusterCertificate a ServerCertificate. K upgradu 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 kryptografický otisk sekundárního v proměnných ThumbprintSecondary.
ServerCertificateCommonNames Doporučeno pro produkční prostředí. Tento certifikát se klientovi zobrazí, když se pokusí připojit 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 více 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 běžné názvy certifikátů serveru.
ServerCertificateIssuerStores Doporučeno pro produkční prostředí. Tento certifikát odpovídá vystaviteli 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 určení kryptografického otisku vystavitele v části ServerCertificateCommonNames. To usnadňuje vrácení certifikátů vystavitelů serveru. Pokud se používá více než jeden certifikát serveru, je možné 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, 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 jednotlivých certifikátů v proměnné CertificateThumbprint. Pokud nastavíte IsAdmin na hodnotu true, klient s tímto certifikátem na něm nainstalovaný může provádět aktivity správy správce v clusteru. Pokud je IsAdmin nepravda, 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 v 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 vystavitelech najdete v tématu Práce s certifikáty.
ClientCertificateIssuerStores Doporučeno pro produkční prostředí. Tento certifikát odpovídá vystaviteli klientského certifikátu (role správce i role nesprávce). V této části můžete zadat běžný název vystavitele a odpovídající název úložiště, místo abyste zadali kryptografický otisk vystavitele v části ClientCertificateCommonNames. Díky tomu je snadné převést certifikáty vystavitele klientů. Pokud se používá více než jeden klientský certifikát, je možné 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čeno pro testovací prostředí. Tento volitelný certifikát můžete zadat, pokud chcete zabezpečit reverzní proxy server. Pokud používáte tento certifikát, ujistěte se, že je v nodeTypes nastavený reverseProxyEndpointPort.
ReverseProxyCertificateCommonNames Doporučeno pro produkční prostředí. Tento volitelný certifikát můžete zadat, pokud chcete zabezpečit reverzní proxy server. Pokud používáte tento certifikát, ujistěte se, že je v nodeTypes nastavený reverseProxyEndpointPort.

Tady je příklad konfigurace clusteru, kde byly poskytnuty certifikáty clusteru, serveru a klienta. U certifikátů clusteru, serveru nebo reverseProxy nejde 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"
           }]
       }]
   }
}

Výměna certifikátů

Pokud místo kryptografického otisku použijete běžný název certifikátu, nevyžaduje změna certifikátu 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 pomocí kryptografických otisků nového vystavitele a potom nainstalovat nové certifikáty (certifikát clusteru nebo serveru a certifikáty vystavitele) v úložišti. Uchovávejte starý certifikát vystavitele v úložišti certifikátů nejméně dvě hodiny po instalaci nového certifikátu vystavitele. Pokud používáte úložiště vystavitelů, nemusí se při přechodu certifikátu vystavitele provádět žádný upgrade konfigurace. Nainstalujte nový certifikát vystavitele s pozdější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.

V případě clusterů, ve kterých běží produkční úlohy, použijte k zabezpečení clusteru certifikát X.509 podepsaný certifikační autoritou(CA). Další informace o tom, jak tyto certifikáty získat, najdete v tématu Jak získat certifikát.

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

  • Zprostředkovatelem certifikátu musí být Microsoft Enhanced RSA a Zprostředkovatel kryptografických služeb AES.

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

  • Rozšíření Použití klíče má hodnotu Digitální podpis, Š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í klientů (OID: 1.3.6.1.5.5.7.3.2).

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

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

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ý se dá 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. Chcete-li změnit výchozí název certifikátu, upravte tento soubor. (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. Z nabídky Start spusťte příkaz Spravovat certifikáty počítačů.

  2. Přejděte do složky Místní počítač\Osobní a najděte 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, které ho ochrání, a v PowerShellu spusťte následující příkaz:

    $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 Manager.

Instalace certifikátů

Jakmile budete mít certifikáty, můžete je nainstalovat na uzly clusteru. Na uzlech musí být nainstalovaná nejnovější verze 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 nebo soubory .pfx 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írovanou 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. Nyní nastavte řízení přístupu pro tento certifikát tak, aby ho proces Service Fabric, který běží pod účtem síťové služby, mohl používat spuštěním následujícího skriptu. Zadejte kryptografický otisk certifikátu a síťové služby pro účet služby. Správnost seznamů ACL na certifikátu můžete zkontrolovat tak, že certifikát otevřete v části Spustit>správu certifikátů počítačů a podíváte se na Všechny úlohy>Správa privátních klíčů.

    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. Tyto kroky můžete také použít k instalaci klientských certifikátů na počítače, kterým chcete povolit přístup ke clusteru.

Vytvoření zabezpečeného clusteru

Po konfiguraci části zabezpečení v souboru ClusterConfig.X509.MultiMachine.json můžete přejít do části Vytvoření clusteru , kde nakonfigurujete uzly a vytvoříte samostatný cluster. Při vytváření clusteru nezapomeňte použít soubor ClusterConfig.X509.MultiMachine.json. 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 rutinu 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 spuštění clusteru během nasazování. Pokud chcete problémy se zabezpečením diagnostikovat sami, podívejte se do Prohlížeč událostí skupiny Protokoly> aplikací a služebMicrosoft-Service Fabric.