Een zelfstandig cluster in Windows beveiligen met X.509-certificaten

In dit artikel wordt beschreven hoe u de communicatie tussen de verschillende knooppunten van uw zelfstandige Windows-cluster kunt beveiligen. Er wordt ook beschreven hoe u clients verifieert die verbinding maken met dit cluster met behulp van X.509-certificaten. Verificatie zorgt ervoor dat alleen geautoriseerde gebruikers toegang hebben tot het cluster en de geïmplementeerde toepassingen en beheertaken kunnen uitvoeren. Certificaatbeveiliging moet zijn ingeschakeld op het cluster wanneer het cluster wordt gemaakt.

Zie Clusterbeveiligingsscenario's voor meer informatie over clusterbeveiliging, zoals beveiliging van knooppunten naar knooppunten, beveiliging van client naar knooppunt en op rollen gebaseerd toegangsbeheer.

Welke certificaten hebt u nodig?

Download eerst het Service Fabric voor Windows Server-pakket naar een van de knooppunten in uw cluster. In het gedownloade pakket vindt u het bestand ClusterConfig.X509.MultiMachine.json. Open het bestand en controleer de sectie op beveiliging onder de sectie Eigenschappen:

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

In deze sectie worden de certificaten beschreven die u nodig hebt om uw zelfstandige Windows-cluster te beveiligen. Als u een clustercertificaat opgeeft, stelt u de waarde van ClusterCredentialType in op X509. Als u een servercertificaat voor externe verbindingen opgeeft, stelt u ServerCredentialType in op X509. Hoewel dit niet verplicht is, raden we u aan beide certificaten te gebruiken voor een goed beveiligd cluster. Als u deze waarden instelt op X509, moet u ook de bijbehorende certificaten opgeven, anders genereert Service Fabric een uitzondering. In sommige scenario's wilt u mogelijk alleen de ClientCertificateThumbprints of het ReverseProxyCertificate opgeven. In deze scenario's hoeft u ClusterCredentialType of ServerCredentialType niet in te stellen op X509.

Notitie

Een vingerafdruk is de primaire identiteit van een certificaat. Zie Een vingerafdruk van een certificaat ophalen voor informatie over de vingerafdruk van de certificaten die u maakt.

De volgende tabel bevat de certificaten die u nodig hebt voor de clusterinstallatie:

Instelling Certificaatinformatie Beschrijving
ClusterCertificaat Aanbevolen voor een testomgeving. Dit certificaat is vereist om de communicatie tussen de knooppunten in een cluster te beveiligen. U kunt twee verschillende certificaten gebruiken, een primaire en een secundaire, voor een upgrade. Stel de vingerafdruk van het primaire certificaat in de sectie Vingerafdruk in en die van de secundaire in de variabelen VingerafdrukSecondary.
ClusterCertificateCommonNames Aanbevolen voor een productieomgeving. Dit certificaat is vereist om de communicatie tussen de knooppunten in een cluster te beveiligen. U kunt een of twee algemene namen van clustercertificaten gebruiken. De CertificateIssuerThumbprint komt overeen met de vingerafdruk van de verlener van dit certificaat. Als er meer dan één certificaat met dezelfde algemene naam wordt gebruikt, kunt u meerdere verlenervingervingerafdrukken opgeven.
ClusterCertificateIssuerStores Aanbevolen voor een productieomgeving. Dit certificaat komt overeen met de verlener van het clustercertificaat. In deze sectie kunt u de algemene naam van de uitgever en de bijbehorende winkelnaam opgeven in plaats van de vingerafdruk van de uitgever op te geven onder ClusterCertificateCommonNames. Dit maakt het eenvoudig om certificaten van clusterverleners te rolloveren. Meerdere verleners kunnen worden opgegeven als er meer dan één clustercertificaat wordt gebruikt. Een lege IssuerCommonName staat alle certificaten toe in de bijbehorende winkels die zijn opgegeven onder X509StoreNames.
ServerCertificate Aanbevolen voor een testomgeving. Dit certificaat wordt aan de client gepresenteerd wanneer deze verbinding probeert te maken met dit cluster. Voor het gemak kunt u ervoor kiezen om hetzelfde certificaat te gebruiken voor ClusterCertificate en ServerCertificate. U kunt twee verschillende servercertificaten gebruiken, een primaire en een secundaire, voor een upgrade. Stel de vingerafdruk van het primaire certificaat in de sectie Vingerafdruk in en die van de secundaire in de variabelen VingerafdrukSecondary.
ServerCertificateCommonNames Aanbevolen voor een productieomgeving. Dit certificaat wordt aan de client gepresenteerd wanneer deze verbinding probeert te maken met dit cluster. De CertificateIssuerThumbprint komt overeen met de vingerafdruk van de verlener van dit certificaat. Als er meer dan één certificaat met dezelfde algemene naam wordt gebruikt, kunt u meerdere verlenervingervingerafdrukken opgeven. Voor het gemak kunt u hetzelfde certificaat gebruiken voor ClusterCertificateCommonNames en ServerCertificateCommonNames. U kunt een of twee algemene namen van servercertificaten gebruiken.
ServerCertificateIssuerStores Aanbevolen voor een productieomgeving. Dit certificaat komt overeen met de verlener van het servercertificaat. In deze sectie kunt u de algemene naam van de uitgever en de bijbehorende winkelnaam opgeven in plaats van de vingerafdruk van de uitgever op te geven onder ServerCertificateCommonNames. Dit maakt het eenvoudig om certificaten van verleners van servers te rolloveren. Meerdere verleners kunnen worden opgegeven als er meer dan één servercertificaat wordt gebruikt. Een lege IssuerCommonName staat alle certificaten toe in de bijbehorende winkels die zijn opgegeven onder X509StoreNames.
ClientCertificateThumbprints Installeer deze set certificaten op de geverifieerde clients. U kunt een aantal verschillende clientcertificaten hebben geïnstalleerd op de computers die u toegang tot het cluster wilt toestaan. Stel de vingerafdruk van elk certificaat in de variabele CertificateThumbprint in. Als u IsAdmin instelt op true, kan de client waarop dit certificaat is geïnstalleerd, beheeractiviteiten voor beheerders uitvoeren op het cluster. Als IsAdmin onwaar is, kan de client met dit certificaat de acties uitvoeren die alleen zijn toegestaan voor gebruikerstoegangsrechten, meestal alleen-lezen. Zie Op rollen gebaseerd toegangsbeheer van Service Fabric voor meer informatie over rollen.
ClientCertificateCommonNames Stel de algemene naam van het eerste clientcertificaat in voor CertificateCommonName. De CertificateIssuerThumbprint is de vingerafdruk voor de verlener van dit certificaat. Zie Werken met certificaten voor meer informatie over algemene namen en de verlener.
ClientCertificateIssuerStores Aanbevolen voor een productieomgeving. Dit certificaat komt overeen met de verlener van het clientcertificaat (zowel beheerders- als niet-beheerdersrollen). In deze sectie kunt u de algemene naam van de uitgever en de bijbehorende winkelnaam opgeven in plaats van de vingerafdruk van de verlener op te geven onder ClientCertificateCommonNames. Dit maakt het eenvoudig om certificaten van clientverleners te rolloveren. Meerdere verleners kunnen worden opgegeven als er meer dan één clientcertificaat wordt gebruikt. Een lege IssuerCommonName staat alle certificaten toe in de bijbehorende winkels die zijn opgegeven onder X509StoreNames.
ReverseProxyCertificate Aanbevolen voor een testomgeving. Dit optionele certificaat kan worden opgegeven als u uw omgekeerde proxy wilt beveiligen. Zorg ervoor dat reverseProxyEndpointPort is ingesteld in nodeTypes als u dit certificaat gebruikt.
ReverseProxyCertificateCommonNames Aanbevolen voor een productieomgeving. Dit optionele certificaat kan worden opgegeven als u uw omgekeerde proxy wilt beveiligen. Zorg ervoor dat reverseProxyEndpointPort is ingesteld in nodeTypes als u dit certificaat gebruikt.

Hier volgt een voorbeeld van een clusterconfiguratie waarin het cluster, de server en de clientcertificaten zijn opgegeven. Voor cluster-/server-/reverseProxy-certificaten kunnen de vingerafdruk en de algemene naam niet samen worden geconfigureerd voor hetzelfde certificaattype.

{
   "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 van certificaten

Wanneer u een algemene naam van een certificaat gebruikt in plaats van een vingerafdruk, is voor de rollover van het certificaat geen upgrade van de clusterconfiguratie vereist. Voor upgrades van de verlener van de vingerafdruk moet u ervoor zorgen dat de nieuwe lijst met vingerafdruksnijdt met de oude lijst. U moet eerst een configuratie-upgrade uitvoeren met de vingerafdruk van de nieuwe verlener en vervolgens de nieuwe certificaten (zowel cluster-/servercertificaat als verlenercertificaten) in het archief installeren. Bewaar het oude certificaat van de verlener ten minste twee uur in het certificaatarchief nadat u het nieuwe certificaat van verlener hebt geïnstalleerd. Als u verlenerarchieven gebruikt, hoeft er geen configuratie-upgrade te worden uitgevoerd voor rollover van certificaatuitgever. Installeer het nieuwe certificaat van de verlener met een laatste vervaldatum in het bijbehorende certificaatarchief en verwijder het oude certificaat van de verlener na een paar uur.

De X.509-certificaten verkrijgen

Als u de communicatie binnen het cluster wilt beveiligen, moet u eerst X.509-certificaten voor uw clusterknooppunten verkrijgen. Als u de verbinding met dit cluster wilt beperken tot geautoriseerde computers/gebruikers, moet u bovendien certificaten voor de clientcomputers verkrijgen en installeren.

Voor clusters waarop productieworkloads worden uitgevoerd, gebruikt u een door de certificeringsinstantie (CA) ondertekend X.509-certificaat om het cluster te beveiligen. Zie Een certificaat verkrijgen voor meer informatie over het verkrijgen van deze certificaten.

Er zijn een aantal eigenschappen die het certificaat moet hebben om goed te kunnen functioneren:

  • De provider van het certificaat moet Microsoft Enhanced RSA en AES Cryptographic Provider zijn

  • Wanneer u een RSA-sleutel maakt, moet u ervoor zorgen dat de sleutel 2048 bits is.

  • De extensie Sleutelgebruik heeft de waarde Digitale handtekening, Sleutelcodering (a0)

  • De extensie Uitgebreid sleutelgebruik heeft de waarden Serververificatie (OID: 1.3.6.1.5.5.7.3.1) en Clientverificatie (OID: 1.3.6.1.5.5.7.3.2)

Voor clusters die u voor testdoeleinden gebruikt, kunt u ervoor kiezen om een zelfondertekend certificaat te gebruiken.

Raadpleeg veelgestelde vragen over certificaten voor aanvullende vragen.

Optioneel: een zelfondertekend certificaat maken

Een manier om een zelfondertekend certificaat te maken dat correct kan worden beveiligd, is door het script CertSetup.ps1 te gebruiken in de map Service Fabric SDK in de map C:\Program Files\Microsoft SDKs\Service Fabric\ClusterSetup\Secure. Bewerk dit bestand om de standaardnaam van het certificaat te wijzigen. (Zoek de waarde CN=ServiceFabricDevClusterCert.) Voer dit script uit als .\CertSetup.ps1 -Install.

Exporteer het certificaat nu naar een PFX-bestand met een beveiligd wachtwoord. Haal eerst de vingerafdruk van het certificaat op.

  1. Voer in het menu Startcomputercertificaten beheren uit.

  2. Ga naar de map Lokale computer\Persoonlijk en zoek het certificaat dat u hebt gemaakt.

  3. Dubbelklik op het certificaat om het te openen, selecteer het tabblad Details en schuif omlaag naar het veld Vingerafdruk .

  4. Verwijder de spaties en kopieer de vingerafdrukwaarde naar de volgende PowerShell-opdracht.

  5. Wijzig de String waarde in een geschikt beveiligd wachtwoord om deze te beveiligen en voer het volgende uit in PowerShell:

    $pswd = ConvertTo-SecureString -String "1234" -Force –AsPlainText
    Get-ChildItem -Path cert:\localMachine\my\<Thumbprint> | Export-PfxCertificate -FilePath C:\mypfx.pfx -Password $pswd
    
  6. Voer de volgende PowerShell-opdracht uit om de details van een certificaat te zien dat op de computer is geïnstalleerd:

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

Als u een Azure-abonnement hebt, volgt u de stappen in Een Service Fabric-cluster maken met behulp van Azure Resource Manager.

De certificaten installeren

Nadat u certificaten hebt, kunt u deze installeren op de clusterknooppunten. Op uw knooppunten moet de meest recente Windows PowerShell 3.x zijn geïnstalleerd. Herhaal deze stappen op elk knooppunt voor zowel cluster- als servercertificaten en secundaire certificaten.

  1. Kopieer het PFX-bestand of de bestanden naar het knooppunt.

  2. Open een PowerShell-venster als beheerder en voer de volgende opdrachten in. Vervang $pswd door het wachtwoord dat u hebt gebruikt om dit certificaat te maken. Vervang $PfxFilePath door het volledige pad van het PFX-bestand dat naar dit knooppunt is gekopieerd.

    $pswd = "1234"
    $PfxFilePath ="C:\mypfx.pfx"
    Import-PfxCertificate -Exportable -CertStoreLocation Cert:\LocalMachine\My -FilePath $PfxFilePath -Password (ConvertTo-SecureString -String $pswd -AsPlainText -Force)
    
  3. Stel nu het toegangsbeheer voor dit certificaat in zodat het Service Fabric-proces, dat wordt uitgevoerd onder het netwerkserviceaccount, dit kan gebruiken door het volgende script uit te voeren. Geef de vingerafdruk op van het certificaat en DE NETWERKSERVICE voor het serviceaccount. U kunt controleren of de ACL's op het certificaat juist zijn door het certificaat te openen in Start>Computercertificaten beheren en alle taken>Persoonlijke sleutels beheren te bekijken.

    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. Herhaal de vorige stappen voor elk servercertificaat. U kunt deze stappen ook gebruiken om de clientcertificaten te installeren op de computers die u toegang tot het cluster wilt toestaan.

Het beveiligde cluster maken

Nadat u de beveiligingssectie van het bestand ClusterConfig.X509.MultiMachine.json hebt geconfigureerd, kunt u doorgaan naar de sectie Het cluster maken om de knooppunten te configureren en het zelfstandige cluster te maken. Vergeet niet om het bestand ClusterConfig.X509.MultiMachine.json te gebruiken tijdens het maken van het cluster. Uw opdracht kan er bijvoorbeeld als volgt uitzien:

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

Nadat u het beveiligde zelfstandige Windows-cluster hebt uitgevoerd en de geverifieerde clients hebt ingesteld om er verbinding mee te maken, volgt u de stappen in de sectie Verbinding maken met een cluster met behulp van PowerShell om er verbinding mee te maken. Bijvoorbeeld:

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

U kunt vervolgens andere PowerShell-opdrachten uitvoeren om met dit cluster te werken. U kunt bijvoorbeeld Get-ServiceFabricNode uitvoeren om een lijst met knooppunten in dit beveiligde cluster weer te geven.

Als u het cluster wilt verwijderen, maakt u verbinding met het knooppunt in het cluster waar u het Service Fabric-pakket hebt gedownload, opent u een opdrachtregel en gaat u naar de pakketmap. Voer nu de volgende opdracht uit:

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

Notitie

Een onjuiste certificaatconfiguratie kan verhinderen dat het cluster tijdens de implementatie wordt weergegeven. Als u zelf een diagnose wilt stellen van beveiligingsproblemen, kijkt u in de Logboeken groep Toepassingen en services logboeken>Microsoft-Service Fabric.