UART et Raspberry PI

Ce post n’a rien de neuf, mais fera office de remember quand la même chose arrivera de nouveau.

Il y a maintenant quelques mois, je me suis retrouvé en face d’un petit problème avec mon raspi 3 et l’image RaspBian du moment.

Pour configurer la première fois mon raspi, j’utilise un câble console/USB (USB to TTL Serial), qui fait aussi office d’alimentation pour le raspi. Cela permet d’avoir un shell lors de la première connexion.

Le câble utilisé est celui-ci :
https://www.modmypi.com/image/cache/data/rpi-products/gpio/debug/USB-to-TTL-Serial-Cable-Debug-Console-Cable-for-Raspberry-Pi-2-800×609.jpg

Sauf que je me suis retrouvé avec l’impossibilité d’obtenir un shell à travers le câble console. Le symptôme est simple : rien ne s’affiche à l’écran.

Pour résoudre ce problème, j’ai donc dû connecter un écran et un clavier. En effet, la méthode consistant à ajouter la ligne

enable_uart = 1

dans le fichier config.txt n’a pas suffit…

Donc voici les étapes :

 

  1. Ajouter la ligne enable_uart= 1 dans le fichier /boot/config.txt
  2. Étendre le système de fichiers grâce à la commande raspi-config
  3. Installer la commande rpi-update
  4. Lancer la commande rpi-update en admin (donc sudo rpi-update) pour mettre à jour le firmware du raspi
  5. Rebooter

Normalement, une fois ces étapes effectuées, la sortie par le câble console devrait fonctionner.

Centos 7 et SELinux, quelques résolutions de problèmes

Lorsque l’on installe un serveur Centos 7 et que l’on active SELinux, on est par défaut dans la politique targeted. Cette politique, bien que déjà suffisante, ne répond pas à toutes les problématiques que l’on pourrait avoir sur un serveur. En effet, le fait de laisser des modules en unconfined peut clairement être un problème de sécurité.

Donc, la première chose à faire est d’installer une politique plus contraignante certes, mais surtout beaucoup plus restrictive.

Je préconise de passer directement en MLS avant d’installer les autres programmes. En effet, il est plus simple de résoudre les problèmes un par un, que de tous les avoir d’un seul coup.


# yum install selinux-policy-mls.noarch

Ce paquet ne vient pas tout seul

[root@ postfix]# yum deplist selinux-policy-mls.noarch
Modules complémentaires chargés : fastestmirror
Loading mirror speeds from cached hostfile
* base: centos.mirrors.ovh.net
* epel: ftp.nluug.nl
* extras: centos.mirrors.ovh.net
* updates: centos.mirrors.ovh.net
paquet : selinux-policy-mls.noarch 3.13.1-102.el7_3.15
dépendance  : /bin/bash
provider: bash.x86_64 4.2.46-21.el7_3
dépendance  : /bin/sh
provider: bash.x86_64 4.2.46-21.el7_3
dépendance  : coreutils
provider: coreutils.x86_64 8.22-18.el7
dépendance  : policycoreutils >= 2.5
provider: policycoreutils.x86_64 2.5-11.el7_3
dépendance  : policycoreutils-newrole >= 2.5
provider: policycoreutils-newrole.x86_64 2.5-11.el7_3
dépendance  : selinux-policy = 3.13.1-102.el7_3.15
provider: selinux-policy.noarch 3.13.1-102.el7_3.15
dépendance  : setransd
provider: mcstrans.x86_64 0.3.4-5.el7

Une fois cette politique installée, il faut aller modifier le fichier /etc/selinux/config et modifier la politique chargée pour mettre mls. Il est important de ne pas mettre la configuration en enforcing, sinon, le serveur risque de pas redémarrer.

Puis, il faudra installer policycoreutils-python-2.5-11.el7_3.x86_64 pour pouvoir manipuler les contextes de sécurité. Ce paquet nous sera nécessaire par la suite.

Il faut associer un compte utilisateur classique (celui qui administrera le serveur) à l’utilisateur SELinux staff_u. Ainsi, l’utilisateur devrait changer de rôle pour devenir sysadm_r pour pouvoir faire les actions d’administration.

Pourquoi le mettre dans staff_u et non en sysadm_u ? Simplement parce que SELinux va interdire la connexion en SSH des comptes associés à l’utilisateur SELinux sysadm_u. Ce paramètre est modifiable en manipulant les booléens SELinux, mais ce n’est pas conseillé.

Avant de redémarrer, il est nécessaire que SELinux relabellise le système de fichiers pour que les nouveaux contextes de sécurité soient appliqués. Pour cela, il suffit de taper


# touch /.autorelabel

Et de redémarrer le serveur. Le redémarrage va être plus long qu’un démarrage classique puisque le système va devoir parcourir entièrement le système de fichiers.

Premiers problèmes

Après la relabellisation et donc le redémarrage, certains fichiers ne possèdent pas le bon contexte de sécurité. Soit parce que le script de relabellisation n’a pas fonctionné correctement, soit parce que les fichiers ont été créés après le mécanisme. Dans tous les cas, vous aurez des erreurs et surtout, des restes de contextes de sécurité unconfined. Pour résoudre ce premier problème, il suffit de taper :


# restorecon -Rv /

Cette commande va forcer la relabellisation du système de fichiers.

Une fois cette première étape passée, vous allez sûrement installer des applications (serveur HTTP, MySQL, etc.). Cependant, vous allez être confrontés à ce genre de message et ce, malgré la relabellisation du système de fichiers.


type=AVC msg=audit(1488804756.793:6136): avc: denied { read } for pid=18603 comm="fail2ban-server" name="localtime" dev="sda1" ino=654211 scontext=system_u:system_r:fail2ban_t:s0-s15:c0.c1023 tcontext=system_u:object_r:locale_t:s15:c0.c1023 tclass=lnk_file

Pour résoudre ce problème, vous serez peut-être tenté de taper la commande magique (audit2allow) qui va lire le contenu des fichiers de logs SELinux et proposer une solution. Mais il se pourrait que l’erreur suivante apparaisse :


[root@ conf.d]# audit2allow -a
[Errno 2] Aucun fichier ou dossier de ce type: '/etc/selinux/mls/contexts/files/file_contexts.local'

Oupss… Bon, la résolution est assez simple puisqu’il suffit de créer le fichier file_contexs.local, même vide, pour que l’outil fonctionne correctement.

La solution au premier problème la plus naturelle est la suivante :


allow fail2ban_t locale_t:lnk_file { read };

Alors oui, il faut installer le paquet selinux-policy-devel (même si l’ANSSI dit que non, mais c’est nécessaire à la compilation et à la manipulation des politiques SELinux).


[root@ modules]# yum deplist selinux-policy-devel
Modules complémentaires chargés : fastestmirror
Determining fastest mirrors
* base: fr.mirror.babylon.network
* epel: fr.mirror.babylon.network
* extras: fr.mirror.babylon.network
* updates: fr.mirror.babylon.network
paquet : selinux-policy-devel.noarch 3.13.1-102.el7_3.15
dépendance  : /bin/sh
provider: bash.x86_64 4.2.46-21.el7_3
dépendance  : /usr/bin/make
provider: make.x86_64 1:3.82-23.el7
dépendance  : checkpolicy >= 2.5
provider: checkpolicy.x86_64 2.5-4.el7
dépendance  : m4
provider: m4.x86_64 1.4.16-10.el7
dépendance  : policycoreutils-devel >= 2.5
provider: policycoreutils-devel.x86_64 2.5-11.el7_3
provider: policycoreutils-devel.i686 2.5-11.el7_3
dépendance  : selinux-policy = 3.13.1-102.el7_3.15
provider: selinux-policy.noarch 3.13.1-102.el7_3.15

Mais cela ne suffira pas. En effet, vous allez avoir une violation d’une contrainte MLS puisque le lien symbolique est dans une sensibilité s15 et votre processus n’est qu’en s0-s15.

Il existe, au moins, deux solutions pour résoudre ce problème. La première, bien bourrine et qui peut laisser quelques failles de sécurité :


mls_file_read_all_levels(fail2ban_t);

Bon, la, on autorise le domaine fail2ban_t a contourné toute la politique MLS sur l’ensemble du système. Et surtout, vous allez avoir le même problème avec les autres applications qui ont besoin de lire la timezone (genre httpd ou maridb, toutes les applications dans la vraie vie). Donc, il va falloir autoriser l’ensemble des applications à contourner la politique MLS.

La seconde consiste à modifier le contexte de sécurité du lien symbolique et du fichier cible. Pour cela, on va taper les commandes suivantes :


chcon -hv system_u:object_r:locale_t:s0 /etc/localtime
chcon -hv system_u:object_r:locale_t:s0 /usr/share/zoneinfo/Europe/Paris

Avec cette méthode, il n’y a plus de violation des propriétés MLS.

Dernier point par rapport à ce premier post, il m’est arrivé de faire tout simplement crasher audit2allow sans trop savoir pourquoi. Ma supposition est que le fichier d’audit était bien trop gros (~8Mo) pour le programme, mais ce n’est qu’une supposition. La seule solution est de supprimer le fichier et de redémarrer le service d’audit.

Mail, Microsoft et trolls

Nous nous sommes retrouvés par malchance ou mégarde dans une blackliste mail. Ce qui avait pour conséquence que tous les mails envoyés vers les serveurs de Microsoft (hotmail et outlook en autre) nous étaient renvoyés avec le message suivant :


Host mx2.hotmail.com[65.55.33.135] said: 550 SC-001
(COL004-MC6F15) Unfortunately, messages from 5.135.176.69 weren't sent.
Please contact your Internet service provider since part of their network
is on our block list. You can also refer your provider to
http://mail.live.com/mail/troubleshooting.aspx#errors. (in reply to MAIL
FROM command)

Pour résoudre ce problème, nous avons dû remplir un formulaire en ligne pour se supprimer de cette blackliste. Pour ceux qui auront le même soucis, le lien est le suivant :

https://support.microsoft.com/en-us/getsupport?oaspworkflow=start_1.0.0.0&wfname=capsub&productkey=edfsmsbl3&locale=en-us&ccsid=636267274311800514

Chose amusante, le site de Microsoft n’accepte que des adresses IPv4, comme le montre la capture suivante MS Fail

Au moment de l’écriture de ce post, tout est rentré dans l’ordre. Il n’aura fallu que quelques heures pour être “dé-blacklisté”. Mais il faudrait quand même que Microsoft découvre que nous pouvons aussi l’IPv6.

SX, Centos 7 et un peu de sécurité

Comme vous l’avez sûrement vu, nous avons été offline pendant deux jours début mars. Cela nous a permis de passer de Centos 6 à Centos 7, Centos 6 arrivant à la fin de son support complet en Mai 2017 (comme l’indique le tableau suivant https://wiki.centos.org/About/Product ).

Je vais faire une série de petits posts sur les problèmes que nous avons rencontrés lors de l’installation, configuration et exploitation de cette nouvelle version de Centos 7 et des mécanismes de sécurité que nous avons voulus mettre en place.

Pourquoi choisir Centos ?

Il n’y a pas vraiment de vraies bonnes raisons. Les deux principales sont :

– Une distribution stable et fonctionnelle, c’est-à-dire que les paquets de base sont fonctionnelles et sont, pour la plupart, utilisables dès leur installation.
– Un support natif de SELinux. Si vous avez lu les précédents posts orientés Admin système et réseau, SELinux est le mécanisme de sécurité que nous avons choisi car il est intégré nativement au noyau et que les politiques de base sont presque toujours fonctionnelles. Nous aurions pu choisir “son grand concurrent”, à savoir Grsecurity, mais il est nécessaire de recompiler son noyau à chaque mise à jour, ce qui est assez contraignant.

Et, à la différence de ce que préconise l’ANSSI dans son guide de sécurisation d’un serveur Linux (https://www.ssi.gouv.fr/uploads/2015/10/NP_Linux_Configuration.pdf), nous avons choisi la politique MLS (multi-level security), qui, comme nous le verrons par la suite, ne s’est pas révélée sans conséquence.

La politique targeted, celle préconisée par l’ANSSI, laisse les utilisateurs et certaines applications n’ayant pas de politique SELinux spécifiques, dans un domaine non confiné (donc non contrôlé).

Inconvénient majeur : la version de certains paquets. En effet, PHP, Apache, etc, sont en version assez vieillottes, ce qui nous privent de fonctionnalités parfois importantes.

Qu’est-ce que l’on va installer ?

De manière non exhaustive :

– un serveur HTTP
– une base de données MySQL
– un serveur de mail
– un ensemble d’autres applications utiles à la gestion d’un serveur.

Et l’objectif étant de sécuriser le tout avec un peu de SELinx, un peu de Fail2Ban et un peu du reste.

SELinux et Fail2ban

Aujourd’hui, je vais vous présenter rapidement une configuration SELinux pour pouvoir utiliser Fail2ban de manière correcte.

Notre système système est toujours une Centos 6 à jour. La politique SELinux est une politique mls presque de base et l’objectif est de l’utiliser en mode enforcing.

# sestatus
SELinux status: enabled
SELinuxfs mount: /selinux
Current mode: enforcing
Mode from config file: permissive
Policy version: 24
Policy from config file: mls

Fail2ban est un logiciel de protection réseau qui va bannir pendant un temps spécifique les IP qui “tentent des choses” sur notre serveur. Pour cela, il doit aller lire le contenu de certains fichiers. Suivant la configuration ces fichiers vont être : messages, daemon, syslog, etc.

Sur une configuration de base, le module de politique SELinux pour Fail2ban n’est pas assez bien renseigné et Fail2ban ne peut pas se lancer. Il est nécessaire de lui donner quelques accès supplémentaire pour qu’il puisse fonctionner correctement.

Sur notre configuration, Fail2ban ne s’occupe que de : ssh, bind, httpd et postfix. Pour pouvoir lancer correctement Fail2ban, il faut commencer par rajouter ces éléments. On notera que par défaut, Fail2ban n’a pas le droit d’aller lire le contenu des fichiers de log alors que c’est son but principal…

allow insmod_t fail2ban_t:fifo_file { write read };
allow insmod_t fail2ban_tmp_t:file { write };
allow insmod_t inotifyfs_t:dir read;
allow insmod_t var_log_t:file read

mls_file_read_all_levels(fail2ban_t);
allow initrc_t fail2ban_t:unix_stream_socket { connectto };
allow initrc_t fail2ban_var_run_t:sock_file { write setattr };
allow fail2ban_t var_log_t:file { read getattr };

Il est nécessaire de générer une exception au niveau MLS pour que Fail2ban puisse lire les fichiers qui ne sont pas à son niveau de sensibilité (No Read Up de Bell-La Padula). Les règles sur l’init permettent de pouvoir (re)lancer le programme depuis la commande run_init.

Si vous souhaitez en plus rajouter le fait que Fail2ban aille lire le contenu de /var/log/audit/audit.log (pour activer le ssh-selinux par exemple), il suffit de rajouter les lignes suivantes :

allow fail2ban_t auditd_log_t:dir search;
allow fail2ban_t auditd_log_t:file read;
allow fail2ban_t auditd_log_t:file open;
allow fail2ban_t auditd_log_t:file getattr;
allow fail2ban_t auditd_log_t:dir read;
allow fail2ban_t auditd_log_t:dir getattr;

Il ne reste plus qu’à compiler la politique, la charger et lancer Fail2ban avec la commande run_init.

Un antivirus : quid de l’efficacité et de l’intérêt ?

Nous étions restés la dessus : Retour sur armadito antivirus.

Pour faire un résumé extrêmement rapide : l’idée de faire un projet orienté sécurité défensive (open-source) est une bonne idée et peut permettre de faire avancer les choses, l’idée de faire un antivirus a au moins 20 de retard. La question est donc pourquoi ?

A quoi sert un antivirus ?

Certains pourraient dire à rien et je ne serai pas loin d’être d’accord. Dans l’absolu, un antivirus n’est pas utile si vous avez une petite idée de ce que vous faites lorsque vous naviguez/connectez des périphériques, etc. Une bonne gestion des droits doit suffire, mais ce n’est pas le sujet qui nous intéresse. Quoique…

Comment juger de l’efficacité d’un antivirus ?

Plusieurs critères sont généralement mis en jeu (l’objet de cet article n’est pas de discuter de tous ces critères donc cette liste est loin d’être exhaustive) :

  • Le taux de reconnaissance des menaces “connues”
  • Le taux de détection des menaces “non connues”
  • L’utilisation des ressources du système : mémoire, CPU, etc.
  • On pourrait rajouter des choses comme : vitesse de scan, protection web, etc.

Les deux derniers points étant plus du confort d’utilisation qu’autre chose, nous ne les détaillerons pas.

Les menaces connues ? C’est le plus simple et ça dépend essentiellement de la capacité de l’entreprise derrière l’antivirus à intégrer les menaces qu’elle détecte et à dispatcher ces mises à jour.

Le nerf de la guerre, ce sont les menaces non connues. Comment savoir si le binaire que l’utilisateur veut exécuter est sain ou malveillant ? et c’est bien là toute la question.

Je ne sais pas s’il est pertinent de faire une liste des techniques utilisées par les entreprises pour déterminer si un programme est malveillant ou non.

On va juste essayer de faire un “meta”-tour de ces techniques pour pouvoir introduire la suite :

  • Le pattern matching : on détecte un ensemble d’instructions qui correspondent à un comportement malveillant. Actuellement, c’est (sûrement?) YARA qui est le plus utilisé
  • Analyse comportementale : est-ce que le fichier correspond à un comportement déjà observé ?
  • Sandbox : exécution du fichier pour savoir ce qu’il fait

Même si on parle ici de menaces non connues, toutes ces techniques se basent sur des “choses” connues. Mais dans ce cas, comment traiter les fichiers jamais vus par les antivirus et qui donc ne rentrent pas dans une de ces catégories ?

Prenons un exemple simple : imaginons un programme exécuté par un utilisateur depuis son Bureau. Ce programme va :

  • Lire le contenu du dossier courant
  • Se connecter à un site
  • Envoyer une image qui se trouve sur ce Bureau sur le site.

Comment savoir si ce comportement est un comportement malveillant ou pas ? La première réponse est de regarder le site sur lequel le programme se connecte. Mais l’identification d’un nom de domaine est un problème de recherche assez complexe et pas aussi trivial qu’il n’y paraît (Domain Generation Algorithm). Sans rentrer plus dans le détail du fichier, il n’est donc pas évident de savoir si ce comportement est malveillant.

La réponse est donc aujourd’hui simple : on ne peut pas (bon ok, on peut estimer dans une certaine mesure grâce à l’utilisation des différentes techniques, mais il est rare de pouvoir être sûr à 100% sans une analyse fine, voir manuelle, du fichier). Et heureusement d’ailleurs, car sinon toutes les recherches sur ce sujet seraient déjà finies et on risquerait de s’ennuyer.

Si on est capable d’estimer cette potentielle menace, qui doit prendre la décision : l’antivirus ou l’utilisateur ? L’un comme l’autre peuvent se tromper et par conséquent compromettre le système par une mauvaise décision.

Mais alors, quelle est la solution ?

La solution est à la fois simple mais complexe (surtout à mettre en place). Il suffit de ne pas autoriser l’exécution de programme qui ne sont pas reconnus “comme de confiance” par l’administrateur. Cela ne peut passer que par un contrôle fin des programmes et des autorisations données aux utilisateurs. En contrôlant les accès sur le système, nous sommes capables de bloquer les actions qui sont considérées comme illégitimes. On fera donc la distinction entre malveillant (qui va potentiellement attaquer le système) et illégitime (qui sont des actions non souhaitées).

Cette philosophie est décrite dans ce que l’on appelle : les mécanismes de contrôle d’accès obligatoire. Ils autorisent uniquement les programmes présents dans la politique de sécurité à réaliser des actions définies sur le système. Tout binaire exécuté par la suite et non présent dans la politique sera (en théorie) bloqué. Il existe des implémentations sur les systèmes Linux : SELinux et GrSecurity (pour les deux plus connus).

Ces mécanismes ont toutefois des inconvénients majeurs :

  • Ils sont extrêmement complexes à configurer : il faut autoriser chaque action une à une pour chaque programme du système. Cela peut rapidement être long et fastidieux.
  • Ils contraignent à figer le système. Une fois la politique appliquée, tout programme non autorisé sera bloqué. Et à chaque mise à jour/ajout de programme, il est nécessaire de refaire tout ou une partie de la politique pour s’assurer du bon fonctionnement du système.
  • Ils n’empêchent pas l’exploitation des programmations, mais en réduisent les conséquences sur le système. Pour empêcher l’exploitation, il est nécessaire d’utiliser des mécanismes externes à l’image de PaX sur Linux.

Grâce à ces mécanismes de protection, nous sommes capables de :

  • (pré)calculer, par avance, l’ensemble des opérations autorisées sur le système.
  • vérifier des propriétés de sécurité : est-ce qu’un utilisateur peut aller lire des fichiers interdits ?

Toutes ces opérations se basent sur la politique de contrôle d’accès établie qui se doit donc d’être parfaite.

Quelles conclusions tirer de tout cela ?

La première conclusion est que, tant que l’on fera confiance aux antivirus pour protéger les systèmes, nous aurons un temps de retard. Les attaques de types Stuxnet montrent bien que, dès que les attaquants utilisent des techniques un peu différentes, les antivirus ne sont plus capables de protéger quoique ce soit.

Le seconde conclusion est qu’il existe des mécanismes capables de protéger les systèmes “by design” (en admettant qu’il n’y ait pas de problèmes dans ces mécanismes). Cette notion est loin d’être nouvelle puisqu’elle date des années 70, Anderson.

La question qu’il faut donc se poser est pourquoi n’avons-nous pas plus de projet proposant ce genre de solution alors que l’on sait qu’elles proposent un modèle de protection efficace ? Alors que l’on voit (dans les grandes conférences de sécurité, certains diraient de hacker) uniquement des choses orientées vers le pentest ou de la recherche de vulnérabilités et n’apporte rien à l’état de l’art…(ce n’est pas moi qui le dit mais Brad Spengler

Utiliser SELinux pour protéger un forum SMF

Un article un peu pratique : comment configurer SELinux pour protéger un forum de type SMF (simple machine forum) ? (c’est largement utilisable pour d’autres forums).

SELinux fera l’objet d’un billet spécifique donc je ne le présente pas ici.

La configuration de base

Pour être efficace, SELinux doit être en mode enforcing. De plus, comme on le verra dans un prochain billet, nous avons fait le choix d’utiliser la politique MLS.

La configuration du serveur

Nous utilisons la configuration suivante :

  • Centos 6 à jour
  • SELinux : politique MLS
  • LibSELinux-devel
  • HTTPD (apache)

En détails, les dépendances pour SELinux :

[root@ossus]# rpm -qa | grep selinux
libselinux-utils-2.0.94-7.el6.x86_64
libselinux-2.0.94-7.el6.x86_64
libselinux-devel-2.0.94-7.el6.x86_64
libselinux-python-2.0.94-7.el6.x86_64
selinux-policy-3.7.19-292.el6.noarch
selinux-policy-mls-3.7.19-292.el6.noarch
selinux-policy-targeted-3.7.19-292.el6.noarch

Avec la politique de base, nous avons donc

ps auxwZ | grep apache
system_u:system_r:httpd_t:s0-s15:c0.c1023 apache 4410 0.5 1.2 478756 49552 ? S 16:25 1:01 /usr/sbin/httpd

Le contexte d’apache est donc system_u:system_r:httpd_t:s0-s15:c0.c1023.

SMF est installé dans le répertoire /var/www/html/forum/.

La politique SELinux

Avec la politique de base de SELinux, les éléments présents dans /var/www/html ont le contexte suivant : httpd_sys_content_t

Par défaut, httpd_t n’a pas les permissions de modification (création, suppression, exécution, etc.). Pour preuve, les AVC générés par apache :

type=AVC msg=audit(1466969654.803:74508): avc: denied { add_name } for pid=29483 comm=”httpd” name=”” scontext=system_u:system_r:httpd_t:s0-s15:c0.c1023 tcontext=system_u:object_r:httpd_sys_content_t:s0 tclass=dir
type=AVC msg=audit(1466969654.880:74511): avc: denied { setattr } for pid=29483 comm=”httpd” name=”” dev=sda1 ino=1182475 scontext=system_u:system_r:httpd_t:s0-s15:c0.c1023 tcontext=staff_u:object_r:httpd_sys_content_t:s0 tclass=file
type=AVC msg=audit(1466969656.954:74512): avc: denied { remove_name } for pid=29483 comm=”httpd” name=”” dev=sda1 ino=1702698 scontext=system_u:system_r:httpd_t:s0-s15:c0.c1023 tcontext=system_u:object_r:httpd_sys_content_t:s0 tclass=dir
type=AVC msg=audit(1467154855.120:80140): avc: denied { write } for pid=5473 comm=”httpd” name=”” dev=sda1 ino=1182554 scontext=system_u:system_r:httpd_t:s0-s15:c0.c1023 tcontext=staff_u:object_r:httpd_sys_content_t:s0 tclass=file

Donc par défaut, apache n’a pas la possibilité de modifier les répertoires présents dans le sous-répertoire du forum (ni les fichiers par extension).

Le problème c’est qu’il est nécessaire pour apache de pouvoir écrire dans certains répertoires comme celui du cache, des fichiers joints, avatar, etc.

Première méthode

On autorise tout : d’un point de vu sécurité, c’est pas top top. Il suffit de faire une règle

allow httpd_t httpd_sys_content_t:dir *;
allow httpd_t httpd_sys_content_t:dir *;

et on est tranquille.

Deuxième méthode

On fait ça proprement.

File context

Création du file_context spécifique :

var/www/html/forum/attachments system_u:object_r:http_wr_smf:s0
/var/www/html/forum/attachments/*.* system_u:object_r:http_wr_smf:s0

/var/www/html/forum/avatars system_u:object_r:http_wr_smf:s0
/var/www/html/forum/avatars/*.* system_u:object_r:http_wr_smf:s0

/var/www/html/forum/cache system_u:object_r:http_wr_smf:s0
/var/www/html/forum/cache/*.* system_u:object_r:http_wr_smf:s0

/var/www/html/forum/Packages system_u:object_r:http_wr_smf:s0
/var/www/html/forum/Packages/*.* system_u:object_r:http_wr_smf:s0

/var/www/html/forum/Settings.php system_u:object_r:http_wr_smf:s0
/var/www/html/forum/Settings_bak.php system_u:object_r:http_wr_smf:s0
/var/www/html/forum/Sources/Load.php system_u:object_r:http_wr_smf:s0

Quelques explications :

  • attachments : contient les pièces jointes mises sur le forum
  • avatars : explicite
  • cache : cache du forum
  • Packages : contient les archives pour installer des modules/mises à jour du forum
  • Settings.php : pour pouvoir modifier les configurations depuis le serveur
  • Load.php : coeur du forum

Tous ces fichiers ayant (presque) les mêmes demandent de permissions, on va leur créer un type spécifique http_wr_smf On pourrait affiner un peu en créant un contexte spécifique pour chaque catégories,, mais dans un soucis de clarté, on va rester simple.

Règle SELinux

Il reste maintenant à donner l’autorisation à apache de réaliser des actions spécifiques sur ce type.
On créé le nouveau type :

type http_wr_smf

Puis on fait les règles qui vont bien :

allow httpd_t http_wr_smf:file { read write create setattr getattr unlink open rename lock} ;
allow httpd_t http_wr_smf:dir *;

allow httpd_t http_wr_smf:filesystem { associate };
allow http_wr_smf fs_t:filesystem { associate };

On compile (j’ai volontairement omis les types requis à la compilation). On charge la nouvelle politique et on applique les nouveaux contextes de sécurité, soit en utilisant restorecon soit autorelabel.

On a donc un forum fonctionnel avec SELinux en enforcing.

Retour sur armadito antivirus

Depuis maintenant quelques jours, bon nombre de personnes critiquent/jugent un projet qui est arrivé sur GitHub et qui se nomme Armadito Antivirus. Ce projet est porté par la société Teclib’.

Avant toute polémique, le but de ce billet n’est pas de savoir si ces sources sont issues ou non du projet DAVFI. Pour ceux qui ne comprennent pas, je vous laisserai chercher avec votre moteur de recherche préféré pourquoi j’écris ça. Non, ici le but est de s’interroger sur la pertinence ou pas de ce projet, pertinence scientifique bien sûr.

Qu’est-ce que Armadito Antivirus ? Pour le savoir, allons voir ce qui est dit sur le site (extrait au 9/07/2016) :

Armadito Antivirus is an open-source antivirus that protects your computers and servers from malware and viruses.

Armadito includes classical signature-based malware detection and provides innovative heuristic detection modules for binaries (MS-Windows and GNU/Linux) and for PDF documents.

An intuitive and user-friendly interface gives access to all Armadito’s features: on-demand scanning, real-time protection, quarantine zone, threat detection journal…

Armadito is remotely manageable for enterprises and organisations using a central administration console.

Un projet open-source, qui semble être développé par une entreprise française, en voila deux bons points.

Est-ce une réelle bonne idée ?

Un projet open-source ?

Premier point, et même si beaucoup de personnes pensent que non, je trouve que c’est une bonne idée. Nous avons ici un antivirus (souverain ?) dont tout le monde peut lire/vérifier/compiler les sources et se faire sa propre idée. On ne pourra pas leur reprocher de cacher des backdoors, puisque si backdoors il y a, on pourra les repérer en lisant le code source mis à notre disposition. La plupart des personnes qui râlent sur ce projet pestent aussi sur le fait que les autres projets ne publient pas leur code. Nous avons accès à tout (en tout cas pour l’instant).

Alors oui, quelqu’un qui publie son code source s’expose à ce genre de critiques : ça ne fait pas ci, il faudrait faire comme ça, etc. Mais on attend toujours la publication d’outils utiles de la part de ces mêmes personnes pour faire avancer la (recherche ?) sécurité informatique plutôt que de critiquer de manière gratuite.

Un outil pour faire la sécurité défensive

Second point, enfin un outil défensif. On trouve énormément d’outils offensifs : fuzzing, recherche de vuln, exécution d’exploits, pentest, etc. Mais peu d’outils défensifs qui font réellement de la protection. De plus, ce genre d’outil s’utilise généralement quand il est trop tard. Certes ce n’est qu’un antivirus, et il en existe pléthore, mais il a le mérite d’exister. A voir s’il sera efficace ou s’il mourra de sa belle mort tout comme Tiranium Antivirus. Je ne m’attarderai pas sur la description donnée sur le site qui vante ses qualités de détections et de protection, le mieux étant de tester pour se rendre compte de la réelle efficacité ou non d’un produit, chose que je n’ai pas encore faite.

Est-ce réellement une si bonne idée ?

On pourrait essayer de faire des paragraphes entiers à défendre le projet mais il est nécessaire de se poser la question du réel intérêt scientifique de ce (genre de) projet. Dans l’idée, les deux points positifs que je retiendrai sont le côté open-source et un outil de sécurité défensive. Mais cela ne rattrape pas ce qui va suivre.

Faire un antivirus ?

Nous sommes en 2016, l’informatique existe depuis maintenant plusieurs dizaines d’années, Internet a explosé depuis les années (19)95 et, avec, les menaces informatiques. On est passé du virus, aux spywares, aux rootkits, aux ransomware, etc. Les malware deviennent de plus en plus évolués et complexes à étudier et à supprimer d’un système. Dans ce cyber-digital-monde-de-pirate (poke Gof), la réalisation d’un antivirus montre juste le retard de l’industrie dans la protection des systèmes. On verra pourquoi dans un prochain article.

On peut noter, de plus, que le marché propose déjà un très (trop ?) grand nombre de logiciels anti-truc : antivirus, antimalware, antispyware, etc. Je ne vais pas m’amuser à tous les citer, je risquerai d’en oublier une bonne partie. Mais la multitude des outils n’a pas fait baisser la menace, ni rendu le surf plus sûr, ni éradiqué la faim dans le monde.

La plupart de ces outils sont (que je considère comme) des outils de détections. Ils ne sont pas capables d’anticiper les menaces et dès que quelque chose sort un peu de l’ordinaire (une exploitation d’une faille inconnu, un cheminement non conventionnel pour un malware), tous les outils sont dépassés. On pourrait aussi discuter des méthodes innovantes de protection pro-actives, mais il faudrait déjà comprendre ce que ça veut dire. Aucun outil n’est réellement capable de faire de la protection du système de manière efficace, c’est-à-dire bloquer un binaire avant son exécution. Un antivirus s’utilise en amont, pour protéger le système, pas pour supprimer les choses qu’il trouve, encore faut-il qu’il soit capable de le faire.

Les entreprises proposant des antivirus ou des antimalware ne sont que dans la réaction et non dans l’anticipation/la création. C’est pour cela qu’ils seront toujours derrière en matière de protection. Il n’y a que très peu de recherches (que ce soit académique ou industrielle) proposant des méthodes de protections efficaces, qui ne reposent pas sur des “choses” que l’on a déjà vu.

Donc, même si ce projet a le mérite d’exister et propose des choses, il ne va pas faire avancer la recherche ni la sécurité informatique. Ce n’est qu’un outil de plus parmi la longue liste d’outils antimachin qui ne sera pas efficace pour protéger de manière efficace un système et ces utilisateurs.

Une petite note amusante : le CERT-FR a déjà publié une note concernant une vulnérabilité dans cet antivirus CERT-FR

Nous verrons dans un prochain article les remèdes et les solutions à cela.

Un remerciement à Gof pour sa relecture.