Problema de seguridade no acceso dende os clientes Linux ás carpetas compartidas
Ir a la navegación
Ir a la búsqueda
- Neste apartado imos expoñer un problema de seguridade que se pode dar seguindo os pasos expostos no material do curso para montar as carpetas compartidas do dominio usando pam_mount.
- Este problema podería permitir a lectura por parte dun alumno do contido da carpeta persoal de outro alumno. Veremos cal é o motivo e como resolvelo.
- Amosaremos o problema e a súa solución no escenario baseado en Samba3+LDAP, pero sería similar no caso de Samba4 e integrando o almacenamento en FreeNAS.
Problema de seguridade no acceso ás carpetas com pam_mount
- Nas seguintes imaxes imos mostrar como un alumno (tom) podería chegar a acceder á carpeta de outro (mon). Móstrase abrindo a sesión en uclient01 en modo de texto, pero podería facerse en modo gráfico.
- No caso exposto, iniciamos sesión nun cliente con un usuario (tom) ao mesmo tempo que temos outra sesión aberta (a de mon). En principio, pam_mount debería desmontar as carpetas montadas cando se pecha a sesión, así que se intentamos facelo pechando a sesión dun usuario e abrindo a do outro pode xa non teríamos o problema.
- Non obstante, temos detectado que en ocasións, seguramente debido a que algún proceso do sistema mantén ficheiros abertos da carpeta persoal, pam_mount non desmonta as carpetas ao pechar sesión e continúan montadas. Isto facilitaría aínda máis a posibilidade de que un usuario accedese á carpeta persoal de outro.
- Podemos configurar pam_moun para forzar que desmonte as carpetas no peche da sesión, cambiando a seguinte liña do ficheiro de configuración:
<logout wait="0" hup="0" term="0" kill="0" />
- Deixando o seguinte contido:
<logout wait="2000" hup="0" term="1" kill="1" />
- Aínda así, o problema podería darse se dous usuarios abren sesións de forma simultánea no equipo, ben en local ou de forma remota (accedendo por ssh, por exemplo).
Explicación: Causa do problema
- Agora ben, por que ocorre isto? Que é o que provoca que os permisos das carpetas persoais nos equipos cliente non se corresponda cos que teñen en dserver00?
- A razón de que os propietarios e grupos non se correspondan no cliente e no servidor é que CIFS non propaga os permisos do servidor no cliente; hai que ter en conta que aínda que no noso caso os usuarios e grupos que existen nun tamén existen no outro porque os dous están configurados para autenticar contra o mesmo servidor LDAP, isto non tería por que ser así e os usuarios e grupos do servidor polos que se establecen os permisos nas carpetas non teñen que existir no cliente.
- Por iso, o que fai o cliente é poñer sempre como usuario propietario o do usuario que monta a carpeta e como grupo o seu grupo principal, aínda que logo é o servidor o que vai verificar os permisos no acceso á carpeta por CIFS.
- O problema é que sempre vai usar as credenciais que se introduciron ao montar a carpeta, e por iso tom pode fisgonear na carpeta de mon, xa que está usando as súas credenciais.
Proposta para resolver o acceso ás carpetas persoais dos usuarios
- Polo tanto, unha solución pode ser establecer uns permisos na carpeta na que se monta que só permita o acceso ao usuario que a monta, e no caso dos alumnos ao grupo dos profes do seu curso.
- O comando mount.cifs (que é o que usamos en pam_mount para montar as carpetas por cifs) permite forzar o uid e o gid que o cliente vai poñer como permisos das carpetas aos que nos queiramos, en lugar de que sexan o usuario que monta a carpeta e o seu grupo principal (que é g-usuarios, e aí é onde temos o problema).
- Así que podemos modificar as liñas do ficheiro pam_mount.conf.xml que montan as carpetas persoais dos usuarios:
<!-- Montamos carpetas persoais dos usuarios profes -->
<volume sgrp="g-profes" fstype="cifs" server="dserver00" path="%(USER)" mountpoint="/home/iescalquera/profes/%(USER)" options="iocharset=utf8"/>
<!-- Montamos carpetas persoais dos usuarios alumnos -->
<volume sgrp="g-dam1-alum" fstype="cifs" server="dserver00" path="%(USER)" mountpoint="/home/iescalquera/alumnos/dam1/%(USER)" options="iocharset=utf8"/>
<volume sgrp="g-dam2-alum" fstype="cifs" server="dserver00" path="%(USER)" mountpoint="/home/iescalquera/alumnos/dam2/%(USER)" options="iocharset=utf8"/>
- Deixándoas da seguinte maneira:
<!-- Montamos carpetas persoais dos usuarios profes -->
<volume sgrp="g-profes" fstype="cifs" server="dserver00" path="%(USER)" mountpoint="/home/iescalquera/profes/%(USER)" options="iocharset=utf8,uid=%(USER)"/>
<!-- Montamos carpetas persoais dos usuarios alumnos -->
<volume sgrp="g-dam1-alum" fstype="cifs" server="dserver00" path="%(USER)" mountpoint="/home/iescalquera/alumnos/dam1/%(USER)" options="iocharset=utf8,uid=%(USER),gid=g-dam1-profes"/>
<volume sgrp="g-dam2-alum" fstype="cifs" server="dserver00" path="%(USER)" mountpoint="/home/iescalquera/alumnos/dam2/%(USER)" options="iocharset=utf8,uid=%(USER),gid=g-dam2-profes"/>
- Desta forma, veremos como tom xa non poderá acceder á carpeta de mon:
Proposta para resolver o acceso a outras carpetas compartidas
- Este mesmo problema podería darse con outras carpetas montadas con pam_mount, como no noso caso é carpeta comun ou a das carpetas persoais dos alumnos á que acceder os profes.
- Se revisamos a configuración de pam_mount para a montaxe destas carpetas:
<!-- Montamos comun -->
<volume sgrp="g-usuarios" fstype="cifs" server="dserver00" path="comun" mountpoint="/media/comun" options="iocharset=utf8"/>
<!-- Montamos carpeta alumnos para os profes -->
<volume sgrp="g-profes" fstype="cifs" server="dserver00" path="alumnos" mountpoint="/home/iescalquera/alumnos" options="iocharset=utf8"/>
- Podemos concluír que se dous usuarios inician sesión simultaneamente nun equipo cliente montarán a mesma carpeta remota sobre a mesma carpeta do equipo cliente, o que podería permitir a un usuario acceder a esa carpeta coas credenciais do outro.
- Para evitalo, podemos facer as montaxes de cada usuario nunha carpeta co seu nome dentro de /media, modificando o ficheiro de configuración de pam_mount:
<!-- Montamos comun -->
<volume sgrp="g-usuarios" fstype="cifs" server="dserver00" path="comun" mountpoint="/media/%(USER)/comun" options="iocharset=utf8"/>
<!-- Montamos carpeta alumnos para os profes -->
<volume sgrp="g-profes" fstype="cifs" server="dserver00" path="alumnos" mountpoint="/media/%(USER)/alumnos" options="iocharset=utf8"/>
- E para asegurarnos que na carpeta /media/usuario só pode acceder o usuario correspondente introducimos no ficheiro /etc/profile (que se executa cada vez que o usuario inicia sesión) o seguinte comando:
chmod 700 /media/$USER
- Así se inicia sesión tom (que é alumno), monta comun en /media/tom/comun, e se inicia sesión sol (que é profe) monta comun en /media/sol/comun. tom non pode entrar no comun de sol e sol non pode entrar no comun de tom.