Sdílet prostřednictvím


Řešení potíží se zabezpečením

 

Platí pro: Windows Azure Pack

Toto téma popisuje řešení potíží souvisejících se zabezpečením a ověřováním v sadě Windows Azure Pack pro Windows Server. Řadu problémů můžete vyřešit kontrolou kontrolního seznamu přihlašovacích údajů v tomto tématu. Doporučení se týkají následujících problémů:

  • Po integraci služby AD FS resetujte portál pro správu tak, aby používal službu AD.

  • Po integraci služby AD FS nemá přístup k portálu tenanta

  • Získání tokenu pomocí rutiny Get-MgmtSvcToken

  • Programové používání certifikátů tenantů

  • Nahrazení certifikátu podepsaného svým držitelem důvěryhodným certifikátem

  • Řešení upozornění na certifikáty

  • Přihlášení k portálu pro správu z více účtů

  • Kontrola nastavení SSL/TLS

Kontrolní seznam pro přihlašovací údaje

Následující kontrolní seznam obsahuje osvědčené postupy pro konfiguraci certifikátů, uživatelských jmen a hesel pro sadu Windows Azure Pack a produkty a poskytovatele, které používá.

  • Pro testování nebo součásti, které nejsou přístupné z internetu, jako je portál pro správu pro správce nebo rozhraní API Správa, můžete k vytvoření certifikátů podepsaných svým držitelem použít certifikační autoritu Microsoftu.

  • Pro internetové komponenty, jako je portál pro správu tenantů a veřejné rozhraní API tenanta, použijte důvěryhodnou veřejnou certifikační autoritu.

  • Nakonfigurujte identity fondu aplikací pro Service Provider Foundation v Internetové informační službě (IIS) na serveru se spuštěnou službou Service Provider Foundation tak, aby používaly účet přihlašovacích údajů uživatele domény. Použití síťových služeb se nedoporučuje.

  • Nakonfigurujte identity fondu aplikací na serverech se spuštěnými nástroji System Center 2012 R2 Virtual Machine Manager a Service Provider Foundation tak, aby používaly stejný účet domény, který má oprávnění Přihlásit se jako služba .

  • Nakonfigurujte Service Provider Foundation tak, aby používal základní ověřování ve službě IIS.

  • Nakonfigurujte místní uživatelský účet, který má práva správce, aby byl členem skupin VMM, Správa, Zprostředkovatel a Využití na serveru se spuštěnou službou Service Provider Foundation. Tento místní uživatelský účet použijte k registraci koncového bodu Service Provider Foundation v sadě Windows Azure Pack pro Windows Server.

Další informace najdete v blogovém příspěvku Řešení potíží se sadou Windows Azure Pack, Service Provider Foundation & Virtual Machine Manager. Přehled webových služeb Service Provider Foundation najdete v tématu Správa webových služeb a Connections ve službě Service Provider Foundation. Viz také Přehled ověřování pomocí sady Windows Azure Pack.

Po integraci služby AD FS nemá přístup k portálu tenanta

Týká se: Konfigurace Active Directory Federation Services (AD FS) pro Windows Azure Pack

Problém

Přihlašovací obrazovka tenanta se po konfiguraci služby AD FS (Active Directory Federation Services (AD FS)) nezobrazuje nebo nemá přístup k portálu pro správu tenantů.

Doporučení

Po integraci služby AD FS v doméně, ve které je nainstalovaná sada Windows Azure Pack, se přihlašovací stránka vynechá a přejde přímo na portál. Toto je očekávané chování prohlížeče.

Pokud nemáte přístup k portálu pro správu tenantů, pomocí Správce serveru spusťte editor ADSI a ověřte, že je uvedený hlavní název služby (SPN) vašeho serveru AD SF. Hlavní název služby (SPN) by měl být ve formátu http/myADFSServer.

Zpět na začátek

Po integraci služby AD FS resetujte portál pro správu tak, aby používal službu AD.

Týká se: Konfigurace Active Directory Federation Services (AD FS) pro Windows Azure Pack

Problém

Po integraci služby Active Directory Federation Services (AD FS) (AD FS) se chcete vrátit k používání služby Active Directory (AD) pro portál pro správu.

Doporučení

Je nutné znovu navázat vztah důvěryhodnosti mezi portálem pro správu pro správce a webem ověřování systému Windows jako u služby AD FS. Web ověřování systému Windows je port 30072. Můžete použít Windows PowerShell rutin Set-MgmtSvcRelyingPartySettigns a Set-MgmtSvcIdentityProviderSettings.

Získání tokenu pomocí rutiny Get-MgmtSvcToken

Týká se: Windows Azure Pack pro automatizaci Windows Serveru s Windows PowerShell

Problém

Get-MgmtSvcToken nevrací token podle očekávání.

Doporučení

Může se jednat o problém s tím, že rutina Get-MgmtSvcToken nepoužívá správně Active Directory Federation Services (AD FS) (AD FS). Následující skript definuje funkci Get-AdfsToken jako alternativní řešení.

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

Zpět na začátek

Programové používání certifikátů tenantů

Týká se: Service Provider Foundation Developer's Guide

Problém

Musíte vytvořit certifikát, nahrát ho na portál pro správu pro tenanty a pak ho můžete programově používat.

Doporučení

Použijte následující postup:

  1. Vytvořte certifikát (může být podepsaný svým držitelem). Měl by mít příponu .cer souboru.

  2. Na stránce Můj účet na portálu pro správu pro tenanty klikněte na Certifikáty pro správu.

  3. Předejte certifikát v hlavičce požadavku do veřejného rozhraní API tenanta k ověření, jak je znázorněno v následujícím příkladu.

    Poznámka

    Budete mít přístup jenom k předplatnému, ke kterému je tento certifikát přiřazený. Předplatné nebudete moct odstranit prostřednictvím veřejného rozhraní API tenanta.

    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;
    

Zpět na začátek

Nahrazení certifikátu podepsaného svým držitelem důvěryhodným certifikátem

Týká se: Správa sady Windows Azure Pack pro Windows Server

Problém

Po použití certifikátu podepsaného svým držitelem v testovacím prostředí chcete certifikát nahradit certifikátem, který je vydaný důvěryhodnou autoritou.

Doporučení

Nainstalujte certifikát do osobního úložiště místního počítače a namapujte certifikát na každý web ve Správci Internetové informační služby (IIS). Certifikát by měl splňovat následující požadavky:

  • Pochází od důvěryhodné certifikační autority

  • Platný rozsah dat

  • Zadejte platné informace o použití a zamýšleném účelu.

  • Poskytnutí ověřování serveru

  • Spárujte název domény certifikátu s názvem webu.

  • 1024bitové šifrování RSA nebo vyšší

  • Zahrnout privátní klíč

Zpět na začátek

Řešení upozornění na certifikáty

Týká se: Nasazení sady Windows Azure Pack pro Windows Server

Problém

Upozornění certifikátu zůstávají u certifikátu od důvěryhodné autority.

Doporučení

Některé prohlížeče nezpracují pole Authority Information Access, které je v certifikátu během ověřování certifikátu. Alternativním řešením je explicitně nainstalovat zprostředkující certifikáty do úložiště certifikátů. Seznam certifikačních autorit, které podporují toto pole, najdete v tématu Program kořenových certifikátů SSL (členské certifikační autority) pro Windows a Windows Phone 8.

Zpět na začátek

Kontrola nastavení SSL/TLS

Týká se: Nasazení sady Windows Azure Pack pro Windows Server

Problém

Slabé zabezpečení komunikace může vést k tomu, že se v protokolu událostí systému zobrazí velké množství chyb Schannel.

Doporučení

Pokud chcete zlepšit zabezpečení komunikačních kanálů sady Windows Azure Pack, zvažte aktualizaci nastavení SSL/TLS. Před implementací těchto změn byste se měli ujistit, že nemají vliv na jiné aplikace nebo služby.

Na každém počítači se sadou Windows Azure Pack můžete spustit následující skript, který provede tyto změny za vás:

# 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
}

Můžete také spustit ověřovací nástroje SSL/TLS a identifikovat další oblasti pro zlepšení.

Zpět na začátek

Přihlaste se k portálu pro správu z více účtů.

Týká se: Windows Azure Pack for Windows Server Automation s Windows PowerShell

Problém

K portálu pro správu se musíte přihlásit z více účtů.

Doporučení

Pomocí rutiny Add-MgmtSvcAdminUser Windows PowerShell přidejte další objekty zabezpečení. Tyto objekty zabezpečení můžou být explicitní uživatelé nebo skupiny zabezpečení (pokud vaše tokeny obsahují informace o skupině zabezpečení). Následující příklad přidá uživatele. (Předpokládá se, že heslo bylo definováno pro proměnnou $pwd.)

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

Zpět na začátek

Viz také

Řešení potíží se sadou Windows Azure Pack