第七章、網路安全與主機基本防護:限制埠口, 網路升級與 SELinux - daniel-qa/Network GitHub Wiki
第七章、網路安全與主機基本防護:限制埠口, 網路升級與 SELinux #
7.3 限制連線埠口 (port)
為什麼我們的主機會回應網路上面的一些要求封包呢?例如我們設定了一部 WWW 主機後,當有來自 Internet 的 WWW 要求時,我們的主機就會予以回應,這是因為我們的主機有啟用了 WWW 的監聽埠口啊!所以,當我們啟用了一個 daemon 時,就可能會造成主機的埠口在進行監聽的動作,此時該 daemon 就是已經對網路上面提供服務了!萬一這個 daemon 程式有漏洞,因為他提供了 Internet 的服務,所以就容易被 Internet 上面的 cracker 所攻擊了!所以說,仔細的檢查自己系統上面的埠口到底開了多少個,並且予以嚴格的管理,才能夠降低被攻擊的可能性啊!
快講到爛掉了!當妳啟動一個網路服務,這個服務會依據 TCP/IP 的相關通訊協定啟動一個埠口在進行監聽, 那就是 TCP/UDP 封包的 port (埠口) 了。我們從第二章也知道網路連線是雙向的,伺服器端得要啟動一個監聽的埠口, 用戶端得要隨機啟動一個埠口來接收回應的資料才行。那麼伺服器端的服務是否需要啟動在固定的埠口? 用戶端的埠口是否又是固定的呢?我們將第二章中與 port 有關的資料給她彙整一下先:
伺服器端啟動的監聽埠口所對應的服務是固定的: 例如 WWW 服務開啟在 port 80 ,FTP 服務開啟在 port 21,email 傳送開啟在 port 25 等等,都是通訊協定上面的規範!
- 用戶端啟動程式時,隨機啟動一個大於 1024以上的埠口: 用戶端啟動的 port 是隨機產生的,主要是開啟在大於 1024 以上的埠口。這個 port 也是由某些軟體所產生的, 例如瀏覽器、Filezilla 這個 FTP 用戶端程式等等。
一部伺服器可以同時提供多種服務: 所謂的『監聽』是某個服務程式會一直常駐在記憶體當中,所以該程式啟動的 port 就會一直存在。 只要伺服器軟體啟動的埠口不同,那就不會造成衝突。當用戶端連接到此伺服器時,透過不同的埠口,就可以取得不同的服務資料囉。 所以,一部主機上面當然可以同時啟動很多不同的服務啊!
- 共 65536 個 port:
由第二章的 TCP/UDP 表頭資料中,就知道 port 佔用 16 個位元,因此一般主機會有 65536 個 port,而這些 port 又分成兩個部分,以 port 1024 作區隔:
- 只有 root 才能啟動的保留的 port: 在小於 1024 的埠口,都是需要以 root 的身份才能啟動的,這些 port 主要是用於一些常見的通訊服務,在 Linux 系統下,常見的協定與 port 的對應是記錄在 /etc/services 裡面的。
- 大於 1024 用於 client 端的 port: 在大於 1024 以上的 port 主要是作為 client 端的軟體啟動的 port 。
- 是否需要三向交握:
建立可靠的連線服務需要使用到 TCP 協定,也就需要所謂的三向交握了,如果是非連線導向的服務,例如 DNS 與視訊系統, 那只要使用 UDP 協定即可。
- 通訊協定可以啟用在非正規的 port:
我們知道瀏覽器預設會連接到 WWW 主機的 port 80,那麼你的 WWW 是否可以啟動在非 80 的其他埠口? 當然可以啊!你可以透過 WWW 軟體的設定功能將該軟體使用的 port 啟動在非正規的埠口, 只是如此一來,您的用戶端要連接到你的主機時,就得要在瀏覽器的地方額外指定你所啟用的非正規的埠口才行。 這個啟動在非正規的埠口功能,常常被用在一些所謂的地下網站啦!^_^。另外, 某些軟體預設就啟動在大於 1024 以上的埠口,如 MySQL 資料庫軟體就啟動在 3306。
- 所謂的 port 的安全性:
事實上,沒有所謂的 port 的安全性!因為『Port 的啟用是由服務軟體所造成的』, 也就是說,真正影響網路安全的並不是 port ,而是啟動 port 的那個軟體 (程式)! 或許你偶而會聽到:『沒有修補過漏洞的 bind 8.x 版,很容易被黑客所入侵,請盡快升級到 bind 9.x 以後版本』,所以囉,對安全真正有危害的是『某些不安全的服務』 而不是『開了哪些 port』才是!因此,沒有必要的服務就將他關閉吧! 尤其某些網路服務還會啟動一些 port 哩!另外,那些已啟動的軟體也需要持續的保持更新喔!
好了,我們現在知道這個 port 是什麼鬼東西了,再來就是要來瞭解一下,我們的主機到底是開了多少的 port 呢?由於 port 的啟動與服務有關,那麼『服務』跟『port 』對應的檔案是哪一個?再提醒一次呦!是『 /etc/services 』啦!而常用來觀察 port 的則有底下兩個程式:
netstat:在本機上面以自己的程式監測自己的 port; nmap:透過網路的偵測軟體輔助,可偵測非本機上的其他網路主機,但有違法之虞。 見他的大頭王!怎麼使用 nmap 會違法?由於 nmap 的功能太強大了,所以很多 cracker 會直接以他來偵測別人的主機,這個時候就可能造成違法啦!只要你使用 nmap 的時候不要去偵測別人的電腦主機,那麼就不會有問題啦!底下我們分別來說一說這兩個寶貝吧!
- 列出在監聽的網路服務:
[root@www ~]# netstat -tunl
ctive Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN
....(底下省略)....
上面說明了我的主機至少有啟動 port 111, 22, 25 等,而且觀察各連線介面,可發現 25 為 TCP 埠口,但只針對 lo 內部迴圈測試網路提供服務,網際網路是連不到該埠口的。至於 port 22 則有提供網際網路的連線功能。
具体的参数含义如下:
-t: 显示TCP协议相关的连接信息。
-u: 显示UDP协议相关的连接信息。
-n: 以数字形式显示IP地址和端口号,而不进行反向解析。
-l: 仅显示监听状态的连接。
-p: 显示与连接或端口相关联的进程信息。
- 列出已連線的網路連線狀態:
[root@www ~]# netstat -tun
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 52 192.168.1.100:22 192.168.1.101:2162 ESTABLISHED
從上面的資料來看,我的本地端伺服器 (Local Address, 192.168.1.100) 目前僅有一條已建立的連線,那就是與 192.168.1.101 那部主機連接的連線,並且連線方線是由對方連接到我主機的 port 22 來取用我伺服器的服務吶!
- 刪除已建立或在監聽當中的連線:
netstat -tunp
如果想要將已經建立,或者是正在監聽當中的網路服務關閉的話,最簡單的方法當然就是找出該連線的 PID, 然後將他 kill 掉即可啊!例如下面的範例:
[root@www ~]# netstat -tunp
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/P name
tcp 0 52 192.168.1.100:22 192.168.1.101:2162 ESTABLISHED 1342/0
如上面的範例,我們可以找出來該連線是由 sshd 這個程式來啟用的,並且他的 PID 是 1342, 希望你不要心急的用 killall 這個指令,否則容易刪錯人 (因為你的主機裡面可能會有多個 sshd 存在), 應該要使用 kill 這個指令才對喔!
[root@www ~]# kill -9 1342
kill: 这是一个用于发送信号给进程的命令。
-9: 这是信号的编号,表示发送强制终止信号(SIGKILL)。
强制终止信号会立即终止进程,无论进程是否愿意终止,它没有机会做清理或释放资源的操作。
执行命令后,进程号为1342的进程会被立即终止。
SIGKILL信号是一种强制性的措施,建议在正常情况下尽量避免使用。
可以先尝试使用kill命令发送其他信号(如kill -15 <PID>,表示发送终止信号SIGTERM)给进程,让进程有机会进行清理工作。
只有在无效或进程出现问题无法响应时,才考虑使用SIGKILL强制终止。
- nmap
如果你要偵測的設備並沒有可讓你登入的作業系統時,那該怎麼辦?舉例來說,你想要瞭解一下公司的網路印表機是否有開放某些協定時, 那該如何處理啊?現在你知道 netstat 可以用來查閱本機上面的許多監聽中的通訊協定, 那例如網路印表機這樣的非本機的設備,要如何查詢啊?呵呵!用 nmap 就對了!
nmap (註1)的軟體說明之名稱為:『Network exploration tool and security / port scanner』,顧名思義, 這個東西是被系統管理員用來管理系統安全性查核的工具!他的具體描述當中也提到了, nmap 可以經由程式內部自行定義的幾個 port 對應的指紋資料,來查出該 port 的服務為何,所以我們也可以藉此瞭解我們主機的 port 到底是幹嘛用的!在 CentOS 裡頭是有提供 nmap 的, 如果你沒有安裝,那麼就使用 yum 去安裝他吧!
[root@www ~]# nmap [掃瞄類型] [掃瞄參數] [hosts 位址與範圍]
選項與參數:
[掃瞄類型]:主要的掃瞄類型有底下幾種:
-sT:掃瞄 TCP 封包已建立的連線 connect() !
-sS:掃瞄 TCP 封包帶有 SYN 標籤的資料
-sP:以 ping 的方式進行掃瞄
-sU:以 UDP 的封包格式進行掃瞄
-sO:以 IP 的協定 (protocol) 進行主機的掃瞄
[掃瞄參數]:主要的掃瞄參數有幾種:
-PT:使用 TCP 裡頭的 ping 的方式來進行掃瞄,可以獲知目前有幾部電腦存活(較常用)
-PI:使用實際的 ping (帶有 ICMP 封包的) 來進行掃瞄
-p :這個是 port range ,例如 1024-, 80-1023, 30000-60000 等等的使用方式
[Hosts 位址與範圍]:這個有趣多了,有幾種類似的類型
192.168.1.100 :直接寫入 HOST IP 而已,僅檢查一部;
192.168.1.0/24 :為 C Class 的型態,
192.168.*.* :嘿嘿!則變為 B Class 的型態了!掃瞄的範圍變廣了!
192.168.1.0-50,60-100,103,200 :這種是變形的主機範圍啦!很好用吧!
# 範例一:使用預設參數掃瞄本機所啟用的 port (只會掃瞄 TCP)
[root@www ~]# yum install nmap
[root@www ~]# nmap localhost
PORT STATE SERVICE
22/tcp open ssh
25/tcp open smtp
111/tcp open rpcbind
# 在預設的情況下,nmap 僅會掃瞄 TCP 的協定喔!
-sn:僅執行主機發現,不對主機進行端口掃描。
-s: 指定扫描类型。
nmap -sn 192.168.0.0/24
nmap 的用法很簡單吶!就直接在指令後面接上 IP 或者是主機名稱即可。不過,在預設的情況下 nmap 僅會幫你分析 TCP 這個通訊協定而已,像上面這個例子的輸出結果。但優點是順道也將開啟該埠口的服務也列出來了, 真是好! ^_^!那如果想要同時分析 TCP/UDP 這兩個常見的通訊協定呢?可以這樣做:
# 範例二:同時掃瞄本機的 TCP/UDP 埠口
[root@www ~]# nmap -sTU localhost
PORT STATE SERVICE
22/tcp open ssh
25/tcp open smtp
111/tcp open rpcbind
111/udp open rpcbind <==會多出 UDP 的通訊協定埠口!
嘿嘿!與前面的範例比較一下,你會發現這次多了幾個 UDP 的埠口,這樣分析好多了!然後, 如果你想要瞭解一下到底有幾部主機活在你的網路當中時,則可以這樣做:
# 範例三:透過 ICMP 封包的檢測,分析區網內有幾部主機是啟動的
[root@www ~]# nmap -sP 192.168.1.0/24
Starting Nmap 5.21 ( http://nmap.org ) at 2011-07-20 17:05 CST
Nmap scan report for www.centos.vbird (192.168.1.100)
Host is up.
Nmap scan report for 192.168.1.101 <==這三行講的是 192.168.101 的範例!
Host is up (0.00024s latency).
MAC Address: 00:1B:FC:58:9A:BB (Asustek Computer)
Nmap scan report for 192.168.1.254
Host is up (0.00026s latency).
MAC Address: 00:0C:6E:85:D5:69 (Asustek Computer)
Nmap done: 256 IP addresses (3 hosts up) scanned in 3.81 seconds
看到否?鳥哥的環境當中有三部主機活著吶 (Host is up)!並且該 IP 所對應的 MAC 也會被記錄下來, 很不錯吧!如果你還想要將各個主機的啟動的 port 作一番偵測的話,那就得要使用:
[root@www ~]# nmap 192.168.1.0/24
之後你就會看到一堆 port number 被輸出到螢幕上囉~如果想要隨時記錄整個網段的主機是否不小心開放了某些服務, 嘿嘿!利用 nmap 配合資料流重導向 (>, >> 等) 來輸出成為檔案, 那隨時可以掌握住您區域網路內每部主機的服務啟動狀況啊! ^_^
請特別留意,這個 nmap 的功能相當的強大,也是因為如此,所以很多剛在練習的黑客會使用這個軟體來偵測別人的電腦。 這個時候請您特別留意,目前很多的人已經都有『特別的方式』來進行登錄的工作!例如以 TCP_Wrappers (/etc/hosts.allow, /etc/hosts.deny) 的功能來記錄曾經偵測過該 port 的 IP! 這個軟體用來『偵測自己機器的安全性』是很不錯的一個工具,但是如果用來偵測別人的主機, 可是會『吃上官司』的!特別留意!!