Archivi categoria: Guide

Gestione backup GLPI v9.1.4 in ambiente Windows

GLPI (Gestion Libre de Parc Informatique) è un progetto Open Source gratuito distribuito sotto licenza GPL che consente l’IT Asset Management, l’issue tracking system, fornisce una soluzione di service desk solution e consente la gestione di tasks amministrativi e finanziari. Dal momento che il servizio di l’IT Asset Management e/o di issue tracking system, quando implementate all’interno di un’infrastruttura informatica, assumono un’importanza rilevate ai fini della gestione occorre pianificare un’adeguata politica di backup.

Di seguito verrà analizzato come gestire il backup di GLPI 9.1.4 installato in IIS con PHP 7.1.1 su MariaDB 10.2.7 in ambiente Windows Server 2012 R2, inoltre si ipotizzerà che i file di GLPI siano memorizzati in S:\GLPI e che il database sia stato creato col nome glpi.

Funzionalità di backup in GLPI

GLPI offre nativamente la possibilità di eseguire il backup del database tramite il menu Amministrazione – Manutenzione

Tale backup permette di creare un dump sql o XML del contenuto del database, ma come riportato nella pagina WIKI Data/Backup del progetto GLPI al momento non è possibile automatizzare tale operazione, che può quinti tornare utile per backup estemporanei da eseguire prima di operazioni per cui è consigliabile avere una copia di sicurezza del database.

I backup eseguiti tramite l’interfaccia web di GLPI vengono conservati nella subdirectory files\_dumps della cartella d’installazione, è possibile copiarli e incollarli per esempio per gestire il restore su un server differente ad esempio per creare ambienti di test.

Backup del database di GLPI tramite script

Dal momento che come visto precedentemente il backup nativo di GLPI non offre la possibilità di essere eseguito in base ad una schedulazione, per una gestione automatizzata del processo di backup occorrerà creare degli appositi script da eseguire in base ad un’opportuna pianificazione. Di seguito si analizzerà come creare uno script per il backup del database di GLPI ipotizzando che, come detto precedentemente, quest’ultimo sia esposto dal DBMS MariaDB 10.2.7.

In MariaDB 10.2.7 è stato introdotto il tool di backup mariabackup in versione Beta basato su Percona XtraBackup 2.3.8, a riguardo si vedano About MariaDB Backup e MariaDB Backup released with MariaDB Server 10.1.23. Tramite mariabackup è possibile gestire tramite script le operazioni di backup del DBMS MariaDB, di seguito uno script Powershell per il backup gestito dell’intero DBMS MariaDB con possibilità di gestione del numero minimo di backup da mantenere, lo script prevede l’utilizzo dei parametri per poter essere gestito nell’ambito di un’automazione del backup del server GLPI che prevede più step.

Param(
[string]$MariaBackupFile,
[string]$BackupRoot,
[string]$MariaDBHost,
[string]$User,
[string]$Password,
[uint32]$BackupsRetained
)

Set-strictmode -version latest

# Impostazioni di Test
#$MariaBackupFile= $env:ProgramFiles + “\MariaDB 10.2\bin\mariabackup.exe”
#$BackupRoot=”Z:\Backup-MariaDB”
#$MariaDBHost=”.”
#$User=”root”
#$Password=”P@assW0rd!”
#$BackupsRetained = 10

# Inizializzazione Backup
$BackupPath=$BackupRoot + “\” + (Get-Date -format yyyy-MM-dd)
If (Test-Path $BackupPath) {Remove-Item $BackupPath -Force -Recurse}
New-Item -ItemType Directory -Force -Path $BackupPath

# Avvio backup MariaDB
$TargetArg = “–target-dir=” + $BackupPath
$MariaDBHostArg = “–host=” + $MariaDBHost
$UserArg = “–user=” + $User
$PasswordArg = “–password=” + $password

Start-Process -NoNewWindow -Wait -FilePath $MariaBackupFile -ArgumentList “–backup”, $TargetArg, $MariaDBHostArg, $UserArg, $PasswordArg

# Eliminazione backup obsoleti
$BackupDirectories = (Get-ChildItem -Directory $BackupRoot | Sort FullName)
$BackupsCount = ($BackupDirectories | Measure-Object).Count

If ($BackupsCount -gt $BackupsRetained){
For ($i = 1; $i -le $BackupsCount – $BackupsRetained; $i++) {
Remove-Item $BackupDirectories[$i-1].FullName -Force –Recurse
}
}

Lo script è disponibile nel repository GitHub ermannog/PowerShell/Backup-GLPI col nome Backup-MariaDB.ps1.

In alternativa è anche possibile ovviamente eseguire solo il backup del database di GLPI, di seguito uno script Powershell per il backup gestito del singolo database di GLPI con possibilità di gestione del numero minimo di backup da mantenere, lo script prevede l’utilizzo dei parametri per poter essere gestito nell’ambito di un’automazione del backup del server GLPI che prevede più step.

Param(
[string]$MariaBackupFile,
[string]$BackupRoot,
[string]$MariaDBHost,
[string]$GLPIDatabaseName,
[string]$User,
[string]$Password,
[uint32]$BackupsRetained
)

Set-strictmode -version latest

# Impostazioni di Test
#$MariaBackupFile= $env:ProgramFiles + “\MariaDB 10.2\bin\mariabackup.exe”
#$BackupRoot=”Z:\Backup-MariaDB”
#$GLPIDatabaseName=”glpi”
#$User=”root”
#$Password=”P@assW0rd!”
#$BackupsRetained = 10

# Inizializzazione Backup
$BackupPath=$BackupRoot + “\” + (Get-Date -format yyyy-MM-dd)
If (Test-Path $BackupPath) {Remove-Item $BackupPath -Force -Recurse}
New-Item -ItemType Directory -Force -Path $BackupPath

# Avvio backup Database GLPI
$TargetArg = “–target-dir=” + $BackupPath
$MariaDBHostArg = “–host=” + $MariaDBHost
$GLPIDatabaseNameArg = “–databases=” + $GLPIDatabaseName
$UserArg = “–user=” + $User
$PasswordArg = “–password=” + $password

Start-Process -NoNewWindow -Wait -FilePath $MariaBackupFile -ArgumentList “–backup”, $TargetArg, $MariaDBHostArg, $GLPIDatabaseNameArg, $UserArg, $PasswordArg

# Eliminazione backup obsoleti
$BackupDirectories = (Get-ChildItem -Directory $BackupRoot | Sort FullName)
$BackupsCount = ($BackupDirectories | Measure-Object).Count

If ($BackupsCount -gt $BackupsRetained){
For ($i = 1; $i -le $BackupsCount – $BackupsRetained; $i++) {
Remove-Item $BackupDirectories[$i-1].FullName -Force –Recurse
}
}

Lo script è disponibile nel repository GitHub ermannog/PowerShell/Backup-GLPI col nome Backup-DB-GLPI.ps1.

Backup dell’applicazione web GLPI tramite script

Dopo aver eseguito il backup del database di GLPI occorre anche eseguire il backup dell’applicazione web, di seguito uno script Powershell per il backup gestito dell’applicazione GLPI con possibilità di gestione del numero minimo di backup da mantenere, lo script prevede l’utilizzo dei parametri per poter essere gestito nell’ambito di un’automazione del backup del server GLPI che prevede più step.

Param(
[string]$BackupRoot,
[string]$WebApplicationPath,
[string]$WebSiteName,
[uint32]$BackupsRetained
)

Set-strictmode -version latest

# Impostazioni di Test
#$BackupRoot=”Z:\Backup-WebApplication-GLPI”
#$GLPIWebApplicationPath=”C:\inetpub\wwwroot\glpi”

#$WebSiteName=”Default Web Site”
#$BackupsRetained = 10

# Inizializzazione Backup
$BackupPath=$BackupRoot + “\” + (Get-Date -format yyyy-MM-dd)
If (Test-Path $BackupPath) {Remove-Item $BackupPath -Force -Recurse}
New-Item -ItemType Directory -Force -Path $BackupPath

# Arresto Web Site
Stop-WebSite $WebSiteName

# Avvio Backup Web Application GLPI
Copy-Item -Path $WebApplicationPath -Destination $BackupPath –Recurse

# Avvio Web Site
Start-WebSite $WebSiteName

# Eliminazione backup obsoleti
$BackupDirectories = (Get-ChildItem -Directory $BackupRoot | Sort FullName)
$BackupsCount = ($BackupDirectories | Measure-Object).Count

If ($BackupsCount -gt $BackupsRetained){
For ($i = 1; $i -le $BackupsCount – $BackupsRetained; $i++) {
Remove-Item $BackupDirectories[$i-1].FullName -Force –Recurse
}
}

Lo script è disponibile nel repository GitHub ermannog/PowerShell/Backup-GLPI col nome Backup-WebApplication-GLPI.ps1.

Backup del sistema del server GLPI

Oltre al backup del database e dell’applicazione web di GLPI è consigliabile eseguire un backup dell’intero sistema per gestire anche eventuali disaster recovery. Per gestire tali scenari di ripristino è ovviamente consigliabile che il server GLPI sia una macchina virtuale in modo da poter gestire il backup del sistema con vari approcci.

Un primo modo di eseguire il backup dell’intero sistema è quello di utilizzare Windows Backup dedicandogli ad esempio un disco virtuale. Nel la macchina virtuale del server GLPI sia in esecuzione in Hyper-V conviene connettere il disco virtuale su un controller virtuale SCSI in quanto permette di gestire tramite script la connessione e la disconnessione del VHD a caldo per copiare lo stesso su un server di backup.

In alternativa è possibile eseguire il backup dall’Hypervisor e nel caso che quest’ultimo sia Hyper-V tramite Windows Backup o altri software di backup come ad esempio System Center 2016 Data Protection Manager, Veeam Backup & Replication.

Conclusioni

La gestione del backup di GLPI in ambiente Windows non risulta eccessivamente complessa e può essere automatizzata tramite scripts PowerShell, per un recupero dei dati più semplice conviene eseguire il backup con vari livelli di granularità per consentire il ripristino di dati in tabelle, database, applicazione o intero sistema.

Come crittografare una VM su Azure utilizzando Key Vault e lo standard BitLocker

Microsoft Azure mette a disposizione nuovi strumenti per la sicurezza dei nostri dati. Utilizzando pochi comandi PowerShell e concetti base su Key Vault in questo articolo vedremo come crittografare il disco di una VM con lo standard BitLocker.

Prerequisiti:

  • Azure PowerShell
  • Configurazione di un Key Vault

Per soddisfare i prerequisiti potete consultare il precedente articolo https://www.ictpower.it/guide/configurare-microsoft-azure-keyvault.htm

Configurare la VM

Creiamo una nuova VM associata al resource group NewResourceGroup, che avevamo creato nel precedente articolo, utilizzando Resource Manager come modello di deployment.

Figura 1: Scelta del deployment model

Figura 2: parametri per la creazione della nuova VM

Assicuriamoci che tutte le configurazioni siano relative al resource group corretto, cioè quello dentro il quale abbiamo abilitato Key Vault.

Al termine della creazione della VM, cliccando su Disks è possibile constatare che il disco non è crittografato.

Figura 3: Verifica che il disco creato non è crittografato

Scarichiamo dal repository GitHub ufficiale di Azure lo script denominato Azure Disk Encryption Prerequisite Setup, che si occuperà di soddisfare i prerequisiti necessari.

Utilizzando PowerShell ISE, configuriamo il contesto nel quale lo script verrà eseguito con i comandi:

Login-AzureRmAccount

Set-AzureRmContext -SubscriptionId <SubscriptionID>

Eseguiamo lo script:

Figura 4: Esecuzione dello script che verifica i prerequisiti per Azure Disk Encryption

Durante l’esecuzione, lo script chiederà alcune informazioni:

  • Il resource group da utilizzare
  • Il nome di una chiave; se non presente sarà creata automaticamente
  • L’area geografica
  • Il nome di un’applicazione: questa verrà usata per scrivere il segreto nel Key Vault; se non presente, verrà anch’essa creata automaticamente.

Figura 5: Inserimento dei parametri nello script di verifica

Crittografare la VM

Per crittografare la VM è necessario alcuni comandi PowerShell. Dichiariamo qual è il resource group da utilizzare e il nome della VM interessata utilizzando i comandi:

$resourceGroupName ‘NewResourceGroup’

$vmName ‘VMtestKV’

Dopo aver configurato il contesto corretto, possiamo utilizzare il seguente comando per eseguire l’azione di crittografia:

Set-AzureRmVMDiskEncryptionExtension -ResourceGroupName $resourceGroupName -VMName $vmName -AadClientID $aadClientID -AadClientSecret $aadClientSecret -DiskEncryptionKeyVaultUrl $diskEncryptionKeyVaultUrl -DiskEncryptionKeyVaultId $keyVaultResourceId -VolumeType All

Confermiamo per concludere l’operazione:

Figura 6: richiesta di conferma prima dell’abilitazione della crittografia del disco

Al termine dell’esecuzione, lo script ritorna il seguente output:

Figura 7: Crittografia del disco completata

Verificando nuovamente nei dettagli della macchina potremo constatare che l’operazione è avvenuta correttamente.

Figura 8: Il disco della VM risulta crittografato

Conclusioni

Azure fornisce diverse soluzioni in ambito crittografico e quella descritta in questo articolo è particolarmente utile soprattutto se il monitoraggio delle macchine viene effettuato tramite Azure Security Center. Inoltre, con pochi click è possibile applicare la stessa procedura agli storage account in merito a files e blob, rispettando lo standard BitLocker e aumentando la sicurezza delle nostre infrastrutture su cloud.

Configurazione autenticazione Windows in GLPI v9.1.4

GLPI (Gestion Libre de Parc Informatique) è un progetto Open Source gratuito distribuito sotto licenza GPL che consente l’IT Asset Management, l’issue tracking system, fornisce una soluzione di service desk solution e consente la gestione di tasks amministrativi e finanziari. Tali attività normalmente vengono assegnate a persone differenti e nel caso in cui in cui GLPI venga utilizzato in un’infrastruttura basata su Active Directory diventa comodo integrare l’autenticazione Windows con l’autenticazione GLPI sfruttando LDAP (Lightweight Directory Access Protocol).

Di seguito verranno descritti i passi per configurare l’autenticazione basata su LDAP in GLPI 9.1.4 installato in IIS con PHP 7.1.1 in ambiente Windows Server 2012 R2.

Configurazione di IIS e PHP per il supporto dell’autenticazione Windows

Perché IIS possa gestire l’autenticazione Windows utilizzando gli utenti Active Directory il server che ospita IIS dovrà essere membro del dominio come indicato nella KB258063 Internet Explorer May Prompt You for a Password:

Windows Integrated authentication, also known as Windows NT Challenge/Response, must be enabled in the Web site properties in IIS. Anonymous authentication is attempted first, followed by Windows Integrated authentication, Digest authentication (if applicable), and finally Basic (clear text) authentication.

Both the client and the Web server must be either in the same Microsoft Windows NT-based or Microsoft Windows 2000-based domain or in trusted Windows NT-based or Windows 2000-based domains in which the user’s account can be granted permissions to resources on the IIS-based computer.

Inoltre sul server che ospita IIS dovrà essere installata la componete Windows Authentication di IIS:

Per abilitare in PHP l’autenticazione integrata di Windows abilitare l’estensione LDAP modificando il file %ProgramFiles%\PHP\v7.1\php.ini aggiungendo nella sezione [ExtensionList] la seguente impostazione:

extension=php_ldap.dll

Terminata l’editazione del file %ProgramFiles%\PHP\v7.1\php.ini riavviare IIS tramite lnternet Information Services (IIS) Manager (InetMgr.exe) o mediante il seguente comando:

iisreset /restart

Per ulteriori informazioni si veda IIS Configuration Reference – Windows Authentication.

Configurazione di GLPI per l’utilizzo di LDAP

Per default GLPI ha già delle configurazioni per la gestione degli utenti provenienti da una fonte esterna come LDAP, in particolare le opzioni Aggiunge automaticamente utenti da fonte esterna di autenticazione e Aggiungi un utente senza diritti da LDAP consentono di aggiungere automaticamente gli utenti al primo accesso con profilo di sicurezza Self-Service, se si preferisce gestire l’accesso manualmente impostare a No tali opzioni.

La prima operazione da eseguire è configurare GLPI per l’utilizzo di LDAP sul proprio dominio per la ricerca di utenti e gruppi nella Organizational Unit che conterrà gli utenti che dovranno accedere a GLPI, configurando come segue:

Nel campo Server è possibile specificare il dominio che verrà così risolto con gli indirizzi IP dei vari Domain Controller, mentre nel campo Filtro Connessione specificare la query LDAP che consente di ricercare gli utenti non disabilitati:

(&(objectClass=user)(objectCategory=person)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))

Nel campo BaseDN specificare il path LDAP della Organizational Unit che conterrà gli utenti che dovranno accedere a GLPI, mentre nei campi RootDN e Password specificare le credenziali di un utente a minimi privilegi che verrà utilizzato per eseguire le query LDAP su Active Direcory. Infine nel campo Nome utente specificare l’attributo utente che idendifica il logon name ovvero samaccountname (per default GLPI propone uid).

Inoltre configurare la ricerca dei gruppi come segue

Nel campo Tipo ricerca specificare che la ricerca verrà eseguita nei gruppi, mentre nel campo Filtro di ricerca nei gruppi specificare la seguente query LDAP:

(&(objectCategory=group))

Terminata la configurazione delle impostazioni relative alla Directory LDAP eseguire un test di connessione verso Active Directory con l’opzione Test. Per ulteriori informazioni si veda GLPI, LDAP and Active Directory.

Configurare gli utenti Active Directory in GLPI

Per accedere a GLPI tramite gli utenti Active Directory specificando le autorizzazioni necessari occorre prima aggiungerli tramite il Menù Amministrazione – Utenti selezionando l’opzione Collegamento a directory LDAP e quindi l’opzione Importa nuovi utenti:

In alternativa è possibile far sì che GLPI aggiunga automaticamente gli utenti al primo accesso con profilo di sicurezza Self-Service, come visto precedente.

Abilitazione autenticazione Windows in IIS

Di seguito si ipotizzerà che GLPI è stato installato in una Virtual Directory denominata glpi su cui occorrerà disabilitare l’autenticazione anonima e abitare l’autenticazione Windows tramite lnternet Information Services (IIS) Manager (InetMgr.exe)

Per testare che l’autenticazione Windows funziona correttamente e che l’utente viene trasmesso dal browser al server è possibile creare nella Virtual Directory un file php denominato ad esempio TestAuth.php con seguente contenuto:

<?php

echo “REMOTE_USER = ” . $_SERVER [“REMOTE_USER”] . “<BR />”;

echo “HTTP_AUTH_USER = ” . $_SERVER [“HTTP_AUTH_USER”] . “<BR />”;

echo “PHP_AUTH_USER = ” . $_SERVER [“PHP_AUTH_USER”] . “<BR />”;

echo “USERNAME = ” . $_SERVER [“USERNAME”] . “<BR />”;

echo “REDIRECT_REMOTE_USER” . $_SERVER [“REDIRECT_REMOTE_USER”];

?>

Configurazione GLPI per l’autenticazione automatica

Per far sì che l’utente con cui ci si è autenticati sul client venga passato al server su cui è installato GLPI è necessario configurare come segue l’invio dell’autenticazione nella richiesta http mediante il menù Configurazione – Altri metodi di autenticazione:

In Campo per la registrazione dell’accesso nella richiesta HTTP impostare REMOTE_USER. Dopo aver eseguito tali impostazioni gli utenti a cui è stato consenti l’accesso a GLPI in modo manuale o automatico avranno accesso senza più dover inserire le credenziali, in ogni caso sarà ancora possibile accedere alla pagina di login mediante il seguente url:

http://hostname.domain.ext/glpi/index.php?noAUTO=1

Per maggiori informazioni si veda Automatic authentication

Conclusioni

La gestione dell’autenticazione integrata di Windows in GLPI prevede la configurazione della stessa nei vari componenti quindi in IIS, PHP e GLPI, ma consente un’interessante integrazione con l’infrastruttura Active Directory. Nel caso in cui si riscontrino malfunzionamenti nell’accesso a GLPI mediante l’autenticazione integrata di Windows si provi a chiudere tutte le sessioni dei browser e quindi a tentare nuovamente l’accesso, inoltre per identificare eventuali problemi si provi ad esaminare il file \files\_log\php-errors.log.

Creare una connessione Site-to-Site in Microsoft Azure

Microsoft Azure è la soluzione di cloud pubblico che permette di poter eseguire facilmente gran parte dei workload aziendali utilizzando le risorse hardware messe a disposizione online. Io sono dell’idea che un cloud ibrido, in cui alcuni workload sono online ed altri sono on-premises possa essere la soluzione più interessante per le aziende italiane.

In questo articolo voglio mostrarvi come connettere la rete aziendale on-premises con la rete virtuale di Azure (VNET), in modo tale che il cloud sia una naturale estensione della nostra infrastruttura. Per poterlo fare verrà creato un tunnel VPN IPsec/IKE (IKEv1 o IKEv2) tra due dispositivi: il primo dispositivo si troverà nella nostra infrastruttura (Local Network Gateway) e sarà raggiungibile dal cloud tramite un secondo dispositivo creato su Azure (Virtual Network Gateway).

Prerequisiti

Per poter realizzare una connessione Site-to-Site tra la vostra sede aziendale e Microsoft Azure è necessario che vengano rispettati alcuni prerequisiti:

  • Avere a disposizione in azienda un dispositivo VPN compatibile
  • Un indirizzo IP IPv4 pubblico esterno per il dispositivo VPN. L’indirizzo IP non può trovarsi dietro NAT

Figura 1: Schema di funzionamento di una connessione Site-to-Site

Configurazione della connessione

Per prima cosa è necessario avere una Virtual Network (VNET) all’interno della propria sottoscrizione Azure. Alla VNET verranno collegate tutte le macchine virtuali e i servizi che volete ospitare nel cloud. Scegliete di creare una nuova Virtual Network e indicate i parametri relativi al nome della rete, allo spazio di indirizzi da utilizzare e alle sottoreti ed ovviamente alla Regione di Azure dove volete crearla, come mostrato in figura:

Figura 2: Creazione della VNET

Figura 3: VNET creata – Visualizzazione Subnet

Una volta che è stata creata la VNET sarà necessario creare una subnet per il Gateway. In genere è sufficiente utilizzare una sottorete /27 o /28. Per poterlo fare vi basterà selezionare la VNET creata e scegliere il comando per aggiungere la Gateway Subnet. Il Nome per la subnet verrà compilato automaticamente con il valore ‘GatewaySubnet’. Questo valore è obbligatorio per consentire ad Azure di riconoscere la subnet come GatewaySubnet, quindi non modificatelo.

Figura 4: Aggiunta della Gateway Subnet

A questo punto siete pronti per la creazione del Gateway, che farà da Endpoint per la connessione VPN. Si tratta di due macchine virtuali messe in alta disponibilità e create da Microsoft che assicureranno la connessione con il dispositivo VPN che avere in casa.

Cliccate su Nuovo (+) à Networking à Virtual Network Gateway ed inserite i dati richiesti: nome, tipo di Gateway, SKU, Virtual Network a cui associarlo e indirizzo IP pubblico, come mostrato in figura:

Figura 5: Creazione del Virtual Network Gateway

Quando si crea il Virtual Network Gateway è necessario specificare un tipo di VPN. Il tipo di VPN scelto dipende dal tipo di connessione che si desidera creare. Ad esempio, una connessione Point-to-Site (P2S) richiede obbligatoriamente un tipo di VPN RouteBased. Dopo avere creato un gateway non è possibile modificare il tipo di VPN. È necessario eliminare il gateway e ricrearne uno nuovo. Lo SKU del Gateway VPN stabilisce il numero massimo di connessioni e la velocità effettiva aggregata. Attualmente sono disponibili le seguenti configurazioni:

SKU

Tunnel S2S/
rete virtuale-rete virtuale

Connessioni
P2S

Velocità effettiva
aggregata

VpnGw1

Max. 30

Max. 128

500 Mbps

VpnGw2

Max. 30

Max. 128

1 Gbps

VpnGw3

Max. 30

Max. 128

1,25 Gbps

Basic

Max. 10

Max. 128

100 Mbps

Per maggiori informazioni potete visitare la pagina https://docs.microsoft.com/it-it/azure/vpn-gateway/vpn-gateway-about-vpn-gateway-settings#gwsku

La creazione del gateway può richiedere fino a 45 minuti. Nell’attesa potete procedere alla creazione del Local Network Gateway, che rappresenta il dispositivo VPN che avete in azienda e che volete usare per la connessione Site-to-Site. Per crearlo è sufficiente cliccare su Nuovo (+) à Networking à Local network gateway e compilare i campi indicando la rete (o le reti) presente in azienda e l’indirizzo IP pubblico del dispositivo VPN aziendale, come mostrato in figura:

Figura 6: Creazione del Local Network Gateway

Dopo aver atteso il completamento della creazione del Virtual Network Gateway, siamo pronti per creare la connessione Site-to-Site. Selezionate il Gateway e nel tab Settings cliccate su Connections, come mostrato in figura:

Figura 7: Scheda Connections del gateway VPN appena creato

Cliccando su Add avrete la possibilità di scegliere il Tipo di connessione, il Local Network Gateway e la Pre-Shared Key (PSK) necessaria a configurare la connessione IPSEC/IKE, come mostrato in figura:

Figura 8: Configurazione della connessione Site-To-Site

A questo punto il Gateway avrà lo Status Connecting fino a quando non avrete configurato il dispositivo in azienda.

Figura 9: Creazione VPN Site-to-Site completata

Configurazione del dispositivo VPN aziendale

Maggiori informazioni su come configurare i dispositivi VPN e sui parametri IPsec/IKE per le connessioni del Gateway VPN possono essere visualizzate alla pagina https://docs.microsoft.com/it-it/azure/vpn-gateway/vpn-gateway-about-vpn-devices . Microsoft ha predisposto un elenco dei dispositivi VPN dei maggiori vendor con relativa configurazione.

Personalmente nei miei laboratori utilizzo come endpoint Microsoft RRAS installato su Windows Server 2012 R2. È possibile configurarlo manualmente per la connessione IKEv2 oppure potete trovare uno script di configurazione al link https://github.com/Azure/Azure-vpn-config-samples/tree/master/Microsoft

Conclusioni

La connessione VPN Site-to-Site ci permette di poterci collegare alle VNET create in Microsoft Azure ed utilizzare il cloud come estensione delle nostre reti aziendali, dandoci di fatto l’opportunità di accedere alle notevoli risorse di calcolo offerte, come se fossero disponibili in azienda.

Configurare un site-aware failover cluster e la node fairness in Windows Server 2016

Il Site-Aware failover è una novità relativa alla funzionalità di Failover Clustering che è stata introdotta in Windows Server 2016. Anche se in realtà già in Windows Server 2012 R2 era possibile realizzare un cluster i cui nodi erano funzionanti in due regioni geografiche diverse, non c’era modo per indicare in quale di queste regioni si trovassero i diversi nodi, in modo tale da poterli gestire in maniera diversa e poter indicare ai diversi servizi di poter fare “failover” nella stessa area geografica.

Con Windows Server 2016 è stata invece introdotta la possibilità di raggruppare i nodi in base alla loro posizione fisica in modo tale da poter, ad esempio, permettere alle risorse del cluster di poter essere trasferite su un nodo nello stesso sito in caso di manutenzione o draining di un altro nodo.

Per poter implementare la site awareness è possibile procedere in due modi, uno automatico ed uno manuale.

Se si utilizza il modo automatico è possibile utilizzare i Site di Active Directory. Quindi se avete già definito dei Site dentro i quali avete messo i vostri Domain Controller e a cui avete associato delle subnet, vi basterà digitare il comando PowerShell (lanciato con privilegi elevati):

(Get-Cluster).AutoAssignNodeSite 1

Se volete utilizzare la modalità manuale sarà invece prima necessario definire quali sono i Site e successivamente aggiungervi i nodi, utilizzando i comandi PowerShell (lanciati con privilegi elevati):

#Creazione dei Site

New-ClusterFaultDomain –Name Roma –Type Site –Description “Datacenter Primario” –Location “Datacenter Roma”

New-ClusterFaultDomain –Name Milano –Type Site –Description “Datacenter Secondario” –Location “Datacenter Milano”

#Assegnazione dei nodi ai Site

Set-ClusterFaultDomain –Name Nodo1 –Parent Roma

Set-ClusterFaultDomain –Name Nodo2 –Parent Roma

Set-ClusterFaultDomain –Name Nodo3 –Parent Milano

Set-ClusterFaultDomain –Name Nodo4 –Parent Milano

Questo tipo di configurazione permette di migliorare notevolmente il failover, il placement delle macchine virtuali, gli heartbeat tra i nodi e il quorum.

Ad esempio la Failover Affinity permette che le risorse vengano spostate su un nodo dello stesso sito, prima di tentare di spostarle in un sito differente. Inoltre durante la Node Drain le macchine virtuali vengano spostate localmente, su un nodo vicino.

Il Cross-Site Heartbeat da’ la possibilità di configurare in maniera accurata alcuni parametri come ad esempio il CrossSiteDelay (il tempo tra due heartbeat inviati tra nodi in siti diversi) e il CrossSiteThreshold (il numero di heartbeat persi tra due nodi in site diversi). Entrambi i valori sono configurabili con i comandi PowerShell (lanciati con privilegi elevati)

(Get-Cluster).CrossSiteDelay 1000    #valore di default

(Get-Cluster).CrossSiteThreshold 20  #valore di default

Un’altra interessante novità di Windows Server 2016 riguarda la Virtual Machine Node Fairness, che è già abilitata di default ma che viene disabilitata se utilizzate la funzionalità Dynamic Optimization di System Center Virtual Machine Manager. La VM Node Fairness permette di bilanciare le macchine virtuali tra i diversi nodi del cluster: dopo aver valutato l’utilizzo del processore e della memoria, le macchine vengono automaticamente migrate (utilizzando la Live Migration) da un nodo più carico ad un nodo scarico. Il bilanciamento può essere configurato per ottenere le migliori performance nel cluster, utilizzando il comando PowerShell (eseguito con privilegi elevati) per configurare la percentuale di utilizzo del nodo:

(Get-Cluster).AutoBalancerLevel 2

riprendendo i valori dalla seguente tabella:

AutoBalancerLevel

Aggressiveness

Host load percentage

1 (default)

Low

80%

2

Medium

70%

3

High

60%

Oppure è possibile configurare ogni quanto tempo deve essere utilizzata la node fairness, utilizzando il comando PowerShell (eseguito con privilegi elevati):

(Get-Cluster).AutoBalancerMode 2

riprendendo i valori dalla seguente tabella:

AutoBalancerMode

Behavior

0

Disabled

1

Balance on node join only

2 (default)

Balance on node join and every 30 minutes

Conclusioni

Queste due importanti novità relativa al cluster di Windows Server 2016 sono pensate sia per la gestione del Disaster Recovery geografico tra diversi siti della nostra infrastruttura, sia per l’ottimizzazione delle performance dei nodi, senza dover ricorrere a prodotti a pagamento come SCVMM. Sicuramente un grosso passo in avanti per rendere i nostri datacenter più performanti ed avere lo stesso livello di funzionalità offerte dal Cloud pubblico.

Abilitare la nested virtualization con le nuove Azure VM Dv3 ed Ev3

Sono disponibili solo da un paio di giorni (e non in tutte le Regioni di Azure) le nuove macchine virtuali della Serie Dv3 ed Ev3. Queste macchine virtuali sono le prime ad essere ospitate su host Hyper-V basati su Windows Server 2016 e sono le prime che usano la tecnologia Hyper-Threading.

L’utilizzo dell’Hyper-Threading permetterà di creare macchine virtuali con più core e quindi migliorerà le performance e l’efficienza delle VM. I processori utilizzati sono Intel® Broadwell E5-2673 v4 2.3GHz e Intel® Haswell 2.4 GHz E5-2673 v3.

Grazie all’host Windows Server 2016 è adesso possibile abilitare la Nested Virtualization, che permette di poter eseguire il ruolo di Hyper-V anche in una macchina virtuale e di farci girare macchine virtuali annidate oppure Hyper-V Containers. Per maggiori informazioni su cosa sia la virtualizzazione annidata e come abilitarla in Windows Server 2016 vi rimando alla lettura dell’articolo https://docs.microsoft.com/it-it/virtualization/hyper-v-on-windows/user-guide/nested-virtualization

Alla pagina https://azure.microsoft.com/it-it/blog/introducing-the-new-dv3-and-ev3-vm-sizes/ potrete trovare un elenco dettagliato delle nuove VM disponibili, dei tagli previsti e delle Regioni dove attualmente sono abilitate.

Creazione di una nuova VM di tipo Ev3 su Azure

Per poter sfruttare la Nested Virtualization è necessario creare una macchina virtuale di tipo Dv3 oppure Ev3 in una delle regioni abilitate. Io ho deciso di utilizzare una macchina E4s_v3 e l’ho creata in West Europe, scegliendo come sistema operativo Windows Server 2016.

Figura 1: Creazione della VM in West Europe

Figura 2: Scelta della dimensione della VM

Figura 3: Configurazione dello storage, della rete e dell’IP pubblico della VM

Figura 4: Schermata riassuntiva con le scelte selezionate

Al termine della creazione della VM potete collegarvi in desktop remoto per configurarla. Dal Server Manager aggiungete il ruolo di Hyper-V e vedrete che non riceverete nessun messaggio di errore, come mostrato in figura:

Figura 5: Abilitazione del ruolo Hyper-V nella nested VM in Azure

Abilitazione della Nested Virtualization

Per semplificare l’abilitazione e la creazione di macchine virtuali annidate, potete scaricare uno script in PowerShell realizzato da Charles Ding, ingegnere del gruppo di sviluppo Microsoft Azure, all’indirizzo https://aka.ms/azurenestedvirtualization. Lo script vi permetterà di configurare il ruolo di Hyper-V e tutte le altre caratteristiche necessarie alla creazione della Nested VM.

Eseguite lo script in PowerShell ISE (lanciato con privilegi elevati) e la prima volta lo script provvederà ad installare il ruolo di Hyper-V, come mostrato in figura:

Figura 6: Esecuzione dello script che installa Hyper-V e che crea la VM annidata

L’installazione di Hyper-V richiede un paio di riavvii, quindi verrete disconnessi dal desktop remoto. Dopo qualche minuto, potrete ricollegarvi e rilanciare lo script per creare la VM. Modificate il valore $VMName “NestedVM-Level2” scegliendo il nome che volete assegnare alla vostra Nested VM e rilanciate lo script. Lo script verificherà che i prerequisiti sia tutti rispettati e creerà la macchina virtuale, abilitando tutte le estensioni necessarie alla virtualizzazione annidata, come mostrato in figura:

Figura 7: Lo script ha creato la VM annidata

Dopo aver avviato la VM annidata, nel mio caso chiamata NestedVM-Level2, potete installare il sistema operativo, come mostrato in figura:

Figura 8: Accensione della nested VM e installazione del sistema operativo

Se volete permette alla macchina annidata di navigare, poiché il MAC Address spoofing non è abilitato su Azure per motivi di sicurezza, sarà necessario creare una rete NAT nell’hypervisor (la VM su Azure) e poi assegnare alla Nested VM un indirizzo statico oppure potete usare il DHCP.

Per prima cosa create nella macchina “host” (la VM su Azure) un nuovo internal switch chiamato NAT utilizzando il comando PowerShell (lanciato con privilegi elevati):

#Creazione di uno switch di tipo Internal

New-VMSwitch -SwitchName “NAT” -SwitchType Internal

Con il comando Get-NetAdapter individuate l’indice assegnato alla nuova interfaccia di rete creata

Figura 9: Interfaccia di rete creata dallo switch di tipo Internal

A questo punto potete assegnare alla nuova scheda di rete un indirizzo IP statico (nel mio caso ho scelto 192.168.0.1), che poi verrà utilizzato dalla nested VM come gateway:

#Assegnazione dell’IP alla nuova interfaccia (sarà il gateway della rete)

New-NetIPAddress -IPAddress 192.168.0.1 -PrefixLength 24 -InterfaceIndex 13

Figura 10: Assegnazione dell’IP statico alla nuova interfaccia di rete

Create la rete di NAT utilizzando il comando PowerShell (lanciato con privilegi elevati):

#Creazione della rete di NAT

New-NetNat -Name NATnetwork -InternalIPInterfaceAddressPrefix 192.168.0.0/24

Adesso che avete completato la configurazione della rete potete collegare la Nested VM al virtual switch NAT che avete creato in precedenza, come mostrato in figura:

Figura 11: La nested VM viene collegata al virtual switch chiamato NAT

Potete installare sulla macchina Azure il servizio DHCP e quindi fare in modo che gli indirizzi vengano assegnati automaticamente. In alternativa potete configurare la scheda di rete della Nested VM con un IP statico, come mostrato in figura:

Figura 12: Configurazione dell’IP statico nella Nested VM

Come è possibile vedere dalla figura sotto, adesso la Nested VM è in grado di navigare in Internet.

Figura 13: La nested VM è connessa ad Internet

Conclusioni

La Nested Virtualization su Azure permette di utilizzare la nuova funzionalità di Windows Server 2016 e di eseguire macchine virtuali annidate oppure gli Hyper-V Containers di Docker. Un possibile caso d’uso della virtualizzazione annidata potrebbe essere la configurazione di un laboratorio di Hyper-V in un ambiente virtualizzato e il test di scenari a più computer (come ad esempio un cluster) senza la necessità di avere dei server fisici.

Installazione GLPI v9.1.4 in ambiente Windows

Quando le infrastrutture informatiche assumo dimensioni consistenti o la cui complessità richiede più persone per la gestione comincia a farsi sentire l’esigenza di adottare un software per la gestione del parco informatico e del servizio di helpdesk. Un altro scenario in cui tali tipi di software sono particolarmente utili è quello in cui un fornitore di servizi informatici si trovi a dove gestire più piccole aziende con la necessità di offrire un servizio di helpdesk e anche la gestione del parco macchine e apparecchiature dei propri clienti.

Vari sono i software che propongono soluzioni in tal senso, ma molti di essi affrontano il problema tramite scansione della rete per rilevare in modo automatizzato gli asset informatici presenti, sebbene questo tipo di approccio sia in determinati scenari molto pratico in altri può non essere applicabile o comodo. Infatti in scenari in cui non tutti gli asset possono essere gestiti tramite rilevazione automatica in rete in quanto non raggiungibili o privi di interfaccia di rete o ancora perché è necessario poterli gestire prima che vengano inseriti in rete (si pensi ad esempio ad asset mantenuti in magazzino come ricambi).

Inoltre molto spesso la necessità della gestione del parco informatico parte da specifiche necessità di carattere più amministrativo che tecnico, come la gestione dei rinnovi delle garanzie, la gestione del mazzino, la gestione della posizione fisica degli asset o il computo dell’impatto dell’helpdesk declinato in base alle richieste o per tipologia di asset su cui sono avvenuti gli interventi.

Un prodotto che risponde a queste esigenze è GLPI (Gestion Libre de Parc Informatique), un progetto Open Source gratuito distribuito sotto licenza GPL che consente l’IT Asset Management, l’issue tracking system, fornisce una soluzione di service desk solution e consente la gestione di tasks amministrativi e finanziari, di seguito alcune interessanti caratteristiche:

  • Gestione di Multi-entities (multi-park, multi-structure)
  • Gestione Multiutenza
  • Sistema di autenticazione multipla (locale, LDAP, AD, Pop/Imap, CAS, x509…) e multi servers
  • Multilingual (al momento sono disponibili 45 localizzazioni)
  • Gestione di Permissions e profili

Per l’elenco completo delle caratteristiche si veda FEATURES LIST OF GLPI.

GLPI è un applicazione web-based nata nel 2003 come progetto Community based a cui chiunque può contribuire tramite lo lo sviluppo di moduli su GitHub – GLPI o mediante lo sviluppo di GLPi plugins, il progetto ha subito negli anni varie evoluzioni sino ad arrivare all’attuale versione 9.1.4, di seguito la time line dell’evoluzione del progetto tratto dalla pagina Wikipedia dedicata al progetto.

Prerequisiti d’installazione di GPLI

Come riportato nel seguente Prerequisites for installing GLPI l’applicazione web ha i seguenti prerequisiti software:

  • Un Web Server con supporto PHP (Apache 2 o superiore oppure Microsoft IIS)
  • PHP 5.3 o superiore (si veda il seguente Web Server Prerequisites per le estensioni PHP richieste
  • Database MySQL 4.23, ma è raccomando utilizzare per ragioni di performance la versione 5.5.x, in alternativa è possibile utilizzare il DBMS MariaDB (a riguardo si veda Database server Prerequisites)

Dal momento che come viene riportato in Database server Prerequisites, GLPI utilizza l’engine MyISAM non è possibile al momento utilizzare SQL Server come DBMS in quanto quest’ultimo utilizza un engine derivato da quello di Sybase SQL Server frutto di una partnership tra Microsoft e Sybase del 1987 (per maggiori dettagli sulla storia dell’evoluzione dell’engine di SQL Server si veda SQL MythBusters – “SQL Server is really a Sybase product not a Microsoft one.”).

Scenario d’installazione

Nel seguente articolo GPLI sarà installato su IIS 8.5 in Windows Server 2012 R2 utilizzando Microsoft Web Platform Installer 5.0 per installare la versione PHP 7.1.1 a 64 Bit, mentre per quanto riguarda il DBMS sarà installato MariaDB 10.2.6 a 64 Bit.

La scelta di non utilizzare MySQL ma MariaDB che è uno dei fork del primo, nato il 29 ottobre 2009, e scritto dagli sviluppatori originali di MySQL dipende dal fatto di utilizzare un DBMS totalmente OpenSource dal momento che andrà a supporto di un applicativo Open Source qual è GLPI. MySQL infatti dalla versione 5.5 include estensioni non Open Source disponibili solo nella versione Enterprise, tale evoluzione di MySQL è frutto dell’acquisizione di Sun Microsystems da parte di Oracle avvenuta il 27 gennaio 2010 (per quanto riguarda l’evoluzione di MySQL e la nascita MariaDBa riguardo si vedano le relative pagine su Wikipedia). In conseguenza al fatto che MySQL non è più un DBMS solo Open Source (esistono infatti due versioni quella Open Source denominata MySQL Community Server e quella proprietaria denominata Enterprise Server) ha portato vari progetti Open Source a sostituire MySQL con MariaDB, come ad esempio Wikipedia (a riguardo si veda Wikipedia Adopts MariaDB) e alcune distribuzioni Linux quali ad esempio Fedora e RedHat (a riguardo si veda Oracle who? Fedora & openSUSE will replace MySQL with MariaDB).

Per quanto riguarda i prerequisiti hardware dovranno essere rispettati almeno quelli consigliati per il sistema operativo (a riguardo si veda System Requirements and Installation Information for Windows Server 2012 R2):

  • Processore almeno 1.4 GHz a 64-bit
  • 1024 MB di Ram e nel caso una macchina virtuale in Hyper-V è preferibile utilizzare la memoria statica
  • 32 GB per il volume dedicato al sistema operativo, è preferibile installare GLPI e il relativo database su un volume dedicato

Dal momento che i vari pacchetti d’installazione di PHP e MariaDB sono disponibili solo in lingua Inglese è consigliabile installare anche il sistema operativo in lingua Inglese configurando le impostazioni del formato data e ora per la nazionalità italiana. Al termine dell’installazione aggiornare il sistema installando gli aggiornamenti necessari.

Per la documentazione relativa a GLPI si faccia riferimento al Wiki del progetto, mentre per ulteriori informazioni sui prerequisiti si veda https://github.com/glpi-project/glpi mentre per informazioni sui changelog delle varie versioni si veda https://github.com/glpi-project/glpi/releases

Installazione del ruolo Web Server (IIS)

Installare il ruolo Web Server (IIS) con le impostazioni di default, al termine dell’installazione aggiornare il sistema installando gli eventuali aggiornamenti necessari.

Come indicato nei seguenti non è possibile (fatta esclusione per alcune cartelle) spostare IIS su un volume dedicato in quanto IIS è un componente di sistema:

Installazione PHP

Il modo più pratico per installare PHP è quello di utilizzare il Microsoft Web Platform Installer, attualmente è disponibile la versione 5.0 che va installata prima di poter avviare l’installazione del PHP. Per avviare l’installazione del Microsoft Web Platform Installer occorre prima disabilitare la funzionalità IE Enhanced security Configuration per il gruppo Administrators (terminata l’installazione sarà possibile riabilitare tale funzionalità).

Una volta installato il Microsoft Web Platform Installer sarà possibile installare PHP selezionando PHP 7.1.1 a 64 Bit tra i prodotti del gruppo Frameworks

L’installazione comporterà l’installazione di ulteriori package e features:

Per verificare la funzionalità di PHP è possibile creare un file phpinfo.php in %SystemDrive%\inetpub\wwwroot col seguente contenuto:

<?php phpinfo(); ?>

Aprire poi la pagina http://localhost/phpinfo.php che mostrerà le informazioni di configurazione tra cui il percorso del file ini di configurazione per default in (%ProgramFiles%\PHP\v7.1\php.ini)

Abilitazione dell’estensione PHP FileInfo e verifica delle configurazioni nel php.ini

Modificare il file %ProgramFiles%\PHP\v7.1\php.ini aggiungendo nella sezione [ExtensionList] le seguenti impostazioni:

extension=php_fileinfo.dll

zend_extension=php_opcache.dll

Come indicato nel seguente Web Server Prerequisites verificare che le seguenti variabili nel file %ProgramFiles%\PHP\v7.1\php.ini rispettino le seguenti indicazioni (le impostazioni predefinite dovrebbero essere coerenti a tali indicazioni):

memory_limit = 64M ; // Minimum Value
file_uploads = on ;
max_execution_time = 600 ; // Optional but not mandatory
register_globals = off ; // Optional but not mandatory
magic_quotes_sybase = off ;
session.auto_start = off ;
session.use_trans_sid = 0 ; // Optional but not mandatory

La versione 9.14 di GLPI richiede l’estensione apcu-bc che richiede a sua volta l’estensione APCu che può essere scaricata al seguente https://pecl.php.net/package/APCu, al momento l’ultima versione è la 5.1.8 ed occorre scaricare la release per PHP 7.1 Non Thread Safe (NTS) x64 dal momento che il PHP in IIS è configurato con l’opzione Thread Safety a disabled come suggerito in http://windows.php.net/:

“If you are using PHP as FastCGI with IIS you should use the Non-Thread Safe (NTS) versions of PHP.”

Dopo aver scaricato l’estensione apcu, scompattarla e copiare la libreria php_apcu.dll in %ProgramFiles%\PHP\v7.1\ext e quindi modificare il file %ProgramFiles%\PHP\v7.1\php.ini aggiungendo nella sezione [ExtensionList] la seguente impostazione:

extension=php_apcu.dll

Dopo aver attivato l’estensione APCu è possibile scaricare l’estensione apcu-bc al seguente https://pecl.php.net/package/apcu_bc, al momento l’ultima versione è la 1.0.3 ed occorre scaricare la release per PHP 7.1 Non Thread Safe (NTS) x64 perché come visto precedentemente IIS è configurato con l’opzione Thread Safety a disabled.

Dopo aver scaricato l’estensione apcu-bc scompattarla e copiare la libreria php_apc.dll in %ProgramFiles%\PHP\v7.1\ext e quindi modificare il file %ProgramFiles%\PHP\v7.1\php.ini aggiungendo nella sezione [ExtensionList] la seguente impostazione:

extension=php_apc.dll

Nel caso dopo l’installazione di GLPI si notino malfunzionamenti nella visualizzazione delle pagine è possibile disabilitare le estensioni APCu e apcu-bc commentando l’attivazione delle estensioni nel file php.ini dal momento che è un requisito opzionale

Per ulteriori informazioni sulle estensoni PHP in Windows si veda Installation of extensions on Windows.

Terminata l’editazione del file %ProgramFiles%\PHP\v7.1\php.ini riavviare IIS tramite lnternet Information Services (IIS) Manager (InetMgr.exe) o mediante il seguente comando:

iisreset /restart

Installazione del DBMS MariaDB

Scaricare dal sito http://mariadb.org (la pagina di download è disponibile al seguente https://downloads.mariadb.org/) il package per piattaforma Windows a 64 Bit dell’ultima versione di MariaDB, al momento l’ultima versione stabile è la 10.2.6 (mariadb-10.2.6-winx64.msi), come riportato la versione 10.2 ha oltre alla features di MySQL 5.6 & 5.7 anche nuove funzionalità. Sebbene esista anche un package ZIP (mariadb-10.2.6-winx64.zip) questo è indicato solo per semplici scenari di test, ma è meno preformante dell’installazione come servizio e meno sicuro, a riguardo si veda Installing MariaDB Windows ZIP Packages.

Avviare l’installazione di MariaDB 10.2.26 64 Bit eseguendo il package msi con le seguenti impostazioni (per la documentazione sulla procedura d’installazione si veda Installing MariaDB MSI Packages on Windows).

Accettare l’installazione delle funzionalità di default.

Selezionare Database instance per impostare il path dei file di dati tramite il pulsante Browse, nello scenario di esempio saranno memorizzati in S:\MariaDB 10.2\data.

Impostare la password dell’utente root che dovrà essere utilizzato solo motivi amministrativi

Impostare le proprietà dell’istanza configurandola come servizio come raccomandato e se non è necessario connettersi remotamente al DBMS disabilitare l’opzione di networking (come nel caso dello scenario di esempio in quanto GLPI sarà installato sullo stesso server), in questo caso per la connessione al database sarà utilizzato named pipes. GLPI per ora non utilizza InnoDB a riguardo si vedano Closing ticket time issue #1150 e Change storage engine to innodb #644.

Per informazioni sulle impostazioni si vedano le seguenti note riportate in Installing MariaDB MSI Packages on Windows:

Per modificare successivamente le impostazioni è possibili intervenire successivamente editando il file my.ini memorizzato nella directory d’installazione (nello scenario di esempio S:\MariaDB 10.2\data), per informazioni sulla configurazione tramite file d’impostazioni si vedano:

Per connettersi all’istanza di MariaDB è possibile utilizzare HeidiSQL, installato per default insieme a MariaDB, configurando una connessione localmente tramite named pipe, come nello scenario d’esempio.

Installazione dell’applicazione GLPI

Scaricare l’ultima versione di GLPI dal sito http://glpi-project.org (la pagina di download è disponibile al seguente http://glpi-project.org/spip.php?article41), al momento l’ultima versione è la 9.1.4 (glpi-9.1.4.tgz). Estrarre il package tgz, ad esempio tramite 7Zip, e copiare la cartella glpi in locale, nello scenario di esempio verrà copiata in S:\glpi-9.1.4\glpi. Quindi creare in IIS all’interno del Default Web Site una Virtual Directory che punta alla cartella gpli in modo da mantenere l’applicazione su un volume diverso da quello del sistema operativo.

Aprire il sito http://localhost/glpi per eseguire la prima parte dell’installazione di GLPI che creerà il database.

Selezionare la localizzazione italiana.

Accettare la licenza (GNU General Public License Versione 2).

Selezionare Installa.

Controllare che tutte le verifiche siano eseguite con successo.

Inserire le credenziali per accedere all’istanza locale (.)del DBMS MariaDB tramite named pipe con l’account root per creare il database.

Creare un nuovo database, nello scenario di esempio sarà denominato glpi.

Attendere la creazione del database.

Attendere il termine dell’istallazione.

Terminata l’installazione sarà possibile accedere a GLPI tramite la pagina http://localhost/glpi autenticandosi con l’account di amministrazione di default (username=glpi e password=glpi) per iniziare a configurare l’applicazione.

Per ragioni di sicurezza cancellare il seguente file: install/install.php (nello scenario di esempio S:\glpi\install\install.php) e modificare le password degli utenti predefiniti glpi, post-only, tech e normal.

Creazione di un utente per l’accesso al database di GLPI da parte dell’applicazione

Creare tramite HeidiSQL un utente che verrà poi utilizzato dall’applicazione GLPI per accesso locale con soli i privilegi sul database di GLPI, nello scenario di esempio il database è denominato glpi mentre l’utente sarà denominato UsrGLPI.

Impostare le credenziali dell’utente per l’accesso al database GLPI tramite la seguente procedura:

  • Arrestare IIS tramite Internet Information Services (IIS) Manager o mediante il comando: iisreset /stop
  • Impostare le credenziali dell’utente nel file config\config_db.php (nello scenario di esempio S:\glpi-9.1.4\glpi\config\config_db.php)
  • Avviare IIS tramite Internet Information Services (IIS) Manager o mediante il comando: iisreset /start

Gestione dei Plugin

Come anticipato all’inizio dell’articolo le funzionalità di GLPI possono essere estese tramite plugins sviluppati da volontari che contribuiscono al progetto, per il catalogo dei plugins disponibili si veda la Plugin directory, mentre se si intende cimentarsi nello sviluppo di un plugin è possibile trovare informazioni utili ai seguenti:

Per quanto riguarda l’installazione di un plugin l’operazione è descritta al seguente Plugin installation Procedure in GLPI e consiste nelle seguenti operazioni:

  1. Eseguire un backup del database (tramite il menù Amministrazione\Manutenzione)
  2. Scaricare il plugin dalla directory GLPI plugins verificando che sia compatibili con la versione di GLPI installata
  3. Estrarre il file .tar.gz in una sottocartella col nome del plugin nella directory glpi/plugins dell’applicazione, per estrarre i file .tar.gz è possibile utilizzare ad esempio 7Zip (il nome della cartella del plugin deve rispettare quello presente all’interno del file .tar.gz altrimenti il plugin potrebbe non funzionare correttamente)
  4. Eseguire il Log off ed un successivo Log in
  5. Installare il plugin tramite il menu Configurazione\Plugins selezinando Installa in corrispondenza del plugin
  6. Attivare il plugin selezinando Attiva in corrispondenza del plugin

Alcuni plugin necessitano di modifiche al database, che verranno eseguite al primo avvio dello stesso, oppure possono essere necessarie configurazion, in questo caso vi saranno avvisi nella pagina dell’installazione/attivazione del plugin.

L’aggiornamento di un plugin è sostanzialmente simile all’installazione, ma con le precauzioni necessarie per consentire un eventuale ripristino alla versione precedente, di seguito le operazioni da eseguire:

  1. Eseguire un backup del database (tramite il menù Amministrazione\Manutenzione) o delle tabelle create dal plugin che dovrebbero essere specificate nel file readme nella directori del plugin syessto (glpi/plugins/<pluginName>)
  2. Rinominare la directory del plugin per esempio da glpi/plugins/<pluginName> a glpi/plugins/<pluginName-Versione>
  3. Procedere nuovamente all’installazione del plugin come visto precedentemente

Se si intende invece rimuovere un plugin è possibile procedere come segue:

  1. Eseguire un backup del database (tramite il menù Amministrazione\Manutenzione)
  2. Accedere all’elenco dei plugin installati tramite il menu Configurazione\PluginsS
  3. Selezionare Disinstalla in corrispondenza del plugin da rimuovere

Si noti che ovviamente l’utilizzo dei plugin comporterà il controllo che questi siano supportati anche nelle future release di GLPI quanto verranno rilasciate e si deciderà di installarle.

Conclusioni

Grazie al Microsoft Web Platform Installer 5.0 che permette di installare velocemente applicazioni PHP in Windows l’installazione di GLPI si risolve velocemente. Con Windows Server 2016 e la sua integrazione nativa con i container Docker tale installazione potrà ulteriormente essere semplificata. Su GitHub sono infatti presenti vari progetti con la finalità di realizzare container Docker per GLPI, si veda ad esempio driket/docker-glpi – Deploy GLPI (any version) with Docker.

Configurare Microsoft Azure KeyVault

Azure KeyVault è un sistema di gestione di chiavi crittografiche e relativi segreti adoperati da applicazioni e servizi su Azure.

Con KeyVault è possibile crittografare chiavi di autenticazione, certificati .pfx, password ecc., utilizzando anche HSM.

Questo piccolo articolo è un’introduzione al concetto di sicurezza su Cloud e analizzerà come far comunicare un’applicazione con un’infrastruttura su Azure, attraverso l’utilizzo di una chiave crittografata. Tale configurazione viene effettuata tramite Azure PowerShell.

Per informazioni sui costi: https://azure.microsoft.com/it-it/pricing/details/key-vault/

Per velocizzare le cose utilizzeremo un’applicazione d’esempio che Microsoft mette a disposizione: https://www.microsoft.com/en-us/download/details.aspx?id=45343

Installare Azure PowerShell da PowerShell Gallery

Verifichiamo l’installazione di PowerShellGet:

Get-Module PowerShellGet -list Select-Object Name,Version,Path

Se il risultato è quanto segue, abbiamo già cosa serve:

In caso contrario, installiamo il seguente update:

https://www.microsoft.com/en-us/download/details.aspx?id=51451

Eseguendo PowerShell come amministratore, lanciamo il comando:

Install-Module AzureRM

Nel caso in cui fosse la prima volta che utilizziamo PowerShell Gallery, ci verrà richiesta una conferma prima di installare il modulo.

Confermiamo quindi l’installazione e, una volta terminata, importiamo i nuovi moduli con il comando:

Import-Module AzureRM

A questo punto siamo pronti per iniziare!

Configurare il KeyVault

Il primo passo consiste nell’effettuare il login alla propria sottoscrizione su Azure:

Login-AzureRmAccount

Selezioniamo la specifica sottoscrizione con i comandi:

Get-AzureRmSubscription

Set-AzureRmContext -SubscriptionId <subscription ID>

Creiamo un nuovo Resource Group, che con molta poca fantasia chiameremo “NewResourceGroup”, nel quale effettuare le nostre configurazioni:

New-AzureRmResourceGroup –Name ‘NewResourceGroup’ –Location ‘West Europe’

A questo punto possiamo creare un nuovo KeyVault associato al resource group:

New-AzureRmKeyVault -VaultName ‘FKeyVault’ -ResourceGroupName ‘NewResourceGroup’ -Location ‘West Europe’


L’output di quest’ultimo comando mostra una delle proprietà più importanti: il Vault URI. Tutte le applicazioni che dovranno utilizzare il nuovo KeyVault attraverso le API Rest lo faranno attraverso questo URI.

Aggiungiamo una key al nostro KeyVault:

$key Add-AzureKeyVaultKey -VaultName ‘FKeyVault’ -Name ‘NewKey’ -Destination ‘Software’

Per verificare l’URI, utilizziamo il comando:

$Key.key.kid


Per configurare una stringa a questa chiave, ad esempio una password chiamata “Segreto” il cui valore è “123password”, è necessario effettuare due operazioni:

  • convertire la stringa in una stringa sicura;
  • associare la stringa sicura alla chiave.

$secretval ConvertTo-SecureString ‘123password’ -AsPlainText –Force

$secret Set-AzureKeyVaultSecret -VaultName ‘FKeyVault’ -Name ‘Segreto’ -SecretValue $secretval

Per verificarne l’URI:

$secret.Id


Per verificare quanto appena configurato:

Get-AzureKeyVaultKey –VaultName ‘NKeyVault’

Get-AzureKeyVaultSecret –VaultName ‘NKeyVault’

Configurare l’applicazione

Dopo aver scaricato l’applicazione d’esempio, apriamo la solution con Visual Studio


Contestualmente nella directory scripts troveremo lo script GetAppConfigSettings.ps1 da modificare ed eseguire.


È sufficiente modificare le prime righe configurando ciò che abbiamo appena creato:

  • Nome del KeyVault
  • Nome del Resurce Group
  • Nome dell’applicazione


Eseguiamo lo script.

Quando richiesto, inseriamo una password per il certificato.

Al termine dell’esecuzione dello script in output avremo delle chiavi da inserire all’interno del file app.config dell’applicazione.


Caricando lo snap-in dei certificati relativi all’account locale è possibile comprovare l’avvenuta creazione del certificato, senza il quale l’applicazione non sarà in grado di verificare le credenziali su Azure.


Le applicazioni che utilizzano KeyVault devono autenticarsi utilizzando un token generato da Active Directory, nel nostro caso Azure Active Directory.

Per farlo, clicchiamo su “Azure Active Directory”, successivamente su “App registrations” e cerchiamo la nostra applicazione HelloKeyVault.


Abilitiamo l’applicazione all’utilizzo della chiave copiando il clientID (Application ID) e utilizziamo il seguente comando:

Set-AzureRmKeyVaultAccessPolicy -VaultName ‘FKeyVault’ -ServicePrincipalName 341efa38-faf5-459e-903a-05e9a5ad7309 -PermissionsToKeys all

Per verificare che tutto sia andato a buon fine proviamo a eseguire l’applicazione dal sistema in cui è installato il certificato. In questo modo vedremo come questa utilizzi il KeyVault generato e la relativa chiave, con la possibilità di eseguire tutte le operazioni che il KeyVault stesso mette a disposizione:


Conclusioni

La sicurezza è sempre una tematica attuale e, spesso, sottovalutata.

In questo contesto, Azure fornisce delle soluzioni pratiche anche per quei clienti spaventati dall’avere i propri dati sul Cloud.

Fornire agli sviluppatori delle chiavi crittografate, centralizzandone la gestione e mantenendo uno standard di sicurezza adeguato è solo uno dei pregi di questa soluzione, benché sia facilmente intuibile di aver trattato solo scalfito la superficie di quest’ampia tematica.

Implementare Workgroup Cluster e Multi-Domain Cluster in Windows Server 2016

Mentre nelle precedenti versioni di Windows Server era necessario che tutti i nodi di un cluster fossero joinati ad un dominio di Active Directory, in Windows Server 2016 è stata introdotta la possibilità di creare cluster usando dei nodi in workgroup, permettendo quindi di non dover utilizzare un dominio ed implementare dei domain controller.

Nota: Con Windows Server 2016 è inoltre possibile creare cluster i cui nodi appartengono a domini diversi.

Per implementare un workgroup cluster o un multi-domain cluster è necessario però che vengano rispettati determinati prerequisiti:

  • Creare un account utente con lo stesso nome e la stessa password su tutti i nodi
  • Aggiungere l’account creato al gruppo Administrators locale
  • Se non si utilizza l’account predefinito Administrator è necessario creare la chiave di registro LocalAccountTokenFilterPolicy in HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System e metterla con valore 1
  • Il cluster deve essere creato nella modalità Active Directory-Detached Cluster, senza creare nessun oggetto in AD
  • È necessari creare il Cluster Network Name (chiamato anche Administrative Access Point) di tipo DNS
  • Ogni nodo deve avere un suffisso DNS
  • Nel caso di un multi-domain cluster, i suffissi DNS per tutti i domini del cluster devono essere presenti su tutti i nodi
  • Il Witness consigliato è un Cloud Witness oppure un Disk Witness. Non è supportato in entrambi i casi l’utilizzo del File Share Witness.

In questo articolo creeremo un workgroup cluster a due nodi (chiamati NODO1 e NODO2) utilizzando Windows Server 2016. Dopo aver preparato i nodi del cluster ed aver installato il sistema operativo ho provveduto a configurare il suffisso DNS su entrambi i nodi, come mostrato in figura:

Figura 1: Modifica del suffisso DNS

Dopo aver riavviato entrambi i nodi, ho provveduto a modificare il file HOSTS sulle macchine in modo tale che potessero risolvere i nomi dei nodi e il nome del cluster (che ho deciso di chiamare WRKGCLUSTER). Questa operazione è necessaria solo se non volete configurare un DNS. Nel caso abbiate un DNS in rete potete popolare la zona scelta (il suffisso DNS) per il vostro cluster (nel mio caso demo.lab).

Figura 2: Modifica del file HOSTS per la risoluzione del nomi

Ho provveduto quindi a creare su entrambi i nodi l’account di servizio ClusterSVC, ho impostato la stessa password e l’ho aggiunto al gruppo Administrators locale, come mostrato in figura:

Figura 3: Creazione dell’account per l’autenticazione NTLM

L’account è necessario affinché i nodi utilizzino l’autenticazione NTLM. Poiché non sto usando l’account Administrator è necessario inserire sui nodi la chiave di registro indicata nei prerequisiti. In maniera rapida ho eseguito sui due nodi, da un prompt PowerShell con privilegi elevati, il comando:

New-ItemProperty -path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System -Name LocalAccountTokenFilterPolicy -Value 1

Figura 4: Inserimento della chiave di registro necessaria all’utilizzo degli account

Successivamente ho provveduto ad installare la feature del Failover Cluster sui due nodi. È possibile usare il Server Manager oppure il comando PowerShell
Install-WindowsFeature -Name Failover-Clustering -IncludeManagementTools

Figura 5: Installazione della funzionalità di Failover Cluster tramite PowerShell

Terminata l’installazione ho avviato il Failover Cluster Manager e ho lanciato il wizard per la creazione del Cluster. Ho aggiunto i due nodi e ho cliccato su Next, come mostrato in figura:

Figura 6: Aggiunta dei due nodi

Nella schermata successiva ho deciso di lanciare il Validate Configuration Wizard che ovviamente mi ha riportato dei Warning, come mostrato in figura:

Figura 7: Validate Configuration Wizard

Figura 8: Warning relativo alla non appartenenza dei nodi del cluster al dominio

Nella schermata successiva del wizard ho indicato il nome del cluster e l’indirizzo IP scelto, come mostrato in figura:

Figura 9: Scelta del nome del cluster e dell’indirizzo

Terminata la verifica che non ci sia un server con lo stesso nome NETBOIS e non ci siano indirizzi IP duplicati nella stessa rete, appare la schermata riepilogativa mostrata in figura, che indica che il cluster utilizzerà per la registrazione solo il DNS:

Figura 10: Schermata riepilogativa relativa alla creazione del cluster

La stessa operazione poteva essere effettuata utilizzando il comando PowerShell

New-Cluster –Name WRKGCLUSTER.demo.lab -Node NODO1.demo.lab,NODO2.demo.lab -AdministrativeAccessPoint DNS -StaticAddress 10.10.0.5


Al termine della procedura ho ottenuto la schermata finale dell’avvenuta creazione del cluster

Figura 11: Creazione del cluster completata

Figura 12: Nodi del cluster attivi

Conclusioni

I Workgroup Cluster e i Multi-Domain Cluster sono decisamente un’importante novità introdotta in Windows Server 2016. I workload supportati sono SQL Server, File Server e Hyper-V. Per quanto riguarda Hyper-V la mancanza dell’autenticazione Kerberos in realtà complica le cose in quanto la Live Migration non è supportata, mentre è supportata la Quick Migration.

Come effettuare un PenTest – Parte 2: Information Gathering

Abbiamo visto nel precedente articolo cos’è il Penetration Testing o PenTest.

In questo capitolo cercheremo di affrontare la seconda fase di un PenTest, basata su esempi reali e spiegazione di alcuni tools utilizzabili. L’information Gathering può essere distinto in due metodologie: attivo o passivo.

L’obiettivo principale di questa fase è quello di raccogliere più informazioni possibili che possano essere utili nell’attività di PenTest: alcuni dati possono essere ricavati dal DNS, hostname, IP, tecnologie hardware usate, username, documenti sensibili, informazioni di password reset, informazioni di contatto, SOCIAL NETWORK vari ed altro ancora.

Tale attività risulta essere nevralgica e molto importante. Più informazioni riuscirò a carpire, più accurata sarà la mia ricerca.

Nella ricerca delle informazioni ATTIVA cercheremo di ottenere le informazioni, ad esempio, nel traffico di rete dove si trova il nostro target; nella modalità PASSIVA utilizzeremo servizi di terze parti come Google/Linkedin/Shodan ecc.

Nella Information Gathering che stiamo descrivendo non esiste una tecnica o approcci standard: vince chi ha più creatività ed inventiva.

I motori di ricerca possono essere i vostri migliori amici…

È importante aggiungere che, per una raccolta di informazioni meno intrusiva e anonima ma con più difficoltà nel reperire dati, l’approccio PASSIVO è preferibile. L’approccio ATTIVO, restituirà all’attaccante molte info ma il rischio di essere scoperto e bloccato potrebbe essere alto.

La tipologia di approccio può essere scelto dal cliente al momento della redazione del Test PLAN.

Passiamo ai fatti…

Immaginiamo di voler raccogliere più info possibili da un Sito Web sfruttando l’approccio Ibrido (ATTIVO + PASSIVO).

Dove potremmo reperire un numero adeguato di Info?

Siti Web pubblici (affacciati su Internet) possono essere considerati la vetrina di una vittima. Sono molto utili per mostrare ai clienti i loro servizi e prodotti, ma possono essere sfruttati per carpire informazioni di varia natura e successivamente sfruttate a proprio vantaggio.

NOTA: Se un sito web è hostato su un provider esterno, raccogliere informazioni può essere difficoltosa, se il sito è hostato in server proprietari la faccenda potrebbe diventare più interessante…

Risorse Pubbliche alla portata di tutti

Esistono nel web numerose applicazioni che permettono di ottenere alcune info importanti per il proseguimento del PenTest.

Facciamo alcuni esempi:

https://archive.org/ : Permette di avere uno storico dei siti web. Dalla versione più recente alla più vecchia;

http://whois.domaintools.com/: Permette, tramite protocollo whois, di avere molte informazioni utili;

https://centralops.net/co/: simile al secondo link, con il vantaggio di poter fare un port scan semplice via web. (attività anonima a danno del target)

L’utilizzo di risorse pubbliche disponibili su Web, è sempre da preferire in quanto permette di mantenere un certo anonimato. A discapito di ciò, vi è una difficoltà di adeguare i tool via web alle nostre esigenze.

Tools in Linux

WHOIS

In alcune distro Linux è possibile adoperare il protocollo di rete Whois direttamente da terminare di comando.

#whois ictpower.it

Whois permette di effettuare delle query al fine di ottenere informazioni riguardo la registrazione del dominio. È possibile avere informazioni riguardo DNS server e contatti di colui che ha registrato il dominio. Con un pizzico di malizia e una spolverata di “linkedin” è possibile divertirsi un pò.

Ripasso di alcuni record DNS:

SOA: Informazioni autorevoli sulla zona DNS, incluso server DNS principale.

NS: Delega una zona DNS ad essere gestita da un server DNS autorevole per quel dominio.

A: Indirizzo IPv4 dell’host.

MX: Collega un nome di dominio ad una lista di server di posta autorevoli per quel dominio.

AAAA: Indirizzo Ipv6 dell’host.

CNAME: Collega un nome DNS ad un altro.

DIG

Altri tools che possono essere molto utili per poter raccogliere alcune informazioni sono:

Dig permette di fare query DNS; il solo comando DIG restituirà solo record di tipo A. Per poter ottenere tutti i record basterà digitare:

#dig ictpower.it any

Il fattore vincente in DIG può essere quello che permette di eseguire query salvate in un file di testo.

DNSENUM

Una valida alternativa a DIG, può essere dnsenum che permette di restituire i record DNS sfruttando alcune implementazioni aggiuntive:

  • Permette di ottenere nomi e sottodomini aggiuntivi utilizzando Google;
  • Scoprire sottodomini utilizzando tecniche di brute forcing da file di testo;
  • Utilizzare thread per elaborare diverse query…
  • Etc…

#dnsenum ictpower.it

Utilizzando il semplice comando dnsenum, otterremo informazioni riguardo IP dell’host, nome server e IP del server di posta.

Altri tools che permettono un’analisi più automatizzata sono Fierce o DMitry che approcciano l’information gathering in maniera più aggressiva e approfondita.

DA USARE CON MODERAZIONE…

Network Routing Information

Altre informazioni che possiamo ricavare, sono quelle inerenti al “network routing information”; conoscere tali dati permette ad un PenTester di comprendere la rete nella quale si trova il proprio target ed evitare di essere scoperto. In questa fase è possibile anche osservare se vi è un firewall a protezione del target.

TCPtraceroute

Il primo per importanza è sicuramente TCPtraceroute.

Come si evince dal nome, sfrutta il comando traceroute che, combinato ad una serie di migliorie, permette di ottenere risultati sicuramente più efficaci.

Il traceroute packet, nonché “UDP o ICMP
echo
request” con TTL variabile, molto spesso sono filtrati da un firewall; TCPtraceroute sfrutta il TCP SYN (stealth Scan) nonchè pacchetti legittimi e difficilmente bloccabili.

Se TCPtraceroute riceve in risposta del TCP SYN, un SYN/ACK significa che la porta è aperta, se il flag viene settato con RST significa che la porta è chiusa.

Tctrace

Strumento alternativo a TCPtraceroute è tctrace, che sfrutta la stessa tecnica.

TheHarvester

Ladies and gentlemen, inchinatevi davanti al tool per eccellenza per information Gathering.

Uno dei tool più malvagi ed utili che siano stati mai creati è TheHarvester (Tradotto “Il raccoglitore”).

Tale strumento è utilizzato per raccogliere domini, indirizzi email e documenti con metadata inerenti il target. Esso si basa su un suo algoritmo di ricerca in grado di interrogare i maggiori motori di ricerca conosciuti, facendo sì che l’attaccante non visiti direttamente il target. Dunque il target sarà ignaro delle nostre attività.

Riprendendo dalla descrizione nella pagina Github <<https://github.com/laramies/theHarvester>>, elenco alcuni motori di ricerca che interroga:

  • Google
  • Yahoo
  • Baidu
  • Shodan
  • Twitter
  • Etc…

Come ultimo, ma non per importanza, abbiamo Metagoofil.

Cercate documenti inerenti un possibile target? Questo tool fa per voi.

Esso si basa sul fantastico Google, andando a ricercare tutti i documenti con metadati del dominio target.

Possiamo ricercare documenti word, excel, presentazioni powerpoint, PDF

I suoi passi sono fondamentalmente 4:

  1. Cerca tutti i documenti presenti nel web tramite Google, con le estensioni specificate;
  2. Scarica i documenti trovati in locale;
  3. Estrae i metadati dai documenti scaricati;
  4. Salva i dati in un file HTML.

I metadati possono essere username, Versioni software, nomi macchina. Facile No?

Nel prossimo articolo affronteremo il cosiddetto processo di Target Discover nella rete.