这里我使用的是 samba(文件共享服务) v4.9.1 + OPENldap(后端数据库软件) v2.4.44 + smbldap-tools(后端数据库管理软件) v0.9.11 + CentOS7. 如果有不同, 可能会有部分问题.
注:
samba 的功能不只有文件共享, 还可以作为一台域成员, 甚至域控制器. 千万不要认为 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 所创建的内容了.
在图中我们可以看到 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(/.*)?' # 这里我使用 samba 共享使用的 type
- # 如果要使 samba 可以访问 /home 则应当开启 samba_enable_home_dirs 这个 bool 值.
- # 但是 我这里因为使用的是 samba_share_t 这个 type 类型, 所以无需开启 任何 bool 值, 保证了 / home 下的文件信息不会被 samba 访问到.
- restorecon -R /var/smb/ # 然后我们在重置 /var/smb 目录下的 SELinux type 类型即可.
- # 这话我们就能进行 samba 的测试了
- smbclient -L //127.0.0.1/ -U User1
这里我们也就可看到了, User1 用户已经可以登入并查询到共享目录了.
那么我们这里直接登入进去, 上传一些文件做一些测试:
OK, 那么这样一个 samba 的文件共享就完成了.
本文经「原本」原创认证, 作者乾坤盘, 访问 yuanben.io 查询 [2H0DBHHY] 获取授权信息.
来源: https://www.cnblogs.com/somata/p/sambaAndOPENldapBuildFileShareServer.html