SELinux

SELinux (Security-Enhanced Linux) on pakollisen pääsynvalvonnan (MAC) kerros RHEL-perheen jakeluissa (RHEL, CentOS/Stream, Rocky, AlmaLinux, Fedora) — rajoittaa prosesseja niiden omiin "konteksteihinsa" riippumatta tavallisista Unix-oikeuksista (rwx).

Tilan tarkistus

getenforce                # Enforcing / Permissive / Disabled
sestatus                    # yksityiskohtaisempi tila
setenforce 0                  # vaihda väliaikaisesti Permissive-tilaan (ei estä, vain lokittaa)
setenforce 1                    # takaisin Enforcing-tilaan

Pysyvä tilan muutos tehdään /etc/selinux/config-tiedostoon (SELINUX=enforcing|permissive|disabled) ja vaatii uudelleenkäynnistyksen.

Kontekstien tarkastelu

ls -Z tiedosto           # tiedoston SELinux-konteksti
ps -Z                       # prosessien kontekstit
id -Z                          # oman istunnon konteksti

Konteksti on muotoa käyttäjä:rooli:tyyppi:taso — käytännön työssä lähes aina tyyppi (_t-loppuinen, esim. httpd_sys_content_t) on se, mikä ratkaisee sallitun toiminnan.

Kontekstin muuttaminen: chcon vs. restorecon

chcon -t httpd_sys_content_t tiedosto        # väliaikainen — katoaa relabel-ajossa
chcon -R -t httpd_sys_content_t /srv/web        # rekursiivisesti

restorecon -v tiedosto                             # palauta oletuskontekstiin (policyn mukainen)
restorecon -R -v /srv/web                            # rekursiivisesti

chcon muuttaa vain kyseisen tiedoston senhetkisen kontekstin — se ei ole pysyvä, vaan katoaa esim. restorecon-ajossa tai koko tiedostojärjestelmän relabeloinnissa. Pysyvään muutokseen tarvitaan semanage fcontext.

Pysyvät kontekstisäännöt: semanage fcontext

semanage fcontext -l                                     # listaa nykyiset säännöt
semanage fcontext -a -t httpd_sys_content_t "/srv/web(/.*)?"   # lisää uusi sääntö (regex-polku)
restorecon -R -v /srv/web                                    # sovella lisätty sääntö tiedostoihin

semanage fcontext tallentaa säännön pysyvästi (file_contexts.local), ja restorecon soveltaa sen — nämä kaksi kulkevat aina yhdessä: sääntö ilman restorecon-ajoa ei vaikuta jo olemassa oleviin tiedostoihin.

Boolean-asetukset (valmiiksi määritellyt käytäntökytkimet)

getsebool -a                          # listaa kaikki boolean-asetukset ja niiden tilan
getsebool httpd_can_network_connect     # yhden asetuksen tila
setsebool httpd_can_network_connect on    # aseta väliaikaisesti (nollautuu uudelleenkäynnistyksessä)
setsebool -P httpd_can_network_connect on   # aseta pysyvästi

Porttien salliminen palvelulle

semanage port -l                                 # listaa nykyiset porttimääritykset
semanage port -a -t http_port_t -p tcp 8080         # salli httpd kuunnella porttia 8080/tcp
semanage port -d -t http_port_t -p tcp 8080           # poista määritys

Tämä tarvitaan esim. kun web-palvelin halutaan ajaa oletusportin 80/443 sijaan jollain muulla portilla — pelkkä palomuurisääntö ei riitä, jos SELinux ei tunne kyseistä porttia palvelun sallituksi kontekstiksi.

Vianetsintä: miksi jokin estyi?

sudo grep denied /var/log/audit/audit.log     # etsi estopäätökset lokista

Kun syy on selvillä ja haluat sallia täsmälleen sen toiminnon (ei koko SELinuxin sammuttamista!):

grep httpd /var/log/audit/audit.log | audit2allow -M oma_saanto
semodule -i oma_saanto.pp

audit2allow generoi minimaalisen policy-moduulin havaituista estopäätöksistä, ja semodule -i ottaa sen käyttöön. Älä käytä setenforce 0 -tilaa pysyvänä ratkaisuna tuotannossa — se sammuttaa koko suojausmekanismin sen sijaan että korjaisi yksittäisen säännön.