Solução de problemas de segurança
Aplica-se a: Pacote do Windows Azure
Este tópico descreve a solução de problemas relacionados à segurança e à autenticação no Windows Azure Pack para Windows Server. Muitos problemas podem ser resolvidos examinando a lista de verificação Credenciais neste tópico. Recomendações são fornecidas para os seguintes problemas:
Depois de integrar o AD FS, redefina o portal de gerenciamento para usar o AD
Depois de integrar o AD FS, não é possível acessar o portal do locatário
Obter um token com o cmdlet Get-MgmtSvcToken
Usar certificados de locatário programaticamente
Substituir um certificado autoassinado por um certificado confiável
Resolver avisos de certificado
Entre no portal de gerenciamento de várias contas
Examinar as configurações de SSL/TLS
Lista de verificação de credenciais
A lista de verificação a seguir fornece práticas recomendadas para configurar certificados, nomes de usuário e senhas para o Windows Azure Pack e os produtos e provedores que ele usa.
Para testes ou componentes não voltados para a Internet, como o portal de gerenciamento para administradores ou Administração API, você pode usar a autoridade de certificação da Microsoft para criar certificados autoassinados.
Para componentes voltados para a Internet, como o portal de gerenciamento para locatários e a API Pública do Locatário, use uma autoridade de certificação pública confiável.
Configure as identidades do Pool de Aplicativos para o Service Provider Foundation no IIS (Serviços de Informações da Internet) no servidor que executa o Service Provider Foundation para que eles usem a conta de credenciais do usuário de domínio. O uso dos Serviços de Rede não é recomendado.
Configure as identidades do Pool de Aplicativos nos servidores que executam o System Center 2012 R2 Virtual Machine Manager e o Service Provider Foundation para usar a mesma conta de domínio que tem direitos de logon como serviço .
Configure o Service Provider Foundation para usar a autenticação básica no IIS.
Configure uma conta de usuário local que tenha direitos administrativos para ser membro dos grupos VMM, Administração, Provedor e Uso no servidor que executa o Service Provider Foundation. Use essa conta de usuário local para registrar o ponto de extremidade do Service Provider Foundation com o Windows Azure Pack para Windows Server.
Para obter mais informações, consulte a postagem no blog Solução de problemas do Windows Azure Pack, Service Provider Foundation & Virtual Machine Manager. Para obter uma visão geral dos serviços Web do Service Provider Foundation, consulte Gerenciar serviços Web e Connections no Service Provider Foundation. Confira também Visão geral da Autenticação do Pacote do Windows Azure.
Depois de integrar o AD FS, não é possível acessar o portal do locatário
Refere-se a: Configurar Serviços de Federação do Active Directory (AD FS) para o Windows Azure Pack
Problema
A tela de logon do locatário não é exibida depois de configurar o AD FS (Serviços de Federação do Active Directory (AD FS)) ou não pode acessar o portal de gerenciamento para locatários.
Recomendação
Depois de integrar o AD FS no domínio em que o Windows Azure Pack está instalado, a página de logon será ignorada indo diretamente para o portal. Esse é o comportamento esperado do navegador.
Se você não puder acessar o portal de gerenciamento para locatários, use Gerenciador do Servidor para executar a Edição ADSI e verifique se o servidor SF do AD tem um SPN (Nome da Entidade de Serviço) listado. O SPN deve estar na forma de http/myADFSServer.
Voltar ao início
Depois de integrar o AD FS, redefina o portal de gerenciamento para usar o AD
Refere-se a: Configurar Serviços de Federação do Active Directory (AD FS) para o Windows Azure Pack
Problema
Deseja voltar a usar o Active Directory (AD) para o portal de gerenciamento, depois de integrar o AD FS (Serviços de Federação do Active Directory (AD FS)).
Recomendação
Você deve restabelecer a confiança entre o portal de gerenciamento para administradores e o site autenticação do Windows como fez com o AD FS. O site autenticação do Windows é a porta 30072. Você pode usar os cmdlets Windows PowerShell Set-MgmtSvcRelyingPartySettigns e Set-MgmtSvcIdentityProviderSettings.
Obter um token com o cmdlet Get-MgmtSvcToken
Refere-se a: Windows Azure Pack para Automação do Windows Server com Windows PowerShell
Problema
O Get-MgmtSvcToken não retorna o token conforme o esperado.
Recomendação
Isso pode ser um problema com o cmdlet Get-MgmtSvcToken não usando Serviços de Federação do Active Directory (AD FS) (AD FS) corretamente. O script a seguir define uma função, Get-AdfsToken, como uma solução alternativa.
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 início
Usar certificados de locatário programaticamente
Refere-se a: Guia do Desenvolvedor do Service Provider Foundation
Problema
Você precisa criar um certificado e carregá-lo no portal de gerenciamento para locatários e, em seguida, ser capaz de usá-lo programaticamente.
Recomendação
Use este procedimento:
Crie um certificado (ele pode ser autoassinado). Ele deve ter uma extensão de arquivo .cer .
Na página Minha Conta do portal de gerenciamento para locatários, clique em Certificados de Gerenciamento.
Passe o certificado no cabeçalho da solicitação para a API Pública de Locatário para autenticação, conforme mostrado no exemplo a seguir.
Observação
Você poderá acessar apenas a assinatura à qual esse certificado está atribuído. Você não poderá excluir a assinatura por meio da API Pública de Locatário.
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 início
Substituir um certificado autoassinado por um certificado confiável
Refere-se a: Administrar o Windows Azure Pack para Windows Server
Problema
Depois de usar um certificado autoassinado para um ambiente de teste, você deseja substituir o certificado por um emitido de uma autoridade confiável.
Recomendação
Instale o certificado no Repositório Pessoal do computador local e mapeie o certificado para cada site no Gerenciador dos Serviços de Informações da Internet (IIS). O certificado deve atender aos seguintes requisitos:
Vindo de uma autoridade de certificação confiável
Ter um intervalo de datas válido
Fornecer um uso válido e uma instrução de finalidade pretendida
Fornecer autenticação de servidor
Corresponder o nome de domínio do certificado com o nome do site
Ter uma criptografia RSA-1024 bits ou superior
Incluir a chave privada
Voltar ao início
Resolver avisos de certificado
Refere-se a: Implantar o Windows Azure Pack para Windows Server
Problema
Os avisos de certificado persistem com o certificado de uma autoridade confiável.
Recomendação
Alguns navegadores não processam o campo Acesso às Informações da Autoridade que está no certificado durante a validação do certificado. A solução alternativa é instalar explicitamente os certificados intermediários no repositório de certificados. Para obter uma lista de autoridades de certificação que dão suporte a esse campo, consulte Windows e Windows Phone 8 SSL Root Certificate Program (CAs membro).
Voltar ao início
Examinar as configurações de SSL/TLS
Refere-se a: Implantar o Windows Azure Pack para Windows Server
Problema
A segurança de comunicação fraca pode resultar em uma enxurrada de erros do Schannel que aparecem no log de eventos do sistema.
Recomendação
Para melhorar a segurança dos canais de comunicação do Windows Azure Pack, considere atualizar suas configurações de SSL/TLS. Antes de implementar essas alterações, você deve garantir que elas não afetem outros aplicativos ou serviços.
Desabilite o SSLv3 (para obter mais informações, confira Como desabilitar 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 o uso de determinados algoritmos e protocolos criptográficos no Schannel).
Você pode executar o seguinte script em cada computador que executa o Windows Azure Pack para fazer essas alterações para você:
# 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
}
Você também pode executar ferramentas de validação SSL/TLS para identificar outras áreas de melhoria.
Voltar ao início
Entre no portal de gerenciamento de várias contas
Refere-se a: Windows Azure Pack para Automação do Windows Server com Windows PowerShell
Problema
Você precisa ser capaz de entrar no portal de gerenciamento de várias contas.
Recomendação
Use o cmdlet Add-MgmtSvcAdminUser Windows PowerShell para adicionar entidades de segurança adicionais. Essas entidades de segurança podem ser usuários explícitos ou grupos de segurança (se seus tokens contiverem informações de grupo de segurança). O exemplo a seguir adiciona um usuário. (Ele pressupõe que a senha foi definida para a variável $pwd.)
Add-MgmtSvcAdminUser -Server 'mysqlserver' -UserName 'sa' -Password $pwd -Principal 'user7@contoso.com'
Voltar ao início