跳轉到內容

Ict-創新/LPI/110.1

來自華夏公益教科書

110.1 執行安全管理任務

[編輯 | 編輯原始碼]

候選人應該知道如何審查系統配置,以確保主機安全符合本地安全策略。

關鍵知識領域

  • 審計系統以查詢具有 suid/sgid 位設定的檔案。
  • 設定或更改使用者密碼和密碼老化資訊。
  • 能夠使用 nmap 和 netstat 發現系統上的開放埠。
  • 設定使用者登入、程序和記憶體使用量的限制。
  • 基本的 sudo 配置和使用。
  • 在啟動時阻止 Root 訪問。



加固 init

許多系統(在其預設配置中)可以啟動到單使用者模式以獲取 root shell,而無需提供 root 密碼。例如,對於 RHEL5 來說就是這樣。為了防止這種情況,編輯 /etc/inittab 並新增以下行

ss:S:respawn:/bin/sulogin

這行告訴系統,要進入狀態“S”(單使用者),它必須成功執行程式 /sbin/sulogin,該程式會要求輸入 root 密碼。此更改將阻止使用者透過簡單的單使用者啟動獲得 root 訪問許可權。


加固 GRUB

還有其他引導時漏洞會涉及修改 GRUB 傳遞給核心的選項。您可以透過設定 GRUB 密碼來防止這些漏洞。 為此

  1. 啟動 Linux 並執行 grub
  2. 在 grub 提示符下,輸入命令 md5crypt
  3. 在密碼提示符下,輸入所需的密碼
  4. 您將看到密碼雜湊(以“$1...”開頭)
  5. 編輯檔案 /boot/grub/grub.conf 並新增類似以下內容的行

password --md5 $1$c1Vcl/$RlF6Wm6XF3amlhOcDTCdv.

(這裡您應該複製並貼上您在步驟 4 中得到的密碼雜湊)。

此行的效果取決於您在 grub.conf 中的位置。如果您將其放在與特定引導選單選擇相對應的節段(即“title”行之後)中,那麼如果您從引導選單中選擇該項,grub 將始終要求輸入密碼。但是,如果您將其放在這些節段之外,grub 將只會在您嘗試在引導時編輯命令時要求輸入密碼。換句話說,使用 grub 配置中的現有項進行標準引導不需要密碼。


以下是將密碼放在“title”節段內的 grub.conf 示例

default=0

timeout=5

splashimage=(hd0,0)/boot/grub/splash.xpm.gz

hiddenmenu

title Red Hat Enterprise Linux Client (2.6.18-92.el5)

root (hd0,0)

kernel /boot/vmlinuz-2.6.18-92.el5 ro root=LABEL=/ rhgb quiet

initrd /boot/initrd-2.6.18-92.el5.img

password --md5 $1$c1Vcl/$RlF6Wm6XF3amlhOcDTCdv.


加固 BIOS

對計算機有物理訪問許可權的潛在入侵者可以從救援磁碟(或任何“即時”Linux CD)啟動,然後掛載並訪問硬碟上的檔案系統。為了防止這種情況,BIOS 應該配置為只從硬碟啟動。完成後,在 BIOS 上設定密碼。


入侵檢測

在您的系統上擁有合法帳戶的使用者,如果獲得了 root 訪問許可權一段時間(也許是因為您在 root 登入仍然處於活動狀態的情況下離開了計算機),他們可以透過建立由 root 擁有並打開了“setuid”位的可執行程式來植入“後門”。此特殊模式位會導致可執行檔案以檔案所有者的有效許可權執行。

您可以透過列出更改密碼程式來檢視此類程式的示例

# ls -l /usr/bin/passwd

-rwsr-xr-x 1 root root 27768 Jul 17 2006 /usr/bin/passwd


請注意第 4 個字元位置的“s”,它表明設定使用者 ID 位已開啟。此程式“設定為 root”,以便普通(非 root)使用者可以使用它來更改他們的密碼(這需要更新其密碼雜湊在 /etc/shadow 中)。

系統上存在許多合法的 setuid 程式。但是,意外的 setuid 程式(尤其是由 root 擁有的)表明入侵者可能建立了後門。您可以使用 find 命令找到此類程式;例如

# find / -user root -perm +4000 2> /dev/null

/bin/ping

/bin/su

/bin/mount

/usr/bin/passwd

/usr/bin/sudo

/usr/bin/crontab

/usr/bin/sudoedit

/usr/bin/chage

/usr/bin/rlogin

/usr/bin/rsh

/usr/bin/at

/usr/bin/chfn

/usr/bin/newgrp

... 刪除了許多輸出行 ...

在此示例中,值“+4000”表示 setuid 模式位的八進位制值。

您可以透過在系統處於原始狀態時首先捕獲這些檔案的列表來實現簡單的入侵檢測系統

# find / -user root -perm +4000 2> /dev/null > /root/good-setuid-list



之後,您可以構建一個新列表,然後比較這兩個列表。在下面的示例中,故意建立了 bash 的新的 setuid 複製品


# find / -user root -perm +4000 2> /dev/null > /root/new-setuid-list

# diff /root/good-setuid-list /root/new-setuid-list

36a37

> /home/chris/bash

入侵檢測工具(如 tripwire 和 AIDE(高階入侵檢測環境))提供了一種更徹底、更系統的方法來檢測檔案系統中意外的變化。它們的使用超出了 LPI-1 的範圍。

還存在一個“設定組 ID”位(八進位制值為 2000),它會導致可執行檔案以其組的有效組標識執行。例如

# ls -l /usr/bin/wall

-r-xr-sr-x 1 root tty 14792 Oct 13 2006 /usr/bin/wall

雖然不太常見(也不太危險),但您也可以使用 find 搜尋 setgid 程式


# find / -perm +2000 2> /dev/null

/usr/bin/ssh-agent

/usr/bin/xterm

/usr/bin/crontab

/usr/bin/locate

... 刪除行 ...

/usr/bin/wall


密碼管理

使用者可以使用 passwd 命令設定他們自己的密碼

$ passwd

正在更改使用者 chris 的密碼。

正在更改 chris 的密碼

(當前)UNIX 密碼

新 UNIX 密碼

重新輸入新 UNIX 密碼

passwd: 所有身份驗證令牌已成功更新。


Root 可以設定或更改任何使用者的密碼

# passwd chris

正在更改使用者 chris 的密碼。

新 UNIX 密碼

密碼錯誤:基於字典詞

重新輸入新 UNIX 密碼

passwd: 所有身份驗證令牌已成功更新。


注意,當非 root 使用者設定其密碼時,會強制執行密碼強度檢查。但是,當 root 設定使用者的密碼時,密碼強度檢查只會發出警告;它不會阻止 root 設定弱密碼。

密碼強度檢查策略由 PAM 模組控制。要進一步控制密碼強度,請考慮使用 pam_passwdqc 或 pam_cracklib 模組。

密碼不會以純文字形式儲存在系統的任何位置。相反,它們的雜湊會被寫入檔案 /etc/shadow 中。這是一個示例行

# grep chris /etc/shadow

chris:$1$z5b2XDJ7$LLOh4VX5us3UMP2PMFXFp0:14869:0:99999:7::


當用戶登入並提供其密碼時,它會被雜湊化,並且雜湊會與 /etc/shadow 中的雜湊進行比較。密碼可以被鎖定解鎖以暫時停用和重新啟用帳戶。Root 可以使用 passwd -l 鎖定任何使用者的密碼,並使用 passwd -u 解鎖。鎖定密碼只是在密碼雜湊前面放置“!!” 以便它不再是有效的雜湊。解鎖密碼只是刪除“!!” 字元

# passwd -l chris

正在鎖定使用者 chris 的密碼。

passwd: 成功

# grep chris /etc/shadow

chris:!!$1$z5b2XDJ7$LLOh4VX5us3UMP2PMFXFp0:14869:0:99999:7::

# passwd -u chris

正在解鎖使用者 chris 的密碼。

passwd: 成功。

# grep chris /etc/shadow

chris:$1$z5b2XDJ7$LLOh4VX5us3UMP2PMFXFp0:14869:0:99999:7::

可以實施密碼老化策略,迫使使用者定期選擇新密碼,或者在指定日期強制使用者帳戶過期。密碼老化引數儲存在 /etc/shadow 中的欄位 3-8 中,並使用 chage 命令進行管理。chage 命令的選項包括

-ESet 帳戶過期日期

-mSet 密碼更改之間的最短天數(0 表示“無最低天數”)

-MSet 密碼的最大有效期

-WSet 密碼即將過期時向用戶發出警告的提前期(天數)

-l列出當前的密碼老化值


示例

# chage -E 31-12-2011 -M 30 -W 7 chris

# chage -l chris

上次密碼更改時間:Sep 17, 2010

密碼過期時間:Oct 17, 2010

密碼失效時間:從不

帳戶過期時間:Jun 02, 2037

密碼更改之間最短天數:0

密碼更改之間最長天數:30

密碼過期前警告天數:7


最佳實踐

[編輯 | 編輯原始碼]

系統管理員應儘量減少以 root 使用者身份登入的時間。他們應該擁有一個用於一般工作的普通帳戶,並且只在需要執行需要 root 許可權的操作時才切換到 root 使用者。切換到 root 使用者使用 su(替換使用者)命令執行。

該命令的一般形式為

su [-l] [user]

su 會提示輸入使用者的密碼,然後啟動一個以該使用者身份執行的 shell。如果未指定使用者名稱,則該命令會啟動一個 root shell。這是最常見的用法。'-l' 選項告訴 su 啟動一個登入 shell。此 shell 將執行與使用者最初登入時相同的啟動處理;也就是說,它將設定使用者的環境,包括其搜尋路徑。通常,這就是您想要執行的操作。(您也可以使用 '-' 代替 '-l'

id 命令可用於顯示使用者的標識和組成員資格。在下面的示例中,我們使用它來檢查使用 su 之前和之後的身份

[[Image:]]

$ id

uid=500(chris) gid=500(chris) groups=500(chris)

$ su - l

密碼

# id

uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)

sudo 命令可用於授予非 root 使用者以 root 使用者身份執行特定命令的能力,而無需告訴他們 root 密碼。它由檔案配置。

以下是從該檔案中的一條簡單規則的示例

chris ALL=(ALL) /sbin/iptables

有了這條規則,chris 可以提升其許可權以 root 使用者身份執行 iptables 命令

$ /sbin/iptables -F

iptables v1.3.5: 許可權被拒絕(您必須是 root 使用者)

$ sudo /sbin/iptables -F

[sudo] chris 的密碼

$

這裡請求的密碼是使用者自己的密碼,不是 root 密碼。

以下是從 sudoers 中的一條更復雜的規則

harry williambox=(william) /bin/ls, /home/william/bin/testscript.sh

此規則允許 harry 以 william 的身份在 williambox 機器上執行 /bin/ls 和 /home/william/bin/testcript.sh。 (將 sudo 規則限制在特定機器上,對於網路共享 sudoers 檔案很有用。)請注意,sudoers 檔案中的命令必須使用絕對路徑名指定。

sudo 存在一個“寬限期”,在此期間不會再次提示輸入密碼。 這可以透過在 sudoers 檔案中新增以下類似的行來設定

Defaults timestamp_timeout=10

將其設定為 0 將強制 sudo 每次都提示輸入密碼。 使用者可能會覺得這很煩人!

透過定義 *使用者別名*(使用者命名列表)、*主機別名*(主機命名列表)和 *命令別名*(命令命名列表),可以使更大、更復雜的 sudoers 檔案更易於維護。 以下是一個更長的示例

User_Alias ADMINS = jsmith, mikem

Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/up2date, /usr/bin/yum

Cmnd_Alias SERVICES = /sbin/service, /sbin/chkconfig

Cmnd_Alias STORAGE = /sbin/fdisk, /sbin/sfdisk, /sbin/parted, /sbin/partprobe, /bin/mount, /bin/umount

Host_Alias FILESERVERS = fs1, fs2

Host_Alias MAILSERVERS = smtp, smtp2

ADMINS FILESERVERS = STORAGE

chris ALL = SOFTWARE

%wheel ALL = (ALL) ALL

在這個例子中,命令別名實際上定義了角色,從該角色需要能夠執行的命令集合的角度來看。 檔案的最後三行是實際規則。 依次來看

  1. 使用者別名 ADMINS 的成員可以在主機別名 FILESERVERS 列出的任何機器上執行命令別名 STORAGE 中的任何命令
  2. chris 可以在所有機器上執行命令別名 SOFTWARE 中的命令
  3. Linux wheel 組的成員可以在任何機器上以 root 身份執行任何命令

必須使用 visudo 命令編輯 sudoers 檔案。 不要直接編輯它。 visudo 命令將在儲存檔案之前驗證檔案是否語法有效。

使用 sudo 有許多優點

  1. 需要知道 root 密碼的人數最少
  2. 使用者以 root 身份執行的時間最短(僅執行一個命令的持續時間),並且立即恢復到非 root 命令提示符
  3. sudo 記錄其所有操作,通常記錄在 /var/log/secure 中。 因此,保留了所有 root 活動的審計跟蹤。

Ubuntu 專用於 root 命令。 在預設配置中,root 帳戶被鎖定,因此無法直接以 root 身份登入或使用 su 成為 root。 相反,所有操作都使用 sudo。 Ubuntu sudoers 檔案中的關鍵行如下所示

%admin ALL = (ALL) ALL

安裝 Ubuntu 時建立的初始帳戶會自動成為 *admin* 組的成員。

查詢和關閉埠

機器只應執行其應該執行的服務。 不需要的服務及其關聯的開放埠可能會削弱安全性。 如果不應該執行服務,請確保它沒有配置為啟動。 對於 RedHat 風格的發行版(或使用傳統“System-V”風格服務管理的其他發行版),使用 chkconfig 命令檢查和修改服務的執行狀態。 以下命令序列展示瞭如何檢查 httpd 守護程式(Web 伺服器)的當前狀態並停用它。

# chkconfig --list httpd

httpd 0:off1:off2:on3:on4:on5:on6:off

# chkconfig httpd off

# chkconfig --list httpd

httpd 0:off1:off2:off3:off4:off5:off6:off

在上面的示例中,我們看到 httpd 最初被配置為在執行級別 2、3、4 和 5 中啟動。

請注意,chkconfig 僅影響啟動時行為(或更準確地說,執行級別更改時的行為)。 使用 chkconfig 關閉服務實際上不會停止它執行。 為此,您應該執行服務的控制指令碼

# /etc/init.d/httpd stop

Stopping httpd: [ OK ]

檢查正在執行的服務的另一種方法是列出機器上的開放埠。 您可以使用 netstat 或 lsof 來執行此操作; 這些在主題 109.3 中進行了討論。

您還可以使用 nmap 確定哪些埠已開啟。 Nmap 是一個“網路偵察”工具,更常被稱為 *埠掃描器*。 Nmap 會從“外部”檢查您的開放埠,而 netstat 和 lsof 會從機器的“內部”檢查它們。 Nmap 也用於驗證您的防火牆是否按預期的方式工作。

但是,請注意,nmap 也可用於攻擊機器的初始階段,以確定正在執行的埠,從而確定可能被利用的漏洞。 因此,在您的機器上執行埠掃描(即使是您自己的機器)也可能被視為敵對行為,您應該在執行此操作之前獲得管理許可權。

下圖總結了 nmap 的命令語法

以下是一個 nmap 掃描的示例

$ nmap 192.168.81.130

Starting Nmap 5.00 ( http://nmap.org ) at 2010-09-17 16:09 BST

Interesting ports on 192.168.81.130

Not shown: 997 closed ports

PORT STATE SERVICE

22/tcp open ssh

80/tcp open http

111/tcp open rpcbind

Nmap done: 1 IP address (1 host up) scanned in 0.20 seconds


使用者限制

當 /etc/nologin 檔案存在(它可以為空)時,它將阻止所有使用者登入到系統(root 使用者除外)。 如果 **nologin** 檔案包含一條訊息,則該訊息將在成功身份驗證後顯示。

在 /etc/security/ 目錄中,是一組允許管理員限制使用者 CPU 時間、最大檔案大小、最大連線數等,以每使用者為基礎的檔案。

/etc/security/access.conf 檔案可用於禁止來自特定位置的組和使用者登入。

/etc/security/limits.conf 檔案可用於為多種資源設定硬限制和軟限制。 此檔案中的每一行都採用以下格式

<domain> <type> <item> <value>


domain 使用者名稱或組名(帶 @group)


type hard 或 soft


item

core - 限制核心檔案大小(KB)

data - 最大資料大小(KB)

fsize - 最大檔案大小(KB)

memlock - 最大鎖定在記憶體中的地址空間(KB)

nofile - 最大開啟檔案數

cpu - 最大 CPU 時間(分鐘)

nproc - 最大程序數

as - 地址空間限制

maxlogins - 此使用者的最大同時登入數

priority - 執行使用者程序的優先順序

locks - 使用者可以持有的最大檔案鎖數


這不是完整的列表 - 有關完整列表,請參閱 limits.conf(5) 的手冊頁。

以下是一些來自 limits.conf 的示例條目,並附有註釋

# 使用者 ellie 永遠無法建立大於 100 MB 的檔案

ellie hard fsize 102400

# Ellie 必須增加其軟限制才能建立大於 50 MB 的檔案

ellie soft fsize 51200

# student 組的使用者無法執行超過 50 個同時程序

@student hard nproc 20

# 預設情況下,除非使用者提高其軟限制,否則任何使用者都無法建立核心檔案

* soft core 0

資源的軟限制是目前有效的限制。 硬限制是使用者可以將軟限制增加到的最大值。

使用者可以使用 ulimit 命令(shell 內建命令)來更改當前有效的限制。 (非 root)使用者可以將軟限制設定為不超過硬限制的任何值。 他也可以降低硬限制(但不能再將其提高)。 這些限制在該 shell 的上下文中保持,並由該 shell 啟動的任何程式繼承。 但是,如果使用者登出並重新登入,則限制將從 limits.conf 中重新建立。


ulimit 命令接受許多選項,包括

-a 報告所有當前限制

-c 建立的核心檔案的最大大小

-d 程序資料段的最大大小

-e 最大排程優先順序(“nice”)

-f shell 及其子程序寫入的檔案的最大大小

-i 最大掛起訊號數

-l 可以鎖定到記憶體中的最大大小

-n 最大開啟檔案描述符數

-p 以 512 位元組塊為單位的管道大小(這可能無法設定)

-q POSIX 訊息佇列中的最大位元組數

-r 最大即時排程優先順序

-s 最大堆疊大小

-t 最大 CPU 時間(秒)

-u 單個使用者可用的最大程序數

-v shell 可用的最大虛擬記憶體

-x 最大檔案鎖數


在下面的示例中,我們將最大 CPU 時間設定為 100 秒,然後報告所有值

$ ulimit -t 100

$ ulimit -a

core file size (blocks, -c) 0

data seg size (kbytes, -d) unlimited

scheduling priority (-e) 0

file size (blocks, -f) unlimited

pending signals (-i) 8192

max locked memory (kbytes, -l) 32

max memory size (kbytes, -m) unlimited

open files (-n) 1024

pipe size (512 bytes, -p) 8

POSIX message queues (bytes, -q) 819200

real-time priority (-r) 0

stack size (kbytes, -s) 10240

cpu time (seconds, -t) 100

max user processes (-u) 8192

virtual memory (kbytes, -v) unlimited

file locks (-x) unlimited

從 limits.conf 中的設定在登入時建立 ulimit 設定是由 PAM 模組 pam_limits 執行的。 一些系統也支援 /etc/security/limits.d 目錄。 發現的任何檔案的內容將依次處理,就好像它們附加到 /etc/security/limits.conf 一樣。



以下是使用過的檔案、術語和實用程式的部分列表:* find

  • passwd
  • lsof
  • nmap
  • chage
  • netstat
  • sudo
  • /etc/sudoers
  • su
  • usermod
  • ulimit


上一章 | 下一章

華夏公益教科書