Resolução de problemas de segurança
Aplica-se a: Windows Azure Pack
Este tópico descreve problemas de resolução de problemas relacionados com segurança e autenticação no Windows Azure Pack para Windows Server. Muitos problemas podem ser resolvidos ao rever a lista de verificação Credenciais neste tópico. São fornecidas recomendações para os seguintes problemas:
Depois de integrar o AD FS, reponha o portal de gestão para utilizar o AD
Depois de integrar o AD FS, não é possível aceder ao portal do inquilino
Obter um token com o cmdlet Get-MgmtSvcToken
Utilizar certificados de inquilino programaticamente
Substituir um certificado autoassinado por um certificado fidedigno
Resolver avisos de certificados
Iniciar sessão no portal de gestão a partir de várias contas
Rever as definições de SSL/TLS
Lista de verificação de credenciais
A seguinte lista de verificação fornece melhores práticas para configurar certificados, nomes de utilizador e palavras-passe para o Windows Azure Pack e os produtos e fornecedores que utiliza.
Para testes ou componentes não destinados à Internet, como o portal de gestão para administradores ou Administração API, pode utilizar a autoridade de certificação da Microsoft para criar certificados autoassinados.
Para componentes com acesso à Internet, como o portal de gestão para inquilinos e a API Pública do Inquilino, utilize uma autoridade de certificação pública fidedigna.
Configure as identidades do Conjunto Aplicacional para o Service Provider Foundation nos Serviços de Informação Internet (IIS) no servidor que executa o Service Provider Foundation para que utilizem a conta de credenciais de utilizador do domínio. A utilização de Serviços de Rede não é recomendada.
Configure as identidades do Conjunto Aplicacional nos servidores que executam o System Center 2012 R2 Virtual Machine Manager e o Service Provider Foundation para utilizar a mesma conta de domínio que tem direitos de Início de Sessão como serviço .
Configure o Service Provider Foundation para utilizar a autenticação básica no IIS.
Configure uma conta de utilizador local que tenha direitos administrativos para ser membro dos grupos VMM, Administração, Fornecedor e Utilização no servidor que executa o Service Provider Foundation. Utilize esta conta de utilizador local para registar o ponto final do Service Provider Foundation com o Windows Azure Pack para Windows Server.
Para obter mais informações, veja a mensagem de blogue Resolução de problemas do Windows Azure Pack, Service Provider Foundation & Virtual Machine Manager. Para obter uma descrição geral dos serviços Web do Service Provider Foundation, veja Manage Web Services and Connections in Service Provider Foundation (Gerir Serviços Web e Connections no Service Provider Foundation). Veja também Descrição Geral da Autenticação do Windows Azure Pack.
Depois de integrar o AD FS, não é possível aceder ao portal do inquilino
Diz respeito a: Configurar Serviços de Federação do Active Directory (AD FS) para o Windows Azure Pack
Problema
O ecrã de início de sessão do inquilino não é apresentado após configurar o AD FS (Serviços de Federação do Active Directory (AD FS)) ou não consegue aceder ao portal de gestão dos inquilinos.
Recomendação
Depois de integrar o AD FS no domínio onde o Windows Azure Pack está instalado, a página de início de sessão é ignorada ao aceder diretamente ao portal. Este é o comportamento esperado do browser.
Se não conseguir aceder ao portal de gestão dos inquilinos, utilize Gestor de Servidor para executar a Edição ADSI e verifique se o servidor SF do AD tem um Nome do Principal de Serviço (SPN) listado. O SPN deve estar sob a forma de http/myADFSServer.
Voltar ao topo
Depois de integrar o AD FS, reponha o portal de gestão para utilizar o AD
Diz respeito a: Configurar Serviços de Federação do Active Directory (AD FS) para o Windows Azure Pack
Problema
Quer voltar a utilizar o Active Directory (AD) para o portal de gestão, depois de integrar Serviços de Federação do Active Directory (AD FS) (AD FS).
Recomendação
Tem de restabelecer a confiança entre o portal de gestão dos administradores e o site de autenticação do Windows, tal como fez para o AD FS. O site de autenticação do Windows é a porta 30072. Pode utilizar os cmdlets Windows PowerShell Set-MgmtSvcRelyingPartySettigns e Set-MgmtSvcIdentityProviderSettings.
Obter um token com o cmdlet Get-MgmtSvcToken
Diz respeito a: Windows Azure Pack para Automatização do Windows Server com Windows PowerShell
Problema
O Get-MgmtSvcToken não devolve o token conforme esperado.
Recomendação
Este pode ser um problema com o cmdlet Get-MgmtSvcToken que não está a utilizar corretamente Serviços de Federação do Active Directory (AD FS) (AD FS). O script seguinte define uma função, Get-AdfsToken, como solução.
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
Voltar ao topo
Utilizar certificados de inquilino programaticamente
Diz respeito a: Service Provider Foundation Developer's Guide (Guia do Programador do Service Provider Foundation)
Problema
Tem de criar um certificado, carregá-lo para o portal de gestão dos inquilinos e, em seguida, conseguir utilizá-lo programaticamente.
Recomendação
Utilize o seguinte procedimento:
Crie um certificado (pode ser autoassinado). Deve ter uma extensão de ficheiro .cer .
Na página A Minha Conta do portal de gestão dos inquilinos, clique em Certificados de Gestão.
Transmita o certificado no cabeçalho do pedido para a API Pública do Inquilino para autenticação, conforme mostrado no exemplo seguinte.
Nota
Só poderá aceder à subscrição à qual este certificado está atribuído. Não poderá eliminar a subscrição através da API Pública do Inquilino.
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;
Voltar ao topo
Substituir um certificado autoassinado por um certificado fidedigno
Diz respeito a: Administrar o Windows Azure Pack para Windows Server
Problema
Depois de utilizar um certificado autoassinado para um ambiente de teste, quer substituir o certificado por um emitido por uma autoridade fidedigna.
Recomendação
Instale o certificado no Arquivo Pessoal do computador local e mapeie o certificado para cada web site no Gestor de Serviços de Informação Internet (IIS). O certificado deve cumprir os seguintes requisitos:
Provém de uma autoridade de certificação fidedigna
Ter um intervalo de datas válido
Fornecer uma declaração de utilização e finalidade válida
Fornecer autenticação de servidor
Corresponder o nome de domínio do certificado ao nome do web site
Ter uma encriptação RSA-1024-bit ou superior
Incluir a chave privada
Voltar ao topo
Resolver avisos de certificados
Diz respeito a: Implementar o Windows Azure Pack para Windows Server
Problema
Os avisos de certificado persistem com o certificado de uma autoridade fidedigna.
Recomendação
Alguns browsers não processam o campo Acesso a Informações de Autoridade que está no certificado durante a validação do certificado. A solução é instalar explicitamente os certificados intermédios no arquivo de certificados. Para obter uma lista das autoridades de certificação que suportam este campo, consulte Windows and Windows Phone 8 SSL Root Certificate Program (ACs Membro).
Voltar ao topo
Rever as definições de SSL/TLS
Diz respeito a: Implementar o Windows Azure Pack para Windows Server
Problema
A fraca segurança de comunicação pode resultar numa inundação de erros de Schannel que aparecem no registo de eventos do sistema.
Recomendação
Para melhorar a segurança dos canais de comunicação do Windows Azure Pack, considere atualizar as definições de SSL/TLS. Antes de implementar estas alterações, deve garantir que não afetam outras aplicações ou serviços.
Desative o SSLv3 (para obter mais informações, veja Como Desativar o SSL 3.0 em Sites, Funções e Máquinas Virtuais do Azure).
Não aceite chaves com menos de 128 bits.
Não aceite métodos criptográficos fracos, como RC4-SHA e MD5 (para obter mais informações, consulte Como restringir a utilização de determinados algoritmos criptográficos e protocolos no Schannel).
Pode executar o seguinte script em cada computador com o Windows Azure Pack para efetuar estas alterações por si:
# 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
}
Também pode executar ferramentas de validação SSL/TLS para identificar outras áreas para melhoramento.
Voltar ao topo
Iniciar sessão no portal de gestão a partir de várias contas
Diz respeito a: Windows Azure Pack para Automatização do Windows Server com Windows PowerShell
Problema
Tem de conseguir iniciar sessão no portal de gestão a partir de várias contas.
Recomendação
Utilize o cmdlet Add-MgmtSvcAdminUser Windows PowerShell para adicionar principais adicionais. Estes principais podem ser utilizadores explícitos ou grupos de segurança (se os tokens contiverem informações do grupo de segurança). O exemplo seguinte adiciona um utilizador. (Pressupõe que a palavra-passe foi definida para a variável $pwd.)
Add-MgmtSvcAdminUser -Server 'mysqlserver' -UserName 'sa' -Password $pwd -Principal 'user7@contoso.com'
Voltar ao topo