了解目录服务
目录服务是由目录数据库和一套能够访问和处理数据库信息的协议组成的服务协议,用于集中的管理主机帐号密码,员工名字等数据,大大的提升了管理工作效率。轻量级目录访问协议LDAP(Lightweight Directory Access Protocol)是在目录访问协议X.500的基础上研发的,主要的优势是:
X.500目录协议功能非常臃肿,消耗大量资源,无法做到快速查询且不支持TCP/IP协议网络。
LDAP采用树状结构存储数据(类似于DNS服务程序),用于在IP网络层面实现对分布式目录的访问和管理操作,条目是LDAP协议中最基本的元素,可以想象成字典中的单词或者数据库中的记录,通常对LDAP服务程序的添加、删除、更改、搜索都是以条目为基本对象的。
LDAP树状结构存储数据
dn:每个条目的唯一标识符,如上图中linuxprobe的dn值是:
cn=linuxprobe,ou=marketing,ou=people,dc=mydomain,dc=org
rdn:一般为dn值中最左侧的部分,如上图中linuxprobe的rdn值是:
cn=linuxprobe
base DN:此为基准DN值,表示顶层的根部,上图中的base DN值是:
dc=mydomain,dc=org
每个条目可以有多个属性(如姓名、地址、电话等),每个属性中会保存着对象名称与对应值,LDAP已经为运维人员对常见的对象定义了属性,其中有:
属性名称 | 属性别名 | 语法 | 描述 | 值(举例) |
---|---|---|---|---|
commonName | cn | Directory String | 名字 | sean |
surname | sn | Directory String | 姓氏 | Chow |
organizationalUnitName | ou | Directory String | 单位(部门)名称 | IT_SECTION |
organization | o | Directory String | 组织(公司)名称 | linuxprobe |
telephoneNumber | Telephone Number | 电话号码 | 911 | |
objectClass | 内置属性 | organizationalPerson |
目录服务实验
penLdap是基于LDAP协议的开源程序,它的程序名称叫做slapd,本次实验需要用到两台主机:
主机名称 | 操作系统 | IP地址 |
---|---|---|
LDAP服务端(instructor.linuxprobe.com) | 红帽RHEL7操作系统 | 192.168.10.10 |
LDAP客户端 | 红帽RHEL7操作系统 | 192.168.10.20 |
1.安装openldap服务端相关的软件包。
openldap:openldap主程序
openldap-clients:openldap客户端程序
openldap-servers:openldap服务端程序
migrationtools:迁移工具(手工编写的配置文件,openldap是读不懂的,需要用迁移工具把自行编写的配置文件转换成openldap能读懂的格式)
yum install -y openldap openldap-clients openldap-servers migrationtools
2.设置LDAP服务器全局连接密码(记住生成的密码字符串,后面有用),写入一条主机与IP地址的解析记录。(此步骤客户端也要做。实际工作中,这本应该要配置DNS服务去解析,但此实验主要目的是检验配置openldap服务端的效果,因此怎么简单怎么来。)
slappasswd -s kamin -n > /etc/openldap/passwd #生成明文密码kamin的密文密码
cat /etc/openldap/passwd #查看生成的文件内容(每重新执行一次命令,生成的值都是不同的)
echo "192.168.10.10 fuckwjm.kamin.com" >> /etc/hosts #往/etc/hosts文件追加一条主机与IP地址的解析记录
3.使用openssl工具生成X509格式的证书文件(公钥和私钥),并修改生成的证书的所属与权限。因为LDAP目录服务是以明文的方式在网络中传输数据的(包括密码),安全性很低,因此采用TLS加密机制提高安全性。
openssl req -new -x509 -nodes -out /etc/openldap/certs/cert.pem -keyout /etc/openldap/certs/priv.pem -days 365 #生成X509格式的证书文件,有效期365天。-out公钥,-keyout私钥,-days有效天数
...
Country Name (2 letter code) [XX]: #输入国家名称,直接回车(下同)
State or Province Name (full name) []: #输入省份,回车
Locality Name (eg, city) [Default City]: #输入城市,回车
Organization Name (eg, company) [Default Company Ltd]: #输入组织名称,回车
Organizational Unit Name (eg, section) []: #输入组织单位名称,回车
Common Name (eg, your name or your server hostname) []: #输入服务器主机名,键入fuckwjm.kamin.com(要跟上面/etc/hosts新增的主机名一样),回车
Email Address []: #输入邮件地址回车
cd /etc/openldap/certs/ #进入生成密钥对的所在目录
chown ldap:ldap * #更改密钥对所在目录的文件的所有者和所属组为ldap(该用户在安装好openldap服务后自动生成)
chmod 600 priv.pem #降低私钥的文件权限为仅root用户可读写
ls -al #查看密钥对所在目录所有文件的权限情况
4.生成LDAP数据库文件并启用slapd服务程序。先复制一份LDAP的数据库配置文件的模板,再生成LDAP数据库文件(可以忽略报错信息),并修改LDAP数据库的所有者和所有组,最后启动slapd服务并加入开机启动项。
cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG #复制一份LDAP的数据库配置文件的模板
slaptest #生成LDAP数据库文件(可以忽略报错信息)
chown ldap:ldap /var/lib/ldap/* #修改LDAP数据库的所有者和所有组
systemctl restart slapd #启动slapd服务并加入开机启动项
systemctl enable slapd
5.在日志记录服务的配置文件中追加设置LDAP日志文件的配置,以保存LDAP日志信息,并重启日志服务。
vim /etc/rsyslog.conf #编辑日志记录服务的配置文件
...
local4.* /var/log/ldap.log #追加设置LDAP日志文件的配置
...
systemctl restart rsyslog #重启日志服务
在LDAP目录服务中使用LDIF(LDAP Interchange Format)格式来保存信息,而LDIF是一种标准的文本文件且可以随意的导入导出,所以我们需要有一种“格式”标准化LDIF文件的写法,这中格式叫做“schema”,schema用于指定一个目录中所包含对象的类型,以及每一个类型中的可选属性,我们可以将schema理解为面向对象程序设计中的“类”,通过“类”定义出具体的对象,因此其实LDIF数据条目则都是通过schema数据模型创建出来的具体对象:
ldapadd命令用于将LDIF文件导入到目录服务数据库中,格式为:“ldapadd [参数] LDIF文件”。
参数 | 作用 |
---|---|
-x | 进行简单认证。 |
-D | 用于绑定服务器的dn。 |
-h: | 目录服务的地址。 |
-w: | 绑定dn的密码。 |
-f: | 使用LDIF文件进行条目添加的文件。 |
添加cosine和nis模块,配置基础用户认证结构。
cd /etc/openldap/schema/ #该目录有很多ldif结尾的模版文件
ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f cosine.ldif #添加cosine模块
ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f nis.ldif #添加nis模块
配置LDAP本地服务器域。
配置LDAP的顶级域(base DN)。创建/etc/openldap/changes.ldif文件,按一定格式输入配置信息,并将其更新到slapd服务程序。
vim /etc/openldap/changes.ldif
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=kamin,dc=com(主机名为fuckwjm.kamin.com,则域为kamin.com)
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=Manager,dc=kamin,dc=com
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootPW
olcRootPW: 此处输入之前生成的密码({SSHA}3SUlqsjHGbPjFiviFKuGanqZhMSExOs7)
dn: cn=config
changetype: modify
replace: olcTLSCertificateFile
olcTLSCertificateFile: /etc/openldap/certs/cert.pem
dn: cn=config
changetype: modify
replace: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/openldap/certs/priv.pem
dn: cn=config
changetype: modify
replace: olcLogLevel
olcLogLevel: -1
dn: olcDatabase={1}monitor,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read by dn.base="cn=Manager,dc=linuxprobe,dc=com" read by * none
ldapmodify -Y EXTERNAL -H ldapi:/// -f /etc/openldap/changes.ldif #将changes.ldif配置文件更新到slapd服务程序
配置LDAP的组织单位(OU)。创建/etc/openldap/base.ldif文件,按一定格式输入配置信息,并导入该文件,按该文件的配置来创建目录的结构服务。
vim /etc/openldap/base.ldif #编辑/etc/openldap/base.ldif文件
dn: dc=kamin,dc=com
dc: kamin
objectClass: top
objectClass: domain
dn: ou=People,dc=kamin,dc=com
ou: People
objectClass: top
objectClass: organizationalUnit
dn: ou=Group,dc=kamin,dc=com
ou: Group
objectClass: top
objectClass: organizationalUnit
ldapadd -x -w kamin -D cn=Manager,dc=kamin,dc=com -f /etc/openldap/base.ldif #导入base.ldif文件,根据该文件的配置创建目录的结构服务
创建若干个测试用户,设置用户的迁移,把用于测试的用户以及对应的用户组信息迁移至目录服务。
用户和用户组信息分别存放在/etc/passwd和/etc/group文件中,创建好测试用户后,可以读取这两个文件把测试用户的信息抽出来保存。通过migrationtools迁移工具将其转换为LDAP能读懂的格式,再将转换好的ldif文件导入ldap。
useradd test1 #创建测试用户(创建用户后相关信息会默认生成与用户名同名的用户组,)
useradd test2
vim /usr/share/migrationtools/migrate_common.ph #配置用户的迁移
...
$DEFAULT_MAIL_DOMAIN = "kamin.com";
...
$DEFAULT_BASE = "dc=kamin,dc=com";
...
cd /usr/share/migrationtools/ #进入migrationtools迁移工具的目录
grep ":10[0-9][0-9]" /etc/passwd > passwd #抽取出测试用户的信息另存为passwd文件
./migrate_passwd.pl passwd users.ldif #通过migrationtools迁移工具将passwd文件转换为LDAP能读懂的ldif格式
ldapadd -x -w kamin -D cn=Manager,dc=kamin,dc=com -f users.ldif #把转换好格式的users.ldif文件导入到openldap数据库中
grep ":10[0-9][0-9]" /etc/group > group #抽取出测试用户对应用户组的信息另存为group文件
./migrate_group.pl group groups.ldif #通过迁移工具将group文件转换成LDAP能读懂的ldif格式
ldapadd -x -w kamin -D cn=Manager,dc=kamin,dc=com -f groups.ldif #把转换好格式的groups.ldif文件导入到openldap数据库中
ldapsearch -x cn=test1 -b dc=kamin,dc=com #检索测试用户test1,查看openldap中用户test1的配置信息
安装httpd服务程序,将第3步生成的公钥文件复制到网站目录,供客户端下载。(这一步主要是要让服务端为客户端提供下载公钥文件的途径。)
yum install -y httpd
cp /etc/openldap/certs/cert.pem /var/www/html #将公钥文件上传至网站目录
systemctl restart httpd #重启httpd服务并加入开机启动项
systemctl enable httpd
iptables -F #清空防火墙规则并保存状态
service iptables save
配置NFS服务,共享openldap用户的家目录。(如果不做这一步,则在客户端切换登录到openldap用户时,会提示没有该用户的家目录。另外,该步骤可以采用很多方式,samba、autofs都可以。)
vim /etc/exports
/home/test1 *(rw,sync,root_squash) #共享/home/test1目录,*代表任何主机都可以使用本机NFS共享的/home目录
/home/test2 *(rw,sync,root_squash) #
systemctl restart rpcbind #先重启rpcbind服务程序并加入启动项,通过RPC把FNS服务器的ip地址和端口号等信息发送给客户端
systemctl enable rpcbind
systemctl restart nfs-server #再重启nfs服务并加入开机启动项
systemctl enable nfs-server
配置LDAP客户端(192.168.10.20)
1.把服务端的NFS服务共享的openldap用户家目录挂载到客户端上。 虽然可以直接在客户机的/etc/fstab文件中直接追加服务端的nfs共享目录挂载信息,但是假如有100个openldap用户,则要挂载很多个用户家目录(经验证,是不能以/home/*这样的格式去批量挂载的)。考虑这一点,建议在客户端安装并配置autofs自动挂载服务。该服务可以灵活配置参数,而不需要往/etc/fstab文件追加多条挂载信息这么麻烦。
注意:因为服务端中用ldapsearch命令检索并查看测试用户信息时,家目录为/home/*(*泛指测试用户名),所以在客户端的挂载目录也必须是在/home/下(像/home/ldap/,中间又新建了一个ldap目录都不行)!
yum install -y autofs #安装autofs服务程序
vim /etc/auto.master #编辑autofs主配置文件
...
/home /etc/ldap.misc #指定设备挂载位置的上一级目录和对应的子配置文件
...
vim /etc/ldap.misc
* -fstype=nfs,rw,vers=3 fuckwjm.kamin.com:/home/& #主机名也可用ip地址代替,当访问本机/home/*的资源时,自动挂载上服务端NFS共享的/home/&(&代表任意名称的目录)
systemctl restart autofs #重启autofs服务并加入开机启动项
systemctl enable autofs
cd /home/test2 #尝试访问本不存在的/home/test2,提示Permission denied(共享目录的权限为700),但说明autofs服务已配置成功。
2.写入LDAP服务端主机名与IP地址的解析记录,并安装openldap客户端相关软件包。各安装包作用:
echo "192.168.10.10 fuckwjm.kamin.com" >> /etc/hosts #往/etc/hosts追加LDAP服务端的解析记录
yum install -y openldap-clients nss-pam-ldapd authconfig-gtk pam_krb5 #安装openldap客户端相关软件包
3.运行界面化的系统认证工具,填好相应的LDAP服务信息。
运行系统认证工具的方法:
命令方式进入:执行authconfing-gtk或者system-config-authentication都可以
桌面方式进入:(RHEL7系统桌面)左上角Application -> Sundry -> Authentication
authconfig-gtk #运行系统认证工具
输入openldap的顶级域和openldap服务器地址,勾选上“Use TLS to encrypte connections”表示采用TLS验证openldap连接。
点击 Download CA Certificate… ,输入公钥的下载地址(服务端配置了httpd服务):http://fuckwjm.kamin.com/cert.pem
配置好后,再切换openldap的用户,就能正常登陆使用,且不会因找不到家目录以及无权创建家目录而报错