Eigenes Profil erstellen Beispiel ncat: Unterschied zwischen den Versionen

Aus Xinux Wiki
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