
Una colección de preguntas y respuestas de prueba para administradores de sistemas Linux. Pon a prueba tus conocimientos y habilidades en diferentes áreas con estas preguntas y respuestas.
:star:
"Un gran Administrador no necesita saberlo todo, pero debería ser capaz de encontrar soluciones asombrosas para proyectos imposibles." - cwheeler33 (ServerFault)
:star:
"Mis habilidades son hacer que las cosas funcionen, no saber mil millones de hechos. [...] Si necesito arreglar un sistema, identificaré el problema, revisaré los registros y buscaré los errores. Si necesito implementar una solución, investigaré la solución correcta, la implementaré y documentaré, luego solo tendré una idea general de cómo funciona a menos que interactúe con ella con frecuencia... por eso está documentada." - Sparcrypt (Reddit)
ℹ️ Este proyecto contiene 284 preguntas y respuestas de prueba que se pueden usar para evaluar tus conocimientos o durante una entrevista/examen para un puesto como Administrador de Sistemas Linux (*nix).
✔️ Las respuestas son solo ejemplos y no agotan todo el tema. La mayoría de ellas contienen recursos útiles para una comprensión más profunda.
⚠️ Las preguntas marcadas con *** aún no tienen respuesta o la respuesta está incompleta - ¡haz un pull request para agregarlas!
🚥 Si encuentras algo que no tenga sentido, o algo que no parezca correcto, por favor haz un pull request y agrega explicaciones válidas y bien razonadas sobre tus cambios o comentarios.
📚 Para mejorar tus conocimientos/habilidades, por favor consulta devops-interview-questions. Parece realmente interesante.
» Todas las sugerencias son bienvenidas «
Mi distribución favorita de Linux:
Recursos útiles:
GNU no es realmente un sistema operativo. Es más un conjunto de reglas o filosofías que rigen el software libre, que al mismo tiempo dio origen a un montón de herramientas mientras intentaba crear un SO. Por lo tanto, las herramientas GNU son básicamente versiones abiertas de herramientas que ya existían, pero fueron reimplementadas para ajustarse a los principios del software abierto. GNU/Linux es una combinación de esas herramientas y el kernel Linux para formar un SO completo, pero existen otros GNU, por ejemplo GNU/Hurd.
Unix y BSD son implementaciones "más antiguas" de POSIX que tienen varios niveles de "código cerrado". Unix suele ser totalmente de código cerrado, pero hay tantas variantes de Unix como de Linux (si no más). BSD no suele considerarse "abierto", pero se consideró muy abierto cuando se lanzó. Su licencia también permitía uso comercial con muchas menos restricciones que las licencias más "abiertas" de la época.
Linux es el más nuevo de los cuatro. Estrictamente hablando, es "solo un kernel"; sin embargo, en general, se considera un SO completo cuando se combina con las herramientas GNU y varios otros componentes centrales.
Las principales diferencias que rigen entre ellos son sus ideales. Unix, Linux y BSD tienen diferentes ideales que implementan. Todos son POSIX y son básicamente intercambiables. Resuelven algunos de los mismos problemas de diferentes maneras. Entonces, aparte de los ideales y cómo eligen implementar los estándares POSIX, hay poca diferencia.
Para más información, sugiero leer un breve artículo sobre la creación de GNU, OSS, Linux, BSD y UNIX. Estarán sesgados hacia sus ideas individuales, pero esos artículos deberían darte una mejor idea de las diferencias.
Recursos útiles:
CLI es un acrónimo de Command Line Interface (Interfaz de Línea de Comandos) o Command Language Interpreter (Intérprete de Lenguaje de Comandos). La línea de comandos es una de las formas más poderosas de controlar tu sistema/ordenador.
En sistemas tipo Unix, CLI es la interfaz mediante la cual un usuario puede escribir comandos para que el sistema los ejecute. La CLI es muy potente, pero no es muy tolerante a errores.
La CLI te permite realizar manipulaciones con los internos de tu sistema y con el código de una manera mucho más afinada. Ofrece mayor flexibilidad y control que una GUI independientemente del sistema operativo utilizado. Muchos programas que quizás quieras usar en tu software alojado, por ejemplo, en Github, también requieren ejecutar algunos comandos en la CLI para ponerlos en funcionamiento.
Mis herramientas favoritas
screen - multiplexor de terminal gratuito, puedo iniciar una sesión y mis terminales se guardarán incluso si se pierde la conexión, para poder reanudar más tarde o desde casassh - el comando más valioso en general para aprender, puedo usarlo para hacer cosas asombrosas:
sshfsrsync sin demonio rsync iniciando uno propio mediante sshvi/vim - es el editor de texto más popular y potente, es universal, funciona muy rápido, incluso en archivos grandesBASH es mi favorito. Es realmente una cuestión de preferencia, donde me encanta la sintaxis y simplemente "hace clic" para mí. La sintaxis de redirección de entrada/salida (>>, << 2>&1, 2>, 1>, etc.) es similar a C++, lo que me facilita reconocerla.
También me gusta el shell ZSH, porque es mucho más personalizable que BASH. Tiene el framework Oh-My-Zsh, completado por pestañas basado en contexto, coincidencia de patrones/globbing mejorado, módulos cargables y más.
Recursos útiles:
man [nombrecomando] se puede usar para ver una descripción de un comando (ej.: man less, man cat)
-h o --help algunos programas implementan la impresión de instrucciones cuando se pasa este parámetro (ej.: python -h y python --help)
w - mucha información útil allí, incluyendo el tiempo de actividad del servidortop - puedes ver todos los procesos en ejecución, luego ordenarlos por CPU, uso de memoria y másnetstat - para saber en qué puerto e IP está escuchando tu servidor y qué procesos los están utilizandodf - reporta la cantidad de espacio en disco disponible utilizado por los sistemas de archivoshistory - te dice lo que ejecutó anteriormente el usuario con el que estás conectado actualmenteRecursos útiles:
ls -al?En el orden de salida:```bash -rwxrw-r-- 1 root root 2048 Jan 13 07:11 db.dump
- permisos de archivo,
- número de enlaces,
- nombre del propietario,
- grupo del propietario,
- tamaño del archivo,
- hora de la última modificación,
- nombre del archivo/directorio
Los permisos de archivo se muestran de la siguiente manera:
- el primer carácter es `-` o `l` o `d`, `d` indica un directorio, un `-` representa un archivo, `l` es un enlace simbólico (o enlace blando) - un tipo especial de archivo
- tres conjuntos de caracteres, tres veces, que indican los permisos para el propietario, el grupo y otros:
- `r` = legible
- `w` = escribible
- `x` = ejecutable
En tu ejemplo `-rwxrw-r--`, esto significa que la línea mostrada es:
- un archivo normal (mostrado como `-`)
- legible, escribible y ejecutable por el propietario (`rwx`)
- legible, escribible, pero no ejecutable por el grupo (`rw-`)
- legible pero no escribible ni ejecutable por otros (`r--`)
Recursos útiles:
- [¿Qué significan los campos en la salida de ls -al? (original)](https://unix.stackexchange.com/questions/103114/what-do-the-fields-in-ls-al-output-mean)
</details>
<details>
<summary><b>¿Cómo obtener una lista de usuarios conectados?</b></summary><br>
Para obtener un resumen de los usuarios conectados, incluyendo cada inicio de sesión de un nombre de usuario, las terminales a las que están adjuntos los usuarios, la fecha/hora en que iniciaron sesión y posiblemente la computadora desde la que están haciendo la conexión, ingrese:```bash
# It uses /var/run/utmp and /var/log/wtmp files to get the details.
who
La ventaja más significativa de ejecutar el proceso en ejecución en segundo plano es que puedes realizar cualquier otra tarea simultáneamente mientras otros procesos se ejecutan en segundo plano. Así, se pueden completar más procesos en segundo plano mientras trabajas en diferentes procesos. Se puede lograr agregando un carácter especial & al final del comando.
Generalmente, las aplicaciones que tardan demasiado en ejecutarse y no requieren interacción del usuario se envían a segundo plano para que podamos continuar nuestro trabajo en la terminal.
Por ejemplo, si quieres descargar algo en segundo plano, puedes:```bash wget https://url-to-download.com/download.tar.gz &
Cuando ejecutas el comando anterior, obtienes la siguiente salida:```bash
[1] 2203
Aquí 1 es el número de serie del trabajo y 2203 es el PID del trabajo.
Puede ver los trabajos ejecutándose en segundo plano usando el siguiente comando:```bash jobs
Cuando ejecutas un trabajo en segundo plano, te da un PID del trabajo, puedes matar el trabajo que se ejecuta en segundo plano usando el siguiente comando:```bash
kill PID
Reemplaza el PID por el PID del trabajo. Si tienes solo un trabajo en ejecución, puedes traerlo al primer plano usando:```bash fg
Si tienes múltiples trabajos ejecutándose en segundo plano, puedes traer cualquier trabajo al primer plano usando:```bash
fg %#
Reemplace el # con el número de serie del trabajo.
Recursos útiles:
Por completar.
Ejecutar (todo) como root es malo porque:
Estupidez: nada te impide cometer un error descuidado. Si intentas cambiar el sistema de cualquier forma potencialmente dañina, necesitas usar sudo, lo que garantiza una pausa (mientras introduces la contraseña) para asegurarte de que no estás a punto de cometer un error.
Seguridad: es más difícil de hackear si no conoces la cuenta de inicio de sesión del usuario administrador. root significa que ya tienes la mitad del conjunto de credenciales de administrador.
Realmente no lo necesitas: si necesitas ejecutar varios comandos como root y te molesta tener que introducir tu contraseña varias veces cuando sudo ha expirado, todo lo que necesitas hacer es sudo -i y ya eres root. ¿Quieres ejecutar algunos comandos usando tuberías? Entonces usa sudo sh -c "comando1 | comando2".
Siempre puedes usarlo en la consola de recuperación: la consola de recuperación te permite recuperarte de un error grave o solucionar un problema causado por una aplicación (que aún así tuviste que ejecutar como sudo). Ubuntu no tiene una contraseña para la cuenta root en este caso, pero puedes buscar en línea cómo cambiarlo; esto dificultará que cualquiera que tenga acceso físico a tu máquina pueda causar daño.
Recursos útiles:
Usarías top/htop para ambas. Usando los comandos free y vmstat podemos mostrar las estadísticas de memoria física y virtual respectivamente. Con la ayuda del comando sar podemos ver la utilización de la CPU y otras estadísticas (pero sar ni siquiera está instalado en la mayoría de los sistemas).
Recursos útiles:
Los promedios de carga de Linux son "promedios de carga del sistema" que muestran la demanda de hilos (tareas) en ejecución en el sistema como un número promedio de hilos en ejecución más en espera. Esto mide la demanda, que puede ser mayor de lo que el sistema está procesando actualmente. La mayoría de las herramientas muestran tres promedios, para 1, 5 y 15 minutos.
Estos 3 números no son los números para las diferentes CPU. Estos números son valores medios del número de carga para un período de tiempo determinado (de los últimos 1, 5 y 15 minutos).
La carga promedio generalmente se describe como "longitud promedio de la cola de ejecución". Por lo tanto, pocos procesos o hilos que consumen CPU pueden elevar la carga promedio por encima de 1. No hay problema si la carga promedio es menor que el número total de núcleos de CPU. Pero si supera el número de CPU, esto significa que algunos hilos/procesos permanecerán en la cola, listos para ejecutarse, pero esperando una CPU libre.
Está diseñado para darte una idea del estado del sistema, promediado durante varios períodos de tiempo. Dado que es un promedio, lleva tiempo volver a 0 después de que se haya colocado una carga pesada en el sistema.
Algunas interpretaciones:
Recursos útiles:
Las contraseñas no se almacenan en ningún lugar del sistema en absoluto. Lo que se almacena en /etc/shadow son los llamados hashes de las contraseñas.
Un hash de algún texto se crea realizando una llamada función unidireccional sobre el texto (contraseña), creando así una cadena para verificar. Por diseño, es "imposible" (computacionalmente inviable) revertir ese proceso.
Las variantes más antiguas de Unix almacenaban las contraseñas cifradas en /etc/passwd junto con otra información sobre cada cuenta.
Las más recientes simplemente tienen un * en el campo correspondiente en /etc/passwd y usan /etc/shadow para almacenar la contraseña, en parte para garantizar que nadie tenga acceso de lectura a las contraseñas cuando solo necesitan los otros datos (shadow generalmente está protegido más fuertemente que passwd).
Para más información, consulta man crypt, man shadow, man passwd.
Recursos útiles:
Para cambiar todos los directorios, por ejemplo, a 755 (drwxr-xr-x):```bash
find /opt/data -type d -exec chmod 755 {} ;
Para cambiar todos los archivos, por ejemplo, a **644** (`-rw-r--r--`):```bash
find /opt/data -type f -exec chmod 644 {} \;
Recursos útiles:
command not found. ¿Cómo rastrear el origen del error y resolverlo?Parece que en algún momento se está sobrescribiendo la variable de entorno PATH predeterminada. El tipo de errores que tienes indica que PATH no contiene, por ejemplo, /bin, donde residen los comandos (incluyendo bash).
Una forma de comenzar a depurar tu script o comando bash sería iniciar un subshell con la opción -x:```bash
bash --login -x
Esto te mostrará cada comando y sus argumentos, que se ejecutan al iniciar ese shell.
También es muy útil mostrar los valores de la variable `PATH`:```bash
echo $PATH
Si ejecutas esto:```bash PATH=/bin:/sbin:/usr/bin:/usr/sbin
la mayoría de los comandos deberían empezar a funcionar, y luego puedes editar `~/.bash_profile` en lugar de `~/.bashrc` y arreglar lo que esté restableciendo `PATH` allí. Los valores predeterminados de la variable `PATH` para **root** y otros usuarios están en el archivo `/etc/profile`.
Recurso útil:
- [¿Cómo agregar correctamente una ruta a PATH?](https://unix.stackexchange.com/questions/26047/how-to-correctly-add-a-path-to-path)
</details>
<details>
<summary><b>Estás presionando <code>CTRL + C</code> pero tu script sigue ejecutándose. ¿Cómo lo detienes?</b></summary><br>
En la mayoría de los casos, puedes detener un script en ejecución usando la combinación de teclas `CTRL + C`. Esto envía una señal de interrupción (SIGINT) al script, que termina su ejecución. Si esto no funciona y el script sigue ejecutándose, puedes probar con la combinación `CTRL + \`, que envía una señal de cierre (SIGQUIT) al script, lo que puede terminarlo de inmediato.
Alternativamente, si estás usando una terminal o interfaz de línea de comandos, puedes probar usando el comando `kill` para enviar una señal al proceso del script. Puedes encontrar el ID del proceso (PID) del script usando los comandos `ps` o `top`, y luego usar `kill` con el PID para detener el script.
En algunos casos, es posible que necesites usar el comando `kill -9` para forzar la detención del script, ya que el comando `kill` normal puede no funcionar si el script está atascado o no responde. La opción `-9` envía una señal SIGKILL, que obliga al proceso a detenerse de inmediato.
</details>
<details>
<summary><b>¿Qué es el comando <code>grep</code>? ¿Cómo coincidir múltiples cadenas en la misma línea?</b></summary><br>
Las utilidades `grep` son una familia de herramientas Unix, que incluyen `egrep` y `fgrep`.
`grep` busca patrones en archivos. Si estás buscando un patrón específico en la salida de otro comando, `grep` resalta las líneas relevantes. Usa este comando grep para buscar archivos de registro, procesos específicos y más.
Para coincidir múltiples cadenas:```bash
grep -E "string1|string2" filename
Si deseas ejecutar cada comando solo si el anterior tuvo éxito, combínalos usando el operador &&:```bash
cd /my_folder && rm *.jar && svn co path to repo && mvn compile package install
Si uno de los comandos falla, entonces todos los demás comandos que le siguen no se ejecutarán.
Si deseas ejecutar todos los comandos sin importar si los anteriores fallaron o no, sepáralos con punto y coma:```bash
cd /my_folder; rm *.jar; svn co path to repo; mvn compile package install
En tu caso, creo que quieres el primer caso, donde la ejecución del siguiente comando depende del éxito del anterior.
También puedes poner todos los comandos en un script y ejecutarlo en su lugar:```bash
#! /bin/sh
cd /my_folder
&& rm *.jar
&& svn co path to repo
&& mvn compile package install
Recursos útiles:
- [Ejecutar y combinar múltiples comandos de linux en una línea (original)](https://stackoverflow.com/questions/13077241/execute-combine-multiple-linux-commands-in-one-line)
</details>
<details>
<summary><b>¿Qué representación simbólica se puede pasar a <code>chmod</code> para otorgar a todos los usuarios permiso de ejecución en un archivo sin afectar otros permisos?</b></summary><br>```bash
chmod a+x /path/to/file
a - para todos los usuariosx - para permiso de ejecuciónPara sincronizar el contenido de dir1 a dir2 en el mismo sistema, escribe:```bash rsync -av --progress --delete dir1/ dir2
- `-a`, `--archive` - modo archivo
- `--delete` - eliminar archivos sobrantes de los directorios de destino
- `-v`, `--verbose` - modo detallado (aumentar la verbosidad)
- `--progress` - mostrar el progreso durante la transferencia
Recursos útiles:
- [How can I sync two local directories? (original](https://unix.stackexchange.com/questions/392536/how-can-i-sync-two-local-directories)
- [Synchronizing folders with rsync](https://www.jveweb.net/en/archives/2010/11/synchronizing-folders-with-rsync.html)
</details>
<details>
<summary><b>Muchas tareas básicas de mantenimiento requieren que edites archivos de configuración. Explica formas de deshacer los cambios que realices.</b></summary><br>
- copia de seguridad manual de un archivo antes de editarlo (con expansión de llaves como esta: `cp filename{,.orig}`)
- copia manual de la estructura de directorios donde se almacena el archivo (ej. `cp`, `rsync` o `tar`)
- hacer una copia de seguridad del archivo original en tu editor (ej. establecer reglas en el archivo de configuración de tu editor)
- la mejor solución es usar `git` (o cualquier otro control de versiones) para mantener un seguimiento de los archivos de configuración (ej. `etckeeper` para el directorio `/etc`)
Recursos útiles:
- [Archivo de copia de seguridad con .bak antes de la extensión del nombre de archivo](https://unix.stackexchange.com/questions/66376/backup-file-with-bak-before-filename-extension)
- [¿Es buena idea usar git para el control de versiones de archivos de configuración?](https://superuser.com/questions/1037211/is-it-a-good-idea-to-use-git-for-configuration-file-version-controlling)
</details>
<details>
<summary><b>Tienes que encontrar todos los archivos de más de 20 MB. ¿Cómo lo haces?</b></summary><br>```bash
find / -type f -size +20M
sudo su - y no solo sudo su?sudo está presente en la mayoría de las distribuciones modernas de Linux donde (pero no siempre) el usuario root está deshabilitado y no tiene contraseña establecida. Por lo tanto, no puedes cambiar al usuario root con su (puedes intentarlo). Debes invocar sudo con privilegios de root: sudo su.
su simplemente cambia de usuario, proporcionando un shell normal con un entorno casi igual al del usuario anterior.
su - invoca un shell de inicio de sesión después de cambiar de usuario. Un shell de inicio de sesión restablece la mayoría de las variables de entorno, proporcionando una base limpia.
Recursos útiles:
Son esenciales para investigar problemas en el sistema. La gestión de registros (logs) es absolutamente crítica para la seguridad informática.
Los servidores, firewalls y otros equipos de TI mantienen archivos de registro que registran eventos y transacciones importantes. Esta información puede proporcionar pistas importantes sobre actividad hostil que afecta su red desde dentro y fuera. Los datos de registro también pueden proporcionar información para identificar y solucionar problemas de equipos, incluidos problemas de configuración y fallos de hardware.
Es el registro de su servidor de quién ha visitado su sitio, cuándo y exactamente qué vieron. Es increíblemente detallado y muestra:
Factores a considerar:
Al recopilar y analizar registros, puede comprender lo que sucede dentro de su red. Cada archivo de registro contiene muchas piezas de información que pueden ser invaluables, especialmente si sabe cómo leerlos y analizarlos.
Recursos útiles:
Una copia de seguridad incremental es un tipo de copia de seguridad que solo copia los archivos que han cambiado desde la copia de seguridad anterior.
Recursos útiles:
Un RAID (Redundant Array of Inexpensive Disks) es una tecnología que se utiliza para aumentar el rendimiento y/o la fiabilidad del almacenamiento de datos.
Recursos útiles:
Si no se especifica, el comportamiento de useradd dependerá de la variable USERGROUPS_ENAB contenida en /etc/login.defs. El comportamiento predeterminado (USERGROUPS_ENAB yes) es crear un grupo con el mismo nombre que el nombre de usuario, con GID igual a UID.
Recursos útiles:
Por completar.
Recursos útiles:
Por completar.
Lo más importante que entender sobre el modelo OSI (o cualquier otro) es:
Recursos útiles:
Las VLAN y las subredes resuelven problemas diferentes. Las VLAN trabajan en la Capa 2, modificando así los dominios de difusión (por ejemplo). Mientras que las subredes están en la Capa 3 en el contexto actual.
Subred - es un rango de direcciones IP determinado por parte de una dirección (a menudo llamada dirección de red) y una máscara de subred. Por ejemplo, si la máscara de subred es 255.255.255.0 (o /24 para abreviar), y la dirección de red es 192.168.10.0, entonces eso define un rango de direcciones IP desde 192.168.10.0 hasta 192.168.10.255. La forma abreviada de escribirlo es 192.168.10.0/24.
VLAN - una buena forma de pensar en esto es "particionamiento de switches". Supongamos que tienes un switch de 8 puertos que soporta VLAN. Puedes asignar 4 puertos a una VLAN (digamos VLAN 1) y 4 puertos a otra VLAN (digamos VLAN 2). VLAN 1 no verá el tráfico de VLAN 2 y viceversa, lógicamente, ahora tienes dos switches separados. Normalmente en un switch, si el switch no ha visto una dirección MAC, "inundará" el tráfico a todos los demás puertos. Las evitan esto.
POP e IMAP son protocolos para recuperar mensajes de un servidor de correo a un cliente de correo.
POP (Post Office Protocol) utiliza una transferencia unidireccional del servidor de correo al cliente. De forma predeterminada, esto enviará los mensajes al cliente de correo POP y los eliminará del servidor de correo, aunque es posible configurar el servidor de correo para que retenga todos los mensajes. Cualquier acción que realices sobre el mensaje en tu cliente de correo (etiquetar, eliminar, mover a una carpeta) no se reflejará en el servidor de correo y, por lo tanto, será inaccesible para otros clientes de correo que accedan al servidor. POP utiliza poco espacio de almacenamiento en el servidor de correo y puede considerarse más seguro, ya que los mensajes solo existen en un cliente de correo en lugar de en el servidor y en múltiples clientes.
IMAP (Internet Message Access Protocol) utiliza comunicación bidireccional entre el servidor de correo y el cliente. Eliminar o etiquetar un mensaje en tu cliente de correo configurado con IMAP también eliminará o etiquetará el mensaje en el servidor de correo. IMAP permite una experiencia similar al acceder al correo desde diferentes clientes o dispositivos, ya que los mensajes pueden existir en el mismo estado en múltiples dispositivos. IMAP también puede ahorrar espacio en disco en el cliente de correo al sincronizar mensajes de forma selectiva y eliminar mensajes antiguos del cliente, ya que puede sincronizarlos desde el servidor de correo más adelante según sea necesario.
Elige IMAP si necesitas acceder a los mensajes desde múltiples dispositivos y deseas ahorrar espacio en disco en tu dispositivo cliente. Elige POP si deseas ahorrar espacio en disco en tu servidor de correo, acceder a los mensajes solo desde un dispositivo cliente y asegurarte de que los mensajes no existan en múltiples sistemas.
Usando los comandos netstat -nr, route -n o ip route show podemos ver la ruta predeterminada y las tablas de enrutamiento.
Recursos útiles:
Bueno, la diferencia más probable es que aún tienes que hacer una resolución real de localhost en algún lugar.
Si usas 127.0.0.1, entonces el software (inteligente) lo convertirá directamente en una dirección IP y la usará. Algunas implementaciones de gethostbyname detectarán el formato punteado (y presumiblemente el formato IPv6 equivalente) y no realizarán ninguna resolución.
De lo contrario, el nombre debe ser resuelto. Y no hay garantía de que tu archivo hosts se use realmente para esa resolución (primero, o en absoluto), por lo que localhost podría convertirse en una dirección IP totalmente diferente.
Con esto quiero decir que, en algunos sistemas, se puede omitir el archivo hosts local. El archivo host.conf controla esto en Linux (y muchos otros Unix).
Si usas un socket de dominio Unix, será ligeramente más rápido que usar TCP/IP (debido a la menor sobrecarga). Windows usa TCP/IP como predeterminado, mientras que Linux intenta usar un socket de dominio Unix si eliges localhost y TCP/IP si usas 127.0.0.1.
Recursos útiles:
ping?ping usa ICMP, específicamente paquetes ICMP echo request e ICMP echo reply. No hay un 'puerto' asociado con ICMP. Los puertos están asociados con los dos protocolos de capa de transporte IP, TCP y UDP. ICMP, TCP y UDP son "hermanos"; no se basan entre sí, sino que son tres protocolos separados que se ejecutan sobre IP.
Los paquetes ICMP se identifican por el campo 'protocolo' en el encabezado del datagrama IP. ICMP no utiliza servicios de comunicación UDP ni TCP, utiliza servicios de comunicación IP sin procesar. Esto significa que el mensaje ICMP se transporta directamente en el campo de datos de un datagrama IP. raw proviene de cómo se implementa esto en el software: para crear y enviar un mensaje ICMP, se abre un socket raw, se construye un búfer que contiene el mensaje ICMP y luego se escribe el búfer que contiene el mensaje en el socket sin procesar.
El valor del protocolo IP para ICMP es 1. El campo de protocolo es parte del encabezado IP e identifica qué hay en la porción de datos del datagrama IP.
Sin embargo, podrías usar nmap para ver si los puertos están abiertos o no:```bash
nmap -p 80 example.com
Recursos útiles:
- [Número de puerto de ping](https://networkengineering.stackexchange.com/questions/42463/ping-port-number)
- [¿Es posible hacer ping a una dirección:puerto?](https://superuser.com/questions/769541/is-it-possible-to-ping-an-addressport)
</details>
<details>
<summary><b>El Servidor A no puede comunicarse con el Servidor B. Describe posibles razones en unos pocos pasos.</b></summary><br>
Para solucionar problemas de comunicación entre servidores, es mejor seguir idealmente la pila TCP/IP:
1. **Capa de Aplicación**: ¿los servicios están activos y funcionando en ambos servidores? ¿Están configurados correctamente (ej. enlazar la IP y el puerto correctos)? ¿Los registros de aplicación y sistema muestran errores significativos?
2. **Capa de Transporte**: ¿están abiertos los puertos utilizados por la aplicación (¡prueba telnet!)? ¿Es posible hacer ping al servidor?
3. **Capa de Red**: ¿hay un cortafuegos en la red o en el SO correctamente configurado? ¿La pila IP está configurada correctamente (IP, rutas, dns, etc.)? ¿Los switches y routers están funcionando (¡revisa la tabla ARP!)?
4. **Capa Física**: ¿los servidores están conectados a una red? ¿Se están perdiendo paquetes?
</details>
<details>
<summary><b>¿Por qué no se resuelven los nombres de host en tu servidor? Soluciona este problema. ***</b></summary><br>
Por completar.
</details>
<details>
<summary><b>¿Cómo resolver el nombre de dominio (usando dns externo) con CLI? ¿Se pueden resolver las IPs a nombres de dominio?</b></summary><br>
Ejemplos para resolver dirección IP a nombre de dominio:```bash
# with host command:
host domain.com 8.8.8.8
# with dig command:
dig @9.9.9.9 google.com
# with nslookup command:
nslookup domain.com 8.8.8.8
telnet o nc?nc -vz code42.example.com 5432
</details>
<details>
<summary><b>¿Por qué deberías evitar usar <code>telnet</code> para administrar un sistema de forma remota?</b></summary><br>
Los sistemas operativos modernos han desactivado todos los servicios potencialmente inseguros por defecto. Por otro lado, algunos fabricantes de dispositivos de red aún permiten establecer comunicación usando el protocolo telnet.
**Telnet** utiliza el método más inseguro para la comunicación. Envía datos a través de la red en formato de texto plano y cualquiera puede descubrir fácilmente la contraseña usando una herramienta de red.
En el caso de **Telnet**, esto incluye el envío de credenciales de inicio de sesión en texto plano, lo que significa que cualquiera que ejecute un sniffer en tu red puede encontrar la información necesaria para tomar el control de un dispositivo en pocos segundos al espiar una sesión de inicio de sesión de **Telnet**.
Recursos útiles:
- [Telnet y SSH como alternativa segura](https://www.ssh.com/ssh/telnet)
- [¿Cómo hacer telnet a una dirección IP en un puerto específico?](https://superuser.com/questions/339107/how-to-telnet-to-an-ip-address-on-a-specific-port)
</details>
<details>
<summary><b>¿Cuál es la diferencia entre <code>wget</code> y <code>curl</code>?</b></summary><br>
Las principales diferencias son: la gran fortaleza de `wget` en comparación con `curl` es su capacidad de descarga recursiva. `wget` solo es línea de comandos. `curl` admite FTP, FTPS, HTTP, HTTPS, SCP, SFTP, TFTP, TELNET, DICT, LDAP, LDAPS, FILE, POP3, IMAP, SMTP, RTMP y RTSP.
Recursos útiles:
- [¿Cuál es la diferencia entre curl y wget? (original)](https://unix.stackexchange.com/questions/47434/what-is-the-difference-between-curl-and-wget)
</details>
<details>
<summary><b>¿Qué es SSH y cómo funciona?</b></summary><br>
**SSH** significa **Secure Shell**. Es un protocolo que te permite saltar desde un servidor "A" a una sesión de shell en un servidor "B". Te permite interactuar con tu servidor "B".
Para que se establezca una conexión **SSH**, la máquina remota (servidor A) debe ejecutar un software llamado demonio **SSH** y la computadora del usuario (servidor B) debe tener un cliente **SSH**.
El demonio **SSH** y el cliente **SSH** escuchan conexiones en un puerto de red específico (por defecto 22), autentican las solicitudes de conexión y generan el entorno adecuado si el usuario proporciona las credenciales correctas.
Recursos útiles:
- [Comprendiendo el proceso de cifrado y conexión SSH](https://www.digitalocean.com/community/tutorials/understanding-the-ssh-encryption-and-connection-process)
</details>
<details>
<summary><b>La mayoría de los tutoriales sugieren usar autenticación por clave SSH en lugar de autenticación por contraseña. ¿Por qué se considera más segura?</b></summary><br>
Una **clave SSH** es una credencial de acceso en el protocolo SSH. Su función es similar a la de los nombres de usuario y contraseñas, pero las claves se usan principalmente para procesos automatizados y para implementar inicio de sesión único por parte de administradores de sistemas y usuarios avanzados.
En lugar de requerir la contraseña del usuario, es posible confirmar la identidad del cliente utilizando algoritmos de criptografía asimétrica, con claves públicas y privadas.
Si tu servicio SSH solo permite autenticación por clave pública, un atacante necesita una copia de una clave privada correspondiente a una clave pública almacenada en el servidor.
Si tu servicio SSH permite autenticación basada en contraseña, entonces tu servidor SSH conectado a Internet será golpeado día y noche por botnets tratando de adivinar nombres de usuario y contraseñas. La botnet no necesita información, solo puede probar nombres populares y contraseñas populares. Además de cualquier otra cosa, esto satura tus registros.
Recursos útiles:
- [Autenticación basada en clave (Autenticación de clave pública)](http://www.crypto-it.net/eng/tools/key-based-authentication.html)
- [SSH: contraseña vs. autenticación por clave](https://security.stackexchange.com/questions/33381/ssh-password-vs-key-authentication)
</details>
<details>
<summary><b>¿Qué es un filtro de paquetes y cómo funciona?</b></summary><br>
El **filtrado de paquetes** es una técnica de firewall utilizada para controlar el acceso a la red mediante la supervisión de paquetes salientes y entrantes, permitiéndoles pasar o detenerlos según las direcciones IP de origen y destino, protocolos y puertos.
El filtrado de paquetes es apropiado cuando hay requisitos de seguridad modestos. Las redes internas (privadas) de muchas organizaciones no están altamente segmentadas. No se necesitan firewalls muy sofisticados para aislar una parte de la organización de otra.
Sin embargo, es prudente proporcionar algún tipo de protección de la red de producción frente a una red de laboratorio o experimental. Un dispositivo de filtrado de paquetes es una medida muy apropiada para proporcionar aislamiento de una subred de otra.
Operando en la capa de red y la capa de transporte de la pila de protocolos TCP/IP, cada paquete se examina a medida que ingresa a la pila de protocolos. Los encabezados de red y transporte se examinan detenidamente para obtener la siguiente información:
- **protocolo (encabezado IP, capa de red)** - en el encabezado IP, el byte 9 (recuerda que el conteo de bytes comienza en cero) identifica el protocolo del paquete. La mayoría de los dispositivos de filtrado tienen la capacidad de diferenciar entre TCP, UDP e ICMP.
- **dirección de origen (encabezado IP, capa de red)** - la dirección de origen es la dirección IP de 32 bits del host que creó el paquete.
- **dirección de destino (encabezado IP, capa de red)** - la dirección de destino es la dirección IP de 32 bits del host al que se destina el paquete.
- **puerto de origen (encabezado TCP o UDP, capa de transporte)** - cada extremo de una conexión de red TCP o UDP está vinculado a un puerto. Los puertos TCP son separados y distintos de los puertos UDP. Los puertos numerados por debajo de 1024 están reservados – tienen un uso definido específicamente. Los puertos numerados por encima de 1024 (inclusive) se conocen como puertos efímeros. Pueden usarse como el proveedor elija. Para una lista de puertos "bien conocidos", consulta RFP1700. El puerto de origen es un número de puerto efímero asignado pseudoaleatoriamente. Por lo tanto, a menudo no es muy útil filtrar por el puerto de origen.
- **puerto de destino (encabezado TCP o UDP, capa de transporte)** - el número de puerto de destino indica el puerto al que se envía el paquete. Cada servicio en el host de destino escucha en un puerto. Algunos puertos bien conocidos que podrían filtrarse son 20/TCP y 21/TCP - conexión/datos ftp, 23/TCP - telnet, 80/TCP - http, y 53/TCP - transferencias de zona DNS.
- **estado de la conexión (encabezado TCP, capa de transporte)** - el estado de la conexión indica si el paquete es el primer paquete de la sesión de red. El bit ACK en el encabezado TCP se establece en "falso" o 0 si este es el primer paquete de la sesión. Es sencillo impedir que un host establezca una conexión rechazando o descartando cualquier paquete que tenga el bit ACK establecido en "falso" o 0.
Recursos útiles:
- [Construyendo firewalls de Internet - Filtrado de paquetes](http://web.deu.edu.tr/static/oreily/networking/firewall/ch06_01.htm)
</details>
<details>
<summary><b>¿Cuáles son las ventajas de usar un servidor proxy inverso?</b></summary><br>
**Ocultar la topología y características de tus servidores back-end**
El **servidor proxy inverso** puede ocultar la presencia y características del servidor de origen. Actúa como intermediario entre la nube de Internet y el servidor web. Es bueno por razones de seguridad, especialmente cuando se utilizan servicios de alojamiento web.
**Permite el mantenimiento transparente de servidores back-end**
Los cambios que realices en los servidores que se ejecutan detrás de un proxy inverso serán completamente transparentes para tus usuarios finales.
**Balanceo de carga**
El proxy inverso aplicará un algoritmo de balanceo de carga como round robin, round robin ponderado, menor número de conexiones, menor número de conexiones ponderado o aleatorio, para distribuir la carga entre los servidores del clúster.
Cuando un servidor se cae, el sistema realizará automáticamente una conmutación por error al siguiente servidor activo y los usuarios podrán continuar con sus actividades de transferencia segura de archivos.
**Offloading/terminación SSL**
Maneja las conexiones HTTPS entrantes, descifrando las solicitudes y pasando solicitudes sin cifrar a los servidores web.
**Enmascaramiento de IP**
Usando una sola IP pero diferentes URL para enrutar a diferentes servidores back-end.
Recursos útiles:
- [Los beneficios de un proxy inverso](https://dzone.com/articles/benefits-reverse-proxy)
</details>
<details>
<summary><b>¿Cuál es la diferencia entre un router y una puerta de enlace? ¿Qué es la puerta de enlace predeterminada?</b></summary><br>
**Router** describe la función técnica general (reenvío de capa 3) o un dispositivo de hardware destinado a ese propósito, mientras que puerta de enlace describe la función para el segmento local (proporcionando conectividad a otros lugares). También podrías decir que "_configuras un router como puerta de enlace_". Otro término es salto que describe el reenvío entre subredes.
El término **puerta de enlace predeterminada** se usa para referirse al router en tu LAN que tiene la responsabilidad de ser el primer punto de contacto para el tráfico hacia computadoras fuera de la LAN.
Es solo una cuestión de perspectiva, el dispositivo es el mismo.
Recursos útiles:
- [Diferencia entre router y puerta de enlace (original)](https://networkengineering.stackexchange.com/questions/51426/difference-between-router-and-gateway)
</details>
<details>
<summary><b>Explica la función de cada uno de los siguientes registros DNS: SOA, PTR, A, MX y CNAME.</b></summary><br>
Los **registros DNS** son básicamente archivos de mapeo que le indican al servidor DNS qué dirección IP está asociada a cada dominio y cómo manejar las solicitudes enviadas a cada dominio. Algunas sintaxis de **registros DNS** que se usan comúnmente en casi todas las configuraciones de registros DNS son `A`, `AAAA`, `CNAME`, `MX`, `PTR`, `NS`, `SOA`, `SRV`, `TXT` y `NAPTR`.
- **SOA** - Inicio de autoridad (Start Of Authority)
- **A** - Registros de mapeo de direcciones
- **AAAA** - Registros de direcciones IPv6
- **CNAME** - Registros de nombre canónico
- **MX** - Registro de intercambio de correo
- **NS** - Registros de servidor de nombres
- **PTR** - Registros de puntero de búsqueda inversa
Recursos útiles:
- [Lista de tipos de registros DNS](https://en.wikipedia.org/wiki/List_of_DNS_record_types)
</details>
<details>
<summary><b>¿Por qué no se podrían usar direcciones MAC en lugar de IPv4/6 para redes?</b></summary><br>
El modelo **OSI** explica por qué no tiene sentido tomar decisiones de enrutamiento (un concepto de **capa 3**) basadas en un mecanismo físico de **capa 2**.
Las redes modernas están divididas en muchas capas diferentes para lograr tu comunicación de extremo a extremo. Tu tarjeta de red (a la que se dirige la dirección MAC - dirección física) solo necesita ser responsable de comunicarse con pares en su red física.
La comunicación que puedes lograr con tu dirección **MAC** se limitará a otros dispositivos que residan dentro del contacto físico con tu máquina. En Internet, por ejemplo, no estás físicamente conectado a cada máquina. Por eso utilizamos el mecanismo **TCP/IP** (una dirección lógica de **capa 3**) cuando necesitamos comunicarnos con una máquina a la que no estamos conectados físicamente.
**IP** es un esquema de numeración arbitrario impuesto de manera jerárquica en un grupo de computadoras para distinguirlas lógicamente como grupo (eso es lo que es una subred). El envío de mensajes entre esos grupos se realiza mediante tablas de enrutamiento, ellas mismas divididas en múltiples niveles para que no tengamos que realizar un seguimiento de cada subred individual.
También es bastante fácil relacionar esto con otro par de sistemas. Tienes un número de identificación emitido por el estado, ¿por qué necesitarías una dirección postal si ese número de identificación ya es único para ti? Necesitas la dirección postal porque es un sistema arbitrario que describe dónde debe ir el destino único para las comunicaciones hacia ti.
Por otro lado, la distribución de direcciones **MAC** a través de la red es aleatoria y completamente no relacionada con la topología. La agrupación de rutas sería imposible, cada router necesitaría mantener rutas para cada dispositivo individual que transmita tráfico a través de él. Eso es lo que hacen los switches de **capa 2**, y eso no escala bien más allá de un cierto número de hosts.
Recursos útiles:
- [¿Por qué no se podrían usar direcciones MAC en lugar de IPv4|6 para redes? (original)](https://serverfault.com/questions/410626/why-couldnt-mac-addresses-be-used-instead-of-ipv46-for-networking)
</details>
<details>
<summary><b>¿Cuál es la máscara de subred IPv4 más pequeña que se puede aplicar a una red que contenga hasta 30 dispositivos?</b></summary><br>
Ya sea que tengas una VLAN estándar `/24` para usuarios finales, un `/30` para enlaces punto a punto, o algo intermedio, una subred que debe contener hasta 30 dispositivos resulta ser un `/27`, o una máscara de subred de `255.255.255.224`.
Recursos útiles:
- [¿Cómo se calculan el prefijo, la red, la subred y los números de host?](https://networkengineering.stackexchange.com/questions/7106/how-do-you-calculate-the-prefix-network-subnet-and-host-numbers)
- [La barra después de una dirección IP - Notación CIDR](https://networkengineering.stackexchange.com/questions/3697/the-slash-after-an-ip-address-cidr-notation)
- [¿Por qué hay 3 rangos de direcciones IPv4 privadas?](https://networkengineering.stackexchange.com/questions/32119/why-are-there-3-ranges-of-private-ipv4-addresses)
- [Calculadora IP](http://jodies.de/ipcalc)
</details>
<details>
<summary><b>¿Cuáles son algunos códigos de estado HTTP comunes?</b></summary><br>
- **1xx** - Respuestas informativas - comunica información a nivel de protocolo de transferencia
- **2xx** - Éxito - indica que la solicitud del cliente fue aceptada exitosamente
- **3xx** - Redirección - indica que el cliente debe tomar alguna acción adicional para completar su solicitud
- **4xx** - Error del lado del cliente - esta categoría de códigos de estado de error señala al cliente
- **5xx** - Error del lado del servidor - el servidor asume la responsabilidad por estos códigos de estado de error
Recursos útiles:
- [Códigos de estado HTTP](https://httpstatuses.com/)
</details>
###### Preguntas de DevOps (5)
<details>
<summary><b>¿Qué es DevOps? ¿Qué es más importante para el éxito de cualquier comunidad DevOps: cómo se comunican las personas o las herramientas que eliges implementar? ***</b></summary><br>
**DevOps** es un equipo cohesivo que participa tanto en tareas de Desarrollo como de Operaciones, o son equipos individuales de Operaciones y Desarrollo que trabajan muy estrechamente juntos. Es más una "forma" de trabajar colaborativamente con otros departamentos para lograr objetivos comunes.
</details>
<details>
<summary><b>¿Qué es un control de versiones? ¿Tus mensajes de commit se ven bien?</b></summary><br>
Es un sistema que registra cambios en un archivo o conjunto de archivos a lo largo del tiempo para que puedas recuperar versiones específicas más adelante. Los sistemas de control de versiones consisten en un repositorio central compartido donde los compañeros de equipo pueden enviar cambios a un archivo o conjunto de archivos. Luego puedes mencionar los usos del control de versiones.
El control de versiones te permite:
- revertir archivos a un estado anterior
- revertir todo el proyecto a un estado anterior
- comparar cambios a lo largo del tiempo
- ver quién modificó algo por última vez que podría estar causando un problema
- quién introdujo un problema y cuándo
Las siete reglas de un gran mensaje de commit:
- separar el asunto del cuerpo con una línea en blanco
- limitar la línea de asunto a 50 caracteres
- poner en mayúscula la primera letra de la línea de asunto
- no terminar la línea de asunto con un punto
- usar modo imperativo en la línea de asunto
- ajustar el cuerpo a 72 caracteres
- usar el cuerpo para explicar qué y por qué vs. cómo
Recursos útiles:
- [Comenzando - Acerca del control de versiones (original)](https://git-scm.com/book/es/v2/Inicio---Sobre-el-control-de-versiones)
</details>
<details>
<summary><b>Explica algunos comandos básicos de <code>git</code>.</b></summary><br>
- `git init` - crear un nuevo repositorio local
- `git commit -m "mensaje"` - confirmar cambios en HEAD
- `git status` - listar los archivos que has agregado con `git add` y también confirmar cualquier archivo que hayas cambiado desde entonces
- `git push origin master` - enviar cambios a la rama master de tu repositorio remoto
</details>
<details>
<summary><b>Explica un pipeline simple de Integración Continua.</b></summary><br>
- clonar repositorio
- etapa de despliegue (QA)
- entorno de pruebas (QA)
- etapa de despliegue (PROD)
</details>
<details>
<summary><b>Explica algunos comandos básicos de <code>docker</code>.</b></summary><br>
- `docker ps` - mostrar contenedores en ejecución
- `docker ps -a` - mostrar todos los contenedores
- `docker images` - mostrar imágenes docker
- `docker logs <id-contenedor|nombre-contenedor>` - obtener registros del contenedor
- `docker network ls` - mostrar todas las redes docker
- `docker volumes ls` - mostrar todos los volúmenes docker
- `docker exec -it <id-contenedor|nombre-contenedor> bash` - ejecutar bash en el contenedor con shell interactivo
</details>
###### Preguntas de Ciberseguridad (1)
<details>
<summary><b>¿Qué es una mala configuración de seguridad?</b></summary><br>
**La mala configuración de seguridad** es una vulnerabilidad cuando un dispositivo/aplicación/red está configurado de una manera que un atacante puede explotar para aprovecharla. Esto puede ser tan simple como dejar el nombre de usuario/contraseña predeterminados sin cambios o demasiado simples para cuentas de dispositivos, etc.
</details>
### :diamond_shape_with_a_dot_inside: <a name="regular-sysadmin">Sysadmin Regular</a>
###### Preguntas de Sistema (60)
<details>
<summary><b>Cuéntame sobre tu experiencia con los entornos de producción. ***</b></summary><br>
Por completar.
</details>
<details>
<summary><b>¿Qué distribución elegirías para ejecutar un servidor web importante? ***</b></summary><br>
Por completar.
</details>
<details>
<summary><b>Explica en algunos puntos el proceso de arranque del sistema Linux.</b></summary><br>
**BIOS**: La forma completa de BIOS es Sistema Básico de Entrada/Salida que realiza comprobaciones de integridad y buscará y cargará y luego ejecutará el cargador de arranque.
**Cargador de arranque**: Dado que las fases anteriores no son específicas del sistema operativo, se considera que el proceso de arranque basado en BIOS para arquitecturas x86 y x86-64 comienza cuando se ejecuta el código del registro maestro de arranque (MBR) en modo real y se carga el cargador de arranque de primera etapa. En sistemas UEFI, se puede ejecutar directamente una carga útil, como el kernel de Linux. Por lo tanto, no es necesario un cargador de arranque. Algunos cargadores de arranque populares: **GRUB**, **Syslinux/Isolinux** o **Lilo**.
**Kernel**: El kernel en Linux maneja todos los procesos del sistema operativo, como la gestión de memoria, la planificación de tareas, E/S, comunicación entre procesos y el control general del sistema. Se carga en dos etapas: en la primera etapa, el kernel (como un archivo de imagen comprimido) se carga en memoria y se descomprime, y se configuran algunas funciones fundamentales como la gestión básica de memoria.
**Init**: Es el padre de todos los procesos en el sistema, es ejecutado por el kernel y es responsable de iniciar todos los demás procesos.
- `SysV init` - el trabajo de init es "hacer que todo funcione como debería una vez que el kernel está completamente en ejecución. Básicamente establece y opera todo el espacio de usuario. Esto incluye verificar y montar sistemas de archivos, iniciar servicios de usuario necesarios y, en última instancia, cambiar a un entorno de usuario cuando se completa el inicio del sistema.
- `systemd` - los desarrolladores de systemd buscaron reemplazar el sistema init de Linux heredado de Unix System V. Al igual que init, systemd es un demonio que gestiona otros demonios. Todos los demonios, incluido systemd, son procesos en segundo plano. Systemd es el primer demonio en iniciarse (durante el arranque) y el último demonio en terminar (durante el apagado).
- `runit` - runit es un esquema init para sistemas operativos tipo Unix que inicializa, supervisa y termina procesos en todo el sistema operativo. Es una reimplementación del conjunto de herramientas de supervisión de procesos daemontools que se ejecuta en los sistemas operativos Linux, Mac OS X, \*BSD y Solaris.
Recursos útiles:
- [Analizando el proceso de arranque de Linux](https://opensource.com/article/18/1/analyzing-linux-boot-process)
- [Proceso de arranque de Systemd: una mirada cercana en Linux](https://linoxide.com/linux-how-to/systemd-boot-process/)
</details>
<details>
<summary><b>¿Cómo y por qué los demonios de Linux disminuyen privilegios? ¿Por qué algunos demonios necesitan permisos de root para iniciar? Explica. ***</b></summary>
Por completar.
</details>
<details>
<summary><b>¿Por qué una carga de 1.00 no es ideal en una máquina de un solo núcleo?</b></summary><br>El problema con una carga de 1.00 es que no tienes margen. En la práctica, muchos administradores de sistemas trazarán una línea en 0.70.
La regla general de "Necesita ser revisado": 0.70 Si tu promedio de carga se mantiene por encima de > 0.70, es momento de investigar antes de que las cosas empeoren.
La regla general de "Arréglalo ahora": 1.00. Si tu promedio de carga se mantiene por encima de 1.00, encuentra el problema y arréglalo ahora. De lo contrario, te despertarán en medio de la noche y no va a ser divertido.
Regla general: 5.0. Si tu promedio de carga está por encima de 5.00, podrías estar en serios problemas, tu máquina se está colgando o ralentizando mucho, y esto ocurrirá (inexplicablemente) en el peor momento posible, como en medio de la noche o cuando estás presentando en una conferencia. No dejes que llegue a eso.
Recursos útiles:
- [Forma adecuada de interpretar la carga del sistema en un procesador de 4 núcleos y 8 hilos](https://serverfault.com/questions/618130/proper-way-of-interpreting-system-load-on-a-4-core-8-thread-processor)
- [Entendiendo la carga de CPU en Linux - ¿cuándo deberías preocuparte?](http://blog.scoutapp.com/articles/2009/07/31/understanding-load-averages)
</details>
<details>
<summary><b>¿Qué significa cuando el usuario efectivo es root, pero el ID de usuario real sigue siendo tu nombre?</b></summary><br>
El **ID de usuario real** es quién eres realmente (el usuario propietario del proceso), y el **ID de usuario efectivo** es lo que el sistema operativo mira para decidir si tienes permiso para hacer algo (la mayoría de las veces, hay algunas excepciones).
Cuando inicias sesión, el shell de inicio establece tanto el **ID de usuario real como el efectivo** al mismo valor (tu **ID de usuario real**) según lo proporcionado por el archivo de contraseñas.
Si, por ejemplo, ejecutas setuid, y además de ejecutarse como otro usuario (p. ej., **root**) se supone que el programa setuid también haga algo en tu nombre.
Después de ejecutar setuid, tendrá tu **ID real** (ya que eres el propietario del proceso) y el ID de usuario efectivo del propietario del archivo (por ejemplo **root**) ya que es setuid.
Usemos el caso de `passwd`:```bash
-rwsr-xr-x 1 root root 45396 may 25 2012 /usr/bin/passwd
Usar logrotate es la forma habitual de tratar con archivos de registro. Pero en lugar de añadir contenido a /etc/logrotate.conf deberías añadir tu propio trabajo a /etc/logrotate.d/, de lo contrario tendrías que revisar más diferencias de archivos de configuración durante las actualizaciones de versión.
Si se está escribiendo activamente en él, realmente no tienes mucho que puedas hacer mediante truncamiento. Tus únicas opciones son truncar el archivo:```bash : >/var/log/massive-logfile
Es muy útil, ya que trunca el archivo sin interrumpir los procesos.
Recursos útiles:
- [How to Use logrotate to Manage Log Files](https://www.linode.com/docs/uptime/logs/use-logrotate-to-manage-log-files/)
- [System logging](https://www.ibm.com/developerworks/library/l-lpic1-108-2/index.html)
</details>
<details>
<summary><b>¿Cómo crea, gestiona y elimina el kernel de Linux los procesos en el sistema? ***</b></summary><br>
Por completar.
Recursos útiles:
- [Linux Processes](https://www.tldp.org/LDP/tlk/kernel/processes.html)
</details>
<details>
<summary><b>Explique la información seleccionada que se puede ver en <code>top</code> y <code>htop</code>. ¿Cómo diagnosticar problemas de carga, alto tiempo de usuario y falta de memoria con estas herramientas? ***</b></summary><br>
Por completar.
Recursos útiles:
- [top explained visually](https://www.svennd.be/top-explained-visually/)
- [htop Explained Visually](https://codeahoy.com/2017/01/20/hhtop-explained-visually/)
- [Explanation of everything you can see in htop/top on Linux](https://peteris.rocks/blog/htop/)
</details>
<details>
<summary><b>¿Cómo reconocerías un proceso que está acaparando recursos? </b></summary><br>
`top` funciona bastante bien, siempre que mires los números correctos.
- **M** Ordena por uso de memoria residente actual
- **T** Ordena por uso total (o acumulativo) de CPU
- **P** Ordena por uso actual de CPU (esta es la actualización por defecto)
- **?** Muestra un resumen de uso para todos los comandos de top
Esta es una información muy importante para obtener al solucionar problemas de por qué un proceso de computadora se ejecuta lentamente y para tomar decisiones sobre qué procesos matar/software desinstalar.
Recursos útiles:
- [How to find the process(es) which are hogging the machine](https://superuser.com/questions/326300/how-to-find-the-processes-which-are-hogging-the-machine)
</details>
<details>
<summary><b>Necesitas actualizar el servicio <code>ntpd</code> en 200 servidores. ¿Cuál es la mejor manera de actualizar todos a la última versión?</b></summary><br>
Usando un enfoque de **Infraestructura como Código**, hay varias buenas formas:
1. **Modelo de Gestión de Cambios por Sincronización de Configuración**:
Existen Herramientas de Gestión de Configuración (Ansible, Chef, Puppet, Saltstack, ...), que se pueden utilizar para actualizar automáticamente el servicio `ntpd` en todos los servidores. Para mantener los sistemas estables, los paquetes del sistema en los servidores generalmente se actualizan automáticamente solo con actualizaciones de seguridad. Las versiones mayores o menores de los paquetes suelen estar bloqueadas por versión en las definiciones de configuración para evitar una mala configuración del servicio. El cambio se implementa cambiando la versión de `ntpd` en la definición de configuración.
Con este enfoque, es importante tener cuidado al implementar cambios en la infraestructura de forma masiva. La canalización de implementación debe incluir pruebas Unitarias, de Integración y de Sistema, y eventualmente implementarse primero en un entorno de Prueba (Staging) para validar la configuración. Si las pruebas demuestran la corrección de la configuración, la implementación debe realizarse mediante un lanzamiento incremental con capacidad de reversión en caso de errores o fallos.
2. **Modelo de Servidores Inmutables**:
En el modelo de Servidor Inmutable, toda la unidad (servidor, contenedor) se reemplaza por una nueva imagen actualizada en lugar de realizar cambios en el servidor en ejecución (esto elimina la deriva de configuración). Con este enfoque, generalmente se crea la imagen del servidor con herramientas como Packer o Docker con Dockerfile. Luego, esta imagen se prueba e implementa de manera similar a la opción anterior (1.), pero ahora utilizando técnicas como el Lanzamiento Canario (Canary Release), que también tiene capacidad de implementación incremental y reversión.
Recursos útiles:
- [Infrastructure as a Code - Chapter 8: Patterns for Updating and Changing Servers](http://shop.oreilly.com/product/0636920039297.do)
</details>
<details>
<summary><b>¿Cómo configurar permanentemente <code>$PATH</code> en Linux/Unix? ¿Por qué es tan importante esta variable? ***</b></summary>
Por completar.
</details>
<details>
<summary><b>Cuando tu servidor arranca, aparecen algunos errores en la consola. ¿Cómo examinar los mensajes de arranque y dónde se almacenan?</b></summary><br>
Tu consola tiene dos tipos de mensajes:
- **generados por el kernel** (a través de printk)
- **generados por el espacio de usuario** (generalmente tu sistema de inicio)
Los mensajes del kernel siempre se almacenan en el búfer **kmsg**, visibles mediante el comando `dmesg`. También suelen copiarse en tu **syslog**. Esto también se aplica a los mensajes del espacio de usuario escritos en `/dev/kmsg`, aunque son bastante raros.
Mientras tanto, cuando el espacio de usuario escribe su vistoso texto de estado de arranque en `/dev/console` o `/dev/tty1`, no se almacena en ningún lado. Simplemente va a la pantalla y eso es todo.
`dmesg` se utiliza para revisar los mensajes de arranque contenidos en el búfer circular del kernel. Un búfer circular es un búfer de tamaño fijo donde cualquier dato nuevo agregado sobrescribe los datos más antiguos.
Muestra operaciones una vez que el proceso de arranque ha finalizado, como las opciones de línea de comandos pasadas al kernel; componentes de hardware detectados, eventos cuando se agrega un nuevo dispositivo USB, o errores como fallo de NIC (Tarjeta de Interfaz de Red) y los controladores informan que no se ha detectado actividad en el enlace de la red, y mucho más.
Si el registro del sistema se realiza a través del componente journal, debes usar `journalctl`. Muestra mensajes que incluyen mensajes del kernel y de arranque; mensajes de syslog o de varios servicios.
Los problemas/errores de arranque requieren que un administrador del sistema revise ciertos archivos importantes junto con comandos particulares (manejados de manera diferente por diferentes versiones de Linux):
- `/var/log/boot.log` - registro de arranque del sistema, contiene todo lo que sucedió durante el arranque
- `/var/log/messages` - almacena mensajes globales del sistema, incluidos los mensajes registrados durante el arranque
- `/var/log/dmesg` - contiene información del búfer circular del kernel
Recursos útiles:
- [How to view all boot messages in Linux after booting? (original)](https://superuser.com/questions/1188407/how-to-view-all-boot-messages-in-linux-after-booting)
- [Differences in /var/log/{syslog,dmesg,messages} log files](https://superuser.com/questions/565927/differences-in-var-log-syslog-dmesg-messages-log-files)
- [How can the messages that scroll by when booting a Debian system be reviewed later?](https://serverfault.com/questions/516411/all-debian-boot-messages)
</details>
<details>
<summary><b>El uso de swap es demasiado alto. ¿Cuáles son las razones para esto y cómo resolver problemas de swapping?</b></summary><br>
El espacio de **Swap** es una cantidad restringida de memoria física asignada para uso del sistema operativo cuando la memoria disponible se ha utilizado por completo. Es una gestión de memoria que implica intercambiar secciones de memoria hacia y desde el almacenamiento físico.
Si el sistema necesita más recursos de memoria y la RAM está llena, las páginas inactivas en la memoria se mueven al espacio de swap. Si bien el espacio de swap puede ayudar a máquinas con poca RAM, no debe considerarse un reemplazo de más RAM. El espacio de **Swap** se encuentra en discos duros, que tienen un tiempo de acceso más lento que la memoria física.
La carga de trabajo aumenta la demanda de RAM. Estás ejecutando una carga de trabajo que requiere más memoria. El uso completo del swap indica eso. Además, cambiar `swappiness` a **1** podría no ser una decisión sabia. Establecer `swappiness` en **1** no indica que no se realizará swapping. Solo indica cuán agresivo será el kernel con respecto al swapping, no lo elimina. El swapping ocurrirá si es necesario.
- **Aumentar el tamaño del espacio de swap** - en primer lugar, tendrías un mayor uso del disco. Si tus discos no son lo suficientemente rápidos para seguir el ritmo, entonces tu sistema podría terminar en thrashing, y experimentarías ralentizaciones a medida que los datos se intercambian dentro y fuera de la memoria. Esto resultaría en un cuello de botella.
- **Agregar más RAM** - la solución real es agregar más memoria. No hay sustituto para la RAM, y si tienes suficiente memoria, intercambiarás menos.
Para monitorear el uso del espacio de swap:
- `cat /proc/swaps` - para ver el tamaño total y usado de swap
- `grep SwapTotal /proc/meminfo` - para mostrar el espacio total de swap
- `free` - para mostrar la cantidad de memoria del sistema libre y usada (también swap)
- `vmstat` - para verificar estadísticas de swapping
- `top`, `htop` - para verificar el uso del espacio de swap
- `atop` - para mostrar si tu sistema está sobrecomprometiendo memoria
- o usar un comando de shell en una línea para listar todas las aplicaciones con la cantidad de espacio de swap que están usando en kilobytes:```bash
for _fd in /proc/*/status ; do
awk '/VmSwap|Name/{printf $2 " " $3}END{ print ""}' $_fd
done | sort -k 2 -n -r | less
En Linux y otros sistemas operativos tipo Unix, los archivos nuevos se crean con un conjunto predeterminado de permisos. Específicamente, los permisos de un archivo nuevo pueden restringirse de una manera específica aplicando una «máscara» de permisos llamada umask. El comando umask se utiliza para establecer esta máscara o para mostrar su valor actual.
Cambiar permanentemente (establecer, por ejemplo, umask 02):
~/.profile~/.bashrc~/.zshrc~/.cshrcRecursos útiles:
En el sistema de archivos, los archivos están representados por inodos (o son varios inodos, no estoy seguro).
Cuando eliminas un archivo, eliminas un enlace al inodo subyacente. El inodo solo se elimina (o se puede eliminar/sobrescribir) cuando se han eliminado todos los enlaces a ese inodo.
Una vez que se ha creado un enlace físico, el enlace apunta al inodo. Eliminar, renombrar o mover el archivo original no afecta al enlace físico, ya que este enlaza con el inodo subyacente. Cualquier cambio en los datos del inodo se refleja en todos los archivos que hacen referencia a ese inodo.
Nota: Los enlaces físicos solo son válidos dentro del mismo sistema de archivos. Los enlaces simbólicos pueden abarcar varios sistemas de archivos porque simplemente son el nombre de otro archivo.
Diferencias:
Recursos útiles:
SUID/GUID es lo mismo?Esta es probablemente una de las cosas más molestas que la gente confunde todo el tiempo. El bit SUID/GUID y el sticky-bit son dos cosas completamente diferentes.
Si ejecutas man chmod puedes leer sobre el SUID y los sticky-bits.
SUID/GUID
Lo que la página de manual anterior intenta decir es que la posición que ocupa el bit x en el rwxrwxrwx para el octal del usuario (primer grupo de rwx) y el octal del grupo (segundo grupo de rwx) puede tomar un estado adicional en el que la x se convierte en una s. Cuando esto ocurre, este archivo, al ejecutarse (si es un programa y no solo un script de shell), se ejecutará con los permisos del propietario o del grupo del archivo.
Por lo tanto, si el archivo es propiedad de root y el bit SUID está activado, el programa se ejecutará como root, incluso si lo ejecutas como un usuario normal. Lo mismo aplica para el bit GUID.
Ejemplos:
sin suid/guid - solo se establecen los bits rwxr-xr-x.```bash
ls -lt b.pl
-rwxr-xr-x 1 root root 179 Jan 9 01:01 b.pl
**suid y bit ejecutable del usuario habilitado (s minúscula)** - los bits `rwsr-x-r-x` están establecidos.```bash
chmod u+s b.pl
ls -lt b.pl
-rwsr-xr-x 1 root root 179 Jan 9 01:01 b.pl
suid habilitado y bit ejecutable deshabilitado (S mayúscula) - los bits rwSr-xr-x están establecidos.```bash
chmod u-x b.pl
ls -lt b.pl
-rwSr-xr-x 1 root root 179 Jan 9 01:01 b.pl
**guid & bit ejecutable del grupo habilitado (s minúscula)** - los bits `rwxr-sr-x` están establecidos.```bash
chmod g+s b.pl
ls -lt b.pl
-rwxr-sr-x 1 root root 179 Jan 9 01:01 b.pl
LC_ALL=C antes de un comando? ¿En qué casos será útil?LC_ALL es la variable de entorno que anula todas las demás configuraciones de localización. Esto establece todas las variables de tipo LC_ a la vez en una configuración regional especificada.
La razón principal para configurar LC_ALL=C antes de un comando es que es suficiente para obtener simplemente una salida en inglés (cambio general de la configuración regional utilizada por el comando).
Por otro lado, también es importante aumentar la velocidad de ejecución de comandos con LC_ALL=C, por ejemplo, grep o fgrep. El uso de la configuración regional LC_ALL=C aumentó nuestro rendimiento y redujo el tiempo de ejecución de comandos.
Por ejemplo, si configuras LC_ALL=en_US.utf8, tu sistema abrirá múltiples archivos del directorio /usr/lib/locale. Para LC_ALL=C se realiza una cantidad mínima de operaciones de apertura y lectura.
Por completar.
1) Requisitos principales - recuerda esto
/var/www/app01/htmlumask para usuarios y suid/sgid (solo para situaciones específicas)2) Directorios de la aplicación
/var/www contiene un directorio para cada sitio web (aislamiento de las apps), p. ej. /var/www/app01, `/var/www/app02````bash
mkdir /var/www/{app01,app02}
**3) Propietario y grupo de la aplicación**
Cada aplicación tiene un **propietario** designado (por ejemplo, **u01-prod**, **u02-prod**) y un **grupo** (por ejemplo, **g01-prod**, **g02-prod**) que se establecen como propietario de todos los archivos y directorios en el directorio del sitio web:```bash
chown -R u01-prod:g01-prod /var/www/app01
chown -R u02-prod:g02-prod /var/www/app02
4) Propietario y grupo de desarrolladores
Todos los usuarios que mantienen el sitio web tienen sus propios grupos y están adjuntos al grupo de la aplicación:```bash id alice uid=2000(alice) gid=4000(alice) groups=8000(g01-prod) id bob uid=2001(bob) gid=4001(bob) groups=8000(g01-prod),8001(g02-prod)
Para establecer los parámetros del kernel en sistemas tipo Unix, primero edite el archivo /etc/sysctl.conf, después de realizar los cambios guarde el archivo y ejecute el comando sysctl -p. Este comando hará que los cambios sean permanentes sin reiniciar la máquina.
Recursos útiles:
/proc es un sistema de archivos virtual que proporciona información detallada sobre el kernel, el hardware y los procesos en ejecución.
Dado que /proc contiene archivos virtuales, se llama sistema de archivos virtual. Estos archivos virtuales tienen cualidades únicas. La mayoría de ellos aparecen listados con tamaño cero bytes.
Archivos virtuales como /proc/interrupts, /proc/meminfo, /proc/mounts y /proc/partitions proporcionan una vista al instante del hardware del sistema. Otros: el archivo /proc/filesystems y el directorio /proc/sys/ proporcionan información y interfaces de configuración del sistema.
Recursos útiles:
Por completar.
Hay tres tipos de journaling disponibles en los sistemas de archivos ext3/ext4:
Un inodo es una estructura de datos en un sistema de archivos en Linux y otros sistemas operativos tipo Unix que almacena toda la información sobre un archivo excepto su nombre y sus datos reales. Una estructura de datos es una forma de almacenar datos para que puedan usarse de manera eficiente.
Un archivo Unix se almacena en dos partes diferentes del disco: los bloques de datos y los inodos. No entraré en detalles sobre superbloques y otra información esotérica. Los bloques de datos contienen el "contenido" del archivo. La información sobre el archivo se almacena en otro lugar: en el inodo.
El número de inodo de un archivo se puede encontrar fácilmente usando el comando ls, que por defecto lista los objetos (es decir, archivos, enlaces y directorios) en el directorio actual (es decir, el directorio en el que el usuario está trabajando actualmente), con su opción -i. Por lo tanto, por ejemplo, lo siguiente mostrará el nombre de cada objeto en el directorio actual junto con su número de inodo:```bash
ls -i
La opción `-i` de `df` le indica que proporcione información sobre los inodos en cada sistema de archivos en lugar de sobre el espacio disponible. Específicamente, le dice a `df` que devuelva para cada sistema de archivos montado el número total de inodos, el número de inodos libres, el número de inodos usados y el porcentaje de inodos usados. Esta opción se puede usar junto con la opción `-h` de la siguiente manera para facilitar la lectura de la salida:```bash
df -hi
Encontrar archivos por inodos
Si conoces el inodo, puedes encontrarlo usando el comando find:```bash find . -inum 435304 -print
**Eliminando archivos con nombres extraños**
A veces se crean archivos con caracteres extraños en el nombre. El sistema de archivos Unix permite cualquier carácter como parte de un nombre de archivo, excepto un nulo (ASCII 000) o una "/". Todos los demás caracteres están permitidos.
Los usuarios pueden crear archivos con caracteres que dificultan ver el directorio o el archivo. Pueden crear el directorio ".. " con un espacio al final, o crear un archivo que tenga un retroceso en el nombre, usando:```bash
touch `printf "aa\bb"`
ls -l muestra atributos de archivo como signos de interrogación. ¿Qué significa esto y qué pasos tomarías para eliminar archivos "zombi" no utilizados?Este problema puede ser más difícil de resolver porque pueden ser necesarios varios pasos; a veces obtienes test/file: Permission denied, test/file: No such file or directory o test/file: Input/output error.
Eso ocurre cuando el usuario no puede ejecutar un stat() en los archivos (lo que requiere permisos de ejecución), pero puede leer las entradas del directorio (lo que requiere acceso de lectura al directorio). Por lo tanto, obtienes una lista de archivos en el directorio, pero no puedes obtener ninguna información sobre los archivos porque no se pueden leer. Si tienes un directorio que tiene permiso de lectura pero no de ejecución, verás esto.
Algunos procesos como rsync generan archivos temporales que se crean y se eliminan rápidamente, lo que causará errores si intentas invocar otros comandos simples de gestión de archivos como rm, mv, etc.
Ejemplo de salida:```bash ?????????? ? ? ? ? ? sess_kee6fu9ag7tiph2jae
1) cambiar permisos: `chmod 0777 sess_kee6fu9ag7tiph2jae` e intenta eliminar
2) cambiar propietario: `chown root:root sess_kee6fu9ag7tiph2jae` e intenta eliminar
3) cambiar permisos y propietario para el directorio: `chmod -R 0777 dir/ && chown -R root:root dir/` e intenta eliminar
4) recrear archivo: `touch sess_kee6fu9ag7tiph2jae` e intenta eliminar
5) presta atención a otros procesos en ejecución en el servidor, por ejemplo `rsync`, a veces puedes ver esto como un error transitorio cuando un servidor NFS está muy sobrecargado
6) encontrar el inodo del archivo: `ls -i`, e intenta eliminar: `find . -inum <inode_num> -delete`
7) remonta (si es posible) tu sistema de archivos
8) inicia el sistema en modo monousuario y repara tu sistema de archivos con `fsck`
Recursos útiles:
- [Signos de interrogación mostrados en ls del directorio. También errores de E/S.](https://serverfault.com/questions/65616/question-marks-showing-in-ls-of-directory-io-errors-too)
</details>
<details>
<summary><b>¿LVM o no LVM? ¿Qué beneficios proporciona?</b></summary><br>
- LVM facilita bastante mover sistemas de archivos
- puedes extender un grupo de volúmenes a un nuevo volumen físico
- mover cualquier número de volúmenes lógicos de un volumen físico antiguo
- eliminar ese volumen del grupo de volúmenes sin necesidad de desmontar ninguna partición
- también puedes hacer instantáneas de volúmenes lógicos para realizar copias de seguridad
- LVM tiene soporte de mirroring incorporado, por lo que puedes tener un volumen lógico duplicado en múltiples volúmenes físicos
- LVM incluso soporta TRIM
Recursos útiles:
- [¿Qué es LVM y para qué se usa?](https://askubuntu.com/questions/3596/what-is-lvm-and-what-is-it-used-for)
</details>
<details>
<summary><b>¿Cómo aumentar el tamaño de una partición LVM?</b></summary><br>
Usa el comando `lvextend` para redimensionar la partición LVM.
- extendiendo el tamaño en 500MB:```bash
lvextend -L +500M /dev/vgroup/lvolume
Por ejemplo (con el comando visudo):```bash
user1 ALL=(user2) NOPASSWD: /opt/scripts/bin/generate.sh
¡Las rutas de los comandos deben ser absolutas! Luego ejecuta `sudo -u user2 /opt/scripts/bin/generate.sh` desde un shell de user1.
</details>
<details>
<summary><b>¿Cómo verificar si se está ejecutando como root en un script bash? ¿Qué debes tener en cuenta?</b></summary><br>
En un script bash, tienes varias formas de verificar si el usuario en ejecución es root.
Como advertencia, no verifiques si un usuario es root utilizando el nombre de usuario root. Nada garantiza que el usuario con ID 0 se llame root. Es una convención muy fuerte que se sigue ampliamente, pero cualquiera podría renombrar al superusuario con otro nombre.
Creo que la mejor manera al usar bash es usar `$EUID` porque `$UID` podría cambiarse y no reflejar al usuario real que ejecuta el script.```bash
if (( $EUID != 0 )); then
echo "Please run as root"
exit
fi
nobody? ¿Cuáles son las diferencias al ejecutar el servicio httpd como nobody y como www-data?En muchas variantes de Unix, nobody es el nombre convencional de una cuenta de usuario que no posee archivos, no pertenece a grupos privilegiados y no tiene más capacidades que las que cualquier otro usuario tiene.
Es común ejecutar demonios como nobody, especialmente servidores, para limitar el daño que podría causar un usuario malintencionado que obtuviera control sobre ellos.
Sin embargo, la utilidad de esta técnica se reduce si más de un demonio se ejecuta de esta manera, porque entonces tomar el control de un demonio proporcionaría el control de todos ellos. La razón es que los procesos propiedad de nobody tienen la capacidad de enviarse señales entre sí e incluso depurarse mutuamente, lo que les permite leer o incluso modificar la memoria del otro.
¿Cuándo debería usar la cuenta nobody?
Cuando no se requieren permisos para las operaciones de un programa. Esto es especialmente notable cuando no va a haber actividad de disco en absoluto.
Un ejemplo del mundo real es memcached (una caché/base de datos/cosa en memoria clave-valor), que se ejecuta en mi computadora y en mi servidor bajo la cuenta nobody. ¿Por qué? Porque simplemente no necesita permisos y darle una cuenta que sí tuviera acceso de escritura a archivos sería un riesgo innecesario.
El comando que necesita se llama tee:
foo | tee output.file
Por ejemplo, si solo le interesa stdout:
ls -a | tee output.file
Si quiere incluir stderr, haga:
programa [argumentos...] 2>&1 | tee archivo_salida
2>&1 redirige el canal 2 (stderr/error estándar) al canal 1 (stdout/salida estándar), de modo que ambos se escriben como stdout. También se dirigen al archivo de salida indicado gracias al comando tee.
Además, si desea añadir al archivo de registro, use tee -a de la siguiente manera:
programa [argumentos...] 2>&1 | tee -a archivo_salida
./script o bash script?| El tipo de capítulo | Número de preguntas | Descripción breve |
|---|
| Introducción | ||
| 🔸 Preguntas Simples | 14 questions | Relajadas, divertidas y simples - son excelentes para empezar todo. |
| Conocimiento General | ||
| 🔸 Administrador Junior | 65 questions | Razonablemente simples y directas, basadas en conocimientos básicos. |
| 🔸 Administrador Regular | 94 questions | El nivel medio de preguntas si tienes un conocimiento sólido. |
| 🔸 Administrador Senior | 99 questions | Preguntas difíciles y acertijos. Pruébalo si quieres ser bueno. |
| Conocimiento Secreto | ||
| 🔸 Administrador Gurú | 12 questions | Preguntas realmente profundas para conocer al Administrador Gurú. |
bash-completion - contiene varias reglas de completado predefinidas para el shellConsejos y trucos
CTRL + Rpopd/pushd y otros builtins del shell que te permiten manipular la pila de directoriosCTRL + U, CTRL + E!* - todos los argumentos del último comando!! - todo el último comando!ssh - último comando que comienza con sshRecursos útiles:
Para obtener información detallada, incluyendo nombre de usuario, terminal, número IP del equipo de origen, la hora de inicio de la sesión, cualquier tiempo de inactividad, ciclos de CPU del proceso, ciclos de CPU del trabajo y el comando en ejecución actual, ingrese:```bash
w
También importante para mostrar una lista de los últimos usuarios que iniciaron sesión, ingrese:```bash
# It uses /var/log/wtmp.
last
Recursos útiles:
o```bash grep -e "string1" -e "string2" filename
Útiles recursos:
- [¿Qué es grep y cómo se usa? (original)](https://kb.iu.edu/d/afiy)
</details>
<details>
<summary><b>Explica los comandos de contenido de archivos junto con su descripción.</b></summary><br>
- `head`: para verificar el inicio de un archivo.
- `tail`: para verificar el final del archivo. Es lo opuesto al comando head.
- `cat`: se usa para ver, crear, concatenar archivos.
- `more`: se usa para mostrar el texto en la ventana del terminal en forma de paginador.
- `less`: se usa para ver el texto en dirección hacia atrás y también proporciona movimiento línea por línea.
Recursos útiles:
- [Ver archivos de texto desde el indicador del shell](https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/4/html/Step_by_Step_Guide/s1-viewingtext-terminal.html)
</details>
<details>
<summary><b>Señales POSIX SIGHUP, SIGINT, SIGKILL y SIGTERM. Explicar.</b></summary><br>
- **SIGHUP** - se envía a un proceso cuando su terminal de control se cierra. Originalmente fue diseñado para notificar al proceso de una caída de línea serie (un colgado). Muchos demonios recargan sus archivos de configuración y reabren sus archivos de registro en lugar de salir al recibir esta señal.
- **SIGINT** - se envía a un proceso por su terminal de control cuando un usuario desea interrumpir el proceso. Esto se inicia típicamente presionando `Ctrl+C`, pero en algunos sistemas se puede usar el carácter 'delete' o la tecla 'break'.
- **SIGKILL** - se envía a un proceso para que termine inmediatamente (kill). A diferencia de **SIGTERM** y **SIGINT**, esta señal no puede ser capturada ni ignorada, y el proceso receptor no puede realizar ninguna limpieza al recibir esta señal.
- **SIGTERM** - se envía a un proceso para solicitar su terminación. A diferencia de la señal **SIGKILL**, puede ser capturada e interpretada o ignorada por el proceso. Esto permite al proceso realizar una terminación ordenada liberando recursos y guardando el estado si es apropiado. **SIGINT** es casi idéntica a **SIGTERM**.
Recursos útiles:
- [Señales POSIX](https://dsa.cs.tsinghua.edu.cn/oj/static/unix_signal.html)
- [Introducción a la programación de señales en Unix](http://titania.ctie.monash.edu.au/signals/)
</details>
<details>
<summary><b>¿Qué hace el comando <code>kill</code>?</b></summary><br>
En los sistemas operativos Unix y similares a Unix, `kill` es un comando utilizado para enviar una señal a un proceso. Por defecto, el mensaje enviado es la señal de terminación, que solicita que el proceso salga. Pero `kill` es un nombre un tanto inapropiado; la señal enviada puede no tener nada que ver con matar el proceso.
Recursos útiles:
- [Dominando el comando 'Kill' en Linux](https://www.maketecheasier.com/kill-command-in-linux/)
</details>
<details>
<summary><b>¿Cuál es la diferencia entre <code>rm</code> y <code>rm -rf</code>?</b></summary><br>
`rm` solo elimina los archivos nombrados (y no directorios). Con `-rf` como dices:
- `-r`, `-R`, `--recursive` elimina recursivamente el contenido de un directorio, incluyendo archivos ocultos y subdirectorios
- `-f`, `--force` ignora archivos inexistentes, nunca pregunta
Recursos útiles:
- [¿Cuál es la diferencia entre `rm -r` y `rm -f`?](https://superuser.com/questions/1126206/what-is-the-difference-between-rm-r-and-rm-f)
</details>
<details>
<summary><b>¿Cómo hago <code>grep</code> de forma recursiva? Explica con varios ejemplos. ***</b></summary>
Por completar.
</details>
<details>
<summary><b><code>archive.tgz</code> tiene ~30 GB. ¿Cómo listas su contenido y extraes solo un archivo?</b></summary><br>```bash
# list of content
tar tf archive.tgz
# extract file
tar xf archive.tgz filename
Recursos útiles:
r - para permiso de lecturaw - para permiso de escrituraRecursos útiles:
Recursos útiles:
Una subred no es más que un rango de direcciones IP que ayuda a los hosts a comunicarse a través de las capas 2 y 3. Cada subred no requiere su propia VLAN. Las VLAN se implementan para aislamiento (son un entorno aislado para la comunicación de capa dos, dos sistemas de dos VLAN diferentes no pueden comunicarse, pero se puede hacer mediante enrutamiento entre VLAN), facilidad de gestión y seguridad.
Recursos útiles:
| SERVICIO | PUERTO |
|---|---|
| SMTP | 25 |
| FTP | 20 para transferencia de datos y 21 para establecimiento de conexión |
| DNS | 53 |
| DHCP | 67/UDP para servidor DHCP, 68/UDP para cliente DHCP |
| SSH | 22 |
Recursos útiles:
Puedes (a veces) resolver una dirección IP de vuelta a un nombre de host. La dirección IP se puede almacenar contra un registro PTR. Luego puedes hacer:```bash dig A
Para buscar la dirección IPv4 de un host, o:```bash
dig AAAA <hostname>
Para buscar la dirección IPv6 de un anfitrión, o:```bash dig PTR ZZZ.YYY.XXX.WWW.in-addr.arpa.
Para buscar el nombre de host de la dirección IPv4 `WWW.XXX.YYY.ZZZ` (nota: los octetos están invertidos), o:```bash
dig PTR b.a.9.8.7.6.5.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa.
Recursos útiles:
Cuando user2 quiere cambiar su contraseña, ejecuta /usr/bin/passwd.
El RUID será user2 pero el EUID de ese proceso será root.
user2 solo puede usar passwd para cambiar su propia contraseña, porque internamente passwd verifica el RUID y, si no es root, sus acciones estarán limitadas a la contraseña del usuario real.
Es necesario que el EUID se convierta en root en el caso de passwd porque el proceso necesita escribir en /etc/passwd y/o /etc/shadow.
Recursos útiles:
Recursos útiles:
| Umask | Resultado en archivo | Resultado en directorio |
|---|---|---|
| 000 | 666 rw- rw- rw- | 777 rwx rwx rwx |
| 002 | 664 rw- rw- r-- | 775 rwx rwx r-x |
| 022 | 644 rw- r-- r-- | 755 rwx r-x r-x |
| 027 | 640 rw- r-- --- | 750 rwx r-x --- |
| 077 | 600 rw---- --- | 700 rwx --- --- |
| 277 | 400 r-- --- --- | 500 r-x --- --- |
Recursos útiles:
guid habilitado y bit ejecutable deshabilitado (S mayúscula) - los bits rwxr-Sr-x están establecidos.```bash
chmod g-x b.pl
ls -lt b.pl
-rwxr-Sr-x 1 root root 179 Jan 9 01:01 b.pl
**bit adhesivo**
El bit adhesivo, por otro lado, se denota como `t`, como en el directorio `/tmp`:```bash
ls -l /|grep tmp
drwxrwxrwt. 168 root root 28672 Jun 14 08:36 tmp
Este bit debería haberse llamado siempre el bit de eliminación restringida dado que eso es lo que realmente connota. Cuando este bit de modo está habilitado, hace que un directorio permita que los usuarios solo eliminen archivos y directorios dentro de él de los cuales sean propietarios.
Recursos útiles:
Si deseas restaurar todas tus configuraciones regionales normales (originales) para la sesión:```bash LC_ALL=
Si `LC_ALL` no funciona, intenta usar `LANG` (si eso aún no funciona, intenta `LANGUAGE`):```bash
LANG=C date +%A
Monday
Recursos útiles:
Por lo tanto, el usuario **alice** tiene privilegios estándar para `/var/www/app01` y el usuario **bob** tiene privilegios estándar para `/var/www/app01` y `/var/www/app02`.
**5) Propietario y grupo del servidor web**
Cualquier archivo o directorio que necesite ser escrito por el servidor web tiene su propietario. Si el servidor web es Apache, el propietario/grupo predeterminado son **apache:apache** o **www-data:www-data** y para Nginx será **nginx:nginx**. No cambie esta configuración.
Si las aplicaciones funcionan con servidores de aplicaciones como **uwsgi** o **php-fpm**, se debe establecer el usuario y grupo adecuados (por ejemplo, para **app01** será **u01-prod:g01-prod**) en archivos de configuración específicos.
**6) Permisos**
Establezca los permisos adecuadamente con **Listas de Control de Acceso**:```bash
# For web server
setfacl -Rdm "g:apache:rwx" /var/www/app01
setfacl -Rm "g:apache:rwx" /var/www/app01
# For developers
setfacl -Rdm "g:g01-prod:rwx" /var/www/app01
setfacl -Rm "g:g01-prod:rwx" /var/www/app01
Si usas SELinux recuerda el contexto de seguridad:```bash chcon -R system_u:object_r:httpd_sys_content_t /var/www/app01
**7) Errores de seguridad**
- Propietario **root** para archivos y directorios
- **root** nunca ejecuta archivos en el directorio del sitio web, y no debería crear archivos allí
- permisos demasiado amplios como **777** que permiten que algunos archivos críticos sean escribibles y legibles por todos
- evite crear scripts de mantenimiento u otros archivos críticos con suid root
Si permite que su sitio modifique los archivos que forman el código que ejecuta su sitio, facilita mucho que alguien tome el control de su servidor.
Una herramienta de carga de archivos permite a los usuarios subir un archivo con cualquier nombre y cualquier contenido. Esto permite a un usuario subir un script PHP de reenvío de correo a su sitio, que pueden colocar donde quieran para convertir su servidor en una máquina que reenvíe correo comercial no solicitado. Este script también podría usarse para leer todas las direcciones de correo electrónico de su base de datos, u otra información personal.
Si el usuario malicioso puede subir un archivo con cualquier nombre pero no controlar el contenido, entonces podría cargar fácilmente un archivo que sobrescriba su `index.php` (u otro archivo crítico) y dañe su sitio.
Recursos útiles:
- [¿Cómo configurar permisos de Linux para la carpeta WWW?](https://serverfault.com/questions/124800/how-to-setup-linux-permissions-for-the-www-folder)
- [¿Qué permisos deberían tener mis archivos/carpetas del sitio web en un servidor web Linux?](https://serverfault.com/questions/357108/what-permissions-should-my-website-files-folders-have-on-a-linux-webserver)
- [Peligros de seguridad de los programas setgid](https://www.agwa.name/blog/post/security_pitfalls_of_setgid_programs)
</details>
<details>
<summary><b>¿Qué pasos tomará init cuando ejecutes <code>telinit 1</code> desde el nivel de ejecución 3? ¿Cuál será el resultado final de esto? Si usas <code>telinit 6</code> en lugar del comando <code>reboot</code>, ¿se reiniciará tu servidor? ***</b></summary><br>
Por completar.
Recursos útiles:
- [¿Qué diferencias habrá si uso “telinit 6” en lugar del comando “reboot” para reiniciar mi computadora?](https://unix.stackexchange.com/questions/434560/what-differences-it-will-make-if-i-use-telinit-6-instead-of-reboot-command)
</details>
<details>
<summary><b>¡Olvidé la contraseña de root! ¿Qué hago en BSD? ¿Cuál es el propósito de arrancar en modo monousuario?</b></summary><br>
Reinicia el sistema, escribe `boot -s` en el prompt `Boot:` para entrar en **modo monousuario**.
Ante la pregunta sobre el shell a usar, pulsa `Enter` que mostrará un prompt `#`.
Introduce `mount -urw /` para remontar el sistema de archivos raíz en lectura/escritura, luego ejecuta `mount -a` para remontar todos los sistemas de archivos.
Ejecuta `passwd root` para cambiar la contraseña de root y luego ejecuta `exit` para continuar el arranque.
**El modo monousuario** básicamente debería permitirte iniciar sesión con acceso root y cambiar casi cualquier cosa. Por ejemplo, podrías usar el modo monousuario cuando estés restaurando una base de datos maestra dañada o una base de datos del sistema, o cuando estés cambiando opciones de configuración del servidor (por ejemplo, recuperación de contraseña).
Recursos útiles:
- [Restablecer o recuperar contraseña de root en FreeBSD](https://www.cyberciti.biz/tips/howto-freebsd-reset-recover-root-password.html)
- [Definición de modo monousuario](http://www.linfo.org/single_user_mode.html)
</details>
<details>
<summary><b>¿Cómo podrías modificar un archivo de texto sin invocar un editor de texto?</b></summary><br>
Por ejemplo:<br>```bash
# cat >filename ... - overwrite file
# cat >>filename ... - append to file
cat > filename << __EOF__
data
__EOF__
Ahora qué qué sucede cuando usas el comando ls:```bash
ls
aa?b
ls | grep 'a'
ab
Tenga en cuenta que cuando `ls` envía el resultado a una terminal, coloca un "**?**" en el nombre del archivo para mostrar un carácter no imprimible.
Puede deshacerse de este archivo usando `rm -i *` y le pedirá confirmación antes de eliminar cada archivo. Pero también puede usar `find` para eliminar el archivo, una vez que conozca el número de inodo.```bash
ls -i
435304 aa?b
find . -inum 435304 -delete
Recursos útiles:
y `resize2fs` o `xfs_growfs` para redimensionar el sistema de archivos:
- para sistemas de archivos ext:```bash
resize2fs /dev/vgroup/lvolume
Recursos útiles:
- [Extender un volumen lógico](https://www.tldp.org/HOWTO/LVM-HOWTO/extendlv.html)
</details>
<details>
<summary><b>¿Qué es un proceso zombie/defunct?</b></summary><br>
Es un proceso que ha completado su ejecución (mediante la llamada al sistema `exit`) pero aún tiene una entrada en la tabla de procesos: es un proceso en el "**estado terminado**".
Los procesos marcados como **defunct** son procesos muertos (los llamados "zombies") que permanecen porque su padre no los ha destruido correctamente. Estos procesos serán destruidos por init si el proceso padre termina.
Recursos útiles:
- [¿Qué es un proceso <defunct> y por qué no se lo mata?](https://askubuntu.com/questions/201303/what-is-a-defunct-process-and-why-doesnt-it-get-killed)
</details>
<details>
<summary><b>¿Cuál es la forma adecuada de actualizar/mejorar un sistema en producción? ¿Automatizas estos procesos? ¿Estableces tiempo de inactividad para ellos? Escribe recomendaciones. ***</b></summary><br>
Por completar.
</details>
<details>
<summary><b>Tu amigo durante la configuración del servidor MySQL te preguntó: <i>¿Debería ejecutar <code>sudo mysql_secure_installation</code> después de instalar mysql?</i> ¿Qué opinas al respecto?</b></summary><br>
Sería mejor si ejecutas el comando, ya que proporciona muchas opciones de seguridad como:
- Puedes establecer una contraseña para las cuentas root
- Puedes eliminar cuentas root accesibles desde fuera del host local
- Puedes eliminar cuentas de usuario anónimas
- Puedes eliminar la base de datos de prueba, que por defecto puede ser accedida por usuarios anónimos
Recursos útiles:
- [¿Cuál es el propósito de usar mysql_secure_installation?](https://stackoverflow.com/questions/20760908/what-is-purpose-of-using-mysql-secure-installation)
</details>
<details>
<summary><b>Presenta y explica las buenas formas de usar el comando <code>kill</code>.</b></summary><br>
Hablando de matar procesos, nunca uses `kill -9/SIGKILL` a menos que sea absolutamente necesario. Esta señal puede causar problemas debido a su fuerza bruta.
Siempre intenta usar el siguiente procedimiento simple:
- primero, envía la señal **SIGTERM** (`kill -15`) que le dice al proceso que se cierre y generalmente se acepta como la señal a usar cuando se cierra limpiamente (pero recuerda que esta señal puede ser ignorada).
- luego intenta enviar la señal **SIGHUP** (`kill -1`) que se usa comúnmente para indicarle a un proceso que se cierre y reinicie; esta señal también puede ser capturada e ignorada por un proceso.
La gran mayoría de las veces, esto es todo lo que necesitas, y es mucho más limpio.
Recursos útiles:
- [¿Cuándo no debería hacer kill -9 a un proceso?](https://unix.stackexchange.com/questions/8916/when-should-i-not-kill-9-a-process)
- [SIGTERM vs. SIGKILL](https://major.io/2010/03/18/sigterm-vs-sigkill/)
</details>
<details>
<summary><b>¿Qué es el comando <code>strace</code> y cómo debería usarse? Explica un ejemplo de conexión a un proceso ya en ejecución.</b></summary><br>
`strace` es una poderosa herramienta de línea de comandos para depurar y solucionar problemas de programas en sistemas operativos tipo Unix como Linux. Captura y registra todas las llamadas al sistema realizadas por un proceso y las señales recibidas por el proceso.
**Resumen de strace**
`strace` puede verse como un depurador ligero. Permite a un programador/usuario descubrir rápidamente cómo un programa interactúa con el sistema operativo. Lo hace monitoreando llamadas al sistema y señales.
**Usos**
Es útil cuando no tienes código fuente o no quieres molestarte en revisarlo a fondo. También es útil para tu propio código si no tienes ganas de abrir **GDB**, pero solo te interesa entender la interacción externa.
**Ejemplo de adjuntar al proceso**
`strace -p <PID>` - para adjuntar un proceso a strace.
`strace -e trace=read,write -p <PID>` - con esto también puedes rastrear un proceso/programa para un evento, como lectura y escritura (en este ejemplo). Así que aquí imprimirá todos esos eventos que incluyen llamadas al sistema de lectura y escritura por parte del proceso.
Otros ejemplos similares
- `-e trace=network` - rastrear todas las llamadas al sistema relacionadas con la red.
- `-e trace=signal` - rastrear todas las llamadas al sistema relacionadas con señales.
- `-e trace=ipc` - rastrear todas las llamadas al sistema relacionadas con IPC.
- `-e trace=desc` - rastrear todas las llamadas al sistema relacionadas con descriptores de archivo.
- `-e trace=memory` - rastrear todas las llamadas al sistema relacionadas con mapeo de memoria.
Recursos útiles:
- [¿Cómo debería usarse strace? (original)](https://stackoverflow.com/questions/174942/how-should-strace-be-used)
- [¿Cómo se conecta strace a un proceso ya en ejecución? (original)](https://stackoverflow.com/questions/7482076/how-does-strace-connect-to-an-already-running-process)
- [strace: por diversión, beneficio y depuración](http://timetobleed.com/hello-world/)
</details>
<details>
<summary><b>¿Cuándo usarías listas de control de acceso en lugar de o junto con el comando <code>chmod</code>? ***</b></summary><br>
Por completar.
</details>
<details>
<summary><b>¿Qué algoritmos se admiten en el archivo <code>/etc/shadow</code>?</b></summary><br>
Los algoritmos típicos actuales son:
- MD5
- SHA-1 (también llamado SHA)
ambos ¡ya no deberían usarse para fines criptográficos/de seguridad!
- SHA-256
- SHA-512
- SHA-3 (KECCAK fue anunciado como ganador en la competencia por un nuevo algoritmo hash aprobado federalmente en octubre de 2012)
Recursos útiles:
- [¿Cuál es el algoritmo utilizado para cifrar las contraseñas de Linux?](https://crypto.stackexchange.com/questions/40841/what-is-the-algorithm-used-to-encrypt-linux-passwords)
- [¿Cómo encontrar el algoritmo hash utilizado para ofuscar contraseñas?](https://unix.stackexchange.com/questions/430141/how-to-find-the-hashing-algorithm-used-to-obfuscate-passwords)
</details>
<details>
<summary><b>¿Cuál es el uso de ulimit en sistemas tipo Unix?</b></summary><br>
La mayoría de los sistemas operativos tipo Unix, incluidos Linux y BSD, proporcionan formas de limitar y controlar el uso de recursos del sistema como hilos, archivos y conexiones de red por proceso y por usuario. Estos "**ulimits**" evitan que usuarios individuales usen demasiados recursos del sistema.
</details>
<details>
<summary><b>¿Qué son los límites suaves y los límites duros?</b></summary><br>
**Límite duro** es el máximo permitido para un usuario, establecido por el superusuario o root. Este valor se define en el archivo `/etc/security/limits.conf`. El usuario puede aumentar el **límite suave** por sí mismo cuando necesite más recursos, pero no puede establecer el **límite suave** por encima del **límite duro**.
</details>
<details>
<summary><b>Durante la configuración de HAProxy para trabajar con Redis obtienes <code>General socket error (Permission denied)</code> en el registro. SELinux está habilitado. Explica la resolución básica de problemas de SELinux en CLI. ***</b></summary><br>
Recursos útiles:
- [Resolución básica de problemas de SELinux en CLI](https://access.redhat.com/articles/2191331)
</details>
<details>
<summary><b>Has configurado un inicio de sesión con clave RSA pero tu servidor muestra <code>Server refused our key</code> como se esperaba. ¿Dónde buscarías la causa del problema?</b></summary><br>
**Lado del servidor**
Establecer `LogLevel VERBOSE` en el archivo `/etc/ssh/sshd_config` es probablemente lo que necesitas, aunque hay niveles más altos:
Los fallos de autenticación SSH se registran en `/var/log/auth.log`, `/var/log/secure` o `/var/log/audit/audit.log`.
Lo siguiente debería darte solo líneas de registro relacionadas con SSH (por ejemplo):```bash
grep 'sshd' /var/log/auth.log
A continuación, el comando más simple para listar todos los inicios de sesión SSH fallidos es el que se muestra a continuación:```bash grep "Failed password" /var/log/auth.log
también es útil:```bash
grep "Failed\|Failure" /var/log/auth.log
En distribuciones de Linux más recientes, puede consultar el archivo de registro en tiempo real mantenido por el daemon de Systemd mediante el comando journalctl (ssh.service o sshd.service). Por ejemplo:```bash
journalctl _SYSTEMD_UNIT=ssh.service | egrep "Failed|Failure"
**Client side**
También deberías ejecutar el cliente SSH con `-v|--verbose` — está en el primer nivel de verbosidad. Luego, puedes habilitar verbosidad adicional (niveles 2 y 3) para aún más mensajes de depuración como se muestra con, por ejemplo, `-vv`.
Recursos útiles:
- [Habilitar el modo de depuración en SSH para solucionar problemas de conectividad](https://www.tecmint.com/enable-debugging-mode-in-ssh/)
</details>
<details>
<summary><b>¿Por qué la mayoría de las distribuciones usan ext4, en lugar de XFS u otros sistemas de archivos? ¿Por qué hay tantos? ***</b></summary><br>
Para completar.
</details>
<details>
<summary><b>Un gerente de proyecto necesita un nuevo SQL Server. ¿Qué le preguntas? ***</b></summary><br>
Quiero que el DBA haga preguntas como:
- ¿Qué tan grande será la base de datos? (si podemos agregar la base de datos a un servidor existente)
- ¿Qué tan crítica es la base de datos? (acerca de clustering, recuperación ante desastres, alta disponibilidad)
</details>
<details>
<summary><b>Crear un archivo con 100 líneas con valores aleatorios.</b></summary><br>
Por ejemplo:```bash
cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 100 > /path/to/file
Un buen ejemplo también son los servidores web. Imagine si Apache se ejecutara como root y alguien encontrara una forma de enviar comandos personalizados a la consola a través de Apache, tendría acceso a todo su sistema.
La cuenta nobody también se utiliza como un shell restringido para dar a los usuarios acceso al sistema de archivos sin un shell real como bash. Esto debería evitar que puedan ejecutar cosas.
nobody o www-data para httpd (Apache)
Al iniciar, Apache necesita acceso root, pero rápidamente lo abandona y asume la identidad de un usuario no privilegiado. Este usuario puede ser nobody, apache o www-data.
Varias aplicaciones usan el usuario nobody por defecto. Por ejemplo, probablemente nunca quiera que el servicio Apache sobrescriba archivos que pertenecen a bind. Tener una cuenta por servicio suele ser una muy buena idea.
Hacer que Apache se ejecute como nobody:nobody es bastante fácil, solo hay que actualizar la configuración de usuario y grupo. Pero como mencioné anteriormente, no recomiendo ese usuario/grupo en particular. Es completamente posible que en el futuro sienta la tentación de agregar un servicio al sistema que también se ejecute como nobody, y olvide que le ha dado acceso de escritura en el sistema de archivos al usuario nobody.
Si de alguna manera, nobody se viera comprometido, podría tener un impacto mayor que si fuera un usuario aislado de la aplicación, como www-data. Por supuesto, mucho de esto dependerá de los permisos de archivos y grupos. nobody usa los permisos de otros, mientras que un usuario específico de la aplicación podría configurarse para permitir acceso de lectura a archivos, pero otros aún podrían estar denegados.
Recursos útiles: