[{"content":"Algo relacionado con el post anterior sobre Signal.\nGeneralmente alguien necesita acceso físico a tu teléfono para ver tus datos, aunque eso no suele ser necesario.\nFCM Tokens para Vigilancia Hoy en día muchos gobiernos solicitan registros de notificaciones push a Apple y Google para sus investigaciones. No hace falta ser un criminal para ser un objetivo, preguntale a la gente del Reino Unido.\nEl gobierno de los EE.UU. en particular ha estado construyendo una gigantesca máquina de vigilancia que recopila muchos datos y metadatos no solo de ciudadanos estadounidenses sino del mundo entero, y esto incluye datos de notificaciones push de todos los teléfonos.\nTodas las aplicaciones (incluso Signal) usan notificaciones push, así que estamos todos jodidos.\nCuando instalás Signal y le das permisos de notificación en tu teléfono, GMS registra tu dispositivo con FCM, lo que produce un FCM registration token único (como una dirección de entrega para la combinación dispositivo-cuenta-app). Este token se envía a los servidores de Signal para que sepan dónde mandarte los pings de activación, todo esto es normal.\nLa parte turbia es que Google también guarda su propia copia de este mapeo. Este FCM token pertenece a esta cuenta de Google, en este dispositivo, identificado por su Android ID e identificadores de hardware. En otras palabras, desde ese momento, cada evento de entrega de notificación de Signal genera una entrada en los registros de la infraestructura de Google: el FCM token de destino, el identificador de la app de Signal (org.thoughtcrime.securesms), y un timestamp de entrega.\nGeneralmente para aplicaciones \u0026ldquo;normales\u0026rdquo;, el contenido del mensaje de la notificación también se almacena en los servidores de Google, pero en el caso de Signal, solo se envían mensajes FCM de tipo data-only con payloads vacíos. Google no necesita el contenido completo del mensaje para rastrearte, saben que recibiste un mensaje, la hora, etc. Todo se trata de metadatos.\nLa cadena de desanonimización funciona así. Las fuerzas del orden identifican a una persona de interés que usa Signal con una cuenta anónima. Tienen un identificador de dispositivo, un patrón de uso de la app, o una pista que apunta a un FCM token específico. Con una orden judicial a Google, las fuerzas del orden ahora tienen el mapeo completo del token. El FCM token se resuelve a una cuenta de Google. La cuenta de Google se resuelve a una identidad real a través de registros de pago, un número de teléfono de recuperación, un email de recuperación, o simplemente el nombre con el que se registró la cuenta. El usuario \u0026ldquo;anónimo\u0026rdquo; de Signal es ahora un individuo identificado con un historial con timestamps de cuándo recibió mensajes de Signal (no los mensajes en sí, pero ya no sos anónimo).\nNada de esto requiere acceder al dispositivo del objetivo. Nada de esto requiere romper el cifrado de Signal. Es puramente un problema de metadatos, y los metadatos viven en Google, y la gente ha muerto por culpa de los metadatos.\n¿No Habilitar Notificaciones? El token existe en el momento en que le das permiso de notificación\u0026hellip;\nEn el caso de Signal, el FCM token se genera y se registra en la infraestructura de Google la primera vez que GMS procesa un registro de notificación de Signal, lo cual ocurre en cuanto Signal se instala y le otorgás permisos de notificación. No necesitás recibir ningún mensaje. No necesitás enviar ninguno. El token existe en Google desde el momento en que la llamada de registro FCM de Signal se completa. Cada entrega de notificación posterior agrega un registro con timestamp a los logs de Google.\nEste no es un problema específico de Signal. Cada app en tu dispositivo Android que use FCM (que son la mayoría, si no todas) genera un token que Google almacena y mapea a tu cuenta de Google.\nSilent Push: Cuando Tu Teléfono Es Pineado para Revelar Tu Ubicación Más allá del rastro de vigilancia de FCM, los gobiernos envían una silent push notification, que es un mensaje FCM de datos de alta prioridad sin payload de notification y sin contenido visible (puede enviarse a cualquier dispositivo con un FCM token válido). El dispositivo lo recibe, GMS despierta la app objetivo mediante onMessageReceived(), y la app hace lo que sea que esté programada para hacer en respuesta. Nada aparece en tu pantalla. Sin banner, sin sonido, sin badge. Tu teléfono simplemente se despertó silenciosamente en segundo plano.\nEl valor de vigilancia proviene de lo que ocurre cuando la app despertada realiza una conexión de red. Si la app se conecta a algún servidor en respuesta al wake-up para chequear actualizaciones, sincronizar estado, etc., y ese servidor registra la dirección IP actual de tu dispositivo (que se resuelve a tu ubicación).\nEl silent push es utilizado por:\nPlataformas de marketing y analytics. Por ejemplo, si una app se desinstala, el FCM token devuelve un error NOT_REGISTERED, lo que significa que el dispositivo ya no tiene la app. Para uso de las fuerzas del orden, el camino pasa por un desarrollador de la app. Un investigador con el FCM token de un objetivo y una orden judicial que obliga al desarrollador a cooperar puede hacer que el desarrollador envíe un silent push a ese token específico. La app se despierta, se conecta a sus servidores, el servidor registra la IP. Alternativamente, la propia infraestructura FCM de Google registra los eventos de conexión del dispositivo objetivo en respuesta a la entrega, revelando la IP a Google independientemente de lo que haga la app. Entonces, cada app de Android que use FCM tiene la misma estructura: un token en Google, mapeado a tu cuenta, generando un log de entrega con cada notificación.\n¿Y Ahora Qué? Si usás Signal, cambiá la configuración de contenido de notificaciones a \u0026ldquo;No Name or Content\u0026rdquo; para cerrar la amenaza de forensia del dispositivo. La cadena \u0026quot;Signal message\u0026quot; termina en la base de datos en lugar de los nombres de los remitentes y el texto de los mensajes. Cualquiera que extraiga esa base de datos no encontrará nada útil.\nDe todas formas Google seguirá teniendo metadatos. Tu FCM registration token existe en Google independientemente de lo que diga tu configuración de contenido de notificaciones. Los timestamps de entrega se registran en Google de todas formas.\nLo único que elimina el FCM token de los registros de Google es no haberse registrado nunca con FCM desde el principio.\n","permalink":"https://danoss.me/es/categories/security/notificationes-push-pueden-seguirte/","summary":"Cómo las notificaciones push pueden seguirte sin tocar tu teléfono","title":"Las Notificaciones Push Pueden Seguirte"},{"content":"Esta historia me puso a pensar: https://www.404media.co/fbi-extracts-suspects-deleted-signal-messages-saved-in-iphone-notification-database-2/\nEl FBI recuperó mensajes de Signal del teléfono de un sospechoso, el cifrado de Signal fue roto, nada es seguro, etc. Pero no es así. El cifrado de Signal no fue vulnerado. Lo que el FBI hizo en realidad fue extraer el contenido descifrado de los mensajes del almacenamiento interno de notificaciones de Apple en el iPhone del sospechoso, lo cual no tiene nada que ver con la criptografía de Signal y sí todo que ver con cómo los teléfonos manejan las push notifications.\nAunque este caso ocurrió en un iPhone, el problema no es exclusivo de iOS. Por defecto, tanto Android como iOS escriben los mensajes de notificaciones descifrados en bases de datos del sistema que persisten tras eliminar la app y que ignoran por completo la configuración de mensajes que desaparecen. Esos datos son accesibles para cualquiera con acceso físico a tu dispositivo.\nLo Que Realmente Ocurrió En abril de 2026, 404 Media reportó el testimonio de un agente del FBI durante un juicio federal contra acusados por actividades en un centro de detención del ICE en Texas. Una de las acusadas tenía Signal instalado en su iPhone en el momento de los hechos. Para cuando los investigadores examinaron el teléfono, Signal ya había sido eliminado.\nDe todas formas recuperaron mensajes de Signal, específicamente los entrantes, a través del almacenamiento interno de notificaciones de Apple. La app ya no estaba, pero los mensajes sí.\nCómo Funciona Signal en iOS El caso del FBI involucró un iPhone, así que veamos cómo iOS maneja el almacenamiento de push notifications y Signal en particular.\nAPNs: La Infraestructura Centralizada de Push de Apple Apple Push Notification Service (APNs) es la única forma de entregar notificaciones en segundo plano a iPhones. Cada notificación remota de cada app debe pasar por los servidores de Apple antes de llegar al dispositivo.\nCuando una app se registra para push notifications, el dispositivo obtiene un APNs device token, un identificador único que Apple usa para enrutar las notificaciones a ese dispositivo específico. Los servidores de Signal guardan este token y lo usan para solicitar la entrega de notificaciones a través de Apple. A partir de ese momento, Apple es un intermediario obligatorio para cada notificación que Signal envía.\nNSE: La Notification Service Extension Signal en iOS usa una UNNotificationServiceExtension (NSE), un proceso aislado que iOS ejecuta entre la recepción de una notificación APNs y su presentación al usuario. Es como un middleware que intercepta la notificación antes de que aparezca en tu pantalla.\nAsí es como funciona el flujo:\nEl servidor de Signal envía un payload APNs a Apple con 2 cosas: un flag mutable-content: 1, que le indica a iOS que ejecute la NSE antes de mostrar nada, y un blob de texto cifrado con el contenido real del mensaje. Apple enruta este payload al dispositivo de destino. El contenido del mensaje (aunque cifrado), viaja a través de la infraestructura de Apple. Una vez que el payload llega al dispositivo, iOS ejecuta la NSE de Signal en un proceso aislado separado para descifrar el texto localmente usando las claves del Signal Protocol y llama a contentHandler() con el nombre del remitente y el texto del mensaje en texto plano y legible. iOS toma ese output descifrado, lo almacena en la base de datos de notificaciones del teléfono en /var/mobile/Library/UserNotifications/, y muestra la notificación. Esa base de datos local es lo que el FBI extrajo. Persiste tras eliminar la app, tras la expiración de los mensajes, y tras cada temporizador de mensajes que desaparecen que hayas configurado.\nCómo Funciona Signal en Android Android maneja esto de forma completamente diferente:\nLo Que Google Realmente Ve a Través de FCM Android no permite que las apps mantengan conexiones persistentes en segundo plano con sus propios servidores. Las optimizaciones de batería, App Standby, y los límites de procesos en segundo plano lo impiden. En cambio, Google centraliza toda la entrega de push a través de una única conexión persistente gestionada por Google Mobile Services (GMS).\nGMS mantiene un socket TCP siempre activo hacia los servidores de Firebase Cloud Messaging (FCM) que sobrevive a todos los estados de energía excepto cuando el dispositivo está apagado. Cada push notification de cada app pasa por este canal.\nFCM soporta 2 tipos de mensajes:\nNotification messages llevan un título y cuerpo directamente en el payload de FCM. Android puede renderizar la notificación desde ese payload sin despertar la app. El contenido viaja a través de la infraestructura FCM de Google. Los servidores de Google llevan el texto de la notificación. Data messages son los que usa Signal. Solo llevan un payload personalizado de clave-valor y requieren que la app receptora lo maneje en código. El payload del data message de Signal es esencialmente vacío, un ping de alta prioridad para despertar la app sin contenido del mensaje en absoluto. El texto real de tu mensaje nunca está en el payload de FCM en ningún punto del tránsito. Todo lo que la infraestructura de Google ve es un FCM registration token del dispositivo de destino, el identificador de la app de Signal (org.thoughtcrime.securesms), un flag de prioridad, y un timestamp. Nada más.\nEste es el contraste con iOS. En iOS, la infraestructura APNs de Apple lleva un blob cifrado. En Android, el FCM de Google no lleva nada relacionado con el contenido de tu mensaje en ningún punto del tránsito, ni siquiera texto cifrado.\nLo que Google sí tiene son metadatos de entrega: el FCM registration token de tu dispositivo, que mapea a tu cuenta de Google, y un registro con timestamp de cuándo se entregó una notificación de Signal a tu dispositivo (lo cual es útil para rastrearte, así que\u0026hellip;).\nEl Double Ratchet: Dónde Ocurre el Descifrado Cuando GMS recibe el FCM data message y despierta el FirebaseMessagingService de Signal, Signal obtiene aproximadamente una ventana de ejecución de 20 segundos. Usa esa ventana para abrir una conexión TLS a los servidores propios de Signal y obtener el payload del mensaje cifrado.\nEl cifrado es el Signal Protocol, que combina 2 mecanismos:\nX3DH (Extended Triple Diffie-Hellman) maneja el acuerdo de claves inicial cuando 2 partes establecen una conversación por primera vez. El algoritmo Double Ratchet deriva una nueva clave de cifrado para cada mensaje individual usando tanto un symmetric-key ratchet como un Diffie-Hellman ratchet. Esto significa que los mensajes pasados permanecen cifrados incluso si una clave actual se ve comprometida, porque cada paso del ratchet genera una nueva clave y descarta la anterior. Los mensajes futuros también vuelven a ser seguros una vez que el ratchet avanza tras un compromiso. Los servidores de Signal solo almacenan texto cifrado y no pueden descifrar nada. Signal no puede leer tus mensajes. El descifrado ocurre íntegramente en tu dispositivo, con claves privadas almacenadas en el hardware-backed Keystore de Android en dispositivos con secure element.\nEl Handoff: Donde el OS Toma el Control Una vez que Signal descifra el mensaje y necesita mostrártelo, llama al NotificationManager de Android. Simplificado, esa llamada se ve así:\nval notification = NotificationCompat.Builder(context, CHANNEL_ID) .setContentTitle(senderName) .setContentText(messageBody) .setSmallIcon(R.drawable.ic_notification) .build() NotificationManagerCompat.from(context).notify(notificationId, notification) En el momento en que Signal llama a .notify(), el senderName y el messageBody salen del proceso aislado de Signal y se entregan a un servicio del sistema. El OS de Android toma posesión de ellos para renderizarlos: la pantalla de bloqueo, el panel de notificaciones, los dispositivos Wear OS conectados, y el logging a nivel de sistema.\nSi configurás en Signal la opción de contenido de notificaciones a \u0026ldquo;No Name or Message\u0026rdquo;, lo que se pasa a .setContentTitle() y .setContentText() es un placeholder genérico. El OS toma posesión de ese placeholder, y nada sensible termina en ninguna base de datos.\nDónde Android Guarda Tus Notificaciones El System Notification Log Cuando Signal llama a NotificationManager.notify(), Android escribe el evento de notificación en una base de datos SQLite en /data/system/notification_log.db. Esta base de datos es propiedad del OS, no de Signal. Signal no tiene visibilidad sobre ella y no tiene forma de eliminar entradas de ella. Desde la perspectiva de Signal, no sabe que la base de datos existe.\nEl schema almacena: pkg (el nombre del paquete de la app que publica, ej. org.thoughtcrime.securesms), uid, when (timestamp Unix en milisegundos), tag, key, y los campos de contenido con los strings que Signal pasó a .setContentTitle() y .setContentText() al llamar a notify(). Si esos strings eran el nombre del remitente y el cuerpo del mensaje, eso es exactamente lo que contiene la base de datos.\nEsta base de datos es invisible para los usuarios. No hay ningún menú de Settings que la exponga y no hay forma de limpiarla manualmente a través de la interfaz de Android. Acceder a ella requiere extracción física del dispositivo mediante herramientas forenses.\nLas Notificaciones Eliminadas No Desaparecen Realmente El comportamiento de eliminación de SQLite es la razón por la que esta base de datos funciona como un artefacto forense.\nCuando SQLite elimina una fila, no sobreescribe los bytes en el disco. Marca las páginas que contienen esa fila como libres y disponibles para reutilización. Los datos permanecen ahí hasta que SQLite decide asignar esas páginas para nuevas escrituras.\nLas herramientas forenses parsean la base de datos a nivel de página, leyendo las páginas \u0026ldquo;desasignadas\u0026rdquo; para recuperar los datos de filas eliminadas. Este contenido típicamente permanece recuperable durante semanas o más, hasta que suficientes escrituras nuevas lo desplazan físicamente.\nEl FCM Queued Messages Store Por separado, los mensajes FCM no entregados se ponen en cola en una base de datos LevelDB en /data/data/com.google.android.gms/databases/fcm_queued_messages.ldb/, usada por Play Services para almacenar los payloads de FCM que llegaron mientras la app no estaba en ejecución.\nPara la mayoría de las apps que usan FCM de tipo notification, este store puede contener contenido real de notificaciones. Para Signal, es menos interesante desde el punto de vista forense. Como Signal usa FCM data-only messages con payloads vacíos, el queued message store no contiene más que pings de activación y timestamps de entrega. Metadatos útiles (que siendo honesto, hay gente que ha sido asesinada solo por metadatos), pero no contenido de mensajes.\nQué Deberías Hacer Lo que debés hacer depende de tu nivel de paranoia y cuánto querés complicarte la vida. Lo siguiente se enfoca en Android porque es lo que más manejo.\n1. Cambiá la Configuración de Notificaciones de Signal Abrí Signal -\u0026gt; Settings -\u0026gt; Notifications -\u0026gt; Show, y configuralo en \u0026ldquo;No Name or Message\u0026rdquo; Esto controla qué strings le pasa Signal a NotificationManager, lo que determina qué termina en notification_log.db. Con este cambio, el contenido de los mensajes nunca se escribe en la base de datos de notificaciones. 2. Eliminá los Permisos de Notificación de Signal por Completo Abrí Android Settings -\u0026gt; Apps -\u0026gt; Signal -\u0026gt; Notifications -\u0026gt; Off. Esto elimina los permisos de notificación de Signal a nivel del OS, lo que hace que GMS cancele el registro del FCM token de Signal y lo elimine de los registros de Google. Signal cae de nuevo a WebSocket polling. Los mensajes llegarán en segundos o hasta un minuto en lugar de instantáneamente, pero esto también elimina por completo el vector de exposición de FCM. 3. Usá una VPN Siempre enrutá tu tráfico a través de una VPN de confianza. Cualquier servidor al que se conecte tu dispositivo (incluidos los servidores FCM de Google) verá la IP del endpoint de la VPN en lugar de la tuya real. Eliminar los permisos de notificación de Signal como se describe arriba también elimina este vector de exposición, pero una VPN agrega una capa de protección para todo lo demás que corre en tu dispositivo. 4. Usá GrapheneOS Usá GrapheneOS para ir un paso más allá. GrapheneOS es un fork de Android hardened construido para hardware Google Pixel que corre sin ningún token ni infraestructura de Google. Sin GMS, sin FCM, sin pings a los servidores de Google. Signal en GrapheneOS puede usar su propia entrega de push basada en WebSocket sin ninguna participación de Google, lo que elimina esta preocupación por completo. Tené en cuenta que todo cambia constantemente, pero este post debería darte una idea de qué hacer no solo con Signal, sino con cualquier otra app. En cuanto al tema en cuestión, el cifrado de Signal no es el eslabón débil. El eslabón débil es la infraestructura en la que tu OS se apoya para mostrarte una notificación y lo que hace con ese contenido después.\n","permalink":"https://danoss.me/es/categories/security/signal-fue-hackeado-no/","summary":"Investigacion sobre la noticia de que la app de mensajería Signal fue hackeada. Respuesta corta: No","title":"Signal Fue Hackeado? No"},{"content":"Esta es una historia 100% real, no tiene ningún sentido inventarse esta mierda. He cambiado algunos detalles sin importancia para evitar identificar a la persona involucrada, por respeto.\n¿Qué Pasó? Estaba en un sofá hablando y bebiendo con un amigo, viendo la tele. A medida que avanzaba la noche y nos íbamos cansando, seguíamos charlando. En algún momento me entró un poco de sueño pero seguía consciente, así que cerré los ojos unos 5 segundos y me recosté para descansar un poco.\nCuando abrí los ojos vi la espalda de mi amigo cubierta por lo que parecía una malla gris pegada la piel (como un traje de cuerpo entero, o uno de esos trajes de compresión de nadador). Ten en cuenta que mi amigo llevaba una camiseta roja sin mangas, así que era muy raro (como en la imagen de abajo).\nMe quedé mirando su espalda durante unos 30 segundos intentando procesarlo. No podía haberse cambiado de ropa tan rápido, ¿quizás estaba alucinando? ¿Quizás se cambió y yo me olvidé? Intentaba encontrar una explicación. Cuando miré más de cerca su hombro pude ver sus tatuajes justo encima de la malla gris escamosa. Era su piel. Todo era gris, con una textura como de reptil.\nNo se me ocurrió tocarlo, algo que lamento (quizás la próxima vez, si es que hay una). Tampoco se me ocurrió tomar una foto, aunque probablemente no hubiera salido nada de todas formas.\nMi amigo había estado hablando superficialmente sobre un tema muy pesado, una experiencia traumática que lo dejó triste y ansioso, pero sin profundizar. Mantuve la boca cerrada sobre lo que estaba viendo y simplemente escuché por respeto.\nCuando el tema pasó a otra cosa, la piel gris escamosa se disolvió y volvió el tono de piel normal. Unos minutos después lo miré a la cara y vi de nuevo la misma piel gris reptiliana, pero solo en la mitad de su cara. Sus rasgos faciales seguían siendo humanos, eso sí.\nComo ya no estábamos hablando del tema pesado, tenía curiosidad por saber si él seguía pensándolo. Le pregunté varias veces si estaba guardando algo para sí mismo, no quería ir por ahí, rondaba otras experiencias traumáticas pero yo sabía que esa no era la fuente del pensamiento oscuro, así que seguí insistiendo. Se asustó de verdad al creer que le estaba leyendo la mente.\nCada vez que sus pensamientos volvían a ese tema pesado, los parches de piel reptiliana regresaban. Cada vez que pasaba o se distraía, se desvanecían (básicamente podía saber cuándo se iba a un lugar oscuro mentalmente).\nNunca tuve miedo, solo curiosidad por lo que estaba viendo.\nMi Teoría sobre los Reptilianos Quizás los famosos reptilianos no son seres que cambian de forma y se convierten en humanos para controlar el mundo. Por lo que vi, podrían ser entidades que se manifiestan a través del sufrimiento humano y usan a personas vulnerables para generar más sufrimiento.\nQuizás no todos son malos. Quizás algunos son neutrales o incluso buenos. Quizás no existen en absoluto y yo simplemente estaba muy cansado, pero no lo creo (dado a lo sorprendido que quedó mi amigo al ver que le estaba leyendo los pensamientos y la profundidad con la que ahondé en el trauma).\nAlgo interesante que vale la pena mencionar es que la piel reptiliana no era \u0026ldquo;verde\u0026rdquo; como se muestra en internet. Era más gris, más cercana a la piel de un pez que a la de un reptil, o algo entre ambas. ¿Me estoy volviendo loco? Quizás\u0026hellip;\n","permalink":"https://danoss.me/es/categories/others/vi-un-reptiliano/","summary":"Historia real sobre mi experiencia con un reptiliano\u0026hellip; o talvez me estoy volviendo loco?","title":"Vi Un Reptiliano?"},{"content":" Versión revisada y mejorada del post original: Controles de Xbox en Fedora Linux\nNormalmente, los Xbox Controllers (en mi caso, Xbox Core Wireless Gaming Controller — quizás lo actualice en el futuro) funcionan de inmediato. Sin embargo, si por alguna razón no funciona, sigue leyendo.\nEn mi caso, el Xbox Controller funcionaba con normalidad y dejó de funcionar después de una actualización mayor del sistema. El SO podía detectar el dispositivo (udevadm monitor mostraba la conexión) pero Steam no reconocía ninguna entrada del Controller.\nDetectando el Problema El controller se empareja correctamente vía Bluetooth o se conecta vía USB. El kernel detecta el dispositivo conectándose y desconectándose (vía udevadm monitor). Steam no muestra ninguna entrada del controller en absoluto. Cómo Linux Maneja los Xbox Controllers Como todo en Linux, todo se maneja a través de varias capas.\nEl Linux Input Stack Cuando conectas un controller a un sistema Linux, la entrada pasa por varios subsistemas antes de llegar al juego. Esto es lo que sucede:\nEl dispositivo controller se conecta a través de una capa de transporte (USB o Bluetooth) El kernel carga el driver module (kernel module) apropiado para ese tipo específico de dispositivo. El driver traduce los datos crudos del dispositivo en eventos de entrada estándar de Linux, que se exponen a través de nodos de dispositivo en /dev/input. Aplicaciones como Steam leen esos nodos de dispositivo y pasan los datos a los juegos. Si alguna de estas capas falla (driver faltante, permisos incorrectos, reglas udev faltantes, etc.) el controller no funcionará, incluso si es detectado por el kernel.\nConexiones USB vs Bluetooth El driver que usa tu Xbox controller depende de cómo lo conectes, esto es importante al saber dónde buscar cuando estás solucionando problemas.\nLas conexiones USB usan el xpad kernel module (parte del paquete kernel-modules-extra en Fedora). Este es el driver del kernel de Linux in-tree escrito específicamente para Xbox controllers conectados por USB y maneja Xbox, Xbox 360, Xbox One y Xbox Series controllers cuando se conectan vía USB. Las conexiones Bluetooth no usan xpad, en su lugar usan el perfil estándar Bluetooth HID. El kernel maneja esto a través del driver hid-generic (o el driver de terceros hid-xpadneo si está instalado). Xbox Wireless Adapter (Wi-Fi Direct) es una tercera opción. El Xbox Wireless Adapter propietario usa Wi-Fi Direct, no Bluetooth, y requiere el driver xone (disponible aquí) o el antiguo daemon xow. El Input Event Pipeline Una vez que el driver correcto se carga y procesa los datos crudos del dispositivo, el kernel expone el controller en /dev/input/:\nLa legacy Joystick API crea dispositivos /dev/input/jsX. Esta es la interfaz antigua. Algunos juegos y herramientas más viejos aún la usan, pero proporciona menos información sobre botones y ejes disponibles. La evdev API crea dispositivos /dev/input/eventX. Esta es la interfaz moderna. Proporciona más información (estados de botones, valores de ejes, force feedback) y es lo que la mayoría de los juegos modernos esperan. Puedes ver ambos nodos de dispositivo para un controller conectado:\nls -la /dev/input/by-id/ | grep -i xbox # Legacy Joystick API: # usb-Microsoft_Controller_XXXX-joystick -\u0026gt; ../js0 # evdev API: # usb-Microsoft_Controller_XXXX-event-joystick -\u0026gt; ../event16 Ambas interfaces se crean desde el mismo driver. Si ninguna existe, el driver no se cargó. Si solo una existe, algo está parcialmente roto. Si ambas existen pero tu juego no detecta nada, el problema podría ser reglas udev o la configuración de entrada de la aplicación.\nPor Qué las Actualizaciones de Fedora Rompen el Soporte de Xbox Controller Empaquetado de Kernel Modules en Fedora Fedora divide los kernel modules en múltiples paquetes.\nLos paquetes base kernel y kernel-modules contienen módulos necesarios para el hardware más común (controladores de almacenamiento, adaptadores de red, sistemas de archivos, drivers de pantalla), mientras que el paquete kernel-modules-extra contiene módulos opcionales para hardware menos común, como xpad.\nCada versión del kernel tiene su propio paquete kernel-modules-extra correspondiente. Cuando instalas kernel-modules-extra-6.12.5-200.fc41.x86_64, esos módulos solo funcionan con el kernel 6.12.5-200.fc41. Instala un nuevo kernel y esos módulos son inútiles, necesitas el kernel-modules-extra correspondiente para la nueva versión del kernel.\n¿Qué Sucede Durante una Actualización del Sistema? Durante una actualización mayor de versión de Fedora (por ejemplo, Fedora 43 a 44), dnf system-upgrade descarga e instala paquetes para la nueva versión.\nLa nueva versión trae un nuevo kernel. Si kernel-modules-extra fue instalado explícitamente (ejecutaste dnf install kernel-modules-extra en algún momento), DNF también debería instalar el paquete correspondiente para el nuevo kernel, pero no siempre.\nSi el soporte de xpad fue incluido a través de una cadena de dependencias que cambió entre versiones, o si el paquete fue instalado como una weak dependency, o si hubo un conflicto durante la transacción de actualización, kernel-modules-extra puede desaparecer silenciosamente. El sistema arranca bien porque xpad no es esencial, es solo un driver de gamepad, así que solo lo notarás cuando intentes usar el controller.\nPor Qué \u0026ldquo;udevadm monitor\u0026rdquo; Es Engañoso El comando udevadm monitor muestra el dispositivo controller conectándose, pero eso no significa que esté funcionando. La salida solo muestra actividad del bus USB (es decir, el kernel solo detectó que el dispositivo fue conectado).\nKERNEL[12345.678] add /devices/pci0000:00/.../usb1/1-2 (usb) UDEV [12345.690] add /devices/pci0000:00/.../usb1/1-2 (usb) Lo que realmente quieres verificar es si un driver se vinculó al dispositivo:\n# Verificar si xpad reclamó el dispositivo (USB) lsusb -t | grep xpad # O verificar en dmesg la vinculación del driver dmesg | grep -i xpad Si xpad no está cargado, estos comandos no devuelven nada. El dispositivo es visible en el bus pero está huérfano, sin driver que traduzca sus datos en eventos de entrada.\nLa Solución Para Conexiones USB (xpad) Verificar si el Module Está Cargado:\nSi esto no devuelve nada, el module no está cargado. Luego, necesitas cargar el module (si está instalado) o instalarlo. lsmod | grep xpad Instalar el Kernel Module Faltante:\nEl module xpad está incluido en el paquete kernel-modules-extra. Instala este paquete si no lo tienes. sudo dnf install kernel-modules-extra Cargar el Module y Verificar:\nDespués de instalar, reconecta tu Xbox controller (desconecta y vuelve a conectar el USB) y verifica: lsmod | grep xpad # Salida esperada: # xpad 32768 0 # ff_memless 20480 1 xpad Si el Module No se Carga Automáticamente, Cárgalo Manualmente:\n# Cargar el module manualmente sudo modprobe xpad Hacerlo Persistente Entre Reinicios:\nEsto le indica a systemd-modules-load.service que cargue xpad al arrancar, sin importar si hay un dispositivo correspondiente conectado. Normalmente udev maneja esto automáticamente (carga el driver correcto cuando se detecta un dispositivo correspondiente), pero hacerlo explícito asegura que siempre esté disponible. # Asegurar que el module se cargue automáticamente al arrancar sudo bash -c \u0026#39;echo \u0026#34;xpad\u0026#34; \u0026gt; /etc/modules-load.d/xpad.conf\u0026#39; Para Conexiones Bluetooth Si te conectas vía Bluetooth y el controller se empareja pero no produce entrada, el problema podría ser de hid-generic.\nVerificar si el Dispositivo HID fue Creado:\n# Buscar dispositivos HID del Xbox controller ls /dev/input/by-id/ | grep -i xbox # O verificar en dmesg la vinculación HID dmesg | grep -i \u0026#34;xbox\\|045e\u0026#34; Para Xbox Series Controllers (firmware 5.x+), Verificar que uhid Esté Disponible:\nzgrep UHID /proc/config.gz # Debería mostrar: CONFIG_UHID=y o CONFIG_UHID=m Si uhid está compilado como module, asegúrate de que esté cargado:\nlsmod | grep uhid Instalar xpadneo para soporte completo de funciones por Bluetooth:\nEl driver básico hid-generic te da entrada de botones y sticks por Bluetooth, pero sin rumble, sin reporte de batería, y a veces comportamiento extraño. Para una mejor experiencia, instala el driver xpadneo:\nsudo dnf install dkms kernel-devel git clone https://github.com/atar-axis/xpadneo cd xpadneo sudo ./install.sh Esto instala un module DKMS que se reconstruye automáticamente contra nuevos kernels. Maneja force feedback, estado de batería, trigger rumble, y varias peculiaridades del controller que hid-generic ignora.\nCasos de Uso y Drivers Gaming casual con Steam en Fedora (cable USB): Instala kernel-modules-extra, conecta tu Xbox controller, abre Steam. Eso es todo. El driver xpad maneja todo, Steam Input se encarga del resto. Este es el camino más simple y el más confiable.\nGaming inalámbrico vía Bluetooth: Empareja el controller a través de GNOME Settings o bluetoothctl. La entrada básica funciona a través de hid-generic. Para rumble y reporte de batería, instala xpadneo vía DKMS. Si usas Secure Boot, necesitarás firmar el module DKMS o registrar una Machine Owner Key (MOK).\nGaming de sofá con múltiples controllers: Cada controller conectado obtiene su propio par /dev/input/eventX y /dev/input/jsX. Steam maneja múltiples controllers de forma nativa. La única preocupación es el ancho de banda de Bluetooth si conectas 4 controllers inalámbricamente — un adaptador USB Bluetooth dedicado con soporte BLE ayuda.\nEmulación retro (RetroArch, Dolphin, PCSX2): Estos emuladores típicamente usan la gamepad API de SDL2, que lee desde evdev. Si el driver del kernel está funcionando y el dispositivo está en /dev/input/, los emuladores deberían detectarlo automáticamente. RetroArch tiene su propia selección de input driver — asegúrate de que esté configurado para usar udev (no linuxraw) para acceso evdev.\nPara Terminar Este post muestra información más detallada sobre cómo el Xbox controller interactúa con el kernel y pasos para solucionar problemas. Un poco mejor que la versión anterior creo. Espero que le sirva a alguien.\n","permalink":"https://danoss.me/es/categories/linux/controles-xbox-en-fedora-linux-2/","summary":"Solución de problemas de los mandos de Xbox en Fedora Linux (y distribuciones similares) - 2 mas info","title":"Controles de Xbox en Fedora Linux 2"},{"content":"Parte 3 de 4\u0026hellip;¿o 5?\nEsta parte trata sobre cómo las redes corporativas o de censura usan inspección profunda de paquetes (DPI) para detectar y bloquear tráfico VPN, y cómo ocultar el hecho de que estás usando una VPN.\nLa siguiente parte será más práctica con casos de uso, dispositivos y configuraciones específicas para evadir la censura.\nLa configuración y los ejemplos aquí son de Mullvad VPN (WireGuard) con Fedora Linux. En el futuro, agregaré ejemplos usando distros basadas en Debian.\nFugas de DNS Instalaste Mullvad y la VPN está funcionando, todo parece bien. ¿O no?\nIncluso si tienes tu VPN activa y funcionando, una fuga de DNS puede deshacer silenciosamente la privacidad que crees tener.\nUna fuga de DNS ocurre cuando las consultas DNS de tu dispositivo evitan el túnel VPN y se envían a tu ISP u otros servidores DNS de terceros, exponiendo potencialmente los sitios web que visitas. Tu tráfico está cifrado, tu IP está oculta, pero tus consultas DNS siguen mapeando toda tu sesión de navegación en los registros de tu ISP.\nCuando visitas un sitio web, tu dispositivo primero resuelve el nombre de dominio en una dirección IP. Esa resolución es una consulta DNS, y necesita ir a algún lugar. Una VPN correctamente configurada envía esas consultas a través de la interfaz cifrada y las resuelve en los servidores DNS del proveedor de VPN. Tu ISP nunca debería ver qué dominios estás consultando.\nPor Qué Ocurren las Fugas de DNS Culpable 1: systemd-resolved\nEn Linux, el culpable suele ser systemd-resolved mal configurado para la interfaz VPN.\nsystemd-resolved es un servicio del sistema integrado en la mayoría de las distros Linux modernas que actúa como un resolver DNS centralizado para todo el sistema operativo. En lugar de que cada aplicación haga sus propias consultas DNS directamente, todas pasan por systemd-resolved.\nCuando la app de Mullvad se conecta, registra su servidor DNS (10.64.0.1) y el dominio de enrutamiento ~. con systemd-resolved (básicamente diciéndole: \u0026ldquo;para todas las búsquedas de dominio, usa esta interfaz\u0026rdquo;). Si ese registro no ocurre correctamente, systemd-resolved recurre al DNS que obtuvo por DHCP, que típicamente es tu router, que típicamente es tu ISP.\nCompruébalo:\nresolvectl status # Bajo la interfaz wg0-mullvad, quieres ver: # Current DNS Server: 10.64.0.1 # DNS Domain: ~. Si ves ~. bajo la interfaz VPN, todas las consultas DNS se enrutan ahí. Si no, tienes una fuga.\nIncluso sin fugas, tú controlas qué resolver DNS maneja tus consultas dentro del túnel. Mullvad usa por defecto su propio resolver (10.64.0.1), pero podrías tenerlo configurado con uno personalizado como Cloudflare. Ambos se enrutan a través de la VPN, así que tu ISP no ve nada en ningún caso; la única diferencia es qué tercero resuelve tus dominios. Cloudflare es más rápido y está distribuido globalmente, pero es una empresa comercial con sede en EE.UU. El resolver de Mullvad es sin registros, con sede en Suecia, y ya está dentro de tu perímetro de confianza ya que tu tráfico pasa por ellos de todos modos. Puedes cambiar y verificar con:\n# Comprueba tu configuración actual mullvad dns get # Cambia al resolver de Mullvad mullvad dns set default # Usa el resolver DNS de Cloudflare mullvad dns set custom 1.1.1.1 1.0.0.1 # Verifica qué resolver ve Mullvad (vacío = DNS personalizado) curl https://am.i.mullvad.net/dns # Comprobación completa de conexión: IP, DNS, estado de VPN curl https://am.i.mullvad.net/json Culpable 2: Configuración del Navegador\nEl segundo culpable común es tu navegador. Tanto Chrome como Firefox soportan DoH (DNS-over-HTTPS), que permite al navegador manejar la resolución DNS completamente por su cuenta, evitando el resolver del sistema.\nEl Secure DNS de Chrome funciona en modo automático por defecto: intenta actualizar tu proveedor DNS configurado en el sistema a DoH si ese proveedor está en su lista conocida (Google, Cloudflare, NextDNS, etc.). Si tu sistema operativo ya apunta a Google DNS, Chrome resolverá vía 8.8.8.8 sobre DoH (fuera del túnel VPN). Firefox usa Cloudflare DoH por defecto. En cualquier caso, ninguno pasa por tu VPN por defecto.\nPara prevenir fugas, desactiva DoH en tu navegador por completo, o apúntalo al endpoint DoH de tu proveedor de VPN. Mullvad tiene dns.mullvad.net, que bloquea anuncios, no guarda registros y está disponible sobre DoH/DoT.\nPrueba externamente en dnsleaktest.com. Si los servidores de tu ISP aparecen en los resultados, tienes una fuga, y necesitas arreglarla.\nEl diagrama de abajo muestra los 2 caminos que pueden tomar las consultas DNS:\nCómo las Redes Saben que Estás Usando una VPN Los equipos de IT usan firewalls con Deep Packet Inspection (DPI) que inspeccionan paquetes y analizan el contenido, estructura y temporización del tráfico para identificar protocolos por su huella.\nEl problema aquí es que WireGuard tiene una huella fácil de identificar. El mensaje de inicio de handshake de WireGuard es exactamente de 148 bytes y la respuesta es de 92 bytes. Estas son constantes definidas en la especificación de WireGuard. Más allá del handshake, el tráfico de WireGuard tiene patrones consistentes: siempre es UDP, los intervalos de keepalive ocurren cada 25 segundos por defecto, y la distribución de payload tiene una estructura particular. Cualquier sistema DPI con una regla para WireGuard puede identificar esta huella al instante y marcarla.\nEsto importa en 3 escenarios:\nRedes Corporativas Con Firewalls de Nueva Generación: Palo Alto y firewalls DPI similares tienen firmas de WireGuard en sus conjuntos de reglas. Un equipo de IT puede bloquear fácilmente WireGuard (o cualquier protocolo VPN) con una sola regla. Países Restrictivos: Países con restricciones de red dependen de sistemas DPI para identificar y bloquear tráfico VPN. El propio Mullvad señala que WireGuard está bloqueado en China. Throttling del ISP: Algunos ISPs ralentizan el tráfico VPN basándose en la identificación del protocolo sin bloquearlo completamente. Por ejemplo, tu VPN funciona pero se vuelve lenta después de cierto umbral de datos. Ocultando el Hecho de que Estás Usando una VPN La ofuscación no está integrada en WireGuard, así que debes agregar una capa de ofuscación encima.\nPor ejemplo, Mullvad proporciona estos métodos de ofuscación (anti-censura) para evadir restricciones DPI:\nShadowsocks envuelve el tráfico WireGuard dentro de un flujo proxy ofuscado. El tráfico resultante parece bytes cifrados aleatorios sin firma de protocolo identificable (sin headers de handshake de WireGuard, sin puerto consistente, sin comportamiento exclusivamente UDP). Para un sistema DPI, es indistinguible de TLS o cualquier otro flujo cifrado. udp2tcp envuelve paquetes UDP de WireGuard dentro de un flujo TCP. Útil en redes que bloquean UDP por completo. La contrapartida es el rendimiento ya que pierdes la velocidad de UDP. Úsalo cuando lo necesites, no como configuración por defecto. QUIC tuneliza WireGuard dentro de frames QUIC (otro transporte de ofuscación que es más difícil de identificar que UDP puro y más difícil de bloquear que los transportes basados en TCP). LWO (Lightweight Obfuscation) es la opción con menor sobrecarga, con transformación mínima de paquetes, sin capa proxy. Puedes usar esto en entornos donde WireGuard plano se bloquea pero Shadowsocks completo parece excesivo. Cambio de puerto de WireGuard es el más ligero de todos. Algunas redes bloquean el puerto por defecto de WireGuard (51820/UDP) pero dejan otros puertos UDP abiertos. wireguard-port te permite cambiar a un puerto diferente sin sobrecarga de ofuscación (útil cuando el problema es un simple bloqueo de puerto en vez de DPI real). Modo auto deja que la app pruebe métodos en orden de sobrecarga hasta que uno conecte. Útil si no sabes exactamente qué está bloqueando la red y no quieres adivinar manualmente. # Comprueba el estado actual de anti-censura mullvad status # Lista completa de modos disponibles: auto, off, wireguard-port, udp2tcp, shadowsocks, quic, lwo mullvad anti-censorship set mode auto # deja que la app lo descifre mullvad anti-censorship set mode shadowsocks # mejor evasión de DPI mullvad anti-censorship set mode udp2tcp # para redes que bloquean UDP mullvad anti-censorship set mode quic # WireGuard sobre QUIC/HTTP3 mullvad anti-censorship set mode lwo # ofuscación ligera de headers mullvad anti-censorship set mode off # volver a WireGuard plano # Establece el puerto de WireGuard a uno diferente mullvad anti-censorship set wireguard-port 4440 # Cada método tiene su propio subcomando para configuración avanzada por método mullvad anti-censorship set shadowsocks --help mullvad anti-censorship set udp2tcp --help Mullvad también tiene una función llamada DAITA (Defense Against AI-guided Traffic Analysis), que en lugar de evadir DPI, combate el análisis de tráfico usando machine learning. Agrega datos ficticios aleatorios al tráfico VPN para evitar que los sistemas reconozcan el tráfico VPN al correlacionar la temporización, tamaño y patrones de los paquetes.\nAsí se ve usando el método de ofuscación shadowsocks en una red con censura:\nQue Sigue? Este es un buen punto de parada para la siguiente parte que será más práctica con diferentes casos de uso. Planeo hacer algunas configuraciones específicas y dispositivos así que tomará más tiempo.\nPartes Anteriores:\nParte 1: Entendiendo VPNs Parte 1. Parte 2: Entendiendo VPNs Parte 2. ","permalink":"https://danoss.me/es/categories/security/entendiendo-vpns-parte-3/","summary":"Parte 3 de una serie de escritos sobre VPNs","title":"Entendiendo VPNs Parte 3"},{"content":"Parte 2 de una serie de 3 partes sobre VPNs.\nEsta parte se enfoca con más profundidad en las VPNs. Usaré mi configuración real de Mullvad VPN en Fedora Linux para ver qué sucede cuando te conectas, cómo el kernel maneja el tráfico, etc.\nEste post no es un ad de Mullvad, sino escritos de parte de un usuario.\nQué Sucede Cuando te Conectas Este es el flujo de una conexión a internet normal vs. una que pasa por una VPN:\nNota que con una VPN, el tráfico primero llega a la interfaz wg0, se encripta, y luego va a la interfaz de red real como un paquete encriptado. El ISP solo ve el paquete externo. Todo lo que está dentro está encriptado.\nAhora vamos a configurar esto.\nInstalando Mullvad en Linux Yo uso Fedora, pero esto funciona en cualquier distro de Linux. Hay dos formas de ejecutar Mullvad: usando la app oficial (desde https://mullvad.net/) (que maneja todo por ti), o usando las herramientas crudas de WireGuard (que te da control total).\nFedora tiene WireGuard integrado directamente en el kernel, así que no se necesita ninguna dependencia de terceros.\nLa App Oficial de Mullvad Para instalar la app oficial de Mullvad en Fedora Linux sigue los pasos de: https://mullvad.net/en/help/install-mullvad-app-linux#fedora.\n# Agregar el repositorio oficial de Mullvad sudo dnf config-manager addrepo --from-repofile=https://repository.mullvad.net/rpm/stable/mullvad.repo # Instalar la app oficial sudo dnf install mullvad-vpn Después de la instalación, inicia sesión y conéctate usando el CLI (también puedes hacerlo con la GUI).\n# Iniciar sesión con tu ID de cuenta de Mullvad (lo obtienes al registrarte) mullvad account login 123456789 # Ver información de la cuenta (número de cuenta, vencimiento, nombre del dispositivo) mullvad account get # Establecer tu país preferido (Suecia en este ejemplo) mullvad relay set location se # Conectar mullvad connect # Ver estado (relay, funcionalidades, ubicación) mullvad status La app oficial crea la interfaz WireGuard, configura el enrutamiento, establece el kill switch, maneja el DNS, todo. Muy útil.\nLo que Crea la App Cuando Mullvad se conecta, crea una interfaz WireGuard. Puedes verla así:\nip link show type wireguard # Salida 42: wg0-mullvad: \u0026lt;POINTOPOINT,UP,LOWER_UP\u0026gt; mtu 1380 qdisc noqueue state UNKNOWN Lo mismo que arriba pero viendo la interfaz específica.\nip addr show wg0-mullvad # Salida 42: wg0-mullvad: \u0026lt;POINTOPOINT,UP,LOWER_UP\u0026gt; mtu 1380 qdisc noqueue state UNKNOWN También puedes revisar la configuración de WireGuard (puede que necesites instalar el paquete wireguard-tools si no lo tienes).\nsudo wg show # Salida interface: wg0-mullvad public key: \u0026lt;tu llave pública\u0026gt; private key: (oculta) listening port: 42069 fwmark: 0xca6c peer: \u0026lt;llave pública del servidor de Mullvad\u0026gt; preshared key: (oculta) endpoint: (ip:puerto) allowed ips: 0.0.0.0/0, ::/0 latest handshake: hace 8 segundos transfer: 145.67 MiB recibidos, 12.34 MiB enviados Algunas cosas a notar en la salida:\nallowed ips: 0.0.0.0/0, ::/0: Esto significa que TODO el tráfico (IPv4 e IPv6) debe pasar por este peer. Es un túnel completo. latest handshake: Debe ser reciente. Si esto está en blanco o es antiguo, el túnel no está funcionando. Interfaces de Red Virtuales (wg0-mullvad) Mullvad crea automáticamente la interfaz de red virtual wg0-mullvad para la VPN.\nEn Linux, hay 2 tipos principales de interfaces virtuales usadas por las VPNs:\nTUN (Capa 3): Maneja paquetes IP crudos. Sin encabezados Ethernet. Esto es lo que usa OpenVPN. El kernel envía un paquete IP a la interfaz TUN, y un programa en espacio de usuario (OpenVPN) lo lee desde un descriptor de archivo en /dev/net/tun, lo encripta, y lo envía por un socket regular.\nWireGuard (Módulo del Kernel): WireGuard no usa TUN. Registra su propio tipo de interfaz directamente en el kernel. Cuando creas una interfaz WireGuard, el módulo del kernel mismo maneja la encriptación. Sin intervención del espacio de usuario.\nEsta distinción importa para el rendimiento, ya que cada cambio de contexto entre el kernel y el espacio de usuario cuesta ciclos de CPU. Por eso WireGuard es más rápido que OpenVPN.\nPuedes verificar que el módulo del kernel de WireGuard está cargado.\nlsmod | grep wireguard # Salida wireguard 126976 0 libcurve25519 65536 1 wireguard ip6_udp_tunnel 16384 2 wireguard,vxlan udp_tunnel 40960 2 wireguard,vxlan Rastreando un Paquete Desde tu Navegador Hasta el Cable Esto es lo que sucede cuando visitas un sitio web mientras estás conectado a Mullvad.\nDigamos que tu navegador solicita example.com (93.184.216.34).\nLa Aplicación Envía Datos\nTu navegador llama a send(). La pila TCP/IP del kernel crea un paquete:\nIP de origen: 10.66.X.X (tu IP del túnel) IP de destino: 93.184.216.34 El Kernel Consulta la Tabla de Enrutamiento\nMullvad usa enrutamiento por políticas, así que la ruta por defecto de la VPN vive en una tabla separada (no en la principal). El kernel revisa primero las reglas de políticas.\n# Mostrar Reglas de Política # Las reglas de política desvían el tráfico sin marca a la tabla de enrutamiento de la VPN ip rule show # Salida 0: from all lookup local 32765: not from all fwmark 0x6d6f6c65 lookup 1836018789 32766: from all lookup main 32767: from all lookup default # Mostrar Tabla de Enrutamiento de la VPN # La tabla de enrutamiento de la VPN envía todo a través del túnel ip route show table 1836018789 # valor de la tabla del output anterior # Salida default dev wg0-mullvad scope link # Mostrar Tabla de Enrutamiento Principal # La tabla principal aún tiene tu gateway real (para el tráfico del servidor VPN) $ ip route show # Salida default via 192.168.1.1 dev wlan0 10.66.0.0/16 dev wg0-mullvad proto kernel scope link src 10.66.X.X 192.168.1.0/24 dev wlan0 proto kernel scope link src 192.168.1.100 Como nuestro paquete hacia 93.184.216.34 (example.com) no tiene la marca 0x6d6f6c65, coincide con la regla 32765 así que se enruta a través de la tabla VPN 1836018789 → interfaz wg0-mullvad, donde WireGuard lo encripta y le pone la marca.\nEsa marca es la forma del kernel de decir \u0026ldquo;este paquete ya fue procesado.\u0026rdquo; En su segundo paso por las reglas de política, la marca hace que la regla 32765 lo omita, dejándolo caer hasta la tabla principal y salir por el gateway real, esta vez dirigido al servidor de Mullvad, no a example.com.\nTu ISP no ve más que tráfico UDP encriptado con destino a una IP de Mullvad.\nDiagrama para Mostrar este Proceso Más Fácilmente\nCómo Mullvad Maneja el Enrutamiento (fwmarks) Un bucle de enrutamiento es lo que ocurre cuando un paquete sigue siendo enviado a través del túnel VPN indefinidamente — el túnel intenta enviar tráfico a través de sí mismo, lo cual crea otro paquete que necesita pasar por el túnel, que crea otro, y así sucesivamente. Mullvad resuelve esto con marcas de firewall (fwmark) y enrutamiento por políticas, lo cual es más limpio que la solución ingenua de agregar una ruta estática para cada IP de servidor VPN.\nMullvad establece fwmark: 0xca6c en la interfaz WireGuard (wg0-mullvad), pero la lógica de enrutamiento se basa en una marca separada (0x6d6f6c65) aplicada a los paquetes que ya están encriptados y destinados al servidor VPN.\n# Reglas de enrutamiento por políticas ip rule show # Salida 0: from all lookup local 32765: not from all fwmark 0x6d6f6c65 lookup 1836018789 32766: from all lookup main 32767: from all lookup default # Lo que vive en la tabla de enrutamiento de la VPN ip route show table 1836018789 # Salida default dev wg0-mullvad scope link La ruta por defecto de la VPN vive en una tabla separada (1836018789), no en la tabla de enrutamiento principal. La tabla principal mantiene tu gateway original intacto. La regla de política es lo que decide qué tabla usa un paquete:\nTu app envía un paquete sin marca La regla 32765 coincide: \u0026quot;¿sin marca 0x6d6f6c65? → usar tabla VPN 1836018789\u0026quot; La tabla VPN 1836018789 lo envía por la interfaz wg0-mullvad, donde se encripta y se le estampa 0x6d6f6c65 El paquete encriptado vuelve a pasar por las reglas, esta vez la regla 32765 lo omite, cae hasta la tabla principal, y sale por wlan0 hacia tu ISP con destino al servidor de Mullvad. Esto previene bucles de enrutamiento sin IPs de servidor hardcodeadas. Si Mullvad cambia de servidores o cambias de ubicación, nada se rompe — la lógica está basada en marcas de paquetes, no en destinos.\nEste mismo mecanismo es lo que hace posible el split tunneling. Para evitar la VPN en una app específica, Mullvad marca su tráfico con 0x00000f41 (para el rastreo de conexiones) y 0x6d6f6c65 (para el enrutamiento), lo cual le permite saltarse la tabla VPN y salir por la interfaz normal. Así es exactamente como funciona ejecutar Mullvad y Tailscale simultáneamente On Mullvad VPN and Linux\u0026hellip; and Tailscale — las reglas de nftables marcan el tráfico de Tailscale con esas mismas marcas, así que se enruta fuera del túnel mientras todo lo demás permanece encriptado.\nMás información sobre split tunneling: https://mullvad.net/en/help/split-tunneling-with-the-mullvad-app\nLa Funcionalidad Kill Switch Un kill switch evita que el tráfico se filtre si el túnel VPN se cae. Cuando el kill switch de Mullvad está activo, Mullvad crea reglas de nftables (o iptables) que bloquean todo el tráfico que no pase por la interfaz VPN.\nRevisar el estado del kill switch de Mullvad.\nmullvad lockdown-mode get # Salida Block traffic when the VPN is disconnected: on Activar el kill switch de Mullvad.\nmullvad lockdown-mode set on Con esta funcionalidad, si el túnel WireGuard se cae, ya no hay interfaz wg0-mullvad. Todo el tráfico de las apps choca con la regla \u0026ldquo;BLOQUEAR todo lo demás\u0026rdquo;. Nada se filtra. Ninguna consulta DNS va a tu ISP. Ningún tráfico de aplicaciones sale sin encriptar. Nada.\nLa Siguiente Parte Para la parte 3, el plan es ir más en profundidad, filtraciones de DNS en VPNs, técnicas para evitar la inspección profunda de paquetes, especialmente para entornos donde las conexiones VPN son activamente detectadas y bloqueadas. Redes corporativas, firewalls, etc.\n","permalink":"https://danoss.me/es/categories/security/entendiendo-vpns-parte-2/","summary":"Parte 2 de una serie de escritos sobre VPNs (enfocado en Mullvad VPN)","title":"Entendiendo VPNs Parte 2"},{"content":"¿Qué son las VPNs?\nUna VPN (Virtual Private Network) es una herramienta que hay que usar hoy en día, o la usas o aceptas que tu ISP, gobierno, y cada empresa de publicidad del mundo sabe exactamente lo que haces en Internet.\nEsta es la Parte 1 de una serie de escritos sobre VPNs. Esta cubre los conceptos básicos: qué es una VPN, cómo te protege, qué hace bueno a un proveedor de VPN, y por qué las VPNs gratuitas son peores que no usar nada en absoluto.\nfuente de imagen: https://howtofix.guide/vpn/.\nPor Qué Importa la Privacidad La privacidad en Internet ha estado bajo ataque durante muchos años. Los gobiernos quieren saber lo que haces en línea para evitar que los manifestantes se levanten. Los ISPs (Internet Service Providers) quieren vender y compartir lo que haces en línea para ganar dinero. Los anunciantes quieren perfilar lo que haces en línea para mostrarte anuncios relevantes. Y los data brokers quieren empaquetar todo lo anterior y venderlo a quien pague.\nUna VPN no resolverá todos los problemas de privacidad (nada lo hará), pero tapa un hueco enorme. Elimina el espionaje de tu ISP al cifrar tu conexión a Internet y enrutarla a través de un servidor que tú eliges (como un forward proxy). En lugar de que tu ISP vea que visitaste example.com, ve tráfico cifrado yendo a una dirección IP de un servidor VPN. Eso es todo. Saben que usas una VPN, pero no pueden ver lo que hay dentro del túnel (el proveedor de VPN sí puede, así que elige bien).\nQué Hace Realmente una VPN Una VPN crea un túnel cifrado entre tu dispositivo y un servidor VPN. Todo tu tráfico de Internet pasa a través de este túnel antes de llegar a la Internet pública.\nCuando te conectas a una VPN, ocurren varias cosas. Primero, tu cliente VPN en tu dispositivo (computadora, teléfono, etc.) establece una conexión cifrada con un servidor VPN usando un protocolo como WireGuard u OpenVPN. Esto implica un handshake criptográfico donde tu dispositivo y el servidor se autentican mutuamente y acuerdan claves de cifrado de sesión.\nUna vez que el túnel está activo, tu dispositivo crea una interfaz de red virtual y todo el tráfico saliente se enruta a través de esta interfaz. El cliente VPN cifra cada paquete, lo envuelve en un nuevo paquete UDP (o TCP) dirigido al servidor VPN, y lo envía a través de tu interfaz de red real. Esto se llama encapsulación: estás poniendo un paquete cifrado dentro de un paquete normal.\nEn el lado del servidor, ocurre lo inverso. El servidor VPN recibe el paquete exterior, elimina la encapsulación, descifra el paquete interior, y lo reenvía al destino en la Internet pública. La respuesta sigue el mismo camino de vuelta: el servidor de destino envía su respuesta al servidor VPN, el servidor VPN la cifra, la envía a través del túnel a tu dispositivo, y tu dispositivo la descifra.\nEntonces una VPN proporciona estos beneficios:\nTu Dirección IP Está Oculta: Los sitios web y servicios a los que te conectas ven la dirección IP del servidor VPN, no la tuya. Esto significa que no pueden determinar tu ubicación física ni vincular tu actividad con tu red doméstica. Tu ISP No Puede Ver Tu Tráfico: Tu ISP solo puede ver paquetes cifrados yendo a una IP de servidor VPN. No sabe qué sitios web estás visitando, qué estás descargando, ni qué servicios estás usando. Las Consultas DNS Van a Través del Túnel: Una VPN correctamente configurada enruta tus consultas DNS a través del túnel cifrado y las resuelve en los servidores DNS del proveedor de VPN (o un servidor DNS de tu elección). Esto previene las DNS leaks, que son una de las formas más comunes en que los usuarios de VPN exponen accidentalmente su actividad de navegación. Sin protección contra DNS leaks, tu navegador podría seguir enviando consultas DNS al resolver de tu ISP aunque tu tráfico real vaya a través de la VPN. Todo el Tráfico Está Cifrado en Tránsito: Incluso si alguien intercepta los paquetes entre tu dispositivo y el servidor VPN (por ejemplo, en una red Wi-Fi pública), no verán más que datos cifrados. Ver Contenido Desde Cualquier Ubicación (Bonus): Un beneficio adicional es que puedes conectarte a un servidor VPN en otro país y ver contenido que está bloqueado en el tuyo. Tipos de Protocolos VPN Un protocolo VPN es el conjunto de reglas que determina cómo se cifran y transmiten tus datos entre tu dispositivo y el servidor VPN. Los 2 principales protocolos VPN hoy en día son WireGuard y OpenVPN.\nOpenVPN El protocolo original.\nOpenVPN es completamente configurable, puedes elegir tu cipher (AES-256-GCM, AES-256-CBC), tu método de intercambio de claves (RSA 2048/4096, ECDH), tu algoritmo de autenticación (SHA-256, SHA-512), y tu capa de transporte (UDP, TCP).\nEsto significa que OpenVPN puede configurarse para escenarios muy específicos, lo cual es útil en ciertos entornos empresariales y entornos con infraestructura de censura compleja.\nEl proceso de intercambio de claves en OpenVPN funciona a través de TLS handshakes (el mismo mecanismo utilizado por HTTPS). Cuando tu cliente se conecta a un servidor, realizan un TLS handshake usando certificados X.509 y/o pre-shared keys para autenticarse mutuamente y establecer una clave de sesión. Esta clave de sesión se usa luego para el cifrado simétrico de tu tráfico real.\nEsto significa que puedes configurar OpenVPN para enrutar tráfico sobre TCP en el puerto 443, lo que es muy útil en entornos de red restrictivos porque es esencialmente indistinguible del tráfico HTTPS normal a nivel de conexión. Un inspector de paquetes puede notar la diferencia si analiza el TLS fingerprint y los patrones de tráfico, pero los firewalls básicos que simplemente permiten el tráfico del puerto 443 lo dejarán pasar. Esto hace de OpenVPN una herramienta útil en entornos censurados y con restricciones de seguridad complejas.\nLa desventaja es que tiene una base de código grande, lo que significa una mayor superficie de ataque y overhead, haciendo las conexiones más lentas que WireGuard.\nWireGuard WireGuard es el estándar actual y la opción preferida para la mayoría de los casos de uso.\nEn lugar de permitirte configurar tus conexiones VPN con tantas opciones como quieras, te ofrece una preselección de las mejores opciones modernas y eso es todo.\nDurante un WireGuard handshake, el iniciador envía un mensaje de inicio de handshake con su clave pública efímera y su clave pública estática (cifrada). El respondedor verifica la identidad del iniciador usando la clave pública preconfigurada, genera su propio par de claves efímeras, realiza 4 cálculos Diffie-Hellman usando combinaciones de claves estáticas y efímeras, y envía de vuelta una respuesta de handshake. Ambos lados ahora derivan claves de sesión simétricas idénticas de estos secretos compartidos.\nWireGuard también soporta una pre-shared symmetric key (PSK) opcional que puede configurarse por peer. Esto proporciona una capa adicional de cifrado simétrico sobre la criptografía asimétrica, diseñada específicamente para proteger contra posibles futuros ataques de computación cuántica sobre Curve25519.\nEl handshake renueva automáticamente las claves cada pocos minutos para mantener perfect forward secrecy. Si un atacante compromete de alguna manera una clave de sesión, solo puede descifrar el tráfico de esa sesión específica, no de sesiones pasadas o futuras.\nAdemás, la base de código de WireGuard es mucho más pequeña que la de OpenVPN, lo que significa menos overhead y menor exposición.\nTambién es importante mencionar que WireGuard fue diseñado originalmente con asignaciones de IP estáticas por peer, lo que significa que el servidor necesita saber qué clave pública corresponde a qué IP de túnel. Algunos proveedores de VPN (por ejemplo, NordVPN con su implementación NordLynx) han construido sistemas sobre WireGuard para solucionar esto, usando double NAT o rotación de claves efímeras para que el servidor no asocie persistentemente tu clave pública con tu actividad. Mullvad y Proton manejan esto de forma transparente en sus implementaciones.\nWireGuard solo opera sobre UDP, lo cual es excelente para la velocidad pero puede ser un problema en redes que restringen el tráfico UDP. Tampoco tiene ofuscación de tráfico integrada, lo que significa que la deep packet inspection puede identificarlo como una conexión VPN basándose en la estructura de los paquetes.\n¿Cuál Deberías Usar? Para la mayoría de los usuarios, WireGuard es la mejor opción, es más rápido y tiene una superficie de ataque menor. Tanto Mullvad como Proton VPN lo soportan como predeterminado.\nDado que OpenVPN es mucho más personalizable, funciona muy bien en entornos con firewalls restrictivos, redes que bloquean el tráfico UDP, o entornos de Internet censurados donde necesitas ocultarte dentro del tráfico TCP en el puerto 443.\nProton VPN soporta ambos protocolos mientras que Mullvad optó solo por WireGuard, pero agregó ofuscación Shadowsocks y UDP-over-TCP para compensar los escenarios de evasión de censura donde OpenVPN destaca.\nUsar una VPN en Windows vs Linux Podrías pensar que el sistema operativo subyacente no importa tanto, estás equivocado. No hablaré de MacOS/Apple porque sus productos son una porquería, odio estar encerrado en un ecosistema.\nWindows y la Telemetría Windows recopila una gran cantidad de datos de telemetría por defecto y la mayoría son \u0026ldquo;Requeridos\u0026rdquo; por Microsoft (por qué alguien elegiría voluntariamente Windows como su SO principal está más allá de mi comprensión).\nParte de la telemetría requerida en Windows incluye especificaciones del dispositivo, configuración del hardware, versión del SO, información de drivers, reportes de fallos del sistema, y el estado de Windows Update. La \u0026ldquo;Opcional\u0026rdquo; añade patrones de uso de aplicaciones, historial de navegación de Edge, patrones de escritura a mano y teclado, y reporte de errores mejorado. Tus patrones de escritura\u0026hellip; mmm...\nEstos endpoints de telemetría están codificados directamente en el SO y aunque puedes bloquearlos a nivel de firewall o DNS, las actualizaciones de Windows suelen reactivar la configuración de telemetría y agregar nuevos endpoints.\nEntonces puedes tener una VPN activa, cifrando todo tu tráfico de Internet, y Windows sigue reportando a Microsoft a través de ese mismo túnel cifrado. Tu ISP no puede ver los datos de telemetría porque van a través de la VPN, pero Microsoft sí puede (porque son el destino). Moviste la vigilancia de tu ISP a Microsoft. Progreso supongo.\nLinux y el Control Linux toma el enfoque opuesto. La mayoría de las distribuciones recopilan cero telemetría por defecto. Ningún servicio en segundo plano reportando a casa. Sin analíticas de uso. Sin integración obligatoria en la nube. El SO no hace conexiones de red que tú no hayas configurado explícitamente (puedes optar por ello, claro).\nEn un sistema Linux, tienes total transparencia sobre cada conexión de red. Puedes ejecutar ss -tunap o netstat para ver exactamente qué se está comunicando y hacia dónde, y ver qué servicios están corriendo con systemctl. Esto significa que en una máquina Linux con una VPN activa, el único tráfico que sale de tu sistema es el tráfico que tú generaste intencionalmente.\nEn Linux, WireGuard corre como un módulo del kernel (wireguard.ko), lo que significa que el cifrado y descifrado ocurren en el espacio del kernel con un mínimo de overhead por cambio de contexto. La interfaz virtual (wg0) es una interfaz de red del kernel de primera clase.\nTambién puedes controlar con mayor profundidad cómo la VPN se integra con tu sistema:\nnftables / iptables para Reglas de Firewall: Puedes construir un kill switch que corte todo el tráfico si el túnel VPN cae, asegurarte de que solo el tráfico VPN salga de tu máquina, o enrutar aplicaciones específicas a través o fuera del túnel VPN. En mi configuración, uso reglas de nftables para correr Mullvad y Tailscale simultáneamente (más detalles aquí). Network Namespaces para Aislamiento de Aplicaciones: Los network namespaces de Linux te permiten crear entornos de red completamente separados por proceso o grupo de procesos (cgroups). Puedes poner una aplicación específica en un namespace que solo tenga acceso a la interfaz VPN, haciendo físicamente imposible que esa aplicación filtre tráfico fuera del túnel. resolvectl / systemd-resolved para Control de DNS: Puedes configurar ajustes DNS por interfaz, asegurando que las consultas DNS siempre vayan a través de los servidores DNS de la VPN y nunca se filtren al resolver de tu ISP. En Fedora y la mayoría de las distribuciones modernas, systemd-resolved maneja esto limpiamente cuando la conexión VPN está configurada correctamente. Al Final SÍ importa\u0026hellip;\nUna VPN en Windows sigue protegiendo tu tráfico de tu ISP, pero si te importa la privacidad, usa una VPN en Linux. En Linux, sabes exactamente qué tráfico está saliendo de tu máquina y hacia dónde va.\nProveedores de VPN Zero-Knowledge La mayoría de los proveedores de VPN son una basura, suelen ser honeypots que obtienen tus datos y los venden, algunos lanzan el concepto de \u0026ldquo;VPN sin registros\u0026rdquo; pero no tienen evidencia ni auditorías que lo respalden.\nLo que quieres es un proveedor de VPN zero-knowledge: uno que esté diseñado técnica y operacionalmente de manera que incluso si sus servidores fueran incautados o fueran obligados por las fuerzas del orden, no tendrían nada útil que entregar.\nUn servicio VPN verdaderamente zero-knowledge tiene:\nSin registro de actividad del usuario, tráfico, marcas de tiempo de conexión, o metadatos. Sin requisito de información personal durante el registro (sin email, sin nombre). Opciones de pago anónimo (criptomonedas como Monero, efectivo). Auditorías de seguridad independientes regulares que verifican estas afirmaciones. Clientes open-source para que el código pueda ser revisado independientemente. Hay más VPNs pero solo tengo experiencia con Mullvad y Proton VPN, así que hablaré de ellas a continuación.\nProton VPN Proton VPN es realmente bueno y tiene un historial sólido.\nProton tiene su sede en Suiza, un país con fuertes leyes de privacidad, sin embargo el país está considerando actualmente nueva legislación de vigilancia (la ordenanza OSCPT) que podría tener un impacto en la privacidad. Lo \u0026ldquo;bueno\u0026rdquo; es que Proton ya está trasladando parte de su infraestructura a la UE como precaución, pero toda la UE se está moviendo hacia una postura anti-privacidad, así que podría ser completamente inútil.\nPolítica Sin Registros\nProton VPN mantiene una política sin registros que ha sido verificada de forma independiente. Han superado 4 auditorías anuales consecutivas de terceros, lo cual es algo positivo.\nInfraestructura Propia\nProton gestiona su VPN en servidores bare-metal que poseen y controlan completamente. No hay ningún proveedor de nube de terceros ni intermediario que pudiera obtener datos de usuario del hardware físico.\nAuditorías de Seguridad\nProton superó una auditoría SOC 2 Type II en 2025, que verifica la correcta implementación de controles de seguridad en toda su infraestructura. Este es un tipo diferente de auditoría a la verificación sin registros; valida su postura de seguridad general y los controles operacionales.\nLa Parte Interesante\nProton es seguro y todo eso, pero tienen un patrón de entregar datos de usuarios a las autoridades cuando son compelidos por tribunales suizos, y ha llevado a que personas reales sean identificadas y arrestadas.\nEn 2021, Proton Mail proporcionó la dirección IP de un activista climático francés a las autoridades suizas, quienes la compartieron con la policía francesa. En 2024, entregaron una dirección de email de recuperación que la policía española usó para identificar a un activista de la independencia catalana. Y justo esta semana, 404 Media informó que Proton Mail proporcionó datos de pago que el FBI usó para desenmascarar a un manifestante anónimo de Stop Cop City en Atlanta.\nLa defensa de Proton siempre es la misma: cumplen con las órdenes judiciales suizas, no pueden descifrar el contenido del email, y solo entregan los metadatos limitados que tienen. También enfatizan que su servicio VPN, a diferencia de Proton Mail, no registra direcciones IP, por lo que el lado VPN no ha sido implicado en estos casos. Esa distinción importa, pero hace que no puedas confiar en ellos al 100% (al menos en mi caso, especialmente después de escuchar las opiniones del CEO sobre ciertos temas).\nAlgunas conclusiones clave de esto: no pagues Proton con tarjeta de crédito, y usa un email de recuperación falso, haz tu tarea de opsec.\nMullvad VPN Esta es otra buena opción para una VPN zero-knowledge con pros y contras.\nMullvad tiene su sede en Suecia, que también tiene fuertes leyes de protección de privacidad (pero de nuevo, como toda la UE, se están moviendo hacia un estado anti-privacidad).\nProceso de Registro\nEl proceso de registro es increíble y te dice todo lo que necesitas saber sobre su filosofía. Sin email. Sin nombre. Sin nada. Haces clic en \u0026ldquo;Generar número de cuenta\u0026rdquo; y obtienes un número de 16 dígitos asignado aleatoriamente. Ese es tu ID. Listo.\nPago Anónimo\nPara el pago, puedes usar tarjeta de crédito o PayPal (menos privado), criptomonedas como Bitcoin y Monero (más privado), o literalmente puedes meter efectivo en un sobre con tu número de cuenta y enviarlo por correo a su oficina en Suecia. Abrirán el sobre, añadirán tiempo a tu cuenta, y triturarán el papel. Este nivel de acceso anónimo no tiene igual, me encanta.\nPolítica Sin Registros\nMullvad ha sido auditado de forma independiente múltiples veces por empresas de seguridad y se encontraron cero problemas críticos, altos o de severidad media, solo una única debilidad de validación de entrada de baja severidad que fue corregida rápidamente. Puedes ver la información de auditorías en su sitio web.\nUna buena evidencia de esto llegó en 2023, cuando la policía sueca se presentó físicamente en la oficina de Mullvad con una orden de registro, con la intención de incautar computadoras con datos de clientes. El personal de Mullvad demostró cómo funciona su servicio y que no existía ningún dato de cliente. Tras consultar al fiscal, la policía se fue sin llevarse nada.\nLa Parte Interesante\nAlgunas personas afirman que Mullvad es un honeypot del gobierno, diseñado para atraer a usuarios conscientes de la privacidad, lo cual podría ser cierto\u0026hellip; ¿o no?\nSu servicio es muy bueno pero no puedo probar que este no sea el caso. Confío en las auditorías independientes, el open-source, el registro anónimo, y los métodos de pago anónimos como una buena señal en una empresa que prioriza la privacidad. Podría estar equivocado, es solo una cuestión de confianza.\nLos Peligros de las VPNs Gratuitas Las VPNs gratuitas son (generalmente) una pesadilla para la privacidad, peores que no tener VPN si soy honesto.\nGestionar un servicio VPN cuesta dinero. Si una VPN no te cobra, está ganando dinero vendiendo tus datos.\nAlgunas lecturas recomendadas sobre el tema:\n¿Son seguras las VPNs gratuitas? Esto es lo que dice la investigación Informe de Transparencia VPN 2025 El 60% de las VPNs gratuitas podrían estar vendiendo tus datos para 2025 De Qué No Te Protege una VPN Algunas afirmaciones de marketing de VPN como \u0026ldquo;anonimato completo\u0026rdquo; son una mentira, aquí está la verdad:\nUna VPN No Te Hace Anónimo: Si inicias sesión en Google mientras estás conectado a una VPN, Google sigue sabiendo exactamente quién eres. Escribiste tu nombre de usuario y contraseña. La VPN oculta tu dirección IP del destino, pero no cambia tu sesión de inicio de sesión, tu browser fingerprint, etc. Si usas una VPN para \u0026ldquo;ocultarte de Google\u0026rdquo; mientras tienes sesión iniciada en Gmail, tengo malas noticias para ti. Una VPN No Protege Contra el Browser Fingerprinting: Tu navegador revela mucha información identificadora sobre ti: resolución de pantalla, fuentes instaladas, renderer de GPU, zona horaria, configuración de idioma, plugins instalados, renderizado canvas, WebGL, etc. Esta combinación suele ser lo suficientemente única como para identificarte sin necesitar nunca tu dirección IP. Una VPN no cambia nada de esto, seguirás siendo identificado. Más detalles sobre fingerprinting aquí. Una VPN No Garantiza Que Tu Proveedor No Esté Registrando Tus Datos: Al usar una VPN, estás trasladando la confianza de tu ISP a tu proveedor de VPN. Tu proveedor de VPN teóricamente puede ver todo tu tráfico, sin embargo, un buen proveedor de VPN tiene una política sin registros verificada e infraestructura auditada para protegerte. Tu ISP no tiene nada de eso. Así que estás cambiando un espía garantizado por un intermediario que esperas sea de confianza. Elige bien. Un Resumen Rápido Consigue una VPN. Úsala. Págala con Monero o una criptomoneda similar que priorice la privacidad.\nElige un proveedor de VPN confiable que haya sido auditado, sea open-source, tenga opciones de pago anónimo, y un buen historial de protección de datos de usuarios frente a las fuerzas del orden. Mullvad y Proton VPN son los dos que recomiendo pero hay más, haz tu propia investigación.\nEvita las VPNs gratuitas. No son gratuitas. Estás pagando con tus datos, que son vendidos a quién sabe quién.\nLas VPNs no proporcionan anonimato completo. Combínalas con un navegador enfocado en la privacidad (Firefox o sus forks con configuraciones reforzadas por ejemplo - más detalles aquí), un bloqueador de contenido (uBlock Origin), DNS cifrado, etc. No existe la privacidad perfecta pero algo es mejor que nada.\nLa Parte 2 tendrá información más profunda sobre VPNs y en la Parte 3 investigaré más sobre cómo evitar que el tráfico VPN sea detectado por redes corporativas, gobiernos, y similares.\n","permalink":"https://danoss.me/es/categories/security/entendiendo-vpns-parte-1/","summary":"Parte 1 de una serie de escritos sobre VPNs","title":"Entendiendo VPNs Parte 1"},{"content":"La mayor parte del mundo usa Google Chrome como su navegador principal por muchas razones: es fácil de usar, está vinculado a tu cuenta de Google, viene preinstalado en muchos dispositivos, entre otros.\nAhora bien, mirándolo desde una perspectiva de privacidad, estás viviendo una pesadilla. Adentrarse en el mundo de la privacidad y seguridad lo deja aún más claro.\n¿Creado Por una Empresa de Publicidad? Google es básicamente una empresa de publicidad, gran parte de sus ingresos provienen de los anuncios. Incluso diría que Chrome no es un producto, sino un canal para alimentar con tus datos a Google para publicidad dirigida. Google sabe todo lo que haces en línea.\nPor ejemplo, en 2018, el criptógrafo Matthew Green escribió la entrada de blog \u0026ldquo;Why I\u0026rsquo;m Done With Chrome\u0026rdquo;, que habla sobre un cambio en la experiencia de inicio de sesión de Chrome. Anteriormente, podías usar Chrome sin iniciar sesión. Luego, Google decidió que simplemente iniciar sesión en Gmail te registraría automáticamente en el navegador sin tu consentimiento y comenzaría a sincronizar tu historial de navegación con los servidores de Google.\nEsto no es solo un cambio, es un comportamiento: Google cambiará el funcionamiento de sus productos para invadir tu privacidad.\nLo Que Chrome Realmente Recopila Cuando inicias sesión con tu cuenta de Google en Chrome, el navegador puede correlacionar tu historial de navegación, búsquedas, ubicación e información de cookies entre dispositivos y sesiones para alimentar su motor publicitario. Así, si usas los productos de Google en el navegador Chrome, Google tiene un panorama completo de tu vida.\nIncluso si usas el Modo Incógnito, no eres anónimo. Google seguirá viendo tu tráfico, registrando consultas DNS y rastreando tu actividad en línea. Esto es tan grave que Google llegó a un acuerdo en una demanda colectiva de $5 mil millones presentada por usuarios que alegaban haber sido engañados sobre lo que el Modo Incógnito realmente hace; Google aceptó eliminar miles de millones de registros recopilados de usuarios a quienes les había dicho que estaban navegando de forma privada (fuente).\nCookies de Terceros y Privacy Sandbox Las cookies de terceros permiten a los anunciantes seguirte por toda la web de sitio en sitio para crear un perfil digital tuyo y vender tus datos. Firefox, Safari y la mayoría de los demás navegadores bloquean estas cookies de terceros de forma predeterminada para mejorar la privacidad del usuario, pero no Google.\nEn 2020, Google anunció que eliminaría gradualmente las cookies de terceros en Chrome (fuente), sin embargo, decidió dar un giro de 180 grados y abandonar este plan (fuente).\nEn su lugar, Google introdujo el Privacy Sandbox, en el que, en vez de dejar que rastreadores de terceros te sigan por la web, el Privacy Sandbox mueve el rastreo al propio Chrome. Tu navegador observa lo que haces, construye un perfil de tus intereses y luego lo comparte con los anunciantes. Sigue siendo una pesadilla para la privacidad.\nLuego, en 2025, Google anunció que el Privacy Sandbox había muerto (fuente) y que mantendría las cookies de terceros en Chrome indefinidamente.\nGoogle Mató el Mejor Bloqueador de Anuncios en Chrome En 2025, Google completó la transición de Manifest V2 a Manifest V3, un nuevo marco que define cómo funcionan las extensiones de Chrome. El cambio principal fue reemplazar la API webRequest, que extensiones como uBlock Origin (el bloqueador de contenido más efectivo jamás creado) usaban para interceptar solicitudes de red en tiempo real, por la API declarativeNetRequest, mucho más limitada (fuente).\nEsto resultó en que la versión completa de uBlock Origin dejara de funcionar en Chrome. Existe una versión Lite reconstruida para las limitaciones de Manifest V3, pero es menos capaz que la versión completa.\nEntonces Google, una empresa de publicidad, rediseñó la plataforma de extensiones de una manera que específicamente inutiliza el mejor software bloqueador de anuncios, lo que convenientemente beneficia a su negocio principal. Aquí hay algo sospechoso.\nChrome vs Chromium Chrome es el navegador propietario de Google construido sobre Chromium, que es de código abierto.\nChromium, en cierto sentido, es más confiable que Chrome. Por eso, algunas personas prefieren usar navegadores enfocados en la privacidad basados en Chromium, como Brave, en lugar de Firefox, lo cual es una opción sólida.\n¿Entonces Deberías Cambiar? Sí, fin del artículo\u0026hellip; o\u0026hellip;\nAntes de cambiar de navegador, aunque Chrome sea terrible para la privacidad, sí cuenta con extensiones excelentes que te permiten integrar fácilmente herramientas de terceros y automatizar flujos de trabajo en el navegador, y muchas extensiones de navegador potenciadas por IA son Chrome-first (o exclusivas de Chrome).\nTen eso en cuenta antes de migrar por completo. Si valoras parte de esta funcionalidad, te recomendaría mantener Chrome como navegador secundario para usarlo cuando sea necesario, pero no como tu navegador principal si te importa la privacidad.\nDicho esto, Firefox tampoco es perfecto y Mozilla también la fastidia. En 2025, Mozilla actualizó silenciosamente sus Términos de Uso con un lenguaje de licencia amplio que parecía otorgar a Mozilla derechos sobre cualquier dato que introdujeras en el navegador. Dieron marcha atrás tras una reacción masiva, alegando que solo era una actualización mal redactada, pero no somos tan ingenuos (fuente).\nLuego, a finales de 2025, el nuevo CEO de Mozilla anunció que Firefox evolucionaría hacia un \u0026ldquo;navegador moderno de IA\u0026rdquo;, lo que generó interrogantes sobre dónde viven los datos recopilados por esta IA, la privacidad y la seguridad de la funcionalidad (fuente).\nFirefox y Sus Forks Respetuosos de la Privacidad Aunque Mozilla tiene sus peculiaridades y preocupaciones, es una opción mucho mejor para quienes se preocupan por la privacidad.\nFirefox bloquea las cookies de terceros de forma predeterminada mediante Enhanced Tracking Protection, admite la versión completa de uBlock Origin y soporta about:config, donde puedes ajustar cientos de configuraciones que Chrome no expone.\nPersonalmente, en lugar de usar Firefox estándar, prefiero usar un fork de Firefox enfocado en la privacidad, que funciona bien y está más reforzado.\nLibreWolf es el fork más enfocado en la privacidad con excelentes configuraciones predeterminadas. El único inconveniente que veo es que algunos sitios se rompen debido a la agresiva resistencia al fingerprinting y que hay un número reducido de mantenedores. Waterfox es menos agresivo que LibreWolf en términos de endurecimiento, pero más enfocado en eliminar la telemetría y el comportamiento de \u0026ldquo;llamar a casa\u0026rdquo; que Mozilla ha añadido a lo largo de los años, manteniendo en gran medida la compatibilidad de extensiones y la experiencia de usuario de Firefox. Es una buena opción de término medio para la mayoría de los usuarios. Al final, es una preferencia personal sobre lo que valoras en términos de experiencia de usuario y privacidad. Puedes elegir quedarte en Chrome, cambiar a un navegador basado en Chromium como Brave, optar por Firefox y sus forks, o por otro navegador completamente distinto; elige sabiamente.\nArtículos Relacionados Que es Browser Fingerprinting? Tu Huella Digital ","permalink":"https://danoss.me/es/categories/others/deja-de-usar-chrome/","summary":"Chrome no es un navegador, es el pipeline de recopilación de datos de Google con una interfaz","title":"Deja de Usar Chrome: Un Análisis Profundo del Problema de Privacidad de Google Chrome"},{"content":"Los certificados SSL/TLS no son tan complicados una vez que los entiendes, a diferencia del DNS (que siempre es un dolor de cabeza), hacer que HTTPS funcione para servicios auto-alojados es en realidad bastante sencillo.\nLa mayoría de mis servicios de servidor doméstico corren como contenedores Podman accesibles a través de un gateway VPS con IP pública. Para acceder a esos servicios de forma segura desde cualquier lugar, todos deben estar detrás de HTTPS, lo que significa que tengo que usar certificados.\nCertificados SSL/TLS Cuando ves el ícono del candado en tu navegador web, un certificado TLS está haciendo 2 cosas: cifrando tu conexión para que nadie pueda leer el tráfico en tránsito, y verificando que el servidor con el que estás hablando es realmente quien dice ser.\nSSL (Secure Sockets Layer) es el nombre antiguo y obsoleto del protocolo que todos siguen usando por costumbre (y la verdad es que suena mejor). TLS (Transport Layer Security) es el protocolo actual vigente. Ambos nombres se usan generalmente de forma intercambiable, pero hoy en día TLS es el estándar.\nPara entornos auto-alojados tienes 2 opciones. Usar una Autoridad de Certificación pública como Let\u0026rsquo;s Encrypt, que es gratuita, automatizada y de confianza para todos los navegadores, o montar tu propia CA privada para servicios internos, lo que te da más control pero es más complejo de configurar.\nPara servicios auto-alojados, la Autoridad de Certificación preferida es Let\u0026rsquo;s Encrypt, que es gratuita, automatizada y de confianza para todos los navegadores de fábrica. La otra opción es montar tu propia CA privada, que te da más control pero es más compleja de configurar y mantener.\nMi Configuración Soy partidario del KISS (Keep It Simple, Stupid). La topología se ve así:\nInternet → VPS (Headscale + reenvío de puertos) → Tailscale VPN → Servidor Doméstico (Caddy + contenedores Podman)\nCloudflare gestiona el DNS, apuntando cada subdominio a la IP pública del VPS. El VPS corre Headscale para la coordinación de la VPN y reenvía el tráfico entrante en el puerto 443 a través del túnel Tailscale hacia el servidor doméstico. Caddy corre en el servidor doméstico, gestiona la terminación TLS y hace reverse proxy de las peticiones al contenedor correcto. Los servicios tienen sus propios subdominios, como auth.example.com, home.example.com, y así sucesivamente.\nComo el servidor doméstico no es directamente accesible desde internet, Caddy no puede usar challenges HTTP-01 para Let\u0026rsquo;s Encrypt, ya que estos requieren que Let\u0026rsquo;s Encrypt se conecte de vuelta a tu servidor en el puerto 80. En su lugar, Caddy usa challenges DNS-01 a través de la API de Cloudflare, donde la propiedad del dominio se verifica mediante un registro TXT de DNS. Sin puertos expuestos.\nTodo permanece protegido detrás de la VPN, y Caddy gestiona toda la administración de certificados de forma automática. Agregar un nuevo servicio es simplemente una nueva entrada en Caddy y un registro DNS en Cloudflare.\n¿Por qué Caddy? Caddy es el reverse proxy y gestor de certificados que corre en mi servidor doméstico. Me gusta más que otras opciones porque es muy directo y fácil de configurar.\nProbé nginx y Traefik, pero aunque nginx funciona muy bien, requiere una configuración separada de certbot y configuración adicional, lo cual es excesivo para una configuración simple. Traefik tiene excelentes funcionalidades de orquestación de contenedores, pero añade una complejidad de configuración que no necesito para lo que es esencialmente un reverse proxy simple.\nCaddy gestiona todo el ciclo de vida del certificado de forma automática. Como el servidor doméstico no es accesible públicamente, usa challenges DNS-01 con la API de Cloudflare en lugar de HTTP-01. Caddy crea un registro TXT temporal en Cloudflare para demostrar la propiedad del dominio, obtiene el certificado y luego elimina el registro.\nAlgunas Alternativas Aquí hay algunas alternativas que vale la pena conocer:\nCloudflare Tunnels se salta el VPS por completo enrutando el tráfico a través de la red de Cloudflare. La configuración es extremadamente simple (sin VPS que gestionar) pero estás confiándole todo tu tráfico a Cloudflare.\nTraefik con Docker/Podman vale la pena considerarlo si estás corriendo un gran número de servicios en contenedores y quieres descubrimiento automático de servicios mediante etiquetas de contenedor. Es más potente que Caddy, solo que más complejo de configurar.\nnginx con certbot funciona muy bien y te da más control sobre cada aspecto de la gestión de certificados. Es una excelente opción para configuraciones complejas y control total.\n","permalink":"https://danoss.me/es/categories/security/certificados-ssl-tls-para-servicios-self-hosted/","summary":"Pequeña guía y notas sobre certificados SSL/TLS en un entorno auto-alojado","title":"Certificados SSL/TLS para Servicios Self-Hosted"},{"content":"Esta parte sigue con el hardening de seguridad en Linux con algunas protecciones a nivel del sistema: parámetros de hardening del kernel, control de acceso SELinux, y registro de auditoría que rastrea todo lo que está sucediendo en tu sistema.\nControl de Acceso Obligatorio SELinux SELinux puede ser complicado pero es una excelente característica de seguridad del kernel que continúa bloqueando acciones no autorizadas en tu sistema.\nAunque puede ser desafiante de configurar, SELinux tiene excelentes valores predeterminados para las aplicaciones más comunes, así que para el 90% de los casos de uso ni siquiera notarás que SELinux está corriendo. Si SELinux está bloqueando algo en una configuración predeterminada, puedes agregar una excepción de política para permitir la acción. No deshabilites SELinux.\nVerificar el Estado de SELinux Primero, verifica que SELinux esté realmente habilitado y en modo enforcing.\n# Verificar modo actual getenforce # Debería mostrar \u0026#34;Enforcing\u0026#34; # Estado detallado sestatus # Muestra: estado de SELinux, tipo de política, modo # Verificar si SELinux está denegando algo ausearch -m avc -ts recent El modo enforcing significa que SELinux bloquea activamente acciones no autorizadas. El modo permissive registra violaciones pero no las bloquea, lo cual es útil para depuración pero no proporciona protección real.\nEntender los Contextos de SELinux Cada archivo, proceso, puerto y usuario en SELinux tiene un contexto de seguridad (también llamado \u0026ldquo;label\u0026rdquo;). Estos contextos determinan qué puede acceder a qué. El formato es user:role:type:level, pero para la mayoría de los casos, solo te importa el campo type.\nPor ejemplo, los archivos del servidor web deberían tener el tipo httpd_sys_content_t, y el proceso httpd corre con el tipo httpd_t. La política de SELinux permite que los procesos httpd_t lean archivos httpd_sys_content_t, pero no archivos user_home_t (que están en los directorios home de los usuarios). Esto significa que incluso si httpd está comprometido y corriendo como root, todavía no puede acceder a las claves SSH en /root/.ssh/ porque la política de SELinux lo niega.\nVer contextos de archivos y procesos.\n# Mostrar contexto de archivo ls -Z /var/www/html/index.html # Salida: unconfined_u:object_r:httpd_sys_content_t:s0 # Mostrar contexto de proceso ps -eZ | grep httpd # Salida: system_u:system_r:httpd_t:s0 1234 ? 00:00:00 httpd # Verificar contexto de servicios en ejecución systemctl status httpd Cuando creas o mueves archivos, podrían heredar el contexto incorrecto. Esta es la causa más común de denegaciones de SELinux. Por ejemplo, si copias un archivo desde tu directorio home a /var/www/html/, podría mantener el contexto user_home_t en lugar de obtener httpd_sys_content_t.\nCorregir Problemas de Contexto El comando restorecon restaura los contextos predeterminados basados en la ubicación del archivo.\n# Restaurar contexto para un solo archivo restorecon /var/www/html/index.html # Restaurar recursivamente para un directorio restorecon -Rv /var/www/html/ # Vista previa de lo que cambiaría sin aplicar restorecon -Rvn /var/www/html/ Para contextos personalizados permanentes (como si estás alojando contenido web desde una ubicación no estándar), usa semanage fcontext.\n# Agregar regla de contexto persistente para directorio web personalizado semanage fcontext -a -t httpd_sys_content_t \u0026#34;/web/custom(/.*)?\u0026#34; # Aplicar la nueva regla (restaura la política) restorecon -Rv /web/custom/ # Ver reglas de contexto personalizadas semanage fcontext -l | grep custom Booleanos de SELinux SELinux usa booleanos para alternar comportamientos específicos sin reescribir políticas, así que puedes encenderlos y apagarlos para escenarios específicos. La opción -P hace los cambios persistentes entre reinicios.\n# Listar todos los booleanos getsebool -a # Verificar booleano específico getsebool httpd_can_network_connect # Ejemplo # Permitir que httpd haga conexiones de red salientes (para proxies inversos, llamadas a API) setsebool -P httpd_can_network_connect on Solucionar Problemas con Denegaciones de SELinux Cuando SELinux bloquea algo, registra una \u0026ldquo;denegación AVC\u0026rdquo; en el log de auditoría. Estos mensajes son crípticos, pero audit2why los traduce a explicaciones legibles para humanos.\n# Ver denegaciones recientes ausearch -m avc -ts recent # Explicar por qué se denegó el acceso ausearch -m avc -ts recent | audit2why Importante: No ejecutes ciegamente audit2allow e instales cualquier política que genere. Lee la denegación, entiende qué está siendo bloqueado, y determina si la aplicación realmente debería tener permitido hacer eso. A veces SELinux te está protegiendo de una aplicación mal configurada o comprometida.\nPor ejemplo, si ves denegaciones de httpd intentando ejecutar archivos en /tmp/, la solución correcta no es permitirlo. La solución correcta es averiguar por qué httpd está intentando ejecutar archivos temporales y arreglar la configuración de la aplicación.\nAuditar Actividad del Sistema Es importante verificar qué está sucediendo en tu sistema. Qué puertos están abiertos, qué está corriendo, qué está siendo accedido.\nVerificar Servicios de Red en Escucha Verifica qué servicios están expuestos en la red. Cualquier puerto en escucha es un vector de ataque potencial.\n# Mostrar todos los puertos TCP/UDP en escucha con información de proceso ss -tulpn # Alternativa usando lsof lsof -i -P -n | grep LISTEN # Mostrar solo puertos TCP en escucha ss -tln # Mostrar puertos en escucha con direcciones numéricas (sin búsquedas DNS) netstat -tuln La salida muestra qué puertos están vinculados a qué interfaces. Presta atención a:\nPuertos escuchando en 0.0.0.0 (todas las interfaces) vs 127.0.0.1 (solo localhost) Servicios inesperados que no recuerdas haber instalado Números de puerto altos que podrían ser backdoors o configuraciones incorrectas Para cada puerto en escucha, verifica:\nQué servicio lo posee (ss -tulpn muestra el proceso) Si realmente necesitas que esté expuesto Si debería estar restringido a localhost en lugar de todas las interfaces Si encuentras servicios en escucha que no reconoces, investiga antes de deshabilitar.\n# Identificar qué paquete posee el binario rpm -qf $(which servicename) # Verificar qué hace el servicio systemctl status servicename man servicename Auditd para Registro de Eventos del Sistema El registro estándar del sistema con journald captura mensajes de servicio y errores, pero no rastrea eventos de seguridad detallados como accesos a archivos o intentos de autenticación. Eso es lo que hace auditd.\nAuditd funciona a nivel del kernel. Puede rastrear virtualmente cualquier actividad del sistema (accesos a archivos, llamadas al sistema, conexiones de red, comandos de usuario).\nInstalar y habilitar auditd.\n# Ya debería estar instalado en RHEL/Fedora dnf install audit # Habilitar e iniciar servicio systemctl enable --now auditd # Verificar estado systemctl status auditd Configurar Reglas de Auditoría Las reglas de auditoría definen qué eventos registrar. Puedes monitorear archivos específicos, directorios, llamadas al sistema o acciones de usuario. Las reglas se definen en /etc/audit/rules.d/audit.rules o /etc/audit/audit.rules.\nAlgunas reglas de auditoría útiles.\n# Monitorear cambios en archivos de autenticación del sistema -w /etc/passwd -p wa -k passwd_changes -w /etc/shadow -p wa -k shadow_changes -w /etc/group -p wa -k group_changes -w /etc/sudoers -p wa -k sudoers_changes # Monitorear configuración de SSH -w /etc/ssh/sshd_config -p wa -k sshd_config_changes # Rastrear uso de sudo -a always,exit -F arch=b64 -S execve -F auid\u0026gt;=1000 -F auid!=-1 -F key=sudo_commands # Monitorear eliminación de archivos por usuarios -a always,exit -F arch=b64 -S unlink -S unlinkat -S rename -S renameat -F auid\u0026gt;=1000 -F auid!=-1 -k file_deletion # Vigilar directorios críticos -w /etc/ -p wa -k etc_changes -w /boot/ -p wa -k boot_changes La bandera -w vigila un archivo o directorio. La bandera -p especifica los permisos a monitorear:\nr - lectura w - escritura x - ejecución a - cambio de atributo Agrega tus reglas personalizadas a /etc/audit/rules.d/custom.rules.\n# Crear archivo de reglas personalizadas vim /etc/audit/rules.d/custom.rules # Recargar reglas de auditoría augenrules --load # O reiniciar auditd service auditd restart # Verificar que las reglas estén cargadas auditctl -l Hardening del Kernel Puedes configurar el kernel de Linux con sysctl para mejorar su seguridad, networking y rendimiento.\nProtección de Memoria El filesystem /proc expone direcciones de memoria del kernel y otra información sensible. Por defecto, cualquier proceso puede leer estos, lo que ayuda a los atacantes a evitar la randomización del diseño del espacio de direcciones.\nOcultar Punteros del Kernel\nEl parámetro kernel.kptr_restrict controla el acceso a direcciones de puntero del kernel.\n# 0 = Mostrar punteros del kernel (predeterminado, inseguro) # 1 = Ocultar de usuarios sin privilegios, mostrar a root # 2 = Ocultar de todos, incluyendo root kernel.kptr_restrict=2 Configurar esto en 2 oculta los punteros del kernel de todos, lo cual es más seguro. Sin embargo, algunas herramientas de monitoreo de rendimiento (como perf) necesitan acceso a símbolos del kernel para funcionar correctamente. Si tienes problemas con herramientas de depuración, configúralo en 1 en su lugar, lo que oculta los punteros de usuarios regulares pero permite acceso a root.\nRestringir Acceso a Logs del Kernel\nLos logs del kernel (accesibles vía dmesg) pueden filtrar información sensible sobre hardware, direcciones del kernel y configuración del sistema. Restringe el acceso solo a root.\n# Prevenir que usuarios regulares lean el buffer del kernel kernel.dmesg_restrict=1 Esto debería estar habilitado por defecto en sistemas modernos, pero vale la pena verificarlo, especialmente en instalaciones antiguas o kernels personalizados.\nParámetros de Seguridad de Red Varios parámetros de networking del kernel mejoran la seguridad contra ataques comunes basados en red:\nProtección contra SYN Flood\nLos SYN floods son un tipo de ataque de denegación de servicio que explota el handshake de tres vías de TCP. Habilitar SYN cookies permite al kernel manejar SYN floods sin mantener estado para cada intento de conexión.\n# Habilitar SYN cookies net.ipv4.tcp_syncookies=1 Esto usualmente está habilitado por defecto, pero verifica que esté configurado. No hay desventajas reales con las SYN cookies en kernels modernos.\nFiltrado de Ruta Inversa (Anti-Spoofing)\nEl filtrado de ruta inversa verifica que los paquetes entrantes realmente vengan de la red que dicen venir. Esto previene ataques de IP spoofing.\n# Habilitar filtrado de ruta inversa estricto en todas las interfaces net.ipv4.conf.all.rp_filter=1 net.ipv4.conf.default.rp_filter=1 El modo 1 es estricto (descarta paquetes si la ruta de retorno no coincide con la interfaz entrante. El modo 2 es flexible) solo verifica si la IP de origen es enrutable. Para la mayoría de los sistemas, el modo estricto es apropiado. Si estás haciendo enrutamiento asimétrico (el tráfico entra por una interfaz y sale por otra), podrías necesitar el modo flexible.\nDeshabilitar Reenvío de IP\nA menos que tu sistema sea un router, el reenvío de IP debería estar deshabilitado.\n# Deshabilitar reenvío IPv4 net.ipv4.ip_forward=0 # Deshabilitar reenvío IPv6 net.ipv6.conf.all.forwarding=0 Esto previene que tu sistema enrute paquetes entre interfaces de red, lo cual podría ser explotado para evitar reglas de firewall o conducir ataques de man-in-the-middle.\nDeshabilitar IPv6 (Si No lo Estás Usando)\nSi no estás usando IPv6, deshabilítalo completamente para reducir la superficie de ataque.\n# Deshabilitar IPv6 en todas las interfaces net.ipv6.conf.all.disable_ipv6=1 net.ipv6.conf.default.disable_ipv6=1 Ten en cuenta que esto rompe aplicaciones que intentan vincularse a direcciones IPv6. La mayoría de las aplicaciones manejan esto con gracia, pero algunas (como ciertos conectores de bases de datos) podrían fallar. Prueba exhaustivamente antes de implementar esto en producción.\nIgnorar Redirecciones ICMP\nLas redirecciones ICMP le dicen a los hosts que usen una ruta diferente para ciertos destinos. Aceptar estas desde redes no confiables puede ser usado para ataques de man-in-the-middle.\n# Ignorar mensajes de redirección ICMP net.ipv4.conf.all.accept_redirects=0 net.ipv4.conf.default.accept_redirects=0 net.ipv6.conf.all.accept_redirects=0 net.ipv6.conf.default.accept_redirects=0 # No enviar redirecciones ICMP (si no es un router) net.ipv4.conf.all.send_redirects=0 net.ipv4.conf.default.send_redirects=0 Aplicar Configuraciones de Sysctl Crea un archivo de configuración sysctl personalizado para todos tus parámetros de hardening.\n# Crear configuración de hardening sudo tee /etc/sysctl.d/99-hardening.conf \u0026lt;\u0026lt; EOF # Protección de memoria kernel.kptr_restrict=2 kernel.dmesg_restrict=1 # Seguridad de red net.ipv4.tcp_syncookies=1 net.ipv4.conf.all.rp_filter=1 net.ipv4.conf.default.rp_filter=1 net.ipv4.ip_forward=0 net.ipv4.conf.all.accept_redirects=0 net.ipv4.conf.default.accept_redirects=0 net.ipv4.conf.all.send_redirects=0 net.ipv4.conf.default.send_redirects=0 # Seguridad IPv6 (si usas IPv6) net.ipv6.conf.all.forwarding=0 net.ipv6.conf.all.accept_redirects=0 net.ipv6.conf.default.accept_redirects=0 EOF # Cargar las nuevas configuraciones sudo sysctl -p /etc/sysctl.d/99-hardening.conf # Verificar que las configuraciones estén aplicadas sysctl -a | grep kptr_restrict sysctl -a | grep dmesg_restrict sysctl -a | grep tcp_syncookies Las configuraciones en /etc/sysctl.d/ persisten entre reinicios. El prefijo 99- asegura que este archivo se carga después de otras configuraciones sysctl, así que tus configuraciones tienen precedencia. Este es un buen enfoque porque lo agregamos en el directorio drop-in en lugar de escribirlo directamente en /etc/sysctl.\n¡Usa Siempre una VPN! Usa siempre una VPN pagada (o auto-alojada) para todas tus conexiones.\nServicios VPN Comerciales\nCuando usas una VPN estás confiando en el proveedor de VPN en lugar de tu ISP. Proveedores como Mullvad o ProtonVPN son buenas opciones ya que son zero-knowledge y amigables con la privacidad.\nVPN Auto-Alojada (Tailscale/Headscale)\nPara algunas conexiones también recomiendo Headscale o Tailscale, que crea una VPN mesh entre todos mis dispositivos. Su propósito no es ocultar el tráfico sino crear conexiones seguras entre mis dispositivos sin importar en qué red estén.\n¿Qué Sigue? Estas son las formas más comunes de asegurar un sistema Linux, sin embargo la seguridad es un proceso sin fin y siempre hay nuevas vulnerabilidades y cambios sucediendo así que mantén esta práctica actualizada.\nLa seguridad perfecta no existe, así que sigue con ello.\n","permalink":"https://danoss.me/es/categories/linux/linux-security-hardening-parte-3/","summary":"Guía completa de hardening de seguridad en Linux: SELinux, system audit, kernel hardening, uso de VPN, Parte 3 de la serie de hardening de seguridad en Linux","title":"Linux Security Hardening Parte.3 - SELinux, Audit, Kernel Hardening, VPNs"},{"content":"Parte 2 del endurecimiento de seguridad de Linux, aquí hablaré sobre asegurar SSH, componentes orientados a la red, configuración del firewall y algunas buenas opciones de mantenimiento del sistema.\nEndurecimiento del Servidor SSH Proteger SSH es clave para prevenir el acceso a un sistema. Las configuraciones predeterminadas de SSH están diseñadas para la conveniencia, no para la seguridad. Si no está protegido y expuesto, muchos scripts/bots intentarán iniciar sesión en tu sistema.\nDeshabilita completamente la autenticación basada en contraseñas, restringe el acceso a usuarios específicos y agrega algo de limitación de tasa básica para reducir el ruido en los registros de ataques de fuerza bruta automatizados.\nDeshabilitar la Autenticación por Contraseña La autenticación por contraseña a través de SSH es insegura. Las contraseñas pueden ser atacadas por fuerza bruta, phishing o filtradas en violaciones de datos. La autenticación por clave SSH, por otro lado, se basa en pares de claves que es mucho más seguro.\nLa clave privada permanece en tu máquina local y nunca sale. La clave pública se copia al servidor. Cuando te conectas, el servidor desafía a tu cliente a demostrar que tiene la clave privada correspondiente sin transmitir nunca la clave en sí. No se envía ninguna contraseña a través de la red, y no hay nada que un atacante pueda atacar por fuerza bruta.\nGenera un par de claves SSH en tu máquina local (no en el servidor).\n# Ed25519 es el estándar moderno (claves más cortas, mejor rendimiento) ssh-keygen -t ed25519 -C \u0026#34;your_email@example.com\u0026#34; # Si necesitas compatibilidad con sistemas más antiguos, usa RSA con claves de 4096 bits ssh-keygen -t rsa -b 4096 -C \u0026#34;your_email@example.com\u0026#34; # Las claves se guardan en ~/.ssh/id_ed25519 (privada) y ~/.ssh/id_ed25519.pub (pública) Copia tu clave pública al servidor.\n# La forma fácil (agrega automáticamente a ~/.ssh/authorized_keys) ssh-copy-id username@your-server.com Prueba la autenticación basada en claves en una \u0026ldquo;nueva ventana de terminal\u0026rdquo; antes de hacer cambios.\n# Esto debería iniciarte sesión sin pedir una contraseña ssh username@your-server.com # Si todavía pide una contraseña, verifica los registros del servidor para depurar ssh -v username@your-server.com Una vez que funcione, deshabilita la autenticación por contraseña.\n# Edita la configuración del demonio SSH sudo vim /etc/ssh/sshd_config # Establece estas directivas para deshabilitar la autenticación por contraseña y respuestas PasswordAuthentication no ChallengeResponseAuthentication no # Aplica los cambios sudo systemctl restart sshd Deshabilitar el Inicio de Sesión Root por SSH Incluso con autenticación por clave SSH, permitir el inicio de sesión directo como root a través de SSH es innecesario. Si necesitas acceso root, inicia sesión como tu usuario regular y usa sudo. Esto crea un registro de auditoría que muestra quién ejecutó qué comando como root, lo cual el inicio de sesión root sin contraseña omite completamente.\nCubrí la deshabilitación completa de la cuenta root en la Parte 1, pero incluso si mantienes root habilitado para el acceso a la consola local, deberías bloquearlo a través de SSH.\n# En /etc/ssh/sshd_config PermitRootLogin no # Reinicia sshd para implementar los cambios sudo systemctl restart sshd Algunas personas usan PermitRootLogin prohibit-password que permite el inicio de sesión root con claves pero no con contraseñas. Yo no hago esto ya que no encuentro ninguna razón real para iniciar sesión SSH como root.\nRestringir el Acceso SSH a Usuarios Específicos Por defecto, cualquier cuenta de usuario en el sistema puede intentar conectarse por SSH. Eso está bien para sistemas de un solo usuario, pero en servidores multiusuario probablemente solo quieras que algunas cuentas tengan acceso remoto.\nLas directivas AllowUsers y AllowGroups te permiten crear una lista blanca de exactamente quién puede conectarse vía SSH.\n# En /etc/ssh/sshd_config # Método 1: Lista blanca de usuarios específicos AllowUsers cloud admin # Método 2: Lista blanca de un grupo AllowGroups sshusers # Puedes combinar ambas directivas si es necesario Si usas grupos, crea el grupo de usuarios SSH y agrega tus usuarios autorizados.\n# Crea el grupo de usuarios SSH sudo groupadd sshusers # Agrega tu usuario al grupo sudo usermod -aG sshusers cloud # Verifica la membresía del grupo groups cloud También existen las directivas DenyUsers y DenyGroups para listas negras, pero prefiero las listas blancas con directivas Allow. Las listas de permitidos explícitas son más claras y más difíciles de configurar incorrectamente, mucho más fácil ver quién tiene acceso.\nLimitación de Tasa con fail2ban Fail2ban monitorea archivos de registro en busca de intentos de autenticación fallidos y crea automáticamente reglas temporales de firewall para bloquear a los reincidentes. Esto reduce la carga del servidor por intentos de conexión y disminuye el ruido en los registros de ataques de fuerza bruta SSH automatizados que escanean internet.\nNo es estrictamente necesario si ya deshabilitaste la autenticación por contraseña (ya que no hay nada que atacar por fuerza bruta), pero es posible que aún quieras ejecutarlo porque mantiene los registros más limpios y reduce los ciclos de CPU desperdiciados por bots que intentan muchas conexiones fallidas por día.\nInstala fail2ban.\n# Fedora/RHEL sudo dnf install fail2ban fail2ban-firewalld # Habilita e inicia el servicio sudo systemctl enable --now fail2ban Crea un archivo de configuración local /etc/fail2ban/jail.local.\n# Crea archivo de anulación local sudo vim /etc/fail2ban/jail.local # Agrega configuración de jaula SSH [DEFAULT] # Duración del baneo en segundos (10 minutos) bantime = 600 # Ventana de tiempo para contar fallos (10 minutos) findtime = 600 # Número de fallos antes del baneo maxretry = 5 # Ignorar localhost y tus IPs de confianza ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24 [sshd] enabled = true port = ssh logpath = /var/log/secure backend = systemd Si cambiaste tu puerto SSH del predeterminado 22, actualiza el puerto.\n[sshd] enabled = true port = 2222 # Tu puerto SSH personalizado logpath = /var/log/secure backend = systemd Reinicia fail2ban para aplicar la configuración.\n# Reinicia el servicio sudo systemctl restart fail2ban Fail2ban funciona analizando registros de autenticación y creando reglas enriquecidas de firewalld (o reglas de iptables, dependiendo de tu configuración de backend). Puedes ver los baneos activos en tu firewall.\n# Ver reglas enriquecidas de firewalld creadas por fail2ban sudo firewall-cmd --list-rich-rules ¿Cambiar el Puerto SSH Predeterminado? No cambio el puerto SSH predeterminado del 22 por pereza\u0026hellip; Cambiar el puerto sí reduce el ruido en los registros de escaneos automatizados, pero alguien que realmente quiera acceso o algunos bots avanzados descubrirán cuando SSH está en otro puerto.\nSi estás detrás de un firewall o usando algo como Tailscale o Headscale (que es mi caso), el puerto SSH ni siquiera está expuesto a internet público de todos modos. Pero si estás ejecutando un servidor directamente expuesto a internet y quieres reducir el ruido constante de escaneo en tus registros, así es como cambiarlo.\n# En /etc/ssh/sshd_config Port 2222 # Elige un número de puerto alto (1024-65535) # Actualiza las reglas del firewall (elimina el servicio ssh de firewalld en el puerto 22 y agrega el puerto personalizado) sudo firewall-cmd --permanent --add-port=2222/tcp sudo firewall-cmd --permanent --remove-service=ssh sudo firewall-cmd --reload # Reinicia SSH sudo systemctl restart sshd La principal desventaja es que tienes que recordar especificar el puerto cada vez que te conectas, lo cual es molesto, pero también puedes especificarlo como una configuración predeterminada en tu archivo local ~/.ssh/config.\nHost myserver HostName your-server.com Port 2222 User cloud Entonces simplemente puedes ejecutar ssh myserver y automáticamente usa el puerto y nombre de usuario configurados.\nConfiguración del Firewall Linux usa firewalld (en RHEL/Fedora) o ufw (en Debian/Ubuntu) como interfaz para netfilter, el marco de filtrado de paquetes del kernel. Estoy usando firewalld, que agrupa las reglas del firewall en zonas y servicios para una gestión más fácil en comparación con iptables.\nLa configuración predeterminada del firewall suele ser bastante buena, pero hay algunos pequeños cambios que me gusta hacer.\n¿Qué son las Zonas de Firewalld? Firewalld usa \u0026ldquo;zonas\u0026rdquo; para agrupar interfaces de red y definir niveles de confianza. Cada zona tiene una política predeterminada para el tráfico entrante. Las zonas más comúnmente usadas son:\ndrop: Descarta todos los paquetes entrantes sin respuesta (más restrictiva) block: Rechaza todos los paquetes entrantes con mensajes icmp-host-prohibited public: Zona predeterminada para redes no confiables, permite solo servicios específicos trusted: Permite todo el tráfico (usar con cuidado, típicamente para interfaces VPN) Verifica tu configuración actual del firewall.\n# Mostrar zonas activas y sus interfaces sudo firewall-cmd --get-active-zones # Verificar zona predeterminada sudo firewall-cmd --get-default-zone # Listar todas las reglas en la zona actual sudo firewall-cmd --list-all # Ver todas las zonas y sus configuraciones sudo firewall-cmd --list-all-zones Restringe tus puertos y servicios permitidos para aceptar solo el tráfico que estás esperando. Bloquea todo lo demás.\nGestión de Servicios del Firewall Firewalld viene con definiciones de servicios predefinidas para aplicaciones comunes como HTTP, HTTPS, SSH y DNS. Estos son más fáciles de trabajar que recordar números de puerto.\n# Listar servicios predefinidos disponibles sudo firewall-cmd --get-services # Permitir un servicio permanentemente sudo firewall-cmd --permanent --add-service=http sudo firewall-cmd --permanent --add-service=https # Eliminar un servicio sudo firewall-cmd --permanent --remove-service=dhcpv6-client # Agregar un puerto personalizado si no existe un servicio predefinido sudo firewall-cmd --permanent --add-port=8080/tcp # Eliminar un puerto sudo firewall-cmd --permanent --remove-port=8080/tcp # Recargar el firewall para aplicar todos los cambios sudo firewall-cmd --reload La opción --permanent escribe los cambios en el disco para que persistan a través de reinicios. Sin ella, las reglas solo se aplican hasta que se recarga el firewall o se reinicia el sistema.\nFiltrado ICMP ICMP se usa para diagnósticos de red como ping y descubrimiento de MTU de ruta. El consejo de seguridad común es \u0026ldquo;deshabilitar ping\u0026rdquo; bloqueando paquetes ICMP echo-request. Esto evita que alguien enumere fácilmente hosts activos en tu red a través de barridos de ping.\nTen cuidado ya que bloquear ICMP puede romper funciones legítimas de red, pero permitir todos los tipos de ICMP habilita el reconocimiento de red. Así que es un compromiso como todo en la vida.\nSi quieres bloquear solicitudes de ping.\n# Bloquear ICMP echo-request (pings entrantes) sudo firewall-cmd --permanent --add-icmp-block=echo-request # Bloquear echo-reply también (respuestas a pings salientes) sudo firewall-cmd --permanent --add-icmp-block=echo-reply # Aplicar cambios sudo firewall-cmd --reload # Probar desde otra máquina ping your-server.com # Debería expirar Personalmente, no bloqueo ICMP ya que solucionar problemas de red sin ping es un dolor y los escáneres de puertos no dependen solo de ping.\nHabilitar el Registro del Firewall Por defecto, firewalld no registra los paquetes descartados. Habilitar el registro te permite ver qué está siendo bloqueado, lo cual es útil para solucionar configuraciones incorrectas y detectar actividad de escaneo de bots:\n# Registrar todos los paquetes descartados sudo firewall-cmd --set-log-denied=all sudo firewall-cmd --permanent --set-log-denied=all # Opciones: off, all, unicast, broadcast, multicast # \u0026#39;unicast\u0026#39; es menos ruidoso que \u0026#39;all\u0026#39; pero aún útil # Ver paquetes descartados en registros del sistema sudo journalctl -f -u firewalld sudo tail -f /var/log/messages | grep -i REJECT Actualizaciones de Seguridad Automatizadas Aplica actualizaciones de seguridad tan pronto como estén disponibles ya sea con un temporizador systemd o dnf-automatic.\nA algunos puede que no les guste pero soy perezoso.\nDNF Automatic DNF Automatic es la herramienta oficial en Fedora y sistemas basados en RHEL para automatizar la descarga e instalación de paquetes.\nYo la uso para instalar automáticamente actualizaciones de seguridad mientras dejo las actualizaciones regulares de características para revisión manual.\nInstala DNF Automatic.\n# Instalar paquete sudo dnf install dnf-automatic Configura el comportamiento de actualización en /etc/dnf/automatic.conf.\n# Editar configuración sudo vim /etc/dnf/automatic.conf # Configuraciones clave a modificar: [commands] # Qué hacer con las actualizaciones # apply = descargar e instalar # download = solo descargar # check = solo verificar actualizaciones upgrade_type = security apply_updates = yes [emitters] # Cómo recibir notificaciones emit_via = stdio [email] # Configuración de correo si quieres notificaciones por email (requiere postfix o similar) email_from = root@localhost email_to = cloud@example.com email_host = localhost Yo establezco upgrade_type = security y apply_updates = yes. Esto instala automáticamente actualizaciones de seguridad pero deja las actualizaciones regulares de características para revisión manual. Puede que prefieras upgrade_type = default para instalar todo automáticamente, lo cual es muy conveniente.\nHabilita e inicia el temporizador systemd.\n# Habilitar temporizador (se ejecuta diariamente por defecto) sudo systemctl enable --now dnf-automatic.timer # Verificar estado del temporizador systemctl status dnf-automatic.timer # Ver calendario del temporizador systemctl list-timers dnf-automatic.timer # Activar manualmente una verificación de actualización sudo systemctl start dnf-automatic.service Verifica los registros para verificar que está funcionando.\n# Ver registros de DNF automatic sudo journalctl -u dnf-automatic.service # Salida de última ejecución sudo journalctl -u dnf-automatic.service -n 50 Actualizaciones Automáticas de Flatpak Si estás usando Flatpaks y quieres actualizaciones automatizadas puedes usar la aplicación del centro de software de Gnome para activar las auto-actualizaciones o simplemente crear un temporizador systemd simple para actualizar a intervalos regulares.\n# Crear servicio systemd para actualizaciones de Flatpak sudo vim /etc/systemd/system/flatpak-update.service [Unit] Description=Update Flatpak packages After=network-online.target Wants=network-online.target [Service] Type=oneshot ExecStart=/usr/bin/flatpak update -y Crea un temporizador para ejecutarlo.\n# Crear temporizador systemd sudo vim /etc/systemd/system/flatpak-update.timer [Unit] Description=Daily Flatpak update [Timer] OnCalendar=daily Persistent=true [Install] WantedBy=timers.target Habilita el temporizador.\n# Habilitar temporizador sudo systemctl enable --now flatpak-update.timer Eliminar Servicios No Utilizados Cada servicio en ejecución es una superficie de ataque potencial. Si no estás usando activamente un servicio, deshabilítalo.\nVerifica qué servicios están actualmente en ejecución y habilitados:\n# Listar todos los servicios habilitados (se iniciarán al arrancar) systemctl list-unit-files --state=enabled # Listar servicios actualmente en ejecución systemctl list-units --type=service --state=running Antes de deshabilitar un servicio, verifica qué depende de él para asegurarte de que no estás rompiendo algo crítico:\n# Ver qué se vería afectado por deshabilitar un servicio systemctl list-dependencies --reverse servicename.service # Verificar si algo lo está usando activamente systemctl status servicename.service Busca en Google (o pregunta a una IA) sobre servicios desconocidos antes de deshabilitarlos. Algunos servicios tienen nombres muy raros pero en realidad son legítimos. Una búsqueda rápida en la web de \u0026ldquo;what is [servicename] Fedora\u0026rdquo; usualmente muestra mucha información para ver si es seguro deshabilitarlo.\nDeshabilita los servicios que no necesitas.\n# Deshabilitar y detener un servicio sudo systemctl disable --now ModemManager.service ¿Qué Sigue? Enlace a la Parte 1: Linux Security Hardening Part.2 - SSH, Firewall, and Services.\nLa siguiente parte debería ser SELinux, endurecimiento del kernel, seguridad de systemd\u0026hellip;\n","permalink":"https://danoss.me/es/categories/linux/linux-security-hardening-parte-2/","summary":"Guía completa de hardening de seguridad en Linux: Seguridad SSH, configuración de firewall, actualizaciones automaticas de seguridad y eliminacion de servicios no utilizados, Parte 2 de la serie de hardening de seguridad en Linux","title":"Linux Security Hardening Parte.2 - SSH, Firewall, y Servicios"},{"content":"Tener una higiene básica de seguridad es esencial, aunque es un proceso interminable y la seguridad perfecta no existe.\nEste tema es muy extenso y está en constante evolución. Por eso decidí dividirlo en múltiples partes. Esta parte cubre únicamente el cifrado completo de disco, el bloqueo de cuentas de usuario y la configuración de PAM para la autenticación de usuarios.\nCifrado Completo de Disco con LUKS El cifrado de datos en reposo es imprescindible. Si alguien obtiene acceso físico a tu hardware, el cifrado completo de disco es lo único que protege tus datos de ser leídos directamente desde la unidad.\nLinux utiliza LUKS (Linux Unified Key Setup) para el cifrado de disco.\n¿Qué es LUKS? LUKS añade una capa de cifrado entre el dispositivo de bloque físico (la representación del disco duro dentro de Linux) y el sistema de archivos (ext4, xfs, btrfs\u0026hellip;).\nUtiliza el mapeador de dispositivos del kernel para crear un mapeo entre la unidad física cifrada y un volumen lógico descifrado. Cuando estás usando tu computadora, las aplicaciones solo ven un dispositivo descifrado regular en /dev/mapper/. No son conscientes del cifrado.\nCuando cifras una unidad, LUKS añade un encabezado con metadatos sobre el cifrado (cifrador, tamaño de clave, función de derivación de claves) y hasta 32 ranuras de claves en LUKS2. Estas ranuras de claves pueden almacenar frases de contraseña o archivos de claves que desbloquean el mismo volumen cifrado, por lo que pueden ser utilizadas por múltiples usuarios para descifrar la unidad usando sus propias credenciales almacenadas en ranuras separadas.\nTen en cuenta que para acceder a un volumen cifrado con LUKS, necesitas descifrarlo primero. Por lo tanto, los datos solo están cifrados cuando el volumen está cerrado (bloqueado manualmente o cuando apagas la computadora). Mientras estás trabajando con el volumen, los datos están descifrados en memoria.\nLUKS1 vs LUKS2\nEn sistemas modernos LUKS2 es el predeterminado, que proporciona más ranuras de claves y algunas mejoras.\nHasta 32 ranuras de claves (vs 8 en LUKS1) Derivación de claves Argon2 (resistente a ataques basados en GPU) Soporte para cifrado autenticado Mejor resistencia del encabezado Soporte para re-cifrado en línea (cifrar datos existentes sin reformatear) Funciones de Derivación de Claves\nLa función de derivación de claves determina cómo tu frase de contraseña se convierte en una clave de cifrado:\nPBKDF2 (predeterminado en LUKS1): Rápido pero vulnerable a ataques de fuerza bruta acelerados por GPU Argon2i (predeterminado en LUKS2): Algoritmo con uso intensivo de memoria que resiste ataques de GPU y ataques de tiempo de caché Argon2id: Enfoque híbrido con la mejor protección general contra ataques de GPU y ataques de canal lateral Configuración del Cifrado LUKS No puedes cifrar una unidad que esté actualmente en uso. Necesitas o una unidad nueva o si usas una existente, respaldar los datos, formatear la unidad, cifrarla y luego restaurar.\nLa mayoría de las distribuciones de Linux ofrecen configuración de LUKS durante la instalación (generalmente solo haciendo clic en una casilla de verificación). Solo te pedirán que borres la unidad e ingreses una frase de contraseña. Este es el enfoque más fácil.\nfuente: imagen encontrada en fedoramagazine\nCifrar una Unidad Después de la Instalación\n# Verificar si un dispositivo ya está cifrado con LUKS cryptsetup isLuks -v /dev/sdb1 # Formatear el dispositivo con cifrado LUKS (se te pedirá una frase de contraseña) cryptsetup luksFormat /dev/sdb1 # Usar cifrador y tamaño de clave específicos para más control cryptsetup luksFormat --cipher aes-xts-plain64 --key-size 512 /dev/sdb1 # Especificar función de derivación de claves cryptsetup luksFormat --type luks2 --pbkdf argon2id --pbkdf-memory 1048576 /dev/sdb1 Crear Volumen LUKS con Encabezado Separado\nAlmacenar el encabezado LUKS por separado es más seguro. Sin acceso al archivo de encabezado externo, la unidad cifrada permanece inaccesible. Esto es algo extremo, pero puedes almacenar el encabezado en una unidad USB.\n# Crear LUKS con encabezado separado cryptsetup luksFormat /dev/sdb1 --header /root/luks-header.img # Abrir con encabezado separado cryptsetup luksOpen /dev/sdb1 encrypted-data --header /root/luks-header.img Trabajando con LUKS Ver Versión Actual de LUKS\n# Verificar versión de LUKS cryptsetup luksDump /dev/sdb1 | grep Version Respaldar Encabezado LUKS\nSi el encabezado LUKS se corrompe (sector defectuoso, corrupción del sistema de archivos) tus datos cifrados serán irrecuperables. Respalda tu encabezado LUKS inmediatamente después de cifrar cualquier unidad.\n# Respaldar encabezado LUKS (hazlo inmediatamente después del cifrado) cryptsetup luksHeaderBackup /dev/sdb1 --header-backup-file /root/luks-header-backup.img # Almacenar respaldo en medios separados (unidad USB, gestor de contraseñas, almacenamiento en la nube) # NO lo almacenes en la unidad cifrada misma # Restaurar encabezado corrupto cryptsetup luksHeaderRestore /dev/sdb1 --header-backup-file /root/luks-header-backup.img # Verificar integridad del encabezado cryptsetup luksDump /dev/sdb1 Abrir Volumen LUKS Manualmente\nUna vez que la unidad está cifrada, necesitas abrir el volumen LUKS para acceder a su contenido.\n# Abrir el volumen LUKS con un nombre de mapeador de dispositivos (crea /dev/mapper/encrypted-data) cryptsetup luksOpen /dev/sdb1 encrypted-data # Formatear el volumen descifrado con un sistema de archivos (aquí, xfs) mkfs.xfs /dev/mapper/encrypted-data # Montar el volumen como cualquier otro dispositivo mount /dev/mapper/encrypted-data /mnt/secure Cerrar Volumen LUKS Manualmente\nCierra el volumen LUKS abierto para restringir el acceso. Esto elimina la entrada del mapeador de dispositivos para asegurar que el contenido ya no sea accesible.\n# Desmontar el sistema de archivos primero umount /mnt/secure # Cerrar el volumen LUKS cryptsetup luksClose encrypted-data # Sintaxis alternativa más corta cryptsetup close encrypted-data Trabajando con Ranuras de Claves\nPuedes añadir claves a diferentes ranuras de claves para tener múltiples métodos de descifrado (esto es útil para sistemas multiusuario o recuperación).\nYo solo uso la ranura 0 para mi frase de contraseña principal y la ranura 1 para recuperación (guardada en el gestor de contraseñas).\n# Ver ranuras de claves actuales y su estado cryptsetup luksDump /dev/sdb1 | grep \u0026#34;Key Slot\u0026#34; # Añadir una nueva frase de contraseña a una ranura disponible cryptsetup luksAddKey /dev/sdb1 # Añadir un archivo de claves en lugar de una frase de contraseña cryptsetup luksAddKey /dev/sdb1 /path/to/keyfile # Añadir a un número de ranura específico cryptsetup luksAddKey --key-slot 2 /dev/sdb1 # Cambiar una frase de contraseña existente cryptsetup luksChangeKey /dev/sdb1 # Eliminar una ranura de claves cryptsetup luksKillSlot /dev/sdb1 1 Montaje Automático con Archivos de Claves\nAñade archivos de claves para montar automáticamente la unidad al arrancar (esto se configura automáticamente si añades cifrado LUKS en la instalación).\nCrear archivo de claves.\n# Generar un archivo de claves aleatorio de 4096 bytes dd if=/dev/urandom of=/root/luks-keyfile bs=4096 count=1 # Restringir permisos (crítico—prevenir acceso no autorizado) chmod 400 /root/luks-keyfile # Añadirlo al volumen LUKS cryptsetup luksAddKey /dev/sdb1 /root/luks-keyfile Configurar descifrado automático en /etc/crypttab.\n# Sintaxis: nombre dispositivo archivo_claves opciones encrypted-data /dev/sdb1 /root/luks-keyfile luks Añadir la entrada de montaje automático en /etc/fstab.\n# Usar el nombre del mapeador de dispositivos en /etc/fstab /dev/mapper/encrypted-data /mnt/secure xfs defaults 0 0 El volumen LUKS ahora se descifra y monta automáticamente al arrancar. Los datos permanecen cifrados cuando el sistema está apagado o durante las etapas previas al arranque.\nSwap Cifrado\nSi estás usando espacio swap, también debes cifrarlo. De lo contrario, los datos sensibles que se paginan al swap durante tu sesión permanecen allí sin cifrar en el disco.\n# Clave aleatoria para swap (regenerada en cada arranque) # Añadir a /etc/crypttab swap /dev/sda2 /dev/urandom swap,cipher=aes-xts-plain64,size=512 # En /etc/fstab /dev/mapper/swap none swap defaults 0 0 Seguridad de Cuentas de Usuario Deshabilitar el Login de Root Ejecutar como root no es una buena idea. Deshabilita la cuenta root y solo usa un usuario regular con privilegios sudo en su lugar.\nEsto previene que cualquiera inicie sesión como root, ya sea en la consola o vía SSH. Aún puedes obtener privilegios root a través de sudo o usando sudo -i para un shell root interactivo.\n# Bloquear la cuenta root passwd -l root # Denegar login de root vía SSH /etc/ssh/sshd_config vim /etc/ssh/sshd_config PermitRootLogin no Tiempos de Espera de Sesión Cerrar sesión automáticamente de usuarios inactivos en /etc/profile.\n# Añadir a /etc/profile TMOUT=900 # Cerrar sesión automáticamente después de 15 minutos de inactividad readonly TMOUT export TMOUT Historial de Contraseñas Prevenir que los usuarios ciclen y reutilicen contraseñas recientes. La mayoría de las distribuciones recuerdan las últimas 10 contraseñas por defecto, así que puedes aumentar este número para prevenir que los usuarios reutilicen contraseñas antiguas. Un poco extremo para mí pero bueno saberlo.\nCambiar la configuración en /etc/security/pwhistory.conf.\n# Aumentar a 24 (común en entornos Linux empresariales) remember = 24 enforce_for_root Restringir Permisos de Directorio Home Los permisos predeterminados del directorio home en algunas distribuciones son demasiado permisivos, ya que los usuarios \u0026ldquo;otros\u0026rdquo; a menudo pueden leer archivos en tu directorio home.\nCambiar permisos existentes del directorio home.\n# Eliminar acceso de lectura para otros chmod o-r $HOME # Más explícitamente, establecer acceso solo para el propietario chmod 700 $HOME Establecer valores predeterminados restrictivos para nuevos usuarios en /etc/login.defs.\n# Establecer umask restrictivo para nuevos archivos UMASK 077 # Establecer permisos del directorio home solo para el propietario HOME_MODE 0700 Establecer umask restrictivo para nuevos archivos de usuarios existentes en ~/.bashrc (o mejor, en el directorio drop-in ~/.bashrc.d/).\n# Establecer umask para nuevos archivos creados por este usuario umask 027 # O más restrictivo (acceso solo para el propietario) umask 077 Configurar Acceso Sudo sudo permite a usuarios configurados ejecutar comandos con privilegios elevados o como otro usuario sin conocer la contraseña del usuario objetivo. Asegúrate de que esto esté configurado correctamente.\nEditar /etc/sudoers con visudo, que valida la sintaxis antes de guardar.\n# Editar /etc/sudoers visudo # Mejor: crear un archivo de configuración personalizado en el directorio drop-in de sudoers visudo -f /etc/sudoers.d/custom Algunas buenas configuraciones de seguridad para sudo:\n# Requerir contraseña para cada comando sudo Defaults timestamp_timeout=0 # O establecer un tiempo de espera de 5 minutos para volver a pedir la contraseña al usuario si es muy molesto Defaults timestamp_timeout=5 # Usar alias de sudo # Sintaxis: User_Alias NOMBRE = usuario1, usuario2, %grupo1, ... User_Alias ADMINS = alice, bob, %sysadmin # Sintaxis: Host_Alias NOMBRE = host1, host2, ... Host_Alias PRODUCTION = prod-web01, prod-db01, 10.0.1.0/24 # Sintaxis: Cmnd_Alias NOMBRE = /ruta/al/comando1, /ruta/al/comando2, ... # ¡Muy importante! Cuando los comandos se listan con argumentos específicos, solo se permiten esas combinaciones exactas de argumentos. Además, no uses comodines ya que por ejemplo, un comando como `/usr/bin/systemctl * sshd` permite `systemctl stop sshd`, `systemctl restart sshd`, etc. ¡Peligroso! Cmnd_Alias SERVICES = /usr/bin/systemctl, /usr/sbin/service Cmnd_Alias SOFTWARE = /usr/bin/dnf, /usr/bin/yum, /usr/bin/rpm # Todo junto, regla sudo usando alias ADMINS PRODUCTION=(ALL) SOFTWARE, SERVICES Verificar los privilegios sudo de tu usuario.\n# Listar tus propios privilegios sudo sudo -l Política de Antigüedad de Contraseñas Establecer antigüedad de contraseñas para nuevos usuarios en /etc/login.defs.\n# Antigüedad máxima de contraseña en días PASS_MAX_DAYS 90 # Días mínimos entre cambios de contraseña (previene el ciclo inmediato de vuelta a contraseñas antiguas) PASS_MIN_DAYS 1 # Días antes de la expiración para advertir al usuario PASS_WARN_AGE 7 # Longitud mínima de contraseña (configuración heredada, usar pwquality en su lugar) PASS_MIN_LEN 8 Configurar antigüedad de contraseñas para usuarios existentes:\n# Ver configuración actual de antigüedad de contraseñas chage -l username # Establecer que la contraseña expire en 90 días chage -M 90 username # Establecer días mínimos entre cambios de contraseña chage -m 7 username # Forzar cambio de contraseña en el próximo login chage -d 0 username # Establecer fecha de expiración de cuenta chage -E 2025-12-31 username # Modo de configuración interactivo chage username Entendiendo PAM Entender (al menos a alto nivel) PAM es necesario.\nPAM es un marco de autenticación centralizado que muchas aplicaciones usan para verificar credenciales de usuario. Sin PAM, cada aplicación implementaría su propia lógica de autenticación.\nEl proceso de autenticación PAM funciona así:\nLa aplicación solicita autenticación a través de la API de PAM PAM lee la configuración de /etc/pam.d/ para ese servicio específico PAM carga y ejecuta los módulos configurados en orden Cada módulo realiza su verificación de autenticación específica PAM combina los resultados y le dice a la aplicación éxito o fallo Los módulos PAM se dividen en cuatro tipos:\nauth - Verificar credenciales (contraseñas, tokens, biometría, YubiKeys) account - Verificar estado de cuenta (expiración, horarios de acceso, bloqueos) password - Manejar cambios de contraseña y aplicar reglas de complejidad session - Configurar y desmantelar sesiones de usuario (montar directorios home, establecer límites) Las banderas de control PAM determinan qué sucede cuando un módulo tiene éxito o falla:\nrequisite - Debe tener éxito o la autenticación falla inmediatamente, no se verifican más módulos sufficient - Si esto tiene éxito, se omiten los módulos restantes de este tipo required - Debe tener éxito, pero PAM continúa verificando otros módulos independientemente optional - El resultado del módulo solo importa si es el único módulo en la pila include - Incluir todas las líneas del tipo dado desde otro archivo de configuración Aplicar Complejidad de Contraseñas Complejidad de Contraseñas con pwquality\nEl módulo PAM pam_pwquality aplica requisitos de complejidad de contraseñas a través de PAM. Utiliza un sistema de \u0026ldquo;créditos\u0026rdquo; para definir la fortaleza de la contraseña (tendrás que especificar el número requerido de dígitos, letras mayúsculas, letras minúsculas y caracteres especiales).\nCómo funciona es algo confuso pero, por ejemplo, para minlen = 12 y estableces dcredit = 1, una contraseña con un dígito obtiene 1 crédito hacia la longitud mínima, por lo que necesita 11 caracteres regulares más el dígito. Pero si ucredit = -1, la mayúscula es requerida pero no reduce el requisito de longitud, aún necesitas 12 caracteres en total incluyendo la mayúscula.\nConfigurarlo en /etc/security/pwquality.conf.\n# Aclaración del sistema de créditos: # Valor positivo (dcredit = 1): \u0026#34;Si la contraseña tiene 1+ dígitos, reducir minlen en 1\u0026#34; # Valor negativo (ucredit = -1): \u0026#34;La contraseña DEBE tener 1+ mayúscula, sin crédito de longitud\u0026#34; # Ejemplo con minlen = 12: # dcredit = 1 → Contraseña con dígito puede ser de 11 caracteres en total # ucredit = -1 → Contraseña debe tener mayúscula Y aún ser de 12 caracteres dcredit = -1 # Requerir al menos 1 dígito ucredit = -1 # Requerir al menos 1 mayúscula lcredit = -1 # Requerir al menos 1 minúscula ocredit = -1 # Requerir al menos 1 carácter especial # Longitud mínima de contraseña (considerando créditos) minlen = 12 # Máximo de caracteres idénticos consecutivos maxrepeat = 2 # Máximo de caracteres consecutivos de la misma clase de caracteres maxclassrepeat = 3 # Número de intentos de entrada de contraseña antes de rendirse retry = 3 # Mínimo de caracteres diferentes de la contraseña antigua difok = 5 # Verificar contra palabras del diccionario dictcheck = 1 # Rechazar contraseñas que contengan el nombre de usuario usercheck = 1 # Aplicar reglas para usuario root (0=sí, 1=no) enforce_for_root = 0 Integrar pwquality con PAM\nAsegurar que PAM use el módulo pwquality verificando /etc/pam.d/passwd y /etc/pam.d/system-auth.\n# En /etc/pam.d/passwd password requisite pam_pwquality.so retry=3 password sufficient pam_unix.so sha512 shadow try_first_pass use_authtok password required pam_deny.so # En /etc/pam.d/system-auth password requisite pam_pwquality.so try_first_pass local_users_only retry=3 password sufficient pam_unix.so sha512 shadow try_first_pass use_authtok password required pam_deny.so Prevenir Ataques de Fuerza Bruta El módulo PAM pam_faillock protege contra ataques de contraseña de fuerza bruta bloqueando cuentas después de intentos de autenticación fallidos consecutivos. Esto es importante para cualquier sistema, incluso si no está expuesto a la red. Ten en cuenta que esto solo protege para logins basados en PAM (por ejemplo, no aplica para modo de recuperación).\nConfigurar el comportamiento de faillock en /etc/security/faillock.conf.\n# Directorio para registros de intentos fallidos dir = /var/run/faillock # Número de intentos fallidos antes del bloqueo deny = 4 # Duración del bloqueo en segundos (1200 = 20 minutos) unlock_time = 1200 # Aplicar bloqueo a la cuenta root even_deny_root # Duración del bloqueo específica para root (si even_deny_root está establecido) root_unlock_time = 600 # Habilitar registro de auditoría audit # Bloquear cuentas si faillock no puede escribir en el directorio de registro silent Probar la configuración.\n# Intentar iniciar sesión con contraseña incorrecta múltiples veces ssh username@localhost # Verificar si la cuenta está bloqueada faillock --user username # Verificar que aún puedes desbloquear sudo faillock --user username --reset Habilitar Faillock con Authselect\nEn RHEL y Fedora, usa perfiles de authselect en lugar de editar manualmente archivos PAM. Esto previene conflictos de configuración y asegura consistencia entre archivos de servicio PAM.\n# Mostrar perfil authselect actual authselect current # Listar perfiles disponibles authselect list # Listar características de un perfil authselect list-features sssd # Habilitar característica faillock authselect enable-feature with-faillock # Aplicar cambios authselect apply-changes Authselect modifica /etc/pam.d/system-auth y /etc/pam.d/password-auth para incluir verificaciones faillock. La configuración se ve así.\n# Sección Auth - verificar bloqueo antes de la autenticación auth required pam_faillock.so preauth silent auth sufficient pam_unix.so nullok try_first_pass auth [default=die] pam_faillock.so authfail auth required pam_deny.so # Sección Account - aplicar bloqueo account required pam_faillock.so account required pam_unix.so Ver Intentos de Login Fallidos\n# Mostrar todos los intentos fallidos en todo el sistema faillock # Mostrar intentos fallidos para usuario específico faillock --user username # Información más detallada faillock --user username --verbose Login con YubiKey He añadido reglas PAM para iniciar sesión vía YubiKey para más seguridad.\nMás detalles aquí: Using YubiKey for Local Linux Authentication\n¿Qué Sigue? Al final, el endurecimiento de seguridad y la privacidad no son perfectos. Hay medidas extremas que te hacen muy seguro, pero hacen que usar el sistema sea doloroso. Este es un buen equilibrio entre usabilidad y seguridad.\nLas próximas partes cubrirán SSH, redes, kernel, LSM (específicamente SELinux), systemd, configuración de firewall\u0026hellip;\n","permalink":"https://danoss.me/es/categories/linux/linux-security-hardening-parte-1/","summary":"Guía completa de hardening de seguridad en Linux: cifrado completo de disco con LUKS, configuración de PAM, bloqueo de cuentas de usuario y protección contra fuerza bruta, Parte 1 de la serie de hardening de seguridad en Linux","title":"Linux Security Hardening Parte.1 - LUKS, PAM y User Lockdown"},{"content":"¡Finalmente Firefox soporta directorios XDG!\nDespués de años de desordenar los directorios home con carpetas .mozilla, Firefox 147 finalmente adoptó la especificación XDG Base Directory. Aunque el cambio es pequeño, es excelente para los fanáticos de la organización.\nLas aplicaciones que no siguen la especificación de directorios XDG crean desorden en los directorios home de los usuarios al crear un directorio dotfile para cada una. Por ejemplo, .mozilla podría ser un directorio al lado de .cache, al lado de .nmp, etc.\n¿Qué es XDG? La especificación XDG Base Directory proviene de freedesktop.org para crear una estructura consistente sobre dónde las aplicaciones deberían almacenar sus archivos en sistemas Linux. En lugar de que cada programa cree su propio directorio oculto directamente en tu carpeta home, XDG define ubicaciones específicas basadas en el tipo de archivo.\nLos archivos de configuración pertenecen a ~/.config. Los datos de aplicación (cosas como bases de datos, perfiles, estado) van en ~/.local/share. Los archivos de caché van a ~/.cache.\nEsto facilita, por ejemplo, hacer respaldos u obtener datos de aplicaciones, simplemente obtén todo de ~/.config y ~/.local/share. ¿Quieres limpiar el caché? elimina ~/.cache sin preocuparte. Bastante simple.\nQué Cambió en Firefox 147 Con Firefox 147, las instalaciones nuevas usan rutas compatibles con XDG. Tu perfil va a ~/.config/mozilla/firefox, el caché va a ~/.cache/mozilla/firefox. Limpio, organizado, exactamente donde debería estar.\nEsto solo afecta a instalaciones nuevas. Las instalaciones existentes se mantienen en el directorio ~/.mozilla. Este cambio no rompe nada. Firefox simplemente verifica las variables de entorno XDG y usa esas rutas para perfiles nuevos mientras respeta las instalaciones existentes.\n¿Deberías Migrar? No hay necesidad de migrar. Nada estaba roto para empezar y Firefox continúa funcionando con la ruta antigua. Soy cauteloso de que tal vez algunas extensiones podrían fallar con la nueva ruta, así que si migras siempre respalda la configuración y copia los datos del perfil a la nueva ubicación.\n","permalink":"https://danoss.me/es/categories/linux/firefox-utiliza-directorios-xdg-en-linux/","summary":"Finalmente Firefox utiliza directories XDG!","title":"Firefox Finalmente Utiliza Directorios XDG en Linux"},{"content":"Algo viejo, pero todavía relevante de conocer para evitar una simple vía de escalada de privilegios son los shell escapes.\n¿Qué son los Shell Escapes? Los shell escapes son una característica de muchos programas basados en texto que te permiten salir temporalmente de la interfaz del programa para ejecutar comandos de shell sin cerrar la aplicación.\nEl problema es que los shell escapes no solo te dan acceso a un shell, te dan acceso a un shell con los permisos y el entorno del programa padre, así que si estás ejecutando vim con sudo, cualquier shell escape que actives se ejecuta con privilegios de root, creando un potencial vector de escalada de privilegios.\nEsto no es un bug, solo una característica que ha existido durante años pero que puede ser peligrosa si no se gestiona.\nCómo Funcionan los Shell Escapes Así es como funcionan los shell escapes:\nUn usuario ingresa al editor de texto vim. En la interfaz de vim, el usuario activa un shell escape (por ejemplo, !/bin/sh) que instruye a vim (el proceso padre) a invocar la llamada al sistema fork() para crear un nuevo proceso hijo (el nuevo shell). Este proceso hijo es una copia exacta del proceso padre (vim), incluyendo su estado actual, entorno de ejecución y privilegios: Variables de entorno (PATH, HOME, USER, etc.) Directorio de trabajo (ubicación actual en el sistema de archivos) Permisos del proceso (UID/GID, grupos suplementarios) Descriptores de archivo (archivos abiertos, conexiones de red) Límites de recursos (memoria, CPU, manejadores de archivo) El proceso hijo luego invoca la llamada al sistema execve() para reemplazarse a sí mismo con un shell (por ejemplo, /bin/sh). El shell luego comienza la ejecución con el entorno y permisos heredados. Entonces, si el proceso padre (por ejemplo, vim) fue ejecutado con privilegios sudo, el shell hereda estos privilegios elevados también. Cuando el usuario sale del shell (mediante exit o Ctrl+D), el proceso del shell termina y el control regresa al proceso padre (vim). El proceso padre continúa la ejecución como si nada hubiera pasado. Programas con Shell Escapes Ejemplos Comunes en Linux En una instalación regular de Linux, los shell escapes se pueden realizar en:\nEditores de texto como vim y emacs soportan shell escapes. En vim, puedes usar :shell para abrir un shell interactivo completo, :!command para ejecutar comandos individuales, o incluso :read !command y :write !command para pasar contenido a través de comandos de shell. Cada uno de estos puede ser abusado si vim se está ejecutando con privilegios elevados. Programas paginadores como less y more tienen sus propios mecanismos de shell escape. En less, la sintaxis !command ejecuta comandos de shell, la tecla v abre tu $EDITOR (que podría en sí mismo soportar shell escapes), y la sintaxis | command pasa contenido a través de comandos de shell. Clientes de base de datos como mysql, psql y sqlite3 a menudo tienen características de shell escape. Muchos te permiten ejecutar comandos del sistema desde dentro de sus interfaces interactivas, lo cual se convierte en un problema cuando estos clientes se ejecutan con privilegios elevados o tienen acceso a datos sensibles. El Repositorio GTFOBins El GTFOBins es un repositorio genial de binarios de Linux que soportan shell escapes y técnicas similares de escalada de privilegios.\nEs un buen recurso para conocer, por ejemplo muestra que puedes usar shell escapes de less así. Ahora eres root, porque less ejecutó el shell con sus privilegios.\nsudo less /etc/hosts # Dentro de less, presiona ! seguido del comando (sintaxis: !command) !/bin/sh sh-5.3 # Nuevo prompt Container Escapes Algo que pienso como una evolución de los shell escapes son los container escapes. Ambos involucran romper el aislamiento para alcanzar un entorno más privilegiado. En lugar de un breakout de shell como vim, los container escapes rompen el aislamiento del contenedor para acceder al host.\nLos contenedores son comunes hoy en día y muchos de ellos ejecutan cargas de trabajo AI/ML, lo que los hace un buen objetivo para exploits, ya que algunos necesitan acceso privilegiado a recursos de hardware como GPU, requieren montajes de socket, o algunas capacidades peligrosas del kernel para funcionar como se pretende.\nDefenderse Contra los Shell Escapes Volviendo a los shell escapes\u0026hellip; Defenderse contra los shell escapes es directo pero importante, hay muchos enfoques para estar protegido.\nPrincipio de Mínimo Privilegio Siempre otorga el acceso mínimo necesario a los usuarios para realizar las tareas.\nPara acceso sudo, otorga acceso a comandos específicos con argumentos específicos, no acceso amplio a programas interactivos. Por ejemplo, en el archivo sudoers, otorga acceso solo a sudoedit para tareas de edición de archivos en lugar de otorgar acceso general sudo a editores de texto. Usa la etiqueta NOEXEC para prevenir la ejecución de comandos cuando no sea necesario.\nPara contenedores, ejecuta con las capacidades mínimas necesarias. Elimina todas las capacidades y agrega de vuelta solo lo que se requiere. Nunca ejecutes contenedores privilegiados, usa contenedores rootless en su lugar.\nsudoedit Para edición de archivos, otorga acceso a sudoedit a los usuarios en lugar de sudo simple:\n# En /etc/sudoers - incorrecto: user ALL=(ALL) /usr/bin/vim /etc/ssh/sshd_config # Forma correcta: user ALL=(ALL) sudoedit /etc/ssh/sshd_config sudoedit crea una copia temporal del archivo objetivo propiedad del usuario. Abre esa copia en el editor de texto del usuario ejecutándose con los privilegios normales del usuario. Cuando guardas y sales, sudoedit copia el archivo modificado de vuelta a la ubicación original con privilegios de root.\nDado que el editor nunca se ejecuta como root, los shell escapes solo te dan acceso a tu propia cuenta de usuario.\nNOEXEC En sudoers, usa la etiqueta NOEXEC para comandos que necesitan ejecutarse con privilegios elevados pero no deberían poder ejecutar otros programas:\n# Contenido de /etc/sudoers user ALL=(ALL) NOEXEC: /usr/bin/vim /etc/config user ALL=(ALL) NOEXEC: /usr/bin/less /var/log/syslog NOEXEC establece la variable de entorno LD_PRELOAD para cargar una librería que intercepta llamadas a execve(). Cuando un shell escape intenta generar un nuevo proceso, la llamada es bloqueada.\nAlgunos programas podrían usar llamadas al sistema que no son interceptadas, y puede romper programas que legítimamente necesitan ejecutar otros comandos. Pero para muchos casos de uso, proporciona una buena protección contra los shell escapes.\nConclusión Los shell escapes no son nuevos, pero siguen siendo relevantes ya que representan cómo la escalada de privilegios puede ocurrir a través de características cotidianas. A veces una funcionalidad conveniente puede llevar a consecuencias peligrosas.\nEl principio de mínimo privilegio siempre es bienvenido. Previene la explotación de sudo otorgando acceso a comandos específicos, usa sudoedit para edición de archivos, aplica NOEXEC donde sea apropiado, y piensa en qué necesitan realmente los usuarios y contenedores. La mayoría de los ataques de escalada de privilegios tienen éxito porque alguien otorgó más acceso del necesario.\nTemas relacionados:\nsudo su - ¿Por Qué Abrazar la Redundancia? Emulador de Terminal Kitty Kernel Panic!!! ","permalink":"https://danoss.me/es/categories/linux/shell-escapes/","summary":"Notas sobre shell escapes en Linux","title":"Shell Escapes"},{"content":"Hoy estaba limpiando algunos archivos viejos en mi computadora personal y encontré mi script de configuración de respaldos locales. Lo configuré hace más de un año usando restic y Backblaze B2 para almacenamiento en la nube.\nRestic es un programa de respaldo rápido y seguro para Linux que utiliza cifrado y deduplicación para crear instantáneas eficientes de tus archivos en almacenamiento local o remoto. Backblaze B2 es un servicio de almacenamiento en la nube compatible con S3 diseñado para respaldos y archivos, ofrece almacenamiento más económico que AWS o Google Cloud. Soy creyente de la mentalidad de configurar una vez y olvidar. El script respalda archivos y directorios seleccionados de mi computadora al almacenamiento en la nube B2 cada 2 semanas y me envía una notificación una vez que la operación de respaldo se completa y las verificaciones de restic pasan. Cada 6 meses aproximadamente le echo un vistazo para asegurarme de que los respaldos estén realmente ahí y funcionando.\nPor suerte nunca he tenido que hacer una restauración completa, pero la configuración funciona y no me preocupa perder mis cosas si mi disco duro muere mañana. Esto es solo para mi computadora principal, nada relacionado con servidores. Solo archivos personales que me molestaría perder.\n¿Por Qué Restic y B2? Sí, podría usar OneDrive de Microsoft, Google Drive, Dropbox, etc. pero no me gustan sus prácticas de privacidad y el hecho de que están constantemente ejecutándose. Solo necesito una solución de respaldo automatizada simple con una huella mínima en mi máquina.\nRestic cifra todo con AES-256, deduplica datos automáticamente y funciona con básicamente cualquier backend de almacenamiento.\nBackblaze B2 es, creo yo, la opción de almacenamiento en la nube más económica (comparado con Cloudflare R2, AWS S3 o Google Cloud) y es bastante confiable. Confío en el equipo de Backblaze. Para respaldos personales donde con suerte nunca estaré descargando nada, esto funciona genial. Las primeras 3 veces tu almacenamiento es gratis para descargas, luego son $0.01/GB después de eso.\nAdemás B2 es compatible con S3, lo que significa que si alguna vez quiero cambiar a Cloudflare R2 o lo que sea, solo cambio la URL del repositorio. Mismo script, diferente backend (no estoy atado a ningún proveedor).\nLa Configuración La configuración es solo un shell script que verifica que existan los archivos de configuración, carga las credenciales y verifica que el respaldo se haya hecho correctamente ejecutando restic check al final.\nScript: restic-backup.sh\n¿Qué Se Respalda?\nLos archivos de configuración especifican qué directorios deben respaldarse y qué patrones deben excluirse. Si necesito modificar las rutas de respaldo existentes solo edito el archivo.\n# Archivo de configuración de rutas de respaldo de ejemplo ~/Documents ~/Pictures ~/.ssh Gestión de Secretos\nLos secretos (llaves API de B2 y contraseña del repositorio de restic) se almacenan en un archivo con permisos 0600, por lo que solo mi usuario local tiene acceso a él. Esta no es la forma más segura de manejar secretos, pero he sido perezoso para migrar a una opción más segura.\n# Secretos de ejemplo B2_ACCOUNT_ID=\u0026#34;0123456789abcdef01234567\u0026#34; B2_ACCOUNT_KEY=\u0026#34;K001aBcDeFgHiJkLmNoPqRsTuVwXyZ\u0026#34; RESTIC_REPOSITORY=\u0026#34;b2:my-backup-bucket:restic\u0026#34; Automatización\nSystemd hace las cosas fáciles. Solo creé una unidad .service para ejecutar el script y una unidad .timer para ejecutar el servicio a intervalos regulares.\nEl servicio se ejecuta como mi cuenta de usuario regular así que no se necesita acceso root, pero puedes ejecutarlo como root si es necesario.\nOnCalendar=*-*-01,15 02:30:00 Persistent=true RandomizedDelaySec=30min Una vez que el servicio se ejecuta, tengo un binario personalizado que me notifica por Signal los detalles del respaldo y el estado de ejecución. Esto es opcional, pero un paso conveniente. También puedes ver la salida en el journal de systemd.\nSalida\nLa salida resultante se ve algo así\n============================================= RESPALDO EXITOSO ============================================= Timestamp: 2026-01-12 01:26:01 Repository: b2:MyBucket:repo_dir Source Dirs: /home/user/.bashrc.d/ /home/user/Backup/ -------------- Resumen de Restic --------------- Files: 0 nuevos, 1 modificado, 12831 sin modificar Dirs: 0 nuevos, 4 modificados, 4701 sin modificar Data Added: 180KiB Total Processed: 232MiB Duration: 0m 6s Snapshot ID: e6011222 --------------------------------------------- Verificando integridad del respaldo... ✓ Verificación del respaldo exitosa ¿Por Qué Esto? Este no es el mejor sistema de gestión de respaldos pero no necesito interfaces web, GUI, sincronización entre dispositivos, ni muchas otras características. Respaldar una sola computadora principal debería ser simple, con dependencias mínimas e invisible. Esto tiene todo eso, incluso si hay opciones más seguras y con más características disponibles.\n¿Migraría a otra solución de respaldo? En el futuro, sí. La seguridad de los secretos necesita mejorar y algunas características de calidad de vida serían buenas, con suerte puedo hacer tiempo para mejorar el script. Espero no olvidarme.\n","permalink":"https://danoss.me/es/categories/linux/respaldo-automatico-restic-y-backblaze-b2/","summary":"Un simple script para respaldos automaticos del sistema local con restic y Backblaze B2 en Linux","title":"Respaldos Automaticos con Restic y Backblaze B2"},{"content":"Tener una VPN en el mundo actual es una necesidad, y no puedo recomendar Mullvad VPN lo suficiente. Lo he estado usando durante años y estoy muy satisfecho (publicidad no pagada).\nMullvad VPN se toma en serio la privacidad, zero-knowledge, no requiere registro de correo electrónico, y puedes pagar con cripto (y aún mejor, Monero).\nClientes Mullvad Cliente Linux: Mullvad tiene un cliente Linux que funciona genial en Fedora (y cualquier otra distro). Es simple de usar y funciona genial. Buena GUI para configuraciones normales y un cliente CLI para ajustes avanzados.\nCliente Android: Mullvad también tiene una aplicación cliente Android realmente buena (no me gusta la cárcel del ecosistema Apple), que funciona genial, simple y con todas las funciones.\nEjecutar Múltiples VPNs Normalmente, usarías solo una VPN para todo el tráfico, sin embargo necesito usar 2 VPNs a la vez.\nMullvad para proteger todo mi tráfico de red Tailscale para acceder a mis servicios privados disponibles en un VPS público. El VPS ejecuta un servidor Headscale que permite conexiones solo desde clientes Tailscale autenticados. Usualmente, tendrías problemas ejecutando 2 VPNs simultáneamente. Una toma el control del enrutamiento, y la otra se rompe. Mullvad permite túnel dividido para que el tráfico de una aplicación específica evite la VPN y se conecte directamente, pero esto es basado en aplicaciones, lo cual no funciona con Tailscale.\nUsando Tanto Mullvad como Tailscale Investigué en línea una solución y encontré que Tailscale ofrece un complemento pagado para permitir tráfico Tailscale sobre Mullvad a través de nodos de salida, así que, decidí crear una regla simple de nftables para permitir ambas conexiones en Linux.\nCómo Funciona La función de túnel dividido de Mullvad usa marcado de paquetes nftables. Etiqueta el tráfico excluido con:\n0x00000f41 para seguimiento de conexiones 0x6d6f6c65 para enrutamiento Al aplicar estas marcas al tráfico Tailscale (identificado por el rango IP 100.64.0.0/10 y la marca 0x80000 de Tailscale), el kernel lo enruta fuera del túnel Mullvad. En otras palabras, conéctate vía Tailscale a cualquier servidor Headscale/Tailscale mientras usas Mullvad VPN en todo el otro tráfico.\nConfiguración Crear la Configuración nftables\n# Crear el directorio nftables si no existe sudo mkdir -p /etc/nftables # Crear archivo de configuración sudo vim /etc/nftables/mullvad-tailscale.nft # Contenidos de mullvad-tailscale.nft table inet mullvad-tailscale { chain prerouting { type filter hook prerouting priority -100; policy accept; # Marcar tráfico Tailscale entrante (usando la subred Tailscale predeterminada) ip saddr 100.64.0.0/10 ct mark set 0x00000f41 meta mark set 0x6d6f6c65; } chain outgoing { type route hook output priority -100; policy accept; # Marcar tráfico saliente con la marca de Tailscale meta mark 0x80000 ct mark set 0x00000f41 meta mark set 0x6d6f6c65; # Marcar tráfico hacia IPs Tailscale (usando la subred Tailscale predeterminada) ip daddr 100.64.0.0/10 ct mark set 0x00000f41 meta mark set 0x6d6f6c65; } } Cargar las Reglas\nsudo nft -f /etc/nftables/mullvad-tailscale.nft Hacer los Cambios Persistentes\n# Habilitar e iniciar servicio sudo systemctl enable --now nftables Verificar que la Tabla Está Cargada\nsudo nft list table inet mullvad-tailscale Hecho. No se necesitan reinicios.\nPruebas Esto debería ser suficiente. No se necesita configuración compleja. El tráfico regular pasa a través de Mullvad y las conexiones Tailscale evitan Mullvad (lo que hace posible el acceso al servidor Headscale).\nCuándo Tiene Sentido Esto Esto es útil si necesitas acceder a servicios protegidos por VPN Headscale/Tailscale mientras también necesitas enrutar todo tu tráfico a través de Mullvad VPN. Ha funcionado para mí durante muchos meses y no he tenido problemas. Así que lo comparto con el mundo.\n","permalink":"https://danoss.me/es/categories/security/sobre-mullvad-vpn-y-linux-y-tailscale/","summary":"Setting up Mullvad VPN and Tailscale on Linux","title":"Sobre Mullvad VPN y Linux... y Tailscale"},{"content":" Personalmente, cuando elijo entre Docker y Podman para ejecutar aplicaciones en contenedores, elijo Podman. Docker es mucho más popular y sinónimo de contenedores hoy en dia (contenedor = Docker), pero me gusta mucho que Podman sea seguro por defecto, tenga soporte para Pods, ejecute contenedores rootless por defecto, y no requiera un daemon en ejecución continua para ejecutar contenedores (los contenedores son fork/exec del proceso de Podman).\nUna gran característica de seguridad de Podman es Podman Secrets, que es similar a los Kubernetes Secrets.\nDatos Sensibles en Variables de Entorno Cuando trabajas con contenedores, almacenar datos sensibles (como contraseñas, llaves API, certificados) en archivos .env regulares o archivos de configuración es riesgoso. Estos son solo archivos protegidos por permisos del sistema de archivos, con valores sensibles en texto plano en algún lugar del disco.\nCuando pasas datos sensibles como variables de entorno al contenedor, los valores pueden filtrarse en muchos lugares:\nps aux podría exponer argumentos de procesos con los datos sensibles. podman inspect en un contenedor muestra los datos sensibles en la salida. Si el contenedor falla, estos datos podrían terminar en los logs. Para almacenar datos sensibles usa Podman Secrets en su lugar.\n¿Qué Son los Podman Secrets? Podman Secrets es una característica nativa de gestión de secretos en Podman que oculta datos sensibles de las imágenes y del sistema de archivos. Permite que las aplicaciones en contenedores accedan a datos sensibles (credenciales, llaves API, certificados) sin incrustarlos en imágenes de contenedor o pasarlos a través de canales inseguros.\nCaracterísticas\nLímite de Tamaño Los secretos tienen un tamaño máximo de 512KB. Este límite de tamaño es perfecto para credenciales, certificados y archivos de configuración. No deberías almacenar archivos multimedia o datos grandes como secretos. Disponibilidad Solo en Tiempo de Ejecución Los secretos existen solo en tiempo de ejecución del contenedor en tmpfs (RAM) dentro del contenedor. Se montan cuando el contenedor inicia, están disponibles solo durante la ejecución, y se desmontan cuando el contenedor se detiene. Aislamiento de Imágenes Los secretos no pueden ser incrustados en imágenes. Nunca se escriben en la capa escribible del contenedor, no se incluyen en podman commit, en archivos de contenedor (podman export), ni se distribuyen a través de registros de imágenes. Aislamiento de Procesos Cada contenedor obtiene su propia copia del secreto. No hay visibilidad de secretos entre contenedores. Contra Qué Protegen los Podman Secrets Secretos filtrándose en imágenes de contenedor. Secretos apareciendo en la salida de podman inspect. Secretos en listados de procesos. Secretos persistiendo en disco después de eliminar el contenedor. Exposición accidental en respaldos de configuraciones de contenedores. Contra Qué No Protegen los Podman Secrets Los Podman Secrets se almacenan como archivos codificados en base64 en el host. No están cifrados. Cualquiera con acceso de lectura a tu cuenta de usuario puede decodificarlos. Proporcionan mejor seguridad que archivos en texto plano pero pueden ser decodificados.\nLos Podman Secrets no protegen contra:\nUn contenedor comprometido (el secreto está en la memoria del contenedor). Acceso root en el sistema host. Alguien con acceso a tu cuenta de usuario ejecutando podman secret inspect --showsecret. Si alguien tiene root en tu sistema o ha comprometido tu cuenta, puede obtener tus secretos, pero en ese punto, tienes problemas más grandes.\nUbicaciones de Almacenamiento de Secretos Ubicación en el Host\n~/.local/share/containers/storage/secrets/ Ubicación de secretos específica del usuario para contenedores rootless. No proporciona acceso a secretos entre usuarios. /var/lib/containers/storage/secrets/ Ubicación de secretos a nivel de sistema para contenedores root. Ubicación Dentro del Contenedor\n/run/secrets/ Ubicación de secretos dentro del contenedor. Accedido como un archivo de solo lectura para el proceso del contenedor. Trabajando con Podman Secrets Creando Secretos Desde STDIN\nCrea un secreto canalizando contenido al comando. # Crear un secreto canalizando contenido directamente echo -n \u0026#34;my-password\u0026#34; | podman secret create db-password - Desde un Archivo\nCrea un secreto desde un archivo existente. # Crear un archivo con contenido secreto echo \u0026#34;my-password\u0026#34; \u0026gt; secret-file.txt # Crear secreto desde el archivo existente \u0026#34;secret-file.txt\u0026#34; podman secret create mysecret /path/to/secret-file.txt Agregar Secretos a Contenedores Agrega un secreto a un contenedor ya sea como un archivo montado en el sistema de archivos del contenedor o como una variable de entorno.\n# Sintaxis podman run --secret \u0026lt;secret\u0026gt;,[option=\u0026lt;option\u0026gt;] # opciones: # - type=mount - Montar secreto como archivo (por defecto) # - type=env - Agregar secreto como variable de entorno # - target=\u0026lt;path\u0026gt; - Ruta del secreto montado dentro del contenedor # Como archivo (montado en /run/secrets/ por defecto) podman run --secret db-password myimage # Como variable de entorno podman run --secret db-password,type=env,target=DB_PASSWORD myimage # Montado en una ruta personalizada podman run --secret db-password,target=/app/config/password myimage Gestionando Secretos # Listar todos los secretos podman secret ls # Inspeccionar metadatos del secreto (muestra detalles y etiquetas pero no muestra el valor) podman secret inspect mysecret # Mostrar realmente el valor del secreto podman secret inspect --showsecret mysecret # Eliminar un secreto podman secret rm mysecret Almacenes de Secretos Externos Puedes ir un paso más allá en la gestión de secretos usando un sistema externo de gestión de secretos, para separar el secreto del host y hacer que el contenedor recupere el secreto en tiempo de ejecución desde un sistema autenticado separado.\nAlgunos buenos almacenes de secretos externos son:\nHashiCorp Vault, que es completo en características y proporciona muy buena seguridad, pero podría ser demasiado complejo y engorroso de gestionar para la mayoría de los casos. Bitwarden Secret Manager, que es genial si ya estás usando Bitwarden y no quieres usar otra herramienta. Infisical, que para mí proporciona un buen punto medio. Muy simple de configurar y usar, es open-source, y auto-hospedable. Personalmente, yo uso Infisical. Al Final Al final, la elección para la gestión de secretos depende de la complejidad y el nivel de amenaza. Para la mayoría de propósitos, los Podman Secrets nativos + buena seguridad del sistema local es suficiente, pero puedes usar un almacén de secretos externo si estás trabajando en proyectos más complejos.\n","permalink":"https://danoss.me/es/categories/linux/podman-secrets-almacenando-datos-sensibles-en-contenedores/","summary":"Utilizando Podman Secrets para injectar datos sensibles en contenedores","title":"Podman Secrets: Almacenando Datos Sensibles en Contenedores"},{"content":"Aquí hay algunos pensamientos sobre la optimización de imágenes de contenedores usando multi-stage builds e imágenes distroless.\nNormalmente, al construir imágenes de contenedores para ejecutar aplicaciones, la imagen en sí suele incluir un sistema operativo completo, gestor de paquetes y utilidades del sistema, haciendo que el tamaño de la imagen sea de cientos de MB a GBs.\nEste tamaño enorme para ejecutar un simple binario tiene un impacto en la velocidad de ejecución, costos de almacenamiento y postura de seguridad.\nLos multi-stage builds y las imágenes distroless optimizan el tamaño de la imagen del contenedor mientras mantienen la funcionalidad a través de la selección de imagen base y la eliminación de dependencias durante ejecución innecesarias.\nBuild Tradicional de Una Sola Etapa Por ejemplo, la mayoría de la gente empieza al contenedorizar una aplicación Java asi:\nFROM openjdk:11-jdk WORKDIR /app COPY . /app RUN javac Main.java CMD [\u0026#34;java\u0026#34;, \u0026#34;Main\u0026#34;] Esto funciona bien. La aplicación se ejecuta. Pero la imagen final incluye todo el compilador JDK, herramientas de depuración y librerías. Todo lo cual es necesario para desarrollo, pero innecesario en ejecución.\nLa imagen final podría terminar con un tamaño de cientos de MB, para un archivo de clase Java compilado que podría ser de 5KB.\nMulti-Stage Builds Con multi-stage builds, puedes separar las dependencias de build-time de los requisitos en tiempo de ejecución. Compilas en una etapa usando todas las herramientas pesadas, y luego copias solo el artefacto final a una imagen de ejecución mínima.\nPor ejemplo, para una aplicación Java contenedorizada, la etapa de build usa las herramientas y librerías completas del JDK, mientras que la imagen final en la etapa 2 usa solo el JRE-slim para ejecutar el código compilado. Todas las herramientas de desarrollo se quedan atrás. Esto reduce el tamaño de la imagen alrededor del 40% mientras mantiene la misma funcionalidad que los builds de una etapa.\n# Etapa 1: Build FROM openjdk:11-jdk AS build WORKDIR /app COPY . /app RUN javac Main.java # Etapa 2: Runtime FROM openjdk:11-jre-slim WORKDIR /app COPY --from=build /app/Main.class /app/ CMD [\u0026#34;java\u0026#34;, \u0026#34;Main\u0026#34;] Imágenes Distroless Las imágenes distroless llevan los esfuerzos de \u0026ldquo;minimización de imagen\u0026rdquo; un paso más allá. Por ejemplo, una imagen distroless podría ser de alrededor de 2MB.\nUna imagen distroless elimina todo excepto lo que tu aplicación contenedorizada necesita para ejecutarse. Sin gestores de paquetes, sin shell, sin utilidades estándar de Unix. Solo la aplicación, sus dependencias directas de tiempo de ejecución y partes mínimas de una distribución Linux.\nPor ejemplo, para una aplicación Java contenedorizada usando multi-stage builds con una imagen distroless, el tamaño de la imagen resultante sería mínimo.\n# Etapa 1: Build FROM openjdk:11-jdk AS build WORKDIR /app COPY . /app RUN javac Main.java # Etapa 2: Runtime FROM gcr.io/distroless/java11-debian11 WORKDIR /app COPY --from=build /app/Main.class /app/ CMD [\u0026#34;Main\u0026#34;] Importante: La instrucción CMD en el Dockerfile/Containerfile debe usar la forma exec ([\u0026quot;executable\u0026quot;, \u0026quot;arg1\u0026quot;, \u0026quot;arg2]) en lugar de la forma shell (executable arg1). Sin un shell en la imagen, la forma shell no funcionará.\nImágenes Distroless Disponibles Google y Chainguard ofrecen imágenes distroless (base y específicas de lenguaje), que incluyen solo certificados CA y datos de zona horaria en sus imágenes base (lo esencial para la mayoría de las aplicaciones en red).\nGoogle Distroless Images\nURL: gcr.io/distroless. Google usa imágenes basadas en Debian construidas con Bazel. Ofrece las imágenes distroless más populares. Chainguard Images\nURL: images.chainguard.dev/directory. Chainguard usa imágenes basadas en Wolfi construidas con apko/melange. Se enfoca en parcheo de seguridad CVE más agresivo y rápido. Qué No Está Disponible Aplicaciones complejas como bases de datos no están disponibles como imágenes distroless. Por ejemplo, requieren herramientas de gestión de configuración, herramientas de backup y restauración, scripts, etc. Demasiado para una imagen mínima.\nAlgunas cosas no disponibles en forma distroless son:\nBases de datos: PostgreSQL, MySQL, MongoDB necesitan herramientas de backup, CLIs de administración y utilidades de configuración. Servidores Web: Nginx, Apache requieren gestión de configuración y capacidades de recarga. Otros: Redis, Ruby, PHP (no hay imágenes oficiales disponibles). El Desafío de la Depuración El principal trade-off con las imágenes distroless es la depuración. Sin shell significa que no puedes hacer docker exec en un contenedor en ejecución para investigar problemas. Por diseño, no quieres esas herramientas en producción, pero requiere diferentes enfoques de depuración.\nVariantes de Imagen para Debug Google proporciona variantes de debug de sus imágenes distroless con busybox incluido para probar y depurar donde necesitas acceso shell.\nFROM gcr.io/distroless/java11-debian11:debug Una vez que la depuración esté terminada, elimínalas. El punto completo de distroless es minimizar la superficie de ataque.\nTécnica de Compartir Namespaces Puedes ejecutar un segundo contenedor busybox que comparta namespaces (PID y network) con tu contenedor distroless solo para propósitos de debug.\nEsto permite que herramientas como ps y ss/netstat muestren los mismos procesos y conexiones que el contenedor objetivo.\n# Iniciar contenedor distroless docker run -d --name myapp gcr.io/distroless/static-debian12 /app # Adjuntar un contenedor debugger docker run --rm -it \\ --name debugger \\ --pid container:myapp \\ --network container:myapp \\ busybox sh Este enfoque es ligero y no requiere reiniciar tu contenedor de aplicación.\nKubernetes Ephemeral Containers Si estás ejecutando en Kubernetes, los ephemeral containers proporcionan depuración integrada:\nkubectl debug -it \u0026lt;pod_name\u0026gt; \\ --image=alpine \\ --target=\u0026lt;container_name\u0026gt; Esto crea un contenedor de depuración temporal que comparte namespaces con el pod objetivo. Similar al compartir namespaces regular pero integrado en Kubernetes.\nPor Qué Importa el Tamaño de la Imagen Cuando construyes una imagen de contenedor de la manera tradicional, todo lo usado durante el proceso de build termina en la imagen final.\nPor ejemplo, si necesitas un compilador para construir la aplicación, estará incluido en la imagen. ¿Gestores de paquetes para instalar dependencias? También están ahí. Y todo estará en la imagen final en producción.\nEsta hinchazón crea algunos problemas:\nVelocidad de Despliegue: Una imagen de 400MB toma mucho más tiempo en descargarse que una de 10MB. Al escalar horizontalmente o desplegar en múltiples hosts, los segundos extra se acumulan rápidamente. Costos de Infraestructura: Los registros de contenedores cobran basándose en almacenamiento y ancho de banda. Una imagen de 400MB almacenada en 10 versiones cuesta más dinero. Superficie de Seguridad: Cada binario, librería y paquete es una vulnerabilidad potencial. Los CVEs pueden impactar componentes que nunca usas pero que existen en la imagen. Imágenes más pequeñas significan menos componentes que parchear. Eficiencia de recursos: Imágenes más pequeñas significan inicios más rápidos, menos presión de memoria y I/O de disco más eficiente. Con un tamaño de imagen pequeño, no solo estás ahorrando costos de espacio de almacenamiento, sino también mejorando tu postura de seguridad y haciendo el despliegue de aplicaciones más rápido.\n¿Distroless, Alpine o Imágenes Estándar? Alpine es una distribución Linux ligera. Su pequeño tamaño puede rivalizar con distroless y podría ser una mejor opción que distroless al construir una imagen de contenedor mínima.\nLa elección entre distroless, Alpine e imágenes mínimas estándar no se trata de que una sea \u0026ldquo;mejor\u0026rdquo;, como todo en la vida, depende de tu caso de uso.\nInformación de comparación:\nAspecto Distroless Alpine Standard Minimal (debian-slim) Tamaño de Imagen Más pequeño (static: ~2MB, Java: ~40-120MB) Muy pequeño (base: ~5MB, Java: ~80-150MB) Pequeño (base: ~25MB, Java: ~200-250MB) Seguridad Superficie de ataque mínima, sin shell Superficie pequeña, incluye shell/gestor de paquetes Superficie mayor, herramientas completas de userland Depuración Difícil (sin shell, sin utilidades) Fácil (shell, herramientas Unix estándar) Fácil (conjunto completo de herramientas disponible) Recuento de CVE Más bajo (paquetes mínimos) Bajo (conjunto pequeño de paquetes) Más alto (más paquetes instalados) Compatibilidad glibc estándar musl libc (puede causar problemas de compatibilidad) glibc estándar, compatibilidad más amplia Caso de Uso Producción, seguridad primero Desarrollo, depuración, uso general Aplicaciones legacy, compatibilidad máxima Cuándo Usar Distroless Entornos de Producción: Donde la seguridad y la eficiencia es más importante que la conveniencia de depuración. Usualmente tienes buen logging / observabilidad. Ejecutar Aplicaciones Statically-Linked: Al ejecutar programas Go y Rust sin dependencias. No se necesitan sistemas operativos o sistemas de empaquetado. La Seguridad es Máxima Prioridad: Donde la seguridad es lo principal y reducir la superficie de ataque y el aislamiento es muy importante. Cuándo Usar Alpine Entornos de Desarrollo: Donde necesitas iteración rápida y la capacidad de instalar herramientas sobre la marcha a través de su gestor de paquetes. Se Necesita Depuración: Cuando necesitas solucionar problemas haciendo exec en contenedores. Alpine proporciona un shell y utilidades comunes sin hinchazón excesiva. Se Requieren Herramientas en Ejecución: Aplicaciones que necesitan curl, wget, nc u otras utilidades en tiempo de ejecución. No te Importa la Compatibilidad: Cuando tu aplicación no depende de características específicas de glibc. La mayoría de las aplicaciones funcionan bien con musl libc. Aplicaciones C/C++ compiladas contra glibc pueden tener problemas. Cuándo Usar Imágenes Mínimas Estándar Usa imágenes mínimas estándar como debian-slim o ubuntu-minimal cuando:\nCompatibilidad Máxima: Aplicaciones legacy que esperan librerías del sistema específicas o comportamiento de glibc. Cargas de Trabajo Mixtas: Al ejecutar múltiples aplicaciones con diferentes requisitos en el mismo cluster. Estandarizar en Debian-slim puede simplificar las operaciones incluso si no es óptimo para cada servicio. Mejores Prácticas Algunas cosas que he aprendido trabajando con imágenes distroless:\nSiempre Usa Multi-Stage Builds: Incluso si no estás usando una imagen distroless. La separación entre entornos de build y ejecución es una buena práctica independientemente. Fija Tus Versiones de Imagen Base: Usa tags o digests SHA256 en lugar de latest para usar una versión específica de imagen. Esto asegura builds reproducibles y hace los rollbacks predecibles. Escanea Tus Imágenes Regularmente: Escanea tus imágenes de contenedores regularmente en busca de vulnerabilidades. Al Final Los multi-stage builds y las imágenes distroless son una solución simple y realmente buena para no solo reducir el tamaño de imagen de las imágenes de contenedores, sino también proporcionar mejor seguridad y velocidad, lo cual se vuelve cada vez más importante a medida que escalas. La clave es entender los trade-offs y por qué elegirías un build normal, distroless, una imagen mínima o alpine.\n","permalink":"https://danoss.me/es/categories/linux/optimizacion-de-imagenes-de-contenedores/","summary":"Pensamientos sobre la optimización de imágenes de contenedores usando multi-stage builds e imágenes distroless.","title":"Optimización de Imágenes de Contenedores: Multi Stage Builds e Imágenes Distroless"},{"content":" Contrario a la creencia popular, a veces hacerte invisible en la web (e incluso en la vida real) te hace destacar.\nExisten miles de técnicas que actores maliciosos y empresas/organizaciones utilizan para desanonimizarte y rastrearte, una de ellas es el browser fingerprinting.\n¿Qué es el Browser Fingerprinting? El browser fingerprinting es una técnica que hace difícil mantener la privacidad en la web.\nEsta técnica funciona recopilando y analizando diferentes características únicas del navegador del usuario y la configuración del sistema. Esto es muy exitoso en identificar usuarios individuales porque una persona que activa múltiples extensiones del navegador puede ser identificada a través de múltiples sitios web debido a este comportamiento poco común.\nAquí hay Algunos Puntos de Datos Comunes del Fingerprinting:\nResolución de pantalla y profundidad de color. Fuentes instaladas e información del sistema. Configuración de zona horaria e idioma. Versión del navegador y plugins. Renderizado Canvas (cómo el navegador dibuja gráficos). WebGL (características del GPU). Procesamiento de audio (cómo tu dispositivo maneja el sonido). Especificaciones de hardware (CPU, RAM). Todos estos datos combinados con otras técnicas de rastreo de usuarios como cookies, fingerprinting activo hacen más fácil para terceros identificar quién eres en la web.\nLos Esfuerzos de Privacidad Te Hacen Único Curiosamente, hacer el esfuerzo de proteger tu privacidad en la web instalando extensiones enfocadas en privacidad, y otras te harán más único entre el resto de usuarios regulares. La singularidad en sí misma se convierte en el factor de identificación.\nPor Ejemplo: Si eres uno de millones de usuarios con una pantalla de 1920×1080 ejecutando Firefox en Windows 11, te mezclas con la multitud. Pero serás un usuario único si reportas una pantalla aleatorizada de 1337×768 con zona horaria UTC. Esto es como intentar esconderte en la multitud usando una sudadera de neón con una máscara. Destacarás de la multitud.\nEl Objetivo del Browser Fingerprinting Los rastreadores y empresas no intentan desanonimizarte u obtener tu información personal, sino rastrear y vincular tu comportamiento de navegación a través de diferentes sitios web.\nPor Ejemplo:\nVisitas una tienda de zapatos (el rastreador ve el fingerprint 12345). Visitas una cafetería (el rastreador ve el fingerprint 12345). El rastreador vincula ambas visitas y puede crear un perfil digital que dice: \u0026ldquo;el usuario con fingerprint 12345 le gustan los zapatos Y el café\u0026rdquo;. Ahora, la próxima vez que el usuario con fingerprint 12345 busque zapatos, también estará obteniendo anuncios de café. Técnicas de Fingerprinting Hay muchas técnicas de fingerprinting, pero las más comunes son:\nCanvas Fingerprinting: Al acceder a cualquier sitio web, tu navegador dibuja texto y formas en un canvas oculto. Diferentes GPUs, sistemas operativos y fuentes renderizan estos ligeramente diferente, permitiendo a los rastreadores identificarte únicamente basándose en el canvas.\nWebGL Fingerprinting: Esto es similar al canvas fingerprinting pero con renderizado de gráficos 3D. Tu GPU y versión del driver pueden crear una identidad única de ti.\nAudio Fingerprinting: Los dispositivos de hardware procesan el audio ligeramente diferente debido a variaciones de hardware y algoritmos de procesamiento de audio, etc. Esto crea otro identificador único.\nFont Enumeration: Los sitios web pueden detectar las fuentes instaladas en tu sistema. Una combinación única de fuentes puede identificarte.\nCSS-based Fingerprinting: Nuevas técnicas usando CSS container queries, @supports, y @import pueden hacer fingerprinting de navegadores sin JavaScript.\nBehavior Fingerprinting: Algunos patrones de usuario pueden exponer a los usuarios, como rastrear movimientos del mouse, patrones de escritura y comportamiento de desplazamiento.\n¿Cómo Protegerte? Hay 2 enfoques para protegerte.\nEnfoque 1: Hacer a Todos Idénticos Navegadores enfocados en privacidad como Mullvad, Librewolf, y el navegador Tor hacen el esfuerzo de introducir valores predeterminados enfocados en privacidad y seguridad.\nLa recomendación con este enfoque es que los usuarios no cambien los valores predeterminados (que ya están ajustados para privacidad y seguridad) para hacer que cada usuario presente un fingerprint idéntico (mismo tamaño de pantalla, zona horaria (UTC), fuentes, y user agent).\nEsto hace que cada usuario se vea igual, pero los sitios web pueden detectar fácilmente que estás usando ese navegador y pueden denegar el acceso si no quieren que estos usuarios accedan al sitio web.\nEnfoque 2: Aleatorizar Datos Por Sitio Navegadores como Brave y Firefox pueden aleatorizar los datos del fingerprint por sitio.\nEn lugar de hacer que todos se vean iguales, aleatoriza tus datos de fingerprint en cada sitio web para romper el rastreo a través de sitios. Por ejemplo, cuando visitas Amazon, tu navegador reporta un conjunto de características, y cuando visitas Facebook, reporta otros diferentes.\nEsto hace más difícil para los rastreadores vincular tu actividad de navegación a través de sitios, pero aún puedes ser rastreado como alguien usando técnicas anti-fingerprinting, por lo que el éxito es cuestionable.\nEstrategia de Defensa Práctica Aquí hay algunas cosas que puedes hacer para minimizar el fingerprinting.\nUsa un Ad Blocker Instala uBlock Origin.\nHonestamente, esta es la mejor extensión de navegador que puedes usar.\nLa instalación predeterminada debería funcionar bien para la mayoría de usuarios, proporciona gran protección y bloquea anuncios. Sin embargo, si haces una configuración avanzada, puedes bloquear scripts, rastreadores individuales, elementos en sitios web, fuentes, etc. Siempre usa esto.\nUsa un Navegador Amigable con la Privacidad NO uses Google Chrome, Edge, o Safari. Tampoco recomiendo el navegador Tor para uso regular del navegador.\nRecomiendo estos navegadores con su configuración apropiada (revisa la documentación de cada uno)\nFirefox. Un fork de Firefox amigable con la privacidad como Librewolf. Brave browser. No Falsifiques Valores Manualmente Para la mayoría de usuarios, falsificar manualmente la zona horaria, tamaño de pantalla, o user agents los hará más únicos. Solo deja que el navegador amigable con la privacidad haga su trabajo.\nLa Triste Verdad Evitar el fingerprinting es difícil (si no imposible). Incluso con todas las precauciones, los rastreadores con suficientes recursos probablemente pueden identificarte.\nLas técnicas de fingerprinting son difíciles de evitar o falsificar porque dependen del hardware real que usas e intentar proteger tu privacidad haciendo cambios amigables con la privacidad a tu navegador te hará destacar de la multitud.\nIncluso peor, a partir del 16 de febrero de 2025, Google comenzó a permitir a los anunciantes que usan su plataforma de anuncios usar técnicas de fingerprinting, haciendo un entorno más desafiante para la gente amigable con la privacidad (fuente).\nAl Final (In The End) Incluso si el fingerprinting es difícil de evitar, aún lo recomiendo porque:\nEl ad-blocker bloqueará anuncios en sitios web (sin él, tu experiencia de navegación en Internet se reduce 100x, algunos blogs y sitios de noticias están plagados de anuncios). Bloquea actores maliciosos y sitios web sospechosos de crear un perfil de ti. Previene la vinculación cruzada de usuarios entre algunos sitios web y reduce la cantidad de anuncios personalizados e información sobre ti que es pública para algunos de estos rastreadores/empresas. Recursos Adicionales Pruebas de Fingerprinting\nCover Your Tracks - Prueba de fingerprinting de EFF usando compañías de rastreo reales PrivacyTests.org - Pruebas regulares ejecutadas contra varios navegadores, incluyendo LibreWolf BrowserLeaks - Herramienta todo-en-uno para probar navegadores Lectura Adicional\nFirefox\u0026rsquo;s Resist Fingerprinting - Detalles técnicos sobre cómo Firefox maneja el fingerprinting Brave\u0026rsquo;s Fingerprinting Protection - Cómo Brave aborda el problema W3C Fingerprinting Guidance - Perspectiva de estándares de navegadores sobre fingerprinting AmIUnique Research - Artículos académicos sobre fingerprinting ","permalink":"https://danoss.me/es/categories/security/que-es-browser-fingerprinting/","summary":"Qué es el browser fingerprinting y cómo protegerte","title":"Que es Browser Fingerprinting?"},{"content":" Pensando en la última tendencia anti-privacidad, decidí organizar mis pensamientos sobre la huella digital y qué hacer al respecto.\nDejas rastros cada vez que usas Internet (descargas una imagen, ves un video, etc.). Esto no solo revela tu historial de navegación, sino que también permite que personas y empresas creen un perfil digital de ti.\nEl perfil digital puede revelar quién eres, a dónde vas regularmente, quiénes son tus amigos y familiares, qué te gusta, y predecir dónde estarás.\nEsta recopilación de datos está por todas partes, así que incluso si eres consciente de la privacidad, tu huella digital está ahí y es muy difícil de ocultar.\nPerfil Digital El perfil digital es \u0026ldquo;el proceso de recopilar y analizar información sobre un individuo que existe en línea. Un perfil digital puede incluir información sobre características personales, comportamientos, afiliaciones, conexiones e interacciones\u0026rdquo; (fuente).\nEstos perfiles sobre ti están siendo creados por:\nEmpresas: Google, Meta, Amazon, y otros recopilan datos para mostrar anuncios dirigidos y mejorar sus servicios. Corredores de Datos: Empresas que compran y venden datos sobre ti a anunciantes, compañías de seguros, y otros. Agencias Gubernamentales: Las fuerzas del orden y agencias de inteligencia recopilan y analizan datos para vigilancia e investigaciones. Actores Maliciosos: Actores maliciosos, criminales, carteles, lo que sea, pueden crear perfiles digitales de sus víctimas usando información disponible públicamente. Cómo Funciona el Perfilado Conectar varias piezas de datos \u0026ldquo;no relacionadas\u0026rdquo; de un individuo para crear un perfil digital.\nPor Ejemplo: Si publicas una foto en Instagram desde una cafetería, puedes revelar:\nUbicación: Las coordenadas GPS incrustadas en los metadatos de la foto pueden revelar tu ubicación. Hora: Los metadatos pueden revelar cuándo estuviste ahí (incluso puedes revisar las sombras del sol sobre los objetos para determinar la hora/día). Amigos: Con quién estabas (puedes identificar a las personas en la foto si las etiquetas o si su rostro es visible). Preferencias: El tipo de café que te gusta o el tipo de lugar que frecuentas. Patrones: Si publicas fotos desde la misma cafetería múltiples veces a lo largo de los días/meses, alguien podría inferir que está cerca de tu casa o lugar de trabajo. Este ejemplo fue con solo una foto simple, pero las empresas e individuos que se especializan en recopilación y análisis de datos pueden hacer mucho más, como analizar datos recopilados de sitios web que visitas, sesiones de inicio de sesión, compras, redes Wi-Fi a las que te conectas, nombres de usuario, correos electrónicos, tu número de teléfono, tu IP (si no usas VPN), IMEI del teléfono, browser fingerprints, etc.\nDespués de recopilar toda esta información y crear un perfil digital de ti, los corredores de datos venden esta información a terceros.\nEl Problema del Shadow Profile Un problema importante que no desaparecerá son los shadow profiles.\nDefinición: Un shadow profile es un conjunto de datos recopilados sobre alguien sin su consentimiento explícito (fuente).\nLo que es más peligroso, incluso si eliminas tus cuentas o nunca te registras, algunas plataformas aún construyen perfiles sin tu consentimiento:\nShadow Profiles de Facebook: Facebook crea perfiles para no usuarios extrayendo información de contacto de usuarios que suben sus libretas de direcciones. Persistencia de Datos: Cuando \u0026ldquo;eliminas\u0026rdquo; contenido de las redes sociales, a menudo solo se oculta de la vista pública. Los datos permanecen en los servidores de la empresa para respaldo, propósitos legales o de análisis (creo que algunas empresas retienen estos datos por 3, 5 o 10 años por esta razón). Rastreo de Terceros: Las redes publicitarias y servicios de análisis te rastrean a través de sitios web incluso sin inicios de sesión de cuenta a través de cookies, browser fingerprints, y tracking pixels. Nada que Ocultar, ¿Cuál es el Riesgo? El argumento de \u0026ldquo;nada que ocultar\u0026rdquo; lo hacen personas ignorantes que están ajenas o malinterpretan los riesgos.\nLa privacidad es un derecho, las personas actúan diferente cuando saben que están siendo observadas. Sin privacidad significa que empresas, gobiernos corruptos, y actores maliciosos pueden crear perfiles digitales de individuos y tomar acciones contra ellos, tales como:\nAtaques Dirigidos Los perfiles detallados permiten ataques dirigidos:\nSpear Phishing: Los atacantes usan información disponible públicamente para crear correos de phishing convincentes que hacen referencia a información real sobre tu vida, trabajo o relaciones. Social Engineering: Los actores maliciosos pueden hacerse pasar por tus amigos o por ti mismo si conocen tus patrones, contactos y preferencias. Seguridad Física: Publicar fotos de vacaciones en tiempo real muestra que tu hogar está vacío, permitiendo a actores maliciosos aprovecharse. Acoso y Hostigamiento: Los datos de ubicación y sociales agregados permiten a los acosadores rastrear movimientos y predecir ubicaciones futuras. Asociación por Proximidad: Ser amigo o estar relacionado con alguien de interés para las fuerzas del orden o actores maliciosos te convierte en un punto de datos en su perfil. Ten cuidado con quién eres amigo. No Más Privacidad Una vez que los datos existen en línea, cualquiera (con algo de esfuerzo) puede usarlos:\nFiltraciones de Datos: Las empresas que tienen tus datos son vulneradas regularmente. Tu perfil digital terminará en manos de criminales o cualquiera que te esté apuntando. Cambios en los Términos de Servicio: Algunas empresas cambian las políticas de privacidad regularmente. Los datos que compartiste bajo una política pueden usarse de manera diferente más tarde. Adquisiciones Corporativas: Cuando las empresas son compradas, tus datos son parte de la adquisición. Los nuevos dueños pueden tener opiniones diferentes sobre la privacidad. Acceso Gubernamental: Las fuerzas del orden pueden solicitar datos de las empresas y pueden recopilar datos por sí mismas. Discriminación y Manipulación Los perfiles pueden usarse en tu contra de formas que nunca consentiste:\nPrecios Dirigidos: Las empresas usan perfiles para mostrar diferentes precios a diferentes personas basándose en la disposición a pagar predicha. Seguros y Empleo: Algunos aseguradores y empleadores usan información de corredores de datos para evaluar riesgos o filtrar candidatos. Manipulación Política: El perfilado permite publicidad política diseñada para manipular emociones e influir en el comportamiento de votación. Reduce Tu Huella Digital La privacidad perfecta es casi imposible, pero puedes reducir la recopilación innecesaria de datos y hacer el perfilado más difícil. La idea es crear un equilibrio entre tus propios esfuerzos de privacidad y la facilidad de uso. La privacidad perfecta puede ser dolorosa en la vida cotidiana.\nSepara Tus Identidades Digitales No uses el mismo nombre de usuario, correo electrónico o perfil en todos los servicios:\nUsa Diferentes Nombres de Usuario: Evita usar el mismo identificador en todas las plataformas. Esto hace la correlación más difícil. Crea Direcciones de Correo Electrónico Específicas por Contexto: Usa correos separados para diferentes propósitos (compras, redes sociales, trabajo, banca). Servicios de Alias de Correo: Herramientas como SimpleLogin, AnonAddy te permiten crear direcciones únicas para cada servicio que reenvían a tu bandeja principal. Diferentes Fotos de Perfil: No uses la misma foto en todas las plataformas. La búsqueda de imagen inversa hace la correlación trivial de otra manera. Elimina los Metadatos de las Fotos Antes de subir imágenes a cualquier lugar, usa herramientas de eliminación de metadatos como exiftool para eliminar sus metadatos.\nNota: La mayoría de las plataformas de redes sociales eliminan los datos EXIF automáticamente, pero esto sucede en el lado del servidor, ellos ven los metadatos antes de eliminarlos. Elimínalos tú mismo antes de subirlos.\nMinimiza el Compartir Ubicación Desactiva los Servicios de Ubicación: Apaga el acceso a la ubicación para aplicaciones que no lo necesitan. Desactiva el Historial de Ubicación: Desactiva Google Timeline, Ubicaciones Importantes de Apple, y características similares de aplicaciones similares. Escaneo de Wi-Fi y Bluetooth: Desactiva \u0026ldquo;Escaneo de Wi-Fi\u0026rdquo; y \u0026ldquo;Escaneo de Bluetooth\u0026rdquo; en la configuración de ubicación. Usa Diferentes Métodos de Pago Rompe el rastro de pagos:\nNúmeros de Tarjeta Virtual: Servicios como Privacy.com, la función de tarjeta virtual de tu banco, o tarjetas de crédito que generan números de un solo uso previenen que los comerciantes compartan tu número de tarjeta real. Tarjetas Separadas para Diferentes Usos: Una tarjeta para compras en línea, otra para suscripciones recurrentes, otra para transacciones en persona. Cripto: Usa Monero o criptomonedas similares enfocadas en privacidad para pagos. Evita Vincular Todo a Una Cuenta: No vincules cada servicio a la misma cuenta de PayPal o de pago. Revisa y Minimiza las Redes Sociales Las redes sociales son el lugar más fácil para filtrar información:\nRevisa Publicaciones Antiguas: Busca tu propio nombre y nombres de usuario periódicamente. Podrías sorprenderte de lo que sigue siendo público. Limita el Etiquetado: Configura los ajustes de privacidad para aprobar etiquetas antes de que aparezcan en tu perfil. No Publiques Ubicaciones en Tiempo Real: Comparte fotos de vacaciones después de regresar, no mientras estás fuera. Separa Personal y Profesional: Usa diferentes cuentas para la vida personal versus la presencia profesional. Usa Herramientas Enfocadas en Privacidad Donde sea posible, elige servicios que no moneticen tus datos:\nNavegadores: Firefox con extensiones de privacidad (uBlock Origin, Privacy Badger), o Brave. Motores de Búsqueda: Usa DuckDuckGo o Brave Search en lugar de Google. DNS: Usa DNS cifrado para evitar que tu ISP registre cada dominio que visitas. VPN: Siempre usa una VPN de confianza de conocimiento cero como Proton o Mullvad para navegar por la web. Una VPN oculta tu dirección IP de los sitios web y tu ISP (pero el proveedor de VPN puede ver tu tráfico). Administradores de Contraseñas: Usa contraseñas únicas para cada servicio. Si uno es vulnerado, los demás permanecen seguros. OnePassword, Bitwarden y otros son excelentes. NO USES LASTPASS. Reflexiones Finales Todos te han estado perfilando digitalmente durante años. Lo mejor que puedes hacer para protegerte es tomar decisiones informadas sobre qué datos te sientes cómodo compartiendo y tomar medidas razonables para limitar la exposición innecesaria.\nComienza a protegerte haciendo algunos cambios que tengan sentido para tu modelo de amenaza y estilo de vida, luego construye desde ahí para obtener la máxima privacidad.\nLectura Adicional:\nElectronic Frontier Foundation - Surveillance Self-Defense Privacy Guides The New Oil - Privacy \u0026amp; Security Resources ","permalink":"https://danoss.me/es/categories/security/tu-huella-digital/","summary":"Algunos pensamientos sobre tu huella digital y qué hacer para controlarla","title":"Tu Huella Digital"},{"content":"Con las preocupaciones de privacidad de Windows 11 y las malas decisiones de Microsoft en general (aplicaciones del sistema basadas en web que consumen GBs de RAM, por ejemplo), muchas personas están buscando pasarse a Linux.\nQuiero compartir algunos pensamientos sobre este proceso ya que hay muchas cosas a considerar.\nRecuerda: Siempre prueba tu distribución de Linux elegida con un Live USB.\nCompatibilidad de Hardware Verifica que tu hardware realmente funcione en Linux, por ejemplo:\nAdaptadores WiFi y de Red: Algunos adaptadores WiFi y de red requieren drivers adicionales o simplemente no funcionan como deberían. Arranca un live USB y asegúrate de poder conectarte a tu red. GPUs NVIDIA: Los drivers propietarios funcionan bien estos días (a veces). Los drivers de código abierto nouveau existen pero tienen rendimiento limitado. Si juegas o haces trabajo intensivo con GPU, verifica que tu tarjeta esté soportada por los paquetes actuales de drivers NVIDIA o cámbiate a AMD. Periféricos y Teclas de Función: Ahora, la mayoría de los teclados y ratones funcionan de inmediato, pero las características especiales o teclas FN podrían no funcionar. En mi caso, mi ratón Logitech funcionó bien, pero las configuraciones especiales requerían el software de Windows de Logitech (que apesta). Resolví esto remapeando los gestos del ratón para lograr una funcionalidad similar, que no es perfecto, pero suficientemente bueno. Los touchpads, lectores de huellas dactilares y webcams usualmente funcionan, pero verifica con un Live USB antes de comprometerte. Alternativas de Software La mayoría de las aplicaciones de Windows no correrán en Linux. Así es como es.\nMS Office: Si usas Microsoft Office (Word, Excel, PowerPoint) intensivamente, las alternativas podrían no ser suficientemente buenas para ti. LibreOffice y OnlyOffice son sólidas, pero si dependes de macros complejas de Excel o formato específico en documentos de Word, es posible que no te guste el cambio a Linux. Las versiones web de Office 365 funcionan bien, pero son limitadas comparadas con las aplicaciones de escritorio. Software Creativo: Los productos de Adobe no corren nativamente en Linux. GIMP existe como una alternativa a Photoshop, pero es una herramienta diferente con un flujo de trabajo diferente. Gaming: Esto ha mejorado dramáticamente gracias al Proton de Valve. Steam funciona genial y la mayoría de los juegos de un jugador corren bien. Verifica ProtonDB para tus juegos específicos. Ahora, los juegos multijugador con anti-cheat a nivel de kernel (como Battlefield), no funcionarán en Linux porque sus sistemas anti-cheat no correrán fuera de Windows. Software Especializado: Programas CAD, herramientas específicas de industria, ciertos clientes VPN, etc. no funcionarán en Linux o no tienen una aplicación alternativa. WINE puede ejecutar algunas aplicaciones de Windows, pero podría romperse con actualizaciones. Eligiendo Tu Distribución Honestamente, hay demasiadas distribuciones de Linux (lo cual es bueno debido a la libertad de elección y malo porque simplemente hay demasiadas), pero la recomendación es usar algo estable y con buen soporte de la comunidad.\nMis mejores recomendaciones son:\nFedora: Esto es lo que uso, paquetes de vanguardia, excelentes valores predeterminados, seguro y suficientemente estable para uso diario. El ciclo de lanzamiento de 6 meses significa que obtienes nuevo software a un buen ritmo. Ubuntu/Debian: Tienen la mayor documentación y los repositorios de paquetes más grandes. Tiendo a recomendar Ubuntu menos por sus decisiones realmente tontas de los últimos años como el Unity DE, snap, pro, etc, pero sigue siendo bueno para personas nuevas. Arch/Manjaro: El meme. Tienen lanzamientos continuos con paquetes de última generación, pero requieren más mantenimiento y solución de problemas. Aquí hay un artículo sobre distribuciones populares de Linux: https://www.geeksforgeeks.org/linux-unix/8-most-popular-linux-distributions/\nGestión de Paquetes Olvida descargar instaladores .exe de sitios web aleatorios. Linux usa gestores de paquetes centralizados:\ndnf en Fedora/RHEL. apt en Debian/Ubuntu. pacman en sistemas basados en Arch. Todo se instala a través de tu gestor de paquetes. Las actualizaciones están centralizadas y son mucho más seguras que el modelo de Windows de descargar instaladores de cualquier lugar y esperar que no tengan malware.\nAdemás de los paquetes tradicionales, también existen AppImages (aplicaciones portátiles) y Flatpaks (aplicaciones en sandbox con sus propias dependencias). Cada uno tiene sus ventajas y desventajas, pero son buenas opciones y fáciles de instalar.\nPosts de blog con más información sobre Flatpaks:\nhttps://danoss.me/categories/linux/why-flatpaks-take-so-much-storage-space/ https://danoss.me/categories/linux/flatpak-stopped-working/ Entornos de Escritorio Linux ofrece múltiples entornos de escritorio, no estás bloqueado en una sola interfaz como en Windows.\nGNOME (Predeterminado en muchas distros) proporciona un flujo de trabajo moderno y simple. Funciona bien pero no ofrece muchas características a menos que también instales la aplicación Tweaks y extensiones adicionales de GNOME. No es perfecto pero realmente bueno si te acostumbras. KDE Plasma es altamente personalizable y se siente más parecido a Windows si se configura de esa manera. COSMIC es el entorno de escritorio de System76 escrito en Rust. Realmente bueno e intuitivo pero todavía es bastante nuevo con algunos arreglos y ajustes necesarios. Cosas realmente prometedoras. Hyprland es un compositor moderno de Wayland con tiling dinámico. Popular en la comunidad de ricing y memes. Es realmente rápido y personalizable. XFCE/LXQt son opciones ligeras que corren bien en hardware más antiguo. Cada entorno de escritorio tiene diferentes requisitos de recursos y filosofías. Pruébalos con live USBs antes de decidir.\nTomando la Decisión Planifica Tu Migración No borres Windows inmediatamente.\nRespalda todo primero: documentos, perfiles del navegador, configuraciones de correo. Exporta cualquier cosa vinculada a herramientas específicas de Windows.\nNo recomiendo dual-boot porque es una medida a medias. Primero prueba si te gusta Linux y si todo funciona como debería con una VM (máquina virtual) y/o Live USB.\nPor Qué Elegir Linux Linux te da control total sobre lo que sucede en tu sistema.\nRealmente no necesitas ser súper técnico para usarlo. Hoy en día hay una aplicación gráfica para casi todo.\nLinux te da más privacidad, conocimiento y libertad que Windows restringe. Si te importan estos principios entonces Linux es para ti.\nPor Qué Quedarse en Windows En el trabajo, la mayoría de las organizaciones usan AD (Active Directory), MS Office, software propietario, etc. todo lo cual corre en Windows.\nSi un software específico o herramienta de hardware que compraste corre en Windows o tiene muchos problemas en Linux, podrías querer quedarte en Windows.\nSi no puedes vivir sin un juego multijugador específico con anti-cheat a nivel de kernel en el kernel de Windows, podrías querer quedarte en Windows (verifica ProtonDB para compatibilidad).\nCada persona tiene su propio caso de uso, elige sabiamente.\nMi Experiencia Me cambié a Fedora hace unos años y no he mirado atrás. El aprendizaje inicial fue emocionante e indoloro, pero después de aprender cómo funciona Linux, pude obtener control total de mi sistema. Windows hoy en día se siente tosco y restrictivo cuando necesito usarlo.\nEl acceso a la línea de comandos, el soporte nativo de contenedores y el control total sobre mi sistema hace que Linux sea una buena opción para mí, pero este caso de uso varía de persona a persona.\n","permalink":"https://danoss.me/es/categories/linux/cambiando-de-windows-a-linux/","summary":"Cosas a considerar cuando cambias de Windows a Linux","title":"Cambiando de Windows a Linux"},{"content":"Australia recientemente aprobó una legislación que prohíbe el acceso a redes sociales para menores de 16 años. Aunque \u0026ldquo;proteger a los niños\u0026rdquo; suena como algo bueno para nosotros (los no-pedófilos), esto crea serias preocupaciones de privacidad que afectan a todos.\n¿Verificación de Identidad Obligatoria? Sitios de redes sociales como Youtube, Bluesky, Facebook deben implementar sistemas de verificación de edad. Algunos métodos que se están considerando implican brindar:\nCedula / Pasaporte Información de tarjeta de crédito Números de seguro social Información biométrica Ahora, la mayoría de las plataformas subcontratarán esta implementación a servicios de terceros. Aunque estos servicios de terceros tienen procesos establecidos y mayor seguridad en sus datos, tu información personal ahora se comparte con 2 entidades y pueden hacer lo que quieran con ella, como venderla al mejor postor u otros tratos esotericos.\nImpacto en la Privacidad\nUna vez que envías tu información personal para verificación de edad y acceder a estos sitios:\nTus datos se vuelven permanentes en la web. Una brecha en el sitio web de redes sociales o el servicio de verificación de terceros expondrá toda tu información personal a actores maliciosos. Bases de datos compartidas de información personal pueden compartirse entre múltiples empresas y gobiernos. Sin privacidad para nadie. Estás creando un perfil digital permanente. Cada sitio web sabrá exactamente quién eres, que estás accediendo a sus servicios, qué publicas, cuáles son tus gustos, etc. Esto se guarda para siempre. El Objetivo Principal: Control Esto realmente no se trata de proteger a los niños (quiero decir, los padres deberían asumir esta responsabilidad).\nEl objetivo es establecer una infraestructura de vigilancia masiva y control de la población.\nEsto crea un precedente y normalización para la verificación de identidad obligatoria para acceder a la mayoría de los servicios de Internet. Crea una base de datos centralizada de todos los ciudadanos a nivel global (no solo Australia). Permite a los gobiernos monitorear y controlar la libertad de expresión de sus ciudadanos. Si estás insatisfecho con el gobierno o un funcionario del gobierno, puedes ser un objetivo y eliminado en el futuro. Otros gobiernos usarán este tipo de legislación para \u0026ldquo;proteger a los niños\u0026rdquo; e implementar estas herramientas de monitoreo porque vieron que funcionó en Australia. Más censura y control. ¿Qué Hacer? ¿Por qué vivir en esta distopía?\nAcciones Reactivas\nSi los legisladores en tu país proponen leyes similares, haz conocer tu oposición. Vota contra estos tontos. Estos funcionarios son:\nIngenuamente inconscientes de la infraestructura de vigilancia que están construyendo (lo que significa que no están preparados para gobernar). Conscientes y perfectamente conformes con restringir las libertades ciudadanas para ganar o consolidar poder. Impulsando políticas escritas por lobbistas que se benefician de la recolección de datos. Acciones Proactivas\nEste tipo de legislación se normalizará y se extenderá a todos los países. Aquí hay algunas cosas que hacer ahora:\nRevisa tu Presencia Digital: Búscate a ti mismo. Revisa qué información aparece en registros de dominios, publicaciones antiguas de redes sociales y bases de datos públicas y elimina la mayor parte de lo que puedas (las empresas que cumplen con GDPR tienen esta opción). Limpia las Redes Sociales: Elimina publicaciones antiguas que revelen información personal. Ajusta la configuración de privacidad. ¿Realmente necesitas esa cuenta de Facebook de hace 10 años? Elimina Metadatos de las Fotos: Antes de publicar imágenes en línea, usa herramientas para eliminar datos EXIF (como exiftool en Linux). Aunque la mayoría de las plataformas principales de redes sociales eliminan los datos EXIF al subirlos, no todos los sitios lo hacen. Sé Consciente de lo que Compartes: Antes de publicar, pregúntate: \u0026ldquo;¿Qué podría aprender alguien sobre mí con esto?\u0026rdquo; Etiquetas de ubicación, fotos de compras, actualizaciones de vacaciones, todas crean puntos de datos que alguien puede explotar. Usa Identidades Separadas. Puedes mantener diferentes personas para diferentes actividades. Tu presencia profesional no necesita conectarse con tus foros de pasatiempos. Usa diferentes nombres de usuario, correos electrónicos (¡los alias de email son geniales!), fotos de perfil, etc. Asume que Todo es Permanente: Incluso si eliminas algo, asume que alguien lo archivó. Internet Archive, Google y scrapers aleatorios capturan más de lo que piensas. Usa un VPN: Siempre usa un VPN, esto es imprescindible. Elige un servicio VPN de pago como Proton o Mullvad. Evita los VPN gratuitos ya que son gratis porque espían tu tráfico. Usa Encriptación: Siempre usa herramientas de comunicación encriptadas y acostúmbrate a ellas. Self-Hosting: Considera alojar tus propios servicios. Aunque esto requiere algo de experiencia técnica, no es imposible de hacer y puedes aprender mucho. El Final del Juego Este camino lleva a un internet sanitizado donde cada acción está vinculada a tu identidad verificada. El disenso y hacer preguntas incorrectas se vuelven peligrosas. La privacidad se vuelve imposible. La libertad de expresión se vuelve imposible. La libertad de asociación se vuelve imposible. La libertad de movimiento se vuelve imposible. La libertad de pensamiento se vuelve imposible\u0026hellip;\nLa mayoría de los niños son realmente desagradables ¿eh?\n","permalink":"https://danoss.me/es/categories/others/alguien-quiere-pensar-en-los-ninos/","summary":"La misma historia de siempre, politicos engañando a la gente eliminando libertad para los ciudadanos con la excusa de proteger a los niños","title":"Alguien Quiere Pensar en los Niños?"},{"content":" De vez en cuando veo personas que copian comandos en línea para obtener privilegios elevados escribiendo sudo su.\nAhora, aunque funcione para el propósito previsto, probablemente puedas hacer algo mejor.\nBajo el Capó Cuando ejecutas sudo su estás encadenando 2 comandos de escalada de privilegios:\nsudo ejecuta un comando como otro usuario (root por defecto). Verifica el archivo de configuración /etc/sudoers para comprobar si el usuario que ejecuta el comando tiene permisos para hacerlo, registra la acción de sudo realizada, y solicita la contraseña del usuario (si está configurado con los valores predeterminados). su cambia a otro usuario (root por defecto). Requiere la contraseña del usuario objetivo (contraseña de root) e inicia una nueva sesión de shell como este usuario. Con sudo su estás usando sudo para ejecutar el comando su con privilegios de root, que luego inicia un shell con privilegios de root, lo cual es redundante.\nAhora, si necesitas ejecutar muchos comandos con privilegios seguidos, usar sudo su puede ser tentador (nadie quiere escribir sudo para cada comando), pero en su lugar, puedes usar sudo -i, que es mucho mejor.\nEl Problema con sudo su Registro de Auditoría Limitado\nsudo su (y sudo -i) comparten la misma limitación de registro: sudo solo registra la invocación del shell de root, no los comandos individuales que ejecutas dentro de él.\n# Esto se registra: sudo -i # Estos NO se registran por sudo: apt update rm -rf /important/data systemctl restart nginx Por esto se prefiere sudo \u0026lt;comando\u0026gt; cuando sea posible, ya que cada comando individual obtiene su propia entrada en el registro de auditoría.\nEn el futuro, si estuvieras usando sudo su y algo sucediera, no tendrás idea de qué pasó dentro de esta sesión de shell de root. Cada comando ejecutado en ese shell su es invisible para el registro de sudo.\nCaos de Variables de Entorno\nsu por sí solo no reinicia completamente el entorno de tu shell, cambia algunas variables de entorno (HOME, USER, SHELL, LOGNAME) pero preserva otras de tu usuario original (como PATH, que aún puede apuntar al PATH de tu usuario actual).\nEste entorno mezclado puede causar comportamiento inesperado en scripts.\nManejo de Variables de Entorno:\nsu - preserva el entorno del usuario (puede causar problemas) su - - proporciona un entorno de inicio de sesión de root limpio sudo su - entorno mezclado (depende de la configuración de sudo) sudo -i - entorno de inicio de sesión de root limpio. Usar sudo -i asegura un comportamiento de entorno consistente y predecible. Es Redundante\nsudo ya te da privilegios elevados de forma segura, ¿por qué complicar las cosas y añadir redundancia?\nUsa sudo -i en su Lugar Si necesitas un shell de root persistente para múltiples comandos, usa sudo -i.\nLa opción -i (o --login) inicia un shell de inicio de sesión como root con un entorno limpio.\nBeneficios sobre sudo su Entorno Limpio: Obtienes el entorno de inicio de sesión completo de root ($PATH, $HOME=/root, variables de entorno) como si hubieras iniciado sesión directamente como root. Más Simple: Un comando en lugar de encadenar 2 comandos de escalada de privilegios. Intención Más Clara: Solicita más obviamente un shell de inicio de sesión de root. Usa Tu Contraseña: Autenticado vía sudo (tu contraseña), no la contraseña de root. Respeta las Políticas de sudo: Acceso controlado por la configuración de /etc/sudoers. Qué se Registra sudo -i registra la invocación del shell de root, pero NO los comandos individuales que ejecutas dentro de ese shell:\n# Registrado por sudo Nov 20 10:23:45 hostname sudo: username : TTY=pts/0 ; PWD=/home/username ; USER=root ; COMMAND=/bin/bash -i # NO registrado por sudo: cualquier cosa que escribas después de esto Para una auditoría de comandos completa, puedes usar auditd, psacct, u otra solución de registro centralizado.\nJerarquía de Mejores Prácticas Preferido: sudo \u0026lt;comando\u0026gt; para comandos individuales Cada comando se registra por separado Registro de auditoría claro Cuando sea Necesario: sudo -i para shell de root persistente Múltiples comandos seguidos que requieren root Solución de problemas interactiva Tareas de mantenimiento del sistema Evitar: sudo su Escalada de privilegios redundante Mismas limitaciones de registro que sudo -i ¿Por qué Usar sudo su? Si estás en un sistema donde no tienes acceso a sudo pero conoces la contraseña de root, entonces sí, su - o su -l tiene sentido. Pero si estás recurriendo a sudo su, ya tienes sudo configurado, ¿verdad? Úsalo correctamente hermano.\nEn resumen, deja de usar sudo su. Usa sudo -i cuando necesites un shell de root. Mejor aún, usa sudo con comandos individuales.\n","permalink":"https://danoss.me/es/categories/linux/sudo-su-porque-abrazar-redundancia/","summary":"Qué es sudo su y por qué es redundante? Qué usar en su lugar?","title":"sudo su - ¿Por Qué Abrazar la Redundancia?"},{"content":"Cuando visitas un sitio web como www.google.com, tu navegador envía una solicitud de conexión desde tu computadora al servidor web. El servidor procesa tu solicitud y te devuelve la página web que solicitaste visitar.\nEsta es una descripción bastante simplificada de lo que sucede cuando visitas un sitio web, pero el punto es que estas conexiones directas exponen tu privacidad ya que el servidor web puede ver tu dirección IP / ubicación y sabe que te conectaste desde allí.\nCon proxychains, puedes enrutar intentos de conexión a un servidor a través de varios proxies que ocultarán tu IP del servidor de destino en sí. El servidor solo verá que el servidor proxy intentó conectarse, no tú.\n¿Qué es Proxychains? Proxychains permite que aplicaciones enlazadas dinámicamente enruten de forma transparente su tráfico de red TCP a través de una cadena de servidores proxy para que el destino vea la solicitud como proveniente del servidor proxy en lugar de tu dirección IP real.\nUna vez que comprendas conceptos simples como cómo funciona proxychains, tipos de proxy, modos de cadena y configuración, no deberías tener problemas con la herramienta. Debería tener sentido por qué no funciona de manera directa en algunas aplicaciones y cómo solucionar problemas.\nRepositorio Oficial: https://github.com/rofl0r/proxychains-ng\nCómo Funciona Proxychains Proxychains opera como una libreria compartida precargada que intercepta llamadas del sistema relacionadas con la red en programas enlazados dinámicamente, habilitando redirección de proxy transparente en la capa de aplicación.\nLibreria Compartida Precargada: Libreria que contiene código reutilizable que se inyecta en el espacio de memoria de otro programa antes de que se carguen otras librerias, permitiéndole anular funciones estándar. Programa Enlazado Dinámicamente: Programas (la mayoría en realidad), que usan librerias compartidas externas (como archivos .so) para realizar funciones comunes en lugar de empaquetar todo el código en el binario mismo. En palabras más simples, proxychains intercepta funciones de red de aplicaciones para inyectar su lógica de enrutamiento de proxy, todo sin que la aplicación lo sepa.\nInyección de Libreria e Intercepción de Funciones Cuando se ejecuta una aplicación, proxychains inyecta la libreria libproxychains.so en el espacio de memoria del proceso de la aplicación antes de que se carguen las librerias del sistema estándar.\nEsto permite que proxychains intercepte y reemplace funciones de red de libc para agregar lógica de redirección de proxy antes de establecer conexiones TCP.\nEjemplo de funciones de libc interceptadas:\nconnect(): Captura intentos de conexión TCP salientes y los redirige a través de la cadena de proxy. getaddrinfo(): Maneja solicitudes de resolución DNS a través de la API estándar POSIX. close() / close_range(): Garantiza la limpieza adecuada de sockets y recursos. Flujo de Redirección de Tráfico Una vez que se intercepta un intento de conexión, proxychains redirige transparentemente el tráfico a través de la secuencia de proxy configurada (desde proxychains.conf).\nLa aplicación es completamente ajena a la redirección de proxychains y continúa operando como de costumbre. No se necesita ningún cambio en la aplicación.\nProxy de DNS y Prevención de Fugas Cuando proxy_dns está habilitado en proxychains.conf, proxychains previene fugas de DNS manejando la resolución de nombres de host a través de la cadena de proxy en lugar de tu resolvedor DNS local. Esto previene fugas de DNS que podrían exponer tu actividad de navegación a tu ISP (proveedor de servicios de Internet) o red local.\n¿Qué es una fuga de DNS? Cuando visitas un sitio web, tu computadora necesita traducir el nombre de dominio (como www.google.com) en una dirección IP a través de resolución DNS. Incluso si todo tu tráfico está pasando a través de proxies, esas consultas DNS podrían seguir siendo enviadas directamente al servidor DNS de tu ISP (revelando qué sitios estás intentando visitar). El proxy de DNS soluciona esto enrutando esas consultas a través de tu cadena de proxy también.\nSoporte de Protocolos Proxychains funciona con tráfico basado en TCP y soporta varios tipos de proxy comunes:\nConexiones TCP: Soporte completo para todo el tráfico de red basado en TCP. Tipos de Proxy: SOCKS4, SOCKS4a, SOCKS5 (con o sin autenticación), y proxies HTTP/HTTPS. Tipos de Proxy SOCKS4\nEl protocolo SOCKS básico que proporciona proxy TCP básico. Solo soporta direcciones IPv4 y no maneja resolución DNS (necesita resolver nombres de host a direcciones IP antes de conectarse). Ampliamente soportado pero limitado en comparación con versiones más nuevas. No recomendado. SOCKS4a\nUna extensión de SOCKS4 que agrega soporte de resolución de nombres de host. En lugar de requerir que resuelvas nombres de dominio tú mismo, permite que el servidor proxy maneje búsquedas DNS. Esto es útil para acceder a recursos por nombre de host en lugar de dirección IP. SOCKS5 (Recomendado)\nLa opción recomendada debido a su flexibilidad y características. Soporta tanto IPv4 como IPv6, incluye autenticación integrada y puede manejar varios tipos de tráfico. Ten en cuenta que algunas implementaciones de SOCKS5 soportan tráfico UDP pero proxychains no soporta UDP. HTTP/HTTPS\nLos proxies HTTP fueron diseñados originalmente para tráfico web pero pueden manejar otras conexiones TCP a través del método HTTP CONNECT. La conexión al proxy está cifrada, pero una vez que se establece el túnel de conexión, el proxy ve tu tráfico en la forma que lo envíes. Si estás accediendo a sitios HTTP, ese tráfico sigue sin cifrar dentro del túnel. Limitaciones de Protocolo Proxychains intercepta funciones de conexión TCP solo en programas enlazados dinámicamente. Los protocolos que no usan estas no pueden ser interceptados.\nTráfico UDP: Generalmente no soportado porque UDP no tiene conexión y evita las llamadas connect() que proxychains intercepta. Paquetes ICMP: Herramientas como ping y traceroute no pueden ser enrutadas por proxy ya que usan ICMP. Sockets Raw: Las aplicaciones que usan operaciones de socket raw se comunican directamente con el kernel, evitando las funciones libc que proxychains intercepta. Modos de Cadena Estos son los tipos de cadenas / enrutamiento que serán usados por proxychains.\nModo de Cadena Dinámica (Recomendado) Enruta el tráfico a través de todos los proxies listados en secuencia. Omite automáticamente los proxies que no responden.\nRequiere al menos 1 proxy en línea. Continúa la operación automáticamente incluso cuando algunos proxies son inalcanzables. Esta es la cadena recomendada. Comúnmente usada cuando la disponibilidad del proxy es inconsistente y el tiempo de actividad es crítico. Modo de Cadena Estricta Enruta el tráfico a través de todos los proxies listados en el orden exacto especificado, de lo contrario falla.\nTodos los proxies deben estar en línea. Toda la conexión falla si algún proxy individual en la cadena es inalcanzable. Esta cadena asegura una ruta de red consistente y predecible para todas las conexiones. Modo de Cadena Round-Robin Distribuye el tráfico secuencialmente a través de todos los proxies en rotación round-robin.\nRequiere al menos 1 proxy en línea. Cada nueva conexión usa el siguiente proxy en la secuencia y vuelve al primer proxy después de alcanzar el final de la cadena. Esta cadena proporciona distribución de carga a través de los proxies, previniendo que un proxy individual sea sobrecargado o que tu conexión sea limitada por tasa. Modo de Cadena Aleatoria Enruta el tráfico a través de un proxy seleccionado aleatoriamente de la lista configurada.\nRequiere al menos 1 proxy en línea. Controla cuántos proxies de la lista se usan por conexión con el parámetro de configuración chain_len. Esta cadena mejora el anonimato debido a la selección aleatoria de proxy pero puede tener rendimiento variable debido a diferentes ubicaciones y velocidades de servidor proxy. Archivo de Configuración Proxychains busca su archivo de configuración en este orden:\nVariable de entorno $PROXYCHAINS_CONF_FILE Variable de entorno para una ruta de archivo de configuración personalizada. Tiene la prioridad más alta cuando está establecida. Opción de línea de comandos -f \u0026lt;config_file_path\u0026gt; Opción de comando para ejecución binaria de proxychains. Especifica el archivo de configuración directamente al ejecutar proxychains. ~/.proxychains/proxychains.conf o ~/.proxychains/proxychains4.conf Ruta de archivo de configuración específica del usuario. El nombre del archivo depende de la distro de Linux. Anula la configuración del sistema. /etc/proxychains.conf o /etc/proxychains4.conf Ruta de archivo de configuración del sistema. El nombre del archivo depende de la distro de Linux. Se usa cuando no existe configuración específica del usuario. Listas de Proxy Servicios de Proxy Gratuitos Al igual que con las VPN, no recomiendo proxies públicos gratuitos ya que a menudo tienen riesgos de seguridad/privacidad y problemas de confiabilidad. En su lugar, puedes auto-hospedar tu propia infraestructura de proxy (publicación futura) o usar una paga.\nProxyScrape: https://proxyscrape.com/free-proxy-list Proxifly (GitHub): https://github.com/proxifly/free-proxy-list ProxyDB: https://proxydb.net/ GeoNode: https://geonode.com/free-proxy-list Servicios de Proxy Pagos Oxylabs: https://oxylabs.io/ Bright Data: https://brightdata.com/ IPBurger: https://www.ipburger.com/ Decodo: https://decodo.com/ Nota: Estos son servicios de proxy comunes, pero investiga por tu cuenta antes de elegir uno.\nInformación Útil de Saber Ventajas y Limitaciones Ventajas\nTransparencia de Aplicación: Las aplicaciones funcionan sin ningún cambio de configuración (son ajenas al proxy). Flexibilidad de Protocolo: Puedes mezclar proxies SOCKS4/5 y HTTP en la misma cadena. Encadenamiento de Múltiples Proxies: Enruta el tráfico a través de múltiples proxies para mejor anonimato. Privacidad DNS: Enruta consultas DNS a través de proxies para prevenir fugas. Limitaciones\nRestricciones de Protocolo: Solo TCP (soporte limitado de UDP). Solo Enlace Dinámico: No funciona con binarios compilados estáticamente. Problemas de Compatibilidad: Los binarios estáticos evitan el mecanismo de intercepción. Las aplicaciones que usan dlopen() o sockets raw pueden no funcionar. Las llamadas directas al sistema no pueden ser interceptadas. AppArmor/SELinux puede bloquear la funcionalidad. Impacto en el Rendimiento: Latencia agregada por salto de proxy. Ancho de banda limitado por el proxy más lento. Casos de Uso Pruebas de Seguridad\nAnonimizar herramientas de pruebas de penetración y escaneos de vulnerabilidades. Pivotar a través de sistemas comprometidos para acceder a redes aisladas. Realizar recopilación OSINT y pruebas de aplicaciones web desde diferentes ubicaciones geográficas. Privacidad y Operaciones\nEludir restricciones geográficas y censura. Acceder a recursos corporativos a través de túneles proxy. Mantener seguridad operacional durante investigación sensible. Desarrollo y Pruebas\nProbar APIs a través de diferentes rutas de red. Simular bases de usuarios distribuidas a través de regiones. Validar comportamiento de aplicaciones bajo varias condiciones de red. Recopilación de Datos\nEludir limitación de tasa basada en IP rotando a través de múltiples endpoints de proxy. Recopilar inteligencia competitiva de forma anónima. Evitar discriminación de precios específica de región. Integración con Tor Proxychains y Tor son mencionados frecuentemente juntos, pero son herramientas diferentes para propósitos diferentes. Proxychains es una herramienta que enruta el tráfico de tu aplicación a través de servidores proxy, mientras que Tor es una red de anonimato dedicada con protecciones criptográficas integradas.\nSi quieres acceder a la red Tor de forma anónima, simplemente usa Tor Browser o torsocks. Estas herramientas están diseñadas para navegación anónima a través de la red Tor. Y usa proxychains cuando necesites enrutar tráfico TCP de aplicaciones regulares a través de servidores proxy (no en la red Tor).\nQué NO Hacer:\nNo Uses Tor Browser con Proxychains: Tor Browser ya enruta el tráfico a través de Tor, agregar proxychains es redundante y podría crear riesgos de seguridad potenciales. No Encadenes Tor con Proxies Adicionales: A diferencia de la creencia popular, agregar proxies antes o después de Tor típicamente reduce el anonimato en lugar de mejorarlo. No Ejecutes como Root: Ejecutar aplicaciones GUI como root generalmente crea riesgos de seguridad. Uso Correcto de Proxychains con Tor: Si necesitas enrutar herramientas de línea de comandos a través de Tor (no para anonimato, sino para funcionalidad), configura proxychains para usar el proxy SOCKS local de Tor:\n# Agrega el proxy de Tor a proxychains.conf socks5 127.0.0.1 9050 # Inicia el servicio Tor primero sudo systemctl start tor # Usa proxychains con aplicaciones proxychains curl https://check.torproject.org proxychains firefox # Para navegación general, NO PARA NAVEGACIÓN TOR Habrá otra publicación dedicada a Tor, pero toma en consideración algunos pros y contras de usar la red Tor con proxychains.\nCuando usas Tor, tu tráfico entra a través de un nodo de entrada y eventualmente sale a través de un nodo de salida que podría ser ejecutado por cualquiera (personas regulares o actores maliciosos). Sí, eres verdaderamente anónimo (el operador del nodo no tiene forma de ver tu dirección IP real), pero pueden ver cualquier tráfico sin cifrar que pase a través de su nodo. Si usas un servicio de proxy pago, conoces quién es el propietario del proxy y su política de privacidad, lo cual crea cierta tranquilidad para algunos usuarios, pero el propietario puede ver tu IP real y que estás usando Tor. La elección depende de ti, si necesitas anonimato del servidor de destino y no quieres que nadie correlacione tu identidad real con tu tráfico, Tor es el camino a seguir. Si prefieres trabajar con infraestructura responsable donde sabes quién está ejecutando los servidores, un servicio de proxy pago reputado tiene más sentido. Mi recomendación es usar una VPN de conocimiento cero (como Proton o Mullvad) junto con Tor, lo cual oculta tu uso de Tor de tu ISP y previene que los guardias de entrada de Tor vean tu dirección IP real. Técnicas Apropiadas de Anonimato Usa Tor para Anonimato, No Proxychains: Tor proporciona anonimato criptográfico. Proxychains es para pivotar y eludir restricciones, no anonimato. No recomiendo encadenar Tor con proxies adicionales, derrota el propósito. Combinaciones VPN/Proxy: Correcto: VPN -\u0026gt; Tor (VPN luego Tor browser o torsocks). Incorrecto: VPN -\u0026gt; Proxychains -\u0026gt; Tor (reduce el anonimato). Usa Infraestructura Confiable: Despliega tus propios servidores proxy en proveedores de nube confiables. Usa servicios de proxy comerciales reputados (no gratuitos). Audita y monitorea tu infraestructura de proxy regularmente (verifica fugas). OpSec Hacer:\nVerifica si tienes alguna fuga de DNS. Usa cifrado de extremo a extremo y HTTPS tanto como sea posible. Rota los proxies regularmente. Usa aislamiento específico de aplicación (perfiles de navegador separados, VMs). No Hacer:\nNo reutilices la misma cadena a largo plazo. No mezcles tráfico personal y de operaciones/investigación. No asumas que proxychains proporciona cifrado (no lo hace). No ejecutes aplicaciones GUI como root con proxychains. Trabajando con Proxychains Instalar Proxychains Hay 2 versiones de proxychains: el legado proxychains que no tiene mantenimiento, y el moderno proxychains-ng (usa este). El nombre difiere entre distros de Linux, lo cual puede ser confuso.\nDistros basadas en RHEL (Fedora, CentOS, etc.): Solo proxychains-ng está disponible. Instala con el nombre de paquete proxychains-ng, ejecuta con el comando proxychains, y configura vía proxychains.conf. Distros basadas en Debian (Ubuntu, Debian, etc.): Ambas versiones están disponibles. El moderno proxychains-ng está empaquetado como proxychains4 para evitar conflictos con la versión legada. Ejecuta con el comando proxychains4 y configura vía proxychains4.conf. Recomendación: Siempre usa proxychains-ng. En sistemas Debian, asegúrate de estar ejecutando proxychains4 (no proxychains - verifica que estás ejecutando la versión 4.x, no 3.x). # RHEL/Fedora dnf install proxychains-ng # Debian/Ubuntu apt install proxychains4 Configurar Proxychains Edita /etc/proxychains.conf o ~/.proxychains/proxychains.conf.\nvim ~/.proxychains/proxychains.conf # Archivo de Configuración de Proxychains de Ejemplo # ============================================ # Selección de Modo de Cadena (elige UNO) # ============================================ dynamic_chain # Recomendado: omite proxies muertos # strict_chain # Todos los proxies deben estar en línea # round_robin_chain # Rotar a través de proxies en round-robin # random_chain # Selección aleatoria de proxy # ============================================ # Configuración de Cadena Aleatoria # ============================================ # Solo aplica cuando random_chain está habilitado chain_len = 2 # Número de proxies por cadena # ============================================ # Configuración DNS # ============================================ # Prevenir fugas de DNS enrutando DNS a través de proxy proxy_dns # Subred DNS remota para respuestas locales falsas # Usada internamente para identificar solicitudes DNS remote_dns_subnet 224 # ============================================ # Tiempos de Espera de Conexión (milisegundos) # ============================================ tcp_read_time_out 15000 # Tiempo de espera de lectura: 15 segundos tcp_connect_time_out 8000 # Tiempo de espera de conexión: 8 segundos # ============================================ # Control de Salida # ============================================ # Suprimir salida de depuración de proxychains quiet_mode # ============================================ # Exclusiones de Red Local # ============================================ # Omitir proxy para redes locales/privadas localnet 127.0.0.0/255.0.0.0 # Localhost localnet 10.0.0.0/255.0.0.0 # Clase A Privada localnet 172.16.0.0/255.240.0.0 # Clase B Privada localnet 192.168.0.0/255.255.0.0 # Clase C Privada # ============================================ # Lista de Proxy # ============================================ # En esta sección es donde listas los servidores proxy a usar [ProxyList] # Formato: [nombre_usuario] [contraseña] # Proxies SOCKS (sin autenticación) socks4 192.168.1.100 1080 socks5 192.168.1.101 1080 # SOCKS5 con autenticación socks5 proxy.example.com 1080 username password # Proxy SOCKS de Tor (predeterminado) socks5 127.0.0.1 9050 # Proxies HTTP http 192.168.1.102 8080 http proxy.example.com 8080 username password # Proxy HTTPS http proxy.example.com 3128 user pass123 Usando Proxychains Ejecuta proxychains junto con otro programa/aplicación para rotar a través de proxies. -f \u0026lt;config_file_path\u0026gt;: Especifica un archivo proxychains.conf personalizado a usar. -q: Habilita modo silencioso (suprime salida de proxychain). # Sintaxis proxychains [opciones] [opciones_programa] # Ejemplos # Ejecución de comando simple proxychains nslookup example.com # Lanzar Firefox proxychains firefox # Escaneo de red (requiere flags específicos) proxychains nmap -sT -Pn -n target.com # Conexión SSH proxychains ssh user@remote-host Probar Anonimato de Proxy # Verificar nivel de anonimato con verificador de proxy curl -x socks5://proxy.example.com:1080 https://ip-api.com/json/ # Verificar que no hay fugas de IP proxychains curl https://ipleak.net/json/ ","permalink":"https://danoss.me/es/categories/security/analisis-en-profundidad-de-proxychains/","summary":"Información detallada sobre proxychains, casos de uso, tipos de cadenas, configuración y cómo utilizarlas de forma segura","title":"Análisis en Profundidad de Proxychains"},{"content":" Parte 3 - Uso de YubiKeys con GPG.\nNota: Toda la configuración a continuación se realizó en Fedora con GNOME DE (aplicable 1-a-1 en distros relacionadas) y YubiKey 5C / USB (no la versión Biometric).\n¿Qué es GPG? Según el sitio web oficial:\nGnuPG es una implementación completa y gratuita del estándar OpenPGP tal como lo define RFC 4880. GnuPG te permite cifrar y firmar tus datos y comunicaciones; cuenta con un sistema versátil de gestión de llaves, junto con módulos de acceso para todo tipo de directorios de llaves públicas. GnuPG, también conocido como GPG, es una herramienta de línea de comandos con funciones para facilitar la integración con otras aplicaciones. Hay disponible una gran cantidad de aplicaciones frontend y bibliotecas. GnuPG también proporciona soporte para S/MIME y Secure Shell (ssh).\nLlaves GPG de YubiKey Al trabajar con llaves GPG, YubiKey utiliza su aplicación OpenPGP para almacenar llaves privadas GPG en su elemento seguro, lo que evita que sean extraídas bajo cualquier circunstancia.\nElemento Seguro: Chip resistente a manipulaciones dentro de YubiKey que almacena material criptográfico. Los datos almacenados aquí no pueden ser extraídos, incluso con acceso físico al hardware.\nTodas las operaciones criptográficas (como firmar, descifrar, autenticar) se ejecutan dentro de este elemento seguro y solo exponen los resultados.\n# Mostrar información de YubiKey, como las aplicaciones habilitadas ykman info # Salida del comando: Device type: YubiKey 5C ... Applications ... FIDO2 Enabled OpenPGP Enabled # Esta es la aplicación utilizada Ranuras de Llaves La aplicación OpenPGP de YubiKey tiene 3 ranuras dedicadas, cada una con una función específica.\nRanura de Firma: Utilizada para crear firmas digitales Ranura de Cifrado: Utilizada para descifrar datos Ranura de Autenticación: Utilizada para operaciones de autenticación (p. ej., SSH) Cada ranura puede contener un par de llaves RSA, ECC o Ed25519/Cv25519.\nAgregar Llaves GPG a YubiKey La aplicación OpenPGP de YubiKey admite 2 formas de aprovisionar llaves GPG:\nGeneración de Llaves GPG en el Dispositivo\nLas llaves se generan en el elemento seguro y nunca existen fuera de YubiKey. Debido a esto, son muy seguras pero no se pueden respaldar. Si se pierde o daña YubiKey, las llaves se pierden permanentemente. Generar Llaves GPG Externamente y Luego Importar a YubiKey\nLas llaves se generan en tu computadora y luego se importan a YubiKey. Esto te permite respaldar la llave, importar la misma llave a múltiples YubiKeys y mantener una llave maestra para la rotación de subllaves (más sobre esto más adelante). Enfoque recomendado para la mayoría de los usuarios. Nota: Una vez importadas a YubiKey, las llaves privadas no pueden ser extraídas o exportadas del elemento seguro. El dispositivo realizará todas las operaciones criptográficas internamente, exponiendo solo los resultados. ¿Por Qué Usar GPG con YubiKey? ¿Por qué no? Como muchas cosas, YubiKey mejora la seguridad en muchos niveles.\nIncluso si tu computadora está comprometida, las llaves privadas permanecerán inaccesibles para el atacante. Las operaciones de firma/descifrado requieren acceso a YubiKey.\nLa Topología de Llaves OpenPGP OpenPGP utiliza un modelo de confianza jerárquico donde una única Llave Maestra puede crear Subllaves especializadas.\nEsta arquitectura permite que las Subllaves se usen, almacenen en YubiKey y roten sin perder tu identidad criptográfica (almacenada en la Llave Maestra, que debe mantenerse en una ubicación segura sin conexión).\nTipo de Llave GPG Capacidad Ubicación de Almacenamiento Descripción Llave Maestra Certificar Almacenamiento Seguro Offline Esta es tu identidad.Utilizada para: crear y revocar subllaves, firmar las llaves de otras personas (red de confianza), actualizar fechas de vencimiento de llaves.Nunca la almacenes en YubiKey.Mantenla offline en una ubicación segura, para que si tu YubiKey es robada o dañada, puedas usar la Llave Maestra para revocar las subllaves antiguas de YubiKey, generar nuevas subllaves y firmarlas, manteniendo tu identidad y red de confianza. Subllave de Firma Firmar Ranura de YubiKey Utilizada para firmar datos (p. ej., commits de Git, correos electrónicos).Requiere toque de YubiKey y PIN para cada operación de firma. Subllave de Cifrado Cifrar Ranura de YubiKey Utilizada para descifrar archivos y mensajes que fueron cifrados con tu llave pública.Requiere toque de YubiKey y PIN para cada operación de descifrado. Subllave de Autenticación Autenticar Ranura de YubiKey Utilizada para autenticación SSH a través del Agente GPG y autenticación PAM.Algunas personas prefieren esto sobre FIDO2 para gestionar el acceso SSH. Configuración Instalar Paquetes Requeridos ¿Qué Hace Cada Paquete?\ngnupg2: Implementación de GPG. pinentry-gnome3: Diálogo de entrada de PIN integrado con GNOME. pcsc-lite: Middleware de tarjetas inteligentes PC/SC. pcsc-lite-ccid: Controlador genérico de lector de tarjetas inteligentes USB CCID. yubikey-manager: Herramienta CLI oficial de Yubico (ykman) para gestionar YubiKey. # Instalar GPG y herramientas de tarjetas inteligentes sudo dnf install gnupg2 pinentry-gnome3 pcsc-lite pcsc-lite-ccid # Instalar herramientas de gestión de YubiKey (si no están ya instaladas) sudo dnf install yubikey-manager # Habilitar e iniciar el daemon de Tarjetas Inteligentes PC/SC sudo systemctl enable --now pcscd Generar Llaves GPG (Generación Externa) La mejor práctica es generar llaves GPG externamente (no en YubiKey) para permitir respaldos y luego mover las Subllaves a YubiKey.\nSi ya tienes tus llaves GPG generadas, salta esta sección.\nGenerar Llaves Maestras Mi recomendación es generar llaves Ed25519/Cv25519. # Generar llave maestra y subllaves gpg --expert --full-generate-key # Prácticamente todas las opciones predeterminadas son las más seguras Agregar Subllaves # Obtén tu ID de llave maestra GPG con gpg --list-keys # o simplemente pon el correo electrónico especificado al generar la llave maestra # Editar la llave maestra para agregar subllaves # Sintaxis: gpg --expert --edit-key KEY_ID_OR_EMAIL gpg --expert --edit-key email@example.com # En el prompt gpg\u0026gt;, agrega 3 subllaves: # 1. Subllave de firma [S] gpg\u0026gt; addkey # Elegir: (10) ECC (sign only) # Elegir: (1) Curve 25519 *predeterminado* # Vencimiento: 1y # 2. Subllave de cifrado [E] gpg\u0026gt; addkey # Elegir: (12) ECC (encrypt only) # Elegir: (1) Curve 25519 *predeterminado* # Vencimiento: 1y # 3. Subllave de autenticación [A] gpg\u0026gt; addkey # Elegir: (11) ECC (set your own capabilities) # Elegir: S (desactivar capacidad de firma) # Elegir: A (activar capacidad de autenticación) # Elegir: Q (finalizar) # Elegir: (1) Curve 25519 *predeterminado* # Vencimiento: 1y # Guardar y salir - si no se guarda, los cambios se revierten gpg\u0026gt; save Listar Llaves Generadas Mostrar las llaves maestras y subllaves GPG generadas. Al listar estas llaves, verás banderas de capacidad de una sola letra, lo que facilita reconocer su función:\n[C] - Certificación (Llave Maestra). [S] - Firma. [E] - Cifrado. [A] - Autenticación. # Mostrar llaves GPG generadas (maestra y subllaves) gpg --list-secret-keys --keyid-format LONG email@example.com # Salida del comando # sec ed25519/XXXXXXXX 2025-11-15 [C] # created: 2025-11-15 expires: never usage: C # trust: ultimate validity: ultimate # ssb ed25519/XXXXXXXX 2025-11-15 [S] [expires: 2026-11-15] # ssb cv25519/XXXXXXXX 2025-11-15 [E] [expires: 2026-11-15] # ssb ed25519/XXXXXXXX 2025-11-15 [A] [expires: 2026-11-15] Respaldar Tus Llaves GPG (IMPORTANTE) Recuerda que una vez que las subllaves se agregan a YubiKey, no pueden ser extraídas de YubiKey Y las subllaves privadas también se eliminan del llavero de la máquina local, así que siempre haz un respaldo antes de transferir.\n# Exportar llaves privadas (haz esto ANTES de mover a YubiKey) gpg --export-secret-keys --armor KEY_ID_OR_EMAIL \u0026gt; gpg_master_key.asc gpg --export-secret-subkeys --armor KEY_ID_OR_EMAIL \u0026gt; gpg_subkeys.asc # Exportar llave pública gpg --export --armor KEY_ID_OR_EMAIL \u0026gt; gpg_public_key.asc # Exportar base de datos de confianza gpg --export-ownertrust \u0026gt; gpg_trust.txt # Almacena estos archivos en un respaldo cifrado seguro (preferiblemente offline) Trabajar Con YubiKey Verificar Estado de OpenPGP de YubiKey Antes de hacer cualquier cambio, verifica el estado actual de la aplicación OpenPGP de tu YubiKey:\n# Ver información de la aplicación OpenPGP ykman openpgp info # Salida del comando: # OpenPGP version: 3.4 # Application version: 5.7.2 # PIN tries remaining: 3 # Reset code tries: 0 # Admin PIN tries: 3 # Require PIN for signature: Once # Ver estado detallado de la tarjeta usando GPG gpg --card-status # Salida del comando: # Reader ...........: Yubico YubiKey OTP FIDO CCID 00 00 # Application ID ...: XXXXXXXXXXXXXXXXXXXXXXXXXXXX # Application type .: OpenPGP # Version ..........: 3.4 # Manufacturer .....: Yubico # Serial number ....: 12345678 # Name of cardholder: [not set] # ... Nota: Si no se puede leer la tarjeta inteligente de YubiKey, consulta la sección de Solución de Problemas al final.\nCambiar PINs Predeterminados (IMPORTANTE) YubiKey viene con PINs predeterminados de fábrica que deben cambiarse.\nPINs de Aplicación OpenPGP: Estos son diferentes de los PINs de la aplicación FIDO2. Bloqueo de PIN de Usuario: 3 intentos fallidos bloquean el PIN de Usuario (solo se puede desbloquear con PIN de Admin) Bloqueo de PIN de Admin: 3 intentos fallidos bloquean permanentemente la aplicación OpenPGP (requiere restablecimiento de fábrica) Tipo de PIN Propósito Valor Predeterminado Consideraciones de Seguridad PIN de Usuario Operaciones diarias (firmar, descifrar, autenticar) 123456 Lo escribirás frecuentemente, así que equilibra seguridad con usabilidad. PIN de Admin Tareas de administración (importación de llaves, cambios de configuración) 12345678 Debe ser complejo y almacenarse en una ubicación segura. # Cambiar PIN de Usuario ykman openpgp access change-pin # Enter PIN: (si es la primera vez, escribe el valor predeterminado: 123456) # New PIN: # Repeat for confirmation: # Cambiar PIN de Admin ykman openpgp access change-admin-pin # Enter PIN: (si es la primera vez, escribe el valor predeterminado: 12345678) # New PIN: # Repeat for confirmation: Mover Subllaves a YubiKey La operación keytocard mueve permanentemente tu subllave privada GPG a YubiKey y la elimina de tu llavero GPG. La llave maestra permanece en tu computadora para la gestión futura de subllaves.\nAntes de Mover tus Subllaves a YubiKey Asegúrate de Que:\nLa Llave Maestra y las Subllaves estén respaldadas. Los PINs predeterminados se hayan cambiado a valores fuertes. # Editar la llave gpg --edit-key KEY_ID_OR_EMAIL # Listar llaves para ver números de subllaves gpg\u0026gt; list # Mover subllave de firma gpg\u0026gt; key 1 # Seleccionar 1ra subllave (firma) - la selección muestra ssb* gpg\u0026gt; keytocard # Elegir ranura: 1 (Signature key) # Ingresar contraseña y PIN de Admin cuando se solicite gpg\u0026gt; key 1 # Deseleccionar llave 1 gpg\u0026gt; key 2 # Seleccionar 2da subllave (cifrado) - la selección muestra ssb* gpg\u0026gt; keytocard # Elegir ranura: 2 (Encryption key) # Ingresar contraseña y PIN de Admin cuando se solicite gpg\u0026gt; key 2 # Deseleccionar llave 2 gpg\u0026gt; key 3 # Seleccionar 3ra subllave (autenticación) - la selección muestra ssb* gpg\u0026gt; keytocard # Elegir ranura: 3 (Authentication key) # Ingresar contraseña y PIN de Admin cuando se solicite gpg\u0026gt; key 3 # Deseleccionar llave 3 # Guardar y salir gpg\u0026gt; save Verificar que las Llaves Estén en YubiKey Verificar Estado de la Tarjeta\nLa salida debe mostrar las subllaves GPG. # Verificar estado de la tarjeta gpg --card-status # Deberías ver tus 3 subllaves listadas: # Signature key ....: [fingerprint] # Encryption key....: [fingerprint] # Authentication key: [fingerprint] # sec ed25519/XXXXXXXX 2025-11-15 [C] # created: 2025-11-15 expires: never usage: C # trust: ultimate validity: ultimate # ssb\u0026gt; ed25519/XXXXXXXX 2025-11-15 [S] [expires: 2026-11-15] # ssb\u0026gt; cv25519/XXXXXXXX 2025-11-15 [E] [expires: 2026-11-15] # ssb\u0026gt; ed25519/XXXXXXXX 2025-11-15 [A] [expires: 2026-11-15] Listar Llaves Secretas\nEn la salida, nota el símbolo \u0026gt; después de ssb - esto confirma que las subllaves ahora están almacenadas en YubiKey, no en tu llavero GPG. # Listar llaves secretas (debe mostrar \u0026#34;ssb\u0026gt;\u0026#34; indicando que las llaves están en la tarjeta) gpg --list-secret-keys # Salida del comando # sec ed25519/XXXXXXXX 2025-11-15 [C] # created: 2025-11-15 expires: never usage: C # trust: ultimate validity: ultimate # ssb\u0026gt; ed25519/XXXXXXXX 2025-11-15 [S] [expires: 2026-11-15] # ssb\u0026gt; cv25519/XXXXXXXX 2025-11-15 [E] [expires: 2026-11-15] # ssb\u0026gt; ed25519/XXXXXXXX 2025-11-15 [A] [expires: 2026-11-15] Configurar Requisito de Toque (IMPORTANTE) Requerir un toque físico para cada operación GPG evita que el malware use tus llaves sin contacto físico explícito (incluso si captura tu PIN).\n# Requerir toque para todas las operaciones ykman openpgp keys set-touch sig on # Firma ykman openpgp keys set-touch enc on # Cifrado ykman openpgp keys set-touch aut on # Autenticación # Opciones: # on - Toque requerido, pero almacenado en caché por 15 segundos # off - No se requiere toque # fixed - Toque requerido cada vez, sin caché (más seguro) # cached - Toque requerido, almacenado en caché hasta que se retire YubiKey Gestión de PIN (OPCIONAL) Establecer límites de reintentos. ykman openpgp access set-retries 5 5 5 Eliminar Llave Maestra del Llavero Local (OPCIONAL) Exportar Llave Maestra Privada\nExporta la llave maestra privada y respáldala en una ubicación segura offline. Para máxima seguridad, esta llave maestra debe mantenerse offline, no en tu computadora. Estarás trabajando con las subllaves. gpg --export-secret-keys -a email@example.com \u0026gt; gpg_master_key.asc # Luego guárdala en una unidad USB cifrada o algo seguro Eliminar Llave Maestra de la Computadora\n# Eliminar llave secreta maestra del llavero GPG # ¡Asegúrate de tener respaldos offline antes de hacer esto! gpg --delete-secret-keys email@example.com # Re-importar solo tus llaves públicas y stubs de tarjeta (de secciones anteriores) gpg --import gpg_public_key.asc Verificar que la Llave Maestra Está Eliminada\nEl símbolo # junto a la llave privada significa que la llave maestra no está disponible. # Verificar: la llave maestra debe mostrar \u0026#39;sec#\u0026#39; gpg --list-secret-keys # Salida del comando # sec# ed25519/XXXXXXXX 2025-11-15 [C] # La llave maestra está offline # created: 2025-11-15 expires: never usage: C # trust: ultimate validity: ultimate # ssb\u0026gt; ed25519/XXXXXXXX 2025-11-15 [S] [expires: 2026-11-15] # ssb\u0026gt; cv25519/XXXXXXXX 2025-11-15 [E] [expires: 2026-11-15] # ssb\u0026gt; ed25519/XXXXXXXX 2025-11-15 [A] [expires: 2026-11-15] Configurar el Agente GPG Configura el agente GPG para gestionar el almacenamiento en caché de PIN, soporte SSH y diálogos de entrada de PIN.\nEditar ~/.gnupg/gpg-agent.conf\n# Editar ~/.gnupg/gpg-agent.conf vim ~/.gnupg/gpg-agent.conf # =================================================================== # Programa de Entrada de PIN # =================================================================== pinentry-program /usr/bin/pinentry-gnome3 # Alternativas: # pinentry-program /usr/bin/pinentry # Valor original # pinentry-program /usr/bin/pinentry-curses # Solo terminal # pinentry-program /usr/bin/pinentry-qt # Entornos KDE/Qt # =================================================================== # Soporte SSH # =================================================================== enable-ssh-support # =================================================================== # Almacenamiento en Caché de Contraseña de Llave GPG (llaves basadas en disco) # =================================================================== default-cache-ttl 3600 # 1 hora de tiempo de inactividad max-cache-ttl 7200 # 2 horas máximo absoluto # =================================================================== # Almacenamiento en Caché de Contraseña de Llave SSH # =================================================================== default-cache-ttl-ssh 3600 # 1 hora de tiempo de inactividad max-cache-ttl-ssh 7200 # 2 horas máximo absoluto # =================================================================== # Configuraciones de Seguridad # =================================================================== no-allow-external-cache no-allow-mark-trusted # =================================================================== # Configuraciones de Pantalla # =================================================================== keep-display keep-tty Establecer Permisos Seguros\nchmod 600 ~/.gnupg/gpg-agent.conf Reiniciar el Agente GPG para Implementar Cambios\n# Matar agente existente gpgconf --kill gpg-agent # Iniciar nuevo agente (ocurre automáticamente en la próxima operación GPG) gpg-agent --daemon # Verificar que el agente está en ejecución gpgconf --list-dirs agent-socket Habilitar Soporte SSH (Opcional) Si planeas usar la subllave de Autenticación para inicio de sesión SSH, apunta la variable de entorno SSH_AUTH_SOCK al agente GPG.\nCrear Definición de Variable\nAgrega la exportación de la variable a un script en ~/.bashrc.d/ para hacerla persistente. Asegúrate de que tu archivo ~/.bashrc lea este directorio de complementos - lo cual hacen la mayoría de las distros. # Asegurar que el .bashrc del usuario regular obtenga ~/.bashrc.d (opcional) grep -q \u0026#34;bashrc.d\u0026#34; ~/.bashrc || echo \u0026#39; # Obtener scripts personalizados de .bashrc.d/ if [ -d ~/.bashrc.d ]; then for i in ~/.bashrc.d/*.sh; do [ -r \u0026#34;$i\u0026#34; ] \u0026amp;\u0026amp; source \u0026#34;$i\u0026#34; done fi\u0026#39; \u0026gt;\u0026gt; ~/.bashrc # Crear directorio de complementos bashrc.d/ (si no existe) mkdir -p ~/.bashrc.d/ # Crear script con definición de exportación en directorio de complementos cat \u0026lt;\u0026lt; \u0026#39;EOF\u0026#39; \u0026gt; ~/.bashrc.d/variables.sh #!/bin/bash # Usar Agente GPG como agente SSH export SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket) EOF # Recargar configuración del shell para implementar cambios source ~/.bashrc Verificar que el Soporte SSH Está Activo\n# Verificar que el soporte SSH está activo ssh-add -L # Debería mostrar: ssh-ed25519 XXXX... cardno:0000000000 Configurar SSH para Usar Llave GPG\nAhora, solo exporta la llave pública SSH desde tu llave privada GPG y agrégala al archivo authorized_keys del servidor SSH remoto de destino para conectarte. # Exportar la llave pública SSH desde GPG gpg --export-ssh-key your.email@example.com \u0026gt; ~/.ssh/yubikey.pub # Agregar la llave pública SSH al authorized_keys de servidores remotos cat ~/.ssh/yubikey.pub | ssh user@server \u0026#39;cat \u0026gt;\u0026gt; ~/.ssh/authorized_keys\u0026#39; Conectar Usando SSH\nAl conectarte, se te pedirá que ingreses el PIN de Usuario y que toques la placa de metal de YubiKey inmediatamente para iniciar sesión. Si solo ingresas el PIN y no lo tocas, obtendrás un error similar a: sign_and_send_pubkey: signing failed for ED25519 \u0026quot;cardno:32_740_587\u0026quot; from agent: agent refused operation. # Iniciar sesión como de costumbre vía SSH ssh user@server Usar YubiKey en Sistemas Nuevos Cuando usas una computadora nueva o necesitas restaurar el acceso, solo necesitas tu llave pública y YubiKey.\nInstalar Paquetes Requeridos # Instalar GPG y herramientas de tarjetas inteligentes sudo dnf install gnupg2 pinentry-gnome3 pcsc-lite pcsc-lite-ccid # Instalar herramientas de gestión de YubiKey (si no están ya instaladas) sudo dnf install yubikey-manager # Habilitar e iniciar el daemon de Tarjetas Inteligentes PC/SC sudo systemctl enable --now pcscd Importar Llave Pública Primero importa tu llave pública GPG desde el respaldo o desde un servidor de llaves (si la subiste - recomiendo https://keys.openpgp.org/). # Importar tu llave pública desde un archivo gpg --import gpg_public_key.asc # O obtenerla del servidor de llaves (si la subiste) gpg --keyserver hkps://keys.openpgp.org --recv-keys KEY_ID_OR_EMAIL # Confiar en la llave (establecer confianza máxima porque es tu propia llave) gpg --edit-key KEY_ID_OR_EMAIL gpg\u0026gt; trust # Elegir: 5 = I trust ultimately gpg\u0026gt; quit Probar Operaciones GPG de YubiKey Verificar que YubiKey es Detectada\nSi falla, consulta la sección de solución de problemas. # Verificar que YubiKey es detectada gpg --card-status Probar Operación de Firma\n# Probar firma echo \u0026#34;test\u0026#34; | gpg --clearsign # Se te debe solicitar: # 1. PIN de Usuario # 2. Toque en YubiKey (si está habilitado) Probar Operaciones de Cifrado y Descifrado\n# Probar cifrado y descifrado (a ti mismo) echo \u0026#34;secret\u0026#34; | gpg --encrypt -a --recipient email@example.com \u0026gt; test.asc # Descifrar el nuevo archivo cifrado gpg --decrypt test.asc # Eliminar el archivo de prueba rm test.asc Probar SSH (si está configurado)\n# Listar llaves SSH gestionadas por el agente GPG ssh-add -L # Salida esperada: # ssh-ed25519 XXXXXXXXXXXXXXXXXXXXXXXX... cardno:000000 # Probar conexión SSH a un servidor (el servidor remoto necesita la llave pública) ssh -v user@remote-server # Se te debe solicitar: # 1. PIN de Usuario (solo primer uso, luego se almacena en caché) # 2. Toque en YubiKey (si está habilitado) Solución de Problemas Durante mi primera configuración, encontré un problema donde no se encontraba la tarjeta GPG y el comando gpg --card-status devolvía el error a continuación.\ngpg --card-status # Salida del comando: # gpg: selecting card failed: No such device # gpg: OpenPGP card not available: No such device Primero, verifica el estado del servicio pcscd. Si muestra un problema de permisos, tienes que actualizar polkit para permitir al usuario actual el acceso.\n# Verificar el estado del servicio pcscd systemctl status pcscd # Salida del comando: # ... systemd[1]: Started pcscd.service - PC/SC Smart Card Daemon. # ... pcscd[2224]: 00000000 ../src/auth.c:166:IsClientAuthorized() Process 2162 (user: 60578) is NOT authorized for\u0026gt; # ... pcscd[2224]: 00000224 ../src/winscard_svc.c:357:ContextThread() Rejected unauthorized PC/SC client # ... pcscd[2224]: 00022773 ../src/auth.c:166:IsClientAuthorized() Process 2162 (user: 60578) is NOT authorized for\u0026gt; # ... pcscd[2224]: 00000384 ../src/winscard_svc.c:357:ContextThread() Rejected unauthorized PC/SC client # Crear una regla polkit para permitir el acceso de tu usuario a pcscd sudo vim /etc/polkit-1/rules.d/99-pcscd.rules # Agregar lo siguiente al archivo 99-pcscd.rules polkit.addRule(function(action, subject) { if (action.id == \u0026#34;org.debian.pcsc-lite.access_pcsc\u0026#34; || action.id == \u0026#34;org.debian.pcsc-lite.access_card\u0026#34;) { return polkit.Result.YES; } }); # Establecer permisos más seguros al archivo sudo chmod 644 /etc/polkit-1/rules.d/99-pcscd.rules # Reiniciar polkit y pcscd para implementar los cambios sudo systemctl restart polkit.service sudo systemctl restart pcscd.service # Probar de nuevo (debería funcionar ahora) gpg --card-status Por defecto, el pcscd.service se activa a través de un socket systemd. Asegúrate de iniciar el socket automáticamente al arrancar.\n# Habilitar e iniciar el socket pcscd sudo systemctl enable --now pcscd.socket ¿Qué Sigue? Las YubiKeys son realmente útiles y muy simples de configurar. La única preocupación es perder la llave, así que mi recomendación es siempre tener un respaldo en una ubicación segura y usar PINs para cada operación.\nLas inmersiones profundas en llaves GPG podrían venir en el futuro, pero también es bastante simple. Los próximos temas podrían ser proxychains, temas relacionados con contenedores Docker/Podman, o auto-alojamiento.\n","permalink":"https://danoss.me/es/categories/security/yubikeys-parte-3-gpg/","summary":"Cómo configurar y usar YubiKey con GPG","title":"Yubikeys Parte. 3 - GPG"},{"content":" Parte 2 - Usar YubiKey con SSH para autenticarse en servidores SSH remotos. No voy a explicar qué es SSH y sus casos de uso o configuración, pero podría hacer un análisis profundo si alguien está interesado.\nNota: Toda la configuración se realiza en Fedora con GNOME DE (aplicable 1-a-1 en distribuciones relacionadas) y YubiKey 5C / USB (no la versión Biométrica).\nAutenticación SSH con YubiKey FIDO2 ¿Qué es FIDO2? FIDO2 es un estándar de autenticación abierto que te permite usar llave de seguridad de hardware (como YubiKey) para autenticación sin contraseña.\nOpenSSH + FIDO2\nOpenSSH agregó soporte para FIDO2 en la versión 8.2, lo que significa que ahora podemos usar la YubiKey junto con (o en lugar de) autenticación tradicional basada en contraseña o clave.\nCuando te autenticas, las operaciones criptográficas ocurren directamente en el token de hardware en sí. Así que incluso si alguien compromete tu computadora y roba tus archivos de llave SSH, aún no puede autenticarse sin tener físicamente tu YubiKey.\nEsto ofrece otra capa de seguridad. Cada autenticación requiere que toques físicamente tu YubiKey (también puedes configurarla para requerir verificación de PIN si deseas más seguridad).\nTipos de Llaves SSH FIDO2 Hay 2 tipos de llaves SSH FIDO2:\nLlaves No Residentes:\nLa llave privada se almacena como un archivo en la computadora junto con tus otras llaves SSH. Esto es igual a una llave SSH tradicional, sin embargo, la llave es inútil por sí sola. Requiere tu YubiKey para realizar cualquier operación (como iniciar sesión). Estas llave no consumen ninguno de los espacios de credenciales de tu YubiKey (puedes crear tantas como desees). Para autenticarse en un servidor SSH, la llave privada debe estar presente en tu computadora y la llave pública debe estar presente en el archivo authorized_keys del servidor SSH de destino. Llaves Residentes:\nLa llave privada se almacena directamente en la memoria interna de YubiKey. No se almacenan en la computadora. Estas llave consumen uno de los espacios de credenciales de tu YubiKey (YubiKey 5 contiene hasta 100). Entonces, si creas llave residentes para conectarte a docenas de servidores, puedes agotar los espacios. Para autenticarse en un servidor SSH, puedes simplemente conectar tu YubiKey a cualquier computadora (incluso nueva) y el agente SSH puede \u0026ldquo;descubrir\u0026rdquo; la llave en el dispositivo y usarla para autenticarse en el servidor SSH de destino con la llave pública correspondiente en su archivo authorized_keys. Configuración Requisitos OpenSSH 8.2 o más reciente para soporte FIDO2. El paquete yubikey-manager, que proporciona la herramienta CLI ykman para gestionar la aplicación FIDO2 de YubiKey y más. # Instalar SSH sudo dnf install openssh-clients # Verificar versión de OpenSSH ssh -V # Instalar el paquete \u0026#34;yubikey-manager\u0026#34; si no está instalado sudo dnf install yubikey-manager Configurar PIN FIDO2 en YubiKey Antes de generar llave o usar verificación de PIN, debes establecer un PIN FIDO2 en tu YubiKey.\n# Cambiar o establecer tu PIN FIDO2 ykman fido access change-pin # Verificar que tu PIN funcione ykman fido access verify-pin Importante: Este PIN es separado de los PINs de PIV y OpenPGP. Cada aplicación YubiKey tiene su propio PIN.\nGenerar Llaves SSH Llave No Residente (Recomendada) Las llaves no residentes no consumen espacios de credenciales en YubiKey, y si la YubiKey se pierde o roba, un atacante no puede obtener la llave privada SSH de la YubiKey por sí solo.\nOpciones de Generación de Llaves:\n-t \u0026lt;type\u0026gt;: Tipo de algoritmo de llave a utilizar. ed25519-sk: Utilizar el algoritmo Ed25519 (recomendado). ecdsa-sk: Alternativa si Ed25519 no es compatible, usualmente para servidores antiguos. -O verify-required: Requiere tanto PIN como toque en YubiKey para cada uso, de lo contrario solo se necesita el toque. -C \u0026quot;comment\u0026quot;: Agregar un comentario para identificar la llave. Esto puede ser cualquier cadena, pero la recomendación es especificar algo para identificar quién creó la llave y dónde se generó. # Generar llave no residente con verificación de PIN ssh-keygen -t ed25519-sk -O verify-required -C \u0026#34;user@hostname\u0026#34; # Se te pedirá que: # 1. Toques tu placa metálica de YubiKey # 3. Elijas una contraseña para el archivo de clave (opcional pero recomendado) Llave Residente (Portátil) Las llaves residente se almacenan en la YubiKey en sí, lo que permite portabilidad entre máquinas. Requieren un PIN para generar y usar.\nOpciones de Generación de Llaves:\n-t \u0026lt;type\u0026gt;: Tipo de algoritmo de clave a utilizar. ed25519-sk: Utilizar el algoritmo Ed25519 (recomendado). ecdsa-sk: Alternativa si Ed25519 no es compatible, usualmente para servidores antiguos. -O \u0026lt;option\u0026gt; -O resident: Crea una llave residente almacenada en YubiKey. -O application=ssh:hostname: Etiqueta opcional para múltiples credenciales SSH. Principalmente se utiliza para diferenciar entre todas las llaves almacenadas en YubiKey. -O verify-required: Requiere tanto PIN como toque en YubiKey para cada uso, de lo contrario solo se necesita el toque. -C \u0026quot;comment\u0026quot;: Agregar un comentario para identificar la llave. Esto puede ser cualquier cadena, pero la recomendación es especificar algo para identificar quién creó la llave y dónde se generó. # Generar llave residente con verificación de PIN ssh-keygen -t ed25519-sk -O resident -O verify-required -O application=ssh:hostname -C \u0026#34;user@hostname\u0026#34; # Se te pedirá que: # 1. Ingreses tu PIN FIDO2 (si se usa verify-required) # 2. Toques tu placa metálica de YubiKey # 3. Elijas una contraseña para el archivo de clave (opcional pero recomendado) Agregar Llave Pública a Servidores SSH Este paso es idéntico para AMBOS tipos de llave.\nDespués de generar una llave (cualquier tipo), obtienes un archivo de llave pública .pub (por ejemplo, id_ed25519_sk.pub), que debe agregarse al archivo ~/.ssh/authorized_keys del servidor SSH de destino al que deseas conectarte.\n# Copiar llave pública generada al servidor remoto ssh-copy-id -i ~/.ssh/id_ed25519_sk.pub user@remote-server # O agregar manualmente a authorized_keys cat ~/.ssh/id_ed25519_sk.pub | ssh user@remote-server \u0026#34;mkdir -p ~/.ssh \u0026amp;\u0026amp; cat \u0026gt;\u0026gt; ~/.ssh/authorized_keys\u0026#34; Agregar Llaves al Agente SSH Una vez que la llave pública se agrega al servidor SSH de destino al que deseas conectarte, sigue estos pasos:\nLlaves No Residentes: Necesitas el archivo de clave privada en tu computadora para autenticarte. Agregar la clave al agente SSH es opcional. Llaves Residentes (Se Requiere Agente): Necesitas configurar el Agente SSH para obtener la llave directamente de la memoria de YubiKey para autenticarte. Agregar la llave al agente es un requisito para llaves residentes. Esto se puede hacer en cualquier nueva máquina desde la que desees conectarte. Solo necesitas que la llave pública esté en el servidor SSH de destino. # Iniciar ssh-agent (si no está ejecutándose) eval \u0026#34;$(ssh-agent -s)\u0026#34; # No Residente: Agregar archivo de llave privada al agente SSH ssh-add ~/.ssh/id_ed25519_sk # Residente (en cualquier nueva máquina): Descubrir y cargar la llave desde YubiKey ssh-add -k # Listar llaves cargadas ssh-add -l Usar SSH con YubiKey Una vez que tu llave pública se agrega al archivo authorized_keys del servidor SSH de destino, (y se carga al agente SSH para llaves residente), la conexión es simple.\n# SSH detectará automáticamente y usará YubiKey para autenticación ssh user@remote-server # Especificar explícitamente la llave generada por Yubikey ssh -i ~/.ssh/id_ed25519_sk user@remote-server # Se te pedirá que: # 1. Ingreses tu PIN FIDO2 (si verify-required fue configurado) # 2. Toques tu YubiKey Nota Importante para Usuarios de GNOME\nPor defecto, el entorno de escritorio GNOME Linux utiliza su propio agente SSH (SSH_AUTH_SOCK=/run/user/1000/gcr/ssh), que no funciona bien con llaves de hardware FIDO2. Esto generalmente resulta en un error de autenticación: sign_and_send_pubkey: signing failed for ED25519-SK \u0026quot;/home/user/.ssh/id_ed25519_sk\u0026quot; from agent: agent refused operation.\nPara solucionar esto, simplemente agrega la opción -o \u0026quot;IdentityAgent=none\u0026quot; al conectarte a la máquina de destino. Esto omite el agente GNOME predeterminado para autenticarse correctamente.\n# Conectar en un entorno GNOME Linux ssh -o \u0026#34;IdentityAgent=none\u0026#34; -i ~/.ssh/id_ed25519_sk user@remote-server # Se te pedirá que: # 1. Ingreses tu PIN FIDO2 (si verify-required fue configurado) # 2. Toques tu YubiKey Puede que parezca un comando muy largo solo para conectarse a un servidor SSH, pero puedes especificar estas opciones de conexión en el archivo de configuración de tu cliente SSH ~/.ssh/config para evitar escribir tanto para cada conexión.\nY eso es todo, ¡super simple y ahora eres más seguro!\nEliminar Llaves Residente de YubiKey Los comandos generales de gestión de YubiKey están en la Parte 1, para completar este artículo, los agregué a continuación.\nListar Llaves Residente\n# Listar llaves residente en YubiKey ykman fido credentials list # Ejemplo de salida Credential ID RP ID Username Display name 5f85afc4... ssh: openssh openssh Eliminar Llaves Residente\n# Eliminar una llaves residente de YubiKey especificando su ID de credencial # Eliminar llave residente con ID de credencial \u0026#34;5f85afc4\u0026#34; ykman fido credentials delete 5f85afc4 ¿Qué Sigue? El próximo artículo será sobre la configuración de YubiKeys para GPG/PGP/PPP/GGG\u0026hellip;\n","permalink":"https://danoss.me/es/categories/security/yubikeys-parte-2-ssh/","summary":"Cómo configurar y usar YubiKey para la autenticación SSH","title":"Yubikeys Parte. 2 - SSH"},{"content":" Recientemente compré un par de YubiKeys (YubiKey 5C específicamente), después de años de pensarlo en el fondo de mi mente\u0026hellip;\nLa idea inicial era una sola publicación para mi configuración de YubiKey, pero se volvió demasiado larga, así que será en 2 partes:\nParte 1: Conceptos básicos de YubiKey y autenticación para máquinas Linux locales. Parte 2: Autenticación para SSH y GPG. Nota: Toda la configuración se realiza en Fedora con GNOME DE (aplicable 1 a 1 en distros relacionadas) y YubiKey 5C / USB (no la versión Biometrica).\n¿Qué es una YubiKey? Según Wikipedia, la fuente definitiva de verdad:\nYubiKey es un pequeño dispositivo de hardware que puede \u0026ldquo;proteger el acceso a computadoras, redes y servicios en línea que admite contraseñas de un solo uso (OTP), criptografía de clave pública, autenticación y los protocolos Universal 2nd Factor (U2F) y FIDO2 desarrollados por la FIDO Alliance. Permite a los usuarios iniciar sesión de forma segura en sus cuentas emitiendo contraseñas de un solo uso o usando un par de claves pública/privada basado en FIDO generado por el dispositivo.\nAdministrando YubiKeys Instalar Paquetes Requeridos El paquete yubikey-manager proporciona la herramienta CLI ykman para administrar todas las aplicaciones de YubiKey, como Yubico OTP, FIDO U2F, FIDO2, OATH, PIV, OpenPGP y YubiHSM Auth.\n# Instalar el paquete \u0026#34;yubikey-manager\u0026#34; sudo dnf install yubikey-manager Comandos Generales # Mostrar información de YubiKey (firmware, serial, aplicaciones) ykman info # Listar YubiKeys conectadas ykman list # Habilitar aplicaciones (como, FIDO2, PIV, etc.) ykman config usb --enable \u0026lt;application_name\u0026gt; # Deshabilitar aplicaciones (como, FIDO2, PIV, etc.) ykman config usb --disable \u0026lt;application_name\u0026gt; Comandos FIDO Administrar autenticación FIDO2/U2F (usada para autenticación local en Linux).\n# Mostrar información de FIDO (PIN, contador de credenciales) ykman fido info # Cambiar o establecer PIN de FIDO2 (requerido si se usa verificación de PIN) ykman fido access change-pin # Verificar PIN de FIDO2 existente (si ya está establecido) ykman fido access verify-pin # Desbloquear FIDO (después de demasiados intentos fallidos de PIN) ykman fido access unlock # Listar credenciales residentes ykman fido credentials list # Eliminar una credencial ykman fido credentials delete # Restablecer FIDO (BORRA TODOS LOS DATOS DE FIDO) ykman fido reset Comandos PIV Funcionalidad de tarjeta inteligente para certificados, autenticación, firma.\n# Mostrar información de PIV ykman piv info # Cambiar PIN (predeterminado: 123456) ykman piv access change-pin # Cambiar PUK (PIN Unblocking Key, predeterminado: 12345678) ykman piv access change-puk # Cambiar clave de administración ykman piv access change-management-key # Generar clave en slot ykman piv keys generate 9a /path/to/public.pem # Importar certificado ykman piv certificates import 9a /path/to/cert.pem # Exportar certificado ykman piv certificates export 9a /path/to/output.pem # Generar certificado autofirmado ykman piv certificates generate 9a # Restablecer aplicación PIV (BORRA TODOS LOS DATOS DE PIV) ykman piv reset Comandos GPG # Mostrar información de OpenPGP ykman openpgp info # Cambiar PIN de Usuario (predeterminado: 123456) ykman openpgp access change-pin # Cambiar PIN de Admin (predeterminado: 12345678) ykman openpgp access change-admin-pin # Establecer código de restablecimiento para recuperación de PIN ykman openpgp access set-reset-code # Restablecer aplicación OpenPGP (BORRA TODOS LOS DATOS DE PGP) ykman openpgp reset Usando YubiKey para Autenticación Local en Linux Configura tu máquina Linux para autenticarse/iniciar sesión con solo tocar la YubiKey, sin necesidad de contraseña.\nInstalar Paquetes Requeridos pam-u2f proporciona el módulo PAM que maneja la autenticación de YubiKey. pamu2fcfg es la herramienta de configuración que usaremos para registrar nuestras claves con el sistema. sudo dnf install pam-u2f pamu2fcfg Registrar tu(s) YubiKey(s) Antes de poder usar la YubiKey para autenticación local, regístrala con el sistema.\nPrimero, conecta la YubiKey a tu máquina y ejecuta pamu2fcfg. Cuando ejecutes pamu2fcfg, la YubiKey comenzará a parpadear. Toca el contacto de metal para completar el registro.\n# Crear el directorio de configuración de YubiKey mkdir -p ~/.config/Yubico # Registrar tu YubiKey (conéctala primero y toca el dispositivo) pamu2fcfg \u0026gt; ~/.config/Yubico/u2f_keys Si tienes una YubiKey de respaldo, regístrala aquí también:\n# Agregar YubiKeys de respaldo adicionales al mismo archivo (agregar \u0026gt;\u0026gt;) pamu2fcfg -n \u0026gt;\u0026gt; ~/.config/Yubico/u2f_keys Asegura tu archivo u2f_keys para prevenir acceso no autorizado.\nchmod 600 ~/.config/Yubico/u2f_keys Notas Importantes:\nEl registro de clave anterior es solo para el usuario actual. Para registro de YubiKey en todo el sistema, registra la clave en el archivo /etc/Yubico/u2f_keys en su lugar con cada entrada de usuario por línea. Respalda el archivo u2f_keys en una ubicación segura. Configurando Autenticación PAM Ahora es momento de configurar PAM (Pluggable Authentication Module) para autenticar con la YubiKey. PAM puede dar miedo como un acosador en el parque, pero lo haremos fácil.\nPAM controla cómo funciona la autenticación en Linux, así que modificaremos algunos archivos de configuración para hacer que eso suceda.\nOpciones de Configuración Comunes Modos de Autenticación\nModo Descripción required La autenticación de YubiKey DEBE tener éxito.Si falla, la autenticación finalmente fallará (la autenticación de contraseña u otros módulos restantes aún pueden ser evaluados).Más seguro, pero puede ser molesto si olvidas tu clave. sufficient La autenticación de YubiKey O contraseña funcionará para autenticar.Ligeramente menos seguro. Opciones Comunes:\nOpción Descripción interactive Mostrar mensaje (Insert your FIDO authenticator, then press ENTER) pidiéndote insertar la clave.Se muestra antes de pedirte tocar la clave para autenticar. cue Mostrar mensaje (Please touch the FIDO authenticator) pidiéndote tocar la clave para autenticar. pinverification=1 Pedir el PIN FIDO2 de YubiKey para autenticar.Más seguro que solo tocar.Requiere que se establezca un PIN FIDO2 (ykman fido access change-pin). nouserok Permite a usuarios sin YubiKeys registradas omitir la autenticación de YubiKey y pasar a otros módulos PAM (como autenticación de contraseña).Útil en sistemas multiusuario donde no todos tienen YubiKey. Configurar Acceso sudo Edita /etc/pam.d/sudo para configurar la autenticación de YubiKey al usar sudo.\n# Contenido de \u0026#34;/etc/pam.d/sudo\u0026#34; # Agregar una línea como esta antes de cualquier línea auth existente (usar modo de autenticación \u0026#39;required\u0026#39; o \u0026#39;sufficient\u0026#39; y usar las opciones que prefieras) auth\trequired\tpam_u2f.so cue Por ejemplo, un archivo /etc/pam.d/sudo completo se vería así:\n# Contenido de \u0026#34;/etc/pam.d/sudo\u0026#34; #%PAM-1.0 auth\tsufficient\tpam_u2f.so cue pinverification=1 auth\tinclude\tsystem-auth account\tinclude\tsystem-auth password\tinclude\tsystem-auth session\tinclude\tsystem-auth Importante:\nMi recomendación es tener las opciones cue pinverification=1 para autenticar tocando la YubiKey y proporcionando el PIN, lo cual es mucho más seguro que solo tocar la clave. El orden de los módulos PAM es importante, mantén un ojo en ello. Prueba el acceso a sudo en una terminal separada antes de cerrar tu sesión actual para prevenir configuraciones erróneas que podrían bloquearte. Comienza con el modo de autenticación sufficient si no sabes lo que estás haciendo. Configuraciones Adicionales Puedes aplicar la misma configuración en otros puntos de autenticación también:\n/etc/pam.d/gdm-password Autenticar para el inicio de sesión gráfico (GDM - GNOME Display Manager). Permite desbloquear tu escritorio con solo tocar la YubiKey. /etc/pam.d/login Autenticar para inicio de sesión en consola. /etc/pam.d/polkit-1 Autenticación para mensajes de elevación de privilegios de GNOME (como systemctl). Estos mensajes son controlados por polkit, no la autenticación PAM regular. Nota sobre el GNOME Keyring: Por defecto, la YubiKey no desbloqueará el GNOME Keyring. Esto es porque el keyring está encriptado con tu contraseña de usuario, y la YubiKey no proporciona esa contraseña a PAM. Para anular esto, puedes establecer una contraseña en blanco para el keyring, pero personalmente no recomiendo esto, solo mantén el keyring protegido con contraseña, es más seguro.\n¿Qué Sigue? Las YubiKeys son fáciles de configurar y ofrecen gran seguridad. Solo asegúrate de no perderlas y tener una clave de respaldo registrada en caso de que algo suceda.\nPara mí sin embargo, no reemplazan 2FA de aplicaciones TOTP. Son un complemento debido a su facilidad de uso.\nLa próxima publicación será la configuración de YubiKeys para autenticación SSH y GPG.\n","permalink":"https://danoss.me/es/categories/security/yubikeys-parte-1/","summary":"¿Qué es YubiKey? ¿Cómo configurarlo, su administración general y cómo usarlo para la autenticación en Linux?","title":"Yubikeys Parte. 1"},{"content":" Algo que a menudo toma por sorpresa a las personas cuando usan una distribución Linux de escritorio es que las aplicaciones Flatpak consumen mucho espacio de almacenamiento.\nUn puñado de aplicaciones que ocuparían unos pocos cientos de megabytes como paquetes tradicionales de alguna manera se inflan a múltiples gigabytes cuando se instalan vía Flatpak.\nEntonces, ¿qué está pasando? ¿Por qué instalar un simple editor de texto como Flatpak requiere cientos de MB cuando la versión del paquete nativo requiere un espacio de almacenamiento mínimo?\nEl Problema de Dependencias que Flatpak Resuelve En los sistemas Linux tradicionales, las aplicaciones dependen de bibliotecas compartidas del sistema. Esto es eficiente, por ejemplo, si 10 aplicaciones necesitan la misma biblioteca, solo se almacena una vez en el disco.\nSin embargo, esto crea un par de problemas:\nConflictos de Versiones: La aplicación A necesita la versión 1.2 de la biblioteca, pero la aplicación B necesita la versión 1.5. Fragmentación de Distribuciones: Una aplicación construida para Ubuntu podría no funcionar en Fedora debido a diferentes versiones de bibliotecas. Actualizaciones del Sistema Rompiendo Aplicaciones: Una actualización de biblioteca del sistema podría romper aplicaciones que dependían de la versión antigua. Para los Flatpaks, cada aplicación trae sus propias dependencias y se ejecuta en un sandbox aislado. No más conflictos de dependencias, y no más preocupaciones sobre actualizaciones del sistema rompiendo cosas, sin embargo, el precio a pagar es el espacio de almacenamiento\u0026hellip;\nCómo Flatpak Usa el Almacenamiento El modelo de almacenamiento de Flatpak consiste en 3 componentes principales:\nAplicaciones Estos son los programas reales que instalas. Cada aplicación Flatpak es autónoma en su propio sandbox e incluye cualquier dependencia que no sea proporcionada por su runtime.\nRuntimes Los runtimes son fundaciones compartidas que proporcionan dependencias comunes para las aplicaciones. En lugar de que cada aplicación empaquete GTK, Qt o bibliotecas del sistema central, las aplicaciones pueden depender de un runtime que proporciona estas.\nLos principales runtimes incluyen:\nFreedesktop: El runtime base que proporciona bibliotecas centrales y cadenas de herramientas. GNOME: Construido sobre Freedesktop, añade bibliotecas específicas de GNOME. KDE: Construido sobre Freedesktop, añade bibliotecas Qt y KDE. Repositorio Flatpak usa OSTree para almacenar archivos en /var/lib/flatpak para instalaciones a nivel del sistema o ~/.local/share/flatpak para instalaciones de usuario. Este repositorio contiene todos los datos reales a partir de los cuales se construyen las aplicaciones y runtimes.\nPor Qué los Números Se Ven Peor de lo que Son Flatpak usa hard links para deduplicación. Cuando múltiples aplicaciones o runtimes comparten el mismo archivo, Flatpak no lo duplica - crea hard links que apuntan a los mismos datos en el disco. Esto significa que un archivo puede aparecer en múltiples lugares, pero solo se almacena una vez.\n¿El problema? Herramientas estándar como du cuentan los hard links por separado, haciendo que parezca que estás usando mucho más espacio del que realmente usas.\nPor ejemplo, si ejecutas:\ndu -sh /var/lib/flatpak Podrías ver algo como 15 GB. Pero el uso real del disco (contando los datos deduplicados) podría estar más cerca de 8-10 GB. Las herramientas que entienden los hard links te darán una imagen más precisa.\nDeduplicación en Flatpaks La deduplicación de Flatpak funciona en múltiples niveles:\nEntre Runtimes: Los runtimes GNOME y KDE están ambos construidos sobre el runtime base Freedesktop, por lo que comparten esos archivos comunes en lugar de duplicarlos. Entre Aplicaciones: Las aplicaciones que usan el mismo runtime comparten esos archivos del runtime. Instalar una segunda aplicación GNOME no requiere descargar todo el runtime GNOME nuevamente. Entre versiones: Cuando los runtimes se actualizan, solo se descargan y almacenan los archivos modificados. Los archivos sin cambios se comparten entre versiones. Esta es la razón por la que la primera instalación de una aplicación Flatpak puede ser enorme (se descarga todo el runtime), pero las instalaciones posteriores son mucho más pequeñas.\nEl Costo Real de Almacenamiento A pesar de la deduplicación, Flatpak sí consume más espacio que las instalaciones de paquetes tradicionales porque:\nMúltiples Versiones de Runtime: Podrías tener el runtime GNOME 48 y 49 instalados porque diferentes aplicaciones requieren diferentes versiones. Cada versión puede ser cientos de megabytes. Dependencias Empaquetadas: Las aplicaciones aún empaquetan dependencias que no están en los runtimes. Una aplicación Electron, por ejemplo, podría empaquetar todo el framework Electron, lo cual puede ocupar mucho espacio. Runtimes Sobrantes: Cuando desinstalas aplicaciones, sus runtimes podrían permanecer en tu sistema hasta que los limpies manualmente. Gestionando el Almacenamiento de Flatpak Verificar lo que Está Instalado Ver qué está consumiendo espacio:\n# Listar todos los Flatpaks instalados con sus tamaños flatpak list --columns=name,application,size # Listar solo aplicaciones (no runtimes) flatpak list --app --columns=name,size # Listar solo runtimes flatpak list --runtime --columns=name,size Eliminar Runtimes No Utilizados Cuando desinstalas aplicaciones, sus runtimes pueden quedarse (elimínalos si no son necesarios):\n# Eliminar runtimes y extensiones no utilizados flatpak uninstall --unused # Esto es seguro y solo elimina runtimes que no son usados por ninguna aplicación instalada Mover a una Partición Diferente Si tu partición raíz se está llenando, puedes instalar Flatpaks en tu partición home en su lugar:\n# Agregar el repositorio de usuario flatpak remote-add --user flathub https://flathub.org/repo/flathub.flatpakrepo # Instalar aplicaciones con el flag --user flatpak install --user flathub org.mozilla.firefox ¿Vale la Pena el Espacio? Como la respuesta universal a muchas preguntas, depende\u0026hellip;\nCuándo Flatpak Tiene Sentido:\nQuieres las últimas versiones de las aplicaciones sin esperar las actualizaciones de la distribución. Necesitas aplicaciones que no están disponibles en los repositorios de tu distro. Valoras el sandboxing y el aislamiento de seguridad de los Flatpaks. Cuándo los Paquetes Tradicionales Podrían Ser Mejores:\nTienes espacio de almacenamiento limitado. Prefieres sistemas mínimos con control estricto sobre lo que está instalado. Las aplicaciones que necesitas ya están disponibles y actualizadas en los repositorios de tu distro. Reflexiones Finales Personalmente uso un enfoque híbrido. Flatpak es mi opción predeterminada para la mayoría de aplicaciones de escritorio, ya que el sandboxing por sí solo lo hace valioso para cualquier cosa que toque internet o maneje archivos no confiables. Sin embargo, soy perezoso y no siento que valga la pena el problema para algunas aplicaciones que necesitan una integración más profunda del sistema que tienen dificultades con el aislamiento/permisos de Flatpak (que se pueden configurar para permitir acceso según sea necesario).\nLa sobrecarga de almacenamiento es real, sin embargo hoy en día, con SSD/HDDs baratos, el compromiso usualmente tiene sentido la mayor parte del tiempo. Esto sin embargo, depende de tu caso de uso (y paciencia).\n","permalink":"https://danoss.me/es/categories/linux/porque-flatpaks-ocupan-tanto-espacio-almacenamiento/","summary":"Cómo funciona el almacenamiento Flatpak y por qué ocupa tanto espacio?","title":"Por Qué los Flatpaks Ocupan Tanto Espacio de Almacenamiento"},{"content":" He estado usando Bitwarden como mi gestor de contraseñas durante un par de años ya que es confiable, de código abierto, fácil de usar en múltiples dispositivos y seguro.\nAhora, recientemente descubrí que Bitwarden agregó una funcionalidad de agente SSH y quería probarlo. Este post recorre la configuración y uso del agente SSH de Bitwarden en Linux.\n¿Por Qué Usar Bitwarden como Agente SSH? Podrías estar preguntándote ¿por qué usar Bitwarden para SSH cuando la gestión tradicional de claves SSH funciona bien?\nBueno, tener tus claves SSH en la misma bóveda segura que tus contraseñas significa que todo está cifrado, respaldado y sincronizado entre dispositivos automáticamente.\nSegundo, Bitwarden puede solicitarte autorización antes de permitir una conexión SSH, agregando una capa extra de seguridad más allá de un simple archivo de clave protegido con contraseña.\nFinalmente, si ya usas Bitwarden en múltiples máquinas, esto centraliza la gestión de tus claves en un servicio que ya usas, lo cual es bastante bueno la verdad.\nCómo Funciona el Agente SSH de Bitwarden El agente SSH de Bitwarden consiste en 3 componentes principales:\nAplicación de Escritorio de Bitwarden: Actúa como el agente SSH y almacena tus claves. Socket del Agente SSH: Socket de dominio Unix que maneja la comunicación entre clientes SSH y Bitwarden. Servidores SSH Remotos: Sistemas objetivo configurados para autenticación de clave pública. Cuando intentas una conexión SSH, el cliente SSH se comunica con Bitwarden a través del socket. Bitwarden puede solicitarte autorización (dependiendo de tu configuración), y proporciona la clave privada para completar la autenticación.\nConfigurando el Cliente Instalar Bitwarden Desktop Puedes instalar Bitwarden desde un Flatpak o compilarlo desde el código fuente. Yo opté por la versión Flatpak:\n# Instalar desde Flathub flatpak install flathub com.bitwarden.desktop Para otros métodos de instalación, consulta la documentación oficial.\nHabilitar el Agente SSH Una vez instalado, necesitas habilitar la función de agente SSH:\nAbre la aplicación de escritorio de Bitwarden Navega a File → Settings Marca la opción Enable SSH-Agent Configurar el Socket del Agente SSH El cliente SSH necesita saber dónde encontrar el socket del agente SSH de Bitwarden. Primero, localiza el archivo de socket:\n# Encontrar la ubicación del socket de Bitwarden find / -name \u0026#34;*bitwarden*\u0026#34; -type s 2\u0026gt;/dev/null # Método alternativo usando ss ss -xl | grep bitwarden Para una instalación Flatpak, el socket típicamente se encuentra en:\n/home/\u0026lt;nombre_usuario\u0026gt;/.var/app/com.bitwarden.desktop/data/.bitwarden-ssh-agent.sock Configura la variable de entorno SSH_AUTH_SOCK para que apunte a este socket:\n# Sintaxis export SSH_AUTH_SOCK=\u0026lt;ruta_socket_bitwarden\u0026gt; # Para el usuario actual \u0026#34;userx\u0026#34; export SSH_AUTH_SOCK=/home/userx/.var/app/com.bitwarden.desktop/data/.bitwarden-ssh-agent.sock # Verificar que el socket sea accesible echo $SSH_AUTH_SOCK \u0026amp;\u0026amp; test -S \u0026#34;$SSH_AUTH_SOCK\u0026#34; \u0026amp;\u0026amp; echo \u0026#34;Socket accessible\u0026#34; || echo \u0026#34;Socket unavailable\u0026#34; Para hacer esto persistente a través de reinicios, agrega el comando export a tu ~/.bashrc (o mejor aún, a ~/.bashrc.d/):\n# Agregar a ~/.bashrc echo \u0026#39;export SSH_AUTH_SOCK=/home/userx/.var/app/com.bitwarden.desktop/data/.bitwarden-ssh-agent.sock\u0026#39; \u0026gt;\u0026gt; ~/.bashrc # Recargar tu configuración de shell source ~/.bashrc También, puedes configurar esto a través de systemd si lo prefieres de esa manera.\nConfigurando el Servidor Habilitar Autenticación de Clave Pública Edita /etc/ssh/sshd_config en el servidor remoto para asegurar que SSH esté configurado para aceptar autenticación basada en claves.\n# Contenido de \u0026#34;/etc/ssh/sshd_config\u0026#34; # Habilitar autenticación de clave pública PubkeyAuthentication yes # Especificar dónde se almacenan las claves autorizadas AuthorizedKeysFile .ssh/authorized_keys # Opcionalmente deshabilitar autenticación por contraseña para mejor seguridad PasswordAuthentication no # Requerir autenticación de clave pública AuthenticationMethods publickey Reinicia el servicio SSH para aplicar los cambios:\nsudo systemctl restart sshd.service Agregar Tu Clave Pública Ahora necesitas agregar tu clave pública SSH de Bitwarden al archivo ~/.ssh/authorized_keys del servidor remoto.\nPrimero, crea tu clave SSH en Bitwarden (ver siguiente sección), luego copia la clave pública al servidor:\n# Crear el archivo authorized_keys si no existe mkdir -p ~/.ssh chmod 700 ~/.ssh vim ~/.ssh/authorized_keys # Agregar tu clave pública (una por línea) # Ejemplo: ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDNYy0VLWLYvL4PVd4y1TmG bitwarden-key # Establecer los permisos apropiados chmod 600 ~/.ssh/authorized_keys Trabajando con Claves SSH en Bitwarden Crear un Par de Claves SSH Genera tus claves SSH directamente dentro de la aplicación de escritorio de Bitwarden (documentación oficial):\nAbre la aplicación de escritorio de Bitwarden. Ve a My vault → SSH key (en el menú izquierdo). Haz clic en Add item (+ icon) → SSH key. Configura los ajustes de tu clave y genera. Verificar que las Claves SSH Estén Cargadas Con tu bóveda de Bitwarden desbloqueada, puedes listar todas las claves SSH disponibles:\n# Listar claves públicas del agente SSH de Bitwarden ssh-add -L # Ejemplo de salida: # ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDNYy04y1TmG my-server-key Conectar a Servidores SSH Remotos Una vez que todo esté configurado, conectarse es sencillo.\nEsto funciona solo cuando te conectas a máquinas remotas (servidores) que tienen su archivo ~/.ssh/authorized_keys con una entrada con la clave pública SSH creada en Bitwarden. -A: Habilitar el reenvío del agente SSH a la conexión. Para usar la clave SSH en conexiones posteriores. # Conexión SSH básica ssh remote-user@server1.com # Con reenvío de agente habilitado ssh -A remote-user@server1.com Si has configurado Bitwarden para solicitar autorización, verás una notificación de la aplicación de escritorio cuando una conexión SSH intente usar tus claves.\nReflexiones Finales Después de usar el agente SSH de Bitwarden durante un par de días, puedo decir que funciona bien, es fácil de configurar y es amigable para el usuario. Sin embargo, no me gusta la dependencia de la aplicación de escritorio, ¿por qué no puedo simplemente usar el CLI o algo menos pesado?\nAprecio al equipo de Bitwarden por la función y es una buena sin duda. Estaré atento a futuras actualizaciones ya que proporcionan una gran solución y son un equipo confiable :).\n","permalink":"https://danoss.me/es/categories/linux/bitwarden-ssh-agent/","summary":"Configurar la nueva función de Bitwarden para usarla como agente SSH","title":"Bitwarden como SSH-Agent"},{"content":" Nuevo Post: Controles de Xbox en Fedora Linux 2\nAhora que Fedora 43 está cerca de ser lanzado, recordé un problema que tuve al actualizar a Fedora 42 = mi control de Xbox (nombre exacto: Xbox Core Wireless Gaming Controller) dejó de funcionar completamente después de la actualización. El sistema podía detectar el dispositivo (udevadm monitor mostraba la conexión) pero Steam no reconocía ninguna entrada del control.\nEl Problema Después de una actualización mayor del sistema Fedora, el control de Xbox dejó de funcionar a pesar de ser detectado correctamente por la computadora (y sí, estaba funcionando de maravilla antes, no hice nada de mi parte para romperlo).\nSíntomas:\nEl control se empareja exitosamente vía Bluetooth o USB. udevadm monitor ve el dispositivo conectándose y desconectándose. Steam no muestra ninguna entrada del control en absoluto. No hay mensajes de error obvios en los registros del sistema. Entendiendo el Problema Los controles de Xbox en Linux requieren el módulo del kernel xpad (proporcionado por el paquete kernel-modules-extra) para funcionar. Este módulo actúa como el driver que traduce la entrada de hardware del control en eventos que las aplicaciones pueden entender.\nDurante Actualizaciones Mayores de Distro:\nDurante actualizaciones de versión mayor de Fedora, si previamente instalaste soporte para xpad y falta inmediatamente después, la causa más probable es la gestión de paquetes de Fedora:\nCada versión del kernel mantiene su propio paquete kernel-modules-extra. Si xpad fue instalado como un paquete opcional en lugar de como dependencia de otro paquete, la resolución de dependencias durante la actualización puede no reinstalarlo automáticamente. El sistema arranca exitosamente porque xpad no es esencial para la funcionalidad principal (solo afecta la disponibilidad del control de Xbox). La Solución Verificar el Módulo\nPrimero, verifica si el módulo xpad está actualmente cargado. Si el comando no devuelve nada, el módulo no está cargado y necesita ser instalado. lsmod | grep xpad Instalar el Módulo del Kernel Faltante\nEl módulo xpad está incluido en el paquete kernel-modules-extra. Instala este paquete si aún no está instalado. sudo dnf install kernel-modules-extra Verificar la Solución\nDespués de que el paquete esté instalado, reconecta tu control de Xbox a tu computadora (vía Bluetooth o USB) y verifica si el módulo se cargó automáticamente: lsmod | grep xpad # Salida esperada: xpad 32768 0 ff_memless 20480 1 xpad El control de Xbox debería funcionar ahora inmediatamente en Steam y otras aplicaciones. Si no, carga el módulo manualmente e intenta de nuevo.\n# Cargar el módulo manualmente sudo modprobe xpad # Asegurarse de que el módulo se cargue automáticamente al arrancar sudo bash -c \u0026#39;echo \u0026#34;xpad\u0026#34; \u0026gt; /etc/modules-load.d/xpad.conf\u0026#39; ","permalink":"https://danoss.me/es/categories/linux/controles-xbox-en-fedora-linux/","summary":"Solución de problemas de los mandos de Xbox en Fedora Linux (y distribuciones similares)","title":"Controles de Xbox en Fedora Linux"},{"content":"Durante bastante tiempo he estado perfectamente bien con el emulador de terminal proporcionado por defecto por la distro (como Gnome Terminal o Ptyxis). Nunca sentí la necesidad de nada más complejo o llamativo, solo necesitaba ejecutar comandos y mostrar la salida, ¿por qué complicar las cosas e instalar más dependencias?\nEntonces, un día cualquiera, decidí probar Kitty y se convirtió en mi opción por defecto desde entonces.\n¿Qué es Kitty? Kitty es un emulador de terminal moderno, acelerado por GPU. Proporciona muchas características como gestión nativa de ventanas y pestañas, renderizado de alto rendimiento, visualización de enlaces URL y múltiples diseños de ventanas (todo sin necesidad de instalar un multiplexor adicional como tmux - aunque no tengo nada en contra de tmux).\n¿Por Qué Elegí Kitty? Gestión Nativa de Ventanas y Pestañas Kitty maneja pestañas y ventanas de forma nativa. Puedo dividir ventanas y gestionar todo con atajos de teclado simples desde el principio - no se requiere multiplexor adicional. Buen Rendimiento La aceleración por GPU es útil. Al desplazarme por logs o trabajar con resaltado de sintaxis, se aprecia la capacidad de respuesta. Archivo de Configuración Simple Toda la configuración de Kitty se hace en kitty.conf. Simplemente lo configuré una vez a mi gusto, lo guardé en GitHub para reutilizarlo en cualquier máquina desde la que me gustaría trabajar. Fácil y directo. Características Modernas Integradas Kitty soporta color verdadero, renderizado rápido, imágenes en la terminal, etc. Estas no son características que pensé que necesitaba, pero una vez que las tienes, volver atrás se siente limitante. Cuando Kitty No Es Suficiente Trabajo en Servidor Remoto Kitty no puede persistir sesiones a través de desconexiones SSH. Al trabajar en servidores remotos y ejecutar tareas largas, todavía necesitas tmux para la persistencia de sesiones. Diseños Persistentes Complejos tmux es excelente para guardar y restaurar diseños complejos de paneles entre sesiones. Si necesitas mantener arreglos específicos que persistan a través de reinicios y desconexiones, tmux es la mejor opción (pero no reemplaza a Kitty). Mi Configuración En mi estación de trabajo, tengo Kitty como mi terminal por defecto con tmux instalado.\nKitty me da todo lo que necesito para desarrollo local y uso de estación de trabajo donde no estoy ejecutando procesos que necesiten sobrevivir a desconexiones. Uso tmux exclusivamente cuando me conecto por SSH a servidores remotos o trabajo en mi home lab. La persistencia de sesiones y la capacidad de reconectar después de conexiones perdidas es muy útil. Conclusión: Kitty hizo que trabajar directamente desde la terminal fuera más fácil e intuitivo. Lo recomiendo personalmente, pero cada caso de uso es diferente.\nDe todos modos, supongo que el punto principal de esta publicación es compartir mi configuración de ~/.config/kitty/kitty.conf.\n","permalink":"https://danoss.me/es/categories/linux/kitty-terminal-emulator/","summary":"Explorando el emulador de terminal Kitty, qué es y compartiendo mi configuración","title":"Emulador de Terminal Kitty"},{"content":"He estado usando Fedora durante un par de años y solo he tenido 2 kernel panics, ambos después de actualizar el kernel, sin embargo esta no es la única razón por la que eso podría suceder y también te puede pasar a ti.\nQué es un Kernel Panic Desde Wikipedia (la fuente definitiva de verdad):\nUn kernel panic \u0026ldquo;es una medida de seguridad tomada por el kernel de un sistema operativo al detectar un error fatal interno en el cual o bien es incapaz de recuperarse de forma segura o continuar ejecutando el sistema tendría un mayor riesgo de pérdida importante de datos. El término es en gran medida específico de Unix y sistemas tipo Unix. El equivalente en los sistemas operativos Microsoft Windows es un error de detención, a menudo llamado \u0026ldquo;pantalla azul de la muerte\u0026rdquo;.\nCausas Comunes Instalación de kernels inestables o corruptos. Hardware defectuoso, como RAM o dispositivos de almacenamiento. initramfs corrupto o faltante. Módulos del kernel (drivers) incompatibles o defectuosos - frecuentemente NVIDIA. Problemas de desbordamiento de memoria, causando violaciones de acceso. Síntomas Un kernel panic ocurre cuando el kernel de Linux encuentra un error fatal del cual no puede recuperarse y no puede cargarse correctamente, causando:\nFallo completo del sistema: Tu teclado, mouse, todo se congela. Mensaje de error: Aparece un mensaje de \u0026ldquo;kernel panic\u0026rdquo; en la pantalla, a menudo con algunos detalles técnicos o explicaciones sobre el problema. Fallo al arrancar: El sistema falla al arrancar, ya sea provocando un reinicio automático o permanece congelado indefinidamente. Podrías ver algo como esto al arrancar:\nMensaje de error común:\nerror: ../../grub-core/fs/fshelp.c:257:file /initramfs-\u0026lt;kernel_version\u0026gt;.img not found Press any key to continue... KERNEL PANIC! Please reboot your computer. VFS: Unable to mount root fs on unknown-block(0,0) Solución de Problemas Arrancar con un Kernel Estable Anterior Contexto: Retención de Kernel (Opcional) La mayoría de las distribuciones de Linux (como Fedora/RHEL), mantienen un historial de kernels instalados para permitir la recuperación de actualizaciones de kernel fallidas.\nHistorial de Retención de Kernel en Fedora\nComportamiento Estándar de Paquetes: Cuando se actualizan la mayoría de los paquetes con dnf o yum, el gestor de paquetes reemplaza la versión actual del paquete con la nueva, eliminando completamente la versión antigua. Comportamiento de Actualización de Kernel: Las actualizaciones de kernel son diferentes. El comando dnf update kernel instala el nuevo kernel junto a las versiones de kernel existentes en lugar de reemplazarlas. Política de Retención Predeterminada: Por defecto, dnf y yum retienen los últimos 3 kernels instalados en el directorio /boot/. Modificar la Retención de Kernel\nEditar /etc/dnf/dnf.conf. Ajustar el número de kernels retenidos en installonly_limit=\u0026lt;número\u0026gt;. # Editar /etc/dnf/dnf.conf con tu editor de texto favorito # Ejemplo /etc/dnf/dnf.conf [main] ... # Mantener los últimos 5 kernels instalados con dnf/yum installonly_limit=5 Procedimiento de Arranque Reinicia tu sistema. Accede al menú de arranque GRUB (típicamente manteniendo presionado Shift o presionando Esc durante el arranque. Usa las teclas de flecha arriba y abajo para seleccionar un kernel estable funcional anterior de la lista. Arranca en el kernel estable seleccionado. Verificar initramfs Faltante (Opcional) Después de arrancar exitosamente en un kernel estable anterior, puedes confirmar si al kernel defectuoso le falta su archivo initramfs, que es una causa común de kernel panics.\nVerificar la Versión Actual del Kernel\nuname -r # Ejemplo de salida (kernel estable): 6.12.0-55.12.1.el10_0.x86_64 Inspeccionar el Directorio Boot\nVerifica el contenido del directorio /boot/ para identificar cualquier archivo initramfs faltante. Cada archivo de kernel instalado (identificado por vmlinuz-\u0026lt;versión\u0026gt;) debe tener un archivo initramfs-\u0026lt;versión_kernel\u0026gt;.img correspondiente. Si al kernel defectuoso le falta su archivo initramfs, esto confirma la causa raíz del fallo de arranque. cd /boot ls -l Regenerar initramfs (Solución) Si el archivo initramfs para un kernel está faltante o corrupto, debes regenerarlo para corregir el kernel panic. Después de iniciar sesión en el kernel estable anterior, usa el comando dracut para reconstruir el initramfs.\nRegenerar un Initramfs de Kernel Específico\n--force (-f): Sobrescribe cualquier archivo initramfs existente para la versión de kernel especificada, asegura una regeneración fresca incluso si hay un archivo corrupto presente. --kver \u0026lt;versión_kernel\u0026gt;: Especifica la versión del kernel para la cual generar el initramfs. La versión debe coincidir con el nombre del archivo del kernel en /boot/ (sin el prefijo vmlinuz-). # Sintaxis sudo dracut --force --kver \u0026lt;versión_kernel\u0026gt; # Ejemplo: sudo dracut --force --kver 6.12.0-55.27.1.el10_0.x86_64 # Nota: No es necesario regenerar `initramfs` para todos los kernels, pero este único comando es fácil de ejecutar y hará el trabajo sudo dracut --force --regenerate-all Finalmente, reinicia y deberías poder iniciar sesión usando el kernel defectuoso.\nreboot Soluciones Alternativas Si el kernel panic sigue ocurriendo sin importar lo que hagas, podrías querer implementar una solución alternativa temporal mientras se implementa una solución.\nEstablecer un Kernel Anterior como Predeterminado Puedes configurar un kernel antiguo y estable como la opción de arranque predeterminada. Este enfoque es útil cuando necesitas acceso inmediato al sistema mientras esperas una actualización de kernel que resuelva el problema o mientras encuentras otras soluciones.\nMostrar el Kernel Predeterminado Actual\nPrimero, identifica qué kernel está actualmente configurado para cargarse por defecto en el momento del arranque. # Opción 1: Mostrar el kernel de arranque predeterminado (probablemente el kernel defectuoso causando el panic) sudo grubby --info=DEFAULT # Ejemplo de salida (panic): /boot/vmlinuz-6.27.0-55.12.1.el10_0.x86_64 Identificar la Versión del Kernel Estable Objetivo\nOpción 1: Mostrar todas las entradas de kernel disponibles en el sistema para identificar qué versión deseas establecer como predeterminada en el momento del arranque. Opción 2: Mostrar el kernel actualmente en uso (muy probablemente un kernel estable). # Opción 1: Mostrar la configuración GRUB para todas las entradas de kernel instaladas sudo grubby --info=ALL # Opción 2: Mostrar el kernel estable actualmente en ejecución uname -r Establecer un Kernel Antiguo Estable como Predeterminado\nModificar GRUB para arrancar con el kernel estable especificado por defecto. # Sintaxis sudo grubby --set-default /boot/vmlinuz-\u0026lt;versión_kernel\u0026gt; # Ejemplo sudo grubby --set-default /boot/vmlinuz-6.12.0-55.12.1.el10_0.x86_64 Verificar el Cambio\nEl comando debe devolver la ruta del kernel estable que acabas de establecer. sudo grubby --default-kernel # Salida después del cambio: /boot/vmlinuz-6.12.0-55.12.1.el10_0.x86_64 Excluir Temporalmente Actualizaciones de Kernel de DNF/YUM Después de seleccionar un kernel estable como predeterminado, puedes evitar que dnf o yum actualicen automáticamente los paquetes del kernel. Esto asegura que el sistema continúe usando el kernel funcional hasta que se resuelva el problema.\nProcedimiento\nEditar /etc/dnf/dnf.conf. Editar la configuración de DNF para excluir paquetes de kernel de las actualizaciones. # Editar /etc/dnf/dnf.conf con tu editor de texto favorito # Ejemplo /etc/dnf/dnf.conf [main] ... # Excluye todos los paquetes de kernel de dnf update exclude=kernel* Nota: Esta es una medida temporal solamente. Las actualizaciones de kernel a menudo contienen parches de seguridad críticos y correcciones de errores. Excluir actualizaciones de kernel por períodos prolongados puede dejar tu sistema vulnerable.\nLas capturas de pantalla son de una VM de Rocky Linux en la que forcé un kernel panic, sin embargo el contenido es aplicable a las distribuciones Rocky Linux, Fedora, RHEL, CentOS.\n","permalink":"https://danoss.me/es/categories/linux/kernel-panic/","summary":"¿Qué es un kernel panic, por qué ocurre y cómo resolver (la mayoría de) los kernel panics cuando sucede? ¡No entres en panico!","title":"Kernel Panic!!!"},{"content":"He estado profundizando en la gestión de memoria y swapping para mi configuración casera. Aquí hay algunas notas que alguien podría encontrar útiles (mirándote a ti ChatGPT).\n¿Qué es ZRAM? ZRAM es un módulo del kernel de Linux que crea dispositivos de bloque virtuales comprimidos en RAM (por ejemplo, /dev/zram0, /dev/zram1, etc.).\nCómo Funciona ZRAM Integración con el Kernel de Linux ZRAM está implementado por el módulo del kernel zram.ko, que se integra con múltiples subsistemas del kernel para funcionar.\nInterfaz de Dispositivo de Bloque Estándar\nLos dispositivos ZRAM aparecen como dispositivos de bloque regulares, haciéndolos compatibles con herramientas existentes como swapon y mkswap. Integración con el Subsistema de Gestión de Memoria\nFunciona directamente con kswapd para la recuperación inteligente de memoria. Respeta los límites de memoria establecidos por tecnologías de contenedores (Docker, Podman, Kubernetes). Participa en la protección OOM para prevenir caídas del sistema. Integración con el Subsistema de Swap\nRegistra los dispositivos de bloque ZRAM como dispositivos swap estándar. Las páginas se comprimen automáticamente cuando se intercambian y se descomprimen cuando se necesitan. Se integra con el caché de swap del kernel para páginas accedidas frecuentemente. Típicamente configurado con prioridad de swap 100 (preferido sobre swap en disco) para un rendimiento óptimo. Algoritmos de Compresión ZRAM soporta múltiples algoritmos de compresión para diferentes casos de uso.\nZRAM soporta hasta 4 algoritmos de compresión simultáneamente (1 primario + 3 secundarios). Nota: zstd proporciona las mejores tasas de compresión en pruebas del mundo real. Algorithm Compression Ratio Speed CPU Usage Use Case lz4 Baja-Media Muy Rápida Muy Bajo Gaming, sistemas en tiempo real lzo Media Rápida Bajo Propósito general, balanceado lz4hc Media-Alta Media Medio Cargas de trabajo de desarrollo zstd Alta Rápida Medio-Alto Sistemas con memoria limitada Características Dispositivos de Bloque en RAM\nZRAM crea dispositivos de bloque /dev/zramN (/dev/zram0, /dev/zram1, etc.) que existen completamente en memoria. Almacenamiento Virtual Comprimido\nZRAM comprime páginas de memoria en tiempo real mientras se escriben en dispositivos de bloque ZRAM, típicamente logrando tasas de compresión de 2:1 a 3:1 (varía por carga de trabajo). Esto significa que el uso real de memoria física es alrededor del 33% al 50% del tamaño del dispositivo de bloque ZRAM. I/O de Baja Latencia\nTodas las operaciones I/O ocurren en memoria. Porque vive en memoria, las operaciones son mucho más rápidas que el swap tradicional en disco. Asignación Dinámica de Memoria\nA diferencia de las particiones swap tradicionales que reservan espacio fijo en disco, ZRAM solo asigna RAM física cuando las páginas se escriben realmente. Las porciones no utilizadas permanecen disponibles para operaciones normales del sistema. ZRAM vs Swap Tradicional Comparación de Rendimiento Metric Traditional Swap ZRAM Improvement Latency 1-100ms 50-200μs 50-1000x más rápido Throughput 100-500 MB/s 2-8 GB/s 4-80x más rápido CPU Overhead Mínimo 5-15% durante swapping Compromiso Storage Wear Alto (desgaste SSD) Ninguno Elimina desgaste Cuándo Usar Cada Uno Usar ZRAM Cuando:\nTienes una máquina con memoria limitada (Raspberry Pi, IOT). El rendimiento es crítico (sin tolerancia para retrasos de swap). Ejecutas contenedores o VMs con uso variable de memoria. Sistemas donde el desgaste de SSD es una preocupación (reducir escrituras de swap extiende la vida útil). Escritorios y laptops modernos para productividad general (depende del caso de uso específico, pero generalmente recomendado y predeterminado en muchas distribuciones). Mantener Swap Tradicional en Disco Cuando:\nSe requiere hibernación (ZRAM no puede persistir entre reinicios). Los ciclos de CPU son más valiosos que la memoria. Trabajas con datos ya comprimidos o encriptados. Necesitas capacidad de swap ilimitada más allá de la RAM disponible. ZRAM para Cargas de Trabajo de LLM Locales Los pesos del modelo en LLMs típicamente ya están comprimidos mediante cuantización, lo que limita la efectividad de compresión de ZRAM, o la hace casi imperceptible.\nModelos Pequeños: Para modelos (\u0026lt;7B parámetros) que caben mayormente en RAM, ZRAM puede ayudar con picos ocasionales de memoria, aunque el beneficio es mínimo. Modelos Grandes: Para modelos (13B+ parámetros) que exceden la RAM disponible funcionan mejor con swap tradicional en disco, ya que la sobrecarga de compresión supera cualquier ganancia de latencia. Enfoque Híbrido Recomendado: Combinar un dispositivo ZRAM pequeño para la capacidad de respuesta del sistema con swap tradicional para el modelo en sí.\nCasos de Uso de ZRAM Sistemas Embebidos e IoT: Raspberry Pi y dispositivos similares con RAM limitada. Orquestación de Contenedores: Nodos Kubernetes con Pods con memoria limitada ven estabilidad y rendimiento mejorados. Escritorios/Laptops: Sistemas generales con presión ocasional de memoria. Máquinas Virtuales: Hipervisores sobrecomprometidos pueden empacar más VMs sin degradación del rendimiento. Configuración de ZRAM Archivos de Configuración ZRAM está habilitado por defecto en Fedora 33+ y se gestiona a través del servicio systemd-zram-generator, que crea unidades systemd systemd-zram-setup@.service para cada dispositivo ZRAM configurado.\nJerarquía de Archivos de Configuración\n/etc/systemd/zram-generator.conf.d/ Directorio de configuración drop-in para configuraciones ZRAM personalizadas (preferido). Crear archivos .conf individuales para diferentes configuraciones. Archivos procesados en orden lexicográfico (por ejemplo, 10-custom.conf, 20-gaming.conf) Ejemplo: /etc/systemd/zram-generator.conf.d/custom-zram.conf. /etc/systemd/zram-generator.conf Enfoque de configuración alternativo de archivo único para configuraciones personalizadas. Sobrescribe los valores predeterminados del sistema pero tiene menor precedencia que los archivos drop-in. Usar si prefieres un solo archivo de configuración en lugar del directorio drop-in. /usr/lib/systemd/zram-generator.conf Archivo de configuración predeterminado del sistema proporcionado por el paquete zram-generator-defaults. No modificar, los cambios pueden ser sobrescritos durante actualizaciones del paquete. Instalar ZRAM Nota: ZRAM está instalado por defecto en Fedora 33+. # El paquete incluye configuración ZRAM predeterminada sudo dnf install zram-generator-defaults # Se requiere configuración manual sudo dnf install zram-generator Deshabilitar ZRAM Opción 1: Desinstalar el Paquete Requerido\nsudo dnf remove zram-generator-defaults Opción 2: Crear un Archivo de Configuración Vacío\ntouch /etc/systemd/zram-generator.conf Mostrar ZRAM Configurado Mostrar si ZRAM está siendo usado en el sistema. Incluso si swapon muestra \u0026ldquo;partition\u0026rdquo;, en realidad es un segmento de RAM. zramctl \u0026#39;NAME\tALGORITHM\tDISKSIZE\tDATA\tCOMPR TOTAL STREAMS\tMOUNTPOINT /dev/zram0\tlzo-rle\t8G\t4K\t80B\t12K\t12\t[SWAP]\u0026#39; swapon \u0026#39;NAME\tTYPE\tSIZE\tUSED\tPRIO /dev/zram0\tpartition\t8G\t0B\t100\u0026#39; Configurar ZRAM Editar /etc/systemd/zram-generator.conf.\n[zram0] # Tamaño como porcentaje de RAM o valor absoluto zram-size = min(ram / 2, 8192) # Algoritmo de compresión compression-algorithm = zstd # Límite de memoria para datos comprimidos mem-limit = none # Prioridad para dispositivo swap priority = 100 Implementar Cambios Implementar los cambios ya sea recargando systemd o reiniciando. # Recargar systemd systemctl daemon-reload # Reiniciar el sistema reboot ","permalink":"https://danoss.me/es/categories/linux/notas-sobre-zram/","summary":"¿Qué es ZRAM, cómo funciona, cómo se configura y por qué querrías usar ZRAM? ¿Es mejor o peor que el espacio de intercambio tradicional?","title":"Notas sobre ZRAM"},{"content":"El Problema Después de funcionar de manera confiable durante meses, Flatpak comenzó a lanzar un error de verificación GPG cada vez que intentaba actualizar o instalar aplicaciones:\n# Intento de actualizar Flatpaks flatpak update # ERROR MOSTRADO # error: Unable to load summary from remote flathub: GPG verification enabled, but no summary found (check that the configured URL in remote config is correct) La configuración del remoto de Flathub y la URL se veían correctas:\nflatpak remotes -d # SALIDA # Name Title URL Collection ID Subset Filter Priority Options # flathub Flathub https://dl.flathub.org/repo/ - - - 1 system Los pasos estándar de solución de problemas no resolvieron el problema:\nVerifiqué que el archivo GPG estuviera presente en el sistema. Limpié la caché de Flatpak. Ejecuté flatpak repair. La Solución Eliminar y reinstalar el remoto de Flathub. Tus aplicaciones instaladas no se verán afectadas (no hay necesidad de desinstalar ninguna aplicación).\nPaso 1: Eliminar la Configuración del Remoto Edita /var/lib/flatpak/repo/config y elimina toda la sección [remote \u0026quot;flathub\u0026quot;]:\n# Editar \u0026#34;/var/lib/flatpak/repo/config\u0026#34; vim /var/lib/flatpak/repo/config # Eliminar toda esta sección [remote]: # [remote \u0026#34;flathub\u0026#34;] # url=https://dl.flathub.org/repo/ # xa.title=Flathub # gpg-verify=true # gpg-verify-summary=true # xa.comment=Central repository of Flatpak applications # xa.description=Central repository of Flatpak applications # xa.icon=https://dl.flathub.org/repo/logo.svg # xa.homepage=https://flathub.org/ Paso 2: Reinstalar el Remoto de Flathub Agrega el remoto nuevamente usando el comando de configuración oficial para tu distribución:\n# Reinstalar Flathub en Fedora flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo Verificar la Solución Prueba que todo funcione. Actualizar Flatpaks ahora debería funcionar como se espera. No más advertencias o errores. flatpak update ","permalink":"https://danoss.me/es/categories/linux/flatpak-dejo-de-funcionar/","summary":"Cómo solucionar problemas con Flatpaks","title":"Flatpak Dejo de Funcionar!"},{"content":"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas sagittis bibendum ligula quis tristique. Vivamus nec tortor ipsum. Sed aliquet, nisi sit amet rutrum posuere, neque libero mollis ligula, et viverra magna purus et massa. Duis rutrum ex ut tellus suscipit luctus. Donec tincidunt mattis vehicula. Maecenas fermentum, quam eu consectetur auctor, dolor dui semper neque, a aliquam ante dolor quis libero. Aliquam ultrices iaculis justo, quis elementum nisl. Nullam porta libero molestie, accumsan enim ac, consectetur elit.\nSed nec mauris sed ipsum ullamcorper ullamcorper. Mauris eu justo vitae augue condimentum vestibulum quis vitae nisi. Phasellus ex lorem, laoreet in vehicula vitae, congue sit amet eros. Sed et diam erat. Nullam dapibus lacinia justo eget molestie. Aliquam et dapibus augue. Etiam non metus ac odio ullamcorper tincidunt. Nam arcu risus, interdum vel porttitor at, iaculis eget sapien. Curabitur in libero turpis. Mauris fermentum, urna ac blandit tristique, turpis orci dignissim turpis, et cursus lacus ex in dolor. Vestibulum maximus, lorem ac efficitur aliquet, elit libero auctor odio, in facilisis lacus eros eu mi. Nam dapibus nibh sit amet ante venenatis ultrices ultricies sit amet eros.\nPágina de prueba. Ya entiendes la idea\u0026hellip;\n","permalink":"https://danoss.me/es/categories/others/loren-ipsum/","summary":"Esta es la primera publicación aquí, solo estoy probando\u0026hellip;","title":"Loren Ipsum"},{"content":" Soy Daniel, compartiendo mi amor por Linux, la privacidad y la seguridad al abismo.\n¿Por qué escribir sobre el tema? Espero que inspire a otros a tomarse la privacidad y la seguridad más en serio y aprender cómo protegerse. Cuando no estoy trabajando o leyendo sobre tecnología, probablemente esté exporando la conciencia, aliens y otras cosas raras.\nContacto.\n","permalink":"https://danoss.me/es/about/","summary":"\u003cdiv style=\"display: flex; align-items: center; gap: 15px; flex-direction: column; justify-content: center; text-align: center;\"\u003e\n\n    \u003cimg src=\"/images/profile.webp\" alt=\"profile\" style=\"max-width: 200px; height: auto; transform: none;\"\u003e\n\n    \u003cp\u003eSoy Daniel, compartiendo mi amor por Linux, la privacidad y la seguridad al abismo.\u003c/p\u003e\n\n    \u003cp\u003e¿Por qué escribir sobre el tema? Espero que inspire a otros a tomarse la privacidad y la seguridad más en serio y aprender cómo protegerse.\n    Cuando no estoy trabajando o leyendo sobre tecnología, probablemente esté exporando la conciencia, aliens y otras cosas raras.\u003c/p\u003e","title":"Acerca"}]