svnsync: creare un repository di backup con svnsync

A partire dalla release 1.4, Subversion ha reso disponibile il supporto per il mirroring dei repository.
In questo post, descrivo un setup molto utile a chi pone particolare attenzione alla sicurezza e desidera avere un repository

svn con diritti di lettura/scrittura in DMZ, accessibile ad esempio solo dalla propria rete interna o tramite VPN,

e un repository di sola lettura su una macchina remota, accessibile da Internet.
Host master: server svn principale in DMZ, i developer ci accedono solo tramite svn+ssh

Host slave: server svn di backup accessibile da chiunque, i developer non hanno accesso in scrittura, ci si accede anche tramite protocolli insicuri (svnserve, http).

Configurazione di “master”

Aggiungete un account “svnuser” e acquisite i suoi privilegi:

adduser svnuser
su - svnuser

Inizializzate il repository che ospiterà il vostro progetto con:

svnadmin create /var/lib/svn/myproject

Importate i sorgenti esistenti del progetto con:

cd /path/to/mysources
mkdir trunk
mv * trunk/
mkdir branches tags
svn import . file:///var/lib/svn/myproject/ -m 'Initial import'

Create una chiave ssh per l’utente “svnuser” con:

$ ssh-keygen -t rsa

Alla richiesta della passphrase, premete invio due volte, lasciandola quindi vuota.
Create il file ~svnuser/.ssh/authorized_keys con il seguente contenuto:

no-port-forwarding,no-X11-forwarding,no-agent-forwarding,command="/usr/bin/svnserve -t --tunnel-user=joe -r /var/lib/svn" ssh-rsa AAAAB3Nz....

no-port-forwarding,no-X11-forwarding,no-agent-forwarding,command="/usr/bin/svnserve -t --tunnel-user=tommy -r /var/lib/svn" ssh-rsa AAAAB3sa....

no-port-forwarding,no-X11-forwarding,no-agent-forwarding,command="/usr/bin/svnserve -t --tunnel-user=bob -r /var/lib/svn" ssh-rsa AAAAB4ds....

dove joe, tommy e bob sono gli username degli sviluppatori, “ssh-rsa AAAA….” sono le loro rispettivi chiavi pubbliche ssh.
Verificate che ~svnuser/.ssh e authorized_keys abbiano i permessi corretti:

$ chmod 700 ~svnuser/.ssh
$ chmod 600 ~svnuser/.ssh/authorized_keys

Configurazione di “slave”:

Aggiungete un utente dedicato: svnsync
Create il repository:

# svnadmin create /var/lib/svn/myproject

e configurate un hook per i revprop change, ovvero create il file /var/lib/svn/myproject/hooks/pre-revprop-change con il seguente contenuto:

REPOS="$1"
REV="$2"
USER="$3"
PROPNAME="$4"
ACTION="$5"

USER="$3"

if [ "$USER" = "svnsync" ]; then exit 0; fi

echo "Only the svnsync user can change revprops"
exit 1

Assicuratevi che abbia i permessi di esecuzione con:

$ chmod a+x /var/lib/svn/myproject/hooks/pre-revprop-change

Copiate il contenuto del file ~svnuser/.ssh/id_rsa.pub presente su “Master” all’interno del file ~svnsync/.ssh/authorized_keys su “Slave”.

Assicuratevi che i permessi su Slave siano corretti:

chmod 700 ~svnsync/.ssh/
chmod 600 ~svnsync/.ssh/authorized_keys

Eseguire la prima sincronizzazione

Ora potete inizializzare la sincronizzazione. Entrate su “Master” come utente “svnuser” e lanciate:

svnsync init --username svnsync svn+ssh://svnsync@slave/myproject file:///var/lib/svn/myproject

Se avete seguito le istruzioni attentamente, otterrete come risposta:

Copied properties for revision 0.

A questo punto potete eseguire la prima sincronizzazione manualmente con:

/usr/bin/svnsync --non-interactive sync svn+ssh://svnsync@slave/myproject/

A seconda delle dimensioni del vostro repository e della velocità di connessione di Master e Slave, la prima sincronizzazione potrebbe impiegare da pochi minuti a qualche ora.
Una volta completata, sempre su Master, create il file /var/lib/svn/myproject/hooks/post-commit con il seguente contenuto:

/usr/bin/svnsync --non-interactive sync svn+ssh://svnsync@slave/myproject/ &

e anche il file /var/lib/svn/myproject/hooks/post-revprop-change contenente:

/usr/bin/svnsync copy-revprops --username svnsync svn+ssh://svnsync@slave/var/lib/svn/myproject/ $REV &

Assicuratevi che abbiano i permessi di esecuzione:

$ chmod a+x /var/lib/svn/myproject/hooks/post-commit
$ chmod a+x /var/lib/svn/myproject/hooks/post-revprop-change

Conclusione

Il setup presentato presenta vantaggi sia dal punto di vista della sicurezza che della ridondanza.
La sincronizzazione dei dati avviene tramite ssh, quindi ne garantisce l’integrità.
L’accesso al server “Master” è ristretto al minimo indispensabile.
Volendo garantire la disponibilità del repository svn pubblico, è possibile realizzare N mirror del medesimo repository, ripetendo la procedura descritta per “Slave” su più host e aggiungendo una riga per ognuno di essi in post-commit e post-revprop-change su “Master”.

Concludo con un suggerimento: se volete che il server vi invii una e-mail con il diff dei sorgenti ogni volta che viene effettuato un commit, aggiungete la seguente riga a post-commit su “Master”:

/usr/share/subversion/hook-scripts/commit-email.pl "$REPOS" "$REV" -s 'SVN:' -h master.localdomain --from noreply@master.localdomain joe@email.com

Dove noreply@master.localdomain è l’indirizzo del mittente e joe@email.com l’indirizzo del destinatario.

Il percorso di commit-email.pl varia a seconda della vostra distribuzione. Un find / -name commit-email.pl vi aiuterà a localizzarlo.

Se volete potete contattarmi.

Share
 
  1. No comments posted yet

Leave a comment

You must be logged in to post a comment.