[redgtux] blog

Aller au contenu | Aller au menu | Aller à la recherche

lundi, février 8 2010

Autoriser un processus non-root à utiliser un port < 1024 sous Linux

Il existe une limitation historique dans la plupart des systèmes UNIX : seul les processus appartenant à root peuvent utiliser les ports réservés (dont le numéro est inférieur à 1024). Cette limite est sensée protéger le système mais elle peut poser des problèmes de sécurité; en effet cela oblige root à lancer tous les process qui utilisent des ports réservés... Heureusement la plupart des démons forkent sur un utilisateur non privilégié mais ce n'est pas toujours le cas. La plupart des demons en java par exemple doivent être lancés par root si on veut pouvoir ouvrir des ports réservés, ce qui pose un gros problème de sécurité.

Je vais vous présenter ici quelques méthodes générales qui permettent de passer outre cette limitation sous Linux, chacune ayant ses avantages et ses inconvénients...

  • Utiliser le setuid

chown root /chemin/executable
chmod +S /chemin/executable

Le problème avec cette méthode est que l'on s'expose à de gros problèmes de sécurité car le processus tourne avec les droits de root; si un attaquant exploite une faille dans l'executable, il se retrouve lui-même root sur la machine.

  • Faire une redirection de port avec iptables

L'idée est de configurer le service pour utiliser un port non réservé et de faire une redirection vers le port réservé avec une règle iptables, par exemple :

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to 8080

Dans cet exemple, tout le traffic entrant sur le port 80 est redirigé vers le port 8080 sur lequel le process écoute. Le problème dans ce cas est que l'on introduit une couche supplémentaire de complexité.

  • Utiliser les capabilities du noyau Linux

Cette méthode est à mon sens la plus efficace mais elle ne fonctionne que sur les noyaux récents (>= 2.6.24). Il est possible d'indiquer les capabilities que chaque processus Linux peut utiliser. Dans notre cas ce qui nous intéresse est le CAP_NET_BIND_SERVICE (faire un man capabilities pour les détails). Pour donner ce droit à un executable il faut taper :
setcap 'cap_net_bind_service=+ep'/chemin/executable
Si la commande setcap n'existe pas sur votre système, il faut installer le paquet libcap ou libcap2.

mardi, janvier 26 2010

LVM : locking type 1 initialisation failed

Cette erreur peut apparaître lorsque l'on essaie de lancer une commande LVM sur un système Linux, par exemple :
# /sbin/lvm pvscan

locking type 1 initialisation failed


En fait cette erreur vient du fait que LVM n'arrive pas à écrire dans /var/lock/lvm/. Souvent, si Linux est démarré en mode maintenance, seuls les filesystems essentiels sont montés (/ en général) et ils le sont uniquement en lecture-seule. On peut les remonter en lecture-écriture avec une commande de ce type :

# mount -oremount,rw FS

Sinon, pour palier à ce message d'erreur, il est également possible d'ajouter l'option --ignorelockingfailure à chaque commande LVM, par exemple :
# /sbin/lvm pvscan --ignorelockingfailure

  PV /dev/cciss/c0d0p5   VG VG   lvm2 [60,41 GB / 52,34 GB free]
  Total: 1 [60,41 GB] / in use: 1 [60,41 GB] / in no VG: 0 [0   ]

lundi, janvier 18 2010

Copie de tous les fichiers avec bash (y compris les fichiers cachés)

Plusieurs techniques existent. C'est valable pour ''ls'', ''cp'' ou ''scp''...

  • On peut tricher et n'afficher que les fichiers cachés

cp -a .[!.]* /dossier/de/destination
cp -a .[^.]* /dossier/de/destination

  • On peut désactiver le comportement du * par défaut. Il faut ensuite lancer la commande normale.

shopt -s dotglob

samedi, janvier 16 2010

Joindre deux fichiers sous UNIX

Voici une méthode simple pour joindre (accoler) deux fichiers sous UNIX, par exemple avec :

file1 :

renault

peugeot

file2 :

megane

308

On cherche à obtenir :

file3 :

renault       megane

peugeot     308

La commande pour faire cela est tout simplement :

paste file1 file2 > file3

La commande paste existe sous AIX et Linux, je n'ai pas fait de test sur d'autres OS. Il existe aussi la commande join mais il faut un champ commun entre les deux fichiers, on peut par exemple numéroter les lignes avec nl avant d'utiliser join.

mardi, janvier 12 2010

Récupération des informations système sous AIX

Pour aujourd'hui, voici quelques commandes permettant d'afficher diverses informations système sous AIX.

  • Type de serveur

lscfg -pl sysplanar0

  • Toutes les infos

prtconf

  • Adresse MAC d'une carte réseau :

entstat <interface>

  • Version du firmware system

lsmcode -rt system

  • Version du microcode d'une carte HBA

lsmcode -c -d <carte>

  • Taille des disques :

bootinfo -s <disque>
Ou sinon :
prtconf | grep hdisk

  • Version en cours

oslevel -r

  • Savoir ce qu'il manque pour passer au TL suivant :

Il faut utiliser instfix. On peut chercher les packages qui ne sont pas installés:
instfix -ivk 5200-10_AIX_ML |grep not
On peut aussi chercher ceux qui sont inférieur au niveau de référence avec grep ":-:". Si on remplace le signe - par + on trouve les packages d'un niveau supérieur au niveau de référence et si on utilise = on trouve uniquement les packages à niveau.

instfix -ciqk 5200-10_AIX_ML|grep ":-:"

Une autre manière de faire est d'utiliser l'option -l avec oslevel -s ou oslevel -r.
oslevel -rl 5300-07

Fileset Actual Level Recommended ML
-----------------------------------------------------------------------------
ICU4C.rte 5.3.0.60 5.3.7.0
OpenGL.OpenGL_X.rte.base 5.3.0.61 5.3.7.0
OpenGL.OpenGL_X.rte.soft 5.3.0.60 5.3.7.0
X11.base.rte 5.3.0.60 5.3.7.0
bos.64bit 5.3.0.61 5.3.7.0
oslevel -sl 5300-06-01-0732


mardi, janvier 5 2010

Redimentionner un volume DRBD à chaud

  1. Pré-requis :
    1. Connaitre le nom du volume utilisé par DRBD sur les deux nodes (attribut disk dans /etc/drbd.conf).
    2. Connaitre le nom de la ressource DRBD (regarder dans /etc/drbd.conf), dans la suite on utilisera nagios comme exemple.
    3. Le volume utilisé par DRBD doit être de type LVM ou EVMS.
    4. La ressource DRBD doit être en etat Connected et sans split-brain, vérifier avec les commande suivantes :
  2. # drbdadm state ressource

    Primary/Secondary

    # drbdadm cstate ressource

    Connected

  3. Procedure :
    1. Etendre le volume sur les deux nodes (leur donner la meme taille), par exemple avec LVM :
    2. lvextend -L1G /dev/VG/LV
    3. Sur un des deux nodes, redimentionner au niveau DRBD :
    4. drbdadm resize ressource
    5. Enfin, sur le node Primary, étendre le système de fichiers; par exemple avec de l'EXT3 :
    6. ext2online /point/de/montage
      ou si ext2online n'existe pas sur votre systeme
      resize2fs /point/de/montage

Afficher le contenu d'un .tar sans le décompresser

On se demande souvent comment afficher le contenu d'une archive tar sans avoir à la décompresser dans un dossier temporaire, voici une solution :

tar tf archive.tar.gz
Cela fonctionne aussi pour un .tar.bz2

Faire un chroot facilement sous Red Hat

Il existe plein de méthodes pour construire des environnements chrootés mais il faut toujours installer à la main plein de binaires.
Sous Debian et dérivés, on peut utiliser debootstrap pour aller plus vite. Voici un équivalent dans le monde Red Hat :
  • Creer le repertoire du chroot et la structure de base RPM :
mkdir -p /chroot/toto1 rpm --root /chroot/toto1 --initdb
  • Telecharger le paquet de la distribution a installer (chercher ''yumdownloader'' sur les repository centos si besoin).
yumdownloader --destdir=/var/tmp fedora-release
cd /var/tmp
rpm --root /chroot/toto1 -ivh --nodeps redhat-release*rpm

  • Installer dans la jail tous les packages necessaires :
yum --installroot=/chroot/toto1 -y install coreutils

Augmenter le nombre de process maximum par utilisateur sous AIX

Un premier billet sur AIX, pour répondre à une question que je me suis souvent posée. Cela permet de résoudre ce genre de problème : The fork function failed. Too many processes already exist..

  1. Changer le nombre de process par user à 1024 par exemple (on peut aussi faire via smitty) :

chdev -l sys0 -a maxuproc='1024'

  1. Vérifier que la modification a bien été prise en compte :

lsattr -El sys0 | grep maxuproc