在Linux中执行有些程序时,这些程序在执行前首先要对启动它的用户进行认证,符合必定的要求以后才容许执行,例如login, su等。在Linux中进行身份或是状态的验证程序是由PAM来进行的,PAM(Pluggable Authentication Modules)可动态加载验证模块,由于能够按须要动态的对验证的内容进行变动,因此能够大大提升验证的灵活性。html
1、PAM模块介绍linux
Linux-PAM(即linux可插入认证模块)是一套共享库,使本地系统管理员能够随意选择程序的认证方式。换句话说,不用(从新编写)从新编译一个包含PAM功能的应用程序,就能够改变它使用的认证机制,这种方式下,就算升级本地认证机制,也不用修改程序。
PAM使用配置/etc/pam.d/下的文件,来管理对程序的认证方式.应用程序 调用相应的配置文件,从而调用本地的认证模块.模块放置在/lib/security下,以加载动态库的形式进,像咱们使用su命令时,系统会提示你输入root用户的密码.这就是su命令经过调用PAM模块实现的。shell
2、PAM的配置文件说明数据库
PAM配置文件有下面两种写法:
1)写在/etc/pam.conf文件中,但centos6以后的系统中,这个文件就没有了。
2)将PAM配置文件放到/etc/pam.d/目录下,其规则内容都是不包含 service 部分的,即不包含服务名称,而/etc/pam.d 目录下文件的名字就是服务名称。如: vsftpd,login等,只是少了最左边的服务名列。如:/etc/pam.d/sshdvim
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
[root@centos6-test06 ~]
# cat /etc/pam.d/sshd
#%PAM-1.0
auth required pam_sepermit.so
auth include password-auth
account required pam_nologin.so
account include password-auth
password include password-auth
# pam_selinux.so close should be the first session rule
session required pam_selinux.so close
session required pam_loginuid.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session required pam_selinux.so
open
env_params
session required pam_namespace.so
session optional pam_keyinit.so force revoke
session include password-auth
|
由上面的pam模块文件内容看,能够将pam配置文件分为四列,centos
1)第一列:PAM的模块类型
Linux-PAM有四种模块类型,分别表明四种不一样的任务,它们是:
认证管理(auth),帐号管理(account),会话管理(session)和密码(password)管理,一个类型可能有多行,它们按顺序依次由PAM模块调用。api
对以上四种模块类型进一步补充说明:
auth:表示鉴别类接口模块类型用于检查用户和密码,并分配权限;
这种类型的模块为用户验证提供两方面服务。让应用程序提示用户输入密码或者其余标记,确认用户合法性;经过他的凭证许可权限,设定组成员关系或者其余优先权。安全
account:表示帐户类接口,主要负责帐户合法性检查,确认账号是否过时,是否有权限登陆系统等;
这种模块执行的是基于非验证的账号管理。他主要用于限制/容许用户对某个服务的访问时间,当前有效的系统资源(最多能够多少用户),限制用户位置(例如:root只能经过控制台登陆)。服务器
多数状况下auth和account会一块儿用来对用户登陆和使用服务的状况进行限制。这样的限制会更加完整。好比下面是一个具体的例子:login是一个应用程序。Login要完成两件工做——首先查询用户,而后为用户提供所需的服务,例如提供一个shell程序。一般Login要求用户输入名称和密码进行验证。当用户名输入的时候,系统天然会去比对该用户是不是一个合法用户,是否在存在于本地或者远程的用户数据库中。若是该帐号确实存在,那么是否过时。这些个工做是由account接口来负责。网络
若是用户知足上述登陆的前提条件,那么它是否具备可登陆系统的口令,口令是否过时等。这个工做就要由auth接口来负责了,他一般会将用户口令信息加密并提供给本地(/etc/shadow)或者远程的(ldap,kerberos等)口令验证方式进行验证。
若是用户可以登陆成功,证实auth和account的工做已经完成。但整个验证过程并无彻底结束。由于还有一些其余的问题没有获得确认。例如,用户可以在服务器上同时开启多少个窗口登陆,用户能够在登陆以后使用多少终端多长时间,用户可以访问哪些资源和不能访问哪些资源等等。也就是说登陆以后的后续验证和环境定义等还须要其余的接口。这就是咱们下面要提到的两组接口:
session:会话类接口。实现从用户登陆成功到退出的会话控制;
处理为用户提供服务以前/后须要作的些事情。包括:开启/关闭交换数据的信息,监视目录等,设置用户会话环境等。也就是说这是在系统正式进行服务提供以前的最后一道关口。
password:口令类接口。控制用户更改密码的全过程。也就是有些资料所说的升级用户验证标记。
注意:上述接口在使用的时候,每行只能指定一种接口类型,若是程序须要多种接口的话,可在多行中分别予以规定。
2)第二列:PAM的控制标记
PAM使用控制标记来处理和判断各个模块的返回值.(在此只说明简单的认证标记)。
规定如何处理PAM模块鉴别认证的结果,简而言之就是鉴别认证成功或者失败以后会发生什么事,如何进行控制。单个应用程序能够调用多种底层模块,一般称为“堆叠”。对应于某程序按照配置文件中出现顺序执行的全部模块成为“堆”,堆中的各模块的地位与出错时的处理方式由control_flag栏的取值决定,他的四种可能的取值分别为required、Requisite、sufficient或_optional:
required:表示该行以及所涉及模块的成功是用户经过鉴别的必要条件。换句话说,只有当对应于应用程序的全部带 required标记的模块所有成功后,该程序才能经过鉴别。同时,若是任何带required标记的模块出现了错误,PAM并不马上将错误消息返回给应用程序,而是在全部模块都调用完毕后才将错误消息返回调用他的程序。 反正说白了,就是必须将全部的模块都执行一次,其中任何一个模块验证出错,验证都会继续进行,并在执行完成以后才返回错误信息。这样作的目的就是不让用户知道本身被哪一个模块拒绝,经过一种隐蔽的方式来保护系统服务。就像设置防火墙规则的时候将拒绝类的规则都设置为drop同样,以至于用户在访问网络不成功的时候没法准确判断究竟是被拒绝仍是目标网络不可达。
requisite:与required相仿,只有带此标记的模块返回成功后,用户才能经过鉴别。不一样之处在于其一旦失败就再也不执行堆中后面的其余模块,而且鉴别过程到此结束,同时也会当即返回错误信息。与上面的required相比,彷佛要显得更光明正大一些。
sufficient:表示该行以及所涉及模块验证成功是用户经过鉴别的充分条件。也就是说只要标记为sufficient的模块一旦验证成功,那么PAM便当即向应用程序返回成功结果而没必要尝试任何其余模块。即使后面的层叠模块使用了requisite或者required控制标志也是同样。当标记为sufficient的模块失败时,sufficient模块会当作 optional对待。所以拥有sufficient 标志位的配置项在执行验证出错的时候并不会致使整个验证失败,但执行验证成功之时则大门敞开。因此该控制位的使用务必慎重。
optional:他表示即使该行所涉及的模块验证失败用户仍能经过认证。在PAM体系中,带有该标记的模块失败后将继续处理下一模块。也就是说即便本行指定的模块验证失败,也容许用户享受应用程序提供的服务。使用该标志,PAM框架会忽略这个模块产生的验证错误,继续顺序执行下一个层叠模块。
include:表示在验证过程当中调用其余的PAM配置文件。在RHEL系统中有至关多的应用经过完整调用/etc/pam.d/system-auth来实现认证而不须要从新逐一去写配置项。这也就意味着在不少时候只要用户可以登陆系统,针对绝大多数的应用程序也能同时经过认证。
另外还有一种比较复杂的格式为value = action的语法来设置控制标志,标志之间会以空格分开。格式以下:
1
|
value1 = action1 value2 = action2 ……
|
其中value能够是下列Linux PAM库的返回值:
success、open_err、symbol_err、service_err、 system_err、buf_err、perm_denied、auth_err、cred_insufficient、authinfo_unavail、user_unknown、maxtries、new_authtok_reqd、acct_expired、 session_err、cred_unavail、cred_expired、cred_err、no_module_data、conv_err、 authtok_err、authtok_recover_err、authtok_lock_busy、authtok_disable_aging、 try_again、ignore、abort、authtok_expired、module_unknown、bad_item和default。
最后一个(default)可以用来设置上面的返回值没法表达的行为。
actionN能够是一个非负整数或者是下面的记号之一:ignore、ok、done、bad、die和reset。若是是非负整数J,就表示须要忽略后面J个一样类型的模块。经过这种方式,系统管理者能够更加灵活地设置层叠模块,模块的层叠路径由单个模块的反应决定。
关于这几个记号的详细解释:
ignore:若是使用层叠模块,那么这个模块的返回值将被忽略,不会被应用程序知道。
bad:他表示这个返回码应该被看做是模块验证失败的标志。若是这个模块是层叠模块的第一个验证失败的模块,那么他的状态值就是整个层叠模块验证的状态值和结果。
die:终止层叠模块验证过程,马上返回到应用程序。
ok:告诉PAM这个模块的返回值将直接做为全部层叠模块的返回值。也就是说,若是这个模块前面的模块返回状态是PAM_SUCCESS,那这个返回值就会覆盖前面的返回状态。注意:若是前面的模块的返回状态表示模块验证失败,那么不能使用这个返回值再加以覆盖。
done:终止后续层叠模块的验证,把控制权马上交回应用程序。
reset:清除全部层叠模块的返回状态,从下一个层叠模块从新开始验证。
3)模块路径
模块路径.即要调用模块的位置. 若是是64位系统,通常保存在/lib64/security,如: pam_unix.so,同一个模块,能够出如今不一样的类型中.它在不一样的类型中所执行的操做都不相同.这是因为每一个模块,针对不一样的模块类型,编制了不一样的执行函数。
4)模块参数
模块参数,即传递给模块的参数.参数能够有多个,之间用空格分隔开,如:password required pam_unix.so nullok obscure min=4 max=8 md5。
3、PAM模块的工做原理和流程
以RHEL系统为例,当pam安装以后有两大部分:在/lib/security目录下的各类pam模块以及/etc/pam.d和/etc/pam.d目录下的针对各类服务和应用已经定义好的pam配置文件。当某一个有认证需求的应用程序须要验证的时候,通常在应用程序中就会定义负责对其认证的PAM配置文件。以vsftpd为例,在它的配置文件/etc/vsftpd/vsftpd.conf中就有这样一行定义:
1
|
pam_service_name=vsftpd
|
表示登陆FTP服务器的时候进行认证是根据/etc/pam.d/vsftpd文件定义的内容进行。
那么,当程序须要认证的时候已经找到相关的pam配置文件,认证过程是如何进行的?下面咱们将经过解读/etc/pam.d/system-auth文件予以说明。
首先要声明一点的是:system-auth是一个很是重要的pam配置文件,主要负责用户登陆系统的认证工做。并且该文件不只仅只是负责用户登陆系统认证,其它的程序和服务经过include接口也能够调用到它,从而节省了不少从新自定义配置的工做。因此应该说该文件是系统安全的总开关和核心的pam配置文件。
下面是/etc/pam.d/system-auth文件的所有内容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
[root@centos6-test06 ~]
# grep -v ^# /etc/pam.d/system-auth
auth required pam_env.so
auth sufficient pam_unix.so nullok try_first_pass
auth requisite pam_succeed_if.so uid >= 500 quiet
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 required pam_permit.so
password requisite pam_cracklib.so try_first_pass retry=3
type
=
password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok
password required pam_deny.so
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
|
第一部分表示,当用户登陆的时候,首先会经过auth类接口对用户身份进行识别和密码认证。因此在该过程当中验证会通过几个带auth的配置项。
其中的第一步是经过pam_env.so模块来定义用户登陆以后的环境变量, pam_env.so容许设置和更改用户登陆时候的环境变量,默认状况下,若没有特别指定配置文件,将依据/etc/security/pam_env.conf进行用户登陆以后环境变量的设置。
而后经过pam_unix.so模块来提示用户输入密码,并将用户密码与/etc/shadow中记录的密码信息进行对比,若是密码比对结果正确则容许用户登陆,并且该配置项的使用的是“sufficient”控制位,即表示只要该配置项的验证经过,用户便可彻底经过认证而不用再去走下面的认证项。不过在特殊状况下,用户容许使用空密码登陆系统,例如当将某个用户在/etc/shadow中的密码字段删除以后,该用户能够只输入用户名直接登陆系统。
下面的配置项中,经过pam_succeed_if.so对用户的登陆条件作一些限制,表示容许uid大于500的用户在经过密码验证的状况下登陆,在Linux系统中,通常系统用户的uid都在500以内,因此该项即表示容许使用useradd命令以及默认选项创建的普通用户直接由本地控制台登陆系统。
最后经过pam_deny.so模块对全部不知足上述任意条件的登陆请求直接拒绝,pam_deny.so是一个特殊的模块,该模块返回值永远为否,相似于大多数安全机制的配置准则,在全部认证规则走完以后,对不匹配任何规则的请求直接拒绝。
第二部分的三个配置项主要表示经过account帐户类接口来识别帐户的合法性以及登陆权限。
第一行仍然使用pam_unix.so模块来声明用户须要经过密码认证。第二行认可了系统中uid小于500的系统用户的合法性。以后对全部类型的用户登陆请求都开放控制台。
第三部分会经过password口另类接口来确认用户使用的密码或者口令的合法性。第一行配置项表示须要的状况下将调用pam_cracklib来验证用户密码复杂度。若是用户输入密码不知足复杂度要求或者密码错,最多将在三次这种错误以后直接返回密码错误的提示,不然期间任何一次正确的密码验证都容许登陆。须要指出的是,pam_cracklib.so是一个经常使用的控制密码复杂度的pam模块,关于其用法举例咱们会在以后详细介绍。以后带pam_unix.so和pam_deny.so的两行配置项的意思与以前相似。都表示须要经过密码认证并对不符合上述任何配置项要求的登陆请求直接予以拒绝。不过用户若是执行的操做是单纯的登陆,则这部分配置是不起做用的。
第四部分主要将经过session会话类接口为用户初始化会话链接。其中几个比较重要的地方包括,使用pam_keyinit.so表示当用户登陆的时候为其创建相应的密钥环,并在用户登出的时候予以撤销。不过该行配置的控制位使用的是optional,表示这并不是必要条件。以后经过pam_limits.so限制用户登陆时的会话链接资源,相关pam_limit.so配置文件是/etc/security/limits.conf,默认状况下对每一个登陆用户都没有限制。关于该模块的配置方法在后面也会详细介绍。
可见,不一样应用程序经过配置文件在认证过程当中调用不一样的pam模块来定制具体的认证流程。其中咱们不难看出,其实能够根据实际的须要对pam的配置文件进行修改以知足不一样的认证需求,例以下面的例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
#%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 required pam_tally.so onerr=fail deny=5
auth sufficient pam_unix.so nullok try_first_pass
auth requisite pam_succeed_if.so uid >= 500 quiet
auth required pam_deny.so
account required pam_unix.so
account sufficient pam_succeed_if.so uid < 500 quiet
account required pam_permit.so
password requisite pam_cracklib.so try_first_pass retry=3 minlen=10 lcredit=-1 ucredit=-1 dcredit=-1 ocredit=-1 difok=6
password requisite pam_passwdqc.so use_first_pass enforce=everyone
password sufficient pam_unix.so md5 remember=6 shadow nullok try_first_pass use_authtok
password required pam_deny.so
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
|
在其中就增长了对用户密码修改时复杂度的限制,用户屡次错误输入密码以后的锁定限制以及用户使用密码历史等限制选项。
因此咱们经过对上述system-auth配置文件的修改,模块的增长和选项的变化,从很大的程度上增长了用户登陆验证的安全性要求。咱们会在以后的文章中对该配置进行详细说明。
另外也必定须要注意,在整个的PAM配置文件当中,配置项以及模块调用的逻辑顺序很是关键。由于PAM是按照配置项的前后顺序来进行验证。错误的模块调用顺序极可能致使严重的安全问题甚至系统错误。因此对PAM配置进行修改的时候务必要考虑这一点。
4、经常使用的PAM模块介绍
PAM模块 | 结合管理类型 | 说明 |
pam_unix.so | auth |
提示用户输入密码,并与/etc/shadow文件相比对.匹配返回0 |
account | 检查用户的帐号信息(包括是否过时等).账号可用时,返回0. | |
password | 修改用户的密码. 将用户输入的密码,做为用户的新密码更新shadow文件 | |
pam_shells.so | auth account |
若是用户想登陆系统,那么它的shell必须是在/etc/shells文件中之一的shell |
pam_deny.so | account auth password session |
该模块可用于拒绝访问 |
pam_permit.so | auth account password session |
模块任什么时候候都返回成功. |
pam_securetty.so | auth | 若是用户要以root登陆时,则登陆的tty必须在/etc/securetty之中. |
pam_listfile.so | auth account password session |
访问应用程的控制开关 |
pam_cracklib.so | password | 这个模块能够插入到一个程序的密码栈中,用于检查密码的强度. |
pam_limits.so | session | 定义使用系统资源的上限,root用户也会受此限制,能够经过/etc/security/limits.conf或/etc/security/limits.d/*.conf来设定 |
5、PAM模式使用说明
1)pam_access.so模块
pam_access.so模块主要的功能和做用是根据主机名(包括普通主机名或者FQDN)、IP地址和用户实现全面的访问控制。pam_access.so模块的具体工做行为根据配置文件/etc/security/access.conf来决定。该配置文件的主体包含了三个字段——权限、用户和访问发起方。格式上是一个用""隔开的表。
第一个字段:权限(permission),使用"+"表示授予权限,用"-"表示禁止权限。
第二个字段:用户(user),定义了用户、组以及用"@"表示的在不一样主机上的同名用户和同一主机上不一样名用户。
第三个字段:访问发起方(origins),定义了发起访问的主机名称、域名称、终端名称。
并且/etc/security/access.conf文件提供了不少范例供修改时参考,而且都给出了具体的说明,例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
#禁止非root用户经过tty1访问相关服务
#-:ALL EXCEPT root:tty1
#禁止除了wheel、shutdown以及sync以外的全部用户访问相关服务
#-:ALL EXCEPT wheel shutdown sync:LOCAL
#禁止wheel用户经过.win.tue.nl以外的其它它终端访问相关服务
#-:wheel:ALL EXCEPT LOCAL .win.tue.nl
# 禁止下面的用户从任何主机登陆。其它用户能够从任意地方访问相关服务
#-:wsbscaro wsbsecr wsbspac wsbsym wscosor wstaiwde:ALL
# root用户容许经过cron来使用tty1到tty6终端访问相关服务
#+ : root : cron crond :0 tty1 tty2 tty3 tty4 tty5 tty6
# 用户root容许从下面的地址访问相关服务
#+ : root : 192.168.200.1 192.168.200.4 192.168.200.9
#+ : root : 127.0.0.1
# 用户root能够从192.168.201.网段访问相关服务
#+ : root : 192.168.201.
# 用户root能够从.foo.bar.org中任何主机访问相关服务
#+ : root : .foo.bar.org
# 用户root不容许从任何主机访问相关服务
#- : root : ALL
# 用户@nis_group和foo能够从任何主机访问相关服务
#+ : @nis_group foo : ALL
# 用户john只能从127.0.0.0/24来对本机相关服务进行访问
#+ : john : 127.0.0.0/24
# 用户john能够经过ipv4和ipv6的地址对本机相关服务进行访问
#+ : john : ::ffff:127.0.0.0/127
# 用户john能够经过ipv6的地址访问本机相关服务
#+ : john : 2001:4ca0:0:101::1
# 用户john能够经过ipv6的主机IP地址来访问本机
#+ : john : 2001:4ca0:0:101:0:0:0:1
# 用户john能够经过ipv6的IP地址和掩码来访问相关服务
#+ : john : 2001:4ca0:0:101::/64
# 开放全部用户对本机全部相关服务的访问
#- : ALL : ALL
|
示例说明(vsftp):
若是要在网络内架设一个FTP服务器,并且在该FTP服务器上须要强制地指定某个用户只能经过某个IP地址登陆,这个时候pam_access.so模块就派上用场了。假设个人FTP服务器是使用vsftp来构建的,具体操做是:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
1)修改FTP服务器的
/etc/pam
.d
/vsftpd
文件,在调用account接口处插入
"account required pam_access.so"
这行内容,以下:
[root@centos6-test06 ~]
# vim /etc/pam.d/vsftpd
#%PAM-1.0
session optional pam_keyinit.so force revoke
auth required pam_listfile.so item=user sense=deny
file
=
/etc/vsftpd/ftpusers
onerr=succeed
auth required pam_shells.so
auth include password-auth
account include password-auth
account required pam_access.so
//
添加这一行内容
session required pam_loginuid.so
session include password-auth
上述配置表示当针对FTP访问执行用户类接口的时候会增长pam_access.so的认证。
2)修改
/etc/security/access
.conf配置文件,
在文件底部添加下面的两行:
[root@centos6-test06 ~]
# vim /etc/security/access.conf
- : kevin : ALL EXCEPT 192.168.10.101
- : grace : ALL EXCEPT 192.168.10.102
前提是已经在系统上事先创建了kevin和grace两个用户。上面的配置表示:
kevin用户不能从192.168.10.101以外的任何客户端访问FTP服务器;
grace用户不能从192.168.10.102以外的任何客户端访问FTP服务器。
3)修改
/etc/vsftpd/vsftpd
.conf文件,禁用匿名登陆:
[root@centos6-test06 ~]
# vim /etc/vsftpd/vsftpd.conf
......
Anonymous_enable = NO
这样当重启vsftpd服务以后,用户kevin将只能从192.168.10.101访问
ftp
服务,而grace将只能从192.168.10.102访问
ftp
服务。
因此当针对这种需求并且不想使用防火墙以及应用程序自带的认证机制的时候,经过pam_access.so能够实现所需的效果。
|
2)pam_listfile.so
pam_listfile.so模块的功能和pam_access.so模块相似,目标也是实现基于用户/组,主机名/IP,终端的访问控制。不过它实现的方式和pam_access.so会稍微有些不一样,由于它没有专门的默认配置文件。访问控制是靠pam配置文件中的控制选项和一个自定义的配置文件来实现的。并且除了针对上述访问源的控制以外,还可以控制到ruser,rhost,所属用户组和登陆shell。因此有些用户认为它的功能彷佛比pam_access.so更加灵活和强大一些。
对于pam_listfile.so的配置方法,能够参考vsftpd文件中对pam的调用方式。熟悉vsftpd的人都知道,在vsftpd默认配置中,root用户是不容许经过ftp方式直接访问FTP服务器的。这个功能其实是由/etc/vsftpd/vsftpd.conf,/etc/vsftpd/ftpusers和/etc/pam.d/vsftpd共同控制的。 由于在/etc/pam.d/vsftpd中有这样的一行配置:
1
2
3
|
[root@centos6-test06 ~]
# cat /etc/pam.d/vsftpd
......
auth required pam_listfile.so item=user sense=deny
file
=
/etc/vsftpd/ftpusers
onerr=succeed
|
表示当用户试图登陆FTP服务器的时候,会调用pam_listfile.so模块来验证用户是否能够登陆,这里item=user表示访问控制是基于user即用户实现的。那么哪些用户能够登陆呢?就是除了file选项所定义的/etc/vsftpd/ftpusers文件以外的用户,这是由另一个选项sense=deny所决定的。而在/etc/vsftpd/vsftpd.conf中明确指定了对用户的认证须要经过/etc/pam.d/vsftpd中的配置调用pam模块:
1
2
|
[root@centos6-test06 ~]
# cat /etc/vsftpd/vsftpd.conf |grep pam_service_name
pam_service_name=vsftpd
|
而刚好root用户又在/etc/vsftpd/ftpusers文件中,因此这成为了制约root登陆FTP服务器的一个必要条件(但不是惟一条件)。因此针对这种状况,要开放和容许root用户登陆FTP的权限,至少有三种改法:
1
2
3
|
1)修改
/etc/pam
.d
/vsftpd
文件,将sense=deny改为sense=allow。这样会正好将状况反转过来,FTP服务器只容许
/etc/vsftpd/ftpusers
文件内的用户登陆;
2)修改
/etc/pam
.d
/vsftpd
文件,注释掉调用pam_listfile.so那行。这样FTP服务器在认证用户的时候将再也不考虑pam_listfile.so模块的任何限制;
3)将root从
/etc/vsftpd/ftpuser
文件中注释掉;
|
不过须要注意的是,root用户比较特殊,由于它在vsftpd配置中的限制不只仅来自于pam,vsftpd自己的配置中也对其作了限制。当咱们看/etc/vsftpd/user_list文件的时候,还将会看到这样的配置说明:
1
2
3
4
5
6
7
8
9
|
[root@centos6-test06 vsftpd]
# cat /etc/vsftpd/user_list
# vsftpd userlist
# If userlist_deny=NO, only allow users in this file
# If userlist_deny=YES (default), never allow users in this file, and
# do not even prompt for a password.
# Note that the default vsftpd pam config also checks /etc/vsftpd/ftpusers
# for users that are denied.
........
........
|
表示当vsftpd.conf中userlist_deny=NO的时候,系统将只容许user_list中的用户登陆FTP服务器;若是userlist_deny=YES,状况将截然相反——此时user_list变成了黑名单,里面的用户将一律不容许登陆FTP服务器。因此要完全开放root登陆FTP的权限,咱们还要在/etc/vsftpd/vsftpd.conf中增长userlist_deny=YES或者注释掉user_list中的root。
不过无论怎么说,vsftpd中禁用root用户的直接登陆是在绝大多数FTP服务器上默认的安全措施,因此开放root权限时应该慎重。
另外除了经过pam_listfile.so实现基于用户的访问控制以外,还能够实现基于其它条件的访问控制。这个能够具体看看pam_listfile.so模块的选项就会比较清楚了,使用pam_listfile.so模块配置的格式分为五个部分:分别是item、onerr、sense、file以及apply。 其中:
a)item=[tty|user|rhost|ruser|group|shell]:定义了对哪些列出的目标或者条件采用规则,显然,这里能够指定多种不一样的条件。
b)onerr=succeed|fail:定义了当出现错误(好比没法打开配置文件)时的缺省返回值。
c)sense=allow|deny:定义了当在配置文件中找到符合条件的项目时的控制方式。若是没有找到符合条件的项目,则通常验证都会经过。
d)file=filename:用于指定配置文件的全路径名称。
e)apply=user|@group:定义规则适用的用户类型(用户或者组)。
而至于file文件的写法就简单了,每行一个用户或者组名称便可。因此,当须要对其它服务进行相似的访问控制的时候,就能够照葫芦画瓢。例如如今须要在SSH服务器上对ssh客户端实现基于用户的访问控制
示例说明一:
不容许bobo帐号经过ssh方式登陆。作法以下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
1)针对这种需求只须要更改
/etc/pam
.d
/sshd
文件,并在该文件中添加一行(必定要添加到第一行):
[root@centos6-test06 ~]
# vim /etc/pam.d/sshd
auth required pam_listfile.so item=user sense=deny
file
=
/etc/pam
.d
/denyusers
onerr=succeed
......
2)建立bobo帐号
[root@centos6-test06 ~]
# useradd bobo
[root@centos6-test06 ~]
# passwd bobo
Changing password
for
user bobo.
New password:
Retype new password:
passwd
: all authentication tokens updated successfully.
3)创建文件
/etc/pam
.d
/denyusers
,并在文件中写入用户信息。
[root@centos6-test06 ~]
# echo "bobo" > /etc/pam.d/denyusers
[root@centos6-test06 ~]
# cat /etc/pam.d/denyusers
bobo
4)测试使用bobo帐号经过
ssh
方式登陆不上了
[root@centos6-test06 ~]
# ssh -p22 bobo@localhost
bobo@localhost's password:
Permission denied, please try again.
bobo@localhost's password:
表示用户以
ssh
登陆必需要经过pam_listfile.so模块进行认证,认证的对象类型是用户,采用的动做是禁止,禁止的目标是
/etc/pam
.d
/denyuser
文件中所定义的用户。
这样在该条目添加到该文件以后,使用bobo帐号从其它主机远程
ssh
访问服务器会出现密码错误的提示,可是使用root或者其它用户则访问可以成功!
再次强调,要注意pam模块使用的顺序,刚才的规则必定要添加到
/etc/pam
.d
/sshd
文件的auth的第一行以前,不然不会生效!!!!!
|
示例说明二:
仅仅容许kevin用户能够经过ssh远程登陆。作法以下:
在/etc/pam.d/sshd文件中添加一条(务必添加到文件的第一行!):
auth required pam_listfile.so item=user sense=allow file=/etc/sshdusers onerr=succeed
添加两个用户kevin和grace
1
2
3
4
|
[root@centos6-test06 ~]
# useradd kevin
[root@centos6-test06 ~]
# passwd kevin
[root@centos6-test06 ~]
# useradd grace
[root@centos6-test06 ~]
# passwd grace
|
编辑file指定的文件,添加上一个用户kevin(这一步是关键)
1
|
[root@centos6-test06 ~]
# echo "kevin" >/etc/sshdusers //文件/etc/sshdusers是在上面添加到/etc/pam.d/sshd中定义的
|
而后验证,发现使用kevin帐号能正常ssh登陆,使用grace帐号就不能正常ssh登陆了!
1
2
3
4
5
6
7
8
9
10
11
|
[root@centos6-test06 ~]
# ssh -p22 kevin@localhost
kevin@localhost's password:
Last login: Thu Mar 29 12:02:18 2018 from 192.168.10.206
[root@centos6-test06 ~]
# ssh -p22 grace@localhost
grace@localhost's password:
Permission denied, please try again.
[root@centos6-test06 ~]
# ssh -p22 root@localhost
root@localhost's password:
Permission denied, please try again.
|
注:此处若是root也使用ssh远程链接,也会受到pam_listfile.so限制的。
舒适提示:
若是发生错误,Linux-PAM 可能会改变系统的安全性。这取决于你本身的选择,你能够选择不安全(开放系统)和绝对安全(拒绝任何访问)。一般,Linux-PAM 在发生错误时,倾向于后者。任何的配置错误均可能致使系统整个或者部分没法访问。配置 Linux-PAM 时,可能遇到最大的问题可能就是 Linux-PAM 的配置文件/etc/pam.d/*被删除了。若是发生这种事情,你的系统就会被锁住。有办法能够进行恢复,最好的方法就是用一个备份的镜像来恢复系统,或者登陆进单用户模式而后进行正确的配置。
3)pam_limits.so模块
pam_limits.so模块的主要功能是限制用户会话过程当中对各类系统资源的使用状况。缺省状况下该模块的配置文件是/etc/security/limits.conf。而该配置文件的基本格式其实是由4个字段组成的表,其中具体限制的内容包括:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
Domain
type
item value
用户名/组名 软/硬限制 具体值
core——core文件大小 (KB)
data——最大数据大小(KB)
fsize——最大文件大小(KB)
memlock——最大可用内存空间(KB)
nofile——最大能够打开的文件数量
rss——最大可驻留空间(KB)
stack——最大堆栈空间(KB)
cpu——最大CPU使用时间(MIN)
nproc——最大运行进程数
as——地址空间限制
maxlogins——用户能够登陆到系统最屡次数
locks——最大锁定文件数目
|
须要注意的是,若是没有任何限制可使用"-"号,而且针对用户限制的优先级通常要比针对组限制的优先级更高。使用pam_limits.so模块的最多见的场景是在运行Oracle数据库的RHEL服务器中,由于通常Oracle数据库在安装以前,按照其官方文档的说明须要先对某些用户(Oracle)使用系统资源的状况进行限制。因此咱们老是可以在Oracle数据库服务器的/etc/security/limits.conf文件中看到相似这样的配置:
1
2
3
4
5
6
|
[root@centos6-test06 ~]
# vim /etc/security/limits.conf
.......
oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536
|
结合上面的配置文件说明,可知Oracle数据库须要对Oracle用户使用资源的状况进行一些限制,包括: oracle用户最大能开启的进程数不超过16384,最大能打开的文件数不超过65536。
至于soft和hard的区别,不一样于磁盘配额中的软限制和硬限制。普通用户能够调整本身的soft limit但最高不能超过hard limit,并且除了root之外的普通用户也不可以随意更改hard limit。该调整完成以后通常可使用ulimit命令查看。
顺便提一下,针对nofile,这个只是基于用户层面的限制和调整方法。基于系统层面的限制和调整方法是修改/etc/sysctl.conf文件,直接改fs.file-max参数,调整以后sysctl –p生效。
示例说明:
pam_limits.so模块也可使用在对通常应用程序使用的资源限制方面。若是须要在SSH服务器上对来自不一样用户的ssh访问进行限制,就能够调用该模块来实现相关功能。例如,当须要限制用户bobo登陆到SSH服务器时的最大链接数(防止同一个用户开启过多的登陆进程)。限制操做以下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
因为
/etc/pam
.d
/system-auth
中,默认就会经过pam_limits.so 限制用户最多使用多少系统资源
[root@centos6-test06 ~]
# cat /etc/pam.d/system-auth|grep limits.so
session required pam_limits.so
所以只须要在
/etc/security/limits
.conf文件中增长一行对bobo用户产生的链接数进行限定:
[root@centos6-test06 ~]
# vim /etc/security/limits.conf
......
bobo hard maxlogins 2
最后测试
从客户端以bobo身份登陆SSH服务器时,在客户端上能够打开两个控制台登陆。
但当客户端开启第三个登陆窗口的时候会被服务器拒绝,但其它用户不会受到限制。
注意:这样限制的只是从客户端以
ssh
方式登陆次数的场景,若是从xshell登陆,则不受限制!
|
4)pam_rootok.so模块
通常状况下,pam_rootok.so模块的主要做用是使uid为0的用户,即root用户可以直接经过认证而不用输入密码。pam_rootok.so模块的一个典型应用是插入到一些应用程序的认证配置文件中,当root用户执行这些命令的时候能够不用输入口令而直接经过认证。好比说"su"命令,为何当以root用户执行"su"切换到普通用户身份的时候是不须要输入任何口令而能够直接切换过去?当咱们查看一下/etc/pam.d/su文件的内容就不会奇怪了。由于该文件的第一行就是:
1
2
3
|
[root@centos6-test06 ~]
# cat /etc/pam.d/su
......
auth sufficient pam_rootok.so
|
而若是将该行配置注释掉的状况下,就会发现即使以root用户切换普通用户的时候仍然要求输入口令。
另一种方法,只须要将上述的"sufficient"改为"required"便可。由于这样,pam_rootok.so模块的验证经过就成为了必要条件之一。
pam_rootok.so模块的另一个应用是在chfn命令中。Chfn命令用于改变/etc/passwd中的用户的说明字段。当以root身份执行chfn命令修改用户信息的时候是不用输入密码的。可是以普通用户身份执行chfn则须要输入密码以后才能改变本身的用户说明。这实际上也是由于在/etc/pam.d/chfn配置文件中的第一行调用了pam_rootok.so的结果。
不过这里即使将该配置中的第一行注释掉,root用户经过chfn修改本身信息的时候仍然不须要使用密码。因此恐怕效果不是很明显。究其缘由主要是不少PAM模块对root用户是不会产生限制的。
示例说明(禁用用户间使用su切换命令):
su的缺点
1)不安全su工具在多人参与的系统管理中,并非最好的选择,su只适用于一两我的参与管理的系统,毕竟su并不能让普通用户受限的使用;超级用户root密码应该掌握在少数用户手中。
2)麻烦:须要把root密码告知每一个须要root权限的人。
能够在/etc/pam.d/su文件里设置禁止用户使用su命令
[root@centos6-test06 ~]# vim /etc/pam.d/su
auth sufficient pam_rootok.so
# Uncomment the following line to implicitly trust users in the "wheel" group.
#auth sufficient pam_wheel.so trust use_uid
# Uncomment the following line to require a user to be in the "wheel" group.
#auth required pam_wheel.so use_uid
...........
a)以上标红的两行是默认状态(即开启第一行,注释第二行),这种状态下是容许全部用户间使用su命令进行切换的!(或者两行都注释也是运行全部用户都能使用su命令,但root下使用su切换到其余普通用户须要输入密码;若是第一行不注释,则root使用su切换普通用户就不须要输入密码)
b)若是开启第二行,表示只有root用户和wheel组内的用户才可使用su命令。
c)若是注释第一行,开启第二行,表示只有wheel组内的用户才能使用su命令,root用户也被禁用su命令。
5) pam_userdb.so模块
pam_userdb.so模块的主要做用是经过一个轻量级的Berkeley数据库来保存用户和口令信息。这样用户认证将经过该数据库进行,而不是传统的/etc/passwd和/etc/shadow或者其它的一些基于LDAP或者NIS等类型的网络认证。因此存在于Berkeley数据库中的用户也称为虚拟用户。
pam_userdb.so模块的一个典型用途就是结合vsftpd配置基于虚拟用户访问的FTP服务器。
相对于本地用户以及匿名用户来讲,虚拟用户只是相对于FTP服务器而言才有用的用户,这些用户被严格地限定在pam_userdb数据库当中。因此虚拟用户只能访问FTP服务器所提供的资源,于是能够大大提升系统安全性。另外相对于匿名用户而言,虚拟用户必须经过用户名和密码才可以访问FTP的资源。这样也提升了对FTP用户下载的可管理性。
基于虚拟用户实现的vsftpd的原理基本上是这样一个过程:先定义一些专门针对FTP的虚拟用户,而后将用户信息加入到系统自带的数据库中(但不是passwd)从而生成一个访问FTP的虚拟用户列表,这里使用的数据库是db4也就是Berkeley DB。而后能够经过使用pam_userdb.so模块来调用该数据库存储用户信息以及实现FTP用户认证。固然同时也能够在系统中经过对配置文件的定义和划分来实现对不一样虚拟用户不一样类型的访问控制。
FTP虚拟帐号登陆环境部署:http://www.cnblogs.com/kevingrace/p/5587140.html
6)pam_cracklib.so模块
pam_cracklib.so是一个经常使用而且很是重要的PAM模块。该模块主要的做用是对用户密码的强健性进行检测。即检查和限制用户自定义密码的长度、复杂度和历史等。如不知足上述强度的密码将拒绝用户使用。pam_cracklib.so比较重要和难于理解的是它的一些参数和计数方法,其经常使用参数包括:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
debug: 将调试信息写入日志;
type
=xxx: 当添加/修改密码时,系统给出的缺省提示符是
"New UNIX password:"
以及
"Retype UNIX password:"
,而使用该参数能够自定义输入密码的提示符,好比指定
type
=your own word;
retry=N: 定义登陆/修改密码失败时,能够重试的次数;
Difok=N: 定义新密码中必须至少有几个字符要与旧密码不一样。可是若是新密码中有1
/2
以上的字符与旧密码不一样时,该新密码将被接受;
minlen=N: 定义用户密码的最小长度;
dcredit=N:定义用户密码中必须至少包含多少个数字;
ucredit=N:定义用户密码中必须至少包含多少个大写字母;
lcredit=N:定义用户密码中必须至少包含多少个小些字母;
ocredit=N:定义用户密码中必须至少包含多少个特殊字符(除数字、字母以外);
特别要注意:
当N>0时,N表明新密码中最多能够有N个指定的字符!!
当N<0时,N表明新密码中最少能够有N个指定的字符!!
同时建议重启系统使之生效!
|
/etc/pam.d/login文件里包含了/etc/pam.d/system-auth文件的配置
1
2
3
4
5
|
[root@centos6-test06 ~]
# cat /etc/pam.d/login|grep system-auth
auth include system-auth
account include system-auth
password include system-auth
session include system-auth
|
以下看pam_cracklib.so的一个应用实例:在/etc/pam.d/system-auth中使用pam_cracklib.so来限制用户修改本身密码时必须知足必定的强健性要求。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
[root@centos6-test06 ~]
# cat /etc/pam.d/system-auth
#%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 required pam_deny.so
account required pam_unix.so
account sufficient pam_localuser.so
account sufficient pam_succeed_if.so uid < 500 quiet
account required pam_permit.so
password requisite pam_cracklib.so try_first_pass retry=3
type
=
password sufficient pam_unix.so md5 shadow nullok try_first_pass use_authtok
password required pam_deny.so
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
-----------------------------------------------------------------------------
从上面使用pam_cracklib.so的策略看,要求用户修改密码时必需要知足9位,而且密码中至少要包含一个大写字母、小写字母、数字和特殊符号。
可是实际上像minlen和全部credit所对应的数值能够是非0以外的正负整数,那么这些数值到底表示什么意思呢?
不少人将其简单地理解为某一类字符的位数,其实远远没有那么简单。
下面咱们对这些数值和关系作一个简短的说明:
首先要明确整个环境中密码的长度要知足下面的计算公式:
计算公式:
最小密码长度(minlen)应该小于或者等于 dcredit+ucredit+lcredit+ocredit+其它分值 (同时知足 * credit的条件)。
注意:
*credit=-1表示至少有一个的意思
*credit=N(N表示当知足条件的时候加N分,例如dcredit=2表示一个数字加2分,两个数字加4分)
因此这里minlen其实更准确的表述应该是mincredit。
因此在下面的例子中,当pam_cracklib.so的参数按以下方式指定:
password requisite pam_cracklib.so try_first_pass retry=3 minlen=12 dcredit=2 ucredit=0 lcredit=0 ocredit=0
那么当用户执行命令修改密码的时候:
[bobo@centos6-test06 ~]$
passwd
Changing password
for
user bobo.
Changing password
for
bobo
(current) UNIX password:
New UNIX password: 输入密码
"1\=poiuyt"
不成功 1个数字再加2分
此时密码有一个数字,2分,其它的字符每一个1分,总共10分,不知足minlen的位数需求,因此该密码不能经过。
BAD PASSWORD: is too simple
New UNIX password: 输入密码
"12\=poiuyt"
成功 2个数字再加2分
Retype new UNIX password:
此时密码有两个数字,4分,其它的字符每一个1分,总共12分,知足minlen的位数需求,因此密码能够经过。
New UNIX password: 输入密码
"1\=poiuytre"
成功 1个数字再加2分
Retype new UNIX password:
此时密码有1个数字,2分,其它的字符每一个1分,总共12分,知足minlen的位数需求,因此密码能够经过。
所以经过上述的配置基本能够得出这样的结论:
当某类credit为正数N的时候,表示密码中该类字符一个能够加N分;当某类credit为负数N的时候,表示密码中某类字符必须具有N个。时间关系我将不会一一演示。
因此当输入的密码全部的字符总分大于或者等于minlen,而且知足全部credit的要求,该密码经过; 即:输入的密码长度(每一个输入值都算数)+*credit(加分)>=minlen
因此pam_cracklib.so模块在系统安全管理策略和管理中的用途是很是重要和普遍的。
|
7)pam_pwhistroy.so模块
pam_pwhistory.so模块也是一个经常使用模块,通常辅助pam_cracklib.so,pam_tally.so以及pam_unix.so等模块来增强用户使用密码的安全度。不过pam_pwhistory.so模块起的是另外一类的做用,即专门为用户创建一个密码历史档案,防止用户在必定时间内使用已经用过的密码。
示例说明:(特别注意:/etc/pam.d/system-auth下的配置针对的是普通用户,在root用户下是无效的)
当须要限定用户在90天以内不能重复使用之前曾经使用过的10个密码,那么具体操做方法是去修改/etc/pam.d/system-auth文件,在password接口处增长:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
[root@centos6-test06 ~]
# vim /etc/pam.d/system-auth
......
password required pam_cracklib.so retry=3 password required pam_pwhistory.so enforce_for_root remember=10
----------------------------------------------------------------
此时用户使用过的密码将会记录到
/etc/security/opasswd
文件中。可是pam_pwhistory.so并无什么选项能够限定密码在多少天以内没法被重复使用,
因此上述的90天是没法配置的。一个简单的解决方法就是当90天左右的时候,手动清空一次opasswd文件便可。
固然,若是要实现一样的功能除了pam_pwhistory.so模块以外还有其它的办法。比较经常使用的是pam_unix.so模块。
具体方法是修改
/etc/pam
.d
/system-auth
文件,给pam_unix.so模块里加上remember=10这个选项,修改以后的配置文件为:
[root@centos6-test06 ~]
# vim /etc/pam.d/system-auth
.......
password required pam_unix.so md5 remember=10 use_authtok
这样系统将一样记住10个已经使用的密码。
不过此时
/etc/security/opasswd
文件由于记录了N个使用过的密码,因此安全性就十分关键了,因此要确保该文件只能被root用户读取和编辑:
[root@centos6-test06 ~]
# touch /etc/security/opasswd
[root@centos6-test06 ~]
# chown root:root /etc/security/opasswd
[root@centos6-test06 ~]
# chmod 600 /etc/security/opasswd
|
==========总结几个PAM模块比较常见的实操案例===========
1)怎样才能强迫用户设置的密码不能与过去3次内的密码重复?(特别注意:/etc/pam.d/system-auth下的配置针对的是普通用户,在root用户下是无效的)
1
2
3
4
|
修改
/etc/pam
.d
/system-auth
,增长pam_unix.so的参数,以下:
[root@centos6-test06 ~]
# vim /etc/pam.d/system-auth
......
password sufficient pam_unix.so md5 shadow nullok try_first_pass use_authtok remember=3
|
2)如何要求用户设置的密码必须至少包含5个数字和3个特殊符号?
1
2
3
4
5
6
7
8
|
修改
/etc/pam
.d
/system-auth
,在password使用pam_cracklib.so设置的最后附加 dcredit=-5 ocredit=-3
[root@centos6-test06 ~]
# vim /etc/pam.d/system-auth
......
password requisite pam_cracklib.so try_first_pass retry=3 dcredit=-5 ocredit=-3
----------------------------------------------------------------------
同时注意:
密码中的n个数字和n个特殊字符不能所有放在一块儿!!
|
3)如何限制kevin用户最多同时登录4个?(同时能够限制root用户)
1
2
3
4
5
6
7
8
|
这须要pam_limits.so模块。因为
/etc/pam
.d
/system-auth
中,默认就会经过pam_limits.so 限制用户最多使用多少系统资源.
[root@centos6-test06 ~]
# cat /etc/pam.d/system-auth|grep limits.so
session required pam_limits.so
所以只须要在
/etc/security/limits
.conf 中加入如下内容:
[root@centos6-test06 ~]
# vim /etc/security/limits.conf
......
kevin hard maxlogins 4
|
4)某用户连续登录失败2次就锁定该帐号,禁止登录?(默认只能尝试登陆三次,由retry=N决定的)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
如今不少地方都有限制用户登陆的功能,Linux也是如此,当你登陆失败屡次后就能够限制用户登陆,从而起到保护电脑安全的做用,经过PAM模块便可实现。
Linux有一个pam_tally2.so的PAM模块,来限定用户的登陆失败次数,若是次数达到设置的阈值,则锁定用户。
编译PAM的配置文件
[root@centos6-test06 ~]
# vi /etc/pam.d/login //在#%PAM-1.0下面添加一行
#%PAM-1.0
auth required pam_tally2.so onerr=fail deny=2 unlock_time=300 even_deny_root root_unlock_time=10
......
参数解释:
onerr=fail 表示定义了当出现错误(好比没法打开配置文件)时的缺省返回值;
even_deny_root 表示也限制root用户;
deny 表示设置普通用户和root用户连续错误登录的最大次数,超过最大次数,则锁定该用户;
unlock_time 表示设定普通用户锁定后,多少时间后解锁,单位是秒;
root_unlock_time 表示设定root用户锁定后,多少时间后解锁,单位是秒;
此处使用的是 pam_tally2模块,若是不支持pam_tally2,可使用pam_tally模块。
另外,不一样的pam版本,设置可能有所不一样,具体使用方法,能够参照相关模块的使用规则。
特别注意:
必定要将内容添加到
#%PAM-1.0的下面,即在第二行添加内容,必定要写在前面!!
若是写在后面,虽然用户被锁定,可是只要用户输入正确的密码,仍是能够登陆的!
------------------------------------------
也能够将上面的内容添加到
/etc/pam
.d
/password-auth
文件中,由于
/etc/pam
.d
/login
文件中包括(include)了password-auth配置
[root@centos6-test06 ~]
# vim /etc/pam.d/system-auth //一样添加到auth区域的第一行
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth required pam_tally2.so onerr=fail deny=2 unlock_time=300 even_deny_root root_unlock_time=10
========================================================================================
特别注意:
上面的配置只是限制了用户从
tty
终端登陆,而没有限制远程
ssh
登陆,若是想限制远程登陆,须要在
/etc/pam
.d
/sshd
文件里配置
[root@centos6-test06 ~]
# vim /etc/pam.d/sshd //一样添加到auth区域的第一行
#%PAM-1.0
auth required pam_tally2.so onerr=fail deny=2 unlock_time=300 even_deny_root root_unlock_time=10
这样的话,使用
ssh
远程登陆的时候,连续输入两次错误密码,就会被锁定了!
若是输入错误次数没有达到deny设置的次数,再输入正确密码就能够登陆。
验证:
[bobo@centos6-test06 ~]$
ssh
-p22 kevin@localhost
kevin@localhost's password:
//
第一次输入密码错误
Permission denied, please try again.
kevin@localhost's password:
//
第二次输入密码错误,此时已被锁定
Permission denied, please try again.
kevin@localhost's password:
//
接着第三次再输入正确密码,仍是没法登陆进去,由于已被锁定300s了!
Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
由于被锁定300s了!在这个时间内,就算再输入正确密码也是没法顺利登陆到机器的!
[bobo@centos6-test06 ~]$
ssh
-p22 kevin@localhost
kevin@localhost's password:
Permission denied, please try again.
接着能够解锁!!
查看用户登陆失败的次数。由下面命令可知,已经输错3次了
[root@centos6-test06 ~]
# pam_tally2 --user kevin
Login Failures Latest failure From
kevin 3 03
/30/18
07:35:49 ::1
解锁指定用户
[root@centos6-test06 ~]
# pam_tally2 -r -u kevin
Login Failures Latest failure From
kevin 3 03
/30/18
07:35:49 ::1
[root@centos6-test06 ~]
# pam_tally2 --user kevin
Login Failures Latest failure From
kevin 0
接着,就能够输入正确密码登陆机器了
[bobo@centos6-test06 ~]$
ssh
-p22 kevin@localhost
kevin@localhost's password:
Last login: Fri Mar 30 07:40:04 2018 from ::1
[kevin@centos6-test06 ~]$
|
5)如何限制root只能从kevin.com这台计算机使用ssh远程登录?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
因为
ssh
服务器的程序文件使用sshd,而sshd恰好支持PAM,验证以下:
[root@centos6-test06 ~]
# ldd /usr/sbin/sshd | grep libpam.so
libpam.so.0 =>
/lib64/libpam
.so.0 (0x00007f36f254d000)
修改
/etc/pam
.d
/sshd
,加入第二行,以下:
[root@centos6-test06 ~]
# vim /etc/pam.d/sshd
auth include system-auth
account required pam_access.so accessfile=
/etc/deny_sshd
account required pam_nologin.so
建立
/etc/deny_sshd
文件
[root@centos6-test06 ~]
# touch /etc/deny_sshd
[root@centos6-test06 ~]
# vim /etc/deny_sshd
-:root:ALL EXCEPT kevin.com
|