Ellendhel's Blog

LinuxGestion de comptes utilisateurs sous Linux

Parmi les tâches assignées à un administrateur système se trouve la gestion des comptes utilisateurs. C'est à dire permettre à plusieurs personnes d'accéder à des ressources, de manière sécurisée, en tenant compte des besoins de chacun et si possible, simple à mettre en œuvre.

Lorsqu'il s'agit d'une ou deux personnes à ajouter, de manière ponctuelle, la création d'un compte sur le système peut se faire manuellement en utilisant adduser (qui fonctionne de manière interactive) ou useradd (qui nécessite plusieurs paramètres). Évidemment les choses deviennent plus compliquée dès que plus de personnes sont concernées ("Two is company, three's a crowd").

adduser est une solution à exclure, useradd peut-être utile pour écrire votre propre script, qui est généralement la solution préconisée.

Une autre solution existe : la commande newusers ; cette commande est effectivement destinée à ajouter des utilisateurs en masse. Le principe est de préparer un fichier équivalent à /etc/passwd, à ce détail que le mot de passe est conservé en clair, et de l'utiliser comme argument pour cette commande. Tous les utilisateurs listés seront crées, ainsi que leur répertoires personnels.

Admettons que vous ayez une série de nouveaux utilisateurs à créer, votre fichier d'import ressemblera à ceci :

ash:o+uykC49Hw:2001:500:Ash:/home/ash:/bin/bash
ava:ct2yYGu2o*:2002:500:Ava:/home/ava:/bin/bash
bender:sF8\guswB1:2003:500:Bender:/home/bender:/bin/bash
ed-209:tko+8Cj1Kk:2004:500:ED-209:/home/ed-209:/bin/bash
glados:hn3+qep4EO:2005:500:GLaDOS:/home/glados:/bin/bash
hal:Oya4uF8sj{:2006:500:HAL:/home/hal:/bin/bash
jarvis:a%bfi2ID1t:2007:500:Jarvis:/home/jarvis:/bin/bash
joshua:udH}8Gmzq4:2008:500:Joshua:/home/joshua:/bin/bash
optimus:po8uh#M5oZ:2009:500:Optimus Prime:/home/optimus:/bin/bash
r2-d2:9@lIh3inQa:2010:500:R2-D2:/home/rd-d2:/bin/bash
t-800:z5flLDw=1z:2011:500:T-800:/home/t-800:/bin/bash
wall-e:e5q%3NMfut:2012:500:Wall-E:/home/wall-e:/bin/bash

Générer ce fichier requiert quelques étapes préliminaires :

- Définir les comptes utilisateurs. Notre exemple ne comporte pas vraiment de cas particulier, mais vous pouvez vous retrouver à à gérer des noms particulièrement longs, ou avec des caractères spéciaux (espace, apostrophe, accents, ...). Ces identifiants seront probablement aussi ceux que vous utiliserez pour le répertoire personnel de chacun, vous devez donc vous assurer qu'ils n'engendreront pas de problème au niveau du système de fichiers.

Une règle que vous pouvez choisir d'appliquer est normaliser tous les identifiants en n'acceptant que certains caractères (de a à z, minuscules uniquement, chiffres et le symbole tiret). La gestion des collisions (deux personnes ayant un identifiant potentiellement identique) doit aussi être préparée à l'avance. La lecture du chapitre 8 "Namespaces" du livre "The Practice of System and Network Administration" à ce sujet est recommandée.

- Générer des mots de passe. Vous pouvez assigner un mot de passe unique à chaque utilisateur avec l'aide de la commande mkpasswd. Vous pouvez facilement contrôler l'utilisation de chiffres, caractères spéciaux et la longueur du mot de passe.

La première chose à s'assurer est que ce fichier est proprement sécurisé (droits de lecture minumum, une seule copie de travail, ...). Vous devrez conserver au moins une copie après utilisation pour founir le mot de passe initial à chaque utilisateur, après cela le fichier pourra être supprimé.

Une fois votre fichier d'import préparé, il est fortement recommandé de le tester avant utilisation. Là encore, une commande existe pour cette tâche en particulier : pwck. Utilisez cette commande avec les options -q et -r sur votre liste pour repérer les possibles erreurs.

Si votre liste d'utilisateurs est facilement accessible en consultation (base de données, annuaire, ...) la mise en place d'une solution automatique pour ajouter de nouveaux utilisateurs peut se faire aisément.

publié le 20 juin 2016

lien direct

LinuxContrôler votre historique de commandes

Une des fonctions couramment utilisée avec l'interpréteur de commandes Bash est l'historique de commandes : par une simple pression sur la touche fléchée "Haut" vous retrouvez les commandes lancées précédemment, avec leurs options. Vous pouvez éviter de fastidieuses saisies, limiter les erreurs et être plus efficace d'un manière générale.

Ce qui est parfois moins connu est l'utilisation de la commande history, qui affiche l'intégralité de commandes sauvegardées (500 lignes par défaut). Cet historique n'est toutefois pas parfait, entre autre exemple aucune date ou heure n'est indiquée.

Cela se règle assez facilement en déclarant une variable dans votre fichier ~/.profile :

export HISTTIMEFORMAT='%F %T '

Une fois le fichier enregistré, vous pouvez appliquer ce nouveau paramètre dans votre session :

source ~/.profile

Et la commande history vous donnera maintenant la date et l'heure pour chaque entrée de votre historique.

Mais dans certaines situations vous ne souhaitez pas que certaines commandes soit enregistrées. L'exemple le plus évident est lors de l'utilisation de commandes intégrant un mot de passe en clair (mysql, smbclient ou testsaslauthd entre autre). Une autre option peut être ajoutée à votre fichier .profile pour déclarer des exceptions :

export HISTIGNORE="mysql *:smbclient *:testsaslauthd *"

Toute ligne de commande débutant par une des commandes listées suivies d'un espace et d'arguments ne sera pas inclue dans votre historique.

Il reste quelques rares cas où vous souhaitez qu'une commande soit ignorée, mais que vous n'avez pas définie à l'avance. Bash propose alors une option supplémentaire adaptée à cette situation :

export HISTCONTROL=ignorespace

Toute commande débutant par un espace sera alors ignorée dans l'historique, sans que cela interfère lors de l'exécution.

Bash dispose d'autres options liées à l'historique de commandes, que vous pouvez trouver dans la page de manuel correspondante.

publié le 29 janvier 2016

lien direct

LinuxInstaller un logiciel depuis ses sources : iperf3

Pour diverses raisons vous pouvez être amené à compiler un logiciel depuis ses sources et ce que l'on peut entendre ou lire le plus souvent ressemble à "c'est simple : configure, make, make install et c'est réglé". C'est probablement vrai dans de nombreux cas mais pour certains logiciels, une bibliothèque particulière peut être requise, une option nécessite d'être activée ou l'on souhaite contrôler la manière dont l'installation se déroule.

Dans tous les cas l'administrateur système se retrouve à sortir des sentiers battus. Cet article est un exemple basée sur l'installation de iperf3, un outil de mesure de performance réseau. Le but est non seulement d'installer iperf et de pouvoir l'utiliser mais également de savoir comment progresser lorsqu'un problème se présente. Comme à l'accoutumée, l'environnement utilisé est une Slackware 64 bits.

Commençons par obtenir les sources. Rien de très spécial, il suffit de télécharger une archive .tar.gz depuis le site officiel. Vérifier la signature GPG est toujours une bonne idée avant de se lancer dans les étapes suivantes. Si tout est correct il n'y a qu'à décompresser le fichier.

# cd /usr/local/src
# mkdir iperf
# cd iperf
# wget http://downloads.es.net/pub/iperf/iperf-3.0.11.tar.gz
# wget http://downloads.es.net/pub/iperf/iperf-3.0.11.txt.asc
# gpg --verify iperf-3.0.11.txt.asc
gpg: Signature made Fri 09 Jan 2015 01:01:36 PM EST using RSA key ID 8CAAEE8A
gpg: Can't check signature: public key not found

Première embûche, "impossible" de vérifier la signature GPG. Et pour cause, il faut avoir une copie de la clé publique en premier lieu. L'identifiant de la clé est indiqué dans le message d'erreur, et GPG dispose d'une fonction pour interroger un serveur de clés, rien de très complexe donc :

# gpg --search 8CAAEE8A

Une fois la clé ajoutée à votre trousseau (sélectionnez la clé proposée avec son numéro et confirmez), la vérification peut avoir lieu :

# gpg --verify iperf-3.0.11.txt.asc
# grep --color $(sha256sum iperf-3.0.11.tar.gz) iperf-3.0.11.txt.asc

La première commande vérifie la validité de la signature du fichier texte et doit renvoyer un message contenant "Good signature".

La deuxième commande recherche l'empreinte SHA-256 du fichier compressé dans le fichier texte et une longue chaîne de caractères doit apparaître en résultat. À noter que cela n'est pas la procédure la plus courante ; en règle générale un fichier de signature permet de vérifier le fichier de sources lui-même sans passer par un fichier texte intermédiaire.

Reste à décompresser le fichier :

# tar xvfz iperf-3.0.11.tar.gz
# cd iperf-3.0.11

Nous y sommes. En théorie, il ne reste qu'à appliquer la formule magique "configure, make, make install". Essayons donc.

# ./configure
# make
# make install

Et ça marche. Où en tout cas, ça y ressemble :

Par défaut, les fichiers binaires sont généralement installés dans /usr/local/bin, ou /usr/local/sbin s'ils sont destinés uniquement à l'utilisateur root. Vérifions rapidement :

# whereis iperf3
iperf3: /usr/local/bin/iperf3

Effectivement, il y a quelque chose ; tentons d'exécuter le programme :

# /usr/local/bin/iperf3
/usr/local/bin/iperf3: error while loading shared libraries: libiperf.so.0: cannot open shared object file: No such file or directory

Nouveau problème, la bibliothèque libiperf.so est introuvable. L'utilitaire ldd le confirme. ldd affiche les liens entre un programme donné et les bibliothèques partagés dont il dépend.

# ldd /usr/local/bin/iperf3
        linux-vdso.so.1 => (0x00007fff6a3ff000)
        libiperf.so.0 => not found
        libc.so.6 => /lib64/libc.so.6 (0x00007fb7c2d6e000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fb7c3143000)

Pourtant libiperf est fournie avec les sources d'iperf3 et est installée en même temps. Vérifions :

# find /usr/local -type f -name 'libiperf.*'

Les résultats montrent bien des fichiers dans /usr/local/lib/.

# ls /usr/local/lib/libiperf.*

Tout est là mais cela ne fonctionne pas. Ce qui est parfois nécessaire est d'utiliser la commande ldconfig pour recréer les liens pour les bibliothèques partagées.

# ldconfig

Testons à nouveau :

# /usr/local/bin/iperf3

Ça marche ! Et ldd ne ne plaint plus :

# ldd /usr/local/bin/iperf3
        linux-vdso.so.1 => (0x00007fff535de000)
        libiperf.so.0 => /usr/local/lib/libiperf.so.0 (0x00007f9f12511000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f9f12168000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f9f12758000)

Sauf qu'à y regarder de plus près, les choses ne sont pas parfaites. Nous avons une bibliothèque 64 bits installée dans un répertoire pour bibliothèques 32 bits. Rien de bloquant mais cela pourrait poser problème à moyen ou long terme. Le mieux serait d'avoir libiperf installé dans /usr/local/lib64.

# file /usr/local/lib/libiperf.so.0.0.0
/usr/local/lib/libiperf.so.0.0.0: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, not stripped

Il serait possible de déplacer les fichiers manuellement, mettre à jour les liens symboliques et tout ce genre de choses, mais soyons clair, ce n'est pas la bonne méthode. Autant reprendre les choses depuis le début.

Désinstallons iperf :

# make uninstall

Nous allons reprendre à l'étape de configuration, qui est là où tout se décide. Demandons de l'aide.

# ./configure --help | less

Parmi la liste d'options se trouve celle qui permet de contrôler le répertoire dédié aux bibliothèques :

--libdir=DIR        object code libraries [EPREFIX/lib]

Utilisons donc cette option.

# ./configure --libdir=/usr/local/lib64/
# make
# make install

Vérifions où se trouve libiperf.so :

# ls /usr/local/lib64/libiperf.*

Et tout est correct pour exécuter iperf :

# ldd /usr/local/bin/iperf3
        linux-vdso.so.1 => (0x00007fffc1d50000)
        libiperf.so.0 => /usr/local/lib64/libiperf.so.0 (0x00007fdc5baef000)
        libc.so.6 => /lib64/libc.so.6 (0x00007fdc5b71b000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fdc5bd0c000)

Le cas de iperf est un peu particulier, du fait que la bibliothèque est fournie avec le logiciel lui-même. Le cas le plus courant est d'avoir une bibliothèque fournie à part (ldns et unbound par exemple). Dans tous les cas configure vous permettra de spécifier l'emplacement des fichiers de configuration, d'activer certaines fonctions, ...

Lors d'une mise à jour il sera nécessaire de réutiliser ces même options (sauf indication contraire des développeurs, dans le cas d'un changement de version majeure par exemple). Vous n'avez pas besoin de noter celles que vous avez utilisé, elles se trouvent au début du fichier config.log qui conserve les résultats de la commande configure.

# head config.log
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.

It was created by iperf configure 3.0.11, which was
generated by GNU Autoconf 2.69. Invocation command line was

  $ ./configure --libdir=/usr/local/lib64/

## --------- ##
## Platform. ##

Cet article devrait vous fournir les bases pour compiler d'autres logiciels de manière similaire. Lorsqu'une installation "classique" ne fonctionne pas le "kit de premier secours" est souvent basé sur ldd, ldconfig et find. En ayant bien évidemment pris le temps de lire la documentation fournie en premier lieu.

publié le 27 novembre 2015

lien direct