SELinux kekeckedik - hostapd

Amiről beszélek, az Fedora 21-en még működött. Adva van egy Fedora 22 live, szeretném indítani a hostapd-t, erre ilyeneket beszél:
máj 29 14:14:59 twenty-two systemd[1]: Starting Hostapd IEEE 802.11 AP, IEEE 802.1X/WPA/WPA2/EAP/RADIUS Authenticator...
máj 29 14:14:59 twenty-two hostapd[1776]: Configuration file: /etc/hostapd/hostapd.conf
máj 29 14:14:59 twenty-two audit[1776]: <audit-1400> avc:  denied  { net_admin } for  pid=1776 comm="hostapd" capability=12  scontext=system_u:system_r:hostapd_t:s0 tcontext=system_u:s
ystem_r:hostapd_t:s0 tclass=capability permissive=0
máj 29 14:14:59 twenty-two audit[1776]: <audit-1400> avc:  denied  { net_admin } for  pid=1776 comm="hostapd" capability=12  scontext=system_u:system_r:hostapd_t:s0 tcontext=system_u:s
ystem_r:hostapd_t:s0 tclass=capability permissive=0
máj 29 14:14:59 twenty-two audit[1776]: <audit-1400> avc:  denied  { net_admin } for  pid=1776 comm="hostapd" capability=12  scontext=system_u:system_r:hostapd_t:s0 tcontext=system_u:s
ystem_r:hostapd_t:s0 tclass=capability permissive=0
máj 29 14:14:59 twenty-two hostapd[1776]: Could not set interface wlp0s26f7u3 flags (UP): Operation not permitted
máj 29 14:14:59 twenty-two hostapd[1776]: nl80211: Could not configure driver mode
máj 29 14:14:59 twenty-two hostapd[1776]: nl80211: deinit ifname=wlp0s26f7u3 disabled_11b_rates=0
máj 29 14:14:59 twenty-two audit[1776]: <audit-1400> avc:  denied  { net_admin } for  pid=1776 comm="hostapd" capability=12  scontext=system_u:system_r:hostapd_t:s0 tcontext=system_u:s
ystem_r:hostapd_t:s0 tclass=capability permissive=0
máj 29 14:14:59 twenty-two audit[1776]: <audit-1400> avc:  denied  { net_admin } for  pid=1776 comm="hostapd" capability=12  scontext=system_u:system_r:hostapd_t:s0 tcontext=system_u:s
ystem_r:hostapd_t:s0 tclass=capability permissive=0
máj 29 14:14:59 twenty-two hostapd[1776]: nl80211 driver initialization failed.
máj 29 14:14:59 twenty-two hostapd[1776]: wlp0s26f7u3: interface state UNINITIALIZED->DISABLED
máj 29 14:14:59 twenty-two hostapd[1776]: wlp0s26f7u3: AP-DISABLED
máj 29 14:14:59 twenty-two hostapd[1776]: hostapd_free_hapd_data: Interface wlp0s26f7u3 wasn't started
máj 29 14:14:59 twenty-two systemd[1]: hostapd.service: control process exited, code=exited status=1
máj 29 14:14:59 twenty-two systemd[1]: Failed to start Hostapd IEEE 802.11 AP, IEEE 802.1X/WPA/WPA2/EAP/RADIUS Authenticator.
máj 29 14:14:59 twenty-two systemd[1]: Unit hostapd.service entered failed state.
máj 29 14:14:59 twenty-two systemd[1]: hostapd.service failed.
máj 29 14:14:59 twenty-two audit[1]: <audit-1130> pid=1 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:init_t:s0 msg='unit=hostapd comm="systemd" exe="/usr/lib/systemd/sys
temd" hostname=? addr=? terminal=? res=failed'

Amennyiben nem service-ként indítom a hostapd, hanem simán, ahogy az a unit file-ban le van írva, akkor működik. Merre tovább?

Hozzászólások

Bennem nagyon erős kételyek merülnek fel az értelmességét illetően, ha a "megoldás" abból áll, hogy amit a program kér, azt engedjük meg neki.

Szóval az egyik értelmes megoldás az, ha másvalaki végiggondolja, és az egyszerű júzer meg használja a "gyári" beállításokkal. Ezt értem, ennek van értelme, igaz, elég korlátos a használhatósága, pont, mint egy windowsnak.

A másik megoldás, hogy az ember beleássa magát, és beállítja korrektül. Ez iszonyú sok meló.

Szerintem is az a baja a SELinuxnak, hogy bonyolult. Ha úgy bízom a fejlesztőkben, hogy könnyedén nem ellenőrizhetők a szabályok, azzal nem vagyok kisegítve, különösen, ha tudom, hogy az egész project az NSA-től indult. Ha meg magamnak csinálom a szabályokat..., azt hiszem, akkor inkább elmegyek kapálni.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Nincs ám ez megoldva. Az alábbit látom:

 Miroslav Grepl 2015-06-01 09:17:31 EDT

commit c6d5db8082b8f27471dad06176b0f05a7d7cfa01
Author: Miroslav Grepl <*@redhat.com>
Date:   Mon Jun 1 15:15:46 2015 +0200

    Allow hostapd net_admin capability. hostapd needs to able to set an interface flag. BZ(1032880)

Status: NEW → MODIFIED
Fixed In Version: selinux-policy-3.13.1-127.fc22

Én az említett selinux-policy-3.13.1-127.fc22 verziót használom, és bizony marhára nincs ez megoldva. Az említett BZ(1032880) hivatkozás földi halandók számára nagy titok, tehát ettől sem lettem okosabb.

A „hostapd needs to able to set an interface flag” megnyilvánulást úgy kell érteni, hogy ez a hostapd-ben javítandó? Tehát várjam, amíg új hostapd jön ki? Mert a

getsebool -a

nem mondott nekem arra utaló infót, hogy lenne bármi flag, amit átbillenthetnék...

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

<< A „hostapd needs to able to set an interface flag” megnyilvánulást úgy kell érteni, hogy ez a hostapd-ben javítandó? >>
Nem. Pontosabban nagy valószínűség szerint azt jelenti, hogy a hostapd jelenlegi megvalósítása esetén az a szolgáltatás kell neki, és majd a selinux policy szerint engedélyezi is neki.

Na jó, de ugye ezt írja a fejlesztő:

Fixed In Version: selinux-policy-3.13.1-127.fc22

Viszont én már eleve ezzel tesztelve néztem, és ugyanúgy megdöglend. Most csináltam új image-et, ma tesztelem. Ebben az audit2allow segítségével logból kinyert infóból csináltattam szabályt. Kíváncsi vagyok. Viszont nem ez lenne a megoldás, jó volna, ha a feklesztők megcsinálnák, s nem hinnék egy pillanatig sem, hogy a 127-es build megoldja a dolgokat, amikor nem.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Lehet, ez lesz. Sok helyen megfogta a hostapd-t a SELinux. Épp feloldottam az összes akadályt, de menteni már nem volt időm. Az én esetemben az összedőlés nem tekinthető klasszikus értelemben vett bugnak, live root fs-én nem szabad sokat módosítani működés közben, mert abból baj lesz.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Sajnos az audit2allow (amivel azért érdemes vigyázni, emlékeim szerint tud nagylelkű lenni), meg úgy általában kézzel nyomkodni ilyen szinten a selinuxot adminként csak félmegoldás, a javasolt irány ált, az, hogy a fejlesztő gondolkodjon, valóban kell-e az oda, és ha igen, akkor pontosan mi.

Nyilván, ilyet érdemben csak a disztribútor tud egyeztetni, de mondjuk ez kb az az eset, ahol nekik kéne vagy lefocizni ezt a hostapds arcokkal, vagy rendesen beállítani a selinuxot.

No, kipróbáltam, nem működött. Viszont tudom, miért nem. Ha több SELinux szabály különféle helyeken megfogja a működést, akkor először csak az első akadály feloldására tudok szabályt készíteni. Ez egy iteratív folyamat, kb. 4-5 helyen fogta meg a SELinux a hostapd-t. Remek.

Már majdnem le tudtam menteni az összes szabályt tartalmazó mypol.te file-t, amikor a kernel úgy döntött, inkább közli velem a stack pointer értékét meg a futó kódrészt, amibe beledöglött. Hát, jó. :(

Ennek az oka valószínűleg az, hogy ez egy live, a filerendszer egy tömörített ext4 snapshot, bármi módosítás van a filerendszeren, az RAM-ba megy, de erre detikált mennyiségű hely van lefoglalva. Amikor ez a RAM elfogy, ami a snapshot és a jelen állapot közti diff-et tartalmazza, akkor széthullik a filerendszer, összedől az egész.

Márpedig a több semodule -i mypol.pp nem tett jót eme memóriával takarékoskodás terén. A fenyőbe...

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE