Skip to content

Linux Attitude

Le libre est un état d'esprit

Archive

Archive for June, 2007

Niveau :      
Résumé : $_SERVER['PHP_AUTH_USER']

Il ne faut pas confondre authentification, identification et autorisation.

L'identification est le processus qui permet à une application de reconnaître une personne. Elle se fait en général par échange de login. Celui-ci peut être complété par la corrélation de ce login avec le contenu d'une base de données.

L'authentification c'est le fait de vérifier qu'une personne est bien celle qu'elle prétend être. C'est un processus qui se déroule en général par échange de mot de passe. Mais il est aussi possible d'authentifier une personne avec une carte à puce par exemple.

L'autorisation est le processus qui à partir de l'identification d'une personne dûment authentifiée donne des droits d'accès à une application ou à des données.

Chacune de ces tâches est bien distincte.

Dans le cas du système, l'identification est faite par nss, l'authentification par pam et l'autorisation par le noyau ou par l'application concernée.

Dans le cas du web, il est possible de tout faire faire par PHP ou de tout faire faire par apache.

Apache dispose d'un mécanisme standard d'authentification qui est intégré au protocole HTTP. Il dispose aussi naturellement de mécanismes d'autorisation d'accès en fonction des url accédées. Par contre l'identification dans apache n'est pas particulièrement utile et se résume donc à inclure le login dans les logs.

Php ne dispose pas naturellement de ces fonctions et donc les nombreuses applications qui suivent ce processus doivent tout redévelopper elles-mêmes. C'est une chose à éviter. Si c'est ce que vous faites, STOP ! vous êtes en train de recoder la roue. En l'absence de l'expérience accumulée sur les mécanismes spécialisés il est certain que les trous de sécurité et les erreurs s'accumulent dans votre application.

La solution est tout simplement de laisser apache faire l'authentification. Quitte à faire vous même l'autorisation en PHP si vous préférez. Pour cela rien de plus simple, modifiez le fichier .htaccess de votre racine.

AuthType Basic
AuthName Authentification
AuthUserFile /srv/http/site/htpassword
Require valid-user

Et ensuite, vous avez le login disponible en php dans la variable $_SERVER['PHP_AUTH_USER']

Et si vous trouvez plus pratique de gérer vos utilisateurs dans une base sql, il y a mod_auth_mysql qui vous permettra de le faire.

Alors faites simple. Vous verrez l'avantage le jour où vous aurez besoin d'automatiser les accès à votre application, le jour où vous voudrez garantir une authentification commune à plusieurs applications, le jour ou vous voudrez changer de méthode d'authentification et surtout le jour où vous voudrez mettre en place un SSO (Single Sign On).

Niveau :      
Résumé : traceroute -I ; mtr ; tcptracetroute

J'imagine que vous connaissez tous le fonctionnement d'IP. Vous êtes connectés à un routeur lui-même connecté à d'autres routeurs, etc.

Et donc chaque connexion que vous faites passe par un certain nombre de routeurs plus ou moins lents. Comment les connaître ? Hé bien il existe tout ce qu'il faut dans le protocole IP pour cela et donc des commandes qui vont avec.

Ping

La première est ping. Bon, je ne vous apprendrai pas à vous en servir. C'est uniquement pour vous indiquer l'option -R qui permet de mémoriser par où passent les paquets. Mais cela ne marche que pour les routeurs qui l'acceptent et uniquement lorsqu'il y a moins de 9 routeurs sur votre chemin.

$ ping -R www.net

Traceroute

La commande suivante est traceroute. Tout routard d'internet connaît un peu traceroute. Par défaut celui-ci envoie des paquets UDP avec un TTL de plus en plus long. Le TTL limitant le nombre de routeurs qu'un paquet peut traverser, lorsque la limite est atteinte, le routeur préviendra l'émetteur que son paquet est perdu (si sa conf ne lui interdit pas). On peut donc avoir progressivement les informations sur tous les routeurs d'un chemin et leur temps de réponse.

$ traceroute www.net

Traceroute vous affiche alors la liste des routeurs traversés avec le temps de réponse. Une étoile indique qu'il n'y a pas eu de réponse.

En général, on utilise l'option -I qui utilise des paquets ICMP plutôt qu'UDP, ceci pour la simple raison que les routeurs acceptent plus souvent les paquets ICMP qu'UDP. En effet, il ne faut pas oublier que le flux doit être ouvert jusqu'au bout. Vous pouvez ajouter l'option -p si vous savez qu'un port UDP spécifique est ouvert.

$ traceroute -I www.net

continue reading...

Niveau :      
Résumé : telnet www.net http

Il existe toujours de bonnes raisons pour connaître les protocoles ou tout au moins connaitre les commandes de base. Dans le cas du HTTP, c'est assez simple. Le protocole HTTP 1.0 peut être résumé en une ligne :

$ telnet www.com http
> GET /toto.html

Et c'est tout, la page http://www.com/toto.html est renvoyée telle quelle.

Pour quelques options supplémentaires, il faut préciser la version de http désirée (HTTP/1.0 ou HTTP/1.1).

Le HTTP 1.0 est tout de même dépassé de nos jours. Les sites web étant très souvent mutualisés sur les mêmes serveurs, il vous faut connaître le HTTP 1.1. La base reste assez simple (attention au dernier retour à la ligne) :

$ telnet www.com http
> GET /toto.html HTTP/1.1
> Host: www.com
>

Et voilà, vous avez quasiment le même résultat précédé de quelques en-têtes. Ou un résultat différent s'il y avait plusieurs sites différents hébergés sur www.com. N'oubliez pas ce petit truc, c'est bien pratique pour tester un site dont l'entrée DNS n'est pas encore déclarée correctement. Il suffit de faire le telnet directement sur l'ip.

Notez qu'avec wget vous pouvez faire l'équivalent :

$ wget --header="Host: www.com" "http://127.0.0.1/toto.html"

continue reading...

Niveau :      
Résumé : PS1="[\t] \[\e[01;32m\]\u@\h\[\e[00m\]:\[\e[01;34m\]\w\[\e[00m\]\$ "

Si vous utilisez bash, la variable $PS1 décrit le prompt principal, celui qui s'affiche à chaque ligne de commande. Il est souvent initialisé à quelque chose comme login@host:path$ mais vous pouvez y mettre ce que vous voulez.

Faisons un test :

$ PS1=youpi

Mais revenons à quelque chose de plus standard :

$ PS1="\u@\h:\w\$ "

Vous aurez compris que les '\\' représentent des valeurs interprétées par le shell. Utilisons-en quelques unes sympathiques.

Si vous voulez être avertis par un bip à chaque nouvelle ligne (cela vous indique que la commande précédente vient de se terminer), précédez le de \a.

$ PS1="\a\u@\h:\w\$ "

Si vous pensez que votre shell n'est pas assez aéré, ajoutez un retour à la ligne :

$ PS1="\u@\h:\w\$\n"

Vous pouvez aussi intégrer l'heure à votre prompt, cela peut être utile pour estimer la durée de vos commandes :

$ PS1="[\t] \u@\h:\w\$ "

continue reading...

Niveau :      
Résumé : iftop

Si vous êtes sur une machine très utilisée ou si vous constatez des lenteurs réseau, il se peut que la quantité de trafic soit en cause. Pour le vérifier, il existe une méthode simple lorsqu'on est root :

$ iftop

Cette commande lance une petite interface ncurses qui liste toutes les connexions de la machines. Des barres sont affichées en inversion vidéo pour représenter visuellement le débit.

Les raccourcis à connaître pour rendre plus lisibles les données sont :

  • t : regrouper les débits entrants et sortants d'une connexion en une seule ligne (ou afficher uniquement l'un ou l'autre)
  • s : effacer les sources (cela regroupe les lignes par destinataire)
  • d : même chose dans l'autre sens (cela regroupe les lignes par émetteur)
  • p : dégrouper les connexions par port (S et D pour n'en dégrouper qu'un seul)

Si vous avez beaucoup de connexions il se peut que vous vouliez filtrer. Pour cela vous avez 2 possibilités. Tout d'abord l'option -f de iftop qui prend un filtre au même format que tcpdump (touche f pour l'équivalent en live). Attention, iftop ne conserve que les paquets IP.

$ iftop -f "port http"

Ensuite vous aurez envie de scroller parmi vos nombreuses connexions. Pour cela stabilisez l'affichage (touche o ou éventuellement P pour un gel complet) et scrollez avec les touches j et k. Une autre méthode est de filtrer les machines à l'affichage avec la touche l.

Iftop supporte de nombreuses options courantes comme -n pour ne pas résoudre les noms. Si vous voulez voir tout ce qui transite sur le réseau et pas seulement ce qui vous est destiné, utilisez l'option -p.

$ iftop -np

Une dernière chose, si vous utilisez régulièrement iftop, faites-vous un fichier de configuration ~/.iftoprc pour ne pas retaper les paramètres à chaque fois.

Et bien sûr man 8 iftop reste votre ami pour plus de détails.

Niveau :      
Résumé : lsattr ; chattr

Vos fichiers contiennent plus d'informations que vous le ne pensez. Il n'y a pas que les données du fichier, il y a ses méta données, le nom, les droits, les acl, les attributs et les attributs étendus.

Comme vous connaissez déja le nom (mv, rm ...), le contenu (cat, vi ...) et les droits (ls -l, chmod ...) nous allons nous intéresser aux attributs.

Par défaut les attributs d'un fichier ne sont pas positionnés. Pour lire ces attributs, il faut utiliser la commande lsattr.

$ lsattr fichier

Et pour les changer chattr (vous devez être root) :

$ chattr +i fichier

L'utilisation en est simple, option -R pour la récursivité et la liste des attributs précédée de '+' ou '-' selon que vous voulez en ajouter ou en supprimer. Un attribut a dans certains cas un équivalent en option de montage. Mais l'attribut s'applique uniquement aux fichiers concernés.

Chaque attribut fait un caractère. Le plus connu et le plus intéressant est celui de l'exemple 'i'. Il permet de rendre un fichier strictement non modifiable, même par root. A quoi cela sert-il si root peut faire chattr -i ? Tout simplement à contrecarrer les plans d'une commande qu'on ne maîtrise pas complètement. Si pour une quelconque raison vous avez compilé votre /bin/ps et que vous vouliez qu'aucun upgrade ne puisse jamais le remplacer par mégarde, donnez lui l'attribut 'i'.

Toujours plus

Si les autres attributs sont moins connus c'est aussi qu'ils ont moins souvent d'utilité. Mais certains ont quand même un petit intérêt.

L'attribut 'a' est utile pour les fichiers fonctionnant comme des fichiers de logs. Il permet de n'autoriser que l'ajout de données à la fin du fichier (comme les listes de courses). C'est surtout utile pour les fichiers partagés entre plusieurs utilisateurs si vous voulez éviter les mauvaises blagues de suppression de lignes ou de fichier tout en laissant les droits d'écriture aux utilisateurs.

L'attribut 'A' est intéressant sur toute une arborescence. C'est l'équivalent de l'option noatime des systèmes de fichier. Il permet de faire en sorte que la date du dernier accès ne soit pas mise à jour lors des accès. C'est utile sur les serveurs NFS très chargés pour gagner du temps processeur. C'est aussi utile sur les disques où l'écriture est très lente ou limitée (flash), ou pour les originaux qui mettent leur journal sur un disque externe.

Pour les fichiers que vous ne voulez absolument pas perdre, il y a 'S' (écriture synchronisée sur le disque) et 'j' écriture des données (et pas seulement des métadonnées) dans le fichier journal. Mais bon, vous pouvez aussi utiliser les options sync et journal=data de votre système de fichier.

Nous avons ensuite les attributs qui pourraient être utiles mais qui ne sont pas implémentées dans ext2 et ext3 : 's' et 'u'. 's' permet de sécuriser la suppression, les données sont réécrites (et pas seulement les méta données). 'u' au contraire permet de ne pas effacer totalement les données pour rendre le fichier récupérable.

Et enfin nous avons des attributs peu utiles ou non implémentés. Vous les trouverez dans man 1 chattr.

Niveau :      
Résumé : kill -9 $$ && ...

Lors d'un recent article je vous expliquais qu'on peut faire disparaître son propre historique shell. Malheureusement, il reste une trace de votre connexion dans le fichier /var/log/wtmp lisible par la commande last.

On m'a demandé comment y remédier, et c'est ce que nous allons voir. Attention, seul root peut faire ceci, si vous le faites, c'est donc que la machine vous appartient ;-)

Étude de fichier

Tout d'abord étudions le format de ce fichier. C'est un fichier binaire dont chaque entrée correspond à une structure bien décrite dans man 5 utmp. Pour mieux la comprendre nous allons écrire un petit programme en C pour lire le fichier. Nous comparerons sa sortie à la commande last.


continue reading...