Eine Möglichkeit, eine SELinux-Richtlinienverletzung auszulösen?

12

Ich studiere die grundlegenden Funktionen von SELinux und würde es nützlich finden, eine Ablehnung auszulösen. Auf meinem Testcomputer wird CentOS 7 ausgeführt, es handelt sich um eine einfache Serverinstallation ohne zusätzliche Dienste, und getenforce gibt "Enforcing" an. Ich war mir also sicher, dass es der Trick sein würde, / root für die ganze Welt lesbar zu machen und zu versuchen, Dateien von dort als nicht privilegierter Benutzer zu lesen. Aber kein glück! Kann mir jemand ein paar Schnelltests vorschlagen? Versuchen, auf Pfade zuzugreifen oder Ports zu öffnen usw.

Im Idealfall suche ich nach einfachen Shell-Befehlen, die ein DAC nicht eingeschränkt hätte, ein MAC jedoch bemerkt und ablehnt. Als solches versuche ich nicht, maßgeschneiderte Programme zu kompilieren oder bestimmte Dienste (wie einen Webserver) zu installieren, um dies zu erreichen. Dies ist wertvoll, da es eine allgemeine und klare Möglichkeit bietet, SELinux in Aktion zu sehen.

Ich habe kein Problem damit, die DAC-Berechtigungen (dh Dateisystemberechtigungen) so zu ändern, dass sie weniger einschränkend sind, als dies im Rahmen eines Tests standardmäßig der Fall wäre.

Nachdenklich
quelle
1
Es ist ein wichtiger und häufig versäumter Schritt, zu wissen, wie Sie Ihre Schutzsysteme auslösen, damit Sie überprüfen können, ob sie funktionieren.
Gowenfawr
Ich stimme dafür, diese Frage als "Off-Topic" zu schließen, da sie zu Unix & Linux SE gehört.
Markieren Sie

Antworten:

3

Um das SELinux-Hilfsprogramm zur Fehlererkennung für Code von Drittanbietern / Entwicklern zu demonstrieren , sehen Sie sich hier einen Speicherschutz-Test an (das erste Codebeispiel hier ändern ):

#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;
}
Kompilieren und Standard anzeigen (nicht abgefangen)
$ 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>

Ändern Sie die Booleschen Werte, um das Problem zu beheben:

$ 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ρɯͽ
quelle
Dies ist definitiv nützlich und gut dokumentiert (+1), obwohl ich kein Programmierer bin und den Code nicht wirklich verstehe. Idealerweise würde ich gerne ein offensichtliches Beispiel dafür sehen, wie SELinux den Versuch, einen Port zu öffnen oder auf einen Pfad zuzugreifen, mit einfachen Befehlszeilentools wie Shell, Netcat, Telnet usw. verweigert. Ich werde die Frage bearbeiten, um dies klarer zu machen.
Nachdenklich
Ich musste selbst nach Codeteilen suchen. Ich bin froh, dass Sie unten einen Bash-Test hinzugefügt haben. Ich habe Snort- und Postfix-Fehler (möglicherweise Dovecot-Fehler) unter CentOS7 ausgelassen, da es sich um Pakete handelt, die mehr Installationsarbeit erfordern und möglicherweise später behoben werden müssen. Wenn Sie bereits so vorgehen, ist dies für die Richtlinienerstellung hilfreich.
3.
3

Dies zeigt deutlich eine MAC-Richtlinie, bei der ein äquivalenter DAC bei einer Basisinstallation von CentOS 7 umgangen werden könnte.

  1. Standardmäßig (in CentOS zum Zeitpunkt des Schreibens) sind nichtprivilegierte Benutzer ohne Systemberechtigung als die Rolle "unconfined_u" angemeldet. Wir können jedoch unser System so ändern, dass unser nichtprivilegierter Benutzer 'alice' stattdessen in die Rolle 'user_u' versetzt wird. Die Standardrichtlinien können festgelegt werden, um diese Rolle mit nur wenigen zusätzlichen Konfigurationsschritten eindeutig einzuschränken.

    [root]# echo "alice:user_u:s0-s0:c0.c1023" >> /etc/selinux/targeted/seusers
    
  2. Deaktivieren Sie jetzt die Möglichkeit für diese Benutzer, Dateien auszuführen, die sich in ihren Basisverzeichnissen und / tmp befinden. Wieder ist die Standardeinstellung, dieses Verhalten zuzulassen. Dieser Befehl kann einen Moment dauern .

    [root]# setsebool -P user_exec_content off
    
  3. Jetzt (mit unserem nicht privilegierten Benutzer) können wir uns anmelden und versuchen, etwas in einem dieser No-Go-Bereiche auszuführen. Wie Sie sehen, werden wir abgelehnt.

    [alice]$ cp /bin/ls /tmp/
    [alice]$ /tmp/ls
    -bash: /tmp/ls: Permission denied
    
  4. Schließlich können wir das AVC-Protokoll anzeigen, um unsere SELinux-Ablehnung zu sehen.

    [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
    
Nachdenklich
quelle
Hey ja das funktioniert! Mir gefällt besonders, dass Sie sich für diesen "no exec content" -Ansatz entschieden haben, da dieser auf jeden Fall abgefangen werden sollte. Ich habe es vorgezogen, das auditd zu verwenden, um die Erstellung von ausführbaren Dateien zu verhindern, aber das gefällt mir auch. Ein Anwendungsfall: Ich verwende einen allgemeinen Cloud-basierten Dienst, der die Installation neuer Software erschwert (Sie müssen den Paketmanager verwenden und es gibt kein sudo), aber es gibt wenig Sinn. Sie blockieren weder die Erstellung noch die Ausführung und sind Entwicklerumgebungen. Ich wage / scp also nur die Pakete, die ich benötige, und kompiliere sie. +1
ǝɲǝɲbρɯͽ
1

Sofern Sie Ihre Richtlinien nicht auf der Registerkarte Boolean von system-config-selinux (oder in / etc / selinux / policy) geändert haben, sollte die Standardeinstellung auf Folgendes reagieren (Hinweis: Möglicherweise möchten Sie auch eine Fehlerbehebung für einen tieferen Tauchgang installieren). :

mkdir -m 755 -p / install / ks

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

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

Starten Sie dann Ihren Webserver neu und versuchen Sie, mit Ihrem Webbrowser auf http: // localhost / ks zuzugreifen . Sie sollten eine "Verbotene" Meldung sehen. Wenn Sie verfolgen /var/log/audit/audit.logoder rennen ausearch -m avc -ts recent, sollte die folgende Meldung angezeigt werden: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

Sie können dann den SELinux-Kontext mit ändern, chcon -Rv --reference /var/www/html /install/kswenn Sie SELinux nicht deaktivieren, aber auf die Ressource zugreifen möchten.

EDIT: sorry, hab nicht gesehen, dass du "kein webserver" gesagt hast. Versuchen Sie chcon -u fake_u <filename>, ein nicht privilegiertes Konto für eine Systemdatei zu verwenden.

atdre
quelle
Ich konnte Ihren zweiten Vorschlag nicht zum Laufen bringen (mit einem neu erstellten Benutzer). Ich hätte auch lieber einen allgemeineren Test, ein Beispiel für eine MAC-Aufstockung, bei der der DAC dies zugelassen hätte: Dabei wird geprüft, wie gut SELinux vor administrativen Änderungen an der SELinux-Kennzeichnung schützen kann.
Nachdenklich
0

Installieren Sie zwei kleine Pakete - keine Abhängigkeiten

  yum install -y vsftpd lftp

Starten Sie einen FTP-Server

  systemctl start vsftpd

erstelle eine Datei in root's home

  touch ~/tux.tch

Wechseln Sie vom Stammverzeichnis in das FTP-Verzeichnis.
hinweis: verschieben, nicht kopieren, sonst ändert sich der fkontext der datei

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

Melden Sie sich bei Ihrem FTP-Server als FTP-Client-Benutzer an und versuchen Sie, auf die neue Datei zuzugreifen.
Hinweis: Die automatische Vervollständigung von Registerkarten funktioniert hier nicht

  lftp localhost
    ls pub/tux.tch
    exit

Zeigen Sie die Ablehnung in den Rohprotokollen an

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

oder wenn du setroubleshoot*installiert hast

  grep sealert /var/log/messages
unendlich-etcetera
quelle