Ejecución remota
Introducción
Hemos visto en el capítulo anterior que a través de CIM/WMI es posible realizar una serie de acciones sobre máquinas remotas. En este capítulo le vamos a mostrar que existen otros medios de llevarlo a cabo.
La administración remota de equipos es un tema muy amplio y no todo el mundo tiene las mismas expectativas. Sobre todo es muy amplio porque, en función del OS remoto (Windows Server o cliente Windows) y de la versión de PowerShell instalada, no administraremos las máquinas de la misma manera. Además, desde que PowerShell es multiplataforma, existen distintas maneras de proceder. En efecto, no se gestiona de la misma manera un OS Windows que un OS Linux.
A continuación, en términos de expectativas, habrá quien simplemente quiera enviar un comando de manera remota, como por ejemplo reiniciar una máquina, recuperar una lista de procesos en ejecución, reiniciar un servicio detenido, etc., mientras que otras personas desearán, por su parte, ejecutar un script sobre uno o varios equipos remotos.
Sin duda, todos estos escenarios son posibles con PowerShell. El objetivo de este capítulo es, precisamente, explicarle cómo implementar todos estos escenarios de la manera mejor adaptada posible a su contexto y a su entorno técnico.
Evolución de las tecnologías de acceso remoto
PowerShell existe ahora desde hace una decena...
Comunicaciones remotas del Framework .NET
Esta sección solo se aplica a Windows PowerShell. En efecto, en PowerShell Core, con ánimo de homogeneizar el funcionamiento multiplataforma, el parámetro -ComputerName solo existe en los comandos basados en WinRM.
PowerShell se apoya plenamente en el Framework .NET y por eso aprovecha las funcionalidades de ejecución remota de este. Así es como algunos comandos han adquirido el parámetro -ComputerName. Estos comandos son capaces de ejecutarse sobre uno o varios equipos remotos que no es necesario configurar. Funciona, simplemente (siempre que los distintos firewalls no impidan su funcionamiento).
Las comunicaciones remotas del Framework .NET representan la manera más sencilla de actuar sobre equipos remotos, pero preste atención porque se apoyan en el protocolo RPC. Este protocolo utiliza puertos dinámicos. Podría por lo tanto verse enfrentado rápidamente a problemas de seguridad de red. Es la razón por la que su uso está sobre todo restringido a redes de tipo LAN. Si trabaja en entornos con cortafuegos y reglas de filtrado instaladas, le aconsejamos que vaya directamente a la sección que habla de las comunicaciones remotas WinRM.
Preste atención: a partir de Windows Server 2012/Windows 8, los protocolos RPC y DCOM están bloqueados por el cortafuegos de Windows. Por lo tanto, a menos que añada excepciones en el cortafuegos, no podrá usar la «comunicación remota del Framework .NET». Le recomendamos enérgicamente, para estas plataformas, optar por el mecanismo de «comunicación remota de PowerShell».
1. Requisitos
Ser miembro del grupo de Administradores del equipo remoto o ser miembro del grupo Administradores del dominio.
2. Determinar los comandos remotos del Framework .NET
Desgraciadamente no existe un método sencillo que permita determinar, para un comando dado, sobre qué mecanismo reposa su funcionalidad de ejecución remota. Lo más sencillo es leer la sección de ayuda asociada al comando y prestar especial atención al parámetro -ComputerName. Por lo tanto es lo que le vamos a mostrar.
Lo primero que debemos hacer, si todavía no lo hemos realizado, es instalar la ayuda de PowerShell en su equipo. Para ello, le invitamos a volver al capítulo Descubrimiento de PowerShell.
Después...
Comunicaciones remotas de Windows PowerShell (WinRM)
Esta sección se aplica a Windows PowerShell y PowerShell Core, pero solo sobre plataformas Windows.
El mecanismo de comunicación remota de Windows PowerShell, presente desde la versión 2.0, se basa en el protocolo WS-Man, llamado también «Gestión remota de Windows (WinRM)» o en inglés «Windows Remote Management». WinRM es la implementación hecha por Microsoft del estándar WS-Man.
WinRM es una tecnología que emergió con Windows Server 2003 R2. WinRM, que significa Windows Remote Management, permite enviar consultas de gestión a equipos de una red TCP/IP por los puertos 5985 (HTTP) y 5986 (HTTPS). El protocolo que se esconde detrás de esta tecnología se llama WS-Management. Este último es una especificación del DMTF (Distributed Management Task Force), que define un protocolo de comunicación para la administración de servidores, equipamientos y aplicaciones basadas en los Web Services (SOAP). WS-Management se ha convertido el 28 de enero de 2013 en un estándar oficial ISO (International Organization for Standardization).
Al igual que WBEM, WS-Management aporta un estándar (esquema XML) orientado a la gestión del hardware para facilitar la interoperabilidad entre sistemas heterogéneos en el seno de una infraestructura IT.
1. Autenticación y cifrado de las comunicaciones
La seguridad de los intercambios entre dos ordenadores se basa en dos puntos esenciales, que son la autenticación y el cifrado de los datos que transitan por la red.
Para que dos ordenadores confíen entre sí, se requiere necesariamente un tercero de confianza común a ambas partes. En un dominio Active Directory, este tercero se materializa en los controladores de dominio. Fuera del dominio, este tercero será una autoridad de certificación (PKI), de modo que dos máquinas que dispongan cada una de un certificado de servidor entregado por una misma autoridad de certificación confiarán mutuamente de manera natural. Esta autenticación mutua garantiza que un ataque de tipo «man in the middle» no pueda producirse, pues el cliente está seguro de la identidad del servidor sobre el que se conecta.
a. En un dominio Active Directory
Cuando se utiliza WinRM como protocolo de comunicación...
Comunicación remota sobre SSH (PowerShell Core únicamente)
Preste atención: en el momento de escribir estas líneas, la versión de OpenSSH para Windows está todavía en versión beta, de modo que puede que haya sutiles diferencias con la versión final.
Desde la aparición de PowerShell Core, es posible utilizar SSH como protocolo de transporte en lugar de WinRM. Esto abre escenarios que no era posible contemplar hasta el momento, tales como la administración de OS Linux o Mac OS desde una máquina Windows, ¡y también a la inversa!
Para ello, en primer lugar, vamos a tener que instalar la capa SSH que provee OpenSSH. Esto aporta a la vez un cliente SSH (ssh.exe) y también un servidor SSH (sshd.exe). Win32 OpenSSH es la versión OpenSSH para OpenBSD.
1. Instalación de OpenSSH en Windows
Lo prime que tenemos que hacer es descargar la última versión desde la siguiente dirección: https://github.com/PowerShell/Win32-OpenSSH/releases/. A continuación, ejecute escrupulosamente las siguientes operaciones:
Descargue el archivo Zip de la versión 64 bits si va a realizar la instalación sobre un OS de tipo Windows Server 2016, como haremos aquí.
Descomprima el archivo en la ruta C:\Program Files\OpenSSH.
Sitúese en la ruta donde haya descomprimido los archivos y, a continuación, desde una consola PowerShell abierta en modo Administrador, ejecute la siguiente línea de comando:
PS > powershell.exe -ExecutionPolicy Bypass -File install-sshd.ps1
A continuación, vamos a configurar el firewall a fin de abrir el puerto 22 para autorizar las conexiones SSH entrantes:
PS > New-NetFirewallRule -Name sshd `
-DisplayName 'OpenSSH Server (sshd)' `
-Enabled True -Direction Inbound -Protocol TCP `
-Action Allow -LocalPort 22
Arranque el servicio SSH:
PS > Start-Service sshd
El arranque del servicio va a crear un archivo de host SSH, así como el archivo de configuración sshd_config en %programdata%\ssh (observe que se trata de una carpeta oculta).
Para que los servicios SSH arranquen de manera automática con Windows, escriba las siguientes líneas:
PS > Set-Service sshd -StartupType Automatic
PS > Set-Service...
Conclusión
Hemos visto a través de este capítulo que existen múltiples formas de administrar máquinas de manera remota (RPC, WinRM, SSH) y que, en función de su contexto de seguridad y de los sistemas operativos que tenga que administrar, no siempre procederá del mismo modo.
PowerShell 6 presenta una gran evolución ofreciéndonos la posibilidad de administrar máquinas Linux y Mac OS con una facilidad apabullante, en particular desde la compatibilidad con SSH.
Dicho esto, no todo es de color de rosa, pues se habrá dado cuenta de que pasar de una máquina a otra puede resultar, en ocasiones, un auténtico desafío. Esperemos que Microsoft, en el futuro, nos proporcione soluciones más fáciles de implementar que las actuales.
En cualquier caso, el dilema no es sencillo, pues se contraponen de un lado la facilidad de la administración y de otro la seguridad. Vasto asunto...