本文通过EMR自带的框架,在非kerberos的环境下,通过OpenLDAP建立起用户/用户组体系,并使用Hive+Ranger+Hue的链路,完成数仓中数据访问权限的管控。
概述
方案介绍
企业级别的数仓,通常需要提供数据给业务方/分析师查询,随之而来的权限管控问题,常常困扰了许多用户,本文将基于EMR中提供的组件帮助客户快速建立数仓的权限体系,完成Hive中数据访问权限的管控。
目标读者
使用开源Hadoop生态体系的用户,对于Hive,Hue,Ranger,OpenLDAP,Knox有一定了解。
适用场景
希望通过用户组/角色来快速建立权限体系的企业用户。
方案架构
方案架构图
我们将企业的用户分为三种身份角色,不同身份角色又有各自不同的组。
角色 | 身份 |
运维管理员 | 管理员(manager_group) |
分析师/运营 | 分析师组(analyst_group) |
访客组(guest_group) | |
研发/BI | 数仓1组(bigdata1_group) |
数仓2组(bigdata2_group) | |
算法组(ai_group) |
方案优势
大多数场景中,我们不会单独为每个账户配置权限,而是通过赋予组/角色权限,再将账户绑定到组/角色上,完成对单个账号权限的配置。
在本案例中,无需引入其他框架,通过EMR自带的框架实现权限的管理,帮助客户在非kerberos的场景下,建立权限体系,保障数据安全。
相关框架介绍
OpenLDAP介绍
OpenLDAP(后文统一缩写为LDAP)是轻量级目录访问协议的开源实现。
可以简单的理解为是EMR中用来存放用户认证信息的框架,许多开源框架也支持从LDAP中同步用户信息,做账密认证,例如Hive,Hue,Ranger等。
本案例会在LDAP中创建用户/用户组,并集成到Hadoop、Ranger、Hive、Hue中。
所有成员:丁一 、胡二、 张三、 李四、 王五、 赵六、 孙七、 周八。
LDAP中组织关系如下:
组别类型 | 运维/管理员 | 研发/BI | 分析师/运营 | |||
组别中文 | 管理员 | 数仓1组 | 数仓2组 | 算法组 | 分析师组 | 访客组 |
组别英文 | manager_group | bigdata1_group | bigdata2_group | ai_group | analyst_group | guest_group |
组员 | 丁一 | 张三 | 李四 | 王五 | 王五 | 周八 |
胡二 | 孙七 | 赵六 |
Hive介绍
Hive是一个基于Hadoop的数据仓库框架,在大数据业务场景中,主要用来进行数据提取、转化和加载(ETL)以及元数据管理(官网介绍)。
它包含两个常驻服务:
Hive Metastore:管理库/表/字段分区等元数据。
Hive Server2:Hive提交任务的JDBC入口。
本案例中,使用HiveServer2作为提交sql,鉴定权限的入口。
Hue介绍
Hue是数据库和数据仓库的开源SQL助手,无需额外开发,即可在浏览器端与Hadoop集群进行交互来分析处理数据(官网介绍)。
许多使用开源框架的企业,都会选择将Hue提供给内部的数据分析师,甚至外部的访客查询数仓的数据,Hue提交任务到Hive是通过JDBC接口(HiveServer2服务),因此本案例中,引入Hue来作为sql查询的入口。
Ranger介绍
Ranger提供集中式的权限管理框架,可以对Hadoop生态中的HDFS、Hive和YARN等组件进行细粒度的权限访问控制,并且提供了Web UI方便管理员操作(官网介绍)。
它包含两个较为重要的组件:
Ranger Admin:提供了Web UI界面,让用户可以方便的配置,管理权限。
Ranger UserSync:定时更新用户信息,默认同步Linux上的用户信息,本案例中会配置从LDAP中同步用户/用户组信息。
Knox介绍
各种开源框架都提供了Web访问入口,端口不一而足,这对于安全组端口的放行造成不小的麻烦,Knox将HDFS、YARN、Spark和Ganglia等Web UI页面,统一接入到8443端口,并且绑定了LDAP做登录认证,帮助客户可以在公网的条件下更加安全、便捷的访问集群不同服务的Web UI(官网介绍)。
案例中,会使用Knox访问Ranger UI配置权限,当然在需要查看HDFS的WEB,或者需要通过YARN查看任务状态等时候,也会大量使用到Knox。
方案实施
前提条件
已有一个空闲,集群所有服务正常,header机器绑定弹性公网IP,并且没有开启过高安全(Kerberos)的EMR-Hadoop集群。
建议版本在3.34.0及后续版本或EMR-4.8.0及后续版本,因为在步骤二、三、六中,均使用到了“一键启用LDAP”功能,实现一键添加配置,如果使用低于建议版本的集群,则需要手动添加不同框架集成LDAP的配置,较为繁琐。
绑定公网是为了能直接使用Knox访问各组件的Web服务,如果不想绑定公网,请自行通过其他方式访问各组件的Web服务。
本案例使用EMR-3.38.3版本进行验证。
上述的EMR集群中添加过Ranger服务,安装成功并且服务正常。
用户使用的阿里云账号拥有EMR的AliyunEMRFullAccess权限。
后续的许多操作需要在EMR控制台添加/部署配置,并重启服务。
部分操作需要登录到ECS上执行,例如使用脚本方式创建LDAP用户/用户组,如果通过公网访问,那么安全组需要放行指定IP访问集群的22端口,也可以通过ECS控制台内网访问。
访问Knox的8443端口和Hue的8888端口权限。
安全组需要放行指定IP访问集群的8443端口和8888端口,通过Konx访问Ranger,YARN等UI,访问Hue UI。
操作步骤
步骤一:LDAP中创建用户/用户组
LDAP创建用户。
通过EMR管控台创建LDAP用户(推荐)。
在顶部菜单栏处,根据实际情况选择地域和资源组。
进入上方的集群管理页签,单击相应集群所在行的详情。
在左侧导航栏,进入用户管理,单击添加用户。
在添加用户对话框的用户名下拉列表中,选择已有的RAM用户作为EMR用户的名称,输入密码和确认密码,单击确定。
通过LDAP脚本创建LDAP用户。
通过ssh或者“ECS控制台”远程登录EMR集群对应的ECS机器。
请参考附件一“添加用户”脚本,在任意一台ECS机器中执行。
#请将<admin_passwd>替换成LDAP中admin的密码 #请将<user_password>替换成每个用户的密码 sh adduser.sh <admin_password> dingyi <user_password> sh adduser.sh <admin_password> huer <user_password> sh adduser.sh <admin_password> zhangsan <user_password> sh adduser.sh <admin_password> lisi <user_password> sh adduser.sh <admin_password> wangwu <user_password> sh adduser.sh <admin_password> zhaoliu <user_password> sh adduser.sh <admin_password> sunqi <user_password> sh adduser.sh <admin_password> zhouba <user_password>
LDAP创建用户组。
通过ssh或者“ECS控制台”远程登录EMR集群对应的ECS机器。
请参考附件一“添加用户组”脚本,在任意一台ECS机器中执行。
#请将<admin_passwd>替换成LDAP中admin的密码 sh addgroup.sh <admin_password> manager_group dingyi sh addgroup.sh <admin_password> bigdata1_group zhangsan sh addgroup.sh <admin_password> bigdata2_group lisi sh addgroup.sh <admin_password> ai_group wangwu sh addgroup.sh <admin_password> analyst_group wangwu sh addgroup.sh <admin_password> guest_group zhouba
将LDAP用户添加到用户组中。
通过ssh或者“ECS控制台”远程登录EMR集群对应的ECS机器。
请参考附件一“添加用户到用户组”脚本,在任意一台ECS机器中执行。
#请将<admin_passwd>替换成LDAP中admin的密码 sh adduser2group.sh <admin_password> bigdata2_group huer sh adduser2group.sh <admin_password> ai_group sunqi sh adduser2group.sh <admin_password> analyst_group zhaoliu
步骤验证。
执行LDAP查询组别命令,查询用户组信息。
通过回显信息,可以查看用户/用户组添加是否成功,用户组中是否添加了对应的用户。
#请将<admin_passwd>替换成LDAP中admin的密码 [root@emr-header-1 ~]# ldapsearch -x -H ldap://emr-header-1:10389 -D uid=admin,o=emr -w <admin_passwd> -b "ou=groups,o=emr" # extended LDIF # # LDAPv3 # base <ou=groups,o=emr> with scope subtree # filter: (objectclass=*) # requesting: ALL # # groups, emr dn: ou=groups,o=emr objectClass: organizationalUnit objectClass: top ou: groups # manger_group, groups, emr dn: cn=manger_group,ou=groups,o=emr objectClass: groupOfNames cn: manger_group member: uid=dingyi,ou=people,o=emr description: manger_group group # bigdata1_group, groups, emr dn: cn=bigdata1_group,ou=groups,o=emr objectClass: groupOfNames cn: bigdata1_group member: uid=zhangsan,ou=people,o=emr description: bigdata1_group group # bigdata2_group, groups, emr dn: cn=bigdata2_group,ou=groups,o=emr objectClass: groupOfNames cn: bigdata2_group member: uid=lisi,ou=people,o=emr member: uid=huer,ou=people,o=emr description: bigdata2_group group # ai_group, groups, emr dn: cn=ai_group,ou=groups,o=emr objectClass: groupOfNames cn: ai_group member: uid=wangwu,ou=people,o=emr member: uid=sunqi,ou=people,o=emr description: ai_group group # analyst_group, groups, emr dn: cn=analyst_group,ou=groups,o=emr objectClass: groupOfNames cn: analyst_group member: uid=wangwu,ou=people,o=emr member: uid=zhaoliu,ou=people,o=emr description: analyst_group group # guest_group, groups, emr dn: cn=guest_group,ou=groups,o=emr objectClass: groupOfNames cn: guest_group member: uid=zhouba,ou=people,o=emr description: guest_group group # search result search: 2 result: 0 Success # numResponses: 8 # numEntries: 7
通过管控台添加LDAP用户的方式,只能添加与RAM账号同名的用户,账密信息会同步到LDAP中,并在EMR集群所属的ECS机器中创建同名用户(但由于创建的Linux账号默认不设置密码,所以无法使用该用户登录ECS) 管理用户。
步骤二:HiveServer2开启LDAP认证
HiveServer2默认没有做认证(客户可以伪装不同用户访问数据)。
通常情况下,会使用LDAP/Kerberos来做认证(本文着重介绍LDAP),开启了LDAP权限认证之后,用户连接HiveServer2的时候,就需要提供LDAP中的账密信息。
进入Hive页面。
在顶部菜单栏处,根据实际情况选择地域和资源组。
进入上方的集群管理页签,单击相应集群所在行的详情。
在左侧导航栏,选择集群服务 > Hive。
开启LDAP认证。
在Hive服务页面,选择右上角的操作 > 开启LDAP认证。
在执行集群操作对话中,单击确认。
单击上方的查看操作历史直至操作状态显示成功。
重启HiveServer2。
在Hive服务页面,选择右上角的操作 > 重启HiveServer2。
在执行集群操作对话中,输入执行原因,单击确定。
在确认对话中,单击确定。
Hive开启LDAP认证后,Hue访问Hive需要进行额外的配置,本文会在步骤五中进行详细介绍,管理LDAP认证。
步骤验证。
通过beeline连接hiveserver2,需要输入正确的LDAP账密信息,才能通过
beeline -u jdbc:hive2://emr-header-1:10000 -n <user_name> -p <user_password>
。通过jdbc连接hiveserver2,需要输入正确的LDAP账密信息,才能通过
jdbc:hive2://emr-header-1:10000/default;user=<user_name>;password=<user_password>
。
步骤三:RangerUserSync开启LDAP认证
Ranger默认只会读取UserSync服务所在的Linux用户信息,所以需要做额外的配置,将LDAP中的用户/用户组的关系提供给Ranger,这样Ranger UI中才能选到对应的用户/用户组,才能实现权限的配置。
进入Ranger页面。
在顶部菜单栏处,根据实际情况选择地域和资源组。
单击上方的集群管理页签。
在集群管理页面,单击相应集群所在行的详情。
在左侧导航栏,选择集群服务 > Ranger。
开启LDAP认证。
在Ranger服务页面,选择右上角的操作 > UserSync开启LDAP认证。
在执行集群操作对话中,单击确认。
单击上方的查看操作历史直至Configure操作状态显示成功。
在服务配置区域,单击ranger-ugsync-site页签。
配置如下参数,同步LDAP用户组至Ranger。
ranger.usersync.group.memberattributename = member ranger.usersync.group.nameattribute = cn ranger.usersync.group.objectclass = groupofnames ranger.usersync.group.searchbase = ou=groups,o=emr ranger.usersync.group.searchenabled = true ranger.usersync.group.usermapsyncenabled = true
单击保存,在确认修改对话框中,点选自动更新配置,填写执行原因,最后单击确认。
单击上方的查看操作历史直至操作Configure状态显示成功。
重启RangerUserSync。
在Ranger服务页面,选择右上角的操作 > 重启RangerUserSync。
在执行集群操作对话中,输入执行原因,单击确定。
在确认对话中,单击确定。
步骤验证。
通过Knox访问Ranger UI(官网链接),请先使用LDAP中的账密进行knox认证,跳转到Ranger UI之后,再通过Ranger UI的默认账密
admin/admin
,登录Ranger。击Ranger UI中的Settings,查看Users和Groups的信息是否准确无误。
UserSync同步LDAP中用户信息是add模式,也就是说,如果从LDAP中删除了一个用户/用户组,但是在Ranger中还是可以看到这个用户/用户组,除非手动在Ranger UI上,将这个用户/用户组删除。
步骤四:HDFS配置LDAP用户组映射
HDFS默认会从active的Namenode所在的Linux上,读取Linux用户/用户组信息,因此我们需要做额外的配置,将LDAP中的用户/用户组的关系提供给HDFS。
进入HDFS页面。
·登录阿里云E-MapReduce控制台。
在顶部菜单栏处,根据实际情况选择地域和资源组。
单击上方的集群管理页签。
在集群管理页面,单击相应集群所在行的详情。
在左侧导航栏,选择集群服务 > HDFS。
配置LDAP用户组映射。
在服务配置区域,单击core-site页签。
单击自定义配置,配置如下参数。
hadoop.security.group.mapping = org.apache.hadoop.security.CompositeGroupsMapping hadoop.security.group.mapping.providers.combined = true hadoop.security.group.mapping.providers = unix4services,ldap4users hadoop.security.group.mapping.provider.unix4services = org.apache.hadoop.security.JniBasedUnixGroupsMappingWithFallback hadoop.security.group.mapping.provider.ldap4users = org.apache.hadoop.security.LdapGroupsMapping hadoop.security.group.mapping.provider.ldap4users.ldap.url = ldap://emr-header-1:10389 hadoop.security.group.mapping.provider.ldap4users.ldap.bind.user = uid=admin,o=emr hadoop.security.group.mapping.provider.ldap4users.ldap.bind.password = <填写该集群OpenLDAP配置中manager_password的值> hadoop.security.group.mapping.provider.ldap4users.ldap.base = o=emr hadoop.security.group.mapping.provider.ldap4users.ldap.search.filter.user = (&(objectClass=person)(uid={0})) hadoop.security.group.mapping.provider.ldap4users.ldap.search.filter.group = (objectClass=groupOfNames)
单击保存,在确认修改对话框中,点选自动更新配置,填写执行原因,最后单击确认。
单击上方的查看操作历史直至Configure操作状态显示成功。
重启Namenode。
在HDFS服务页面,选择右上角的操作 > 重启namenode。
在执行集群操作对话中,输入执行原因,单击确定。
在确认对话中,单击确定。
步骤验证。
登录到EMR集群对应的任意ECS中使用如下命令测试,如果能正确返回用户组信息,即为配置成功。
#hdfs groups <idapuser> [root@emr-header-1 ~]# hdfs groups dingyi dingyi : manager_group [root@emr-header-1 ~]# hdfs groups zhouba zhouba : guest_group
步骤五:Hue配置连接开启LDAP认证引擎
需要生成一个Hue的代理用户,让Hue可以通过HiveServer2的LDAP认证。
通过LDAP脚本创建Hue代理用户。
通过ssh或者“ECS控制台”远程登录EMR集群对应的ECS机器。
请参考附件一“添加用户”脚本,在任意一台ECS机器中执行。
#请将<admin_passwd>替换成LDAP中admin的密码 #请将<user_password>替换成每个用户的密码 sh adduser.sh <admin_password> hue <user_password>
配置Hue代理用户。
在服务配置区域,单击hue页签。
单击自定义配置,配置如下参数。
#请将<user_password>替换成每个用户的密码 beeswax.auth_username = hue beeswax.auth_password = <user_password>
重启Hue。
在Hue服务页面,选择右上角的操作 > 重启Hue。
在执行集群操作对话中,输入执行原因,单击确定。
在确认对话中,单击确定。
步骤验证。
通过“访问链接与端口”跳转到Hue UI。
创建/登录账号。
执行任意sql,如果不成功,请看常见问题中的“Hue执行sql异常”。
更多信息请参考(官网链接)。
步骤六:Hue开启LDAP认证
Hue默认有自己的一套用户体系(存储在Hue绑定的MySQL中)。
假设通过admin账号登录到Hue UI,在页面提交sql,那么下发到引擎层面,也是使用admin账号,也就是说,如果在Hue中创建了一个不存在于LDAP中的用户,会因为Ranger上看不到这个用户,而无法给这个用户配置权限,除非在Hue中创建与LDAP同名的用户。
因此在这种场景下,Hue开启LDAP认证,可以更好的将用户体系统一,用户登录Hue界面的时候,只需要提供LDAP中账密信息即可。
进入Hue页面。
在顶部菜单栏处,根据实际情况选择地域和资源组。
单击上方的集群管理页签。
在集群管理页面,单击相应集群所在行的详情。
在左侧导航栏,选择集群服务 > Hue。
开启LDAP认证。
在Hue服务页面,选择右上角的操作 > 开启LDAP认证。
在执行集群操作对话中,单击确认。
单击上方的查看操作历史直至操作状态显示成功。
重启Hue。
在Hue服务页面,选择右上角的操作 > 重启Hue。
在执行集群操作对话中,输入执行原因,单击确定。
在确认对话中,单击确定。
开启LDAP后,第一次登录Hue UI的用户将成为管理员用户,并且之前创建的用户都无法登录管理LDAP认证。
步骤七:初始化测试hive库表数据
--创建bigdata1
create database bigdata1;
create table bigdata1.bigdata1_table1(id int,name string);
insert into bigdata1.bigdata1_table1 select 1,'bigdata1_table1_value1'
union all select 2,'bigdata1_table1_value2'
union all select 3,'bigdata1_table1_value3'
union all select 4,'bigdata1_table1_value4'
union all select 5,'bigdata1_table1_value5';
create table bigdata1.bigdata1_table2(id int,name string);
insert into bigdata1.bigdata1_table2 select 1,'bigdata1_table2_value1'
union all select 2,'bigdata1_table2_value2'
union all select 3,'bigdata1_table2_value3';
--创建bigdata2
create database bigdata2;
create table bigdata2.bigdata2_table1(id int,name string);
insert into bigdata2.bigdata2_table1 select 1,'bigdata2_table1_value1'
union all select 2,'bigdata2_table1_value2'
union all select 3,'bigdata2_table1_value3'
union all select 4,'bigdata2_table1_value4';
--创建ai
create database ai;
create table ai.ai_table1(id int,name string);
insert into ai.ai_table1 select 1,'ai_table1_value1'
union all select 2,'ai_table1_value2';
--创建analyst
create database analyst;
create table analyst.analyst_table1(id int,name string);
insert into analyst.analyst_table1 select 1,'analyst_table1_value1'
union all select 2,'analyst_table1_value2'
union all select 3,'analyst_table1_value3'
union all select 4,'analyst_table1_value4'
union all select 5,'analyst_table1_value5'
union all select 6,'analyst_table1_value6'
union all select 7,'analyst_table1_value7'
union all select 8,'analyst_table1_value8'
union all select 9,'analyst_table1_value9'
union all select 10,'analyst_table1_value10';
--查询测试
select * from analyst.analyst_table1;
步骤八:Hive集成Ranger
Ranger没有启用Hive插件之前,查询任何的数据都不做权限校验,用户只要通过了LDAP的认证,就可以查询任意数据,启用了Hive插件之后,所有数据都无法被访问,需要在Ranger中自行配置放行权限。
Ranger启用Hive。
在顶部菜单栏处,根据实际情况选择地域和资源组。
单击上方的集群管理页签。
在集群管理页面,单击相应集群所在行的详情。
在左侧导航栏单击集群服务 > RANGER。
单击右侧的操作下拉菜单,选择启用Hive。
执行集群操作单击右上角查看操作历史查看任务进度,等待任务完成。
说明Ranger启用Hive后,HiveServer2场景下,您需要使用Ranger进行权限配置。HiveClient场景下,您需要借助HDFS权限进行控制开启HDFS的权限请参见HDFS配置。
Ranger UI添加Hive Service。
进入Ranger UI页面,详情请参见概述。
在Ranger UI页面,添加Hive Service。当您的Ranger版本为2.1.0版本时,截图如下。
配置参数。
参数
说明
备注
Service Name
emr-hive
固定值,不可修改。
Username
固定值hadoop
用户名与密码,会影响到Test Connection按钮(就算测试连接失败,也不影响后续权限配置的生效)和添加policy时候的库/表/字段名联想功能,所以密码可以随意填写。
Password
自定义
jdbc.driverClassName
org.apache.hive.jdbc.HiveDriver
默认值,无需修改。
jdbc.url
jdbc:hive2://emr-header-1:10000/
jdbc的地址,端口号默认为10000。
Add New Configurations
Name:policy.download.auth.users
Value:hadoop
Name为固定值
如果没有开启kerberos,该值设置为hadoop。
单击Add。
重启Hive上述任务完成后,需要重启Hive才生效。
左侧导航栏单击集群服务 > Hive。
单击右上角操作下拉菜单,选择重启 All Components。
执行集群操作。
在执行集群操作对话框中,输入执行原因,单击确定。
在确认对话框,单击确定。
单击右上角查看操作历史查看任务进度,等待任务完成。
验证步骤。
Hive集成Ranger成功后,除了上述配置的hadoop用户之外,其他用户均没有任何权限访问库表。
执行查询测试:
select * from analyst.analyst_table1;
。看到如下异常,证明配置成功:
Error while compiling statement: FAILED: HiveAccessControlException Permission denied: user [dingyi] does not have [USE] privilege on [default]
。更多配置信息,请参考(官方文档)。
步骤九:配置用户/用户组权限
通过Ranger UI配置权限相对不复杂,如下介绍2个案例,更多案例请参考(官方文档),或者Ranger开源文档。
配置manager_group拥有所有权限。
单击步骤八创建出来的名为emr-hive的Hive Service。
默认自带3条policy,点击编辑按钮,将manager_group添加进去。
页面下拉,单击Save按钮,查看是否添加成功。
在Hue中通过dingyi查询数据。
配置bigdata1_group组和zhouba用户,拥有bigdata1库所有权限。
单击步骤八创建出来的名为emr-hive的Hive Service。
点击右上角Add New Policy,如下图完成配置。
页面下拉,单击Save按钮,查看是否添加成功。
在Hue中通过zhouba查询bigdata1库中的数据。
在Hue中通过zhouba查询bigdata2库中的数据。
常见问题
Ranger同步LDAP用户/用户组信息异常
由于用户同步是通过User Sync开启LDAP认证实现的,所以正常情况下,用户同步不会有问题,大多数问题可能是,ranger上完全看不到LDAP中创建的用户组,或者个别用户没有用户组信息,可以到/mnt/disk1/log/ranger/usersync/
下查看相应日志,前者可能属于配置参数有异常,后者可能属于用户组中添加的用户实际不存在,请仔细检查。
Ranger配置用户权限生效,配置用户组权限不生效
请检查步骤四,HDFS的配置是否有异常,可以查看active的namenode的日志,确认配置成功后,需要重启服务,并且通过命令验证是否生效hdfs groups <idapuser>
。
Hue执行sql异常
类似如下报错:
Bad status: 3 (Error validating the login) (code THRIFTTRANSPORT): TTransportException('Bad status: 3 (Error validating the login)',)。
请仔细检查步骤五,配置的代理用户账密信息无误,可以通过beeline验证。
beeline -u jdbc:hive2://emr-header-1:10000 -n hue -p <user_password>
。
如果认证不通过,请确认LDAP中hue账号是否被添加,或者密码是否正确,可以使用附件一“删除用户”脚本,删除hue账户,并重新添加。
附件一:LDAP脚本
LDAP的管理方法采用ldif文件的方式,下述脚本将ldif文件封装在了Shell脚本中,原理是通过admin账号对LDAP中的信息进行增删改查,因此在脚本中都需要输入admin_passwd(admin的密码,可在LDAP的配置中查看manager_password对应的值),建议可以先学习下LDAP的ldif相关内容(参考文章),后续运维能更熟悉方便。
添加用户
建议直接在控制台添加用户,会同步创建同名ldap用户和Linux用户。
若要使用命令行添加,使用如下脚本。
adduser.sh
使用方法:sh adduser.sh admin_passwd user_name user_passwd
。
if [[ $# -ne 3 ]]
then
echo "input error"
echo "usage: sh adduser.sh admin_passwd user_name user_passwd"
exit 1
fi
admin_passwd=$1
user_name=$2
user_passwd=$3
read -r -d '' VAR << EOM
dn: uid=$user_name,ou=people,o=emr
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
sn: $user_name
cn: $user_name
uid: $user_name
userPassword: $user_passwd
EOM
ldapadd -x -H ldap://emr-header-1:10389 -D uid=admin,o=emr -w $admin_passwd -f /dev/stdin <<< "$VAR"
删除用户
deluser.sh
使用方法:sh deluser.sh admin_passwd user_name
。
if [[ $# -ne 2 ]]
then
echo "input error"
echo "usage: sh deluser.sh admin_passwd user_name"
exit 1
fi
admin_passwd=$1
user_name=$2
read -r -d '' VAR << EOM
dn: uid=$user_name,ou=people,o=emr
changetype: delete
EOM
ldapmodify -x -H ldap://emr-header-1:10389 -D uid=admin,o=emr -w $admin_passwd -f /dev/stdin <<< "$VAR"
添加用户组
由于添加用户组的时候需要至少包含一个用户,所以输入参数包含一个用户名,后续再增加其他用户。
addgroup.sh
使用方法:sh addgroup.sh admin_passwd group_name user_name
。
if [[ $# -ne 3 ]]
then
echo "input error!"
echo "usage: sh addgroup.sh admin_passwd group_name user_name"
exit 1
fi
admin_passwd=$1
group_name=$2
group_user=$3
read -r -d '' VAR << EOM
dn: cn=$group_name,ou=groups,o=emr
objectclass: groupofnames
cn: $group_name
member: uid=$group_user,ou=people,o=emr
description: $group_name group
EOM
ldapadd -x -H ldap://emr-header-1:10389 -D uid=admin,o=emr -w $admin_passwd -f /dev/stdin <<< "$VAR"
删除用户组
delgroup.sh
使用方法:sh delgroup.sh admin_passwd group_name
。
if [[ $# -ne 2 ]]
then
echo "input error!"
echo "usage: sh delgroup.sh admin_passwd group_name"
exit 1
fi
admin_passwd=$1
group_name=$2
read -r -d '' VAR << EOM
dn: cn=$group_name,ou=groups,o=emr
changetype: delete
EOM
ldapmodify -x -H ldap://emr-header-1:10389 -D uid=admin,o=emr -w $admin_passwd -f /dev/stdin <<< "$VAR"
添加用户到用户组
adduser2group.sh
使用方法:sh adduser2group.sh admin_passwd group_name user_name
。
if [[ $# -ne 3 ]]
then
echo "input error!"
echo "usage: sh adduser2group.sh admin_passwd group_name user_name"
exit 1
fi
admin_passwd=$1
group_name=$2
user_name=$3
read -r -d '' VAR << EOM
dn: cn=$group_name,ou=groups,o=emr
changetype: modify
add: member
member: uid=$user_name,ou=people,o=emr
EOM
ldapmodify -x -H ldap://emr-header-1:10389 -D uid=admin,o=emr -w $admin_passwd -f /dev/stdin <<< "$VAR"
从用户组删除用户
deluseringroup.sh
使用方法:sh deluseringroup.sh admin_passwd group_name user_name
。
if [[ $# -ne 3 ]]
then
echo "input error!"
echo "usage: sh deluseringroup.sh admin_passwd group_name user_name"
exit 1
fi
admin_passwd=$1
group_name=$2
user_name=$3
read -r -d '' VAR << EOM
dn: cn=$group_name,ou=groups,o=emr
changetype: modify
delete: member
member: uid=$user_name,ou=people,o=emr
EOM
ldapmodify -x -H ldap://emr-header-1:10389 -D uid=admin,o=emr -w $admin_passwd -f /dev/stdin <<< "$VAR"
查看信息
user/group添加之后可以直接使用命令slapcat
列出所有内容,若需要查看指定内容,可以使用ldapsearch
,其使用命令类似上文脚本中的ldapadd
和ldapmodify
,例如:
查看所有groups信息:
ldapsearch -x -H ldap://emr-header-1:10389 -D uid=admin,o=emr -w <admin_passwd> -b "ou=groups,o=emr"
。查看group=itpeople信息:
ldapsearch -x -H ldap://emr-header-1:10389 -D uid=admin,o=emr -w <admin_passwd> -b "cn=itpeople,ou=groups,o=emr"
。