Archive for the 'BSD' Category

kit de survie SVN Mercredi, octobre 31st, 2007

voici deux références bien utiles pour l’utilisation quotidienne de svn:

sauvegarde cryptée de serveur à serveur Lundi, octobre 8th, 2007

J’ai un serveur pro (renater réseau de la recherche) et un serveur perso (dedibox groupe illiade).
Tous les deux tournent sur FreeBSD.
Je souhaite effectuer une synchro de mes sites web à j -1 d’un serveur à l’autre.
Vu les débits de chaque serveur ça doit pouvoir se passer dans la nuit.
L’idée c’est de faire ça bien mais quand même un peu à la sauvage donc j’utiliserai rsync plutôt que rsnapshot.
je vais effectuer le rsync via ssh ce qui me permettra de crypter la copie.
Au préalable il faut bien sûr avoir installé openSSH et rsync.

La suite est une traduction très libre de http://troy.jdmz.net/rsync/index.html,  je la poserai sur onfamp plus tard, elle est intéressante parce que sécuritaire

Préparation de thishost

D’abord vérifier que rsync est installé et qu’il fonctionne via ssh. Je préfère m’assurer que ça fonctionne avant d’automatiser, donc je teste cette commande avec les droits de thisuser

$ rsync -avz -e ssh remoteuser@remotehost:/remote/dir /this/dir/

je tape le mot de passe au prompt et mes deux dossiers ont le même contenu. thisuser doit évidemment avoir les droits corrects sur les deux répertoires.
il faut maintenant générer une paire clé publique / clé privée avec un mot de passe vide pour pouvoir se loguer en ssh sans mot de passe. Ca paraît un peu dangereux, mais c’est quand même mieux que de stocker son mot de passe en claire dans le script. Et puis je peux limiter un peu le champs d’action de cette clé. Bref je génère cette clé que j’utiliserai sur thishost (en tant que thisuser) :

$ ssh-keygen -t dsa -b 2048 -f /home/thisuser/cron/thishost-rsync-key
Generating public/private dsa key pair.
Enter passphrase (empty for no passphrase): [press enter here]
Enter same passphrase again: [press enter here]
Your identification has been saved in /home/thisuser/cron/thishost-rsync-key.
Your public key has been saved in /home/thisuser/cron/thishost-rsync-key.pub.
The key fingerprint is:
2e:28:d9:ec:85:21:e7:ff:73:df:2e:07:78:f0:d0:a0 thisuser@thishost

On a maintenant une clé avec aucun mot de passe répartie en deux fichiers. Assurez vous qu’aucun utilisateur non autorisé ne puisse lire le fichier de la clé privée (celui qui n’a pas l’extension .pub)

Cette clé ne sert à rien tant qu’on n’a pas mis sa partie publique dans le fichier  ‘authorized_keys’ du remotehost, et en partculier celui de thisuser

/usr/home/remoteuser/.ssh/authorized_keys

J’utilise scp (secure copy) pour copier le fichier sur remotehost

$ scp /usr/home/thisuser/cron/thishost-rsync-key.pub remoteuser@remotehost:/usr/home/remoteuser/

Et maintenant je peux préparer remotehost

Configurer remotehost

Je me connecte en ssh sur remotehost.

$ssh remoteuser@remotehost
remoteuser@remotehost’s password: [type correct password here]

Je dois m’assurer que j’ai bien les bons répertoires et les bons fichiers pour l’autoristation

$ if [ ! -d .ssh ]; then mkdir .ssh ; chmod 700 .ssh ; fi
$ mv thishost-rsync-key.pub .ssh/
$ cd .ssh/
$ if [ ! -f authorized_keys ]; then touch authorized_keys ; chmod 600 authorized_keys ; fi
$ cat thishost-rsync-key.pub >> authorized_keys

Maintenant on peut utiliser la clé pour se connecter à ce serveur, mais les connexions peuvent se faire à partir de n’importe où (ce que le démon ssh de remotehost autorise comme connexion) et peuvent tout faire (ce que remoteuser peut faire), et ça ça ne me plaît pas. J’édite le ‘authorized_keys’ et je modifie la ligne avec les informations de ‘thishost-rsync-key.pub’. Je ne vais changer que peu de chose au début de ce qu’il y a déjà, modifier les lignes comme suit:

ssh-dss AAAAB3NzaC1kc3MAAAEBAKYJenaYvMG3nHwWxKwlWLjHb77CT2hXwmC8Ap+fG8wjlaY/9t4u
A+2qx9JNorgdrWKhHSKHokFFlWRj+qk3q+lGHS+hsXuvta44W0yD0y0sW62wrEVegz+JVmntxeYc0nDz
5tVGfZe6ydlgomzj1bhfdpYe+BAwop8L+EMqKLS4iSacNjoPlHsmqHMnbibn3tBqJEq2QJjEPaiYj1iP
5IaCuYBhuTKQGa+oyH3mXEif5CKdsIKBj46B0tCy0/GC7oWcUN92QdLrUyTeRJZsTWsxKpRbMliD2pBh
4oyX/aXEf8+HZBrO5vQjDBCfTFQA+35Xrd3eTVEjkGkncI0SAeUAAAAVAMZSASmQ9Pi38mdm6oiVXD55
Kk2rAAABAE/bA402VuCsOLg9YS0NKxugT+o4UuIjyl6b2/cMmBVWO39lWAjcsKK/zEdJbrOdt/sKsxIK
1/ZIvtl92DLlMhci5c4tBjCODey4yjLhApjWgvX9D5OPp89qhah4zu509uNX7uH58Zw/+m6ZOLHN28mV
5KLUl7FTL2KZ583KrcWkUA0Id4ptUa9CAkcqn/gWkHMptgVwaZKlqZ+QtEa0V2IwUDWS097p3SlLvozw
46+ucWxwTJttCHLzUmNN7w1cIv0w/OHh5IGh+wWjV9pbO0VT3/r2jxkzqksKOYAb5CYzSNRyEwp+NIKr
Y+aJz7myu4Unn9de4cYsuXoAB6FQ5I8AAAEBAJSmDndXJCm7G66qdu3ElsLT0Jlz/es9F27r+xrg5pZ5
GjfBCRvHNo2DF4YW9MKdUQiv+ILMY8OISduTeu32nyA7dwx7z5M8b+DtasRAa1U03EfpvRQps6ovu79m
bt1OE8LS9ql8trx8qyIpYmJxmzIdBQ+kzkY+9ZlaXsaU0Ssuda7xPrX4405CbnKcpvM6q6okMP86Ejjn
75Cfzhv65hJkCjbiF7FZxosCRIuYbhEEKu2Z9Dgh+ZbsZ+9FETZVzKBs4fySA6dIw6zmGINd+KY6umMW
yJNej2Sia70fu3XLHj2yBgN5cy8arlZ80q1Mcy763RjYGkR/FkLJ611HWIA= thisuser@thishost

en

from="10.1.1.1",command="/home/remoteuser/cron/validate-rsync" ssh-dss AAAAB3Nza
C1kc3MAAAEBAKYJenaYvMG3nHwWxKwlWLjHb77CT2hXwmC8Ap+fG8wjlaY/9t4uA+2qx9JNorgdrWKhH
SKHokFFlWRj+qk3q+lGHS+hsXuvta44W0yD0y0sW62wrEVegz+JVmntxeYc0nDz5tVGfZe6ydlgomzj1
bhfdpYe+BAwop8L+EMqKLS4iSacNjoPlHsmqHMnbibn3tBqJEq2QJjEPaiYj1iP5IaCuYBhuTKQGa+oy
H3mXEif5CKdsIKBj46B0tCy0/GC7oWcUN92QdLrUyTeRJZsTWsxKpRbMliD2pBh4oyX/aXEf8+HZBrO5
vQjDBCfTFQA+35Xrd3eTVEjkGkncI0SAeUAAAAVAMZSASmQ9Pi38mdm6oiVXD55Kk2rAAABAE/bA402V
uCsOLg9YS0NKxugT+o4UuIjyl6b2/cMmBVWO39lWAjcsKK/zEdJbrOdt/sKsxIK1/ZIvtl92DLlMhci5
c4tBjCODey4yjLhApjWgvX9D5OPp89qhah4zu509uNX7uH58Zw/+m6ZOLHN28mV5KLUl7FTL2KZ583Kr
cWkUA0Id4ptUa9CAkcqn/gWkHMptgVwaZKlqZ+QtEa0V2IwUDWS097p3SlLvozw46+ucWxwTJttCHLzU
mNN7w1cIv0w/OHh5IGh+wWjV9pbO0VT3/r2jxkzqksKOYAb5CYzSNRyEwp+NIKrY+aJz7myu4Unn9de4
cYsuXoAB6FQ5I8AAAEBAJSmDndXJCm7G66qdu3ElsLT0Jlz/es9F27r+xrg5pZ5GjfBCRvHNo2DF4YW9
MKdUQiv+ILMY8OISduTeu32nyA7dwx7z5M8b+DtasRAa1U03EfpvRQps6ovu79mbt1OE8LS9ql8trx8q
yIpYmJxmzIdBQ+kzkY+9ZlaXsaU0Ssuda7xPrX4405CbnKcpvM6q6okMP86Ejjn75Cfzhv65hJkCjbiF
7FZxosCRIuYbhEEKu2Z9Dgh+ZbsZ+9FETZVzKBs4fySA6dIw6zmGINd+KY6umMWyJNej2Sia70fu3XLH
j2yBgN5cy8arlZ80q1Mcy763RjYGkR/FkLJ611HWIA= thisuser@thishost

Où "10.1.1.1" est l’IP de thishost, et "/home/remoteuser/cron/validate-rsync" est le script qui ressemble à quelque chose du genre

#!/bin/sh

case "$SSH_ORIGINAL_COMMAND" in
*&*)
echo "Rejected"
;;
*(*)
echo "Rejected"
;;
*{*)
echo "Rejected"
;;
*;*)
echo "Rejected"
;;
*<*)
echo "Rejected"
;;
*`*)
echo "Rejected"
;;
rsync –server*)
$SSH_ORIGINAL_COMMAND
;;
*)
echo "Rejected"
;;
esac

si thishost a une adresse variable, enlever le 10.1.1.1, la partie de la ligne (incluant la virgule), mais laisser la partie ‘commande’. Comme ça seule la commande rsync sera accessible avec cette clé. Assurez vous que ‘validate-rsync’ est exécutable par remoteuser sur remotehost et tester le.

NB : La clé privée, est maintenant limitée dans ce qu’elle peut faire (et aussi d’où elle peut le faire), elle autorise son possesseur à copier n’importe quel fichier  de remote hostauquel remotuser accès. Ceci est dangereux et je devrais prendre toutes les précautions que j’estime nécessaire pour maintenir la sécurité du système et le secret de cette clé.
Une possibilité serait d’assigner des permissions correctes à ce fichier, une autre d’envisager l’utilisation d’un "key caching daemon", et enfin me demander si j’ai vraiment besoin de ce script par rapport au risque encouru.

NB2: Un autre détail de sécurité est la configuration du démon ssh sur remote host. Cet exemple se base sur un ustilisateur qui n’est pas root. Je recommande de ne pas utiliser root comme utilisateur distant pour accéder à tous les fichiers de remotehost. Cette permissions est dangeruese à elle seule, et les risques encourus sur les erreurs ou les mauvaises configuration, plus gros qu’avec un utilisateur normal.
Si vous n’utilisez pas du tout root comme utilisateur distant, et que vous voulez encore sécurisé remotehost, je recommande :

PermitRootLogin forced-commands-only

ou

PermitRootLogin forced-commands-only

dans le fichier ‘/etc/ssh/sshd_config’ de remotehost. Ceux sont des paramètres globaux, pas juste liés à cette connexion, donc vérifiez bien que vous n’avez pas besoin de fonctionnalités que cette configuration interdit.

les entrées ‘AllowUsers’, ‘AllowGroups’, ‘DenyUsers’, et ‘DenyGroups’ peuvent être utilisées pour restreindre l’accès SSH par utilisateur ou par groupe.  Elles sont documentées dans le man de "sshd_config", mais je dirais juste qu’elles utilisent ‘*’ et ‘?’ comme caractères jokers pour autoriser ou interdire les utilisateur et les groupes par expressions régulières. ‘AllowUsers’ et ‘DenyUsers’ peuvent aussi interdire par machine distante avec le motif USER@HOST form.

Maintenant j’ai une clé sans mot de passe dans ma configuration, je vais la tester avant de la planifier. je me délogue de remotehost et j’essaie

$ rsync -avz -e "ssh -i /home/thisuser/cron/thishost-rsync-key" remoteuser@remotehost:/remote/dir /this/dir/

Si ca ne marche pas, j’enleverai la restriction "commande" sur la clé et je réessaierai. Si le mot de passe est demandé je vérifierais les permissions de la clé privée (sur thishost ce doit être 600), et sur ‘authorized_keys’ (sur remotehost, ce doit être 600), et sur le répertoire ‘~/.ssh/’ (sur les deux machines ce doit être). S’il ya quelques messages d’erreur de protocol de cryptage dans ‘rsync’ mentionnant le script ‘validate-rsync’, je vérifierais les permissions de  ‘validate-rsync’ (sur remotehost, ce doit être 755 si tous les utilisateurs de remotehost sont sur) qui doivent être ‘lecture’ et ‘exécution’ pour  remoteuser.

La dernière étape est de planifier le script. J’utilise un truc comme ça

#!/bin/sh

RSYNC=/usr/bin/rsync
SSH=/usr/bin/ssh
KEY=/home/thisuser/cron/thishost-rsync-key
RUSER=remoteuser
RHOST=remotehost
RPATH=/remote/dir
LPATH=/this/dir/

$RSYNC -az -e "$SSH -i $KEY" $RUSER@$RHOST:$RPATH $LPATH

C’et ainsi plus adaptable pour les différents machines et user. Je l’appellerais normalement ‘rsync-remotehost-backups’ s’il contenait des sauvegrades. Je teste le script juste au cas où j’aurais fait une erreur quelque part.

Quand le script s’est exécuté correctement, j’utilise crontab -e pour mettre une nouvelle ligne dans ma table de cron

0 5 * * * /home/thisuser/cron/rsync-remotehost-backups

Pour une sauvegarde quotidienne à 5h00 (du matin)

0 5 * * 5 /home/thisuser/cron/rsync-remotehost-backups

Pour une sauvegarde hebdomadaire à 5h00 (du matin les vendredi)

symfony class_implements() & iconv() sur un BSD Vendredi, avril 13th, 2007

Call to undefined function iconv()
Call to undefined function class_implements()

SI vous avez ces messages au court de vos développements symfony c’est que PHP5 n’est pas compilé avec les bons flags:
Pour iconv() extension iconv

portinstall php5-iconv

Pour class_implements() extension spl

portinstall php5-spl