Franciser un système Debian


A force de travailler dans l’informatique, nous nous sommes tous plus ou moins habitués à l’utilisation de la langue de Shakespeare.

Cependant il existe toujours des irréductibles Gaulois qui ne sont à l’aise qu’avec la langue de Voltaire !

Voici comment passer de la langue anglaise à la langue française en quelques commande sur un système Debian.

Reconfigurations des locales

dpkg-reconfigure locales

on coche les lignes suivantes :

[*] fr_FR.UTF-8 UTF-8
[*] fr_FR@euro ISO-8859-15

et on sélectionne le jeu de paramètres régionaux actif par défaut :

fr_FR.UTF-8

Installation des versions française des manpages

apt-get install manpages-fr manpages-fr-extra

Conclusion
On ferme la session, on se reconnecte et la magie s’opère immédiatement.

Recherche récursive d’une expression dans des fichiers d’un dossier

Je ne pense pas qu’il existe une commande permettant la recherche récursive d’une expression dans les fichiers d’un dossier et ses sous dossiers. Il existe cependant plusieurs façon de simuler cette commande.

(Edit : allez voir dans le commentaires, c’est tout à fait faisable directement avec grep)

Exemple

Trouver l’expression « eth0  » dans les fichiers du dossier courant.

Solution 1

find . -print | xargs egrep --color "eth0"

Solution 2

find . -exec egrep "eth0" {} \; -print;

Envoyer des SMS en lignes de commande

Les alertes mails sont faciles à générer pour prévenir un utilisateur. Seulement, nous ne sommes pas tous 24h sur 24 devant un écran d’ordinateur et particulièrement lors de nos weekend. De plus, dans certains cas, une alerte mail ne fonctionnera pas, par exemple lors d’une alerte vérifiant la connectivité d’un système à Internet.

Il est donc intéressant de lever des alertes d’un autre type et ne passant pas par internet pour des services cruciaux. La génération d’alerte via SMS permet de répondre à ces problématiques et plus particulièrement dans le cadre d’entreprise disposant un portable d’astreinte.

Sous Windows, je vous souhaite bien du courage, j’ai essayé et j’ai finis par abandonner. Par contre, sous Linux, rien de plus facile !

Il vous suffit d’un téléphone GSM qui puisse communiquer avec un ordinateur via les commandes AT (la plupart des téléphones). Ici mes tests ont étés effectués avec un vieux modem GSM Wavecom dans lequel on introduit une carte SIM, il était relié au PC via un câble série.

Installation

sudo apt-get install gsm-utils

Envoyer un message

gsmsendsms -d /dev/ttyS0  -b 115200 +33600000000 "ALERTE : coupure internet"
  • -d /dev/ttyS0 : port COM1, (/dev/ttyUSB0 pour le port USB0)
  • -b 115200 : le Bau (rate), c’est la vitesse de connexion de la liaison série (pas nécessaire en USB)
  • +33600000000 : le numéro de téléphone au format international

Conclusion

A utiliser, par exemple, sur le portable d’astreinte pour les « grosses alertes ». Pour information, Gsmsendsms s’interface très bien avec Nagios.

Il ne vous reste plus qu’à laisser libre cours à votre imagination pour répondre à vos besoins.

Redmine : la gestion complète de projets

Redmine est une application web Open Source de gestion complète de projet en mode web, développé en Ruby sur la base du framework Ruby on Rails (cf Wikipédia).

C’est un vrai petit bijoux pour la gestion de projet, amis développeurs, n’hésitez pas à l’installer en interne dans votre entreprise.

N’ayant pas trouvé de howto suffisamment simple à mon goût, je vous propose le mien pour installer Redmine  avec apache sous Debian Lenny.

Installation depuis un depot

Il y a depuis peu un paquet redmine dans les backports de lenny.

On modifie le fichier de source :

nano /etc/apt/sources.list

On ajoute la ligne suivante :

deb http://www.backports.org/debian lenny-backports main contrib non-free

Recharger la base de données d’apt-get

apt-get update

Installer la signature du depot backport

apt-get install debian-backports-keyring

Recharger la base des paquets deb

apt-get update

Installer mysql

apt-get install mysql-server

Installer redmine-mysql

apt-get -y -t lenny-backports install redmine-mysql redmine

Test en local

On va lancer Redmine avec le serveur web de test de rail

ruby /usr/share/redmine/script/server -e production

On peut le tester en local avec lynx

lynx http://127.0.0.1:3000

Configuration d’apache

On installe apache2 :

apt-get install apache2

Correction bug actuel :

chown www-data /usr/share/redmine/config/environment.rb

On va créer un Virtualhost dédié qui va écouter sur le port 8080 :

nano /etc/apache2/sites-available/redmine
Listen 8080
<VirtualHost *:8080>
  RailsEnv production
  RailsBaseURI /
  SetEnv X_DEBIAN_SITEID default

  DocumentRoot /usr/share/redmine/public
  ServerSignature off

  <Directory "/usr/share/redmine/public">
    AllowOverride None
    Order allow,deny
    Allow from all
  </Directory>

  ErrorLog /var/log/apache2/redmine-error.log
  CustomLog /var/log/apache2/redmine-access.log combined
</VirtualHost>

On ajoute le site :

a2ensite redmine

On relance la configuration d’apache2 :

/etc/init.d/apache2 reload

On peut joindre redmine à l’adresse suivante : http://127.0.0.1:8080/

Références

MySecureShell : ou comment chrooter simplement Sftp ?

Ftp n’est pas un protocole sécurisé pour le partage de fichiers, c’est un fait avéré. Pourtant ce protocole est très utilisé dans l’échange de données pour des raisons historiques et par la force de l’habitude.

Une des solutions est d’utiliser une de ses variantes le Sftp qui se repose sur le protocole Ssh. Sous linux il suffit d’installer openssh-server. Par défaut, l’utilisateur à accès aux autres dossiers du système et possède un accès Ssh.

Pour bloquer l’utilisateur dans son dossier personnel et restreindre l’accès Ssh au commande Sftp, il est usuel de mettre en place un environnement Sftp chrooté. La configuration de cette mise en place, sans être très compliquée, n’est pas des plus triviales.

Une alternative simple, mais que je ne vois pas souvent citée, est la mise en place de MySecureShell.

Installation

Ajout des dépôts de MySecureShell

nano /etc/apt/sources.list
...
deb http://mysecureshell.free.fr/repository/index.php/debian testing main
deb-src http://mysecureshell.free.fr/repository/index.php/debian testing main

Mise à jour de la liste de paquets et installation

apt-get update
apt-get install openssh-server mysecureshell

Configuration de sftp

nano /etc/ssh/sftp_config

Parmi les options, il faut modifier les suivantes :

...
StayAtHome		true	#limit client to his home
VirtualChroot		true	#fake a chroot to the home account

On redémarre le service

/etc/init.d/mysecureshell restart

Ajout d’un utilisateur toto

useradd -m -s /bin/MySecureShell toto
passwd toto

Conclusion

Nous avons créé un utilisateur toto qui peux venir déposer et télécharger des fichiers sur notre serveur de façon sécurisé. L’utilisateur est restreint uniquement à son répertoire personnel, et il lui est impossible de se connecter à une console.

SQUID avec authentification LDAP sous Debian

Description

Cet article concerne la mise en place d’un Proxy avec authentification Ldap et une gestion de règles selon l’OU de l’utilisateur.

Un tel système permet la journalisation des requêtes par utilisateur et le filtrage des sites internet. Je ne reviendrai pas sur la façon dont certaines entreprises abusent de ces systèmes. Cependant sans vouloir faire l’avocat du diable, gardons à l’esprit qu’un responsable informatique est légalement responsable du système dont il a la charge et qu’il doit couvrir ses obligations.

Nous allons donc monter un serveur Proxy Squid relié à un serveur d’annuaire Ldap, pour l’analyse des log nous utiliserons sarg.

Matériel

Les ingrédients pour réussir la recette sont donnés à titre d’exemple.

  • 1 machine
  • 1 système d’exploitation Linux (ex: Debian Lenny)
  • 2 cartes Ethernet
  • 1 serveur Ldap (ex: Novel)

Dans notre exemple l’interface eth0 est reliée à un réseau qui à accès à internet. L’interface eth1 est branché au réseau local dont l’accès à internet a été restreint.

Installation sous Debian

apt-get install squid ldap-utils apache2 sarg

Configuration interfaces réseaux

Il est nécessaire de configurer des adresses réseaux fixes et non attribuées par le serveur DHCP.

nano /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
allow-hotplug eth0
iface eth0 inet static
 address 10.20.1.2
 netmask 255.255.255.0
 gateway 10.20.1.1
 broadcast 255.255.255.255

# The secoundary network interface
auto eth1
allow-hotplug eth1
iface eth1 inet static
 address 192.168.1.1
 netmask 255.255.255.0
 broadcast 255.255.255.255

Pour prendre en compte les changements réseaux on redémarre le service networking

/etc/init.d/networking restart

Configuration Squid

Nous allons forcer l’authentification des utilisateurs via un annuaire LDAP, et gérer des règles en fonction des OU des utilisateurs.

nano /etc/squid/squid.conf

Les explications sont dans les commentaires

# --------------------------------------
#    Fichier de configuration du proxy SQUID
#
#    * Authentification via LDAP
#    * Regles en fonction des OU
#
#    @file : /etc/squid/squid.conf
#     @author : Liberez le tux
#    @version : 3
#    @email : xxxxxxxx
# --------------------------------------

# --------------------------------------
# Prerequis :
# --------------------------------------
#    * debian lenny
#    * etre root
#    * apt-get install squid ldap-utils apache2 sarg
# --------------------------------------

# --------------------------------------
# TODO
# --------------------------------------
#    * Definir toutes les OU
#    * Definir toutes les regles
# --------------------------------------

# OPTIONS FOR AUTHENTICATION
# --------------------------------------

#####  TAG: auth_param

# Parametrage de l'authentification LDAP avec un compte existant
# -b "o=ROOT" : la racine de l'annuaire
# -D cn=LDAP,ou=ROBOTS,ou=USERS,o=ROOT -w monmotdepasse : utilisateur utilise pour se connecter a l'annuaire
# -h 10.20.1.1 : l'adresse du serveur LDAP
# -f "uid=%s" : le filtre pour l'authentification
#
auth_param basic program /usr/lib/squid/ldap_auth -v 3 -b "o=ROOT" -D cn=LDAP,ou=ROBOTS,ou=USERS,o=ROOT -w monmotdepasse -f "uid=%s" -h 10.20.1.1

# Nombre d'instances de SQUID pour l'authentification
auth_param basic children 5

# Nom du serveur (affiche le message dans la boite de dialogue du navigateur)
auth_param basic realm  Mon beau proxy

# Session desactivee apres 2 heures d'inactivite
auth_param basic credentialsttl 2 hours

# ACCESS CONTROLS
# --------------------------------------

#####  TAG: external_acl_type
# Permet de vérifier l'appartenance d'un utilisateur a une OU.
# Le filtre "(&(objectclass=person)(cn=%u)(ou:dn:=%a))"
# verifie que l'utilisateur courant %u est dans l'OU donnée via %a.
# L'expression %a est un paramètre qui sera renseigné dans une ACL.
external_acl_type ldapou %LOGIN /usr/lib/squid/squid_ldap_group -b "o=ROOT" -f "(&(objectclass=person)(cn=%u)(ou:dn:=%a))" -D cn=LDAP,ou=ROBOTS,ou=USERS,o=ROOT -w monmotdepasse -h 10.20.1.1

#####  TAG: acl

# Obligation de s'authentifier
acl auth proxy_auth REQUIRED

# Definition de "all" (tout le monde)
acl all src all

# Definition des groupes par OU
# ici le groupe "gr_restrict" correspond a l'OU "RESTRICTS"
# ici le groupe "gr_admin" correspond a l'OU "ADMINS"
acl gr_restrict external ldapou RESTRICTS
acl gr_admin external ldapou ADMINS

# Restrictions
# les url autorises sont dans le fichier "url_allow"
# chaque url doit commencer par un "." :
#     .liberez-le-tux.servhome.org
#     .planet-libre.org
acl url_allow dstdomain "/etc/squid/domains/url_allow.txt"

# Restrictions : une autre ecriture
# acl url_allow dstdomain .liberez-le-tux.servhome.org .planet-libre.org

#####  TAG: http_access

# groupe "gr_restrict" restreint a une liste d'url
http_access allow gr_restrict url_allow

# groupe "gr_admin" autorise a tout voir
http_access allow gr_admin

# groupe les autres
http_access deny all

# NETWORK OPTIONS
# --------------------------------------

# Port d'ecoute de SQUID
http_port 10.20.1.1:8080

# DISK CACHE OPTIONS
# -------------------------------------- 

# cache de 500 Mo
cache_dir ufs /var/spool/squid 500 16 256 

# ERROR PAGE OPTIONS
# --------------------------------------
# Gestion des erreurs (francais)
error_directory /usr/share/squid/errors/French

# LOGFILE OPTIONS
# --------------------------------------

# Emplacement fichier de log
access_log /var/log/squid/access.log
cache_log /var/log/squid/cache.log
cache_store_log /var/log/squid/store.log

Maintenant Squid est configuré, pour prendre en compte les modifications du fichier de configuration il est nécessaire de recharger la configuration.

/etc/init.d/squid reload

Configuration Logrotate

Par défauts les logs de squid sont supprimés tous les 2 jours, pour des besoins en entreprise il est souvent  nécessaire de conserver ces données plus longtemps. Attention car les logs générés peuvent prendre beaucoup de place sur les serveurs.

nano /etc/logrotate.d/squid

Configuration pour une rotation des logs tous les 6 mois.

#
#       Logrotate fragment for squid.
#
/var/log/squid/*.log {
 monthly
 compress
 delaycompress
 rotate 6
 missingok
 nocreate
 sharedscripts
 postrotate
 test ! -e /var/run/squid.pid || /usr/sbin/squid -k rotate
 endscript
}

Configuration Sarg

Sarg permet de créer simplement des rapport lisibles

nano /etc/squid/sarg.conf

Nous pouvons configurer la langue des rapports ainsi que le format de date.

...
language French
...
access_log /var/log/squid/access.log
...
graphs yes
...
date_format e

L’accès aux rapports se fait via http://monserveur/squid-reports

Cron

Il est nécessaire de planifier la création des rapports de sarg, par jour, par semaine, par mois.

Lancer la commande suivante dans un terminal :

crontab -e

Entrer les lignes suivantes et quitter

00 08-18/1 * * * sarg-reports today
00 00      * * * sarg-reports daily
00 01      * * 1 sarg-reports weekly
30 02      1 * * sarg-reports monthly

Apache

Par défaut tout le monde peut venir voir les rapports générés par Sarg à l’adresse http://monserveur/squid-reports. Nous allons donc mettre en place une authentification obligatoire pour l’accès aux rapports via un fichier .htaccess.

N.D.A : Je vous invite fortement par la suite à créer un virtualhost dédié aux rapports de Squid et à le configurer directement pour limiter l’accès aux rapports.

Nous prenons comme hypothèse que le serveur Apache n’a pas été modifiée et que sa configuration est celle par défaut.

nano /etc/apache2/sites-available/default

Il faut modifier la ligne AllowOverride none en AllowOverride All dans la balise <Directory /var/www/> pour pouvoir utiliser un fichier .htaccess.

<VirtualHost *:80>
 ServerAdmin webmaster@localhost

 DocumentRoot /var/www/
 <Directory />
 Options FollowSymLinks
 AllowOverride None
 </Directory>
 <Directory /var/www/>
 Options Indexes FollowSymLinks MultiViews
 AllowOverride All
 Order allow,deny
 allow from all
 </Directory>

 ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
 <Directory "/usr/lib/cgi-bin">
 AllowOverride None
 Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
 Order allow,deny
 Allow from all
 </Directory>

 ErrorLog /var/log/apache2/error.log

 # Possible values include: debug, info, notice, warn, error, crit,
 # alert, emerg.
 LogLevel warn

 CustomLog /var/log/apache2/access.log combined

 Alias /doc/ "/usr/share/doc/"
 <Directory "/usr/share/doc/">
 Options Indexes MultiViews FollowSymLinks
 AllowOverride None
 Order deny,allow
 Deny from all
 Allow from 127.0.0.0/255.0.0.0 ::1/128
 </Directory>

</VirtualHost>

Création du htaccess

nano /var/www/squid-reports/.htaccess
AuthName "Authentification requise pour la consultation des rapports Squid"
AuthUserFile /var/www/squid-reports/password/.htpasswd
AuthGroupFile /dev/null
AuthType Basic

require valid-user

Création du dossier contenant le fichier des mots de passe

mkdir /var/www/squid-reports/password

Ajout de l’utilisateur admin, le mot de passe est demandé à la suite de cette commande. L’option -c permet de créer le fichier associé.

htpasswd -c /var/www/squid-reports/password/.htpasswd admin

Protection du fichier de mot de passe

nano /var/www/squid-reports/password/.htaccess
AuthGroupFile /dev/null
AuthName "Acces restreint"
AuthType Basic

deny from all

On relance Apache :

/etc/init.d/apache2 reload

Conclusion

Nous avons maintenant un proxy fonctionnel, dont les règles de gestion dépendent de l’OU d’appartenance des utilisateurs. Nous avons un  outil qui génère des rapports compréhensibles par tous, mais dont l’accès est limité. Il ne reste qu’à configurer les navigateurs des utilisateurs pour utiliser notre proxy. Pour la configuration des navigateurs, le plus simple reste l’utilisation d’un script de configuration automatique hébergé sur un serveur différent du proxy.

Installer un serveur SMTP relai via POSTFIX

Les entreprises sont de plus en plus friantes d’envois de rapports automatisés, on pensera notamment à Nagios. Pour cela il est nécessaire de posséder un serveur SMTP en interne. Il est souvent préférable que ce serveur SMTP ne demande pas d’authentification, pour plus de simplicité au niveau de la configuration des outils l’utilisant.

Malheureusement, pour lutter contre le SPAM, certains FAI bloquent la possibilité de mettre en place un serveur d’envoi d’email personnel. Il existe cependant un moyen simple pour disposer d’un serveur SMTP personnel : un serveur SMTP relai. Celui-ci n’aura qu’une seule fonction, envoyer vos email vers le serveur SMTP de votre FAI qui s’occupera lui-même de leurs distribution.

Configuration utilisée

  • Distribution : Debian Lenny
  • Serveur SMTP externe : smtp.orange.fr

Installation

apt-get install postfix libsasl2-modules sasl2-bin

Choisir l’option « Système satellite » dans le menu et renseigner l’adresse du serveur (cette étape n’est pas importante car nous allons modifier le fichier de configuration à la main)

Configuration de Saslauthd

Saslauthd est le module qui permet l’authentification sur le serveur SMTP distant (ici : smtp.orange.fr).

nano /etc/default/saslauthd

Changer la ligne « START=no » par défaut

START=yes

Configuration de Postfix

nano /etc/postfix/main.cf

Le fichier minimal d’un relai :

smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no

append_dot_mydomain = no
readme_directory = no

myhostname = monserveur
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
mydestination = monserveur, monserveur.fr, localhost

relayhost = [smtp.orange.fr]:25
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl/orange.conf
smtp_sasl_security_options = noanonymous

mynetworks = 127.0.0.1, 192.168.1.10, 192.168.1.11
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all

  • smtp_sasl_password_maps : le fichier contenant les informations d’authentification
  • mynetworks : contient les adresses IP des machines autorisées à utiliser le serveur SMTP. Il est possible de renseigner des adresses de réseaux (ex: 192.168.1.0/24). Les adresses sont séparées par une virgule.

Il est maintenant nécessaire de définir le nom d’utilisateur et mot de passe pour se connecter au serveur distant. Dans notre exemple, le fichier contenant les identifiants est le suivant :

nano /etc/postfix/sasl/orange.conf

on renseigne le nom de l’utilisateur (USERNAME) et le mot de passe (PASSWORD) du compte de la messagerie d’orange

[smtp.orange.fr]:25 USERNAME:PASSWORD

On protège l’accès en lecture au fichier contenant les informations d’authentification :

chown root:root /etc/postfix/sasl/orange.conf
chmod 600 /etc/postfix/sasl/orange.conf

on va générer maintenant le fichier .db nécessaire au bon fonctionnement de postfix :

postmap /etc/postfix/sasl/orange.conf

On relance Postfix

/etc/init.d/postfix reload

Les logs

Les logs sont situés dan les fichiers /var/log/mail.info, /var/log/mail.err, /var/log/mail.warn

nano /var/log/mail.info

Pour voir les changements en temps réel du fichier de log :

tail -f /var/log/mail.info

File de messages

Voir la file des messages :

mailq

Pour supprimer un message de la queue :

postsuper -d queue_id

Pour supprimer tous les messages de la queue :

postsuper -d ALL

Conclusion

Il ne vous reste plus qu’à configurer vos outils pour utiliser votre nouveau serveur SMTP.

Activer Sudo sous Debian

Sudo est une commande qui permet d’accorder à certains utilisateurs (ou groupes d’utilisateurs) la possibilité de lancer une commande en tant qu’administrateur, ou comme autre utilisateur, tout en conservant une trace des commandes saisies et des arguments.

Debian à l’inverse d’Ubuntu n’est pas nativement configuré pour utiliser Sudo, le compte root est préféré pour les taches d’administration. Je trouve personnellement qu’il est préférable que chacun dispose de son propre compte lorsque plusieurs personnes sont amenées à administrer un même serveur. La manipulation est très simple comme souvent sous Linux.

Installation

apt-get install sudo

Configuration sudoers

On ouvre le fichier /etc/sudoers via la commande suivante :

visudo

On rajoute la ligne « %sudo ALL=(root) ALL »

# /etc/sudoers
#
# This file MUST be edited with the 'visudo' command as root.
#
# See the man page for details on how to write a sudoers file.
#

Defaults        env_reset

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root    ALL=(ALL) ALL
%sudo ALL=(root) ALL

# Uncomment to allow members of group sudo to not need a password
# (Note that later entries override this, so you might need to move
# it further down)
# %sudo ALL=NOPASSWD: ALL

Configuration des utilisateurs

On ajoute le groupe sudo au utilisateurs administrateurs de la machine.

adduser mon_utilisateur1 sudo
adduser mon_utilisateur2 sudo

On va maintenant désactiver le compte root car nous n’en avons plus besoin.

passwd -l root

Si besoin on peut réactiver le compte root

passwd -u root

Conclusion

Il est maintenant impossible de se connecter avec le compte root, mais les administrateurs peuvent lancer les commandes nécessitant les droits root en respectant la syntaxe : sudo ma_commande_root

Compter le nombre de lignes d’un projet

Des commandes toutes simples, mais très utiles pour celui qui désire savoir combien de lignes de code comporte un projet.

Exemple pour un projet PHP :

cat `find . -name "*.php"` | wc -l

ou

find . -name "*.php" -exec cat {} \;|wc -l

Exemple avec le nombre de lignes par fichier ainsi que le total (merci à louiz’ et tOkeshu )

find . -name "*.php" | xargs wc -l

ou

wc -l $(find -name "*.php")

Il suffit de remplacer php par l’extension désirée.

Modifier la taille par défaut d’un terminal sous Linux

Un des grands défauts des terminaux, que j’ai pu constater après une utilisation intensive de ceux-ci, est  leurs taille réduite par défaut.

Le terminal de gnome ainsi que tous les autres terminaux ne proposent pas de fixer une taille par défaut de ceux-ci.

Il est judicieux de figer une taille par défaut des terminaux par exemple en fonction de la résolution de l’écran. Cela l’est encore plus pour celui qui travaille avec beaucoup de terminaux ouverts.

Le fichier à modifier est :

/usr/share/vte/termcap/xterm

La ligne à modifier est la suivante :

:co#80:it#8:li#24:\

Exemple pour un affichage de 100 colonne pour 40 lignes :

:co#100:it#8:li#40:\

PS : il est à noter que tous les utilisateurs seront impactés.