Linux中TCP wrapper的使用
tcpwrapper的目的是對那些訪問控制功能較弱的服務提供訪問控制功能要想了解訪問控制就必須先知道服務監聽的概念:編程
服務監聽的兩種方式:vim
listen : socket 監聽在套接字上提供服務windows
循環 不停歇的查看某個端口來提供服務安全
有兩種方式來判斷一個服務是否支持tcp wrapper:服務器
1.經過查找庫文件看是否有libwrap網絡
ldd `which command`app
2.查看是否鏈接到/etc/hosts.allow|denyssh
strings `which command` # 查看靜態連接庫socket
若是有/etc/hosts.allowtcp
/etc/hosts.deny 就說明這個命令靜態連接了tcpwrraper
tcpwrraper自身工做在內核,卻能夠經過這兩個文件來提供訪問控制
請求
↓
服務 --->/etc/hosts.allow ---> 若有有就放行
↓ 沒有
/etc/hosts.deny ----> 若是沒有就放行
↓
若是有明確的匹配條目拒絕
/etc/hosts.allow|deny文件格式:damon_list: client_list [:option]
匹配服務列表:damon_list
vsftpd: 192.168.0.
vsftpd,sshd,in.telnetd:
ALL
daemon@host
vsftpd@192.168.0.186
#能夠簡寫192.168.0 表明192.168.0.0網段
#能夠一次指定多個服務
#可使用通配符ALL來指定全部的服務
#@只對某個主機來控制
匹配客戶端列表clent_list
IP
network address
network/mask: mask不能使用長度格式 ,只能是有徹底ip的格式
172.16.0.0--->172.16. 也能夠簡寫網段
HOSTNAME
fqdn
.a.rog 表示a.org域內的全部主機
option 選項
spawn #能夠經過spawn來實現日誌定義
spawn echo ""
#下面定義一個條件,只要用戶經過telnet登陸就記錄到一個日誌
vim /etc/hosts.deny
in.telnetd:ALL EXCEPT 172.16.0.1: spawnecho "Login attemp(`date`) %u from %a attemp to login %A, the deamon is%d." >> /var/log/telnet.log
##注意不能在echo後面用: 分號在這裏有特殊意義。
##能夠經過man 5 hosts_access 來查看上述%的含義
經常使用的宏定義 MACRO
ALL #表明全部主機,或者全部服務
LOCAL #表示本地主機,非FQDN主機
KNOWN #表示能夠被解析的主機
UNKNOWN #反向能夠被解析的主機
PARANOID #正反向解析不匹配的主機
EXCEPT #排除某個主機或某個網絡
-
怎麼來控制vsftpd的訪問
- 1. which vsftpd # 肯定文件路徑
- 2. vim /etc/hosts.deny # 改文件當即生效
- vsftpd: 172.16.100.100
-
- #假設僅容許172.16網段訪問
- vim /etc/hosts.allow
- vsftpd: 171.16 # 只容許172.16.0.0/16網段
- vim /etc/hosts.deny
- ALL: ALL # 拒絕其餘的用戶登錄
這樣就只有172.16.0.0網段能夠訪問了
控制SSH ,只容許192.168.0.32網段登錄,而且不容許192.168.0.32登錄
- vim /etc/hosts.deny
- ALL:ALL
- vim /etc/hosts.allow
- sshd: 192.168.0 EXCEPT 192.168.0.32
效果:
![](http://static.javashuo.com/static/loading.gif)
將/etc/hosts.deny 裏面的ALL: ALL去掉就能夠恢復登錄
![](http://static.javashuo.com/static/loading.gif)
1、Tcp_wrapper簡介
Tcp_wrapper是Wietse Venema開發的一個免費軟件。Tcp_wrapper的誕生有個小小的故事,大約1990年,做者所在大學的服務器屢屢受到一個外來黑客侵入,由於受害主機的硬盤數據多次被rm -rf/命令整個抹掉,因此找尋線索極爲困難,直到有一天晚上做者在工做的過程當中無心中發現這個黑客在不斷的finger 受害主機、偷窺受害者的工做。因而,一個想法誕生了:設計一個軟件,使它能夠截獲發起finger請求的IP,用戶名等資料。Venema很快投入了工做,而Tcp_wrapper也由此誕生!此後,Tcp_wrapper隨着普遍的應用逐漸成爲一種標準的安全工具。經過它,管理員實現了對inetd提供的各類服務進行監控和過濾。
Tcp_wrapper編譯安裝成功後,會生成一個tcpd程序,它能夠在inetd.conf這個控制文件中取代in.telnetd的位置,這樣,每當有telnet的鏈接請求時,tcpd即會截獲請求,先讀取管理員所設置的訪問控制文件,合乎要求,則會把此次鏈接原封不動的轉給真正的in.telnetd程序,由in.telnetd完成後續工做。若是此次鏈接發起的ip不符合訪問控制文件中的設置,則會中斷鏈接請求,拒絕提供telnet服務。Tcp_wrapper訪問控制的實現是依靠兩個文件:hosts.allow,hosts.deny來實現的。
若是咱們編輯/etc/syslog.conf文件,爲Tcp wrapper加入了日誌記錄功能,即:
#tcp wrapper loglocal3.info /var/log/tcplog
編輯結束後,保存文件,在/var/log下會生成tcplog文件,注意這個文件的讀寫屬性,應該只對root有讀寫權限。而後ps -ef | grep syslogd,找出syslogd的進程號,kill -HUP 重啓syslogd進程使改動生效。在這裏,咱們能夠預先看一看之後生成的tcplog文件內容,以下:
Jul 31 22:00:52 [url]www.test.org[/url] in.telnetd[4365]: connect from 10.68.32.1
Jul 31 22:02:10 [url]www.test.org[/url] in.telnetd[4389]: connect from 10.68.32.5
Jul 31 22:04:58 [url]www.test.org[/url] in.ftpd[4429]: connect from 10.68.32.3
Aug 2 02:11:07 [url]www.test.org[/url] in.rshd[13660]: connect from 10.68.32.5
Aug 2 02:11:07 [url]www.test.org[/url] in.rlogind[13659]: connect from 10.68.32.1
從上面咱們能夠看到,在安裝了Tcp_wrapper的主機上,系統的每一次鏈接,Tcp_wrapper都作了記錄,它的內容包括時間、服務、狀態、ip等,對攻擊這有很大的參考價值,不過,必定要記得清除日誌了。
2、inetd服務介紹
最重要的網絡服務進程,即inetd服務器程序,實際上,大部分請求不太頻繁的服務都是由它啓動的。
inetd程序在系統中是做爲一個服務進程出現,它監聽許多端口而且在獲得客戶請求時啓動這個端口的服務程序。inetd程序能夠由命令行來啓動:inetd [-d] -d選項用於打開調試信息。
inetd的工做方式是由/etc/inetd.conf和/etc/services文件設定的,下面咱們來解釋一下這兩個文件。
services文件的格式基本上是這樣:
netstat 15/tcp
qotd 17/tcpquote
msp 18/tcp# message send protocol
msp 18/udp# message send protocol
chargen19/tcpttytst source
chargen19/udpttytst source
ftp21/tcp
# 22 - unassigned
telnet23/tcp
每一行都是兩欄或者三欄,第一欄是服務的名字,第二行是使用的端口和協議,例如這裏的telnet 23/tcp是表示telnet服務應該使用端口23,協議類型爲tcp。第三欄是服務的別名,一般能夠省略。
inetd.conf是依賴於services文件的,它也是個文本文件,每行表明一種服務的工做方式,由"#"引導的行表示註釋行,非註釋行的格式大致是這樣:
服務名 數據類型 協議 監聽方式 用戶身份 服務程序 參數
例如,要啓動telnet的服務,應該加入這樣一行:
telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd
服務的名字就是telnet,這個名字按照/etc/services的定義將在23號端口提供服務;stream表示數據的發送和接收將使用簡單的流式文件讀寫來完成(fscanf和fprintf);tcp表示使用tcp協議,監聽方式這一欄能夠由兩個選項,即wait和nowait。簡單地說,若是相應的服務程序是多進程的,那麼要設置爲nowait,這時inetd會每接受到一個請求以後啓動一個服務程序進程,例如telnet就是這樣工做的,每一個獨立的telnet對話都會啓動一個telnet服務進程。相反,若是是單進程的,就能夠設置爲wait。
用戶身份表示對應服務進程啓動時所使用的uid/euid,由於telnet能夠是任何用戶發出,並且用戶能夠經過telnet執行任何命令,因此使用root用戶身份。/usr/sbin/tcpd 是實際啓動的程序,這個程序實際是一個通用的TCP鏈接處理程序,參數使用in.telnetd,連起來就是當有23端口的鏈接請求時,inetd去執行/usr/sbin/tcpd in.telnetd。
一般狀況下,各類服務都已經寫在inetd.conf中,不啓用的服務使用註釋#使之失效。若是須要打開這服務,只要把引導的#註釋符號刪除就能夠了。值得一提的是/usr/sbin/tcpd程序,它是一個TCP鏈接過濾程序,一般大部分須要作鏈接驗證的服務都應該經過tcpd程序啓動,這個程序可以自動對客戶機器的IP地址進行驗證而且進行某些安全性過濾,其中最主要的功能是禁止某些地址來的鏈接。例如,按照
上面的形式,in.telnetd程序就是經過/usr/sbin/tcpd程序啓動的,所以能夠對telnet請求進行地址檢驗。
tcpd的地址檢驗是經過/etc/hosts.deny和/etc/hosts.allow文件完成的,若是不存在這樣的文件,你能夠本身創建一個,二者的語法幾乎是同樣的,只是hosts.allow是容許某個地址來的鏈接,而hosts.deny是禁止某個地方來的鏈接。基本的語法是:服務程序:客戶地址(域名或主機名)
服務程序是指經過tcpd程序被啓動的程序名字,客戶地址是相關地址的一個列表,例如,/etc/hosts.allow文件中加入這樣一行:in.telnetd:10.0.0.2 。將容許10.0.0.2處的機器使用本地的telnet服務,若是這一行加入到/etc/hosts.deny重將禁止10.0.0.2處的機器登陸上來。
地址可使用集合形式,經常使用的集合形式主要有下列幾種:
以逗點開頭的字符串定義一個域,例如.edu.cn表示全部域名後綴是.edu.cn的機器。
以逗點結束的字符串定義一串IP地址,如202.199.248.表明202.199.248.0到202.199.248.255。
以/分開的字符串解釋爲網絡地址/子網掩碼的形式,例如172.13.0.0/255.255.0.0表明172.13.0.0到172.13.255.255。
另外,地址和服務程序均可以使用通配符,通配符有下列幾種:
ALL 表明全部,全部的服務程序或者全部的地址。常常和EXCEPT子句連用,EXCEPT表明「除了」。例如,在hosts.deny中寫上ALL:ALL EXCEPT 202.199.248.將禁止除了202.199.248.*的機器以外的全部客戶機器使用任何基於tcpd的服務。寫上ALL EXPECT in.telnetd:ALL將使得除了telnet之外的全部基於tcpd的服務都被禁止。
LOCAL 指代全部沒有名字後綴的機器。
KNOWN 全部IP地址和域名都知道的機器
UNKNOWN IP地址或者域名沒法肯定的機器
PARANOID IP地址和從域名服務返回的名字不匹配的機器。
tcp wrapper是一款訪問控制的工具,很相似iptables的功能,可是要比iptables功能要小不少,通常只有在知足如下條件時才能使用tcp wrapper
1),在編譯的時候明確表示能接受tcp wrapper的控制
經過ldd `which sshd`來查看
經過strings `which portmap`| grep hosts查看
2),必須是tcp協議
這個時候才能實現tcp wrapper的控制,雖然能功能範圍少了一點,可是tcp wrapper配置起來要比iptables簡單不少
能接受tcp wrapper控制的服務好比:telnet ,ssh ,vsftp
所謂的監遵從編程角度來說就是一段程序經過循環不停的對一個端口進行掃描
實際上tcp wrapper的實現就是主要是經過配置如下兩個文件:
/etc/hosts.allow
/etc/hosts.deny
tcp wrapper的格式:
daemon_list: client_list [:options]
服務名 : 客戶端名 [選項]
client_list有如下幾種格式:
IP
network address/mask #網絡地址(只能使用相似255.255.徹底ip地址 格 式,不能使用位長度表示)
hostname #主機名稱
.a.org #表示.a.org域內的全部主機
如下是以vsftp爲例進行演示(拒絕172.16.100.1訪問ftp服務器):
1),yum install vsftpd
2), service vsftpd start
3),vim /etc/hosts.deny 裏面寫入
vsftpd: 172.16.100.1
4),配置完當即生效,不須要重啓服務
5),經過windows客戶端進行認證
只容許172.16.網段訪問ftp:
1),vim /etc/hosts.allow 寫入: vsftpd: 172.16.
2), vim /etc/hsots.deny : vsftpd: ALL
如下是對telnet(監聽23號端口)的介紹:
telnet是一個非獨立守護進程,由超級守護進程(xinetd)代爲管理,它接受tcp wrapper的控制,可是 實際上不是telnet接受tcp wrapper的控制,而是xinetd接受tcp wrapper的控制
telnet傳輸的過程是明文
telnet通常不容許管理員直接登陸(能夠先以普通身份登進去,而後su - root)
1),yum install telnet-server
2),ls /etc/xinetd.d #裏面會有telnet,由此說明telnet是接受超級進程xinetd控制
3),ldd `which xinetd` #能夠發現超級守護進程是接受tcp wrapper控制的
4),chkconfig telnet on #注意這裏只是說明下一次開機會自動啓動,不能當即生效
5),service xinetd restart #經過重啓超級進程來重啓telnet
6),useradd gentoo
7),passwd gentoo
8),telnet 172.168.25.1測試
只容許172.16.0.1登陸telnet:
vim /etc/hosts.deny 寫入: in.telnetd:ALL EXCEPT 172.16.0.1
[:options] 介紹:
spawn #發起一些額外的命令
vim /etc/hosts.deny 寫入:
in.telnet: ALL EXCEPT 172.16.0.1 : spawn echo "%u from %a attempt to login %A ,the daemon is %d." >>/var/log/telnet.log
除了spawn還有allow 和 deny分別表示在/etc/hosts.allow中deny 和 /etc/hosts.deny中容許 好比: vim /etc/hosts.deny中寫入 : in.telnetd: 172.16. :ALLOW ALL:ALL #表示只容許172.16.網段使用telnet登陸