Mediafire: script Bash per upload di files da console

Di seguito pubblico uno script utile per chi vuole caricare su mediafire uno o più file da console senza dover utilizzare un browser web. Questo script è utile in caso di job notturni o programmi che non richiedono l’intervento dell’utente.

#!/bin/bash

#
# Copyright (c) 2011 vittorio benintende
# (vittorio@lucullo.it - http://www.morzello.com).
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# 1. Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in the
#    documentation and/or other materials provided with the distribution.
#
# 3. Neither the name of the Site nor the names of its contributors
#    may be used to endorse or promote products derived from this software
#    without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE SITE AND CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED.  IN NO EVENT SHALL THE SITE OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
#
#
# --- PARAMS ---
#
# login and password must be url-encoded!
#

MF_LOGIN='mediafire%40morzello.com'
MF_PWD='mypass'

# --- PARAMS ---
#
# DO NOT MODIFY LINES BELOW
#

MF_FILES="$@"

if [ "z${MF_FILES}" = "z" ]; then
	echo
	echo "No file(s) specified."
	echo
	echo "USAGE: $0 : file1 file2 ..."
	echo

	exit 1
fi

OUTPUT_FILE=$(mktemp)
COOKIE_FILE=$(mktemp)

rdom () { local IFS=\> ; read -d \< E C ;}

wget -q --save-cookies ${COOKIE_FILE} --keep-session-cookies -O /dev/null "https://www.mediafire.com/"

wget -q --load-cookies ${COOKIE_FILE} --save-cookies ${COOKIE_FILE} --keep-session-cookies --referer="https://www.mediafire.com/" \
     --post-data "login_email=${MF_LOGIN}&login_pass=${MF_PWD}&login_remember=on&submit_login.x=97&submit_login.y=18" \
     -O /dev/null "https://www.mediafire.com/dynamic/login.php"

wget -q --load-cookies ${COOKIE_FILE} --save-cookies ${COOKIE_FILE} --keep-session-cookies --referer="https://www.mediafire.com/myfiles.php" \
     -O ${OUTPUT_FILE} "https://www.mediafire.com//basicapi/uploaderconfiguration.php?45144"

UPLOAD_SESSION=$(while rdom; do
    if [[ ${E} = "upload_session" ]]; then
        echo ${C}
        exit
    fi
done < ${OUTPUT_FILE})

# echo "Upload Session = ${UPLOAD_SESSION}"

UKEY=$(while rdom; do
    if [[ ${E} = "ukey" ]]; then
        echo ${C}
        exit
    fi
done < ${OUTPUT_FILE})  

# echo "UKey = ${UKEY}"

TRACKKEY=$(while rdom; do
    if [[ ${E} = "trackkey" ]]; then
        echo ${C}
        exit
    fi
done < ${OUTPUT_FILE})

# echo "Track Key = ${TRACKKEY}"

FOLDERKEY=$(while rdom; do
    if [[ ${E} = "folderkey" ]]; then
        echo ${C}
        exit
    fi
done < ${OUTPUT_FILE})  

# echo "Folder Key = ${FOLDERKEY}"

MFULCONFIG=$(while rdom; do
    if [[ ${E} = "MFULConfig" ]]; then
        echo ${C}
        exit
    fi
done < ${OUTPUT_FILE})  

# echo "MFUL Config = ${MFULCONFIG}"

MF_USER=$(while rdom; do
    if [[ ${E} = "user" ]]; then
        echo ${C}
        exit
    fi
done < ${OUTPUT_FILE})  

# echo "User = ${MF_USER}"

for FILENAME in ${MF_FILES}; do

	SHORT_FILENAME=$(basename "${FILENAME}")
	FILESIZE=$(stat -c%s "${FILENAME}")

	wget -q --load-cookies ${COOKIE_FILE} --save-cookies ${COOKIE_FILE} --keep-session-cookies --referer="https://www.mediafire.com/myfile.php" \
	     --header="Content-Type: application/octet-stream" \
	     --header="X-Filename: ${SHORT_FILENAME}" \
	     --header="X-Filesize: ${FILESIZE}" \
	     --post-file="${FILENAME}" \
	     -O ${OUTPUT_FILE} "https://www.mediafire.com/douploadtoapi/?type=basic&ukey=${UKEY}&user=${MF_USER}&uploadkey=${FOLDERKEY}&filenum=0&uploader=0&MFULConfig=${MFULCONFIG}"

	RESKEY=$(while rdom; do
	    if [[ ${E} = "key" ]]; then
	        echo ${C}
	        exit
	    fi
	done < ${OUTPUT_FILE})

	# echo "${FILENAME} > ${RESKEY}" 

	# get result

	RUN=1

	while [ ${RUN} -eq 1 ]; do
		wget -q --load-cookies ${COOKIE_FILE} --save-cookies ${COOKIE_FILE} --keep-session-cookies --referer="https://www.mediafire.com/myfile.php" \
		     -O ${OUTPUT_FILE} "https://www.mediafire.com/basicapi/pollupload.php?key=${RESKEY}&MFULConfig=${MFULCONFIG}"

		QUICKKEY=$(while rdom; do
		    if [[ ${E} = "quickkey" ]]; then
		        echo ${C}
		        exit
		    fi
		done < ${OUTPUT_FILE})

		FILEERROR=$(while rdom; do
		    if [[ ${E} = "fileerror" ]]; then
		        echo ${C}
		        exit
		    fi
		done < ${OUTPUT_FILE})

		# echo "${QUICKKEY} ; ${FILEERROR}" 

		RUN=0
		if [ "z${FILEERROR}" = "z" ] && [ "z${QUICKKEY}" = "z" ]; then
			RUN=1

		fi

		#
		#..

		#...
		#... File too large. 1 0 
		#... File too small. 2 0 
		#... Archive is bad. 3 0 
		#... Archive is bad or password protected. 4 0 
		#... Virus found. 5 0  
		#... File already uploaded. 13 0  
		#... Archive has an unknown problem. 9 0 
		#... Invalid image. 10 0 
		#... File lost. 6 1 
		#... Error scanning file. 7 1 
		#... Disk error. 8,11 1 
		#... Database error. 12 1 
		#..
		#	

		case "${FILEERROR}" in
			1) FILEERROR=" 1 : File too large."
			;;
			2) FILEERROR=" 2 : File too small."
			;;
			3) FILEERROR=" 3 : Archive is bad."
			;;
			4) FILEERROR=" 4 : Archive is bad or password protected."
			;;
			5) FILEERROR=" 5 : Virus found."
			;;
			13) FILEERROR="13 : File already uploaded."
			;;
			9) FILEERROR=" 9 : Archive has an unknown problem."
			;;
			10) FILEERROR="10 : Invalid image."
			;;
			6) FILEERROR=" 6 : File lost."
			;;
			7) FILEERROR=" 7 : Error scanning file."
			;;
		 8) FILEERROR=" 8 : Disk error."
			;;
			11) FILEERROR="11 : Disk error."
			;;
			12) FILEERROR="12 : Database error."
			;;
			*) FILEERROR="0 : Success."
			;;
		esac

	done 

	echo "${FILEERROR} | ${FILENAME} > ${QUICKKEY}"
done

rm ${OUTPUT_FILE}
rm ${COOKIE_FILE}

Prima di iniziare
Prima di utilizzare lo script è necessario impostare i parametri di login e password in uso su medaifire. Bisogna ricordare che questi paramentri sono url-encoded; questo perchè vengono esposti direttamente nell’url di login. Ad esempio:

mediafile@morzello.com -> mediafire%40morzello.com

Usare lo script
Per utilizzare lo script basta indicare il file o i file da inviare al server:

./mfup.sh myfile.txt all.* /root/repo/*

Ricordate però che non verranno prese in considerazione le sottocartelle.

Alla prossima

Come faccio a sapere se il mio ISP blocca il traffico P2P?

Qualche volta le richieste di consulenza informatica che ricevo sono alquanto bizzarre. Non per questo però sono da ritenersi banali.

L’ultima mi è stata rivolta da un amico che, dopo aver sottoscritto un contratto di abbonamento ADSL con un noto gestore di telefonia italiano, mi chiede:

“Ma secondo te, il mio ISP (Internet Service Provider) manipola il traffico P2P (Peer-To-Peer) sul mio account?”

Sembrerebbe una domanda banale, tuttavia da consulente mi sento di dover fare alcune considerazioni in merito.

In primo luogo è necessario comprendere cosa sono e come funzionano i protocolli P2P. Banalmente, quando pensiamo a questi protocolli, salta subito alla mente eDonkey (ampiamente sfruttato dal client eMule) e BitTorrent. In realtà si tratta di protocolli ampiamente utilizzati per la condivisione di file (non necessariamente a scopo di pirateria) che non impiegano una gerarchia fra i nodi. In questi protocolli quindi non esiste una relazione Client-Server ma i nodi sono considerati contemporaneamente Client e Server.

Non tutti i protocolli sono uguali
C’è inoltre da tenere presente che i protocolli P2P possono essere molto diversi tra loro. Ad esempio, il protocollo eDonkey, conosciuto anche come ed2k o swamp, prevede l’impiego di alcuni server con lo scopo mi mantenere una sorta di indice dei file presenti in una rete di nodi. Il bittorrent invece prevede l’uso del tracker, un server a cui i client si collegano periodicamente per aggiornare e coordinare i nodi. Nel tracker vengono mantenuti solo le informazioni utili a reperire le risorse, non le risorse stesse. Queste informazioni sono conservate ed aggiornate in file con estensione torrent.

Poiché i nodi sono contemporaneamente client e server, tutti i nodi sono chiamati a gestire connessioni in ingresso per consentire ad altri client la condivisione delle risorse. Questo vuol dire che di norma, i client ricevono connessioni dall’esterno su alcune porte TCP/IP.

eMule ad esempio, utilizza le porte 4662/TCP e 4772/UDP (a volte anche 4672) per gestire il traffico entrante, mentre il protocollo Bittorrent impiega un range che va da 6881 a 6900. Questi sono i parametri standard che generalmente vengono utilizzati e che comunque possono essere modificati all’occorrenza dall’utente.

Nei panni dell’ISP
Per rispondere alla domanda precedente io ne fare un’altra: “Se fossi chiamato a gestire un ISP, come mi comporterei nei confronti delle comunicazioni P2P?”.

In Italia i provider Internet a carattere nazionale sono dotati di linee commerciali e linee business. Queste ultime sono dedicate a contratti aziendali utilizzati ad esempio da: pubblica amministrazione, ospedali, banche, liberi professionisti, ecc. Le linee commerciali sono invece destinate all’uso domestico. Questa segregazione delle reti aiuta sicuramente ad ovviare al rallentamento che la linea commerciale provoca, specie nelle ore di punta.

QOS
Al di là della banda disponibile, c’è da dire che non tutti i servizi offerti da Internet sono uguali. Dal punto di vista dell’utente che ne deve usufruire, potremmo suddividerli in tre macro gruppi:

- Servizi Batch: sono quei servizi che non necessitano di un intervento da parte dell’utente se non marginalmente: ad esempio all’avvio dello stesso. Pensiamo al servizio di trasferimento dei file come FTP (File Transfer Protocol) oppure ai protocolli P2P. Può sembrare strano ma per questi servizi, i difetti dovuti ad una congestione della banda non sono tanto sentiti poiché l’utente non deve forzatamente stare davanti al PC attendendo la fine delle operazioni. E’ vero quindi che, entro certi limiti, avere una banda larga o piccola fa poca differenza.

- Servizi Interattivi: sono servizi che richiedono una continua iterazione da parte dell’utente. Appartengono a questa famiglia la navigazione sul web, l’invio di posta elettronica (con ovvi limiti), l’uso di ERP (come ad esempio SAP) e così via. In genere sono servizi che occupano poca banda, di contro però necessitano di essere molto veloci perché l’utente poco sopporta anche pochi secondi di ritardo.

- Servizi ad Alta Disponibilità: sono quei servizi per i quali la banda è da considerarsi il driver prioritario. Sono ad esempio i servizi di streaming audio/video ed il VoIP. In questo caso una rete sottodimensionata oppure una banda insufficiente rischia non solo di irritare gli utenti ma addirittura di rendere inutile il servizio stesso.

Fatta questa distinzione possiamo immaginare come sia necessario intervenire in qualche maniera al fine di dare una priorità ad alcuni servizi togliendola ad altri.
Il metodo oggi più utilizzato per priorizzare i servizi è quello che impiega il modello di Qualità del Servizio (QoS). Si tratta di accorgimenti ed algoritmi adottati dai vari dispositivi di rete in tempo reale durante lo smistamento del traffico. Ce ne sono tanti e con nome diverso ma tutti vengono generalmente identificati come QoS.

Restando nell’ambito delle linee commerciali, la prima misura che adotterei è quella di introdurre un modello di qualità del servizio (qos).

Blocco del traffico
Bloccare il traffico su alcune porte è sicuramente il metodo più semplice di intervenire ma è anche il metodo più facile da aggirare. In effetti per bloccare le porte che comunemente vengono utilizzate da questi protocolli non vi è bisogno di hadrware particolarmente dotati in termini di CPU perché è possibile definire delle regole statiche. Non a caso i firewall che adottano questo approccio prendono il nome di stateless cioè senza memoria. In realtà basta modificare le porte usate dal servizio per ovviare al problema. E’ ovvio che se l’interesse dell’ISP è quello di arginare il traffico del 70%-80% degli utenti questo è sicuramente un ottimo metodo.

Analisi del traffico di rete
Il modo più efficace invece consiste nell’adottare un sistema di monitoraggio attivo in grado di discriminare il traffico che attraversa la rete al livello più alto dello strato OSI ossia il livello applicativo. E’ il lavoro svolto dalla maggior parte dei firewall statefull che al contrario dei fratelli minori stateless riassemblano tutti i pacchetti prima di consegnarli al destinatario. Vengono spesso usati per intercettare virus e connessioni pericolose e possono dare i loro frutti anche nel caso di protocolli P2P anche su porte non convenzionali. Il rovescio della medaglia è dato dal fatto che ispezionare tutti i pacchetti in transito mantenendo una velocità adeguata necessita di molta potenza di calcolo e questo implica un costo che potrebbe non essere compensato dalla maggior larghezza di banda a disposzione.

A valle di queste considerazioni vi consiglio un sito web dove poter fare alcuni test e capire effettivamente se il vostro ISP adotta uno o più metodi indicati in precedenza:

http://broadband.mpi-sws.org/transparency/bttest.php

Alla prossima.

BackupPC – backup dell’intero pool su nastro o file

Supponiamo che vogliate migrare una installazione di BackupPc su un’altra macchina o che vogliate fare un backup “dei backup”. Di seguito vi propongo una soluzione molto semplice che il comando dump per copiare il contenuto del pool su nastro o su file.
Perché il codice funzioni correttamente è necessario che il pool sia su un filesystem diverso da quello usato per montare la root “/”. A mio avviso, usare un mountpoint per il pool è utile non solo per il backup ma consente di ripristinare il sistema operativo senza dover spostare i dati.
supponiamo quindi che l’installazione di BackupPc sia fatta usando i percorsi di default ma utilizziamo un link che punti su un mountpoint fuori dal filesystem di root. Supponiamo di avere i seguenti mount point:

[root@morzello ~]# mount
/dev/mapper/VolGroup01-LogVol00 on / type ext3 (rw)
/dev/mapper/vgData-Data on /mnt/data type ext3 (rw)
//server-esterno/repository on /mnt/repository type cifs (rw,mand)
...

la prima cosa da fare è quella di portare l’installazione di BackupPC sotto /mnt/data creando un link simbolico su /var/lib/backuppc:

ln -s /var/lib/backuppc /mnt/data/backuppc
ls -l /var/lib/backuppc
lrwxrwxrwx  1 root  root 18 May 13  2010 backuppc -> /mnt/data/backuppc

Consiglio di creare il link prima di procedere con l’installazione altrimenti dovrete spostare i dati da un filesystem all’altro.

Lo script
Lo script non fa altro che spegnere i servizi che utilizzano il filesystem prima di procedere con il dump della partizione. Nel nostro esempio viene preso in considerazione solo BackupPc ma se ci fossero altri servizi bisogna gestirli correttamente altrimenti il comando mount usato per smontare la partizione fallirebbe:

#!/bin/bash
# Esegue il backup di /mnt/data su nastro.
# Da rirpistinare con restore rf /dev/nst0 nella
# root della partizione 

#MYDIR=$(pwd)
#cd /

echo "Controllo esecuzione backup"
ps U 'backuppc' | grep -e 'BackupPC_' && \
	echo "Impossibile proseguire. Backup in corso." && \
	exit 0

echo "Stop ai servizi che accedono alla partizione"
/sbin/service backuppc stop
/sbin/service backuppc_httpd stop

echo "Smontaggio della partizione"
/bin/umount /mnt/data

echo "Controllo con fsck"
/sbin/fsck.ext3 /dev/vgData/Data

echo "dump della partizione su nastro"

#backup su nastro:
/sbin/dump -0 -a -f /dev/nst0 -b64 -j9 /dev/vgData/Data

#backup su file
#/sbin/dump -0 -a -f /mnt/repository/backuppc-dump.bz -b64 -j9 /dev/vgData/Data

echo "Montaggio della partizione"
/bin/mount /mnt/data

echo "Riavvio dei servizi che accedono alla partizione"
/sbin/service backuppc start
/sbin/service backuppc_httpd start

#cd $MYDIR
echo "Fatto."

Prima di eseguire il dump lo script controlla che non vi siano backup in esecuzione da parte dell’utente backuppc. Anche in questo caso se l’utente fosse diverso è necessario modificare il codice.
Il servizio backuppc_httpd è una istanza di apache modificata proprio per backuppc; per maggiori informazioni visitare questo link:

http://www.morzello.com/index.php/installare-backuppc-su-centos/

Se invece utilizzate l’istanza di default potete sostituire il servizio con httpd.
Per quanto riguarda la destinazione, se non aveste a disposizione una unità a nastro potete cambiare il percorso di destinazione ovunque vogliate. Prendendo come esempio il comando mount indicato in precedenza potremmo ad esempio creare un file sotto /mnt/repository

Alla prossima.

Data remanence con dd e shred, un modo economico e sicuro per cancellare i dati su disco.

Qualche giorno fa un amico mi chiese un parere su alcuni programmi per la cancellazione sicura dei dati perchè aveva un portatile che avrebbe dovuto restituire da li a breve.  Mi chiese anche se la formattazione a basso livello era una opzione oppure no.

Intanto c’è da rilevare che la richiesta è del tutto legittima dal momento che la semplice cancellazione del dato all’interno del sistema operativo è il più delle volte insufficiente. In effetti esiste un problema legato alla persistenza dei dati dopo la cancellazione (Data Remanence). Per maggiori informazioni visitare la wikipedia:

http://en.wikipedia.org/wiki/Data_remanence

Esistono tanti programmi, alcuni anche molto costosi, in grado di riscrivere diverse volte dati arbritari sul disco al fine di eliminare la persistenza dei dati (Overwriting) ma io ho pensato che ancora una volta il comando dd poteva essere utile, veloce e sopratutto gratuito.

Per maggiori informazioni sull’uso di dd potete visitare l’articolo:

http://www.morzello.com/?p=28

L’idea di base è quella di utilizzare dd per sovrascrivere il contenuto dell’intero disco eseguendo il comando diverse volte utilizzando /dev/urandom come input.

/dev/urandom sui sistemi unix-like è un file particolare in grado di generare un flusso binario pseudo casuale che viene utilizzato a vari scopi come ad esempio la crittografia.

A questo punto, per cancellare completamente il contenuto di un disco, potremmo impartire il comando:

dd if=/dev/urandom of=/dev/sdX

dove sdX è il disco in questione.
Ovviamente la soluzione proposta presuppone la cancellazione dei dati sull’intero disco e non consente la sovrascittura in caso di singoli file come ad esempio è possibile fare tramite il comando shred ma è comunque un’idea come un’altra di portare a termine il lavoro a basso costo.

Usare shred
shred invece nasce proprio per sovrascrivere e nascondere o cancellare il contenuto di file. Ovviamente, dato che /dev/sdX è anche esso un file, è possibile ottenere un ottimo risultato impartendo il comando:

shred -n N -zv /dev/sdX

dove N è il numero di scritture da fare mentre -z provvede a fare l’ultima scritura con una serie di zeri al fine di nascondere l’esecuzione del programma (come se fosse stato impartito un semplice dd if=/dev/zero of=/dev/sdX).

Alla prossima.

Creazione di una Certification Authority con CentOS/Fedora (Parte II)

Continuando il discorso iniziato nell’articolo precedente, di seguito riportiamo i comandi necessari per installare una propria Certification Authority creata con OpenSSL.

Quasi tutte le installazioni di Linux (Fedora e CentOS compresi) fanno uso di OpenSSL. Per accertarsi che sia installato è sufficiente scrivere nella shell:

OpenSSL

Se tutto è ok comparirà il prompt dei comandi del programma (per uscire scrivere quit e premere invio).

Chi dovesse installare il pacchetto può scrivere invece:

yum install openssl

A differenza di altre distribuzioni, in Red Hat i files di configurazione di OpenSSL risiedono nella cartella “/etc/pki/tls”. Il primo passo consiste nel creare una nuova directory dove conservare tutti i files necessari alla nostra CA. Per non incorrere in problemi dovuti alle policy di selinux, in questo esempio utilizzeremo la cartella “/etc/pki/CA” (l’utente può usare comunque un altro percorso).

Una volta scelta la destinazione è necessario creare alcune sottocartelle:

  • certs – cartella in cui verranno sistemati i certificati;
  • crl – cartella dedicata alla revoca dei certificati;
  • newcerts – cartella utilizzata da openssl per creare i certificati nella forma non criptata
  • private – cartella contenente le chiavi private. Questa cartella dovrebbe essere di sola lettura e trattata con estrema cura dal momento che contiene la parte più intima della CA.

Oltre alle cartelle, bisogna creare alcuni file:

  • index.txt – file che fungerà da database;
  • serial – file che contiene il numero progressivo dei certificati segnati;
  • crlnumber – (facoltativo) contiene il numero successivo da utilizzare nella lista dei certificati revocati;

Per comodità, di seguito trovate i comandi necessari per creare l’ambiente:

cd /etc/pki/CA
mkdir certs crl newcerts private
touch index.txt
echo "01" > serial
chmod 0755 *

Fatto questo, passiamo alla modifica del file di configurazione openssl.cnf che si trova nella cartella /etc/pki/tls. Prima di procedere oltre però sarebbe bene fare una copia di backup.

[ CA_default ]
  dir = /etc/pki/CA
  x509_extensions = v3_ca
  countryName_default = IT
  stateOrProvinceName_default = Calabria
  0.organizationName_default = Catanzaro

In alto abbiamo riportato solo le righe che sono state modificate.

Per quanto concerne il parametro x509_extensions vi sono alcune considerazioni da fare. Si tratta di un parametro che indica quale sezione del file di configurazione prendere in considerazione quando vengono creati i certificati (relativamente alle estensioni x509). Poichè la sezione usr_cert (valore di default) contiene alcuni parametri che devono essere correttamente impostati per creare certificati validi in ambiente MS-Windows, si è preferito sostituirla con v3_ca che non necessita di personalizzazioni; ricordiamo che questo articolo non tratta tutti gli argomenti relativi al file di configurazione di openssl.

Se non sono state apportate modifiche al file di configurazione diverse da quelle specificate in precedenza, per creare una CA è sufficiente impartire il seguente comando:

openssl req -config /etc/pki/tls/openssl.cnf \
    -new -x509 -days 7200 -keyout /etc/pki/CA/private/cakey.pem \
    -out /etc/pki/CA/cacert.pem

É ovvio che i percorsi indicati nel comando devono rispecchiare la configurazione altrimenti il certificato non verrà utilizzato dal sistema operativo. Il certificato creato avrà una durata di 20 anni, probabilmente è un periodo di tempo eccessivo.

A questo punto viene richiesta una pass phrase ed i campi del certificato:

Generating a 1024 bit RSA private key
.................++++++
.........++++++
writing new private key to '/etc/pki/CA/private/cakey.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [GB]:IT
State or Province Name (full name) [Berkshire]:Catanzaro
Locality Name (eg, city) [Newbury]:Catanzaro
Organization Name (eg, company) [My Company Ltd]:Morzello Blog
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:morzello.com
Email Address []:noreply@morzello.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:ScegliUnaPassword
An optional company name []:Morzello Blog

La pass phrase non deve essere intesa come una password, in effetti viene rischiesta una “frase segreta” che dorà essere custodita con cura.

La challenge password invece viene usata per evitare le la chiave privata venga conservata in chiaro sul disco.

Creazione dei certificati

La creazione dei certificati è relativamente semplice e si compone di due fasi: nella prima viene fatta una richiesta di certificazione mentre nella seconda la richiesta viene segnata digitalmente.

In linea di principio non c’è differenza tra i certificati emessi per un server e quelli emessi per un client; a variare è l’uso che se ne fa del certificato. In genere, la chiave privata del certificato non viene conservata in chiaro ma viene anch’essa sottoposta a crittografia mediante la richiesta di una password. Nel caso di servizi server però questa politica è difficilmente applicabile poichè all’avvio del server tipicamente non vi è nessuno in gradi di digitare una password. Conservare la password in chiaro non ha senso e quindi i certificati per i server non contemplano la crittografia per la chiave privata.

Richiesta di certificati server

OpenSSL può essere utilizzato anche per emettere le richieste di certificazione. Di seguito vediamo un esempio applicabile ai certificati server:

openssl req -config /etc/pki/tls/openssl.cnf -new -nodes -days 730 \
     -keyout /etc/pki/CA/private/new.key \
     -out /etc/pki/CA/newcerts/new_req.pem

Il parametro -nodes evita proprio che il certificato venga sottoposto a crittografia triple des.

Dopo aver eseguito il comando si procederà con la compilazione dei campi necessari:

Generating a 1024 bit RSA private key
........++++++
..........++++++
writing new private key to '/etc/pki/CA/private/new.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [GB]:IT
State or Province Name (full name) [Berkshire]:Italy
Locality Name (eg, city) [Newbury]:Torino
Organization Name (eg, company) [My Company Ltd]:Morzello Blog
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:www.morzello.com
Email Address []:noreply@morzello.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:test
An optional company name []:

Richiesta di certificati client

Per i client la richiesta è del tutto simile ma in questo caso, possiamo usare la crittografia a protezione della chiave privata:

openssl req -config /etc/pki/tls/openssl.cnf -new -days 730 \
     -keyout /etc/pki/CA/private/new.key \
     -out /etc/pki/CA/newcerts/new_req.pem

A titolo esemplificativo riportiamo l’output del comando precedente:

Generating a 1024 bit RSA private key
.++++++
.......++++++
writing new private key to '/etc/pki/CA/private/new.key'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [GB]:IT
State or Province Name (full name) [Berkshire]:Calabria
Locality Name (eg, city) [Newbury]:Catanzaro
Organization Name (eg, company) [My Company Ltd]:Morzello Blog
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:client.morzello.com
Email Address []:noreply@morzello.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:test
An optional company name []:

Come è possibile notare, in questo caso viene richiesta una pass phrase per il certificato.

Firmare digitalmente le richieste

Dopo aver creato la richiesta possiamo passare alla sua firma (sign). Per farlo possiamo usare la nostra CA:

openssl ca -config /etc/pki/tls/openssl.cnf \
     -policy policy_anything \
     -out /etc/pki/CA/certs/new.crt \
     -infiles /etc/pki/CA/newcerts/new_req.pem

Il risultato sarebbe del tutto simile al seguente:

Using configuration from /etc/pki/tls/openssl.cnf
Enter pass phrase for /etc/pki/CA/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 1 (0x1)
        Validity
            Not Before: Jun 30 09:18:53 20xx GMT
            Not After : Jun 30 09:18:53 20yy GMT
        Subject:
            countryName               = IT
            stateOrProvinceName       = Calabria
            localityName              = Catanzaro
            organizationName          = Morzello Blog
            commonName                = client.morzello.com
            emailAddress              = noreply@morzello.com
        X509v3 extensions:
            X509v3 Subject Key Identifier:
                0A:AF:2C:D3:55:29:86:33:FC:D2:9A:A4:AF:90:42:AB:BD:17:01:29
            X509v3 Authority Key Identifier:
                keyid:30:16:68:ED:CD:61:20:61:F3:D0:BA:17:35:2A:74:87:E4:D3:A1:32
                DirName:/C=IT/ST=Calabria/L=Catanzaro/O=Vittorio Benintende/CN=client.morzello.com/emailAddress=noreply@morzello.com
                serial:09:DB:34:A3:DA:3F:56:BC

            X509v3 Basic Constraints:
                CA:TRUE
Certificate is to be certified until Jun 30 09:18:53 20xx GMT (365 days)
Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

A questo punto possiamo eliminare la richiesta:

rm /etc/pki/CA/newcerts/new_req.pem

Verifiche e test sui certificati

Per visualizzare le informazioni relative ad un certificato basta indicare gli argomenti che interessano, come ad esempio: l’emittente, la data di scadenza, l’hash md5, il fingerprint, …

openssl x509 -noout -subject -issuer -enddate -hash -fingerprint -in /etc/pki/CA/certs/new.crt

Il parametro -noout indica ad openssl che non c’è un output da gestire.

Per verificare la validità di un certificato si può utilizzare il comando:

openssl verify -CAfile /etc/pki/CA/cacert.pem /etc/pki/CA/certs/new.crt
/etc/pki/CA/certs/new.crt: OK

Installare i certificati in Windows

In Windows l’installazione dei certificati merita un po’ di attenzione perchè è necessario fare una conversione se si utilizza l’esempio riportato in alto. Per metabolizzare il certificato infatti Windows ha bisogno del formato PKCS#12. Per ottenere questo possiamo utilizzare il seguente comando:

openssl pkcs12 -export -in /etc/pki/CA/certs/new.crt \
-inkey /etc/pki/CA/private/new.key -out /etc/pki/CA/certs/new.p12 -clcerts

A questo punto viene eventualmente richiesta la password per l’esportazione del certificato.

Per importare i certificati e le CA all’interno del sistema operativo basta cliccare sul file e seguire le istruzioni del wizard proposte a video. Un certificato può essere installato per il singolo utente o per la macchina (con credenziali amministrative).

Se si desidera avere maggior controllo si può invece utilizzare la Microsoft Management Console (mmc.exe)  aggiungendo l’apposito snap-in:

file -> aggiungi/rimuovi snap-in...
aggiungi -> certificati -> account del computer

Dovreste trovarvi in una situazione simile a quella riportata in foto:


Alla prossima.

OpenVPN – NTLM e quel proxy infame

Questo articolo è rivolto a coloro che hanno problemi a far dialogare OpenVPN con proxy che richiedono autenticazione NTLM.

Al momento della stesura di questo articolo, la versione di ovpn è la 2.1.3, versioni successive a questa potrebbero non soffrire dello stesso male.

Utilizzando l’autenticazione di tipo NTLM ho notato che la comunicazione si interrompe subito dopo l’invio del messaggio di tipo 1 da parte del client. In pratica il proxy non si degna di dare una risposta negativa o positiva che sia.

Per maggiori informazioni sulla comunicazione tipo NTLM potete visitare il sito:

http://davenport.sourceforge.net/ntlm.html

Dando uno sguardo al codice sorgente ho notato che la stringa inviata dal client al proxy è la seguente:

TlRMTVNTUAABAAAAAgIAAA==

ed è una costante definita nel file ntlm.c

Dopo aver portato a termine qualche prova con uno sniffer di rete mi sono accorto che altri prorammi come ad esempio firefox, funzionano perfettamente con il proxy così mi sono chiesto quali fossero le differenze. In effetti il messaggio di fase 1 inviato dal browser è sostanzialmente diverso:

TlRMTVNTUAABAAAAB4IIogAAAAAAAAAAAAAAAAAAAAAFASgKAAAADw==

e sembra essere più gradito.

A questo punto ho modificato il codice sorgente nell’unica riga necessaria:

const char *
ntlm_phase_1 (const struct http_proxy_info *p, struct gc_arena *gc)
{
  struct buffer out = alloc_buf_gc (96, gc);
  /* try a minimal NTLM handshake
   *
   * http://davenport.sourceforge.net/ntlm.html
   *
   * This message contains only the NTLMSSP signature,
   * the NTLM message type,
   * and the minimal set of flags (Negotiate NTLM and Negotiate OEM).
   *
   */
  // buf_printf (&out, "%s", "TlRMTVNTUAABAAAAAgIAAA==");
   buf_printf (&out, "%s", "TlRMTVNTUAABAAAAB4IIogAAAAAAAAAAAAAAAAAAAAAFASgKAAAADw==");
  return (BSTR (&out));
}

e dopo aver ricompilato l’eseguibile, tutto funziona correttamente.

Alla prossima.

Pentaho – Avviare il servizio al boot. Uno script per CentOS, Fedora e RHEL

Ho visto che in giro non è ancora stato pubblicato uno script per l’avvio automatico di pentaho su sistemi linux derivati da Red Hat così ho pensato di mettere online il mio:

#!/bin/bash
#
# chkconfig: - 92 36
# description: Starts and stops pentaho.

# Source function library.
. /etc/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0

unset BASH_ENV ENV

PUSER="pentaho"
PENTAHO_HOME="/opt/pentaho/biserver-ce"
JAVA_HOME="/usr/lib/jvm/jre-1.6.0/"
prog=$"Pentaho server"
logfile="${PENTAHO_HOME}/pentaho.log"

if [ -e "${logfile}" ]; then
    rm -f "${logfile}" > /dev/null
fi

cd ${PENTAHO_HOME}
. "${PENTAHO_HOME}/set-pentaho-java.sh"

if [ -d "${PENTAHO_HOME}/jre" ]; then
    setPentahoJava "${PENTAHO_HOME}/jre" >> ${logfile} 2>&1
else
    setPentahoJava >> ${logfile} 2>&1
fi

PENV="export _PENTAHO_JAVA_HOME=${_PENTAHO_JAVA_HOME} && export _PENTAHO_JAVA=${_PENTAHO_JAVA} && export JAVA_OPTS='-Djava.awt.headless=true' && export JAVA_HOME=${_PENTAHO_JAVA_HOME}"

start() {
    echo -n $"Starting $prog: "

    if [ -e "${PENTAHO_HOME}/promptuser.sh" ]; then
        sh "${PENTAHO_HOME}/promptuser.sh" >> ${logfile} 2>&1
        rm "${PENTAHO_HOME}/promptuser.sh"
    fi

    if [ "$?" = 0 ]; then
        /sbin/runuser -l ${PUSER} -c "${PENV} && cd '${PENTAHO_HOME}/data' && sh ./start_hypersonic.sh & " >> ${logfile} 2>&1 && \
        /sbin/runuser -l ${PUSER} -c "${PENV} && cd '${PENTAHO_HOME}/tomcat/bin' && export CATALINA_OPTS='-Xms256m -Xmx768m -XX:MaxPermSize=256m -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000' && sh ./startup.sh" >> ${logfile} 2>&1 && echo "OK" || echo "ERROR"

    fi

}

stop() {
    echo -n $"Shutting down $prog: "

    /sbin/runuser -l ${PUSER} -c "${PENV} && cd '${PENTAHO_HOME}/data' && sh ./stop_hypersonic.sh & "  >> ${logfile} 2>&1 && \
    /sbin/runuser -l ${PUSER} -c "${PENV} && cd '${PENTAHO_HOME}/tomcat/bin' && sh ./shutdown.sh"  >> ${logfile} 2>&1 && echo 'OK' || echo "ERROR"

}

# See how we were called.
case "$1" in
  start)
	start
	;;
  stop)
	stop
	;;
  restart)
	stop
	sleep 3
	start
	;;
  status)
	ps U 'pentaho' | grep -e 'sh ./start_hypersonic.sh' >> /dev/null && echo "$prog is running" || echo "$prog is stopped"
	;;
  *)
	echo $"Usage: $0 {start|stop|restart}"
	exit 1
esac

Ovviamente sarà necessario configurare le variabili in base alla installazione di Pentaho.

Alla prossima.

MySQL – abilitare l’accesso a root dalla rete

Può capitare a volte di voler accedere all’istanza presente su una macchina dalla quale non è possibile utilizzare strumenti visuali quali:

  • MySQL Administrator
  • MySQL Workbench

è ad esempio il caso di CentOS, dove questi strumenti sono difficili da installare. A mio avviso un metodo veloce per arginare il problema è quello di utilizzare il comando mysql in locale per abilitare l’accesso all’utente root dalla rete. Una volta apportate tutte le modifiche del caso, sarà sufficiente ristabilire le restrizioni volute.

Per accedere alla console di mysql basta usare il comando:

mysql -uroot -p

dopo aver digitato la password ci ritroveremo nell’ambiente del db e potremo abilitare l’accesso dall’esterno con due comandi:

grant all privileges on mysql.* to root@"NOMEPC" identified by 'MIA_PASSWORD';
flush privileges;

Dove NOMEPC è l’indirzzo della macchina dalla quale vogliamo accedere (indicando ‘%’ abilitiamo tutta la rete) e MIA_PASSWORD è la password che vogliamo usare per la connessione.

Ora è possibile fare le modifiche del caso da un altro pc.

Alla prossima.

BackupPC ed errore Perl su CentOS x64

Ho notato che in questi giorni, installando BackupPC su CentOS a 64bit si incorre in un errore al quanto criptico duarante il tentativo di avvio del servizio:

 service backuppc start
Starting BackupPC: Can't locate BackupPC/Lib.pm in @INC (@INC contains: /usr/lib /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/site_perl/5.8.8 /usr/lib/perl5/site_perl /usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.8 /usr/lib/perl5/vendor_perl /usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/5.8.8 .) at /usr/bin/BackupPC line 60.
BEGIN failed--compilation aborted at /usr/bin/BackupPC line 60.
                                                           [FAILED]

Si tratta di un bug che può agevolmente essere risolto ripristinando i riferimenti corretti a Perl all’interno del codice di BackupPC.
Per quanto riguarda il file /usr/bin/BackupPC ad esempio, è necessario sostituire la riga in ‘use lib “/usr/lib”;’:

use strict;
no  utf8;
use vars qw(%Status %Info $Hosts);
use lib "/usr/lib";
use BackupPC::Lib;
use BackupPC::FileZIO;
use Encode qw/decode_utf8/;

con ‘use lib “/usr/lib64″;’:

use strict;
no  utf8;
use vars qw(%Status %Info $Hosts);
use lib "/usr/lib64";
use BackupPC::Lib;
use BackupPC::FileZIO;
use Encode qw/decode_utf8/;

Per evitare di apportare queste modifiche in tutti i punti del codice sorgente, la cosa più comoda è quella di creare un link all’interno della cartella /usr/lib:

cd /usr/lib
ln -s /usr/lib64/BackupPC BackupPC

Ed il gioco è fatto.

Installare BackupPC su CentOS

BackupPc è sicuramente una comoda soluzione per fare il backup di più macchine in rete.
Al momento in cui scrivo, CentOS non prevede un pacchetto all’interno della propria distribuzione, rendendo l’uso del software non proprio agevole. Per questo motivo ho deciso di scrivere questa breve guida che spiega come installare e configurare il software.

Come sempre, prima di partire è bene disabilitare temporaneamente SELinux ed Iptables. Questi verranno riabilitati alla fine dell’installazione:

/usr/sbin/service iptables stop
bash: /usr/sbin/service: No such file or directory
[root@francesca /]# /sbin/service iptables stop
Flushing firewall rules:                                   [  OK  ]
Setting chains to policy ACCEPT: filter                    [  OK  ]
Unloading iptables modules:                                [  OK  ]

Come dicevamo prima, non potendo usare il repository di default, dovremo utilizzarne uno esterno:

yum install backuppc
Loaded plugins: fastestmirror, priorities
Loading mirror speeds from cached hostfile
...
Setting up Install Process
No package backuppc available.
Nothing to do

Abbiamo dunque bisogno di un repository di test. Istruzioni su come attivare repository esterni alla distribuzione sono disponibili qui.

Se avete seguito le istruzioni relative ai repository riportate nell’articolo, potrete installare backuppc tramite il comando:

yum --enablerepo=c5-testing install backuppc mod_perl httpd

Il comando provvederà ad installare anche eventuali dipendenze:

Dependencies Resolved

================================================================================
 Package                       Arch     Version              Repository    Size
================================================================================
Installing:
 backuppc                      i386     3.1.0-1.el5.centos   c5-testing   667 k
Installing for dependencies:
 perl-Archive-Zip              noarch   1.16-1.2.1           base         138 k
 perl-Class-Singleton          i386     1.03-1.2.el5.rf      rpmforge      14 k
 perl-Compress-Raw-Bzip2       i386     2.021-1.el5.rf       rpmforge     108 k
 perl-Compress-Raw-Zlib        i386     2.021-1.el5.rf       rpmforge     169 k
 perl-DateTime                 i386     0.4305-1.el5.rf      rpmforge     134 k
 perl-DateTime-Format-Mail     noarch   0.3001-1.el5.rf      rpmforge      25 k
 perl-DateTime-Format-W3CDTF   noarch   0.04-1.el5.rf        rpmforge      16 k
 perl-DateTime-Locale          noarch   0.4001-1.el5.rf      rpmforge     1.7 M
 perl-DateTime-TimeZone        i386     0.46-1.el5.rf        rpmforge     361 k
 perl-File-RsyncP              i386     0.68-1.el5.rf        rpmforge     179 k
 perl-HTML-Parser              i386     3.55-1.fc6           base          92 k
 perl-HTML-Tagset              noarch   3.10-2.1.1           base          15 k
 perl-IO-Compress              noarch   2.021-1.el5.rf       rpmforge     238 k
 perl-List-MoreUtils           i386     0.25.1-1.el5.rf      rpmforge     104 k
 perl-Params-Validate          i386     0.91-1.el5.rf        rpmforge     104 k
 perl-Time-modules             noarch   2006.0814-1.el5.rf   rpmforge      38 k
 perl-XML-Parser               i386     2.34-6.1.2.2.1       base         210 k
 perl-XML-RSS                  noarch   1.45-1.el5.rf        rpmforge      62 k
 perl-libwww-perl              noarch   5.805-1.1.1          base         376 k

Transaction Summary
================================================================================
Install     20 Package(s)
Update       0 Package(s)
Remove       0 Package(s)

Total download size: 4.7 M

Configurare il frontend
Ora è la volta di Apache che verrà utilizzato come frontend per la gestione dei backup. Seguendo l’HOW-TO riportato sul sito di CentOS la configurazione sarà modificata per consentire l’esecuzione di Apache come utente diverso.
A mio parere questo potrebbe avere implicazioni non trascurabili sulla sicurezza e sull’assetto della distribuzione, senza considerare il fatto che Apache verrebbe dedicato interamente al backup.

Preferisco invece eseguire una seconda istanza del webserver con i soli plug-in necessari a far giare BackupPC. Per questo motivo copiamo il file di configurazione esistente in un nuovo file:

cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/backuppc_httpd.conf

modificando i paramentri essenziali:

PidFile run/backuppc_httpd.pid
Listen 81
User backuppc
#Allow from all

Possiamo inoltre disabilitare tutti i plug-in che non sono necessari al frontend. Per comodità riporto un file di configurazione utile come esempio:

ServerTokens OS
ServerRoot "/etc/httpd"
PidFile run/httpd_backuppc.pid
Timeout 120
KeepAlive Off
MaxKeepAliveRequests 100
KeepAliveTimeout 15
Include conf.d/perl.conf

StartServers       8
MinSpareServers    5
MaxSpareServers   20
ServerLimit      256
MaxClients       256
MaxRequestsPerChild  4000

StartServers         2
MaxClients         150
MinSpareThreads     25
MaxSpareThreads     75
ThreadsPerChild     25
MaxRequestsPerChild  0

Listen 81

LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule auth_digest_module modules/mod_auth_digest.so
LoadModule authn_file_module modules/mod_authn_file.so
LoadModule authn_alias_module modules/mod_authn_alias.so
LoadModule authn_anon_module modules/mod_authn_anon.so
LoadModule authn_dbm_module modules/mod_authn_dbm.so
LoadModule authn_default_module modules/mod_authn_default.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule authz_user_module modules/mod_authz_user.so
LoadModule authz_owner_module modules/mod_authz_owner.so
LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
LoadModule authz_dbm_module modules/mod_authz_dbm.so
LoadModule authz_default_module modules/mod_authz_default.so
#LoadModule ldap_module modules/mod_ldap.so
#LoadModule authnz_ldap_module modules/mod_authnz_ldap.so
LoadModule include_module modules/mod_include.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule logio_module modules/mod_logio.so
LoadModule env_module modules/mod_env.so
LoadModule ext_filter_module modules/mod_ext_filter.so
LoadModule mime_magic_module modules/mod_mime_magic.so
LoadModule expires_module modules/mod_expires.so
LoadModule deflate_module modules/mod_deflate.so
LoadModule headers_module modules/mod_headers.so
LoadModule usertrack_module modules/mod_usertrack.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule mime_module modules/mod_mime.so
#LoadModule dav_module modules/mod_dav.so
LoadModule status_module modules/mod_status.so
LoadModule autoindex_module modules/mod_autoindex.so
LoadModule info_module modules/mod_info.so
#LoadModule dav_fs_module modules/mod_dav_fs.so
LoadModule vhost_alias_module modules/mod_vhost_alias.so
LoadModule negotiation_module modules/mod_negotiation.so
LoadModule dir_module modules/mod_dir.so
LoadModule actions_module modules/mod_actions.so
LoadModule speling_module modules/mod_speling.so
LoadModule userdir_module modules/mod_userdir.so
LoadModule alias_module modules/mod_alias.so
LoadModule rewrite_module modules/mod_rewrite.so
#LoadModule proxy_module modules/mod_proxy.so
#LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
#LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
#LoadModule proxy_http_module modules/mod_proxy_http.so
#LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule cache_module modules/mod_cache.so
LoadModule suexec_module modules/mod_suexec.so
LoadModule disk_cache_module modules/mod_disk_cache.so
LoadModule file_cache_module modules/mod_file_cache.so
LoadModule mem_cache_module modules/mod_mem_cache.so
LoadModule cgi_module modules/mod_cgi.so
LoadModule version_module modules/mod_version.so

#ExtendedStatus On

User backuppc
Group apache

ServerAdmin root@localhost
#ServerName www.example.com:80
UseCanonicalName Off
#DocumentRoot "/var/www/html"
DocumentRoot "/var/lib/backuppc"

    Options FollowSymLinks
    AllowOverride None

    UserDir disable
    #UserDir public_html

DirectoryIndex index.html index.html.var

AccessFileName .htaccess

    Order allow,deny
    Deny from all

TypesConfig /etc/mime.types

DefaultType text/plain

#   MIMEMagicFile /usr/share/magic.mime
    MIMEMagicFile conf/magic

HostnameLookups Off

ErrorLog logs/backuppc_error_log

LogLevel warn

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

CustomLog logs/backuppc_access_log combined

ServerSignature On

Alias /icons/ "/var/www/icons/"

    Options Indexes MultiViews
    AllowOverride None
    Order allow,deny
    Allow from all

    # Location of the WebDAV lock database.
    DAVLockDB /var/lib/dav/lockdb

IndexOptions FancyIndexing VersionSort NameWidth=* HTMLTable

AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip

AddIconByType (TXT,/icons/text.gif) text/*
AddIconByType (IMG,/icons/image2.gif) image/*
AddIconByType (SND,/icons/sound2.gif) audio/*
AddIconByType (VID,/icons/movie.gif) video/*

AddIcon /icons/binary.gif .bin .exe
AddIcon /icons/binhex.gif .hqx
AddIcon /icons/tar.gif .tar
AddIcon /icons/world2.gif .wrl .wrl.gz .vrml .vrm .iv
AddIcon /icons/compressed.gif .Z .z .tgz .gz .zip
AddIcon /icons/a.gif .ps .ai .eps
AddIcon /icons/layout.gif .html .shtml .htm .pdf
AddIcon /icons/text.gif .txt
AddIcon /icons/c.gif .c
AddIcon /icons/p.gif .pl .py
AddIcon /icons/f.gif .for
AddIcon /icons/dvi.gif .dvi
AddIcon /icons/uuencoded.gif .uu
AddIcon /icons/script.gif .conf .sh .shar .csh .ksh .tcl
AddIcon /icons/tex.gif .tex
AddIcon /icons/bomb.gif core

AddIcon /icons/back.gif ..
AddIcon /icons/hand.right.gif README
AddIcon /icons/folder.gif ^^DIRECTORY^^
AddIcon /icons/blank.gif ^^BLANKICON^^

DefaultIcon /icons/unknown.gif

#AddDescription "GZIP compressed document" .gz
#AddDescription "tar archive" .tar
#AddDescription "GZIP compressed tar archive" .tgz

ReadmeName README.html
HeaderName HEADER.html

IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t

AddLanguage ca .ca
AddLanguage cs .cz .cs
AddLanguage da .dk
AddLanguage de .de
AddLanguage el .el
AddLanguage en .en
AddLanguage eo .eo
AddLanguage es .es
AddLanguage et .et
AddLanguage fr .fr
AddLanguage he .he
AddLanguage hr .hr
AddLanguage it .it
AddLanguage ja .ja
AddLanguage ko .ko
AddLanguage ltz .ltz
AddLanguage nl .nl
AddLanguage nn .nn
AddLanguage no .no
AddLanguage pl .po
AddLanguage pt .pt
AddLanguage pt-BR .pt-br
AddLanguage ru .ru
AddLanguage sv .sv
AddLanguage zh-CN .zh-cn
AddLanguage zh-TW .zh-tw

LanguagePriority en ca cs da de el eo es et fr he hr it ja ko ltz nl nn no pl pt pt-BR ru sv zh-CN zh-TW

ForceLanguagePriority Prefer Fallback

AddDefaultCharset UTF-8

AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz

AddHandler type-map var

AddType text/html .shtml
AddOutputFilter INCLUDES .shtml

Alias /error/ "/var/www/error/"

        AllowOverride None
        Options IncludesNoExec
        AddOutputFilter Includes html
        AddHandler type-map var
        Order allow,deny
        Allow from all
        LanguagePriority en es de fr
        ForceLanguagePriority Prefer Fallback

BrowserMatch "Mozilla/2" nokeepalive
BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0
BrowserMatch "RealPlayer 4\.0" force-response-1.0
BrowserMatch "Java/1\.0" force-response-1.0
BrowserMatch "JDK/1\.0" force-response-1.0

BrowserMatch "Microsoft Data Access Internet Publishing Provider" redirect-carefully
BrowserMatch "MS FrontPage" redirect-carefully
BrowserMatch "^WebDrive" redirect-carefully
BrowserMatch "^WebDAVFS/1.[0123]" redirect-carefully
BrowserMatch "^gnome-vfs/1.0" redirect-carefully
BrowserMatch "^XML Spy" redirect-carefully
BrowserMatch "^Dreamweaver-WebDAV-SCM1" redirect-carefully

alias /backuppc /usr/share/backuppc

   SetHandler perl-script
   PerlResponseHandler ModPerl::Registry
   PerlOptions +ParseHeaders
   Options +ExecCGI
   Order deny,allow
   Deny from all
   Allow from 192.168.0
   Allow from 127.0.0.1
   AuthName "Backup Admin"
   AuthType Basic
   AuthUserFile /var/lib/backuppc/passwd/htpasswd
   Require valid-user

Per verificare che il file sia formalmente valido possiamo eseguire un test preliminare:

/usr/sbin/httpd -f /etc/httpd/conf/backuppc_httpd.conf -t
Syntax OK

Prima di provare il servizio impostiamo una password per l’accesso al frontend:

htpasswd -c /var/lib/backuppc/passwd/htpasswd backup_manager
New password: your_password
Re-type new password: your_password
Adding password for user backup_manager

Arriva ora il momento di avviare una seconda instanza di Apache per verificare che tutto sia in ordine:

/usr/sbin/httpd -f /etc/httpd/conf/backuppc_httpd.conf -k start

Se tutto funziona correttamente possiamo procedere con le opportune modifiche necessarie a far partire il servizio all’avvio del sistema. Anche in questo caso faremo una copia del file utilizzato dal webserver:

cp /etc/init.d/httpd /etc/init.d/backuppc_httpd

Anche in questo caso per comodità riporto un esempio:

#!/bin/bash
#
# backuppc_httpd   Startup script for the Apache HTTP Server (BackupPC)
#
# chkconfig: - 90 34
# description: BackupPC stand alone web server 

# Source function library.
if [ -f /etc/init.d/functions ] ; then
. /etc/init.d/functions
elif [ -f /etc/rc.d/init.d/functions ] ; then
. /etc/rc.d/init.d/functions
else
exit 0
fi

# Avoid using root's TMPDIR
unset TMPDIR

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 1

RETVAL=0

start() {
   KIND="BackupPC Web Server"
   echo -n $"Starting  service: "
   /usr/sbin/httpd -f /etc/httpd/conf/backuppc_httpd.conf -k start && echo "OK" || echo "Error"
   RETVAL=0
   echo
   return
}

stop() {
   KIND="BackupPC Web Server"
   echo -n $"Shutting down  services: "
   /usr/sbin/httpd -f /etc/httpd/conf/backuppc_httpd.conf -k stop && echo "OK" || echo "Error"
   RETVAL=0
   echo
   return
}

restart() {
   stop
   sleep 5
   start
}

case "$1" in
start)
   start
   ;;
stop)
   stop
   ;;
restart)
   restart
   ;;
*)
   echo $"Usage: $0 {start|stop|restart}"
   exit 1
esac

exit 0

Useremo chkconfig per rendere il servizio attivo all’avvio:

/sbin/chkconfig backuppc_httpd --add
/sbin/chkconfig --level 2345 backuppc_httpd on

Configurare BackupPC
Finito con il frontend passiamo a personalizzare il file /etc/BackupPC/config.pl che contiene i parametri necessari al backup. L’articolo si occupa di spiegare come configuare CentOS per la corretta esecuzione del pacchetto. Per maggiori informazioni è necessario seguire l’help online.

Una modifca importante da fare però riguarda la necessità di dover dare all’utente backuppc l’accesso all’intero file system tramite il comando tar altrimenti non sarà possibile procedere con il backup completo del sistema. Editiamo il file /etc/sudoers impostando i seguenti parametri:

#Defaults    requiretty
Defaults !lecture

backuppc ALL=NOPASSWD:/bin/gtar,/bin/tar

Come abbiamo già fatto per il frontend, possiamo abilitare l’avvio automatico del servizio tramite chkconfig:

chkconfig backuppc on

Prima di concludere
Al momento in cui scrivo questo articolo, esiste un piccolo baco facile da risolvere. Se per caso i link alla documentazione in linea non dovessero funzionare, potete eseguire i seguenti comandi per ripristinarli:

mkdir /usr/doc
ln -s /usr/share/doc/backuppc*/BackupPC.html /usr/doc/BackupPC.html

Alla prossima.