天天看点

基于Tcp Wrapper和Xinetd的服务访问控制

一、tcp wrapper

Tcp wrapper:又叫TCPD网络资源访问控制器,工作在TCP层,通常情况下只能对基于TCP协议的某些访问做控制的,其实它对应的是一个库文件,由glibc提供的,工作于用户空间用户请求之间。当一个应用程序在编译时连接到该库时,当用户通过TCP协议连接本机去访问该服务时,其访问的流程就变成了以下流程:

<a target="_blank" href="http://blog.51cto.com/attachment/201204/233731280.png"></a>

当用户通过基于TCP协议访问该应用程序时,首先进入TCP/IP协议栈,之后由tcp wrapper进行检查访问是否被允许,如果允许则交送给APP,否则的话则直接拒绝访问。

因此可以将tcp wrapper理解为:一个工作在用户请求和服务套接字之间的检查过滤机制,拦截对于某种特定服务的符文请求并将其根据其定义的访问规则决定是否允许被访问的访问控制机制。

检查一个服务是否受tcp wrapper控制

#ldd `which bin_name` | grep "libwrap.so"

如果可以查找到,就说明其受tcp wrapper控制

但是有些程序在编译时是通过静态的方式链接库

如上面的那种就叫做动态链接库,即是在需要使用时进行动态加载

因此使用另外以命令:

#strings `which bin_name` | grep hosts

可以看到/etc/hosts.allow、/etc/hosts.deny

而tcp wrapper正式根据这两个文件中所定义的规则进行访问控制的

语法格式:

daemon_list:    Client_list    [:options]

进程列表(可执行程序的文件名):客户端列表(client_list)

例:sshd: 192.168.0.

允许192.168.0.0网段允许或拒绝访问sshd服务

daemon_list:

vsftpd,sshd,in.telnetd   #客户端列表

ALL(宏)                   #表示所有

[email protected]    #用户通过172.16.4.1来访问vsftp服务则受tcp wrapper控制

Client_list:

IP

network address

    network/mask 只接受长格式掩码,不接受短格式掩码

    172.16.  标准网络地址,注意不要漏掉 " . "

HOSTNAME

    FQDN        www.coolinuz.com

    .DOMNAME    .coolinuz.com

MACRO(宏)

    ALL

    LOCAL(跟本地主机IP在同一个网段)

    KNOWN(主机名可以被正常解析的)

    UNKNOWN(主机名不要可以被正常解析的)

    PARANOID(主机名的正向解析和反向解析不匹配)

    EXCEPT(除了,不包含)

spawn:记录日志  

    %c:client infomation(user@host)  登录者的IP

    %s:service info(service@host)   访问的服务

    %h:client hostname  客户端的主机名

    %p:server PID  

例如:以下规则均写在/etc/hosts.allow,/etc/hosts.deny格式一样,这里不做具体的演示。

in.telnetd: 172.16. EXCEPT 172.16.100.200

允许172.16.0.0网段中除了172.16.100.200主机访问telnet服务

in.telnetd: 172.16. :spawn echo "connect `date`" &gt;&gt;/var/log/tcpwrapper.log

允许172.16.0.0网段中主机访问telnet服务,并将其访问之日记录到/var/log/tcpwrapper.log

生效顺序:

/etc/hosts.allow --&gt; /etc/hosts.deny --&gt; 默认规则(allow)

分割线

===============================================================================================

二、xinetd

在linux中服务有两类:

standalone:独立守护进程

    自己管理自己,不受其他的限制与影响,响应速度快

transient:非独立守护进程:xinetd

    按需启动,无需关闭,节省资源

【1】xinetd:超级守护进程:

extended internet daemon

xinetd是新一代的网络守护进程服务程序,常用来管理多种轻量级Internet服务。

xinetd受tcpd控制,xinetd管理的所有服务都受tcpd控制

配置文件:/etc/xinetd.conf

片段:/etc/xinetd.d/*

【2】xinetd所管理的服务:

1. 标准Internet服务:telnet、ftp。

2. 信息服务:finger、netstat、systat。

3. 邮件服务:imap、imaps、pop2、pop3、pops。

4. RPC服务:rquotad、rstatd、rusersd、sprayd、walld。

5. BSD服务:comsat、exec、login、ntalk、shell、talk。

6. 内部服务:chargen、daytime、echo、servers、services、time。

7. 安全服务:irc。

8. 其他服务:name、tftp、uucp。

具体可以使用xinetd的服务在/etc/services文件中指出。

【3】配置文件/etc/xinetd.conf:

xinetd的配置文件是/etc/xinetd.conf,但是它只包括几个默认值及/etc/xinetd.d目录中的配置文件。如果要启用或禁用某项xinetd服务,编辑位于/etc/xinetd.d目录中的配置文件。/etc/xinetd.conf有许多选项,下面是RHEL 5.4的/etc/xinetd.conf。

# This is the master xinetd configuration file. Settings in the 

# default section will be inherited by all service configurations 

# unless explicitly overridden in the service configuration. See 

# xinetd.conf in the man pages for a more detailed explanation of 

# these attributes. 

defaults 

# The next two items are intended to be a quick access place to 

# temporarily enable or disable services. 

#       enabled         =            

#       disabled        = 

# Define general logging characteristics. 

        log_type        = SYSLOG daemon info        日志类型:交给SYSLOG 

        log_on_failure  = HOST 

        log_on_success  = PID HOST DURATION EXIT 

# Define access restriction defaults 

#       no_access       = 

#       only_from       = 

#       max_load        = 0 

        cps             = 50 10 

        instances       = 50 

        per_source      = 10 

# Address and networking defaults 

#       bind            = 

#       mdns            = yes 

        v6only          = no 

# setup environmental attributes 

#       passenv         = 

        groups          = yes 

        umask           = 002 

# Generally, banners are not used. This sets up their global defaults 

#       banner          = 

#       banner_fail     = 

#       banner_success  = 

includedir /etc/xinetd.d 

对应的各项意义:

— enabled|disabled:对应的服务是否启用

— log_type = SYSLOG daemon info:表示使用syslog进行记录日志,日志类型info

— log_on_failure = HOST:表示访问失败后记录客户机的IP地址。

— log_on_success  = PID HOST DURATION EXIT:记录访问成功后的日志,并且记录下访问的服务的PID,客户端IP,连接持续时间,退出时间

— includedir /etc/xinetd.d:表示告诉xinetd要包含的文件或目录是/etc/xinetd.d

其他的选项意义在后面介绍

【4】服务配置:

下面以/etc/xinetd.d/中的一个文件(telnet)为例。

# default: on 

# description: The telnet server serves telnet sessions; it uses \ 

#       unencrypted username/password pairs for authentication. 

service telnet 

     disable         = yes 

        flags           = REUSE 

        socket_type     = stream 

        wait            = no 

        user            = root 

        server          = /usr/sbin/in.telnetd 

        log_on_failure  += USERID 

下面说明每一行选项的含义。

— disable = yes:表示禁用这个服务。

— flags = REUSE:表示其标志位,表示可被重用,即可以被多次启动连接

— socket_type = stream:表示服务的数据包类型为stream即TCP。

— wait = no:表示不需等待,即服务将以多线程的方式运行。

— user = root:表示执行此服务进程的用户是root。

— server = /usr/bin/rsync:启动脚本的位置。

— log_on_failure += USERID:表示设置失败时,UID添加到系统登记表

【5】配置文件格式:

service SERVICENAME

{

    &lt;attribute服务属性&gt; &lt;assign_op赋值操作符&gt; &lt;value服务值&gt;

}

根据习惯,一般将对应的某个服务配置,在/etc/xinetd.d/下新建一个与服务同名的一个文件

&lt;attribute属性&gt;:

访问控制:

    only_from =    仅允许哪些访问

        IP:172.16.100.200

        NETMASK:172.16.0.0/16 172.16.0.0/255.255.0.0

        HOSTNAME:www.coolinuz.com

        DOAMIN:.coolinuz.com

    no_access =    不允许哪些访问,其定义方式和only_from一样,如果同时定义了,则匹配范围最小的生效

    access_times =    基于时间的访问控制,在什么时间内允许访问

        hh:mm-hh:mm

    bind = 监听本机的某个IP,提供服务的地址

资源访问控制:

    cps = 50 10

        每秒中允许最多连接进来的个数,当超过时的临时禁用多久

    per_source = 同一个IP最多允许并发的个数

    instances = 本服务最多被请求多少次,最大连接数

向启动的Server传递参数:

    server_args = 

    banner = file

&lt;assign_op赋值操作符&gt;

=:直接使用并覆盖默认值

+=:在默认配置基础上增加某个选项

-=:在默认配置基础上减去某个选项

当定义完一个服务后,使用xinetd重新载入即可

#service xinetd reload

笔者了解的还不够全,不够深,有错误或不清楚的,还请博友们指出。

本文转自 向阳草米奇 51CTO博客,原文链接:http://blog.51cto.com/grass51/833640,如需转载请自行联系原作者