Port Knocking et installation de Knockd sous debian

Le port no quoi ?

Le port knocking est un système permettant de débloquer les port d’une machine en fonction d’une suite de «knock» reçu sur certains ports. De ce fait, il est possible d’ouvrir un port ssh qu’après avoir reçu un knock sur le port 3000 et 8000, voir même de demander un knock de type TCP et l’autre de type UDP. Un knock est représenter par une trame TCP ou UDP visant un port particulier du système

Installation de port knocking sous debian

Présentation

knockd est un daemon permettant de faire du port knocking sous Linux. Le service surveille toutes les connexions entrantes sur les interfaces de la machine, si les connexions consécutives correspondent à une séquence de «knocks» qu’il a dans sa configuration, alors il execute une commande permettant d’ouvrir un port.

Installation

Pour installer knockd sous debian c’est très simple. Celui-ci est disponible dans les paquets de Debian Wheezy et peut donc être installé avec la commande suivante:

apt-get install knockd

Après avoir installer knockd, il est neccessaire de modifier le fichier de configuration /etc/default/knockd pour lui donner l’autorisation de démarrer. Pour celà, il suffit de modifier la ligne suivante:

# Avant
START_KNOCKD=0
# Après
START_KNOCKD=1

Configuration de knockd

Nous allons maintenant configuer knockd pour ouvrir le port 22 (ssh) lorsque des knocks sont détectés sur les ports 7000, 8000 et 9000 en TCP. Nous allons donc modifier le fichier /etc/knockd.conf et lui appliquer la configuration suivante.

[opencloseSSH]
        sequence    = 7000,8000,9000
        seq_timeout = 5
        start_command     = /sbin/iptables -I INPUT 1 -s %IP% -p tcp --dport 22 -j ACCEPT
        tcpflags    = syn
        cmd_timeout   = 10
        stop_command  = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT

Nous demandons donc à knockd d’ouvrir le port en rajoutant une règles iptables quand les knocks correspondent. Nous lui demandons aussi de refermer ce port au bout de 10 secondes. Par défaut les ports indiqué doivent être «knocké» en TCP, mais il est aussi possible de demander de l’UDP. Pour ça il suffit d’indiquer le port suivant de son protocôle de la manière suivante: num_port:protcole.

Nous pouvons maintenant démarrer knockd:

service knockd start

Configuration iptables

Nous allons maintenant définir quelques règles iptables pour profiter de knockd. En effet, de base, debian ne définis aucune règle de filtrage. Tout les ports sont donc ouvert par défaut. Nous allons donc définir des règles permettant de laisser passer certaines trames comme celle transitant sur notre boucle locale. Puis nous demanderons à iptables de droper tout les paquets en dernier recours:

iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -j DROP

Ouvrir le port à distance

Pour éxecuter une suite de knock rien de plus simple. Il y a même plusieurs solutions pour le faire.

Le client knock

Lorsque l’on installe le serveur de port knocking «knockd», un client est automatiquement installé avec. Il se nomme subtilement knock. Pour l’utiliser rien de plus simple:

knock ip_server 7000 8000 9000

Et par exemple si le port 8000 doit être «knocké» en UDP:

knock ip_server 7000 8000:udp 9000

NMAP

Il est aussi d’utiliser le scanner de port NMAP pour effectuer des knocks:

nmap -Pn --host_timeout 201 --max-retries 0  -p 7000 ip_server
nmap -Pn --host_timeout 201 --max-retries 0  -p 8000 ip_server
nmap -Pn --host_timeout 201 --max-retries 0  -p 9000 ip_server

Conclusion

Comme vous pouvez le voir knockd est très simple à mettre en place. Pensez tout de même à prendre votre temps sur la rédaction de vos règles iptables, ça serait balot de perdre la main sur votre machine distante pendant la configuration ;)

Les partitions sous linux

Bien le bonjour ! Cela fait un petit moment que je ne suis pas venu par ici déposer un nouvel article. Profitant d’un cours que j’ai pu rédiger pour mon école je me suis dit qu’il serait intéressant de le partager ici. Nous parlerons donc aujourd’hui de la création de partition sous Linux et leur gestion!

Introduction

Une partition est par définition une zone logique située dans un disque dur, permettant d’isoler les données d’une partition à l’autre. Cela permet par exemple d’utiliser plusieurs systèmes de fichier sur un même disque dur.

Dans un système UNIX, les disques durs peuvent être trouvés dans le dossier /dev. Leurs noms diffèrent en fonction de leur nombre et de leur type. Leurs formes seront toujours /dev/XXY, où XX représente le type du disque dur et Y la lettre correspondant à son emplacement.

Les deux principaux types de disques durs que vous serez amenés à croiser sur votre système seront les disques IDE (hd) et les disques SATA (sd). Par exemple si nous voulons accéder au deuxième disque SATA présent sur un système son nom sera /dev/sdb (b étant la deuxième lettre de l’alphabet).

Si vous avez été curieux, peut être avez vous remarqué des fichiers dans le dossier /dev avec des noms tels que sda1, sda2, et sda3. Rien de bien compliqué ici, il s’agit tout simplement des différentes partitions présentes sur le disque représentées par le nom du disque, puis le numéro de la partition.

Affichage des partitions

L’utilitaire fdisk est très utile pour créer des partitions. Mais il s’avère aussi capable d’afficher les partitions présentes sur un disque dur comme dans l’exemple suivant:

[root@pr0tos y0no]# fdisk -l
Disk /dev/sda: 750.2 GB, 750156374016 bytes, 1465149168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk label type: dos
Disk identifier: 0x0005b350

Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *          63       64259       32098+  83  Linux
Partition 1 does not start on physical sector boundary.
/dev/sda2           64260     1060289      498015   82  Linux swap / Solaris
Partition 2 does not start on physical sector boundary.
/dev/sda3         1060290  1465149167   732044439   83  Linux
Partition 3 does not start on physical sector boundary.

Création de partitions

Tout d’abord il est important de vérifier qu’il reste de l’espace sur le disque dur avec la commande vue précédemment. Si c’est bien le cas nous allons pouvoir commencer à étudier la création de partitions.

Pour cela, continuons avec l’utilitaire fdisk:

[root@pr0tos y0no]# fdisk /dev/sdb

Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
Partition number (1-4, default 1):
Using default value 1
First sector (2048-16777215, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-16777215, default 16777215):
Using default value 16777215

Command (m for help): p

Disk /dev/sdb: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders, total 16777216 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x3f775d6d

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    16777215     8387584   83  Linux

Command (m for help): w

The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

Comme nous pouvons le voir dans l’exemple juste au-dessus, il suffit de donner le nom du disque dur que l’on veut partionner pour arriver dans le shell fdisk. La commande n permet de créer une nouvelle partition. Il suffit ensuite de suivre les instructions pour définir un numéro de partition, son premier puis dernier secteur. Enfin on peut vérifier le résultat avec la commande p puis sauvegarder le tout avec w.

Voilà pour la création de partition, voyons maintenant comment définir son système de fichiers.

Définir le système de fichier

Théorie

Tout d’abord, un bref récapulatif de ce qu’est un système de fichier me semble ne pas être de trop. Un système de fichier (aussi appelé FileSystem) est une manière logique de stocker et d’organiser les fichiers sur un support de stockage (dans notre cas un disque dur). Chaque système de stockage à ses avantages et inconvénients que ce soit au niveau de la vitesse d’écriture, de lecture, ou de la journalisation. Sur les systèmes UNIX le filesystem recommandé est ext (EXtended Filesystem), il existe en 4 versions numérotées extX. Voyons les caractéristiques des versions encore utilisées:

  • ext2 est le système original de Linux, malheureusement il n’y a pas de journalisation des métadonnées. La routine de vérification du filesystem au démarrage peut donc être long.
  • ext3 est l’évolution de l’ext2, ses performances résident dans l’apparition de la journalisation des métadonnées pour une récupération rapide des fichiers.
  • ext4 est une “mise à jour” de l’ext3, il permet de gérer des disques dur de tailles très importantes (1 Eo) contenant des fichiers pouvant peser jusqu’à 16To.

Pratique

Passons maintenant à la pratique en formatant notre partition récemment crée. Pour cela rien de bien compliqué, il suffit d’utiliser l’utilitaire mkfs. Sur la majorité des systèmes d’exploitation l’utilisation de mkfs se résume à la commande suivante:

mkfs.XXXX /dev/YYYY

Où XXXX est le type de filesystem voulu et YYYY est la partition que nous voulons formater. Reprenons notre partition précédente et formatons la en ext4:

[root@pr0tos y0no]# mkfs.ext4 /dev/sdb1
mke2fs 1.42.5 (29-Jul-2012)
Étiquette de système de fichiers=
Type de système d'exploitation : Linux
Taille de bloc=4096 (log=2)
Taille de fragment=4096 (log=2)
« Stride » = 0 blocs, « Stripe width » = 0 blocs
524288 i-noeuds, 2096896 blocs
104844 blocs (5.00%) réservés pour le super utilisateur
Premier bloc de données=0
Nombre maximum de blocs du système de fichiers=2147483648
64 groupes de blocs
32768 blocs par groupe, 32768 fragments par groupe
8192 i-noeuds par groupe
Superblocs de secours stockés sur les blocs :
    32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

Allocation des tables de groupe : complété                        
Écriture des tables d'i-noeuds : complété                        
Création du journal (32768 blocs) : complété
Écriture des superblocs et de l'information de comptabilité du système de
fichiers : complété

Montage et démontage de la partition

Manuellement

Les commandes mount et umount permettent de gérer le montage d’une partition facilement. Et comme un exemple vaut plus que des mots:

[root@pr0tos y0no]# mount -t ext4 /dev/sdb1 /mnt/test/
[root@pr0tos y0no]# cat /etc/mtab
rootfs / rootfs rw 0 0
sysfs /sys sysfs rw,nosuid,nodev,noexec,relatime 0 0
proc /proc proc rw,nosuid,nodev,noexec,relatime 0 0
udev /dev devtmpfs rw,relatime,size=10240k,nr_inodes=126817,mode=755 0 0
devpts /dev/pts devpts rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000 0 0
tmpfs /run tmpfs rw,nosuid,noexec,relatime,size=102704k,mode=755 0 0
/dev/disk/by-uuid/a1033ad6-cce1-4d99-a737-e5a74a8aca8c / ext4 rw,relatime,errors=remount-ro,user_xattr,barrier=1,data=ordered 0 0
tmpfs /run/lock tmpfs rw,nosuid,nodev,noexec,relatime,size=5120k 0 0
tmpfs /run/shm tmpfs rw,nosuid,nodev,noexec,relatime,size=283840k 0 0
fusectl /sys/fs/fuse/connections fusectl rw,relatime 0 0
gvfs-fuse-daemon /home/y0no/.gvfs fuse.gvfs-fuse-daemon rw,nosuid,nodev,relatime,user_id=1000,group_id=1000 0 0
/dev/sdb1 /mnt/test ext4 rw,relatime,user_xattr,barrier=1,data=ordered 0 0
[root@pr0tos y0no]# umount /mnt/test/

Donc résumons ce que nous venons de faire. Nous avons monté notre partition avec la commande mount, nous lui avons indiqué le type de filesystem à monter, l’emplacement de la partition, puis son point de montage.

Nous avons ensuite vérifié que notre montage était bel et bien monté en regardant dans le fichier /etc/mtab. Celui-ci tient en temps réel l’état des montages sur le système. A noter que sur les systèmes solaris ce fichier se nomme mnttab et non pas mtab.

Enfin nous avons démonté notre volume avec la commande umount en lui indiquant le point de montage à retirer.

Automatiquement

Concernant le montage automatique de nos partitions, nous allons nous tourner vers le fichier /etc/fstab. Ce fichier permet d’indiquer au système les partitions qu’il devra monter au démarrage. Nous allons donc y mettre notre partition et ses arguments de la manière suivante:

[root@pr0tos y0no]# cat /etc/fstab
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
# / was on /dev/sda1 during installation
UUID=a1033ad6-cce1-4d99-a737-e5a74a8aca8c /               ext4    errors=remount-ro 0       1
# swap was on /dev/sda5 during installation
UUID=2ffbdf14-92c8-4ee5-a563-0a5930085ef2 none            swap    sw              0       0
/dev/sr0        /media/cdrom0   udf,iso9660 user,noauto     0       0

/dev/sdb1	/mnt/test	ext4	rw,acl	0	0

Nous indiquons au fichier la partition que nous voulons monter, son point de montage, puis son filesystem. La quatrième colonne indique les options de montage que nous souhaitons mettre en place (nous y reviendrons) et les colonnes suivantes concernent la programmation d’archivage et l’ordre de vérification qu’empruntera l’outil fsck.

Concernant les options nous avons autorisé l’accès en lecteur/écriture (rw) sur cette partition, puis nous y avons indiqué que nous souhaitions utiliser les ACLs pour la gestion des droits. Pourquoi les ACLs ? C’est ce que nous allons voir dans le prochain point de cet article. Mais d’abord, voyons les options que nous aurions pu ajouter:

  • noauto pour ne pas monter automatiquement la partition au démarrage.
  • noexec pour interdire l’exécution de fichier binaire.
  • user pour autoriser n’importe quel utilisateur à monter/démonter la partition.

Voilà c’est à peu près tout concernant le montage des partitions !

Gestion des droits et créations d’ACLs

Théorie

Les ACLs ne remplacent bien sûr pas la gestion des droits déjà implémentée dans les systèmes UNIX, mais a l’avantage de proposer une gestion affinée des droits dans des cas bien précis. Imaginons que nous voulions partager un de nos fichiers avec un autre utilisateur n’appartenant pas au même groupe que nous, la gestion UGO (User/Group/Other) ne permettrait pas de résoudre ce problème facilement sans modifier ou créer un groupe. C’est là qu’interviennent les ACLs. Mais avant de pouvoir en créer, il faut s’assurer que deux prérequis ont été respectés:

  • Le noyau doit gérer les ACLs
  • La partition est montée avec l’option acl (voir le point précédent)

Si tout est prêt, passons à la pratique !

Pratique

Commençons par créer un utilisateur n’appartenant pas à l’un de nos groupes:

[root@pr0tos y0no]# useradd bobi
[root@pr0tos y0no]# passwd bobi
Entrez le nouveau mot de passe UNIX :
Retapez le nouveau mot de passe UNIX :
passwd : le mot de passe a été mis à jour avec succès

Créons ensuite dans notre partition un fichier avec des droits, uniquement pour notre utilisateur:

[root@pr0tos /mnt/test]# touch fichierTest
[root@pr0tos /mnt/test]# chmod 700 fichierTest
[root@pr0tos /mnt/test]# chown y0no:y0no fichierTest
[root@pr0tos /mnt/test]# ls -al fichierTest
-rwx------ 1 y0no y0no 0 oct.  14 11:25 fichierTest
[root@pr0tos /mnt/test]# su bobi
bobi@ExiaExercise:/mnt/test$ echo "test" > fichierTest
bash: fichierTest: Permission non accordée

Avec ce genre de droits notre utilisateur bobi ne pourra jamais accéder au fichier fichierTest, voyons comment résoudre ça avec une ACLs:

y0no@ExiaExercise:/mnt/test$ getfacl fichierTest
# file: fichierTest
# owner: y0no
# group: y0no
user::rwx
group::---
other::---
y0no@ExiaExercise:~$ setfacl -m u:bobi:rwx /mnt/test/fichierTest
y0no@ExiaExercise:/mnt/test$ getfacl fichierTest
# file: fichierTest
# owner: y0no
# group: y0no
user::rwx
user:bobi:rwx
group::---
mask::rwx
other::---

Comme on peut le voir au-dessus, la commande getfacl permet de voir les droits et les ACLs en actions sur un fichier ou un dossier. A la première exécution, nous voyons bien que l’utilisateur y0no est le seul à avoir des droits sur le fichier.

La commande setfacl, elle, permet de définir des droits. Dans notre exemple nous demandons au système d’ajouter à l’utilisateur bobi (u:bobi) les droits de lecture/écriture/exécution (:rwx) sur fichierTest.

Enfin nous exécutons une nouvelle fois getfacl pour vérifier que notre utilisateur à bel et bien une ACL le concernant. Nous pouvons maintenant vérifier les autorisations:

bobi@ExiaExercise:/mnt/test$ echo "test" > fichierTest
bobi@ExiaExercise:/mnt/test$ cat fichierTest
test

Conclusion

Pour résumer notre cheminement, nous avons vu comment créer et formater une partition grâce aux outils fdisk et mkfs. Nous avons ensuite appris à monter/démonter une partition manuellement avec mount et umount, puis automatiquement avec l’utilisation du fichier fstab. Enfin nous avons appris à affiner les droits d’un fichier avec l’utilisation des ACLs (commandes getfacl et setfacl).

Voilà, c’est tout pour aujourd’hui, sur ce à bientôt!