Seguridad y PowerShell (Parte III)

Continuamos con la serie de PowerShell y seguridad de ésta, hablando hoy sobre el tema de comunicaciones y ejecuciones remotas. PowerShell ofrece para los administradores de sistemas la posibilidad de realizar consultas o ejecutar acciones sobre máquinas y sistemas remotos dentro de la organización. PowerShell funciona por debajo con .NET Framework, el cual facilita dichas gestionas. Para estas comunicaciones se necesita Windows Remote Management 2.0, el cual viene instalado por defecto en los sistemas operativos Windows 7 / 2008 R2. El requisito fundamental para poder utilizar las ejecuciones remotas en una máquina, y es que se debe ser miembro del grupo administradores de la máquina remota o ser miembro del grupo de administradores de dominio, si el ámbito es un dominio. Implícitamente PowerShell enviará sus credenciales con las que actualmente nos encontremos logueados en el sistema, tal y como sucede con SMB.

Por este hecho es necesario estar logueado en la máquina local como un usuario que sea administrador en la máquina remota, además esa misma cuenta deberá disponer de la misma contraseña (Impersonalización de usuarios? pass the hash implícito?). Aunque, por supuesto, existe la opción de poder indicar con qué credenciales se quiere autenticar en la máquina remota el usuario.

Creación y configuración de una sesión remota

Existe una gran cantidad de cmdlets en PowerShell que permiten ejecutar instrucciones remotas de manera segura. Uno de los ejemplos más básicos sería la posibilidad de listar los servicios o procesos que corren en una máquina remota sin necesidad de Windows Remote Managmente 2.0. Para ello se puede utilizar el parámetro computername, por ejemplo, get-service -computername <maquina>.

Ahora, si queremos crear sesiones remotas se debe habilitar, en primera instancia Windows Remote Management 2.0, con el cmdlet Enable-PSRemoting en los equipos que serán administrados a distancia. Por el contrario, si en algún instante se quiere deshabilitar la gestión remota se ejecutará el cmdlet Disable-PSRemoting. Es importante que el perfil de la red no sea público, porque no podremos realizar dichas acciones, siempre un perfil de red de dominio o privado. Las máquinas deben de ser de confianza, por lo que en un dominio no hay problema, si no hay dominio habrá que configurar la confianza.

El cmdlet New-PSSession permite crear nuevas sesiones, y dispone de gran cantidad de opciones:

  • Credential. Especifica con qué usuario y password se quiere iniciar sesión.
  • Port. Puerto por el que realizar la conexión.
  • ComputerName. Nombre de la máquina para la conexión.
Para crear la sesión como el usuario con el que se está logueado hay que ejecutar new-PSSession -computername <maquina>. Un ejemplo para llevar a cabo estas acciones puede ser:
$cred = get-credential; new-PSSession –ComputerName <nombre máquina> -Credential $cred

En primer lugar se pide las credenciales, las cuales se encuentran securizadas en memoria, se almacenan en la variable y después se crea la sesión sobre la máquina remota. El cmdlet Get-PSSession devuelve las distintas sesiones que se han creado, ya sean locales o remotas.

En el libro de PowerShell: La navaja suiza de los administradores de sistemas se puede obtener más información sobre la seguridad aplicada con esta línea de comandos.