Linux에서 PAM은 동적으로 로드 가능한 검증 모듈을 의미합니다. 이는 검증 내용이 필요에 따라 동적으로 변경될 수 있기 때문에 로컬 시스템 관리자가 프로그램의 인증 방법을 마음대로 선택할 수 있는 공유 라이브러리 집합입니다. 검증 유연성이 크게 향상됩니다. PAM은 "/etc/pam.d/" 아래의 구성 파일을 사용하여 프로그램의 인증 방법을 관리합니다. 애플리케이션은 해당 구성 파일을 호출하여 로컬 인증 모듈을 호출합니다.
이 튜토리얼의 운영 환경: linux7.3 시스템, Dell G3 컴퓨터.
Linux에서 일부 프로그램을 실행할 때 이러한 프로그램은 실행하기 전에 먼저 해당 프로그램을 시작한 사용자를 인증해야 하며 로그인, su 등 특정 요구 사항을 충족한 후에만 실행을 허용해야 합니다. Linux의 신원 또는 상태 확인 프로세스는 PAM에 의해 수행됩니다. PAM(플러그형 인증 모듈)은 필요에 따라 확인 내용을 동적으로 변경할 수 있으므로 확인 유연성이 크게 향상될 수 있습니다.
1. PAM 모듈 소개
Linux-PAM(리눅스 플러그 가능 인증 모듈)은 로컬 시스템 관리자가 프로그램의 인증 방법을 마음대로 선택할 수 있는 공유 라이브러리 집합입니다. 즉, PAM 기능이 포함된 응용 프로그램을 다시 컴파일(다시 작성)하지 않고도 사용하는 인증 메커니즘을 변경할 수 있습니다. 이러한 방식으로 로컬 인증 메커니즘이 업그레이드되더라도 프로그램을 수정할 필요가 없습니다.
PAM은 /etc/pam.d/ 구성에 있는 파일을 사용하여 프로그램의 인증 방법을 관리합니다. 애플리케이션은 해당 구성 파일을 호출하여 로컬 인증 모듈을 호출합니다. 모듈은 /lib/security에 위치하며 su 명령을 사용하면 루트 사용자의 비밀번호를 입력하라는 메시지가 표시됩니다. 이것이 su 명령이 PAM 모듈을 호출하여 수행하는 작업입니다.
PAM 모듈 유형
Linux-PAM에는 4가지 다른 작업을 나타내는 4가지 모듈 유형이 있습니다.
인증 관리(auth)
계정 관리(account)
세션 관리( 세션)
비밀번호 관리
한 유형에는 PAM 모듈에 의해 순서대로 호출되는 여러 줄이 있을 수 있습니다.
vi /etc/pam.d/system-auth
아래와 같이:
구성은 기본적으로 모듈 이름, 제어, 모듈 라이브러리 파일 및 매개 변수의 네 가지 열로 나뉩니다.
모듈은 크게 네 가지 유형으로 나뉘며, 구체적인 기능은 다음과 같습니다.
인증 모듈: 사용자의 신원을 식별하는 데 사용됩니다. 예를 들어 사용자에게 비밀번호를 입력하라는 메시지를 표시하거나 사용자가 루트인지 확인하는 등의 작업을 수행합니다.
인증 모듈: 계정의 다양한 속성을 확인합니다. 예: 로그인 허용 여부, 최대 사용자 수에 도달했는지 여부, 루트 사용자가 이 터미널에서 로그인할 수 있는지 여부 등.
세션 모듈: 이 모듈은 사용자가 로그인하기 전과 사용자가 로그아웃한 후에 수행할 작업을 정의하는 데 사용됩니다. 예: 로그인 연결 정보, 사용자 데이터 열기 및 닫기, 파일 시스템 마운트 등
비밀번호 모듈: 사용자 정보로 업데이트합니다. 예: 사용자 비밀번호를 변경합니다.
요약: auth, account, 비밀번호, 세션, auth는 식별자로서 수행할 작업을 설명하며, auth는 로그인 시 확인을 처리하고, 계정, 비밀번호, 세션 및 로그인 시 확인은 비밀번호와 같이 아무 관련이 없습니다. 비밀번호를 변경하면 발생합니다.
2.PAM 구성 파일 설명
PAM 구성 파일은 다음과 같은 두 가지 작성 방법이 있습니다.
1) /etc/pam.conf 파일에 작성되지만 centos6 이후 시스템에서는 파일이 하나도 남지 않았습니다.
2) PAM 구성 파일을 /etc/pam.d/ 디렉터리에 배치합니다. 해당 규칙 콘텐츠에는 서비스 부분이 포함되지 않습니다. 즉, 서비스 이름과 파일 이름이 포함되지 않습니다. /etc/pam.d 디렉토리 서비스 이름입니다. 예: vsftpd, login 등. 그러나 가장 왼쪽 서비스 목록이 누락되었습니다. 예: /etc/pam.d/sshd
[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 구성 파일을 4개의 열로 나눌 수 있습니다,
1) 첫 번째 열: PAM 모듈 유형
Linux-PAM에는 네 가지 다른 작업을 나타내는 네 가지 모듈 유형이 있습니다.
인증 관리( auth), 계정 관리(account), 세션 관리(session), password(비밀번호) 관리 유형은 여러 줄로 구성될 수 있으며 PAM 모듈에 의해 순차적으로 호출됩니다.
위의 네 가지 모듈 유형에 대한 추가 설명:
auth: 사용자 및 비밀번호를 확인하고 권한을 할당하는 데 사용되는 인증 인터페이스 모듈 유형을 나타냅니다.
이 유형은 모듈이 제공합니다. 사용자 인증을 위한 두 가지 서비스. 애플리케이션이 사용자의 자격 증명 권한을 통해 그룹 멤버십이나 기타 우선 순위를 설정하기 위해 사용자에게 비밀번호나 기타 토큰을 묻는 메시지를 표시하도록 합니다.
account: 주로 계정의 적법성 확인, 계정 만료 여부, 시스템 로그인 권한 여부 등을 확인하는 계정 인터페이스를 나타냅니다.
이 모듈은 다음을 수행합니다. 비인증 기반의 계정 관리. 주로 사용자가 특정 서비스에 액세스하도록 제한/허용하고, 현재 유효한 시스템 리소스(최대 사용자 수) 및 사용자 위치를 제한하는 데 사용됩니다(예: 루트는 콘솔을 통해서만 로그인할 수 있음).
대부분의 경우 사용자의 로그인 및 서비스 이용을 제한하기 위해 인증과 계정을 함께 사용합니다. 그러한 제한은 더 완전할 것입니다. 예를 들어, 다음은 구체적인 예입니다. 로그인은 애플리케이션입니다. 로그인은 두 가지 작업을 완료해야 합니다. 먼저 사용자에게 쿼리한 다음 사용자에게 쉘 프로그램 제공과 같은 필수 서비스를 제공해야 합니다. 일반적으로 로그인하려면 사용자가 확인을 위해 이름과 비밀번호를 입력해야 합니다. 사용자 이름을 입력하면 시스템은 해당 사용자가 합법적인 사용자인지, 로컬 또는 원격 사용자 데이터베이스에 존재하는지를 자연스럽게 비교합니다. 계정이 존재하는 경우 만료됩니까? 이러한 작업은 계정 인터페이스에서 처리됩니다.
사용자가 위의 로그인 전제 조건을 충족하는 경우 시스템에 로그인할 수 있는 비밀번호가 있는지, 비밀번호가 만료되었는지 등이 확인됩니다. 이 작업은 일반적으로 사용자 비밀번호 정보를 암호화하고 이를 로컬(/etc/shadow) 또는 원격(ldap, kerberos 등) 비밀번호 확인 방법에 제공하여 확인하는 인증 인터페이스에 의해 처리됩니다.
사용자가 성공적으로 로그인할 수 있다면 인증 및 계정 작업이 완료된 것입니다. 하지만 모든 검증 과정이 완전히 끝난 것은 아닙니다. 확인되지 않은 다른 문제가 있기 때문입니다. 예를 들어, 사용자가 로그인하기 위해 동시에 서버에서 몇 개의 창을 열 수 있는지, 로그인 후 얼마나 오랫동안 사용할 수 있는지, 사용자가 액세스할 수 있는 리소스와 액세스할 수 없는 리소스 등이 있습니다. 즉, 로그인 후 후속 검증 및 환경 정의에도 다른 인터페이스가 필요합니다. 아래에서 언급할 두 가지 인터페이스 세트는 다음과 같습니다.
세션: 세션 인터페이스. 성공적인 사용자 로그인부터 종료까지 세션 제어를 구현합니다.
사용자에게 서비스를 제공하기 전/후에 수행해야 할 몇 가지 작업을 처리합니다. 포함 사항: 교환 데이터 정보 켜기/끄기, 디렉터리 모니터링 등, 사용자 세션 환경 설정 등 즉, 이는 시스템이 공식적으로 서비스를 제공하기 전 마지막 단계이다.
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的语法来设置控制标志,标志之间会以空格分开。格式如下:
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。
三、PAM模块的工作原理和流程
以RHEL系统为例,当pam安装之后有两大部分:在/lib/security目录下的各种pam模块以及/etc/pam.d和/etc/pam.d目录下的针对各种服务和应用已经定义好的pam配置文件。当某一个有认证需求的应用程序需要验证的时候,一般在应用程序中就会定义负责对其认证的PAM配置文件。以vsftpd为例,在它的配置文件/etc/vsftpd/vsftpd.conf中就有这样一行定义:
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文件的全部内容:
[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的配置文件进行修改以满足不同的认证需求,例如下面的例子:
#%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 | 사용자 비밀번호를 수정합니다. 사용자가 입력한 비밀번호를 사용자의 새 비밀번호 | |||
pam_shells.so | auth 계정 | 으로 섀도우 파일을 업데이트하세요. 시스템에 대한 쉘은 /etc/shells 파일에 있어야 합니다. 쉘 중 하나 | ||
pam_deny.so | account auth password session | 이 모듈을 사용하여 거부할 수 있습니다. access | ||
pam_permit.so | auth account 비밀번호 session | 모듈은 언제든지 성공을 반환합니다. | ||
pam_securetty.so | auth | 사용자가 로그인을 원하는 경우 루트로 로그인한 tty는 /etc/securetty에 있어야 합니다. | ||
pam_listfile.so | auth account password 세션 | 응용 프로그램의 액세스 제어 스위치 | ||
pam_cracklib.so | password | 이 모듈은 프로그램의 비밀번호 스택에 삽입할 수 있습니다. | ||
pam_limits.so | session | 시스템 리소스 사용의 상한을 정의하세요. 루트 사용자에게도 이 제한이 적용됩니다. /etc/security/limits.conf 또는 /etc/security/limits.d/*.conf를 전달하여 |
五、PAM模式使用说明
1)pam_access.so模块
pam_access.so模块主要的功能和作用是根据主机名(包括普通主机名或者FQDN)、IP地址和用户实现全面的访问控制。pam_access.so模块的具体工作行为根据配置文件/etc/security/access.conf来决定。该配置文件的主体包含了三个字段——权限、用户和访问发起方。格式上是一个用""隔开的表。
第一个字段:权限(permission),使用"+"表示授予权限,用"-"表示禁止权限。
第二个字段:用户(user),定义了用户、组以及用"@"表示的在不同主机上的同名用户和同一主机上不同名用户。
第三个字段:访问发起方(origins),定义了发起访问的主机名称、域名称、终端名称。
而且/etc/security/access.conf文件提供了很多范例供修改时参考,并且都给出了具体的说明,例如:
#禁止非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)修改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中有这样的一行配置:
[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模块:
[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)修改/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文件的时候,还将会看到这样的配置说明:
[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)针对这种需求只需要更改/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
[root@centos6-test06 ~]# useradd kevin [root@centos6-test06 ~]# passwd kevin [root@centos6-test06 ~]# useradd grace [root@centos6-test06 ~]# passwd grace
编辑file指定的文件,添加上一个用户kevin(这一步是关键)
[root@centos6-test06 ~]# echo "kevin" >/etc/sshdusers //文件/etc/sshdusers是在上面添加到/etc/pam.d/sshd中定义的
然后验证,发现使用kevin账号能正常ssh登录,使用grace账号就不能正常ssh登录了!
[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个字段组成的表,其中具体限制的内容包括:
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文件中看到类似这样的配置:
[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服务器时的最大连接数(防止同一个用户开启过多的登录进程)。限制操作如下:
由于/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文件的内容就不会奇怪了。因为该文件的第一行就是:
[root@centos6-test06 ~]# cat /etc/pam.d/su ...... auth sufficient pam_rootok.so
이 구성 줄을 주석으로 처리하면 루트 사용자로 일반 사용자로 전환하더라도 여전히 비밀번호를 입력해야 한다는 것을 알 수 있습니다.
또 다른 방법은 위의 "충분함"을 "필수"로 변경하는 것입니다. 이로 인해 pam_rootok.so 모듈 검증을 통과하는 것이 필수 조건 중 하나가 되었습니다.
pam_rootok.so 모듈의 또 다른 응용 프로그램은 chfn 명령에 있습니다. Chfn 명령은 /etc/passwd의 사용자 설명 필드를 변경하는 데 사용됩니다. 사용자 정보를 수정하기 위해 루트로 chfn 명령을 실행하는 경우 비밀번호를 입력할 필요가 없습니다. 그러나 일반 사용자로 chfn을 실행하는 경우 사용자 설명을 변경하기 전에 비밀번호를 입력해야 합니다. 이는 실제로 /etc/pam.d/chfn 구성 파일의 첫 번째 줄에서 pam_rootok.so를 호출한 결과입니다.
그러나 구성의 첫 번째 줄이 주석 처리되더라도 루트 사용자는 chfn을 통해 자신의 정보를 수정할 때 비밀번호를 사용할 필요가 없습니다. 그래서 효과가 그다지 뚜렷하지 않은 것 같아요. 주된 이유는 많은 PAM 모듈이 루트 사용자에게 제한을 두지 않기 때문입니다.
예제 설명(사용자 간 su 전환 명령 비활성화):
su
1의 단점 1) 안전하지 않은 su 도구는 여러 사람이 참여하는 시스템 관리에서 최선의 선택이 아니며 su만이 적합합니다. 결국 한두 사람이 관리에 참여하는 시스템의 경우 su는 일반 사용자가 제한된 방식으로 이를 사용하도록 허용할 수 없습니다.
2) 문제: 루트 권한이 필요한 모든 사람에게 루트 비밀번호를 알려야 합니다.
사용자가 su 명령을 사용하지 못하도록 /etc/pam.d/su 파일을 설정할 수 있습니다
[root@centos6-test06 ~]# vim /etc/pam.d/su
auth 충분 pam_rootok.so
# "wheel" 그룹의 사용자를 암시적으로 신뢰하려면 다음 줄의 주석 처리를 제거하세요.
#auth 충분함 pam_wheel.so trust use_uid
# 사용자가 "wheel" 그룹에 속하도록 요구하려면 다음 줄의 주석 처리를 해제하세요.
#auth 필수 pam_wheel.so use_uid
......
a) 위에서 빨간색으로 표시된 두 줄이 기본 상태입니다(즉, 첫 번째 줄을 활성화하고 두 번째 줄에 주석 처리) , 이 상태 다음은 모든 사용자가 su 명령을 사용하여 전환할 수 있도록 허용합니다! (또는 두 줄 모두 주석 처리된 경우 모든 사용자는 su 명령을 사용할 수 있지만 su를 사용하여 루트에서 다른 일반 사용자로 전환하려면 비밀번호를 입력해야 합니다. 첫 번째 줄에 주석 처리가 되어 있지 않으면 루트는 다음 작업을 수행할 때 비밀번호를 입력할 필요가 없습니다. su를 사용하여 일반 사용자로 전환)
b) 두 번째 줄 이 켜져 있으면 은 루트 사용자와 휠 그룹의 사용자만 su 명령을 사용할 수 있다는 의미입니다.
c) 첫 번째 줄에 주석을 달고 두 번째 줄을 활성화하면 휠 그룹에 속한 사용자만 su 명령을 사용할 수 있으며 루트 사용자도 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用户认证。当然同时也可以在系统中通过对配置文件的定义和划分来实现对不同虚拟用户不同类型的访问控制。
6)pam_cracklib.so模块
pam_cracklib.so是一个常用并且非常重要的PAM模块。该模块主要的作用是对用户密码的强健性进行检测。即检查和限制用户自定义密码的长度、复杂度和历史等。如不满足上述强度的密码将拒绝用户使用。pam_cracklib.so比较重要和难于理解的是它的一些参数和计数方法,其常用参数包括:
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文件的配置
[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来限制用户修改自己密码时必须满足一定的强健性要求。
[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接口处增加:
[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用户下是无效的)
修改/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个特殊符号?
修改/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用户)
这需要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决定的)
现在很多地方都有限制用户登录的功能,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远程登陆?
由于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
相关推荐:《Linux视频教程》
위 내용은 리눅스 팸은 무슨 뜻인가요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!