Un moyen de déclencher une violation de la politique SELinux?

12

J'étudie le fonctionnement de base de SELinux et trouverais utile de déclencher un déni. Ma machine de test exécute CentOS 7, c'est une installation de base du serveur sans aucun service supplémentaire, et getenforce indique «Enforcing». J'étais donc convaincu que rendre lisible / root dans le monde entier et essayer de lire des fichiers à partir de là en tant qu'utilisateur non privilégié ferait l'affaire. Mais pas de chance! Quelqu'un peut-il suggérer des tests rapides? Essayer d'accéder à des chemins, d'ouvrir des ports, etc.

Idéalement, je recherche des commandes shell simples qu'un DAC n'aurait pas restreintes, mais un MAC le remarquera et le refusera. En tant que tel, je ne cherche pas à compiler des programmes sur mesure, ni à installer des services spécifiques (comme un serveur Web) pour y parvenir. Ceci est précieux car il fournit un moyen générique et clair de voir SELinux en action.

Je n'ai aucun problème à modifier le DAC (c'est-à-dire les autorisations du système de fichiers) pour les rendre moins restrictives qu'elles ne le seraient par défaut dans le cadre d'un test.

Réfléchi
la source
1
+1 savoir comment déclencher vos systèmes de protection afin de vérifier qu'ils fonctionnent est une étape vitale et souvent manquée.
gowenfawr
Je vote pour fermer cette question comme hors sujet car elle appartient à Unix et Linux SE.
Mark

Réponses:

3

Pour démontrer l'utilité de SELinux dans la détection de bogue pour un tiers / votre propre code de développeur, voici un test de protection de la mémoire (modification du premier exemple de code ici ):

#include <fcntl.h>
#include <stdio.h>
#include <sys/mman.h>

int main (void) {
  // open file read-write, get a memory-mapped pointer with private access, write permission
  int fd = open ("file_to_test", O_RDWR);
  char *p = mmap (NULL, 42, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);

  p[0] = 'a';   // put something

  // Update protection mode; SELinux response depends on sebool: allow_execmod
  int r = mprotect (p, 42, PROT_READ | PROT_EXEC);

  // Display mprotect result
  printf ("mprotect = %d\n", r);

  close(fd);
  return 0;
}
Compiler et afficher les valeurs par défaut (non capturées)
$ echo "test data" > file_to_test
$ gcc execmod.c 

$ ./a.out 
mprotect = 0

$ sudo aureport -a

AVC Report
========================================================
# date time comm subj syscall class permission obj event
========================================================
<no events of interest were found>

Changez les booléens pour attraper le problème:

$ sudo getsebool allow_execmod
allow_execmod --> on

$ sudo setsebool allow_execmod 0
$ ./a.out 
mprotect = -1

$ sudo aureport -a

AVC Report
========================================================
# date time comm subj syscall class permission obj event
========================================================
1. 04/30/2015 12:26:41 a.out unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 10 file execmod unconfined_u:object_r:user_home_t:s0 denied 3612
ǝɲǝɲbρɯͽ
la source
C'est certainement utile et bien documenté (+1), bien que je ne sois pas programmeur et que je ne comprenne pas vraiment le code. Idéalement, j'aimerais voir un exemple évident de SELinux refusant de tenter d'ouvrir un port ou d'accéder à un chemin, en utilisant des outils de ligne de commande simples comme le shell, netcat, telnet, etc. Je modifierai la question pour rendre cela plus clair.
Thoughtitious
J'ai dû rechercher moi-même les parties de code. Je suis content que vous ayez ajouté un test bash ci-dessous. J'ai omis les erreurs Snort et postfix (peut-être dovecot) sur CentOS7 parce que ce sont des packages, il y a plus de travail à installer, cela peut être corrigé plus tard et c'est juste plus de configuration. Si vous allez déjà dans ce sens, c'est utile pour la pratique de génération de politiques.
ǝɲǝɲbρɯͽ
3

Cela démontre clairement une politique MAC où un DAC équivalent aurait pu être contourné sur une installation de base de CentOS 7.

  1. Par défaut (dans CentOS au moment de la rédaction), les utilisateurs non privilégiés non-système sont connectés en tant que rôle 'unconfined_u'. Cependant, nous pouvons changer notre système afin que notre utilisateur non privilégié «alice» soit placé à la place dans le rôle «user_u». Les stratégies par défaut peuvent être définies pour restreindre clairement ce rôle avec seulement une petite quantité de configuration supplémentaire.

    [root]# echo "alice:user_u:s0-s0:c0.c1023" >> /etc/selinux/targeted/seusers
    
  2. Désactivez maintenant la possibilité pour ces utilisateurs d'exécuter des fichiers situés dans leurs répertoires personnels et / tmp. Encore une fois, la valeur par défaut est d'autoriser ce comportement. Cette commande peut prendre un peu de temps .

    [root]# setsebool -P user_exec_content off
    
  3. Maintenant (avec notre utilisateur non privilégié), nous pouvons nous connecter et tenter d'exécuter quelque chose sur l'une de ces zones interdites. Comme vous pouvez le voir, on nous refuse.

    [alice]$ cp /bin/ls /tmp/
    [alice]$ /tmp/ls
    -bash: /tmp/ls: Permission denied
    
  4. Enfin, nous pouvons afficher le journal AVC pour voir notre déni SELinux.

    [root]# aureport -a
    
    AVC Report
    ========================================================
    # date time comm subj syscall class permission obj event
    ========================================================
    1. 02/05/15 21:08:33 bash user_u:user_r:user_t:s0 59 file execute user_u:object_r:user_tmp_t:s0 denied 693
    
Réfléchi
la source
Hé ouais ça marche! J'aime particulièrement que vous ayez choisi cette approche «sans contenu exécutif», car cela devrait certainement être pris en compte. J'ai eu tendance à préférer l'audit pour empêcher la création d'exécutables en premier lieu, mais j'aime ça aussi. Un cas d'utilisation: j'utilise un service cloud commun qui rend difficile l'installation de nouveaux logiciels (vous devez utiliser leur gestionnaire de paquets, et il n'y a pas de sudo), mais cela ne sert à rien; ils ne bloquent pas la création ou l'exécution et ce sont des environnements de développement ... donc je ne fais que wget / scp les packages dont j'ai besoin et les compile . +1
ǝɲǝɲbρɯͽ
1

À moins que vous n'ayez changé vos politiques dans l'onglet booléen de system-config-selinux (ou dans / etc / selinux / policy), la valeur par défaut devrait répondre aux éléments suivants (NB, vous pouvez également installer setroubleshoot pour une plongée plus profonde) :

mkdir -m 755 -p / install / ks

cp /root/anaconda-ks.cfg / install / ks

chmod 644 /install/ks/anaconda-ks.cfg

Ensuite, redémarrez votre serveur Web et essayez d'accéder à http: // localhost / ks avec votre navigateur Web. Vous devriez voir un message "Interdit". Si vous suivez /var/log/audit/audit.logou si vous courez ausearch -m avc -ts recent, vous devriez pouvoir voir le message:type=AVC msg=audit(1391277951.222:266): avc: denied { read } for pid=1731 comm="httpd" name="ks" dev=sda1 ino=22351 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined u:object r:default t:s0 tclass=dir

Vous pouvez ensuite modifier le contexte SELinux avec chcon -Rv --reference /var/www/html /install/kssi vous ne souhaitez pas désactiver SELinux mais être en mesure d'accéder à la ressource.

EDIT: désolé, je n'ai pas vu que vous avez dit "pas un serveur Web". Essayez d' chcon -u fake_u <filename>utiliser un compte non privilégié sur un fichier système.

atdre
la source
Je n'ai pas pu faire fonctionner votre deuxième suggestion (en utilisant un utilisateur nouvellement créé). De plus, je préfère un test plus générique, un exemple d'un MAC qui aurait permis que le DAC le permette: alors que cela teste dans quelle mesure SELinux peut se protéger contre les modifications administratives de l'étiquetage SELinux.
Thoughtitious
0

installer deux petits packages - pas de dépendances

  yum install -y vsftpd lftp

démarrer un serveur FTP

  systemctl start vsftpd

créer un fichier chez root

  touch ~/tux.tch

déplacer du répertoire racine vers le répertoire FTP.
note: déplacez, ne copiez pas, ou le contexte f du fichier changera

  mv ~/tux.tch /var/ftp/pub

connectez-vous à votre serveur FTP en tant qu'utilisateur client FTP et essayez d'accéder au nouveau fichier.
remarque: la saisie automatique des onglets ne fonctionnera pas ici

  lftp localhost
    ls pub/tux.tch
    exit

afficher le déni dans les journaux bruts

  grep AVC /var/log/audit/audit.log

ou si vous avez setroubleshoot*installé

  grep sealert /var/log/messages
infinite-etcetera
la source