Compartilhar via


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:

  1. Crie um certificado (ele pode ser autoassinado). Ele deve ter uma extensão de arquivo .cer .

  2. Na página Minha Conta do portal de gerenciamento para locatários, clique em Certificados de Gerenciamento.

  3. 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.

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

Consulte Também

Solução de problemas do Pacote do Windows Azure