Linux では、PAM は動的にロード可能な検証モジュールを指します。検証内容を動的に変更できるため、ローカル システム管理者がプログラムの認証方法を自由に選択できる共有ライブラリのセットです。必要なため、検証の柔軟性が大幅に向上します。 PAM は、「/etc/pam.d/」配下の設定ファイルを使用して、プログラムの認証方法を管理します。アプリケーションは、対応する構成ファイルを呼び出して、ローカル認証モジュールを呼び出します。
#このチュートリアルの動作環境: linux7.3 システム、Dell G3 コンピューター。
Linux で一部のプログラムを実行する場合、これらのプログラムは実行前にまずプログラムを開始するユーザーを認証する必要があり、ログインや su などの特定の要件を満たした場合にのみ実行を許可する必要があります。 Linux における ID またはステータスの検証プロセスは PAM によって実行されます。PAM (Pluggable Authentication Modules) は検証モジュールを動的にロードできます。検証内容は必要に応じて動的に変更できるため、検証の柔軟性が向上します。大幅に改善されました。
1. PAM モジュールの概要
Linux-PAM (Linux Pluggable Authentication Module) は、ローカル システム管理を可能にする共有ライブラリのセットです。メンバーはプログラムの認証方法を自由に選択できます。つまり、PAM機能を含むアプリケーションを再コンパイル(書き換え)することなく、使用する認証機構を変更できるため、ローカル認証機構がバージョンアップされてもプログラムを変更する必要がありません。
PAM は、構成 /etc/pam.d/ 内のファイルを使用して、プログラムの認証方法を管理します。アプリケーションは、対応する構成ファイルを呼び出して、ローカル認証モジュールを呼び出します。モジュールは /lib/security に配置され、ダイナミック ライブラリとしてロードされます。su コマンドを使用すると、システムは root ユーザーのパスワードの入力を求めるプロンプトを表示します。これは、su コマンドが PAM モジュールを呼び出して行うことです。
#PAM モジュール タイプ#Linux-PAM には、4 つの異なるタスクを表す 4 つのモジュール タイプがあります。認証管理(auth)
##アカウント管理(アカウント)##セッション管理(セッション)
vi /etc/pam.d/system-auth
モジュールは主に 4 種類に分かれており、具体的な機能は次のとおりです。ユーザーのアイデンティティ。たとえば、ユーザーにパスワードの入力を求めるプロンプトを表示したり、ユーザーが root であるかどうかを判断したりできます。
auth モジュール: アカウントのさまざまな属性を確認します。例: ログインが許可されているかどうか、最大ユーザー数に達しているかどうか、または root ユーザーがこの端末からログインできるかどうかなど。
セッション モジュール: このモジュールは、ユーザーのログイン前およびログアウト後に実行される操作を定義するために使用されます。例: ログイン接続情報、ユーザー データのオープンとクローズ、ファイル システムのマウントなど。PAM 設定ファイルには次の 2 つの書き方があります:
/etc/pam.d/
ディレクトリに配置します。そのルールの内容にはサービス部分が含まれていません。つまり、サービス名が含まれておらず、/ etc/pam. d ディレクトリ内のファイル名がサービス名になります。例: vsftpd、login などですが、一番左のサービス リストがありません。例: /etc/pam.d/sshd上記の pam モジュール ファイルの内容から判断すると、pam 構成ファイルを 4 つの列に分割できます, Linux-PAM には 4 つのモジュール タイプがあり、4 つの異なるタスクを表します。認証管理 (認証) ) # 上記 4 つのモジュール タイプの詳細説明: auth: ユーザーとパスワードを確認し、権限を割り当てるために使用される認証インターフェイス モジュールのタイプを示します。 このようなモジュール 非認証ベースのアカウント管理を行います。これは主に、特定のサービス、現在有効なシステム リソース (最大ユーザー数) へのユーザーのアクセスを制限/許可し、ユーザーの場所を制限するために使用されます (例: root はコンソール経由でのみログインできます)。 ほとんどの場合、認証とアカウントはユーザーのログインとサービスの使用を制限するために一緒に使用されます。このような制限はより完全になります。たとえば、次のような具体例があります。ログインはアプリケーションです。ログインでは 2 つのタスクを完了する必要があります。最初にユーザーにクエリを実行し、次にシェル プログラムの提供などの必要なサービスをユーザーに提供します。通常、ログインでは、ユーザーは検証のために名前とパスワードを入力する必要があります。ユーザー名が入力されると、システムはそのユーザーが正規のユーザーであるかどうか、またそのユーザーがローカルまたはリモートのユーザー データベースに存在するかどうかを自然に比較します。アカウントが存在する場合、期限切れになりますか?これらのタスクはアカウント インターフェイスによって処理されます。 ユーザーが正常にログインできれば、認証とアカウントの作業が完了したことが証明されます。しかし、検証プロセス全体が完全に終わったわけではありません。他にも確認されていない問題がいくつかあるためです。たとえば、ユーザーがログインするためにサーバー上で同時に開くことができるウィンドウの数、ログイン後にユーザーが使用できる端末の数、ユーザーがアクセスできるリソースとアクセスできないリソースなどです。つまり、ログイン後のその後の検証や環境定義にも他のインターフェースが必要になります。これらは、以下で説明する 2 つのインターフェイスのセットです: session: セッション クラス インターフェイス。ユーザーのログイン成功から終了までのセッション制御を実装します。 ユーザーにサービスを提供する前/後に行う必要があるいくつかのことを処理します。含まれるもの:交換データ情報のオン/オフ、ディレクトリなどの監視、ユーザーセッション環境の設定など。つまり、システムが正式にサービスを提供する前の最後のステップです。 注: 上記のインターフェイスを使用する場合、各行に指定できるインターフェイスの種類は 1 つだけです。プログラムで複数のインターフェイスが必要な場合は、複数のインターフェイスで指定できます。行については別途定める。 2) 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的语法来设置控制标志,标志之间会以空格分开。格式如下: 其中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)模块路径 4)模块参数 三、PAM模块的工作原理和流程 以RHEL系统为例,当pam安装之后有两大部分:在/lib/security目录下的各种pam模块以及/etc/pam.d和/etc/pam.d目录下的针对各种服务和应用已经定义好的pam配置文件。当某一个有认证需求的应用程序需要验证的时候,一般在应用程序中就会定义负责对其认证的PAM配置文件。以vsftpd为例,在它的配置文件/etc/vsftpd/vsftpd.conf中就有这样一行定义: 表示登录FTP服务器的时候进行认证是根据/etc/pam.d/vsftpd文件定义的内容进行。 那么,当程序需要认证的时候已经找到相关的pam配置文件,认证过程是如何进行的?下面我们将通过解读/etc/pam.d/system-auth文件予以说明。 首先要声明一点的是:system-auth是一个非常重要的pam配置文件,主要负责用户登录系统的认证工作。而且该文件不仅仅只是负责用户登录系统认证,其它的程序和服务通过include接口也可以调用到它,从而节省了很多重新自定义配置的工作。所以应该说该文件是系统安全的总开关和核心的pam配置文件。 下面是/etc/pam.d/system-auth文件的全部内容: 第一部分表示,当用户登录的时候,首先会通过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 構成ファイル全体において、構成項目とモジュール呼び出しの論理シーケンスが非常に重要であることに注意する必要があります。 PAM は設定項目の順序に従って検証を実行するためです。モジュールの呼び出しシーケンスが正しくないと、重大なセキュリティ上の問題が発生したり、システム エラーが発生したりする可能性があります。したがって、PAM 構成を変更するときは、必ずこれを考慮してください。 4. 一般的に使用される PAM モジュールの紹介 #ユーザーにパスワードの入力を求めるプロンプトを表示します, そして、それを /etc/shadow ファイルと比較し、一致すると 0 password session password session 制御スイッチアプリケーションへのアクセス pam_limits .so 五、PAM模式使用说明 1)pam_access.so模块 pam_access.so模块主要的功能和作用是根据主机名(包括普通主机名或者FQDN)、IP地址和用户实现全面的访问控制。pam_access.so模块的具体工作行为根据配置文件/etc/security/access.conf来决定。该配置文件的主体包含了三个字段——权限、用户和访问发起方。格式上是一个用""隔开的表。 而且/etc/security/access.conf文件提供了很多范例供修改时参考,并且都给出了具体的说明,例如: 示例说明(vsftp): 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中有这样的一行配置: 表示当用户试图登录FTP服务器的时候,会调用pam_listfile.so模块来验证用户是否可以登录,这里item=user表示访问控制是基于user即用户实现的。那么哪些用户可以登录呢?就是除了file选项所定义的/etc/vsftpd/ftpusers文件之外的用户,这是由另外一个选项sense=deny所决定的。而在/etc/vsftpd/vsftpd.conf中明确指定了对用户的认证需要通过/etc/pam.d/vsftpd中的配置调用pam模块: 而恰好root用户又在/etc/vsftpd/ftpusers文件中,所以这成为了制约root登录FTP服务器的一个必要条件(但不是唯一条件)。所以针对这种情况,要开放和允许root用户登录FTP的权限,至少有三种改法: 不过需要注意的是,root用户比较特殊,因为它在vsftpd配置中的限制不仅仅来自于pam,vsftpd本身的配置中也对其做了限制。当我们看/etc/vsftpd/user_list文件的时候,还将会看到这样的配置说明: 表示当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。 其中: 而至于file文件的写法就简单了,每行一个用户或者组名称即可。所以,当需要对其它服务进行类似的访问控制的时候,就可以照葫芦画瓢。例如现在需要在SSH服务器上对ssh客户端实现基于用户的访问控制 示例说明一: 示例说明二: 在/etc/pam.d/sshd文件中添加一条(务必添加到文件的第一行!): 添加两个用户kevin和grace 编辑file指定的文件,添加上一个用户kevin(这一步是关键) 然后验证,发现使用kevin账号能正常ssh登录,使用grace账号就不能正常ssh登录了! 注:此处如果root也使用ssh远程连接,也会受到pam_listfile.so限制的。 温馨提示: 3)pam_limits.so模块 pam_limits.so模块的主要功能是限制用户会话过程中对各种系统资源的使用情况。缺省情况下该模块的配置文件是/etc/security/limits.conf。而该配置文件的基本格式实际上是由4个字段组成的表,其中具体限制的内容包括: 需要注意的是,如果没有任何限制可以使用"-"号,并且针对用户限制的优先级一般要比针对组限制的优先级更高。使用pam_limits.so模块的最常见的场景是在运行Oracle数据库的RHEL服务器中,因为一般Oracle数据库在安装之前,按照其官方文档的说明需要先对某些用户(Oracle)使用系统资源的情况进行限制。所以我们总是能够在Oracle数据库服务器的/etc/security/limits.conf文件中看到类似这样的配置: 结合上面的配置文件说明,可知Oracle数据库需要对Oracle用户使用资源的情况进行一些限制,包括: oracle用户最大能开启的进程数不超过16384,最大能打开的文件数不超过65536。 至于soft和hard的区别,不同于磁盘配额中的软限制和硬限制。普通用户可以调整自己的soft limit但最高不能超过hard limit,而且除了root以外的普通用户也不能够随意更改hard limit。该调整完成之后一般可以使用ulimit命令查看。 顺便提一下,针对nofile,这个只是基于用户层面的限制和调整方法。基于系统层面的限制和调整方法是修改/etc/sysctl.conf文件,直接改fs.file-max参数,调整之后sysctl –p生效。 示例说明: 4)pam_rootok.so模块 一般情况下,pam_rootok.so模块的主要作用是使uid为0的用户,即root用户能够直接通过认证而不用输入密码。pam_rootok.so模块的一个典型应用是插入到一些应用程序的认证配置文件中,当root用户执行这些命令的时候可以不用输入口令而直接通过认证。比如说"su"命令,为什么当以root用户执行"su"切换到普通用户身份的时候是不需要输入任何口令而可以直接切换过去?当我们查看一下/etc/pam.d/su文件的内容就不会奇怪了。因为该文件的第一行就是: この設定行をコメントアウトすると、root ユーザーとして通常のユーザーに切り替える場合でも、依然としてパスワードの入力が必要であることがわかります。 もう一つの方法は、上記の「十分」を「必須」に変更することです。このため、pam_rootok.so モジュールの検証に合格することが必要条件の 1 つになりました。 pam_rootok.so モジュールの別のアプリケーションは chfn コマンドにあります。 Chfn コマンドは、/etc/passwd のユーザー説明フィールドを変更するために使用されます。 rootでchfnコマンドを実行してユーザー情報を変更する場合、パスワードの入力は必要ありません。ただし、通常のユーザーとして chfn を実行する場合は、ユーザーの説明を変更する前にパスワードを入力する必要があります。これは実際には、/etc/pam.d/chfn 設定ファイルの最初の行で pam_rootok.so を呼び出した結果です。 ただし、設定の最初の行がコメントアウトされている場合でも、root ユーザーは chfn を通じて自分の情報を変更するときにパスワードを使用する必要はありません。ですので、効果はあまり分かりにくいと思います。主な理由は、多くの PAM モジュールが root ユーザーに制限を課さないことです。 説明例 (ユーザー間の su 切り替えコマンドを無効にする): su の欠点 /etc/pam.d/su ファイルに設定して、ユーザーによる su コマンドの使用を禁止できます a) 上で赤でマークされた 2 行はデフォルトの状態です (つまり、1 行目を開き、2 行目をコメント化します) 、 この状態では、すべてのユーザーが対話を許可されています su コマンドを使用して切り替えます。 (または、両方の行がコメント化されている場合、すべてのユーザーは su コマンドを使用できますが、su を使用して root 下の他の一般ユーザーに切り替えるにはパスワードの入力が必要です。最初の行がコメント化されていない場合、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用户认证。当然同时也可以在系统中通过对配置文件的定义和划分来实现对不同虚拟用户不同类型的访问控制。 6)pam_cracklib.so模块 pam_cracklib.so是一个常用并且非常重要的PAM模块。该模块主要的作用是对用户密码的强健性进行检测。即检查和限制用户自定义密码的长度、复杂度和历史等。如不满足上述强度的密码将拒绝用户使用。pam_cracklib.so比较重要和难于理解的是它的一些参数和计数方法,其常用参数包括: /etc/pam.d/login文件里包含了/etc/pam.d/system-auth文件的配置 如下看pam_cracklib.so的一个应用实例:在/etc/pam.d/system-auth中使用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用户下是无效的) ==========总结几个PAM模块比较常见的实操案例=========== 1)怎样才能强迫用户设置的密码不能与过去3次内的密码重复?(特别注意:/etc/pam.d/system-auth下的配置针对的是普通用户,在root用户下是无效的) 2)如何要求用户设置的密码必须至少包含5个数字和3个特殊符号? 3)如何限制kevin用户最多同时登陆4个?(同时可以限制root用户) 4)某用户连续登陆失败2次就锁定该账号,禁止登陆?(默认只能尝试登录三次,由retry=N决定的) 5)如何限制root只能从kevin.com这台计算机使用ssh远程登陆? 相关推荐:《Linux视频教程》 以上がLinux PAM とはどういう意味ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。[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
# 1) 最初の列: PAM モジュール タイプ
、
アカウント管理 (アカウント) 、 セッション管理 (セッション) および パスワード (パスワード) 管理 、タイプには複数の行が含まれる場合があります。順番に PAM モジュールによって呼び出されます。
このタイプのモジュールは、ユーザー認証に 2 つのサービスを提供します。ユーザーの正当性を確認するために、アプリケーションでユーザーにパスワードまたはその他のトークンの入力を求めるようにし、資格情報のアクセス許可を通じてグループ メンバーシップやその他の優先順位を設定します。
account: アカウント クラス インターフェイスを表し、主にアカウントの正当性の確認、アカウントの有効期限が切れているかどうか、システムにログインする権限があるかどうかなどを確認します。 ;
ユーザーが上記のログイン前提条件を満たしている場合、システムにログインできるパスワードを持っているかどうか、パスワードの有効期限が切れているかどうかなど。この作業は認証インターフェイスによって処理され、通常、ユーザーのパスワード情報が暗号化され、検証のためにローカル (/etc/shadow) またはリモート (ldap、kerberos など) のパスワード検証メソッドに提供されます。
password: パスワード クラス インターフェイス。ユーザーがパスワードを変更するプロセス全体を制御します。これは、一部の情報ではユーザー認証マークのアップグレードと呼ばれるものです。 value1 = action1 value2 = action2 ……
模块路径.即要调用模块的位置. 如果是64位系统,一般保存在/lib64/security,如: pam_unix.so,同一个模块,可以出现在不同的类型中.它在不同的类型中所执行的操作都不相同.这是由于每个模块,针对不同的模块类型,编制了不同的执行函数。
模块参数,即传递给模块的参数.参数可以有多个,之间用空格分隔开,如:password required pam_unix.so nullok obscure min=4 max=8 md5。pam_service_name=vsftpd
[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
#%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
##pam_unix.soPAM モジュール 結合管理タイプ #説明 ユーザーのアカウント情報を確認します (有効期限が切れているかどうかを含む)。アカウントが利用可能になった場合、0.#auth account ユーザーのパスワードを変更します。ユーザーが入力したパスワードを使用してシャドウ ファイルを更新します。ユーザーの新しいパスワードpassword pam_shells.so auth account ユーザーがログを取得したい場合システムに追加する場合、そのシェルは /etc/shell pam_deny.so account auth にある必要があります。シェル ファイルの 1 つで pam_permit.so auth authaccount pam_securetty.so authユーザーが root としてログインしたい場合は、ログインした tty が /etc/securetty.## にある必要があります。 #pam_listfile.so account password session pam_cracklib.sopassword このモジュールはプログラムのパスワード スタックに挿入し、チェックするために使用できます。パスワードの強度。 session システム リソース使用量の上限を定義します。root ユーザーは、 /etc/security/limits.conf または /etc/security/limits.d/ *.conf を介して渡すことで、 を設定できます。
第一个字段:权限(permission),使用"+"表示授予权限,用"-"表示禁止权限。
第二个字段:用户(user),定义了用户、组以及用"@"表示的在不同主机上的同名用户和同一主机上不同名用户。
第三个字段:访问发起方(origins),定义了发起访问的主机名称、域名称、终端名称。#禁止非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
如果要在网络内架设一个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可以实现所需的效果。
[root@centos6-test06 ~]# cat /etc/pam.d/vsftpd
......
auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
[root@centos6-test06 ~]# cat /etc/vsftpd/vsftpd.conf |grep pam_service_name
pam_service_name=vsftpd
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@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.
........
........
a)item=[tty|user|rhost|ruser|group|shell]:定义了对哪些列出的目标或者条件采用规则,显然,这里可以指定多种不同的条件。
b)onerr=succeed|fail:定义了当出现错误(比如无法打开配置文件)时的缺省返回值。
c)sense=allow|deny:定义了当在配置文件中找到符合条件的项目时的控制方式。如果没有找到符合条件的项目,则一般验证都会通过。
d)file=filename:用于指定配置文件的全路径名称。
e)apply=user|@group:定义规则适用的用户类型(用户或者组)。
不允许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远程登录。做法如下:
auth required pam_listfile.so item=user sense=allow file=/etc/sshdusers onerr=succeed[root@centos6-test06 ~]# useradd kevin
[root@centos6-test06 ~]# passwd kevin
[root@centos6-test06 ~]# useradd grace
[root@centos6-test06 ~]# passwd grace
[root@centos6-test06 ~]# echo "kevin" >/etc/sshdusers //文件/etc/sshdusers是在上面添加到/etc/pam.d/sshd中定义的
[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.
如果发生错误,Linux-PAM 可能会改变系统的安全性。这取决于你自己的选择,你可以选择不安全(开放系统)和绝对安全(拒绝任何访问)。通常,Linux-PAM 在发生错误时,倾向于后者。任何的配置错误都可能导致系统整个或者部分无法访问。配置 Linux-PAM 时,可能遇到最大的问题可能就是 Linux-PAM 的配置文件/etc/pam.d/*被删除了。如果发生这种事情,你的系统就会被锁住。有办法可以进行恢复,最好的方法就是用一个备份的镜像来恢复系统,或者登录进单用户模式然后进行正确的配置。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——最大锁定文件数目
[root@centos6-test06 ~]# vim /etc/security/limits.conf
.......
oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536
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登录,则不受限制!
[root@centos6-test06 ~]# cat /etc/pam.d/su
......
auth sufficient pam_rootok.so
1) 安全でない su ツールは、複数人が関わるシステム管理には最適ではありません。su は 1 人か 2 人が管理に参加するシステムにのみ適しています。結局のところ、su は一般ユーザーがそれを使用することを許可できません。制限された方法; スーパーユーザーの root パスワードは少数のユーザーが所有する必要があります。
2) 問題: root パスワードは、root 権限を必要とするすべての人に通知する必要があります。
[root@centos6-test06 ~]# vim /etc/pam.d/su
auth fully pam_rootok.so
# 次の行のコメントを外して、「wheel」グループのユーザーを暗黙的に信頼します。
#auth fully pam_wheel.so trust use_uid
#次の行は、ユーザーが「wheel」グループに所属することを要求します。
#auth required pam_wheel.so use_uid
........
b) 2 行目 、 を開いた場合これは、root ユーザーと Wheel グループ内のユーザーのみが su コマンドを使用できることを意味します。
c) 最初の行 と をコメントにして 2 行目をオンにすると、wheel グループのユーザーのみが使用できることを意味しますsu コマンド、root ユーザーは su コマンドも無効になります。 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个指定的字符!!
同时建议重启系统使之生效!
[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
[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模块在系统安全管理策略和管理中的用途是非常重要和广泛的。
当需要限定用户在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
修改/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
修改/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个特殊字符不能全部放在一起!!
这需要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
现在很多地方都有限制用户登录的功能,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 ~]$
由于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