歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux資訊 >> 更多Linux

使用xinetd

  Jose 描述了如何著手配置調整xinetd。 ~~~~~~~~~~~~~~~~~ xinetd 提供了訪問控制,改進的日志功能和資源管理,取代了inetd,已經成為了Red Hat 7 和Mandrake 7.2的Internet標准超級守護進程。對那些對它感興趣的人,這篇文章將引導你如何應 用一些它的特性,這些特性基於xinetd 2.1.8.8pre3版本。 ******** 導言 ******** xinetd的最初的作者,Panagoitis Tsirigotis ([email protected])。好像已經停止了這 個項目。 Rob Braun ([email protected])繼續了這個工作,現在負責維護這個軟件包。為了能 使select( )在我的老的libc5系統上使用,我不得不給當前的包添加幾對頭文件,這是我注意到的 問題。或許你需要它們,如下: xinetd/internals.c.orig Fri Jun 16 19:00:15 2000 +++ xinetd/internals.c Fri Jun 16 19:00:53 2000 @@ -12,6 +12,8 @@ #include #include #include #include #include #include "sio.h" ***************** 關於 xinetd ***************** xinetd 用同樣功能的,擴展了的語法取代了 inetd中的通用的行。 另外,還添加了日志功能和訪 問控制。 雖然 inetd 使用Venema的 tcp_wrappers 軟件(tcpd)控制TCP的連接, 但是你不能控 制UDP連接。而且,inetd對 RPC (portmapper)類型的服務也處理不好。 另外, 雖然使用inetd你 可以控制連接速度 ( 通過給wait或是 no wait 變量附加一個數, 例如nowait.1 每個 一秒鐘一個 實例),你不能控制實例的最大數。這能導致進程表攻擊,例如,一個有效的拒絕服務攻擊。通過使 用 xinetd,我們可以防止這樣。 我啟動xinetd通常用下面的命令,把它放在我的Internet服務啟動腳本中: /usr/sbin/xinetd -filelog /var/adm/xinetd.log -f /etc/xinetd.conf 這告訴 xinetd 對所有的服務都進行紀錄,日志保存到文件 /var/adm/xinetd.log 中,並且使用 配置文件 /etc/xinetd.conf.。這篇文章中的大量篇幅都將用在這個設置文件上。 ***************** 編譯時選項 ***************** 你應該注意的3個編譯時的選項提供了額外的訪問控制 libwrap, loadavg (用於監視負載均衡) 和 IPv6 支持。對於大多數libwrap“明白“的守護進程 (如 portmapper 和sendmail),在設置 腳本中的``with-libwrap''選項 告訴 xinetd支持tcp_wrappers文件/etc/hosts.allow 和/etc/hosts.deny。xinetd 的這些選項就像對 inetd那樣支持所有的 xinetd控制的監視進 程。 注意如果你從頭開始做 xinetd的話,就可以做訪問控制,不再需要tcpd。不管怎樣對libwrap 的支持是有用的--如果你從inetd/tcpd遷移並且也不想改變你的訪問文件的話 。 第二個有趣的設置選項是支持負載均衡監視,在 ./configure腳本中使用with-loadavg選 項。sendmail 支持在高負載的時候去掉連接,假定它已經脫離了控制並且正在當掉機器。用這個選 項可以激活max_load 選項以限制任何連接或是基於負載均衡機器的所有服務。 最後,添加 IPv6支持 可以通過在 ./configure 腳本中使用 with-inet6 capability選項來 完成。這使xinetd 支持 IPv6地址和連接。注意要使這個生效的話你的核心(和網絡)必須支 持 IPv6。當然了,IPv4 仍然被支持。 ************** 配置文件 ************** The xinetd 配置文件,通常可以手工或是自動從 inetd.conf文件生成。 前者費時間且容易出 錯;後者可以通過 itox軟件或者xconv.pl 腳本輕易完成。雖然 itox軟件正在被取消而傾向於使 用xconv.pl 腳本,它仍然很有用。但是,要注意重復的運行它會覆蓋原有的配置文件。itox 和xconv都以同樣的方式工作,我們用 itox來進行演示; $ itox < /etc/inetd.conf > xinetd.conf 更新一些的軟件,xconv,可以理解注釋,並且比 itox對tcpd 用得更好,使用 itox,你不得不指


定守護進程的路徑 ,如 /usr/sbin。 你想要包含的第一段就是默認的段,就像名字的暗示的那 樣,默認的inetd服務。 defaults { instances = 25 log_type = FILE /var/adm/servicelog log_on_sUCcess = PID HOST EXIT flags = NORETRY log_on_failure = HOST RECORD ATTEMPT only_from = 129.22.0.0 no_Access = 129.22.210.61 disabled = nntp uucp tFTP bootps who shell login exec disabled += finger } 馬上, 我們可以了解 xinetd 設置參數的語法: <指示directive> <操作符operator> <值value>. xinetd 指示符列在表一中,在這裡我們將忽略 flags,type,env 和 passenv指示符。 我對將 對only_from 和 no_access以及額外的日志選項加以更多的討論 表 1. xinetd的指示符 ----------------------------------------------------------------------- 指示符 描述 socket_type 網絡套接字類型, 流或者數據包 protocol IP 協議, 通常是TCP或者 UDP wait yes/no, 等同於inetd的wait/nowait user 運行進程的用戶 ID server 執行的完整路徑 server_args 傳遞給server的變量,或者是值 instances 可以啟動的實例的最大的值 start max_load 負載均衡 log_on_success 成功啟動的登記選項 log_on_failure 聯機失敗的時候的日志信息 only_from 接受的網絡或是主機 no_access 拒絕訪問的網絡或是主機 disabled 用在默認的 {} 中 禁止服務 log_type 日志的類型和路徑 FILE /SYSLOG nice 運行服務的優先級 id 日志中使用的服務名 ------------------------------------------------------------------------ 操作符非常簡單, = 或者+=。用 =,右邊給定的值傳給左邊的指示符。 +=也是非常直接的,用於 給一個已經指定的指示符添加一個值。沒有它,原先的指示符就會被覆蓋,這樣可以用來展開訪問列 表,或者跨越多行。 用如下的格式描述服務: ---------------------------------- 服務名 { 指示符 = 值 指示符 += 值 } ---------------------------------- 服務名一定要在 /etc/services列出 ,並且要用使用合適的socket和協議。 ***************** 關於訪問控制 ***************** 關於訪問控制的有幾句話。 首先, xinetd控制連接,不是通過包,它只是個用戶方的守護進程,如 同inetd 一樣。 同樣的, 可以打斷一個被服務器禁止的主機的SYN或是connect()。但不能打斷

象FIN [端口掃描使用帶有FIN 標志位的TCP包, 通常是nmap這樣的工具運行產生的]這樣的“秘密 “ 掃描。 不要把 xinetd 當作一個 firewall 用以阻止端口掃描。一個有經驗的入侵者能夠用這 些信息收集你的不同服務的訪問列表。幸運的是, 這些可以被xinetd紀錄。當你看到你的日志的時 候你的疑慮會消失的。 第二, xinetd, 2.1.8.8pre3版本,當一個系統試圖連接的時候進行名字查找,以前,它在啟動的 時候進行查找, 但是現在已經改變了。 使用訪問控制真的很簡單。第一個指示符是 only_from, 列出了從哪一個網絡或是主機我們可以接 受連接。這個規則可以被 no_access覆蓋。 你可以使用網絡號,如 10.0.0.0 或者 10,或者是網 絡名,包括 *.my.com 或者 .my.com 。主機名或者主機的 IP地址也可以在這裡使用指示 符0.0.0.0 t匹配所有的主機,監聽所有的地址。通過使用 no_access一旦符合標准拒絕就會被解 析。 再說一遍,網絡和主機可以指定。 *********** 服務配置 *********** 讓我們看一些基本的應用.我們要看的第一個基本的服務是echo,它是inetd 和 xinetd固有的服務。 service echo { socket_type = stream protocol = tcp wait = no user = root type = INTERNAL id = echo-stream } echo 作為root運行, 是一個tcp 流 並在內部處理。echo-stream指示符將出現在日志中。如果沒 在only_from或者是 no_access 指示符中,對這個服務的訪問不受限制。現在,讓我們看一個正規 的服務,daytime: service daytime { socket_type = stream protocol = tcp wait = no user = nobody server = /usr/sbin/in.date instances = 1 nice = 10 only_from = 0.0.0.0 } 再說一次,任何人都可以連接, 不過我們指明它以nobody的身份運行來返回信息。和前一個例子相 比,這個並沒有額外的什麼。現在我們看另一個服務 secure shell version 1。 下面的設置可以 防止sshd帶來的資源枯竭。 service ssh1 { socket_type = stream protocol = tcp instances = 10 nice = 10 wait = no user = root server = /usr/local/sbin/sshd1 server_args = -i log_on_failure += USERID only_from = 192.168.0.0 no_access = 192.168.54.0 no_access += 192.168.33.0 } 在這裡,我們建立了前面我們所作的。當作為超級用戶inetd或者 xinetd重新調用 sshd 需要 用 -i 參數, 所以我們把它放在了 server_args 指示符後。 注意:把這個標記添加到server標 識符出會導致失敗。在任何時候只有十個人可以同時使用, 在這個服務器上這不是問題,這個例子我 們從日志得到。另外作為默認信息, 如果不能連接的話,連接方的用戶 ID在RFC 1413種描述。最 後,我們有兩個網絡列表不能訪問這個服務器。 *************** 日志和 xinetd *************** 日志中有幾個值可以用於得到你的服務器的信息 表2 不同的日志指示值 __________________________________________________________________________ 值 成功/失敗 描述 PID success 當一個連接成功時登記產生的進程的 pid HOST both 登記遠程主機地址 USERID both 登記遠程用戶的RFC 1413 ID

EXIT success 登記產生的進程的完成 DURATION success 登記任務持續的時間 ATTEMPT failure 登記連接失敗的原因 RECORD failure 關於連接失敗的額外的信息 __________________________________________________________________________ 這樣,可以添加一些標准的行指明日志,就像下面的樣子。對一個成功連接的服務, 我們通常想登記 服務產生的進程id, 連接的主機和退出的時間: log_on_success = PID HOST EXIT 這可以給我們有用的信息用來排錯, 並明白服務器連接. 針對失敗, 我們可以記錄我們想要的: log_on_failure = HOST RECORD ATTEMPT Here we log the host that connected, 拒絕連接的原因和關於連接主機的額外的信息(由的時 候是那些試圖連接的用戶的 ID)。推薦你這樣做,可以對你的服務器有一個好的把握。 還看上面, 在我們的默認段中,我們的日志寫在 /var/adm/servicelog中。我們指定所有信息,成功和失敗的 都要被 xinetd記錄。我們的大多數信息看起來像這樣: 00/9/13@16:05:07: START: pop3 pid=25679 from=192.168.152.133 00/9/13@16:05:09: EXIT: pop3 status=0 pid=25679 00/10/3@19:28:18: USERID: telnet OTHER :www 使用這個信息, 可以輕易對 xinetd 排錯和進行和正常操作。也可以容易發現安全問題 ,如你試圖 阻止的連接企圖, 在日志中簡單的用 grep 作 ``FAIL'' 過濾, 這些項顯示如下: 00/10/4@17:04:58: FAIL: telnet address from=216.237.57.154 00/10/8@22:25:09: FAIL: pop2 address from=202.112.14.184 真正的安全問題需要另外的文章,但是,這足以說明,既然地址可以偽造,不要把地址報告看作固定 的信息。 xinetd.log文件,包含了從 xinetd得到的信息. 連接出錯的時候作為排錯信息很有用。 00/10/25@21:10:48 xinetd[50]: ERROR: service echo-stream, accept: Connection reset by peer ********************** 重新配置 xinetd ********************** 在xinetd.conf運行的時候,你可以編輯 xinetd.conf 文件。 要重新配置,發送一個信號l SIGUSR1 給 xinetd 進程: # ps -ax grep xinetd 50 ? S 5:47 /usr/sbin/xinetd -filelog /var/adm/xinetd.log -f /etc/xinetd.conf # kill -SIGUSR1 50 察看日志文件的尾部確保你的配置和改動已經生效。如果你是個遠程用戶的話要確保你退出後還可以 重新登陸進來。 注意使用-HUP,對xinetd重新配置,會實際導致 xinetd 停止操作。 從設計的角度看,這可以阻止 黑客重新配置你的 xinetd並且無需理解文檔就可以重新載入它。 ********************* 何時使用 xinetd ********************* 以我個人而言,對所有的服務我都使用 xinetd; 唯一一個對性能有影響的服務是我的web 守護進 程 Apache。不得不啟動太多的進程,太快了時間的效率是個問題。DNS 服務也不應該用 xinetd; 性能消耗太大。 sendmail 服務我也使用了 xinetd,對於允許連接的客戶,我能夠進行完美的控制。針對 sendmail我的設置如下: service smtp { socket_type = stream protocol = tcp wait = no user = root server = /usr/sbin/sendmail server_args = -bs instances = 20 nice = 10 only_from += 0.0.0.0 no_access += 129.22.122.84 204.0.224.254

} 即使是在一個高流量的郵件服務器上,對性能的影響也是可以忽略不計的。 我還把sshd 載入 到xinetd 以便阻止對它的進程表攻擊。 ******** 結論 ******** 我希望這篇文章對你配置或者是根據需要調整inetd很有幫助。正如你所看到的,它提供的特性要 比inetd甚至tcp_wrappers強大的多。Solar Designer http://www.openwall.com/) 有一個補丁 是針對稍舊一點的xinetd的版本的,2.2.1版本,允許基於IP 的實例控制,這有助於阻止簡單的進 程表攻擊。注意,不管怎樣,簡單的偽造可以繞過它。我不知道是否這個包對以後的 xinetd是否也 適用。



程表攻擊。注意,不管怎樣,簡單的偽造可以繞過它。我不知道是否這個包對以後的 xinetd是否也 適用。



到xinetd 以便阻止對它的進程表攻擊。 ******** 結論 ******** 我希望這篇文章對你配置或者是根據需要調整inetd很有幫助。正如你所看到的,它提供的特性要 比inetd甚至tcp_wrappers強大的多。Solar Designer http://www.openwall.com/) 有一個補丁 是針對稍舊一點的xinetd的版本的,2.2.1版本,允許基於IP 的實例控制,這有助於阻止簡單的進 程表攻擊。注意,不管怎樣,簡單的偽造可以繞過它。我不知道是否這個包對以後的 xinetd是否也 適用。



Copyright © Linux教程網 All Rights Reserved