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:
Skapa ett certifikat (det kan vara självsignerat). Det bör ha ett .cer filnamnstillägg.
På sidan Mitt konto i hanteringsportalen för klienter klickar du på Hanteringscertifikat.
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.
Inaktivera SSLv3 (mer information finns i Inaktivera SSL 3.0 på Azure Websites, Roles och Virtual Machines).
Acceptera inte nycklar med färre än 128 bitar.
Acceptera inte svaga kryptografiska metoder som RC4-SHA och MD5 (mer information finns i Så här begränsar du användningen av vissa kryptografiska algoritmer och protokoll i Schannel).
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