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=samba
ypath="%(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