Contents

Montar un servidor casero con Raspberry Pi (Parte 8): NAS con Raspberry Pi y Samba

En este nuevo tutorial del servidor casero con Raspberry Pi veremos como montar un NAS casero con la Raspberry Pi, Samba y un disco duro externo.

/wp-content/uploads/2013/10/banner-tutorial-raspi_-nas.png
Nas con Raspberry Pi

Índice de tutoriales:

  1. Objetivos e índice.
  2. Instalar Raspbian en una tarjeta SD.
  3. Primera ejecución de Raspbian.
  4. Configurar servidor DHCP.
  5. Configurar servidor DNS caché.
  6. DNS local con actualizaciones DHCP.
  7. Acceder al servidor desde el exterior.
  8. Instalación y configuración de OpenVPN.
  9. NAS con Raspberry Pi y Samba

Tutoriales relacionados:

Hace 4 meses desde la última parte publicada de esta serie de tutoriales que hoy retomo con la intención de añadir un nuevo servicio a mi Raspberry Pi, la compartición de archivos con Samba.

El bajo consumo y precio de la Raspberry Pi convierten al dispositivo en una forma ideal de montar un NAS casero, que si bien no tendrá el rendimiento de productos creados específicamente para realizar dicha función, sí que nos ofrecerá una solución totalmente funcional para centralizar archivos dentro de nuestra red local.

Esquema de compartición en la red

Este tutorial está enfocado a una pequeña red doméstica, por lo que no tiene mucho sentido crear complejos sistemas de compartición, no obstante, como ha venido siendo costumbre en estos tutoriales, sí que intentaremos crear un sistema que nos permita ver algunas de las funcionalidades que nos ofrece el servicio Samba y que además aporten algo de valor añadido.

El esquema que propongo y que emplearé para el tutorial (el mismo que tengo actualmente funcionando en mi casa) será el siguiente: Se crearán 3 carpetas que compartiremos con Samba, 2 de ellas serán carpetas personales para los dos usuarios que existen en la red donde sólo ellos podrán leer y escribir, la tercera carpeta será compartida para ambos, donde podrán leer y escribir a placer.

Vamos a poner los datos concretos con los que ejemplificaré todo el tutorial:

  • Usuarios: usuario1 y usuario2.
  • Grupos: home.
  • Carpetas: carpus1, carpus2 y compartida.

Montar el disco duro externo en la Raspberry Pi

Esta parte evidentemente es opcional. Si lo que quieres es compartir una carpeta dentro de tu sistema de ficheros de la Raspberry Pi puedes saltarte este paso. En mi caso como no podría compartir una gran cantidad de espacio debido a las limitaciones de la tarjeta SD me he decantado por compartir un disco duro externo de 1,5TB.

Para hacer esta parte más fácil y no extender mucho más el post de lo que ya se va a extender he formateado el disco duro desde mi ordenador de escritorio en formato ext4 antes de conectarlo a la Raspberry.

Antes que nada deberemos crear en nuestro sistema de archivos la carpeta donde montaremos el disco duro, en este tutorial se utilizará /mnt/NAS:

1
$ sudo mkdir /mnt/NAS

Posteriormente debemos identificar el disco duro en nuestro sistema. Para ello nos valdremos de:

1
$ blkid

Que nos debería mostrar una línea parecida a la siguiente:

1
/dev/sda1: LABEL="NAS" UUID="37cdcd88-696a-4c63-9c1b-66cdcbb89b3f" TYPE="ext4"

Copiaremos el UUID, que será lo que utilizaremos para identificar el dispositivo dentro del fichero fstab que pasaremos a editar ahora:

1
$ sudo nano /etc/fstab

Al final de este archivo debemos crear una línea similar a la siguiente:

1
UUID=37cdcd88-696a-4c63-9c1b-66cdcbb89b3f /mnt/NAS ext4 defaults,noatime 0 0

Lo que estamos haciendo en esta línea es indicar dónde y como queremos montar nuestro disco duro en el sistema de archivos. En este caso lo estamos montando en /mnt/NAS y con los parámetros por defecto. Recomiendo que si no conocéis el funcionamiento de este archivo antes de hacer nada y copiar y pegar a lo bruto la reviséis para entender exactamente qué implica cada parámetro.

Editado el archivo lo guardamos, cerramos y montamos el disco en nuestro sistema de ficheros:

1
$ sudo mount -a

Si la sintaxis era correcta y no aparece error alguno al ejecutar mount ya tendremos nuestra unidad montada en /mnt/NAS.

Instalar Samba en Raspbian

No estoy seguro de si esto es necesario en una instalación limpia de Raspbian, puesto que yo borré una cantidad enorme de paquetes de Raspbian tal y como indiqué en el tutorial correspondiente, de todos modos no tiene mucho misterio utilizando apt:

1
$ sudo apt-get install samba samba-common-bin

Esto será todo lo que necesitaremos instalado para continuar con el tutorial.

Creación de usuarios y grupo

Toca crear los usuarios y el grupo que interactúan con las carpetas compartidas. Si habéis trabajado con comparticiones en Windows la mecánica de permisos es “parecida” en el sentido de que existen dos permisos con los que tendremos que tratar, con los permisos del sistema de archivos y con los permisos de Samba.

Como nuestro servidor Samba se encuentra en un ambiente donde no existe un Active Directory ni un LDAP contra el que autenticar usuarios deberemos crear los usuarios en el propio servidor y en Samba.

Para crear los usuarios en nuestra Raspbian usaremos:

1
2
$ sudo adduser -shell /bin/false --no-create-home usuario1
$ sudo adduser -shell /bin/false --no-create-home usuario2

Como podéis observar le he pasado un par de parámetros al comando adduser, totalmente opcionales pero que personalmente recomiendo:

  • -shell /bin/false: El parámetro -shell sirve para asignar un intérprete de órdenes (shell) distinto al que viene asignado por defecto en nuestro sistema. Asignarle una shell falsa hará que el usuario no pueda logearse en el sistema ni acceder vía ssh, siendo ambas cosas innecesarias además de un potencial riesgo en este entorno.
  • –no-create-home: Esta otra opción es autoexplicativa. Forzamos a adduser a no crear un directorio home en el sistema, interesante para no llenar el directorio de carpetas innecesarias.

Posteriormente los añadimos a la lista de usuarios de Samba:

1
2
$ sudo smbpasswd -a usuario1
$ sudo smbpasswd -a usuario2

Ahora toca crear el grupo y unir a nuestros dos usuarios a dicho grupo:

1
2
3
$ sudo addgroup home
$ sudo adduser usuario1 home
$ sudo adduser usuario2 home

Llegados aquí ya tendremos lo necesario para implementar la seguridad pertinente en las carpetas compartidas que vamos a crear a continuación.

Creación de carpetas compartidas y asignación de permisos

Vamos a crear las carpetas que vamos a compartir dentro de nuestro disco duro externo siguiendo el esquema anteriormente descrito:

1
2
$ cd /mnt/NAS
$ sudo mkdir carpus1 carpus2 compartida

Con las carpetas creadas es hora de poner un orden a los permisos de las carpetas. Tal y como hemos visto en el esquema necesitamos que los usuarios puedan leer y escribir en su carpeta personal y en la compartida, pero no en la carpeta personal de los demás. Para ello primero vamos a cambiar la propiedad de las carpetas a los usuarios y grupos correspondientes:

1
2
3
$ sudo chown -R usuario1:usuario1 carpus1
$ sudo chown -R usuario2:usuario2 carpus2
$ sudo chgrp -R home compartida

Y asignamos los permisos correspondientes a todas las carpetas:

1
$ sudo chmod -R 770 *

Estos permisos evidentemente no son al azar. Lo que pretendemos es que solo el usuario y grupo propietarios puedan leer y escribir en la carpeta y que el resto de usuarios no pueda acceder. Puesto que el grupo usuario1 y usuario2 están compuestos únicamente por los usuarios con el mismo nombre nos aseguramos que nadie más puede acceder. Si no tenemos muy fresco el tema de los permisos es mejor que lo repasemos para saber exactamente qué estamos haciendo.

Hay una última cosa tenemos que tener en consideración con el tema de los permisos. En la carpeta compartida escribirán usuario1 y usuario2, por lo que cuando creemos un archivo ahí dentro, como su grupo principal es usuario1 y usuario2 respectivamente nos encontraremos con que un usuario no podrá modificar lo creado por el otro. La solución a esto se encuentra en el bit setgid. Asignar este bit a la carpeta “compartida” hará que todo lo que creemos bajo este directorio sea asignado al grupo de la carpeta principal, por lo tanto, lo que cree usuario1 será asignado al grupo home, lo que permitirá que ambos puedan modificarlo.

Asignar el bit es muy sencillo, simplemente ejecutaremos:

1
$ sudo chmod g+s compartida

Ejecutar un ls -l nos mostrará el resultado de todo lo hecho en este apartado:

1
2
3
4
$ ls -l
drwxrws--- 2 root home 4096 Oct 10 21:13 compartida
drwxrwx--- 2 usuario1 usuario1 4096 Oct 10 22:41 carpus1
drwxrwx--- 2 usuario2 usuario2 4096 Oct 10 21:12 carpus2

Como vemos, todas las carpetas tienen permiso 770, y en la carpeta compartida podemos ver una “s” en la casilla de ejecución de grupo, lo que muestra que está habilitado el bit setgid.

Configuración de Samba en la Raspberry Pi

Hecha toda la preparación falta precisamente de lo que trata este post: configurar Samba en la Raspberry Pi. En este tutorial no voy a tocar nada que no sea necesario para la configuración propuesta en el esquema del principio de la entrada, esto se debe a que las opciones de Samba son muy extensas y difícilmente podría cubrirlas en una entrada de este estilo. Así que vamos al lío:

Como siempre lo primero que haremos será crear un backup del archivo de configuración que vamos a editar, para así poder volver atrás en caso de que toquemos algo que no debemos.

1
2
3
sudo su
cd /etc/samba
mv smb.conf smb.conf.orig

Después de esto crearemos una copia limpia de comentarios del archivo original. Esto lo haremos mediante la herramienta de verificación de la configuración de smb.conf:

1
testparm -s smb.conf.orig > smb.conf

El archivo original está muy bien documentado, así que siempre es útil dirigirse a él en busca de información sobre los parámetros así como podemos hacerlo en la página man de smb.conf.

Vamos a editar nuestro archivo de configuración generado:

1
nano smb.conf

Observaremos que hay distintas secciones separadas en el archivo de configuración. De las ya existentes solo tocaremos la sección [global] en la que añadiremos lo siguiente:

1
security=user

Si bien este es el comportamiento por defecto siempre es interesante tenerlo puesto. Ahora generaremos nuestras propias secciones, que corresponderán a las distintas carpetas que compartamos. Puesto que en esencia las tres secciones son iguales pondré los comentarios solo en la primera:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[carpus1] # Nombre del recurso compartido
 comment = Carpeta personal de usuario1 # Descripción.
 path = /mnt/NAS/carpus1 # Ruta de la carpeta.
 read only = No # Indicamos que no es de solo lectura.
 valid users = usuario1 # Usuarios que pueden acceder al recurso.
 write list = usuario1 # Usuarios que pueden escribir en el recurso.
 create mask = 0660 # Máscara de creación de archivos.
 directory mask = 0770 # Máscara de creación de directorios.

[carpus2]
 comment = Carpeta personal de usuario2
 path = /mnt/NAS/carpus2
 read only = No
 valid users = usuario2
 write list = usuario2
 create mask = 0660
 directory mask = 0770

[compartida]
 comment = Carpeta compartida
 path = /mnt/NAS/compartida
 read only = No
 valid users = @ home
 write list = @ home
 create mask = 0660
 directory mask = 0770

NOTA: En valid users y write list de la sección compartida es @home sin espacio.

Quiero pararme un momento a hablar de los parámetros “create mask” y “directory mask”. Estos dos parámetros determinarán los permisos que se aplicarán a los archivos y directorios creados respectivamente. Es importante especificar esto, sobretodo en la carpeta compartida, puesto que necesitamos que los archivos se generen con permiso de escritura para el grupo, de no ser así el otro usuario que accede a la carpeta no podría modificar los permisos. Por otro lado, tanto en la compartida como en las personales queremos evitar que se de ningún tipo de permiso a otros usuarios, por lo cual es importante que se apliquen estos permisos. De nuevo recomiendo echar un ojo a los permisos en GNU/Linux ante cualquier duda al respecto.

Hecho esto guardamos el archivo y ejecutamos la herramienta de comprobación del archivo smb.conf:

1
testparm

Que no debería mostrarnos errores. Posteriormente reiniciamos el servicio Samba:

1
service samba restart

Comprobación del funcionamiento

Con todo esto hecho ya tendríamos que tener nuestro servidor Samba funcionando en la Raspberry Pi. Como última parte del tutorial os dejo de forma genérica como acceder a los recursos compartidos con Samba desde GNU/Linux y Microsoft Windows para que podáis comprobar que todo funciona bien.

Comprobación en GNU/Linux

Para acceder a nuestros recursos Samba desde GNU/Linux podemos emplear el navegador de archivos de nuestra distribución de cabecera y en la barra de direcciones escribir:

1
smb://raspberry

Esto nos mostrará la lista de elementos que nuestra Raspberry contiene. (Esto sólo funcionará si hemos seguido los tutoriales anteriores y hemos habilitado un servidor DNS local). Podemos intentar acceder desde ambos usuarios a los distintos recursos y comprobar que todo funciona como lo hemos configurado.

Comprobación en Microsoft Windows

En Microsoft Windows el modo más sencillo es abrir un explorador de archivos (pinchar en Mi PC/Equipo por ejemplo) y en la barra de direcciones escribir:

1
\\raspberry

Que mostrará los elementos compartidos con Samba por la Raspberry Pi. Nuevamente podemos intentar acceder a los directorios con los dos usuarios y ver si la funcionalidad es la correcta.

Como último consejo recomiendo que entréis vía ssh y vayáis mirando como se generan los permisos y las propiedades de los nuevos archivos de cada una de las carpetas creadas para así ver si se están aplicando las configuraciones de seguridad correctamente.

Bonus link: Con nuestro NAS casero montado y funcionando puede interesarnos controlar el uso del espacio de nuestras unidades con este script.