Eigenes Profil erstellen Beispiel ncat: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
| Zeile 18: | Zeile 18: | ||
/root/selinux/modules/netzkatze/netzkatze_selinux.spec # Spezifikationsdatei | /root/selinux/modules/netzkatze/netzkatze_selinux.spec # Spezifikationsdatei | ||
/root/selinux/modules/netzkatze/netzkatze.sh # Einrichtungsskript | /root/selinux/modules/netzkatze/netzkatze.sh # Einrichtungsskript | ||
| + | <span id="modul-konfigurieren"></span> | ||
| + | = Modul konfigurieren = | ||
| + | |||
| + | * Die Grundeinstellung der ''.te'' Datei erlaubt lediglich den Start des Dienstes über systemd. | ||
| + | * Es muss noch ein Porttyp für das Programm definiert werden. | ||
| + | * Ein Port muss über '''semanage port''' mit den benutzerdefinierten Porttype gelabelt werden | ||
| + | * Das Programm muss die zu den nötigen Typen transitieren dürfen. | ||
| + | |||
| + | <!-----> | ||
<span id="permissive-für-das-modul-ausschalten"></span> | <span id="permissive-für-das-modul-ausschalten"></span> | ||
| − | = Permissive für das Modul ausschalten = | + | == Permissive für das Modul ausschalten == |
| − | * Standardmäßig ist das Modul auf permissive gestellt. | + | * Standardmäßig ist das Modul auf permissive gestellt, d.h. SELinux schränkt das Programm nicht ein. |
* Um das zu ändern muss diese Zeile auskommentiert werden: | * Um das zu ändern muss diese Zeile auskommentiert werden: | ||
<!-----> | <!-----> | ||
| − | permissive netzkatze_t; | + | # permissive netzkatze_t; |
| + | <span id="attribute-und-klassen-laden"></span> | ||
| + | == Attribute und Klassen laden == | ||
| + | |||
| + | * Um die Standardregeln von SELinux benutzen zu dürfen, müssen diese mit '''require''' im Skript geladen werden | ||
| + | * Die Listen der Standardobjekte und -assoziationen kann man sich mit '''seinfo -x …''' anzeigen | ||
| + | * Für unseren Fall benötigen wir folgendes: | ||
| + | |||
| + | <!-----> | ||
| + | require { | ||
| + | attribute port_type; | ||
| + | class tcp_socket { recv_msg name_bind }; | ||
| + | } | ||
| + | <span id="porttyp-deklarieren-und-typentransition-erlauben"></span> | ||
| + | == Porttyp deklarieren und Typentransition erlauben == | ||
| + | |||
| + | Vollständige Konfiguration: | ||
| + | |||
| + | policy_module(netzkatze, 1.0.0) | ||
| + | |||
| + | require { | ||
| + | attribute port_type; | ||
| + | class tcp_socket { name_bind }; | ||
| + | } | ||
| + | ######################################## | ||
| + | # | ||
| + | # Declarations | ||
| + | # | ||
| + | |||
| + | type netzkatze_t; | ||
| + | type netzkatze_port_t; | ||
| + | type netzkatze_exec_t; | ||
| + | init_daemon_domain(netzkatze_t, netzkatze_exec_t) | ||
| + | typeattribute netzkatze_port_t port_type; | ||
| + | |||
| + | #permissive netzkatze_t; | ||
| + | |||
| + | ######################################## | ||
| + | # | ||
| + | # netzkatze local policy | ||
| + | # | ||
| + | allow netzkatze_t self:fifo_file rw_fifo_file_perms; | ||
| + | allow netzkatze_t self:unix_stream_socket create_stream_socket_perms; | ||
| + | |||
| + | # allow port to receive things | ||
| + | |||
| + | allow netzkatze_t netzkatze_port_t:tcp_socket { name_bind }; | ||
| + | allow netzkatze_t node_t:tcp_socket { node_bind }; | ||
| + | allow netzkatze_t self:tcp_socket { listen accept }; | ||
| + | |||
| + | domain_use_interactive_fds(netzkatze_t) | ||
| + | |||
| + | files_read_etc_files(netzkatze_t) | ||
| + | |||
| + | miscfiles_read_localization(netzkatze_t) | ||
| + | |||
| + | sysnet_dns_name_resolve(netzkatze_t) | ||
<span id="einrichten-des-neuen-richtlinienmoduls-mithilfe-des-erzeugten-setup-skripts"></span> | <span id="einrichten-des-neuen-richtlinienmoduls-mithilfe-des-erzeugten-setup-skripts"></span> | ||
= Einrichten des neuen Richtlinienmoduls mithilfe des erzeugten Setup-Skripts = | = Einrichten des neuen Richtlinienmoduls mithilfe des erzeugten Setup-Skripts = | ||
Version vom 24. November 2022, 11:43 Uhr
Kopieren der Netzkatze
- cp /usr/bin/ncat /usr/local/bin/netzkatze
Benutzerdefiniert Richtlinie für das Programm “netzkatze” generieren
- sepolicy generate --init /usr/local/bin/netzkatze
Failed to retrieve rpm info for selinux-policy Created the following files: /root/selinux/modules/netzkatze/netzkatze.te # Typ-Enforcement-Datei /root/selinux/modules/netzkatze/netzkatze.if # Schnittstellendatei /root/selinux/modules/netzkatze/netzkatze.fc # Dateikontext-Datei /root/selinux/modules/netzkatze/netzkatze_selinux.spec # Spezifikationsdatei /root/selinux/modules/netzkatze/netzkatze.sh # Einrichtungsskript
Modul konfigurieren
- Die Grundeinstellung der .te Datei erlaubt lediglich den Start des Dienstes über systemd.
- Es muss noch ein Porttyp für das Programm definiert werden.
- Ein Port muss über semanage port mit den benutzerdefinierten Porttype gelabelt werden
- Das Programm muss die zu den nötigen Typen transitieren dürfen.
Permissive für das Modul ausschalten
- Standardmäßig ist das Modul auf permissive gestellt, d.h. SELinux schränkt das Programm nicht ein.
- Um das zu ändern muss diese Zeile auskommentiert werden:
# permissive netzkatze_t;
Attribute und Klassen laden
- Um die Standardregeln von SELinux benutzen zu dürfen, müssen diese mit require im Skript geladen werden
- Die Listen der Standardobjekte und -assoziationen kann man sich mit seinfo -x … anzeigen
- Für unseren Fall benötigen wir folgendes:
require {
attribute port_type;
class tcp_socket { recv_msg name_bind };
}
Porttyp deklarieren und Typentransition erlauben
Vollständige Konfiguration:
policy_module(netzkatze, 1.0.0)
require {
attribute port_type;
class tcp_socket { name_bind };
}
########################################
#
# Declarations
#
type netzkatze_t;
type netzkatze_port_t;
type netzkatze_exec_t;
init_daemon_domain(netzkatze_t, netzkatze_exec_t)
typeattribute netzkatze_port_t port_type;
#permissive netzkatze_t;
########################################
#
# netzkatze local policy
#
allow netzkatze_t self:fifo_file rw_fifo_file_perms;
allow netzkatze_t self:unix_stream_socket create_stream_socket_perms;
# allow port to receive things
allow netzkatze_t netzkatze_port_t:tcp_socket { name_bind };
allow netzkatze_t node_t:tcp_socket { node_bind };
allow netzkatze_t self:tcp_socket { listen accept };
domain_use_interactive_fds(netzkatze_t)
files_read_etc_files(netzkatze_t)
miscfiles_read_localization(netzkatze_t)
sysnet_dns_name_resolve(netzkatze_t)
Einrichten des neuen Richtlinienmoduls mithilfe des erzeugten Setup-Skripts
- ./netzkatze.sh
Building and Loading Policy + make -f /usr/share/selinux/devel/Makefile netzkatze.pp Compiling default netzkatze module Creating default netzkatze.pp policy package rm tmp/netzkatze.mod tmp/netzkatze.mod.fc + /usr/sbin/semodule -i netzkatze.pp libsemanage.add_user: user sddm not in password file + sepolicy manpage -p . -d netzkatze_t ./netzkatze_selinux.8 + /sbin/restorecon -F -R -v /usr/local/sbin/netzkatze Relabeled /usr/local/sbin/netzkatze from unconfined_u:object_r:bin_t:s0 to system_u:object_r:netzkatze_exec_t:s0 + pwd + pwd=/root/selinux/modules/netzkatze + rpmbuild --define _sourcedir /root/selinux/modules/netzkatze --define _specdir /root/selinux/modules/netzkatze --define _builddir /root/selinux/modules/netzkatze --define _srcrpmdir /root/selinux/modules/netzkatze --define _rpmdir /root/selinux/modules/netzkatze --define _buildrootdir /root/selinux/modules/netzkatze/.build -ba netzkatze_selinux.spec ./netzkatze.sh: 52: rpmbuild: not found
Systemd-Dienst erstellen
- cat /lib/systemd/system/netzkatze.service
[Unit] Description=Simple Enforcement test [Service] Type=simple ExecStart=/usr/local/bin/netzkatze -lp 9999 StandardOutput=/tmp/netzkatze.log [Install] WantedBy=default.target
Temporäre Änderung des Kontexts
- chcon -u system_u -t systemd_unit_t /lib/systemd/system/netzkatze.service
Permanente Änderung des Kontexts
- semanage fcontext -a -t systemd_unit_t /lib/systemd/system/netzkatze.service
- restorecon -Fv netzkatze.service
Service starten
- systemctl enable --now netzkatze
- systemctl status netzkatze
Einschränkung überprüfen
- ps -eZ | grep netzkatze
system_u:system_r:netzkatze_t:s0 3598 ? 00:00:00 netzkatze
- ss -Zlt | grep netzkatze
LISTEN 0 1 0.0.0.0:9999 0.0.0.0:* users:(("netzkatze",pid=3598,proc_ctx=system_u:system_r:netzkatze_t:s0,fd=3))
Verstöße anzeigen
- ausearch -m AVC -ts recent
----
time->Wed Nov 23 11:18:23 2022
type=AVC msg=audit(1669198703.130:210): avc: denied { name_bind } for pid=3598 comm="netzkatze" src=9999 scontext=system_u:system_r:netzkatze_t:s0 tcontext=system_u:object_r:unreserved_port_t:s0 tclass=tcp_socket permissive=1
----
time->Wed Nov 23 11:18:23 2022
type=AVC msg=audit(1669198703.130:211): avc: denied { node_bind } for pid=3598 comm="netzkatze" src=9999 scontext=system_u:system_r:netzkatze_t:s0 tcontext=system_u:object_r:node_t:s0 tclass=tcp_socket permissive=1
----
time->Wed Nov 23 11:18:23 2022
type=AVC msg=audit(1669198703.130:212): avc: denied { listen } for pid=3598 comm="netzkatze" lport=9999 scontext=system_u:system_r:netzkatze_t:s0 tcontext=system_u:system_r:netzkatze_t:s0 tclass=tcp_socket permissive=1
----
time->Wed Nov 23 11:18:23 2022
type=AVC msg=audit(1669198703.130:213): avc: denied { accept } for pid=3598 comm="netzkatze" lport=9999 scontext=system_u:system_r:netzkatze_t:s0 tcontext=system_u:system_r:netzkatze_t:s0 tclass=tcp_socket permissive=1
Vorgeschlagene Änderungen
- ausearch -m AVC -ts recent | audit2allow -R