sergey vasin

The IT blog

Включаем функциональность «второго перехода» в PowerShell с помощью CredSSP – Hey, Scripting Guy! Blog

leave a comment »

Резюме: Microsoft Scripting Guy, Ed Wilson рассказывает о так называемой проблеме «второго перехода» («second-hop») в Windows PowerShell, а также о способе ее преодоления при помощи CredSSP.

Для начала — описание проблемы

В недавней статье я рассказывал о модуле для Windows Update, позволяющем применять обновления к моему локальному компьютеру. Это действительно здорово.

Заметка: Больше информации о модуле для Windows Update и о том, как его использовать, вы можете найти в посте Use a PowerShell Module to Run Windows Update (перевод).

Сохранив модуль в центральном расположении я могу с легкостью вносить в него изменения, без необходимости обновлять каждый из моих серверов в отдельности. Кроме того, при необходимости я могу просто загрузить модуль и обновить удаленные системы. Для этого мне нужно всего лишь создать удаленную сессию, импортировать модуль и запустить командлет Get-WUInstall.

К сожалению, когда я запускаю командлет Invoke-Command, я получаю следующие ошибки: «ResourceUnavailable» и «not recognized as the name of a cmdlet». Они приведены на рисунке ниже.

01

Когда я использую командлет Invoke-Command для проверки существования пути, я получаю ошибку «Access is denied». Это странно, так как я запускаю команду с правами администратора, и я знаю, что мне разрешен доступ как в настройках общей папки, так и в NTFS. Я могу проверить путь со своего локального компьютера, и все работает нормально. Что бы это могло быть?

Я решил подключиться к моему серверу SQL1 посредством Remote Desktop Protocol (RDP), и запустить Test-Path оттуда. (К слову, я могу запустить Remote Desktop Connection прямо из консоли PowerShell, набрав mstsc).

В RDP-сессии я открыл Windows PowerShell и набрал Test-Path. Командлет вернул True.

PS C:\> Test-Path \\dc1\Share\PSWindowsUpdate

True

Я также смог импортировать модуль из общей папки на DC1.

Import-Module -Name \\dc1\Share\PSWindowsUpdate

Кроме этого, я без проблем смог запустить командлеты (расширенные функции) из этого модуля и они отработали положенным образом.

02

Итак, это определенно не проблема с разрешением имен, так как сервер SQL1 может подключиться к серверу DC1. Также с SQL1 я смог подключиться к общей папке, импортировать модуль и даже запустить входящие в него командлеты. То что я не смог – так это подключиться со своего компьютера к серверу SQL1, а затем с него – к серверу DC1. Это и есть печально известная проблема второго перехода.

Эта ситуация представлена на следующем рисунке. Клиент A устанавливает удаленную сессию с сервером A. Внутри сессии запускается командлет Get-Process. Он отрабатывает как ожидается и клиент получает список процессов на сервере A. Теперь в сессии запускается командлет Test-Path для проверки пути к общей папке на сервере B. Результатом является ошибка «Access is denied». Это проблема второго перехода, когда учетные данные клиента, использовавшиеся для установления сессии к серверу A, пытаются использовать для доступа с серверу B с целью проверки пути.

 03

Используем CreddSSP для решения проблемы второго перехода

Во время разработки Windows Vista мы внедрили новый модуль делегирования, называемый Credential Security Service Provider (CredSSP). Изначально он был разработан для использования с Терминальными Службами, потому что в них, практически все – это второй переход. Так что же именно происходит при втором переходе? Итак, я могу подключиться к серверу SQL1 и работать локально. Для этого я использую учетные данные, указанные мной при создании сессии. Когда, работая удаленно на SQL1, я пытаюсь получить доступ на DC1 – это второй переход. И откуда же берутся учетные данные для подключения к DC1? Для этого могли бы использоваться мои учетные данные, указанные при подключении к SQL1, но это может стать проблемой, если SQL1 будет скомпрометирован. Таким образом злоумышленник, обладая моими учетными данными, может сделать множество вещей.

Давайте подумаем об этом с другой стороны. Мой отец дает мне его кредитную карту, чтобы я мог совершать только строго определенные покупки (например, заправить машину, чтобы я мог приехать домой на праздники). Таким образом отец мне доверяет, а также доверяет тому, что я буду покупать только определенные вещи. Это первый переход, и он разрешен во всех наших сценариях управления. Теперь представим, что я решил одолжить кредитную карту отца некоторым из моих друзей. Это не разрешается, поскольку мой отец не знает моих друзей и что они будут делать с его картой.

Однако, предположим, что отец знает одного из моих друзей. И он хочет помочь ему, чтобы он тоже смог приехать домой на праздники. В этом случае он явным образом разрешит второй переход для определенного человека и для определенной ситуации. И здесь на сцену выходит CredSSP.

Заметка: для получения дополнительной информации о CredSSP ознакомьтесь с этой замечательной статьей на MSDN.

Мне нужно внести два изменения. На моей рабочей станции мне надо запустить командлет Enable-WSManCredSSP для включения роли клиента и указания компьютера, которому я хочу делегировать свои учетные данные.

Enable-WSManCredSSP -Role Client -DelegateComputer *.iammred.net –Force

Также мне нужно внести изменения в конфигурацию удаленного сервера, чтобы позволить ему использовать делегированные учетные данные.

Enable-WSMaCredSSP -Role Server –Force

Использование этих двух команд проиллюстрировано на рисунке.

 04

Выполняем второй переход

Теперь я могу использовать CredSSP для выполнения второго перехода, а значит и для использования модуля из общей папки.

Однако, есть две важные вещи, о которых следует помнить, создавая подключения.

1.       При создании сессии, убедитесь, что указали параметр  –Authentication CredSSP.

2.       При создании сессии используйте FQDN удаленного сервера.

Ниже приведен текст скрипта, использующего CredSSP.

$credential = Get-Credential -Credential iammred\administrator

$session = New-PSSession -cn SQL1.Iammred.Net -Credential $credential -Authentication Credssp

Invoke-Command -Session $session -ScriptBlock {Test-Path \\dc1\share\PSWindowsUpdate}

Invoke-Command -Session $session -ScriptBlock {

  Import-Module -Name \\dc1\Share\PSWindowsUpdate }

Invoke-Command -Session $session -ScriptBlock {Get-WUHistory }

Автор:

Ed Wilson, Microsoft Scripting Guy

Оригинал:

http://blogs.technet.com/b/heyscriptingguy/archive/2012/11/14/enable-powershell-quot-second-hop-quot-functionality-with-credssp.aspx


Страницы в социальных сетях:

Twitter: https://twitter.com/vsseth
Facebook: https://fb.com/inpowershell
VKontakte: https://vk.com/inpowershell


Реклама

Written by Сергей Васин

Ноябрь 17, 2012 в 14:55

Опубликовано в HeyScriptingGuyBlog, PowerShell

Tagged with

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s