系統管理員安全

火星人 @ 2014-03-12 , reply:0


  本文從系統管理員的角度討論安全問題.系統管理員是管理系統的人:啟動系統,停止系統運行,安裝新軟體,增加新用戶,刪除老用戶,以及完成保持系統發展和運行的日常事務工作.

1.安全管理
安全管理主要分為四個方面:

(1)防止未授權存取:這是計算機安全最重要的問題:未被使用系統的人進入系統.用戶意識,良好的口令管理(由系統管理員和用戶雙方配合),登錄活動記錄和報告,用戶和網路活動的周期檢查,這些都是防止未授權存取的關鍵.(2)防止泄密:這也是計算機安全的一個重要問題.防止已授權或未授權的用戶相互存取相互的重要信息.文件系統查帳,su登錄和報告,用戶意識,加密都是防止泄密的關鍵.

(3)防止用戶拒絕系統的管理:這一方面的安全應由操作系統來完成.一個系統不應被一個有意試圖使用過多資源的用戶損害.不幸的是,UNIX不能很好地限制用戶對資源的使用,一個用戶能夠使用文件系統的整個磁碟空間,而UNIX基本不能阻止用戶這樣做.系統管理員最好用PS命令,記帳程序df和du周期地檢查系統.查出過多佔用CUP的進程和大量佔用磁碟的文件.

(4)防止丟失系統的完整性:這一安全方面與一個好系統管理員的實際工作(例如:周期地備份文件系統,系統崩潰后運行fsck檢查,修復文件系統,當有新用戶時,檢測該用戶是否可能使系統崩潰的軟體)和保持一個可靠的操作系統有關(即用戶不能經常性地使系統崩潰).本文其餘部分主要涉及前兩個問題,第三個問題在"安全查帳"一節討論.


2.超級用戶
一些系統管理命令只能由超級用戶運行.超級用戶擁有其他用戶所沒有的特權,超級用戶不管文件存取許可方式如何,都可以讀,寫任何文件,運行任何程序.系統管理員通常使用命令: /bin/su 或以 root 進入系統從而成為超級用戶.在後面文章中以#表示應敲入必須由超級用戶運行的命令,用$表示應敲入由所有其他用戶運行的命令.

3.文件系統安全
(1)UNIX文件系統概述
UNIX文件系統是UNIX系統的心臟部分,提供了層次結構的目錄和文件.文件系統將磁碟空間劃分為每1024個位元組一組,稱為塊(block)(也有用512位元組為一塊的,如:SCO XENIX).編號從0到整個磁碟的最大塊數.全部塊可劃分為四個部分,塊0稱為引導塊,文件系統不用該塊;塊1稱為專用塊,專用塊含有許多信息,其中有磁碟大小和全部塊的其它兩部分的大小.從塊2開始是i節點表,i節點表中含有i節點,表的塊數是可變的,後面將做討論.i節點表之後是空閑存儲塊(數據存儲塊),可用於存放文件內容.文件的邏輯結構和物理結構是十分不同的,邏輯結構是用戶敲入cat命令后所看到的文件,用戶可得到表示文件內容的字元流.物理結構是文件實際上如何存放在磁碟上的存儲格式.用戶認為自己的文件是邊疆的字元流,但實際上文件可能並不是以邊疆的方式存放在磁碟上的,長於一塊的文件通常將分散地存放在盤上.然而當用戶存取文件時,UNIX文件系統將以正確的順序取各塊,
給用戶提供文件的邏輯結構.當然,在UNIX系統的某處一定會有一個表,告訴文件系統如何將物理結構轉換為邏輯結構.這就涉及到i節點了.i節點是一個64位元組長的表,含有有關一個文件的信息,其中有文件大小,文件所有者,文件存取許可方式,以及文件為普通文件,目錄文件還是特別文件等.在i節點中最重要的一項是磁碟地址表.該表中有13個塊號.前10個塊號是文件前10塊的存放地址.這10個塊號能給出一個至多10塊長的文件的邏輯結構,文件將以塊號在磁碟地址表中出現的順序依次取相應的塊.當文件長於10塊時又怎樣呢?磁碟地址表中的第十一項給出一個塊號,這個塊號指出的塊中含有256個塊號,至此,這種方法滿足了至多長於266塊的文件(272,384位元組).如果文件大於266塊,磁碟地址表的第十二項給出一個塊號,這個塊號指出的塊中含有256個塊號,這256個塊號的每一個塊號又指出一塊,塊中含256個塊號,這些塊號才用於取文件的內容.磁碟地址中和第十三項索引定址方式與第十二項類似,只是多一級間接索引.這樣,在UNIX系統中,文件的最大長度是16,842,762塊,即17,246,988,288位元組,有幸是是UNIX系統對文件的最大長度(一般為1到2M位元組)加了更實際的限制,使用戶不會無意中建立一個用完整個磁碟窨所有塊的文件.文件系統將文件名轉換為i節點的方法實際上相當簡單.一個目錄實際上是一個含有目錄表的文件:對於目錄中的每個文件,在目錄表中有一個入口項,入口項中含有文件名和與文件相應的i節點號.當用戶敲入cat xxx時,文件系統就在當前目錄表中查找名為xxx的入口項,得到與文件xxx相應的i節點號,然後開始取含有文件xxx的內容的塊.

(2)設備文件
UNIX系統與邊在本系統上的各種設備之間的通訊,通過特別文件來實現,就程序而言,磁碟是文件,MODEM是文件,甚至內存也是文件.所有連接到系統上的設備都在/dev目錄中有一個文件與其對應.當在這些文件上執行I/O操作時,由UNIX系統將I/O操作轉換成實際設備的動作.例如,文件/dev/mem是系統的內存,如果cat這個文件,實際上是在終端顯示系統的內存.為了安全起見,這個文件對普通用戶是不可讀的.因為在任一給定時間,內存區可能含有用戶登錄口令或運行程序的口令,某部分文件的編輯緩衝區,緩衝區可能含有用ed -x命令解密后的文本,以及用戶不願讓其他人存取的種種信息.在/dev中的文件通常稱為設備文件,用ls /dev命令可以看看系統中的一些設備:
acuo 呼叫自動撥號器
console 系統控制台
dsknn 塊方式操作磁碟分區
kmem 核心內存
mem 內存
lp 印表機
mto 塊方式操作磁帶
rdsknn 流方式操作的磁碟分區
rmto 流方式操作的磁帶
swap 交換區
syscon 系統終端
ttynn 終埠
x25 網路埠
等等

(3)/etc/mknod命令
用於建立設備文件.只有root能使用這個命令建立設備文件.其參數是文件名,字母c或b分別代表字元特別文件或塊特別文件,主設備號,次設備號.塊特別文件是像磁帶,磁碟這樣一些以塊為單位存取數據的設備.字元特別文件是如像終端,印表機,MODEM,或者其它任何與系統通訊時,一次傳輸一個字元的設備,包括模仿對磁碟進行字元方式存取的磁碟驅動器.主設備號指定了系統子程序(設備驅動程序),當在設備上執行I/O時,系統將調用這個驅動程序.調用設備驅動程序時,次設備號將傳遞給該驅動程序(次設備規定具體的磁碟驅動器,帶驅動器,信號線編號,或磁碟分區).每種類型的設備一般都有自己的設備驅動程序.文件系統將主設備號和次設備號存放在i節點中的磁碟地址表內,所以沒有磁碟空間分配給設備文件(除i節點本身佔用的磁碟區外).當程序試圖在設備文件上執行I/O操作時,系統識別出該文件是一個特別文件,並調用由主設備號指定的設備驅動程序,次設備號作為調用設備驅動程序的參數.


(4)安全考慮
將設備處理成文件,使得UNIX程序獨立於設備,即程序不必一定要了解正使用的設備的任何特性,存取設備也不需要記錄長度,塊大小,傳輸速度,網路協議等這樣一些信息,所有煩人的細節由設備驅動程序去關心考慮,要存取設備,程序只須打開設備文件,然後作為普通的UNIX文件來使用.從安全的觀點來看這樣處理很好,因為任何設備上進行的I/O操作只經過了少量的渠道(即設備文件).用戶不能直接地存取設備.所以如果正確地設置了磁碟分區的存取許可,用戶就只能通過UNIX文件系統存取磁碟.文件系統有內部安全機制(文件許可).不幸的是,如果磁碟分區設備得不正確,任何用戶都能夠寫一個程序讀磁碟分區中的每個文件,作法很簡單:讀一i節點,然後以磁盤地址表中塊號出現的順序,依次讀這些塊號指出的存有文件內容的塊.故除了root以外,決不要使盤分區對任何人可寫.因為所有者,文件存取許可方式這樣一些信息存放於i節點中,任何人只要具有已安裝分區的寫許可,就能設置任何文件的SUID許可,而不管文件的所有者是誰,也不必用chmod()命令,還可避過系統建立的安全檢查.
以上所述對內存文件mem,kmem和對換文件swap也是一樣的.這些文件含有
用戶信息,一個"耐心"的程序可以將用戶信息提取出來.
要避免磁碟分區(以及其它設備)可讀可寫,應當在建立設備文件前先用
umask命令設置文件建立屏蔽值.
一般情況下,UNIX系統上的終埠對任何人都是可寫的,從而使用戶可以
用write命令發送信息.雖然write命令易引起安全方面的問題,但大多數用戶
覺得用write得到其他用戶的信息很方便,所以系統將終端設備的存取許可設
置成對所有用戶可寫.
/dev目錄應當是755存取許可方式,且屬root所有.
不允許除root外的任何用戶讀或寫盤分區的原則有一例外,即一些程序
(通常是資料庫系統)要求對磁碟分區直接存取,解決這個問題的經驗的盤分區
應當由這種程序專用(不安裝文件系統),而且應當告知使用這種程序的用戶,
文件安全保護將由程序自己而不是UNIX文件系統完成.

(5)find命令
find命令用於搜索目錄樹,並對目錄樹上的所有文件執行某種操作,參數
是目錄名表(指出從哪些起點開始搜索),還可給出一個或多個選項,規定對每
個文件執行什麼操作.
find . -print 將列出當前工作目錄下的目錄樹的每一個文件.
find / -user bob -print 將列出在系統中可找到的屬於bob用戶的所有
文件.
find /usr/bob -perm 666 -print 將列出/usr/bob目錄樹下所有存取許
可為666的文件.若將666改為-666則將列出所有具有包含了666在內
的存取許可方式的文件(如777).
find /usr/bob -type b -print 將列出/usr/bob目錄樹下所有塊特別文
件(c為字元特別文件).
find / -user root -perm -4000 -exec ls -l {} \; 是一個較複雜一
點的命令,-exec COMMAND \;允許對所找到的每個文件運行指定的
命令COMMAND.若COMMAND中含有{},則{}將由find所找到的文件名替
換.COMMAND必須以\;結束.
以上舉例介紹find的用法,各選項可組合使用以達到更強的功能.

(6)secure程序
系統管理員應當做一個程序以定期檢查系統中的各個系統文件,包括檢查
設備文件和SUID,SGID程序,尤其要注意檢查SUID,SGID程序,檢查/etc/passwd
和/etc/group文件,尋找久未登錄的戶頭和校驗各重要文件是否被修改.
(源程序清單將在今後發表)

(7)ncheck命令
用於檢查文件系統,只用一個磁碟分區名作為參數,將列出i節點號及相應
的文件名.i節點相同的文件為建鏈文件.
注意:所列出的清單文件名與mount命令的第一個域相同的文件名前部分
將不會列出來.因為是做文件系統內部的檢查,ncheck並不知道文件系統安裝
點以上部分的目錄.
也可用此命令來搜索文件系統中所有的SUID和SGID程序和設備文件,使用
-s選項來完成此項功能.

(8)安裝和拆卸文件系統
UNIX文件系統是可安裝的,這意味著每個文件系統可以連接到整個目錄樹
的任意節點上(根目錄總是被安裝上的).安裝文件系統的目錄稱為安裝點.
/etc/mount命令用於安裝文件系統,用這條命令可將文件系統安裝在現有
目錄結構的任意處.
安裝文件系統時,安裝點的文件和目錄都是不可存取的,因此未安裝文件
系統時,不要將文件存入安裝點目錄.文件系統安裝后,安裝點的存取許可方式
和所有者將改變為所安裝的文件根目錄的許可方式和所有者.
安裝文件系統時要小心:安裝點的屬性會改變!還要注意新建的文件,除非
新文件系統是由標準文件建立的,系統標準文件會設置適當的存取許可方式,
否則新文件系統的存取許可將是777!
可用-r選項將文件系統安裝成只讀文件系統.需要防寫的帶驅動器和磁
盤應當以這種方式來安裝.
不帶任何參數的/etc/mount可獲得系統中所安裝的文件系統的有關信息.
包括:文件系統被安裝的安裝點目錄,對應/dev中的哪個設備,只讀或可讀寫,
安裝時間和日期等.
從安全的觀點來講,可安裝系統的危險來自用戶可能請求系統管理員為其
安裝用戶自己的文件系統.如果安裝了用戶的文件系統,則應在允許用戶存取
文件系統前,先掃描用戶的文件系統,搜索SUID/SGID程序和設備文件.在除了
root外任何人不能執行的目錄中安裝文件系統,用find命令或secure列出可疑
文件,刪除不屬用戶所有的文件的SUID/SGID許可.
用戶的文件系統用完后,可用umount命令卸下文件系統.並將安裝點目錄
的所有者改回root,存取許可改為755.

(9)系統目錄和文件
UNIX系統中有許多文件不允許用戶寫,如:/bin,/usr/bin,/usr/lbin,
/etc/passwd,/usr/lib/crontab,/unix,/etc/rc,/etc/inittab這樣一些文件
和目錄(大多數的系統目錄),可寫的目錄允許移動文件,會引起安全問題.
系統管理員應經常檢查系統文件和目錄的許可許可權和所有者.可做一個程
序根據系統提供的規則文件(在/etc/permlist文件中)所描述的文件所有者和
許可權規則檢查各文件.
(源程序清單將在今後發表)
注意:如果系統的安全管理不好,或系統是新安裝的,其安全程序不夠高,
可以用make方式在安全強的系統上運行上述程序,將許可規則文件拷貝到新系
統來,再以設置方式在新系統上運行上述程序,就可提高本系統的安全程序.但
要記住,兩個系統必須運行相同的UNIX系統版本.

4.作為root運行的程序
在UNIX系統中,有些程序由系統作為root進程運行.這些程序並不總是具有
SUID許可,因為其不少程序僅由root運行,系統管理員需要清楚這些程序做什麼,
以及這些程序還將運行其它什麼程序.

(1)啟動系統
當某些UNIX系統(如SCO UNIX/XENIX)啟動時,是以被稱為單用戶的方式運
行,在這種方式中普通用戶不能登錄,唯有的進程是init,swapper,以及一些由
系統管理員從控制台運行的進程.UNIX系統的單用戶方式啟動,使系統管理員
能在允許普通用戶登錄以前,先檢查系統操作,確保系統一切正常,當系統處於
單用戶方式時,控制台作為超級用戶,命令揭示是"#",有些UNIX系統不要確認
超級用戶口令就認可控制台是root,給出#提示符.這就可能成為一個安全問題.

(2)init進程
UNIX系統總是以某種方式或稱為某種級運行,系統有若干種運行級,這些
運行級由init進程式控制制.
UNIX系統啟動時以單用戶方式運行,也叫1級或S級.
對於其他用戶登錄進入系統,UNIX有一種多用戶運行方式,也叫2級.
init進程式控制制系統運行級,它讀入文件/etc/inittab,該文件詳細地規定
了哪些進程在哪一級運行.當root敲入init n(數字),系統就進入n級.init讀
該文件以確定終止哪些進程,啟動哪些進程.
有效的運行級的數值是從0到6與s.
注意:由init建立的進程以UID為0運行(root)從/etc/inittab運行的程序
也作為root運行,所以系統管理員要確保自己知道/etc/inittab中的程序做什
么工作,確保這些程序以及這些程序所在的目錄直到/和/etc/inittab除root
外無人可寫.

(3)進入多用戶
當UNIX系統進入多用戶方式時,將寢化一系列事件,接著開始執行gettys,
允許其他用戶登錄進入系統.如果再看看/etc/inittab文件,會看到gettys定
義在運行級2,至少三個shell程序/etc/brc,/etc/bcheckrc,/etc/rc*也定義
在運行級2.這些程序都在gettys啟動前運行.
這些shell程序作為root運行,也不能僅對root可寫還應當檢查shell程序
運行的命令,因為這些命令也將作為root運行.

(4)shutdown命令
用shutdown命令關係統,shutdown shell程序發送警告通知所有用戶離開
系統,在"給定的期限時間"到了后,就終止進程,拆卸文件系統,進入單用戶方
式或關機狀態.一旦進入單用戶方式,所有的gettys停止運行,用戶再不能登錄.
進入關機狀態后可將系統關電.
shutdown僅能由作為root登錄的用戶從系統控制台上運行.所以任何的
shutdown運行的命令僅能對root可寫.

(5)系統V的cron程序
cron在UNIX系統是多用戶方式時運行,根據規定的時間安排執行指定的命
令,每隔一分鐘檢查一次文件/usr/lib/crontab,尋找是否有應當運行的程序?
如果找到要運行的程序,就運行該程序,否則睡眠等待一分鐘.
實際的/usr/lib/crontab用於根據全天的規則時間表運行程序,也可在夜
晚運行白天不願運行怕降低其他用戶速度的程序.通常由cron運行的程序是如
記帳,存文件這樣的程序.cron一般在系統進入多用戶後由/etc/rc啟動,當
shutdown運行killall命令時便終止運行.由cron運行的程序作為root,所以應
當注意放什麼程序在crontab中,還要確保/usr/lib/crontab和該表中列出的
任何程序對任何人不可寫.
如果用戶需要由cron執行一個程序,系統管理員可用su命令在crontab表
中建立一個入口,使用戶的程序不能獲得root的許可權.

(6)系統V版本2之後的cron程序
在系統V版本2中,cron被修改成允許用戶建立自己的crontab入口,
/usr/lib/crontab文件不再存在,由目錄/usr/spool/cron/crontabs中的文件
代替.這些文件的格式與crontab相同,但每個文件與系統中的一個用戶對應,
並以某用戶的名義由cron運行.
如果想限制能建立crontab的用戶,可在文件/usr/lib/cron/cron.allow
文件中列出允許運行crontab命令的用戶.任何未列於該文件的用戶不能運行
crontab.反之,若更願意列出不允許運行crontab命令的用戶,則可將他們列入
/usr/lib/cron/cron.deny文件中,未列於該文件的其他用戶將被允許建立
crontab.
注意:若兩個文件都存在,系統將使用cron.allow,忽略cron.deny.如果兩
個文件都不存在,則只有root可運行crontab.所以,若要允許系統中的所有用
戶都可運行crontab命令,應當建立一個空的cron.deny文件,如果cron.allow
也存在,則刪除該文件.
這個版本的cron命令的安全程度比前一個高,因為用戶只能看自己的
crontab,系統管理員也不必擔心其他用戶的程序是否會作為root運行,由於允
許每個系統登錄用戶有自己的crontab,也簡化了對程序必須由cron運行,但不
必作為root運行的系統程序的處理.
必須確保root的crontab文件僅對root可寫,並且該文件所在的目錄及所
有的父目錄也僅對root可寫.

(7)/etc/profile
每當用戶(包括root在內)登錄時,由shell執行/etc/profile文件,應確保
這個文件以及從這個文件運行的程序和命令都僅對root可寫.

5./etc/passwd文件
/etc/passwd文件是UNIX安全的關鍵文件之一.該文件用於用戶登錄時校驗
用戶的口令,當然應當僅對root可寫.文件中每行的一般格式為:
LOGNAME:PASSWORD:UID:GID:USERINFO:HOME:SHELL
每行的頭兩項是登錄名和加密后的口令,後面的兩個數是UID和GID,接著的
一項是系統管理員想寫入的有關該用戶的任何信息,最後兩項是兩個路徑名:
一個是分配給用戶的HOME目錄,第二個是用戶登錄后將執行的shell(若為空格則
預設為/bin/sh).

(1)口令時效
/etc/passwd文件的格式使系統管理員能要求用戶定期地改變他們的口令.
在口令文件中可以看到,有些加密后的口令有逗號,逗號後有幾個字元和一個
冒號.如:
steve:xyDfccTrt180x,M.y8:0:0:admin:/:/bin/sh
restrict:pomJk109Jky41,.1:0:0:admin:/:/bin/sh
pat:xmotTVoyumjls:0:0:admin:/:/bin/sh
可以看到,steve的口令逗號後有4個字元,restrict有2個,pat沒有逗號.
逗號后第一個字元是口令有效期的最大周數,第二個字元決定了用戶再次
修改口信之前,原口令應使用的最小周數(這就防止了用戶改了新口令后立刻
又改回成老口令).其餘字元表明口令最新修改時間.
要能讀懂口令中逗號后的信息,必須首先知道如何用passwd_esc計數,計
數的方法是: .=0 /=1 0-9=2-11 A-Z=12-37 a-z=38-63
系統管理員必須將前兩個字元放進/etc/passwd文件,以要求用戶定期的
修改口令,另外兩個字元當用戶修改口令時,由passwd命令填入.
注意:若想讓用戶修改口令,可在最後一次口令被修改時,放兩個".",則下
一次用戶登錄時將被要求修改自己的口令.
有兩種特殊情況:
. 最大周數(第一個字元)小於最小周數(第二個字元),則不允許用戶修改
口令,僅超級用戶可以修改用戶的口令.
. 第一個字元和第二個字元都是".",這時用戶下次登錄時被要求修改口
令,修改口令后,passwd命令將"."刪除,此後再不會要求用戶修改口令.

(2)UID和GID
/etc/passwd中UID信息很重要,系統使用UID而不是登錄名區別用戶.一般
來說,用戶的UID應當是獨一無二的,其他用戶不應當有相同的UID數值.根據慣
例,從0到99的UID保留用作系統用戶的UID(root,bin,uucp等).
如果在/etc/passwd文件中有兩個不同的入口項有相同的UID,則這兩個用
戶對相互的文件具有相同的存取許可權.

6./etc/group文件
/etc/group文件含有關於小組的信息,/etc/passwd中的每個GID在本文件中
應當有相應的入口項,入口項中列出了小組名和小組中的用戶.這樣可方便地了
解每個小組的用戶,否則必須根據GID在/etc/passwd文件中從頭至尾地尋找同組
用戶.
/etc/group文件對小組的許可許可權的控制並不是必要的,因為系統用UID,GID
(取自/etc/passwd)決定文件存取許可權,即使/etc/group文件不存在於系統中,具
有相同的GID用戶也可以小組的存取許可許可權共享文件.
小組就像登錄用戶一樣可以有口令.如果/etc/group文件入口項的第二個域
為非空,則將被認為是加密口令,newgrp命令將要求用戶給出口令,然後將口令加
密,再與該域的加密口令比較.
給小組建立口令一般不是個好作法.第一,如果小組內共享文件,若有某人猜
著小組口令,則該組的所有用戶的文件就可能泄漏;其次,管理小組口令很費事,
因為對於小組沒有類似的passwd命令.可用/usr/lib/makekey生成一個口令寫入
/etc/group.
以下情況必須建立新組:
(1)可能要增加新用戶,該用戶不屬於任何一個現有的小組.
(2)有的用戶可能時常需要獨自為一個小組.
(3)有的用戶可能有一個SGID程序,需要獨自為一個小組.
(4)有時可能要安裝運行SGID的軟體系統,該軟體系統需要建立一個新組.
要增加一個新組,必須編輯該文件,為新組加一個入口項.
由於用戶登錄時,系統從/etc/passwd文件中取GID,而不是從/etc/group中
取GID,所以group文件和口令文件應當具有一致性.對於一個用戶的小組,UID和
GID應當是相同的.多用戶小組的GID應當不同於任何用戶的UID,一般為5位數,這
樣在查看/etc/passwd文件時,就可根據5位數據的GID識別多用戶小組,這將減少
增加新組,新用戶時可能產生的混淆.

7.增加,刪除,移走用戶

(1)增加用戶
增加用戶有三個過程:
. 在/etc/passwd文件中寫入新用戶的入口項.
. 為新登錄用戶建立一個HOME目錄.
. 在/etc/group中為新用戶增加一個入口項.
在/etc/passwd文件中寫入新的入口項時,口令部分可先設置為NOLOGIN,
以免有人做為此新用戶登錄.在修改文件前,應mkdir /etc/ptmp,以免他人同
時修改此文件.新用戶一般獨立為一個新組,GID號與UID號相同(除非他要加入
目前已存在的一個新組),UID號必須和其他人不同,HOME目錄一般設置在/usr
或/home目錄下建立一個以用戶登錄名為名稱的目錄做為其主目錄.

(2)刪除用戶
刪除用戶與加用戶的工作正好相反,首先在/etc/passwd和/etc/group文
件中刪除用戶的入口項,然後刪除用戶的HOME目錄和所有文件.
rm -r /usr/loginname 刪除整個目錄樹.
如果用戶在/usr/spool/cron/crontabs中有crontab文件,也應當刪除.

(3)將用戶移到另一個系統
這是一個複雜的問題,不只是拷貝用戶的文件和用戶在/etc/passwd文件
中的入口項.首先一個問題是用戶的UID和GID可能已經用於另一個系統,若是
出現這種情況,必須給要移的用戶分配另外的UID和GID,如果改變了用戶的UID
和GID,則必須搜索該用戶的全部文件,將文件的原UID和GID改成新的UID和GID.
用find命令可以完成這一修改:
find . -user olduid -exec chown newuid {} \;
find . -group oldgid -exec chgrp newgid {} \;
也許還要為用戶移走其它一些文件:
/usr/mail/user和/usr/spool/cron/crontabs/user.
如果用戶從一個不是本系統管理員的系統移來,則應對該用戶的目錄結構
運行程序來檢查.一個不安全系統的用戶,可能有與該用戶其它文件存在一起
的SUID/SGID程序,而這個SUID/SGID程序屬於另一個用戶.在這種情況下,如果
用cpio或tar命令將用戶的目錄結構拷貝到本系統,SUID/SGID程序也將會拷貝
到本系統而沒有任何警告信息.應當在允許用戶使用新系統以前先刪除這種文
件的SUID/SGID許可.總之,始終堅持檢查所移用戶的文件總是更安全些.也可
以用su命令進入用戶的戶頭,再拷貝用戶文件,這樣文件的所有者就是該用戶,
而不是root.

8.安全檢查
像find和secure這樣的程序稱為檢查程序,它們搜索文件系統,尋找出SUID/
SGID文件,設備文件,任何人可寫的系統文件,設有口令的登錄用戶,具有相同UID
/GID的用戶等等.

(1)記帳
UNIX記帳軟體包可用作安全檢查工具,除最後登錄時間的記錄外,記帳系
統還能保存全天運行的所有進程的完整記錄,對於一個進程所存貯的信息包括
UID,命令名,進程開始執行與結束的時間,CPU時間和實際消耗的時間,該進程
是否是root進程,這將有助於系統管理員了解系統中的用戶在幹什麼.acctcom
命令可以列出一天的帳目表.有明,系統中有多個記帳數據文件,記帳信息保存
在文件/usr/adm/pacct*中,/usr/adm/pacct是當前記錄文件,/usr/adm/pacctn
是以前的記帳文件(n為整型數).若有若干個記帳文件要查看,可在acctcom命
令中指定文件名: acctcom /usr/adm/pacct? /usr/adm/pacct
要檢查的問題的其中之一是:在acctcom的輸出中查找一個用戶過多的登
錄過程,若有,則說明可能有人一遍遍地嘗試登錄,猜測口令,企圖非法進入系
統.此外,還應查看root進程,除了系統管理員用su命令從終端進入root,系統
啟動,系統停止時間,以及由init(通常init只啟動getty,login,登錄shell),
cron啟動的進程和具有root SUID許可的命令外,不應當有任何root進程.
由記帳系統也可獲得有關每個用戶的CPU利用率,運行的進程數等統計數
據.

(2)其它檢查命令
*du:報告在層次目錄結構(當前工作目錄或指定目錄起)中各目錄佔用的
磁碟塊數.可用於檢查用戶對文件系統的使用情況.
*df:報告整個文件系統當前的空間使用情況.可用於合理調整磁碟空間的
使用和管理.
*ps:檢查當前系統中正在運行的所有進程.對於用了大量CPU時間的進程,
同時運行了許多進程的用戶,運行了很長時間但用了很少CPU時間的
用戶進程應當深入檢查.還可以查出運行了一個無限制循環的後台進
程的用戶,未註銷戶頭就關終端的用戶(一般發生在直接連線的終端).
*who:可以告訴系統管理員系統中工作的進展情況等等許多信息,檢查用
戶的登錄時間,登錄終端.
*su:每當用戶試圖使用su命令進入系統用戶時,命令將在/usr/adm/sulog
文件中寫一條信息,若該文件記錄了大量試圖用su進入root的無效操
作信息,則表明了可能有人企圖破譯root口令.
*login:在一些系統中,login程序記錄了無效的登錄企圖(若本系統的
login程序不做這項工作而系統中有login源程序,則應修改login).
每天總有少量的無效登錄,若無效登錄的次數突然增加了兩倍,則表
明可能有人企圖通過猜測登錄名和口令,非法進入系統.
這裡最重要的一點是:系統管理沒越熟悉自己的用戶和用戶的工作習慣,
就越能快速發現系統中任何不尋常的事件,而不尋常的事件意味著系統已被人
竊密.


(3)安全檢查程序的問題
關於以上的檢查方法的一個警告,若有誘騙,則這些方法中沒有幾個能防
誘騙.如find命令,如果碰到路徑名長於256個字元的文件或含有多於200個文
件的目錄,將放棄處理該文件或目錄,用戶就有可能利用建立多層目錄結構或
大目錄隱藏SUID程序,使其逃避檢查(但find命令會給出一個錯誤信息,系統管
理員應手工檢查這些目錄和文件).也可用ncheck命令搜索文件系統,但它沒有
find命令指定搜索哪種文件的功能.
如果定期存取.profile文件,則檢查久未登錄用戶的方法就不奏效了.而
用戶用su命令時,除非用參數-,否則su不讀用戶的.profile.
有三種方法可尋找久未登錄的帳戶:
. UNIX記帳系統在文件/usr/adm/acct/sum/login中為每個用戶保留了最
后一次登錄日期.用這個文件的好處是,該文件由系統維護,所以可完全
肯定登錄日期是準確的.缺點是必須在系統上運行記帳程序以更新
loginlog文件,如果在清晨(午夜后)運行記帳程序,一天的登錄日期可
能就被清除了.
. /etc/passwd文件中的口令時效域將能告訴系統管理員,用戶的口令是
否過期了,若過期,則意味著自過期以來,戶頭再未被用過.這一方法的
好處在於系統記錄了久未用的戶頭,檢查過程簡單,且不需要記帳系統
所需要的磁碟資源,缺點是也許系統管理員不想在系統上設置口令時效,
而且這一方法僅在口令的最大有效期(只有幾周)才是準確的.
. 系統管理員可以寫一個程序,每天(和重新引導系統時)掃描/etc/wtmp,
自己保留下用戶最後登錄時間記錄,這一方法的好處是不需要記帳程序,
並且時間準確,缺點是要自己寫程序.
以上任何方法都可和/usr/adm/sulog文件結合起來,查出由login或su登
錄戶頭的最後登錄時間.
如果有人存心破壞系統安全,第一件要做的事就是尋找檢查程序.破壞者
將修改檢查程序,使其不能報告任何異常事件,也可能停止系統記帳,刪除記帳
文件,使系統管理員不能發現破壞者幹了些什麼.

(4)系統泄密后怎麼辦?
發現有人已經破壞了系統安全的時候,這時系統管理員首先應做的是面對
肇事用戶.如果該用戶所做的事不是蓄意的,而且公司沒有關於"破壞安全"的
規章,也未造成損壞,則系統管理員只需清理系統,並留心該用戶一段時間.如
果該用戶造成了某些損壞,則應當報告有關人士,並且應儘可能地將系統恢復
到原來的狀態.
如果肇事者是非授權用戶,那就得做最壞的假設了:肇事者已設法成為root
且本系統的文件和程序已經泄密了.系統管理員應當想法查出誰是肇事者,他
造成了什麼損壞?還應當對整個文件做一次全面的檢查,並不只是檢查SUID和
SGID,設備文件.如果系統安全被一個敵對的用戶破壞了,應當採用下面的步驟:
. 關係統,然後重新引導,不要進入多用戶方式,進入單用戶方式.
. 安裝含有本系統原始UNIX版本的帶和軟盤.
. 將/bin,/usr/bin,/etc,/usr/lib中的文件拷貝到一個暫存目錄中.
. 將暫存目錄中所有文件的校驗和(用原始版本的sum程序拷貝做校驗和,
不要用/bin中的suM程序做)與系統中所有對就的文件的校驗和進行比
較,如果有任何差別,要查清差別產生的原因.如果兩個校驗和不同,是
由於安裝了新版本的程序,確認一相是否的確是安裝了新版本程序.如
果不能找出校驗和不同的原因,用暫存目錄中的命令替換系統中的原有
命令.
. 在確認系統中的命令還未被竄改之前,不要用系統中原命令.用暫存目
錄中的shell,並將PATH設置為僅在暫存目錄中搜索命令.
. 根據暫存目錄中所有系統命令的存取許可,檢查系統中所有命令的存取
許可.
. 檢查所有系統目錄的存取許可,如果用了perms,檢查permlist文件是否
被竄改過.
. 如果系統UNIX(/unix)的校驗和不同於原版的校驗和,並且系統管理員
從未修改過核心,則應當認為,一個非法者"很能幹",從暫存緩衝區重新
裝入系統.系統管理員可以從逐步增加的文件系統備份中恢復用戶的文
件,但是在檢查備份中的"有趣"文件之前,不能做文件恢復.
. 改變系統中的所有口令,通知用戶他們的口令已改變,應找系統管理員
得到新口令.
. 當用戶來要新口令時,告訴用戶發生了一次安全事故,他們應查看自己
的文件和目錄是否潛伏著危害(如SUID文件,特洛依木馬,任何人可寫的
目錄),並報告系統管理員任何異乎尋常的情況.
. 設法查清安全破壞是如何發生的?如果沒有肇事者說明,這也許是不可
能弄清的.如果能發現肇事者如何進入系統,設法堵住這個安全漏洞.
第一次安裝UNIX系統時,可以將shell,sum命令,所有文件的校驗和存放在
安全的介質上(帶,軟盤,硬碟和任何可以卸下並鎖焉起來的介質).於是不必再
從原版系統帶上重新裝入文件,可以安裝備份介質,裝入shell和sum,將存在帶
上的校驗和與系統中文件的校驗和進行比較.系統管理員也許想自己寫一個計
算校驗和的程序,破壞者將不能知道該程序的演演算法,如果將該程序及校驗和保
存在帶上,這一方法的保密問題就減小到一個物理的安全問題,即只需將帶鎖
起來.

9.加限制的環境

(1)加限制的shell(rsh)
該shell幾乎與普通的shell相同,但是該shell的設計能限制一個用戶的
能力,不允許用戶有某些標準shell所允許的行為:
. 不能改變工作目錄(cd).
. 不能改變PATH或SHELL shell變數.
. 不能使用含有"/"的命令名.
. 不能重定向輸出(>和>>).
. 不能用exec執行程序.
用戶在登錄時,招待.profile文件后系統就強加上了這些限制,如果用戶
在.profile文件正被解釋時按了BREAK鍵或DELETE鍵,該用戶將被註銷.
這些簡單的限制,使用寫受限制用戶的.profile文件的系統管理員可以對
用戶能使用什麼命令,進行完全的控制.
應當注意:系統V加限制的shell實際上不是很安全,在敵對的用戶時不要
用.系統V版本2以後的版本中加限制的shell更安全些.但若允許受限制的用戶
使用某些命令(如env,cp,ln),用戶將能逃避加限制的shell,進入非限制的
shell.

(2)用chroot()限制用戶
如果的確想限制一個用戶,可用chroot()子程序為用戶建立一個完全隔離
的環境,改變了進程對根目錄的概念,因此可用於將一個用戶封在整個文件系
統的某一層目錄結構中,使用戶無法用cd命令轉出該層目錄結構,不能存取文
件系統中其餘部分的任何文件.這種限制方式比加限制的shell好得多.用戶使
用的命令應由系統管理員在新的root目錄中建立一個bin目錄,並建立用戶可
用命令的鏈到系統的/bin目錄中相應命令文件上(若在不同的文件系統則應拷
貝命令文件).
還應建立新的passwd文件,保留系統登錄戶頭(為了使ls -l正確地報告與
受限制的子文件系統中的文件相關的正確登錄名)和用戶帳戶,但系統帳戶的
口令改為NOLOGIN以使受限制的用戶不能取得系統登錄的真實口令,使"破密"
程序的任何企圖成為泡影.
utmp文件是who所需要的,該文件含有系統中已登錄用戶的列表.
新的/etc/profile文件也不是建鏈文件,以便受限制的用戶可以執行不同
的啟動命令.
/dev目錄中的終端設備文件被鏈接到新的/dev目錄下,因為命令who產生
輸出時要查看這些文件.
在系統V及以後的UNIX版本中,login命令有chroot()的功能.如果口令文
件中用戶入口項的登錄shell域(最後一個域)是*,login將調用chroot()把用
戶的根目錄設置成為口令文件中用戶入口項登錄目錄域指定的目錄.然後再調
用exec()執行login,新的login將在新子系統文件中執行該用戶的登錄.
chroot()並不是把root封鎖在一個子文件系統中,所以給受限制用戶用的
命令時應加以考慮,具有root的SUID許可的程序可能會給予用戶root的能力.
應當將這種可能減低到最小程度,交給用戶使用的命令應當取自清除了SUID陷
井的系統命令.鏈接文件可減少磁碟佔用區,但要記住,當與敵對用戶打交道時
鏈接到chroot目錄結構(尤其是命令)的系統文件是很危險的.
如果建立一個像這樣的限制環境,應確保對安裝到新的/bin的每條命令都
做過測試,有些程序可能有系統管理員未曾想到的出乎意料的執行結果.為了
使這些命令能運行,還得在加限制的子文件系統中加服務目錄或文件如:/tmp,
/etc/termcap,/usr/lib/terminfo,/dev/mem,/dev/kmem,/dev/swap,用戶所
登錄的/dev中的tty文件以及/unix.
有些程序在子文件系統中運行時不會很好,如果將假離線程序和網路命令
拷貝到加限制的子文件系統中,並放在為兩條命令專建的目錄層結構下,它們
可能也運行不了.

10.小系統安全
任何足夠小,運行於辦公室的UNIX系統就是小系統.這類小系統也包括所有
台式UNIX機器.根據安全觀點,使小系統很特別而值得特別的有以下幾點:
. 小系統的用戶比大系統的用戶少,通常是很小一組用戶,使系統管理員能
熟悉每個人,安全問題可以直接地面對面處理.
. 由於小UNIX系統管理更簡單,可能只需要一個系統管理員,因而維護系統
安全的責任只有一個人擔負.
. 如果既是用戶又是系統管理員,將不能花大量時間考慮系統安全.
. 如果自己擁有系統並且是系統管理員,就可能有權直接將違反規的用戶從
系統中刪除,而沒有幾個大系統的管理員能有這種權利.
. 如果自己是系統的唯一用戶,則將既是用戶又是管理員,維護系統安全的
任務就很簡單了,只須確保系統中所有登錄戶頭的口令是好的.
. 如果不能將系統鎖起來,就把敏感的數據存放在軟盤上,把軟盤鎖起來.
. 即使系統中有若干個用戶,但如果系統的終端之產是有線連接,並且用戶
們保持門上鎖,則系統也將是安全的,至少在本組用戶內是安全的.
. 小系統通常有可移動的介質(軟盤),可用mount命令將其安裝到系統上,提
供一種安全的方法讓用戶自己在系統上安裝軟盤,否則系統管理員要一天
到晚地干這些瑣碎的安裝盤事務.允許用戶安裝軟盤的通常做法是給用戶
一個SUID程序,該程序基本完成與系統管理員安裝用戶軟盤同樣的操作,
首先檢查軟盤上有無SUID/SGID/設備文件,若發現任何奇怪的文件,則拒
絕安裝該軟盤.
. 當小系統開電源后,系統一般在從硬碟引導以前,先試圖從軟盤引導.這就
意味著計算機將首先試圖從軟盤裝入程序,若軟盤不在驅動器中,系統將
從硬碟裝入UNIX內核.軟盤幾乎可以含有任何程序,包括在控制台啟動
root shell的UNIX系統版本.如果破壞者有一把螺絲起子和有關係統內部
的一些知識,則即便系統有被認為防止安全事故發生的特殊"微碼"口令,
也可能被誘騙去從軟盤引導.
. 即使小系統晚上不鎖,凡從不將個人的或秘密的信息存放在大系統上的人
他們不可能認識所有系統上的用戶),也不會想把這樣的信息存放在小系
統上.
. 小系統的系統管理員在使用UNIX系統方面常不如大系統管理員有經驗,而
安全地管理系統需要一定的使用系統的知識.

11.物理安全
對於運行任何操作系統的小型或大型計算機,物理安全都是一個要考慮的重
要問題,物理安全包括:鎖上放置計算機的屋子,報警系統,警衛,所有安置在不能
上鎖的地方的通訊設施,包括有線通訊線,電話線,區域網,遠程網,應答MODEM,鑰
匙或信用卡識別設備,給用戶的口令和鑰匙分配,任何前置通訊設施的加密裝置,
文件保護,備份或恢復方案(稱為安全保險方案,用作應付偶然的或蓄意的數據或
計算設備被破壞的情況),上鎖的輸出仃,上鎖的廢物箱和碎紙機.
物理安全中所飲食的總考慮應是:在安全方案上所付出的代價不應當多於值
得保護的(硬體或軟體的)價值.
下面著重討論保護用戶的各種通訊線.對於任何可在不上鎖的地方存取的系
統,通訊是特別嚴重的安全薄弱環節.當允許用戶通過掛到地方電話公司的撥號
MODEM存取系統時,系統的安全程度就將大大地削弱,有電話和MODEM的任何人就
可能非法進入該系統.應當避免這一情況,要確保MODEM的電話號碼不被列於電話
薄上,並且最好將電話號碼放在不同於本公司普通電話號碼所在的交換機上.總
之,不要假設沒人知道自己的撥入號碼!大多數家庭計算機都能編程用一個MODEM
整天地依次調用撥號碼,記錄下連接上其它MODEM的號碼.如果可能,安裝一個局
域PBX,使得對外界的撥號產生一秒鐘的撥號蜂音,並且必須輸入一個與MODEM相
關聯的擴展號碼.

12.用戶意識
UNIX系統管理員的職責之一是保證用戶安全.這其中一部分工作是由用戶的
管理部門來完成,但是作為系統管理員,有責任發現和報告系統的安全問題,因為
系統管理員負責系統的運行.
避免系統安全事故的方法是預防性的,當用戶登錄時,其shell在給出提示前
先執行/etc/profile文件,要確保該文件中的PATH指定最後搜索當前工作目錄,
這樣將減少用戶能運行特洛依木馬的機會.
將文件建立屏蔽值的設置放在該文件中也是很合適的,可將其值設置成至少
將防止用戶無意中建立任何人都能寫的文件(022/026).要小心選擇此值,如果限
制太嚴,則用戶會在自己的.profile中重新調用umask以抵制系統管理員的意願,
如果用戶大量使用小組許可權共享文件,系統管理員就一要設置限制小組存取許可權
的屏蔽值.系統管理員必須建立系統安全和用戶的"痛苦量"間的平衡(痛苦量是
安全限制引起的憤怒的函數).定期地用grep命令查看用戶.profile文件中的
umask,可了解系統安全限制是否超過了用戶痛苦極限.
系統管理員可每星期隨機抽選一個用戶,將該用戶的安全檢查結果(用戶的
登錄情況簡報,SUID/SGID文件列表等)發送給他的管理部門和他本人.主要有四
個目的:
. 大多數用戶會收到至少有一個文件檢查情況的郵件,這將引起用戶考慮安
全問題(雖然並不意味著用戶們會採取加強安全的行動).
. 有大量可寫文件的用戶,將一星期得到一次郵件,直到他們取消可寫文件
的寫許可為止.冗長的煩人的郵件信息也許足以促使這些用戶採取措施,
刪除文件的寫許可.
. 郵件將列出用戶的SUID程序,引起用戶注意自己有SUID程序,使用戶知道
是否有不是自己建立的SUID程序.
. 送安全檢查表可供用戶管理自己的文件,並使用戶知道對文件的管理關係
到數據安全.如果系統管理員打算這樣做,應事先讓用戶知道,以便他們了
解安全檢查郵件的目的.
發送郵件是讓用戶具有安全意識,不要抱怨發送郵件.

管理意識是提高安全性的另一個重要因素.如果用戶的管理部門對安全要求
不強烈,系統管理員可能也忘記強化安全規則.最好讓管理部門建立一套每個人
都必須遵守的安全標準,如果系統管理員在此基礎上再建立自己的安全規則,就
強化了安全.管理有助於加強用戶意識,讓用戶明確,信息是有價值的資產.

系統管理員應當使安全保護方法對用戶儘可能地簡單,提供一些提高安全的
工具,如:公布鎖終端的lock程序,讓用戶自己運行secure程序,將pwexp(檢查用
戶口令信息的程序)放入/etc/profile中,使用戶知道自己的口令時間.多教給用
戶一些關於系統安全的知識,確保用戶知道自己的許可許可權和umask命令的設置
值.如果注意到用戶在做蠢事,就給他們一些應當怎樣做才對的提示.用戶知道的
關於安全的知識越多,系統管理員在保護用戶利益方面做的事就越少.

13.系統管理員意識

(1)保持系統管理員個人的登錄安全
若系統管理員的登錄口令泄密了,則竊密者離竊取root只有一步之遙了,
因為系統管理員經常作為root運行,竊密者非法進入到系統管理員的戶頭后,
將用特洛依木馬替換系統管理員的某些程序,系統管理員將作為root運行這些
已被替換的程序.正是因為這個原因,在UNIX系統中,管理員的戶頭最常受到攻
擊.即使su命令通常要在任何都不可讀的文件中記錄所有想成為root的企圖,
還可用記帳數據或ps命令識別運行su命令的用戶.也是如此,系統管理員作為
root運行程序時應當特別小心,因為最微小的疏忽也可能"沉船".下列一些指
導規則可使系統管理員駕駛一艘"堅固的船":
. 不要作為root或以自己的登錄戶頭運行其他用戶的程序,首先用su命令進
入用戶的戶頭.
. 決不要把當前工作目錄排在PATH路徑表的前邊,那樣實際是招引特洛依木
馬.當系統管理員用su命令進入root時,他的PATH將會改變,就讓PATH保持
這樣,以避免特洛依木馬的侵入.
. 敲入/bin/su執行su命令.若有su源碼,將其改成必須用全路徑名運行(即
su要確認argv[0]的頭一個字元是"/"才運行).隨著時間的推移,用戶和管
理員將養成敲/bin/su的習慣.
. 不要未註銷戶頭就離開終端,特別是作為root用戶時更不能這樣.當系統
管理員作為root用戶時,命令提示符是"#",這個提示符對某些人來說可能
是個紅燈標誌.
. 不允許root在除控制台外的任何終端登錄(這是login的編譯時的選項),
如果沒有login源碼,就將登錄名root改成別的名,使破壞者不能在root登
錄名下猜測各種可能的口令,從而非法進入root的戶頭.
. 經常改變root的口令.
. 確認su命令記下的想運行su企圖的記錄/usr/adm/sulog,該記錄文件的許
可方式是600,並屬root所有.這是非法者喜歡選擇來替換成特洛依木馬的
文件.
. 不要讓某人作為root運行,即使是幾分鐘,即使是系統管理員在一旁註視
著也不行!

(2)保持系統安全
. 考慮系統中一些關鍵的薄弱環節:
a. 系統是否有MODEM?電話號碼是否公布?
b. 系統是否連接到?還有什麼系統也連接到該網路?
c. 系統管理員是否使用未知來處或來處不可靠的程序?
d. 系統管理員是否將重要信息放在系統中?
e. 系統的用戶是熟悉系統的使用還是新手?
f. 用戶是否很重視關心安全?
g. 用戶的管理部門是否重視安全?
. 保持系統文件安全的完整性.檢查所有系統文件的存取許可,任何具有
SUID許可的程序都是非法者想偷換的選擇對象.
. 要特別注意設備文件的存取許可.
. 要審查用戶目錄中具有系統ID/系統小組的SUID/SGID許可的文件.
. 在未檢查用戶的文件系統的SUID/SGID程序和設備文件之前,不要安裝用
戶的文件系統.
. 將磁碟的備份存放在安全的地方.
. 設置口令時效,如果能存取UNIX的源碼,將加密口令和信息移到僅對root可讀的文件中,並修改系統的口令處理子程序.這樣可增加口令的安全.修改passwd,使passwd能刪去口令打頭和末尾的數字,然後根據spell詞典和/etc/passwd中用戶的個人信息,檢查用戶的新口令,也檢查用戶新口令中子串等於登錄名的情況.如果新口令是spell詞典中的單詞,或/etc/passwd中的入口項的某項值,或是登錄名的子串,passwd將不允許用戶改變口令.. 記錄本系統的用戶及其授權使用的系統.
. 查出久未使用的登錄戶頭,並取消該戶頭.
. 確保沒有無口令的登錄戶頭.
. 啟動記帳系統.
. 查出不尋常的系統使用情況,如大量的佔用磁碟,大量的使用CPU時間,大量的進程,大量的使用su的企圖,大量無效的登錄,大量的到某一系統的網
絡傳輸,奇怪的uucp請求.
. 修改shell,使其等待了一定時間而無任務時終止運行.
. 修改login,使其列印出用戶登錄的最後時間,三次無效登錄后,將通訊線掛起,以便系統管理員能檢查出是否有人試圖非法進入系統.確保login不
讓root在除控制台外的任何地方登錄.
. 修改su,使得只有root能以過期口令通過su進入某一戶頭.
. 當安裝來源不可靠的軟體時,要檢查源碼和makefile文件,查看特殊的子
程序調用或命令.
. 即使是安裝來源可靠的軟體,也要檢查是否有SUID(SGID)程序,確認這些許可的確是必要的.如果可能,不要讓這些程序具有系統ID(或組)的SUID(SGID)許可,而應該建立一個新用戶(或給)供該軟體運行.. 如果系統在辦公室中,門應上鎖,將重要數據保存在軟盤上或帶上,並鎖起來.. 將secure,perms和任何其它做安全檢查的shell程序存取許可置為僅執行,更好的是將這些shell程序存於可拆卸的介質上.. 記住,只要系統有任何人都可調用的撥號線,系統就不可能真正的安全.系統管理員可以很好地防止系統受到偶然的破壞.但是那些有耐心,有計劃,知道自己在幹什麼的破壞者,對系統直接的有預謀的攻擊卻常常能成功.. 如果系統管理員認為系統已經泄密,則應當設法查出肇事者.若肇事者是本系統的用戶,與用戶的管理部門聯繫,並檢查該用戶的文件,查找任何可疑的文件,然後對該用戶的登錄小心地監督幾個星期.如果肇事者不是本系統的用戶,可讓本公司採取合法的措施,並要求所有的用戶改變口令,讓用戶知道出了安全事故,用戶們應當檢查自己的文件是否有被竄改的跡象.如果系統管理員認為系統軟體已被更改了,就應當從原版系統帶(或;軟盤)上重裝入所有系統軟體,保持系統安全比道歉更好.


--------------------------------------------------------------------
標 題: 程序員安全


UNIX系統為程序員提供了許多子程序,這些子程序可存取各種安全屬性.有
些是信息子程序,返迴文件屬性,實際的和有效的UID,GID等信息.有些子程序可
改變文件屬性.UID,GID等有些處理口令文件和小組文件,還有些完成加密和解密.
本文主要討論有關係統子程序,標準C庫子程序的安全,如何寫安全的C程序
並從root的角度介紹程序設計(僅能被root調用的子程序).

1.系統子程序

(1)I/O子程序
*creat():建立一個新文件或重寫一個暫存文件.
需要兩個參數:文件名和存取許可值(8進位方式).如:
creat("/usr/pat/read_write",0666) /* 建立存取許可方式為0666的文件 */
調用此子程序的進程必須要有建立的文件的所在目錄的寫和執行許可,置
給creat()的許可方式變數將被umask()設置的文件建立屏蔽值所修改,新
文件的所有者和小組由有效的UID和GID決定.
返回值為新建文件的文件描述符.
*fstat():見後面的stat().
*open():在C程序內部打開文件.
需要兩個參數:文件路徑名和打開方式(I,O,I&O).
如果調用此子程序的進程沒有對於要打開的文件的正確存取許可(包括文件路徑上所有目錄分量的搜索許可),將會引起執行失敗.
如果此子程序被調用去打開不存在的文件,除非設置了O_CREAT標誌,調用將不成功.此時,新文件的存取許可作為第三個參數(可被用戶的umask修
改).
當文件被進程打開后再改變該文件或該文件所在目錄的存取許可,不影響對該文件的I/O操作.
*read():從已由open()打開並用作輸入的文件中讀信息.
它並不關心該文件的存取許可.一旦文件作為輸入打開,即可從該文件中讀取信息.
*write():輸出信息到已由open()打開並用作輸出的文件中.同read()一樣它也不關心該文件的存取許可.

(2)進程式控制制
*exec()族:包括execl(),execv(),execle(),execve(),execlp()和execvp()
可將一可執行模快拷貝到調用進程佔有的存貯空間.正被調用進程執行的程序將不復存在,新程序取代其位置.
這是UNIX系統中一個程序被執行的唯一方式:用將執行的程序復蓋原有的程序.
安全注意事項:
. 實際的和有效的UID和GID傳遞給由exec()調入的不具有SUID和SGID許可的程序.
. 如果由exec()調入的程序有SUID和SGID許可,則有效的UID和GID將設置給該程序的所有者或小組.
. 文件建立屏蔽值將傳遞給新程序.
. 除設了對exec()關閉標誌的文件外,所有打開的文件都傳遞給新程序.
用fcntl()子程序可設置對exec()的關閉標誌.
*fork():用來建立新進程.其建立的子進程是與調用fork()的進程(父進程)
完全相同的拷貝(除了進程號外)
安全注意事項:
. 子進程將繼承父進程的實際和有效的UID和GID.
. 子進程繼承文件方式建立屏蔽值.
. 所有打開的文件傳給子進程.
*signal():允許進程處理可能發生的意外事件和中斷.
需要兩個參數:信號編號和信號發生時要調用的子程序.
信號編號定義在signal.h中.
信號發生時要調用的子程序可由用戶編寫,也可用系統給的值,如:SIG_IGN
則信號將被忽略,SIG_DFL則信號將按系統的預設方式處理.
如許多與安全有關的程序禁止終端發中斷信息(BREAK和DELETE),以免自己
被用戶終端終止運行.
有些信號使UNIX系統的產生進程的核心轉儲(進程接收到信號時所佔內存
的內容,有時含有重要信息),此系統子程序可用于禁止核心轉儲.

(3)文件屬性
*access():檢測指定文件的存取能力是否符合指定的存取類型.
需要兩個參數:文件名和要檢測的存取類型(整數).
存取類型定義如下:
0: 檢查文件是否存在
1: 檢查是否可執行(搜索)
2: 檢查是否可寫
3: 檢查是否可寫和執行
4: 檢查是否可讀
5: 檢查是否可讀和執行
6: 檢查是否可讀可寫可執行
這些數字的意義和chmod命令中規定許可方式的數字意義相同.
此子程序使用實際的UID和GID檢測文件的存取能力(一般有效的UID和GID
用於檢查文件存取能力).
返回值: 0:許可 -1:不許可.
*chmod():將指定文件或目錄的存取許可方式改成新的許可方式.
需要兩個參數:文件名和新的存取許可方式.
*chown():同時改變指定文件的所有者和小組的UID和GID.(與chown命令不
同).
由於此子程序同時改變文件的所有者和小組,故必須取消所操作文件的SUID
和SGID許可,以防止用戶建立SUID和SGID程序,然後運行chown()去獲得別
人的許可權.
*stat():返迴文件的狀態(屬性).
需要兩個參數:文件路徑名和一個結構指針,指向狀態信息的存放
的位置.
結構定義如下:
st_mode: 文件類型和存取許可方式
st_ino: I節點號
st_dev: 文件所在設備的ID
st_rdev: 特別文件的ID
st_nlink: 文件鏈接數
st_uid: 文件所有者的UID
st_gid: 文件小組的GID
st_size: 按位元組計數的文件大小
st_atime: 最後存取時間(讀)
st_mtime: 最後修改時間(寫)和最後狀態的改變
st_ctime: 最後的狀態修改時間
返回值: 0:成功 1:失敗
*umask():將調用進程及其子進程的文件建立屏蔽值設置為指定的存取許可.
需要一個參數: 新的文件建立屏值.

(4)UID和GID的處理
*getuid():返回進程的實際UID.
*getgid():返回進程的實際GID.
以上兩個子程序可用於確定是誰在運行進程.
*geteuid():返回進程的有效UID.
*getegid():返回進程的有效GID.
以上兩個子程序可在一個程序不得不確定它是否在運行某用戶而不是運行它的用戶的SUID程序時很有用,可調用它們來檢查確認本程序的確是以該用戶的SUID許可在運行.
*setuid():用於改變有效的UID.
對於一般用戶,此子程序僅對要在有效和實際的UID之間變換的SUID程序才有用(從原有效UID變換為實際UID),以保護進程不受到安全危害.實際上該進程不再是SUID方式運行.
*setgid():用於改變有效的GID.

2.標準C庫

(1)標準I/O
*fopen():打開一個文件供讀或寫,安全方面的考慮同open()一樣.
*fread(),getc(),fgetc(),gets(),scanf()和fscanf():從已由fopen()打
開供讀的文件中讀取信息.它們並不關心文件的存取許可.這一點
同read().
*fwrite(),put(),fputc(),puts,fputs(),printf(),fprintf():寫信息到
已由fopen()打開供寫的文件中.它們也不關心文件的存取許可.
同write().
*getpass():從終端上讀至多8個字元長的口令,不回顯用戶輸入的字元.
需要一個參數: 提示信息.
該子程序將提示信息顯示在終端上,禁止字元回顯功能,從/dev/tty讀取口
令,然後再恢復字元回顯功能,返回剛敲入的口令的指針.
*popen():將在(5)運行shell中介紹.

(2)/etc/passwd處理
有一組子程序可對/etc/passwd文件進行方便的存取,可對文件讀取到入口
項或寫新的入口項或更新等等.
*getpwuid():從/etc/passwd文件中獲取指定的UID的入口項.
*getpwnam():對於指定的登錄名,在/etc/passwd文件檢索入口項.
以上兩個子程序返回一指向passwd結構的指針,該結構定義在
/usr/include/pwd.h中,定義如下:
struct passwd {
char * pw_name; /* 登錄名 */
char * pw_passwd; /* 加密后的口令 */
uid_t pw_uid; /* UID */
gid_t pw_gid; /* GID */
char * pw_age; /* 代理信息 */
char * pw_comment; /* 註釋 */
char * pw_gecos;
char * pw_dir; /* 主目錄 */
char * pw_shell; /* 使用的shell */
};
*getpwent(),setpwent(),endpwent():對口令文件作後續處理.
首次調用getpwent(),打開/etc/passwd並返回指向文件中第一個入口項的
指針,保持調用之間文件的打開狀態.
再調用getpwent()可順序地返回口令文件中的各入口項.
調用setpwent()把口令文件的指針重新置為文件的開始處.
使用完口令文件后調用endpwent()關閉口令文件.
*putpwent():修改或增加/etc/passwd文件中的入口項.
此子程序將入口項寫到一個指定的文件中,一般是一個臨時文件,直接寫口
令文件是很危險的.最好在執行前做文件封鎖,使兩個程序不能同時寫一個
文件.演演算法如下:
. 建立一個獨立的臨時文件,即/etc/passnnn,nnn是PID號.
. 建立新產生的臨時文件和標準臨時文件/etc/ptmp的鏈,若建鏈失敗,
則為有人正在使用/etc/ptmp,等待直到/etc/ptmp可用為止或退出.
. 將/etc/passwd拷貝到/etc/ptmp,可對此文件做任何修改.
. 將/etc/passwd移到備份文件/etc/opasswd.
. 建立/etc/ptmp和/etc/passwd的鏈.
. 斷開/etc/passnnn與/etc/ptmp的鏈.
注意:臨時文件應建立在/etc目錄,才能保證文件處於同一文件系統中,建鏈才能成功,且臨時文件不會不安全.此外,若新文件已存在,即便建鏈的是root用戶,也將失敗,從而保證了一旦臨時文件成功地建鏈后沒有人能再插進來干擾.當然,使用臨時文件的程序應確保清除所有臨時文件,正確地捕捉信號.

(3)/etc/group的處理
有一組類似於前面的子程序處理/etc/group的信息,使用時必須用include語句將/usr/include/grp.h文件加入到自己的程序中.該文件定義了group結構,將由getgrnam(),getgrgid(),getgrent()返回group結構指針.
*getgrnam():在/etc/group文件中搜索指定的小組名,然後返回指向小組入
口項的指針.
*getgrgid():類似於前一子程序,不同的是搜索指定的GID.
*getgrent():返回group文件中的下一個入口項.
*setgrent():將group文件的文件指針恢復到文件的起點.
*endgrent():用於完成工作后,關閉group文件.
*getuid():返回調用進程的實際UID.
*getpruid():以getuid()返回的實際UID為參數,確定與實際UID相應的登錄名,或指定一UID為參數.
*getlogin():返回在終端上登錄的用戶的指針.
系統依次檢查STDIN,STDOUT,STDERR是否與終端相聯,與終端相聯的標準輸入用於確定終端名,終端名用於查找列於/etc/utmp文件中的用戶,該文件
由login維護,由who程序用來確認用戶.
*cuserid():首先調用getlogin(),若getlogin()返回NULL指針,再調用
getpwuid(getuid()).
*以下為命令:
*logname:列出登錄進終端的用戶名.
*who am i:顯示出運行這條命令的用戶的登錄名.
*id:顯示實際的UID和GID(若有效的UID和GID和實際的不同時也顯示有效的UID和GID)和相應的登錄名.

(4)加密子程序
1977年1月,NBS宣布一個用於美國聯邦政府ADP系統的網路的標準加密法:數
據加密標準即DES用於非機密應用方面.DES一次處理64BITS的塊,56位的加
密鍵.
*setkey(),encrypt():提供用戶對DES的存取.
此兩子程序都取64BITS長的字元數組,數組中的每個元素代表一個位,為0
或1.setkey()設置將按DES處理的加密鍵,忽略每第8位構成一個56位的加
密鍵.encrypt()然後加密或解密給定的64BITS長的一塊,加密或解密取決
於該子程序的第二個變元,0:加密 1:解密.
*crypt():是UNIX系統中的口令加密程序,也被/usr/lib/makekey命令調用.
crypt()子程序與crypt命令無關,它與/usr/lib/makekey一樣取8個字元長
的關鍵詞,2個salt字元.關鍵詞送給setkey(),salt字元用於混合encrypt()
中的DES演演算法,最終調用encrypt()重複25次加密一個相同的字元串.
返回加密后的字元串指針.

(5)運行shell
*system():運行/bin/sh執行其參數指定的命令,當指定命令完成時返回.
*popen():類似於system(),不同的是命令運行時,其標準輸入或輸出聯到由
popen()返回的文件指針.
二者都調用fork(),exec(),popen()還調用pipe(),完成各自的工作,因而
fork()和exec()的安全方面的考慮開始起作用.

3.寫安全的C程序
一般有兩方面的安全問題,在寫程序時必須考慮:
(1)確保自己建立的任何臨時文件不含有機密數據,如果有機密數據,設置
臨時文件僅對自己可讀/寫.確保建立臨時文件的目錄僅對自己可寫.
(2)確保自己要運行的任何命令(通過system(),popen(),execlp(),
execvp()運行的命令)的確是自己要運行的命令,而不是其它什麼命
令,尤其是自己的程序為SUID或SGID許可時要小心.
第一方面比較簡單,在程序開始前調用umask(077).若要使文件對其他人可
讀,可再調chmod(),也可用下述語名建立一個"不可見"的臨時文件.
creat("/tmp/xxx",0);
file=open("/tmp/xxx",O_RDWR);
unlink("/tmp/xxx");
文件/tmp/xxx建立后,打開,然後斷開鏈,但是分配給該文件的存儲器並未刪
除,直到最終指向該文件的文件通道被關閉時才被刪除.打開該文件的進程
和它的任何子進程都可存取這個臨時文件,而其它進程不能存取該文件,因
為它在/tmp中的目錄項已被unlink()刪除.
第二方面比較複雜而微妙,由於system(),popen(),execlp(),execvp()執行
時,若不給出執行命令的全路徑,就能"騙"用戶的程序去執行不同的命令.因
為系統子程序是根據PATH變數確定哪種順序搜索哪些目錄,以尋找指定的命
令,這稱為SUID陷井.最安全的辦法是在調用system()前將有效UID改變成實
際UID,另一種比較好的方法是以全路徑名命令作為參數.execl(),execv(),
execle(),execve()都要求全路徑名作為參數.有關SUID陷井的另一方式是
在程序中設置PATH,由於system()和popen()都啟動shell,故可使用shell句
法.如:
system("PATH=/bin:/usr/bin cd");
這樣允許用戶運行系統命令而不必知道要執行的命令在哪個目錄中,但這種
方法不能用於execlp(),execvp()中,因為它們不能啟動shell執行調用序列
傳遞的命令字元串.
關於shell解釋傳遞給system()和popen()的命令行的方式,有兩個其它的問
題:
*shell使用IFS shell變數中的字元,將命令行分解成單詞(通常這個
shell變數中是空格,tab,換行),如IFS中是/,字元串/bin/ed被解釋成單詞
bin,接下來是單詞ed,從而引起命令行的曲解.

再強調一次:在通過自己的程序運行另一個程序前,應將有效UID改為實際的
UID,等另一個程序退出后,再將有效UID改回原來的有效UID.

SUID/SGID程序指導準則
(1)不要寫SUID/SGID程序,大多數時候無此必要.
(2)設置SGID許可,不要設置SUID許可.應獨自建立一個新的小組.
(3)不要用exec()執行任何程序.記住exec()也被system()和popen()調用.
. 若要調用exec()(或system(),popen()),應事先用setgid(getgid())
將有效GID置加實際GID.
. 若不能用setgid(),則調用system()或popen()時,應設置IFS:
popen("IFS=\t\n;export IFS;/bin/ls","r");
. 使用要執行的命令的全路徑名.
. 若不能使用全路徑名,則應在命令前先設置PATH:
popen("IFS=\t\n;export IFS;PATH=/bin:/usr/bin;/bin/ls","r");
. 不要將用戶規定的參數傳給system()或popen();若無法避免則應檢查
變元字元串中是否有特殊的shell字元.
. 若用戶有個大程序,調用exec()執行許多其它程序,這種情況下不要將
大程序設置為SGID許可.可以寫一個(或多個)更小,更簡單的SGID程序
執行必須具有SGID許可的任務,然後由大程序執行這些小SGID程序.
(4)若用戶必須使用SUID而不是SGID,以相同的順序記住(2),(3)項內容,並
相應調整.不要設置root的SUID許可.選一個其它戶頭.
(5)若用戶想給予其他人執行自己的shell程序的許可,但又不想讓他們能
讀該程序,可將程序設置為僅執行許可,並只能通過自己的shell程序來
運行.
編譯,安裝SUID/SGID程序時應按下面的方法
(1)確保所有的SUID(SGID)程序是對於小組和其他用戶都是不可寫的,存取
許可權的限制低於4755(2755)將帶來麻煩.只能更嚴格.4111(2111)將使
其他人無法尋找程序中的安全漏洞.
(2)警惕外來的編碼和make/install方法
. 某些make/install方法不加選擇地建立SUID/SGID程序.
. 檢查違背上述指導原則的SUID/SGID許可的編碼.
. 檢查makefile文件中可能建立SUID/SGID文件的命令.

4.root程序的設計
有若干個子程序可以從有效UID為0的進程中調用.許多前面提到的子程序,
當從root進程中調用時,將完成和原來不同的處理.主要是忽略了許可許可權的檢
查.
由root用戶運行的程序當然是root進程(SUID除外),因有效UID用於確定文
件的存取許可權,所以從具有root的程序中,調用fork()產生的進程,也是root進程.

(1)setuid():從root進程調用setuid()時,其處理有所不同,setuid()將把有
效的和實際的UID都置為指定的值.這個值可以是任何整型數.而對非root
進程則僅能以實際UID或本進程原來有效的UID為變數值調用setuid().
(2)setgid():在系統進程中調用setgid()時,與setuid()類似,將實際和有效
的GID都改變成其參數指定的值.
* 調用以上兩個子程序時,應當注意下面幾點:
. 調用一次setuid()(setgid())將同時設置有效和實際UID(GID),獨立分
別設置有效或實際UID(GID)固然很好,但無法做到這點.
. setuid()(setgid())可將有效和實際UID(GID)設置成任何整型數,其數
值不必一定與/etc/passwd(/etc/group)中用戶(小組)相關聯.
. 一旦程序以一個用戶的UID了setuid(),該程序就不再做為root運行,也
不可能再獲root特權.
(3)chown():當root進程運行chown()時,chown()將不刪除文件的SUID和/或
SGID許可,但當非root進程運行chown()時,chown()將取消文件的SUID和/
或SGID許可.
(4)chroot():改變進程對根目錄的概念,調用chroot()后,進程就不能把當前
工作目錄改變到新的根目錄以上的任一目錄,所有以/開始的路徑搜索,都
從新的根目錄開始.
(5)mknod():用於建立一個文件,類似於creat(),差別是mknod()不返回所打開文件的文件描述符,並且能建立任何類型的文件(普通文件,特殊文件,目錄文件).若從非root進程調用mknod()將執行失敗,只有建立FIFO特別文件(有名管道文件)時例外,其它任何情況下,必須從root進程調用mknod().由於creat()僅能建立普通文件,mknod()是建立目錄文件的唯一途徑,因而僅有root能建立目錄,這就是為什麼mkdir命令具有SUID許可並屬root所有.一般不從程序中調用mknod().通常用/etc/mknod命令建立特別設備文件而這些文件一般不能在使用著時建立和刪除,mkdir命令用於建立目錄.當用mknod()建立特別文件時,應當注意確從所建的特別文件不允許存取內存,磁碟,終端和其它設備.


(6)unlink():用於刪除文件.參數是要刪除文件的路徑名指針.當指定了目錄時,必須從root進程調用unlink(),這是必須從root進程調用unlink()的唯一情況,這就是為什麼rmdir命令具有root的SGID許可的原因.(7)mount(),umount():由root進程調用,分別用於安裝和拆卸文件系統.這兩個子程序也被mount和umount命令調用,其參數基本和命令的參數相同.調用mount(),需要給出一個特別文件和一個目錄的指針,特別文件上的文件系統就將安裝在該目錄下,調用時還要給出一個標識選項,指定被安裝的文件系統要被讀/寫(0)還是僅讀(1).umount()的參數是要一個要拆卸的特別文件的指針.

--------------------------------------------------------------------
標 題: 網路安全



本文主要討論網路和數據通訊安全,分為六個部分.第一部分概述最大,最老的UNIX網路UUCP系統;第二部分討論UUCP的安全;第三部分討論新HONEY DANBERUUCP及安全特點;第四部分討論其它的UNIX網路,其中包括RJE和NSC;第五部分討論通訊的物理安全;最後一部分討論Sun Microsystem公司的Sun OS系統的網路安全.

1.UUCP系統概述
UUCP系統是一組程序,完成文件傳輸,執行系統之間的命令,維護系統使用情況的統計,保護安全.UUCP是UNIX系統最廣泛使用的網路實用系統,這其中在兩個原因:第一,UUCP是各種UNIX版本都可用的唯一的標準網路系統,第二,UUCP是最便宜的網路系統.只需要一根電纜連接兩個系統,然後就可建立UUCP.如果需要在相距數百或數千公里遠的兩個系統間傳輸數據,中需要兩個具有撥號功能的調製解調器.

(1)UUCP命令
UUCP命令之一是uucp,該命令用於兩系統間的文件傳輸,uucp命令格式類
似於cp命令的格式,只是uucp允許用戶有系統間拷貝文件,命令的一般格式如
下:
uucp source_file destination_file
source_file通常是本系統的文件(但不必一定是),destination_file通
常是另一系統的文件或目錄.指定destination_file的格式為:
system!filename或system!directory.
uucp給系統管理員提供了一個選項,可以限制傳入和傳出本系統的uucp文件只能傳到/usr/spool/uucppublic目錄結構中.若告訴uucp將傳輸的文件存放在其他目錄中,系統將會送回一個郵件:remote access to path / filedenied. uucp允許以簡化符號~代替/usr/spool/uucppublic/.如:
uucp names remote!~/john/names
有時也可用uucp將文件從另一個系統拷貝到本系統,只要將要傳入本系統
的文件指定為源文件(用system!file)即可,如:
uucp remotes!/usr/john/file1 file1
如果在遠地機限制了文件傳輸的目錄,上條命令不能拷貝到文件.拷貝文件到本系統的最安全的方法是:在兩個系統上都通過uucppublic目錄進行文件傳輸:
uucp remotes!~/john/file1 ~/pat/file1

(2)uux命令
uux命令可用於在另一個系統上執行命令,這一特點稱為"遠程命令仞行".uux最通常的用處是在系統之間發送郵件(mail在其內部執行uux).典型的uux
請求如下:
pr listing| uux - "remote1!lp -d pr1"
這條命令將文件listing格式編排后,再連接到系統remote1的印表機pr1
上列印出來.uux的選項"-"使uux將本命令的標準輸入設備建立為遠程命令的
標準輸入設備.當若干個系統中只有一個系統連接了印表機時,常用uux列印文
件.
當然必須嚴格地限制遠程命令招待,以保護系統安全.如:本系統不應允許其它系統上的用戶運行下面的命令:uux "yoursys!uucp yoursys!/etc/passwd (outside!~/passwd)"這條命令將使本系統傳送/etc/passwd文件到系統outside上,一般地,只有幾條命令允許地執行.rmail是加限制的mail程序,常常為允許通過uux執行的命令之一.也允許rnews(加限制的netnews偽離線命令)在運行netnews的系統上執行,還允許lp在提供了列印設備的系統上運行.

(3)uucico程序
uucp和uux命令實際上並不調用另一個系統及傳送文件和執行命令,而是將用戶的請求排入隊列,並啟動uucico程序.uucico完成實際的通訊工作.它調用其它的系統,登錄,傳送數據(可以是文件或請求遠程命令執行).如果電話線忙,或其它系統已關機,傳輸請求仍針保留在隊列中,uucico後續的職能操作(通常是cron完成)將發送這些傳輸請求.uucico完成數據的發送和接收.在本系統的/etc/passwd文件中,有其它系統的uucico登錄進入本系統的入口項,該入口項中指定的預設shell是uucico.
因此,其它系統調用本系統時,直接與uucico對話.

(4)uuxqt程序
當另一系統的uucico調用本系統請求遠程命令執行時,本系統的uucico將該請求排入隊列,並在退出之前,啟動uuxqt程序執行遠程命令請求.下面舉例說明數據是如何傳輸的.假設本系統的一個用戶發送郵件給另一遠程系統remote1的某人,mail會執行uux,在remote1系統上遠程地運行remail程序,要傳送的郵件為remail命令的輸入.uux將傳輸請求排入隊列,然後啟動uucico招待實際的遠程調用和數據傳輸.如果remote1響應請求,uucico登錄到remote1,然後傳送兩個文件:郵件和將在remote1上由uuxqt執行的uux命令文件.uux命令文件中含有運行remail請求.如果remote1在被調時已關機,uucico則將無法登和傳送文件,但是cron會周期地(1小時)啟動uucico.uucico查找是否有還未傳送出的數據,若發現uux指定的傳輸目標系統是remote1,就嘗試再調用remote1,直到調通remote1為止,或者過了一定天數仍未調通remote1,未送出的郵件將作為"不可投遞"的郵件退回給發送該郵件的用戶.

2.UUCP的安全問題
UUCP系統未設置限制,允許任何本系統外的用戶執行任何命令和拷貝進/出uucp用戶可讀/寫的任何文件.在具體的uucp應用環境中應了解這點,根據需要設置保護.在UUCP中,有兩個程序處理安全問題.第一個是uucico程序,該程序在其它系統調用本系統時啟動.這個程序是本系統uucp安全的關鍵,完成本系統文件傳輸的傳進和傳出.第二個程序是uuxqt,該程序為所有的遠程命令執行服務.

(1)USERFILE文件
uucico用文件/usr/lib/uucp/USERFILE確定遠程系統發送或接收什麼文
件,其格式為:
login,sys[c] path_name [path_name...]
其中login是本系統的登錄名,sys是遠程系統名,c是可選的call_back標志,path_name是目錄名.
uucico作為登錄shell啟動時,將得到遠程系統名和所在系統的登錄名,並在USERFILE文件中找到匹配login和sys的行.如果該行含有call_back標誌c,uucico將不傳送文件,連接斷開,調用遠程系統(即,任何系統可以告訴本系統它的名是xyz,於是本系統掛起,調用實際的xyz執行文件傳輸),若無c,uucico將執行遠程系統請求的文件傳送,被傳送的文件名被假定為以path_name開頭的.
用戶需要了解以下幾點:
. 如果遠程系統使用的登錄名未列於USERFILE的登錄域中,uucico將拒絕允許其它系統做任何事,並掛起.. 如果系統名未列於sys域中,uucico將使用USERFILE中有匹配的登錄名和空系統名的第一行,如:nuucp,/usr/spool/uucppublic應用到作為nuucp登錄的所有系統.cbuucp,c將迫使作為cbuucp登錄的所有系統自己執行文件傳輸的請求.若調用系統名不匹配sys系統中的任何一個,並且無空入口項,uucico也將拒絕做任何事.. 若兩個機器都設置了call_back標誌,傳送文件的請求決不會被執行,兩
個系統一直互相調用,直到兩個系統中的一個取消call_back時,才能進
行文件傳送.
. 如果一個用戶的登錄名列於USERFILE文件的login域中,則當調用本系統的uucico為該用戶傳送文件時,uucico只傳送至path_name指定的目錄中的文件.空登錄名用於所有未明確列於USERFILE文件中的用戶進行登錄.所以
pat,/usr/pat
只允許pat傳送/usr/pat目錄結構中的文件.
,/usr/spool/uucppublic /tmp
其他用戶僅允許傳送目錄/usr/spool/uucppublic和/tmp中的文件.不要允許uucico將文件拷進/出到除了/usr/spool/uucppublic目錄以外的其它任何目錄,否則可能會有人用下面的命令拷貝走本系統的重要信息:
uucp yoursys!/etc/passwd to-creep

(2)L.cmds文件
uuxqt利用/usr/lib/uucp/L.cmds文件確定要執行的遠程執行請求命令.該文件的格式是每行一條命令.如果只需uuxqt處理電子郵件,該文件中就只須一行命令:
rmail

系統管理員可允許登錄用戶執行netnews(rnews)的命令或遠程列印命令(lp),但決不能允許用戶執行拷貝文件到標準輸出的命令,如cat命令或網路命令uucp,否則這些人只需在他們自己的系統上敲入:

uux "yoursys!uucp yoursys!/etc/passwd (outside!~/passwd)"<





[火星人 via ] 系統管理員安全已經有618次圍觀

http://www.coctec.com/docs/security/show-post-73089.html