欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

LDAP--OpenLDAP

程序员文章站 2022-03-04 19:53:28
...

首先说下标题LDAP–OpenLDAP,他们并不是一个东西。

LDAP:Lightweight directory access protocol 轻量级目录访问协议。是美国密歇根大学推出的基于X.500标准的一种简化的目录访问协议,属于目录服务。它里边的信息是一树形结构在一个数据库中存储的,ldap也可以说是一种数据库,但是又不同于我们理解的数据库,它的功能没那么强大。

目录服务

      目录服务是一种信息查询服务,把管理所需要的信息按照层次结构关系构造成一种树形结构,并将这些信息存储于目录数据库,使用树状结构的目录数据库提供信息查询。比如linux的目录结构就是倒树型。

目录数据库

       目录实际上就是一个数据库,里面储存了有关资源(文件)的信息,以及资源的位置、管理等。
      与关系型数据库相比,目录更容易为用户提供高效的查询,数据的读取和查询很快;但是写的效率较低。
      还是用linux举例子,/etc/httpd/conf/httpd.conf绝对路径,就是从根进行逐层搜索,最终找到了httpd.conf这个文件。

为什么使用LDAP

      LDAP对数据的读取做了很多优化,比如优化了数据类型,修改了锁机制,取消了不必要的函数,取消了回滚机制等等,非常适用于读多写少的环境,并且支持跨平台。如果你有一些面向查询的服务,那LDAP无疑是一个不错的选择。
LDAP目录中可以存储各种类型的数据:
      电子邮件地址; 人力资源数据; 公用密匙联系人列表等等。

什么时候使用LDAP

在使用LDAP存储你的数据前,你应该先问以下几个问题:
      1 你的数据是不是需要在不同的平台上读取?
       2 你的数据是不是很少发生更改,但是会被频繁的读取?
       3 你的数据是否能存放于一个平面数据库中?
如果都为是,那么恭喜,LDAP将是你最好的选择。

我们用的软件就是用ldap技术实现了用户集中管理的软件OpenLDAP。

层次结构:
例子:
把一个大学的庞大的学生信息放到LDAP里:
(1)建立一个"dc=ourschool,dc=edu“的树根"
(2)建立若干个系:
ou=computer,dc=ourschool,dc=edu
ou=film,dc=ourschool,dc=edu

(3)在每个系建立专业 如
ou=linux,ou=computer,dc=ourschool,dc=edu
ou=network,ou=computer,dc=ourschool,dc=edu

(4)加学生
dn:cn=xiaoming,ou=linux,ou=computer,dc=ourschool,dc=edu
dn:cn=xiaoliang,ou=network,ou=computer,dc=ourschool,dc=edu

(5)学生的详细信息
dn:cn=xiaoming,ou=linux,ou=computer,dc=ourschool,dc=edu
objectClass: organizationalPerson
cn:xiaoming
cn:小明
description:a good boy,…
基本概念

  • (1)Entry(条目),也叫记录项,是LDAP中最基本的颗粒,通常对LDAP的添加、删除、更改、检索都是以条目为基本对象的;
    dn:Distinguished Names 标识名;一条记录的位置 dc:domain component
    域组件;一条记录所属的区域 ou:organization Unit 组织单元;一条记录所属的组织 cn/uid:common
    name 通用名;一条记录的名字/ID

  • (2)属性(Attribute),每个条目都可以有很多属性;

  • (3)对象类(ObjectClass)是属性的集合;

  • (4)模式(Schema),对象类、属性类型、语法分别约定了条目、属性、值,这些构成了模式(Schema)–对象类的集合;

  • (5)数据库(database),保存数据的;

  • (6)SSL/TLS 的加密协议用来保证数据传送的保密性和完整性;

  • (7)LDIF(LDAP Data Interchange Format,数据交换格式)是LDAP数据库信息的一种文本格式,用于数据的导入导出,每行都是“属性: 值”。

具体配置:
OpenLDAP也是服务端客户端类型的。
172.16.12.62 server 端
172.16.12.63 client 端

首先配置server端

1、安装软件:

[aaa@qq.com_server ~]# yum install -y openldap openldap-servers openldap-clients openldap-devel migrationtools

2、生成加密密码:

[aaa@qq.com_server ~]# slappasswd
New password: 
Re-enter new password: 
{SSHA}I+VIzW+ERq8zOJbw1zIUAtvmC/4I4h+2
密码是000000 加密后是最下边的。

3、改配置文件:

[aaa@qq.com_server ~]# vim /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{1\}monitor.ldif
上边是配置文件。  
  7  al,cn=auth" read by dn.base="cn=Manager,dc=testl,dc=com" read by * none
增加管理员信息  Manager就是管理员用户名
修改dc后边的东西,这个是自定义的。也就是上边说的树根。
[aaa@qq.com_server ~]# vim /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{2\}hdb.ldif
  8 olcSuffix: dc=testl,dc=com
基准DN
  9 olcRootDN: cn=Manager,dc=testl,dc=com
管理员用户的DN
同上个配置文件,修改dc根,要想同。

 19 olcRootPW: {SSHA}G1cm46dfFkfjJb71PkmTBtooxKBRqPnc
管理员用户的密码

4、准备数据库配置文件:

[aaa@qq.com_server ~]# cd /var/lib/ldap/
这个目录就相当于是/var/lib/mysql,是存放数据库的位置。

[aaa@qq.com_server ldap]# cp /usr/share/openldap-servers/DB_CONFIG.example .
[aaa@qq.com_server ldap]# mv DB_CONFIG.example DB_CONFIG
[aaa@qq.com_server ldap]# chown -R ldap:ldap .

就将配置文件拷贝过来,然后赋予整个目录权限。

启动服务测试:

[aaa@qq.com ldap]# systemctl restart slapd
[aaa@qq.com ldap]# systemctl enable slapd
Created symlink from /etc/systemd/system/multi-user.target.wants/slapd.service to /usr/lib/systemd/system/slapd.service.

[aaa@qq.com ldap]# netstat -antlup | grep slapd
tcp        0      0 0.0.0.0:389             0.0.0.0:*               LISTEN      2259/slapd          
tcp6       0      0 :::389                  :::*                    LISTEN      2259/slapd  

5、加入数据库的schemas中:

PS:schema(发音 “skee-muh” ,中文叫模式)是数据库的组织和结构。模式中包含了schema对象,可以是表(table)、列(column)、数据类型(data type)、视图(view)、存储过程(stored procedures)、关系(relationships)、主键(primary key)、外键(foreign key)等。

这个可以是固定写法了,放到脚本中执行也可以。

cd /etc/openldap/schema/
ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f cosine.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f nis.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f collective.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f corba.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f core.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f duaconf.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f dyngroup.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f inetorgperson.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f java.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f misc.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f openldap.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f pmi.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f ppolicy.ldif

6、写个脚本,添加10个用户:(测试用)

[aaa@qq.com /]# mkdir /ldaphome

[aaa@qq.com ~]# vim useradd.sh 
#!/bin/bash

userlist="/root/userandpass.txt"

if [ ! -d ${userlist} ]
then
    touch ${userlist}
fi

> ${userlist}
for  i in `seq 1 10 `
do
    id user$i
    if [ $? -ne 0 ]
    then
        useradd user$i -d /ldaphome/user${i}
        passwd=$(tr -dc a-zA-Z0-9_ < /dev/urandom | head -c 6 | xargs)
        echo "${passwd}" | passwd user$i --stdin
        echo -e "user$i\t${passwd}" >> ${userlist}
    fi
done

[aaa@qq.com ~]# cat userandpass.txt 
user1	VX1dDz
user2	G9eKs6
user3	s8S2N8
user4	bNBwce
user5	QkGb2H
user6	Lx765n
user7	z7Au5H
user8	uvYOcF
user9	UnFmBq
user10	Gg3dV7

!!!!!!!一定要指定家目录。!!!!!!!!
!!!!!!!一定要指定家目录。!!!!!!!!
!!!!!!!一定要指定家目录。!!!!!!!!

要测试的只是后创建的10个用户所以重新建个文件方便。

[aaa@qq.com ~]# tail /etc/passwd > /tmp/passwd
[aaa@qq.com ~]# tail /etc/group > /tmp/group
[aaa@qq.com ~]# tail /etc/shadow > /tmp/shadow

7、编辑配置文件:

[aaa@qq.com_server ~]# cd /usr/share/migrationtools/
[aaa@qq.com_server migrationtools]# vim migrate_common.ph 
61     $NAMINGCONTEXT{'group'}             = "ou=Groups";
改下组的ou
 71 $DEFAULT_MAIL_DOMAIN = "testl.com";
 74 $DEFAULT_BASE = "dc=testl,dc=com";
dc改成最初设置的
 90 $EXTENDED_SCHEMA = 1;
改成1 
[aaa@qq.com_server migrationtools]# vim migrate_passwd.pl
188     open(SHADOW, "/tmp/shadow") || return;
这个就是指定了用户的密码文件

8、生成基本框架:

[aaa@qq.com_server migrationtools]# ./migrate_base.pl > /tmp/base.ldif

[aaa@qq.com_server migrationtools]# vim /tmp/base.ldif
删掉其他的剩这些够用。

dn: dc=testl,dc=com
dc: testl
objectClass: top
objectClass: domain
objectClass: domainRelatedObject
associatedDomain: testl.com

dn: ou=People,dc=testl,dc=com
ou: People
objectClass: top
objectClass: organizationalUnit
objectClass: domainRelatedObject
associatedDomain: testl.com

dn: ou=Groups,dc=testl,dc=com
ou: Groups
objectClass: top
objectClass: organizationalUnit
objectClass: domainRelatedObject
associatedDomain: testl.com

9、生成用户和组的数据文件:

[aaa@qq.com_server migrationtools]# ./migrate_passwd.pl /etc/passwd > /tmp/user.ldif
[aaa@qq.com_server migrationtools]# ./migrate_passwd.pl /etc/group > /tmp/group.ldif

//这个生成的文件 user.ldif就相当于是XXXX.sql 。SQL脚本,mysql备份导出的文件。保存着ldap的实际数据

10、将数据文件导入数据库:
先导入骨架

[aaa@qq.com_server migrationtools]# ldapadd -xWD "cn=Manager,dc=testl,dc=com" -f /tmp/base.ldif 
Enter LDAP Password: 
adding new entry "dc=testl,dc=com"

adding new entry "ou=People,dc=testl,dc=com"

adding new entry "ou=Groups,dc=testl,dc=com"

	-x	进行认证
	-W  输入密码
	-D	绑定服务器的基准DN
	-f	使用的ldif文件
	cn=Manager,dc=sgy,dc=com	ldap的管理员用户

然后导入数据

[aaa@qq.com_server migrationtools]# ldapadd -x -W -D "cn=Manager,dc=testl,dc=com" -f /tmp/user.ldif 
Enter LDAP Password: 
adding new entry "uid=user1,ou=People,dc=testl,dc=com"

adding new entry "uid=user2,ou=People,dc=testl,dc=com"
...........

[aaa@qq.com_server migrationtools]# ldapadd -x -W -D "cn=Manager,dc=testl,dc=com" -f /tmp/group.ldif 
Enter LDAP Password: 
adding new entry "cn=user1,ou=Groups,dc=testl,dc=com"

adding new entry "cn=user2,ou=Groups,dc=testl,dc=com"

adding new entry "cn=user3,ou=Groups,dc=testl,dc=com"
........
[aaa@qq.com_server migrationtools]# ldapsearch -xWD "cn=Manager,dc=testl,dc=com" -b "uid=user1,ou=People,dc=testl,dc=com" -LLL
Enter LDAP Password: 
dn: uid=user1,ou=People,dc=testl,dc=com
uid: user1
cn: user1
sn: user1
mail: aaa@qq.com.com
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
userPassword:: e2NyeXB0fSQ2JFY4Lks4MldxJGI1bVZDN2toWG84eThGY201R0JCaHRGLnZqN29
 0NmxNUlBIdUZpNS51ZmEyWEtjWm9DMFZsZHdUOFZWMnVBTWJhN3ZFWWFiN3JJcEI3QzlKSnliMWkx
shadowLastChange: 18242
shadowMin: 0
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 1000
gidNumber: 1000
homeDirectory: /ldaphome/user1

-b   后边加的是查询的条件
uid=user1用户ID,ou=People所在ou,dc=testl,dc=com这个是所在dc
-LLL就是详细显示

到这里服务端的内容就基本完成,并且也有user1到user10 10个用户。

其次,配置client端

1、安装软件

[aaa@qq.com_client ~]# yum install -y nss-pam-ldapd pam_krb5 setuptool

直接setup

[aaa@qq.com_client ~]# setup

打开之后就进到下边这个页面
LDAP--OpenLDAP
选择RunTool进行配置

LDAP--OpenLDAP
这些选项只选这2 个,按空格选中。

LDAP--OpenLDAP

在这里写上服务端IP和dc域。然后ok

又会跳到第一页。

LDAP--OpenLDAP

这次直接 Quit 退出就好了。

然后可以直接在额外的另一台机器上做测试。

[aaa@qq.com zones]# ssh aaa@qq.com】
IP输入client客户端的IP。
The authenticity of host '172.16.12.63 (172.16.12.63)' can't be established.
ECDSA key fingerprint is SHA256:iXTfA21RkpJUzHpSYB6d2ZIORcUpaKxDfPCTA0IM5W8.
ECDSA key fingerprint is MD5:21:21:2d:86:77:43:f6:90:16:cb:c7:58:e5:71:eb:71.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '172.16.12.63' (ECDSA) to the list of known hosts.
aaa@qq.com's password: 
Could not chdir to home directory /ldaphome/user1: No such file or directory

-bash-4.2$  这就登陆进来了,但是没有家目录。

-bash-4.2$ ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

从结果可以看到,在服务端创建的用户user1~user10 ,但是也能用这个用户直接登录client客户端。这就实现了用户的集中管理。

下面进行家目录的创建。NFS+自动挂载来实现。

server 端
配置NFS,共享ldap用户的家目录:
1、安装nfs

[aaa@qq.com_server migrationtools]# yum install nfs-* -y

2、设置共享目录

[aaa@qq.com_server ~]# vim /etc/exports
/ldaphome 172.16.0.0/16(rw,sync)
[aaa@qq.com_server ~]# systemctl restart nfs

client 端
配置autofs,自动挂载nfs的共享:
1、安装nfs 自动挂载

[aaa@qq.com_client ~]# yum install -y nfs-utils autofs

2、配置自动挂载

[aaa@qq.com_client ~]# showmount -e 172.16.12.62
Export list for 172.16.12.62:
/ldaphome 172.16.0.0/16
[aaa@qq.com_client ~]# vim /etc/auto.master
/ldaphome /etc/auto-ldap.conf   //加一行

[aaa@qq.com_client ~]# vim /etc/auto-ldap.conf
*   -rw,soft,intr   172.16.12.62:/ldaphome/&

[aaa@qq.com_client ldaphome]# systemctl restart autofs
[aaa@qq.com_client ldaphome]# systemctl enable autofs
Created symlink from /etc/systemd/system/multi-user.target.wants/autofs.service to /usr/lib/systemd/system/autofs.service.


[aaa@qq.com_client ~]# cd /ldaphome/
[aaa@qq.com_client ldaphome]# ls
[aaa@qq.com_client ldaphome]# cd user1
-bash: cd: user1: Permission denied
其实可以看一下,但是发现没有权限,而不是提示目录不存在,这就是ok了

再次在另一台机器上进行登录测试:
这次就有家目录了

[aaa@qq.com zones]# ssh aaa@qq.com
aaa@qq.com.16.12.63's password: 
Last login: Fri Dec 13 03:13:26 2019 from 172.16.12.32
[aaa@qq.com_client ~]$ pwd
/ldaphome/user1

应用:
1:ssh,那必须的能啊,刚才就是ssh访问的啊

2:vsftpd
client端安装vsftpd,然后启动服务。

[aaa@qq.com ~]# ftp 172.16.12.63
Connected to 172.16.12.63 (172.16.12.63).
220 (vsFTPd 3.0.2)
Name (172.16.12.63:root): user1   //直接输入这个user1用户
331 Please specify the password.  
Password:						//密码
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> 

对于别的机器来说,user1就在client上,没有什么差别。

3、samba

[aaa@qq.com ~]# yum install -y samba

[aaa@qq.com ~]# vim /etc/samba/smb.conf
[share]
    comment = ldap test user1
    path = /samba
    writable = yes
    create mask = 0664
    directory mask = 0775

[aaa@qq.com_client ~]# mkdir /samba
[aaa@qq.com_client ~]# chmod 1757 /samba/

[aaa@qq.com_client ~]# smbpasswd -a user1
New SMB password:
Retype new SMB password:
Added user user1.

[aaa@qq.com ~]# smbpasswd -a user2
New SMB password:
Retype new SMB password:
Added user ldap2.

[aaa@qq.com_client ldaphome]# systemctl restart smb

LDAP--OpenLDAP

ldap的管理:

用户的添加:
1、修改脚本,在跑一遍脚本

user11  riRpwt
user12  D7VOeu
user13  I_HPqa
user14  soHHYz
user15  HOypyM
user16  8lxGQq
user17  BVh0AD
user18  jaHYJN
user19  dZpDN1
user20  rFsDDL
生成了这几个         

2、做用户

[aaa@qq.com_server ~]# tail /etc/passwd > /tmp/passwdnew
[aaa@qq.com_server ~]# tail /etc/group > /tmp/groupnew
[aaa@qq.com_server ~]# tail /etc/shadow >> /tmp/shadow 
//注意最后的shadow要用追加,因为上边配置文件中的位置的这个,记录着用户的密码,要一直用的 ,如果重定向的话前10个用户就没有密码了。

3、生成数据文件然后导入:

[aaa@qq.com_server migrationtools]# ldapadd -xWD "cn=Manager,dc=testl,dc=com" -f /tmp/usernew.ldif

[aaa@qq.com_server migrationtools]# ldapadd -xWD "cn=Manager,dc=testl,dc=com" -f /tmp/groupnew.ldif
[aaa@qq.com zones]# ssh aaa@qq.com
aaa@qq.com.16.12.63's password: 
[aaa@qq.com_client ~]$ 
直接测试就好了

用户的删除:

server端删除
[aaa@qq.com_server migrationtools]#  ldapdelete -xWD "cn=Manager,dc=testl,dc=com" "uid=user1,ou=People,dc=testl,dc=com"
Enter LDAP Password: 

这个删除只是删除数据库中的那个记录,server端本机上的用户还在。

client端测试
[aaa@qq.com_client ldaphome]# su - user1
su: user user1 does not exist

用户的添加,单个:
添加单个的用户语法如下,这个很复杂。用脚本反而比较好点。

#!/bin/bash

cat << EOF| ldapadd -x -D "cn=Manager,dc=gsc,dc=com" -w 000000
dn: uid=user1,ou=People,dc=gsc,dc=com
uid: user1
cn: user1
sn: user1
mail: aaa@qq.com.com
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
userPassword:: e2NyeXB0fSQ2JEZ1cjZYSE40JFRLeWQ1dGcxVzNad2Y5SngzbEtaYURzeTl2R1E
 zcy5FeWdkUWZJQnNGYmRYMXFtNHBVUFFhRHQyLzUyM09ib1pzYzFkLnczUk1CbExGZDQ2dkRDLzgw
shadowLastChange: 18242
shadowMin: 0
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 1000
gidNumber: 1000
homeDirectory: /ldaphome/user1
EOF

用户信息的修改:
但是这个修改很麻烦。。。。

ldapmodrdn -x -D "cn=Manager,dc=testl,dc=com" -w123456 "uid=user2,ou=People,dc=testl,dc=com" "uid=user222"

密码的修改
-w是直接写入密码。

ldappasswd -x -D "cn=Manager,dc=testl,dc=com" -w000000  "uid=user2,ou=People,dc=testl,dc=com"  -s123456

另外OpenLDAP有图形化工具:

留个坑。。。。

相关标签: 安全

推荐阅读