ssh的 TCP_Wrapper和PAM安全模块----->配置,ulimit命令

本文深入探讨了TCP_Wrappers的工作原理及配置方法,包括如何通过hosts.allow和hosts.deny文件进行访问控制。此外,还详细介绍了PAM认证机制,包括其架构、配置文件以及常见PAM模块的使用。

一. TCP_Wrappers介绍

前提得支持libwrap.so库,不然没用

工作在第四层(传输层)的TCP协议
对有状态连接的特定服务进行安全检测并实现访问控制
以库文件形式实现

某进程是否接受libwrap的控制取决于发起此进程的程序在编译时是否针对libwrap进行编译的

判断服务程序是否能够由tcp_wrapper进行访问控制的方法:
查看软件是否支持TCP_wrappers

ldd /PATH/TO/PROGRAM|grep libwrap.so
strings PATH/TO/PROGRAM|grep libwrap.so

在这里插入图片描述

telnet-server依赖于守护进程

centos7xinted支持这个服务
centos7上systemed(不支持这个服务)

http不支持这个服务

配置文件
/etc/hosts.allow这个文件里面的内容是允许访问的
/etc/hosts.deny这个文件里面的内容是拒绝的
如果两个文件中都不写--------默认允许

帮助参考:man 5 hosts_access,man 5 hosts_options

检查顺序:hosts.allow优先-------->hosts.deny(默认允许

注意:一旦前面规则匹配,直接生效,将不再继续

基本语法:

daemon_list@host: client_list [ :options :option… ]

精确到某个ip才写 @ip,不写就是拒绝本机所有ip被访问
daemon_list 服务的二进制文件名
client_list客户端

Daemon_list@host格式

单个应用程序的二进制文件名,而非服务名,例如vsftpd
以逗号或空格分隔的应用程序文件名列表,如:sshd,vsftpd

ALL表示所有接受tcp_wrapper控制的服务程序
主机有多个IP,可用@hostIP来实现控制
如:in.telnetd@192.168.0.254

客户端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(知道-将名称和ip之间解析),UNKNOWN(不知道),PARANOID(将名称和ip之间不匹配)

EXCEPT用法:(排除)分情况———allow或deny
示例:
拒绝172.16.网段,排除172.16.100.0中又排除172.16.100.1(相当于这个地址被拒绝)
vsftpd: 172.16. EXCEPT 172.16.100.0/24 EXCEPT 172.16.100.1

拒绝sshd服务访问
这里只是拒绝访问本机的192.168.245.129的ip

vim  /etc/hosts.deny
sshd@192.168.245.129:192.168.245.128

在这里插入图片描述
在这里插入图片描述
例如:vsftpd服务21端口
拒绝
在这里插入图片描述
示例:只允许192.168.1.0/24的主机访问sshd

 /etc/hosts.allow
sshd: 192.168.1. 
 /etc/hosts.deny 
sshd :ALL 

示例:只允许192.168.1.0/24的主机访问telnet和vsftpd服务

 /etc/hosts.allow
vsftpd,in.telnetd: 192.168.1.
 /etc/host.deny
vsftpd,in.telnetd: ALL

如果发现有人多次访问自己用lastb命令查看----并将其扔到deny中去
在这里插入图片描述

逻辑:取出访问>=三次的ip并将其追加到/etc/hosts.deny中
system()函数—用于调用linux命令
system(“echo sshd:“i”>> /etc/hosts.deny” )
解析后为 echo sshd:ip >> /etc/hosts.deny

lastb|awk '! /^btmp|^$/{ip[$2]++}END{for(i  in ip){if(ip[i]>=3){system("echo sshd:"i">> /etc/hosts.deny" )}}}'

最后这些ip就会被拒绝访问
在这里插入图片描述

[:options]选项

帮助:man 5 hosts_options
deny 主要用在/etc/hosts.allow定义“拒绝”规则 :deny

vsftpd: 172.16. :deny

allow 主要用在/etc/hosts.deny定义“允许”规则 :allow

vsftpd:172.16. :allow

spawn 启动一个外部程序完成执行的操作(也就是触发一个动作不会影响你的访问

twist 实际动作是拒绝访问,使用指定操作替换当前服务,标准输出和ERROR发送到客户端,默认至/dev/null

测试工具
tcpdmatch [-d] daemon[@host] client
-d 测试当前目录下的hosts.allow和hosts.deny

说明
在/etc/hosts.allow中添加,允许登录,并记录日志
在/etc/hosts.deny中添加,拒绝登录,并记录日志

%c 客户端信息
%s 服务器端信息  sshd@192.168.37.7
%d 服务名   sshd
%p 守护进程的PID
%% 表示% 

例如
sshd: ALL :spawn echo “$(date +%%F) login attempt from %c to
%s,%d” >>/var/log/sshd.log
在这里插入图片描述

vsftpd: 172.16. :twist /bin/echo “connection prohibited”
相当于vsftpd服务不提供----变成了后面这条命令(返回给客户端)
在这里插入图片描述

练习

1.仅开放本机两个IP地址中的一个地址172.16.0.X上绑定的sshd和vsftpd服务给172.16.0.0/16网络中除了172.16.0.0/24网络中的主机之外的所有主机,但允许172.16.0.200访问,每次的用户访问都要记录于日志文件中,注:其中X为学号

vim  /etc/hosts.deny
sshd,vsftpd@172.16.0.80:172.16.0.0/16 EXPECT 172.16.0.0/24 EXPRCT 172.16.0.200 spawn echo “$(date +%%F) login attempt from %c to %s,%d” >>/var/log/sshd.log

2.编写脚本/root/bin/checkip.sh,每5分钟检查一次,如果发现通过ssh登录失败次数超过10次,自动将此远程IP放入Tcp Wrapper的黑名单中予以禁止防问

vim /root/bin/checkip.sh
watch -n 10 -d `lastb|awk -F" +|:|/" '{if($2=="ssh")ip[$4]++}END{for(i in ip)if(ip[i]>=10){system("echo sshd:"i">>/etc/hosts.deny")}}'`




二. PAM认证机制

类似于淘宝----中间人

只专注与安全

PAM:Pluggable Authentication Modules
认证库:文本文件,MySQL,NIS,LDAP等

PAM 是关注如何为服务验证用户的 API,通过提供一些动态链接库和一套统一的API,将系统提供的服务和该服务的认证方式分开
使得系统管理员可以灵活地根据需要给不同的服务配置不同的认证方式而无需更改服务程序
一种认证框架,自身不做认证

它提供了对所有服务进行认证的中央机制,适用于本地登录,远程登录,如:telnet,rlogin,fsh,ftp,点对点协议PPP,su等应用程序中,系统管理员通过PAM配置文件来制定不同应用程序的不同认证策略;应用程序开发者通过在服务程序中使用PAM API(pam_xxxx( ))来实现对认证方法的调用;而PAM服务模块的
开发者则利用PAM SPI来编写模块(主要调用函数pam_sm_xxxx( )供PAM接口库调用,将不同的认证机制加入到系统中;PAM接口库(libpam)则读取配置文件,将应用程序和相应的PAM服务模块联系起来

PAM架构
在这里插入图片描述

PAM认证机制

PAM相关文件

模块文件目录:/lib64/security/*.so (与安全相关)
环境相关的设置:/etc/security/
主配置文件:/etc/pam.conf,默认不存在

为每种应用模块提供一个专用的配置文件:/etc/pam.d/APP_NAME

tail /var/log/secure 监控日志

注意:如/etc/pam.d存在,/etc/pam.conf将失效

在这个文件下面的服务可以给他们修改模块----实现安全
在这里插入图片描述

pam认证原理
PAM认证一般遵循这样的顺序:Service(服务)→PAM(配置文件)→pam_*.so
PAM认证首先要确定那一项服务,然后加载相应的PAM的配置文件(位于/etc/pam.d下),最后调用认证文件(位于/lib64/security下)进行安全认证

在这里插入图片描述

PAM认证过程
1.使用者执行/usr/bin/passwd 程序,并输入密码

2.passwd开始调用PAM模块,PAM模块会搜寻passwd程序的PAM相关设置文 件,这个设置文件一般是在/etc/pam.d/里边的与程序同名的文件,即PAM会搜寻/etc/pam.d/passwd此设置文件

3.经由/etc/pam.d/passwd设定文件的数据,取用PAM所提供的相关模块来进行验证

4.将验证结果回传给passwd这个程序,而passwd这个程序会根据PAM回传的结果决定下一个动作(重新输入密码或者通过验证)

通用配置文件/etc/pam.conf格式
application type control module-path arguments

专用配置文件/etc/pam.d/* 格式
type control module-path arguments

说明:
服务名(application)
telnet、login、ftp等,服务名字“OTHER”代表所有没有在该文件中明确配置的其它服务

模块类型(module-type)
control PAM库该如何处理与该服务相关的PAM模块的成功或失败情况
module-path 用来指明本模块对应的程序文件的路径名
Arguments 用来传递给该模块的参数

模块类型
Auth 账号的认证和授权
Account 与账号管理相关的非认证类的功能,如:用来限制/允许用户对某个服务的访问时间,当前有效的系统资源(最多可以有多少个用户),限制用户的位置(例如:root用户只能从控制台登录)

Password 用户修改密码时密码复杂度检查机制等功能

Session 用户获取到服务之前或使用服务完成之后需要进行一些附加的操作,如:记录打开/关闭数据的信息,监视目录等

-type 表示因为缺失而不能加载的模块将不记录到系统日志,对于那些不总是安装在系统上的模块有用

前面有个横线表示该模块不重要

Control: 控制
PAM库如何处理与该服务相关的PAM模块成功或失败情况

两种方式实现:

简单和复杂

简单方式实现:一个关健词实现

required:一票否决,表示本模块必须返回成功才能通过认证,但是如果该模块返回失败,失败结果也不会立即通知用户,而是要等到同一type中的所有模块全部执行完毕再将失败结果返回给应用程序,即为必要条件

requisite :一票否决,该模块必须返回成功才能通过认证,但是一旦该模块返回失败,将不再执行同一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 忽略已经得到的结果

module-path: 模块路径

1.相对路径
/lib64/security目录下的模块可使用相对路径
如:pam_shells.so、pam_limits.so
2.绝对路径

模块通过读取配置文件完成用户对系统资源的使用控制

/etc/security/*.conf

注意:修改PAM配置文件将马上生效
建议:编辑pam规则时,保持至少打开一个root会话,以防止root身份验证错误
Arguments 用来传递给该模块的参数

pam文档说明

/user/share/doc/pam-*
rpm -qd pam
man –k pam_
man 模块名 如man rootok
《The Linux-PAM System Administrators’ Guide》

PAM模块示例

搜索支持该模块的服务 (cd /etc/pam.d)
在这里插入图片描述

1.pam_shells

功能:检查有效shell
man pam_shells
示例:不允许使用/bin/csh的用户本地登录

vim /etc/pam.d/login
 auth required pam_shells.so 
 
vim /etc/shells  注释掉默认的shell
 去掉 /bin/csh
 
useradd –s /bin/csh testuser   更改用户的shell

testuser将不可登录

tail -f /var/log/secure 监控日志

2.pam_securetty.so

远程用户通过root登录与这个模块有关

功能:只允许root用户在/etc/securetty列出的安全终端上登陆

示例:允许root在telnet登陆默认不允许

vi /etc/pam.d/remote

#auth required pam_securetty.so #将这一行加上注释

或者

/etc/securetty文件中加入
pts/0,pts/1…pts/n

3.pam_nologin.so

功能
如果/etc/nologin文件存在,将导致非root用户,不能登陆
如果用户shell是/sbin/nologin 时,当该用户登陆时,会显示/etc/nologin
文件内容,并拒绝登陆

也可以给文件里面写内容
在这里插入图片描述

4. pam_limits.so

功能:在用户级别实现对其可使用的资源的限制
例如:
可打开的文件数量,
可运行的进程数量,
可用内存空间

修改限制的实现方式:

ulimit命令

,立即生效,但无法保存----可以修改配置文件(达到保存效果)

-n 每个进程最多的打开的文件描述符个数
-u 最大用户进程数
-S 使用 soft(软)资源限制
-H 使用 hard(硬)资源限制
-a  可以看到进程数

(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> 指定具体值

在这里插入图片描述

ab可以向远程主机发送大量的httpd请求-----用于压力测试(并发执行的)
在这里插入图片描述
-c 连接数 -n多少个

ab -c 100 -n 2000  ip

在这里插入图片描述
每个进程最多可以发起1024请求
在这里插入图片描述
例如 限制wang用户的进程数不能超过5个
vim /etc/security/limit.conf
在这里插入图片描述
查看用pgrep -u wang
在这里插入图片描述
在这里插入图片描述
限制用户最多打开的文件数和运行进程数

/etc/pam.d/system-auth
session required pam_limits.so

vim /etc/security/limits.conf 
apache – nofile 10240   用户apache可打开10240个文件
student hard nproc 20   用户student不能运行超过20个进程

生产案例
/etc/security/limit.conf

*                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

### 代码功能分析 `__register_tcp_dev_notifier` 函数的主要功能是为 `tcpc_device` 结构体注册一个通知器块。具体步骤如下: 1. 分配一个 `tcp_notifier_block_wrapper` 结构体,用于包装传入的通知器块。 2. 初始化 `tcp_notifier_block_wrapper` 结构体,将传入的通知器块赋值给 `action_nb` 成员,并设置 `stub_nb` 的回调函数为 `tcp_notifier_func_stub`。 3. 使用 `srcu_notifier_chain_register` 函数将 `stub_nb` 注册到 `tcpc->evt_nh + idx` 指向的通知器链中。 4. 如果注册失败,释放之前分配的 `tcp_notifier_block_wrapper` 结构体。 5. 调用 `__add_wrapper_to_managed_res_list` 函数将包装器添加到管理资源列表中。 6. 如果添加失败,打印一条通知消息,但仍然返回成功状态(返回 0)。 ### 代码优化建议 #### 1. 错误处理 当前代码在 `__add_wrapper_to_managed_res_list` 函数调用失败时,只是打印了一条通知消息,然后返回 0。这可能会导致调用者误以为注册成功,建议返回错误码。 ```c static int __register_tcp_dev_notifier(struct tcpc_device *tcpc, struct notifier_block *nb, uint8_t idx) { struct tcp_notifier_block_wrapper *nb_wrapper; int retval; nb_wrapper = devm_kzalloc( &tcpc->dev, sizeof(*nb_wrapper), GFP_KERNEL); if (!nb_wrapper) return -ENOMEM; nb_wrapper->action_nb = nb; nb_wrapper->stub_nb.notifier_call = tcp_notifier_func_stub; retval = srcu_notifier_chain_register( tcpc->evt_nh + idx, &nb_wrapper->stub_nb); if (retval < 0) { devm_kfree(&tcpc->dev, nb_wrapper); return retval; } retval = __add_wrapper_to_managed_res_list( tcpc, nb_wrapper, nb, idx); if (retval < 0) { dev_notice(&tcpc->dev, "Failed to add resource to manager(%d)", retval); // 注销之前注册的通知器 srcu_notifier_chain_unregister(tcpc->evt_nh + idx, &nb_wrapper->stub_nb); devm_kfree(&tcpc->dev, nb_wrapper); return retval; } return 0; } ``` #### 2. 代码可读性 可以添加一些注释来提高代码的可读性,特别是对于关键步骤复杂的函数调用。 #### 3. 性能优化 由于代码中主要是内存分配通知器链的注册操作,没有明显的性能瓶颈。但可以考虑在 `devm_kzalloc` 调用时,根据实际情况选择更合适的内存分配标志,以提高内存分配的效率。 ### 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值