Windows, PowerShell e certificati

Una delle cose che più mi affascina nel sistema Windows è la forte integrazione presente tra vari elementi. E questa una particolarità che lo rende più adatto di altri in molti scenari aziendali. E per sistema Windows intendo sia i sistemi desktop che i server che altro. Fulcro principale di questa integrazione è sicuramente Active Directory, un contenitore gerarchico che si occupa di gestire le informazioni relative alla maggior parte degli elementi come utenti, computer, certificati, stampanti, applicazioni e altro.

Uno di questi elementi, fornito con il server Windows, sono i Certification Services. La mia esperienza nelle aziende mi induce a pensare che siano inspiegabilmente poco conosciuti e quindi poco installati. Questi servizi, integrati con Active Directory, forniscono a Windows una completa struttura di Certification Authority (CA) per la gestione dei certificati digitali standard che permette operazioni come la richiesta, la revoca e la distribuzione di questi elementi oggi fondamentali. Alcune di queste operazioni su alcuni tipi di certificati sono automatiche e trasparenti per l’utilizzatore. I certificati sono assolutamente standard tanto è vero che noi li utilizziamo anche nei nostri server Domino, Apache e WebSphere.

Oltre ad autentificazione e crittografia una delle funzionalità fornite da una struttura di certificati è la firma digitale del codice. Questo è molto importante per aumentare il livello di sicurezza del codice che viene eseguito nella rete. Ad esempio io li utilizzo anche per firmare gli script PowerShell.

In pratica un mio PC dove sviluppo il codice ha un livello relativamente blando di sicurezza (RemoteSigned) ma i server, invece, richiedono codice firmato. Quindi io scrivo uno script sul PC e, una volta testato, lo copio nel server e lo firmo per autorizzarne l’esecuzione. L’utilizzo del certificato rilasciato dalla CA integrata fa sì che la firma sia conosciuta da tutti i computer del dominio. Questo dovrebbe impedire l’esecuzione di script malevoli scritti da persone che non possono firmare digitalmente lo script utilizzando la CA o dovrebbe contribuire all’individuazione dell’autore.

Per attivare questi meccanismi (che peraltro possono essere usati per la firma di altro tipo di codice) ho utilizzato i Certification Services (installati come una CA di livello Enterprise). In questo modo ho una CA “autocertificata” che certifica tutti i certificati rilasciati (e questo mi permette di utilizzare certificati dove voglio all’interno della mia rete) e che sono riconosciuti dalle macchine, dagli utenti e dai software che fanno parte del dominio. Fatto questo ho abilitato il template per il Code Signing usando la console sul server. Sul PC dove voglio firmare lo script richiedo il certificato usando l’apposito plugin per MMC (digitando certmgr.msc si lancia una console con il plugin già caricato per i certificati personali).

image

A questo punto è possibile firmare il codice. Il resto è storia e ben descritto nell’help della PowerShell (digitate help about_signing). Comunque per farla breve ho dovuto impostare il livello di esecuzione del codice nella shell:

Set-ExecutionPolicy AllSigned

In seguito ho firmato lo script:

$cert = @(dir cert:\\CurrentUser\\My -codesigning)[0]
Set-AuthenticodeSignature .\\mioscript.ps1 $cert

In questo modo ho potuto eseguirlo:

mioscript

Cosa succede se non firmo lo script? PowerShell si rifiuta di eseguirlo. Cosa succede se lo script è firmato con un certificato non noto (cioè un autocertificato o un certificato non facenti parte della stessa catena di autorizzazione)? Il sistema si rifiuta di eseguirlo.

Una nota sulla istruzione dir usata nel codice di cui sopra: utilizza l’accesso ai certificati attraverso un provider per gli store dei certificati.

2 comments

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: