TCP_Wrappers 基于TCP的安全控制

简介:

TCP_Wrappers简介

TCP_Wrappers全称:Transmission Control Protocol(TCP)Wrappers

是一个基于主机的网络访问控制表系统,用于过滤对类Unix系统(如Linux或BSD)的网络访问。

其能将主机或子网IP地址、名称及ident查询回复作为筛选标记,实现访问控制。

Tcp_Wrappers主要特点

 工作在第四层(传输层)的TCP协议

 对有状态连接的特定服务进行安全检测并实现访问控制

 以库文件形式实现

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

判断程序是否支持tcp_wrapper

程序如果调用了libwrap.so库,表示支持。

ldd 程序路径|grep libwrap.so
strings 程序路径|grep libwrap.so

#ldd /usr/sbin/sshd|grep libwrap.so
    libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f9851678000)

#ldd /usr/sbin/vsftpd |grep libwrap.so
    libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f802ef50000)

#strings `which sshd`|grep libwrap.so
libwrap.so.0

TCP_Wrappers的使用

TCP Wrappers是通过/etc/hosts.allow和/etc/hosts.deny这两个配置文件来实现一个类似防火墙的机制。

配置文件

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

配置文件 规则定义
/etc/hosts.allow 允许访问规则
/etc/hosts.deny 拒绝访问规则

注意:说明文档中表示此文件也可以实现拒绝的规则,本着见名知义和管理清晰化的指引,这种写法不是讨论的重点。

语法

daemon_list : client_list [ : shell_command ]

daemon_list  
        单个应用程序的二进制文件名,而不是服务名,如果有多个,用逗号或空格分隔。如sshd,vsftpd 或 sshd vsftpd
        可以绑定服务地址,如,sshd@192.168.7.202:ALL
        ALL表示所有接受tcp_wrapper控制的服务程序
        支持通配符

client_list
        客户端列表
         基于单个IP地址:192.168.10.1 
         基于网段IP地址:192.168.1. 注意,192.168.1.0这个写法是错误的。
         基于主机名:www.hunk.tech .hunk.tech较少用
         基于网络/掩码:192.168.0.0/255.255.255.0
         基于net/prefixlen: 192.168.1.0/24(仅CentOS7)
         基于网络组(NIS 域):@mynetwork
         内置ACL:
            ALL 所有(进程或者主机)
            LOCAL 名称中不带点的主机
            KNOWN 可以解析的主机名
            UNKNOWN 无法解析的主机名
            PARANOID 正、反向查询不匹配或无法解析
        支持通配符

shell_command
        执行指令
        如:sshd:all:spawn echo "`date +%%F-%%T` from %a pid=%p to %s" >> /app/sshd.log

EXCEPT是排除的意思,一行规则里可以有多个,后面的是对前面的结果集进行排除。 
        vsftpd:172.16. EXCEPT 172.16.100.0/24 EXCEPT 172.16.100.1
        匹配整个172.16网段,但是把172.16.100的网段排除,在排除172.16.100网段中又把172.16.100.1的IP给排除。

spawn 启动一个外部程序完成执行的操作,可以支持内置变量。内置变量请man ,找%的选项
        %a (%A) 客户端IP
        %c      客户端信息,可以是IP或主机名(如果能解析)
        %p      服务器进程信息 (PID)
        %s      连接的服务端的信息
        %%      当规则中包含%时,使用双%转义

twist 特殊扩展
以指定的命令执行,执行后立即结束该连接。需在spawn之后使用。

示例

使用的2台测试主机网络IP配置如下:

本文中简称 主机 IP 1 IP 2
6A 6-web-1.hunk.tech 192.168.7.201 192.168.5.102
7B 7-web-2.hunk.tech 192.168.7.202 192.168.5.103

默认hosts.allow和hosts.deny 配置文件为空,表示全部允许。

#ssh 192.168.7.202
Last login: Thu Feb  8 11:04:58 2018 from 192.168.7.201

拒绝某个IP访问:

7B:
vim /etc/hosts.deny
sshd:192.168.7.201

6A:
#ssh 192.168.7.202
ssh_exchange_identification: Connection closed by remote host

配置规则保存后,立即生效

7B:日志会明确记录
#tail -n1 /var/log/secure
Feb  8 11:18:29 7-web-2 sshd[1811]: refused connect from 192.168.7.201 (192.168.7.201)

那如果一个client_list同时存在于2个文件呢

7B:
tail -n1 /etc/hosts.deny >> /etc/hosts.allow 

6A:
#ssh 192.168.7.202
Last login: Thu Feb  8 11:05:33 2018 from 192.168.7.201

看到了吧,是可以允许访问的,这就涉及到了执行处理机制了。
image

因此,上面的结果就是允许访问了。因为在hosts.allow已经匹配了。

仅允许内网IP访问

假设192.168.7.202是7B的肉网卡地址,那么规则应该为:
#vim /etc/hosts.deny
sshd@192.168.7.202:ALL

#ssh -b 192.168.7.201 192.168.7.202         > -b 是使用源地址为X.X.X.X访问
bind: 192.168.7.201: Cannot assign requested address
ssh: connect to host 192.168.7.202 port 22: Cannot assign requested address

把每个ssh登录日志记录到文件

#vim /etc/hosts.allow
sshd:all:spawn echo "`date +%%F-%%T` from %a pid=%p to %s" >> /app/sshd.log

#cat /app/sshd.log
2018-02-08-15:59:53 from 192.168.7.202 pid=2565 to sshd@192.168.7.202

#ps aux |grep 2565
root       2565  0.0  2.3 145696  5328 ?        Ss   15:59   0:00 sshd: root@pts/2

应用实例

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

#!/bin/bash
#定义 休眠时间
sleeptime=300

#定义 通过ssh登录失败次数
num=10

#定义 黑名单文件
file=/etc/hosts.deny

#无限循环
while true;do
        #将失败登录的记录逐行读入变量
        lastb | grep ssh|awk -F "[ ]+" '{print $3}'|uniq -c | while read conn ip;do
        #判断失败次数
        if  [ "$conn" -ge "$num" ];then
                #判断记录的IP是否存在
                egrep -q ^sshd.*$ip $file
                #如果不存在记录,将追加记录至指定黑名单文件
                [ $? -ne 0 ] &&  echo "sshd:$ip" >> $file
        fi
        done
sleep $sleeptime
done

使用watch -n1 cat /etc/hosts.deny来观察动态文件
image

总结:TCP_Wrappers
适用于需求简单的应用场景,并且受到监控软件的是否支持libwrap.so库局限。



本文转自 ljpwinxp 51CTO博客,原文链接:http://blog.51cto.com/191226139/2070438

相关文章
|
JavaScript
npm install less-loader报错 npm查看版本号
npm install less-loader报错 npm查看版本号
856 0
npm install less-loader报错 npm查看版本号
|
关系型数据库 MySQL 搜索推荐
mysql point类型的简单使用
什么是point类型数据?举个例子如下:POINT(123.462202 41.804471) 首先建立一个表: DROP TABLE IF EXISTS `tb_point`; CREATE TABLE `tb_point` ( `timesta...
3610 0
|
4月前
|
存储 机器学习/深度学习 缓存
阿里云服务器4核8G配置租用价格:不同实例收费标准、活动价格对比与选购参考
4核8G配置是深受初创企业用户喜欢的云服务器配置,2025年截止目前,按量收费标准最低降至0.45元/小时,包年包月租用平均优惠月价最低仅需159.84元/月,按年购买还可享受u1实例4核8G活动价955.58元/年起的价格。云服务器实例规格和配置不同,收费标准与活动价格也不同,下面是小编为大家整理汇总的阿里云服务器4核8G配置2025年最新收费标准与活动价格。
602 5
阿里云服务器4核8G配置租用价格:不同实例收费标准、活动价格对比与选购参考
|
缓存 安全 应用服务中间件
Nginx七层(应用层)反向代理:HTTP反向代理proxy_pass篇(二)
Nginx七层(应用层)反向代理:HTTP反向代理proxy_pass篇(二)
780 1
|
缓存 应用服务中间件 API
FM全网自动采集聚合影视搜索源码
FM 全网聚合影视搜索(响应式布局),基于 TP5.1 开发的聚合影视搜索程序,本程序无数据库,本程序内置P2P 版播放器,承诺无广告无捆绑。片源内部滚动广告与本站无关,谨防上当受骗,资源搜索全部来自于网络。
446 1
|
SQL 存储 DataWorks
DataWorks操作报错合集之遇到错误信息提示:"ErrorMessage: ClickHouse exception, code: 210, host: cc-,是什么导致的
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
JSON 前端开发 测试技术
基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(二)
基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(二)
|
开发框架 JavaScript 前端开发
WebStorm使用
WebStorm使用
|
Windows
Windows Server 2016 备份和灾难恢复-2
在“确认”界面中,可以看到该备份的标签信息,如图9.26所示。
813 0