Admin Libre - Administración de sistemas y redes

Navega un poco más seguro usando la separación de privilegios de UNIX
Por Francisco Gaitán el 10 de Abril de 2022

El exploit pdf.js de 2015 que afectaba a Firefox, donde archivos pdf maliciosos leían ficheros del home del usuario (incluyendo las llaves ssh) despertó todas las alarmas sobre la forma despreocupada en que se suelen usar los navegadores, los cuales están cada vez más cargados de funcionalidades y de complejidad.

Aunque a día de hoy en OpenBSD tanto Firefox como Chromium vienen compilados con unveil(2) puede ser muy conveniente separar los distintos roles de navegación en distintos usuarios aislados, de forma que un fallo en un perfil de navegación no afecte a otro. Por ejemplo, se pueden crear tres usuarios para navegación:

  • Usuario compras donde se escriben los datos de la tarjeta
  • Usuario incognito para navegación casual sin login
  • Usuario webmail para acceder a un servicio de correo web

La idea es de Matthew Dillon y está explicada en este mensaje de la lista de correo de DragonflyBSD, el cual he adaptado a OpenBSD tal y como aquí explico.

Esta configuración, aunque no es perfecta ya que la sesión de X Windows es compartida por todos los usuarios, es muy conveniente ya que si un perfil queda comprometido los datos de los demás usuarios no son directamente accesibles. Además, cada instancia se puede lanzar desde un dominio de enrutado distinto y a través de un VPN road warrior con WireGuard.

Crear nuevos usuarios con vipw

Parto de un usuario principal de nombre y grupo johndoe con llave ssh. Esto sirve para no tener que teclear la contraseña cada vez que se usa el navegador, y se explica en las páginas de manual ssh-keygen(1) para la generación y ssh-agent(1).

Usaré vipw(8) para crear dos nuevas cuentas, usaré UID a partir del número 30000:

incognito:*:30000:30000::0:0:Navegación casual:/home/incognito:/bin/ksh
compras:*:30001:30001::0:0:Compras por internet:/home/compras:/bin/ksh
webmail:*:30002:30002::0:0:Foros:/home/webmail:/bin/ksh

Ahora creo los directorios correspondientes:

# mkdir -p /home/{incognito,compras,webmail}/.ssh 
# cp /home/johndoe/.ssh/id_rsa.pub /home/incognito/.ssh/authorized_keys
# cp /home/johndoe/.ssh/id_rsa.pub /home/compras/.ssh/authorized_keys
# cp /home/johndoe/.ssh/id_rsa.pub /home/webmail/.ssh/authorized_keys
# chown -R incognito /home/incognito
# chown -R compras /home/compras
# chown -R webmail /home/webmail
# chgrp -R johndoe /home/{incognito,compras,webmail}
# chmod -R 750 /home/{incognito,compras,webmail}
# chmod -R o-rwx /home/{incognito,compras,webmail}

Para probar ejecuto el comando ssh incognito@localhost -n ls -la. Si sshd está funcionando y todo se hizo bien debe aparecer la lista del directorio home del usuario incognito.

Ahora creo un script para cada instancia de Firefox/Chromium. Los llamaré incognito.sh, compras.sh y webmail.sh que estarán en el directorio /home/johndoe/bin:

#!/bin/csh
scp ~/.Xauthority incognito@localhost:
ssh incognito@localhost -n "export DISPLAY=":0.0"; chromium"

Después creo un par de scripts para webmail y compras de la misma manera. Para rizar el rizo, cada instancia podría usar un distinto dominio de enrutado usando VPNs tal y como explico en el artículo VPN Road Warrior con Wireguard y OpenBSD.

Enlaces a los directorios de descarga

Ahora creo unos enlaces del directorio de descargas de cada usuario al home de mi usuario principal. Como le di permisos de acceso al incluirlo en el grupo johndoe deberían ser accesibles. Si se quiere se le pueden dar permisos de escritura al grupo en el directorio Downloads de cada uno de estos usuarios.

$ mkdir ~/descargas
$ ln -s /home/incognito/Downloads ~/descargas/incognito
$ ln -s /home/compras/Downloads ~/descargas/compras
$ ln -s /home/webmail/Downloads ~/descargas/webmail

Acceso a dispositivos dri

A día 30 de Noviembre de 2022 en OpenBSD-current hay dos archivos a los que es conveniente dar acceso de lectura y escritura a los usuarios que van a usar el navegador:

  • /dev/dri/card0
  • /dev/dri/renderD128

Ambos pertenecen a mi usuario principal y al grupo _dri que he creado y al que he agregado a dichos usuarios. Los permisos son permisos 660.

# groupadd _dri
# usermod -G _dri compras
# usermod -G _dri incognito 
# usermod -G _dri webmail 
# chown foo:_dri /dev/dri/card0
# chown foo:_dri /dev/dri/renderD128

Para que se mantengan estos permisos después de cada arranque añado esto al archivo /etc/rc.local (aunque no sé si es la forma más correcta):

chown foo:_dri /dev/dri/card0
chmod 660 /dev/dri/card0
chown foo:_dri /dev/dri/renderD128
chmod 660 /dev/dri/renderD128

A tener en cuenta

  • Esta no es una solución perfecta porque estás dando a la cuenta secundaria acceso completo a la sesión de las X.
  • Estas aplicaciones serán capaces de usar la memoria compartida de las X y por tanto funcionar de forma rápida ya que no están usando un túnel ssh.
  • Puedes configurar el GID y permisos de grupo para acceder a archivos y directorios de estas cuentas desde tu usuario principal sin dar a las cuentas secundarias acceso a tus archivos.
  • La configuración de cada navegador se realiza individualmente.
  • Puedes copiar/pegar sin problemas al no estar funcionando a través de un túnel ssh.

Destacado

Contacto

Si has encontrado algún error o quieres comentarme algo mándame un correo a webmaster@adminlibre.org