76

基于LDAP的用户管理

 5 years ago
source link: https://mp.weixin.qq.com/s/uwVAjjDXXlCRMOlr-hSaxQ
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

在前面一章中有提到 基于Kerberos的大数据安全方案 在这里呢我们跟随上一章的脚步继续往下探索大数据安全问题;大数据安全呢我们简单大致分为四个方面:用户管理、认证、授权以及审计,前面已经介绍了认证,那么下面我们开启对用户管理的认识与实现。

基于Kerberos的大数据安全方案 地址:[https://mp.weixin.qq.com/s/UehY8pqmJzsRurMTJY9Cgw]

1. 什么是LDAP?

LDAP是轻量目录访问协议,英文全称是Lightweight Directory Access Protocol,一般都简称为LDAP。它是基于X.500标准的,但是简单多了并且可以根据需要定制。与X.500不同,LDAP支持TCP/IP,这对访问Internet是必须的。LDAP的核心规范在RFC中都有定义,所有与LDAP相关的RFC都可以在LDAPman RFC网页中找到。

LDAP目录以树状的层次结构来存储数据。如果你对自顶向下的DNS树或UNIX文件的目录树比较熟悉,也就很容易掌握LDAP目录树这个概念了。就象DNS的主机名那样,LDAP目录记录的标识名(Distinguished Name,简称DN)是用来读取单个记录,以及回溯到树的顶部。后面会做详细地介绍。

理论的东西理解起来总是非常的难懂,我们用一句话来表达一下吧; LDAP 是以树形来存储数据,每条数据我们称之为条目,条目之中定义了很多属性可以存储较为数据类型,因为是这种特殊的存储模式非常适合大量的读操作,所以被广泛应用在企业内部用户管理,大名鼎鼎的微软的AD域就是其中之一,不过我们今天的主角是OpenLDAP

这里我们为什么选择OpenLDAP呢?开源,适合部署到Linux,而AD需要系统微软系统,这点我们管理增大了难度。

2. 为什么使用LDAP?

虽然Kerberos 提供了可靠的身份验证提供支持,但它对高级身份特征用户组几乎没有提供任何支持。特别是Kerberos 只将身份表现为简单的分为两部分的字符串(对于服务来说是分为三部分的字符串),这两部分分别为短名称和域。当赋予每位用户一个唯一的身份标识时,这种身份表现法虽然有用,但对于实现可靠的身份验证协议来说仍然不够。

Hadoop 使用一个名为hadoop.security.group.mapping 的配置参数,以控制用户到用户组的映射。默认的实现方法使用标准UNIX 接口进行本地调用,或者使用shell 命令查找用户到组的映射。这意味着,只有配置在调用映射的那台服务器上的用户组才对Hadoop 可见。在实际操作中,这不是个大问题,因为Hadoop 集群对访问集群的用户和用户组会有一致的视图。

而我们可以通过系统用户进行映射到HDFS中,但是考虑到我们和系统用户结合同时为了扩展性我们采用系统映射LDAP用户,从而间接映射到HDFS中,这样非常方便以后的管理及扩展。

不光对于HDFS组件来说,其他组件也是如此。

3. 快速部署OpenLDAP服务端

开始部署之前,我先约定一下我们的环境及排版。这里使用的环境CentOS7.X系列,OpenLDAP采用yum进行安装而版本是2.4.X,如果在代码中看到 $开头是shell命令。

安装依赖及OpenLDAP Server:



  1. $ yum install nscd nss-pam-ldapd \

  2.    pcre pcre-devel -y

  3. $ yum install openldap openldap-servers \

  4.    openldap-clients \

  5.    openldap-devel openldap-servers-sql migrationtools -y

配置后端存储配置并启动服务:



  1. $ cp /usr/share/openldap-servers/DB_CONFIG.example \

  2.    /var/lib/ldap/DB_CONFIG

  3. $ chown ldap.ldap /var/lib/ldap/DB_CONFIG

  4. $ systemctl enable slapd

  5. $ systemctl start slapd

我们在正式使用前我们需要做一些初始化的工作,比如:增加管理员、初始化域;好了接下来我们继续。

初始化一个密码,方便我们后面使用:



  1. $ slappasswd -s ldap123  # Res {SSHA}9nSUMd6kFjr4HvFQ4hm12C0l5GWNorN3

下面我们配置到系统系统之中:



  1. $ cat <<EOF | ldapadd -Y EXTERNAL -H ldapi:///

  2. # specify the password generated above for "olcRootPW" section

  3. dn: olcDatabase={0}config,cn=config

  4. changetype: modify

  5. add: olcRootPW

  6. olcRootPW: {SSHA}9nSUMd6kFjr4HvFQ4hm12C0l5GWNorN3

  7. EOF

初始化域,增加系统管理员:



  1. cat <<EOF | ldapadd -Y EXTERNAL -H ldapi:///

  2. # replace to your own domain name for "dc=***,dc=***" section

  3. dn: olcDatabase={1}monitor,cn=config

  4. changetype: modify

  5. replace: olcAccess

  6. olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read

  7.  by dn.base="cn=admin,dc=hwinfo,dc=com" read by * none

  8. dn: olcDatabase={2}hdb,cn=config

  9. changetype: modify

  10. replace: olcSuffix

  11. olcSuffix: dc=hwinfo,dc=com

  12. dn: olcDatabase={2}hdb,cn=config

  13. changetype: modify

  14. replace: olcRootDN

  15. olcRootDN: cn=admin,dc=hwinfo,dc=com

  16. dn: olcDatabase={2}hdb,cn=config

  17. changetype: modify

  18. add: olcRootPW

  19. olcRootPW: {SSHA}9nSUMd6kFjr4HvFQ4hm12C0l5GWNorN3

  20. EOF

我们前面还提到构成条目的还需要属性,自然不能缺了属性,我们导入常用属性:



  1. ldapadd -Y EXTERNAL -H ldapi:/// \

  2.  -f /etc/openldap/schema/cosine.ldif

  3. ldapadd -Y EXTERNAL -H ldapi:/// \

  4.  -f /etc/openldap/schema/nis.ldif

  5. ldapadd -Y EXTERNAL -H ldapi:/// \

  6.  -f /etc/openldap/schema/inetorgperson.ldif

创建Base域,基础域:



  1. cat <<EOF | ldapadd -x -W  -H ldapi:/// -D "cn=admin,dc=hwinfo,dc=com"

  2. # Ldap Base Tree

  3. dn: dc=hwinfo,dc=com

  4. dc: hwinfo

  5. objectClass: top

  6. objectClass: domain

  7. dn: ou=users,dc=hwinfo,dc=com

  8. ou: users

  9. objectClass: top

  10. objectClass: organizationalUnit

  11. dn: ou=group,dc=hwinfo,dc=com

  12. ou: group

  13. objectClass: top

  14. objectClass: organizationalUnit

  15. EOF

为了测试这里我们通过系统添加一些测试数据,方便我们验证后面的结果:。

我们这里创建两个用户来测试:



  1. $ useradd ldap01 && echo "ldap01"|passwd ldap01 --stdin

  2. $ useradd ldap02 && echo "ldap02"|passwd ldap02 --stdin

修改migrationtools文件的配置域 /usr/share/migrationtools/migrate_common.ph:



  1. 71 $DEFAULT_MAIL_DOMAIN = "hwinfo.com";

  2. 72

  3. 73 # Default base

  4. 74 $DEFAULT_BASE = "dc=hwinfo,dc=com";

导出需要转换的条目:



  1. $ tail -2 /etc/passwd > user

  2. $ tail -2 /etc/group > group

转换并导入系统:



  1. $ /usr/share/migrationtools/migrate_passwd.pl user >user.ldif

  2. $ /usr/share/migrationtools/migrate_group.pl group > group.ldif

  3. #  可以根据里面的内容进行自定义

  4. $ ldapadd -x -w ldap123 -D "cn=admin,dc=hwinfo,dc=com" -f user.ldif

  5. $ ldapadd -x -w ldap123 -D "cn=admin,dc=hwinfo,dc=com" -f group.ldif

我们通常希望用户可以修改自身的密码,所以在这里我们增加这样的权限:



  1. cat <<EOF | ldapmodify -Y EXTERNAL -H ldapi:/// -D "cn=admin,dc=hwinfo,dc=com"

  2. dn: olcDatabase={2}hdb,cn=config

  3. add: olcAccess

  4. olcAccess: to attrs=userPassword,shadowLastChange

  5.  by dn="cn=admin,dc=hwinfo,dc=com" write

  6.  by anonymous auth by self write by * none

  7. olcAccess: to *

  8.  by dn="cn=admin,dc=hwinfo,dc=com" write

  9.  by users read

  10.  by * none

  11. EOF

这里推荐三款管理工具:

  • LAM: Web UI类型功能丰富多样化目前还在更新;

  • LDAP Admin:Windows中的桌面工具,基本够用,我常用;

  • apache directory studio: 高级功能必备产品。

使用方法这里不再阐述了。

4. 客户端映射用户

这里我们的客户端的环境同样是CentOS7.X, 但是经过测试同类型机器基本都支持,但建议使用CentOS7的环境。

安装系统基础依赖:



  1. $ yum install -y nscd nss-pam-ldapd pcre pcre-devel openldap-clients authconfig

这里我们通过authconfig可以进行一键配置方便简单,但是我们遵循一个原则,操作前备份,操作后检查。



  1. # 备份配置

  2. $ authconfig --savebackup=systemconfig.bak

  3. # 配置

  4. $ authconfig --enablemkhomedir --enableldap --enableldapauth \

  5. --ldapserver=ldap://node-3.hw.io:389 --ldapbasedn="dc=hwinfo,dc=com" \

  6. --enableshadow --update

我们这里还不能进行认证,因为我们为了安全,前面讲匿名用户的访问权限给禁止了,所以这边我们需要使用binddn用户,这里我们修改配置文件,增加如下内容:



  1. $ grep -E "^bind" /etc/nslcd.conf

  2. binddn cn=admin,dc=hwinfo,dc=com

  3. bindpw ldap123

重启服务使其生效:



  1. $ systemctl restart nslcd

测试一下,是不是满足我们的需求了:



  1. $ id ldap01

  2. uid=1001(ldap01) gid=1001(ldap01) groups=1001(ldap01)

OK,这里已经实现了用户的映射。

这里你就可以通过SSH进行连接这个用户了,但是如果你不想用户被登录,那么可以通过SSH的限制进行控制那些用户可以登陆连接。

在整个篇幅中我们讲述了LDAP的作用,同时配合Kerberos可以弥补管理的难度,以及后面我们做了一个demo来安装LDAP Server,做客户端认证;用户管理远远不止于此,后面还有更多,这里我只是围绕LDAP来做基础Demo,那么如何和其他组件进行结合呢?


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK