内网群晖
NAS
由本地账号改成OpenLDAP
认证,使用的OpenLDAP
版本默认没有开启samba
属性,因此不能使用账号进行SMB
协议认证,也就是使用\\IP\路径
的方式进行访问。如改成FTP
的方式那共享中的图片将不能进行预览,要支持预览的话就需要下载专门的FTP
的客户端进行访问,如SmartFTP
,那这样一来体验就有所下降,综上决定对账号添加SMB
特性。
OpenLDAP 和 Self-Service 使用容器安装,版本如下:
系统版本 | OpenLDAP | Self-Service |
---|---|---|
CentOS 7.6 | bitnami/openldap:2.4.56 | tiredofit/self-service-password |
添加 SMB
属性到 OpenLDAP
,可以通过引入Samba LDAP schema
(模式)来获得此类属性。该模式已存在于现在安装的 SAMBA
包中,通过 ldif
格式来导入。
# yum install samba -y
# find / -type f -name "samba.ldif"
/usr/share/doc/samba-4.10.16/LDAP/samba.ldif
# cp /usr/share/doc/samba-4.10.16/LDAP/samba.ldif /data/bitnami/conf/
# ldapadd -Q -Y EXTERNAL -H ldapi:/// -f samba.ldif
adding new entry "cn=samba,cn=schema,cn=config"
# 查看是否启用了samba
# ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:/// -b cn=config dn
dn: cn=config
dn: cn=module{0},cn=config
dn: cn=schema,cn=config
dn: cn={0}core,cn=schema,cn=config
dn: cn={1}cosine,cn=schema,cn=config
dn: cn={2}inetorgperson,cn=schema,cn=config
dn: cn={3}nis,cn=schema,cn=config
dn: cn={4}samba,cn=schema,cn=config
......
命令行添加支持 SMB
特性的用户,配置中关于 SMB
的字段不能缺失,缺失后将不支持 SMB
协议访问群晖 NAS
。
控制台先在组织架构下建立一个 Entry
,选择 Samba Domain
。
# cat ldapuser.ldif
dn: cn=张三,cn=运维组,ou=发行系统,dc=ldap,dc=cn
cn: 张三
gidnumber: 1816016195
homedirectory: /home/user/feb
loginshell: /usr/sbin/nologin
mail: zhangsan@ldap.cn
objectclass: inetOrgPerson
objectclass: top
objectclass: posixAccount
objectclass: shadowAccount
objectclass: sambaSamAccount
sambalmpassword: 123456
sambantpassword: 123456
sambapwdcanchange: 1660470662
sambapwdlastset: 1660038662
sambapwdmustchange: 1660039590
sambasid: S-1-5-21-3004
shadowwarning: 8
sn: feb
uid: feb
uidnumber: 100268
userpassword: 123456
# 进入到容器内部执行
# ldapadd -h localhost -p 1389 -D "cn=admin,dc=ldap,dc=cn" -W -x -f ldapuser.ldif
在 Window
中使用如下方式访问,也就是使用 SMB
协议访问
自助修改密码以 tiredofit/self-service-password
服务为例子,如果我们要支持修改密码的同时修改掉SAMBA
的密码,我们把配置如下注释打开即可。
# vim htdocs/conf/config.inc.php
......
# Samba mode
# true: update sambaNTpassword and sambaPwdLastSet attributes too
$samba_mode = true;
......
执行上述操作后,修改密码会出现如下操作,是因为 LDAP
管理员账号没有修改 SAMBA
属性相关的权限。
查看 PHP
日志会出现如下错误
......
[16-Aug-2022 17:34:44] WARNING: [pool www] child 2600 said into stderr: "NOTICE: PHP message: LDAP - Modify password error 50 (Insufficient access)"
......
查看 OpenLDAP
日志会出现如下错误
......
62f1dbfb conn=1016 op=3 SRCH base="cn=common-feb2,ou=sz,dc=ldap,dc=cn" scope=0 deref=0 filter="(objectClass=*)"
62f1dbfb conn=1016 op=3 SRCH attr=userPassword
62f1dbfb conn=1016 op=3 SEARCH RESULT tag=101 err=0 nentries=1 text=
62f1dbfb conn=1016 op=4 MOD dn="cn=common-feb2,ou=sz,dc=ldap,dc=cn"
62f1dbfb conn=1016 op=4 MOD attr=sambaNTPassword sambaPwdLastSet sambaPwdCanChange sambaPwdMustChange userPassword
62f1dbfb conn=1016 op=4 RESULT tag=103 err=50 text=
62f1dbfb conn=1016 op=5 UNBIND
62f1dbfb conn=1016 fd=15 closed
......
# cat updatepass.ldif
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcAccess
olcAccess: to attrs=sambaNTPassword
by dn="cn=admin,dc=ldap,dc=cn" write
by dn.children="cn=admin,dc=ldap,dc=cn" write
by anonymous auth
by self write
by * none
olcAccess: to attrs=sambaPwdLastSet
by dn="cn=admin,dc=ldap,dc=cn" write
by dn.children="cn=admin,dc=ldap,dc=cn" write
by anonymous auth
by self write
by * none
olcAccess: to attrs=sambaPwdCanChange
by dn="cn=admin,dc=ldap,dc=cn" write
by dn.children="cn=admin,dc=ldap,dc=cn" write
by anonymous auth
by self write
by * none
olcAccess: to attrs=sambaPwdMustChange
by dn="cn=admin,dc=ldap,dc=cn" write
by dn.children="cn=admin,dc=ldap,dc=cn" write
by anonymous auth
by self write
by * none
olcAccess: to attrs=sambalmpassword
by dn="cn=admin,dc=ldap,dc=cn" write
by dn.children="cn=admin,dc=ldap,dc=cn" write
by anonymous auth
by self write
by * none
# ldapmodify -Y EXTERNAL -H ldapi:/// -f updatepass.ldif
到这还是不能修改,因为在一开始为了修改支持修改密码我添加了一个 read
规则,这个规则是在当前 samba
规则前面,会导致修改 samba
密码时依旧报错 密码被 LDAP 服务器拒绝
。所以我们必须调整一下 read
的位置,将 read
放在最后面。 直接通过命令行去调整配置的顺序目前还不了解,但是可以手动去调整该配置。
这是在支持 SAMBA
属性修改之前的配置,目的是为了能在控制台修改密码,未加的修改密码依旧会报 密码被 LDAP 服务器拒绝
错误
# cat updatepass.ldif
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcAccess
olcAccess: to attrs=userPassword
by dn="cn=admin,dc=ldap,dc=cn" write
by dn.children="cn=admin,dc=ldap,dc=cn" write
by anonymous auth
by self write
by * none
olcAccess: to *
by dn="cn=admin,dc=ldap,dc=cn" write
by dn.children="cn=admin,dc=ldap,dc=cn" write
by * read
先停止 OpenLDAP
服务,打开配置文件,进行手动修改
# vim slapd.d/cn\=config/olcDatabase\=\{2\}hdb.ldif
# 修改这个配置顺序,将一开始的 read 配置移到最后,并修改 {x} 的顺序,实际就是 olcAccess 后面括号的顺序问题
......
olcAccess: {6}to attrs=*
......
启动 OpenLDAP
服务,接下来修改密码就不会报 密码被 LDAP 服务器拒绝
的错误了。