• 使用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控制用户对其访问了。

    [root@linux-node1 ~]# 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

    [root@linux-node1 ~]# 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       
    [root@linux-node1 ~]# ldd  `which  xinetd`
            libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f0045a13000)
    

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

    [root@linux-node1 ~]# 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管理的

    [root@linux-node1 ~]# /etc/init.d/xinetd start
    Starting xinetd:                                           [  OK  ]
    [root@linux-node1 ~]# chkconfig  telnet  on
    [root@linux-node1 ~]# 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,其他主机访问拒绝

    [root@linux-node1 ~]# vim  /etc/hosts.allow   
    in.telnetd: 192.168.
    [root@linux-node1 ~]# 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服务将被拒绝。

    [root@linux-node1 ~]# vim  /etc/hosts.allow   
    in.telnetd: 192.168.  expect 192.168.1.180
    [root@linux-node1 ~]# vim /etc/hosts.deny  
    in.telnetd: ALL
    

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

    [root@linux-node1 ~]# 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
    [root@linux-node1 ~]# vim  /etc/hosts.deny 
    in.telnetd:ALL : spawn echo "`date`,login attempt from %h" >>/var/log/tcpwrappe
    r.log
    

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

    [root@linux-node1 ~]# 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 in.telnetd@192.168.1.120

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

    [root@linux-node1 ~]# man  5 hosts_access
           %c     Client information: user@host, user@address, 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: daemon@host, daemon@address, or  just
                  a  daemon  name,  depending  on  how  much information is
                  available.
    

    使用xinetd对非独立守护进程的管理

    虽然tcp_wrapper可以对加载libwrap.so库的应用服务做用户访问控制,比如对xinetd的服务访问控制,但xinetd本身主要是管理其他瞬时守护进程的,利用tcp_wrapper对xinetd管理的进程做访问控制功能上很少,没有用xinetd服务直接对其下管理的瞬时进程功能上更丰富,当然这样根据生产环境来选择是使用tcp_wrapper还是使用xinetd来控制用户的访问服务。

    下面使用xinetd来管理并控制telnet瞬时进程

    xinetd的配置文件为/etc/xinetd.conf文件,这个配置文件中配置的参数为全局配置参数,在/etc/xinetd.d/目录下的配置文件中的参数除了重新定义参数的值,要么都要继承全局配置参数的值

    [root@linux-node1 ~]# vim  /etc/xinetd.conf 
    defaults
    {
            log_type        = SYSLOG daemon info
            log_on_failure  = HOST
            log_on_success  = PID HOST DURATION EXIT
    #       no_access       =
    #       only_from       =
    #       max_load        = 0
            cps             = 50 10
            instances       = 50
            per_source      = 10
    #       bind            =
    #       banner          =
    }
    

    下面修改xinetd管理的telnet服务参数

    [root@linux-node1 ~]# vim /etc/xinetd.d/telnet 
    service telnet
    {
            disable = no   #开启telnet服务
            flags           = REUSE                   #telnet服务可以重复使用
            socket_type     = stream                  #使用tcp的socket连接方式
            wait            = no
            user            = root
            log_type        = FILE /var/log/xinetd-telent.log    #telnet产生的日志存放文件
            only_from       = 192.168.0.0/16          #仅允许哪些主机访问,最好不要和no_access同时使用
            no_access       = 192.168.1.180           #不允许那个主机访问telnet,最好不要和only_from同时使用
            access_times    = 10:30-19:00             #设置用户可以访问telnet的访问时间
            cps             = 30 10                   #表示每秒可允许的连接数,第二个参数为当连接数超过第一个参数设定的值,要延时等待10秒再连接
            instances       = 50                      #表示telnet允许的最大连接总数
            per_source      = 5                       #表示同一个ip地址可以连接数
            bind            = 192.168.1.120           #绑定telnet监听的那个ip地址
            banner          = /etc/telnet.banner      #连接上telnet时显示的提示消息
            server          = /usr/sbin/in.telnetd    #表示telnet这个服务对应的二进制程序
            log_on_failure  += USERID                 #表示登录失败在日志中显示的字段
    }
    

    接下来创建/etc/telnet.banner文件,并重启xinetd服务是配置生效

    [root@linux-node1 ~]# vim  /etc/telnet.banner
    
    Welcome enter our telnet  server
    
    [root@linux-node1 ~]# /etc/init.d/xinetd restart
    Stopping xinetd:                                           [  OK  ]
    Starting xinetd:                                           [  OK  ]
    

    最后用客户端连接telnet来测试上面的配置参数是否生效。还有参数disable = no 也可以通过chkconfig telnet on或off来开启或关闭telnet

    对于telnet的配置参数的设置可以通过man  xinetd.conf都可以找到设置的方式! 

  • 相关阅读:
    Solr查询参数sort(排序)
    使用SolrNet访问Solr-5.5.0
    java impl
    Solr Facet 搜索时,facet.missing = true 的真正含义
    为solr增加用户验证
    每日晨读_20140705
    说说常用的服务器操作
    如何添加自定义脚本到开机自启动
    记录一个mysql连接慢的问题
    javascript时间戳和日期字符串相互转换
  • 原文地址:https://www.cnblogs.com/goser/p/8575110.html
Copyright © 2020-2023  润新知