openssl认证流程(使用OpenLDAP集中式认证)

1 OpenLDAP入门1.1 什么是LDAP?,今天小编就来说说关于openssl认证流程?下面更多详细答案一起来看看吧!

openssl认证流程(使用OpenLDAP集中式认证)

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.confGranting 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.confExample 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-authEnable 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 BaseDNLDAP目录树的根dc=genfic,dc=com
    Mail domaine-mail地址所用域名genfic.com
    Mail host邮件服务器系统的FQDNsmtp.genfic.com
    LDAP Root DNLDAP系统管理员的DNcn=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

      分享
      投诉
      首页