系統(tǒng)中,用戶是活動的主體,直接享有對系統(tǒng)文件和資源進(jìn)行操作和控制的權(quán)利,所以如何對系統(tǒng)中的用戶進(jìn)行好的管理,是系統(tǒng)管理員保證系統(tǒng)安全必須認(rèn)真完成的第一步工作。
在Linux操作系統(tǒng)中,每一個文件和程序都?xì)w屬于一個特定的“用戶”。每一個用戶都由一個惟一的身份來標(biāo)識,這個標(biāo)識叫做用戶ID(UserID,UID)。并且,系統(tǒng)中的每一個用戶也至少需要屬于一個“用戶分組”,也就是由系統(tǒng)管理員所建立的用戶小組,這個小組中包含著許多系統(tǒng)用戶。與用戶一樣,用戶分組也是由一個惟一的身份來標(biāo)識的,該標(biāo)識叫做用戶分組ID(GroupID,GID)。用戶可以歸屬于多個用戶分組。對某個文件或程序的訪問是以它的UID和GID為基礎(chǔ)的。一個執(zhí)行中的程序繼承了調(diào)用它的用戶的權(quán)利和訪問權(quán)限。
用戶文件和組文件
1. 用戶賬戶文件——/etc/passwd
/etc/passwd文件是Unix安全的關(guān)鍵文件之一。這個文件的每一行保存一個用戶的資料,而用戶資料的每一個數(shù)據(jù)項采用冒號“: ”分隔。如下所示:
LOGNAME: PASSWORD: UID: GID: USERINFO: HOME: SHELL
每行的頭兩項是登錄名和加密后的口令,后面的兩個數(shù)是UID和GID,接著的一項是系統(tǒng)管理員想寫入的有關(guān)該用戶的任何信息。最后兩項是兩個路徑名: 一個是分配給用戶的HOME目錄; 第二個是用戶登錄后將執(zhí)行的shell(若為空格則缺省為/bin/sh)。所有用戶口令的存放都是加密的,通常采用的是不可逆的加密算法,比如DES。任何擁有0值UID的用戶都具有根用戶(系統(tǒng)管理員)訪問權(quán)限,通常,UID是這個特殊值的用戶的登錄名是“root”。允許任何其他用戶或者用戶名擁有0值的UID都可能危及系統(tǒng)安全。
2. 用戶影子文件——shadow
由于/etc/passwd文件是全局可讀的,而且口令加密的算法是公開的,如果有惡意用戶取得了/etc/passwd文件,便可以窮舉所有可能的明文通過相同的算法計算出密文進(jìn)行比較,直到相同,從而破解口令。因此,針對這種安全問題,Linux/Unix廣泛采用了“shadow(影子)文件”機(jī)制,將加密的口令轉(zhuǎn)移到/etc/shadow文件里,該文件只為root超級用戶可讀,而同時/etc/passwd文件的密文域顯示為一個x,從而最大限度地減少了密文泄露的機(jī)會。/etc/shadow文件的每行是8個冒號分割的9個域,格式如下。
username: passwd: lastchg: min: max: warn: inactive: expire: flag
其中,各個域表示如下含義: 用戶登錄名、加密的用戶口令、從1970年1月1日起到上次修改口令所經(jīng)過的天數(shù)、兩次修改口令之間至少經(jīng)過的天數(shù)、口令還會有效的最大天數(shù)(如果是99999則表示永不過期)、口令失效前多少天內(nèi)系統(tǒng)向用戶發(fā)出警告、禁止登陸前用戶名還有效的天數(shù)、用戶被禁止登陸的時間、保留字段(暫未使用)。
3. 用戶組賬號文件——/etc/group
/etc/passwd文件中包含著每個用戶缺省的分組ID(GID)。在/etc/group文件中,這個GID被映射到該用戶分組的名稱以及同一分組中的其他成員。
/etc/group文件含有關(guān)于小組的信息,/etc/passwd中的每個GID在文件中應(yīng)當(dāng)有相應(yīng)的入口項,入口項中列出了小組名和小組中的用戶,這樣可方便地了解每個小組的用戶,否則必須根據(jù)GID在/etc/passwd文件中從頭至尾地尋找同組用戶,這提供了一個比較快捷的尋找途徑。/etc/group文件對小組的許可權(quán)限的控制并不是必要的,因為系統(tǒng)用來自于/etc/passwd文件的UID、GID來決定文件存取權(quán)限,即使/etc/group文件不存在于系統(tǒng)中,具有相同的GID用戶也可以小組的存取許可權(quán)限共享文件。小組就像登錄用戶一樣可以有口令。如果/etc/group文件入口項的第二個域為非空(通常用x表示),則將被認(rèn)為是加密口令。
/etc/group文件中每一行的內(nèi)容如下所示: 用戶分組名、加過密的用戶分組口令、用戶分組ID號(GID)、以逗號分隔的成員用戶清單。
4. 組賬號文件——/etc/gshadow
如同用戶賬號文件的作用一樣,組賬號文件也是為了加強(qiáng)組口令的安全性,防止對其實行的暴力攻擊,而采用的一種將組口令與組的其他信息相分離的安全機(jī)制。其格式如下所示: 用戶組名、加密的組口令、組成員列表。
驗證用戶和組文件
1. 使用pwck和grpck命令驗證用戶和組文件
上面所介紹的用戶以及組賬號文件都非常重要,對于系統(tǒng)驗證用戶和組具有重要意義。一旦上述文件發(fā)生錯誤,則會對系統(tǒng)造成影響。正是基于這個原因,Linux提供了pwck和grpck這兩個命令分別驗證用戶以及組文件,以保證這兩個文件的一致性和正確性。下面將分別加以介紹。
pwck用來驗證用戶賬號文件(/etc/passwd)和影子文件(/etc/shadow)的一致性,它驗證文件中的每一個數(shù)據(jù)項中每個域的格式以及數(shù)據(jù)的正確性。如果發(fā)現(xiàn)錯誤,該命令將會提示用戶對出現(xiàn)錯誤的數(shù)據(jù)項進(jìn)行刪除。
該命令主要驗證每個數(shù)據(jù)項是否具有: 正確的域數(shù)目、惟一的用戶名、合法的用戶和組標(biāo)識、合法的主要組群、合法的主目錄、合法的登錄shell。如果檢查發(fā)現(xiàn)域數(shù)目與用戶名錯誤,則該錯誤是致命的,則需要用戶刪除整個數(shù)據(jù)項。其他的錯誤均為非致命的,將會需要用戶進(jìn)行修改,而不一定要刪除整個數(shù)據(jù)項。下面的例子說明如何使用該命令:
//cat /etc/passwd
//顯示系統(tǒng)中原來的用戶賬號文件
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
……
#vi /etc/passwd
//編輯該賬號文件,并加入一項不存在的數(shù)據(jù)項
//“super:x:200:200:superman:/home/super:/bin/bash”
#pwck /etc/passwd //執(zhí)行驗證工作
//驗證出系統(tǒng)并不存在該super用戶
user adm: directory /var/adm does not exist
user news: directory /etc/news does not exist
user uucp: directory /var/spool/uucp does not exist
user gopher: directory /var/gopher does not exist
user pcap: directory /var/arpwatch does not exist
user super: no group 200
user super: directory /home/super does not exist
pwck: no changes
//再次編輯該賬號文件,加入不正確的數(shù)據(jù)項“super:x:200:200:superman:/home/super:”
//執(zhí)行驗證工作
#pwck /etc/passwd
user adm: directory /var/adm does not exist
user news: directory /etc/news does not exist
user uucp: directory /var/spool/uucp does not exist
user gopher: directory /var/gopher does not exist
user pcap: directory /var/arpwatch does not exist
user super: no group 200
user super: directory /home/super does not exist
invalid password file entry
delete line `'? y
pwck: the files have been updated
上述執(zhí)行的兩次驗證操作結(jié)果不一樣,第一次并沒有要求用戶刪除該不正確的數(shù)據(jù)項,原因是數(shù)據(jù)項中域的數(shù)目沒有發(fā)生錯誤,而第二次域的數(shù)目少了一個(本來應(yīng)該有七項,只有六項),所以是致命錯誤,系統(tǒng)提示用戶進(jìn)行刪除,用戶確定刪除后該文件驗證才通過。同樣地,也可以用該命令來驗證/etc/shadow文件的一致性。
與pwck命令相類似,grpck命令是用來驗證組賬號文件(/etc/group)和影子文件(/etc/gshadow)的一致性和正確性的。該命令驗證文件中的每一個數(shù)據(jù)項中每個域的格式以及數(shù)據(jù)的正確性。如果發(fā)現(xiàn)錯誤,該命令將會提示用戶對出現(xiàn)錯誤的數(shù)據(jù)項進(jìn)行刪除。
該命令主要驗證每個數(shù)據(jù)項是否具有: 正確的域數(shù)目、惟一的組群標(biāo)識、合法的成員和管理員列表。
如果檢查發(fā)現(xiàn)域數(shù)目與組名錯誤,則該錯誤是致命的,則需要用戶刪除整個數(shù)據(jù)項。其他的錯誤均為非致命的,將會需要用戶進(jìn)行修改,而不一定要刪除整個數(shù)據(jù)項。
下面的例子說明如何使用該命令:
//cat /etc/group //顯示系統(tǒng)中原來的用戶賬號文件
root:x:0:root,patterson
bin:x:1:root,bin,daemon
daemon:x:2:root,bin,daemon
sys:x:3:root,bin,adm
adm:x:4:root,adm,daemon
tty:x:5:
disk:x:6:root
lp:x:7:daemon,lp
kmem:x:9:
supersun:x:501:liyangsuper
liyangsuper:x:502:
patterson1:x:504:
programmer:x:2500:
jerry:x:503:
manager:x:2500:
#vi /etc/group
//編輯該賬號文件,加入不正確的數(shù)據(jù)項“test:x”
//執(zhí)行驗證工作
#grpck /etc/group
invalid group file entry
delete line `test:x:'? y
grpck: the files have been updated
上述命令判斷出插入的數(shù)據(jù)項的域數(shù)目不正確,是致命錯誤,因而提示用戶刪除相關(guān)數(shù)據(jù)項。同樣的,可以使用該命令驗證/etc/gshadow影子文件的一致性,操作步驟相同,這里不再贅述。
2. 使用其他方法
另外,上述的這些文件的一致性和正確性,也可使用在我們系列報道第一期所講述的Tripwire工具來進(jìn)行驗證和保護(hù)。具體步驟如下:
● 用戶首先在一套“干凈”的系統(tǒng)內(nèi),建立用戶和組,形成初始的相關(guān)用戶和組文件(包括/etc/passwd,/etc/shadow,/etc/group,/etc/gshadow);
● 對這些文件進(jìn)行備份,存放在安全的目錄當(dāng)中;
● 將這些監(jiān)控的對象文件添加到Tripwire掃描文件當(dāng)中;
● 定期地(一般為三天或一周)使用Tripwire對系統(tǒng)進(jìn)行掃描,查看掃面報告;
● 如果發(fā)現(xiàn)這些文件被修改過了,則需要用現(xiàn)在的文件與先前備份的文件進(jìn)行對比,查出被修改的文件,從而確定系統(tǒng)被非法添加或者去掉了某些用戶;
● 使用備份的文件進(jìn)行恢復(fù),并綜合采用其他安全工具根據(jù)實際情況進(jìn)行進(jìn)一步的處理。
需要注意的是,由于系統(tǒng)管理員在建立用戶或者用戶組時也會改動這些文件,Tripwire同樣會檢測到,所以系統(tǒng)管理員在使用后應(yīng)該重新對修改的文件進(jìn)行備份并修改相應(yīng)的Tripwire修改策略即可。