[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