[linux-l] SELinux
Lutz Willek
lutz.willek at belug.de
Di Sep 29 13:22:13 CEST 2015
Hi Peter,
das geht alles viel einfacher.
Prinzipiell hast Du schon richtig gedacht:
> # ls -Z /etc/postfix/relocated
> -rw-r--r--. root root system_u:object_r:postfix_etc_t:s0
> /etc/postfix/relocated
Da siehst Du das selinux die Datei mit einem Kontext geflaggt hat:
postfix_etc_t
Damit erstellst du dann einfach Dein Verzeichnis unter /opt:
> # mkdir -p /opt/postfix/etc/
ein ls -Z auf das soeben erstellte Verzeichnis würde Dir jetzt etwas von
"unconfined object" und "default type" erzählen. Du musst also einfach
den Kontext passend setzen.
Ja... Das geht schon mit chcon, aber das überlebt ein relabel nicht, was
Deine Probleme erklärt?
> # chcon -t postfix_etc_t /opt/postfix/etc/
> # restorecon -v /opt/postfix/etc/
> # touch /opt/postfix/etc/file
> # ls -lZ /opt/postfix/etc/file
Soweit hattest Du das ja alles schon: Insgesamt ein unbefriedigendes
Ergebnis.
Daher besser gleich: Du änderst den default selinux Kontext passend und
kümmerst Dich einen Scheiß um die Dateirechte einzelner Dateien, weil
die passen dann automatisch.
Den default context änderst Du mit semanage, das ist Teil des Paketes
policycoreutil-python.
Als erstes wieder rausfinden was überhaupt Sache ist: (gekürzte Ausgaben
der Befehle!)
> # semanage fcontext -l |grep '^/etc/postfix'
> /etc/postfix.* all files
> system_u:object_r:postfix_etc_t:s0
Und wieder haben wir das "postfix_etc_t" von vorhin gefunden, diesmal
aber im default, und nicht über eine bestehende Datei abgeschaut.
Mit diesen Infos änderst Du dann Dein Verzeichnis: (erst mal aufräumen)
> # rm -rf /opt/postfix/etc
> # mkdir -p /etc/postfix/etc
> # semanage fcontext -a -t postfix_etc_t '/opt/postfix/etc(/.*)?'
> # restorecon -RFvv /opt/postfix/etc
Danach sollten die Rechte auf das Verzeichnis passen. Wenn Du jetzt eine
Datei dort anlegst, dann sollten die Rechte sofort passen. (Im Gegensatz
zum 1. Beispiel)
> # touch /opt/postfix/etc/file
> # ls -lZ /opt/postfix/etc/file
Den ganzen Rest Deiner noch benötigten Rechte änderst Du dann auch nach
den Beispielen die schon da sind, der Befehl zum abkupfern der
bestehenden Rechte wäre:
> semanage fcontext -l |grep 'postfix'
Achtung ^^das da ist eine längere Ausgabe... Aber das Prinzip hast Du ja
jetzt.
So, und jetzt zu den Fallen...
Achtung Falle: (Bitte unbedingt nachmachen)
# touch /tmp/file
# mv /tmp/file /opt/postfix/etc/file1
# cp /tmp/file /opt/postfix/etc/file2
# ls -lZ /opt/postfix/etc/file*
Alles klar?
Das tritt immer beim typischen Arbeitsablauf auf:
wget https://server/postfix.tar.gz ; tar xfz postfix.tar.gz; mv
./postfix /opt/
und passierte mir häufiger als mir lieb ist.
Daher besser:
wget https://server/postfix.tar.gz ; tar xfz postfix.tar.gz; cp -r
./postfix /opt/ ; rm -rf ./postfix
Du hast Die Idee..
Der Rest der Dir jetzt noch zum Glück fehlt sind boleans und Ports,
Befehle dazu sind getsebool und setsebool. Doku dazu findest Du in
selinux-policy-devel. Das Vorgehen ist quasi identisch zu semanage
> [root at localhost ~]# getsebool -a |grep postfix
> postfix_local_write_mail_spool --> on
> [root at localhost ~]# getsebool postfix_local_write_mail_spool
> postfix_local_write_mail_spool --> on
> [root at localhost ~]# semanage boolean -l |grep
> postfix_local_write_mail_spool
> postfix_local_write_mail_spool (ein , ein) Allow postfix to local
> write mail spool
> [root at localhost ~]# setsebool -P postfix_local_write_mail_spool on
> [root at localhost ~]# semanage boolean -l |grep
> postfix_local_write_mail_spool
> postfix_local_write_mail_spool (ein , ein) Allow postfix to local
> write mail spool
> [root at localhost ~]#
Das Beispiel hier ist ein wenig für den kalten Fuß, weil das bei mir ja
schon angeschaltet war, aber ich wollte zeigen wie Du das ändern kannst
wenn Du es bei Dir brauchen solltest. Wichtig ist "-P" für persistente
Änderungen...
Weils gerade passt, wenn Du Dir anzeigen lassen möchtest was alles im
System geändert wurde: (Quasi der diff zum default)
"# semanage boolean -l -C"
Damit solltest Du schon sehr weit kommen.
Probleme mit selinux debuggst Du am besten mit dem Paket
"setroubleshoot-server", da aber unbedingt das Paket aus den Updates
nehmen, weil in RedHat/CentOS 7.1 ist da ein bug drin, der in den
Updates inzwischen behoben wurde.
Nach der Installation wird /var/log/audit/audit.log überwacht, jedes mal
wenn es eine violation gibt wird das in /var/log/messages incl. einer
eindeutigen uuid vermerkt. Mittels "sealert -l uuid" kannst Du Dir
ansehen was Sache ist und bekommst auch Hinweise zum fixen des
Problemchens. Möchtest Du alles ansehen was bisher gelaufen ist, dann
hilft Dir ein "sealert -a /var/log/audit/audit.log" weiter. Aber gerade
beim erstellen von Regeln ist das oft schon zu viel Information auf
einmal... besser Du arbeitset mit uuid. (Zumindest mir geht es so)
Zum Schluss ein Rat: Solltest Du auf SELinux vorerst verzichten, dann
immer nur in den Permissive mode stellen, niemals (wirklich, niemals!)
ganz abstellen. Der Hintergrund: Wenn selinux=disabled dann werden die
fcontexte nicht mehr gepflegt. Sollte das System dann irgendwann doch
wieder mit SELinux arbeiten dann ist ein Chaos vorprogrammiert.
Sollte dieser Rat zu spät kommen, die korrekte Sequenz für weniger Ärger
ist:
> [root at localhost ~]# sed -i 's/^SELINUX=.*/SELINUX=enforcing/'
> /etc/sysconfig/selinux
> [root at localhost ~]# touch /.autorelabel
> [root at localhost ~]# systemctl reboot
Und wenn das Kind schon ganz tief im Brunnen steckt, weil bei selinux
nicht mal rescue.target wirklich hilft:
* Neustart (zur Not erzwungen)
* im Grub-Menü: "e" drücken
* Die Zeile beginnend mit "linux16" suchen
* hinten an die Zeile anhängen: "rd.break enforcing=0"
* strg+x drücken zum booten
So kommst Du auf eine shell, und selinux ist aus, bist aber noch in der
initramfs. Daher das sysroot mounten und ein chroot dort hinein:
# mount -o remount,rw /sysroot
# chroot /sysroot
Jetzt kannst Du dann Sachen machen die Du vergessen hast zu tun als Dein
System noch lief. Dann (und das bitte NICHT vergessen) zum Abschluss im
chroot IMMER folgendes:
# touch /.autorelabel
# mount -o remount,ro /
# exit
Und dann gefolgt von einem weiteren exit, um das relabel einzuleiten und
das System neu zu starten. Abhängig von der Datengröße kann das jetzt
zwischen Sekunden und Stunden dauern...
Nach dem Neustart dann prüfen ob selinux an ist: ein "getenforce" sollte
Dir eine 1 geben (oder in neueren Versionen: enforcing anzeigen)
Hoffe das hilft Dir weiter.
Gruß Lutz
Am 29.09.2015 um 10:49 schrieb Peter Ross:
> Hallo allerseits,
>
> Quoting Peter Ross <Peter.Ross at bogen.in-berlin.de>:
>
>> Ich haette gern etwas wie
>> "chcon --like /etc/postfix/main.cf /opt/it/etc/postfix/main.cf"
>>
>> Gibt es das?
>
> Manchmal braucht man wohl nur ein paar Minuten Ruhe (ein Buero nach
> sechs z.B.;-)
>
> "chcon --reference /etc/postfix/main.cf /opt/it/etc/postfix/main.cf"
>
> # ls -Z /etc/postfix/relocated
> -rw-r--r--. root root system_u:object_r:postfix_etc_t:s0
> /etc/postfix/relocated
> # touch /tmp/dumb
> # ls -Z /tmp/dumb
> -rw-r-----. root root unconfined_u:object_r:user_tmp_t:s0 /tmp/dumb
> # chcon --reference=/etc/postfix/relocated /tmp/dumb
> # ls -Z /tmp/dumb
> -rw-r-----. root root system_u:object_r:postfix_etc_t:s0 /tmp/dumb
>
> Wobei ich fuers "Permanente" ("semanage fcontext") wohl immer noch
> nicht ums Skripten herumkomme?
>
> # __user=ls -Z /etc/postfix/relocated | awk '{print $4}' | awk -F:
> '{print $1}'`
> # __type=`ls -Z /etc/postfix/relocated | awk -F: '{print $3}'`
> # echo "__user: ${__user} - __type: ${__type}"
> __user: system_u - __type: postfix_etc_t
> # semanage fcontext -a -s ${__user} -t ${__type} /tmp/dumb
>
> Ist es das?
>
>> Dann habe ich ab und an extra Filesysteme fuer Daten (wie z.B.
>> /var/db/mysql oder /var/spool/squid etc.),
>>
>> die ich vom Betriebssystem getrennt halten moechte (um Backup,
>> Spiegeln, zu neuer Instanz zuordnen etc. zu erleichtern)
>>
>> Was muss ich an dieser Stelle machen? Von Hause aus streikt SELinux
>> erstmal. Ich glaube, ich bin vergesslich, und finde die "richtige"
>> Loesung nicht (abseits von SELinux ausschalten;-) oder halt
>> umstaendlichem Skripten)
>>
>> Danke fuer alle Antworten
>> Peter
Mehr Informationen über die Mailingliste linux-l