lunes, 28 de abril de 2014

Ubuntu - Agragar usuario con contraseña desde consola

Es algo poco común, pero en ocasiones necesitamos diseñar scripts que nos permitan establecer la contraseña de un usuario desde consola, y en mi caso, en la misma línea que se crea el usuario. Ubuntu utiliza encriptación SHA-512 para guardar las contraseñas.

Con el comando useradd, se puede establecer la contraseña cuando se crea el usuario, pero hay que ingresarla encripatada de una vez. Para hacer este menester se utiliza perl embebido en el comando useradd, y la cadena "$6" en la encriptación.

useradd -m -p $(perl -e 'print crypt("password","\$6\$saltsalt\$") . "\n"') _usuario

viernes, 4 de abril de 2014

Instalar una aplicación wine una vez, ejecutar en muchos usuarios.

Esta duda me ha atormentado desde hace mucho tiempo (casi desde que empecé a utilizar GNU/Linux) y es como instalar una vez un programa Windows en linux y ejecutarlo en cualquier usuario linux.
Se me ocurrieron varias cosas, como crear un enlace simbólico a la carpeta wine de los otros usuarios, pero por los permisos no sirvió, enlaces duros tampoco.
Trasteando un poco leí una solución que me sirvió, en lo poco que la he probado, que es hacer un usuario y ejecutar wine (o playonlinux) como él, entonces las instalaciones y todo quedan en su carpeta de usuario y la podemos utilizar desde el usuario que se desee. Suena sencillo, pero luego se complica un poco (hay que otorgar al usuario "wine" permiso para que ejecute X en el usuario que queremos ejecutar, etc), pero encontré una página donde solucionaron casi todo. En esta entrada transcribo, casi textualmente, traduciendo al español los pasos a seguir para lograrlo.

Instalar WINE y PLAYONLINUX

Instalarlos es muy sencillo, pueden buscar los paquetes en el gestor de paquetes Synaptic.

Crear una nueva cuenta de usuario para Wine

Se creará una cuenta de usuario llamada "wine" (en minuscula). Para crearlo se puede hacer mediante la consola
$ sudo adduser --disabled-login --shell /forbid/login wine
Esto debería crear una nueva cuenta de usuario llamada wine que no se podrá autenticar, pero tendrá directorio home.

Opcional

Dependiendo de los programas que se quieran instalar se deberá agregar al usuario wine a un grupo que tenga los permisos necesarios. Por ejemplo, si se tiene un programa que requiera audio deberá agregarse wine al grupo audio
$ sudo usermod --append --groups audio wine
De igual manera, según necesidad, se tendrá que agregar el usuario wine a grupos como cdrom, floppy, etc.

Permitir a nuestra propia cuenta de usuario lanzar comandos bajo el nombre de la cuenta wine

Tener mucho cuidado en esta sección los usuarios de Ubuntu y otras distribuciones donde sudo maneja los privilegios de super usuario y no se tiene acceso al usuario root. El comando sudo permite correr comandos bajo el nombre de otra cuenta. Usualmente sudo es utilizado para correr programas como super usuario (lo hicimos un par de veces en la sección anterior). Pero también se puede usar sudo con la opción -u, que permite correr los comandos como otro usuario. Normalmente esto requiere que se digite la contraseña de dicho usuario, pero editando el archivo /etc/sudoers se puede dar permiso a tu propia cuenta de usuario para correr el comando sin necesidad de escribir la contraseña de la otra cuenta de usuario.  Para editar /etc/sudoers se debe hacer son el momando visudo
sudo visudo
Una vez dentro del archivo /etc/sudoers, se necesita agregar una nueva linea al final del archivo. Se quiere que nuestra cuenta, para este ejemplo llamada "pepe", pueda correr comandos como el usuario wine. Para esto se agrega la siguiente línea
pepe ALL=(wine) NOPASSWD: ALL
Recuerde cambiar pepe por su propio nombre de usuario.  Debe de hacer esto con cada usuario que desee ejecute la aplicación windows.  Leyendo un poco la documentación de /etc/sudoers y un par de ejemplos por ahí dice que se puede agregar Alias y listas de usuarios.
Ahora se puede, desde la terminal, probar que sirvan los comandos corridos desde la cuenta wine :
$ sudo -u wine ls /home/wine

Opcional (recomendado)

Si la cuenta de usuario que desea que ejecute los programas Windows no está dentro del grupo sudo, debe agregarla desde la terminal. Pero al hacer esto, le estará dando permisos (por la configuración por default que viene en el archivo /etc/sudoers) para ejecutarse y loguearse como administrador. Por motivos de seguridad esto no es deseable, para corregir esto, siga los siguientes pasos, sin salir de la edición del archivo /etc/sudoers.
Documente la línea %sudo ALL=(ALL:ALL) ALL, quedando así
#Allow members of group sudo to execute any command
#%sudo ALL=(ALL:ALL) ALL
Seguido debe agregar al grupo administrador de sistema (donde se encuentra su cuenta principal de administración) y darle todos los permisos, para esto (probado en Ubuntu 13.10) agregue las siguientes líneas al archivo
#Permitir al grupo administrador ejecutar cualquier comando
%adm ALL=(ALL:ALL) ALL
Con esto le concede permiso a los usuarios del grupo adm (administradores en Ubuntu) a ejecutar cualquier comando y poderse loguear como super usuario.

No permitir que wine y playonlinux sean usados por otras cuentas de usuario

Porque queremos estar seguros que Wine o PlayOnLinux no será utilizado deliberadamente o accidentalmente por otra cuenta de usuario que no se wine, necesitamos cambiar los permisos de ejecución de los respectivos archivos binarios.  Estos se encuentran en la carpeta de sistema /usr/bin.
$ sudo chown root:wine /usr/bin/wine*
$ sudo chown root:wine /usr/bin/playonlinux*
$ sudo chmod o-x /usr/bin/wine*
$ sudo chmod o-x /usr/bin/playonlinux*

Creando el script runaswine

Según la lógica que llevamos, correr una aplicación en windows debería ser tan simple como digitar sudo -u wine /ruta/programa_windows.exe. Pero en la práctica, nos podemos encontrar un par de piedras grandes en el camino.
Primero que todo, el usuario wine no podrá tener acceso al servidor X  para manejar los gráficos. Al intentar correr la aplicación, como HotPotatoes, únicamente nos generará un mensaje de error. Para dar permiso al usuario wine de utilizar el servidro X, podemos ingresar en el terminal el siguiente comando:
xhost +SI:localuser:wine
Esto dará permiso al usuario wine de utilizar el servidor X de nuestro usuario por una sesión únicamente.
nota: Pareces ser que se puede hacer permanente mediante xauth , tengo que investigar sobre el asunto.
El comando sudo -u wine /ruta/programa_windows.exe ahora debería servir.  Pero, las variables de entorno de nuestro usuario wine están apuntando a las variables de nuestro usuario ejecutor, esto puede crear conflictos a la hora de ejecutar programas y dejar un par posibles huecos de seguridad (también se tiene que investigar más este punto) ,entonces se puede usar el comando env, utilizando la cuenta wine para reflejar las variables hacia wine.

sudo -u wine env HOME=/home/wine USER=wine USERNAME=wine LOGNAME=wine wine "$@"

Esto lo podemos agregar en un script que se ejecute luego desde terminal, el cual se puede guardar en /usr/bin, para este ejemplo el escript se llamará runaswine.bash.
nano /usr/bin/runaswine.bash

Dentro del archivo escribiremos los comandos recién vistos.
#!/bin/bash
# Run Wine as user wine.
# Should only be used for running Windows software with Wine emulator.

echo "Adding wine to X server permissions list."
xhost +SI:localuser:wine

echo "Running as wine:" "$@"
# Use sudo -u wine to run command (and all arguments) as user wine.
# and use env command to set environment variables for wine user.
sudo -u wine env HOME=/home/wine USER=wine USERNAME=wine LOGNAME=wine playonlinux "$@"
http://www.bobulous.org.uk/misc/Spotify-Linux-Wine.html
http://www.linuxtotal.com.mx/?cont=info_admon_014