随着公司的发展,往往会有很多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基于入口进行工作,入口是具有唯一标识的属性集合,该标识用于信息的调度。以树状结构来存储数据,对信息进行分级管理。
/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:shileizcc@126.com。 | |
telephoneNameber | 通常指登入账户的手机号码,例如,telephoneNumber:xxxxxxxxxxx |
c(country) | 通常指一个二位国家的名称,例如 CN、US 等国家代号。例如,c:CN。 |
本地系统帐户是本机建立的用户帐户,域账户是域服务器上管由管理员分配给你的帐户(或你自己设置的,当你是管理员时) 本地系统是本机登陆,不能访问域上的资源域帐户受域的权限管理,那当然也可以访问本机上的资源,域帐户可以在域内任何一台电脑上登录,本地系统帐户就不行
看完上面很多概念想必你已经有点头晕,为了更加便于管理,官方推出了 lam(ldap-account-manager)工具来对openLDAP用户进行可视化管理,这样一来大大降低了其维护成本。
$ yum install -y openldap openldap-clients openldap-servers migrationtools openldap-devel compat-openldap
$ slappasswd
New password:
Re-enter new password:
{SSHA}TOb0vnJFL6cYXp+jDu64TjE2h2jdtQaQ
# 复制加密后的密码到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
$ slaptest -u
# -u:忽略database配置错误
$ 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
$ 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
$ 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
OpenLDAP服务器加载schema是按配置的先后顺序加载的,有依赖的必须在所依赖的后面导入;
schema文件里面父类必须写在子类前面,否则会报错说找不到子类的SUP,OID先后无所谓。
# 查询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文件进行条目添加的文件
# 创建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用户为默认的账户管理员,具有最高权限。
# 创建配置相关的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(LDAP Account Manager)是一个用来管理储存在一个LDAP目录中的用户的web前端应用程序,官方文档。
lam可以通过两种方式安装,一种是通过rpm包,一种是编译安装,直接使用rpm包安装。
lam从6.0开始依赖php7.0。
# 配置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)
$ 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
$ 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提供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
$ systemctl start httpd
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;
}
}
ldap+lam+Apache+nginx部署完成!