Share via


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. Ook wordt 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, client-naar-knooppuntbeveiliging 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 een ClusterConfig.X509.MultiMachine.json-bestand. Open het bestand en controleer de sectie voor 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 opgeeft voor externe verbindingen, stelt u ServerCredentialType in op X509. Hoewel dit niet verplicht is, raden we u aan beide certificaten te hebben voor een goed beveiligd cluster. Als u deze waarden instelt op X509, moet u ook de bijbehorende certificaten opgeven of Service Fabric een uitzondering genereert. In sommige scenario's wilt u mogelijk alleen de ClientCertificateThumbprints of 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 meer informatie over de vingerafdruk van de certificaten die u maakt.

De volgende tabel bevat de certificaten die u nodig hebt voor het instellen van uw cluster:

Certificaatinformatie-instelling Beschrijving
ClusterCertificate Aanbevolen voor een testomgeving. Dit certificaat is vereist om de communicatie tussen de knooppunten in een cluster te beveiligen. U kunt twee verschillende certificaten, een primaire en een secundaire, gebruiken voor een upgrade. Stel de vingerafdruk van het primaire certificaat in de sectie Vingerafdruk en die van de secundaire in de variabelen ThumbprintSecondary in.
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 uitgever van dit certificaat. Als meer dan één certificaat met dezelfde algemene naam wordt gebruikt, kunt u meerdere vingerafdruk van verleners opgeven.
ClusterCertificateIssuerStores Aanbevolen voor een productieomgeving. Dit certificaat komt overeen met de verlener van het clustercertificaat. U kunt de algemene naam van de uitgever en de bijbehorende winkelnaam onder deze sectie opgeven in plaats van de vingerafdruk van de uitgever op te geven onder ClusterCertificateCommonNames. Dit maakt het eenvoudig om certificaten voor clusteruitgevers te implementeren. Er kunnen meerdere verleners 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 het verbinding probeert te maken met dit cluster. Voor het gemak kunt u hetzelfde certificaat gebruiken voor ClusterCertificate en ServerCertificate. U kunt twee verschillende servercertificaten, een primaire en een secundaire server, gebruiken voor een upgrade. Stel de vingerafdruk van het primaire certificaat in de sectie Vingerafdruk en die van de secundaire in de variabelen ThumbprintSecondary in.
ServerCertificateCommonNames Aanbevolen voor een productieomgeving. Dit certificaat wordt aan de client gepresenteerd wanneer het verbinding probeert te maken met dit cluster. De CertificateIssuerThumbprint komt overeen met de vingerafdruk van de uitgever van dit certificaat. Als meer dan één certificaat met dezelfde algemene naam wordt gebruikt, kunt u meerdere vingerafdruk van verleners 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. U kunt de algemene naam van de uitgever en de bijbehorende winkelnaam onder deze sectie opgeven in plaats van de vingerafdruk van de uitgever op te geven onder ServerCertificateCommonNames. Hierdoor kunt u eenvoudig certificaten van serververleners rolloveren. Er kunnen meerdere verleners 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 installeren op de computers waarvoor 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, beheerdersbeheeractiviteiten 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 voor CertificateCommonName in. De CertificateIssuerThumbprint is de vingerafdruk voor de uitgever 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). U kunt de algemene naam van de uitgever en de bijbehorende winkelnaam onder deze sectie opgeven in plaats van de vingerafdruk van de uitgever op te geven onder ClientCertificateCommonNames. Hierdoor kunt u eenvoudig certificaten van clientverleners rolloveren. Er kunnen meerdere verleners 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 de cluster-, server- en 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"
           }]
       }]
   }
}

Certificaatrollover

Wanneer u een algemene naam van een certificaat gebruikt in plaats van een vingerafdruk, is voor certificaatrollover geen upgrade van de clusterconfiguratie vereist. Zorg ervoor dat de nieuwe vingerafdruklijst met de oude lijst wordt gekruist voor upgrades van de uitgevervingerafdruk. U moet eerst een configuratie-upgrade uitvoeren met de nieuwe vingerafdruk van de verlener en vervolgens de nieuwe certificaten (zowel cluster-/servercertificaat als certificaten voor verleners) installeren in het archief. Houd het oude certificaat van de verlener ten minste twee uur in het certificaatarchief nadat u het nieuwe certificaat voor verleners hebt geïnstalleerd. Als u verlenerarchieven gebruikt, hoeft er geen configuratie-upgrade te worden uitgevoerd voor de rollover van certificaatverleners. Installeer het nieuwe verlenercertificaat met een laatste vervaldatum in het bijbehorende certificaatarchief en verwijder het oude certificaat na enkele uren.

De X.509-certificaten verkrijgen

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

Voor clusters waarop productieworkloads worden uitgevoerd, gebruikt u een X.509-certificaat dat is ondertekend door de certificeringsinstantie (CA) om het cluster te beveiligen. Zie Hoe u een certificaat kunt 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

  • Zorg er bij het maken van een RSA-sleutel voor dat de sleutel 2048 bits is.

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

  • De extensie Uitgebreid sleutelgebruik heeft waarden voor 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 SDK's\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 Start computercertificaten beheren uit.

  2. Ga naar de map Local Computer\Personal 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 het 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 te zien van een certificaat 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 eventuele secundaire certificaten.

  1. Kopieer het PFX-bestand of de pfx-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 de PFX die 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 van het certificaat en DE NETWERKSERVICE op voor het serviceaccount. U kunt controleren of de ACL's op het certificaat juist zijn door het certificaat te openen in Computercertificaten> starten en te kijken naar Alle taken>persoonlijke sleutels beheren.

    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 waarvoor u toegang tot het cluster wilt toestaan.

Het beveiligde cluster maken

Nadat u de beveiligingssectie van het ClusterConfig.X509.MultiMachine.json-bestand hebt geconfigureerd, kunt u doorgaan met de sectie Cluster maken om de knooppunten te configureren en het zelfstandige cluster te maken. Vergeet niet om het ClusterConfig.X509.MultiMachine.json-bestand 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. Voorbeeld:

$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 op dit beveiligde cluster weer te geven.

Als u het cluster wilt verwijderen, maakt u verbinding met het knooppunt op 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

Onjuiste certificaatconfiguratie voorkomt mogelijk dat het cluster tijdens de implementatie opkomt. Als u beveiligingsproblemen zelf wilt vaststellen, kijkt u in de Logboeken groep Toepassingen en Services logboeken>Microsoft-Service Fabric.