Présentation du matériel de base
Publié par The Troll le 13 02 2018

Il est temps de vous présenter le matériel que nous allons utiliser. Il y a d'autres modules et d'autres méthodes. Notre arbitrage fonctionnalités/prix nous a conduit à ces choix.

Les trois modules basiques fournis

Comme on peut le voir, Nous avons un arduino uno (ou plutôt un funduino) qui est un arduino italien, comme il est entièrement libre, il est fabriqué également sous d'autres marques. !Nous avons donc le arduino uno, une carte d'extension, permettant de bénéficier des connecteurs arduino sur une carte "vide", et une petite breadboard en plastique blanc. La breadboard est une petite carte permettant de faire des montages simples sans soudure.

On colle la breadboard sur la carte d'extension et on accouple la carte d'extension sur l'arduino uno. Nous obtenons alors la bête terminée.

la plateforme de travail montée

Il reste juste à présenter comment fonctionne une breadboard. Chaque demie-partie présente des continuités verticales. Comme le montre la photo ci-dessous, chacun des trous d'une même ligne sont reliés entre eux : le courant passe entre tous les trous de la même ligne.

le schéma de droite représente un petit circuit : Nous relions une résistance à la pin 9 de l'arduino avec un câble sans soudure (le câble et la résistance sont branchés sur la même ligne verticale). Puis nous relions la résistance à une led (les 2 sont sur la même ligne verticale. puis la led à un câble sans soudure (les 2 sont sur la même ligne verticale) qui est relié à la masse. Sur l'image les continuités entre les composants sont représentées par les lignes rouges.

Breadboard, comment ca marche ?
Prêts pour devenir le nouveau Turing :-)
Arduino - Électronique - Commentez
Premier pas avec un arduino : l'installation des outils
Publié par The Troll le 01 05 2015

Puisque nous sommes à nous raconter notre vie, j'ai commencé à tater un peu de l’électronique pour en faire avec mon gamin. Après des recherches un peu fastidieuses, j'ai opté pour un arduino, car il me semblait bien adapté pour ce que je voulais faire :

  • Facilement mis en œuvre
  • De l’électronique simple
  • De la programmation accessible
  • Tout plein de tutoriels sur le net

De plus, cerise sur le gâteau, ce que l'on apprends est directement utilisable autant en électronique qu'en programmation ( c'est du c). Dans ce premier billet, je vais aborder ce que nous avons fait pour mettre en place la plateforme pour que tout fonctionne.

Disclaimer : J'ai toujours cherché à avoir des outils qui fonctionnent en ligne de commande pour ne pas avoir besoin d'un machine dont la puissance sert uniquement à faire tourner un ide. J'ai l'impression également que cela te permet d'être plus proche de ce que tu fais en ayant besoin de plus de connaissance et que donc tu comprends un peu pus ce que tu fais.

Disclaimer 2 : mon système d'exploitation est debian linux, ainsi toute les étapes d'installation sont centrées sur cette plateforme.

Donc, première étape, installons les outils nécessaires pour l'arduino (ces manœuvres se font en étant Super Utilisateur - root) :

apt-get install arduino-core

Ce paquet va également installer le nécessaire de compilation et les outils pour obtenir un "fichier" binaire utilisable sur l'arduino. On peut également installer arduino (tout court) qui fournit un IDE qui à besoin de java pour fonctionner. arduino-core fournis tout un tas de fichier nécessaire à compiler pour l'arduino, des bibliothèques, des fichiers de définitions des différents modèles...

Pour parler avec l'arduino branché en usb, j'ai choisi ino, écrit en python, il s'installe facilement (si vous avez le paquet python-setuptools, qui fournit easy_install. Donc :


apt-get install python-setuptools

Une fois installé, il reste à installer ino

easy_install ino

ino à besoin de picocom pour parler avec la carte, et de make pour compiler c'est facilement fait :


apt-get install picocom
apt-get install make

Ensuite, il vous reste à brancher votre carte et vous la verrez apparaître sous le poétique nom de /dev/ttyACM0

crw-rw--- 1 root dialout 4, 67 mai    1 11:57 /dev/ttyACM0                                                                                                                     

Comme on peut le voir, vous en tant que simple utilisateur, vous n'avez pas le droit de faire quoi que ce soit avec lui, seul le propriétaire (root) et le groupe (dialout) ont le droit de lire et écrire (rw-) sur ce fichier (car sous linux tout est fichier). Ainsi il y a 2 moyens de contourner le problème :

  • Crée une règle udev pour que le périphérique vous appartienne
  • Vous faire appartenir au groupe dialout

J'ai choisi cette deuxième solution. Cela se fait facilement avec une simple commande (il faut être Super utilisateur (root)) :


usermod -a -G dialout votre_utilisateur

Votre utilisateur est le login que vous employez pour vous connecter, si vous ne le connaissez pas (auto-login par exemple), il est disponible avec la commande :


whoami

Une fois ajouté au groupe, il faut vous reconnecter et vous reconnecter pour que votre appartenance soit effective. Dernière manœuvre pour se faciliter la tache (car nous avons décider d'utiliser nano comme éditeur de code : installé d'office et très très light. D'autant plus que pour le moment le code que l'on fera sera tout simple et plutôt court. Les fichiers que produit ino se nomment xxx.ino. Comme nous désirons avoir la coloration syntaxique du C, je modifie le fichier de coloration syntaxique de nano pour le langage c qui se trouve à cette place /usr/share/nano/c.nanorc et modifie la première ligne pour qu'elle deviennent :


syntax "c" "\.(c(c|pp|xx)?|C|ino)$" "\.(h(h|pp|xx)?|H)$" "\.ii?$"

Vous êtes maintenant prêts pour la grande aventure.

Arduino - Électronique - 2 commentaire(s)
BOITE À OUTILS : Postfix et Dovecot
Publié par The Troll le 01 05 2015

Et bien, j'avais promis la chose, la voila... C'est le truc qui m'avait pris le plus de temps à comprendre et mettre en place. C'est le genre de truc pas aussi courant qu'un virtualhost apache et qui a besoin de pas mal de configuration pour fonctionner.

Comme à chaque fois, c'est un truc qui marche chez moi, mais je ne peux pas vous certifier qu'il marchera chez vous. De plus je vous conseille de lire l'introduction à tous mes billets "boite à outils pour gestion de serveur".

Donc passons aux choses sérieuses. j'utilise postfix et dovecot-pop3d de la manière qui me semble la plus simple, il y a des milliers d'autres manières de faire, peut être même plus intelligentes mais celle-ci me convient. TOUS les mails sont indépendants des utilisateurs du système.

1 - d'abord quelques réglages dans le fichier /etc/postfix/main.cf


virtual_mailbox_domains = /etc/postfix/domains
virtual_mailbox_base = /var/vmail/
virtual_mailbox_maps = hash:/etc/postfix/vmailbox
virtual_alias_maps = hash:/etc/postfix/virtual
virtual_minimum_uid = 5000
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
virtual_transport = virtual

Le reste du fichier n'est pas concerné par la configuration que nous faisons.

Comme vous le voyez, vous devez créer les fichiers /etc/postfix/domains /etc/postfix/vmailbox et /etc/postfix/virtual (ce sont des noms que j'ai choisis tout seul et qui sont utilisés dans le script_de_la_mort_qui_tue), vous pouvez tout à fait les changer. Pas besoin de les remplir, le script d'en chargera.

Pour résumer, le fichier domains contiendra les noms de domaines que votre serveur gère, le fichier virtual contiendra les mails redirigés et le fichier vmailbox contiendra les mails avec une boite pop dispo sur votre serveur.

Comme vous le voyez j'ai un utilisateur 5000, pour le créer :


groupadd -g 5000 vmail
useradd -s /usr/sbin/nologin -g vmail -u 5000 vmail -d /var/vmail -m

J'ai choisi de mettre les boites mails dans /var/vmail/ le script en tient compte, si vous voulez changer vous devez également le faire dans le script.

2 - Passons à dovecot.

J'ai décidé d'utiliser un seul fichier pour gérer les identifiants et mots de passe que l'on peut créer ou l'on veut, par exemple /etc/dovecot/fichier_user

On doit modifier /etc/dovecot/conf.d/10-master.conf, dans service auth {


# Postfix smtp-auth
unix_listener /var/spool/postfix/private/auth {
  mode = 0666
  user = postfix
  group = postfix
}

(on a ajouté le user et le group.)

puis on modifie : /etc/dovecot/conf.d/10-auth.conf


#!include auth-deny.conf.ext
#!include auth-master.conf.ext
#!include auth-system.conf.ext
#!include auth-sql.conf.ext
#!include auth-ldap.conf.ext
!include auth-passwdfile.conf.ext
#!include auth-checkpassword.conf.ext
#!include auth-vpopmail.conf.ext
#!include auth-static.conf.ext

(on désactive tous les protocoles et laisse auth-passwdfile.conf.ext)

ce qui amène à modifier le fichier : /etc/dovecot/conf.d/auth-passwdfile.conf.ext


passdb {
  driver = passwd-file
  args = scheme=CRYPT username_format=%u /etc/dovecot/fichier_user
}

userdb {
  driver = passwd-file
  args = username_format=%u /etc/dovecot/fichier_user
}

Comme vous le voyez, on retrouve ici le fichier que l'on a créé pour les utilisateurs : /etc/dovecot/fichier_user

Il reste ensuite à modifier le fichier /etc/dovecot/conf.d/10-mail.conf pour y ajouter la ligne suivante :


mail_location = maildir:/var/vmail/%d/%n/

Ici le chemin /var/vmail/ est le chemin choisi ET dans le fichier /etc/postfix/main.cf ET lors de la création de l'utilisateur virtuel vmail.

Normalement vous redémarrez postifx et dovecot et vous êtes près à commencer.

Maintenant le morceaux de choix : le fameux (fumeux?) script. Je l'ai appelé manage_mail. Comme pour le reste je le pose dans un dossier, le rend exécutable et ./manage_mail pour l'appeler.


#!/bin/sh

[ "$1" = "" ] && echo "$0 help pour de l aide" && exit

# conf postfix
virtual_alias_file=/etc/postfix/virtual
virtual_mailbox_file=/etc/postfix/vmailbox
virtual_domains=/etc/postfix/domains

# conf dovecot
dovecot_passwd="/usr/bin/doveadm pw"
dovecot_make_dir=/usr/bin/maildirmake.dovecot
directory_mail=/var/vmail
dovecot_id=5000
dovecot_users=/etc/dovecot/users

# conf sauvegarde
file_to_save="$virtual_alias_file $virtual_mailbox_file $virtual_domains $dovecot_users"
save_dir=/home/herve


action=$1
data=$2
la_date=`date +"%Y-%m-%d"`
its_done="     ....... fait"
already="     ...... existait déjà"

get_stats(){
        echo "#####################"
        [ "$data" != "" ] && echo "# Recherche sur $data" || echo "# liste générale"
        echo "#####################\n"

        echo "## domaines gérés  ##############"
        [ "$data" != "" ] && grep $data $virtual_domains || cat $virtual_domains |tr "\n" " "
        echo $domains

        echo "## adresses box ##############"
        [ "$data" != "" ] && grep $data $virtual_mailbox_file | cut -f1-2 --output-delimiter " ->[*]" || cut $virtual_mailbox_file -f1-2 --output-delimiter " ->[*]"
        echo "\n"

        echo "## adresses alias ##############"
        [ "$data" != "" ] && grep $data $virtual_alias_file | cut -f1-2 --output-delimiter " -> " || cut $virtual_alias_file -f1-2 --output-delimiter " -> "
        echo "\n"
}

re_start_all(){
        echo -n "Redemarrage du service"
        postmap $virtual_alias_file
        postmap $virtual_mailbox_file
        postfix reload
        /etc/init.d/postfix restart
        echo "$its_done"

}

add_domains(){
        if (grep -q $data $virtual_domains )
        then
                echo "domaine $data déja présent"
        else
                echo "$data" >> $virtual_domains
                echo "#$data" >> $virtual_alias_file
                echo "#$data" >> $virtual_mailbox_file
                echo "#$data" >> $dovecot_users
                echo "Domaine $data ajouté."
        fi
}

del_domains(){
        [ "$data" != "" ] && sed -i '/'"$data"'/d' $virtual_domains && echo "Domain $data effacé"
        read -p "Effacer toutes les adresses mails afférentes ? [o/n]" del_mails
        if [ $del_mails = "o" ]
        then
                sed -i '/'"$data"'/d' $virtual_alias_file
                sed -i '/'"$data"'/d' $virtual_mailbox_file
                sed -i '/'"$data"'/d' $dovecot_users
                rm -rf $directory_mail/$data/
                echo "$its_done"
        fi
}


add_aliass(){
        if (grep -q $data $virtual_alias_file )
        then
                echo "Alias $data déja présent"
        else
                sed -i 's/#'"$domain"'/#'"$domain"'\n'"$data"'  '"$redir"'/' $virtual_alias_file
                echo "Alias $data -> $redir  ajouté."
        fi
}

del_aliass(){
        sed -i '/'"$data"'/d' $virtual_alias_file
        echo "$its_done"

}

del_boxes(){
        read -p "Effacer l'adresse $data  [o/n]? " del_box

        if [ $del_box = "o" ]
        then
                sed -i '/'"$data"'/d' $virtual_mailbox_file
                sed -i '/'"$data"'/d' $dovecot_users
                rm -rf $directory_mail/$domain/$user
                echo "$its_done"
        fi
}

add_boxes(){
        echo "Ajout de la boite mail  $data..."
        read -p "Mot de passe pour l'utilisateur:  " the_pass
        the_passwd=`$dovecot_passwd -p $the_pass`

        if (grep  -q $data $dovecot_users)
        then
                sed -i '/'"$data"'/d' $dovecot_users
        fi

        echo -n "Ajout de l utilisateur  $user@$domain au fichier $dovecot_users"
        sed -i 's|#'$domain'|#'$domain'\n'$data':'$the_passwd':5000:5000::'$directory_mail'\/'$domain'\/'$user'\/:\/bin\/false::|' $dovecot_users && echo "$its_done"

        echo -n "Creation du répertoire $directory_mail/$domain/$user"

        if [ ! -d $directory_mail/$domain ]
        then
                mkdir $directory_mail/$domain
                chown $dovecot_id:$dovecot_id $directory_mail/$domain
                chmod 700 $directory_mail/$domain
                echo "$its_done"
        else
                echo "$already"
        fi

        $dovecot_make_dir $directory_mail/$domain/$user $dovecot_id:$dovecot_id
        for i in Drafts Sent Junk Trash
          do
          $dovecot_make_dir $directory_mail/$domain/$user/.$i $dovecot_id:$dovecot_id
        done

        echo -n "Ajout de l utilisateur au fichier $virtual_mailbox_file"

        if (grep  -q $data $virtual_mailbox_file)
        then
                echo "$already";
        else
                sed -i 's/#'"$domain"'/#'"$domain"'\n'"$data"'  '"$domain\/$user\/"'/' $virtual_mailbox_file
                echo "$its_done";
        fi

        #################### pour garder les informations dans un fichier ##################################
        echo "======================"
        echo "$user@$domain -> $the_pass"
        echo "======================"
        ####################################################################################################

}

save_conf(){
        for i in $file_to_save
        do
        cp $i $save_dir/"$la_date"_"$i".bak
        done
        echo "$its_done"

}
case $action in
        stats)
                get_stats;;

        add_domain)
                add_domains;;

        del_domain)
                del_domains;;

        add_alias)
                user=`echo "$data" | cut -f1 -d "@"`
                domain=`echo "$data" | cut -s -f2 -d "@"`
                if !(grep  -q $domain $virtual_domains);then echo "le domaine $domain n est pas géré, il faut le créer avant"; exit;fi
                [ "$3" = "" ] && echo "il manque l adresse de redirection. add_alias user@domain.tld redir@domain.tld" && exit
                redir=$3
                [ "$data" != "" ] && add_aliass;;


        del_alias)
                [ "$data" != "" ] && del_aliass;;

        add_box)
                user=`echo "$data" | cut -f1 -d "@"`
                domain=`echo "$data" | cut -s -f2 -d "@"`
                if !(grep  -q $domain $virtual_domains);then echo "le domaine $domain n est pas géré, il faut le créer avant"; exit;fi
                [ "$data" = "" ] && echo "il manque l adresse à créer. add_box user@domain.tld" && exit
                add_boxes;;

        del_box)
                [ "$data" = "" ] && echo "il manque l adresse à supprimer. del_box user@domain.tld" && exit
                user=`echo "$data" | cut -f1 -d "@"`
                domain=`echo "$data" | cut -s -f2 -d "@"`
                del_boxes;;

        restart)
                re_start_all;;

        save)
                save_conf;;

        help)
                echo "###############################"
                echo "Usage $0 action data"
                echo "----------------"
                echo " action:  stats -> listes de tout ( stats | stats motif_de_recherche) "
                echo "          add_domain -> ajoute un domaine à gerer (add_domain domain.ltd)"
                echo "          del_domain -> supprime un domaine à gerer (del_domain domain.ltd)"
                echo "          add_alias -> ajoute une adresse redirigée (add_alias from_mail@domain.tld to_mail@anotherdomain.tld)"
                echo "          del_alias -> supprime une adresse redirigée (del_alias from_mail@domain.tld )"
                echo "          add_box -> ajoute une adresse pop (add_box mail@domain.tld )"
                echo "          del_box -> supprime une adresse pop (del_box mail@domain.tld )"
                echo "          restart -> redemmare le serveur et remet à jour les hash des fichiers (restart)"
                echo "          save -> sauvegarde les fichiers de config en .bak (save)"

esac

comment il marche : l'aide dit :

Usage ./manage_mail action data
----------------
action:
stats -> listes de tout ( stats ou stats motif-de-recherche)
add_domain -> ajoute un domaine à gerer (add_domain domain.ltd)
del_domain -> supprime un domaine à gerer (del_domain domain.ltd)
add_alias -> ajoute une adresse redirigée (add_alias from_mail@domain.tld to_mail@anotherdomain.tld)
del_alias -> supprime une adresse redirigée (del_alias from_mail@domain.tld )
add_box -> ajoute une adresse pop (add_box mail@domain.tld )
del_box -> supprime une adresse pop (del_box mail@domain.tld )
restart -> redemmare le serveur et remet à jour les hash des fichiers (restart)
save -> sauvegarde les fichiers de config en .bak (save)

L'aide est assez claire.

il y a juste à configurer les variables en début de fichier


# conf postfix
virtual_alias_file=/etc/postfix/virtual (fichier défini dans /etc/postfix/main.cf)
virtual_mailbox_file=/etc/postfix/vmailbox (fichier défini dans /etc/postfix/main.cf)
virtual_domains=/etc/postfix/domains (fichier défini dans /etc/postfix/main.cf)

# conf dovecot
dovecot_passwd="/usr/bin/doveadm pw" (normalement inchangé dans debian 7)
dovecot_make_dir=/usr/bin/maildirmake.dovecot (normalement inchangé dans debian 7)
directory_mail=/var/vmail (fichier défini dans /etc/postfix/main.cf, /etc/dovecot/conf.d/10-mail.conf et home de l'utilisateur vmail )
dovecot_id=5000 (id de l'utilisateur vmail)
dovecot_users=/etc/dovecot/fichier_user (fichier défini dans /etc/dovecot/conf.d/auth-passwdfile.conf.ext)

# conf sauvegarde
file_to_save="$virtual_alias_file $virtual_mailbox_file $virtual_domains $dovecot_users"
save_dir=/rertoire/ou/vous/sauvegarder (doit exister)

le fichier /etc/dovecot/fichier_user sera sous la forme :


user@domaine.ltd:{CRAM-MD5}mot_de_passe_hash_md5:5000:5000::/var/vmail/domaine.ltd/user/:/bin/false::

Vous pouvez tout à fait faire vos test avant de le mettre en production, en donnant des fichiers "factices" (que vous avez créés dans votre home) ainsi qu'un sous répertoire de test (pour les mails) dans votre home.

Normalement cela fonctionne, il ne reste qu'à faite un test :


./manage_mail add_domain domaine_que_vous_gerez.com
./manage_mail add_box mon_user@domain_que_vous_gerez.com (vous donnez le mot de passe et il fait tout le travail).
./manage_mail restart (pour que tout soit pris en compte)

Enfin plus qu'à tester en ligne de commande :


mail user@domain_que_vous_gerez.com

vous renseignez le sujet, puis tappez le corps du message, vous terminez par une ligne avec juste un . (puis entrer) et vous devez voir passez dans vos logs

Nov 22 09:48:27 votre_server postfix/qmgr[6034]: 87F9A564670B: from=, size=292, nrcpt=1 (queue active)
Nov 22 09:48:28 votre_server postfix/virtual[8508]: 87F9A564670B: to=, relay=virtual, delay=0.77, 
    delays=0.49/0.09/0/0.19, dsn=2.0.0, status=sent (delivered to maildir)
Nov 22 09:48:28 votre_server postfix/qmgr[6034]: 87F9A564670B: removed

pffff. bon voila qui est fait, comme promis. Et le mot de la fin n]'oubliez pas de mettre à jour redémarrer votre serveur sinon cela n'est pas pris en compte.


./manage_mail restart

Serveurs - 1 commentaire(s)
BOITE À OUTILS BIND
Publié par The Troll le 26 04 2015

Puisqu'avoir un serveur virtuel ça ne sert pas à grand chose si on ne peut pas le visiter, il faut y associer une résolution de noms pour que les femelles en chaleur puisse le trouver (Oui c'est sexiste, mais à mon crédit, lorsque les femelles en chaleur peuvent le trouver, les mâles en rut également.) Ok, çà n'améliore pas mon coté sexiste, j'irais me fouetter avec des orties fraîches.

Donc je disais : la résolution des noms avec bind. La encore, même technique que pour apache, un fichier de zone modèle, un script qui le remplit à la demande. Vous DEVEZ remplir les fichiers modèle et script avec VOS bonnes informations, sinon ça marchera pas.

================ zone_modele==============
    
$ttl 38400
DOMAIN.        IN    SOA    SERVER.    user.mail.com.    (
            NUMERO
            28800
            14400
            1209600
            38400    )
DOMAIN.        IN    NS    SERVER.
DOMAIN.        IN    NS    DNSSLAVE.
        IN    MX    10 Mail
mail        IN    A    IP
DOMAIN.        IN    TXT    "v=spf1 mx a ip4:IP/32 ~all"
DOMAIN.        IN    A    IP
www.DOMAIN.    IN    A    IP

Dans ce fichier, il faut juste personnaliser en mettant votre adresse mail. il est sous la forme username@domain.com. en remplaçant le @ par un point. SI dans votre username il y a aussi un point, il s'échappe avec un \ exemple : prenom\.nom.domain.com. Remarquez bien le point final, il est important.

Ensuite un fichier pour faire le travail

=============== do_dns===============

#!/bin/sh
echo "vérifier les infos de base : serveur dns secondaire et nom de machine"

LIP=88.888.77.877
SERVER=domain.com
DNSSLAVE=ns-slave.server.tld
STAMP=`date "+%Y%m%d01"`
DEST="/etc/bind/zones/"

sed -e 's/IP/'$LIP'/g' zone_modele > $1.hosts
sed -i -e 's/DNSSLAVE/'$DNSSLAVE'/g'  $1.hosts
sed -i -e 's/SERVER/'$SERVER'/g'  $1.hosts
sed -i -e 's/NUMERO/'$STAMP'/g'  $1.hosts
sed -i -e 's/DOMAIN/'$1'/g'  $1.hosts
echo "======================="
more  $1.hosts
echo "======================="
read -p "Config ok [o/n]]?" reponse

if [ $reponse = "o" ]; then

mv $1.hosts $DEST$1.hosts && echo "fichier copié $DEST$1.hosts"
echo "verif fichier ======================="
named-checkzone $1 $DEST$1.hosts
echo "======================="

echo "modifier aussi le fichier named.conf.local et y ajouter :"
echo "======================="
echo 'zone "'$1'" {'
echo "        type master;"
echo '        file "'$DEST$1.hosts'";'
echo "        };"
echo "======================="
named-checkconf
read -p "redemarrer le serveur ? [o/n]]?" reponse

if [ $reponse = "o" ]; then
rdnc reload
service bind9 restart
fi
fi

Il faut absolument personnaliser les lignes suivantes :
LIP=L'adresse IP de votre serveur
SERVER=Le nom de domaine de votre serveur (donc qui fait dns primaire)
DNSSLAVE=le nom de votre serveur dns secondaire *
DEST="/etc/bind/zones/" -je mets mes fichiers zone à cet endroit (il faut créer le répertoire)

* ne pas oublier que le serveur secondaire doit avoir le droit de transférer les infos : on l'ajoute donc dans le fichier named.conf.options dans allow-transfert, allow-recursion et allow-query-cache

Donc comme pour apache, les 2 fichiers dans un répertoire, exécutable pour do_dns et on l'appelle simplement


./do_dns mondomaine.tld

il crée le fichier mondomaine.tld.hosts que vous pouvez éditer dans un autre shell, pour vérifier. En cliquant sur o à la réponse "config ok ?", il le copie à la bonne place, vous propose les informations à copier dans le fichier named.conf.local (vous devez le faire, un copier-coller marche très bien) , un truc du style :


zone "toto.com" {
                type master;
                file "/etc/bind/zones/toto.com.hosts";
                };

Oui, je sais, je pourrais l'ajouter directement avec un echo >>, mais je ne l'ai pas encore fait.. un jour je le mettrais à jour.

Redémarre le serveur bind.

YAPU qu'a attendre le car de femelles en chaleurs\w\w\w\w mâle en rut

Serveurs - Commentez
BOITE À OUTILS : VSFTPD (serveur ftp)
Publié par The Troll le 21 04 2015

Ce soir dans la série je gère mon site sans panel, un truc pas si compliqué et pas forcément nécessaire : la création de compte ftp pour permettre à des utilisateurs d'accéder aux dossiers.

Présupposés :
  • je n'utilise pas d'utilisateurs ayant un compte sur la machine (donc que des utilisateurs virtuels).
  • je veux un petit serveur ftp et pas une usine à gaz, même si cela me restreint dans la gestion du bousin (mais avec mes petits besoins, je n'ai pas eu ce soucis).
  • je veux pouvoir librement choisir le répertoire de chacun d'eux.
  • je veux que les fichiers sur le serveur appartiennent au même utilisateur système,
  • je veux pouvoir gérer les identifiant et pass avec un fichier texte.

vsftpd me permettait tout cela, je l'ai donc naturellement choisi. Bonus : il est pensé sécurité avant tout et performance. Et il est tout petit (Installed-Size: 464) et semble avoir une toute petite empreinte mémoire.

Une fois installé, quelques modifs dans le fichier : /etc/vsftpd.conf


listen=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
chroot_local_user=YES
guest_enable=YES
guest_username=user
user_config_dir=/etc/vsftpd-virtual-user/
virtual_use_local_privs=YES
pam_service_name=vsftpd

Il y a d'autres options, mais celles-ci permettent au bousin de tomber en marche. Comme on peut le voir nous avons besoin d'un répertoire pour y mettre les fichiers de configuration des utilisateurs (car vous pouvez avoir des configurations différentes pour chaque utilisateur.) ici, c'est /etc/vsftpd-virtual-user/ (vous devez le créer). Les fichiers qui arriveront sur le serveur appartiendront à l'utilisateur user (un "vrai" utilisateur système). On peut voir également que pam se charge de l'authentification,

donc modification du fichier /etc/pam.d/vsftpd


auth    required        pam_userdb.so db=/etc/virtual_users
account required        pam_userdb.so db=/etc/virtual_users

Il n'y a rien d'autre dans le fichier en question.Comme vous pouvez le voir, il s'attend à trouver une base de donnée : /etc/virtual_users, nous y viendrons plus tard. C'est un nom que j'ai choisi, vous pouvez en choisir un autre sans aucun soucis.

ATTENTION, il n'y a pas de .db à la fin, c'est normal.

Notre fichier modèle utilisateur /root/ftp_user_model


local_root=DIRECTORY
cmds_allowed=USER,PASS,SYST,FEAT,OPTS,PWD,TYPE,PASV,LIST,STOR,DELE,CWD,MKD,SIZE,MDTM,CDUP,RETR,RNFR,RNTO
local_umask=022
write_enable=YES

La liste des commandes utilisées semble classique, vous pouvez la personnaliser. Liste des commandes FTP sur wikipedia

c'est maintenant que ça va shazammer : le script de la mort qui tue (bon, pas tellement en fait) do_ftp


#!/bin/sh
USER_CONF_DIR=/etc/vsftpd-virtual-user/
USER_CONF_MODEl=/root/ftp_user_model
USERS_FILE=/etc/users_ftp
USERS_DB=/etc/virtual_users.db
did=" effectué"
action=$1
user=$2
pass=$3
the_directory=$4
 usage(){
    echo "Usage :$0 ACTION var(s)"
    echo "Action : add_user nom_user password /directory"
    echo "    del_user nom_user"
    echo "    list_user"
    echo "    list_pass"
    exit
}
 [ "$1" = "" ] && usage;
 add_user(){
    echo "création utilisateur $user avec le pass $pass pour le répertoire $the_directory"
    sed -e 's,DIRECTORY,'$the_directory',g' $USER_CONF_MODEl > user_$user
    more user_$user
    read -p "Config ok [o/n] ?" reponse

    if [ $reponse = "o" ]; then
        mv user_$user $USER_CONF_DIR/$user && echo "mise en place du fichier utilisateur$did"
        sed -i '1i'$user'\n'$pass'' $USERS_FILE && echo "inscription dans la base des mots de passe$did"
        /usr/bin/db_load -T -thash -f $USERS_FILE $USERS_DB && echo "re-hash de la base$did"
    fi
exit
}

del_users(){
    read -p "Voulez vous vraiment effacer l'utilisateur $user [o/n] ?" reponse
       
    if [ $reponse = "o" ]; then
        sed -i '/'$user'/{N;d}' $USERS_FILE
        echo "Utiliateur $user effacé"
        rm $USER_CONF_DIR/$user
        /usr/bin/db_load -T -thash -f $USERS_FILE $USERS_DB && echo "re-hash de la base$did"
     fi
}


list_userss(){
    find $USER_CONF_DIR -type f -printf "%f\n" | sort
}

list_passs(){
    echo "Liste des mots de passe ===="
    < users sed "N;s/\n/ -> /"
}


case $action in
        add_user)
              [ "$the_directory" = "" ] && usage;

              if ( [ -f "$USER_CONF_DIR/$user" ] );then
                    echo "l'utilisateur $user existe déja"
                    exit
              fi

              if !( [ -d "$the_directory" ] );then
                    echo "$the_directory doit être un répertoire existant";exit
              fi

              add_user;;

    list_users)
        list_userss;;

    list_pass)
        list_passs;;

    del_user)
        del_users;;

esac

Comme on peut le voir dans le code, il permet d'ajouter, supprimer, lister utilisateurs et mots de passe

Usage :./do_ftp ACTION var(s)
Action :
  • add_user nom_user password /directory
  • del_user nom_user
  • list_user
  • list_pass

C'est presque fini : il vous faut configurer le script :

USER_CONF_DIR=/etc/vsftpd-virtual-user/ (répertoire créé pour /etc/vsftpd.conf)
USER_CONF_MODEl=/root/ftp_user_model (le modèle de fichier utilisateur)
USERS_FILE=/etc/users_ftp (le fichier texte des utilisateurs)
USERS_DB=/etc/virtual_users.db (la base de donnée, même chose que dans le fichier /etc/pam.d/vsftpd - avec le .db en plus, c'est normal)

enfin il faut créer le fichier /etc/users_ftp avec une ligne vide, par exemple


touch /etc/users_ftp && echo "" > /etc/users_ftp && chmod 600  /etc/users_ftp 

et voila.

le fichier /etc/users_ftp est un fichier texte en clair sous la forme :
ident1
pass_ident1
ident2
pass_ident2
ident3
pass_ident3

Ce qui peut en rebuter plus d'un. J'ai choisi de le laisser sur mon système en le rendant en lecture uniquement par root (si un personne devient root sur la machine, ce sera le moindre de vos soucis).

  • Vous pouvez le déplacer dans un autre endroit de la machine (en changeant son nom) et le remettre lorsque vous en avez besoin,
  • vous pouvez le garder en local sur votre machine et le ssh-er lorsque vous en avez besoin. Ce sont des contournements à cette problématique.

Comme d'hab, le script(doit être exécutable) et le fichier de conf dans le bon répertoire et pour créer votre premier utilisateur :


./do_ftp nom_user pass_user /rept/de/utilisateur

on vous demande si la configuration est bonne. Avant de continuer, vous pouvez à ce moment là, depuis un autre terminal (shell) modifier les commandes pour par exemple supprimer l'upload de fichier et la personne ne pourra que télécharger, ou pas de droit de créer des répertoires...

Note : Le répertoire utilisateur doit exister AVANT de créer l'utilisateur, il doit appartenir à l'utilisateur user (défini dans /etc/vsftpd.conf)

Note 2:La version que j'utilise ne permet à l'utilisateur d'écrire dans son répertoire de premier niveau, j'ai ajusté ma structure de répertoires pour pallier cet inconvénient

Et voila... suite au prochain épisode.

Serveurs - Commentez