samba + OPENldap 搭建文件共享服务器
samba + openldap 搭建文件共享服务器
这里我使用的是 samba(文件共享服务) v4.9.1 + openldap(后端数据库软件) v2.4.44 + smbldap-tools(后端数据库管理软件) v0.9.11 + centos7。 如果有不同,可能会有部分问题。
注:
- samba 的功能不只有文件共享,还可以作为一台windows域成员,甚至windows域控制器。千万不要认为samba只是一个文件共享服务。
- 由于我们使用了samba的文件共享功能,与文件权限有直接的联系,所以samba中的使用的用户必须是linux中能查询到。因为使用了 openldap 作为samba 的后端数据库,所以我们这里还需要配置linux能查询到 openldap 中的用户信息,也就是需要配置 nss。关于nss部分的配置需要在smbldap-tools 初始化ldap数据库后完成nss部分的配置,需要注意!!!
- samba 有使用pam作为认证模块,和使用其自带的认证程序,在centos中编译时配置的是使用其自带的认证程序,所以pam的配置可以省略。
- 如果想要配置openldap中的用户可以登入系统,可以查阅这篇文章:《配置linux使用ldap用户认证》,其中的配置与本文中的配置并不相同,需要注意!!!
初始化配置
yum 源和网络配置省略。
yum -y install samba openldap-servers openldap-clients smbldap-tools nss-pam-ldapd
配置openldap服务
这里只进行简单的服务配置,数据库配置这里会使用 smbldap-tools 进行配置,如果不知道openldap 可以去看看这篇文章:《openldap 服务搭建和后期管理》
这里将 openldap 所有配置清空,重新配置。
# 首先备份文件,以免无法复原 mkdir /root/back tar -jcvf /root/back/slapd.config-`date '+(%y.%m.%d_%h:%m:%s)'`.tar.xz /etc/openldap/slapd.d/ tar -jcvf /root/back/slapd.data-`date '+(%y.%m.%d_%h:%m:%s)'`.tar.xz /var/lib/ldap/ # 然后再删除配置文件 rm -rf /etc/openldap/slapd.d/* rm -rf /var/lib/ldap/* # 复制一个samba的schema文件 cp /usr/share/doc/samba-4.9.1/ldap/samba.ldif /etc/openldap/schema/
这里的配置文件我是从/usr/share/openldap-servers/slapd.ldif
中复制过来,并修改成如下这个样子的。主要修改了basedn(suffix), openldaptls,olcrootpw(密码由 slappasswd 生成,本文中的密码为: 123456) 和 include
# file: /tmp/slapd.ldif dn: cn=config objectclass: olcglobal cn: config olcargsfile: /var/run/openldap/slapd.args olcpidfile: /var/run/openldap/slapd.pid dn: cn=schema,cn=config objectclass: olcschemaconfig cn: schema include: file:///etc/openldap/schema/core.ldif include: file:///etc/openldap/schema/cosine.ldif include: file:///etc/openldap/schema/nis.ldif include: file:///etc/openldap/schema/inetorgperson.ldif include: file:///etc/openldap/schema/samba.ldif dn: olcdatabase=frontend,cn=config objectclass: olcdatabaseconfig objectclass: olcfrontendconfig olcdatabase: frontend dn: olcdatabase=config,cn=config objectclass: olcdatabaseconfig olcdatabase: config olcaccess: to * by dn.base="gidnumber=0+uidnumber=0,cn=peercred,cn=external,cn=auth" manage by * none dn: olcdatabase=monitor,cn=config objectclass: olcdatabaseconfig olcdatabase: monitor olcaccess: to * by dn.base="gidnumber=0+uidnumber=0,cn=peercred,cn=external,cn=auth" read by dn.base="cn=manager,dc=black,dc=com" read by * none dn: olcdatabase=hdb,cn=config objectclass: olcdatabaseconfig objectclass: olchdbconfig olcdatabase: hdb olcsuffix: dc=black,dc=com olcrootdn: cn=manager,dc=black,dc=com olcrootpw: {ssha}l1vbi/homkleiqzgcm3co+hfqi68rh1q olcdbdirectory: /var/lib/ldap olcdbindex: objectclass eq,pres olcdbindex: ou,cn,mail,surname,givenname eq,pres,sub,uid
根据配置生成服务器的配置文件
slapadd -f "/etc/openldap/slapd.d/" -b "cn=config" -l /tmp/slapd.ldif # 这里还需要注意文件属主还是root的,需要改回为openldap chown -r ldap:ldap /etc/openldap/slapd.d/* # 然后再开启服务即可 systemctl start slapd
_#################### 100.00% eta none elapsed none fast!
closing db...
注:这里只配置了openldap中的服务配置部分,没有配置openldap 的数据库,这里再次强调以下。
配置 samba
这里只是为了测试使用samba 与 openldap 的使用,就不进行过于复杂的文件共享配置了,只共享一个用户的家目录仅供测试。
# file: /etc/samba/smb.conf [global] workgroup = mygroup # 指定共享组名称。 server string = samba server version %v log file = /var/log/samba/log # 日志 security = user # 指定安全级别为user passdb backend = ldapsam:ldap://127.0.0.1 # 指定passdb 的后端数据库使用ldapsam ldap suffix = dc=black,dc=com # 指定ldap的 suffix ldap user suffix = ou=people # 指定用户的 suffix 段位 ou=people 这里会与上一个suffix结合。 ldap group suffix = ou=group # 上同,指定的是用户组。 ldap admin dn = cn=manager,dc=black,dc=com # 指定查询ldap服务使用的管理员用户 ldap ssl = no # 指定不使用ssl加密。 load printers = no # 指定不加载共享打印机。 [homes] comment = home directories browseable = no writable = yes create mask = 0600 directory mask = 700
smbpasswd -w 123456 # 存储用于连接 ldap 服务的用户密码,!!!非常重要,否则无法启动smb服务。
启动samba服务
systemctl start nmb systemctl start smb
smbldap-tools 配置
这里使用 smbldap-tools 来快速完成 samba 服务所需要的数据信息,同时通过 smblda-tools 来进行用户段管理。但是smbldap-tools 有一个缺点就是 不会管你本地用户是否有相同的 uid 或则 gid,可能有冲突,需要注意。
smbldap 会从 /etc/samba/smb.conf 读取部分信息,所以需要先配置好samba再配置 smbldap-tools 服务。
smbldap-config # 配置 smbldap-tools 的配置,这里使用smbldap-conifg 简易配置。
这里省略下面的配置过程,不知道的默认即可。
smbldap-populate # 初始化配置 openldap 数据库。
这里再创建一个用户用于后面的测试使用。
smbldap-useradd -a -m user1 # 添加用户user2 # -a: 指定添加的用户类型为windows,这样samba 才能识别到该用户。 # -m: 指定创建该用户的家目录。 smbldap-passwd user1 # 修改该用户的用户密码
这里省略该用户的密码修改过程。
这样 openldap 的数据库初始化就完成了,这样就能去查询openldap 中的内容了。如下图,这个就是smbldap-populate
所创建的内容了。下图为 apache directory studio,有兴趣可以去研究一下《apache directory studio 简易使用》
在图中我们可以看到 uid = root 和 nobody 的用户,我并不想让这些特殊用户登入到服务器,所以在下面的配置,我会通过 fliter 将这2个用户过滤掉。
nss 配置
这里的nss配置主要就是需要配置,nss 将 ldap 的请求转发给 nslcd ,由 nslcd 来查询 openldap 中的用户信息。
首先配置 nss ,只需添加 passwd 段和 group 段的ldap认证即可。
# file: /etc/nsswitch.conf passwd: files ldap shadow: files group: files ldap hosts: files dns myhostname bootparams: nisplus [notfound=return] files ethers: files netmasks: files networks: files protocols: files rpc: files services: files sss netgroup: nisplus sss publickey: nisplus automount: files nisplus sss aliases: files nisplus
然后配置 nslcd, 注意 nslcd 是以daemon 形式运行的,主要配置后重启。
# file:/etc/nslcd.conf uid nslcd gid ldap uri ldap://127.0.0.1/ # ldap url地址 base dc=black,dc=com # base dn 路径 binddn cn=manager,dc=black,dc=com # 指定连接的用户 bindpw 123456 # 指定密码 ssl no # 指定不要使用ssl 加密连接。 filter passwd (&(objectclass=posixaccount)(uidnumber>=1000)) # 编写 passwd 的过滤规则。 filter group (&(objectclass=posixgroup)(gidnumber>=500)) # 上同,编写的是 group
chmod 600 /etc/nslcd.conf # 配置文件权限,非常重要,否则无法启动服务。 systemctl start nslcd # 启动 nslcd 服务。
我们这里测试以下 nss 的配置是否可用
getent passwd user1
user1:*:1001:513:system user:/var/smb/user1:/bin/bash
如上可见,我们配置的 nss 和 openldap 服务 已经生效了,下面我们再来继续配置samba,使其可用。
samba 权限配置
如果看的比较仔细的人,就会发现我将用户的home 目录位置存放在了/var/smb
位置,主要是为了不与系统中的用户搞混。并且这样可以通过selinux来隔离samba 禁止访问 /home
路径下的资源,详细请看下面操作。
# 上面通过 smbldap-useradd 命令,已经创建了用户的home 目录, # 下面可以直接进行selinux 的相关配置了。 semanage fcontext -a -t samba_share_t '/var/smb(/.*)?' # 修改/var/smb 路径的默认type,这里我用 samba 共享使用的type,selinux 默认允许访问这个type类型 # 如果要使samba 可以访问 /home 则应当开启 samba_enable_home_dirs 这个 bool 值。 # 但是 我这里因为使用的是 samba_share_t 这个 type 类型,所以无需开启 任何 bool 值,这样就能使samba只能访问到 /var/smb 和 samba 其他所需文件。 restorecon -r /var/smb/ # 然后我们在重置 /var/smb 目录下的selinux type 类型即可。
# 这里我们就能进行samba的测试了 smbclient -l //127.0.0.1/ -u user1
这里我们也就可看到了,user1 用户已经可以登入并查询到共享目录了。
那么我们这里直接登入进去,上传一些文件做一些测试:
ok,那么这样一个samba 的文件共享就完成了。
本文经「原本」原创认证,作者乾坤盘,访问yuanben.io查询【2h0dbhhy】获取授权信息。