Ldap - Samba - Hostpam
Se creara un servidor ldap con usuarios, un servidor samba con puntos de montaje para cada usuario y un host que autenticara usuarios mediante ldap, creara localmente un home a cada usuario y montara un recurso samba en el home del usuario.
Ldap
Partimos de un servidor ldap ya creado en docker con usuarios user01,...,user08, estos usuarios están repartidos en diferentes grupos hisx1,...,hisx4
docker run --rm --name ldapserver -h ldapserver --net ldapnet -d jorgepastorr/ldapserver19
user01:*:7001:610:user01:/tmp/home/hisx1/user01:/bin/bash
user02:*:7002:610:user02:/tmp/home/hisx1/user02:/bin/bash
user03:*:7003:611:user03:/tmp/home/hisx2/user03:
user04:*:7004:611:user04:/tmp/home/hisx2/user04:
user05:*:7005:612:user05:/tmp/home/hisx3/user05:
user06:*:7006:612:user06:/tmp/home/hisx3/user06:
user07:*:7007:613:user07:/tmp/home/hisx4/user07:
user08:*:7008:613:user08:/tmp/home/hisx4/user08:
Samba
El servidor samba tendrá los usuarios locales samba lila, pla, rock, patipla , y ademas los usuarios samba de ldap.
Para esto conectamos con el servidor ldap y los añadimos a samba.
Paquetes necesarios
dnf install -y passwd nss-pam-ldapd authconfig samba samba-client
Configurar conexión con ldap
authconfig --enableshadow --enablelocauthorize \
--enableldap \
--enableldapauth \
--ldapserver='ldapserver' \
--ldapbase='dc=edt,dc=org' \
--enablemkhomedir \
--updateall
Encender servicio
/sbin/nscd
/sbin/nslcd
ya podemos hacer getent passwd y ver los usuarios ldap.
Añadir usuarios
# usuarios locales samba
useradd lila
useradd rock
useradd patipla
useradd pla
echo -e "lila\nlila" | smbpasswd -a lila
echo -e "rock\nrock" | smbpasswd -a rock
echo -e "patipla\npatipla" | smbpasswd -a patipla
echo -e "pla\npla" | smbpasswd -a pla
A mas de añadir los usuarios ldap, hay que crearles el home y ponerles los permisos adecuados.
# usuarios ldap samba
for num in {01..08}
do
echo -e "jupiter\njupiter" | smbpasswd -a user$num
liniaget=$( getent passwd user$num )
uid=$( echo $liniaget | cut -d: -f 3 )
gid=$( echo $liniaget | cut -d: -f 4 )
homedir=$( echo $liniaget | cut -d: -f 6 )
if [ ! -d $homedir ];then
mkdir -p $homedir
cp -ra /etc/skel/. $homedir
chown -R $uid:$gid $homedir
fi
done
Configurar samba
En la configuración de samba nos interesa la sección de homes de usuario
/etc/samba/smb.conf
[global]
workgroup = MYGROUP
server string = Samba Server Version %v
log file = /var/log/samba/log.%m
max log size = 50
security = user
passdb backend = tdbsam
load printers = yes
cups options = raw
[homes]
comment = Home Directories
browseable = no
writable = yes
; valid users = %S
; valid users = MYDOMAIN\%S
[printers]
comment = All Printers
path = /var/spool/samba
browseable = no
guest ok = no
writable = no
printable = yes
Arrancar servicio
/sbin/smbd
/sbin/nmbd
Host
En el host nos interesa, tener conexión con ldap para la autentificación y con samba para crear el punto de montaje.
Paquetes necesarios
dnf install -y passwd nss-pam-ldapd authconfig samba-client cifs-utils pam_mount
Conexión ldap
authconfig --enableshadow --enablelocauthorize \
--enableldap \
--enableldapauth \
--ldapserver='ldapserver' \
--ldapbase='dc=edt,dc=org' \
--enablemkhomedir \
--updateall
/sbin/nscd
/sbin/nslcd
Usuarios locales
useradd local1
useradd local2
useradd local3
echo 'local1' | passwd local1 --stdin
echo 'local2' | passwd local2 --stdin
echo 'local3' | passwd local3 --stdin
Montaje automático
Para que monte automáticamente, el recurso samba en el home hay que modificar system-auth y pam_mount.conf.xml.
/etc/pam.d/system-auth
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth required pam_env.so
auth optional pam_mount.so
auth required pam_faildelay.so delay=2000000
auth sufficient pam_unix.so nullok try_first_pass
auth requisite pam_succeed_if.so uid >= 1000 quiet_success
auth sufficient pam_ldap.so use_first_pass
auth required pam_deny.so
account required pam_unix.so broken_shadow
account sufficient pam_localuser.so
account sufficient pam_succeed_if.so uid < 1000 quiet
account [default=bad success=ok user_unknown=ignore] pam_ldap.so
account required pam_permit.so
password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok
password sufficient pam_ldap.so use_authtok
password required pam_deny.so
session optional pam_keyinit.so revoke
session required pam_limits.so
-session optional pam_systemd.so
session optional pam_mkhomedir.so umask=0077
session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session required pam_unix.so
session optional pam_ldap.so
session [success=ignore default=1] pam_succeed_if.so uid >= 7000
session optional pam_mount.so
Se a añadido el modulo pam_mount.so con una condición, de que si el usuario tiene un uid >= 7000 ( los de ldap) se active.
/etc/security/pam_mount.conf.xml
...
<!-- Volume definitions -->
<volume user="*" fstype="cifs" server="samba" path="%(USER)" mountpoint="~/%(USER)" options="user=%(USER)" />
...
Se este archivo le decimos que montar y donde.
server=sambaypath="%(USER)"es equivalente a//server/user, donde el user sera el que inicia sesión.mountpoint"~/%(USER)"donde se montara.options="user=%(USER)"el usuario con el que hará la petición al recurso samba.
Docker
docker run --rm --name ldapserver -h ldapserver --net ldapnet -d jorgepastorr/ldapserver19
docker run --rm --name samba -h samba --net ldapnet --privileged -d jorgepastorr/samba19:pam
docker run --rm --name pam -h pam --net ldapnet --privileged -it jorgepastorr/hostpam19:samba
[local1@pam ~]$ su - user01
pam_mount password:
[user01@pam ~]$ pwd
/tmp/home/hisx1/user01
[user01@pam ~]$ ls
user01