openssl认证流程(使用OpenLDAP集中式认证)
1 OpenLDAP入门1.1 什么是LDAP?,今天小编就来说说关于openssl认证流程?下面更多详细答案一起来看看吧!
openssl认证流程
-
1 OpenLDAP入门
-
1.1 什么是LDAP?
-
1.2 我不理解。什么是目录?
-
1.3 信息结构是什么样?
-
1.4 所以……它可以用来做什么?
-
2 OpenLDAP服务器配置
-
2.1.1 OLC样式的LDIF更新示例
-
2.1 验证配置
-
3 配置OpenLDAP客户端工具
-
4 集中式认证客户端配置
-
4.1 客户端PAM配置SSSD方法
-
4.2 客户端PAM配置pam_ldap模块方法
-
5 迁移已有数据到LDAP
-
6 复制
-
6.1 高可靠性
-
6.2 设置复制
-
7 LDAP 服务器安全设置
-
7.1 OpenLDAP 权限
-
8 实际使用 OpenLDAP
-
8.1 维护目录
OpenLDAP入门
什么是LDAP?
LDAP代表着轻量组目录访问协议。基于X.500它包含了它的绝大部分主要功能,但是缺少X.500的更加深奥的功能。现在什么是这个X.500以及为什么会有一个LDAP?
公钥基础架构
-
共享日历
-
共享地址簿
-
存储DHCP,DNS,......
-
系统级的配置管理(跟踪多台服务器的配置)
-
集中认证 (PosixAccount)
-
...
OpenLDAP服务器配置
域名“genfic.com”是这份指南中的一个例子,您当然想改变它,但是请确保其顶级节点是官方的合法域名,如net、com、cc、be......
我们首先要emerge OpenLDAP。请确保如下USE标记被使用:berkdb, crypt, gnutls, ipv6, sasl, ssl, syslog, -minimal
root #
emerge --ask openldap
OpenLDAP有一个主要用户,它被称为“rootdn(Root Distinguished Name)”,这个用户已经在应用中被写死,不可更改。但是与Unix中的root用户不同,rootdn仍然需要被指定适当的权限。rootdn用户可能仅在配置的上下文中被使用,也可能被用于目录的定义,相应地,rootdn用户可以使用配置文件里的密码和目录树中的密码来认证他们自己。(译者注:这里不太好理解,我的个人理解是:openldap的服务器采用/etc/slapd.conf来做配置,里面有一个rootdn条目,这里面指定的dn,例如cn=Manager,dc=genfic,dc=com就是ldap里面最牛的管理员,它可以在LDAP里面干任何事儿,另外openldap运行起来之后,它会维护一个用户信息数据库,这个数据库里面是可以没有cn=Manager,dc=genfic,dc=com这个dn的,当没有这个dn时,这个叫Manager的用户就是只可以管理ldap目录及其内容,但不能用这个用户在ldap客户端上登录,也不能保存关于Manager的个人信息,如电话、地址等,因为ldap没有存储这些信息的地方。但是您也可以在数据库中自己加上这个用户的相应节点,这时这个用户就可以像其它用户一样享受在客户端登录,保存个人信息等“福利”了。)
为了验证目的的用户密码(不管是rootdn的还是其它用户的)都可以被存储为明文或者哈希过的。很多哈希算法都是可用的,但是使用太弱(比MD5更弱)的加密算法是不被推荐的。SHA当前被认为是足够安全的算法。
下面的命令创建了一个给定口令的哈希值,命令的输出结果可以被用在slapd.conf 配置文件中,或者目录中某一个用户的口令属性中。
root #
slappasswd
New password: my-password
Re-enter new password: my-password
{SSHA}EzP6I82DZRnW ou6lyiXHGxSpSOw2XO4
现在我们编辑LDAP服务器的配置文件: /etc/openldap/slapd.conf。这份 slapd.conf是从openLDAP原包里来的,下面是一个范例配置,您可以用它替换掉系统中原来的文件来开始您的工作。
FILE /etc/openldap/slapd.conf
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/inetorgperson.schema
include /etc/openldap/schema/nis.schema
include /etc/openldap/schema/misc.schema
pidfile /var/run/openldap/slapd.pid
argsfile /var/run/openldap/slapd.args
## ## ServerID used in case of replication
serverID 0
loglevel 0
## ## Certificate/SSL Section
TLSCipherSuite normal
TLSCACertificateFile /etc/openldap/ssl/ldap.crt
TLSCertificateFile /etc/openldap/ssl/ldap.pem
TLSCertificateKeyFile /etc/openldap/ssl/ldap.key
TLSVerifyClient never
## ## Access Controls
access to dn.base="" by * read
access to dn.base="cn=Subschema" by * read
access to *
by self write
by users read
by anonymous read
## ## Database definition
database hdb
suffix "dc=genfic,dc=com"
checkpoint 32 30
rootdn "cn=Manager,dc=genfic,dc=com"
## ## rootpwd generated earlier via slappasswd command
rootpw "{SSHA}EzP6I82DZRnW ou6lyiXHGxSpSOw2XO4"
directory "/var/lib/openldap-data"
index objectClass eq
## ## Synchronisation (pull from other LDAP server)
syncrepl rid=000
provider=ldap://ldap2.genfic.com
type=refreshAndPersist
retry="5 5 300 "
searchbase="dc=genfic,dc=com"
attrs="*, "
bindmethod="simple"
binddn="cn=ldapreader,dc=genfic,dc=com"
credentials="ldapsyncpass"
index entryCSN eq
index entryUUID eq
mirrormode TRUE
overlay syncprov
syncprov-checkpoint 100 10
要想深入了解配置文件的含义,我们建议您研读OpenLDAP Administrator's Guide。
验证配置
在定制化slapd.conf 配置文件之后,您可以使用下面的命令检查验证其是否配置无误:
user $
slaptest -v -d 1 -f /etc/openldap/slapd.conf
或者您也可以使用OLC风格的配置文件:
user $
slaptest -v -d 1 -F /etc/openldap/slapd.d
改变debug级别(上面的"-d 1")可以得到更多的信息。如果顺利的话,您会看到“config file testing succeeded”。 如果发生错误,slaptest
将会列出造成错误的行号(位于slapd.conf)
需要注意的是:从2.4.23版本开始,OpenLDAP从传统的扁平的配置文件(slapd.conf) 切换到OLC风格的配置文件,并且将是缺省的配置方法。使用OLC风格的配置文件的一大好处是当配置需要被更改时,这一动态的后台配置(cn=config)不需要重启服务就可以生效。老用户可以通过设置了-f和-F参数的命令slaptest
将现有配置迁移到新的OLC风格的配置。传统的OLC是以ldif格式(这样可以保证可读性)保存在/etc/openldap/slapd.d 目录中的。Gentoo用户目前还不一定需要进行这一配置文件的转换,但是未来老的方法将可能不被支持。
如果您想改变OpenLDAP服务器的配置,您必须至少要对cn=config
赋予写权限(或者管理权限 )。
下面的例子展示了如何在OLC(“cn=config”数据库)中向系统管理员赋予管理权限 ,我们需要在 slapd.conf 的末尾添加一行配置:
FILE /etc/openldap/slapd.conf
Granting root Linux account manage rights to cn=config
database config
access to *
by dn.exact="gidNumber=0 uidNumber=0,cn=peercred,cn=external,cn=auth" manage
by * none
root #
mkdir /etc/openldap/slapd.d
root #
slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d
root #
chown -R ldap /etc/openldap/slapd.d
上面的命令将会转换并翻译配置文件(slapd.conf->OLC),您可能曾经想过用准备好的ldif文件来完成OLC配置文件的升级,不过假如您对此不那么熟悉,你就可以像我们这样先编辑 slapd.conf ,然后用slaptest命令将其翻译为OLC配置文件(最终保存于 slapd.d/中),最后不要忘记检查这个目录的权限是否可以被ldap系统用户访问。
您可以从产生的文件的注释中获取更多的指导。
下面这一行配置用于使能slapd.d/(OLC)配置方法。
FILE /etc/conf.d/slapd
OPTS="-F /etc/openldap/slapd.d -h 'ldaps:// ldap:// ldapi:///var/run/openldap/slapd.sock'"
最后我们创建 /var/lib/openldap-data目录(用于保存目录的实际数据)。
root #
mkdir -p /var/lib/openldap-data
root #
chown ldap:ldap /var/lib/openldap-data
root #
chmod 700 /var/lib/openldap-data
启动slapd服务:
root #
/etc/init.d/slapd start
如果启动服务没能成功,您可以将 slapd.conf配置中loglevel的值设为4或更大,然后查看 /var/log/messages 来获取更多的信息。
OLC样式的LDIF更新示例
一些OLC风格的配置文件升级范例可以参见下文。
例如,改变OLC配置文件的存放路径:
FILE fix-configs.ldif
dn: cn=config
changetype: modify
delete: olcConfigFile
dn: cn=config
changetype: modify
replace: olcConfigDir
olcConfigDir: /etc/openldap/slapd.d
改变OpenLDAP服务的日志级别:
FILE loglevel.ldif
dn: cn=config
changetype: modify
replace: olcLogLevel
olcLogLevel: stats sync
为了确认这些改变,可以运行下面的命令:
root #
ldapmodify -Y EXTERNAL -H ldapi:/// -f loglevel.ldif
配置OpenLDAP客户端工具
编辑LDAP客户端的配置文件。这个文件会被ldapsearch和其它ldap命令行工具读取。
FILE /etc/openldap/ldap.conf
添加以下
BASE dc=genfic, dc=com
URI ldap://ldap.genfic.com:389/ ldap://ldap1.genfic.com:389/ ldap://ldap2.genfic.com:389/
TLS_REQCERT allow
TIMELIMIT 2
您可以用下面的命令测试运行中的服务器。
user $
ldapsearch -x -D "cn=Manager,dc=genfic,dc=com" -W
如果您收到错误信息,您可以用 -d 255
这个参数来增加debug级别,以便获取更详细的信息用于解决问题。
集中式认证客户端配置
有很多方法/工具可以被用来做远程认证。一些发行版也提供了它们自己的很好用的配置工具。下面列出一些,排名不分先后。把本地用户认证与集中认证同时结合在一起是可行的。这一点非常重要,因为万一LDAP服务器不可用,至少您还可以通过root用户进行本地登录。
-
SSSD (Single Sign-on Services Daemon). 它主要的功能是为远程身份认证提供一个通用的框架,提供缓存与不在线的支持。它提供PAM与NSS模块,将来还会为扩展用户信息支持D-Bus接口。它也提供了一个更好的数据库来存储本地用户和扩展用户的数据。
-
使用
pam_ldap
登录到LDAP服务器并认证。口令不会在网络上以明文的方式发送。
-
NSLCD (Name Service Look up Daemon)。与SSSD类似,但更古老。
-
NSS (Name Service Switch) 使用传统的
pam_unix
模块从网络上获取哈希口令。如果要允许用户变更他们的口令,还需要结合pam_ldap
方法一起使用。
下面我们会用最少的必要配置来演示前两个方法使之工作。
客户端PAM配置SSSD方法
操作方法很简单,只有三个文件需要被编辑,如下:
FILE /etc/sssd/sssd.conf
[sssd]config_file_version = 2services = nss, pamdomains = genficdebug_level = 5 [nss]filter_users = root,ldap,named,avahi,haldaemon,dbus,radiusd,news,nscd [domain/genfic]id_provider = ldapauth_provider = ldapldap_search_base = dc=genfic,dc=comldap_tls_reqcert = never# primary and backup ldap servers below [first server and],[second server]ldap_uri = ldap://X.X.X.X,ldap://X.X.X.X
按照如下文件所示增加“sss”到每一行的末尾,这样就可以将(对用户信息的)查询工作转交给sssd系统服务,你完成对这个文件的编辑后,就可以将sssd的后台服务启动起来了。
FILE /etc/nsswitch.conf
Example nsswitch.conf with SSSD support
passwd: files sss
shadow: files sss
group: files sss
netgroup: files sss
automount: files sss
sudoers: files sss
最后一个文件是非常关键的。请在编辑它之前先打开另外一个终端窗口以便失败时退回(译者注:我因为开始一点也不懂pam的这个配置文件的原理,也没有重视这一条要求,当时就编辑错了,导致还得用引导盘引导系统后用root用户重新编辑这个文件,直至系统恢复)。文件中在行尾标注了 #
的行即是用于使能远程认证。注意使用pam_mkhomedir.so 来支持在用户登录时创建主目录(如果是首次在某一客户端登录的话)。
FILE /etc/pam.d/system-auth
Enable pam_sss support
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth required pam_env.so
auth sufficient pam_unix.so nullok try_first_pass
auth requisite pam_succeed_if.so uid >= 500 quiet
auth sufficient pam_sss.so use_first_pass #
auth required pam_deny.so
account required pam_unix.so
account sufficient pam_localuser.so
account sufficient pam_succeed_if.so uid < 500 quiet
account [default=bad success=ok user_unknown=ignore] pam_sss.so #
account required pam_permit.so
password requisite pam_cracklib.so try_first_pass retry=3
password sufficient pam_unix.so md5 shadow nullok try_first_pass use_authtok
password sufficient pam_sss.so use_authtok #
password required pam_deny.so
session required pam_mkhomedir.so skel=/etc/skel/ umask=0077
session optional pam_keyinit.so revoke
session required pam_limits.so
session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session required pam_unix.so
session optional pam_sss.so #
好了,现在就可以试着从另外一个终端进行登录了。
客户端PAM配置pam_ldap模块方法
首先我们要配置PAM来允许LDAP认证。安装 sys-auth/pam_ldap程序包以便让PAM支持LDAP授权,然后是 sys-auth/nss_ldap以支持您的系统从LDAP服务器获取额外信息为 (nsswitch.conf)所用。
root #
emerge --ask pam_ldap nss_ldap
最后一个文件是最关键的。在编辑之前请打开几个额外的root用户登录终端作好准备。行尾标有 #
的表示使能远程认证。
FILE /etc/pam.d/system-auth
#%PAM-1.0
auth required pam_env.so
auth sufficient pam_unix.so try_first_pass likeauth nullok
auth sufficient pam_ldap.so use_first_pass #
auth required pam_deny.so
account sufficient pam_ldap.so #
account required pam_unix.so
password required pam_cracklib.so difok=2 minlen=8 dcredit=2 ocredit=2 try_first_pass retry=3
password sufficient pam_unix.so try_first_pass use_authtok nullok md5 shadow
password sufficient pam_ldap.so use_authtok use_first_pass #
password required pam_deny.so
session required pam_limits.so
session required pam_unix.so
session optional pam_ldap.so #
改变 /etc/ldap.conf为只读权限。
FILE /etc/ldap.conf
## #host 127.0.0.1
## #base dc=padl,dc=com
base dc=genfic,dc=com
## #rootbinddn uid=root,ou=People,dc=genfic,dc=com
bind_policy soft
bind_timelimit 2
ldap_version 3
nss_base_group ou=Group,dc=genfic,dc=com
nss_base_hosts ou=Hosts,dc=genfic,dc=com
nss_base_passwd ou=People,dc=genfic,dc=com
nss_base_shadow ou=People,dc=genfic,dc=com
pam_filter objectclass=posixAccount
pam_login_attribute uid
pam_member_attribute memberuid
pam_password exop
scope one
timelimit 2
uri ldap://ldap.genfic.com/ ldap://ldap1.genfic.com ldap://ldap2.genfic.com
下一步,把(OpenLDAP) ldap.conf 文件从服务器拷贝到客户端,这样客户端就可以理解LDAP环境了。
root #
scp ldap-server:/etc/openldap/ldap.conf /etc/openldap
最后,在客户端进行配置以便它会为系统帐号查询LDAP。
FILE /etc/nsswitch.conf
passwd: files ldap
group: files ldap
shadow: files ldap
如果您注意到在/etc/ldap.conf 有一行被注释掉了 (rootbinddn
),这意味着您在这个客户端上不需要以超级用户(LDAP的超级用户)身份变更其它用户的密码。如果您真的想这么做,您还需要在/etc/ldap.secret中以明文方式把超级用户的密码写入其中。这是很危险的做法,所以您还应该把这个文件的权限设为600。比较好的做法是,平时将/etc/ldap.secret文件留空,当您需要变更某个用户(LDAP或 /etc/passwd)的密码时,把超级用户的密码填在那里,完成任务后,再把密码清空。
迁移已有数据到LDAP
为集中认证和管理Linux/Unix信息配置OpenLDAP不是个轻松的活儿,但是拜互联网上的工具们和脚本们所赐,从分立的系统管理到基于OpenLDAP的集中系统管理的迁移工作也不是那么难。
在http://www.padl.com/OSS/MigrationTools.html可以得到这些脚本。您可能需要迁移工具和make_master.sh 脚本。
下一步,解开工具并且拷贝 make_master.sh 脚本。
root #
mktemp -d
/tmp/tmp.zchomocO3Q
root #
cd /tmp/tmp.zchomocO3Q
root #
tar xvzf /path/to/MigrationTools.tgz
root #
mv /path/to/make_master.sh MigrationTools-47
root #
cd MigrationTools-47</pre>
下一步就要把这些信息迁移到您系统中的OpenLDAP中了。make_master.sh 脚本会为您实现这个目标,不过您要为其提供LDAP架构和环境的相关信息。
截止到我们写文档的时候,这个工具需要下面的输入信息:
输入 | 描述 | 范例 |
---|---|---|
LDAP BaseDN | LDAP目录树的根 | dc=genfic,dc=com |
Mail domain | e-mail地址所用域名 | genfic.com |
Mail host | 邮件服务器系统的FQDN | smtp.genfic.com |
LDAP Root DN | LDAP系统管理员的DN | cn=Manager,dc=genfic,dc=com |
LDAP Root Password | 系统管理员的帐号密码 | slappasswd command |
这个工具也会问您想要迁移哪些帐号和设置。
Warning
您不需要改变pam.d/system-auth
复制
高可靠性
设置在多个LDAP服务器之间同步信息。在这份指导中,复制功能会使用一个特别的复制帐号 ( ldapreader
) ,它具有对主LDAP服务器上的读权限 ,然后它会把改变的信息从主LDAP服务器上拉到其它服务器上。
备用LDAP服务器可以反过来充当主服务器,为了达成此目的,配置也要相应的镜像过来。感谢OpenLDAP的内部架构,此时已经被复制过的变更的信息不会再被重新复制回来。
设置复制
为了设置复制,首先要设置备用OpenLDAP服务器,它的大部分配置跟前面的配置相同,但是要注意的区别是:
-
sync replication provider 要指向另外一台机器。
-
每一台OpenLDAP服务器的serverID 是不同的。
下一步,创建同步帐号。我们创建一个LDIF文件(格式同LDAP服务器做信息导入所需格式),然后将其导入每一台LDAP服务器。
user $
slappasswd -s myreaderpassword
{SSHA}XvbdAv6rdskp9HgFaFL9YhGkJH3HSkiM
user $
cat ldapreader.ldif
dn: cn=ldapreader,dc=genfic,dc=com
userPassword: {SSHA}XvbdAv6rdskp9HgFaFL9YhGkJH3HSkiM
objectClass: organizationalRole
objectClass: simpleSecurityObject
cn: ldapreader
description: LDAP reader used for synchronization
user $
ldapadd -x -W -D "cn=Manager,dc=genfic,dc=com" -f ldapreader.ldif
Password: ## enter the administrative password
LDAP 服务器安全设置
OpenLDAP 权限
如果查看 /etc/openldap/slapd.conf ,您会发现您可以自定义ACLs(您希望的权限) 来控制什么用户可以读/写什么数据:
FILE /etc/openldap/slapd.conf
access to attrs=userPassword,gecos,description,loginShell
by self write
access to *
by dn="uid=root,ou=People,dc=genfic,dc=com" write
by users read
by anonymous auth
这个规定了一个用户能够改变的数据。如果数据归您所有,您就有读和写的权利,如果数据是别人的,您就只能读取它(不能改变它),匿名用户可以发送login/pass来登录系统。这些权限有四个等级,按从低到高的顺序排列: auth search read write
。
下一条ACL则更安全一些,因为它阻止了普通用户读取它人的登录密码。
FILE /etc/openldap/slapd.conf
access to attrs="userPassword"
by dn="uid=root,ou=People,dc=genfic,dc=com" write
by dn="uid=John,ou=People,dc=genfic,dc=com" write
by anonymous auth
by self write
by * none
access to *
by dn="uid=root,ou=People,dc=genfic,dc=com" write
by dn="uid=John,ou=People,dc=genfic,dc=com" write
by * search
这个例子给了root用户和john用户在目录树中对 dc=genfic,dc=com以下任何信息的read/write/search权限。配置也允许用户改变他们自己的密码userPassword
。最后一条声明其他任何人只具有搜索能力,这意味着他能使用搜索过滤器,但不能读到搜索结果。您是可以设置多个ACL的,但是遍历规则是从下面开始处理,所以您的顶层设置应该是最严格的一条。
实际使用 OpenLDAP
维护目录
您可以在apache/proftpd/qmail/samba中开始用目录来认证用户了。您可以用LAM (Ldap Account Manager),phpldapadmin,diradm,jxplorer或者lat来管理您的目录,它们都提供了方便的接口来实施管理。
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com