PAM身份验证安全配置实例

- 强制使用强密码(用户密码安全配置)

- 用户SSH登录失败尝试次数超出限制后锁定账户(帐户锁定/解锁和时间设置)

- 允许普通用户使用sudo而不是su(限制普通用户登录到root用户)

- 禁止直接使用root用户通过SSH登录

pwgen复杂密码随机生成工具

关于PAM

Linux-PAM (Pluggable Authentication Modules for Linux)可插拔认证模块。Linux-PAM是一套适用于Linux的身份验证共享库系统,它为系统中的应用程序或服务提供动态身份验证模块支持。在Linux中,PAM是可动态配置的,本地系统管理员可以自由选择应用程序如何对用户进行身份验证。PAM应用在许多程序与服务上,比如登录程序(login、su)的PAM身份验证(口令认证、限制登录),passwd强制密码,用户进程实时管理,向用户分配系统资源等。

PAM的主要特征是认证的性质是可动态配置的。PAM的核心部分是库(libpam)和PAM模块的集合,它们是位于文件夹/lib/security/中的动态链接库(.so)文件,以及位于/etc/pam.d/目录中(或者是/etc/pam.conf配置文件)的各个PAM模块配置文件。/etc/pam.d/目录中定义了各种程序和服务的PAM配置文件,其中system-auth文件是PAM模块的重要配置文件,它主要负责用户登录系统的身份认证工作,不仅如此,其他的应用程序或服务可以通过include接口来调用它(该文件是system-auth-ac的软链接)。此外password-auth配置文件也是与身份验证相关的重要配置文件,比如用户的远程登录验证(SSH登录)就通过它调用。而在Ubuntu、SuSE Linux等发行版中,PAM主要配置文件是common-auth、common-account、common-password、common-session这四个文件,所有的应用程序和服务的主要PAM配置都可以通过它们来调用。

使用如下命令判断程序是否使用了PAM:

root@HMing ~ # ldd /usr/bin/passwd | grep libpam

libpam_misc.so.0 => /lib64/libpam_misc.so.0 (0x00007fb74f748000)

libpam.so.0 => /lib64/libpam.so.0 (0x00007fb74eb45000)

如看到有类似的输出,说明该程序使用了PAM,没有输出,则没有使用。

PAM身份验证配置文件

/etc/pam.d/目录包含应用程序的PAM配置文件。例如,login程序将其程序/服务名称定义为login,与之对应的PAM配置文件为/etc/pam.d/login。

PAM配置文件语法格式

每个PAM配置文件都包含一组指令,用于定义模块以及控制标志和参数。每条指令都有一个简单的语法,用于标识模块的目的(接口)和模块的配置设置,语法格式如下:

module_interface      control_flag      module_name  module_arguments

如在/etc/pam.d/password-auth-ac配置文件中(CentOS),其中一行PAM模块接口定义如下

PAM模块接口(模块管理组)

PAM为认证任务提供四种类型可用的模块接口,它们分别提供不同的认证服务:

√ auth - 认证模块接口,如验证用户身份、检查密码是否可以通过,并设置用户凭据
√ account - 账户模块接口,检查指定账户是否满足当前验证条件,如用户是否有权访问所请求的服务,检查账户是否到期
√ password  - 密码模块接口,用于更改用户密码,以及强制使用强密码配置
√ session - 会话模块接口,用于管理和配置用户会话。会话在用户成功认证之后启动生效

单个PAM库模块可以提供给任何或所有模块接口使用。例如,pam_unix.so提供给四个模块接口使用。

PAM控制标志

所有的PAM模块被调用时都会返回成功或者失败的结果,每个PAM模块中由多个对应的控制标志决定结果是否通过或失败。每一个控制标志对应一个处理结果,PAM库将这些通过/失败的结果整合为一个整体的通过/失败结果,然后将结果返回给应用程序。模块可以按特定的顺序堆叠。控制标志是实现用户在对某一个特定的应用程序或服务身份验证的具体实现细节。该控制标志是PAM配置文件中的第二个字段,PAM控制标志如下:

> required  - 模块结果必须成功才能继续认证,如果在此处测试失败,则继续测试引用在该模块接口的下一个模块,直到所有的模块测试完成,才将结果通知给用户。
> requisite  - 模块结果必须成功才能继续认证,如果在此处测试失败,则会立即将失败结果通知给用户。
> sufficient  - 模块结果如果测试失败,将被忽略。如果sufficient模块测试成功,并且之前的required模块没有发生故障,PAM会向应用程序返回通过的结果,不会再调用堆栈中其他模块。
> optional  - 该模块返回的通过/失败结果被忽略。当没有其他模块被引用时,标记为optional模块并且成功验证时该模块才是必须的。该模块被调用来执行一些操作,并不影响模块堆栈的结果。
> include - 与其他控制标志不同,include与模块结果的处理方式无关。该标志用于直接引用其他PAM模块的配置参数

PAM配置方法

所有的PAM配置方法都在man手册中有说明,比如要查找某个程序支持PAM模块的配置,可以使用man 加模块名(去掉.so)查找说明,如# man pam_unix。(模块名可以在目录/lib/security/或/lib64/security/中找到。)

PAM身份验证安全配置实例

一、强制使用强密码(用户密码安全配置)

PAM配置文件:/etc/pam.d/system-auth-ac

模块名称:pam_cracklib(仅适用于password模块接口)

模块参数:

minlen=12       密码字符长度不少于12位(默认为9)

lcredit=-1      至少包含1个小写字母

ucredit=-1      至少包含1个大写字母

dcredit=-1      至少包含1个数字

ocredit=-1      至少包含1个特殊字符

retry=3         配置密码时,提示3次用户密码错误输入

difok=6         配置密码时,新密码中至少6个字符与旧密码不同(默认为5)

其他常用参数:

reject_username    新密码中不能包含与用户名称相同的字段

maxrepeat=N        拒绝包含超过N个连续字符的密码,默认值为0表示此检查已禁用

maxsequence=N      拒绝包含大于N的单调字符序列的密码,例如’1234’或’fedcb’,默认情况下即使没有这个参数配置,一般大多数这样的密码都不会通过,除非序列只是密码的一小部分

maxcla***epeat=N   拒绝包含相同类别的N个以上连续字符的密码。默认值为0表示此检查已禁用。

use_authtok        强制使用先前的密码,不提示用户输入新密码(不允许用户修改密码)

模块名称:pam_unix (适用于account,auth, password和session模块接口)

模块参数:

remember=N     保存每个用户使用过的N个密码,强制密码不能跟历史密码重复

其他常见参数:

sha512          当用户下一次更改密码时,使用SHA256算法进行加密

md5             当用户更改密码时,使用MD5算法对其进行加密。

try_first_pass  在提示用户输入密码之前,模块首先尝试先前的密码,以测试是否满足该模块的需求。

use_first_pass  该模块强制使用先前的密码(不允许用户修改密码),如果密码为空或者密码不对,用户将被拒绝访问

shadow          用户保护密码

nullok          默认不允许空密码访问服务

use_authtok     强制使用先前的密码,不提示用户输入新密码(不允许用户修改密码)

例 修改配置/etc/pam.d/system-auth-ac文件,在password模块接口行修改或添加配置参数如下:

password    requisite     pam_cracklib.so try_first_pass retry=3 type= reject_username minlen=12 lcredit=-1 ucredit=-1 dcredit=-1 ocredit=-1 difok=6

修改后的/etc/pam.d/system-auth-ac配置文件如下图所示

需要注意的是,我在这里展示的是在RHEL/CentOS下的配置,passwd程序的PAM配置文件涉及主配置文件/etc/pam.d/passwd和/etc/pam.d/system-auth-ac(也可以是/etc/pam.d/password-auth-ac),其中/etc/pam.d/passwd配置文件默认只包含了/etc/pam.d/system-auth-ac配置文件,因此对于以上PAM身份验证密码模块配置,只修改/配置该文件即可。或者在Ubuntu中,配置文件包括:/etc/pam.d/common-password、/etc/pam.d/common-account、/etc/pam.d/common-auth、/etc/pam.d/common-session。

测试PAM配置:

登录(su)普通用户使用passwd程序更新密码,如果输入的密码不符合要求,将不能修改

1
2
3
4
5
6
7
8
9
10
11
12
root@HMing ~ # su - hm      #登录到hm用户
hm@HMing ~ $ passwd         #修改密码
Changing password for user hm.
Changing password for hm.
(current) UNIX password:    #提示输入旧密码
New password:               #提示输入新密码,如果不满足要求,将会提示相关错误信息
Password unchanged
New password: 
BAD PASSWORD: is too simple
New password:               #当输入的密码满足要求时,才提示再次输入
Retype new password: 
passwd: all authentication tokens updated successfully.

二、用户SSH登录失败尝试次数超出限制后锁定账户(帐户锁定/解锁和时间设置)

为了进一步提高安全性,可以指定超过失败登录尝试次数后锁定用户。用户账户可以被解锁(可以由root用户主动解锁),或者在设定的时间后自动解锁。如在三次失败的登录尝试后锁定用户十分钟。需要在/etc/pam.d/password-auth-ac(或者在/etc/pam.d/sshd)文件添加以下参数:

auth        required      pam_tally2.so deny=3 unlock_time=600 onerr=succeed file=/var/log/tallylog

在Ubuntu、SuSE Linux中,需要修改/etc/pam.d/common-auth配置文件

另外,使用PAM还可以限制在console控制台上登录,需要修改/etc/pam.d/system-auth配置文件(或者/etc/pam.d/login),添加如上auth配置字段即可。

一旦用户失败登录尝试次数达到3次,该帐户立刻被锁定,除非root用户解锁。root用户下使用如下命令解锁用户:

1
# pam_tally2 -u username -r --reset

查看用户登录失败信息:

1
# pam_tally2 -u username

如果要在3次失败登录尝试后永久锁定用户,那么需要删除unlock_time字段,除非root用户解锁该账户,否则将永久锁定。

pam_tally/pam_tally2模块参数:

全局选项

onerr=[succeed|fail]

file=/path/to/log   失败登录日志文件,默认为/var/log/tallylog

audit               如果登录的用户没有找到,则将用户名信息记录到系统日志中

silent              不打印相关的信息

no_log_info         不通过syslog记录日志信息

AUTH选项

deny=n              失败登录次数超过n次后拒绝访问

lock_time=n         失败登录后锁定的时间(秒数)

unlock_time=n       超出失败登录次数限制后,解锁的时间

no_lock_time        不在日志文件/var/log/faillog 中记录.fail_locktime字段

magic_root          root用户(uid=0)调用该模块时,计数器不会递增

even_deny_root      root用户失败登录次数超过deny=n次后拒绝访问

root_unlock_time=n  与even_deny_root相对应的选项,如果配置该选项,则root用户在登录失败次数超出限制后被锁定指定时间

三、允许普通用户使用sudo而不是su(限制普通用户登录到root用户)

Linux系统上默认存在一个wheel组,用于限制普通用户通过su登录到root用户,只有属于wheel组的用户成员才能使用su。但是在默认情况下,系统并没有启用这个功能,我们可以通过PAM启用它,或者修改为指定的组/用户使用su,当然指定为什么组可以按照要求而定。该配置通过pam_wheel模块指定。

首先启用whell组,使得只属于wheel组的用户可以使用su命令

需要在/etc/pam.d/su配置文件添加以下配置:

auth            required        pam_wheel.so use_uid

需要注意应该将这一行参数添加在/etc/pam.d/su文件的首部,否则PAM模块可能会跳过该项检查。配置完之后,我们就可以将需要用su权限的用户添加到wheel组中,如下:

1
# usermod -a -G wheel username

其次,如果你不想使用wheel组,而是使用其他的组代替,比如指定组名为myadmingroup的组拥有su的权限,需要这么做:

auth            required        pam_wheel.so use_uid group=myadmingroup

最后配置指定用户拥有sudo权限,要知道我们的目的是尽量少使用root身份的权限,sudo可以让用户仅仅在需要调用root用户权限的情况下调用。我们可以指定特定的组/用户使用sudo(不需要root密码)调用root权限。visudo打开配置文件:

hmm    ALL=(ALL)     NOPASSWD: ALL   #允许hmm用户通过sudo执行任何命令(不需要输入密码)

%wheel  ALL=(ALL)    ALL             #允许wheel组成员使用sudo执行任何命令(需要输入密码)

四、禁止直接使用root用户通过SSH登录

在/etc/pam.d/password-auth-ac或者/etc/pam.d/sshd配置文件中添加以下配置(该配置禁止SSH的口令认证,但仍然可以使用SSH密钥登录)

auth        required      pam_securetty.so

此外还可以配置/etc/securetty 文件禁止root用户通过所有tty终端登录系统

1
2
# cp /etc/securetty /etc/securetty.saved
# echo "" >/etc/securetty

五、pwgen复杂密码随机生成工具

pwgen是一个在Linux随机生成密码的工具,在CnetOS6下安装:

1
2
# rpm -ivh https://mirrors.aliyun.com/epel/epel-release-latest-6.noarch.rpm
# yum install pwgen

使用pwgen命令随机生成字符长度为12的密码

# pwgen -s 12 -c -n -y

-n  至少包含一个数字

-c  至少包含一个大写字母

-y  至少包含一个特殊字符

-s  完全随机生成密码

Linux安全策略配置-pam_tally2身份验证模块的更多相关文章

  1. Windows 10提示你不能访问此共享文件夹,因为你组织的安全策略阻止未经身份验证的来宾访问

    Windows 10提示你不能访问此共享文件夹,因为你组织的安全策略阻止未经身份验证的来宾访问 1.首先按window+R键打开运行.如下图 2.在运行中输入“gpedit.msc”来启动本地组策略编 ...

  2. Github官方app分析——用户身份验证模块

    这篇文章记述的是我对Giuhub官方app的用户身份验证模块的分析. Giuhub的官方app虽然是一个非常小众的程序,但是从程序的设计的角度看,这是一个非常优秀的项目.对于其用户身份验证模块,给我留 ...

  3. linux上使用google身份验证器(简版)

    系统:centos6.6 下载google身份验证包google-authenticator-master(其实只是一个.zip文件,在windwos下解压,然后传进linux) #cd /data/ ...

  4. win10无法访问服务器上的共享文件夹怎么设置,提示:你不能访问此共享文件夹,因为你组织的安全策略阻止未经身份验证的来宾访问

    此问题需要修改Win10 网络策略 按window+R键输入gpedit.msc 来启动本地组策略编辑器. 依次找到“计算机配置-管理模板-网络-Lanman工作站”这个节点,在右侧内容区可以看到“启 ...

  5. 修改Linux用户配置之后先验证再退出

    在服务器上更改完zsh.SSH连接属性.用户密码之后,我们可能想退出重新登录查看是否配置生效.这时,有一个注意事项:不要关闭旧窗口,而是重新打开一个新窗口尝试登录.否则,如果配置改错了,自己就再也没有 ...

  6. Win 10 你不能访问此共享文件夹,因为你组织的安全策略阻止未经身份验证的来宾访问....

    按window+R键输入gpedit.msc 来启动本地组策略编辑器 依次找到“计算机配置-管理模板-网络-Lanman工作站”这个节点,在右侧内容区可以看到“启用不安全的来宾登录”这一条策略设置.状 ...

  7. win10 系统出现“你不能访问此共享文件夹,因为你组织的安全策略阻止未经身份验证的来宾访问。”

    公司无法访问共享 \192.168.7.101.win+R 输入gpedit.msc2.计算机配置-管理模板–网络-lanman 工作站-找到"启用不安全的来宾登录"选择 已启用. ...

  8. 通过Google身份验证器加强Linux帐户安全

    下载Google的身份验证模块: # wget https://google-authenticator.googlecode.com/files/libpam-google-authenticato ...

  9. 谷歌身份验证器加强Linux帐户安全

    下载 Google的身份验证模块 # wget https://google-authenticator.googlecode.com/files/libpam-google-authenticato ...

随机推荐

  1. 那些年我读过的Blog(Ⅰ)

    序 近期发现自己已经很久很久没有写过文章,其中包括公开的和非公开的Blog,于是自己去翻了以前很多关注的人的Blog,发现也已经有很大一部分没有更新了,遂有了本文,梳理一下自己那些年关注过并且现在已经 ...

  2. 【ASK】git使用中出现Permission denied (publickey).

    好久没有用git了,今天突然执行了一下 $git submodule update --init --recursive =============================== 结果出现如下提 ...

  3. double类型转化成string

    public static void main(String[] args) { double priceWithFreight = 1200.5698d; System.out.println(pr ...

  4. Python中xlrd和xlwt模块使用方法 (python对excel文件的操作)

    本文主要介绍可操作excel文件的xlrd.xlwt模块.其中xlrd模块实现对excel文件内容读取,xlwt模块实现对excel文件的写入. 安装xlrd和xlwt模块 xlrd和xlwt模块不是 ...

  5. [越狱开发] theOpenDev配置与搭建碰到的问题

    CodeSign error: code signing is required for product type 'Dynamic Library' in SDK 'iOS 6.1' 如何解决?

  6. Android去掉标题的方法

    我们写程序的时候经常要全屏显示或者不显示标题.比如我们做地图导航的时候就不要标题了,下面介绍三种方法来实现Android去掉标题. 第一种:也一般入门的时候经常使用的一种方法 在setContentV ...

  7. Kotlin——高级篇(四):集合(Array、List、Set、Map)基础

    在实际的项目开发中,集合的运用可以说是多不胜数.不过Kotlin中的集合运用和Java中还是有很大的差别,他们两者之间,除了集合的类型相同以外,还包含集合的初始化的不同,以及Kotlin对于集合封装特 ...

  8. JZOJ.5281【NOIP2017模拟8.15】钦点

    Description

  9. oninput事件(解决onkeyup无法监听到复制黏贴)

    change事件需要两个条件触发: a)当前对象属性改变,并且是由键盘或鼠标事件激发的(脚本触发无效) b)当前对象失去焦点(onblur)  keypress  能监听键盘事件,但鼠标复制黏贴操作就 ...

  10. IDEA 设置代码模板

    一.代码模板 参考: IntelliJ IDEA 使用(一)基本设置与类.方法模板设置 - 云 + 社区 - 腾讯云 文件代码模板的使用 - IntelliJ IDEA 使用教程 - 极客学院 Wik ...