<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Linux Sin Humo (Publicaciones sobre seguridad)</title><link>https://sergiobelkin.com/</link><description></description><atom:link href="https://sergiobelkin.com/categories/seguridad.xml" rel="self" type="application/rss+xml"></atom:link><language>es</language><copyright>Contents © 2026 &lt;a href="mailto:sebelk@gmail.com"&gt;sebelk&lt;/a&gt; 
&lt;a rel="license" href="https://creativecommons.org/licenses/by-nc-sa/4.0/"&gt;
&lt;img alt="Creative Commons License BY-NC-SA"
style="border-width:0; margin-bottom:12px;"
src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png"&gt;&lt;/a&gt;
</copyright><lastBuildDate>Mon, 20 Apr 2026 23:54:27 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>Gestión de Contraseñas Usando Contenedores Podman (Update 2025)</title><link>https://sergiobelkin.com/posts/gestion-de-contrasenas-usando-contenedores-podman-update-2025/</link><dc:creator>sebelk</dc:creator><description>&lt;figure&gt;&lt;img src="https://sergiobelkin.com/images/podman-pass-2025.png"&gt;&lt;/figure&gt; &lt;p&gt;En 2023, &lt;a href="https://sergiobelkin.com/posts/gestion-de-contrasenas-usando-contenedores-podman/"&gt;publiqué un post&lt;/a&gt; sobre cómo usar &lt;strong&gt;&lt;code&gt;pass&lt;/code&gt;&lt;/strong&gt; con un contenedor Git administrado por Podman. Esa guía fue muy útil como demo inicial, pero desde entonces cambiaron algunas cosas: nuevas versiones de Podman, la aparición de &lt;strong&gt;Quadlet&lt;/strong&gt;, la deprecación de &lt;code&gt;podman generate systemd&lt;/code&gt;, y la conveniencia de usar imágenes más estables.&lt;/p&gt;
&lt;p&gt;Este post es una &lt;strong&gt;actualización 2025&lt;/strong&gt; del artículo original, incorporando:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Imagen base &lt;strong&gt;UBI9 minimal&lt;/strong&gt; (más liviana y con soporte extendido). Esta imagen, desarrollada por Red Hat, es de tamaño relativamente pequeño, usa una versión reduccida de dnf, llamada &lt;em&gt;microdnf&lt;/em&gt; con soporte de módulos y usa software de repositorios - también - de Red Hat.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rootless limpio&lt;/strong&gt; con &lt;code&gt;UserNS=keep-id&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Quadlet&lt;/strong&gt; para integrar con &lt;code&gt;systemd --user&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Volúmenes persistentes&lt;/strong&gt; para no perder datos ni claves al actualizar la imagen.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Endurecimiento SSH&lt;/strong&gt; (solo claves públicas, nada de contraseñas).&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="1-construccion-de-la-imagen"&gt;1. Construcción de la imagen&lt;/h3&gt;
&lt;p&gt;Dockerfile (&lt;code&gt;Dockerfile&lt;/code&gt;):&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;registry.access.redhat.com/ubi9/ubi-minimal&lt;/span&gt;

&lt;span class="k"&gt;RUN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;microdnf&lt;span class="w"&gt; &lt;/span&gt;-y&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;openssh-server&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;shadow-utils&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;microdnf&lt;span class="w"&gt; &lt;/span&gt;clean&lt;span class="w"&gt; &lt;/span&gt;all&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;useradd&lt;span class="w"&gt; &lt;/span&gt;-ms&lt;span class="w"&gt; &lt;/span&gt;/bin/bash&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;chsh&lt;span class="w"&gt; &lt;/span&gt;-s&lt;span class="w"&gt; &lt;/span&gt;/usr/bin/git-shell&lt;span class="w"&gt; &lt;/span&gt;git

&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;2222&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"/usr/sbin/sshd"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"-D"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"-e"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Construcción:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;podman&lt;span class="w"&gt; &lt;/span&gt;build&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;localhost/passteiner-ubi9:1&lt;span class="w"&gt; &lt;/span&gt;.
&lt;/pre&gt;&lt;/div&gt;

&lt;hr&gt;
&lt;h3 id="2-crear-volumenes-persistentes"&gt;2. Crear volúmenes persistentes&lt;/h3&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;podman&lt;span class="w"&gt; &lt;/span&gt;volume&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;git-home
podman&lt;span class="w"&gt; &lt;/span&gt;volume&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;ssh-etc

&lt;span class="nv"&gt;VHOME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;podman&lt;span class="w"&gt; &lt;/span&gt;volume&lt;span class="w"&gt; &lt;/span&gt;inspect&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'{{.Mountpoint}}'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;git-home&lt;span class="k"&gt;)&lt;/span&gt;
mkdir&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$VHOME&lt;/span&gt;&lt;span class="s2"&gt;/.ssh"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$VHOME&lt;/span&gt;&lt;span class="s2"&gt;/.password-store"&lt;/span&gt;
cp&lt;span class="w"&gt; &lt;/span&gt;~/.ssh/id_ed25519.pub&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$VHOME&lt;/span&gt;&lt;span class="s2"&gt;/.ssh/authorized_keys"&lt;/span&gt;
chmod&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;700&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$VHOME&lt;/span&gt;&lt;span class="s2"&gt;/.ssh"&lt;/span&gt;
chmod&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;600&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$VHOME&lt;/span&gt;&lt;span class="s2"&gt;/.ssh/authorized_keys"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Repositorio bare:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;podman&lt;span class="w"&gt; &lt;/span&gt;unshare&lt;span class="w"&gt; &lt;/span&gt;chown&lt;span class="w"&gt; &lt;/span&gt;-R&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1000&lt;/span&gt;:1000&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$VHOME&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
podman&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;--rm&lt;span class="w"&gt; &lt;/span&gt;-v&lt;span class="w"&gt; &lt;/span&gt;git-home:/home/git&lt;span class="w"&gt; &lt;/span&gt;localhost/passteiner-ubi9:1&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;init&lt;span class="w"&gt; &lt;/span&gt;--bare&lt;span class="w"&gt; &lt;/span&gt;/home/git/.password-store
&lt;/pre&gt;&lt;/div&gt;

&lt;hr&gt;
&lt;h3 id="3-quadlet-systemd-integration"&gt;3. Quadlet (systemd integration)&lt;/h3&gt;
&lt;p&gt;Archivo &lt;code&gt;~/.config/containers/systemd/pass_git.container&lt;/code&gt;:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="k"&gt;[Unit]&lt;/span&gt;
&lt;span class="na"&gt;Description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;pass git over SSH (podman quadlet)&lt;/span&gt;
&lt;span class="na"&gt;Wants&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;network-online.target&lt;/span&gt;
&lt;span class="na"&gt;After&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;network-online.target&lt;/span&gt;

&lt;span class="k"&gt;[Container]&lt;/span&gt;
&lt;span class="na"&gt;Image&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;containers-storage:localhost/passteiner-ubi9:1&lt;/span&gt;
&lt;span class="na"&gt;Pull&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;never&lt;/span&gt;

&lt;span class="na"&gt;ContainerName&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;pass_git&lt;/span&gt;
&lt;span class="na"&gt;Network&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;pasta&lt;/span&gt;
&lt;span class="na"&gt;PublishPort&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;60003:2222&lt;/span&gt;

&lt;span class="na"&gt;Volume&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;git-home:/home/git:Z,U&lt;/span&gt;
&lt;span class="na"&gt;Volume&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;ssh-etc:/etc/ssh:Z&lt;/span&gt;

&lt;span class="na"&gt;UserNS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;keep-id&lt;/span&gt;
&lt;span class="na"&gt;LogDriver&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;journald&lt;/span&gt;
&lt;span class="na"&gt;Exec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/usr/sbin/sshd -D -e -p 2222 -o PidFile=/tmp/sshd.pid&lt;/span&gt;

&lt;span class="k"&gt;[Service]&lt;/span&gt;
&lt;span class="na"&gt;Restart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;on-failure&lt;/span&gt;

&lt;span class="k"&gt;[Install]&lt;/span&gt;
&lt;span class="na"&gt;WantedBy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;default.target&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Activación:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;--user&lt;span class="w"&gt; &lt;/span&gt;daemon-reload
systemctl&lt;span class="w"&gt; &lt;/span&gt;--user&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;enable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--now&lt;span class="w"&gt; &lt;/span&gt;pass_git.service
&lt;/pre&gt;&lt;/div&gt;

&lt;hr&gt;
&lt;h3 id="4-probar-conexion-ssh"&gt;4. Probar conexión SSH&lt;/h3&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;ssh&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;60003&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;git@&amp;lt;IP_DEL_HOST&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;PreferredAuthentications&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;publickey&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;PasswordAuthentication&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;no&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s1"&gt;'git --version &amp;amp;&amp;amp; echo OK'&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Debe autenticar con tu clave pública y responder &lt;code&gt;git version ...&lt;/code&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="5-probar-pass-con-git"&gt;5. Probar pass con git&lt;/h3&gt;
&lt;p&gt;Inicializar &lt;code&gt;pass&lt;/code&gt; en tu host y configurar el remoto:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;PASSWORD_STORE_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;~/.local/share/pass
pass&lt;span class="w"&gt; &lt;/span&gt;init&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tu_clave_gpg"&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PASSWORD_STORE_DIR&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
git&lt;span class="w"&gt; &lt;/span&gt;remote&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;origin&lt;span class="w"&gt; &lt;/span&gt;ssh://git@&amp;lt;IP_DEL_HOST&amp;gt;:60003/home/git/.password-store
git&lt;span class="w"&gt; &lt;/span&gt;push&lt;span class="w"&gt; &lt;/span&gt;origin&lt;span class="w"&gt; &lt;/span&gt;master
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Y luego:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;pass&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;push
pass&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;pull
&lt;/pre&gt;&lt;/div&gt;

&lt;hr&gt;
&lt;h3 id="diferencias-clave-respecto-al-articulo-original"&gt;Diferencias clave respecto al artículo original&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Imagen&lt;/strong&gt;: antes Fedora, ahora UBI9 minimal (más estable, soporte hasta 2032).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Systemd&lt;/strong&gt;: antes &lt;code&gt;podman generate systemd&lt;/code&gt;, ahora &lt;strong&gt;Quadlet&lt;/strong&gt; (futuro estándar, más limpio).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rootless&lt;/strong&gt;: antes root dentro del contenedor, ahora &lt;code&gt;UserNS=keep-id&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Volúmenes&lt;/strong&gt;: ahora explícitos (&lt;code&gt;git-home&lt;/code&gt;, &lt;code&gt;ssh-etc&lt;/code&gt;), evitando pérdidas de datos.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Seguridad SSH&lt;/strong&gt;: solo claves, sin password, &lt;code&gt;PidFile&lt;/code&gt; movido a &lt;code&gt;/tmp&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="conclusion"&gt;Conclusión&lt;/h3&gt;
&lt;p&gt;Este enfoque actualizado:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Evita perder el repositorio y las claves al recrear el contenedor.&lt;/li&gt;
&lt;li&gt;Asegura compatibilidad a futuro con Podman + systemd.&lt;/li&gt;
&lt;li&gt;Se apoya en una base más segura (UBI9 minimal).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;👉 Si ya usás el setup original, podés migrar en pocas horas y quedarte tranquilo de que tu &lt;strong&gt;gestor de contraseñas &lt;code&gt;pass&lt;/code&gt;&lt;/strong&gt; seguirá funcionando a largo plazo.&lt;/p&gt;</description><category>contenedores</category><category>seguridad</category><guid>https://sergiobelkin.com/posts/gestion-de-contrasenas-usando-contenedores-podman-update-2025/</guid><pubDate>Mon, 25 Aug 2025 22:27:46 GMT</pubDate></item><item><title>3 Power Tips + 1 Power Link I1</title><link>https://sergiobelkin.com/posts/3-power-tips-plus-i1/</link><dc:creator>sebelk</dc:creator><description>&lt;figure&gt;&lt;img src="https://sergiobelkin.com/images/PowerTipsPlus.webp"&gt;&lt;/figure&gt; &lt;h3 id="power-tip-1"&gt;Power Tip #1&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;El comando &lt;code&gt;cd -&lt;/code&gt; sirve para ir rápidamente al directorio anterior&lt;/strong&gt;&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/usr/local/bin
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/tmp
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-
&lt;span class="nb"&gt;pwd&lt;/span&gt;
/usr/local/bin
&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id="power-tip-2"&gt;Power Tip #2&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;La variable &lt;code&gt;HISTTIMEFORMAT&lt;/code&gt; agrega una marca de tiempo en el hi:storial de bash&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Agegar en &lt;code&gt;~/.bashrc&lt;/code&gt;&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="nv"&gt;HISTTIMEFORMAT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"%F %T"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;También se puede usar &lt;a href="https://sergiobelkin.com/posts/frameworks-para-bash-realmente-los-necesitamos-una-mirada-profunda-a-bash-it/"&gt;bash-it&lt;/a&gt; para realizar la configuración.&lt;/p&gt;
&lt;p&gt;Al recargar la configuración, se agregará la marca de tiempo:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="m"&gt;234475&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;2025&lt;/span&gt;-06-03&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;21&lt;/span&gt;:54:27&lt;span class="w"&gt; &lt;/span&gt;vim&lt;span class="w"&gt;  &lt;/span&gt;~/Documentos/Arts/nikola-env/sebelkfloss/files/assets/css/custom.css&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="m"&gt;234476&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;2025&lt;/span&gt;-06-02&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;08&lt;/span&gt;:18:37&lt;span class="w"&gt; &lt;/span&gt;vim&lt;span class="w"&gt;  &lt;/span&gt;~/.config/nvim/lua/core/lazy.lua&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="m"&gt;234477&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;2025&lt;/span&gt;-06-04&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;18&lt;/span&gt;:27:09&lt;span class="w"&gt; &lt;/span&gt;nohup&lt;span class="w"&gt; &lt;/span&gt;nikola&lt;span class="w"&gt; &lt;/span&gt;serve&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;/dev/null&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;
&lt;span class="m"&gt;234478&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;2025&lt;/span&gt;-06-04&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;18&lt;/span&gt;:29:38&lt;span class="w"&gt; &lt;/span&gt;vim&lt;span class="w"&gt;  &lt;/span&gt;~/.config/nvim/lua/core/lazy.lua&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="m"&gt;234479&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;2025&lt;/span&gt;-06-04&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;18&lt;/span&gt;:29:57&lt;span class="w"&gt; &lt;/span&gt;loadnikola&lt;span class="w"&gt; &lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id="power-tip-3"&gt;Power Tip #3&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Usar una herramienta de monitoreo local como wallpaper&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;El emulador de terminal &lt;code&gt;kitty&lt;/code&gt; posee herramientas pequeñas que amplian su funcionalidad. Una de ellas permite mostrar usar la terminal como wallpaper:&lt;/p&gt;
&lt;p&gt;Este comando mostrará el panel de la herramienta &lt;code&gt;glances&lt;/code&gt; en un entorno Wayland&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;kitty&lt;span class="w"&gt; &lt;/span&gt;+kitten&lt;span class="w"&gt; &lt;/span&gt;panel&lt;span class="w"&gt; &lt;/span&gt;--edge&lt;span class="o"&gt;=&lt;/span&gt;background&lt;span class="w"&gt; &lt;/span&gt;--focus-policy&lt;span class="w"&gt; &lt;/span&gt;exclusive&lt;span class="w"&gt; &lt;/span&gt;--detach&lt;span class="w"&gt;  &lt;/span&gt;glances
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;

&lt;/p&gt;&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
  &lt;iframe src="https://www.youtube.com/embed/8QzpwiyLw2o?vq=hd720" frameborder="0" allowfullscreen style="position: absolute; top: 0; left: 0; width: 100%; height: 100%;"&gt;
  &lt;/iframe&gt;
&lt;/div&gt;


&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;h3 id="power-link"&gt;Power Link&lt;/h3&gt;
&lt;p&gt;Sencillamente un link: &lt;a href="https://stopdisablingselinux.com/"&gt;Stop disabling SELinux&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¡Hasta la próxima!&lt;/strong&gt;&lt;/p&gt;</description><category>bash</category><category>seguridad</category><guid>https://sergiobelkin.com/posts/3-power-tips-plus-i1/</guid><pubDate>Tue, 17 Jun 2025 19:25:26 GMT</pubDate></item><item><title>Introducción a nftables y familia de direcciones</title><link>https://sergiobelkin.com/posts/introduccion-a-nftables/</link><dc:creator>sebelk</dc:creator><description>&lt;h3 id="historia-e-introduccion"&gt;Historia e Introducción&lt;/h3&gt;
&lt;p&gt;Antes de iptables y nftables, existía &lt;strong&gt;ipfwadm&lt;/strong&gt;, una herramienta que se utilizaba en las primeras versiones del kernel de Linux para gestionar el firewall. Aunque ipfwadm sentó las bases para el firewalling en Linux, fue reemplazada debido a su limitada capacidad de manejo de tráfico y escalabilidad. Primero fue sustituida por &lt;em&gt;ipchains&lt;/em&gt; y más tarde por el popular &lt;em&gt;iptables&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a class="image-reference" href="https://sergiobelkin.com/images/nftables-families-circled.webp"&gt;&lt;img src="https://sergiobelkin.com/images/nftables-families-circled.thumbnail.webp" alt="nftables"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;h4 id="comunidad-y-grupos-clave"&gt;Comunidad y Grupos Clave&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Netfilter Project&lt;/strong&gt;: La comunidad principal detrás de iptables y nftables. Este grupo ha sido esencial en el desarrollo, mantenimiento y promoción de herramientas de filtrado de paquetes en Linux.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Kernel Contributors&lt;/strong&gt;: Muchos desarrolladores de kernel han colaborado en la optimización de las capacidades de firewalling en Linux, asegurando su integración fluida y eficiente.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="creacion-de-nftables"&gt;Creación de nftables&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;nftables&lt;/strong&gt; fue introducido en 2014 como el sucesor de iptables, diseñado para abordar las limitaciones de su predecesor en términos de rendimiento y escalabilidad. &lt;/p&gt;
&lt;p&gt;Si bien eso fue hace más de 10 años, hay cambios tecnológicos que van por ascensor y otros por escalera. En ámbitos corporativos el mero hecho de reemplazar un software que es cardinal en una infraestructura, no es una tarea trivial. Ese cambio se debe a que los tiempos de vida de las distribuciones que las medianas y grandes organizaciones tienen soporte a largo a plazo. A veces es falta de urgencia y otras veces por sencilla negligencia :smile:.&lt;/p&gt;
&lt;p&gt;Sin embargo apenas 3 datos para considerar la adopción de nftables:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;RHEL9 considera iptables, ipset y ebtables herramientas depreciadas.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;iptables no estará disponible en RHEL10 ni en OpenShift 4.16.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Debian Bullseye (a la fecha oldstable) ha depreciado iptables en favor de nftables.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="cual-es-el-problema-de-iptables"&gt;&lt;strong&gt;¿Cuál es el problema de iptables?&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Aunque ha sido una herramienta extraordinaria que ha servido de base para muchas soluciones de firewall, &lt;strong&gt;iptables&lt;/strong&gt; presenta algunas limitaciones. A continuación, mencionamos tres de las más importantes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Reprocesamiento completo al modificar reglas&lt;/strong&gt;:&lt;br&gt;
   Cada vez que se agrega o elimina una regla, el kernel debe volver a procesar toda la lista de reglas. Este enfoque resulta ineficiente, especialmente en entornos donde se realizan cambios frecuentes o se manejan firewalls con un gran número de reglas.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Gestión complicada de rangos de direcciones IP&lt;/strong&gt;:&lt;br&gt;
   Manejar rangos de direcciones IP o grandes conjuntos de direcciones en &lt;strong&gt;iptables&lt;/strong&gt; puede ser tedioso y poco práctico. La herramienta &lt;strong&gt;ipset&lt;/strong&gt; fue una solución ingeniosa para optimizar esta tarea, ya que permite manejar conjuntos de IPs, rangos o puertos de manera más eficiente. Sin embargo, su uso añade una capa de complejidad adicional al proceso de configuración y gestión.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Extensiones con sintaxis inconsistente&lt;/strong&gt;:&lt;br&gt;
&lt;strong&gt;iptables&lt;/strong&gt; cuenta con extensiones como &lt;strong&gt;xtables&lt;/strong&gt;, que amplían sus funcionalidades al incluir capacidades avanzadas como el seguimiento de conexiones o la inspección profunda de protocolos. No obstante, la sintaxis de estas extensiones no siempre es uniforme ni intuitiva, lo que puede dificultar su uso y generar confusiones en configuraciones complejas.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;En cambio, desde su incorporación, &lt;strong&gt;nftables&lt;/strong&gt; ha demostrado ser una herramienta eficiente y moderna para la gestión del tráfico de red en Linux. Una de sus principales innovaciones es consolidar las herramientas clásicas como iptables, ip6tables, ebtables y arptables en una única interfaz, simplificando tanto la configuración como el mantenimiento.&lt;/p&gt;
&lt;h3 id="conceptos-claves-de-nftables"&gt;Conceptos claves de nftables&lt;/h3&gt;
&lt;h4 id="contexto-y-familias-de-direcciones"&gt;Contexto y Familias de Direcciones&lt;/h4&gt;
&lt;p&gt;En &lt;code&gt;iptables&lt;/code&gt;, cada tipo de tráfico o protocolo tenía su propio comando o herramienta específica, que funcionaba de manera independiente:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Comando/herramienta&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Propósito&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;iptables&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Filtrar y manipular tráfico IPv4.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;ip6tables&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Filtrar y manipular tráfico IPv6.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;arptables&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Filtrar y manipular tráfico ARP.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;ebtables&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Filtrar tráfico en bridges (Ethernet frames).&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Cada una de estas herramientas tenía su propia sintaxis y requería comandos separados para manejar diferentes tipos de tráfico, lo que podía ser confuso y propenso a errores.&lt;/p&gt;
&lt;h5 id="problemas-del-enfoque-de-iptables"&gt;&lt;strong&gt;Problemas del enfoque de iptables&lt;/strong&gt;&lt;/h5&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Fragmentación:&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;Si querías manejar tráfico IPv4 e IPv6, debías configurar reglas separadas con &lt;code&gt;iptables&lt;/code&gt; e &lt;code&gt;ip6tables&lt;/code&gt;, incluso si las reglas eran idénticas.&lt;/li&gt;
&lt;li&gt;Lo mismo ocurría si querías gestionar tráfico ARP con &lt;code&gt;arptables&lt;/code&gt; o tráfico en bridges con &lt;code&gt;ebtables&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Falta de unificación:&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;Cada herramienta tenía su propia lógica, lo que aumentaba la complejidad administrativa.&lt;/li&gt;
&lt;li&gt;No existía una forma centralizada de gestionar tráfico que abarcase múltiples protocolos o tipos de datos.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mantenimiento difícil:&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;Las configuraciones de firewall requerían gestionar múltiples conjuntos de reglas, lo que hacía el mantenimiento y la depuración más complicados.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h5 id="como-nftables-mejoro-este-enfoque"&gt;&lt;strong&gt;Cómo nftables mejoró este enfoque:&lt;/strong&gt;&lt;/h5&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Introducción de familias:&lt;/strong&gt; En &lt;code&gt;nftables&lt;/code&gt;, las &lt;strong&gt;familias&lt;/strong&gt; permiten manejar diferentes tipos de tráfico dentro de un mismo marco conceptual, con una sintaxis unificada.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Familia &lt;code&gt;ip&lt;/code&gt;: Maneja tráfico IPv4.&lt;/li&gt;
&lt;li&gt;Familia &lt;code&gt;ip6&lt;/code&gt;: Maneja tráfico IPv6.&lt;/li&gt;
&lt;li&gt;Familia &lt;code&gt;inet&lt;/code&gt;: Unifica IPv4 e IPv6.&lt;/li&gt;
&lt;li&gt;Familia &lt;code&gt;arp&lt;/code&gt;: Maneja tráfico ARP.&lt;/li&gt;
&lt;li&gt;Familia &lt;code&gt;bridge&lt;/code&gt;: Maneja tráfico L2 en bridges.&lt;/li&gt;
&lt;li&gt;Familia &lt;code&gt;netdev&lt;/code&gt;: Maneja tráfico en interfaces específicas.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Unificación de reglas:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Con la familia &lt;code&gt;inet&lt;/code&gt;, puedes escribir reglas que funcionen tanto para IPv4 como para IPv6.&lt;/li&gt;
&lt;li&gt;Esto simplifica significativamente la configuración y el mantenimiento del firewall.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Menor duplicación de configuraciones:&lt;/strong&gt; En lugar de mantener múltiples herramientas (&lt;code&gt;iptables&lt;/code&gt;, &lt;code&gt;ip6tables&lt;/code&gt;, &lt;code&gt;arptables&lt;/code&gt;, &lt;code&gt;ebtables&lt;/code&gt;), todo se gestiona con el comando &lt;code&gt;nft&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Ejemplos en &lt;code&gt;nftables&lt;/code&gt;:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="c1"&gt;# Una regla para IPv4 e IPv6&lt;/span&gt;
nft&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;rule&lt;span class="w"&gt; &lt;/span&gt;inet&lt;span class="w"&gt; &lt;/span&gt;filter&lt;span class="w"&gt; &lt;/span&gt;input&lt;span class="w"&gt; &lt;/span&gt;ip&lt;span class="w"&gt; &lt;/span&gt;saddr&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;192&lt;/span&gt;.168.0.0/24&lt;span class="w"&gt; &lt;/span&gt;accept
nft&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;rule&lt;span class="w"&gt; &lt;/span&gt;inet&lt;span class="w"&gt; &lt;/span&gt;filter&lt;span class="w"&gt; &lt;/span&gt;input&lt;span class="w"&gt; &lt;/span&gt;ip6&lt;span class="w"&gt; &lt;/span&gt;saddr&lt;span class="w"&gt; &lt;/span&gt;fc00::/7&lt;span class="w"&gt; &lt;/span&gt;accept
&lt;/pre&gt;&lt;/div&gt;

&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;nft&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;table&lt;span class="w"&gt; &lt;/span&gt;arp&lt;span class="w"&gt; &lt;/span&gt;filter
nft&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;chain&lt;span class="w"&gt; &lt;/span&gt;arp&lt;span class="w"&gt; &lt;/span&gt;filter&lt;span class="w"&gt; &lt;/span&gt;input&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;filter&lt;span class="w"&gt; &lt;/span&gt;hook&lt;span class="w"&gt; &lt;/span&gt;input&lt;span class="w"&gt; &lt;/span&gt;priority&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="c1"&gt;# Permitir solicitudes ARP desde el rango 192.168.1.0/24 en eth0&lt;/span&gt;
nft&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;rule&lt;span class="w"&gt; &lt;/span&gt;arp&lt;span class="w"&gt; &lt;/span&gt;filter&lt;span class="w"&gt; &lt;/span&gt;input&lt;span class="w"&gt; &lt;/span&gt;iif&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"eth0"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;arp&lt;span class="w"&gt; &lt;/span&gt;sip&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;192&lt;/span&gt;.168.1.0/24&lt;span class="w"&gt; &lt;/span&gt;arp&lt;span class="w"&gt; &lt;/span&gt;op&lt;span class="w"&gt; &lt;/span&gt;request&lt;span class="w"&gt; &lt;/span&gt;accept

&lt;span class="c1"&gt;# Bloquear cualquier otra solicitud ARP&lt;/span&gt;
nft&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;rule&lt;span class="w"&gt; &lt;/span&gt;arp&lt;span class="w"&gt; &lt;/span&gt;filter&lt;span class="w"&gt; &lt;/span&gt;input&lt;span class="w"&gt; &lt;/span&gt;iif&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"eth0"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;arp&lt;span class="w"&gt; &lt;/span&gt;op&lt;span class="w"&gt; &lt;/span&gt;request&lt;span class="w"&gt; &lt;/span&gt;drop
&lt;/pre&gt;&lt;/div&gt;

&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;nft&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;table&lt;span class="w"&gt; &lt;/span&gt;bridge&lt;span class="w"&gt; &lt;/span&gt;filter
nft&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;chain&lt;span class="w"&gt; &lt;/span&gt;bridge&lt;span class="w"&gt; &lt;/span&gt;filter&lt;span class="w"&gt; &lt;/span&gt;forward&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;filter&lt;span class="w"&gt; &lt;/span&gt;hook&lt;span class="w"&gt; &lt;/span&gt;forward&lt;span class="w"&gt; &lt;/span&gt;priority&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="c1"&gt;# Permitir solicitudes ARP desde direcciones MAC específicas en el bridge br0&lt;/span&gt;
nft&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;rule&lt;span class="w"&gt; &lt;/span&gt;bridge&lt;span class="w"&gt; &lt;/span&gt;filter&lt;span class="w"&gt; &lt;/span&gt;forward&lt;span class="w"&gt; &lt;/span&gt;iif&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"br0"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ether&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;arp&lt;span class="w"&gt; &lt;/span&gt;arp&lt;span class="w"&gt; &lt;/span&gt;op&lt;span class="w"&gt; &lt;/span&gt;request&lt;span class="w"&gt; &lt;/span&gt;ether&lt;span class="w"&gt; &lt;/span&gt;saddr&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;:11:22:33:44:55&lt;span class="w"&gt; &lt;/span&gt;accept
nft&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;rule&lt;span class="w"&gt; &lt;/span&gt;bridge&lt;span class="w"&gt; &lt;/span&gt;filter&lt;span class="w"&gt; &lt;/span&gt;forward&lt;span class="w"&gt; &lt;/span&gt;iif&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"br0"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ether&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;arp&lt;span class="w"&gt; &lt;/span&gt;arp&lt;span class="w"&gt; &lt;/span&gt;op&lt;span class="w"&gt; &lt;/span&gt;request&lt;span class="w"&gt; &lt;/span&gt;ether&lt;span class="w"&gt; &lt;/span&gt;saddr&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;:aa:bb:cc:dd:ee&lt;span class="w"&gt; &lt;/span&gt;accept

&lt;span class="c1"&gt;# Bloquear cualquier otra solicitud ARP en el bridge&lt;/span&gt;
nft&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;rule&lt;span class="w"&gt; &lt;/span&gt;bridge&lt;span class="w"&gt; &lt;/span&gt;filter&lt;span class="w"&gt; &lt;/span&gt;forward&lt;span class="w"&gt; &lt;/span&gt;iif&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"br0"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ether&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;arp&lt;span class="w"&gt; &lt;/span&gt;arp&lt;span class="w"&gt; &lt;/span&gt;op&lt;span class="w"&gt; &lt;/span&gt;request&lt;span class="w"&gt; &lt;/span&gt;drop
&lt;/pre&gt;&lt;/div&gt;

&lt;h5 id="diferencia-entre-las-familias-inet-y-netdev"&gt;Diferencia entre las familias inet y netdev&lt;/h5&gt;
&lt;p&gt;La familia &lt;code&gt;netdev&lt;/code&gt;&lt;strong&gt; puede ser una opción adecuada para implementar &lt;/strong&gt;policing&lt;strong&gt; con &lt;code&gt;nftables&lt;/code&gt;, dependiendo del escenario. Esto se debe a que la familia &lt;code&gt;netdev&lt;/code&gt; opera en el &lt;/strong&gt;hook &lt;code&gt;ingress&lt;/code&gt;, lo que significa que puede evaluar el tráfico &lt;strong&gt;directamente en la interfaz&lt;/strong&gt; antes de que llegue al stack de red.&lt;/p&gt;
&lt;p&gt;Vamos a explorar por qué usar la familia &lt;code&gt;netdev&lt;/code&gt; podría ser más apropiado para policing en algunos casos y cuándo es mejor utilizar otras familias.&lt;/p&gt;
&lt;h6 id="por-que-usar-la-familia-netdev-para-policing"&gt;&lt;strong&gt;Por qué usar la familia netdev para policing:&lt;/strong&gt;&lt;/h6&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Posición temprana en el flujo del tráfico:&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;La familia &lt;code&gt;netdev&lt;/code&gt; opera en el hook &lt;strong&gt;&lt;code&gt;ingress&lt;/code&gt;&lt;/strong&gt;, lo que significa que intercepta el tráfico &lt;strong&gt;inmediatamente después de que llega a la interfaz de red&lt;/strong&gt; y antes de que sea procesado por el stack TCP/IP.&lt;/li&gt;
&lt;li&gt;Esto permite implementar políticas de policing directamente en el nivel de la interfaz, evitando sobrecargar el sistema con tráfico innecesario.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Ejemplo de regla de policing en &lt;code&gt;netdev&lt;/code&gt;:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;nft&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;table&lt;span class="w"&gt; &lt;/span&gt;netdev&lt;span class="w"&gt; &lt;/span&gt;ingress
nft&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;chain&lt;span class="w"&gt; &lt;/span&gt;netdev&lt;span class="w"&gt; &lt;/span&gt;ingress&lt;span class="w"&gt; &lt;/span&gt;mychain&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;filter&lt;span class="w"&gt; &lt;/span&gt;hook&lt;span class="w"&gt; &lt;/span&gt;ingress&lt;span class="w"&gt; &lt;/span&gt;priority&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
nft&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;rule&lt;span class="w"&gt; &lt;/span&gt;netdev&lt;span class="w"&gt; &lt;/span&gt;ingress&lt;span class="w"&gt; &lt;/span&gt;mychain&lt;span class="w"&gt; &lt;/span&gt;ip&lt;span class="w"&gt; &lt;/span&gt;limit&lt;span class="w"&gt; &lt;/span&gt;rate&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;mbps&lt;span class="w"&gt; &lt;/span&gt;drop
&lt;/pre&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Esta regla limita el tráfico IP entrante a 10 Mbps en la interfaz.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Evitar procesamiento innecesario:&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Como &lt;code&gt;netdev&lt;/code&gt; actúa antes de que los paquetes sean entregados al stack TCP/IP, los paquetes que no cumplen con las políticas son descartados sin consumir recursos adicionales del sistema.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ideal para interfaces específicas:&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Cuando el objetivo es aplicar policing solo en una interfaz específica (por ejemplo, &lt;code&gt;eth0&lt;/code&gt;), la familia &lt;code&gt;netdev&lt;/code&gt; es la opción más directa.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Compatibilidad con &lt;code&gt;limit rate&lt;/code&gt;:&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;La familia &lt;code&gt;netdev&lt;/code&gt; admite acciones como &lt;code&gt;limit rate&lt;/code&gt;, que es esencial para configurar políticas de policing basadas en rates.&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="cuando-usar-netdev-frente-a-otras-familias-ip-inet"&gt;&lt;strong&gt;¿Cuándo usar netdev frente a otras familias (ip, inet)?&lt;/strong&gt;&lt;/h6&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Criterio&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Familia &lt;code&gt;netdev&lt;/code&gt;&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Familias &lt;code&gt;ip&lt;/code&gt;/&lt;code&gt;inet&lt;/code&gt;&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Posición en el stack&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Hook &lt;code&gt;ingress&lt;/code&gt;, antes del stack TCP/IP.&lt;/td&gt;
&lt;td&gt;Hook &lt;code&gt;prerouting&lt;/code&gt;, &lt;code&gt;forward&lt;/code&gt;, o &lt;code&gt;input&lt;/code&gt;, después de ingresar al stack.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Eficiencia&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Muy alta: paquetes descartados antes de procesarse.&lt;/td&gt;
&lt;td&gt;Menor: los paquetes son procesados parcialmente antes de aplicar las políticas.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tráfico inspeccionado&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Solo tráfico entrante en una interfaz específica.&lt;/td&gt;
&lt;td&gt;Tráfico en todas las interfaces (dependiendo de la configuración).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Complejidad de las reglas&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Más limitada: ideal para políticas simples (policing básico).&lt;/td&gt;
&lt;td&gt;Más flexible: soporta reglas complejas (filtrado avanzado, conntrack).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Uso típico&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Policing directo en una interfaz (DDoS, límites de ancho de banda).&lt;/td&gt;
&lt;td&gt;Filtrado y políticas basadas en estado o dirección IP.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h6 id="limitaciones-de-la-familia-netdev"&gt;&lt;strong&gt;Limitaciones de la familia netdev:&lt;/strong&gt;&lt;/h6&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Solo para tráfico entrante:&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;La familia &lt;code&gt;netdev&lt;/code&gt; opera únicamente en el hook &lt;code&gt;ingress&lt;/code&gt;, por lo que no puedes aplicar policing en el tráfico saliente de una interfaz.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Falta de seguimiento de conexiones (&lt;code&gt;conntrack&lt;/code&gt;):&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;No puedes usar estados como &lt;code&gt;NEW&lt;/code&gt; o &lt;code&gt;ESTABLISHED&lt;/code&gt;, ya que &lt;code&gt;netdev&lt;/code&gt; opera antes de que el módulo &lt;code&gt;conntrack&lt;/code&gt; pueda procesar el tráfico.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Menor flexibilidad:&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;Si necesitás reglas más complejas basadas en capas superiores (por ejemplo, L7 o estados de conexión), las familias &lt;code&gt;ip&lt;/code&gt; o &lt;code&gt;inet&lt;/code&gt; son más adecuadas.&lt;/li&gt;
&lt;/ol&gt;
&lt;h6 id="cuando-es-mejor-usar-la-familia-netdev-para-policing"&gt;&lt;strong&gt;¿Cuándo es mejor usar la familia netdev para policing?&lt;/strong&gt;&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Tráfico entrante en una interfaz específica:&lt;/strong&gt; Cuando necesitás limitar o descartar tráfico directamente en una interfaz antes de que afecte el sistema. Ejemplo: Mitigar un ataque DDoS en &lt;code&gt;eth0&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Simplicidad y eficiencia:&lt;/strong&gt; Si solo necesitas evaluar tráfico basándote en tasas o direcciones básicas (IP, MAC).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="ejemplo-practico"&gt;&lt;strong&gt;Ejemplo práctico:&lt;/strong&gt;&lt;/h6&gt;
&lt;p&gt;Supongamos que queremos limitar el tráfico entrante a 100 Mbps en una interfaz específica (&lt;code&gt;eth0&lt;/code&gt;):&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;nft&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;table&lt;span class="w"&gt; &lt;/span&gt;netdev&lt;span class="w"&gt; &lt;/span&gt;ingress
nft&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;chain&lt;span class="w"&gt; &lt;/span&gt;netdev&lt;span class="w"&gt; &lt;/span&gt;ingress&lt;span class="w"&gt; &lt;/span&gt;eth0_chain&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;filter&lt;span class="w"&gt; &lt;/span&gt;hook&lt;span class="w"&gt; &lt;/span&gt;ingress&lt;span class="w"&gt; &lt;/span&gt;priority&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
nft&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;rule&lt;span class="w"&gt; &lt;/span&gt;netdev&lt;span class="w"&gt; &lt;/span&gt;ingress&lt;span class="w"&gt; &lt;/span&gt;eth0_chain&lt;span class="w"&gt; &lt;/span&gt;limit&lt;span class="w"&gt; &lt;/span&gt;rate&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;100&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;mbps&lt;span class="w"&gt; &lt;/span&gt;drop
&lt;/pre&gt;&lt;/div&gt;

&lt;h4 id="diferencia-entre-la-familia-bridge-y-netdev"&gt;Diferencia entre la familia bridge y netdev&lt;/h4&gt;
&lt;p&gt;Dado que la tanto la tabla &lt;strong&gt;bridge&lt;/strong&gt; como la tabla &lt;strong&gt;netdev&lt;/strong&gt; operan en Capa 2 uno podría preguntarse, qué diferencia hay entre estas dos familias, aquí tenemos una tabla comparativa detallada entre las familias &lt;strong&gt;&lt;code&gt;bridge&lt;/code&gt;&lt;/strong&gt; y &lt;strong&gt;&lt;code&gt;netdev&lt;/code&gt;&lt;/strong&gt; en &lt;code&gt;nftables&lt;/code&gt;:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Aspecto&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Familia &lt;code&gt;bridge&lt;/code&gt;&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Familia &lt;code&gt;netdev&lt;/code&gt;&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Nivel del modelo OSI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Capa 2 (L2)&lt;/td&gt;
&lt;td&gt;Capa 2 (L2), pero en el contexto de interfaces individuales.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tráfico manejado&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Tráfico que cruza un bridge (tramas Ethernet).&lt;/td&gt;
&lt;td&gt;Todo el tráfico en una interfaz específica antes de llegar al stack de red.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Propósito principal&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Controlar y filtrar tráfico dentro de bridges.&lt;/td&gt;
&lt;td&gt;Filtrar tráfico en una interfaz individual (sin importar si forma parte de un bridge).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ámbito de aplicación&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Solo funciona en interfaces que forman parte de un bridge.&lt;/td&gt;
&lt;td&gt;Funciona en cualquier interfaz (física o virtual), bridge o no.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Casos de uso típicos&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;- Aislar tráfico entre puertos de un bridge.&lt;br&gt;- Proteger bridges contra broadcast storms, spoofing de MAC, etc.&lt;br&gt;- Controlar tráfico entre VLANs en un bridge.&lt;/td&gt;
&lt;td&gt;- Filtrar tráfico directo en una interfaz (ingress/egress).&lt;br&gt;- Detectar y mitigar DDoS a nivel de interfaz.&lt;br&gt;- Filtrar ARP o IPv4 antes de pasar al stack de red.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Compatibilidad con VLANs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Sí, puede filtrar tráfico basado en etiquetas VLAN (802.1Q).&lt;/td&gt;
&lt;td&gt;No trabaja específicamente con VLANs.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Estado de conexión&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No tiene integración con &lt;code&gt;conntrack&lt;/code&gt;.&lt;/td&gt;
&lt;td&gt;No tiene integración con &lt;code&gt;conntrack&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Posición en el stack&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Filtra tráfico que pasa a través de un bridge antes de ser reenviado.&lt;/td&gt;
&lt;td&gt;Filtra tráfico directamente en una interfaz, antes de ser procesado por el stack de red.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Soporte de ARP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Sí, puede filtrar tramas ARP.&lt;/td&gt;
&lt;td&gt;Sí, puede filtrar tramas ARP.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Soporte de IPv4/IPv6&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Sí, puede inspeccionar tráfico IP encapsulado.&lt;/td&gt;
&lt;td&gt;Sí, puede inspeccionar tráfico IP encapsulado.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Direcciones MAC&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Puede filtrar según direcciones MAC de origen y destino.&lt;/td&gt;
&lt;td&gt;Puede filtrar según direcciones MAC de origen y destino.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Uso con interfaces individuales&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No, requiere que las interfaces formen parte de un bridge.&lt;/td&gt;
&lt;td&gt;Sí, funciona en cualquier interfaz individual.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Reemplaza a...&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ebtables&lt;/code&gt;.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;tc ingress&lt;/code&gt; para ciertas tareas de filtrado.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Limitaciones&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;- Solo opera en tráfico dentro de bridges.&lt;br&gt;- No puede controlar tráfico de interfaces individuales fuera del bridge.&lt;/td&gt;
&lt;td&gt;- No tiene integración con &lt;code&gt;conntrack&lt;/code&gt;.&lt;br&gt;- No puede manejar tráfico reenviado entre interfaces.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h5 id="diferencias-clave-entre-bridge-y-netdev"&gt;&lt;strong&gt;Diferencias clave entre bridge y netdev:&lt;/strong&gt;&lt;/h5&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Ámbito del tráfico manejado:&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;bridge&lt;/code&gt;:&lt;/strong&gt; Filtra tráfico que cruza un bridge, conectando múltiples interfaces dentro del mismo dominio de difusión.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;netdev&lt;/code&gt;:&lt;/strong&gt; Filtra tráfico directo en una interfaz individual, antes de pasar al stack de red.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Dependencia de bridges:&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;bridge&lt;/code&gt;:&lt;/strong&gt; Solo funciona en interfaces que son parte de un bridge.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;netdev&lt;/code&gt;:&lt;/strong&gt; Funciona en cualquier interfaz, sin importar si es parte de un bridge o no.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Posición en el stack de red:&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;bridge&lt;/code&gt;:&lt;/strong&gt; Opera después de que el tráfico ha ingresado al bridge pero antes de ser reenviado a otra interfaz.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;netdev&lt;/code&gt;:&lt;/strong&gt; Opera antes de que el tráfico entre al stack de red del sistema operativo, en el &lt;strong&gt;hook &lt;code&gt;ingress&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Casos de uso:&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;bridge&lt;/code&gt;:&lt;/strong&gt; Aislar tráfico dentro del bridge, controlar VLANs, proteger contra ataques L2 como spoofing de MAC.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;netdev&lt;/code&gt;:&lt;/strong&gt; Inspeccionar todo el tráfico que entra o sale de una interfaz específica, ideal para mitigación temprana de DDoS o filtros basados en MAC/IP/ARP.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h5 id="cuando-usar-cada-una"&gt;&lt;strong&gt;¿Cuándo usar cada una?&lt;/strong&gt;&lt;/h5&gt;
&lt;h6 id="usa-la-familia-bridge-si"&gt;&lt;strong&gt;Usa la familia bridge si:&lt;/strong&gt;&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;Tenemos configurado un bridge que conecta múltiples interfaces.&lt;/li&gt;
&lt;li&gt;Necesitamos controlar tráfico entre dispositivos conectados al mismo bridge.&lt;/li&gt;
&lt;li&gt;Queremos aislar tráfico entre VLANs o puertos del bridge.&lt;/li&gt;
&lt;li&gt;Deseamos implementar políticas de seguridad para tráfico L2 dentro del bridge.&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="usa-la-familia-netdev-si"&gt;&lt;strong&gt;Usa la familia netdev si:&lt;/strong&gt;&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;Queremos filtrar tráfico directo en una interfaz individual, incluso si no es parte de un bridge.&lt;/li&gt;
&lt;li&gt;Necesitamos mitigar DDoS o ataques en el hook más temprano (&lt;code&gt;ingress&lt;/code&gt;), antes de que el tráfico llegue al stack de red.&lt;/li&gt;
&lt;li&gt;Deseamos inspeccionar tráfico ARP, IPv4 o IPv6 en una interfaz específica.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h4 id="ejemplos-practicos"&gt;&lt;strong&gt;Ejemplos prácticos:&lt;/strong&gt;&lt;/h4&gt;
&lt;h5 id="con-bridge"&gt;&lt;strong&gt;Con bridge:&lt;/strong&gt;&lt;/h5&gt;
&lt;ol&gt;
&lt;li&gt;Bloquear tráfico entre dos interfaces en un bridge:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;nft&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;table&lt;span class="w"&gt; &lt;/span&gt;bridge&lt;span class="w"&gt; &lt;/span&gt;filter
nft&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;chain&lt;span class="w"&gt; &lt;/span&gt;bridge&lt;span class="w"&gt; &lt;/span&gt;filter&lt;span class="w"&gt; &lt;/span&gt;forward&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;filter&lt;span class="w"&gt; &lt;/span&gt;hook&lt;span class="w"&gt; &lt;/span&gt;forward&lt;span class="w"&gt; &lt;/span&gt;priority&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
nft&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;rule&lt;span class="w"&gt; &lt;/span&gt;bridge&lt;span class="w"&gt; &lt;/span&gt;filter&lt;span class="w"&gt; &lt;/span&gt;forward&lt;span class="w"&gt; &lt;/span&gt;iif&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"eth0"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;oif&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"eth1"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;drop
nft&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;rule&lt;span class="w"&gt; &lt;/span&gt;bridge&lt;span class="w"&gt; &lt;/span&gt;filter&lt;span class="w"&gt; &lt;/span&gt;forward&lt;span class="w"&gt; &lt;/span&gt;iif&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"eth1"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;oif&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"eth0"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;drop
&lt;/pre&gt;&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Permitir solo tráfico ARP en el bridge:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;nft&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;rule&lt;span class="w"&gt; &lt;/span&gt;bridge&lt;span class="w"&gt; &lt;/span&gt;filter&lt;span class="w"&gt; &lt;/span&gt;forward&lt;span class="w"&gt; &lt;/span&gt;ether&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;arp&lt;span class="w"&gt; &lt;/span&gt;accept
nft&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;rule&lt;span class="w"&gt; &lt;/span&gt;bridge&lt;span class="w"&gt; &lt;/span&gt;filter&lt;span class="w"&gt; &lt;/span&gt;forward&lt;span class="w"&gt; &lt;/span&gt;drop
&lt;/pre&gt;&lt;/div&gt;

&lt;h5 id="con-netdev"&gt;&lt;strong&gt;Con netdev:&lt;/strong&gt;&lt;/h5&gt;
&lt;ol&gt;
&lt;li&gt;Bloquear todo el tráfico IPv4 en una interfaz específica (&lt;code&gt;eth0&lt;/code&gt;):&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;nft&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;table&lt;span class="w"&gt; &lt;/span&gt;netdev&lt;span class="w"&gt; &lt;/span&gt;filter
nft&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;chain&lt;span class="w"&gt; &lt;/span&gt;netdev&lt;span class="w"&gt; &lt;/span&gt;filter&lt;span class="w"&gt; &lt;/span&gt;ingress&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;filter&lt;span class="w"&gt; &lt;/span&gt;hook&lt;span class="w"&gt; &lt;/span&gt;ingress&lt;span class="w"&gt; &lt;/span&gt;priority&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
nft&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;rule&lt;span class="w"&gt; &lt;/span&gt;netdev&lt;span class="w"&gt; &lt;/span&gt;filter&lt;span class="w"&gt; &lt;/span&gt;ingress&lt;span class="w"&gt; &lt;/span&gt;iif&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"eth0"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ip&lt;span class="w"&gt; &lt;/span&gt;drop
&lt;/pre&gt;&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Mitigar ataques DDoS limitando paquetes por segundo:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;nft&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;rule&lt;span class="w"&gt; &lt;/span&gt;netdev&lt;span class="w"&gt; &lt;/span&gt;filter&lt;span class="w"&gt; &lt;/span&gt;ingress&lt;span class="w"&gt; &lt;/span&gt;iif&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"eth0"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ip&lt;span class="w"&gt; &lt;/span&gt;limit&lt;span class="w"&gt; &lt;/span&gt;rate&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1000&lt;/span&gt;/second&lt;span class="w"&gt; &lt;/span&gt;drop
&lt;/pre&gt;&lt;/div&gt;

&lt;h5 id="entonces"&gt;&lt;strong&gt;Entonces:&lt;/strong&gt;&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Familia &lt;code&gt;bridge&lt;/code&gt;:&lt;/strong&gt; Para manejar tráfico dentro de un bridge, enfocándose en L2 (direcciones MAC, VLANs, tramas Ethernet).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Familia &lt;code&gt;netdev&lt;/code&gt;:&lt;/strong&gt; Para filtrar tráfico temprano en una interfaz específica, independientemente de si forma parte de un bridge.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ambas familias trabajan en L2, pero con propósitos distintos y aplicables en diferentes escenarios.&lt;/p&gt;
&lt;h4 id="resumen"&gt;Resumen:&lt;/h4&gt;
&lt;p&gt;En &lt;code&gt;iptables&lt;/code&gt;, no existía el concepto de familias. En su lugar, se usaban herramientas separadas para cada protocolo o tipo de tráfico (&lt;code&gt;iptables&lt;/code&gt;, &lt;code&gt;ip6tables&lt;/code&gt;, &lt;code&gt;arptables&lt;/code&gt;, &lt;code&gt;ebtables&lt;/code&gt;). Esto hacía que la configuración fuera fragmentada y menos eficiente.&lt;/p&gt;
&lt;p&gt;Con la llegada de &lt;code&gt;nftables&lt;/code&gt;, se introdujo el concepto de familias para unificar la gestión de diferentes tipos de tráfico, mejorando la flexibilidad, la simplicidad y el mantenimiento de las reglas de firewall. Este cambio fue una de las razones clave por las que &lt;code&gt;nftables&lt;/code&gt; es considerado un reemplazo moderno y más avanzado.&lt;/p&gt;
&lt;p&gt;Conocer en profundidad nftables y el concepto de las familias, tiene implicancias sumamente prácticas. Por ejemplo: ¿qué familia usarías para poder separar en una misma LAN el tráfico inalámbrico del cableado? Lo dejo para que lo pienses. 😊&lt;/p&gt;
&lt;h3 id="fuentes-y-mas-informacion"&gt;Fuentes y más información&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://wiki.nftables.org/wiki-nftables/index.php/Main_Page"&gt;Documentación oficial de nftables&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://netfilter.org/"&gt;Sitio Oficial del proyecto netfilter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://netfilter.org/about.html#history"&gt;Historia del proyecto Netfilter&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><category>networking</category><category>seguridad</category><guid>https://sergiobelkin.com/posts/introduccion-a-nftables/</guid><pubDate>Wed, 22 Jan 2025 18:07:44 GMT</pubDate></item><item><title>¿SELinux? Nah, dejalo en Disabled</title><link>https://sergiobelkin.com/posts/selinux-nah-deshabilitalo/</link><dc:creator>sebelk</dc:creator><description>&lt;p&gt;En el mundo real muchos sysadmins y developers en sistemas operativos de la familia Red Hat deshabilitan &lt;strong&gt;SELinux&lt;/strong&gt;.
"¡Es muy difícil!" dicen. En Ubuntu ni en Debian existe esa cuestión ya que en su lugar se usa AppArmor.
Este post no te dará servido en bandeja como solucionar un problema, sino algo mucho más valioso, que es &lt;strong&gt;entender el fundamento del comportamiento de SELinux y por qué funciona la solución que vayas a aplicar&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Usamos un caso práctico: tenemos una instalación basada en Laravel, php-fpm y con nginx como web server. &lt;/p&gt;
&lt;div style="float: right; margin-left: 15px; width: 300px; max-width: 100%;"&gt;
&lt;a class="image-reference" href="https://sergiobelkin.com/images/SELINUX_ENABLED.webp"&gt;
&lt;img src="https://sergiobelkin.com/images/SELINUX_ENABLED.thumbnail.webp" alt="Entiendiendo SELinux"&gt;
&lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;Tenemos una estructura de directorio así:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;tree&lt;span class="w"&gt; &lt;/span&gt;-L&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/home/sergio/laravel-voyager/
/home/sergio/laravel-voyager/
├──&lt;span class="w"&gt; &lt;/span&gt;app
├──&lt;span class="w"&gt; &lt;/span&gt;artisan
├──&lt;span class="w"&gt; &lt;/span&gt;bootstrap
├──&lt;span class="w"&gt; &lt;/span&gt;composer.json
├──&lt;span class="w"&gt; &lt;/span&gt;composer.lock
├──&lt;span class="w"&gt; &lt;/span&gt;config
├──&lt;span class="w"&gt; &lt;/span&gt;database
├──&lt;span class="w"&gt; &lt;/span&gt;lang
├──&lt;span class="w"&gt; &lt;/span&gt;package.json
├──&lt;span class="w"&gt; &lt;/span&gt;phpunit.xml
├──&lt;span class="w"&gt; &lt;/span&gt;public
├──&lt;span class="w"&gt; &lt;/span&gt;README.md
├──&lt;span class="w"&gt; &lt;/span&gt;resources
├──&lt;span class="w"&gt; &lt;/span&gt;routes
├──&lt;span class="w"&gt; &lt;/span&gt;storage
├──&lt;span class="w"&gt; &lt;/span&gt;tests
├──&lt;span class="w"&gt; &lt;/span&gt;vendor
└──&lt;span class="w"&gt; &lt;/span&gt;vite.config.js

&lt;span class="m"&gt;11&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;directories,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;7&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;files
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Veamos la información de SELinux para algunos archivos y directorios:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="o"&gt;[&lt;/span&gt;sergio@masterk&lt;span class="w"&gt; &lt;/span&gt;laravel-voyager&lt;span class="o"&gt;]&lt;/span&gt;$&lt;span class="w"&gt; &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;ls&lt;span class="w"&gt; &lt;/span&gt;-Zd&lt;span class="w"&gt; &lt;/span&gt;public/storage&lt;span class="w"&gt; &lt;/span&gt;/etc/nginx&lt;span class="w"&gt; &lt;/span&gt;/home/sergio/.bashrc&lt;span class="w"&gt; &lt;/span&gt;/root/.bashrc&lt;span class="w"&gt; &lt;/span&gt;/usr/share/nginx/&lt;span class="w"&gt; &lt;/span&gt;bootstrap/cache/
&lt;span class="o"&gt;[&lt;/span&gt;sudo&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;password&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sergio:&lt;span class="w"&gt; &lt;/span&gt;
unconfined_u:object_r:user_home_t:s0&lt;span class="w"&gt; &lt;/span&gt;bootstrap/cache/&lt;span class="w"&gt;      &lt;/span&gt;unconfined_u:object_r:user_home_t:s0&lt;span class="w"&gt; &lt;/span&gt;public/storage
&lt;span class="w"&gt; &lt;/span&gt;system_u:object_r:httpd_config_t:s0&lt;span class="w"&gt; &lt;/span&gt;/etc/nginx&lt;span class="w"&gt;               &lt;/span&gt;system_u:object_r:admin_home_t:s0&lt;span class="w"&gt; &lt;/span&gt;/root/.bashrc
&lt;span class="w"&gt;    &lt;/span&gt;system_u:object_r:user_home_t:s0&lt;span class="w"&gt; &lt;/span&gt;/home/sergio/.bashrc&lt;span class="w"&gt;            &lt;/span&gt;system_u:object_r:usr_t:s0&lt;span class="w"&gt; &lt;/span&gt;/usr/share/nginx/
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Si bien la salida es demasiado críptica, la podemos descifrar:&lt;/p&gt;
&lt;style&gt;
  table {
  }
  th, td {
    padding: 10px;
    text-align: left;
  }
&lt;/style&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Archivo/Directorio&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Usuario (SELinux)&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Rol (SELinux)&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Asignación basada en tipos (SELinux)&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Rango (SELinux)&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Descripción y Observaciones&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;bootstrap/cache/&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;unconfined_u&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;object_r&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;user_home_t&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;s0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Considerado como parte del directorio personal de un usuario. &lt;strong&gt;Debe ser &lt;code&gt;httpd_sys_rw_content_t&lt;/code&gt;&lt;/strong&gt; para Laravel.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;public/storage&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;unconfined_u&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;object_r&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;user_home_t&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;s0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Similar a &lt;code&gt;bootstrap/cache&lt;/code&gt;. &lt;strong&gt;Debe ser &lt;code&gt;httpd_sys_content_t&lt;/code&gt;&lt;/strong&gt; para que Laravel sirva archivos estáticos.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;/etc/nginx&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;system_u&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;object_r&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;httpd_config_t&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;s0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Archivo de configuración de Nginx. Correctamente etiquetado como &lt;code&gt;httpd_config_t&lt;/code&gt;. No requiere cambios.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;/home/sergio/.bashrc&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;system_u&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;object_r&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;user_home_t&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;s0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Archivo personal de configuración de un usuario. Etiquetado como &lt;code&gt;user_home_t&lt;/code&gt;, lo cual es correcto.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;/root/.bashrc&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;system_u&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;object_r&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;admin_home_t&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;s0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Archivo de configuración del usuario &lt;code&gt;root&lt;/code&gt;. Etiquetado como &lt;code&gt;admin_home_t&lt;/code&gt;, lo cual es correcto.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;/usr/share/nginx/&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;system_u&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;object_r&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;usr_t&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;s0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Etiquetado como &lt;code&gt;usr_t&lt;/code&gt;, que es genérico. &lt;strong&gt;Debe ser &lt;code&gt;httpd_sys_content_t&lt;/code&gt;&lt;/strong&gt; si Nginx sirve contenido estático aquí.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id="descripcion-de-los-campos"&gt;Descripción de los campos&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Concepto&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Descripción&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Ejemplo&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Usuario (SELinux)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Define el usuario de SELinux asociado al recurso.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;system_u&lt;/code&gt;: Archivo gestionado por el sistema. &lt;br&gt; &lt;code&gt;unconfined_u&lt;/code&gt;: Archivo de un usuario sin restricciones.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Rol (SELinux)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Define el rol asignado al recurso.&lt;/td&gt;
&lt;td&gt;Usualmente es &lt;code&gt;object_r&lt;/code&gt; para archivos regulares y directorios.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Asignación basada en tipos&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Determina qué procesos o aplicaciones pueden interactuar con un recurso.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;httpd_sys_rw_content_t&lt;/code&gt;: Permite lectura/escritura por parte del servidor web. &lt;br&gt; &lt;code&gt;httpd_sys_content_t&lt;/code&gt;: Permite solo lectura por parte del servidor web. &lt;br&gt; &lt;code&gt;user_home_t&lt;/code&gt;: Para directorios o archivos en &lt;code&gt;/home&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Rango (SELinux)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Se usa para configuraciones de seguridad MLS o TE (usualmente &lt;code&gt;s0&lt;/code&gt; en configuraciones estándar).&lt;/td&gt;
&lt;td&gt;Normalmente no requiere ajustes en configuraciones básicas.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Ahora bien, hay varios tipos de políticas en cuanto a funcionalidades que se pueden aplicar en SELinux, la que se usa en general es &lt;em&gt;targeted&lt;/em&gt;. El tipo de política targeted significa que determinados servicios se ejecutan de manera confinada, es decir limitada para realizar solamente determinadas acciones más allá de los permisos ordinarios.&lt;/p&gt;
&lt;p&gt;Y es importante enfatizar que cuando usamos &lt;em&gt;targeted&lt;/em&gt; el campo que más nos tiene que interesar de un contexto es el "Type Enforcement". En general no prestaremos demasiada atención al resto de los campos.&lt;/p&gt;
&lt;p&gt;Lo más importante para entender es que las reglas de SELinux tienen &lt;strong&gt;sujetos&lt;/strong&gt; y &lt;strong&gt;objetos&lt;/strong&gt;. El contexto o etiqueta del objeto  podría no permitir que el sujeto realice una determinada acción al sujeto, y es allí cuando se produce un error. Dicho error tiene por objetivo proteger al sistema.
En este ejemplo los sujetos son nginx y php-fpm y los objetos son los directorios &lt;code&gt;bootstrap/cache&lt;/code&gt; y &lt;code&gt;public/storage&lt;/code&gt; (y sus respectivos contenidos).&lt;/p&gt;
&lt;p&gt;Por ejemplo, nginx sería el sujeto y con el siguiente comando vemos el contexto del proceso:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;ps&lt;span class="w"&gt; &lt;/span&gt;-C&lt;span class="w"&gt; &lt;/span&gt;nginx,php-fpm&lt;span class="w"&gt; &lt;/span&gt;-Z
LABEL&lt;span class="w"&gt;                               &lt;/span&gt;PID&lt;span class="w"&gt; &lt;/span&gt;TTY&lt;span class="w"&gt;          &lt;/span&gt;TIME&lt;span class="w"&gt; &lt;/span&gt;CMD
system_u:system_r:httpd_t:s0&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="m"&gt;898&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;?&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;:00:00&lt;span class="w"&gt; &lt;/span&gt;php-fpm
system_u:system_r:httpd_t:s0&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="m"&gt;1118&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;?&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;:00:00&lt;span class="w"&gt; &lt;/span&gt;php-fpm
system_u:system_r:httpd_t:s0&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="m"&gt;1119&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;?&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;:00:00&lt;span class="w"&gt; &lt;/span&gt;php-fpm
system_u:system_r:httpd_t:s0&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="m"&gt;1120&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;?&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;:00:00&lt;span class="w"&gt; &lt;/span&gt;php-fpm
system_u:system_r:httpd_t:s0&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="m"&gt;1121&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;?&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;:00:00&lt;span class="w"&gt; &lt;/span&gt;php-fpm
system_u:system_r:httpd_t:s0&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="m"&gt;1122&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;?&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;:00:00&lt;span class="w"&gt; &lt;/span&gt;php-fpm
system_u:system_r:httpd_t:s0&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="m"&gt;1451&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;?&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;:00:00&lt;span class="w"&gt; &lt;/span&gt;nginx
system_u:system_r:httpd_t:s0&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="m"&gt;1452&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;?&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;:00:00&lt;span class="w"&gt; &lt;/span&gt;nginx
system_u:system_r:httpd_t:s0&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="m"&gt;1453&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;?&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;:00:00&lt;span class="w"&gt; &lt;/span&gt;nginx
&lt;/pre&gt;&lt;/div&gt;

&lt;h4 id="pero-habra-problemas"&gt;Pero habrá problemas...&lt;/h4&gt;
&lt;p&gt;La cuestión es que tanto nginx como php-fpm se ejecutan con la asignación de tipo (TE) httpd_t y la TE que tienen directorior como bootstrap/cache y public/storage es user_home_t.&lt;/p&gt;
&lt;p&gt;Con el siguiente comando podemos verificar qué cosas puede hacer el dominio &lt;code&gt;httpd_t&lt;/code&gt; en el contexto del objeto que tiene el tipo de asignación &lt;code&gt;user_home_t&lt;/code&gt;:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;sesearch&lt;span class="w"&gt; &lt;/span&gt;-s&lt;span class="w"&gt; &lt;/span&gt;httpd_t&lt;span class="w"&gt; &lt;/span&gt;-A&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;user_home_t
allow&lt;span class="w"&gt; &lt;/span&gt;daemon&lt;span class="w"&gt; &lt;/span&gt;user_home_t:file&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;append&lt;span class="w"&gt; &lt;/span&gt;getattr&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
allow&lt;span class="w"&gt; &lt;/span&gt;domain&lt;span class="w"&gt; &lt;/span&gt;file_type:blk_file&lt;span class="w"&gt; &lt;/span&gt;map&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;domain_can_mmap_files&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;:True
allow&lt;span class="w"&gt; &lt;/span&gt;domain&lt;span class="w"&gt; &lt;/span&gt;file_type:chr_file&lt;span class="w"&gt; &lt;/span&gt;map&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;domain_can_mmap_files&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;:True
allow&lt;span class="w"&gt; &lt;/span&gt;domain&lt;span class="w"&gt; &lt;/span&gt;file_type:file&lt;span class="w"&gt; &lt;/span&gt;map&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;domain_can_mmap_files&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;:True
allow&lt;span class="w"&gt; &lt;/span&gt;domain&lt;span class="w"&gt; &lt;/span&gt;file_type:lnk_file&lt;span class="w"&gt; &lt;/span&gt;map&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;domain_can_mmap_files&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;:True
allow&lt;span class="w"&gt; &lt;/span&gt;httpd_t&lt;span class="w"&gt; &lt;/span&gt;file_type:dir&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;getattr&lt;span class="w"&gt; &lt;/span&gt;open&lt;span class="w"&gt; &lt;/span&gt;search&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
allow&lt;span class="w"&gt; &lt;/span&gt;httpd_t&lt;span class="w"&gt; &lt;/span&gt;file_type:filesystem&lt;span class="w"&gt; &lt;/span&gt;getattr&lt;span class="p"&gt;;&lt;/span&gt;
allow&lt;span class="w"&gt; &lt;/span&gt;httpd_t&lt;span class="w"&gt; &lt;/span&gt;user_home_t:file&lt;span class="w"&gt; &lt;/span&gt;map&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;httpd_read_user_content&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;:True
allow&lt;span class="w"&gt; &lt;/span&gt;httpd_t&lt;span class="w"&gt; &lt;/span&gt;user_home_type:dir&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;getattr&lt;span class="w"&gt; &lt;/span&gt;ioctl&lt;span class="w"&gt; &lt;/span&gt;lock&lt;span class="w"&gt; &lt;/span&gt;open&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;read&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;search&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;httpd_read_user_content&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;:True
allow&lt;span class="w"&gt; &lt;/span&gt;httpd_t&lt;span class="w"&gt; &lt;/span&gt;user_home_type:dir&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;getattr&lt;span class="w"&gt; &lt;/span&gt;open&lt;span class="w"&gt; &lt;/span&gt;search&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;httpd_enable_homedirs&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;:True
allow&lt;span class="w"&gt; &lt;/span&gt;httpd_t&lt;span class="w"&gt; &lt;/span&gt;user_home_type:dir&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;getattr&lt;span class="w"&gt; &lt;/span&gt;open&lt;span class="w"&gt; &lt;/span&gt;search&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;httpd_read_user_content&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;:True
allow&lt;span class="w"&gt; &lt;/span&gt;httpd_t&lt;span class="w"&gt; &lt;/span&gt;user_home_type:dir&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;getattr&lt;span class="w"&gt; &lt;/span&gt;open&lt;span class="w"&gt; &lt;/span&gt;search&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;httpd_read_user_content&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;:True
allow&lt;span class="w"&gt; &lt;/span&gt;httpd_t&lt;span class="w"&gt; &lt;/span&gt;user_home_type:file&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;getattr&lt;span class="w"&gt; &lt;/span&gt;ioctl&lt;span class="w"&gt; &lt;/span&gt;lock&lt;span class="w"&gt; &lt;/span&gt;open&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;read&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;httpd_read_user_content&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;:True
allow&lt;span class="w"&gt; &lt;/span&gt;httpd_t&lt;span class="w"&gt; &lt;/span&gt;user_home_type:lnk_file&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;getattr&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;read&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;httpd_enable_homedirs&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;:True
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Cada regla tiene:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;El tipo de regla ( &lt;em&gt;allow&lt;/em&gt; )&lt;/li&gt;
&lt;li&gt;El sujeto de la regla ( &lt;em&gt;httpd_t&lt;/em&gt; )&lt;/li&gt;
&lt;li&gt;El contexto y tipo del objeto ( &lt;em&gt;user_home_t:file&lt;/em&gt; )&lt;/li&gt;
&lt;li&gt;Los permisos (&lt;em&gt;append&lt;/em&gt; y &lt;em&gt;getattr&lt;/em&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;¡No hay ninguna regla que permita la modificación total del contenido del archivo ni la creación de archivos en la carpeta (por ejemplo, el permiso &lt;em&gt;write&lt;/em&gt;)!&lt;/strong&gt;. Esto significa que, de manera predeterminada, servicios como apache o nginx no tienen permiso para escribir en los directorios &lt;em&gt;home&lt;/em&gt;  de los usuarios. Y por ese motivo hay cosas que fallarán, sin importar los permisos ni el usuario...&lt;/p&gt;
&lt;p&gt;Por lo tanto los directorios &lt;code&gt;public/storage&lt;/code&gt; y &lt;code&gt;bootstrap/cache&lt;/code&gt; y su contenido necesitan otro contexto para que Laravel funcione correctamente cuando está ubicado en un subdirectorio de /home. Mirando la documentación podemos ver que &lt;em&gt;httpd_sys_content_t&lt;/em&gt;  y &lt;em&gt;httpd_sys_rw_content&lt;/em&gt; son respectivamente los apropiados para esos directorios y su contenido:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="n"&gt;httpd_sys_content_t&lt;/span&gt;

&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;with&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;httpd_sys_content_t&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;you&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;want&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;treat&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;httpd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;

&lt;span class="n"&gt;Paths&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;srv&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="o"&gt;^/&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;*/&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;htdig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;srv&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;gallery2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;trac&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;htdig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;icons&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;share&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;glpi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;share&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;htdig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;share&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;drupal&lt;/span&gt;&lt;span class="o"&gt;.*&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;share&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;svn&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;conf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;share&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;icecast&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cacti&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;rra&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;share&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ntop&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;share&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;nginx&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;share&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ghc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;share&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;openca&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;htdocs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;share&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;selinux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;pol&lt;/span&gt;&lt;span class="err"&gt;‐&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="n"&gt;icy&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;^/&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;*/&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;y&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="n"&gt;httpd_sys_rw_content_t&lt;/span&gt;

&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;with&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;httpd_sys_rw_content_t&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;you&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;want&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;treat&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;httpd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;

&lt;span class="n"&gt;Paths&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;glpi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;horde&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;drupal&lt;/span&gt;&lt;span class="o"&gt;.*&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;svn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;svn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;owncloud&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;uploads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;wp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;wp_back&lt;/span&gt;&lt;span class="err"&gt;‐&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="n"&gt;ups&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;sites&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;sites&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;php&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mock&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;koji&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;nextcloud&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;drupal&lt;/span&gt;&lt;span class="o"&gt;.*&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;zabbix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;web&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;moodle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;log&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;spool&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;gosa&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;WebCalendar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;share&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;joomla&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;dokuwiki&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;owncloud&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;spool&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;viewvc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;nextcloud&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;pootle&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;po&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;phpMyAdmin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;moodledata&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;srv&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;gallery2&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smarty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;moodle&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;graphite&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;web&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;log&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;shibboleth&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;gallery&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;albums&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;owncloud&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;nextcloud&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;share&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;wordpress&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;mu&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;wp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;share&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;wordpress&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;wp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;upgrade&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;share&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;wordpress&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;wp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;uploads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/.*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="err"&gt;‐&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="n"&gt;uration&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;php&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;De modo que esos son los contextos que tendrías que aplicar a esos directorios y sus contenidos. El resto, si sos administrador o desarrollador de Linux con algo de experiencia es anecdótico.&lt;/p&gt;
&lt;h3 id="fuentes-y-mas-recursos"&gt;Fuentes y más recursos&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Página del manual de &lt;strong&gt;httpd_selinux&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.redhat.com/es/documentation/red_hat_enterprise_linux/8/html/using_selinux/benefits-of-selinux_getting-started-with-selinux#benefits-of-selinux_getting-started-with-selinux"&gt;Ventajas de usar SELinux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.redhat.com/es/documentation/red_hat_enterprise_linux/8/html/using_selinux/enabling_and_disabling_selinux-disabling_selinux_changing-selinux-states-and-modes#Enabling_and_Disabling_SELinux-Disabling_SELinux_changing-selinux-states-and-modes"&gt;Desactivación de SELinux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Página del manual de &lt;strong&gt;booleans&lt;/strong&gt; (concepto importante que complementan a las reglas de las políticas de SELinux)&lt;/li&gt;
&lt;/ul&gt;</description><category>seguridad</category><guid>https://sergiobelkin.com/posts/selinux-nah-deshabilitalo/</guid><pubDate>Mon, 25 Nov 2024 00:15:35 GMT</pubDate></item><item><title>¿Qué es flatpak?</title><link>https://sergiobelkin.com/posts/que-es-flatpak/</link><dc:creator>sebelk</dc:creator><description>&lt;p&gt;Es conveniente y merecido que &lt;strong&gt;Flatpak&lt;/strong&gt; tenga un post especialmente dedicado a él, más allá de su interacción con polkit que dejamos planteado en el &lt;a href="https://sergiobelkin.com/posts/entendiendo-polkit/"&gt;post anterior&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;&lt;a class="image-reference" href="https://sergiobelkin.com/posts/que-es-flatpak/images/flatpak-spirit.webp"&gt;&lt;img src="https://sergiobelkin.com/images/flatpak-spirit.thumbnail.webp" alt="Flatpak"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;h2 id="brevisimo-repaso-historico"&gt;Brevísimo repaso histórico&lt;/h2&gt;
&lt;p&gt;En agosto de &lt;strong&gt;2007&lt;/strong&gt; el desarrollador sueco &lt;strong&gt;Alexander Larsson&lt;/strong&gt; lanza su primer intento de empaquetar aplicaciones con todas sus dependencias. A fines de &lt;strong&gt;2014&lt;/strong&gt; comienza a trabajar en el proyecto &lt;strong&gt;xdg-app&lt;/strong&gt;, el cual cambia de nombre a &lt;strong&gt;Flatpak&lt;/strong&gt; en 2016.&lt;/p&gt;
&lt;h3 id="que-es-flatpak"&gt;¿Qué es Flatpak?&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Flatpak&lt;/strong&gt; es un sistema para compilar, distribuir y ejecutar aplicaciones. Las aplicaciones se pueden compilar y distribuir independientemente del sistema en que se usan, y al ejecutarse están aisladas del mismo hasta cierto punto.&lt;/p&gt;
&lt;p&gt;Cada aplicación está en un sandbox, de manera predeterminada solamente puede acceder al contenido del mismo. Cada programa en flatpak tiene acceso a &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;~/.var/app/$FLATPAK_ID&lt;/code&gt;, y &lt;code&gt;$XDG_RUNTIME_DIR/app/$FLATPAK_ID&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;De manera limitada a llamadas del sistema.&lt;/li&gt;
&lt;li&gt;De manera limitada a la instancia de &lt;strong&gt;D-BUS&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Aun así, para ser realistas, las aplicaciones en general necesitan más permisos, en este caso se insta a los empaquetadores a que adviertan qué accesos necesitará la aplicación para que el usuario esté conciente de ello, tal como cuando se instala una app desde el Play Store de Android.&lt;/p&gt;
&lt;p&gt;&lt;a class="image-reference" href="https://sergiobelkin.com/images/flatseal.png"&gt;&lt;img src="https://sergiobelkin.com/images/flatseal.thumbnail.png" alt="Flatseal mostrando los permisos que usa cada una de las aplicaciones instaladas" title="Hacer clic para agrandar"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Flatpak ofrece un repositorio llamado &lt;a href="https://flathub.org/"&gt;Flathub&lt;/a&gt;. Nada impide que cualquier persona o proyecto (como es el caso de Fedora) tenga el suyo propio.&lt;/p&gt;
&lt;p&gt;Flatpak usa &lt;strong&gt;OSTree&lt;/strong&gt; (&lt;em&gt;Fedora usa OCI&lt;/em&gt;) para distribuir y desplegar datos. OSTree es similar a &lt;em&gt;Git&lt;/em&gt; pero está diseñado para hacer control de versiones de binarios y archivos grandes de datos. El uso de OSTree permite además que un mismo archivo sea usado por más de una misma aplicación, ahorrando de esta manera espacio en disco. Cada aplicación que se instala es almacenada en un repositorio local de control de versiones, y luego se mapea en el sistema de archivos local.&lt;/p&gt;
&lt;p&gt;Los cambios entre las diferentes versiones de una aplicación se aplican en el filesystem mediante enlaces duros.&lt;/p&gt;
&lt;p&gt;Por ejemplo, con el comando siguiente podemos ver log del último commit de una aplicación flatpak (Logseq):
.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;❯&lt;span class="w"&gt; &lt;/span&gt;ostree&lt;span class="w"&gt; &lt;/span&gt;log&lt;span class="w"&gt; &lt;/span&gt;--repo&lt;span class="o"&gt;=&lt;/span&gt;/var/lib/flatpak/repo&lt;span class="w"&gt;  &lt;/span&gt;deploy/app/com.logseq.Logseq/x86_64/stable
commit&lt;span class="w"&gt; &lt;/span&gt;a54ee70b0ec9047c2083f77b9f9175e8e8edcac998e3be8d395009255a6a03f6
Parent:&lt;span class="w"&gt;  &lt;/span&gt;8c36feebe7ea23654917f542eb5419b71426359a42165f53496c9d82049a6806
ContentChecksum:&lt;span class="w"&gt;  &lt;/span&gt;4d06f4e875d0335f2ff1c7a30ffa5b200c9a3eb3aeb0b608588eadb045994b22
Date:&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;2024&lt;/span&gt;-06-09&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;07&lt;/span&gt;:22:27&lt;span class="w"&gt; &lt;/span&gt;+0000

&lt;span class="w"&gt;    &lt;/span&gt;Remove&lt;span class="w"&gt; &lt;/span&gt;screenshot&lt;span class="w"&gt; &lt;/span&gt;locale&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;8a160109&lt;span class="o"&gt;)&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;Name:&lt;span class="w"&gt; &lt;/span&gt;com.logseq.Logseq
&lt;span class="w"&gt;    &lt;/span&gt;Arch:&lt;span class="w"&gt; &lt;/span&gt;x86_64
&lt;span class="w"&gt;    &lt;/span&gt;Branch:&lt;span class="w"&gt; &lt;/span&gt;stable
&lt;span class="w"&gt;    &lt;/span&gt;Built&lt;span class="w"&gt; &lt;/span&gt;with:&lt;span class="w"&gt; &lt;/span&gt;Flatpak&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.14.8

&amp;lt;&amp;lt;&lt;span class="w"&gt; &lt;/span&gt;History&lt;span class="w"&gt; &lt;/span&gt;beyond&lt;span class="w"&gt; &lt;/span&gt;this&lt;span class="w"&gt; &lt;/span&gt;commit&lt;span class="w"&gt; &lt;/span&gt;not&lt;span class="w"&gt; &lt;/span&gt;fetched&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;En realidad el comando mostrado es de bajo nivel solamente a los efectos de mostrar ostree como software subyacente, para obtener información a más alto nivel, es conveniente usar directamente el comando &lt;strong&gt;flatpak&lt;/strong&gt; para obtener información de la aplicación:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;flatpak&lt;span class="w"&gt; &lt;/span&gt;info&lt;span class="w"&gt; &lt;/span&gt;com.logseq.Logseq&lt;span class="w"&gt; &lt;/span&gt;

Logseq&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Connect&lt;span class="w"&gt; &lt;/span&gt;your&lt;span class="w"&gt; &lt;/span&gt;notes&lt;span class="w"&gt; &lt;/span&gt;and&lt;span class="w"&gt; &lt;/span&gt;knowledge

&lt;span class="w"&gt;                 &lt;/span&gt;ID:&lt;span class="w"&gt; &lt;/span&gt;com.logseq.Logseq
&lt;span class="w"&gt;         &lt;/span&gt;Referencia:&lt;span class="w"&gt; &lt;/span&gt;app/com.logseq.Logseq/x86_64/stable
&lt;span class="w"&gt;       &lt;/span&gt;Arquitectura:&lt;span class="w"&gt; &lt;/span&gt;x86_64
&lt;span class="w"&gt;               &lt;/span&gt;Rama:&lt;span class="w"&gt; &lt;/span&gt;stable
&lt;span class="w"&gt;            &lt;/span&gt;Versión:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.10.9
&lt;span class="w"&gt;           &lt;/span&gt;Licencia:&lt;span class="w"&gt; &lt;/span&gt;AGPL-3.0-or-later
&lt;span class="w"&gt;             &lt;/span&gt;Origen:&lt;span class="w"&gt; &lt;/span&gt;flathub
&lt;span class="w"&gt;          &lt;/span&gt;Colección:&lt;span class="w"&gt; &lt;/span&gt;org.flathub.Stable
&lt;span class="w"&gt;        &lt;/span&gt;Instalación:&lt;span class="w"&gt; &lt;/span&gt;system
&lt;span class="w"&gt;          &lt;/span&gt;Instalada:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;437&lt;/span&gt;,7&lt;span class="w"&gt; &lt;/span&gt;MB
Tiempo&lt;span class="w"&gt; &lt;/span&gt;de&lt;span class="w"&gt; &lt;/span&gt;ejecución:&lt;span class="w"&gt; &lt;/span&gt;org.freedesktop.Platform/x86_64/23.08
&lt;span class="w"&gt;                &lt;/span&gt;Sdk:&lt;span class="w"&gt; &lt;/span&gt;org.freedesktop.Sdk/x86_64/23.08

&lt;span class="w"&gt;             &lt;/span&gt;Commit:&lt;span class="w"&gt; &lt;/span&gt;a54ee70b0ec9047c2083f77b9f9175e8e8edcac998e3be8d395009255a6a03f6
&lt;span class="w"&gt;              &lt;/span&gt;Padre:&lt;span class="w"&gt; &lt;/span&gt;8c36feebe7ea23654917f542eb5419b71426359a42165f53496c9d82049a6806
&lt;span class="w"&gt;             &lt;/span&gt;Asunto:&lt;span class="w"&gt; &lt;/span&gt;Remove&lt;span class="w"&gt; &lt;/span&gt;screenshot&lt;span class="w"&gt; &lt;/span&gt;locale&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;8a160109&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;              &lt;/span&gt;Fecha:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2024&lt;/span&gt;-06-09&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;07&lt;/span&gt;:22:27&lt;span class="w"&gt; &lt;/span&gt;+0000
&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id="comparacion-entre-dnf-apt-y-flatpak"&gt;Comparación entre dnf, apt y flatpak&lt;/h3&gt;
&lt;p&gt;Flatpak está pensado para todo tipo de aplicaciones de escritorio y se esfuerza por ser tan neutral como sea posible en cuanto a los métodos que usa para compilar aplicaciones.&lt;/p&gt;
&lt;p&gt;Además, flatpak proporciona actualizaciones atómicas, rollback y consistencia post-instalación.&lt;/p&gt;
&lt;p&gt;El siguiente cuadro nos ayuda a ver las diferencias con los dos gestores populares de paquetes: &lt;em&gt;dnf&lt;/em&gt; y &lt;em&gt;apt&lt;/em&gt;.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Característica&lt;/th&gt;
&lt;th&gt;DNF&lt;/th&gt;
&lt;th&gt;APT&lt;/th&gt;
&lt;th&gt;Flatpak&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Distribución Principal&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Fedora, RHEL, CentOS&lt;/td&gt;
&lt;td&gt;Debian, Ubuntu&lt;/td&gt;
&lt;td&gt;Varias distribuciones de Linux&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Formato de Paquete&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;RPM&lt;/td&gt;
&lt;td&gt;DEB&lt;/td&gt;
&lt;td&gt;OSTree, Flatpak Bundle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Gestión de Dependencias&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Manejo automático de dependencias&lt;/td&gt;
&lt;td&gt;Manejo automático de dependencias&lt;/td&gt;
&lt;td&gt;Manejo dentro del sandbox&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Aislamiento&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Sí, aplicaciones ejecutadas en sandbox&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Instalación de Aplicaciones&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Desde repositorios específicos del sistema&lt;/td&gt;
&lt;td&gt;Desde repositorios específicos del sistema&lt;/td&gt;
&lt;td&gt;Desde repositorios centralizados (Flathub) y repositorios personalizados&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Actualizaciones&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;dnf update&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;apt update &amp;amp;&amp;amp; apt upgrade&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;flatpak update&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Permisos de Instalación&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Requiere permisos de root&lt;/td&gt;
&lt;td&gt;Requiere permisos de root&lt;/td&gt;
&lt;td&gt;Puede instalarse sin permisos de root&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Compatibilidad entre Distros&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Limitada a sistemas basados en RPM&lt;/td&gt;
&lt;td&gt;Limitada a sistemas basados en DEB&lt;/td&gt;
&lt;td&gt;Compatible con múltiples distribuciones&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Seguridad&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Depende de la configuración del sistema&lt;/td&gt;
&lt;td&gt;Depende de la configuración del sistema&lt;/td&gt;
&lt;td&gt;Sandboxing y permisos controlados por portales&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Facilidad de Uso&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Interfaz de línea de comandos&lt;/td&gt;
&lt;td&gt;Interfaz de línea de comandos&lt;/td&gt;
&lt;td&gt;Interfaz de línea de comandos y GUI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Espacio de Disco&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Compartido entre aplicaciones&lt;/td&gt;
&lt;td&gt;Compartido entre aplicaciones&lt;/td&gt;
&lt;td&gt;Deduplicación y compartición de runtimes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Formato de Archivo Individual&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No aplica&lt;/td&gt;
&lt;td&gt;No aplica&lt;/td&gt;
&lt;td&gt;Flatpak Bundle (&lt;code&gt;.flatpak&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Desventajas&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Depende de la política de la distro&lt;/td&gt;
&lt;td&gt;Dependencia de la política de la distro&lt;/td&gt;
&lt;td&gt;Las aplicaciones pueden tener un mayor tamaño inicial&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Compatibilidad con Aplicaciones Antiguas&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Sí, con soporte de versiones específicas&lt;/td&gt;
&lt;td&gt;Sí, con soporte de versiones específicas&lt;/td&gt;
&lt;td&gt;Generalmente más adecuado para nuevas aplicaciones&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Desarrollo y Mantenimiento&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Desarrollado por el proyecto Fedora&lt;/td&gt;
&lt;td&gt;Desarrollado por el proyecto Debian&lt;/td&gt;
&lt;td&gt;Desarrollado por el proyecto Flatpak, con apoyo de Red Hat y GNOME&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Adopción&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Usado por muchas distribuciones y entornos de escritorio&lt;/td&gt;
&lt;td&gt;Usado principalmente en Debian, Ubuntu y derivadas&lt;/td&gt;
&lt;td&gt;Usado en diversas distribuciones, especialmente para aplicaciones portátiles&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ejemplo de Comando de Instalación&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;dnf install gedit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;apt install gedit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;flatpak install flathub org.gnome.Gedit&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;br&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="inconvenientes-para-usuarios-y-desarrolladores-de-aplicaciones-linux"&gt;Inconvenientes para usuarios y desarrolladores de aplicaciones Linux&lt;/h3&gt;
&lt;p&gt;Si bien Linux mejoró significativamente en cuando a usabilidad y experiencia de usuario en los últimos años, hay obstáculos tanto para usuarios como para desarrolladores:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Una aplicación para un entorno de escritorio en Linux se debe empaquetar para que esté disponible (como Debian, Fedora, Ubuntu, Arch Linux, etc.), y asegurarse de que cumpla con los requisitos específicos de cada sistema de paquetes (deb, rpm, etc.). Esto requiere un esfuerzo considerable para mantener múltiples versiones y asegurarse de que cada paquete funcione correctamente en su respectiva distribución. Todo esto &lt;strong&gt;demanda o más tiempo o bien más gente idónea dedicada en la tarea de crear y mantener paquetes&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Si un usuario quiere usar aplicación que no está empaquetada en la distribución, tendrá que realizar &lt;strong&gt;algún paso extra&lt;/strong&gt;, que van desde operaciones relativamente sencillas como bajar un ejecutable (darle permisos, ubicarlo en un directorio del PATH, etc.), hasta &lt;strong&gt;procedimientos bastante más complejos y fuera del interés y conocimiento de un usuario final como puede ser compilar el programa&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Una distribución de soporte a largo plazo como &lt;em&gt;Debian Stable&lt;/em&gt; no posee versiones actualizadas de la mayoría de las aplicaciones. Por lo tanto un usuario tiene que &lt;strong&gt;elegir estabilidad a cambio de software un tanto anticuado&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Flatpak tiene como propósito justamente eliminar esas barreras&lt;/strong&gt;. Gracias a Flatpak un usuario podrá instalar una aplicación como &lt;a href="https://logseq.com/"&gt;Logseq&lt;/a&gt; aun cuando no esté incluida en los repositorios de su distribución, o instalar una versión reciente de &lt;em&gt;&lt;a href="https://kdenlive.org/en/"&gt;Kdenlive&lt;/a&gt;&lt;/em&gt; en Debian Stable.&lt;/p&gt;
&lt;p&gt;En la actualidad existen distribuciones con la mirada puesta en la innovación que se benefician de Flatpak, por ejemplo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://vanillaos.org/"&gt;Vanilla OS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fedoraproject.org/atomic-desktops/"&gt;Fedora Atomic desktops&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.endlessos.org/os"&gt;Endless OS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="caracteristicas-de-flatpak"&gt;Características de flatpak&lt;/h3&gt;
&lt;p&gt;Analicemos &lt;strong&gt;la app ONLYOFFICE&lt;/strong&gt; en flatpak:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;flatpak&lt;span class="w"&gt; &lt;/span&gt;info&lt;span class="w"&gt; &lt;/span&gt;org.onlyoffice.desktopeditors

ONLYOFFICE&lt;span class="w"&gt; &lt;/span&gt;Desktop&lt;span class="w"&gt; &lt;/span&gt;Editors&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt; &lt;/span&gt;Office&lt;span class="w"&gt; &lt;/span&gt;productivity&lt;span class="w"&gt; &lt;/span&gt;suite

&lt;span class="w"&gt;                 &lt;/span&gt;ID:&lt;span class="w"&gt; &lt;/span&gt;org.onlyoffice.desktopeditors
&lt;span class="w"&gt;         &lt;/span&gt;Referencia:&lt;span class="w"&gt; &lt;/span&gt;app/org.onlyoffice.desktopeditors/x86_64/stable
&lt;span class="w"&gt;       &lt;/span&gt;Arquitectura:&lt;span class="w"&gt; &lt;/span&gt;x86_64
&lt;span class="w"&gt;               &lt;/span&gt;Rama:&lt;span class="w"&gt; &lt;/span&gt;stable
&lt;span class="w"&gt;            &lt;/span&gt;Versión:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;8&lt;/span&gt;.0.1
&lt;span class="w"&gt;           &lt;/span&gt;Licencia:&lt;span class="w"&gt; &lt;/span&gt;AGPL-3.0-only
&lt;span class="w"&gt;             &lt;/span&gt;Origen:&lt;span class="w"&gt; &lt;/span&gt;flathub
&lt;span class="w"&gt;          &lt;/span&gt;Colección:&lt;span class="w"&gt; &lt;/span&gt;org.flathub.Stable
&lt;span class="w"&gt;        &lt;/span&gt;Instalación:&lt;span class="w"&gt; &lt;/span&gt;system
&lt;span class="w"&gt;          &lt;/span&gt;Instalada:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;863&lt;/span&gt;,8&lt;span class="w"&gt; &lt;/span&gt;MB
Tiempo&lt;span class="w"&gt; &lt;/span&gt;de&lt;span class="w"&gt; &lt;/span&gt;ejecución:&lt;span class="w"&gt; &lt;/span&gt;org.freedesktop.Platform/x86_64/23.08
&lt;span class="w"&gt;                &lt;/span&gt;Sdk:&lt;span class="w"&gt; &lt;/span&gt;org.freedesktop.Sdk/x86_64/23.08

&lt;span class="w"&gt;             &lt;/span&gt;Commit:&lt;span class="w"&gt; &lt;/span&gt;c9f73db43c9639df65e597108eb4c685025fe484fde05f73f650d05f9ea28512
&lt;span class="w"&gt;              &lt;/span&gt;Padre:&lt;span class="w"&gt; &lt;/span&gt;a38db7bbfaa18eda6d26e9d113ce850c077bf533d9ebf5aa7e34988a58b91b28
&lt;span class="w"&gt;             &lt;/span&gt;Asunto:&lt;span class="w"&gt; &lt;/span&gt;Update&lt;span class="w"&gt; &lt;/span&gt;version&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;8&lt;/span&gt;.0.1&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="c1"&gt;#117) (a88ad400)&lt;/span&gt;
&lt;span class="w"&gt;              &lt;/span&gt;Fecha:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2024&lt;/span&gt;-03-04&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;15&lt;/span&gt;:34:56&lt;span class="w"&gt; &lt;/span&gt;+0000
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;La aplicación &lt;strong&gt;ONLYOFFICE&lt;/strong&gt; usa como &lt;strong&gt;runtime&lt;/strong&gt;  org.freedesktop.Platform/x86_64/23.08. El runtime org.freedesktop.Platform/x86_64/23.08 es un entorno estandarizado y versionado que provee FreeDesktop.org para ejecutar aplicaciones de escritorio en Linux. Incluye una colección de librerías y servicios comunes, que aseguran la compatibilidad y la estabilidad entre las diferentes distribuciones de Linux. Este runtime está compilado específicamente para arquitecturas de 64-bit y fue actualizado o liberado en agosto de 2023. &lt;/p&gt;
&lt;p&gt;Los runtimes no dependen ni de una distribución ni de una versión en particular de una distribución. Y una aplicación instalada en flatpak será exactamente igual no importa si se instala en Debian o en Fedora. Una aplicación como GIMP, empaquetada como Flatpak, debería proporcionar la misma funcionalidad principal y experiencia de usuario tanto en Debian como en Fedora, dado que todas las dependencias y configuraciones críticas se gestionan dentro del contenedor Flatpak. Desde luego, hay diferencias potenciales: Si una aplicación Flatpak utiliza características específicas del sistema, como integraciones con servicios de notificación de escritorio, la forma en que estas integraciones funcionan puede variar ligeramente entre GNOME en Fedora y KDE en Debian.&lt;/p&gt;
&lt;p&gt;&lt;a class="image-reference" href="https://sergiobelkin.com/images/flatpak-runtimes.png"&gt;&lt;img src="https://sergiobelkin.com/images/flatpak-runtimes.thumbnail.png" alt="Existen diferentes runtimes para Flatpak, tales como freedesktop, GNOME, KDE y Elementary" title="Hacer clic para agrandar"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;h3 id="objeciones-en-cuanto-a-la-seguridad"&gt;Objeciones en cuanto a la seguridad&lt;/h3&gt;
&lt;p&gt;Han existido críticas severas a la seguridad de flatpak, en especial por el sitio anónimo &lt;a href="https://flatkill.org/2020"&gt;Flatkill&lt;/a&gt;. El siguiente cuaddro es un resumen de los argumentos en contra y favor de Flatpak en cuanto a este tema:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Objeción de Seguridad&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Descripción&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Respuesta / Acción Tomada&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Sandboxing Ineficaz&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Muchas aplicaciones en Flathub tienen permisos amplios como &lt;code&gt;filesystem=host&lt;/code&gt; o &lt;code&gt;filesystem=home&lt;/code&gt;, lo que permite acceso completo al sistema de archivos del usuario.&lt;/td&gt;
&lt;td&gt;Flatpak ha mejorado la transparencia sobre los permisos de las aplicaciones y trabaja en fortalecer el modelo de sandboxing. Se han introducido portales para permitir el acceso controlado a los recursos del sistema. &lt;a href="https://docs.flatpak.org/en/latest/using-flatpak.html#sandboxes-and-permissions"&gt;Flatpak Documentation&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Actualizaciones de Seguridad Retrasadas&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Algunas aplicaciones y runtimes en Flatpak no reciben actualizaciones de seguridad oportunas, lo que deja a los usuarios expuestos a vulnerabilidades conocidas.&lt;/td&gt;
&lt;td&gt;La herramienta flatpak-external-data-checker automatiza la verificación de fuentes externas y la generación de solicitudes de fusión cuando se encuentran actualizaciones. Al implementar f-e-d-c, los desarrolladores pueden asegurar que las aplicaciones en Flathub se mantengan actualizadas más fácilmente y de manera más eficiente, lo que reduce el tiempo de espera para las actualizaciones de los usuarios finales&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Integración Limitada del Escritorio&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Problemas con la integración de aplicaciones Flatpak en escritorios Linux, como la falta de soporte para configuraciones de fuentes y temas de escritorio.&lt;/td&gt;
&lt;td&gt;Se han mejorado los mecanismos de integración de escritorio, incluyendo mejor soporte para fuentes y temas en KDE y GNOME. Flatpak sigue trabajando en mejorar la compatibilidad con configuraciones del sistema host.)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Explotación Local de Root&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Riesgo de explotación de root local debido a aplicaciones Flatpak instaladas con permisos &lt;strong&gt;suid&lt;/strong&gt;.&lt;/td&gt;
&lt;td&gt;Flatpak utiliza nuevas APIs de libostree para rechazar cualquier archivo con permisos suid o de escritura mundial al instalar aplicaciones.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Gestión de Permisos Confusa para el Usuario&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Los usuarios pueden ser engañados por íconos y descripciones que indican un falso sentido de seguridad sobre las aplicaciones sandboxed.&lt;/td&gt;
&lt;td&gt;Flatpak ha mejorado la interfaz de usuario para mostrar de manera más clara los permisos que solicita cada aplicación, ayudando a los usuarios a tomar decisiones informadas sobre las aplicaciones que instalan.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;br&gt;
&lt;a class="image-reference" href="https://sergiobelkin.com/images/flathub.png"&gt;&lt;img src="https://sergiobelkin.com/images/flathub.thumbnail.png" alt="Sitio de Flathub mostrando las advertencias pertinentes a una determinada aplicación" title="Haga clic para agrandar"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;h3 id="como-hace-flatpak-para-no-pedirle-a-un-usuario-de-un-grupo-administrativo-que-se-autentique-nuevamente"&gt;¿Cómo hace flatpak para no pedirle a un usuario de un grupo administrativo que se autentique nuevamente?&lt;/h3&gt;
&lt;p&gt;En el &lt;a href="https://sergiobelkin.com/posts/entendiendo-polkit/"&gt;post anterior&lt;/a&gt; vimos como funciona polkit. Flatpak se vale de polkit para facilitar la instalación de paquetes por parte de usuarios con permisos administrativos. Basta con mirar el archivo &lt;code&gt;/usr/share/polkit-1/rules.d/org.freedesktop.Flatpak.rules&lt;/code&gt;.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="nx"&gt;polkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addRule&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"org.freedesktop.Flatpak.app-install"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"org.freedesktop.Flatpak.runtime-install"&lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"org.freedesktop.Flatpak.app-uninstall"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"org.freedesktop.Flatpak.runtime-uninstall"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"org.freedesktop.Flatpak.modify-repo"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nx"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;active&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;local&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nx"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isInGroup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"wheel"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;polkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;YES&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;polkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NOT_HANDLED&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;polkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addRule&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"org.freedesktop.Flatpak.override-parental-controls"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;polkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;AUTH_ADMIN&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;polkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NOT_HANDLED&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Este archivo tiene dos reglas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Permite a los usuarios del grupo "wheel", que están loogoueados localmente y tienen una sesión activa instalar, desinstalar, y modificar aplicaciones y repositorios sin autenticación adicional.&lt;/li&gt;
&lt;li&gt;No se pueden pasar por arriba de los controles parentales sin autenticarse con una cuenta de usuario administrativa.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Para ambos casos, si las condiciones no se cumplen, el resultado dependerá de otras reglas o de la regla predeterminada.&lt;/p&gt;
&lt;h3 id="para-terminar"&gt;Para terminar...&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Flatpak&lt;/strong&gt; elimina barreras y obstáculos tanto para desarrolladores como para usuarios finales. Para los primeros, significa les ofrece la posibilidad de poner aplicaciones disposición de cualquier distribución de Linux. Para los segundos representa una mayor facilidad para obtener los programas que están necesitando.&lt;/p&gt;
&lt;p&gt;&lt;a class="image-reference" href="https://sergiobelkin.com/images/Discover-Flatpak.png"&gt;&lt;img src="https://sergiobelkin.com/images/Discover-Flatpak.thumbnail.png" alt="Discover mostrando aplicaciones disonibles en Flathub" title="Haga clic para agrandar"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;h4 id="fuentes-y-mas-recursos"&gt;Fuentes y Más Recursos&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://docs.flatpak.org/en/latest/using-flatpak.html"&gt;Flatpak Documentation - Using Flatpak&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://flathub.org"&gt;Flathub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://flatkill.org/2020/"&gt;Flatkill - Flatpak, a security nightmare&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tesk.page/2021/02/11/response-to-flatkill-org/"&gt;Respuestas a objecioones planteadas en Flatkill&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.fedoraproject.org/en-US/flatpak/"&gt;Flatpak en Fedora&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</description><category>package-management</category><category>seguridad</category><guid>https://sergiobelkin.com/posts/que-es-flatpak/</guid><pubDate>Sat, 22 Jun 2024 20:11:07 GMT</pubDate></item><item><title>Entendiendo Polkit</title><link>https://sergiobelkin.com/posts/entendiendo-polkit/</link><dc:creator>sebelk</dc:creator><description>&lt;div&gt;&lt;h3 id="introduccion"&gt;Introducción&lt;/h3&gt;
&lt;p&gt;El esquema de permisos en Linux es simple:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Un superusuario con todos los poderes para leer, modificar y ejecutar todo.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;El resto de los usuarios con permisos limitados.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Es decir, la clasificación de usuarios en tres categorías, el famoso UGO (User, Group, Others) y el trío de permisos: rwx (read, write y execution).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pero esa simpleza tiene sus limitaciones, &lt;a href="https://sergiobelkin.com/posts/2008/07/06/permisos/"&gt;como vimos ya anteriormente&lt;/a&gt;, con el paso del tiempo se han ideado maneras de hacer esos permisos más granulares y que superusuario root pueda delegar atribuciones.&lt;/p&gt;
&lt;p&gt;Una herramienta muy importante en este sentido es &lt;strong&gt;polkit&lt;/strong&gt; (antiguamente conocido como PolicyKit). En este post vamos a explorar para develar qué es polkit, como funciona, y como se diferencia de sudo. Además, en el próximo post, veremos la relación que tiene con flatpak.&lt;/p&gt;
&lt;h3 id="que-es-polkit"&gt;¿Qué es polkit?&lt;/h3&gt;
&lt;p&gt;&lt;a class="image-reference" href="https://sergiobelkin.com/images/polkit-featured.webp"&gt;&lt;img src="https://sergiobelkin.com/images/polkit-featured.thumbnail.webp" alt="Polkit"&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;a href="https://sergiobelkin.com/posts/entendiendo-polkit/"&gt;Leer más…&lt;/a&gt; (quedan 9 minutos de lectura)&lt;/p&gt;&lt;/div&gt;</description><category>seguridad</category><guid>https://sergiobelkin.com/posts/entendiendo-polkit/</guid><pubDate>Sat, 15 Jun 2024 18:56:09 GMT</pubDate></item><item><title>Gestión de Contraseñas Usando Contenedores Podman</title><link>https://sergiobelkin.com/posts/gestion-de-contrasenas-usando-contenedores-podman/</link><dc:creator>sebelk</dc:creator><description>&lt;p&gt;Podemos administrar nuestros datos personales también con estándares profesionales. En este contexto, vamos a explorar cómo llevar la gestión de contraseñas usando utilizando herramientas viejas y confiables como &lt;strong&gt;pass&lt;/strong&gt;, &lt;strong&gt;gpg&lt;/strong&gt;, &lt;strong&gt;git&lt;/strong&gt; combinada con  la potente solución de contenedores &lt;strong&gt;Podman&lt;/strong&gt;. Será una experiencia desafiante.&lt;/p&gt;
&lt;p&gt;&lt;a class="image-reference" href="https://sergiobelkin.com/images/rc-xyz-nft-gallery-r8VbpgMS6Uc-unsplash.jpg"&gt;&lt;img src="https://sergiobelkin.com/images/rc-xyz-nft-gallery-r8VbpgMS6Uc-unsplash.thumbnail.jpg" alt="Claves"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;h3 id="almacenamiento-de-contrasenas-elevado"&gt;Almacenamiento de Contraseñas Elevado&lt;/h3&gt;
&lt;p&gt;Para gestionar nuestras passwords usaremos &lt;strong&gt;pass&lt;/strong&gt;. La herramienta pass no estra cosa que un potente script de bash de algo más de 720 líneas de wrapper principalemente para gpg y git.&lt;/p&gt;
&lt;p&gt;Ahora, lo realmente interesante: configuraremos un repositorio dentro de un contenedor &lt;strong&gt;Podman&lt;/strong&gt;. Este repositorio, administrado con &lt;strong&gt;git&lt;/strong&gt;, puede ser compartido de manera segura y efectiva en todos tus dispositivos.&lt;/p&gt;
&lt;h3 id="acceso-simplificado-desde-cualquier-lugar"&gt;Acceso Simplificado desde Cualquier Lugar&lt;/h3&gt;
&lt;p&gt;La accesibilidad es clave en tu entorno profesional. Ya sea trabajando en sistemas Windows o Linux, puedes aprovechar &lt;a href="https://qtpass.org/"&gt;QtPass&lt;/a&gt;, una interfaz gráfica para &lt;strong&gt;pass&lt;/strong&gt;. Para usuarios de iPhone, &lt;strong&gt;passforios&lt;/strong&gt; es una excelente opción, mientras que los dispositivos Android pueden beneficiarse de &lt;a href="https://github.com/android-password-store/Android-Password-Store#readme"&gt;Password-Store&lt;/a&gt;, disponible en &lt;a href="https://play.google.com/store/apps/details?id=dev.msfjarvis.aps"&gt;Google Play Store&lt;/a&gt; y &lt;a href="https://f-droid.org/packages/dev.msfjarvis.aps/"&gt;F-Droid&lt;/a&gt; para mantener tus contraseñas siempre sincronizadas.&lt;/p&gt;
&lt;p&gt;&lt;a class="image-reference" href="https://sergiobelkin.com/images/podman-pass.png"&gt;&lt;img src="https://sergiobelkin.com/images/podman-pass.thumbnail.png" title="Hacer clic para ampliar la imagen" alt="Esquema de podman con pass"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;h3 id="caracteristicas-clave-para-profesionales"&gt;Características Clave para Profesionales&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Control Total:&lt;/strong&gt; Somos nosotros quienes gestionan nuestros repositorios. Los datos sensibles están en tus dispositivos, evitando intermediarios y asegurando la confidencialidad.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Portabilidad Sin Esfuerzo&lt;/strong&gt;: Se puede cambiar de dispositivos o realiza copias de seguridad con facilidad. Tu repositorio te seguirá sin problemas.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Seguridad de Alto Nivel&lt;/strong&gt;:  tus credenciales seguras con estándares de confiabilidad, integridad y disponibilidad.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Compartir con Confianza&lt;/strong&gt;: Podrás compartirlo fácilmente en círculos de confianza. &lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="configuracion-inicial-y-uso-avanzado"&gt;Configuración Inicial y Uso Avanzado&lt;/h3&gt;
&lt;p&gt;En esta primera fase, te guiaremos a través de la configuración de tu repositorio en un contenedor &lt;strong&gt;Podman&lt;/strong&gt; y las opciones para interactuar con él desde distintos dispositivos.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;mark&gt;Nota 1:&lt;/mark&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;El enfoque primordial es establecer un almacén personal de contraseñas. Además de utilizarlo en tus dispositivos, podrás extender su uso a usuarios de confianza. Aunque podría requerirse alguna asistencia técnica inicial para la configuración, las acciones esenciales son "actualizar desde el repositorio (pull)" y "enviar cambios al repositorio (push)".&lt;/p&gt;
&lt;p&gt;Esta idea es adaptable a ambientes profesionales con para grupos reducidos de usuarios en una red corporativa, donde cada miembro tiene su copia del repositorio principal. El repositorio podría estar incluso en algún contenedor que esté disponible 24x7. Esto facilita la consulta, creación, modificación y eliminación colaborativa de contraseñas, consolidando luego los cambios en un repositorio compartido.&lt;/p&gt;
&lt;p&gt;&lt;mark&gt;&lt;strong&gt;Nota 2:&lt;/strong&gt;&lt;/mark&gt;&lt;/p&gt;
&lt;p&gt;Para aprovechar plenamente esta guía, asumimos que poseés conocimientos de:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gestión de claves públicas ssh&lt;/li&gt;
&lt;li&gt;Gestión de claves gpg&lt;/li&gt;
&lt;li&gt;Uso básico de git&lt;/li&gt;
&lt;li&gt;Uso básico de &lt;strong&gt;Podman&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Conocimientos generales de Linux: bash, systemd, firewalld (iptables/nftables), etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="que-usaremos-para-lograr-todo-esto"&gt;¿Qué usaremos para lograr todo esto?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;OS: Fedora 38&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;podman&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://www.passwordstore.org/"&gt;pass&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Se podría usar otra distribución, sin embargo es importante que cuente con una versión relativamente reciente de podman. &lt;/p&gt;
&lt;p&gt;¿Por qué usamos podman? Porque tiene una gran similitud con docker, y además, posee la capacidad de correr contenedores de manera mucho más segura y sencilla. En este caso particular, crearemos un contenedor que alojará el repositorio compartido de passwords.&lt;/p&gt;
&lt;p&gt;No será necesario crear servicios web y/o de bases de datos.&lt;/p&gt;
&lt;h4 id="instalacion-de-paquetes"&gt;Instalación de paquetes&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;dnf install -y  git pass&lt;/code&gt;&lt;/p&gt;
&lt;h4 id="inicializacion-de-repositorio-de-passwords"&gt;Inicialización de repositorio de passwords&lt;/h4&gt;
&lt;p&gt;En este ejemplo le pasamos los identificadores de las clave públicas gpg en el siguiente usamos 3 direcciones de mail correspondientes a la clave del host, la del celular y la de otra persona respectivamente.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;pass init jkm@example.com fxi@example.com pyn@example.net&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;pass git init&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;pass generate puertablanca&lt;/code&gt;&lt;/p&gt;
&lt;h4 id="preparacion-del-container"&gt;Preparación del container&lt;/h4&gt;
&lt;p&gt;Creamos el siguiente Dockerfile&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;FROM fedora:38
RUN dnf update -y &amp;amp;&amp;amp; dnf install -y git openssh-server
RUN useradd -ms /bin/bash git
RUN mkdir /home/git/.ssh
RUN ssh-keygen -A
COPY  ssh-pks /home/git/.ssh/authorized_keys
RUN echo "git ALL=(ALL:ALL) NOPASSWD: /usr/sbin/sshd" &amp;gt;&amp;gt; /etc/sudoers &amp;amp;&amp;amp; git clone --bare /mnt/.password-store /home/git/.password-store &amp;amp;&amp;amp; chown -R git:git /home/git  &amp;amp;&amp;amp; chmod 700 /home/git/.ssh &amp;amp;&amp;amp; chmod 600 /home/git/.ssh/authorized_keys
EXPOSE 22
CMD ["sudo","/usr/sbin/sshd", "-D"]
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Esto nos permitirá crear un repositorio con las siguientes características:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Basado en Fedora 38&lt;/li&gt;
&lt;li&gt;Un usuario llamado &lt;em&gt;git&lt;/em&gt; que tendrá el único privilegio de correr el servicio ssh&lt;/li&gt;
&lt;li&gt;Obtendrá una copia del repositorio git antes creado con pass&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="crear-la-imagen-de-podman"&gt;Crear la imagen de podman&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;podman build  -v /home/sergio/.password-store:/mnt/.password-store  -t passteiner .&lt;/code&gt;&lt;/p&gt;
&lt;h4 id="crear-el-container"&gt;Crear el container&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;podman run  -d --name container-pass_git  --user git   -p 60003:22    passteiner&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="image-reference" href="https://sergiobelkin.com/images/podman-pass-running.png"&gt;&lt;img src="https://sergiobelkin.com/images/podman-pass-running.thumbnail.png" alt=""&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;En este punto, ya estamos en condiciones de crear, editar, modificar nuestras passwords y subirlas al repo del contenedor de manera que esté disponible para otros dispostivos y/o usuarios. &lt;/p&gt;
&lt;p&gt;Cabe aclarar que para usar Password Store en Android hace falta instalar &lt;a href="https://github.com/open-keychain/open-keychain#readme"&gt;OpenKeychain&lt;/a&gt;. Esa aplicación nos permitirá crear un el par de clave privada + clave pública GnuPG, como así también importar la clave pública del resto de los usuarios con quien compartiremos el llavero. Tener en cuenta que es muy importante la passphrase que usemos para cifrar nuestra clave privada: debe ser fácil de memorizar y a la vez robusta. Esa misma passphrase se nos pedirá cuando necesitamos acceder a las contraseñas:&lt;/p&gt;
&lt;p&gt;Y luego con &lt;strong&gt;Password Store&lt;/strong&gt; tendremos que:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ingresar los parámetros de repositorio que está en el contenedor que hemos creado, tanto la url (por ejemplo ssh://git@10.0.0.10:60003/git/,password-store) y la branch (master).&lt;/li&gt;
&lt;li&gt;Generar la clave pública ssh para autenticarse al repositorio. Esta clave tendrá que copiarse al archivo /home/git/.ssh/authorized_keys del contenedor.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;podman exec container-pass_git bash -c 'echo "clave_publica_ssh" /home/git/.ssh/authorized_keys'&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;(Si queremos que este archivo sea persistente, podríamos modiicar el Dockerfile para que use un volumen).&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Clonar el repositorio del contenedor.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Una vez que hemos clonado el repositorio, obtendremos el listado de passwords y el menú para operar con él:&lt;/p&gt;
&lt;p&gt;&lt;a class="image-reference" href="https://sergiobelkin.com/images/photo_2023-08-18_18-14-14.jpg"&gt;&lt;img src="https://sergiobelkin.com/images/photo_2023-08-18_18-14-14.thumbnail.jpg" alt="Menú de Password Store"&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="actualizando-nuestro-repositorio"&gt;Actualizando nuestro repositorio&lt;/h3&gt;
&lt;p&gt;Hay varias configuraciones posibles, pero la que recomiendo es la siguiente:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;pass git config pull.rebase false&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Para bajar las actualizaciones del contenedor:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;pass git pull&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Para subir las propias modificaciones al contenedor:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;pass git push&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="comentario-finales"&gt;Comentario finales&lt;/h3&gt;
&lt;p&gt;Al finalizar habrás conseguido que:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;El contenedor se ejecuta como un usuario sin privilegios dentro del sistema.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Todo - excepto el proceso sshd - se ejecutará como un usuario sin privilegios &lt;strong&gt;aun dentro del container&lt;/strong&gt;. Salvo que explícitamente uses algo como &lt;code&gt;docker run --user root.....&lt;/code&gt; . Pero ¿por qué lo harías?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Por fuera del contenedor en realidad, mapea a nuestro propio usuario.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a class="image-reference" href='https://sergiobelkin.com/images/podman-pass-container-top.png"'&gt;&lt;img src="https://sergiobelkin.com/images/podman-pass-container-top.thumbnail.png" alt=""&gt;&lt;/a&gt; &lt;/p&gt;
&lt;h3 id="enlaces-utiles"&gt;Enlaces útiles&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.howtogeek.com/devops/how-to-use-pass-a-command-line-password-manager-for-linux-systems/"&gt;How to Use Pass, a Command-Line Password Manager for Linux Systems&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.devdungeon.com/content/gpg-tutorial"&gt;GPG Tutorial | DevDungeon&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=zeObvF1tk8M"&gt;(135) QtPass and opensource project management The road from a 2 day project till inclusion in all distro… - YouTube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><category>contenedores</category><category>seguridad</category><guid>https://sergiobelkin.com/posts/gestion-de-contrasenas-usando-contenedores-podman/</guid><pubDate>Tue, 29 Aug 2023 22:06:14 GMT</pubDate></item><item><title>Tutorial de fscrypt para cifrar archivos</title><link>https://sergiobelkin.com/posts/tutorial-de-fscrypt-para-cifrar-archivos/</link><dc:creator>sebelk</dc:creator><description>&lt;h4 id="conocimientos-previos-necesarios"&gt;Conocimientos previos necesarios:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Instalación de Linux.&lt;/li&gt;
&lt;li&gt;Uso habitual de línea de comandos en Linux (incluyendo entre otros manejo de propietarios y permisos).&lt;/li&gt;
&lt;li&gt;Instalación y desinstalación de paquetes.&lt;/li&gt;
&lt;li&gt;Montaje de sistemas de archivos.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a class="image-reference" href="https://sergiobelkin.com/images/alex-motoc-Y83nsKGkxSw-unsplash.jpg"&gt;&lt;img src="https://sergiobelkin.com/images/alex-motoc-Y83nsKGkxSw-unsplash.thumbnail.jpg" alt="Cifrado de archivos"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;El sistema ext4 proporciona cifrado de bloques de datos y nombres de archivos. Veremos a continuación de algunas reglas generales para cifrar el directorio /home de un usuario.&lt;/p&gt;
&lt;p&gt;En el ejemplo en cuestión estoy usando Debian Buster (te recomiendo primero instalarla en una máquina virtual para hacer pruebas), de modo que los pasos a seguir pueden ser un poco diferentes en otras distribuciones, pero los principios generales se mantienen.&lt;/p&gt;
&lt;p&gt;¡Manos a la obra!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Los comandos precedidos por &lt;code&gt;sudo&lt;/code&gt; indican que necesitan privilegios de root. Si querés usar sudo, sencillamente ejecutá como root:&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;code&gt;usermod -aG sudo sergio&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Obviamente aquí y en cada caso reemplazalo con tu usuario común.&lt;/p&gt;
&lt;h3 id="preparacion-del-sistema-de-archivos"&gt;Preparación del sistema de archivos&lt;/h3&gt;
&lt;p&gt;Algo que tendremos que hacer es habilitar la funcionalidad de cifrado, suponiendo que la partición de cifrado es /dev/sda1, haríamos:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sudo tune2fs -O encrypt /dev/sda1&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="descarga-y-compilacion"&gt;Descarga y compilación&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;sudo apt update &amp;amp;&amp;amp; sudo apt build-dep fscrypt&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;do apt -y install git &amp;amp;&amp;amp; go get -d github.com/google/fscrypt/...&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;cd go/src/github.com/google/fscrypt/&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;make &amp;amp;&amp;amp; sudo make install PREFIX=/usr&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="configuracion"&gt;Configuración&lt;/h3&gt;
&lt;p&gt;Tenemos que actualizar la configuración de PAM, que servirán para desbloquear directorios al loguearse, bloquear al desloguearse, y cambiar contraseñas de acceso a los recursos cifrados.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sudo pam-auth-update&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="image-reference" href="https://sergiobelkin.com/images/pam-auth-update-fscrypt.png"&gt;&lt;img src="https://sergiobelkin.com/images/pam-auth-update-fscrypt.thumbnail.png" alt="pam-auth-update"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Para configurar globalmente:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sudo fscrypt setup&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;No se puede cifrar un directorio que ya tiene contenido, de manera que hay que crear un nuevo directorio, y luego migrar el contenido del directorio del usuario:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sudo mkdir /home/sergio_temp &amp;amp;&amp;amp; sudo chown sergio.sergio /home/sergio_temp&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;fscrypt encrypt /home/sergio_temp&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Allí podríamos elegir entre la contraseña del usuario, una passphrase o bien un archivo con clave 256-bit. En nuestro elegimos la primera opción, siempre teniendo en cuenta lo importante que es contar con una buena contraseña.&lt;/p&gt;
&lt;p&gt;Luego chequeamos que esté todo en orden:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;fscrypt status /home/sergio_temp&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Ahora sí, migramos el contenido:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;cp -av -T /home/sergio /home/sergio_temp&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Bloqueamos el contenido del directorio&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sudo fscrypt lock /home/sergio_temp --user=/home/sergio_temp&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Probamos desbloquear&lt;/p&gt;
&lt;p&gt;&lt;code&gt;fscrypt unlock /home/sergio_temp&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Si funciona podemos reemplazarlo por el nuevo directorio:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sudo su -&lt;/code&gt;
&lt;code&gt;mv /home/sergio{,_para-borrar}&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;mv /home/sergio{_temp,}&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Luego al reiniciar podemos probar:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;reboot&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;¿Cómo se ven los archivos cifrados?&lt;/p&gt;
&lt;p&gt;&lt;a class="image-reference" href="https://sergiobelkin.com/images/fscrypt-access.png"&gt;&lt;img src="https://sergiobelkin.com/images/fscrypt-access.thumbnail.png" alt=""&gt;&lt;/a&gt; &lt;/p&gt;
&lt;h4 id="mas-recursos"&gt;Más Recursos&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/google/fscrypt"&gt;fscrypt: Go tool for managing Linux filesystem encryption&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wiki.archlinux.org/index.php/Fscrypt"&gt;fscrypt - ArchWiki&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.kernel.org/doc/html/v4.18/filesystems/fscrypt.html"&gt;Filesystem-level encryption (fscrypt) — The Linux Kernel documentation&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;</description><category>criptografia</category><category>seguridad</category><guid>https://sergiobelkin.com/posts/tutorial-de-fscrypt-para-cifrar-archivos/</guid><pubDate>Sat, 24 Apr 2021 13:30:29 GMT</pubDate></item><item><title>Diagrama de netfilter/iptables</title><link>https://sergiobelkin.com/posts/diagrama-de-netfilteriptables/</link><dc:creator>sebelk</dc:creator><description>&lt;p&gt;&lt;a class="image-reference" href="https://sergiobelkin.com/images/netfilter.png"&gt;&lt;img src="https://sergiobelkin.com/images/netfilter.thumbnail.png" alt="netfilter/iptables"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Claves&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Las reglas se organizan en tablas: raw, mangle, nat, filter.&lt;/li&gt;
&lt;li&gt;Las tablas tienen cadenas, filter, por ejemplo tiene INPUT, OUTPUT y FORWARD. Y como se puede apreciar las decisiones de routing implican que INPUT y FORWARD son excluyentes. Lo mismo que OUTPUT y FORWARD.&lt;/li&gt;
&lt;li&gt;El orden siempre es raw, mangle, nat, filter (si es que están presentes).&lt;/li&gt;
&lt;li&gt;Hay 3 lugares en que se decide el ruteo, uno de los cuales es local.&lt;/li&gt;
&lt;li&gt;Solamente se filtra en filter, obviamente.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Más?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://book.huihoo.com/iptables-tutorial/book1.htm"&gt;Iptables Tutorial 1.2.2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><category>networking</category><category>seguridad</category><guid>https://sergiobelkin.com/posts/diagrama-de-netfilteriptables/</guid><pubDate>Thu, 26 Sep 2019 18:11:49 GMT</pubDate></item><item><title>Defendiendo la disponibilidad de un servicio con iptables</title><link>https://sergiobelkin.com/posts/2016/01/08/defendiendo-la-disponibilidad-de-un-servicio-con-iptables/</link><dc:creator>sebelk</dc:creator><description>&lt;div class="markdown-here-wrapper" data-md-url="http://www.sergiobelkin.com/wp-admin/post.php?post=818&amp;amp;action=edit"&gt;
&lt;p style="margin: 1.2em 0px ! important;"&gt;La famosa sigla &lt;strong&gt;CID&lt;/strong&gt; define el trípode en el cual se sustenta la seguridad informática: &lt;strong&gt;C&lt;/strong&gt;onfidencialidad, &lt;strong&gt;I&lt;/strong&gt;ntegridad, &lt;strong&gt;D&lt;/strong&gt;isposnibilidad.&lt;/p&gt;
&lt;p style="margin: 1.2em 0px ! important;"&gt;Es decir, al interrumpir la &lt;em&gt;disponibilidad&lt;/em&gt; de un servicio se quiebra la seguridad de uno o más servicios.&lt;/p&gt;
&lt;p style="margin: 1.2em 0px ! important;"&gt;El famoso ataque de denegación de servicio puede colgar aplicaciones de un servidor o inundarlos de tráfico afectando seriamente el rendimiento. Muchas veces ese tipo de ataque proviene de direcciones IP falsificadas y desde más de un origen. Existen variantes de este tipo de agresiones que pueden incluso aprovechar vulnerabilidades de los dispositivos víctima, de manera tal que los atacantes pueden por ejemplo hacer reemplazar el firmware original por otro malicioso.&lt;/p&gt;
&lt;h2 id="el-m-dulo-xt_recent" style="margin: 1.3em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.4em; border-bottom: 1px solid #eeeeee;"&gt;El módulo xt_recent&lt;/h2&gt;
&lt;p style="margin: 1.2em 0px ! important;"&gt;Como vimos, bloquear o limitar el tráfico de una lista estática de direcciones IP no es conveniente. Exige en cambio adoptar una defensa dinámica y proactiva.&lt;/p&gt;
&lt;p style="margin: 1.2em 0px ! important;"&gt;El módulo de iptables &lt;strong&gt;xt_recent&lt;/strong&gt; es una de las opciones a las que podemos recurrir en estos casos. Fue creado por Stephen Frost en 2003&lt;span style="color: #ff0000;"&gt;&lt;a style="color: #ff0000;" href="http://www.snowman.net/projects/ipt_recent/"&gt;&lt;sup&gt;^1&lt;/sup&gt;&lt;/a&gt;&lt;/span&gt;   y lo mantiene actualmente el equipo de iptables.&lt;span style="color: #ff0000;"&gt;&lt;a style="color: #ff0000;" href="http://netfilter.org/projects/iptables/index.html"&gt;&lt;sup&gt;^2&lt;/sup&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin: 1.2em 0px ! important;"&gt;El presente artículo intenta mostrar de manera sencilla y clara el funcionamiento del módulo, no es un curso de iptables ni una receta para diseñar una política de firewall. El propósito es mostrar como el propio kernel posee instrumentos para defenderse contra un (D)DOS.&lt;/p&gt;
&lt;h2 id="como-funciona-y-usos" style="margin: 1.3em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.4em; border-bottom: 1px solid #eeeeee;"&gt;Como funciona y usos&lt;/h2&gt;
&lt;p style="margin: 1.2em 0px ! important;"&gt;El modulo &lt;strong&gt;xt_recent&lt;/strong&gt; o más comúnmente conocido &lt;strong&gt;recent&lt;/strong&gt; crea una conjunto de direcciones IPs de acuerdo a ciertos criterios que queramos establecer. Por ejemplo podríamos crear un regla que coincida con paquetes de tipo icmp pertenecientes a conexiones nuevas.&lt;/p&gt;
&lt;p style="margin: 1.2em 0px ! important;"&gt;Es cierto, tal vez no podamos hablar estrictamente de conexiones nuevas para este tipo de protocolo. Pero recordemos que iptables es un firewall de estado es decir, no solamente analiza y/o filtra paquetes de manera aislada. Sino que además puede examinar su historial: saber si un paquete pertenece a una conexión nueva (&lt;strong&gt;NEW&lt;/strong&gt;), establecida (&lt;strong&gt;ESTABLISHED&lt;/strong&gt;), relacionada (&lt;strong&gt;RELATED&lt;/strong&gt;) o no válida (&lt;strong&gt;INVALID&lt;/strong&gt;).&lt;/p&gt;
&lt;p style="margin: 1.2em 0px ! important;"&gt;Por ejemplo al realizar un &lt;em&gt;echo-request&lt;/em&gt; con ping y recibir desde el otro host un &lt;em&gt;echo-reply&lt;/em&gt;, iptables, o mejor dicho, netfilter considera que se estableció una conexión.&lt;/p&gt;
&lt;p style="margin: 1.2em 0px ! important;"&gt;Si queremos contrarrestar un icmp-flood de manera efectiva lo correcto es limitar las paquetes &lt;em&gt;nuevos&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id="reglas-sencillas-para-probarlo" style="margin: 1.3em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.4em; border-bottom: 1px solid #eeeeee;"&gt;Reglas sencillas para probarlo&lt;/h2&gt;
&lt;p style="margin: 1.2em 0px ! important;"&gt;Las siguientes reglas permiten aplicar un límite de un paquete nuevo icmp por minuto (es un ejemplo extremo, pero útil para explicar el funcionamiento del módulo)&lt;/p&gt;
&lt;pre style="font-size: 1em; font-family: Consolas,Inconsolata,Courier,monospace; line-height: 1.2em; margin: 1.2em 0px;"&gt;&lt;code style="font-size: 0.85em; font-family: Consolas,Inconsolata,Courier,monospace; margin: 0px 0.15em; padding: 0.5em 0.7em; white-space: pre; border: 1px solid #cccccc; background-color: #f8f8f8; border-radius: 3px; display: block ! important; overflow: auto;"&gt;iptables -A INPUT -p icmp -m state –state NEW -m recent –update –seconds 60 –hitcount 1 –name icmpflood -j DROP
iptables -A INPUT -p icmp -m state –state NEW -m recent –set –name icmpflood
&lt;/code&gt;&lt;/pre&gt;
&lt;p style="margin: 1.2em 0px ! important;"&gt;Como siempre es importante el orden de las reglas, podríamos invertirlas pero en la documentación de primera mano&lt;span style="color: #ff0000;"&gt;&lt;a style="color: #ff0000;" href="http://www.snowman.net/projects/ipt_recent/"&gt;^1&lt;/a&gt;&lt;/span&gt; está en ese orden (y las cosas cambiarían, podés probarlo vos el resultado).&lt;/p&gt;
&lt;p style="margin: 1.2em 0px ! important;"&gt;Pero veamos las cosas tal como están. Supongamos que no han llegado paquetes nuevos icmp: Al arribar uno, no coincidirá con la primer regla. Explicaremos la razón:&lt;/p&gt;
&lt;p style="margin: 1.2em 0px ! important;"&gt;El parámetro &lt;code style="font-size: 0.85em; font-family: Consolas,Inconsolata,Courier,monospace; margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid #eaeaea; background-color: #f8f8f8; border-radius: 3px; display: inline;"&gt;–seconds–&lt;/code&gt; indica el intervalo de tiempo que examinaremos, mientras que &lt;code style="font-size: 0.85em; font-family: Consolas,Inconsolata,Courier,monospace; margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid #eaeaea; background-color: #f8f8f8; border-radius: 3px; display: inline;"&gt;–hitcount&lt;/code&gt; evalúa la cantidad de paquetes de este tipo desde la misma dirección. Es importante entender que esta regla &lt;em&gt;no&lt;/em&gt; incrementa el contador. Solamente examina cantidad de paquetes por unidad de tiempo. Como hasta ahora el contador está en 0, el paquete podrá ingresar (asumimos que la política predeterminada es ACCEPT, lo cual puede – en principio – ser inseguro, pero nuestro propósito es explicar el funcionamiento de &lt;strong&gt;recent&lt;/strong&gt;, de manera que el lector está advertido). Insistimos: esta regla &lt;em&gt;NO&lt;/em&gt; penaliza, es decir no incrementa el contador. ¿Quedó claro?&lt;/p&gt;
&lt;p style="margin: 1.2em 0px ! important;"&gt;Vayamos a la segunda regla: esta regla crea un conjunto llamado &lt;em&gt;icmpflood&lt;/em&gt; e incrementa el contador para los paquetes que cumplan con los requisitos estipulados, es decir: con protocolo &lt;em&gt;icmp&lt;/em&gt; y estado &lt;em&gt;NEW&lt;/em&gt;. De manera que al llegar el primer paquete se agrega la dirección IP al &lt;em&gt;set&lt;/em&gt; icmpflood y el número de hits es ahora &lt;strong&gt;1&lt;/strong&gt;.&lt;/p&gt;
&lt;p style="margin: 1.2em 0px ! important;"&gt;Recién al llegar el segundo paquete en menos de 60 segundos se habrán cumplidos los requisitos de la primer regla y por lo tanto el paquete será descartado.&lt;/p&gt;
&lt;h2 id="m-todo-sencillo-para-testear-las-reglas" style="margin: 1.3em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.4em; border-bottom: 1px solid #eeeeee;"&gt;Método sencillo para testear las reglas&lt;/h2&gt;
&lt;p style="margin: 1.2em 0px ! important;"&gt;Lo podemos probar sencillamente con los siguientes comandos desde otro host:&lt;/p&gt;
&lt;pre style="font-size: 1em; font-family: Consolas,Inconsolata,Courier,monospace; line-height: 1.2em; margin: 1.2em 0px;"&gt;&lt;code style="font-size: 0.85em; font-family: Consolas,Inconsolata,Courier,monospace; margin: 0px 0.15em; padding: 0.5em 0.7em; white-space: pre; border: 1px solid #cccccc; background-color: #f8f8f8; border-radius: 3px; display: block ! important; overflow: auto;"&gt;pingwait(){ ping -q -c1 $1 &amp;amp; sleep 31; }
IP=192.168.80.148
pingwait $IP; pingwait $IP; ping -q -c1 192.168.80.148
&lt;/code&gt;&lt;/pre&gt;
&lt;p style="margin: 1.2em 0px ! important;"&gt;Es decir lo que hacemos es enviar dos paquetes &lt;strong&gt;nuevos&lt;/strong&gt; icmp cada 31 segundos.&lt;/p&gt;
&lt;p style="margin: 1.2em 0px ! important;"&gt;El resultado en el host de destino es:&lt;/p&gt;
&lt;pre style="font-size: 1em; font-family: Consolas,Inconsolata,Courier,monospace; line-height: 1.2em; margin: 1.2em 0px;"&gt;&lt;code style="font-size: 0.85em; font-family: Consolas,Inconsolata,Courier,monospace; margin: 0px 0.15em; padding: 0.5em 0.7em; white-space: pre; border: 1px solid #cccccc; background-color: #f8f8f8; border-radius: 3px; display: block ! important; overflow: auto;"&gt;Every 2,0s: iptables -L INPUT -vn  

Chain INPUT (policy ACCEPT 63 packets, 3612 bytes)
 pkts bytes target     prot opt in     out     source               destination
    2   168 DROP       icmp —  *      *       0.0.0.0/0            0.0.0.0/0            state NEW recent: UPDATE seconds:
 60 hit_count: 1 name: icmpflood side: source mask: 255.255.255.255
    1    84            icmp —  *      *       0.0.0.0/0            0.0.0.0/0            state NEW recent: SET name: icmpflood side: source mask: 255.255.255.255
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="diferencia-entre-rcheck-y-update" style="margin: 1.3em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.4em; border-bottom: 1px solid #eeeeee;"&gt;Explicación amigable de rcheck y update&lt;/h2&gt;
&lt;p style="margin: 1.2em 0px ! important;"&gt;No explicamos en absoluto el significado de &lt;strong&gt;UPDATE&lt;/strong&gt; (–update) hasta ahora y la diferencia con &lt;strong&gt;CHECK &lt;/strong&gt;(–rcheck). No es sorpresa que la mejor explicación esté en la documentación original. Muchos de los sitios que intentan explicarlo en mi modesta opinión no lo hacen de la manera más clara. Así que trataré de hacerme entender, ya que son dos parámetros claves. Pero antes de hacerlo y sin querer eludir la explicación, mostraré el resultado al cambiar &lt;em&gt;UPDATE&lt;/em&gt; por &lt;em&gt;CHECK&lt;/em&gt;:&lt;/p&gt;
&lt;pre style="font-size: 1em; font-family: Consolas,Inconsolata,Courier,monospace; line-height: 1.2em; margin: 1.2em 0px;"&gt;&lt;code style="font-size: 0.85em; font-family: Consolas,Inconsolata,Courier,monospace; margin: 0px 0.15em; padding: 0.5em 0.7em; white-space: pre; border: 1px solid #cccccc; background-color: #f8f8f8; border-radius: 3px; display: block ! important; overflow: auto;"&gt;iptables -F &amp;amp;&amp;amp; iptables -X &amp;amp;&amp;amp; iptables -Z
iptables -A INPUT -p icmp -m state –state NEW -m recent –rcheck –seconds 60 –hitcount 1 –name icmpflood -j DROP
iptables -A INPUT -p icmp -m state –state NEW -m recent –set –name icmpflood
&lt;/code&gt;&lt;/pre&gt;
&lt;pre style="font-size: 1em; font-family: Consolas,Inconsolata,Courier,monospace; line-height: 1.2em; margin: 1.2em 0px;"&gt;&lt;code style="font-size: 0.85em; font-family: Consolas,Inconsolata,Courier,monospace; margin: 0px 0.15em; padding: 0.5em 0.7em; white-space: pre; border: 1px solid #cccccc; background-color: #f8f8f8; border-radius: 3px; display: block ! important; overflow: auto;"&gt;Every 2,0s: iptables -L INPUT -vn                                                                       Thu Jan  7 16:49:41 2016

Chain INPUT (policy ACCEPT 57 packets, 3250 bytes)
 pkts bytes target     prot opt in     out     source               destination
    1    84 DROP       icmp —  *      *       0.0.0.0/0            0.0.0.0/0            state NEW recent: CHECK seconds:
60 hit_count: 1 name: icmpflood side: source mask: 255.255.255.255
    2   168            icmp —  *      *       0.0.0.0/0            0.0.0.0/0            state NEW recent: SET name: icmpf
lood side: source mask: 255.255.255.255
&lt;/code&gt;&lt;/pre&gt;
&lt;p style="margin: 1.2em 0px ! important;"&gt;Supongamos que tenés una bolsa con 10 caramelos y un nene te pide que se los des. Aceptás con una condición, solamente podrá comer 2 por hora. Entonces, podrías adoptar dos políticas con el pequeño:&lt;/p&gt;
&lt;p style="margin: 1.2em 0px ! important;"&gt;&lt;strong&gt;Laxa (–rcheck)&lt;/strong&gt;&lt;/p&gt;
&lt;ul style="margin: 1.2em 0px; padding-left: 2em;"&gt;
&lt;li style="margin: 0.5em 0px;"&gt;Hora 15:00 Viene el nene por primera vez y te pide 2 caramelos. Le das un caramelo.&lt;/li&gt;
&lt;li style="margin: 0.5em 0px;"&gt;Hora 15:15: ¡Regresa el niño en busca de más caramelos! Está ok, le regalás el dulce, pero le decís que es el último durante esa hora.&lt;/li&gt;
&lt;li style="margin: 0.5em 0px;"&gt;Hora 15:30: Otra vez el simpático nene te pido caramelos, le explicás que ya comió los dos caramelos que corresponden a esa hora, recién a las 16:00 se lo darás.&lt;/li&gt;
&lt;li style="margin: 0.5em 0px;"&gt;Hora 16:00: Ahora sí tal lo prometido le podrás dar 1 o 2 caramelos durante las 16:00 hasta las 16:59.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style="margin: 1.2em 0px ! important;"&gt;&lt;strong&gt;Rígida (–update)&lt;/strong&gt;&lt;/p&gt;
&lt;ul style="margin: 1.2em 0px; padding-left: 2em;"&gt;
&lt;li style="margin: 0.5em 0px;"&gt;Hora 15:00 Viene el nene por primera vez y te pide 2 caramelos. Le das un caramelo.&lt;/li&gt;
&lt;li style="margin: 0.5em 0px;"&gt;Hora 15:15: ¡Regresa el niño en busca de más caramelos! Está ok, le regalás el dulce, pero le decís que es el último durante esa hora.&lt;/li&gt;
&lt;li style="margin: 0.5em 0px;"&gt;Hora 15:30: Otra vez el simpático nene te pido caramelos, le explicás que ya comió los dos caramelos que corresponden a esa hora… Pero que durante una hora a partir de ahora no le podrás dar más caramelos.&lt;/li&gt;
&lt;li style="margin: 0.5em 0px;"&gt;Hora 15:45: El chico insiste quiere más caramelos. Como disciplina le decís que por no esperás volvés a extender el tiempo de espera. De manera que tendrá que esperar hasta las 16.45 para recibir otro caramelo.&lt;/li&gt;
&lt;li style="margin: 0.5em 0px;"&gt;Hora 16:00 El pobre nene insiste, entonces extendés la penalidad una hora más. Y el nino recién ahí comprende la indicación y espera una hora.&lt;/li&gt;
&lt;li style="margin: 0.5em 0px;"&gt;Hora 17:00: Ahora sí tal lo prometido le podrás dar 1 o 2 caramelos durante los siguientes 60 minutos.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style="margin: 1.2em 0px ! important;"&gt;Así que esas son las diferencias entre &lt;code style="font-size: 0.85em; font-family: Consolas,Inconsolata,Courier,monospace; margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid #eaeaea; background-color: #f8f8f8; border-radius: 3px; display: inline;"&gt;–rcheck&lt;/code&gt;, &lt;code style="font-size: 0.85em; font-family: Consolas,Inconsolata,Courier,monospace; margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid #eaeaea; background-color: #f8f8f8; border-radius: 3px; display: inline;"&gt;–update&lt;/code&gt;, cuanto menos respete el atacante el tiempo estipulado en &lt;code style="font-size: 0.85em; font-family: Consolas,Inconsolata,Courier,monospace; margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid #eaeaea; background-color: #f8f8f8; border-radius: 3px; display: inline;"&gt;–seconds&lt;/code&gt; peor será le penalidad. En el ejemplo que estuvimos viendo &lt;code style="font-size: 0.85em; font-family: Consolas,Inconsolata,Courier,monospace; margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid #eaeaea; background-color: #f8f8f8; border-radius: 3px; display: inline;"&gt;–update&lt;/code&gt; significa que el otro host deberá esperar sí o sí 1 minuto entre ping y ping. En cambio &lt;code style="font-size: 0.85em; font-family: Consolas,Inconsolata,Courier,monospace; margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid #eaeaea; background-color: #f8f8f8; border-radius: 3px; display: inline;"&gt;–rcheck&lt;/code&gt; es más permisivo, por cada nuevo minuto nuevo que comience podrá enviar la cantidad estipulada en &lt;code style="font-size: 0.85em; font-family: Consolas,Inconsolata,Courier,monospace; margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid #eaeaea; background-color: #f8f8f8; border-radius: 3px; display: inline;"&gt;–hitcounts&lt;/code&gt; que en nuestro ejemplo fue 1 paquete.&lt;/p&gt;
&lt;h2 id="parseo-del-archivo-xt_recent" style="margin: 1.3em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.4em; border-bottom: 1px solid #eeeeee;"&gt;Archivos de listas en /proc/net/xt_recent&lt;/h2&gt;
&lt;pre style="font-size: 1em; font-family: Consolas,Inconsolata,Courier,monospace; line-height: 1.2em; margin: 1.2em 0px;"&gt;&lt;code style="font-size: 0.85em; font-family: Consolas,Inconsolata,Courier,monospace; margin: 0px 0.15em; padding: 0.5em 0.7em; white-space: pre; border: 1px solid #cccccc; background-color: #f8f8f8; border-radius: 3px; display: block ! important; overflow: auto;"&gt;root@raspberrypi:~#  cat  /proc/net/xt_recent/icmpflood src=192.168.80.250 ttl: 64 last_seen: 29694939 oldest_pkt: 3 29688739, 29691839, 29694939
&lt;/code&gt;&lt;/pre&gt;
&lt;p style="margin: 1.2em 0px ! important;"&gt;Hay un archivo por lista (set). Vemos en el archivo &lt;strong&gt;/proc/net/xt_recent/icmpflood&lt;/strong&gt; la dirección de origen del paquete y además la última vez que fue vista usando la unidad de tiempo jiffies.&lt;/p&gt;
&lt;h2 id="par-metros-del-kernel" style="margin: 1.3em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.4em; border-bottom: 1px solid #eeeeee;"&gt;Parámetros del kernel&lt;/h2&gt;
&lt;p style="margin: 1.2em 0px ! important;"&gt;Además se le pueden pasar parámetros al módulo&lt;/p&gt;
&lt;p style="margin: 1.2em 0px ! important;"&gt;&lt;strong&gt;ip_list_tot&lt;/strong&gt;: Número de direcciones IPs que puede recordar por lista&lt;br&gt;
&lt;strong&gt;ip_pkt_list_tot&lt;/strong&gt;: Número de paquetes que puede recordar por IP (el máximo es 255)&lt;/p&gt;
&lt;h2 id="conclusi-n" style="margin: 1.3em 0px 1em; padding: 0px; font-weight: bold; font-size: 1.4em; border-bottom: 1px solid #eeeeee;"&gt;Conclusión&lt;/h2&gt;
&lt;p style="margin: 1.2em 0px ! important;"&gt;Como vemos si bien existen otros métodos para mitigar un DDOS o DOS, este tiene la ventaja de usar directamente netfilter, sin la necesidad de instalar una herramienta adicional.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt; &lt;/p&gt;</description><category>seguridad</category><guid>https://sergiobelkin.com/posts/2016/01/08/defendiendo-la-disponibilidad-de-un-servicio-con-iptables/</guid><pubDate>Fri, 08 Jan 2016 11:06:17 GMT</pubDate></item></channel></rss>