Linux: script para crear usuarios automáticamente con contraseñas aleatorias desde una lista dada en CSV.

Vamos con un script para automatizar tareas. Tenemos un CSV, le llamaremos user.csv, con los siguientes datos: Nombre, Primer Apellido y Usuario. Algo tal que así

Manuel,Garcia,ManuG1
Pedro,Rodriguez,PredroR2
Maria,Abalo,MariaA45
Josefa,Perez,JosefP21
Marta,Rios,MartaR91

La idea del script es la siguiente: recorre el fichero csv y crea a los usuarios con ese nombre y apellido y ese código de usuario. Asigna una contraseña generada de forma aleatoria y redirige la salida a un fichero para poder notificar a los usuarios creados su usuario y contraseña.

#!/bin/bash

OLDIFS=$IFS
IFS=","

while read firstname lastname userid 
do 
     PS=$(openssl rand -base64 12)   
     useradd -c "${firstname} ${lastname}" -p $PS -d /home/"${userid}" -s /bin/bash "${userid}"            
     echo "Usuario: ${userid} - Contraseña: $PS ....." >> resultado.txt 
done < user.csv

La opción de crear los usuarios con contraseña no es recomendable en todos los ámbitos por temas de seguridad, lo he hecho en este caso porque el ejemplo real en el que lo hice lo había requerido así el cliente, pero según la política y el contexto de seguridad no es algo recomendable en todos los casos porque podrían ser vistas por algún usuario no autorizado, así que aunque la generes así es mejor obligar a los usuarios a cambiarla. Para crearlo sin contraseña en la instrucción useradd quita el parámetro -p $PS, la línea de encima que genera el password (que ya sería inútil) y el $PS en la salida.

Hacer que un fichero en Linux no pueda ser borrado ni modificado.

A veces nos interesa que en nuestro sistema Linux haya algún fichero inmutable, que no pueda ser borrado o modificado incluso aunque se intente con permisos de superusuario. ¿Es posible? Sí, con el comando chattr y usando la opción +i. Por ejemplo:

chattr +i nombre_del_fichero

Si lo aplicamos a una carpeta esto haría no solo que la carpeta no pueda ser borrado o editada sino que tampoco se puedan añadir nuevos ficheros a la misma o borrarlos, pero sí se podrían editar estos ficheros. ¿Se puede hacer que estos tampoco puedan ser editados? Sí, habría que aplicar el comando de forma recursiva sobre la carpeta para que afecte a todo lo que esta contiene:

chattr +i -RV nombre_de_carpeta

¿Y para quitar este flag y poder borrarlo o editarlo? En lugar de +i se usa -i:

chattr -i nombre_del_fichero

¿Esto tiene alguna utilidad? Pues sí. Por ejemplo podéis hacer que el fichero de usuarios o de contraseñas del sistema sea inmutable, de forma que nadie podría darse de alta sin antes modificar los permisos del fichero para ello, dando un punto extra a la seguridad.

Mostrar asteriscos en la consola de Mac o de Linux al escribir una contraseña

Una de las cosas que más despistan cuando se empieza a trabajar con la línea de comandos de sistemas operativos basados en UNIX es que al poner una contraseña no se muestra nada. La parte buena es que si tenemos a alguien mirando por encima de nuestros hombros no le damos una pista de la longitud de nuestra contraseña, la mala es que no sabemos si hemos tecleado mal. Pero ¿se puede hacer que muestre unos asteriscos cuando la introducimos? Se puede:

Lo primero, editar el fichero de sudoers:

sudo visudo

Lo siguiente, buscar la línea que pone esto:

Defaults        env_reset

Lo tercero, modificar la línea para que luzca así:

Defaults        env_reset,pwfeedback

Esto funciona en la mayoría de linux modernos y en los Mac con OS X superior al 10.8, así que si quieres esta ayuda visual seguramente podrás disfrutarla.

Linux: crear una contraseña aleatoria simple

Hemos visto un par de formas de generar claves aleatorias en Linux. Vamos a ver otra que no es especialmente compleja. No es lo más seguro para generar una serie de claves aleatorias ni da un resultado especialmente recordable, pero para un apuro te permite salir del paso en la consola cualquier distribución y sin instalar software:

date|md5sum

Tan simple como esto: tomamos la fecha en tiempo UNIX y le aplicamos la función de resumen md5.

Utilizar sudo sin contraseña

Arracamos 2018 con más Linux ¿Se puede configurar el sistema para no tener que poner la contraseña cuando invoquemos un comando precedido de sudo? Sí, se puede. ¿Se debe? No, eso debilita la seguridad y no es nada recomendable. ¿Entonces no se puede? Sí, se puede pero no se debe.

La cosa es editar el fichero /etc/sudoers utilizando el siguiente comando:

sudo visudo

Una vez lo estemos editando buscamos la línea que pone root ALL=(ALL) ALL y debajo añadimos la siguiente, cambiando nuestro_usuario por el nombre de usuario que corresponda.

nuestro_usuario ALL=(ALL) NOPASSWD: ALL

También podemos aplicarlo a grupos, para ello debemos poner el símbolo % seguido del nombre del grupo:

%nuestro_grupo ALL=(ALL) NOPASSWD: ALL

Y otra opción es permitirlo sólo a un comando, o serie de comandos. En ese caso cambiamos el ALL que va después de NOPASSWD por el comando en cuestión. En el ejemplo veremos como hacerlo para /bin/kill:

nuestro_usuario ALL=(ALL) NOPASSWD: /bin/kill

Y una vez guardados los cambios el sistema nos permitirá usar sudo sin contraseña. Y vuelvo a repetir: NO SE DEBE HACER. Pero si queréis hacerlo, ahí tenéis el cómo.

Generar contraseñas seguras en Linux con APG

Ya vimos en el pasado cómo generar contraseñas en linux con mkpasswd, hoy veremos otro método. APG, abreviatura de Automatic Password Generator, viene instalado en Ubuntu y sus derivados. Es un programa pensado para generar contraseñas «memorizables«. Si lo ejecutas a secas te pedirá una «raíz«, una serie de datos con los que trabajar, y en base a eso creará una contraseña «memorizable«, y con «memorizable» quiero decir que junto a la contraseña te mostrará una transcripción fonética para que la recuerdes mejor.

APG Ejemplo
Ejemplo de APG

También puedes generar contraseñas totalmente aleatorias usando el comando apg a -1, que ofrece resultados de entre 8 y 10 caracteres.

Ejemplo APG 2
Ejemplo de APG con a -1

X11 forwarding sobre ssh

Llevo tanto tiempo lidiando con servidores Windows que se me empiezan a anquilosar las habilidades linuxeras más allá de lo que viene a ser el día a día. Creo que necesito preparar el LPIC aunque sólo sea para mantenerme en forma. El caso, que hoy tenía que ejecutar remotamente una aplicación con entorno gráfico de un servidor Linux y tuve que ir a ojear los viejos apuntes de sistemas operativos que guardo en una carpeta en la nube con manuales de todo tipo. Seguro que hay mil entradas por ahí pero yo os lo cuento igual:

Paso 1: Habilitamos el X11 forwarding en el servidor. ¿Cómo? Editando el fichero /etc/ssh/ssh_config y buscando allí la línea que pone X11Forwarding  para ponerle el valor en YES. Y tras esto reiniciamos el demonio de SSH.

Paso 2: nos conectamos mediante ssh pasando el parámetro -X:

ssh -X usuario@nombreEquipo

Y luego ya ejecutamos el programa en cuestión.

Si el cableado o la conexión es malo puede que te interese usar la opción que comprime los datos que te enviará el servidor. Carga más trabajo en la memoria del servidor y del cliente, pero reduce el tamaño del tráfico de red:

ssh -X -C usuario@nombreEquipo

 

Seguir partidos de la NBA desde un terminal de Linux

Mis amigos saben que me encanta el baloncesto, Linux y las cosas altamente freaks. Y esta mañana, cuando me levanté, me encontré con que uno me había compartido en el muro de Facebook esta entradade OMGUbuntu: Ver partidos de la NBA desde el terminal con NBA-Go.

¿Cómo va esto?

Bueno, lo primero es tener npm instalado instalado en vuestro equipo. Está en los repositorios de Ubuntu:

sudo apt-get update
sudo apt-get install nodejs
sudo apt-get install npm

Y una vez tengamos npm instalado vamos a instalar NBA-Go:

sudo npm install -g nba-go

El programa principalmente ofrece dos comandos: game y player (abreviados g y p). Dentro de la opción game hay dos opciones posibles: ver qué partidos hay disponibles y ver uno en concreto.

A la hora de ver los posibles tenemos las opciones date, yesterday, today y tomorrow. La primera para una fecha concreta, la segunda para los partidos de ayer, la tercera para los de hoy y la cuarta para los de mañana. Vemos ejemplos:

//fecha formato año/mes/día
$ nba-go game -d 2017/11/02
$ nba-go game --date 2017/11/02
//ayer
$ nba-go game -y
$ nba-go game --yesterday
//hoy
$ nba-go game -t
$ nba-go game --today
//mañana
$ nba-go game -T
$ nba-go game --tomorrow

Una vez listado podéis navegar con el partido, ver la información previa al juego o seguir el desarrollo del mismo con las estadísticas en directo. También podéis ver el boxscore del partido ya finalizado con toda la estadística.

Aquí os dejo un gif de la página oficial que ilustra esto:

Seleccionar partido

Partido en directo

Con el comando player tenemos tres opciones: información general, estadísticas de la temporada regular o de los playoff. Voy a usar el mismo ejemplo que en la página oficial para que cuadre con el gif que voy a usar de la misma.

//info de Curry
$ nba-go player Curry -i
$ nba-go player Curry --info
//temporada regular
$ nba-go player Curry -r
$ nba-go player Curry --regular
//eliminatorias
$ nba-go player Curry -p
$ nba-go player Curry --playoffs
//todo junto
$ nba-go player Curry -i -r -p

Información de jugadores

Os dejo por aquí el enlace al proyecto en GitHub por si queréis ver el código o si queréis clonarlo.

Redirección de datos en Bash

La redirección de datos es un elemento básico de Bash ya que nos permite controlar hacia dónde se volcarán los datos de salida de un comando o script, o de dónde obtenemos los datos de entrada.

Tenemos tres descriptores:

  • stdin: Entrada estándar.
  • stdout: Salida estándar. También se abrevia con el número 1.
  • stderr: Error estándar. También se abrevia con el número 2.

Esto nos dará varias opciones. La primera, redirigir la salida estándar a un fichero, para lo que usamos el operador >:

ls -l > fichero.txt

En el ejemplo de arriba ejecutamos el comando ls -l pero le decimos que nos guarde el resultado en un fichero. Ahora vamos a redirigir el error estándar a un fichero, usando el operador 2>:

grep pri * 2> error.txt

En este caso ejecutamos el comando grep pri * y lo que sacamos al fichero son los errores. Luego podemos combinar la salida y sacar la salida el estándar por el error estándar o viceversa:

#Sacamos el error estándar por la salida estándar
grep pri * 2>&1
#Sacamos la salida estándar por el error estándar
grep pri * 1>&2

Finalmente vamos a ver cómo sacar la salida y el error estándar juntos a un fichero:

grep pri * &> todo.txt

Esto es muy útil si queremos ejecutar un comando o un script en silencio, por ejemplo uno que se ejecute en una tarea programada con cron, ya que no veremos nada en pantalla pero tendremos nuestro propio log con los datos de lo ejecutado.

¿Cómo hacer que sudo te insulte cuando te equivocas con el password?

Vamos con una entrada de sistemas completamente inútil. Sí, porque como humanos nos divierten las cosas inútiles pero chocantes. También puede valer como troleo de oficina, si gustáis: Hacer que sudo insulte al usuario cuando se equivoque introduciendo su password. Esto en principio funciona en los sistemas basados en Ubuntu, posteriores a Ubuntu 12.04 y que tengan sudo 1.8.3 instalado.

La cuestión es que tenéis que editar el fichero /etc/sudoers y buscar la línea que pone:

Defaults                env_reset

Y cambiáis esa línea por:

Defaults env_reset,insults

Tras eso, si queréis comprobar su funcionamiento, invocáis una instrucción con sudo y ponéis mal la contraseña. Recibiréis respuestas tan ingeniosas como: It can only be attributed to human error, Ying Tong Iddle I Po, Take a stress pill and think things over, He has fallen in the water, Have a gorilla…,The more you drive — the dumber you get, … and it used to be so popular… o BOB says: You seem to have forgotten your passwd, enter another!

Como ya dije, inútil pero divertido.