OPENLDAP部署完整版(Linux)附一键式脚本,建议在干净的环境运行。

(一)环境信息

1,系统环境

项目Value
OScentos
CPU,MEM1核1G
DISK40G

2,域信息(本章节使用)

注意:以下内容均自定义。

项目Value
DNcn=admin,dc=test,dc=cn
CNadmin
DCtest
DCcn

(二)应用部署

1,ladp部署

1、 yum方式安装OpenLDAP服务

yum -y install openldap-servers openldap-clients

2、拷贝数据库配置配置文件,并启动服务

cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
chown ldap. /var/lib/ldap/DB_CONFIG
systemctl start slapd
systemctl enable slapd

3、slappasswd生成OpenLDAP管理员密码

注意:OpenLDAP管理员密码,记录下来(后边有个管理员密码,两者的区别个人并没有没有去了解)

slappasswd

在这里插入图片描述

vim chrootpw.ldif
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}+YIJ4gVMNx+8OlYYYbjFtCvTZTfzisjO
ldapadd -Y EXTERNAL -H ldapi:/// -f chrootpw.ldif

在这里插入图片描述

4、导入基本的模式

ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif

5、在OpenLDAP DB上配置域信息

注意:版本不同会遇到数据文件名的数字不是2的
在这里插入图片描述
使用slappasswd 生成管理员的密码(上文提到的管理员密码,大概是域的账户密码,个人理解)

slappasswd

在这里插入图片描述

vim chdomain.ldif
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=admin,dc=test,dc=cn" read by * none

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=test,dc=cn

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=admin,dc=test,dc=cn

dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}IMDL0ohcloXXLulIlGDhub62cvtwwzWw

dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange by
  dn="cn=admin,dc=test,dc=cn" write by anonymous auth by self write by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by dn="cn=admin,dc=test,dc=cn" write by * read
ldapmodify -Y EXTERNAL -H ldapi:/// -f chdomain.ldif

在这里插入图片描述
注意:创建初始目录结构(个人理解),这个需要命令行创建

vim basedomain.ldif
dn: dc=test,dc=cn
objectClass: top
objectClass: dcObject
objectclass: organization
o: Test Cloud
dc: test

dn: cn=admin,dc=test,dc=cn
objectClass: organizationalRole
cn: admin
description: Directory Manager

dn: ou=People,dc=test,dc=cn
objectClass: organizationalUnit
ou: People

dn: ou=Group,dc=test,dc=cn
objectClass: organizationalUnit
ou: Group
ldapadd -x -D cn=admin,dc=test,dc=cn -W -f basedomain.ldif

注意:输入Manager的密码(上文提到的第二个)
在这里插入图片描述
在这里插入图片描述

2,安装phpLDAPadmin实现通过Web管理LDAP服务

1,部署httpd

yum install -y httpd
mv /etc/httpd/conf.d/welcome.conf /etc/httpd/conf.d/welcome.conf_bak
vim /etc/httpd/conf/httpd.conf
#95行下面加一行(95gg),指定地址(域名/ip)及端口
95 #ServerName www.example.com:80
96 ServerName www.walkingcloud.cn
#在151行处改为
AllowOverride All
#164行处改为
DirectoryIndex index.html index.php index.cgi
#在最下面添加如下两行
ServerTokens Prod
KeepAlive On
systemctl start httpd
systemctl enable httpd.service

在这里插入图片描述

2,部署php应用

yum install php php-mbstring php-pear
systemctl restart httpd

3,部署phpldapadmin(LDAP的web管理平台)

yum --enablerepo=epel -y install phpldapadmin
vim /etc/phpldapadmin/config.php

注意:397行取消注释,398行注释掉

397 $servers->setValue('login','attr','dn');
398 //$servers->setValue('login','attr','uid');
vim /etc/httpd/conf.d/phpldapadmin.conf
#
#  Web-based tool for managing LDAP servers
#

Alias /phpldapadmin /usr/share/phpldapadmin/htdocs
Alias /ldapadmin /usr/share/phpldapadmin/htdocs

<Directory /usr/share/phpldapadmin/htdocs>
  <IfModule mod_authz_core.c>
    # Apache 2.4
    #Require local
    Require all granted
  </IfModule>
  <IfModule !mod_authz_core.c>
    # Apache 2.2
    Order Deny,Allow
    #Deny from all
    Allow from all
    #Allow from 127.0.0.1
    Allow from ::1
  </IfModule>
</Directory>

注意:遇到以下报错
You don’t have permission to access /ldapadmin on this server
可以通过修改httpd配置文件 httpd.conf。

vim /etc/httpd/conf/httpd.conf

修改前

<Directory />
AllowOverride none
Require all denied
</Directory>

修改后:

<Directory />
Options Indexes FollowSymLinks
AllowOverride None
</Directory>

4,测试访问http://ip:port/ldapadmin

在这里插入图片描述

5,使用dn账户登录(dn=admin,dc=test,dc=cn)

在这里插入图片描述

6,对象信息说明

更多请参考ldap objectclass - Fuzengjie - 博客园

objectClass: 描述了实体所表现的对象类型。objectClass存在于任意实体中,并且至少包含两个属性值,其中的一个值必须是 top
aliasedObjectName: 如果包含这个属性的实体是 alias 的话,那么目录服务就使用 aliasedObjectName
cn: X.500 的 commonName 属性。包含一个对象的名字,如果对象是 person 的时候, cn 经常代表用户的全名
sn:X.500 的 surname 属性,保存了 person 的 family name 。
serialNumber: 保存了 一个设备的序列号
c: 保存了 一个两位数字的 ISO 国家代码 (countryName)
l: 保存了 地域名称,例如城市,乡镇或者其他的地理区域 (localityName)
st: 保存了 州或者省的全名 (stateOrProvinceName)
street: 保存了 实体对应的对象的物理地址,例如包裹的邮寄地址。 (streetAddress)
o: 保存了 组织的名字。 (organizationName)
ou: 保存了 组织单元的名称 (organizationalUnitName)
description: 保存了 对象的一个易于理解的 描述。

7,创建组和用户模板

ldapadd -x -D 'cn=admin,dc=test,dc=cn' -f READAFA.ldif  -H ldap://localhost -w <password>
# yunwei, GROUP, test.cn
dn: cn=yunwei,ou=GROUP,dc=test,dc=cn
cn: yunwei
gidNumber: 500
objectClass: posixGroup
objectClass: top

# yangyang, yunwei, GROUP, test.cn
dn: cn=yangyang,cn=yunwei,ou=GROUP,dc=test,dc=cn
givenName: yang
sn: yang
uid: yangyang
homeDirectory: /home/users/yangyang
loginShell: /usr/sbin/nologin
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: top
uidNumber: 1001
gidNumber: 500
cn: yangyang
userPassword:: MTIzNDU2

8,导出域中全部信息

ldapsearch -D 用于验证的binddb -w '对应密码' -H ldap://localhost (-p ldap服务器端口 -h ldap服务器地址) -b 'dc=test,dc=cn' "ou=*或者ou=Group(可添加过滤条件精确匹配)"

(三)附上脚本,仅适合初始搭建使用!!!!

1,脚本内容

注意:初始目录可能创建失败,可在命令行手动执行

#!/bin/bash
HALPPSFE="ldappass.txt"
HALPANPSFE="ldapadminpass.txt"
yum -y install openldap-servers openldap-clients expect >/dev/null
cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
chown ldap. /var/lib/ldap/DB_CONFIG
systemctl start slapd
systemctl enable slapd
read -p $'\n请输入LDAP密码并记录:\n' -e LDAPPASS
expect <<-EOF >$HALPPSFE
    set timeout 10
    spawn -noecho slappasswd
    expect {
        "*assword:*" {send "$LDAPPASS\n";exp_continue}
        "*assword:*" {send "$LDAPPASS\n";exp_continue}
    }
EOF
HALDAPPASS=`tail -n 1 ${HALPPSFE}`
echo $HALDAPPASS
cat >chrootpw.ldif<<-EOF
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: $HALDAPPASS
EOF
ldapadd -Y EXTERNAL -H ldapi:/// -f chrootpw.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif
read -p $'\n请输入LDAPADMIN密码并记录:\n' -e LDAPADMINPASS
expect <<-EOF >$HALPANPSFE
    set timeout 10
    spawn -noecho slappasswd
    expect {
        "New password:" {send "$LDAPADMINPASS\n";exp_continue}
        "Re-enter new password:" {send "$LDAPADMINPASS\n";exp_continue}
    }
EOF
HALDAPADMINPASS=`tail -n 1 ${HALPANPSFE}`
echo $HALDAPADMINPASS
read -p $'\n请输入你的CN,例如:cn=【admin】,dc=test,dc=cn,括号内的内容为你需要输入的自定义CN:\n' -e CN
while [ -z $CN ]
do
        read -p $'你输入了一个空的CN,请重新输入\n' -e CN
done
read -p $'\n请输入你的DC,例如:cn=admin,dc=【test】,dc=cn括号内的内容为你需要输入的自定义DC:\n' -e DC
while [ -z $DC ]
do
    read -p $'你输入了一个空的DC,请重新输入\n' -e DC
done
read -p $'\n请输入你的DC,例如:cn=admin,dc=test,dc=【cn】括号内的内容为你需要输入的自定义DC:\n' -e Dc
while [ -z $Dc ]
do
    read -p $'你输入了一个空的DC,请重新输入\n' -e Dc
done
echo -e "\n你的LDAP密码为:$LDAPPASS
你的域为cn=$CN,dc=$DC,dc=$Dc,LDAPADMIN密码为:$LDAPADMINPASS\n
请你记录,10s后开始后续写入执行。。。"
sleep 10s
cat >chdomain.ldif<<-EOF
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=$CN,dc=$DC,dc=$Dc" read by * none

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=$DC,dc=$Dc

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=$CN,dc=$DC,dc=$Dc

dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcRootPW
olcRootPW: $HALDAPADMINPASS

dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange by
  dn="cn=$CN,dc=$DC,dc=$Dc" write by anonymous auth by self write by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by dn="cn=$CN,dc=$DC,dc=$Dc" write by * read
EOF
ldapmodify -Y EXTERNAL -H ldapi:/// -f chdomain.ldif
read -p $'请输入你要创建的组名,例如【Group】(ldapadmin无法创建)这里是写死的,未做判断,不要跳过:\n' -e OU
read -p $'请输入你要创建的组名,例如【People】(ldapadmin无法创建)这里是写死的,未做判断,不要跳过:\n' -e Ou
cat >basedomain.ldif<<-EOF
dn: dc=$DC,dc=$Dc
objectClass: top
objectClass: dcObject
objectclass: organization
o: Test Cloud
dc: $DC

dn: cn=$CN,dc=$DC,dc=$Dc
objectClass: organizationalRole
cn: $CN
description: Directory Manager

dn: ou=$OU,dc=$DC,dc=$Dc
objectClass: organizationalUnit
ou: $OU

dn: ou=$Ou,dc=$DC,dc=$Dc
objectClass: organizationalUnit
ou: $Ou
EOF
expect <<-EOF
    set timeout 10
    spawn -noecho ldapadd -x -D cn=$CN,dc=$DC,dc=$Dc -W -f basedomain.ldif
    expect {
        "*assword:*" {send "$LDAPADMINPASS\n";exp_continue}
    }
EOF
echo -e "\nldapserver部署完成,5s后开始部署ldapphpadmin。。。"
sleep 5s
yum install -y httpd mod_ssl>/dev/null
WEFILE="/etc/httpd/conf.d/welcome.conf"
if [ -e "$WEFILE" ];then
        mv $WEFILE ${WEFILE}_bak
else
        :
fi
TIME=`date +%Y%m%d%H%M`
HDFILE="/etc/httpd/conf/httpd.conf"
cp $HDFILE /tmp/httpd.conf-$TIME
read -p $'请输入你期望的httpd监听的端口号:\n' -e LISTEN
sed -i "s/^Listen.*/Listen $LISTEN/g" $HDFILE
grep "AllowOverride All" $HDFILE
if [ $? -ne 0 ];then
        sed -i "151s/AllowOverride None/AllowOverride all/g" $HDFILE
                if [ $? -ne 0 ];then
                        echo "151s/AllowOverride None/AllowOverride all/g $HDFILE失败"
                else
                        :       
                fi
else
        :       
fi
JUD=`sed -n "/^ServerName.*/p" $HDFILE`
echo "$JUD"
if [ -z "$JUD" ];then
        read -p $'请输入你的ip/域名:\n' -e DOMAIN
        sed -i  "/^#ServerName.*www.example.com:80/a\ServerName  $DOMAIN"  $HDFILE
else
        read -p  $'已存在以上servrname,是否继续新增,需要请选择【yes】,忽略请回车' -e CHOO
        while [ "$CHOO" == "yes" ]
        do
                        TIME=`date +%Y%m%d%H%M`
                        cp $HDFILE /tmp/httpd.conf-$TIME
                        read -p $'请输入你的ip/域名:\n' -e DOMAIN
                        sed -i  "/^#ServerName.*www.example.com:80/a\ServerName  $DOMAIN"  $HDFILE
                        JUD=`sed -n "/^ServerName.*/p" $HDFILE`
                        read -p  $'已存在$JUD,是否新增,需要请选择【yes】,忽略请回车' -e CHOO
        done    
        echo "非新增操作,请手动查找修改httpd.conf文件"
fi
sed -i "s/.*DirectoryIndex.*index.*/    DirectoryIndex index.html index.php index.cgi/g" $HDFILE
grep "ServerTokens Prod" $HDFILE >/dev/null
if [ $? -ne 0 ];then
    echo -e "\nServerTokens Prod\nKeepAlive On" >> $HDFILE
        systemctl start httpd
    systemctl enable httpd.service
else
        systemctl start httpd
    systemctl enable httpd.service
fi
yum -y install php php-mbstring php-pear >/dev/null
systemctl restart httpd
yum --enablerepo=epel -y install phpldapadmin >/dev/null
PHPLPANFE="/etc/phpldapadmin/config.php"
TIME=`date +%Y%m%d%H%M`
cp $PHPLPANFE /tmp/config.php-$TIME
sed -i "397s/.*/\$servers->setValue('login','attr','dn');/g" $PHPLPANFE
sed -i "398s/.*/\/\/ $servers->setValue('login','attr','uid');/g"  $PHPLPANFE
HDPHPLPANFE="/etc/httpd/conf.d/phpldapadmin.conf" 
cp $HDPHPLPANFE /tmp/phpldapadmin.conf-$TIME
cat >$HDPHPLPANFE<<-EOF
#
#  Web-based tool for managing LDAP servers
#
Alias /phpldapadmin /usr/share/phpldapadmin/htdocs
Alias /ldapadmin /usr/share/phpldapadmin/htdocs
<Directory /usr/share/phpldapadmin/htdocs>
  <IfModule mod_authz_core.c>
    # Apache 2.4
    Require local
    Require all granted
  </IfModule>
  <IfModule !mod_authz_core.c>
    # Apache 2.2
    Order Deny,Allow
    Allow from all
    Allow from ::1
  </IfModule>
</Directory>
EOF
systemctl restart httpd

#脚本中有下载httpd的mod_ssl模块,在/etc/httpd/conf.d/ssl.conf中配置证书文件地址

2,搭建ldap自助修改密码系统Self Service Password

安装应用
Self Service Password:yum install https://ltb-project.org/rpm/6Server/noarch/self-service-password-1.1-1.el6.noarch.rpm
配置apache: /etc/httpd/conf.d/self-service-password.conf

NameVirtualHost *:80
<VirtualHost *:80>
       ServerName changepasswd.xxxxx.net
       DocumentRoot /usr/share/self-service-password
       DirectoryIndex index.php
       AddDefaultCharset UTF-8
      <Directory "/usr/share/self-service-password">
            AllowOverride None
            Require all granted
      </Directory>
      LogLevel warn   
      ErrorLog /var/log/httpd/ssp_error_log
      CustomLog /var/log/httpd/ssp_access_log combined
</VirtualHost>

配置Self Service Password,支持密码修改和邮件重置: vim /usr/share/self-service-password/conf/config.inc.php

       #关闭 问题验证 和 短信验证(视个人需要):

            $use_questions=false;
            $use_sms= false;

      #配置 LDAP
    $ldap_url = "ldap://ldap.xxxxx.net";
    $ldap_starttls = false;
    $ldap_binddn = "cn=Manager,dc=ldap,dc=xxxxxx,dc=net";   
    $ldap_bindpw = "xxxxxxxxx";
    $ldap_base = "dc=ldap,dc=xxxxxx,dc=net";
    $ldap_login_attribute = "cn";
    $ldap_fullname_attribute = "cn";
    $ldap_filter = "(&(objectClass=person)($ldap_login_attribute={login}))";
       $who_change_password = "manager";   #指定LDAP 以什么用户身份更改密码
       $keyphrase = "admintestcn"; #更改短语。

      #配置邮件
    $mail_from = "elk@xxxxx.com";
    $mail_from_name = "企业账号密码重置";
    $mail_signature = "";
       $notify_on_change = true;      #密码修改成功后,向用户发送通知邮件
    $mail_sendmailpath = '/usr/sbin/sendmail';   #需安装sendmail服务 yum install -y sendmail
    $mail_protocol = 'smtp';
    $mail_smtp_debug = 0;
    $mail_debug_format = 'html';
    $mail_smtp_host = 'smtp.gmail.com';
    $mail_smtp_auth = true;
    $mail_smtp_user = 'elk@xxxxxx.com';
    $mail_smtp_pass = 'xxxxxx';
    $mail_smtp_port = 587;
    $mail_smtp_timeout = 30;
    $mail_smtp_keepalive = false;
    $mail_smtp_secure = 'tls';
    $mail_contenttype = 'text/plain';
    $mail_wordwrap = 0;
    $mail_charset = 'utf-8';
    $mail_priority = 3;
    $mail_newline = PHP_EOL;

配置完成,登录网页访问,通过网页修改账号密码验证

3,注意事项

注意:执行shell脚本时报错:/bin/bash^M: 坏的解释器: 没有那个文件或目录,是因为该文件在windows系统上打开过,关闭后其中的换行符号和Linux的不同,导致这个报错,我们可以通过 sed命令 与正则的配合将文件中的换行符号替换成linux的形式

sed -i 's/\r$//' mocha.sh

(四)docker-compose启动Ldap+web管理+自助密码修改

点击跳转到文章地址

END:参考文章

CentOS7下搭建OpenLDAP服务器 - 腾讯云开发者社区-腾讯云

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值