Linux MAC (Mandatory Access Control) avec Akari (Tomoyo)

Plop à tous …

Aujourd’hui je vais parler MAC (Mandatory Access Control), l’une des techniques les plus simple pour contrôler l’ensemble des actions des processus sous linux et pourtant si peux utilisé :s.

Généralement en MAC, on parle souvent de GrSec, AppArmor ou encore de SeLinux.

Entre apparmor qui gère à peine le réseau (ça se limite à autoriser de l’udp ou du tcp, sans plus de détaille), SeLinux avec ses liens avec la NSA, ainsi qu’une syntaxe hardcore et GrSec qui nécessite de patcher son kernel.

L’interêt de Akari, c’est qu’il s’agit d’un module, donc y’a pas besoin de recompiler le kernel, ça s’installe facilement, la configuration est aussi très simple, un mode d’apprentissage est disponible permettant de détecter la configuration la plus strict possible pour le processus en question.

Pour l’install sur Ubuntu, j’ai un petit script sympa qui fait l’install du module et du logiciel d’administration :

#!/bin/bash
VERSION=$(uname -r)
apt-get install wget gcc make libncurses-dev linux-headers-${VERSION}
cd /usr/src/linux-headers-${VERSION}/

wget -O akari-1.0.27-20120710.tar.gz 'http://sourceforge.jp/frs/redir.php?f=/akari/49272/akari-1.0.27-20120710.tar.gz'
tar -zxf akari-1.0.27-20120710.tar.gz

make SUBDIRS=$PWD/akari modules
make SUBDIRS=$PWD/akari modules_install
depmod ${VERSION}

cd /tmp
wget -O ccs-tools-1.8.3-20120414.tar.gz 'http://sourceforge.jp/frs/redir.php?f=/tomoyo/49693/ccs-tools-1.8.3-20120414.tar.gz'
tar -zxf ccs-tools-1.8.3-20120414.tar.gz
cd ccs-tools/
make -s USRLIBDIR=/usr/lib
make -s USRLIBDIR=/usr/lib install

Une fois que tout est installé, on commence la configuration, si on ne veut que la vérification sur les accès sur des fichiers (read write)
les – – sont à coller, wordpress ne les aime pas côte à côte :s

/usr/lib/ccs/init_policy - -file-only-profile - -module_name=akari

Sinon on active le tout : vérification des variables d’environnement, accès aux fichiers, accès au réseaux (avec contrôles des ports, protocoles et IP accédé par le processus).

/usr/lib/ccs/init_policy - -module_name=akari

Ensuite faut lancer la chose au boot, avant l’init en fait, donc faut modifier la ligne de boot du kernel, on édite /etc/default/grub, et on modifie

GRUB_CMDLINE_LINUX=""

en

GRUB_CMDLINE_LINUX="init=/sbin/ccs-init"

un coup de

sudo update-grub

et on reboot, pour comprendre le fonctionnement d’akari, je conseille de lire au moins ça :
Quelques bases sur le fonctionnement d’Akari

Le logiciel à executer en root s’appel ccs-editpolicy, ça fournit une interface ncurse avec la hierarchie des processus à gérer.

Les profiles

Y’a un système de profile qui permet de switch entre les modes désactivé (par défaut), apprentissage, permissif et ‘enforcing’. On peut aussi créer ses propres modes, pour des logs ou autres, plutôt sympa couplé à un IDS (Ossec ou Prelude ;)) pour rapporter des erreurs (je ferais probablement un article là dessus).

les Domaines et leurs exceptions

Une notion très importante dans Tomoyo ou Akari, est la notion de Domain (expliqué dans le chapitre 4 linké précédemment) pour Tomoyo un « /bin/bash /bin/cat » et un « /bin/sh /bin/cat » sont considéré comme différent d’un point de vue « droit de base » si l’on édite directement le processus (sont domain en fait) dans l’interface ncurse gérant le domaine en question, il faut donc créer une exception au domaine (détaillé à l’étape 5.2) de cat « initialize_domain /bin/cat from any » et éditer ses droits dans ce domaine-ci. (l’utilisation de cat dans un bash ou un sh à été pris ici comme exemple ;)).

Définition de règles

Via apprentissage

Le plus simple pour gérer ses droits est de passer un Domaine en apprentissage, de le laisser faire ça tembouille et de passer en Enforcing ensuite.

Pour ce faire on lance donc ccs-editpolicy, avec les flèches bas et haut on sélectionne son processus (sans faire entrer), et on appuie sur s, un invité s’affiche et on tappe 1 (le numéro du mode Learning que l’on peut récupérer en faisant w puis p, si vous le faite, revenez dans le domain transition editor en faisant w puis d) puis entrer, toutes les actions effectuées sur le logiciel seront enregistré directement (accès fichier, accès réseaux, …).

Pour voir les règles il suffit d’appuyer à nouveau sur entrer, on a accès ensuite à la liste des actions autorisées par le système. (Si vous comptez configurer un serveur web ou d’autre logiciel assez complexe en terme de droits (réseaux, accès db, …), je vous conseille vivement de jouer avec les pattern et les variables pour définir les réseaux autorisé, les path d’accès, …).

Via fichier

Cela dit, si vous préférez définir vos droits dans un fichier et le charger, c’est aussi possible via la commande ccs-loadpolicy et en créant un fichier suivant la syntaxe suivante pour définir les droits (plus fastidieux :s).

Un fichier d’exemple pourrait être (nécessite de spécifier le domaine au début des règles) :

 /usr/sbin/httpd

file read /var/www/html/\*.html
file read /var/www/html/\{\*\}/\*.html
file read /var/www/html/\{\*\}/\*.jpg

On bloque!!

Une fois que l’on a édité les règles, on peut se limiter à celle-ci et bloquer tout le reste en passant en mode Enforcing (3), dans l’interface du « Domain Transition » en sélectionnant le domain puis appuyer sur s et taper 3 puis entrer.

Et voilà … maintenant en plus de gérer les iptables, chmod et chown, il faudra aussi checker la config Akari ^^ en cas de problèmes d’accès au fichiers et au réseaux. Bonne chance 😉