Archive for admin

Petite installation d’un serveur samba avec authentification unix

J’ai eu le besoin de configurer un serveur samba pour des utilisateurs linux et windows, mais je n’arrive pas à trouver de solution d’administration satisfaisante. Le serveur de partage est hébergé sur un serveur debian.
Tout d’abord, rappelons que samba est une implémentation unix du partage de fichier au format NTFS de windows. Il permet de mettre à disposition des fichiers sur un réseau pour tous les utilisateurs d’un lan, avec une gestion des droits assez fine. J’ai personnellement une nette préférence pour NFS, mais bien entendu, NFS n’est pas disponible pour les utlisateurs windows.

Pour l’installer, pas de soucis:

apt-get install samba samba-common

Le fichier de configuration est /etc/samba/smb.conf . Le fichier d’installation de base de debian est une mine d’information.

Les aspects de sécurité sont importants dans l’installation d’un montage Samba.

-Les users autorisés à se connecter sont des utilisateurs unix du serveurs
-Leurs mots de passe (unix et samba) sont synchronisés dans le sens unix vers samba. Toutefois l’implémentation que j’ai de cette synchronisation a un défaut majeur qui la rend selon presque inutilisable. Nous verrons cela plus bas.

-On restreint les interfaces en écoute et on met des iptables pour restreindre l’accés à certains ports (ceux de nmbd et smbd, les démons utilisés).

Je vous donne ici les seuls paramètres que j’ai changés par rapport au smb.conf d’origine:

# interfaces sur laquelle tourne le serveur samba
interfaces = 192.168.3.0/24
# bind seulement sur les interfaces ci-dessus
bind interfaces only = yes
# tout utilisateur samba doit être un utilisateur unix
security = user
# le home de root ne peut pas être un partage et root ne peut pas se connecter
invalid users = root
# le nombre max de partages utilisateurs
usershare max shares = 10

Ce qui nous donne:

[global]
workgroup = WORKGROUP
server string = %h server
;   wins server = w.x.y.z
dns proxy = no
;   name resolve order = lmhosts host wins bcast
interfaces = 192.168.3.0/24
bind interfaces only = yes
log file = /var/log/samba/log.%m
max log size = 1000
syslog = 0
panic action = /usr/share/samba/panic-action %d
security = user
invalid users = root
encrypt passwords = true
passdb backend = tdbsam
obey pam restrictions = yes
unix password sync = yes
passwd program = /usr/bin/passwd %u
passwd chat = *Entersnews*spassword:* %nn *Retypesnews*spassword:* %nn *passwordsupdatedssuccessfully* .
pam password change = no
usershare max shares = 10
[homes]
comment = Home Directories
browseable = no
read only = no
create mask = 0700
directory mask = 0700
valid users = %S
donne pour le fichier dans son ensemble:

Afin de pouvoir synchroniser les mots de passe, j’ai besoin de libpam-smbpass :

apt-get install libpam-smbpass

Afin de pouvoir utiliser ce module PAM pour synchroniser les users, j’ai besoin de modifier les fichiers suivants:
/etc/pam.d/common-password

password   required   pam_unix.so nullok obscure md5
password   required   pam_smbpass.so nullok use_authtok try_first_pass

/etc/pam.d/common-auth

auth    required        pam_unix.so nullok_secure
auth    optional        pam_smbpass.so migrate

Ce dernier, par l’option migrate, permet de modifier (et créer) les utilisateurs samba quand on modifie le mot de passe par passwd. La restriction que j’exprimais est que le mot de passe n’est effectivement changé en base smb que quand l’utilisateur se sera loggé sur son compte par mot de passe. Ceci est particulièrement contraignant dans l’administration du système au quotidien et je suis à la recherche d’autres solutions.

Par conséquent pour activer un compte blah:

$useradd -m blah
$passwd blah

Attention pour être en base smb, le user doit maintenant se logger lui-même.

Comment utiliser le système?
Sur un poste linux:

sudo mkdir /mnt/blah
sudo mount -t smbfs //192.168.3.253/blah /mnt/blah -o user=blah,password=xxxxxx,uid=1000

où user blah est le user distant, password est le mot de passe et uid est l’uid de l’utilsateur local qui utilisera /mnt/blah. Sinon, il n’aura pas les droits en écriture.

Sur un poste windows: je ne sais pas bien, mais cela se fait en quelques clics, non?

Afin de sécuriser l’accès aux services, en ne l’autorisant que depuis le réseau local, j’applique les iptables suivantes:

iptables -A INPUT -p udp -m udp  --dport 137 -j DROP
iptables -A INPUT -p udp -m udp  --dport 138 -j DROP
iptables -A INPUT -p udp -m udp  -s 192.168.3.0/24 --dport 137 -j ACCEPT
iptables -A INPUT -p udp -m udp  -s 192.168.3.0/24 --dport 138 -j ACCEPT

En conclusion, je ne peux pas me satisfaire de cette solution, mais c’est la seule que j’ai pour le moment. Si quelqu’un a d’autres idées, je suis preneur!

Posted in admin | Leave a comment

Un petit conseil openvpn pour la route

Bonjour,

Presque un an que je n’ai pas écrit ici. Je ne m’en satisfais pas car cette année encore, la communauté open-source m’a enrichi d’idées, de nouveautés, de méthodes et de nouveaux softs toujours plus performants. Alors, stephbul parle à stephbul:

“Et toi, stephbul, qu’as-tu fait pour la communauté?” Pas grand chose répond stephbul, pas grand chose.

Ce petit conseil est une goutte d’eau dans la marée heureuse de l’open-source, mais il est bien utile.

Vous avez des services qui ont besoin d’écouter sur votre interface tun0 créée par openvpn, mais ce service est lancé avant openvpn. Que va-t-il se passer? Ou le service écoutera sur les autres interfaces ou le service ne démarrera pas. Et si le service openvpn est soudainement arrêté, que se passera-t-il?  Que faire?

Plusieurs méthodes vont sourdre des esprits. Une seule méritera qu’on la retienne!

A jeter dans /dev/null:

-Le cron qui reloadera le service… Je suis sûr que certains y ont pensé! Voire, certains plus malins que les autres ne reloaderont le service que si tun0 est up, ce qu’ils auront testés par un [ ! -z “`ifconfig | grep tun0`” ]… brrrr, j’en ai des frissons.

-Changer l’ordre des initscripts avec update-rc.d… Très mauvais, car ce n’est pas l’ordre de démarrage qui compte. Il faut juste que les services soient lancés alors que tun0 est up. Si les initscripts sont rapprochés, votre service aura été appelé après openvpn, mais tun0 ne sera pas encore up pour autant.

Non, la seule solution à garder est celle offerte par openvpn lui même:

-L’option –up cmd . Celle-ci permet d’exécuter une commande, un script au moment où l’interface devient up . Je recommande donc de mettre dans le fichier /etc/default/openvpn:


OPTARGS="--script-security 2 --up monscript.sh"

Le script-security 2 permet d’exécuter un code tiers, nécessaire pour exécuter monscript.sh, en charge de recharger les services.

Je vous laisse deviner ce que peut signifier l’option –down .

Posted in admin, openvpn, shell | 2 Comments

Des soucis de disque dur

Lors de la panne d’un disque dur, il me semble que personne n’a pu éviter de penser que ce n’était vraiment pas le moment. Quand il s’agit d’un serveur sur lequel est hébergé des services (ce blog notamment), il faut réagir vite pour ne pas frustrer les innombrables lecteurs que vous êtes. La panne d’un disque a des effets différents et par chance, par moment, elle s’annonce par quelques symptômes avant-coureur, des petits bruits, des problèmes de système de fichier. Hier, ce ne sont pas des bruits qui m’ont alerté puisque ma machine se trouve à environ 250 km de mon domicile, mais l’impossibilité d’effectuer certaines commandes unix, celles qui nécessitaient notamment l’écriture dans ma partition / de mon file system.

La commande dmesg du serveur sous une distribution linux ubuntu server me renseignait alors très bien:

[1815129.630045] hda: dma_intr: status=0x51 { DriveReady SeekComplete Error }
[1815129.630055] hda: dma_intr: error=0x40 { UncorrectableError }, LBAsect=61642, high=0, low=61642, sector=61639
[1815129.630069] ide: failed opcode was: unknown
[1815129.630076] end_request: I/O error, dev hda, sector 61639
[1815129.630136] journal_bmap: journal block not found at offset 7180 on hda1
[1815129.630167] Aborting journal on device hda1.
[1815129.631994] journal commit I/O error
[1815129.632192] ext3_abort called.
[1815129.632211] EXT3-fs error (device hda1): ext3_journal_start_sb: Detected aborted journal
[1815129.632237] Remounting filesystem read-only

L’impossibilité d’accéder à certains secteurs avait obligé ext3 à placer la partition / en read-only. La partition /home n’est pas passée en lecture seule, enfin pas encore et il est préférable d’agir immédiatement, en prenant le temps d’aller vite et garder son calme.

La principale contrainte: faire du back-up rapide en évitant les écritures sur le disque.

Sauvegarder ce blog utilisant le moteur de blog wordpress:
Impossible de faire un dump de la base sql, puisque mysqldump a besoin d’écrire dans /tmp. Il va donc falloir faire une copie de l’arborescence. Ce n’est pas une solution à recommander, mais c’est la seule que j’ai. Je vais devoir récupérer /var/lib/mysql

Backuper /home:
La dernière version de son backup est évidemment trop ancienne.

Backup les confs:
La mauvaise gestion de mes arborescences de configuration est flagrante, elles sont toutes dans /etc, ce qui m’oblige aussi à le sauvegarder. Je ne m’y referai plus prendre, elles seront toutes, c’est décidé, dans /home/user/etc afin que la sauvegarde soit plus simple.

Bien, comment faire un backup de tout cela qui soit rapide?
-scp? Non, trop lent, pas besoin de chiffrer, d’autant que je passe déjà par un vpn, l’overhead de chiffrement de ssh ne me satisfait pas.
-L’élégant tar, tar cvf – /source-dir | ssh user@backup-server.home “cat > /backup/source-dir.tar n’est pas plus souhaitable, pour la même raison.
-Puis, toujours dans l’idée d’aller lentement pour aller vite, je parle à iMil de mes soucis. Il me glisse l’idée de passer par netcat pour effectuer un back-up rapide. Je ne connais pas et l’idée de prendre le temps d’apprendre, là maintenant, dans la panade ne me me plait pas d’emblée. Je dois prendre le temps, mais tout de même. Le principe est d’écouter sur un port d’un côté et de mettre dans stdout ce qu’on y reçoit, et d’envoyer stdin de l’autre machine sur ce port. L’intérêt est alors de l’associer à tar. L’idée fait son chemin. Quelques minutes plus tard:

$ man netcat

me donne nc – TCP/IP swiss army knife. J’aime bien l’idée.

Après quelques essais, j’obtiens sur la machine où je veux backuper:

$ netcat -l 3869 | tar xfp -

Cette commande met en écoute netcat sur le port 3869 et envoie le résultat vers le stdin (-) de tar pour l’extraire.

Sur la machine que je veux backuper:

$ tar cvfp - source-dir | netcat host 3869

où source-dir est le répertoire à sauvegarder sur la machine host.
Comme je ne sais pas si tar -z a besoin des droits d’accès en écriture, j’évite de l’utiliser. Si d’ailleurs quelqu’un a la réponse, il peut me laisser un petit comment.

La phase la plus difficile est de prioriser le backup sans rien oublier. Je pense la phrase “Tu n’as rien oublié?” complètement inutile et parfaitement stupide. Le risque d’oubli n’est pas nul, et comme je ne peux pas envisager faire un backup total de la machine qui serait beaucoup trop long et inutile, il faut se concentrer, faire le tour de l’arborescence, puis refaire un tour… et se lancer.

Se lancer, cela veut dire, ouvrir un ticket chez le hoster de mon serveur dédié. Je dois reconnaître qu’OVH, mon hoster a été très rapide pour intervenir. Deux heures plus tard, mon disque était changé, l’install d’une debian 5.0 terminée. J’abandonnai ubuntu pour debian.

Il me reste à cet instant l’install, la config de tous les services, aussi proprement que possible pour faciliter les backups.

Je vous fais une liste des opérations que j’ai effectuées pour avoir mon service up and running:

-Changement du mot de passe root
-Modification du /etc/apt/sources.list pour le faire pointer sur une debian testing ou stable, au choix. stable est plus conseillé sur une machine de prod, bien entendu.

/etc/apt/sources.list:

deb http://ftp.fr.debian.org/debian/ stable main contrib non-free
deb-src http://ftp.fr.debian.org/debian/ stable main contrib non-free
deb http://security.debian.org/ stable/updates main contrib non-free
deb-src http://security.debian.org/ stable/updates main contrib non-free

-Je ne veux pas utiliser lilo, et préfère grub.

apt-get remove lilo
apt-get install grub
update-grub
grub-install "(hd0,0)"
grub
>root (hd0,0)
>setup (hd0)
>quit

Il faut alors installer le kernel pour ne pas utiliser le kernel monolythique proposé par le hoster.

apt-get update
apt-cache search kernel-image et choisir le bon.
apt-get install kernel-image-2.6.26-2.i686
apt-get dist-upgrade

Rebooter.
Tout s’est bien passé dans mon cas. Je peux continuer:

-Modification du hostname
-Création de mon user principal useradd -m user
-Modification du /etc/ssh/sshd_config pour interdire l’accès en ssh à root et l’accès par mot de passe:

PermitRootLogin no
PubkeyAuthentication yes
PasswordAuthentication no

-Récupération du répertoire .ssh des utilisateurs qui se connectent par ssh dans lequel on a les clés autorisées.
Attention, à partir de cet instant, il ne faut plus fermer son terminal avant d’avoir tester la connexion par clé, sous peine de devoir rebooter en mode rescue avec un mot de passe root fourni par OVH, monter ses partitions à la main et changer la config de ssh. Le mode rescue d’OVH est excellent, mais il est préférable d’en éviter la lourdeur inévitable.

etc/init.d/ssh restart

Essayer de se connecter avec un autre terminal, si c’est ok, on continue.

-Installation de openvpn en tant que serveur.
Pour respecter mon engagement, je place tous mes fichiers de conf dans /home/user/etc/openvpn et rien dans /etc/openvpn et je n’utilise pas le script /etc/init.d/openvpn start pour le démarrer, mais je préfère screener l’application

cd /home/user/openvpn/
screen -S openvpn
openvpn --config server.conf

Ctrl a-d # pour détacher le screen sans le terminer
A cet instant, si vous êtes encore plus novice que moi et que nous ne connaissez pas screen, un “man screen” est obligatoire.

server.conf est mon fichier de conf server.conf, récupéré de mon backup. J’ai bien entendu modifié les chemins d’accès vers /home/user dans celui-ci.

Passons au service apache pour relancer blog et wiki.

sudo apt-get install apache2 php5 mysql-server php5-mysql libapache2-mod-gnutls

L’utilisateur www-data est créé automatiquement par l’installaton d’apache2, mais je lui crée son répertoire et mot de passe. Je déplace toutes les conf apache dans /home/www-data/ et fais un dans /etc fait un ln -s /home/www-data/etc/apache2 apache2 en modifiant /home/www-data/etc/apache2/apache2.conf

Je laisse mysql configuré comme par défaut dans /etc/mysql, celui-ci ne nécessite pas de modification dans mon cas et la sauvegarde doit se faire par mysqldump.

Je copie la base sql de mon blog dans /var/lib/mysql/bulblog, je modifie les propriétés avec chown.
J’utilise wordpress comme moteur de blog. Le nom du user utilisant la base mysql se trouve dans wp-config.php avec son mot de passe. Je crée l’utilisateur avec des droits d’accès depuis localhost seulement.

mysql -u root -p

mysql> CREATE USER 'wpuser'@'localhost' IDENTIFIED BY 'wpuserpass';
mysql>  GRANT ALL ON *.* TO 'wpuser'@'localhost';
mysql> quit

Attention, il est important de ne laisser l’accès que depuis localhost, car l’utilisateur a tous les droits.

Dans apache, il faut maintenant recopier tous les contenus des pages backupées dans les bons répertoires des config de site définis dans /home/www-data/etc/apache2/sites-available
Un test préalable du serveur apache lui-même est conseillé avec la page par défaut “it works”.
Ensuite, il faut activer les sites avec la commande:

a2ensite filename

où filename est le nom du fichier de conf du site dans /etc/apache2/sites-available qui est un lien vers /home/www-data/etc/apache2/sites-available .

On termine avec un /etc/init.d/apache2 restart

Utilisant dokuwiki pour mon wiki, la gestion par fichier plat des données simplifie grandement le backup, la simple copie avec les bons droits et bons propriétaires suffit pour remettre l’ensemble en service.

Puisque vous pouvez lire ces lignes, c’est que mon aventure s’est bien terminée et que j’ai pu reprendre le cours normal de mes opérations. Si j’étais un habitué des bonnes résolutions, je me promettrais de travailler plus proprement sur les backups.

En tout cas merci à iMil pour ses conseils, innombrables et toujours judicieux.

Posted in admin, apache2 | 8 Comments

le tips cifs du matin

Bonjour,

Je cherchais à introduire dans ma config de mes points de montages sur mon réseau  dans /etc/fstab, un point de montage cifs. Depuis un certain temps déjà, cela était fait sans problème mais pas très proprement ainsi en ajoutant la ligne à /etc/fstab:

//192.168.0.3/ED_MINI /chemin/ou/monter cifs user,rw,username=xxxxx,password=xxxxx,gid=1000,uid=1000 0 0

Pourquoi pas très proprement? Evidemment pour deux raisons, à cause de l’adresse IP et du mot de passe en dur.
J’ai donc décidé de donner un nom réseau sur mon DNS au disque réseau LaCie que j’utilise afin de faire ceci:

//hd01/ED_MINI /chemin/ou/monter cifs user,rw,username=xxxxx,password=xxxxx,gid=1000,uid=1000 0 0

Cependant, cela ne marche pas directement, il faut installer le package smbfs en plus.

sudo apt-get install smbfs

Celui-ci contient les commandes nécessaires au montage avec résolution d’adresse, ce qui n’est pas le cas du simple smbclient, utilisé précédemment.

Enfin, comment ne pas avoir les credentials? Il suffit de créer le fichier /etc/.cifscred (ou autre, bien entendu) avec comme contenu

username=xxxxxx
password=xxxxx

et de remplacer la ligne ci-dessus dans /etc/fstab par:
//hd01/ED_MINI /chemin/ou/monter cifs user,rw,credentials=/etc/.cifscred,gid=1000,uid=1000 0 0

Bon, pour être honnête, ce dernier point n’est qu’une légère amélioration…

J’espère que cela aidera.
A bientôt.
Stephbul

Posted in admin, Uncategorized | Leave a comment

Swedish Greys - a WordPress theme from Nordic Themepark.