Ya que tengo un pequeño servidor casero lo voy a aprovechar para conectar a el los discos duros donde guardamos copias simples de los datos de los ordenadores de casa y las copias de seguridad.
En un principios todos los ordenadores que tendrán acceso a los recursos compartidos utilizan como S.O. GNU/Linux pero no quiero cerrar el acceso a un posible uso por parte de usuarios con equipos Windows por lo que utilizaré Samba como implementación de código abierto del protocolo de red SMB/CIFS para montar un servidor Samba independiente.
Requisitos de usuarios y recursos a cumplir:
- Cada usuario tendrá al menos una carpeta compartida personal y privada;
- Todos los usuarios deben tener acceso de lectura y escritura a un recurso compartido de archivos común;
- Existirá un usuario administrador con acceso de lectura y escritura a todos los recursos compartidos personales y con la propiedad del recurso compartido común.
Los recursos compartidos van a estar en discos duros externos, por lo que debo de montarlos y configurar el servidor para que en cada arranque los monte automáticamente. Para cada disco procederé de la siguiente manera:
Conecto el disco duro al servidor, me aseguro que este desmontado y desde el terminal ejecuto el comando blkid
para determinar el UUID del disco.
1
2
3
4
5
6
7
|
usuario@servidor:~$ sudo umount /dev/sdb1
usuario@servidor:~$ sudo blkid -c /dev/null
/dev/sda1: UUID="b60367ee-e2bf-46d0-b6aa-f6239e589ca5" TYPE="ext4" PARTUUID="de864ffb-01"
/dev/sda2: LABEL="datos" UUID="6f38a642-5086-48f1-9946-39c96a86f8d9" TYPE="ext4" PARTUUID="de864ffb-02"
/dev/sda3: UUID="cb3341c2-8272-4a57-8441-0c47922b3c77" TYPE="swap" PARTUUID="de864ffb-03"
/dev/sdb5: LABEL="Respaldo_1" UUID="ff3605bc-0e85-4308-82f7-76be171eb044" TYPE="ext4" PARTUUID="5b7ccb58-05"
/dev/sdc5: LABEL="exchange_data" UUID="be134147-7220-4c05-bcec-e3c5bf65e32c" TYPE="ext4" PARTUUID="c7da918e-05"
|
En este ejemplo tengo conectado a mi servidor un disco duro (sdc5) en formato EXT4, con la etiqueta o nombre "exchange_data"
que voy a agregarlo al fstab del servidor, para que en el arranque el disco duro siempre se monte en la carpeta compartida “datos_intercambio”
.
Edito el fstab y agrego el UUID
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
usuario@servidor:~$ sudo nano /etc/fstab
#/etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point> <type> <options> <dump> <pass>
# / was on /dev/sda1 during installation
UUID=b60367ee-e2bf-46d0-b6aa-f6239e589ca5 / ext4 errors=remount-ro 0 1
# swap was on /dev/sda3 during installation
UUID=cb3341c2-8272-4a57-8441-0c47922b3c77 none swap sw 0 0
UUID=6f38a642-5086-48f1-9946-39c96a86f8d9 /mnt/datos ext4 defaults 0 0
UUID=be134147-7220-4c05-bcec-e3c5bf65e32c /media/datos_intercambio ext4 errors=remount-ro,auto,exec,rw,user 0 0
UUID=ff3605bc-0e85-4308-82f7-76be171eb044 /media/respaldo ext4 errors=remount-ro,auto,exec,rw,user 0 0
|
Creo las carpetas donde montaré los discos sdb y sdc
1
2
|
usuario@servidor:~$ sudo mkdir /media/datos_intercambio
usuario@servidor:~$ sudo mkdir /media/respaldo
|
Monto todos los sistemas de archivos mencionados en fstab entre ellos sdb
1
|
usuario@servidor:~$ sudo mount -a
|
Ahora ya puedo crear las carpetas que voy a compartir
1
2
3
4
5
|
usuario@servidor:~$ sudo mkdir /media/datos_intercambio/intercambios
usuario@servidor:~$ sudo mkdir /media/datos_intercambio/cosas_de_usuario1
usuario@servidor:~$ sudo mkdir /media/datos_intercambio/cosas_de_usuario2
usuario@servidor:~$ sudo mkdir /media/respaldo/respaldo_usuario1
usuario@servidor:~$ sudo mkdir /media/respaldo/respaldo_usuario2
|
Instalo Samba.
1
|
usuario@servidor:~$ sudo apt-get install samba
|
Este comando instalará e iniciará tanto el servidor Samba smbd como el servidor Samba NetBIOS nmbd.
Configurando UFW
Configuro el cortafuegos del servidor para permitir el tráfico de Samba dentro de la red local.
1
|
usuario@servidor:~$ sudo ufw allow from 192.168.100.0/24 to any app Samba
|
Compruebo las reglas del cortafuegos.
1
2
3
4
5
6
7
8
9
10
|
usuario@servidor:~$ sudo ufw status
Status: active
To Action From
-- ------ ----
9000 ALLOW 192.168.100.0/24
2011 ALLOW 192.168.100.0/24
10000 ALLOW 192.168.100.0/24
Anywhere ALLOW 192.168.100.136
Samba ALLOW 192.168.100.0/24
|
Compruebo que funciona.
1
2
3
4
5
|
usuario@servidor:~$ sudo netstat -tulpn | grep smb
tcp 0 0 127.0.0.1:139 0.0.0.0:* LISTEN 4054/smbd
tcp 0 0 192.168.100.132:139 0.0.0.0:* LISTEN 4054/smbd
tcp 0 0 127.0.0.1:445 0.0.0.0:* LISTEN 4054/smbd
tcp 0 0 192.168.100.132:445 0.0.0.0:* LISTEN 4054/smbd
|
Creando usuarios y permisos
Creo un usuario “usuario1” en el servidor. Este usuario no tendrá directorio home ni podrá acceder mediante ssh al servidor.
1
2
3
|
usuario@servidor:~$ sudo groupadd sambauser
usuario@servidor:~$ sudo useradd -c "usuario1" -s /usr/sbin/nologin usuario1
usuario@servidor:~$ sudo usermod -G sambauser -a usuario1
|
Agrego el usuario usuario1 al servidor Samba.
1
2
3
4
5
6
|
usuario@servidor:~$ sudo smbpasswd -a usuario1
New SMB password:
Retype new SMB password:
Added user usuario1.
usuario@servidor:~$ sudo smbpasswd -e usuario1
Enabled user usuario1.
|
Repito estos pasos para el segundo usuario usuario2.
1
2
3
4
5
6
7
8
|
usuario@servidor:~$ sudo useradd -c "usuario2" -s /usr/sbin/nologin usuario2
usuario@servidor:~$ sudo usermod -G sambauser -a usuario2
usuario@servidor:~$ sudo smbpasswd -a usuario2
New SMB password:
Retype new SMB password:
Added user ito.
usuario@servidor:~$ sudo smbpasswd -e usuario2
Enabled user usuario2.
|
Y para el usuario administrador sambaadmins
.
1
2
3
4
5
6
7
8
9
|
usuario@servidor:~$ sudo groupadd sambaadmins
usuario@servidor:~$ sudo useradd -c "adminsamba" -s /usr/sbin/nologin adminsamba
usuario@servidor:~$ sudo usermod -G sambaadmins -a adminsamba
usuario@servidor:~$ sudo smbpasswd -a adminsamba
New SMB password:
Retype new SMB password:
Added user adminsamba.
usuario@servidor:~$ sudo smbpasswd -e adminsamba
Enabled user adminsamba.
|
compruebo los usuarios en Samba.
1
2
3
4
|
usuario@servidor:~$ sudo pdbedit -L
usuario1:1002:usuario1
adminsamba:1004:adminsamba
usuario2:1003:usuario2
|
Ahora que los usuarios del sistema usuario1, usuario2 y adminsamba existen, puedo establecer la propiedad y los permisos en el directorio de inicio de Samba:
1
2
3
4
5
6
7
8
9
10
11
12
|
usuario@servidor:~$ sudo chown adminsamba:sambauser /media/datos_intercambio/intercambios
usuario@servidor:~$ sudo chmod 2770 /media/datos_intercambio/intercambios
usuario@servidor:~$ sudo chown usuario1:sambauser /media/datos_intercambio/cosas_de_usuario1/
usuario@servidor:~$ sudo chmod 2770 /media/datos_intercambio/cosas_de_usuario1/
usuario@servidor:~$ sudo chown usuario1:sambauser /media/datos_intercambio/cosas_de_usuario2/
usuario@servidor:~$ sudo chmod 2770 /media/datos_intercambio/cosas_de_usuario2/
usuario@servidor:~$ sudo chown usuario1:sambauser /media/respaldo/respaldo_usuario1/
usuario@servidor:~$ sudo chmod 2770 /media/respaldo/respaldo_usuario1/
usuario@servidor:~$ sudo chown usuario2:sambauser /media/respaldo/respaldo_usuario2/
usuario@servidor:~$ sudo chmod 2770 /media/respaldo/respaldo_usuario2/
|
Establecer los permisos del directorio en 2770 significa que los nuevos archivos o directorios creados en /media/datos_intercambio/cosas_de_usuario1 heredarán la propiedad del grupo del directorio principal en lugar del grupo primario del usuario que creó el archivo o directorio.
Esto significa, por ejemplo, que si el usuario administrador adminsamba
creara un nuevo directorio en el recurso compartido de usuario1, usuario1 podría leerlo y escribir en el.
Configurando Samba
Lo siguiente es hacer una copia del archivo de configuración del servidor Samba y editarlo:
1
2
|
usuario@servidor:~$ sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.old
usuario@servidor:~$ sudo nano /etc/samba/smb.conf
|
Dentro de el establezco el nombre del grupo de trabajo (por defecto “WORKGROUP”):
1
2
|
# Change this to the workgroup/NT-domain name your Samba server will part of
workgroup = WORKGROUP
|
Deshabilito la definición de share para los homes de usuarios:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
;[homes]
; comment = Home Directories
; browseable = no
# By default, the home directories are exported read-only. Change the
# next parameter to 'no' if you want to be able to write to them.
; read only = yes
# File creation mask is set to 0700 for security reasons. If you want to
# create files with group=rw permissions, set next parameter to 0775.
; create mask = 0700
# Directory creation mask is set to 0700 for security reasons. If you want to
# create dirs. with group=rw permissions, set next parameter to 0775.
; directory mask = 0700
# By default, \\server\username shares can be connected to by anyone
# with access to the samba server.
# The following parameter makes sure that only "username" can connect
# to \\server\username
# This might need tweaking when using external authentication schemes
; valid users = %S
|
Deshabilito compartir impresoras:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
;[printers]
; comment = All Printers
; browseable = no
; path = /var/spool/samba
; printable = yes
; guest ok = no
; read only = yes
; create mask = 0700
# Windows clients look for this share name as a source of downloadable
# printer drivers
;[print$]
; comment = Printer Drivers
; path = /var/lib/samba/printers
; browseable = yes
; read only = yes
; guest ok = no
|
Y al final del archivo de configuración, incluyo un archivo de definición de shares personalizado (para simplificar la configuración):
include = /etc/samba/smb.conf.shares
Guardo los cambios y cierro el archivo. Luego, defino el nuevo share en el archivo personalizado:
1
|
usuario@servidor:~$ sudo nano /etc/samba/smb.conf.shares
|
Inserto la siguiente configuración:
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
GNU nano 3.2 /etc/samba/smb.conf.shares
[intercambios]
comment = Directorio de intercambio
path = /media/datos_intercambio/intercambios/
valid users = @sambauser @sambaadmins
browseable = yes
read only = no
force directory mode = 2770
force create mode = 0770
[Cosas de Usuario1]
comment = Directorio personal de Usuario1
path = /media/datos_intercambio/cosas_de_usuario1
valid users = usuario1 @sambaadmins
browseable = yes
read only = no
force directory mode = 2770
force create mode = 0770
[Respaldo de Usuario1]
comment = Directorio copias de seguridad de Usuario1
path = /media/respaldo/respaldo_usuario1
valid users = usuario1 @sambaadmins
browseable = yes
read only = no
force directory mode = 2770
force create mode = 0770
[Cosas de Usuario2]
comment = Directorio personal de Usuario2
path = /media/datos_intercambio/cosas_de_usuario2
valid users = usuario2 @sambaadmins
browseable = yes
read only = no
force directory mode = 2770
force create mode = 0770
[Respaldo de Usuario2]
comment = Directorio copias de seguridad de Usuario2
path = /media/respaldo/respaldo_usuario2
valid users = usuario2 @sambaadmins
browseable = yes
read only = no
force directory mode = 2770
force create mode = 0770
|
Guardo los cambios y antes de reiniciar Samba compruebo con el programa de test testparm
que no hay ningún fallo dentro de la configuracion del archivo.
1
2
|
usuario@servidor:~$ sudo testparm
usuario@servidor:~$ sudo systemctl restart smbd
|
Acceso al servidor Samba desde la linea de comandos
Se puede usar una herramienta llamada smbclient para acceder a Samba desde la línea de comandos.
Este paquete no está incluido de manera predeterminada en la mayoría de las distribuciones de Linux, por lo que se debería instalar con el administrador de paquetes local apt.
En Debian y Ubuntu, se instala smbclient con el siguiente comando:
1
2
|
usuario@usuariopc:~$ sudo apt-get update
usuario@usuariopc:~$ sudo apt-get install smbclient
|
Para montar, en el sistema de archivos de mi ordenador personal con Debian, recursos de redes CIFS compartidos en máquinas remotas, debo instalar las Utilidades Comunes para Sistemas de Archivos de Internet ,“Common Internet File System utilities” cifs-utils
:
1
|
usuario@usuariopc:~$ sudo apt -y install cifs-utils
|
smbclient usa el siguiente formato para acceder a los recursos compartidos de Samba:
1
|
smbclient //ip_samba_hostname_o_server_ip/share -U username
|
Después de ejecutar el comando smbclient, me pide la contraseña de Samba y me registra en una interfaz de línea de comandos que recuerda la interfaz de texto FTP:
Esta interfaz es más útil para probar nombres de usuario y contraseñas y acceso de lectura y escritura.
Por ejemplo, puedo crear un directorio y enumerar su contenido de la siguiente manera:
1
2
|
smb: \> mkdir prueba
smb: \> ls
|
Para eliminar el directorio puedo escribir:
smb: \> rmdir test
Si quiero acceder como usuario1
al recurso compartido común intercambios
, cambio el comando a:
1
|
smbclient //samba.ejemplo.com/intercambios -U usuario1
|
o al recurso compartido Cosas de Usuario1
:
1
2
3
4
5
6
|
usuario@usuariopc:~$ smbclient //servidor-nombre.local/'Cosas de Usuario1' -U usuario1
mkdir failed on directory /var/run/samba/msg.lock: Permiso denegado
Unable to initialize messaging context
Enter WORKGROUP\usuario1's password:
Try "help" to get a list of possible commands.
smb: \>
|
Veo que aparece un error, no me permite acceder al directorio /var/run/samba/msg.lock
. es un bug reportado para la version de Samba 4.9.5 que porta Debian Buster
Realizo un test de velocidad para conocer la velocidad de transferencia entre los distintos discos
1
2
3
4
5
6
7
8
9
10
11
|
usuario@servidor:~$ sudo hdparm -t /dev/sdc
/dev/sdc:
Timing buffered disk reads: 92 MB in 3.05 seconds = 30.17 MB/sec
usuario@servidor:~$ sudo hdparm -t /dev/sdb
/dev/sdb:
Timing buffered disk reads: 288 MB in 3.01 seconds = 95.56 MB/sec
usuario@servidor:~$ sudo hdparm -t /dev/sda
/dev/sda:
Timing buffered disk reads: 1296 MB in 3.00 seconds = 431.78 MB/sec
|