Ř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:
Vytvořte certifikát (může být podepsaný svým držitelem). Měl by mít příponu .cer souboru.
Na stránce Můj účet na portálu pro správu pro tenanty klikněte na Certifikáty pro správu.
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.
Zakažte SSLv3 (další informace najdete v tématu Jak zakázat SSL 3.0 v Azure Websites, Role a Virtual Machines).
Nepřijímejte klíče s méně než 128 bity.
Nepřijímejte slabé kryptografické metody, jako jsou RC4-SHA a MD5 (další informace najdete v tématu Jak omezit použití určitých kryptografických algoritmů a protokolů v Schannel).
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