Dela via


Säkerhetsfelsökning

 

Gäller för: Windows Azure Pack

I det här avsnittet beskrivs felsökning av problem som rör säkerhet och autentisering i Windows Azure Pack för Windows Server. Många problem kan lösas genom att granska checklistan för autentiseringsuppgifter i det här avsnittet. Rekommendationer ges för följande problem:

  • När du har integrerat AD FS återställer du hanteringsportalen för att använda AD

  • När du har integrerat AD FS kan du inte komma åt klientportalen

  • Hämta en token med cmdleten Get-MgmtSvcToken

  • Använda klientcertifikat programmatiskt

  • Ersätt ett självsignerat certifikat med ett betrott certifikat

  • Lösa certifikatvarningar

  • Logga in på hanteringsportalen från flera konton

  • Granska SSL/TLS-inställningar

Checklista för autentiseringsuppgifter

Följande checklista innehåller metodtips för att konfigurera certifikat, användarnamn och lösenord för Windows Azure Pack och de produkter och leverantörer som används.

  • För testning eller icke-Internetriktade komponenter som hanteringsportalen för administratörer eller Admin API kan du använda Microsofts certifikatutfärdare för att skapa självsignerade certifikat.

  • För Internetriktade komponenter, till exempel hanteringsportalen för klienter och klientorganisationens offentliga API, använder du en betrodd offentlig certifikatutfärdare.

  • Konfigurera programpoolsidentiteterna för Service Provider Foundation i Internet Information Services (IIS) på servern som kör Service Provider Foundation så att de använder kontot för domänanvändarautentiseringsuppgifter. Du rekommenderas inte att använda Network Services.

  • Konfigurera programpoolsidentiteterna på servrarna som kör System Center 2012 R2 Virtual Machine Manager och Service Provider Foundation för att använda samma domänkonto som har inloggningsrättigheter som en tjänst .

  • Konfigurera Service Provider Foundation för att använda grundläggande autentisering i IIS.

  • Konfigurera ett lokalt användarkonto som har administratörsbehörighet för att vara medlem i grupperna VMM, Admin, Provider och Användning på servern som kör Service Provider Foundation. Använd det här lokala användarkontot för att registrera Service Provider Foundation-slutpunkten med Windows Azure Pack för Windows Server.

Mer information finns i blogginlägget Felsöka Windows Azure Pack, Service Provider Foundation & Virtual Machine Manager. En översikt över Service Provider Foundation-webbtjänsterna finns i Hantera webbtjänster och Connections i Service Provider Foundation. Se även Översikt över Windows Azure Pack-autentisering.

När du har integrerat AD FS kan du inte komma åt klientportalen

Gäller för: Konfigurera Active Directory Federation Services (AD FS) för Windows Azure Pack

Problem

Inloggningsskärmen för klientorganisationen visas inte när AD FS (Active Directory Federation Services (AD FS)) har konfigurerats eller så går det inte att komma åt hanteringsportalen för klienter.

Rekommendation

När du har integrerat AD FS i domänen där Windows Azure Pack är installerat kringgås inloggningssidan direkt till portalen. Det här är det förväntade webbläsarbeteendet.

Om du inte kan komma åt hanteringsportalen för klienter använder du Serverhanteraren för att köra ADSI-redigering och kontrollera att AD SF-servern har ett SPN (Service Principal Name) visas. SPN ska vara i formatet http/myADFSServer.

Överst på sidan

När du har integrerat AD FS återställer du hanteringsportalen för att använda AD

Gäller för: Konfigurera Active Directory Federation Services (AD FS) för Windows Azure Pack

Problem

Vill återgå till att använda Active Directory (AD) för hanteringsportalen efter integrering av Active Directory Federation Services (AD FS) (AD FS).

Rekommendation

Du måste återupprätta förtroendet mellan hanteringsportalen för administratörer och Windows-autentiseringswebbplatsen som du gjorde för AD FS. Webbplatsen för Windows-autentisering är port 30072. Du kan använda Windows PowerShell-cmdletarna Set-MgmtSvcRelyingPartySettigns och Set-MgmtSvcIdentityProviderSettings.

Hämta en token med cmdleten Get-MgmtSvcToken

Gäller för: Windows Azure Pack för Windows Server Automation med Windows PowerShell

Problem

Den Get-MgmtSvcToken returnerar inte token som förväntat.

Rekommendation

Detta kan vara ett problem med cmdleten Get-MgmtSvcToken som inte använder Active Directory Federation Services (AD FS) (AD FS) korrekt. Följande skript definierar en funktion, Get-AdfsToken, som en lösning.

function Get-AdfsToken([string]$adfsAddress, [PSCredential]$credential)
{
    $clientRealm = 'http://azureservices/AdminSite'
    $allowSelfSignCertificates = $true

    Add-Type -AssemblyName 'System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
    Add-Type -AssemblyName 'System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'

    $identityProviderEndpoint = New-Object -TypeName System.ServiceModel.EndpointAddress -ArgumentList ($adfsAddress + '/adfs/services/trust/13/usernamemixed')
    $identityProviderBinding = New-Object -TypeName System.ServiceModel.WS2007HttpBinding -ArgumentList ([System.ServiceModel.SecurityMode]::TransportWithMessageCredential)
    $identityProviderBinding.Security.Message.EstablishSecurityContext = $false
    $identityProviderBinding.Security.Message.ClientCredentialType = 'UserName'
    $identityProviderBinding.Security.Transport.ClientCredentialType = 'None'

    $trustChannelFactory = New-Object -TypeName System.ServiceModel.Security.WSTrustChannelFactory -ArgumentList $identityProviderBinding, $identityProviderEndpoint
    $trustChannelFactory.TrustVersion = [System.ServiceModel.Security.TrustVersion]::WSTrust13

    if ($allowSelfSignCertificates)
    {
        $certificateAuthentication = New-Object -TypeName System.ServiceModel.Security.X509ServiceCertificateAuthentication
        $certificateAuthentication.CertificateValidationMode = 'None'
        $trustChannelFactory.Credentials.ServiceCertificate.SslCertificateAuthentication = $certificateAuthentication
    }

    $ptr = [System.Runtime.InteropServices.Marshal]::SecureStringToCoTaskMemUnicode($credential.Password)
    $password = [System.Runtime.InteropServices.Marshal]::PtrToStringUni($ptr)
    [System.Runtime.InteropServices.Marshal]::ZeroFreeCoTaskMemUnicode($ptr)

    $trustChannelFactory.Credentials.SupportInteractive = $false
    $trustChannelFactory.Credentials.UserName.UserName = $credential.UserName
    $trustChannelFactory.Credentials.UserName.Password = $password #$credential.Password

    $rst = New-Object -TypeName System.IdentityModel.Protocols.WSTrust.RequestSecurityToken -ArgumentList ([System.IdentityModel.Protocols.WSTrust.RequestTypes]::Issue)
    $rst.AppliesTo = New-Object -TypeName System.IdentityModel.Protocols.WSTrust.EndpointReference -ArgumentList $clientRealm
    $rst.TokenType = 'urn:ietf:params:oauth:token-type:jwt'
    $rst.KeyType = [System.IdentityModel.Protocols.WSTrust.KeyTypes]::Bearer

    $rstr = New-Object -TypeName System.IdentityModel.Protocols.WSTrust.RequestSecurityTokenResponse

    $channel = $trustChannelFactory.CreateChannel()
    $token = $channel.Issue($rst, [ref] $rstr)

    $tokenString = ([System.IdentityModel.Tokens.GenericXmlSecurityToken]$token).TokenXml.InnerText;
    $result = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($tokenString))
    return $result
}

# Fill in values
$adfsAddress = 'https://adfshost'
$username = 'domain\username'
$password = 'password'
$securePassword = ConvertTo-SecureString -String $password -AsPlainText -Force
$credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $username,$securePassword

$token = Get-AdfsToken -adfsAddress $adfsAddress -credential $credential 
$token

Överst på sidan

Använda klientcertifikat programmatiskt

Gäller för: Utvecklarhandbok för Service Provider Foundation

Problem

Du måste skapa ett certifikat och ladda upp det till hanteringsportalen för klienter och sedan kunna använda det programmatiskt.

Rekommendation

Följ dessa steg:

  1. Skapa ett certifikat (det kan vara självsignerat). Det bör ha ett .cer filnamnstillägg.

  2. På sidan Mitt konto i hanteringsportalen för klienter klickar du på Hanteringscertifikat.

  3. Skicka certifikatet i rubriken för begäran till klientorganisationens offentliga API för autentisering, som du ser i följande exempel.

    Anteckning

    Du kommer bara att kunna komma åt den prenumeration som det här certifikatet har tilldelats. Du kommer inte att kunna ta bort prenumerationen via klientorganisationens offentliga API.

    X509Certificate2 mycert3 = new X509Certificate2("C:\\WorkDocs\\Test\\Management Certs\\myCert.cer");
    HttpClient httpClient = new HttpClient();
    var handler = new WebRequestHandler();
    handler.ClientCertificates.Add(mycert3);
    handler.PreAuthenticate = true;
    httpClient = new HttpClient(handler);
    
    string tenantPublicEndpoint = "https://test.fabrikam.com:30006/";
    string subscriptionid = " 7d31eb89-bb1e-4b16-aa3c-993f978b6bc1";
    
    string subscriptionEndpoint = tenantPublicEndpoint + subscriptionid+ "/services/webspaces/defaultwebspace/sites";
    var response = httpClient.GetAsync(subscriptionEndpoint);
    var resultsStr = response.Result.Content.ReadAsStringAsync().Result;
    

Överst på sidan

Ersätt ett självsignerat certifikat med ett betrott certifikat

Gäller för: Administrera Windows Azure Pack för Windows Server

Problem

När du har använt ett självsignerat certifikat för en testmiljö vill du ersätta certifikatet med ett certifikat som har utfärdats från en betrodd utfärdare.

Rekommendation

Installera certifikatet i det personliga arkivet på den lokala datorn och mappa certifikatet till varje webbplats i IIS-hanteraren (Internet Information Services). Certifikatet bör uppfylla följande krav:

  • Kom från en betrodd certifikatutfärdare

  • Ha ett giltigt datumintervall

  • Ange en giltig användnings- och avsedd användningsinstrukation

  • Ange serverautentisering

  • Matcha domännamnet för certifikatet med namnet på webbplatsen

  • Ha en RSA-1024-bitars kryptering eller högre

  • Inkludera den privata nyckeln

Överst på sidan

Lösa certifikatvarningar

Gäller för: Distribuera Windows Azure Pack för Windows Server

Problem

Certifikatvarningar bevaras med certifikat från en betrodd utfärdare.

Rekommendation

Vissa webbläsare bearbetar inte fältet Åtkomst till utfärdarinformation som finns i certifikatet under certifikatverifieringen. Lösningen är att uttryckligen installera mellanliggande certifikat i certifikatarkivet. En lista över certifikatutfärdare som stöder det här fältet finns i Windows och Windows Phone 8 SSL-rotcertifikatprogram (medlemscertifikatutfärdare).

Överst på sidan

Granska SSL/TLS-inställningar

Gäller för: Distribuera Windows Azure Pack för Windows Server

Problem

Svag kommunikationssäkerhet kan leda till att en flod av Schannel-fel visas i systemets händelselogg.

Rekommendation

Om du vill förbättra säkerheten för Windows Azure Pack-kommunikationskanaler bör du överväga att uppdatera dina SSL/TLS-inställningar. Innan du implementerar dessa ändringar bör du se till att de inte påverkar andra program eller tjänster.

Du kan köra följande skript på varje dator som kör Windows Azure Pack för att göra dessa ändringar åt dig:

# PowerShell script to secure TLS/SSL settings.
# Copyright (c) Microsoft Corporation. All rights reserved.
# 20-Jun-2015 Update-ComputerSchannelSettings.ps1

<#
.Synopsis
   Apply HTTP.SYS settings
.NOTES
   Reference: Http.sys registry settings for Windows
   https://support.microsoft.com/en-us/kb/820129
#>
function Set-HttpSysSettings()
{
    Write-Verbose -Message "$($Myinvocation.MyCommand.Name)" -Verbose

    $regPath = "HKLM:\System\CurrentControlSet\Services\HTTP\Parameters"

    # Read original values.
    $maxFieldLength = (Get-ItemProperty -Path $regPath -Name MaxFieldLength -ErrorAction SilentlyContinue).MaxFieldLength
    $maxRequestBytes = (Get-ItemProperty -Path $regPath -Name MaxRequestBytes -ErrorAction SilentlyContinue).MaxRequestBytes
    Write-Verbose -Message "HTTP.SYS settings:`r`n  MaxFieldLength = $maxFieldLength`r`n  MaxRequestBytes = $maxRequestBytes" -Verbose

    # Is update needed?
    if ($maxFieldLength -ne 32KB -or $maxRequestBytes -ne 32KB)
    {
        # Write updated values.
        Set-ItemProperty -Path $regPath -Name MaxFieldLength -Value 32KB
        Set-ItemProperty -Path $regPath -Name MaxRequestBytes -Value 32KB

        # Read updated values.
        $maxFieldLength = (Get-ItemProperty -Path $regPath -Name MaxFieldLength).MaxFieldLength
        $maxRequestBytes = (Get-ItemProperty -Path $regPath -Name MaxRequestBytes).MaxRequestBytes
        Write-Verbose -Message "HTTP.SYS settings (updated):`r`n  MaxFieldLength = $maxFieldLength`r`n  MaxRequestBytes = $maxRequestBytes" -Verbose

        # Changes that are made to the registry will not take effect until you restart the HTTP service.
        Write-Warning -Message "HTTP.SYS settings updated; restarting the HTTP service."
        Restart-Service -Name "http" -Force -Verbose
    }

    return $false # No reboot needed.
}

<#
.Synopsis
   Apply SSL configuration settings (TLS Cipher Suite Ordering)
.NOTES
   Reference: Prioritizing Schannel Cipher Suites
   https://msdn.microsoft.com/en-us/library/windows/desktop/bb870930(v=vs.85).aspx
#>
function Set-SchannelCipherOrder()
{
    Write-Verbose -Message "$($Myinvocation.MyCommand.Name)" -Verbose
    $reboot = $false

    $regPath = "HKLM:\SOFTWARE\Policies\Microsoft\Cryptography\Configuration\SSL\00010002"

    # The ordered suites names need to be specified as a single string (REG_SZ)
    # with each suite separated by commas and with no embedded spaces.
    # The list of cipher suites is limited to 1023 characters.
    $cipherOrder = @(
        'TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384_P384'
        'TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256_P256'
        'TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384'
        'TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256'
        'TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P384'
        'TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P256'
        'TLS_RSA_WITH_AES_256_GCM_SHA384'
        'TLS_RSA_WITH_AES_128_GCM_SHA256'
        'TLS_RSA_WITH_AES_256_CBC_SHA256'
        'TLS_RSA_WITH_AES_128_CBC_SHA256'
        'TLS_RSA_WITH_AES_256_CBC_SHA'
        'TLS_RSA_WITH_AES_128_CBC_SHA'
    )
    $cipherOrderList = ($cipherOrder -join ',')

    # Read original values.
    $functions = (Get-ItemProperty -Path $regPath -Name Functions -ErrorAction SilentlyContinue).Functions
    Write-Verbose -Message "Schannel Cipher Order:`r`n  Functions = $($functions -split ',' | ConvertTo-Json)" -Verbose

    # Is update needed?
    if ($functions -ne ($cipherOrder -join ','))
    {
        # Write updated values.
        Set-ItemProperty -Path $regPath -Name Functions -Value $cipherOrderList -Force

        # Read updated values.
        $functions = (Get-ItemProperty -Path $regPath -Name Functions -ErrorAction SilentlyContinue).Functions
        Write-Verbose -Message "Schannel Cipher Order (updated):`r`n  Functions = $($functions -split ',' | ConvertTo-Json)" -Verbose

        # It is necessary to restart the computer after modifying this setting for the changes to take effect.
        Write-Warning -Message "Schannel Cipher Order updated; it is necessary to restart the computer."
        $reboot = $true ### TODO: Restart-Computer -Force -Verbose
    }

    return $reboot
}
<#
.Synopsis
   Apply TLS Protocol version configuration
.NOTES
   Reference: How to Disable SSL 3.0 in Azure Websites, Roles, and Virtual Machines
   https://azure.microsoft.com/blog/2014/10/19/how-to-disable-ssl-3-0-in-azure-websites-roles-and-virtual-machines/
#>
function Set-SchannelProtocols()
{
    Write-Verbose -Message "$($Myinvocation.MyCommand.Name)" -Verbose
    $reboot = $false

    $regPath = "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols"
    $protocolSettings = @(
        [PSCustomObject]@{ Path = "$regPath\SSL 2.0\Client"; Name = "Enabled"; Value = 0 }
        [PSCustomObject]@{ Path = "$regPath\SSL 2.0\Server"; Name = "Enabled"; Value = 0 }
        [PSCustomObject]@{ Path = "$regPath\SSL 3.0\Client"; Name = "Enabled"; Value = 0 }
        [PSCustomObject]@{ Path = "$regPath\SSL 3.0\Server"; Name = "Enabled"; Value = 0 }
        [PSCustomObject]@{ Path = "$regPath\TLS 1.0\Client"; Name = "Enabled"; Value = 1 }
        [PSCustomObject]@{ Path = "$regPath\TLS 1.0\Server"; Name = "Enabled"; Value = 1 }
        [PSCustomObject]@{ Path = "$regPath\TLS 1.1\Client"; Name = "Enabled"; Value = 1 }
        [PSCustomObject]@{ Path = "$regPath\TLS 1.1\Server"; Name = "Enabled"; Value = 1 }
        [PSCustomObject]@{ Path = "$regPath\TLS 1.2\Client"; Name = "Enabled"; Value = 1 }
        [PSCustomObject]@{ Path = "$regPath\TLS 1.2\Server"; Name = "Enabled"; Value = 1 }
    )

    # Read original values.
    $currentProtocolSettings = @()
    foreach ($protocolSetting in $protocolSettings)
    {
        $value = (Get-ItemProperty -Path $protocolSetting.Path -Name $protocolSetting.Name -ErrorAction SilentlyContinue).$($protocolSetting.Name)
        $currentProtocolSettings += [PSCustomObject]@{ Path = $protocolSetting.Path; Name = $protocolSetting.Name; Value = $value }
    }
    Write-Verbose -Message "Schannel Protocol Settings: $($currentProtocolSettings | Format-Table -Autosize | Out-String)" -Verbose

    $observed = $currentProtocolSettings | ConvertTo-Json -Compress
    $expected = $protocolSettings | ConvertTo-Json -Compress

    # Is update needed?
    if ($observed -ne $expected)
    {
        # Create registry nodes.
        $protocolPaths = @(
            "$regPath\SSL 2.0"
            "$regPath\SSL 2.0\Client"
            "$regPath\SSL 2.0\Server"
            "$regPath\SSL 3.0"
            "$regPath\SSL 3.0\Client"
            "$regPath\SSL 3.0\Server"
            "$regPath\TLS 1.0"
            "$regPath\TLS 1.0\Client"
            "$regPath\TLS 1.0\Server"
            "$regPath\TLS 1.1"
            "$regPath\TLS 1.1\Client"
            "$regPath\TLS 1.1\Server"
            "$regPath\TLS 1.2"
            "$regPath\TLS 1.2\Client"
            "$regPath\TLS 1.2\Server"
        )
        foreach ($protocolPath in $protocolPaths)
        {
            if (-not (Get-Item -Path $protocolPath -ErrorAction SilentlyContinue))
            {
                New-Item -Path $protocolPath -ItemType Container -Force | Out-Null
            }
        }

        # Write updated values.
        foreach ($protocolSetting in $protocolSettings)
        {
            Set-ItemProperty -Path $protocolSetting.Path -Name $protocolSetting.Name -Value $protocolSetting.Value -Force
        }

        # Read updated values.
        $currentProtocolSettings = @()
        foreach ($protocolSetting in $protocolSettings)
        {
            $value = (Get-ItemProperty -Path $protocolSetting.Path -Name $protocolSetting.Name -ErrorAction SilentlyContinue).$($protocolSetting.Name)
            $currentProtocolSettings += [PSCustomObject]@{ Path = $protocolSetting.Path; Name = $protocolSetting.Name; Value = $value }
        }
        Write-Verbose -Message "Schannel Protocol Settings (updated): $($currentProtocolSettings | Format-Table -Autosize | Out-String)" -Verbose

        # It is necessary to restart the computer after modifying this setting for the changes to take effect.
        Write-Warning -Message "Schannel Protocols updated; it is necessary to restart the computer."
        $reboot = $true ### TODO: Restart-Computer -Force -Verbose
    }

    return $reboot
}

#-------------------------------------------------------------------------------
# Main

$reboot = $false
$reboot += Set-HttpSysSettings
$reboot += Set-SchannelCipherOrder
$reboot += Set-SchannelProtocols
if ($reboot)
{
    Write-Warning -Message "Restart the computer for settings to take effect."
    # TODO: Restart-Computer -Force -Verbose
}

Du kan också köra SSL/TLS-valideringsverktyg för att identifiera andra förbättringsområden.

Överst på sidan

Logga in på hanteringsportalen från flera konton

Gäller för: Windows Azure Pack för Windows Server Automation med Windows PowerShell

Problem

Du måste kunna logga in på hanteringsportalen från flera konton.

Rekommendation

Använd cmdleten Add-MgmtSvcAdminUser Windows PowerShell för att lägga till ytterligare huvudkonton. Dessa huvudnamn kan vara explicita användare eller säkerhetsgrupper (om dina token innehåller information om säkerhetsgrupper). I följande exempel läggs en användare till. (Det förutsätter att lösenordet har definierats för variabeln $pwd.)

Add-MgmtSvcAdminUser -Server 'mysqlserver' -UserName 'sa' -Password $pwd -Principal 'user7@contoso.com'

Överst på sidan

Se även

Felsökning av Windows Azure Pack