Устранение неполадок с безопасностью
Область применения: Windows Azure Pack
В этом разделе описываются проблемы, связанные с безопасностью и проверкой подлинности в Windows Azure Pack для Windows Server. Многие проблемы можно устранить, просмотрив контрольный список учетных данных в этом разделе. Предоставляются рекомендации по следующим проблемам:
После интеграции AD FS сбросьте портал управления для использования AD.
После интеграции AD FS не удается получить доступ к порталу клиента
Получение маркера с помощью командлета Get-MgmtSvcToken
Программное использование сертификатов клиента
Замена самозаверяющего сертификата доверенным сертификатом
Устранение предупреждений о сертификатах
Вход на портал управления из нескольких учетных записей
Проверка параметров SSL/TLS
Контрольный список учетных данных
В следующем контрольном списке приведены рекомендации по настройке сертификатов, имен пользователей и паролей для Windows Azure Pack, а также продуктов и поставщиков, которые он использует.
Для тестирования или без подключения к Интернету компонентов, таких как портал управления для администраторов или API Администратор, можно использовать центр сертификации Майкрософт для создания самозаверяющих сертификатов.
Для компонентов с выходом в Интернет, таких как портал управления для клиентов и общедоступный API клиента, используйте доверенный общедоступный центр сертификации.
Настройте удостоверения пула приложений для Service Provider Foundation в службах IIS на сервере Service Provider Foundation, чтобы они использовали учетные данные пользователя домена. Не рекомендуется использовать сетевые службы.
Настройте удостоверения пула приложений на серверах под управлением System Center 2012 R2 Virtual Machine Manager и Service Provider Foundation, чтобы использовать ту же учетную запись домена с правами входа в качестве службы .
Настройте Service Provider Foundation для использования обычной проверки подлинности в IIS.
Настройте учетную запись локального пользователя с правами администратора, чтобы она была членом групп VMM, Администратор, поставщиков и использования на сервере Service Provider Foundation. Используйте эту учетную запись локального пользователя для регистрации конечной точки Service Provider Foundation в Windows Azure Pack для Windows Server.
Дополнительные сведения см. в записи блога Troubleshooting Windows Azure Pack, Service Provider Foundation & Virtual Machine Manager. Общие сведения о веб-службах Service Provider Foundation см. в статье Управление веб-службами и Connections в Service Provider Foundation. См. также общие сведения о проверке подлинности пакета Windows Azure.
После интеграции AD FS не удается получить доступ к порталу клиента
Относится к: Настройка службы федерации Active Directory (AD FS) для Windows Azure Pack
Проблема
Экран входа клиента не отображается после настройки AD FS (службы федерации Active Directory (AD FS)) или не может получить доступ к порталу управления для клиентов.
Рекомендация
После интеграции AD FS в домене, где установлен Пакет Windows Azure, страница входа будет обходить переход непосредственно на портал. Это ожидаемое поведение браузера.
Если вы не можете получить доступ к порталу управления для клиентов, используйте диспетчер сервера для запуска adsI Edit и убедитесь, что на сервере AD SF указано имя субъекта-службы (SPN). Имя субъекта-службы должно иметь вид http/myADFSServer.
В начало
После интеграции AD FS сбросьте портал управления для использования AD.
Относится к: Настройка службы федерации Active Directory (AD FS) для Windows Azure Pack
Проблема
Хотите вернуться к использованию Active Directory (AD) для портала управления после интеграции службы федерации Active Directory (AD FS) (AD FS).
Рекомендация
Необходимо восстановить доверие между порталом управления для администраторов и сайтом проверка подлинности Windows, как и для AD FS. Сайт проверка подлинности Windows — порт 30072. Можно использовать командлеты Windows PowerShell Set-MgmtSvcRelyingPartySettigns и Set-MgmtSvcIdentityProviderSettings.
Получение маркера с помощью командлета Get-MgmtSvcToken
Относится к: Windows Azure Pack для автоматизации Windows Server с Windows PowerShell
Проблема
Get-MgmtSvcToken не возвращает токен должным образом.
Рекомендация
Это может быть проблемой из-за неправильного использования службы федерации Active Directory (AD FS) (AD FS) командлетом Get-MgmtSvcToken. Следующий скрипт определяет функцию Get-AdfsToken в качестве обходного решения.
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
В начало
Программное использование сертификатов клиента
Относится к: Руководство разработчика Service Provider Foundation
Проблема
Необходимо создать сертификат и отправить его на портал управления для клиентов, а затем использовать его программным способом.
Рекомендация
Выполните перечисленные ниже действия.
Создайте сертификат (он может быть самозаверяющий). Он должен иметь расширение .cer файла.
На странице Моя учетная запись портала управления для клиентов щелкните Сертификаты управления.
Передайте сертификат в заголовке запроса в общедоступный API клиента для проверки подлинности, как показано в следующем примере.
Примечание
Вы сможете получить доступ только к подписке, назначенной этому сертификату. Вы не сможете удалить подписку с помощью общедоступного 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;
В начало
Замена самозаверяющего сертификата доверенным сертификатом
Относится к: администрирование Пакета Windows Azure для Windows Server
Проблема
После использования самозаверяющего сертификата для тестовой среды необходимо заменить сертификатом, выданным доверенным центром сертификации.
Рекомендация
Установите сертификат в личном хранилище локального компьютера и сопоставьте его с каждым веб-сайтом в диспетчере служб IIS. Сертификат должен соответствовать следующим требованиям:
Из доверенного центра сертификации
Наличие допустимого диапазона дат
Укажите допустимую инструкцию об использовании и предполагаемой цели
Проверка подлинности сервера
Сопоставление доменного имени сертификата с именем веб-сайта
1024-разрядное шифрование RSA или более поздней версии
Включение закрытого ключа
В начало
Устранение предупреждений о сертификатах
Относится к: Развертывание Пакета Windows Azure для Windows Server
Проблема
Предупреждения о сертификатах сохраняются с сертификатом из доверенного центра.
Рекомендация
Некоторые браузеры не обрабатывают поле "Доступ к информации центра", которое находится в сертификате во время проверки сертификата. Обходной путь заключается в явной установке промежуточных сертификатов в хранилище сертификатов. Список центров сертификации, поддерживающих это поле, см. в статье Программа корневых сертификатов SSL (члены ЦС) для Windows и Windows Phone 8.
В начало
Проверка параметров SSL/TLS
Относится к: Развертывание Пакета Windows Azure для Windows Server
Проблема
Слабая безопасность связи может привести к переполнению ошибок Schannel, отображаемых в журнале системных событий.
Рекомендация
Чтобы повысить безопасность каналов связи Windows Azure Pack, рассмотрите возможность обновления параметров SSL/TLS. Перед реализацией этих изменений необходимо убедиться, что они не влияют на другие приложения или службы.
Отключение SSLv3 (дополнительные сведения см. в статье Отключение SSL 3.0 в веб-сайтах, ролях и Виртуальные машины Azure).
Не принимайте ключи менее 128 бит.
Не допускайте слабые криптографические методы, такие как RC4-SHA и MD5 (дополнительные сведения см. в статье Ограничение использования определенных криптографических алгоритмов и протоколов в Schannel).
Чтобы внести эти изменения, на каждом компьютере под управлением Windows Azure Pack можно выполнить следующий скрипт:
# 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
}
Вы также можете запустить средства проверки SSL/TLS, чтобы определить другие области для улучшения.
В начало
Вход на портал управления из нескольких учетных записей
Относится к: Windows Azure Pack для автоматизации Windows Server с Windows PowerShell
Проблема
Необходимо иметь возможность входа на портал управления из нескольких учетных записей.
Рекомендация
Используйте командлет Add-MgmtSvcAdminUser Windows PowerShell для добавления дополнительных субъектов. Эти субъекты могут быть явными пользователями или группами безопасности (если маркеры содержат сведения о группе безопасности). В следующем примере добавляется пользователь. (Предполагается, что пароль определен для переменной $pwd.)
Add-MgmtSvcAdminUser -Server 'mysqlserver' -UserName 'sa' -Password $pwd -Principal 'user7@contoso.com'
В начало