Ict-innovation/LPI/110.2
考生應瞭解如何設定基本的主機安全級別
關鍵知識領域
- 瞭解影子密碼及其工作原理。
- 關閉未使用的網路服務。
- 瞭解 TCP 包裝器的作用。
許多網路服務,如 sshd 和 httpd,在啟動時啟動並持續執行。它們處理自己的網路連線,接受來自客戶端的連線併為其提供服務。
但是,有些服務依賴於超級伺服器來監聽並接受代表它們的連線請求。當接受連線時,超級伺服器啟動所需的服務並將網路連線透過一對檔案描述符傳遞給它。
這種工作方式減少了系統中等待客戶端連線而阻塞的程序數量。它還可以提供一箇中心位置,用於在收到服務請求時進行訪問控制和日誌記錄。但是,按需建立服務程序會產生少量開銷,因此此技術通常不適用於可能會經歷高連線請求速率的服務。
有兩個超級伺服器。第一個是 inetd。它非常古老,在任何當前的 Linux 發行版中都沒有使用;但是它包含在 LPI-1 目標中。更現代的超級伺服器是 xinetd。它添加了訪問控制和日誌記錄功能。
inetd 守護程序(舊)
此守護程序在啟動時啟動並監聽特定埠上的連線。這允許伺服器僅在需要時執行特定的網路守護程序。例如,舊的 telnet 服務有一個守護程序 in.telnetd 用於處理 telnet 會話。inetd 被指示監聽埠 23,而不是一直執行此守護程序。另一個例子是 swat(一個基於瀏覽器的 samba 配置工具),它也依賴於超級伺服器來監聽連線。
接受連線並啟動服務的流程如下所示。
inetd 在檔案 /etc/inetd.conf 中配置。每行定義一個 inetd 應該監聽的服務。
/etc/inetd.conf 中的欄位包含以下內容
| service-name | 來自 ** /etc/services ** 的有效名稱 |
| 套接字型別 | TCP 的 stream 和 UDP 的 dgram |
| 協議 | 來自 ** /etc/protocols ** 的有效協議 |
| 標誌 | 如果多執行緒則為 nowait,如果單執行緒則為 wait |
| 使用者/組 | 以使用者或組身份執行應用程式。 |
| 程式 | 要執行的程式的名稱 |
| 引數 | 要傳遞給程式的引數(如果有) |
示例
daytime stream tcp nowait root internal
telnet stream tcp nowait root /usr/sbin/in.telnetd
pop-3 stream tcp nowait root /usr/sbin/tcpd ipop3d
第一行顯示一個簡單的 TCP 服務,它在 inetd 內部實現。沒有外部伺服器要啟動。第二行啟動 telnet 伺服器的“inet 感知”版本。第三行顯示一個透過稱為 TCP 包裝器 (tcpd) 的中間程式啟動的服務。該程式添加了一個訪問控制層,將在本主題中稍後討論。
此檔案第一欄位中出現的服務名稱將在 /etc/services 檔案中查詢,以查詢關聯的埠號。 /etc/services 中的欄位如下
service-name port/protocol [別名]
例如,pop3 的條目如下所示
pop3110/tcppop-3
如果更改了 /etc/inetd.conf 檔案,請向 inetd 傳送一個 HUP 訊號以使其重新讀取檔案
|
# pkill -HUP inetd |
TCP 包裝器
TCP 包裝器是一個程式,它在檔案 /etc/hosts.allow 和 /etc/hosts.deny 的控制下,為服務添加了一個訪問控制層。通常,TCP 包裝器 (tcpd 守護程序) 與 inetd 結合使用以新增訪問控制。它的工作原理如下
- inetd 伺服器監聽並接受到特定服務的連線(例如 pop3)
- inetd 啟動其配置檔案中為該服務指定的程式。若要使用 TCP 包裝器,該程式被指定為 /usr/sbin/tcpd
- 實際伺服器的名稱 (ipop3d,在本例中) 作為引數傳遞給 tcpd
- tcpd 諮詢檔案 /etc/hosts.allow 和 /etc/hosts.deny(將在下面討論)以決定是否允許連線。
- 如果允許連線,tcpd 將啟動實際伺服器並將與來自客戶端的網路連線相關的檔案描述符傳遞給它。
下圖顯示了檢查 hosts.allow 和 hosts.deny 檔案中的條目的邏輯。
請注意,預設情況(如果 hosts.allow 和 hosts.deny 檔案為空)是允許訪問。
這兩個檔案中行的格式是
daemon-list : client-host-list [ : shell-command ]
典型的配置在 hosts.deny 中放置一行
ALL: ALL
有了此檔案,所有連線都將被拒絕,除非它們與 hosts.allow 中的規則匹配。
以下是一些來自 hosts.allow 的示例條目
sshd: ALL except 192.168.1.11
pop3: 192.168.1.0/24
在這些示例中,客戶端主機透過 IP 地址(或 IP 地址塊)識別。您也可以在此處指定主機名,或使用關鍵字 ALL 來匹配所有主機。
TCP 包裝器還將記錄到服務的每個連線。檢查日誌以查詢未經授權的連線嘗試的證據,可能會提供對系統攻擊的證據。
TCP 包裝器通常透過 tcpd 守護程序(透過 inetd)呼叫。但是,一些服務(如 sshd 和 vsftpd)與 libwrap 庫(處理針對 hosts.allow 和 hosts.deny 的訪問控制檢查的庫)連結,因此遵守這些訪問控制。
您可以透過檢查 ldd 的輸出(顯示可執行檔案需要哪些動態連結庫 (.so 檔案))來檢查服務是否使用 libwrap 庫。例如
|
$ ldd /usr/sbin/sshd libwrap.so.0 => /usr/lib64/libwrap.so.0 (0x00002b4c09fe3000) libpam.so.0 => /lib64/libpam.so.0 (0x00002b4c0a1ec000) libdl.so.2 => /lib64/libdl.so.2 (0x00002b4c0a3f7000) libselinux.so.1 => /lib64/libselinux.so.1 (0x00002b4c0a5fc000) libaudit.so.0 => /lib64/libaudit.so.0 (0x00002b4c0a814000) libcrypto.so.6 => /lib64/libcrypto.so.6 (0x00002b4c0aa29000) ... 刪除的幾行 ... |
一些命令列技巧可以找到目錄中所有使用 libwrap 的檔案
|
$ find /usr/sbin -type f -exec grep -l libwrap {} \; 2> /dev/null /usr/sbin/mailstats /usr/sbin/makemap /usr/sbin/stunnel /usr/sbin/conmand /usr/sbin/sendmail.sendmail /usr/sbin/smrsh /usr/sbin/rpc.rquotad /usr/sbin/praliases /usr/sbin/sshd |
xinetd 守護程序
在現代 Linux 發行版中,xinetd 已經取代了 inetd。它執行基本上相同的工作,但它也能夠根據客戶端機器、時間、機器負載等來強制執行訪問控制限制。它還記錄每個連線,因此不再使用 tcpd 守護程序,而是 xinetd 完成所有操作。配置是透過單個檔案 /etc/xinetd.conf 和/或 /etc/xinetd.d/ 中以正在由 xinetd 監控的服務命名的各個檔案完成的。
在大多數發行版中,檔案 /etc/xinetd.conf 提供預設設定,這些設定可能會被 /etc/xinetd.d/ 中服務特定檔案中的條目覆蓋
xinetd.d 中服務檔案的結構
Service-name {
disable = yes/no
socket_type = stream for TCP and dgram for UDP
protocol = valid protocol from /etc/protocols
wait = <yes or no>
user= the user the application runs as
group= the group the application runs as
server= the name of the program to be run for this service
}
以下是一個“頂層”檔案 /etc/xinetd.conf 的示例
defaults
{
log_type= SYSLOG daemon info
log_on_failure= HOST
log_on_success= PID HOST DURATION EXIT
cps= 50 10
instances= 50
per_source= 10
v6only= no
groups= yes
umask= 002
}
includedir /etc/xinetd.d
在此示例中,我們設定了 xinetd 傳送訊息到 syslog 的工具和優先順序,並指定了這些訊息中包含哪些資訊。我們還實施了一些簡單的訪問控制,這些控制限制了機器的負載。在此示例中,cps 指令將傳入連線的速率限制為每秒 50 個。如果超過此速率,該服務將暫時停用 10 秒。(您也可以將此視為攻擊者對機器發動拒絕服務攻擊的一種方式!)instances 指令確定同時可以為服務啟用的伺服器的最大數量。
以下是一個特定於服務的示例檔案
service rsync
{
disable = no
socket_type = stream
wait = no
user = root
server = /usr/bin/rsync
server_args = --daemon
log_on_failure += USERID
only_from = 192.168.0.0/24
}
您最有可能需要在此處更改的欄位是“disable”欄位。將“disable = no”設定為開啟服務,或將“disable = yes”設定為關閉服務。對 xinetd 配置進行更改後,向其傳送一個 SIGHUP 訊號
|
# pkill -HUP xinetd |
有關更多詳細資訊,請參閱 xinetd.conf(5) 的手冊頁
以下是使用過的檔案、術語和實用程式的部分列表:* /etc/nologin
- /etc/passwd
- /etc/shadow
- /etc/xinetd.d/*
- /etc/xinetd.conf
- /etc/inetd.d/*
- /etc/inetd.conf
- /etc/inittab
- /etc/init.d/*
- /etc/hosts.allow
- /etc/hosts.deny