Installare e configurare PowerShell for Linux
Ci stiamo quasi abituando ai rilasci sempre più rapidi di software e servizi che integrano il mondo Windows con quello Linux e le sfaccettature della nuova politica di Microsoft sono talmente tante che spesso capita di perderci qualcosa. A me per esempio era sfuggito questo simpatico video, nel quale viene ufficializzato dal team di sviluppo il rilascio della prima PowerShell Open Source nei repository GitHub.
https://www.youtube.com/watch?v=1uGyswOOPdA
E’ sicuramente un altro passo verso la strada della completa interazione tra Windows ed il mondo Open Source iniziata due anni fa e fortemente voluta dal CEO di Microsoft Satya Nadella. Tramite PowerShell Open Source, infatti, è possibile amministrare delle macchine Windows utilizzando Linux o MacOS, funzionalità impensabile fino a poco tempo fa.
Andiamo subito a vedere come possiamo installare e che cosa è possibile fare in dettaglio con questa Shell, utilizzando ad esempio un server Linux. In questo caso siamo su una macchina CentOS versione 7, ma la Shell è supportata anche su distribuzioni Ubuntu e MacOS; è disponibile inoltre anche in una immagine Docker. I binari per tutte le versioni sono disponibili su GitHub a questo link:
https://github.com/PowerShell/PowerShell/blob/master/README.md
Nel nostro caso, effettuiamo il download della versione per linux Centos con:
wget https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-alpha.12/powershell-6.0.0_alpha.12-1.el7.centos.x86_64.rpm
ed installiamo il pacchetto utilizzando yum, che provvederà anche a scaricare ed installare eventuali prerequisiti
yum install ./powershell-6.0.0_alpha.12-1.el7.centos.x86_64.rpm
La nostra PowerShell è già pronta e possiamo già utilizzarla digitando il commando
powershell
Eseguiamo il comando
Get-Module -ListAvailable
per visualizzare i moduli PowerShell disponibili sulla macchina linux:
Probabilmente un sistemista Linux non utilizzerà mai PowerShell per amministrare la propria macchina, ma è altrettanto vero che un sistemista Windows può amministrare delle macchine Linux con i comandi che già conosce; non possiamo certo ignorare il fatto che la strada intrapresa è quella che consentirà di amministrare “everything from everywhere”.
Molto particolare è sicuramente la possibilità di accedere ad una sessione PowerShell su un Windows remoto tramite il cmd-let Enter-PSSession; per fare ciò abbiamo la necessità di costruire un canale di comunicazione tra la macchina linux che stiamo usando e la macchina Windows da amministrare. Ciò viene fatto tramite una connessione SSH e per consentire alle macchine di “parlarsi” abbiamo bisogno di configurare il servizio sulla macchina target.
Iniziamo con l’installazione della nuova PowerShell 6.0 scaricando il pacchetto in formato .msi da questa pagina:
https://github.com/PowerShell/PowerShell/releases
Al momento della stesura di questo articolo l’ultima versione è la 6.0.0.12-alfa scaricabile da questo link (per Windows Server 2016):
Terminata l’installazione apriamo la PowerShell 6 dal nuovo link che troviamo nel menu start e prepariamo il sistema per accettare connessioni remote configurando il servizio WinRM (Windows Remote Management). Questo servizio è installato di default ed impostato per l’avvio automatico da Windows 2008 in poi, ma necessita di una rapidissima configurazione per accettare le connessioni remote. Per configurare il servizio con i parametri di default è sufficiente eseguire dal prompt dei comandi:
winrm quickconfig
e confermare le modifiche quando richiesto
Per ulteriori informazioni su WinRM si può fare riferimento all’articolo https://msdn.microsoft.com/en-us/library/aa384372(v=vs.85).aspx
Abbiamo poi bisogno di registrare la nuova Powershell su WinRM; questa operazione viene fatta lanciando uno script presente nella cartella di installazione della shell stessa, che di default risulta essere
C:\Program Files\PowerShell\6.0.0.12
Eseguiamo quindi lo script con:
cd "C:\Program Files\PowerShell\6.0.0.12"
.\Install-PowerShellRemoting.ps1
Prendiamo nota della cartella di installazione di PowerShell 6 perché ci sarà utile in seguito.
A questo punto torniamo alla costruzione del nostro “canale di comunicazione” tra Windows e Linux, che consiste nell’installazione sui due sistemi del servizio OpenSSH. Quasi tutte le distribuzioni Linux hanno questo servizio installato di default, passiamo quindi all’installazione lato Windows. Seguendo questa mini guida saranno necessari solo pochi minuti per raggiungere il nostro checkpoint:
1 – Scaricare l’ultima build di OpenSSH server da qui
https://github.com/PowerShell/Win32-OpenSSH/releases/latest/
2 – Estrarre il file scaricato nella directory c:\Program Files\OpenSSH
3 – Installare il servizio OpenSSH eseguendo da PowerShell i seguenti comandi:
cd "c:\Program Files\OpenSSH"
powershell -executionpolicy bypass -file install-sshd.ps1
4 – Generare le chiavi relative all’host per avviare il servizio OpenSSH eseguendo
.\ssh-keygen.exe -A
5 – Configurare Windows Firewall per consentire l’accesso sulla porta 22
New-NetFirewallRule -Protocol TCP -LocalPort 22 -Direction Inbound -Action Allow -DisplayName SSH
6 – Modificare il file sshd_config all’interno della cartella OpenSSH per consentire l’accesso tramite password e definire il sottosistema powershell. Le modifiche da effettuare sono:
Decommentare: PasswordAuthentication yes
Nella sezione Subsystem aggiungere le riga (utilizzando il percorso di powershell.exe annotato in precedenza):
Subsystem powershell C:\Program Files\PowerShell\6.0.0.12\powershell.exe -sshs -NoLogo -NoProfile
7 – Avviare i servizi
Start-Service sshd
Start-Service ssh-agent
8 – Per impostare l’avvio automatico del servizio OpenSSH eseguire:
Set-Service ssh-agent -StartupType Automatic
Set-Service sshd -StartupType Automatic
NB – SUCCESSIVA DISINSTALLAZIONE
Se state eseguendo l’installazione solo per testare le funzionalità alla fine dei test sarà possibile disinstallare il servizio OpenSSH con i seguenti comandi (con PowerShell dalla cartella c:\program files\openssh):
Stop-Service sshd
powershell.exe -executionpolicy bypass -file uninstall-sshd.ps1
Sulla macchina linux invece sarà necessario solo effettuare un paio di modifiche al file /etc/ssh/sshd_config
A seconda delle distribuzioni il percorso del file sshd_config potrebbe cambiare. Per editare il file utilizziamo un qualsiasi editor di testo, ad esempio
nano /etc/ssh/sshd_config
decommentiamo: PasswordAuthentication yes
ed aggiungiamo nella sezione “# override default of no subsystems”
Subsystem powershell powershell -sshs -NoLogo -NoProfile
Salviamo le modifiche e riavviamo il servizio ssh con il comando (sulla distribuzione Centos)
service sshd restart
A questo punto siamo pronti per stabilire una connessione PowerShell dalla nostra Linux box al server Windows, utilizzando il cmd-let di PowerShell
Enter-PSSession
Apriamo quindi la PowerShell con il comando
powershell
ed avviamo una sessione remota tramite
Enter-PSSession -HostName [NomeHost] -UserName [NomeUtente]
La macchina target è ora pronta per ricevere i nostri comandi.
Eseguiamo anche qui il comando Get-Module -ListAvailable
per vedere i moduli utilizzabili (questa volta da PowerShell 6 su Windows)
Il team di sviluppo ha in progetto l’implementazione di altri moduli in un futuro più o meno prossimo, sarà sicuramente interessante poter gestire ruoli e funzionalità oppure accedere al database Active Directory. Nel frattempo prendiamo confidenza con i comandi disponibili e non dimentichiamo di seguire tutti gli sviluppi direttamente sulla pagina del progetto: