你的檔案安全嗎
UNIX檔案系統存取控制及安全
By 吳賢明 1997.12
‧前言 | |
‧UNIX檔案存取控制 | |
‧檔案權限修改 | |
‧File Times --Which One is Trustworthy ?? | |
‧關係到檔案安全的面具 - umask | |
‧兩個與檔案安全相關的小工具 |
‧結語 |
本校自八十五學度起,所有工作站級以上的機器,全部改採UNIX作業系統。UNIX是一個供多人同時使用的分時系統,為使多人可以共享系統資源、儲存空間、系統各項又能確保每一個存放於系統中個人資料的私密性,檔案系統提供了管制措施,讓每一個可以自行決定個人檔案資料開放的程度,也管制了誰可以何種方式對某一個檔案進行存取。我們可以說檔案系統管制是系統安全之初步。
本文將以使用者角度,說明UNIX檔案系統存取管制及保護方式,同時介紹一些可供使用觀察本身檔案狀態的工具指令,最後並提供一些如何保護使用者檔案的實際做法供使用者參考。希望透過本文,讓本校使用者,在對於檔案保護有進一層了解之後,可以更放心的使用。
UNIX檔案存取控制(UNIX File System Access Control)
UNIX系統中對於每一個檔案,均維護一些檔案屬性相關訊息,透過這些訊息,可方便使用者對於檔案之管理與維護,這些訊息包括至少包括以下之項目:
檔案模式
- : 一般檔案
d:目錄
b:特殊檔案(區塊)
c:特殊檔案(字元)
l:符號連結檔
使用者區分:檔案擁有者、群組、其他
權限區分:讀( r )、寫( w )、執行( x )
UNIX共用九個字元來描述三種使用者之三種權利。
指向此一檔案之檔案名稱(inode)之個數,此鏈結個數不包含符號鏈結。
檔案擁有者
擁有此一檔案之使用者名稱。
此一檔案所屬之群組。
單位為byte。
此檔案最後一次被修改日期。
檔案名稱
Example:(檔案訊息)
ls -l /etc/rc
- | rw- | rw- | r-- | 1 | root | sys | 3488 | jan 20 17:00 | /etc/rc |
這是一個檔案 |
擁 有 者 權 限 |
群 組 權 限 |
其 他 人 權 限 |
鏈 結 個 數 |
擁 有 者 |
群 組 |
檔 案 大 小 |
修最 改後 日一 期次 |
檔 名 |
ls -ld /etc
d | Rwx | rwx | r-x | 41 | root | sys | 640 | jan 23 17:30 | /etc |
這是一個目錄 |
擁 有 者 權 限 |
群 組 權 限 |
其 他 人 權 限 |
鏈 結 個 數 |
擁 有 者 |
群 組 |
檔 案 大 小 |
修 改 日 期 |
檔 名 |
UNIX檔案系統將使用者分成檔案擁有者、群組及其他三大類;存取權力則分成讀取( r )、寫入( w )及執行( x )三種;藉著使用者區分與存取權力之給予之組合,組成UNIX的檔案保護系統。
每一個檔均有一個擁有者(owner),僅有owner及super user可以更改檔案之存取保護模式(with command chmod, 說明容下文敘述),而一般則只有super user可以更改檔案之擁有者(with command “chown” )。
讀取(r):可讀取檔案內容,複製檔案內容。
寫入(w):可更改檔案內容、名稱(搬移檔案),刪除檔案。
執行(x):可執行檔案。(If it’s a executable file,包括shell program)
讀取( r ):可瀏覽目錄內容(ls directory)。
寫入( w ):可在目錄中建立或刪除檔案。
執行( x ):可搜尋此目錄,並可更改工作目錄(cd)至此目錄。” cat /var/spool/mqueue/syslog”這個指令的執行,就必須對/var/spool/mqueue這個目錄具有執行之權力。
Example:
~User woody~
cc301:~> ls -ld test
drwxr--r-- 2 woody users 32768 Feb 4 14:50 test/
## right “Read” is granted, but not “Execute” ##
cc301:~> ls -l test
total 224
-rwxrwxrwx 1 woody users 96466 Feb 4 14:41 hhh*
-rwxrwxrwx 1 woody users 96466 Jan 27 15:57 kdiffs-1.2.3-quota+acct*
-rwxrwxrwx 1 woody users 164 Feb 4 14:49 kerm*
## All rights granted for all files under test ##
cc301:~>
~User woody1~
cc301:~woody> whoami
woody1
cc301:~woody> cd test
test: Permission denied. ## Cannont cd to test##
cc301:~woody> cat test/kerm
rm: test/kerm: Permission denied
## Cannot read kerm, even though read is granted for file kerm ##
cc301:~woody>
~User woody~
cc301:~> chmod 755 test ##Grant execute for test to everyone##
cc301:~> ls -ld test
drwxr-xr-x 2 woody users 32768 Feb 4 14:50 test/
~User woody1~
cc301:~woody> whoami
woody1
cc301:~woody> cd test ## Ok Now!!! ##
cc301:~woody/test> pwd
/home/woody/test
cc301:~woody/test>
cc301:~woody/test> cd ..
cc301:~woody> cat test/kerm ## OK Now !!! ##
set line /dev/modem
set speed 38400
set modem hayes
….
set window 5
set prompt Linux Kermit>
cc301:~woody>
**注意,因/home/woody/test檔案對goup及other之寫入權力依舊未打開,即使/home/woody/test/kerm允許寫入,一般User依然只能修改kerm內容,而無法rm kerm。You can try on that !!
‧只有檔案擁有者及SuperUser可以更改檔案權限。(只有SuperUser可以更改檔案擁
有者)‧檔案權限修改指令 -- chmod,其語法如下:
chmod {a, u, g, o}{+,-}{r,w,x} filename(相對表示法)
or
chmod x1x2x3 filename(絕對表示法)
其中
a:所有User
u:檔案擁有者
g:群組
o:其他User
+:增加權力
-:減少權力
r:讀取
w:寫入
x1x2x3:x1、x2、x3均為“三個二進位數字所組成之十進位數字表示“(範圍0~7),x1表owner權限,x2表群組user權限,x3則表其他User之權限。例如755 (=111 101 101)表示檔案存取權限為: rwx r-x r-x。
‧Example:
cc301:~/test> ls -l kerm
-rwxr-xr-x 1 woody users 164 Feb 4 14:49 kerm*
cc301:~/test> chmod g+w,o-x kerm (= chmod 774 kerm)
cc301:~/test> ls -l kerm
-rwxrwxr-- 1 woody users 164 Feb 4 14:49 kerm*
cc301:~/test>
File Times --Which One is Trustworthy ??
即使依照自己意思,以上述方式設定了檔案存取模式,如果你是一個對安全問題態度審慎的人,或許你還需要一些不定時的自我診斷,已確定真的沒有人動過(read or modify)我的檔案。如果你的設定正確,檔案安全問題仍在的話,只有兩種可能;一是帳號被盜用,一是系統以root身分檢查過你的檔案。這兩種狀況都可以透過自我診斷,提早確定事情真相,減輕損失。
‧File Time
系統檔案相關資訊中,除了上節所提modify time之外,尚有access time;另外inode change time也是一個證明檔案安全指標。了解自己檔案變動及存取狀況,通常是自我診斷最重要的課題。
Modify time (mtime):這是檔案內容最後一次被更改過的時間,當你更改檔案內容的時候,這個時間會跟著變動;如果你從未更改過檔案,這個時間就是你建立此檔案的時間。
Access time(atime):這是檔案最後一次被存取的時間,所謂存取包括read、write、及execution。一個檔案只要曾被讀取、更改或執行,這個時間都會跟著更改。
Inode Change time(ctime):inode是UNIX檔案系統中,記錄檔案各項資訊(包括owner、access mode、modify time、access time等等)之所在,每一個檔案都會擁有一個inode;任何檔案資訊的變動(owner change、last writting、protection mode change等)都會改變這個時間。
How To Access File Time:以上所提三種File Time均可透過UNIX指令列出,所用到的指令只有一個指令”ls”。ls –l 所列出的是file modify time,ls –lu 所列出的是file access time,而ls –lc所列出則是indoe modify time。下面是個簡單例子:
woody@audi: ~ 11 >ls -l .cshrc
-rw-r--r-- 1 woody center 1992 Oct 21 16:21 .cshrc
woody@audi: ~ 12 >ls -lu .login
-rw------- 1 woody center 59 Nov 10 13:05 .login
woody@audi: ~ 13 >ls -lc .login
-rw------- 1 woody center 59 Oct 17 17:29 .login
這個例子說明.login這個檔案最後一次更改內容時間為 Oct 21
16:21,最後一次被讀取內容時間為Nov 10 13:05,而屬性被更
改時間為Oct 17 17:29。
‧我所知道的訊息正確嗎? - ls –l 、ls –lu 、or ls –lc
雖然mtime (modify time)、atime(access time)及ctime(inode change time) 提供我們研判檔案被存取的資料,但在UNIX中,前兩者是可以輕易的以一般指令捏造的,唯有ctime一般使用者(即使是file owner)無法竄改。系統入侵者或帳號盜用者,總希望不露痕跡,因此只要他盜用了你的帳號,他可以在讀過你的檔案或更改過你的檔案後,輕易的把mtime及atime復原。請看以下例子:
woody@audi: ~ 54 >ls -l .cshrc
-rw-r--r-- 1 woody center 1992 Oct 21 16:21 .cshrc
woody@audi: ~ 55 >ls -lu .cshrc
-rw-r--r-- 1 woody center 1992 Nov 10 13:05 .cshrc
woody@audi: ~ 56 >ls -lc .cshrc
-rw-r--r-- 1 woody center 1992 Oct 21 16:21 .cshrc
woody@audi: ~ 57 >touch -m 11011231 .cshrc
woody@audi: ~ 58 >touch -a 11032120 .cshrc
woody@audi: ~ 59 >ls -l .cshrc
-rw-r--r-- 1 woody center 1992 Nov 1 12:31 .cshrc
woody@audi: ~ 60 >ls -lu .cshrc
-rw-r--r-- 1 woody center 1992 Nov 3 21:20 .cshrc
woody@audi: ~ 61 >ls -lc .cshrc
-rw-r--r-- 1 woody center 1992 Nov 10 13:36 .cshrc
這個例子顯示,只要我取得某一個使用者的權限(如盜用帳號),我便可以輕易將 mtime及atime更改至任何時間,唯有ctime可以忠實的反應檔案訊系息何時被更改。上例中ctime所記錄的時間正式touch這個指令執行的時間,也就是.cshrc 這個檔案mtime及atime被篡改的時間。
為了檔案安全,使用者應養成隔些時間,便檢查檔案的ctime。如果你有一段時間沒更改過某一個檔案,而ctime顯示的時間卻不如此,則你的檔案肯定被動過手腳了。
關係到檔案安全的面具 - umask
umask (or “unix file-creation mode mask”)是一個三位數的八進位號碼,這三個八進位數字會被用來決定新產生檔案的存取保護模式設定方式,基本上,UNIX中每一個程序(process)均擁有本身的umask值。
umask 的值,代表的是你不希望新檔案開放的權利;新檔案產生時,系統預設開放的存取保護模式(一般為666),減去umask的值,就是此一新檔案的存取保護模式。例如當你umask值設定為022時,你每一個新產生的檔案會是644 (rw-r--r--)。
‧了解你的umask
除非你刻意更改,否則你的umask就是採系統預設值(寫在系統profile中)。”umask”這個指令會告訴你目前的umask值。
woody@audi: ~ 3 >umask
22
絕大部份之UNIX作業系統出廠值umask設定均設為022,其用意在於響應資料共享與UNIX 開放運算環境之原意,可是這似乎違反了安全原則。除非你真的連個人信件這類的私人資料均願意與人分享(Why ?),否則這umask值會將你所產生的新檔之讀取權力完全開放,這個時候如果你的home directory read及execution權力均全部打開的話,那你真是所謂的”世界大同”了,不可不慎 !!
‧設定你的umask值
umask 這個指令也可以讓你改變你的umask值。
woody@audi: ~ 2 >umask 22
woody@audi: ~ 3 >umask
22
woody@audi: ~ 4 >umask 077
woody@audi: ~ 5 >umask
77
woody@audi: ~ 6 >
如果你想讓這個umask值永久有效,把他放入$HOME/.cshrc (for csh、tcsh)或$HOME/.profile(for ksh、sh)中即可。User自己設定的umask會覆寫(overwrite)系統的設定值。
‧怎樣的umask值安全
當然,最安全的umask值為077,如果你擔心如此會影響你開放資料共享的本意,還是建議你針對不同檔案作權限設定,畢竟沒了安全,哪來資料開放。
‧diff
這個指令可以讓你比較兩個檔案的內容,如果你有習慣隨時保存自己目錄下所有檔案訊息,利用diff便可以馬上可能找出有問的檔案,而作進一部追查。
‧sum
這是sun Solaris系統中,可以幫你算出檔案所佔block數,及檔案內容之checksum值的一個小工具。有人習慣以檔案長度來判斷一個檔是否曾遭更動,殊不知檔案長度常可以藉著padding方式使它和原有檔案一致。雖然說一個檔案的checksum值可以刻意復原,但畢竟難度上較高。你可以用”sum * > sumlist”這個指令記錄目前所在目錄所有檔案之checksum值,並將結果存放於檔案sumlist中,供你日後查核之參考。
駭客橫行,系統的並安全不完全是管理者的責任;如果管理者幫你看緊了大門,而你卻自己將窗戶打開,那也是莫可奈何。
UNIX流行,UNIX好用,但UNIX也危險。身處一個多人多工的作業環境,使用者不得不對安全問題有所了解。檔案安全並非系統安全之全部,卻是關鍵的一環。
本文介紹了UNIX作業系統有關檔案存取控制的方式,也介紹了一些防治檔案被竊與診斷檔案是否依然完好如初的方法,當然這也不是檔案安全的全部。使用者唯有在意並關心自身之檔案安全,才能真正確保本身的私密,也才不致給予惡意或純粹好玩心態的入侵者可乘之機。