{"id":28308118,"url":"https://github.com/djimenezweb/born2beroot","last_synced_at":"2025-07-04T07:33:54.698Z","repository":{"id":290233039,"uuid":"973766900","full_name":"djimenezweb/born2beroot","owner":"djimenezweb","description":null,"archived":false,"fork":false,"pushed_at":"2025-05-12T08:49:46.000Z","size":36,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-05-24T07:09:02.437Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/djimenezweb.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-04-27T17:37:53.000Z","updated_at":"2025-05-12T08:49:50.000Z","dependencies_parsed_at":"2025-04-27T18:45:44.900Z","dependency_job_id":null,"html_url":"https://github.com/djimenezweb/born2beroot","commit_stats":null,"previous_names":["djimenezweb/born2beroot"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/djimenezweb/born2beroot","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/djimenezweb%2Fborn2beroot","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/djimenezweb%2Fborn2beroot/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/djimenezweb%2Fborn2beroot/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/djimenezweb%2Fborn2beroot/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/djimenezweb","download_url":"https://codeload.github.com/djimenezweb/born2beroot/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/djimenezweb%2Fborn2beroot/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":263468967,"owners_count":23471421,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-05-24T07:09:00.125Z","updated_at":"2025-07-04T07:33:54.690Z","avatar_url":"https://github.com/djimenezweb.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Born to be Root\r\n\r\nEste proyecto busca introducirte al maravilloso mundo de la virtualización. Crearás tu primera máquina en `VirtualBox` (o `UTM` si no puedes utilizar `VirtualBox`) bajo instrucciones específicas. Por lo tanto, al final del proyecto, serás capaz de configurar tu propio sistema operativo utilizando reglas estrictas.\r\n\r\n## Instrucciones generales\r\n\r\nEl uso de `VirtualBox` es obligatorio (o `UTM` en caso de que `VirtualBox` no funcione en tu máquina).\r\nSolo debes entregar un archivo llamado `signature.txt` en la raíz de tu repositorio. Debes pegar en él la firma del disco virtual de tu máquina. (Ver Entrega y evaluación).\r\n\r\n## Parte obligatoria\r\n\r\nEste proyecto consiste en configurar tu primer servidor siguiendo una serie de normas concretas.\r\n\r\n### Configuración del servidor\r\n\r\nComo consiste en configurar un servidor, deberás instalar el número mínimo de servicios. Por este motivo, una interfaz gráfica no tiene sentido. Está prohibido por tanto instalar `X.org` o cualquier servidor gráfico equivalente. En caso de hacerlo, tu nota será 0.\r\n\r\nDeberás elegir como sistema operativo la última versión estable de Debian (no testing/unstable), o la última versión estable de Rocky. Se recomienda encarecidamente Debian si no tienes experiencia en administración de sistemas.\r\n\r\nConfigurar Rocky es bastante complejo. Por lo tanto, no tienes que configurar `KDump`. Sin embargo, `SELinux` debe ejecutarse al iniciar y su configuración debe adaptarse a las necesidades del proyecto. `AppArmor` en Debian debe ejecutarse al iniciar también.\r\n\r\nDebes crear al menos 2 particiones cifradas usando `LVM`. Puedes encontrar un ejemplo de lo que se espera debajo:\r\n\r\n```\r\nwill@will:~$ lsblk\r\nNAME                   MAJ:MIN  RM   SIZE  RO  TYPE  MOUNTPOINT\r\nsda                      8:0     0     8G   0  disk\r\n├─sda1                   8:1     0   487M   0  part  /boot\r\n├─sda2                   8:2     0     1K   0  part\r\n└─sda5                   8:5     0   7.5G   0  part\r\n  └─sda5_crypt         254:0     0   7.5G   0  crypt\r\n    ├─will--vg-root    254:1     0   2.8G   0  lvm   /\r\n    ├─will--vg-swap_1  254:2     0   976M   0  lvm   [SWAP]\r\n    └─will--vg-home    254:3     0   3.8G   0  lvm   /home\r\nsr0                     11:0     1  1024M   0  rom\r\nwill@will:~$ _\r\n```\r\n\r\nDurante la defensa, se te harán unas preguntas sobre el sistema operativo que has elegido. Debes saber, por lo tanto, las diferencias entre `aptitude` y `apt`, o qué son `SELinux` y `AppArmor`. En definitiva, ¡entiende lo que estás utilizando!\r\n\r\nEl servicio `SSH` se ejecutará obligatoriamente en el puerto `4242` de tu máquina virtual. Por seguridad, no debe ser posible conectarte a través de `SSH` como `root`.\r\n\r\nEl uso de `SSH` será comprobado durante la defensa creando un nuevo usuario. Por lo tanto, debes entender cómo funciona.\r\n\r\nDebes configurar tu sistema operativo con el firewall `UFW`, (o `firewalld` en Rocky) dejando solamente el puerto `4242` abierto en tu máquina virtual.\r\n\r\nTu firewall debe estar activo cuando ejecutes la máquina virtual.\r\n\r\nEl `hostname` de tu máquina virtual debe ser tu login terminado en 42 (por ejemplo, `wil42`). Deberás modificar este `hostname` durante tu evaluación.\r\n\r\nDebes implementar una política de contraseñas fuerte (también para la contraseña de `root`).\r\n\r\nDebes instalar y configurar `sudo` siguiendo reglas estrictas.\r\n\r\nAdemás del usuario `root`, un usuario con tu login como nombre debe existir.\r\n\r\nEste usuario debe pertenecer a los grupos `user42` y `sudo`.\r\n\r\nDurante la defensa, deberás crear un usuario y asignárselo a un grupo.\r\n\r\n### Política de contraseñas\r\n\r\n- Tu contraseña debe expirar cada 30 días.\r\n- El número mínimo de días permitido antes de modificar una contraseña deberá ser 2.\r\n- El usuario debe recibir un mensaje de aviso 7 días antes de que su contraseña expire.\r\n- Tu contraseña debe tener como mínimo 10 caracteres de longitud. Debe contener una mayúscula, una minúscula y un número.\r\n- No puede tener más de 3 veces consecutivas el mismo carácter.\r\n- No puede contener el nombre del usuario.\r\n- Debe tener al menos 7 caracteres que no sean parte de la antigua contraseña (no se aplica a la contraseña para root).\r\n\r\nDespués de preparar tus archivos de configuración, deberás cambiar la contraseña de todas las cuentas presentes en la máquina virtual, `root` incluida.\r\n\r\nPara configurar una contraseña fuerte para tu grupo `sudo`, debes cumplir con los siguientes requisitos:\r\n\r\n- Autenticarte con `sudo` debe estar limitado a tres intentos en el caso de introducir una contraseña incorrecta.\r\n- Un mensaje personalizado de tu elección debe mostrarse en caso de que la contraseña introducida sea incorrecta cuando se utilice `sudo`.\r\n- Para cada comando ejecutado con `sudo`, tanto el input como el output deben quedar archivados en el directorio `/var/log/sudo/`.\r\n- El modo `TTY` debe estar activado por razones de seguridad.\r\n- Por seguridad, los directorios utilizables por `sudo` deben estar restringidos. Por ejemplo: `/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin`\r\n\r\n### monitoring.sh\r\n\r\nFinalmente, debes crear un script sencillo llamado `monitoring.sh`. Debe estar desarrollado en bash.\r\n\r\nCuando el servidor inicie, el script mostrará cierta información (listada debajo) en todos los terminales cada 10 minutos (échale un vistazo a `wall`). El banner de wall es opcional. Ningún error debe ser visible.\r\n\r\nTu script debe siempre mostrar la siguiente información:\r\n\r\n- La arquitectura de tu sistema operativo y su versión de kernel.\r\n- El número de núcleos físicos.\r\n- El número de núcleos virtuales.\r\n- La memoria RAM disponible actualmente en tu servidor y su porcentaje de uso.\r\n- La memoria disponible actualmente en tu servidor y su utilización como un porcentaje.\r\n- El porcentaje actual de uso de tus núcleos.\r\n- La fecha y hora del último reinicio.\r\n- Si LVM está activo o no.\r\n- El número de conexiones activas.\r\n- El número de usuarios del servidor.\r\n- La dirección IPv4 de tu servidor y su MAC (Media Access Control)\r\n- El número de comandos ejecutados con `sudo`.\r\n\r\nDurante la defensa, te preguntarán cómo funciona este script. Deberás interrumpirlo sin modificarlo. Échale un vistazo a `cron`.\r\n\r\nEste es un ejemplo de cómo se espera que funcione tu script:\r\n\r\n```\r\nBroadcast message from root@wil (tty1) (Sun Apr 25 15:45:00 2021):\r\n\r\n    #Architecture: Linux wil 4.19.0-16-amd64 #1 SMP Debian 4.19.181-1 (2021-03-19) x86_64 GNU/Linux\r\n    #CPU physical : 1\r\n    #vCPU : 1\r\n    #Memory Usage: 74/987MB (7.50%)\r\n    #Disk Usage: 1009/2Gb (49%)\r\n    #CPU load: 6.7%\r\n    #Last boot: 2021-04-25 14:45\r\n    #LVM use: yes\r\n    #TCP Connections : 1 ESTABLISHED\r\n    #User log: 1\r\n    #Network: IP 10.0.2.15 (08.00:27:51:9b:a5)\r\n    #Sudo : 42 cmd\r\n```\r\n\r\n## Ejemplos\r\n\r\nDebajo tienes dos comandos que puedes utilizar para comprobar algunos requisitos del subject:\r\n\r\n```\r\nroot@wil:~# head -n 2 /etc/os-release\r\nPRETTY_NAME=\"Debian GNU/Linux 10 (buster)\"\r\nNAME=\"Debian GNU/Linux\"\r\n\r\nroot@wil:/home/wil# /usr/sbin/aa-status\r\napparmor module is loaded.\r\n\r\nroot@wil:/home/wil# ss -tunlp\r\nNetid  State   Recv-Q  Send-Q  Local Address:Port  Peer Address:Port\r\ntcp    LISTEN  0       128           0.0.0.0:4242       0.0.0.0:*     users:((\"sshd\",pid=523,fd=3))\r\ntcp    LISTEN  0       128              [::]:4242          [::]:*     users:((\"sshd\",pid=523,fd=4))\r\n\r\nroot@wil:/home/wil# /usr/sbin/ufw status\r\nStatus: active\r\n\r\nTo            Action    From\r\n--            ------    ----\r\n4242          ALLOW     Anywhere\r\n4242 (v6)     ALLOW     Anywhere (v6)\r\n```\r\n\r\n(Ver imagen Rocky en documento PDF)\r\n\r\n## Parte bonus\r\n\r\nPara completar la parte bonus tienes la posibilidad de configurar servicios adicionales. En este caso, puedes abrir más puertos de acuerdo a tus necesidades. Por supuesto, las reglas de UFW/Rocky deben adaptarse según sea necesario.\r\n\r\nLa parte bonus solo será evaluada si la parte obligatoria está PERFECTA. Perfecta significa que la parte obligatoria es integramente funcional y completa. Si no has completado TODA la parte obligatoria, tu parte bonus no será evaluada.\r\n\r\n- Configura correctamente las particiones para obtener una estructura similar a la mostrada debajo:\r\n\r\n```\r\n# lsblk\r\nNAME                     MAJ:MIN  RM   SIZE  RO  TYPE  MOUNTPOINT\r\nsda                        8:0     0  30.8G   0  disk\r\n├─sda1                     8:1     0   500M   0  part  /boot\r\n├─sda2                     8:2     0     1K   0  part\r\n└─sda5                     8:5     0  30.3G   0  part\r\n  └─sda5_crypt           254:0     0  30.3G   0  crypt\r\n    ├─LVMGroup-root      254:1     0    10G   0  lvm   /\r\n    ├─LVMGroup-swap      254:2     0   2.3G   0  lvm   [SWAP]\r\n    ├─LVMGroup-home      254:3     0     5G   0  lvm   /home\r\n    ├─LVMGroup-var       254:4     0     3G   0  lvm   /var\r\n    ├─LVMGroup-srv       254:5     0     3G   0  lvm   /srv\r\n    ├─LVMGroup-tmp       254:6     0     3G   0  lvm   /tmp\r\n    └─LVMGroup-var--log  254:7     0     4G   0  lvm   /var/log\r\nsr0                       11:0     1  1024M   0  rom\r\n```\r\n\r\n- Configura un sitio WordPress funcional con los siguientes servicios: lighttpd, MariaDB, y PHP.\r\n\r\n- Configura un servicio de tu elección que consideres útil (excepto NGINX / Apache2). Durante la defensa, deberás justificar tu elección.\r\n\r\n## Entrega y evaluación\r\n\r\nSolo deberás enviar un archivo `signature.txt` en la raíz de tu repositorio Git. Debes pegar en él la firma de tu disco virtual. Para obtener esta firma, debes primero abrir la ruta por defecto de instalación (es decir, donde tus VMs se guardan).\r\n\r\n- Windows: `%HOMEDRIVE % %HOMEPATH %\\VirtualBox VMs\\`\r\n- Linux: `~/VirtualBox VMs/`\r\n- MacM1: `~/Library/Containers/com.utmapp.UTM/Data/Documents/`\r\n- MacOS: `~/VirtualBox VMs/`\r\n\r\nRecupera entonces la firma del archivo `.vdi` (o `.qcow2` para UTM) de tu máquina virtual en formato `sha1`. Debajo tienes 4 ejemplos de comandos para un archivo `rocky_serv.vdi`:\r\n\r\n- Windows: `certUtil -hashfile rocky_serv.vdi sha1`\r\n- Linux: `sha1sum rocky_serv.vdi`\r\n- For Mac `M1: shasum rocky.utm/Images/disk-0.qcow2`\r\n- MacOS: `shasum rocky_serv.vdi`\r\n\r\nEste es un ejemplo del tipo de resultado que obtendrás:\r\n\r\n- `6e657c4619944be17df3c31faa030c25e43e40af`\r\n\r\nPor favor, ten en cuenta que la firma de tu VM puede verse alterada tras tu primera evaluación. Para solucionar este problema, puedes duplicar tus máquinas virtuales o usar `save state`.\r\n\r\nEvidentemente está PROHIBIDO entregar tu máquina virtual en tu repositorio de Git. Durante la defensa, el contenido del archivo `signature.txt` se comparará con la firma de tu máquina virtual. Si las dos no son idénticas, tu nota será 0.\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdjimenezweb%2Fborn2beroot","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdjimenezweb%2Fborn2beroot","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdjimenezweb%2Fborn2beroot/lists"}