前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关于openldap

关于openldap

作者头像
阿dai学长
发布2022-03-24 10:40:42
2.1K0
发布2022-03-24 10:40:42
举报
文章被收录于专栏:阿dai_linux

LDAP是什么?

随着公司的发展,往往会有很多IT系统,如gitlab、V**、jira、wiki等等,员工需要开通多个系统的账号,这么多的账号密码,很容易混乱,同样对于管理人员维护来说也不方便。于是需要一个统一的认证系统来进行用户名及密码管理,OpenLDAP正好适用于此。

OpenLDAP(Open Lightweight Directory Account Protocol)是一款轻量级目录访问协议,属于开源集中账号管理架构的实现。是基于X.500目录服务, LDAP通过TCP / IP或其他面向连接的传输服务运行,详见官方文档

戏说ldap应用:http://www.sohu.com/a/194197808_465221

目录服务

目录是一个为查询、浏览和搜索而优化的专业分布式数据库,它呈树状结构组织数据,就好象Linux/Unix系统中的文件目录一样。目录数据库有优异的读性能,但写性能差,并且没有事务处理、回滚等复杂的数据管理系统的功能,不适于存储修改频繁的数据。

工作原理

ldap通过将一个给定的逻辑范围内(不受地理位置限制)的所有资源(包括计算机、用户账号、打印机等等)集中存放在一个公共数据库内,管理员和用户就可以通过这个数据库的访问和管理实现集中性访问。

ldap基于入口进行工作,入口是具有唯一标识的属性集合,该标识用于信息的调度。以树状结构来存储数据,对信息进行分级管理

基础概念

objectClass
  • objectClass:对象类是属性的集合,LDAP预想了很多人员组织机构中常见的对象,并将其封装成对象类。比如人员(person)含有姓(sn)、名(cn)、电话(telephoneNumber)、密码(userPassword)等属性,单位职工(organizationalPerson)是人员(person)的继承类,除了上述属性之外还含有职务(title)、邮政编码(postalCode)、通信地址(postalAddress)等属性。
  • 通过对象类可以方便的定义条目类型。每个条目可以直接继承多个对象类,这样就继承了各种属性。如果2个对象类中有相同的属性,则条目继承后只会保留1个属性。对象类同时也规定了哪些属性是基本信息,必须含有(Must 活Required,必要属性):哪些属性是扩展信息,可以含有(May或Optional,可选属性)。
  • OpenLDAP objectClass概述:https://wiki.shileizcc.com/confluence/pages/viewpage.action?pageId=39223503
Schema
  • 对象类(ObjectClass)、属性类型(AttributeType)、语法(Syntax)分别约定了条目、属性、值,他们之间的关系如下图所示。所以这些构成了模式(Schema)——对象类的集合。条目数据在导入时通常需要接受模式检查,它确保了目录中所有的条目数据结构都是一致的。
  • schema(一般在/etc/openldap/schema/目录)在导入时要注意前后顺序。

基础属性

属性(Attribute)在目录树中主要用于描述条目相关信息,例如用户条目的用途、联系方式、邮件、uid、gid、公司地址等辅助信息。属性由 objectClass 所控制,一个 objectClass 的节点具有一系列 Attribute,Attribute 可以理解为 Linux 系统当中的变量,每个变量都有对应的值,OpenLDAP Attribute 也是对应的值。这些属性的对应值表示每个对象的特点,但有些属性在添加时是必须指定的,有些属性是非必要的(类似于条目更详细的描述)。在目录树中常用的 Attribute 有 uid、sn、giveName、I、objectClass、dc、ou、cn、mail、telephoneNumber、c 等。

常见属性

属性

描述

dn(distinguished name)

唯一标示名,类似于 Linux 文件系统中的绝对路径,每个对象都有唯一标示名。例如,uid=dpgdy,ou=People,dc=shileizcc,dc=com

rdb(relative dn)

通常指相对标示名,类似于 Linux 文件系统中的相对路径。例如,uid=dpgdy

uid(user id)

通常指一个用户的登入名称。例如,uid=dpgdy,在系统中的 uid 不是一个概念。

sn(sur name)

通常指一个人的姓氏。例如,sn:Guo

giveName

通常指一个人的名字。例如,giveName:Guodayong,但不能是姓氏。

I

通常指一个地方的地名。例如,I:Shanghai

objectClass

objectClass 是特殊的属性,包含数据存储的方式以及相关属性信息。

dc(domain component)

通常指定一个域名。例如,dc=example,dc=com

ou/o(organization unit)

通常指定一个组织单元的名称。例如,ou=people,dc=example,dc=com

cn(common name)

通常指一个对象的名称,如果是人,需要使用全名。

mail

通常指登入账户的邮箱地址,例如,mail:shileizcc@126.com。

telephoneNameber

通常指登入账户的手机号码,例如,telephoneNumber:xxxxxxxxxxx

c(country)

通常指一个二位国家的名称,例如 CN、US 等国家代号。例如,c:CN。

系统用户和ldap用户的区别

本地系统帐户是本机建立的用户帐户,域账户是域服务器上管由管理员分配给你的帐户(或你自己设置的,当你是管理员时) 本地系统是本机登陆,不能访问域上的资源域帐户受域的权限管理,那当然也可以访问本机上的资源,域帐户可以在域内任何一台电脑上登录,本地系统帐户就不行

管理和维护

看完上面很多概念想必你已经有点头晕,为了更加便于管理,官方推出了 lam(ldap-account-manager)工具来对openLDAP用户进行可视化管理,这样一来大大降低了其维护成本。

部署和使用

环境介绍

  • 访问地址:http://ldap.adai.cn (只可在V**环境访问)
  • 部署机器:nginxtest
  • 配置目录:/etc/openldap
  • 数据目录:/var/lib/ldap
  • lam:
    • 部署位置:/usr/share/ldap-account-manager
    • apache端口号:9000

部署说明

OpenLDAP安装
  • 配置云主机外网防火墙,对内网放行ldap对应的端口号389(默认),目的是用于gitlab、wiki等服务与ldap的集成;
  • 安装ldap:
代码语言:javascript
复制
$ yum install -y openldap openldap-clients openldap-servers migrationtools openldap-devel compat-openldap   
  • 为ldap创建root密码:
代码语言:javascript
复制
$ slappasswd 
New password: 
Re-enter new password: 
{SSHA}TOb0vnJFL6cYXp+jDu64TjE2h2jdtQaQ
  • 配置root密码:
代码语言:javascript
复制
# 复制加密后的密码到ldap的配置文件(/etc/openldap/slapd.d/cn=config/olcDatabase={2}hdb.ldif)
$ vim /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{2\}hdb.ldif
# 配置使用ldap服务的域名
olcSuffix: dc=adai,dc=cn
# 创建root管理员入口(DN--Distinguished Name)
olcRootDN: cn=admin,dc=adai,dc=cn
# 配置root密码
olcRootPW: {SSHA}TOb0vnJFL6cYXp+jDu64TjE2h2jdtQaQ
  • 检查配置:
代码语言:javascript
复制
$ slaptest -u
# -u:忽略database配置错误
  • 启动slapd服务:
代码语言:javascript
复制
 $ systemctl start slapd

# 开机启动
$ systemctl enable slapd

# 查看服务监听的端口
$ netstat -lntp |grep slapd
tcp        0      0 0.0.0.0:389             0.0.0.0:*               LISTEN      8511/slapd          
tcp6       0      0 :::389                  :::*                    LISTEN      8511/slapd 
OpenLDAP配置
  • 数据库配置:
代码语言:javascript
复制
$ cp /usr/share/openldap-servers/DB_CONFIG.example  /var/lib/ldap/DB_CONFIG
$ chown -R ldap:ldap /var/lib/ldap/
$ chown –R ldap:ldap /etc/openldap
  • 配置scheme:
代码语言:javascript
复制
$ 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
  • Note:

OpenLDAP服务器加载schema是按配置的先后顺序加载的,有依赖的必须在所依赖的后面导入;

schema文件里面父类必须写在子类前面,否则会报错说找不到子类的SUP,OID先后无所谓。

应用指南

日常操作命令
  • ldapsearch:用户查看
代码语言:javascript
复制
# 查询root密码(如果忘记密码)
$ ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b  cn=config olcRootDN=cn=admin,dc=adai,dc=cn dn olcRootDN olcRootPW
## 如果密码是加密的就需要重置密码了:http://techiezone.rottigni.net/2011/12/change-root-dn-password-on-openldap/

# 查询信息
$ ldapsearch -Q -H ldapi:/// -Y EXTERNAL -b "olcDatabase={1}hdb,cn=config"

# 参数解析:
## -x:   进行简单认证
## -D:   用来绑定服务器的DN
## -h:   目录服务的地址
## -w:   绑定DN的密码
## -f:   使用ldif文件进行条目添加的文件
  • ldapadd:添加用户(添加前需要先创建ldif文件)
代码语言:javascript
复制
# 创建ldif文件(示例):
$ useradd ldapuser1
$ echo "123456" |passwd --stdin ldapuser1
$ grep ":10[0-9][0-9]" /etc/passwd > /root/passwd  # 将用户信息保存到/root/passwd
$ grep ":10[0-9][0-9]" /etc/group > /root/group # 将用户的组信息保存到/root/group
$ cd /usr/share/migrationtools/
$ /usr/share/migrationtools/migrate_passwd.pl /root/passwd /root/group  # 将个人用户文件转换为ldap数据格式
$ ./migrate_passwd.pl /root/passwd /root/users.ldif  # 创建用户ldif文件

# 将本地用户导入ldap数据库:
$ ldapadd -x -W -D "cn=Manager,dc=adai,dc=cn" -f /root/users.ldif
$ ldapadd -x -W -D "cn=Manager,dc=adai,dc=cn" -f /root/groups.ldif

Note: 该过程会要求手动输入Manager的密码,Manager用户为默认的账户管理员,具有最高权限。

  • ldapmodify:添加或修改配置(需要先创建ldif文件)
代码语言:javascript
复制
# 创建配置相关的ldif文件
$ vim tmp.ldif
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange by dn="cn=admin,dc=adai,dc=cn" write  by dn="cn=reader,dc=adai,dc=cn" read by anonymous auth by self write by * none
olcAccess: {1}to * by dn="cn=admin,dc=adai,dc=cn" write by dn="cn=reader,dc=adai,dc=cn" read by dn="uid=adai,ou=people,dc=adai,dc=cn" read by dn="uid=adai,ou=people,dc=adai,dc=cn" read by anonymous auth by self write by * none

# 更改配置
$ ldapmodify -Q -H ldapi:/// -Y EXTERNAL -f tmp.ldif

关于ldif文件参考:https://wiki.shileizcc.com/confluence/pages/viewpage.action?pageId=39223519

命令参考: https://docs.oracle.com/cd/E56344_01/html/E54075/ldapadd-1.html

安装lam

LAM(LDAP Account Manager)是一个用来管理储存在一个LDAP目录中的用户的web前端应用程序,官方文档

安装&&配置

lam可以通过两种方式安装,一种是通过rpm包,一种是编译安装,直接使用rpm包安装。

安装

lam从6.0开始依赖php7.0。

  • ldap+lam+Apache+nginx部署完成!
代码语言:javascript
复制
# 配置PHP≥7.0的yum源
$ yum install -y epel-release   # 下面这条命令依赖epel扩展源
$ rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm

# 升级php
$ yum install -y php72w php72w-ldap php72w-common php72w-cli php72w-pecl-imagick
## 该过程会与部分旧版本的包有冲突,直接使用 “rpm -e 包名 --npdeps” 卸载即可

# php升级完成后检测httpd的模块,有如下模块说明配置完成
$ apachectl -M
php7_module (shared) 
代码语言:javascript
复制
$ wget -O ldap-account-manager-lamdaemon-7.0-0.fedora.1.noarch.rpm http://prdownloads.sourceforge.net/lam/ldap-account-manager-lamdaemon-7.0-0.fedora.1.noarch.rpm?download
  • 安装:
代码语言:javascript
复制
$ yum localinstall -y ldap-account-manager-lamdaemon-7.0-0.fedora.1.noarch.rpm
# 官方文档:https://www.ldap-account-manager.org/static/doc/manual/ch02.html

$ vim /usr/share/ldap-account-manager/lam.conf
# List of active account types.
activeTypes: user,group
types: suffix_user: dc=adai,dc=cn
types: attr_user: #uid;#givenName;#sn;#uidNumber;#gidNumber;#mail
types: modules_user: inetOrgPerson,posixAccount,shadowAccount,sambaSamAccount
types: suffix_group: dc=adai,dc=cn
types: attr_group: #cn;#gidNumber;#memberUID;#description
types: modules_group: posixGroup,sambaGroupMapping
  • 配置Apache:
代码语言:javascript
复制
# 使用Apache提供web服务
$ yum install -y httpd

$ vim /etc/httpd/conf/httpd.conf
Listen 127.0.0.1:9000

# lam相关默认配置(Note:这里配置很重要!!!)
$ less /etc/httpd/conf.d/lam.apache.conf
  • 启动httpd服务:
代码语言:javascript
复制
$ systemctl start httpd
  • 配置nginx:
代码语言:javascript
复制
server {
    listen 80;
    server_name ldap.adai.cn;
    client_max_body_size 20m;

    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_pass http://127.0.0.1:9000;
        proxy_redirect default;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
  • 代码review,上线。
  • 在浏览器访问:https://ldap.adai.cn/lam 进入lam登录界面,所有配置均可在此管理,不用到终端手动编辑配置文件。

ldap+lam+Apache+nginx部署完成!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/07/15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • LDAP是什么?
  • 目录服务
  • 工作原理
    • 基础概念
      • objectClass
      • Schema
    • 基础属性
      • 系统用户和ldap用户的区别
      • 管理和维护
      • 部署和使用
        • 环境介绍
          • 部署说明
            • OpenLDAP安装
            • OpenLDAP配置
          • 应用指南
            • 日常操作命令
        • 安装lam
          • 安装&&配置
          • 安装
          相关产品与服务
          云服务器
          云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档