FreeBSD使用大全II- 11.5 应用PAM

11.5 应用PAM

当介绍了LDAP和Radius之后,需要考虑的就是如何将系统与它们集成。最简单的例子就是如何使用LDAP或Radius来认证用户。前面提到一个例子radlogin,可以用来代替标准的login程序来认证用户,但是这种方法很不标准,更为优秀的方法被称为PAM(Pluggable Authentication Modules,可加载认证模块)。

11.5.1 PAM简介

正是因为在实际应用中,人们需要各种不同方式的用户认证机制,例如NIS、LDAP、Radius等等,如果每种认证机制都需要使用独立的login程序,系统就非常混乱,而且也不能混合支持多种认证方式。因此,人们更希望提出一种认证系统的框架,在这个框架之下,可以编写特定的模块来支持各种不同的认证方法。

PAM甚至比上述的方法更为前进一步,它支持这些认证模块的动态加载,就是说这些模块可以在任意时候添加到系统中,执行认证。
3.1-release之后的FreeBSD版本支持可加载的认证方式模块PAM,这种机制能使得系统能非常灵活的支持多种认证方式,具备非常大的可扩展性。PAM的设置文件为/etc/pam.conf,这里定义了各种条件下使用的认证方式。

这里是一个简单pam.conf的例子:

login auth  sufficient pam_skey.so

login auth  requisite  pam_cleartext_pass_ok.so

login auth  required  pam_unix.so   try_first_pass

su  auth  required  pam_unix.so   try_first_pass

这个配置文件的格式相当简单.
第一列定义执行认证的服务类型,事实上这很简单,就是执行认证程序的名字,例如登录过程执行认证的/usr/bin/login是login,而su、ppp等使用相应的认证名字。而一个服务类型可以有多行配置,这就表示对一种服务可以执行多种认证模块,例如第一种认证失败,还可以使用第二种方式认证,直到某一次认证终止。

第二列是PAM的任务类型,auth执行认证任务,是最为常用的PAM操作。除此之外,还可以使用account管理帐户,例如用户口令的过期设置、服务类型限制等等,session任务可以用来在登录和退出时执行额外的操作,提供系统审计功能,password任务用来提供口令更新功能等。

第三列是认证处理的方式,这是因为一种服务可以支持多个认证模块,这些认证模块顺序进行。由于每个认证模块都会返回成功或失败,那么何时终止整个认证过程,就非常重要。是一种认证通过就表示用户认证成功了呢?还是全部认证通过才表示用户认证成功了呢?这就需要使用额外的参数,设置每个模块对认证结果的处理方式。

通常,sufficient表示充分条件,该种认证通过之后,就表示全部认证通过,如果没有通过,则继续进行下面的认证。使用requisite为必要条件,表示这次认证失败之后,就不再进行该次认证,直接返回认证失败。而required与requisite类似,但认证失败之后,继续进行后面的认证,这样用户就不清楚是哪个模块认证失败,提供更好的安全性。

第四列为认证模块的名字,缺省情况下这些模块位于/usr/lib目录下。

这里定义了三个认证过程,按照顺序系统将首先使用pam_skey.so,然后pam_cleartext_pass_ok.so,最后是标准unix认证pam_unix.so。第一个是用于使用S/key系统认证,第二个不是一个认证,而是用于限制用户访问的,它检查/etc/skey.access,以禁止非许可的节点、用户登录,因此其第三个参数为requisite,而非pam_skey.so对应的sufficient,如果第二个设置许可,才能进入第三项定义的标准Unix认证方式。

注意,如果存在/etc/pam.d目录,PAM将在这个目录中寻找设置信息,而忽略pam.conf,pam.d目录中将认证配置按照服务分开,例如login服务就单独为一个独立的名字为login的文件,因而该文件中也不需要第一列标识服务类型。

这些认证系统的动态连接库均位于系统中的/usr/lib/目录下,如果需要,可以增加其他认证方式。

# ls -l /usr/lib/*pam*

-r–r–r–  1 root  wheel  59938 Feb 15 18:41 /usr/lib/libpam.a

lrwxrwxrwx  1 root  wheel     11 Apr 14 16:24 /usr/lib/libpam.so -> libpam.so.1

-r–r–r–  1 root  wheel  33451 Feb 15 18:41 /usr/lib/libpam.so.1

-r–r–r–  1 root  wheel   2895 Feb 15 18:41 /usr/lib/pam_cleartext_pass_ok.so

-r–r–r–  1 root  wheel   6587 Feb 15 18:41 /usr/lib/pam_radius.so

-r–r–r–  1 root  wheel   3798 Feb 15 18:41 /usr/lib/pam_skey.so

-r–r–r–  1 root  wheel   6497 Feb 15 18:41 /usr/lib/pam_tacplus.so

-r–r–r–  1 root  wheel   3333 Feb 15 18:41 /usr/lib/pam_unix.so

其中每个以pam_开头的库均对应一种认证方式,可以看出系统中能提供多种认证方式,如RADUIS、TACPLUS等方式。使用libpam能帮助用户开发其他PAM认证程序。除了这些标准的模块之外,还有一些额外的认证模块,如pam_ldap、pam_mysql、pam_smb等提供其他方式的认证。

PAM是一种新的、更为灵活的认证机制,以前的FreeBSD版本并不支持这种方式。PAM虽然更为灵活,但对于一般目的,缺省的支持s/key和标准认证方式的设置就能满足需要了,一般不必改动配置文件。然而有些时候,譬如ISP,通常使用RADUIS服务器来保存用户的认证数据,此时使用RADUIS进行认证就能带来非常大的益处。因为PAM涉及系统认证,因而对安全性非常重要,不能轻易加入一个非信任的认证模块,因为除了模块本身的问题之外,认证模块中很容易加入后门。建议经常检查/etc/pam.conf,/etc/pam.d/目录,以及/usr/lib/*pam*文件是否被非法改动,以保证系统安全。

11.5.2 支持Radius与LDAP

由于使用了PAM,支持Radius和LDAP就相当容易了。但是,除了在pam.conf文件中指定该支持认证模块之外,还需要额外的配置文件,来指定一些额外的信息,例如认证服务器的地址,认证口令等等。

1) 支持Radius

从上面的认证模块列表可以看出,pam_radius.so是标准系统的一部分,这就是说,不需要安装额外的软件,FreeBSD系统就可以支持Radius统一认证。

因此,一个支持Radius认证的pam.conf例子为:

login auth  sufficient pam_radius.so

login auth  required  pam_unix.so   try_first_pass

此外,还需要为pam_radius模块指定Radius服务器的地址和连接密码,那么这需要使用/etc/radius.conf配置文件。

# cat /etc/radius.conf

auth  localhost testing123

acct  localhost testing123

显然,radius.conf中只需要指定auth行就可以了,不需要acct表示的记账服务器。但是这个配置文件不但pam_radius使用,其他使用Radius认证和记账的程序,例如ppp,也使用这个文件。

2) 支持LDAP

从认证模块列表可以看出,系统中并不存在pam_ldap或类似的模块,这就表示系统PAM缺省并没有提供LDAP认证模块。但是,存在第三方软件pam_ldap,提供PAM模块。

需要注意的是,如果通过Ports Collection安装pam_ldap,由于它依赖于OpenLDAP 1.2.x,会自动安装相关的软件包。这在系统中已经安装了OpenLDAP 2.0.x的情况时,就会导致覆盖原有的OpenLDAP系统,导致系统故障。

为了使用pam_ldap,首先需要设置pam.conf,包括以下内容:

login  auth   sufficient  /usr/local/lib/pam_ldap.so

还需要配置文件/usr/local/etc/ldap.conf,来配置LDAP认证模块的有关参数。可以参考系统缺省安装的ldap.conf.dist来配置系统。这里是一个简单的例子:

host 127.0.0.1

port 389

base dc=my-domain,dc=com

scope sub

pam_login_attribute uid

在这里,使用host和port来配置LDAP服务器及其相应端口,也可以使用标准的LDAP URL来做到这个目的。

缺省的pam-ldap使用LDAP v2来连接LDAP服务器,OpenLDAP 1.2.x使用这个协议。对于OpenLDAP 2.x,需要要求使用LDAP v3连接LDAP服务器,那么就需要在ldap.conf中添加配置ldap_version配置。

ldap_version 3

pam-ldap需要搜索目录树,查找用户数据,因此LDAP服务器就需要支持匿名目录树搜寻,如果不支持匿名目录树搜索,那么pam-ldap就需要首先通过一个目录成员的认证,绑定到目录树上进行搜索,这就意味着需要配置binddn和bindpw。

binddn cn=search,dc=my-domain,dc=com

bindpw secret

因此,这时就需要对ldap.conf提供保护,例如设置它的模式为600,以防止该目录成员口令泄露。这种方法也存在很大问题,例如对于login,因为它是一个root权限的进程,那么就可以正常访问ldap.conf,但是如果是一个普通用户进程启动的PAM,那么就无法访问ldap.conf,导致无法进行正常的认证,因此,这就决定了ldap.conf不能设置为600。

当ldap.conf不能设置为600,那么就不能将安全相关的LDAP密码放在这个文件中,例如一个具备写权限DN的绑定密码。但是,在一些情况下,需要具备写权限,因为PAM需要更新密码或其他属性。这就造成了一些矛盾。

最简单的考虑,是设置两个绑定的dn,一个只具备搜索权限,用于普通用户使用PAM,另一个具备写权限,用于root用户启动的进程使用PAM。对于具备写权限的DN,在ldap.conf要可读的条件下,就只能将密码放置到ldap.conf之外。

这个特殊的写权限LDAP成员,可以通过设置rootbinddn来做到。

rootbinddn cn=manager,dc=my-domain,dc=com

此时,可以在/etc/ldap.secret中保存密码。

在目录树中进行搜索有几种不同方式,一种方法是从树的一个枝干开始,搜索整个子树,称为subtree(sub)方法,另一个方法为搜索这个枝干的直接连接的叶,称为onelevel(one)方法,最后还有一种方法只搜索该枝干本身,成为base方法。通常使用sub或one方法搜索用户,因此还需要同时定义搜索的开始点,就是设置base参数。

为了让pam-ldap正确搜索用户,必须选择用户名与LDAP中的哪个属性相对应,这就是pam_login_attribute所定义的,通常使用的属性为uid。

以上的配置就适用于最简单的auth类型的PAM操作。

用户数据的集中配置

PAM的作用是认证,因此,使用Radius或LDAP认证的前提是系统中的/etc/passwd数据库中包含这个用户的有关信息,如果这个用户仅仅在Radius或LDAP数据库中有定义,还是无法通过认证的,因为该用户并不存在。

这就和NIS不同,NIS可以允许用户数据完全不在本地,因此意义更大一些。但是要求用户数据不在本地,就需要对系统更多的改动,简单的讲,至少改动范围将包括所有NIS对系统的改动,因此,要比PAM复杂的多。

有一种方法是使用一种网关,将NIS映射为LDAP操作,那么所有支持NIS的系统最后能访问LDAP数据库中的用户数据,这种方法为ypldapd所使用的,另一种方法是试图如NIS一样直接提供必要的接口,这种方法为nss_ldap,这两种方法的开发商就是pam_ldap开发商,但它们都是商业软件。目前都还没有被很好的移植到FreeBSD系统中。

使用目录服务来保存包括系统用户在内的一些数据,是目前操作系统发展的一个方向,特别是着眼于复杂的企业网络服务的系统。

pam模块简介请参考:http://blog.haohtml.com/index.php/archives/7386

27 thoughts on “FreeBSD使用大全II- 11.5 应用PAM

  1. Pingback: www.rajaqqtop.com

  2. Pingback: เช่าชุดแต่งงาน

  3. Pingback: useful reference

  4. Pingback: 바카라사이트

  5. Pingback: https://www.pasjonisci.pl/

  6. Pingback: https://dlugi-faktury.pl/

  7. Pingback: replica cartier swiss copies

  8. Pingback: replicas Breitling Watches Paypal

  9. Pingback: dominoqq

  10. Pingback: kiu

  11. Pingback: 안전바카라

  12. Pingback: auto generated contents

  13. Pingback: Mint Juul

  14. Pingback: naltrexone for sale

  15. Pingback: Study in Uganda

  16. Pingback: tylenol stock price

  17. Pingback: รับทำการตลาด

  18. Pingback: santa-clara-ductless.info

  19. Pingback: tutor me

  20. Pingback: Guns for Sale

  21. Pingback: fun88.viet

  22. Pingback: lo de online

  23. Pingback: fan88

  24. Pingback: Cheap sweets

  25. Pingback: Pick and mix online

  26. Pingback: kinemaster video editing smooth transitions

  27. Pingback: bitcoin loophole

Leave a Reply