xinetd不太詳的詳解

xinetd不太詳的詳解

http://blog.sina.com.cn/s/blog_88cdde9f01019fg5.htmlhtml

######################################linux

大蚊子整理、修正shell

2012.12.4 20:00apache

######################################vim

xinetd(eXtended InterNET services Daemon)安全

xinetd提供相似於inetd+tcp wrapper的功能,但更增強大、安全。服務器

 

1. xinetd特點

 

1.強大的存取控制功能網絡

— 內置對惡意用戶和藹意用戶的差異待遇設定。多線程

— 使用libwrap支持,其效能更甚於tcpd。併發

— 能夠限制鏈接的等級,基於主機的鏈接數和基於服務的鏈接數。

— 設置特定的鏈接時間。

— 將某個服務設置到特定的主機以提供服務。

 

2.有效防止DoS攻擊

— 能夠限制鏈接的等級。

— 能夠限制一個主機的最大鏈接數,從而防止某個主機獨佔某個服務。

— 能夠限制日誌文件的大小,防止磁盤空間被填滿。

 

3.強大的日誌功能

— 能夠爲每個服務就syslog設定日誌等級。

— 若是不使用syslog,也能夠爲每一個服務創建日誌文件。

— 能夠記錄請求的起止時間以決定對方的訪問時間。

— 能夠記錄試圖非法訪問的請求。

 

4.轉發功能

能夠將客戶端的請求轉發到另外一臺主機去處理。

 

5.支持IPv6

xinetd自xinetd 2.1.8.8pre*起的版本就支持IPv6,能夠經過在./configure腳本中使用with-inet6 capability選項來完成。注意,要使這個生效,核心和網絡必須支持IPv6。固然IPv4仍然被支持。

 

6.與客戶端的交互功能

不管客戶端請求是否成功,xinetd都會有提示告知鏈接狀態。

 

7.Xinetd的缺點

當前,它最大的缺點是對RPC支持的不穩定性,可是能夠啓動protmap,使它與xinetd共存來解決這個問題。

 

2. 使用xinetd啓動守護進程

 

原則上任何系統服務均可以使用xinetd,然而最適合的應該是那些經常使用的網絡服務,同時,這個服務的請求數目和頻繁程度不會過高。像DNS和Apache就不適合採用這種方式,而像FTP、 Telnet、SSH等就適合使用xinetd模式,系統默認使用xinetd的服務能夠分爲以下幾類。

① 標準Internet服務:telnet、ftp。

② 信息服務:finger、netstat、systat。

③ 郵件服務:imap、imaps、pop二、pop三、pops。

④ RPC服務:rquotad、rstatd、rusersd、sprayd、walld。

⑤ BSD服務:comsat、exec、login、ntalk、shell、talk。

⑥ 內部服務:chargen、daytime、echo、servers、services、time。

⑦ 安全服務:irc。

⑧ 其餘服務:name、tftp、uucp。

 

具體可使用xinetd的服務在/etc/services文件中指出。這個文件的節選內容以下所示:

# /etc/services:

# $Id: services,v 1.40 2004/09/23 05:45:18 notting Exp $

# service-name  port/protocol  [aliases ...]   [# comment]

tcpmux      1/tcp               # TCP port service multiplexer

tcpmux      1/udp               # TCP port service multiplexer

rje     5/tcp                   # Remote Job Entry

rje     5/udp                   # Remote Job Entry

echo        7/tcp

echo        7/udp

discard     9/tcp       sink null

discard     9/udp       sink null

………

服務名        端口/協議         別名      #註釋

 

Internet 網絡服務文件中,記錄網絡服務名和它們對應使用的端口號及協議。

通常狀況下,不要修改該文件的內容,由於這些設置都是Internet標準的設置。一旦修改,可能會形成系統衝突,使用戶沒法正常訪問資源。

 

Linux系統的端口號的範圍爲0~65 535,不一樣範圍的端口號有不一樣的意義。

— 0:不使用。

— 1~1023:系統保留,只能由root用戶使用。

— 1024~4999:由客戶端程序自由分配。            已被使用的端口1024~49151

— 5000~65535:由服務器程序自由分配。          動態和私有端口49151~65535

 

3. Xinet工做方式:

 

 

3.1 服務的啓動和管理主要有stand alone和super daemon兩種。

stand alone由啓動腳本啓動,腳本通常存儲在/etc/init.d/,經過/etc/init.d/[service name] restart 啓動。服務直接加載在內存中,響應迅速,適合訪問量較大的服務。

super daemon經過超級守護進程—xinetd來控制服務。系統服務託管在xinetd進程下,當有請求訪問端口時,xinetd會啓動該服務處理訪問請求。同時xinetd還提供監控、訪問控制等安全特性,缺點是響應速度較慢。

 

3.2 xinetd提供的服務處理模式分爲兩種,一種是多線程,一種是單線程。

multi-threaded:爲每個容許的訪問創建一個daemon提供服務。

single-threaded:爲全部訪問創建一個daemon提供服務。

 

3.3 Daemon工做狀態:

signal-control:只要有客戶端請求,就當即執行。如打印機服務(cupsd)

interval-control:每隔一段時間執行。如atd、crond。

 

4. 數據包訪問服務器資源:

 

數據包->iptables->tcp wrapper->服務->Selinux->權限、ACL->本地資源

數據包->iptables->tcp wrapper->xinetd->

                                  └>服務->SeLinux->權限、ACL->本地資源

 

Iptables對數據包ip、端口、mac等信息進行過濾。

Tcp wrapper針對tcp包頭進行ip、端口等信息的過濾。

Xinetd監控、訪問控制、時間管理、連接管理等。

服務:服務自己的權限控制、訪問控制、資源控制。

SeLinux控制進程對系統資源的訪問,進程上下文匹配文件資源上下文標籤。

權限、ACL目錄以及文件的權限、訪問控制列表,也能夠實現許多資源控制。

本地資源:存儲在本地的一系列須要被外部地址訪問的資源。銀行卡密碼等 ^.^~

 

# grep -i 'disable' /etc/xinetd.d/* //查看Xinetd服務狀態

 

5. /etc/xinetd.conf — xinetd主配置文件

 

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 //日誌的記錄級別(共7級)

        log_on_failure  = HOST           //發生錯誤時記錄主機信息

        log_on_success  = PID HOST DURATION EXIT       //成功登錄時記錄的信息

 

# Define access restriction defaults //訪問控制

#       no_access       = //禁止訪問

#       only_from       = //僅容許訪問

#       max_load        = 0 //用一個浮點數做爲負載係數,當1分鐘內負載達到時,該服務將中止處理後續鏈接,只有Linux、Solaris、FreeBSD支持。

        cps             = 50 10      //每秒超過50個鏈接,等待10s。

        instances       = 50              //同一個服務的最大被鏈接數

        per_source      = 10             //同一客戶端的最大鏈接數

 

# Address and networking defaults //網絡設置

#       bind            = //綁定主機ip地址

#       mdns            = yes //支持組播DNS(multicast DNS),目前只有Mac OS X和linux支持。

        v6only          = no             //僅容許IPv6

 

# setup environmental attributes //環境屬性設置

#       passenv         = //xinetd環境中的環境變量表,該表在激活時傳遞給服務。

        groups          = yes //設定組名

        umask           = 002 //設定文件權限掩碼

 

# Generally, banners are not used. This sets up their global defaults //設置登陸顯示的信息

#       banner          = //創建鏈接時就顯示該文件信息。

#       banner_fail     = //鏈接失敗時,顯示文件內的信息。

#       banner_success  = //鏈接成功時,顯示文件內的信息。

}

includedir /etc/xinetd.d

xinetd守護進程讀取/etc/xinetd.d/之中的配置信息,其餘未指定的參數均按/etc/xinetd.conf中的默認配置設置。

 

6. /etc/xinetd.d/ — xinetd子配置文件

 

/etc/xinetd.d/ — xinetd子配置文件,大概都是形如如下格式。

service

{

<<A name=OLE_LINK7>attribute> <<A name=OLE_LINK6>assign_op> ...

}

解釋:

1.      Service_name與/etc/services有關,xinetd會啓動與名字對應的端口。

2.      Attribute是一些xinetd管理參數

3.      assign_op參數設定方法

                   =:設定參數

                   +=:在默認配置中加入這些參數

                   -=:在默認配置中去掉這些參數

 

Attribute參數:(待補充)

Attribute屬性

explain說明

通常選項:服務啓動、啓動參數

Disable

設定值:[yes|no]   預設:disable = yes

要啓動服務,將此參數設置爲disable = no

Id

設定值:[服務名稱]

對於多個同名的服務,可用id來取代服務名。如/etc/xinetd.d/time-stream

Server

設定值:[program]

啓動服務的進程。如server = /usr/bin/rsync

server_args

設定值:[服務啓動參數]

設置服務啓動時須要的參數。如rsync:server_args = --daemon

最終服務啓動方式:/usr/bin/rsync --daemon

user

設定值:[使用者帳號]

若是xinetd以 root身份管理,這個選項能夠指定其餘用戶。daemon會以指定的用戶啓動服務。

mdns

設定值:[yes/no]   預設:yes

支持組播DNS(multicast DNS),目前只有Mac OS X和linux支持。查詢主機發送一個組播DNS查詢數據包,局域網內被查詢的主機響應。(與ARP相似)

group

和user意思相同!

banner

設定值:[文件路徑]

創建鏈接時,顯示該文件中預設信息。

banner_success

設定值:[文件路徑]

創建鏈接成功時,顯示該文件中預設信息。

banner_fail

設定值:[文件路徑]

創建鏈接失敗時,顯示該文件中預設信息。

通常選項:封包處理方式

socket_type

設定值:[stream|dgram|raw] 與封包有關

Stream — TCP數據包

dgram — UDP數據包

raw — 服務須要直接訪問IP

protocol

設定值:[tcp|udp] 通常使用socket_type取代這個選項

參考/etc/protocols中的通信協議,通常使用tcp、udp。

wait

設定值:[yes(single)|no(multi)]  預設值:wait = no

設定服務的Multi-threaded或single-threaded運行方式。

通常設定爲wait = no,容許爲每一個鏈接建立一個daemon。

Udp — yes       Tcp — no

instances

設定值:[數字或UNLIMITED]

服務可接受的最大鏈接數。

per_source

設定值:[數字或NULIMITED]

每一個IP的最大鏈接數。

cps

設定值:[數字1  數字2]

避免短期內大量的訪問請求致使系統過於繁忙,能夠設置這個選項。

數字1:一秒內可以接受的最多新鏈接

數字2:若超過數字1,暫時關閉該服務的秒數。

max_load

設定值:浮點數[0 2.5 4.5等]

用一個浮點數做爲負載係數,當1分鐘內負載達到時,該服務將中止處理後續鏈接,只有Linux、Solaris、FreeBSD支持。Xinetd編譯須要-with-loadavg參數

Flags

設定值:

[INTERCEPT,NORETRY,IDONLY,NAMEINARGS,NODELAY,KEEPALIVE,NOLIBWRAP,SENSOR,IPv4,IPv6,LABELED,REUSE] 可使用多個參數

 

SENSOR:做用是使用一個SENSOR代替當前服務。

須要注意的幾個問題:

1.  該服務是管理員不想提供的服務;

2.  服務不能檢查的掃描動做;

3.  記錄向該服務訪問的客戶地址,並記錄到做用於全局的no_access列表中,使得請求過該服務的IP在deny_time過時以前一直都拒絕訪問;

4.  xinetd認爲該服務server屬性是INTERNAL;

5.  使用該標記的socket_type爲stream,須要設置wait爲no。

通常選項:日誌記錄選項

log_type

設定值:[日誌進程 日誌等級]

運行服務時,記錄的日誌信息。默認日誌記錄等級是info。

Log_on_success

log_on_failure

設定值:[PID,HOST,USERID,EXIT,DURATION]

『成功登陸』或『失敗登陸』後記錄的內容:

PID:服務進程號;

HOST:遠程主機IP

USERID:客戶登陸的帳號

EXIT:斷開鏈接時記錄的項目

DURATION:用戶使用服務的時間

高級選項:網絡端口、聯機機制等

Env

設定值:[變量名稱=變量內容]

設定一個環境變量,在服務被激活時追加到服務環境變量中。

Passenv

設定值:[變量1=值1 變量2=值2 變量3=值3]

用空格分開的xinetd環境中的環境變量表,該表在激活時傳遞給服務程序。

Port

設定值:[端口號]

設置服務監聽的端口,注意port與/etc/services內的記錄要相同。

Redirect

設定值:[遠程主機IP port]

將客戶端對服務的請求轉發到另一臺服務器上去。

Includedir

設定值:[目錄名稱]

將外部配置導入當前的配置文件。

Nice

設定值:[-20至19]

設定服務運行的優先級。

安全控制

bind

設定值:[IP]

綁定主機的一個ip地址,只爲它提供服務。多ip地址時有用。

interface

設定值:[IP]

同上

only_from

設定值:[0.0.0.0, 192.168.1.0/24, hostname, domainname]

只容許某些ip訪問服務。

no_access

設定值:[0.0.0.0, 192.168.1.0/24, hostname, domainname]

拒絕某些主機訪問服務。

access_times

設定值:[00:00-12:00, HH:MM-HH:MM]

設置服務可訪問的時間段。

umask

設定值:[000, 777, 022]

設定文件權限掩碼

 

6.1 基本屬性

 

上面的列表是xinetd可用的全部屬性,針對一個服務只須要指定幾個屬性。

xinetd設定服務必需的屬性:

屬性

適用範圍

socket_type

全部服務

user

Non_internal service only 非內部服務

server

Non_internal service only 非內部服務

wait

全部服務

protocol

不在/etc/services中的全部RPC服務和全部其餘服務

rpc_vision

全部RPC服務

rpc_number

不在/etc/rpc中的任何RPC服務

port

不在/etc/services中的非RPC服務

 

6.2 支持多操做符的屬性

 

對於大多數的服務而言,在針對一個服務的設定中操做符只能出現一次,並只支持=操做符,下面六個屬性能夠支持多個操做符。

 

支持多操做符的屬性:

屬性

適用範圍

only_from

支持全部操做符

no_access

log_on_success

log_on_failure

passenv

env

不支持-=操做符

 

6.3 默認屬性

 

defaults項是實現爲全部服務指定某些屬性的默認值。默認值可被每一個服務項取消或修改。

 

可用的defaults屬性:

屬性

適用範圍

log_on_success

能夠用=操做符改寫,或用+=或-=操做符修改

log_on_failure

only_from

no_access

passenv

instances

能夠用=操做符改寫

log_type

disabled

註銷的服務

enabled

指定啓用的服務

 

6.4 disabled與enabled

 

前者的參數是禁用的服務列表,後者的參數是啓用的服務列表。共同點是格式相同(屬性名、服務名列表與服務中間用空格分開,例如disabled = in.tftpd in.rexecd),此外,它們都是做用於全局的。若是在disabled列表中被指定,那麼不管包含在列表中的服務是否有配置文件和如何設置,都將被禁用;若是enabled列表被指定,那麼只有列表中的服務纔可啓動,若是enabled沒有被指定,那麼disabled指定的服務以外的全部服務均可以啓動。

6.5 注意問題

 

① 在從新配置的時候,下列的屬性不能被改變:socket_type、wait、protocol、type;

② 若是only_from和no_access屬性沒有被指定(不管在服務項中直接指定仍是經過默認項指定),那麼對該服務的訪問IP將沒有限制;

③ 地址校驗是針對IP地址而不是針對域名地址。

 

7. 對內外網分別應用不一樣設置—telnet爲例

 

7.1 要求:

內網:

o 綁定內網;

o 對127.0.0.0/8 開放登錄權限;

o 沒有鏈接限制;

o 127.0.0.100和127.0.0.200不容許使用telnet登錄。

外網:

o 綁定外網

o 僅開放192.168.0.0/24網絡和.edu.cn域能夠登錄;

o 開放的時間爲早上1-9 點,晚上20-24點;

o 服務最大容許10個鏈接。

 

7.2 配置:

service telnet

{

#——————————增長———

disable = yes    #啓動

bind = 127.0.0.1       #綁定服務在127.0.0.1這個ip上

only_from = 127.0.0.0/8           #容許登錄

no_access = 127.0.0.{100,200}        #限制登錄

instances = UNLIMITED                     #不限制服務最大鏈接數

#——————————增長———

        flags           = REUSE

        socket_type     = stream

        wait            = no

        user            = root

        server          = /usr/sbin/in.telnetd

        log_on_failure  += USERID

        disable         = yes

}

service telnet

{

#——————————增長———

disable = yes    #啓動

bind = 192.168.0.250       #綁定服務在192.168.1.100這個ip上

only_from = 192.168.0.0/24    #容許訪問

only_from += .edu.cn                #容許訪問

access_times = 01:00-9:00 20:00-23:59 #提供telnet服務的時間

instances = 10          #服務僅提供10個連接

#——————————增長———

        flags           = REUSE

        socket_type     = stream

        wait            = no

        user            = root

        server          = /usr/sbin/in.telnetd

        log_on_failure  += USERID

        disable         = yes

}

 

7.3 測試:

xinetd監聽了2個ip地址。

 xinetd不太詳的詳解

Xinetd爲不一樣的網段提供了不一樣的訪問控制。

xinetd不太詳的詳解

7.4 總結:

不一樣的ip地址相同的服務可使用相同的端口。一個主機有2塊網卡對應不一樣的網絡,xinetd可提供不一樣的配置。

 

8. 利用xinetd設置sensor陷阱,隔離惡意訪問

 

許多暴露在公網的服務器都承擔了巨大的安全風險,時時可可均可能被掃描、被攻擊。當有人鏈接管理員不但願被訪問的端口時,xinetd能夠記錄這個端口,並拒絕這個傢伙對服務器中xinetd所託管服務端口的訪問請求,這樣他就跟你的服務器無緣了。

 

Xinetd.conf參數中有一項deny_time是用來設置拒絕時間的,flags選項用來爲服務添加標誌,不一樣的標誌有不一樣的功能,具體以下:

         Deny_time =

                   直到xinetd重啓 | 僅記錄日誌 | 拒絕X分鐘

 

         Flags=SENSOR //記錄訪問服務的IP地址,添加到做用於全局的no_access列表中,使得請求過該服務的IP在deny_time過時以前一直都拒絕訪問。

 

8.1 實驗:

#yum install rsh-server //服務端

#yum install rsh                 //客戶端,提供rsh、rlogin、rcp命令

#yum install telnet-server //telnet用於測試

#yum install telnet

#chkconfig rlogin on

#chkconfig rsh on

#chkconfig telnet on

 

#vim /etc/xinetd.d/rlogin

service login

{

        disable = no

        socket_type             = stream

        wait                    = no

        user                    = root

        log_on_success          += USERID

        log_on_failure          += USERID

        server                  = /usr/sbin/in.rlogind

                   flags                                               = SENSOR

                   deny_time                                    = forever

}

 

8.2 客戶機測試

#yum install telnet rsh

 xinetd不太詳的詳解

Xinetd服務實際上監聽了rlogin-server的端口,因爲帶有flags=SENSOR標記,sensor會記錄客戶ip並將其添加到真對全局的no_access列表裏面去。因此,惡意的訪問都不能訪問xinetd託管的服務了。

注:重啓xinetd服務,禁用ip會失效。

 

另一個高級用法是,利用sensor爲任意端口作陷阱。

1.修改/etc/services下對應服務的端口

2.在/etc/xinetd.d/telnet配置文件中添加port=80

這樣外部訪問80端口的請求都會被禁止,能夠將apache修改成其餘很是規端口。

 

9. 創建自定義xinetd託管服務

 

1.編寫一個test.c程序並編譯

#cat /tmp/test.c

#include

main()

{

printf ("hello world\n");

return 0;

}

#gcc /tmp/test.c -o /tmp/test

 

2.在/etc/xinetd.d/中增長配置文件

#cp telnet test

#vim test

service test_server

{

        disable = no

        flags           = REUSE

        socket_type     = stream

        wait            = no

        user            = root

        server          = /tmp/test

        log_on_failure  += USERID

        port            =9015

}

 

3.在/etc/services裏添加一行

test_server        9015/tcp

 

4.重啓xinetd服務

#service xinetd restart

 

5.測試

另外一臺計算機上運行

#telnet 192.168.0.250 9015

xinetd不太詳的詳解

自定義xinetd服務,須要必定的linux C開發技能,要求熟悉linux C語言的網絡開發。這對我來講仍是頗有難度的。

 

10. xinetd防止拒絕服務攻擊(Denial of Services)的緣由

 

xinetd能有效地防止拒絕服務攻擊(Denial of Services)的緣由以下。

1.限制同時運行的進程數

經過設置instances選項設定同時運行的併發進程數:

Instances=20

當服務器被請求鏈接的進程數達到20個時,xinetd將中止接受多出部分的鏈接請求。直到請求鏈接數低於設定值爲止。

 

2.限制一個IP地址的最大鏈接數

經過限制一個主機的最大鏈接數,從而防止某個主機獨佔某個服務。

per_source=5

這裏每一個 IP地址的鏈接數是5個。

 

3.限制日誌文件大小,防止磁盤空間被填滿

許多攻擊者知道大多數服務須要寫入日誌。入侵者能夠構造大量的錯誤信息併發送出來,服務器記錄這些錯誤,可能就形成日誌文件很是龐大,甚至會塞滿硬盤。同時會讓管理員面對大量的日誌,而不能發現入侵者真正的入侵途徑。所以,限制日誌文件大小是防範拒絕服務攻擊的一個方法。

log_type FILE.1 /var/log/myservice.log 8388608 15728640

這裏設置的日誌文件FILE.1臨界值爲8MB,到達此值時,syslog文件會出現告警,到達15MB,系統會中止全部使用這個日誌系統的服務。

 

4.限制負載

xinetd 還可使用限制負載的方法防範拒絕服務攻擊。用一個浮點數做爲負載係數,當負載達到這個數目的時候,該服務將暫停處理後續的鏈接。

max_load = 2.8

上面的設定表示當一項系統負載達到2.8時,全部服務將暫時停止,直到系統負載降低到設定值如下。

 

注意:

要使用這個選項,編譯時應加入「--with-loadavg」,xinetd將處理max-load配置選項,從而在系統負載太重時關閉某些服務進程,來實現防範某些拒絕服務攻擊。

 

5.限制全部服務器數目(鏈接速率)

xinetd 可使用cps選項設定鏈接速率,下面的例子:

cps = 25 60

上面的設定表示服務器每秒最多啓動25個鏈接,若是達到這個數目將中止啓動新服務60秒。在此期間不接受任何請求。

 

6.限制對硬件資源的利用

經過rlimit_as和rlimit_cpu兩個選項能夠有效地限制一種服務對內存、中央處理器的資源佔用:

rlimit_as = 8M

rlimit_cpu=20

上面的設定表示對服務器硬件資源佔用的限制,最多可用內存爲8MB,CPU每秒處理20個進程。

 

   xinetd的一個重要功能是它可以控制從屬服務能夠利用的資源量,經過設置能夠達到這個目的,有助於防止某個xinetd服務佔用大量資源,從而致使「拒絕服務」狀況的出現。

 

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

相關文章
相關標籤/搜索