La eliminación del módulo falla: no se puede encontrar el tipo de puerto, pero ¿está ahí?

La eliminación del módulo falla: no se puede encontrar el tipo de puerto, pero ¿está ahí?

Tengo un módulo SELinux que, entre otras cosas, permite que Apache se conecte vía TCP a un puerto específico:

cat <<EOF > sgtest.te
module sgtest 1.0.0;

require {
   attribute port_type;
   type httpd_t;
   class tcp_socket name_socket;
}

type my_port_t, port_type;

allow httpd_t my_port_t:tcp_socket name_socket;
EOF

echo > sgtest.fc

checkmodule -M -m -o sgtest.mod sgtest.te
semodule_package -o sgtest.pp -m sgtest.mod -f sgtest.fc
semodule -i sgtest.pp

semanage port -a -t my_port_t -p tcp 2002

Esto se instala bien y las reglas parecen funcionar.

El puerto definitivamente está instalado:

$ semanage port -l | grep my_port_t
my_port_t                      tcp      2002

Sin embargo, no puedo eliminar el módulo:

$ semodule -r sgtest
libsemanage.semanage_direct_remove_key: Removing last sgtest module (no other sgtest module exists at another priority).
libsepol.context_from_record: type my_port_t is not defined (No such file or directory).
libsepol.context_from_record: could not create context structure (Invalid argument).
libsepol.port_from_record: could not create port structure for range 2002:2002 (tcp) (Invalid argument).
libsepol.sepol_port_modify: could not load port range 2002 - 2002 (tcp) (Invalid argument).
libsemanage.dbase_policydb_modify: could not modify record value (Invalid argument).
libsemanage.semanage_base_merge_components: could not merge local modifications into policy (Invalid argument).
semodule:  Failed!

Esto está en CentOS 7.4.1708.

¿Qué he hecho mal?

Respuesta1

No entiendo cómo funciona esto ni cómo se relaciona con el mensaje de error, pero descubrí que puedo salir de la situación si elimino el puerto primero:

semanage port -d -p tcp 2002
semodule -r sgtest

información relacionada