StreamSets 实现LDAP统一认证登录部署配置的实现
StreamSets Data Collector TM是一种轻量级,功能强大的设计和执行引擎,可实时传输数据。使用数据收集器来路由和处理数据流中的数据。
实现该过程的动机
StreamSets用户认证
Data Collector 可以基于LDAP或文件对用户帐户进行身份验证。最佳实践是在组织中使用LDAP。默认情况下,Data Collector使用基于文件的身份验证。
Data Collector 提供了几个角色,这些角色确定用户可以执行的操作。根据使用的是LDAP认证还是基于文件的认证,将角色分配给用户帐户的步骤有所不同。
**注意:**Data Collector的生产部署 应与LDAP身份验证集成。
部署安装LDAP服务
LDAP代表轻量级目录访问协议,该协议可以多种方式使用,例如用于身份验证,共享目录(用于邮件客户端),地址簿等。。LDAP协议可以用于建立和存储任何类型的信息。该OpenLDAP的服务器为您提供了访问存储在一个树形结构信息的可能性。其他和LDAP相关的知识概念我不做多余的累述,大家可以从互联网得到太多的介绍和说明。我在部署安装LDAP服务时在Ubuntu和CentOS都实现过部署配置。下面我先给出我从零开始开始部署时参考过的文档链接。
Ubuntu:如何在Debian,Ubuntu和Linux Mint系统上安装和配置OpenLDAP服务器以及如何使用phpLDAPadmin对其进行管理
CentOS:在Linux和CentOS系统上安装和配置OpenLDAP服务器以及如何使用LDAPadmin图形化界面对其进行管理
接着简单给出我的部署安装的过程记录:
Ubuntu:
1. 更新Ubuntu系统为最新
sudo apt update && sudo apt upgrade
2. 安装
sudo apt install slapd ldap-utils
LDAP目录创建管理员密码,比如:Manager**,admin等
3.重新配置LDAP软件包
sudo dpkg-reconfigure slapd
3.1 要构建LDAP目录的基本DN,需要一个DNS域名:(eg:kylin.org.cn),输入您的DNS域名,然后按Enter确认。
The DNS domain name is used to construct the base DN of the LDAP directory. For example, 'foo.example.org' will create the directory with 'dc=foo, dc=example, dc=org' as base DN.
DNS domain name:
kylin.org.cn___________________________________________________________________________________________________________ <Ok>
3.2 然后,ldap将要求在LDAP目录的基本DN中输入要使用的组织名称。输入您的公司或组织的名称,然后再次按Enter。
Please enter the name of the organization to use in the base DN of your LDAP directory.
Organization name: ChenQi__________________________________________________________________________________
<Ok>
3.3 组织或公司的名字添加后,包的配置会要求输入密码的管理员在进入LDAP目录。您需要输入在先前步骤中创建的管理员密码。 Please enter the password for the admin entry in your LDAP directory.
Administrator password:
*********_____________________________________________________________
<Ok> │
3.4 确认管理员密码
Please enter the admin password for your LDAP directory again to verify that you have typed it correctly.
Confirm password:
*********_________________________________________________________________________________________________
│ <Ok>
3.5 确认管理员密码后,必须选择数据库。根据建议选择了MDB。
HDB and BDB use similar storage formats, but HDB adds support for subtree renames. Both support the same configuration options.
The MDB backend is recommended. MDB uses a new storage format and requires less configuration than BDB or HDB.
In any case, you should review the resulting database configuration for your needs. See /usr/share/doc/slapd/README.Debian.gz for more details.
Database backend to use:
│ BDB
│ HDB
│ MDB
│ <Ok>
3.6 您可以选择您认为更适合的数据库。确定要使用的数据库后,请按Enter确认选择。然后,将提示您另一个问题。清除slapd后,选择“是”以删除数据库。
| Do you want the database to be removed when slapd is purged? │
│ <Yes> <No> │
3.7 再次选择是,然后按Enter。
There are still files in /var/lib/ldap which will probably break the configuration process. If you enable this option, the maintainer
scripts will move the old database files out of the way before creating a new database.
│ Move old database?
│ <Yes> <No>
Backing up /etc/ldap/slapd.d in /var/backups/slapd-2.4.45+dfsg-1ubuntu1.6... done.
Moving old database directory to /var/backups:
- directory unknown... done.
Creating initial configuration... done.
Creating LDAP directory... done.
invoke-rc.d: could not determine current runlevel
# 我这里是WSL2-Ubuntu18.04,本来是应该启动slapd服务的,这里没启动,所以进行下面操作
4. 启动slapd服务
root@kylin:~# service slapd status
* slapd is not running
root@kylin:~# service slapd start
* Starting OpenLDAP slapd [ OK ]
root@kylin:~# service slapd status
* slapd is running
5. 填充LDAP数据库
#现在我们要将初始数据添加到LDAP数据库。 我们将从文件中执行此操作并创建单个条目。
root@kylin:~# vim ldap_data.ldif
root@kylin:~# cat ldap_data.ldif
dn: ou=Peoples,dc=kylin,dc=org,dc=cn
objectClass: organizationalUnit
ou: People
dn: ou=Groups,dc=kylin,dc=org,dc=cn
objectClass: organizationalUnit
ou: Groups
dn: cn=ZDWW,ou=Groups,dc=kylin,dc=org,dc=cn
objectClass: posixGroup
cn: BigData
gidNumber: 5000
dn: uid=kylin,ou=People,dc=kylin,dc=org,dc=cn
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: kylin
sn: qi
givenName: chen
cn: chenqi
displayName: kylin
uidNumber: 10000
gidNumber: 5000
userPassword: kylin
gecos: chenqi
loginShell: /bin/bash
homeDirectory: /kylin
6. 将文件内容添加到LDAP: 使用LDAP管理员密码成功进行身份验证后,将添加数据。
root@kylin:~# ldapadd -x -D cn=admin,dc=kylin,dc=org,dc=cn -W -f ldap_data.ldif
Enter LDAP Password:
adding new entry "ou=People,dc=kylin,dc=org,dc=cn"
adding new entry "ou=Groups,dc=kylin,dc=org,dc=cn"
adding new entry "cn=ZDWW,ou=Groups,dc=kylin,dc=org,dc=cn"
adding new entry "uid=kylin,ou=People,dc=kylin,dc=org,dc=cn"
7. 要测试LDAP服务器,请使用ldapsearch -x命令。
root@kylin:~# ldapsearch -x
# extended LDIF
#
# LDAPv3
# base <> (default) with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
# search result
search: 2
result: 32 No such object
# numResponses: 1
8. 编辑 /etc/ldap/ldap.conf配置文件
root@kylin:~# vim /etc/ldap/ldap.conf
root@kylin:~# cat /etc/ldap/ldap.conf
#
# LDAP Defaults
#
# See ldap.conf(5) for details
# This file should be world readable but not world writable.
BASE dc=kylin,dc=org,dc=cn
#URI ldap://ldap.kylin.org.cn ldap://ldap-master.kylin.org.cn:666
#SIZELIMIT 12
#TIMELIMIT 15
#DEREF never
# TLS certificates (needed for GnuTLS)
TLS_CACERT /etc/ssl/certs/ca-certificates.crt
#这时能看到导入的数据信息
root@kylin:~# ldapsearch -x
# extended LDIF
#
# LDAPv3
# base <dc=kylin,dc=org,dc=cn> (default) with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
# kylin.org.cn
dn: dc=kylin,dc=org,dc=cn
objectClass: top
objectClass: dcObject
objectClass: organization
o: ChenQi
dc: kylin
# admin, kylin.org.cn
dn: cn=admin,dc=kylin,dc=org,dc=cn
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
# Peoples, kylin.org.cn
dn: ou=Peoples,dc=kylin,dc=org,dc=cn
objectClass: organizationalUnit
ou: Peoples
# Groups, kylin.org.cn
dn: ou=Groups,dc=kylin,dc=org,dc=cn
objectClass: organizationalUnit
ou: Groups
# ZDWW, Groups, kylin.org.cn
dn: cn=ZDWW,ou=Groups,dc=kylin,dc=org,dc=cn
objectClass: posixGroup
cn: BigData
cn: ZDWW
gidNumber: 5000
# kylin, Peoples, kylin.org.cn
dn: uid=kylin,ou=Peoples,dc=kylin,dc=org,dc=cn
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: kylin
sn: qi
givenName: chen
cn: chenqi
displayName: kylin
uidNumber: 10000
gidNumber: 5000
gecos: chenqi
loginShell: /bin/bash
homeDirectory: /kylin
# search result
search: 2
result: 0 Success
# numResponses: 7
# numEntries: 6
9. 您可以使用以下命令搜索数据库。
# ldapsearch -x -LLL -b dc=linuxidc,dc=com 'uid=USER' cn gidNumber
root@kylin:~# ldapsearch -x -LLL -b dc=kylin,dc=org,dc=cn 'uid=kylin' cn gidNumber
dn: uid=kylin,ou=People,dc=kylin,dc=org,dc=cn
cn: chenqi
gidNumber: 5000
#您现在拥有LDAP数据库中的第一个条目。 您可以在每次需要添加条目时修改该数据文件,也可以为LDAP安装基于Web的前端或者Windows图形化界面以使该过程更容易。无论哪种方式处理LDAP数据,您都可以开始使用这种功能强大且灵活的目录访问协议。
10. 使用phpLDAPadmin进行LDAP管理.
# 要使用WebUI,Ubuntu需要安装Apache2,使用http服务。
root@kylin:~# sudo apt-get install apache2
root@kylin:~# service apache2 status
* apache2 is not running
root@kylin:~# service apache2 start
* Starting Apache httpd web server apache2
root@kylin:~# service apache2 status
* apache2 is running
root@kylin:~# vim initservice.sh # WSL无法实现系统启动服务自启动,所以将启动命令加入服务初始化脚本。
# phpLDAPadmin是用于LDAP服务器管理的GUI管理工具。此GUI工具将帮助我们通过Web界面与您的LDAP服务器进行交互。它在默认存储库中可用,可以使用apt-get命令安装。
root@kylin:~# sudo apt-get install phpldapadmin
# 打开phpldapadmin config.php文件进行相关配置。
root@kylin:~# vim /etc/phpldapadmin/config.php
# 需要做的就是用您自己的值替换域名
$ servers=new Datastore();
$ servers-> newServer('ldap_pla');
$ servers-> setValue('server','name','My LDAP Server');
$ servers-> setValue('server','host','127.0.0.1');
$ servers-> setValue('server','base',array('dc=kylin,dc=org, dc=cn '));
$ servers-> setValue('login','bind_id','cn=admin,dc=kylin,dc=org, dc=cn ');
WEBUI: http://hadoop/phpldapadmin/ #输入您的ldap登录凭据,然后单击登录。
CentOS:
1. CentOS安装OpenLDAP
yum -y install openldap openldap-servers openldap-clients
2. 安装成功后会生成ldap用户
id ldap
uid=55(ldap) gid=55(ldap) 组=55(ldap)
3. 拷贝数据库配置文件,并改变用户和用户组
cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
chown ldap:ldap /var/lib/ldap/DB_CONFIG
[root@worker3 ~]# ll -d /var/lib/ldap/DB_CONFIG
-rw-r--r-- 1 ldap ldap 845 10月 13 11:12 /var/lib/ldap/DB_CONFIG
4. 配置ldap
vim /etc/openldap/ldap.conf
cat /etc/openldap/ldap.conf
#
# LDAP Defaults
#
# See ldap.conf(5) for details
# This file should be world readable but not world writable.
BASE dc=zdww,dc=org,dc=cn
#URI ldap://ldap.example.com ldap://ldap-master.example.com:666
#SIZELIMIT 12
#TIMELIMIT 15
#DEREF never
TLS_CACERTDIR /etc/openldap/certs
# Turning this off breaks GSSAPI used with krb5 when rdns = false
SASL_NOCANON on
TLS_REQCERT never
5. 开启加密支持
cat /etc/sysconfig/ldapd
SLAPD_LDAPS=yes
6. 启动OpenLDAP Server
systemctl start slapd # 启动
systemctl enable slapd
Created symlink from /etc/systemd/system/multi-user.target.wants/slapd.service to /usr/lib/systemd/system/slapd.service.
systemctl status slapd # 查看状态
7. 查看监听端口
ss -ntl | grep 389
LISTEN 0 128 *:389 *:*
LISTEN 0 128 [::]:389 [::]:*
ss -ntl | grep 636
LISTEN 0 128 *:636 *:*
LISTEN 0 128 [::]:636 [::]:*
8. 设置LDAP管理员密码
# 生成一个LDAP管理用户root密码
[root@worker3 ~]# slappasswd
New password:root
Re-enter new password:root
{SSHA}MT4mXNitWOD65685PdUMZTb1pkYV+ajn
# 自定义LDAP配置属性
[root@worker3 ~]# vim passwd.ldif
[root@worker3 ~]# cat passwd.ldif
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}MT4mXNitWOD65685PdUMZTb1pkYV+ajn #管理员密码
> 以上配置文件关键参数说明:
ldif即LDAP Data Interchange Format,是LDAP中数据交换的一种文件格式。文件内容采用的是key-value形式,注意value后面不能有空格。
上面内容中dn即distingush name
olc即Online Configuration,表示写入LDAP后不需要重启即可生效
changetype: modify表示修改一个entry,changetype的值可以是add,delete, modify等。
add: olcRootPW表示对这个entry新增了一个olcRootPW的属性
olcRootPW:{SSHA}demsoYhw/y4Rz9Pgbpv6KBBzuVQ1t53J指定了属性值
9. 初始化LDAP配置
[root@worker3 ~]# ldapadd -Y EXTERNAL -H ldapi:/// -f passwd.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={0}config,cn=config"
10. 导入schema
[root@worker3 ~]# ls /etc/openldap/schema/*.ldif | while read f; do ldapadd -Y EXTERNAL -H ldapi:/// -f $f; done
11. 设定默认域
# 先生成一个密码admin
[root@worker3 ~]# slappasswd
New password:admin
Re-enter new password:admin
{SSHA}ndCqAPuaDnEAqwoMSbj4eB+jq4EhyYt5
#自定义LDAP配置属性
[root@worker3 ~]# vim domain.ldif
[root@worker3 ~]# cat domain.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=Manager,dc=zdww,dc=org,dc=cn" read by * none
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=zdww,dc=org,dc=cn
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=Manager,dc=zdww,dc=org,dc=cn
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}ndCqAPuaDnEAqwoMSbj4eB+jq4EhyYt5
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange by
dn="cn=Manager,dc=zdww,dc=org,dc=cn" write by anonymous auth by self write by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by dn="cn=Manager,dc=zdww,dc=org,dc=cn" write by * read
> 以上配置文件关键参数说明:
olcAccess即access,该key用于指定目录的ACL即谁有什么权限可以存取什么
olcRootDN设定管理员root用户的distingush name
注意替换上面文件内容中cn为具体的域信息
olcRootPW用上面新生成的密码替换
12. 将默认域配置文件写入LDAP
[root@worker3 ~]# ldapmodify -Y EXTERNAL -H ldapi:/// -f domain.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={1}monitor,cn=config"
modifying entry "olcDatabase={2}hdb,cn=config"
modifying entry "olcDatabase={2}hdb,cn=config"
modifying entry "olcDatabase={2}hdb,cn=config"
modifying entry "olcDatabase={2}hdb,cn=config"
13. 添加基本目录
[root@worker3 ~]# vim basedomain.ldif
[root@worker3 ~]# cat basedomain.ldif
dn: dc=zdww,dc=org,dc=cn
objectClass: top
objectClass: dcObject
objectclass: organization
o: zdww org cn
dc: zdww
dn: cn=Manager,dc=zdww,dc=org,dc=cn
objectClass: organizationalRole
cn: Manager
description: Directory Manager
dn: ou=Peoples,dc=zdww,dc=org,dc=cn
objectClass: organizationalUnit
ou: Peoples
dn: ou=Groups,dc=zdww,dc=org,dc=cn
objectClass: organizationalUnit
ou: Groups
14. 将基本目录信息写入LDAP
[root@worker3 ~]# ldapadd -x -D cn=Manager,dc=zdww,dc=org,dc=cn -W -f basedomain.ldif
Enter LDAP Password:
adding new entry "dc=zdww,dc=org,dc=cn"
adding new entry "cn=Manager,dc=zdww,dc=org,dc=cn"
adding new entry "ou=People,dc=zdww,dc=org,dc=cn"
adding new entry "ou=Group,dc=zdww,dc=org,dc=cn"
15. 测试是否成功
[root@worker3 ~]# ldapsearch -LLL -W -x -D "cn=Manager,dc=zdww,dc=org,dc=cn" -H ldap://localhost -b "dc=zdww,dc=org,dc=cn"
Enter LDAP Password:admin
dn: dc=zdww,dc=org,dc=cn
objectClass: top
objectClass: dcObject
objectClass: organization
o: zdww org cn
dc: zdww
dn: cn=Manager,dc=zdww,dc=org,dc=cn
objectClass: organizationalRole
cn: Manager
description: Directory Manager
dn: ou=People,dc=zdww,dc=org,dc=cn
objectClass: organizationalUnit
ou: People
dn: ou=Group,dc=zdww,dc=org,dc=cn
objectClass: organizationalUnit
ou: Group
LDAP基本使用
可以使用ldapadmin作为LDAP的图形管理工具,下载地址:LDAPadmin图形化界面
# 通过LDAPadmin添加用户和组信息,组信息对应StreamSets角色名称
ldapsearch -x
# extended LDIF
#
# LDAPv3
# base <dc=zdww,dc=org,dc=cn> (default) with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
# zdww.org.cn
dn: dc=zdww,dc=org,dc=cn
objectClass: top
objectClass: dcObject
objectClass: organization
o: zdww org cn
dc: zdww
# Manager, zdww.org.cn
dn: cn=Manager,dc=zdww,dc=org,dc=cn
objectClass: organizationalRole
description: Directory Manager
cn: Manager
# Peoples, zdww.org.cn
dn: ou=Peoples,dc=zdww,dc=org,dc=cn
objectClass: organizationalUnit
ou: Peoples
# Groups, zdww.org.cn
dn: ou=Groups,dc=zdww,dc=org,dc=cn
objectClass: organizationalUnit
ou: Groups
# BigData, Groups, zdww.org.cn
dn: cn=BigData,ou=Groups,dc=zdww,dc=org,dc=cn
objectClass: posixGroup
objectClass: top
cn: BigData
description: zdww-jsfzb
gidNumber: 6092
memberUid: admin
memberUid: kylin
# admin, Peoples, zdww.org.cn
dn: uid=admin,ou=Peoples,dc=zdww,dc=org,dc=cn
objectClass: posixAccount
objectClass: top
objectClass: inetOrgPerson
objectClass: shadowAccount
gidNumber: 0
givenName: admin
sn: admin
displayName: admin
uid: admin
homeDirectory: /admin
loginShell: /bin/bash
shadowFlag: 0
shadowMin: 0
shadowMax: 99999
shadowWarning: 0
shadowInactive: 99999
shadowExpire: 99999
cn: admin
uidNumber: 51816
# kylin, Peoples, zdww.org.cn
dn: uid=kylin,ou=Peoples,dc=zdww,dc=org,dc=cn
objectClass: posixAccount
objectClass: top
objectClass: inetOrgPerson
objectClass: shadowAccount
gidNumber: 0
givenName: kylin
sn: kylin
displayName: kylin
uid: kylin
homeDirectory: /kylin
loginShell: /bin/bash
shadowFlag: 0
shadowMin: 0
shadowMax: 99999
shadowWarning: 0
shadowInactive: 99999
shadowExpire: 99999
cn: kylin
uidNumber: 56923
# DEV, Groups, zdww.org.cn
dn: cn=DEV,ou=Groups,dc=zdww,dc=org,dc=cn
objectClass: posixGroup
objectClass: top
cn: DEV
description: DEV:creator
gidNumber: 48893
# OPS, Groups, zdww.org.cn
dn: cn=OPS,ou=Groups,dc=zdww,dc=org,dc=cn
objectClass: posixGroup
objectClass: top
description: OPS:manager
cn: OPS
memberUid: kylin
gidNumber: 65114
# SUPER, Groups, zdww.org.cn
dn: cn=SUPER,ou=Groups,dc=zdww,dc=org,dc=cn
objectClass: posixGroup
objectClass: top
description: SUPER:creator,manager
cn: SUPER
memberUid: admin
gidNumber: 4491
# search result
search: 2
result: 0 Success
# numResponses: 11
# numEntries: 10
StreamSets配置LDAP认证
如果您的组织使用LDAP,则将Data Collector配置为使用LDAP身份验证。配置LDAP身份验证后,用户将使用其LDAP用户名和密码登录到Data Collector。
要配置LDAP身份验证,请执行以下任务:
-
在Data Collector配置文件
$SDC_CONF/sdc.properties
中通过将http.authentication.login.module属性设置为ldap来启用LDAP身份验证 。 -
在
$SDC_CONF/sdc.properties
文件中,通过将http.authentication 属性设置为basic,digest或 form来定义HTTP身份验证类型。 -
在
$SDC_CONF/ldap-login.conf
文件中,配置LDAP服务器的连接信息。以下是我根据自己的LDAP相关信息和认证方式进行的设置。相关配置属性或更多LDAP认证设置说明可见StreamSets官方文件的用户认证说明。
ldap { com.streamsets.datacollector.http.LdapLoginModule required debug="true" useLdaps="false" useStartTLS="false" contextFactory="com.sun.jndi.ldap.LdapCtxFactory" hostname="worker3" port="389" bindDn="cn=Manager,dc=zdww,dc=org,dc=cn" bindPassword="admin" forceBindingLogin="true" userBaseDn="ou=Peoples,dc=zdww,dc=org,dc=cn" userIdAttribute="uid" userPasswordAttribute="userPassword" userObjectClass="posixAccount" userObjectClass="top" userObjectClass="inetOrgPerson" userObjectClass="shadowAccount" userFilter="uid={user}" roleBaseDn="ou=Groups,dc=zdww,dc=org,dc=cn" roleNameAttribute="cn" roleMemberAttribute="memberUid" roleObjectClass="posixGroup" roleObjectClass="top" roleFilter="memberUid={user}"; };
-
要将LDAP组映射到Data Collector 角色,请在Data Collector 配置文件
$SDC_CONF/sdc.properties
中配置属性**http.authentication.ldap.role.mapping=DEV:creator;OPS:manager;SUPER:creator,manager **。
之后再重启过StreamSets后,就可以进行LDAP认证登录了。方便用户及用户权限的管理。