Dela via


Skydda ett fristående kluster i Windows med hjälp av X.509-certifikat

Den här artikeln beskriver hur du skyddar kommunikationen mellan de olika noderna i ditt fristående Windows-kluster. Den beskriver också hur du autentiserar klienter som ansluter till det här klustret med hjälp av X.509-certifikat. Autentisering säkerställer att endast behöriga användare kan komma åt klustret och de distribuerade programmen och utföra hanteringsuppgifter. Certifikatsäkerhet bör aktiveras i klustret när klustret skapas.

Mer information om klustersäkerhet, till exempel säkerhet från nod till nod, säkerhet från klient till nod och rollbaserad åtkomstkontroll finns i Klustersäkerhetsscenarier.

Vilka certifikat behöver du?

Börja med att ladda ned Service Fabric för Windows Server-paketet till en av noderna i klustret. I det nedladdade paketet hittar du en ClusterConfig.X509.MultiMachine.json fil. Öppna filen och granska avsnittet för säkerhet under avsnittet egenskaper:

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

I det här avsnittet beskrivs de certifikat som du behöver för att skydda ditt fristående Windows-kluster. Om du anger ett klustercertifikat anger du värdet för ClusterCredentialType till X509. Om du anger ett servercertifikat för externa anslutningar anger du ServerCredentialType till X509. Även om det inte är obligatoriskt rekommenderar vi att du har båda dessa certifikat för ett korrekt skyddat kluster. Om du anger dessa värden till X509 måste du också ange motsvarande certifikat eller så utlöser Service Fabric ett undantag. I vissa scenarier kanske du bara vill ange ClientCertificateThumbprints eller ReverseProxyCertificate. I dessa scenarier behöver du inte ange ClusterCredentialType eller ServerCredentialType till X509.

Kommentar

Ett tumavtryck är den primära identiteten för ett certifikat. Information om tumavtrycket för de certifikat som du skapar finns i Hämta ett tumavtryck för ett certifikat.

I följande tabell visas de certifikat som du behöver i klusterkonfigurationen:

CertificateInformation-inställning Beskrivning
ClusterCertificate Rekommenderas för en testmiljö. Det här certifikatet krävs för att skydda kommunikationen mellan noderna i ett kluster. Du kan använda två olika certifikat, ett primärt och ett sekundärt, för uppgradering. Ange tumavtrycket för det primära certifikatet i avsnittet Tumavtryck och det sekundära i variablerna ThumbprintSecondary.
ClusterCertificateCommonNames Rekommenderas för en produktionsmiljö. Det här certifikatet krävs för att skydda kommunikationen mellan noderna i ett kluster. Du kan använda ett eller två vanliga namn på klustercertifikatet. CertificateIssuerThumbprint motsvarar tumavtrycket för utfärdaren av det här certifikatet. Om fler än ett certifikat med samma gemensamma namn används kan du ange flera tumavtryck för utfärdaren.
ClusterCertificateIssuerStores Rekommenderas för en produktionsmiljö. Det här certifikatet motsvarar utfärdaren av klustercertifikatet. Du kan ange utfärdarens gemensamma namn och motsvarande butiksnamn under det här avsnittet i stället för att ange tumavtrycket för utfärdaren under ClusterCertificateCommonNames. Detta gör det enkelt att distribuera klusterutfärdarcertifikat. Flera utfärdare kan anges om fler än ett klustercertifikat används. Ett tomt IssuerCommonName tillåter alla certifikat i motsvarande butiker som anges under X509StoreNames.
ServerCertificate Rekommenderas för en testmiljö. Det här certifikatet visas för klienten när det försöker ansluta till det här klustret. För enkelhetens skull kan du välja att använda samma certifikat för ClusterCertificate och ServerCertificate. Du kan använda två olika servercertifikat, ett primärt och ett sekundärt, för uppgradering. Ange tumavtrycket för det primära certifikatet i avsnittet Tumavtryck och det sekundära i variablerna ThumbprintSecondary.
ServerCertificateCommonNames Rekommenderas för en produktionsmiljö. Det här certifikatet visas för klienten när det försöker ansluta till det här klustret. CertificateIssuerThumbprint motsvarar tumavtrycket för utfärdaren av det här certifikatet. Om fler än ett certifikat med samma gemensamma namn används kan du ange flera tumavtryck för utfärdaren. För enkelhetens skull kan du välja att använda samma certifikat för ClusterCertificateCommonNames och ServerCertificateCommonNames. Du kan använda ett eller två vanliga namn på servercertifikatet.
ServerCertificateIssuerStores Rekommenderas för en produktionsmiljö. Det här certifikatet motsvarar utfärdaren av servercertifikatet. Du kan ange utfärdarens gemensamma namn och motsvarande butiksnamn under det här avsnittet i stället för att ange utfärdarens tumavtryck under ServerCertificateCommonNames. Det gör det enkelt att distribuera certifikat för serverutfärdare. Flera utfärdare kan anges om fler än ett servercertifikat används. Ett tomt IssuerCommonName tillåter alla certifikat i motsvarande butiker som anges under X509StoreNames.
ClientCertificateThumbprints Installera den här uppsättningen certifikat på de autentiserade klienterna. Du kan ha ett antal olika klientcertifikat installerade på de datorer som du vill tillåta åtkomst till klustret. Ange tumavtrycket för varje certifikat i variabeln CertificateThumbprint. Om du anger IsAdmin till true kan klienten med det här certifikatet installerat utföra administratörshanteringsaktiviteter i klustret. Om IsAdmin är falskt kan klienten med det här certifikatet endast utföra de åtgärder som tillåts för användaråtkomsträttigheter, vanligtvis skrivskyddad. Mer information om roller finns i Rollbaserad åtkomstkontroll i Service Fabric.
ClientCertificateCommonNames Ange det vanliga namnet på det första klientcertifikatet för CertificateCommonName. CertificateIssuerThumbprint är tumavtrycket för utfärdaren av det här certifikatet. Mer information om vanliga namn och utfärdaren finns i Arbeta med certifikat.
ClientCertificateIssuerStores Rekommenderas för en produktionsmiljö. Det här certifikatet motsvarar utfärdaren av klientcertifikatet (både administratörs- och icke-administratörsroller). Du kan ange utfärdarens gemensamma namn och motsvarande butiksnamn under det här avsnittet i stället för att ange utfärdarens tumavtryck under ClientCertificateCommonNames. Detta gör det enkelt att distribuera klientutfärdarcertifikat. Flera utfärdare kan anges om fler än ett klientcertifikat används. Ett tomt IssuerCommonName tillåter alla certifikat i motsvarande butiker som anges under X509StoreNames.
ReverseProxyCertificate Rekommenderas för en testmiljö. Det här valfria certifikatet kan anges om du vill skydda den omvända proxyn. Kontrollera att reverseProxyEndpointPort har angetts i nodeTypes om du använder det här certifikatet.
ReverseProxyCertificateCommonNames Rekommenderas för en produktionsmiljö. Det här valfria certifikatet kan anges om du vill skydda den omvända proxyn. Kontrollera att reverseProxyEndpointPort har angetts i nodeTypes om du använder det här certifikatet.

Här är ett exempel på en klusterkonfiguration där kluster-, server- och klientcertifikat har angetts. För kluster-/server-/reverseProxy-certifikat kan tumavtrycket och det gemensamma namnet inte konfigureras tillsammans för samma certifikattyp.

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

Redundans för certifikat

När du använder ett gemensamt certifikatnamn i stället för ett tumavtryck kräver inte certifikatåterställning någon uppgradering av klusterkonfigurationen. För uppgraderingar av tumavtryck för utfärdare kontrollerar du att den nya tumavtryckslistan korsar den gamla listan. Du måste först göra en konfigurationsuppgradering med de nya tumavtrycken för utfärdaren och sedan installera de nya certifikaten (både kluster-/servercertifikat och utfärdarcertifikat) i arkivet. Behåll det gamla utfärdarcertifikatet i certifikatarkivet i minst två timmar efter att du har installerat det nya utfärdarcertifikatet. Om du använder utfärdararkiv behöver ingen konfigurationsuppgradering utföras för distribution av utfärdarcertifikat. Installera det nya utfärdarcertifikatet med ett senare utgångsdatum i motsvarande certifikatarkiv och ta bort det gamla utfärdarcertifikatet efter några timmar.

Hämta X.509-certifikaten

För att skydda kommunikationen i klustret måste du först skaffa X.509-certifikat för dina klusternoder. För att begränsa anslutningen till det här klustret till auktoriserade datorer/användare måste du dessutom hämta och installera certifikat för klientdatorerna.

För kluster som kör produktionsarbetsbelastningar använder du ett certifikatutfärdare (CA)-signerat X.509-certifikat för att skydda klustret. Mer information om hur du hämtar dessa certifikat finns i Så här hämtar du ett certifikat.

Det finns ett antal egenskaper som certifikatet måste ha för att fungera korrekt:

  • Certifikatets provider måste vara Microsoft Enhanced RSA och AES Cryptographic Provider

  • När du skapar en RSA-nyckel kontrollerar du att nyckeln är 2 048 bitar.

  • Nyckelanvändningstillägget har värdet Digital signatur, Nyckelchiffrering (a0)

  • Tillägget Utökad nyckelanvändning har värden för serverautentisering (OID: 1.3.6.1.5.5.7.3.1) och klientautentisering (OID: 1.3.6.1.5.5.7.3.2)

För kluster som du använder i testsyfte kan du välja att använda ett självsignerat certifikat.

Mer information finns i vanliga frågor och svar om certifikat.

Valfritt: Skapa ett självsignerat certifikat

Ett sätt att skapa ett självsignerat certifikat som kan skyddas på rätt sätt är att använda skriptet CertSetup.ps1 i Service Fabric SDK-mappen i katalogen C:\Program Files\Microsoft SDKs\Service Fabric\ClusterSetup\Secure. Redigera den här filen om du vill ändra certifikatets standardnamn. (Leta efter värdet CN=ServiceFabricDevClusterCert.) Kör det här skriptet som .\CertSetup.ps1 -Install.

Exportera nu certifikatet till en .pfx-fil med ett skyddat lösenord. Hämta först tumavtrycket för certifikatet.

  1. På Start-menyn kör du Hantera datorcertifikat.

  2. Gå till mappen Lokal dator\Personlig och leta reda på certifikatet som du skapade.

  3. Dubbelklicka på certifikatet för att öppna det, välj fliken Information och rulla ned till fältet Tumavtryck .

  4. Ta bort blankstegen och kopiera tumavtrycksvärdet till följande PowerShell-kommando.

  5. Ändra värdet String till ett lämpligt säkert lösenord för att skydda det och kör följande i PowerShell:

    $pswd = ConvertTo-SecureString -String "1234" -Force –AsPlainText
    Get-ChildItem -Path cert:\localMachine\my\<Thumbprint> | Export-PfxCertificate -FilePath C:\mypfx.pfx -Password $pswd
    
  6. Om du vill se information om ett certifikat som är installerat på datorn kör du följande PowerShell-kommando:

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

Om du har en Azure-prenumeration kan du också följa stegen i Skapa ett Service Fabric-kluster med hjälp av Azure Resource Manager.

Installera certifikaten

När du har certifikat kan du installera dem på klusternoderna. Noderna måste ha den senaste Versionen av Windows PowerShell 3.x installerad på dem. Upprepa de här stegen på varje nod för både kluster- och servercertifikat och eventuella sekundära certifikat.

  1. Kopiera pfx-filen eller filerna till noden.

  2. Öppna ett PowerShell-fönster som administratör och ange följande kommandon. Ersätt $pswd med lösenordet som du använde för att skapa det här certifikatet. Ersätt $PfxFilePath med den fullständiga sökvägen för den .pfx som kopierats till den här noden.

    $pswd = "1234"
    $PfxFilePath ="C:\mypfx.pfx"
    Import-PfxCertificate -Exportable -CertStoreLocation Cert:\LocalMachine\My -FilePath $PfxFilePath -Password (ConvertTo-SecureString -String $pswd -AsPlainText -Force)
    
  3. Ange nu åtkomstkontrollen för det här certifikatet så att Service Fabric-processen, som körs under nätverkstjänstkontot, kan använda den genom att köra följande skript. Ange tumavtrycket för certifikatet och NÄTVERKSTJÄNSTEN för tjänstkontot. Du kan kontrollera att ACL:erna på certifikatet är korrekta genom att öppna certifikatet i Starta>Hantera datorcertifikat och titta på Alla uppgifter>Hantera privata nycklar.

    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. Upprepa föregående steg för varje servercertifikat. Du kan också använda de här stegen för att installera klientcertifikaten på de datorer som du vill tillåta åtkomst till klustret.

Skapa det säkra klustret

När du har konfigurerat säkerhetsavsnittet i filen ClusterConfig.X509.MultiMachine.json kan du gå vidare till avsnittet Skapa klustret för att konfigurera noderna och skapa det fristående klustret. Kom ihåg att använda filen ClusterConfig.X509.MultiMachine.json när du skapar klustret. Kommandot kan till exempel se ut så här:

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

När du har kört det säkra fristående Windows-klustret och konfigurerat autentiserade klienter för att ansluta till det följer du stegen i avsnittet Anslut till ett kluster med PowerShell för att ansluta till det. Till exempel:

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

Du kan sedan köra andra PowerShell-kommandon för att arbeta med det här klustret. Du kan till exempel köra Get-ServiceFabricNode för att visa en lista över noder i det här säkra klustret.

Om du vill ta bort klustret ansluter du till noden i klustret där du laddade ned Service Fabric-paketet, öppnar en kommandorad och går till paketmappen. Kör nu följande kommando:

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

Kommentar

Felaktig certifikatkonfiguration kan förhindra att klustret kommer upp under distributionen. Om du vill diagnostisera säkerhetsproblem själv kan du titta i Prikazivač događaja-gruppen Program- och tjänstloggar>Microsoft-Service Fabric.