giovedì 26 febbraio 2015

Creazione e compressione backup database SQL SERVER EXPRESS tramite script in Powershell

Lo script che segue permette di effettuare un backup di un database di SQL EXPRESS, compattarlo e creare un file di log.

Requisiti:

- SQL Server distribuzione EXPRESS (qui il link)

- 7-z (qui il link)

- Powershell

Istruzioni:

Installato e configurato SQL Server express e 7-z, procediamo nella creazione dello script, quest'ultimo è così suddiviso:

1 - Connessione al database del quale si vuole effettuare il backup.

2 - Creazione del backup del database (così creato "nomedb-giornomeseannooraminutisecondi.bak")

3 - Compressione e controllo del file (così creato "nomedb-giornomeseannooraminutisecondi.zip")

4 - Creazione del file di log riportante l'esito della compressione (così creato "nomedb-giornomeseannooraminutisecondi.txt")

5 (opzionale) - Invio mail con allegato il file di log

6 - Cancellazione del file di backup

7 (opzionale) - Cancellazione files più vecchi di X giorni

8 - Controllo spazio su disco ed invio mail di avviso

Aperto un editor di testo (anche il notepad va bene), incolliamo le seguenti stringhe:

#Dichiarazione variabili
 

$ServerName = "nome_server\istanza_SQL"
$BackupDirectory = "cartella salavataggio dati"
$dbToBackup = "nome database"


#pulizia schermo

cls

#connessione a SQL Server Management Object
 

[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO") | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SmoExtended") | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.ConnectionInfo") | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SmoEnum") | Out-Null


#definizione variabili
$server = New-Object ("Microsoft.SqlServer.Management.Smo.Server") $ServerName

"Default Backup Directory: " + $backupDirectory 



$db = $server.Databases[$dbToBackup]
$dbName = $db.Name

$timestamp = Get-Date -format yyyyMMdd-HHmmss
$smoBackup = New-Object ("Microsoft.SqlServer.Management.Smo.Backup")

#esecuzione backup

$smoBackup.Action = "Database"
$smoBackup.BackupSetDescription = "Full Backup of " + $dbName
$smoBackup.BackupSetName = $dbName + "Backup"
$smoBackup.Database = $dbName
$smoBackup.MediaDescription = "Disk"
$smoBackup.Devices.AddDevice($backupDirectory + "\" + $timestamp + "_" + $dbName + ".bak", "File")
$smoBackup.SqlBackup($server)
 

#compressione del file di backup

if (-not (test-path "$env:ProgramFiles\7-Zip\7z.exe")) {throw "$env:ProgramFiles\7-Zip\7z.exe needed"}
set-alias sz "$env:ProgramFiles\7-Zip\7z.exe"  

$Source = ($backupDirectory + $timestamp + "_" + $dbName + ".bak")
$Target = ($backupDirectory + $timestamp + "_" + $dbName + ".zip")
$logFile = ($backupDirectory + $timestamp + "_" + $dbName + ".txt")

sz a -mx=9 $Target $Source  | set-content $logFile -encoding ascii
 

#cancellazione il file di backup

Remove-Item $Source -recurse

#invio email con allegato il log
 

#$emailFrom = "indirizzo e-mail mittente"
#$emailTo = "indirizzo e-mail destinatario"
#$subject = "Oggetto della mail"
#$body = "Testo della mail "
#$smtpServer = "indirizzo server smtp"
#$filePath = $logFile
#Function sendEmail([string]$emailFrom, [string]$emailTo, [string]$subject,[string]$body,[string]$smtpServer,[string]$filePath)
#{
#creazione e-mail
#$email = New-Object System.Net.Mail.MailMessage
#$email.From = $emailFrom
#$email.To.Add($emailTo)
#$email.Subject = $subject
#$email.Body = $body
# initiate email attachment
#$emailAttach = New-Object System.Net.Mail.Attachment $filePath
#$email.Attachments.Add($emailAttach)
#initiate sending email
#$smtp = new-object Net.Mail.SmtpClient($smtpServer)
#$smtp.Send($email)
#}

#avvio servizio spedizione e-mail
#sendEmail $emailFrom $emailTo $subject $body $smtpServer $filePath

#eliminazione di file più vecchi di 7 gg

$Daysback = "-inserire il numero dei giorni"

$CurrentDate = Get-Date
$DatetoDelete = $CurrentDate.AddDays($Daysback)
#no sotto cartelle
Get-ChildItem $BackupDirectory | Where-Object { $_.LastWriteTime -lt $DatetoDelete } | Remove-Item

#Visualizza il contenuto della directory



$activity = "Avvio creazione file compressi e relativi log"

$status = "Avvio"
for($counter = 0; $counter -lt 100; $counter++)
{
    $currentOperation = "Percentuale completamento $counter"
    Write-Progress $activity $status -PercentComplete $counter `
                   -CurrentOperation $currentOperation
    Start-Sleep -m 130
}


 Get-ChildItem -Path $BackupDirectory

#controllo spazio su disco ed eventuale invio mail

$min = 5;  #soglia per l'avviso in GB

 
$warningString = "* Warning < $min GB"
$smtpServer = "indirizzo server smtp"
$emailFrom = "indirizzo e-mail mittente"
$emailTo = "indirizzo e-mail destinatario"
$subject = "Report Disk Space ({0})" -f $env:computername

$minByte = $min * 1GB
$drives = Get-WmiObject  Win32_LogicalDisk | Where-Object {$_.DriveType -eq 3}

$frmt = @{l="Drive";e={"{0}" -F ($_.DeviceID)};width=10},`
 @{l="Message";e={if($_.freespace -lt $minByte) {$warningString} else {"OK"}};width=20}, `
 @{l="Free %";e={"{0:N2}" -f ([long]$_.FreeSpace / [long]$_.Size * 100)};width=10}, `
 @{l="Free GB";e={"{0:N2}" -f ($_.FreeSpace / 1GB)};width=10}, `
 @{l="Size GB";e={"{0:N2}" -f ($_.Size / 1GB)};width=10}
 

#mostra una barra di avanzamento   

$result = $drives | Format-Table $frmt | out-string

if($result.Contains($warningString) )
{
 $body = "Server: {0} - Date: {1:dd MMM yyyy HH:mm:ss} `r`n $result `r`n `r`n-- End Report --" -f $env:computername, [DateTime]::Now

 #send email
 $smtp = new-object Net.Mail.SmtpClient($smtpServer)
 $smtp.Send($emailFrom, $emailTo, $subject, $body)

 write-host $body


Ora salvare il file con estensione ".ps1", avviare (come ammistratore) powershell ed avviare lo script sopra creato.

martedì 24 febbraio 2015

Configurazione VPN pfSense client-to-site

Per dar modo a dispositivi mobili (cellulari, tablet, portatili etc.) di potersi collegare ad un computer remoto tramite una VPN configurare pfSense nel seguente modo:

- Dal menù in alto scegliere la voce “VPN”

- Scegliere la scheda “Mobile clients”

- Verrà visualizzato in alto un messaggio che avverte che per creare la VPN client-to-site bisogna creare la Phase 1, premere sul relativo tasto “Create Phase 1”

- Una volta comparso il menù VPN: IPsec: Edit Phase 1: Mobile Client, impostare i seguenti parametri:

Sezione General information :

* Key Exchange version = v1
* Internet Protocol = IPv4

* Interface = WAN

* Description = Inserire una descrizione (es. Vpn clients)


Sezione Phase 1 proposal (Autentication) :

* Authentication method = Mutual PSK + Xauth

* Negotiation mode = Main (preferibile all'agressive mode per questioni di sicurezza)

* My identifier = My IP address
* Peer identifier => Distinguished Name = Inserire un nome (es. VpnClients)

* Pre-Shared Key = in questo campo impostare una chiave segreta (es. VpN@0nL41N)

Sezione Phase 1 proposal (Algorithms) :

* Encryption algorithm = qui scegliere l'algoritmo di criptazione (per questioni di sicurezza consiglio la AES 256 bits)
* Hash algorithm = qui scegliere l'algoritmo di hash (SHA1 è impostato di default e può andare bene)
* DH key group = qui a vostra scelta impostate il gruppo

* Lifetime = 28800


Sezione Advanced Options :

* Disable Rekey = non spuntata

* Disable Reauth = non spuntata
* NAT Traversal = Auto
* Dead Peer Detection = per motivi di stabilità non va spuntata

Terminata l'impostazione dei vari parametri, premere su “save” (comparirà in alto una scrittà che vi avvertirà che sono state effettuate delle modifiche e che se si vuole confermarle bisogna premere sul tasto “Apply changes” e poi su “close”.
Ora si procede con la creazione della “Phase 2” nella seguente maniera:
- Premere sul tasto “+ - Show 0 Phase-2 entries ” che compare sotto la tabella riassuntiva della Phase1

- Premere il tasto ”+” a destra della tabella riassuntiva della Phase2

- All'apertura della finestra VPN: IPsec: Edit Phase 2: Mobile Client inserire i seguenti parametri:

* Mode = Tunnel IPv4

* Local Network = Lasciate sulla voce “LAN subnet”

* Remote Network = Inserite la rete remota lato LAN (es. 192.168.50.0)

* Protocol = lasciate su “ESP”

* Encryption algorithms = la stessa della Phase1

* Hash algorithms = la stessa della Phase1

* PFS key group = lasciate pure su “Off”

* Lifetime = 28800

Infine premete sul tasto “save”, alla comparsa dell'avviso che sono state effettuate delle modifiche premete su “apply changes” e poi “close”.

Come ultimo passaggio creiamo le utenze con le quali si potrà accedere alla VPN:
- Dal menù in alto “System”

- Andare all'ultima voce “User Manager”

- Andare alla seconda scheda “Groups”

- Premere il tasto a destra “+” e inseriamo il nome del gruppo e la relativa descrizione (es. nome gruppo: VpnClients) e scegliamo come privilegi “User - VPN - IPsec xauth Dialin” infine premiamo Save per confermare la creazione del gruppo.

- Andiamo alla scheda “Users”
- Premere il tasto a destra “+” e inseriamo il nome dell'utente, la password, un'eventuale descrizione dell'utenza e alla sezione “Group Memberships” selezioniamo il gruppo precedentemente creato (es. VpnClients) e lo spostiamo sul riquadro a destra “Member Of” (non inserire nessuna pre-shared key in quanto è stata inserita precedentemente nella creazione della Phase 1) infine premiamo su “save” per confermare la creazione dell'utente.

Configurazione VPN site-to-site tra due firewall pfSense

Una volta loggati sul firewall tramite l'interfaccia web, procedere nella seguente maniera per poter configurare il tunnel VPN site-site:

- Dal menù in alto cliccare sulla voce “VPN”

- Dal menù a tendina scegliere la voce “Ipsec”

- Una volta che compare la schermata VPN: Ipsec : Edit Phase 1 spuntare la voce “Enable Ipsec”

- Premere il quadratino a destra “+” (Add new phase1)

- Nella schermata che apparirà inserire i seguenti parametri:


Sezione General information :

* Key Exchange version = v1

* Internet Protocol = IPv4

* Interface = WAN

* Remote Gateway = Inserire l'indirizzo IP pubblico del firewall remoto (es. 10.0.0.1)

* Description = Inserire una descrizione (es. Vpn verso firewall remoto n° 1)


Sezione Phase 1 proposal (Autentication) :

* Authentication method = Mutual PSK

* Negotiation mode = Main (preferibile all'agressive mode per questioni di sicurezza)

* My identifier = My IP address

* Peer identifier = Peer IP address

* Pre-Shared Key = in questo campo impostare una chiave segreta (es. VpN@0nL41N)


Sezione Phase 1 proposal (Algorithms) :

* Encryption algorithm = qui scegliere l'algoritmo di criptazione (per questioni di sicurezza consiglio la AES 256 bits)

* Hash algorithm = qui scegliere l'algoritmo di hash (SHA1 è impostato di default e può andare bene)

* DH key group = qui a vostra scelta impostate il gruppo

* Lifetime = 28800


Sezione Advanced Options :

* Disable Rekey = non spuntata

* Disable Reauth = non spuntata

* NAT Traversal = Auto

* Dead Peer Detection = per motivi di stabilità non va spuntata


Terminata l'impostazione dei vari parametri, premere su “save” (comparirà in alto una scrittà che vi avvertirà che sono state effettuate delle modifiche e che se si vuole confermarle bisogna premere sul tasto “Apply changes” e poi su “close”.

Ora si procede con la creazione della “Phase 2” nella seguente maniera:

- Premere sul tasto “+ - Show 0 Phase-2 entries ” che compare sotto la tabella riassuntiva della Phase1

- Premere il tasto ”+” a destra della tabella riassuntiva della Phase2

- All'apertura della finestra VPN= IPsec: Edit Phase 2 inserire i seguenti parametri:

* Mode = Tunnel IPv4

* Local Network = Lasciate sulla voce “LAN subnet”

* Remote Network = Inserite la rete remota lato LAN (es. 192.168.50.0)

* Protocol = lasciate su “ESP”

* Encryption algorithms = la stessa della Phase1

* Hash algorithms = la stessa della Phase1

* PFS key group = lasciate pure su “Off”

* Lifetime = 28800

Infine premete sul tasto “save”, alla comparsa dell'avviso che sono state effettuate delle modifiche premete su “apply changes” e poi “close”

La stessa configurazione va fatta sul firewall remoto pfSense (gli unici parametri da cambiare sono nella Phase1 la voce Remote Gateway dove andrà inserito l'ip pubblico lato WAN del client remoto e nella Phase 2 la voce Remote network dove va inserita la rete lato LAN del client remoto).