命令行部署#

如果您希望使用命令行的方式部署OpenLDAP,请按照本章节步骤部署。

前提#

在开始前,请配置yum源,使用root用户登陆openldap1,进行基础配置:

ssh root@openldap1

从yum源所在机器获取repo文件:

scp oushu@192.168.1.10:/etc/yum.repos.d/oushu.repo /etc/yum.repos.d/oushu.repo

安装lava命令行管理工具:

yum clean all
yum makecache
yum install -y lava

创建一个openldapfile文件:

touch ~/openldapfile

编辑openldapfile文件内容如下:

cat > ~/openldapfile <<EOF
openldap1
openldap2
EOF

和openldap2交换公钥:

lava ssh-exkeys -f ~/openldapfile -p ********

将repo文件分发给openldap2:

lava scp -f ~/openldapfile /etc/yum.repos.d/oushu.repo =:/etc/yum.repos.d

安装#

执行下列命令安装OpenLDAP

lava ssh -f ~/openldapfile -e "yum -y install openldap openldap-clients openldap-servers compat-openldap openldap-devel migrationtools"

配置#

ldap自签名证书及相关目录权限配置

cat > ~/ldapcert.sh<<EOF
# ldap certs
if [ ! -d /etc/openldap/certs ]; then
  mkdir -p /etc/openldap/certs
  bash /usr/libexec/openldap/create-certdb.sh
  bash /usr/libexec/openldap/generate-server-cert.sh
fi
EOF

lava scp -f ~/openldapfile ~/ldapcert.sh =:~/ldapcert.sh
lava ssh -f ~/openldapfile -e "chmod 755 ~/ldapcert.sh"
lava ssh -f ~/openldapfile -e "~/ldapcert.sh"
lava ssh -f ~/openldapfile -e "chown -R ldap:ldap /etc/openldap/"
lava ssh -f ~/openldapfile -e "cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG"
lava ssh -f ~/openldapfile -e "chown -R ldap:ldap /var/lib/ldap"

配置OpenLDAP服务slapd启动的端口(默认389,不修改可忽略此项)

lava ssh -f ~/openldapfile -e "sed -i '/SLAPD_URLS/s#ldap:///#ldap://:389/#g' /etc/sysconfig/slapd"

启动#

slapd服务启动

lava ssh -f ~/openldapfile -e "systemctl start slapd"

ldap Base CN、Root DN、访问权限等基础配置

cat > ~/rootdn.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=admin,dc=oushu,dc=com" read by * none

# suffix、rootDN、root password、ldap数据库访问配置
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcRootPW
olcRootPW: $(slappasswd -s Oushu6@China)
-
replace: olcRootDN
olcRootDN: cn=admin,dc=oushu,dc=com
-
replace: olcSuffix
olcSuffix: dc=oushu,dc=com
-
add: olcAccess
olcAccess: {0}to attrs=userPassword by self write by dn.base="cn=admin,dc=oushu,dc=com" write by anonymous auth by * none
olcAccess: {1}to * by dn.base="cn=admin,dc=oushu,dc=com" write by self write by * read

# 为了安全起见,禁用匿名访问
dn: cn=config
changetype: modify
add: olcDisallows
olcDisallows: bind_anon
EOF

lava scp -f ~/openldapfile ~/rootdn.ldif =:~/rootdn.ldif
lava ssh -f ~/openldapfile -e "ldapadd -Y EXTERNAL -H ldapi:/// -f ~/rootdn.ldif"

导入常用schema

lava ssh -f ~/openldapfile -e "ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif"
lava ssh -f ~/openldapfile -e "ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif"
lava ssh -f ~/openldapfile -e "ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif"

根节点、管理员节点、用户节点及用户组节点创建

cat > ~/users.ldif <<EOF

# 创建域名
dn: dc=oushu,dc=com
objectClass: dcObject
objectClass: organization
dc: oushu
o: oushu com

# 创建管理员用户
dn: cn=admin,dc=oushu,dc=com
objectClass: organizationalRole
cn: admin

# 创建用户组织
dn: ou=users,dc=oushu,dc=com
ou: users
objectClass: organizationalUnit

# 创建用户组组织
dn: ou=group,dc=oushu,dc=com
ou: group
objectClass: organizationalUnit
EOF

lava scp -f ~/openldapfile ~/users.ldif  =:~/users.ldif 
lava ssh -f ~/openldapfile -e "ldapadd -x -D "cn=admin,dc=oushu,dc=com" -w Oushu6@China -f ~/users.ldif"

开启ldap log服务

cat > ~/ldaplog.ldif << EOF

# 设定日志级别
dn: cn=config
changetype: modify
replace: olcLogLevel
olcLogLevel: stats
EOF

lava scp -f ~/openldapfile ~/ldaplog.ldif  =:~/ldaplog.ldif
lava ssh -f ~/openldapfile -e "ldapmodify -Y EXTERNAL -H ldapi:/// -f ~/ldaplog.ldif"
lava ssh -f ~/openldapfile -e "echo \"local4.* /var/log/slapd.log\"\>\>/etc/rsyslog.conf" 
lava ssh -f ~/openldapfile -e "systemctl restart rsyslog"
lava ssh -f ~/openldapfile -e "systemctl restart slapd"

高可用配置

cat > ~/hacommon.ldif <<EOF

# 引用同步模块
dn: cn=module,cn=config
objectClass: olcModuleList
cn: module
olcModulePath: /usr/lib64/openldap
olcModuleLoad: syncprov.la

# 修改OpenLDAP配置
dn: olcOverlay=syncprov,olcDatabase={2}hdb,cn=config
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov
olcSpSessionLog: 100
EOF

lava scp -f ~/openldapfile ~/hacommon.ldif  =:~/hacommon.ldif 
lava ssh -f ~/openldapfile -e "ldapadd -Y EXTERNAL -H ldapi:/// -f ~/hacommon.ldif"

开启openldap1镜像同步(如果服务端口没有修改过可以不写端口,默认389)

cat << EOF | ldapmodify -Y EXTERNAL -H ldapi:///

# 在openldap1上开启镜像同步
dn: cn=config
changetype: modify
replace: olcServerID
olcServerID: 0

dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcSyncRepl
olcSyncRepl: rid=001
  provider=ldap://openldap2:389
  bindmethod=simple
  binddn="cn=admin,dc=oushu,dc=com"
  credentials=Oushu6@China
  searchbase="dc=oushu,dc=com"
  tls_reqcert=allow
  scope=sub
  schemachecking=on
  type=refreshAndPersist
  retry="30 5 300 3"
  interval=00:00:05:00
-
add: olcMirrorMode
olcMirrorMode: TRUE

dn: olcOverlay=syncprov,olcDatabase={2}hdb,cn=config
changetype: add
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov
EOF

开启openldap2镜像同步

cat > ~/ldap2ha.ldif <<EOF

# 在openldap2上开启镜像同步
dn: cn=config
changetype: modify
replace: olcServerID
olcServerID: 1

dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcSyncRepl
olcSyncRepl: rid=001
  provider=ldap://openldap1:389
  bindmethod=simple
  binddn="cn=admin,dc=oushu,dc=com"
  credentials=Oushu6@China
  searchbase="dc=oushu,dc=com"
  tls_reqcert=allow
  scope=sub
  schemachecking=on
  type=refreshAndPersist
  retry="30 5 300 3"
  interval=00:00:05:00
-
add: olcMirrorMode
olcMirrorMode: TRUE

dn: olcOverlay=syncprov,olcDatabase={2}hdb,cn=config
changetype: add
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov
EOF

lava scp -f ~/openldapfile ~/ldap2ha.ldif  =:~/ldap2ha.ldif 
lava ssh -h openldap2 -e "ldapadd -Y EXTERNAL -H ldapi:/// -f ~/ldap2ha.ldif"

检查状态#

ldapsearch -x -D "cn=admin,dc=oushu,dc=com" -w Oushu6@China -b "dc=oushu,dc=com"

如果有查询结果返回,证明openldap1服务可用

ldapsearch -x -D "cn=admin,dc=oushu,dc=com" -w Oushu6@China -b "dc=oushu,dc=com" -H ldap://openldap2

如果有查询结果返回,证明openldap2服务可用

验证用户同步#

在openldap1上创建用户user1

cat << EOF | ldapadd -D "cn=admin,dc=oushu,dc=com" -w Oushu6@China
dn: uid=user1,ou=users,dc=oushu,dc=com
objectClass: posixAccount
objectClass: top
objectClass: inetOrgPerson
uid: user1
displayName: user1
sn: user1
homeDirectory: /home/user1
cn: user1
uidNumber: $((1000+$RANDOM%9000))
gidNumber: 100
userPassword: user1666
EOF

在openldap2上可以查询到这个用户

ldapsearch -x -D "cn=admin,dc=oushu,dc=com" -w Oushu6@China -b "uid=user1,ou=users,dc=oushu,dc=com" -H ldap://openldap2

在openldap2上创建用户user2

cat > ~/user2.ldif <<EOF
dn: uid=user2,ou=users,dc=oushu,dc=com
objectClass: posixAccount
objectClass: top
objectClass: inetOrgPerson
uid: user2
displayName: user2
sn: user2
homeDirectory: /home/user2
cn: user2
uidNumber: $((1000+$RANDOM%9000))
gidNumber: 100
userPassword: user2666
EOF

lava scp -f ~/openldapfile ~/user2.ldif  =:~/user2.ldif 
lava ssh -h openldap2 -e "ldapadd -D \"cn=admin,dc=oushu,dc=com\" -w Oushu6@China -H ldapi:/// -f ~/user2.ldif"

在openldap1上可以查询到这个用户

ldapsearch -x -D "cn=admin,dc=oushu,dc=com" -w Oushu6@China -b "uid=user2,ou=users,dc=oushu,dc=com"

openldap1的用户openldap2能查到,反之亦然,则证明openldap1、openldap2用户同步完成

常用命令#

(openldap1和openldap2都适用)

查看slapd服务状态

sudo systemctl status slapd

停止slapd服务

sudo systemctl stop slapd

启动slapd服务

sudo systemctl start slapd

重启slapd服务

sudo systemctl restart slapd

查询ldap节点

# -D用来绑定服务器的DN,-w绑定DN的密码,-b要查询的根节点,-H ldap服务器地址
ldapsearch -x -D "cn=admin,dc=oushu,dc=com" -w Oushu6@China -b "dc=oushu,dc=com" -H ldap:///

添加节点

# -f:从文件内读取节点的添加信息,不使用-f的话需要接入标准输入来输入节点信息
ldapadd -x -D "cn=admin,dc=oushu,dc=com" -w Oushu6@China -f newEntry.ldif

修改节点信息

# -f:从文件内读取节点的修改信息,不使用-f的话需要接入标准输入来输入节点信息
ldapmodify -x -D "cn=admin,dc=oushu,dc=com" -w admin113 -f modify.ldif

删除节点

ldapdelete -x -D "cn=admin,dc=oushu,dc=com" -w Oushu6@China "uid=user1,ou=users,dc=oushu,dc=com"

注册到skylab(可选)#

将要安装openldap的机器需要通过机器管理添加到skylab中,如果您尚未添加,请参考注册机器

在openldap1节点修改/usr/local/oushu/lava/conf配置server.json,替换localhost为skylab的服务器ip,具体skylab的基础服务lava安装步骤请参考:lava安装

{
  "server": "localhost:1612",
  "admin": "localhost:1652"
}

创建一个request文件,包含openldap cluster信息

touch ~/openldap-register.json

编辑json文件内容如下:

{
  "data": {
    "name": "OpenLDAP",
    "group_roles": [
      {
        "role": "ldap.worker",
        "cluster_name": "ldapcluster",
        "group_name": "ldapgroup",
        "machines": [
          {
            "id": 1,
            "name": "openldap1",
            "subnet": "lava",
            "data_ip": "192.168.1.11",
            "manage_ip": "192.168.1.11",
            "assist_port": 1622,
            "ssh_port": 22
          },
          {
            "id": 2,
            "name": "openldap2",
            "subnet": "lava",
            "data_ip": "192.168.1.12",
            "manage_ip": "192.168.1.12",
            "assist_port": 1622,
            "ssh_port": 22
          }
        ]
      }
    ]
  }
}

配置文件说明,整个json分为3部分:

  • 第一部分name,为集群名称,个性化填写。

  • 第二部分为group_roles,对于openldap只有1个角色,ldap.worker,不可修改。

  • 第三部分,为每个角色添加机器,需要添加的机器信息可以通过下面的方式获得。

在平台基础组件lava所安装的机器执行(端口和用户名按照lava配置修改):

psql lavaadmin -p 4432 -U oushu -c "select m.id,m.name,s.name as subnet,m.private_ip as data_ip,m.public_ip as manage_ip,m.assist_port,m.ssh_port from machine as m,subnet as s where m.subnet_id=s.id;"

获取到所需的机器信息,根据服务角色对应的节点,将机器信息添加到machines数组中。

在openldap1节点调用lava命令注册集群:

lava login -u oushu -p Oushu6@China
lava onprem-register service -s OpenLDAP -f ~/openldap-register.json

如果返回值为:

Add service by self success

则表示注册成功,如果有错误信息,请根据错误信息处理。

从页面登录后,在自动部署模块对应服务中可以查看到新添加的集群,同时列表中会实时监控openLDAP进程在机器上的状态。