等級保護主機安全:CentOS入侵防範(一)
- 2019 年 10 月 4 日
- 筆記
一、說明
本篇文章主要想說一說我對入侵防範中前3個測評項的理解(對於centos系統而言),如果大家有其他的看法或者思路也可以在回復中提出,我也跟著學習學習。
二、測評項
這3個測評項的內容如下:
a) 應遵循最小安裝的原則,僅安裝需要的組件和應用程式; b) 應關閉不需要的系統服務、默認共享和高危埠; c) 應通過設定終端接入方式或網路地址範圍對通過網路進行管理的管理終端進行限制;
這3個測評項都是跟業務緊密相關的,往往沒有一個固定的標準答案,需要根據實際情況作出判斷。
三、測評項a
a) 應遵循最小安裝的原則,僅安裝需要的組件和應用程式;
如果純粹用這個測評項的要求去檢測,我個人感覺無從下手。
查詢linux中安裝的程式,一般使用yum list installed或者rpm -qa,關鍵是linux中隨隨便便都安裝得有幾百個組件,而且很多組件都是存在著依賴關係。
你很難或者至少很難快速的判斷某組件到底是必需的還是非必需的,而被測評單位方的人也一樣,他也不可能知道。
所以,我一般只能由b測評項的結果來推斷a測評項了。
四、 測評項b
b) 應關閉不需要的系統服務、默認共享和高危埠;
4.1. 關係
對於組件、服務、進程、埠而言,它們之間是存在著關係的:安裝程式→啟動相關服務→啟動相關進程→監聽相關埠
而且,一個程式(組件)可能有數個服務,而一個服務也可能實際啟動了數個進程,當然一個進程應該就對應一個埠。
比如nfs-utils組件,它就包含nfs和nfslock兩個服務,而nfs服務,就可以啟動數個進程:
[root@centos01 ~]# /etc/init.d/nfs statusrpc.svcgssd 已停 rpc.mountd 已停 nfsd 已停 rpc.rquotad 已停
4.2. 查看埠
一般我們使用netstat -ap或者netstat -anp查看系統中監聽的埠以及對應的進程:
netstat -ap Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 localhost:smux 0.0.0.0:* LISTEN 11884/snmpd tcp 0 0 0.0.0.0:sunrpc 0.0.0.0:* LISTEN 1/systemd tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN 5031/sshd tcp 0 0 localhost:smtp 0.0.0.0:* LISTEN 1086/master ……
netstat -apn Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.0.1:199 0.0.0.0:* LISTEN 11884/snmpd tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 5031/sshd tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1086/master ……
如果命令參數中不使用n,那麼結果中有些本地埠就不會顯示出數字值,而是從/etc/services文件中,查找這個埠的數字值所在行,獲取埠的名字:

最左邊的一欄即為埠的名字。
雖然0到1023埠是周知埠,也即大家公認的每個埠都有固定所代表的內容,比如21埠是FTP埠,一般也不會有其他的某個進程也將自己的埠設置為21埠。 所以只要你看到埠值是21埠,那麼你幾乎就可以認定這是ftp進程在監聽的埠。 但是這不是百分之一百的,說不準就有一些程式的進程監聽的是動態埠,一不小心就把0到1023的某個埠給佔用了。 所以最準確的判斷方法是看埠的數值以及監聽該埠的進程名,比如:
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1086/master
埠值是25,監聽該埠的進程是master。
如果還搞不懂,可以使用ps -ef顯示所運行的所有進程,再查看要這個進程的具體資訊。
好,這些方法足夠讓你判斷出開啟的埠都大概都是些什麼埠了。
4.3. 判斷埠
一般伺服器上監聽的埠很多,你得了解一些常用的埠,比如80埠,以及常見的中間件的埠,比如tomcat默認埠是8080。 以及常見的資料庫的埠,比如Oracle默認是1521,MySQL默認是3306。 以及一些常見服務的埠或經常,比如ftp是21、ssh是22、telnet是23、郵件服務是25、rpcbind是111、rpc.statd是動態埠(所以這裡要用進程來判斷)、列印服務(cups)埠是631等。
所以從服務下手的話,比如不使用ftp,那麼21就是多餘埠。不用郵件服務,25就是多餘埠,rpc.statd和nfs有關,不用nfs的話,那麼rpc.statd監聽的動態埠也是多餘埠,以此類推。 多餘埠就應該關閉,可以關閉相對應的服務或者卸載相對應的組件,也可以用iptables或者firewall進行攔截。
至於高危埠,實際上某種意義上所有埠都是高危埠,反正只要你監聽了,都有可能被入侵。 所以對於必須要使用的埠,比如22埠,最好的就是限制連接這個埠的ip,其次,就是修改默認埠。 當然,由於業務需要,不一定可以修改埠的數值和限制連接這個埠的ip,這個看自己怎麼把握了。
4.4. 最小化安裝
檢查完測評項b,如果發現沒有啥多餘埠,那麼就可以認定測評項a至少是部分符合,至於具體怎麼打分,自己把握吧…… 至於為什麼這麼說,因為在等級保護試行2.0的測評要求里是這麼說的:

這裡說的是安裝了非必要組件後關閉了也可以,不過等級保護正式版2.0又變回來了:

說實話,我沒搞明白,這是否遵循最小安裝原則和是否未安裝非必要的組件和應用程式,難道說的不是一回事嗎? 所以,我覺得還是等級保護試行2.0說得更有道理一些。
五、測評項c
c) 應通過設定終端接入方式或網路地址範圍對通過網路進行管理的管理終端進行限制;
對於centos而言,就是限制ssh埠的連接ip,在主機層面,一般可以用Iptables(centos6)、Firewall(centos7)這兩防火牆實現,也可以用hosts.allow和hosts.deny配置文件實現,還可以用/etc/ssh/sshd_config配置文件實現。
不過在實際測評當中可能會遇到的一種情況:
就是被測評伺服器開著ssh埠,也沒有對這個埠的連接ip進行任何限制。但這個伺服器所在網路是內網,且沒有wifi,想要實現遠程管理這個伺服器,需要你自己帶著電腦跑去機房插網線才行。
這種我覺得肯定不能算不符合,至少也有個3、4分吧,甚至我覺得打5分估計也沒啥問題,不知大家怎麼看。
5.1. 防火牆
centos6隻有iptables,而centos7既可以用iptables也可以用Firewall。
對於iptables,強烈建議大家看看這位部落客寫的教程:http://www.zsythink.net/archives/1199
我一開始接觸iptables時就被弄暈了,chain、table到底是個啥玩意?後來看了這篇教程才明白的。
至於Firewall,這裡就簡單的說一下。
簡單的來說,可以用Firewall設定多個zone(區域),每個zone都有自己的過濾規則,然後每當有請求進來之時,根據zone中設置的source(源ip地址)、zone中綁定的interface(請求的網卡)來判斷由使用哪個zone的規則,如果通過source和interface沒有匹配到任何一個zone,則使用firewalld.conf中配置的默認zone。
從優先順序而言是:source、interface、默認zone
所以,一個源(或重疊的源)不能被分配到多個區域。這樣做的結果是產生一個未定義的行為,因為不清楚應該將哪些規則應用於該源。
同樣,一個網卡也只能分配到一個zone中。
我們可以用如下命令,查看所有的zone(如果沒有自己設置zone,那麼應該只存在系統預設的zone):
firewall-cmd --list-all-zones block target: %%REJECT%% icmp-block-inversion: no interfaces: sources: services: ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: dmz target: default icmp-block-inversion: no interfaces: sources: services: ssh ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: drop target: DROP icmp-block-inversion: no interfaces: sources: services: ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: external target: default icmp-block-inversion: no interfaces: sources: services: ssh ports: protocols: masquerade: yes forward-ports: source-ports: icmp-blocks: rich rules: home target: default icmp-block-inversion: no interfaces: sources: services: ssh mdns samba-client dhcpv6-client ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: internal target: default icmp-block-inversion: no interfaces: sources: services: ssh mdns samba-client dhcpv6-client ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: public (active) target: default icmp-block-inversion: no interfaces: em1 sources: services: ssh dhcpv6-client ports: 39289/tcp protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: trusted target: ACCEPT icmp-block-inversion: no interfaces: sources: services: ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: work target: default icmp-block-inversion: no interfaces: sources: services: ssh dhcpv6-client ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
注意看,裡面只有pulic這個zone的interfaces綁定了網卡,所以也只有這一個區域是活動的(active)。
對於裡面各個參數所代表的意義,大家可以在網上搜索搜索就知道了。
5.2. hosts.allow和hosts.deny
5.2.1. 前置條件
通過這兩個配置文件進行限制,需要條件, hosts.allow文件的注釋內容如下:
#hosts.allow This file contains access rules which are used to#allow or deny connections to network services that#either use the tcp_wrappers library or that have been#started through a tcp_wrappers-enabled xinetd.
也就是說:
此文件包含用於允許或拒絕與以下網路服務的連接:
1.使用了tcp包裝庫 2.或者通過啟用了TCP_wrappers的xinetd啟動。
不是任何服務程式都能使用TCP_wrappers的,例如使用命令ldd /usr/sbin/sshd,如果輸出中有libwrap,則說明可以使用TCP_wrappers, 即該服務可以使用/etc/hosts.allow和/etc/hosts.deny,如果輸出沒有libwrap則不可使用。
[root@centos01 ~]# ldd /usr/sbin/sshd linux-vdso.so.1 => (0x00007fffa0da0000) libfipscheck.so.1 => /lib64/libfipscheck.so.1 (0x00007f0417aa6000) libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f041789b000) libaudit.so.1 => /lib64/libaudit.so.1 (0x00007f041767e000) libpam.so.0 => /lib64/libpam.so.0 (0x00007f0417470000) libdl.so.2 => /lib64/libdl.so.2 (0x00007f041726c000) libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f041704c000) libcrypto.so.10 => /usr/lib64/libcrypto.so.10 (0x00007f0416c6d000) libutil.so.1 => /lib64/libutil.so.1 (0x00007f0416a6a000) libz.so.1 => /lib64/libz.so.1 (0x00007f0416853000) libnsl.so.1 => /lib64/libnsl.so.1 (0x00007f041663a000) libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007f0416403000) libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f04161e8000) libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x00007f0415fa4000) libkrb5.so.3 => /lib64/libkrb5.so.3 (0x00007f0415cbe000) libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x00007f0415a91000) libcom_err.so.2 => /lib64/libcom_err.so.2 (0x00007f041588d000) libnss3.so => /usr/lib64/libnss3.so (0x00007f041554f000) libc.so.6 => /lib64/libc.so.6 (0x00007f04151ba000) /lib64/ld-linux-x86-64.so.2 (0x0000003abde00000) libfreebl3.so => /lib64/libfreebl3.so (0x00007f0414f43000) libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x00007f0414d37000) libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007f0414b34000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f0414917000) libnssutil3.so => /usr/lib64/libnssutil3.so (0x00007f04146ea000) libplc4.so => /lib64/libplc4.so (0x00007f04144e5000) libplds4.so => /lib64/libplds4.so (0x00007f04142e1000) libnspr4.so => /lib64/libnspr4.so (0x00007f04140a3000) librt.so.1 => /lib64/librt.so.1 (0x00007f0413e9b000)
經過判斷sshd是可以使用的。
5.2.2. 使用方法
修改/etc/hosts.deny,在其中加入
sshd:ALL
修改:/etc/hosts.allow,在其中進行如下設置:
sshd:192.168.1.2
表示只允許 ip為 192.168.1.2 登陸到sshd
修改 /etc/hosts.allow,在其中加入
all:218.24.129.
這樣就會允許來自218.24.129.*域的所有的客戶來訪問。這只是舉個例子,實際上,系統默認狀態 下,都是能用這些網路服的
修改 /etc/hosts.deny,在其中加入
all:218.24.129.
就限制了來自218.24.129.*域的所有的所有的IP
5.2.3. 優先順序
Wrappers 首先在 hosts.allow 文件中查找規則匹配。如果找到匹配,那麼 tcpd 會根據規則停下來,批准或拒絕訪問。如果在 hosts.allow 文件中未找到匹配,那麼 tcpd 會讀取 hosts.deny 文件直到找到匹配。如果找到匹配,就拒絕訪問,否則批准訪問。
而且這裡的規則是匹配到立刻執行,也就是某ip遇到的第一個匹配到的語句是拒絕,那麼就會被拒絕,無論之後的規則是啥。同樣,如果遇到允許,那就允許,無論之後的規則是啥,所以關鍵是遇到的第一個匹配的規則。
5.2.4. 默認後綴
在allow文件中如果沒有加上:option,默認會認為是:allow。
所以雖然存在hosts.allow和hosts.deny兩個文件,但根據規則的靈活性,可以只用一個文件,只要在使用時明確指後綴即可。
比如修改 /etc/hosts.allow,在其中加入
all:218.24.129.:deny
就是指明了後綴,代表拒絕218.24.129.*ip端的訪問,如果不指明後綴,在hosts.allow默認為allow後綴,在hosts.deny里默認為deny後綴
5.3. sshd_config配置文件
5.3.1. 白名單模式
AllowUsers aliyun [email protected]
僅允許 aliyun和從 192.168.1.1 登錄的 test 帳戶通過 SSH 登錄系統,用戶名之間用空格。
AllowUsers *@192.168.1.1
僅允許從192.168.1.1 登錄的帳戶通過 SSH 登錄系統。
5.3.2. 黑名單模式
使用Denyusers關鍵字,其餘配置與AllowUsers一樣。
5.3.3. 組模式
對應於用戶,還有AllowGroups、DenyGroups關鍵字,和AllowUsers、Denyusers基本一樣,只是後面需要填寫的是組名,而且是主要組(基本組)的名字。
六、結尾
就先寫到這把,其實對於埠限制方面,很多時候並不是靠主機上的策略來實現的,這個等下篇文章再說一說。入侵防範的剩餘測評項,也到下篇文章一起說。
*本文原創作者:起於凡而非於凡,本文屬於FreeBuf原創獎勵計劃,未經許可禁止轉載
