使用tcp_wrapper或xinetd对服务的访问控制

Posted 务必抓紧

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用tcp_wrapper或xinetd对服务的访问控制相关的知识,希望对你有一定的参考价值。

tcp_wrapper及xinetd简介

我们知道对服务的访问控制可以使用iptables,这是因为iptables是工作在内核状态的,它利用几个控制模块来控制访问策略(比如netfilter、nat等)。而tcp_wrapper是一个访问控制库,其工作在内核和应用服务之间,也就是说系统在没有iptables控制的情况下,用户要想访问一个加载tcp_wrapper库的应用服务的话,首先要通过tcp_wrapper来验证此用户合不合法,如果不合法则tcp_wrapper会主动禁止此用户的访问。

一个服务要起作用,首先要运行此服务对应的二进制程序,运行成功后就在系统中产生一个进程,而进程分为:1、独立守护进程 2、非独立守护进程。非独立守护进程又称为瞬时守护进程,而瞬时守护进程是需要xinetd的超级守护进程管理才能开启或关闭。

tcp_wrapper实战

查看一个应用服务是否受tcp_wrapper来控制用户对其访问,可以使用ldd命令来查看,例如产看sshd服务,可以查出其是加载了tcp_wrapper的库文件libwrap.so,而且是动态链接加载这个库文件。如果一个应用服务在编译的时候指定加载libwrap.so库文件的话,用ldd是看不到的,但是这个编译的应用服务事实上就被tcp_wrapper控制用户对其访问了。

[[email protected] ~]# ldd  `which  sshd`
        libwrap.so.0 => /lib64/libwrap.so.0 (0x00007fd55061e000)

再比如说xinetd服务也是加载libwrap.so库文件的,在centos6上安装telnet-server的话是依赖xinetd,所以安装telnet-server的时候一并安装了xinetd,但在centos7上安装telnet-server的话,默认是不安装xinetd的,要独立安装xinetd服务。下面以centos6为例安装telnet-server

[[email protected] ~]# yum  install  telnet-server
Installed:
  telnet-server.x86_64 1:0.17-48.el6                                           

Dependency Installed:
  xinetd.x86_64 2:2.3.14-40.el6       
[[email protected] ~]# ldd  `which  xinetd`
        libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f0045a13000)

那么tcp_wrapper是如何控制加载libwrap.so库文件的应用服务呢,主要受到下面两个文件的控制,一个是/etc/hosts.allow,另一个是/etc/hosts.deny

[[email protected] ~]# ll /etc/host*
-rw-r--r--. 1 root root 370 Jan 12  2010 /etc/hosts.allow
-rw-r--r--. 1 root root 460 Jan 12  2010 /etc/hosts.deny

下面实战tcp_wrapper来控制用户访问telnet服务。启动telnet服务的话,首先启动xinetd服务,因为telnet服务这个瞬时进程是受超级守护进程xinetd管理的

[[email protected] ~]# /etc/init.d/xinetd start
Starting xinetd:                                           [  OK  ]
[[email protected] ~]# chkconfig  telnet  on
[[email protected] ~]# netstat -lntup 
tcp        0      0 :::23                       :::*                        LISTEN      2825/xinetd  

要让tcp_wrapper来控制telnet的访问,就要配置hosts.allow和hosts.deny文件,编写格式为:deamon_list: host_list  例如允许192.168.0.0/16网段的主机可以访问telnet,其他主机访问拒绝

[[email protected] ~]# vim  /etc/hosts.allow   
in.telnetd: 192.168.
[[email protected] ~]# vim /etc/hosts.deny  
in.telnetd: ALL

还可以对规则上加except参数来排除个别主机。比如允许192.168.0.0/16网段的主机访问telnet,除了这个网段中的192.168.1.180主机访问telnet,并且拒绝其他网段的主机访问。这时候在192.168.1.180主机上使用telnet访问192.168.1.120主机上的telnet服务将被拒绝。

[[email protected] ~]# vim  /etc/hosts.allow   
in.telnetd: 192.168.  expect 192.168.1.180
[[email protected] ~]# vim /etc/hosts.deny  
in.telnetd: ALL

当然我们还可以在规则中使用spawn参数,这个参数的意思为启动,可以在这个参数后面跟上一个命令,比如让用户登录telnet成功或失败后记录日志到一个日志文件中

[[email protected] ~]# vim  /etc/hosts.allow 
in.telnetd: 192.168. except 192.168.1.180 : spawn echo "`date`,login attempt fro
m %c to %s" >> /var/log/tcpwrapper.log
[[email protected] ~]# vim  /etc/hosts.deny 
in.telnetd:ALL : spawn echo "`date`,login attempt from %h" >>/var/log/tcpwrappe
r.log

当客户端访问telnet服务后,产生的日志如下:

[[email protected] ~]# tail /var/log/tcpwrapper.log 
Thu Mar 15 15:23:00 CST 2018,login attempt from 192.168.1.180
Thu Mar 15 15:23:39 CST 2018,login attempt from 192.168.1.190 to [email protected]

上面访问控制文件中的参数  %c  %s  %h这个tcp_wrapper宏定义使用man 5  hosts_access可以查看其含义,还有一些tcp_wrapper可以对hosts.allow  hosts.deny文件参数的定义

[[email protected] ~]# man  5 hosts_access
       %c     Client information: [email protected], [email protected], a host name,
              or  just an address, depending on how much information is
              available.
       %h (%H)
              The client (server) host name or  address,  if  the  host
              name is unavailable.
       %s     Server information: [email protected], [email protected], or  just
              a  daemon  name,  depending  on  how  much information is
              available.

  

 

  

 

 

 

以上是关于使用tcp_wrapper或xinetd对服务的访问控制的主要内容,如果未能解决你的问题,请参考以下文章

第十六章 tcp_wrappers

tcp_wrapper,sudo,nsswitch与pam安全解析

编译安装 vsFTP 3.0.3

记录Centos6.5下安装vsftp服务及配置文件说明

linux下如何启动或重起xinetd

TCP_Wrappers 基于TCP的安全控制