{"id":3391,"date":"2026-02-09T01:15:28","date_gmt":"2026-02-08T23:15:28","guid":{"rendered":"https:\/\/www.sinetiqueta.com\/?p=3391"},"modified":"2026-02-09T01:34:03","modified_gmt":"2026-02-08T23:34:03","slug":"blindaje-de-infraestructura-en-raspberry-pi-3b-raspberry-os-lite","status":"publish","type":"post","link":"https:\/\/www.sinetiqueta.com\/?p=3391","title":{"rendered":"&#x1f914; Blindaje de Infraestructura en Raspberry Pi 3B (Raspberry OS Lite)"},"content":{"rendered":"\n<p>La Raspberry Pi 3B es una m\u00e1quina incre\u00edblemente vers\u00e1til, pero con sus <strong>1GB de RAM<\/strong>, la estabilidad es nuestra prioridad n\u00famero uno. En entornos de servidor (LAMP), una actualizaci\u00f3n imprevista de paquetes core como PHP 8.4 puede disparar el consumo de recursos o causar incompatibilidades que dejen tu servicio offline.<\/p>\n\n\n\n<p>En este art\u00edculo, aprender\u00e1s a construir un <strong>Panel de Control de Inmutabilidad<\/strong> para \u00abcongelar\u00bb tu software y asegurar que tu Pi funcione exactamente como el d\u00eda que la configuraste.<\/p>\n\n\n\n<p>La idea es EVITAR actualizaciones que nos tiren el Servidor, concretamente un viernes  a las 14.59, lo que es lo mismo&#8230; que no tengamos cambios entre el d\u00eda que lo \u00ablanzaste\u00bb (Base) y el d\u00eda de hoy (Live).<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"498\" height=\"209\" src=\"https:\/\/www.sinetiqueta.com\/wp-content\/uploads\/2026\/02\/image-7.png\" alt=\"\" class=\"wp-image-3399\" srcset=\"https:\/\/www.sinetiqueta.com\/wp-content\/uploads\/2026\/02\/image-7.png 498w, https:\/\/www.sinetiqueta.com\/wp-content\/uploads\/2026\/02\/image-7-300x126.png 300w\" sizes=\"auto, (max-width: 498px) 100vw, 498px\" \/><\/figure>\n<\/div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading has-medium-font-size\">1. El Concepto: Inmutabilidad de Paquetes<\/h2>\n\n\n\n<p>En sistemas basados en Debian (como Raspberry OS), el comando <code>apt upgrade<\/code> busca la versi\u00f3n m\u00e1s reciente de cada programa. El <strong>Blindaje (Apt-Pinning)<\/strong> marca los paquetes como \u00abretenidos\u00bb (on hold). El sistema los ignorar\u00e1 por completo hasta que t\u00fa decidas liberar el candado.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-medium-font-size\">\u00bfPor qu\u00e9 en la 3B?<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Recursos Cr\u00edticos:<\/strong> Evitas que servicios nuevos m\u00e1s pesados saturen la RAM.<\/li>\n\n\n\n<li><strong>SD Card Health:<\/strong> Menos escrituras accidentales por actualizaciones masivas prolongan la vida de tu tarjeta microSD.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading has-medium-font-size\">2. Preparaci\u00f3n de la \u00abZona de Administraci\u00f3n\u00bb<\/h2>\n\n\n\n<p>Para mantener el orden y la seguridad, crearemos una carpeta dedicada a scripts de sistema que el servidor web pueda invocar de forma controlada.<\/p>\n\n\n\n<p>Bash<\/p>\n\n\n\n<div class=\"wp-block-group has-small-font-size\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<pre class=\"wp-block-preformatted has-small-font-size\"># Creamos la ruta de aplicaciones\nsudo mkdir -p \/var\/www\/apps\/admin-scripts\n\n# Ajustamos el propietario al usuario del servidor web\nsudo chown -R www-data:www-data \/var\/www\/apps\/\n<\/pre>\n<\/div><\/div>\n<\/div><\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading has-medium-font-size\">3. El Script de Control: <code>apt_lock.sh<\/code><\/h2>\n\n\n\n<p>Este script act\u00faa como el brazo ejecutor. Es fundamental crearlo directamente en la Pi para evitar conflictos de formato entre Windows y Linux.<\/p>\n\n\n\n<p>Ejecuta este comando para generar el archivo:<\/p>\n\n\n\n<p>Bash<\/p>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<pre class=\"wp-block-preformatted has-small-font-size\">sudo tee \/var\/www\/apps\/admin-scripts\/apt_lock.sh &lt;&lt; 'EOF'<br>#!\/bin\/bash<br># Script de Blindaje APT - Versi\u00f3n Purificada<br>PAQUETES=\"php8.4* apache2* mariadb-server* mariadb-client*\"<br><br>case \"$1\" in<br>    lock)<br>        apt-mark hold $PAQUETES > \/dev\/null 2>&amp;1<br>        sync; echo 3 > \/proc\/sys\/vm\/drop_caches<br>        systemctl restart php8.4-fpm<br>        echo \"PROTEGIDO\"<br>        ;;<br>    unlock)<br>        apt-mark unhold $PAQUETES > \/dev\/null 2>&amp;1<br>        echo \"VULNERABLE\"<br>        ;;<br>    status)<br>        if apt-mark showhold | grep -q \"php8.4\"; then<br>            echo \"PROTEGIDO\"<br>        else<br>            echo \"VULNERABLE\"<br>        fi<br>        ;;<br>esac<br>EOF<br><\/pre>\n<\/div><\/div>\n\n\n\n<p><strong>Permisos cr\u00edticos:<\/strong><\/p>\n\n\n\n<p>Bash<\/p>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<pre class=\"wp-block-preformatted has-small-font-size\">sudo chmod +x \/var\/www\/apps\/admin-scripts\/apt_lock.sh\n# Eliminamos posibles caracteres ocultos de Windows\nsudo sed -i 's\/\\r$\/\/' \/var\/www\/apps\/admin-scripts\/apt_lock.sh\n<\/pre>\n<\/div><\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading has-medium-font-size\">4. Configuraci\u00f3n de Privilegios (Sudoers)<\/h2>\n\n\n\n<p>El servidor web (usuario <code>www-data<\/code>) no tiene permiso para modificar paquetes. Debemos concederle este \u00absuperpoder\u00bb estrictamente para nuestro script.<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li>Ejecuta: <code>sudo visudo -f \/etc\/sudoers.d\/panel-apt-locks<\/code><\/li>\n\n\n\n<li>Pega esta l\u00ednea exacta: <code>www-data ALL=(ALL) NOPASSWD: \/var\/www\/apps\/admin-scripts\/apt_lock.sh<\/code><\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading has-medium-font-size\">5. El Panel Web: <code>lock-updates.php<\/code><\/h2>\n\n\n\n<p>Crea este archivo en la ra\u00edz de tu sitio web (<code>\/var\/www\/html\/<\/code>). Este c\u00f3digo detecta el estado actual y ofrece el bot\u00f3n de acci\u00f3n.<\/p>\n\n\n\n<p>PHP<\/p>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<pre class=\"wp-block-preformatted has-small-font-size\">&lt;?php\nsession_start();\n\/\/ Cambia 'auth' por la variable que uses en tu login\nif (!isset($_SESSION['auth'])) { header(\"Location: admin.php\"); exit(); }\n\n$script = \"\/var\/www\/apps\/admin-scripts\/apt_lock.sh\";\n\nif (isset($_POST['toggle'])) {\n    $accion = ($_POST['actual'] == \"VULNERABLE\") ? \"lock\" : \"unlock\";\n    shell_exec(\"sudo $script $accion\");\n}\n\n$status = trim(shell_exec(\"sudo $script status\"));\n$is_locked = ($status == \"PROTEGIDO\");\n?&gt;\n&lt;!DOCTYPE html&gt;\n&lt;html lang=\"es\"&gt;\n&lt;head&gt;\n    &lt;meta charset=\"UTF-8\"&gt;\n    &lt;title&gt;Blindaje - Raspberry Pi&lt;\/title&gt;\n    &lt;meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"&gt;\n    &lt;style&gt;\n        body { background: #0f172a; color: #f8fafc; font-family: system-ui; display: flex; align-items: center; justify-content: center; min-height: 100vh; margin: 0; }\n        .card { background: #1e293b; padding: 2rem; border-radius: 1.5rem; width: 90%; max-width: 400px; text-align: center; border: 1px solid #334155; }\n        .status-badge { padding: 1rem; border-radius: 0.75rem; margin: 1.5rem 0; font-weight: bold; font-family: monospace; }\n        .locked { background: rgba(34,197,94,0.1); color: #4ade80; border: 1px solid #22c55e; }\n        .unlocked { background: rgba(239,68,68,0.1); color: #f87171; border: 1px solid #ef4444; }\n        .btn { width: 100%; padding: 1rem; border-radius: 0.75rem; border: none; font-weight: bold; cursor: pointer; transition: 0.2s; }\n        .btn-lock { background: #22c55e; color: white; }\n        .btn-unlock { background: #ef4444; color: white; }\n        .btn:active { transform: scale(0.98); }\n    &lt;\/style&gt;\n&lt;\/head&gt;\n&lt;body&gt;\n    &lt;div class=\"card\"&gt;\n        &lt;h2&gt;&#x1f6e1;&#xfe0f; Blindaje Pi 3B&lt;\/h2&gt;\n        &lt;p style=\"color: #94a3b8; font-size: 0.9rem;\"&gt;Protecci\u00f3n de versiones core para Raspberry OS Lite&lt;\/p&gt;\n        \n        &lt;div class=\"status-badge &lt;?php echo $is_locked ? 'locked' : 'unlocked'; ?&gt;\"&gt;\n            ESTADO: &lt;?php echo $status; ?&gt;\n        &lt;\/div&gt;\n\n        &lt;form method=\"POST\"&gt;\n            &lt;input type=\"hidden\" name=\"actual\" value=\"&lt;?php echo $status; ?&gt;\"&gt;\n            &lt;button type=\"submit\" name=\"toggle\" class=\"btn &lt;?php echo $is_locked ? 'btn-unlock' : 'btn-lock'; ?&gt;\"&gt;\n                &lt;?php echo $is_locked ? '&#x1f513; Permitir Actualizaciones' : '&#x1f512; Bloquear Versiones Core'; ?&gt;\n            &lt;\/button&gt;\n        &lt;\/form&gt;\n        &lt;br&gt;&lt;a href=\"admin.php\" style=\"color: #64748b; text-decoration: none; font-size: 0.8rem;\"&gt;\u2190 Volver al Panel&lt;\/a&gt;\n    &lt;\/div&gt;\n&lt;\/body&gt;\n&lt;\/html&gt;\n<\/pre>\n<\/div><\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading has-medium-font-size\">6. Verificaci\u00f3n: \u00bfC\u00f3mo saber si funciona?<\/h2>\n\n\n\n<p>Una vez actives la protecci\u00f3n desde el panel, puedes comprobarlo en la terminal de dos maneras:<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-medium-font-size\">A. El comando de consulta<\/h3>\n\n\n\n<p>Bash<\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code>apt-mark showhold<\/code><\/pre>\n\n\n\n<p>Deber\u00edas ver una lista con <code>php8.4<\/code>, <code>apache2<\/code>, etc.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-medium-font-size\">B. El simulacro de actualizaci\u00f3n<\/h3>\n\n\n\n<p>Bash<\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code>sudo apt-get upgrade --simulate<\/code><\/pre>\n\n\n\n<p>En el resumen final, ver\u00e1s una l\u00ednea que dice: <strong>\u00abX paquetes no actualizados\u00bb<\/strong> (not upgraded). Esos son tus paquetes blindados.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading has-medium-font-size\">7. Consejos de Mantenimiento para Raspberry OS Lite<\/h2>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li><strong>Seguridad:<\/strong> Aunque el blindaje es excelente para la estabilidad, recuerda desbloquear el sistema una vez al mes, realizar un <code>sudo apt update<\/code> para parches de seguridad, y volver a bloquear.<\/li>\n\n\n\n<li><strong>Logs:<\/strong> Revisa peri\u00f3dicamente <code>\/var\/log\/apache2\/error.log<\/code> si notas lentitud en el panel.<\/li>\n\n\n\n<li><strong>Backups:<\/strong> Antes de desbloquear y actualizar, realiza un volcado de tu base de datos MariaDB.<\/li>\n<\/ol>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading has-medium-font-size\">8.  \u00abPuesta a Punto y Permisos\u00bb<\/h2>\n\n\n\n<p>Una vez creado el script, es vital prepararlo para el entorno de producci\u00f3n de la Raspberry Pi. No basta con que el archivo exista; debe ser ejecutable por el servidor web y tener el formato de texto correcto de Linux. Ejecuta este bloque de comandos para garantizar que todo funcione a la primera:<\/p>\n\n\n\n<p>Bash<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"># 1. Limpieza de formato (Crucial si editas desde Windows)\n# Elimina los caracteres invisibles \\r que rompen la ejecuci\u00f3n en Linux\nsudo sed -i 's\/\\r$\/\/' \/var\/www\/apps\/admin-scripts\/apt_lock.sh\n\n# 2. Asignaci\u00f3n de permisos de ejecuci\u00f3n\n# Permitimos que el script se comporte como un programa\nsudo chmod 755 \/var\/www\/apps\/admin-scripts\/apt_lock.sh\n\n# 3. Transferencia de propiedad\n# Aseguramos que el usuario de Apache (www-data) sea el due\u00f1o del proceso\nsudo chown www-data:www-data \/var\/www\/apps\/admin-scripts\/apt_lock.sh\n<\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong>Nota de experto:<\/strong> El comando <code>sed<\/code> es tu mejor amigo cuando trabajas con Raspberry Pi OS desde un PC. Evita el 90% de los errores de \u00abarchivo no encontrado\u00bb cuando el archivo claramente est\u00e1 ah\u00ed.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">\u00bfPor qu\u00e9 incluirlos?<\/h3>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li><strong>Fiabilidad:<\/strong> Tu gu\u00eda ser\u00e1 a prueba de errores de usuario.<\/li>\n\n\n\n<li><strong>Autoridad:<\/strong> Demuestras que conoces las tripas de Linux (manejo de CRLF vs LF).<\/li>\n\n\n\n<li><strong>Soporte:<\/strong> Te ahorrar\u00e1s muchos comentarios en el blog preguntando por qu\u00e9 el bot\u00f3n no hace nada.<\/li>\n<\/ol>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>La Raspberry Pi 3B es una m\u00e1quina incre\u00edblemente vers\u00e1til, pero con sus 1GB de RAM, la estabilidad es nuestra prioridad n\u00famero uno. En entornos de servidor (LAMP), una actualizaci\u00f3n imprevista de paquetes core como PHP 8.4 puede disparar el consumo&#8230; <a href=\"https:\/\/www.sinetiqueta.com\/?p=3391\" class=\"readmore\">Leer m\u00e1s<span class=\"screen-reader-text\">&#x1f914; Blindaje de Infraestructura en Raspberry Pi 3B (Raspberry OS Lite)<\/span><span class=\"fa fa-angle-double-right\" aria-hidden=\"true\"><\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":3392,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[236,498],"tags":[501,409],"class_list":["post-3391","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-raspberry-pi","category-servidor","tag-apt","tag-update","content-layout-excerpt-thumb"],"jetpack_featured_media_url":"https:\/\/www.sinetiqueta.com\/wp-content\/uploads\/2026\/02\/Captura-de-pantalla-2026-02-09-001252.png","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.sinetiqueta.com\/index.php?rest_route=\/wp\/v2\/posts\/3391","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.sinetiqueta.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.sinetiqueta.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.sinetiqueta.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sinetiqueta.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3391"}],"version-history":[{"count":8,"href":"https:\/\/www.sinetiqueta.com\/index.php?rest_route=\/wp\/v2\/posts\/3391\/revisions"}],"predecessor-version":[{"id":3401,"href":"https:\/\/www.sinetiqueta.com\/index.php?rest_route=\/wp\/v2\/posts\/3391\/revisions\/3401"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.sinetiqueta.com\/index.php?rest_route=\/wp\/v2\/media\/3392"}],"wp:attachment":[{"href":"https:\/\/www.sinetiqueta.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3391"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sinetiqueta.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3391"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sinetiqueta.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3391"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}