TCP_Wrappers介绍和PAM认证机制
TCP_Wrappers
(1)TCP_Wrappers 简介
- 作者:Wieste Venema,IBM,Google
- 工作在第四层(传输层)的TCP协议
- 对有状态连接的特定服务进行安全检测并实现访问控制
- 以库文件形式实现
- 某进程是否接受libwrap的控制取决于发起此进程的程序在编译时是否针对libwrap进行编译的
可以控制一些基于TCP协议的网络访问,只要内置的网络访问功能调用了
libwrap库,就可以使用tcp_wrappes实现访问控制。
ldd `which sshd` | grep libwrap
libwrap.so.0 => /lib64/libwrap.so.0...
说明sshd服务可以使用tcp_wrappers实现访问控制
tcp_wrappers访问控制的实现:/etc/hosts.allow, /etc/hosts.deny
(2)TCP_Wrappers的使用
- 配置文件:/etc/hosts.allow, /etc/hosts.deny
- 帮助参考:man 5 hosts_access,man 5 hosts_options
- 检查顺序:hosts.allow --> hosts.deny -->(默认允许)
注意: 一旦前面规则匹配,直接生效,将不再继续
即 在hosts.allow定义的规则一旦匹配,无论是hosts.allow后面又对其进
行规则定义还是在hosts.deny文件在定义规则,均不管啦~,以第一次匹配的
规则为准。
默认/etc/hosts.allow, /etc/hosts.deny 两个文件均为空,默认允许
- 基本语法:
daemon_list@host: client_list [ :options :option… ]
基本语法
daemon_list@host: client_list [ :options :option… ]
守护进程的程序名:客户端主机列表
①单个应用程序的二进制文件名,而非服务名,例如vsftpd
②以逗号或空格分隔的应用程序文件名列表,如:sshd,vsftpd
③ALL表示所有接受tcp_wrapper控制的服务程序
④主机有多个IP,可用@hostIP来实现控制
如:in.telnetd@192.168.0.254
示例: 对ssh实现访问控制 ==> 修改配置文件立即生效
在/etc/hosts.deny中拒绝所有主机ssh 连接本机
sshd: ALL <window主机也会被拒绝>
客户端Client_list格式
①客户端Client_list格式
②以逗号或空格分隔的客户端列表
③基于IP地址:192.168.10.1 192.168.1. 、
④基于主机名:www.magedu.com .magedu.com 较少用
⑥基于网络/掩码:192.168.0.0/255.255.255.0
⑦基于net/prefixlen: 192.168.1.0/24(CentOS7)
⑧基于网络组(NIS 域):@mynetwork
⑨内置ACL:ALL,LOCAL,KNOWN,UNKNOWN,PARANOID
LOCAL:表示主机名命名时没有加·
UNKNOWN:表示无法将名称解析成地址
PARANOID:表示正向解析和反向解析不匹配
KNOWN:正向和反向解析都一样
支持EXCEP:<排除某列表中的某列表>
eg:vsftpd: 172.16. EXCEPT 172.16.100.0/24 EXCEPT 172.16.100.1
[:options]选项:
deny 主要用在/etc/hosts.allow定义“拒绝”规则
allow 主要用在/etc/hosts.deny定义“允许”规则
spawn 启动一个外部程序完成执行的操作
twist 实际动作是拒绝访问,使用指定操作替换当前服务,标准输出和
ERROR发送到客户端,默认至/dev/null
SSH登录示例:
sshd: ALL :spawn echo "$(date +%%F) login attempt from %c to \
%s,%d" >>/var/log/sshd.log
%c 客户端信息
%s 服务器端信息
%d 服务名
%p 守护进程的PID
%% 表示%
(3)测试工具
- tcpdmatch [-d] daemon[@host] client
- -d 测试当前目录下的hosts.allow和hosts.deny
PAM认证机制
(壹) PAM简介
-
PAM:Pluggable Authentication Modules
-
认证库:文本文件,MySQL,NIS,LDAP等
-
Sun公司于1995 年开发的一种与认证相关的通用框架机制
-
PAM 是关注如何为服务验证用户的 API,通过提供一些动态链接库和一套统一的API,将系统提供的服务和该服务的认证方式分开
-
使得系统管理员可以灵活地根据需要给不同的服务配置不同的认证方式而无需更改服务程序
-
一种认证框架,自身不做认证
PAM是一种认证框架,尤其身份验证,资源控制的功能和应用程序相剥离。
(贰)PAM架构
运维主要配置某个应用程序对应于某个认证模块,资源使用的控制和使用哪些
认证模块,修改应用程序与pam相关的配置文件,进行配置。
(叁)PAM认证原理
- PAM认证一般遵循这样的顺序:Service(服务)→PAM(配置文件)→pam_*.so
- PAM认证首先要确定那一项服务,然后加载相应的PAM的配置文件(位于/etc/pam.d下),最后调用认证文件(位于/lib64/security下)进行安全认证
(肆)PAM认证相关文件
- 模块文件目录:/lib64/security/*.so
- 环境相关的设置:/etc/security/
- 主配置文件:/etc/pam.conf,默认不存在,并且/etc/pam.conf也不做配置,一般不使用。
- 为每种应用模块提供一个专用的配置文件:/etc/pam.d/APP_NAME
- 注意:如/etc/pam.d存在,/etc/pam.conf将失效
(1)/lib64/security/*.so pam模块文件
/lib64/security/*.so 提供认证的模块文件,每个模块文件提供特定的功
能,为二进制文件。
/lib64/security/*.so的每个模块相当于一个命令,后面可以跟参数,
实在复杂的模块提供专门的配置文件 ==>/etc/security/目录下的文件
示例:/etc/pam.d/vsftpd 应用程序调用pam模块时,在/etc/
pam.d/目录下存在对应于应用程序关于pam的配置文件
(2)/etc/pam.d/APP_NAME
/etc/pam.d/ 因此/etc/pam.d/目录为运维关心的目录,目录中的文本文件
即为对应服务的pam配置
(3)/etc/security/ 复杂pam模块独有的配置文件目录
eg:/lib64/security/pam_limits.so 控制资源访问的模块在/etc/
security/目录下关于pam_limits.so有其独有的配置文件/limits.conf
总结:运维一般修改的文件目录:/etc/pam.d/ 和 /etc/security/
(伍)专用配置文件 /etc/pam.d/APP_NAME 格式
-
type control module-path arguments
-
服务名(application)/etc/pam.d/服务名
telnet、login、ftp等,服务名字“OTHER”代表所有没有在该文件中明确配置的其它服务 -
(1)模块类型(module-type)
①Auth 账号的认证和授权
②Account 与账号管理相关的非认证类的功能
③Password 用户修改密码时密码复杂度检查机制等功能
④Session 用户获取到服务之前或使用服务完成之后需要进行一些附加的操作
⑤-type 表示因为缺失而不能加载的模块将不记录到系统日志,对于那些不总是安装在系统上的模块有用 -
(2)control PAM库该如何处理与该服务相关的PAM模块的成功或失败情况
PAM库如何处理与该服务相关的PAM模块成功或失败情况
简单方式实现:一个关健词实现 ①②③④
①required :一票否决,表示本模块必须返回成功才能通过认证,但是如果该模块返回失败,失败结果也不会立即通知用户,而是要等到同一type中的所有模块全部执行完毕再将失败结果返回给应用程序,即为必要条件
②sufficient :一票通过,表明本模块返回成功则通过身份认证的要求,不必再执行同一type内的其它模块,但如果本模块返回失败可忽略,即为充分条件
③optional :表明本模块是可选的,它的成功与否不会对身份认证起关键作用,其返回值一般被忽略
④include: 调用其他的配置文件中定义的配置信息
复杂详细实现:使用一个或多个“status=action”
[status1=action1 status2=action …]
Status:检查结果的返回状态
Action:采取行为 ok,done,die,bad,ignore,reset
①ok 模块通过,继续检查
②done 模块通过,返回最后结果给应用
③bad 结果失败,继续检查
④die 结果失败,返回失败结果给应用
⑤ignore 结果忽略,不影响最后结果
⑥reset 忽略已经得到的结果 -
(3)module-path 用来指明本模块对应的程序文件的路径名
相对路径:
/lib64/security目录下的模块可使用相对路径
绝对路径: -
(4)Arguments 用来传递给该模块的参数
-
模块通过读取配置文件完成用户对系统资源的使用控制
/etc/security/*.conf -
注意: 修改PAM配置文件将马上生效,现有的会话不影响
-
建议: 编辑pam规则时,保持至少打开一个root会话,以防止root身份验证错误
示例:
格式:type control module-path arguments
/etc/pam.d/system-auth: <涉及的验证比较全>
auth required pam_env.so
auth required pam_faildelay.so delay=2000000
auth sufficient pam_unix.so nullok try_first_pass
auth requisite pam_succeed_if.so uid >= 1000 quiet_success
auth required pam_deny.so
(陆)常用PAM模块
- man -k pam_ <查看关于pam_模块的所有帮助简章>
- Linux pam 可直接下载电子版
- rpm -qd pam
常用的/lib64/security/pam_*.so 模块的使用和相应的功能
(1)pam_shells.so:验证登录系统的shell是否为有效shell
有效shell类型:/etc/shlls
~]# man pam_shells 查看帮助说明
查询是否有程序使用pam_shells.so模块:
~]# grep pam_shells.so /etc/pam.d/*
vmtoolsd:auth required pam_shells.so
vmtoolsd:account required pam_shells.so
示例:
让ssh调用pam_shells.so模块,使ssh登录时判断shell类型
①示例准备阶段:<最小化安装默认shells比较少,安装zsh>
~]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/zsh
~]# getent passwd user1
user1:x:1001:1001::/home/user1:/bin/bash
~]#chsh -s /bin/zsh user1 <更换user1的shell>
~]#getent passwd user1
user1:x:1001:1001::/home/user1:/bin/zsh
②确认目前远程主机能以ssh 以user1的用户连接
~]#ssh user1@192.168.38.17
③将/etc/shells中/bin/zsh注释掉
....
# /bin/zsh
④确认目前远程主机能以ssh 以user1的用户连接,还能以ssh连接
⑤ssh引用pam_shells.so模块,在/etc/pam.d/sshd的auth中加入以下
auth required pam_shells.so
⑥登录验证:此时已将/bin/zsh 作为不合要求的shell类型啦~
~]#ssh user1@192.168.38.17
user1@192.168.38.17's password:
Permission denied, please try again.
(2)模块:pam_securetty.so
功能:只允许root用户在/etc/securetty列出的安全终端上登陆
安全的终端?:/etc/securetty 此文件中的终端
~]# cat /etc/securetty
console
vc/1
vc/2
....
但是似乎没有xshell 连接的终端?
~]# tty
/dev/pts/0
查询此模块是否有软件使用?
~]# grep pam_securetty.so /etc/pam.d/*
/etc/pam.d/login: ....
/etc/pam.d/remote:auth required pam_securetty.so
远程?Telnet服务即为远程服务==>因此telnet服务root远程登录不允许
因此允许root用户使用Telnet远程登录的处理方式:
①在/etc/securetty 中将远程终端添加
②将/etc/pam.d/remote模块禁用
(3)模块:pam_nologin.so
功能:
①如果/etc/nologin文件存在,将导致非root用户不能登陆
②如果用户shell是/sbin/nologin 时,当该用户登陆时,会显示/etc/nologin
文件内容,并拒绝登陆
(4)模块:pam_limits.so
功能:在用户级别实现对其可使用的资源的限制,例如:可打开的文件数量,可运行
的进程数量,可用内存空间
查看使用:~]# grep pam_limits.so /etc/pam.d/*
....
/etc/pam.d/system-auth:session required pam_limits.so
/etc/pam.d/system-auth是/etc/pam.d/smartcard-auth-ac的软链接
实际上许多程序都引用了/etc/pam.d/smartcard-auth
比如:login,ssh 基本上登录成功的用户都会受到pam_limits.so的限制
修改限制的实现方式:
(1) ulimit命令,立即生效,但无法保存 == ulimit 内部命令(bash)
获取帮助:~]# help ulimit
-n 每个进程最多的打开的文件描述符个数
-u 最大用户进程数
-S 使用 soft(软)资源限制
-H 使用 hard(硬)资源限制
-a 显示目前要求的limit
普通用户不能使用ulimit修改,root用户修改使用的全部用户参数
(2) 配置文件:/etc/security/limits.conf, /etc/security/limits.d/*.conf
配置文件:每行一个定义;
<domain> <type> <item> <value>
-------------------------------------
<domain> 应用于哪些对象
Username 单个用户
@group 组内所有用户
* 所有用户
-------------------------------------
<type> 限制的类型
Soft 软限制,普通用户自己可以修改
Hard 硬限制,由root用户设定,且通过kernel强制生效
- 二者同时限定
-------------------------------------
<item> 限制的资源
nofile 所能够同时打开的最大文件数量,默认为1024
nproc 所能够同时运行的进程的最大数量,默认为1024
-------------------------------------
<value> 指定具体值
-------------------------------------
生产案例
* soft core unlimited
* hard core unlimited
* soft nproc 1000000
* hard nproc 1000000
* soft nofile 1000000
* hard nofile 1000000
* soft memlock 32000
* hard memlock 32000
* soft msgqueue 8192000
* hard msgqueue 8192000