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):

https://github.com/PowerShell/PowerShell/releases/download/v6.0.0-alpha.12/PowerShell_6.0.0.12-alpha.12-win10-x64.msi

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:

https://github.com/powershell