網路服務Port(埠口)監測與管理
網路服務Port(埠口)監測與管理
1.前言
為什麼我們的主機會回應網路上面的一些要求封包呢?例如我們設定了一部 WWW 主機後,當有來自 Internet 的 WWW 要求時,我們的主機就會予以回應,這是因為我們的主機有啟用了 WWW 的監聽埠口啊!所以,當我們啟用了一個 daemon 時,就可能會造成主機的埠口在進行監聽的動作,此時該 daemon 就是已經對網路上面提供服務了!萬一這個 daemon 程式有漏洞,因為他提供了 Internet 的服務,所以就容易被 Internet 上面的 Hacker 所攻擊了!所以說,仔細的檢查自己系統上面的埠口到底開了多少個,並且予以嚴格的管理,才能夠降低被攻擊的可能性啊!
大綱
2.什麼是 port
當我們的主機啟動了一些服務,相對應的這些服務就會開啟一些Port (埠口) 。『服務』跟『 port 』對應表。參考下列網址:常見的連接埠中文說明 , Internet Assigned Numbers Authority (IANA)連接埠的官方清單
- 伺服器端啟動的監聽埠口所對應的服務是固定的:
- 例如 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 。
- 可以自定義連外Port範圍嗎?
- 只要更改核心參數即可,位置在 /proc/sys/net/ipv4/ip_local_port_range
- 例如,Ubuntu 預設 32768 - 60999,若要將連外Port範圍設在60000~65000之間,可執行下列指令
- $echo "60000 65000"> /proc/sys/net/ipv4/ip_local_port_range
- 可使用 netstat 查詢是否有更改範圍
- $netstat -tun
- port 的安全性:
- 沒有所謂的 port 的安全性!對安全真正有危害的是『某些不安全的服務』 而不是『開了哪些 port 』才是!因此,沒有必要的服務就將他關閉吧! 尤其某些網路服務還會啟動一些 port 哩!另外,那些已啟動的軟體也需要持續的保持更新喔!
3.埠口的觀察: netstat, nmap
- netstat:在本機上面以自己的程式監測自己的 port;
- nmap:透過網路的偵測軟體輔助,可偵測非本機上的其他網路主機,但有違法之虞。
netstat
在做為伺服器的 Linux 系統中,開啟的網路服務越少越好! 因為較少的服務可以較容易除錯 (debug) 與瞭解安全漏洞,並可避免不必要的入侵管道! 所以,這個時候請瞭解一下您的系統當中有沒有哪些服務被開啟了呢? 要瞭解自己的系統當中的服務項目,最簡便的方法就是使用 netstat 了!
列出在監聽的網路服務:
- $netstat -tunl
列出已連線的網路連線狀態:
- $netstat -tun
從上面的資料來看,我的本地端沒有直接上網非伺服器,連在VirtualBox內 (Local Address, 10.0.2.2:67,而非192.168......) 目前僅有一條已建立的連線。
刪除已建立或在監聽當中的連線:
如果想要將已經建立,或者是正在監聽當中的網路服務關閉的話,最簡單的方法當然就是找出該連線的 PID, 然後將他 kill 掉即可啊!例如下面的範例:
- $netstat -tunp
如上面的範例,我們可以找出來該連線是由 sshd 這個程式來啟用的,並且他的 PID 是 1342, 希望你不要心急的用 killall 這個指令,否則容易刪錯人 (因為你的主機裡面可能會有多個 sshd 存在), 應該要使用 kill 這個指令才對喔!
- $kill -9 1342
詳細有關 netstat ,參考 : netstat 指令介紹
nmap
如果你要偵測的設備並沒有可讓你登入的作業系統時,那該怎麼辦?舉例來說,你想要瞭解一下公司的網路印表機是否有開放某些協定時, 那該如何處理啊?現在你知道 netstat 可以用來查閱本機上面的許多監聽中的通訊協定, 那例如網路印表機這樣的非本機的設備,要如何查詢啊?呵呵!用 nmap 就對了!
nmap (註1)的軟體說明之名稱為:『Network exploration tool and security / port scanner』,顧名思義, 這個東西是被系統管理員用來管理系統安全性查核的工具!他的具體描述當中也提到了, nmap 可以經由程式內部自行定義的幾個 port 對應的指紋資料,來查出該 port 的服務為何,所以我們也可以藉此瞭解我們主機的 port 到底是幹嘛用的!
# 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 :這種是變形的主機範圍啦!很好用吧!
範例1:使用預設參數掃瞄本機所啟用的 port (只會掃瞄 TCP)
- $nmap localhost
詳細有關 nmap,參考 : nmap 指令介紹
4.埠口與服務的啟動/關閉及開機時狀態設定
我們就知道,其實 port 是由執行某些軟體之後被軟體啟動的。所以要關閉某些 port 時,那就直接將某個程式給他關閉就是了!關閉的方法你當然可以使用 kill,不過這畢竟不是正統的解決之道,因為 kill 這個指令通常具有強制關閉某些程式的功能,但我們想要正常的關閉該程式啊! 所以,就利用系統給我們的 script 來關閉就好了啊。 在此同時,我們就得再來稍微複習一下,一般傳統的服務有哪幾種類型?
stand alone 與 super daemon
在一般正常的 Linux 系統環境下,服務的啟動與管理主要有兩種方式:
- Stand alone
- 顧名思義,stand alone 就是直接執行該服務的執行檔,讓該執行檔直接載入到記憶體當中運作, 用這種方式來啟動可以讓該服務具有較快速回應的優點。一般來說,這種服務的啟動 script 都會放置到 /etc/init.d/ 這個目錄底下,所以你通常可以使用:『 /etc/init.d/sshd restart 』之類的方式來重新啟動這種服務。
- Super daemon
- 用一個超級服務作為總管,來統一管理某些特殊的服務。在 CentOS 6.x 裡面使用的則是 xinetd 這個 super daemon 啊!這種方式啟動的網路服務雖然在回應上速度會比較慢, 不過,可以透過 super daemon 額外提供一些控管,例如控制何時啟動、何時可以進行連線、 那個 IP 可以連進來、是否允許同時連線等等。通常個別服務的設定檔放置在 /etc/xinetd.d/ 當中,但設定完畢後需要重新以『 /etc/init.d/xinetd restart 』重新來啟動才行!
那麼如果我想要將我系統上面的 port 111 關掉的話, 那應該如何關閉呢?最簡單的作法就是先找出啟動那個 port 111 的程式喔!
找出啟動port的服務程式
透過上面的這個分析的流程,你可以利用系統提供的很多方便的工具來達成某個服務的關閉! 為啥這麼麻煩?不是利用 kill -9 990 就可以刪掉該服務了嗎?
- $kill -9 990
是沒錯啦!不過,你知道該服務是做啥用的嗎?你知道將他關閉之後,你的系統會出什麼問題嗎? 如果不知道的話,那麼利用上面的流程不就可以找出該服務軟體,再利用 rpm 查詢功能, 不就能夠知道該服務的作用了?所以說,這個方式還是對您會有幫助的啦!
另外,最簡單的,我們也可以利用第一道防火牆 ufw 封鎖port 111
- $sudo ufw deny 111 # 封鎖port 111
預設啟動的服務
剛剛上頭的作法僅是『立即將該服務啟動或關閉』喔!並不會影響到下次開機時,這個服務是否預設啟動的情況。 如果你想要在開機的時候就啟動或不啟動某項服務時,那就得要瞭解一下 "開機流程管理" 的內容啦!在 Unix like 的系統當中我們都是透過 run level 來設定某些執行等級需要啟動的服務,以 Red Hat 系統來說,這些 run level 啟動的資料都是放置在 /etc/rc.d/rc[0-6].d/ 裡面的,那如何管理該目錄下的 script 呢?手動處理嗎?會瘋掉的吶!所以你必須要熟悉 chkconfig 或 Red Hat 系統的 ntsysv 這幾個指令才行!
例題:(1)如何查閱 rpcbind 這個程式一開機就執行? (2)如果開機就執行,如何將他改為開機時不要啟動? (3)如何立即關閉這個 rpcbind 服務?
- 可以透過『 chkconfig --list | grep rpcbind 』與『 runlevel 』確認一下你的環境與 rpcbind 是否啟動?
- 如果有啟動,可透過『 chkconfig --level 35 rpcbind off 』來設定開機時不要啟動;
- 可以透過『 /etc/init.d/rpcbind stop 』來立即關閉他!
幾個常見的必須要存在的系統服務!這些服務請不要關閉啊!
服務名稱 | 服務內容 |
---|---|
acpid | 新版的電源管理模組,通常建議開啟,不過,某些筆記型電腦可能不支援此項服務,那就得關閉 |
atd | 在管理單一預約命令執行的服務,應該要啟動的 |
crond | 在管理工作排程的重要服務,請務必要啟動啊! |
haldaemon | 作系統硬體變更偵測的服務,與 USB 設備關係很大 |
iptables | Linux 內建的防火牆軟體,這個也可以啟動啦! |
network | 這個重要了吧?要網路就要有他啊! |
postfix | 系統內部郵件傳遞服務,不要隨便關閉他! |
rsyslog | 系統的登錄檔記錄,很重要的,務必啟動啊! |
sshd | 這是系統預設會啟動的,可以讓你在遠端以文字型態的終端機登入喔! |
xinetd | 就是那個 super daemon 嘛!所以也要啟動啦! |
上面列出的是主機需要的重點服務,請您不要關閉他!除非你知道作了之後會有什麼後果。
舉例來說,你如果不需要管理電源, 那麼將 acpid 關閉也沒有關係啊!如果你不需要提供遠端連線功能,那麼 sshd 也可以關閉啊!那其他你不知道的服務怎辦? 沒關係,只要不是網路服務,你都可以保留他!如果是網路服務呢?那...建議你不知道的服務就先關閉他! 以後我們談到每個相關的服務時,再一個一個打開即可。
底下我們就來做作看關閉網路服務這個部分!
5.安全性考量-關閉網路服務埠口
我們的 Linux distribution 很好心的幫使用者想到很多了,所以在一安裝完畢之後, 系統會開啟一堆有的沒有的網路服務,例如那個 rpcbind 之類的咚咚,這些東西你或許知道或許不知道,不過他就是有開啟~ 但我們的主機明明就是用來做為伺服器的,所以這些本來預計要給 client 使用的服務其實有點『多此一舉』的感覺~ 所以啦,請你將他關閉吧!底下我們舉個簡單的例子來處理,將你的網路服務關閉就好,其他在系統內部的服務,就暫時保留吧!
範例: 找出目前系統上面正在運作中的服務,並且找到相對應的啟動腳本 (在 /etc/init.d 內的檔名之意)。
要找出服務,就利用 netstat -tunlp 即可找到!
看起來總共有 sshd, master, rpc.statd, xinetd, rpcbind 等這幾個服務,對照前一小節的資料內容來看, master (port 25), sshd 不能關掉,那麼其他的就予以關閉啊!透過前兩個小節的介紹,使用 which 與 rpm 搜尋吧!舉例來說, rpc.statd 的啟動腳本在:『rpm -qc $(rpm -qf $(which rpc.statd) ) | grep init』這樣找,結果是在『/etc/rc.d/init.d/nfslock』這裡! 因此最終的結果如下:
接下來就是將該服務關閉,並且設定為開機不啟動吧!
做完上面的例子之後,你再次下達 netstat -tlunp 之後,會得到僅剩 port 25, 22 而已! 如此一來,絕大部分伺服器用不到的服務就被你關閉,而且即使重新開機也不會被啟動的啦! ^_^
參考資料
特色、摘要,Feature、Summary:
關鍵字、標籤,Keyword、Tag:
- Ubuntu,Linux,Network,Security,
留言
張貼留言
Aron阿龍,謝謝您的留言互動!