环境(两台虚拟机):
rstudio--192.168.1.88--centos7.6
ldap--192.168.1.89--centos7.6
关闭防火墙、selinux,配置hosts、yum源
一、安装Rstudio Server
登录rstudio服务器终端,先安装R(需要epel源)
# yum install R
下载安装包并安装
# wget https://download2.rstudio.org/server/centos7/x86_64/rstudio-server-rhel-1.4.1717-x86_64.rpm
# yum localinstall rstudio-server-rhel-1.4.1717-x86_64.rpm
修改配置文件
# vim /etc/rstudio/rserver.conf
rsession-which-r=/usr/bin/R
启动服务并登录浏览器测试
# systemctl start rstudio-server
URL: 192.168.1.88:8787
二、安装openLDAP
1.安装
登录ldap服务器,安装openldap
# yum install openldap openldap-servers openldap-clients
在启动服务前,复制默认配置文件,否则生成密码时会报错
# cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
# chown -R ldap. /var/lib/ldap/DB_CONFIG
启动服务并设置开机自启动
# systemctl enable slapd --now
2.配置密码
从openldap2.4.23版本开始,所有配置都保存在/etc/openldap/slapd.d目录下的cn=config文件夹内,配置文件的后缀为 ldif。
每个配置文件都是通过命令自动生成的,任意打开一个配置文件,在开头都会有一行注释,说明此为自动生成的文件,请勿编辑,使用ldapmodify命令进行修改。
生成管理员密码(注意后面脚本中都是用的这个密码)
# slappasswd -s 123456
{SSHA}vrndYB4LUei9Kj190fdNIHmE4fDwCOo4
编辑配置密码文件
# vim changepwd.ldif
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}vrndYB4LUei9Kj190fdNIHmE4fDwCOo4
注:第一行指要编辑的配置文件,这里就是/etc/openldap/slapd.d/cn=config/olcDatabase={0}config.ldif,第二行指编辑类型为修改,第三行是具体动作即添加一个olcRootPW属性,第四行是添加的值。
# ldapadd -Y EXTERNAL -H ldapi:/// -f changepwd.ldif
此时在olcDatabase={0}config.ldif文件中多处一行:olcRootPW:: e1NTSEF9dnJuZFlCNExVZWk5S2oxOTBmZE5JSG1FNGZEd0NPbzQ=
3.配置schema
schema主要用于控制目录树中各种条目所拥有的对象类以及各种属性的定义,参考:schema介绍
# for i in `ls /etc/openldap/schema/*.ldif`;do ldapadd -Y EXTERNAL -H ldapi:/// -f $i;done
4.配置域名
此处配置的域名为pm.com,管理员账号为admin
# vim changedomain.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=admin,dc=pm,dc=com" read by * none
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=pm,dc=com
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=admin,dc=pm,dc=com
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootPW
olcRootPW: {SSHA}vrndYB4LUei9Kj190fdNIHmE4fDwCOo4
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange by dn="cn=admin,dc=pm,dc=com" write by anonymous auth by self write by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by dn="cn=admin,dc=pm,dc=com" write by * read
# ldapmodify -Y EXTERNAL -H ldapi:/// -f changedomain.ldif
5.配置memberof功能
# vim add-memberof.ldif
dn: cn=module{0},cn=config
cn: modulle{0}
objectClass: olcModuleList
objectclass: top
olcModuleload: memberof.la
olcModulePath: /usr/lib64/openldap
dn: olcOverlay={0}memberof,olcDatabase={2}hdb,cn=config
objectClass: olcConfig
objectClass: olcMemberOf
objectClass: olcOverlayConfig
objectClass: top
olcOverlay: memberof
olcMemberOfDangling: ignore
olcMemberOfRefInt: TRUE
olcMemberOfGroupOC: groupOfUniqueNames
olcMemberOfMemberAD: uniqueMember
olcMemberOfMemberOfAD: memberOf
# vim refint1.ldif
dn: cn=module{0},cn=config
add: olcmoduleload
olcmoduleload: refint
# vim refint2.ldif
dn: olcOverlay=refint,olcDatabase={2}hdb,cn=config
objectClass: olcConfig
objectClass: olcOverlayConfig
objectClass: olcRefintConfig
objectClass: top
olcOverlay: refint
olcRefintAttribute: memberof uniqueMember manager owner
按顺序执行
# ldapadd -Q -Y EXTERNAL -H ldapi:/// -f add-memberof.ldif
# ldapmodify -Q -Y EXTERNAL -H ldapi:/// -f refint1.ldif
# ldapadd -Q -Y EXTERNAL -H ldapi:/// -f refint2.ldif
6.创建组织单元
创建一个叫做 PM Company 的组织,并在其下创建一个 admin 的组织角色(该组织角色内的用户具有管理整个 LDAP 的权限)和 People 和 Group 两个组织单元
# vim base.ldif
dn: dc=pm,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
o: PM Company
dc: pm
dn: cn=admin,dc=pm,dc=com
objectClass: organizationalRole
cn: admin
dn: ou=People,dc=pm,dc=com
objectClass: organizationalUnit
ou: People
dn: ou=Group,dc=pm,dc=com
objectClass: organizationalRole
cn: Group
# ldapadd -x -D cn=admin,dc=pm,dc=com -W -f base.ldif
7.查看
# ldapsearch -x -LLL -H ldap:/// -b dc=pm,dc=com
dn(distinguished name):
可直译为专有名称,可以理解为一个路径,有三个属性分别是dc,ou,cn
dc(Domain Component):
可直译为域组件,例如一个DNS中被点分隔成的各个部分,pm.com ---> dc=pm,dc=com
ou(Organizational Unit):
可直译为组织单元,我们可以有多个组织单元。你可以在组织单元中组织用户组,也可以在组织单元中组织用户,你还可以在组织单元中组织组织单元。
cn(Common Name):
可直译为通用名,可理解为一个具体的实例,一般是用户名
一般按照CN - OU - DC的顺序,从具体的实例到最高级的域名,组成一个dn。
查找是逆序的,比如 cn=test,ou=People,dc=pm,dc=com可理解为文件系统的查找路径:/com/pm/People/test
8,安装openldap客户端
登录rstudio服务器,安装并配置openldap客户端
# yum install nss-pam-ldapd openldap-clients openldap -y
# authconfig --enableldap --enableldapauth --ldapserver="192.168.1.89" --ldapbasedn="dc=pm,dc=com" --update
# systemctl restart nslcd
# systemctl restart sshd
9,创建用户
# vim user.ldif
dn: uid=test,ou=People,dc=pm,dc=com
cn: test
sn: linux
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uidNumber: 1002
gidNumber: 1002
loginShell: /bin/bash
homeDirectory: /home/test
userPassword: {SSHA}vrndYB4LUei9Kj190fdNIHmE4fDwCOo4
dn: cn=test,ou=Group,dc=pm,dc=com
objectClass: posixGroup
cn: test
gidNumber: 1002
memberUid: test
# ldapadd -x -w 123456 -D 'cn=admin,dc=pm,dc=com' -f user.ldif
此时登录到客户端可查看到此用户。
优化脚本思路:可通过命令ldapsearch -x -w 123456 -D 'cn=admin,dc=pm,dc=com' -b 'ou=People,dc=pm,dc=com'查看所有用户的信息,可将最大的uid筛选出来,在新建用户时+1即可。
10.删除用户
三、解决rstudio server和ldap无法通用
此时打开rstudio server无法使用通过ldap创建的用户登录
修改pam配置文件
# cd /etc/pam.d
# mv rstudio rstudio.old
# cp login rstudio
# vim rstudio
在文末添加如下三行:
auth sufficient pam_ldap.so
account required pam_ldap.so
session requisite pam_ldap.so
重启服务:
# systemctl restart rstudio-server
登录测试:
原因:ldap不会自动创建家目录,先手动为用户创建一个家目录,即可正常登录。
四、设置自动创建家目录
在ldap服务端执行:
# yum install openssh-ldap -y
# cp /usr/share/doc/openssh-ldap-7.4p1/openssh-lpk-openldap* /etc/openldap/schema/
# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/openssh-lpk-openldap.ldif
在ldap客户端执行:
# yum install -y oddjob-mkhomedir oddjob openssh-ldap
# systemctl start oddjobd.service
# systemctl start messagebus
# authconfig --enablemkhomedir --update
确保在/etc/pam.d/password-auth和system-auth中有如下一行:
session optional pam_oddjob_mkhomedir.so umask=0077
重启服务:
# systemctl restart nslcd
# systemctl restart sshd