跳到內容

UNIX 計算安全/UNIX 檔案系統

來自華夏公益教科書,開放的世界,開放的書籍

建議主題:卷管理程式,檔案系統,檔案,目錄,ls,find,chown,chgrp,chmod,umask,setuid,setgid,裝置檔案,ACL。


計算機使用的大多數資料都儲存在磁碟驅動器上。與物理記憶體相比,它們是具有相對較高的訪問延遲的物理裝置,但具有更大的儲存容量。在伺服器系統上,磁碟驅動器可以位於與CPU相同的機櫃內,相鄰的擴充套件機櫃,作為裝置連線到網路,或作為儲存區域網路的一部分連線。一些站點也可能使用可移動磁碟介質,這些介質可以由操作員或機器人裝置載入。

檔案系統和檔案

[編輯 | 編輯原始碼]

檔案系統是用於在裝置(如磁碟驅動器)上佈置資料的方法。它包含作業系統可以用來查詢特定資料內容以及誰被允許訪問該資料的資訊。所有這些資料都組織成一系列檔案,它們是管理計算機系統資訊的基本手段。檔案中的資料以應用程式可以理解的格式組織。檔案在目錄樹上的位置稱為其路徑。

在 UNIX 中,與許多其他現代作業系統一樣,檔案儲存在樹狀結構中,分支節點稱為目錄。目錄是一種特殊型別的檔案,它可以引用零個或多個其他檔案和目錄,從而允許組織資料並管理訪問。目錄樹包含在一個或多個檔案系統中。

在 UNIX 中,檔案系統包含以下資訊,可用於每個檔案

  • 唯一的 inode 號碼
  • 檔案的長度(以位元組為單位)
  • 包含檔案的裝置的識別符號
  • 檔案型別
  • 一組許可權位或模式
  • 檔案所有者的識別符號或uid
  • 檔案組的識別符號或gid
  • 檔案建立日期和時間
  • 檔案上次訪問日期和時間
  • 檔案上次修改日期和時間
  • 到 inode 的硬連結總數

典型的 UNIX 檔案型別如下

  • 塊檔案
  • 原始檔案
  • 普通檔案
  • 目錄
  • 命名管道
  • 符號連結
  • 套接字

硬連結是一種引用同一裝置和檔案系統上的另一個檔案的檔案,它透過其 inode 號碼來引用。符號連結是一種包含指向另一個檔案的路徑資訊的檔案。

檔案許可權

[編輯 | 編輯原始碼]

有關檔案統計資訊的資訊可以透過使用ls命令結合-l“長列表”選項來檢視。以下是一個示例

$ ls -l /usr/bin/vi
-r-xr-xr-t  6  bin  bin  604880  Sep  3 2003 /usr/bin/vi

ls輸出的最左側欄位顯示檔案的模式。這是一個通常為 2 位元組(16 位)的整數字段。模式中的每個位都是一個二進位制標誌,代表一種安全訪問設定型別。

模式右邊的數字顯示到檔案的硬連結總數,包括原始檔案。因此,在本例中,該命令還有五個其他硬連結。接下來是檔案所有者和組的名稱,然後是檔案大小(以位元組為單位)、上次修改的日期或時間以及檔名或路徑。

ls模式資訊顯示為一個十個字元的欄位。第一個(最左側)字元顯示檔案型別。常見型別如下

- — 普通檔案
b — 塊特殊檔案
c — 字元特殊檔案
d — 目錄
D — 門(Solaris)
l — 符號連結
n — 網路特殊檔案(HP-UX)
p — 命名管道
s — 套接字

剩下的九個字元由三組三個字元組成。每組描述一組檔案許可權,這些許可權決定是否可以讀取、寫入和作為程式執行檔案。(它們還可以覆蓋某些特殊執行模式。稍後將對此進行詳細介紹。)

這些許可權分別由rwx表示。因此,組集中的rwx表示檔案組中的任何成員都可以讀取、修改或作為程式(或指令碼)執行該檔案。上面的r-x缺少寫入標誌,因此組成員可能無法修改該檔案。

從左到右,前三組字元表示檔案所有者的許可權設定。中間三組是檔案組的許可權設定,最右側的三組是所有其他人的許可權(通常稱為“世界”。)

執行時設定 ID

[編輯 | 編輯原始碼]

模式還可以包含在執行檔案時設定檔案許可權的特殊標誌。也就是說,如果檔案是程式或指令碼,則設定許可權位將確定它將在其下執行的所有者或組。通常,當執行作業時,它會使用執行檔案的帳戶的使用者和組。這控制著作業獲得的訪問型別。

例如,假設命令myjob具有許可權r-xr-x---,並且由檔案所有者、research組中的使用者bill執行。執行myjob命令的程序被賦予所有者bill和組research。該作業可以訪問任何也可以從帳戶bill訪問的檔案。

現在假設myjob檔案被賦予所有者root,並且系統管理員激活了使用者的設定許可權位。生成的許可權位為r-sr-x---,其中s表示已設定執行時設定使用者 ID 標誌。由於該檔案仍然屬於research組,因此使用者bill可以執行它。但是,現在執行作業時,它可以訪問任何可以由root訪問的檔案(通常是系統上的任何檔案)。

當執行時設定組 ID 標誌被設定時,也會發生類似的效果。生成的許可權位現在可能顯示為r-xr-s---。當執行此檔案時,作業執行時就像使用者屬於與檔案組識別符號相同的組一樣。也就是說,如果組識別符號被設定為sys,當執行該檔案時,它將可以訪問任何可以由sys組訪問的檔案。

在此需要特別指出的是,設定 ID 功能可能會損害系統的安全性。由root擁有且具有設定使用者 ID 標誌的檔案與系統管理員具有相同的訪問許可權。如果此檔案還可以被任何使用者修改,那麼它可以被利用來提升該使用者的許可權或執行其他未經授權的活動。即使檔案不能被使用者修改,它可能仍然包含可以利用來獲得未經授權許可權的漏洞。

因此,系統管理員應仔細監控具有設定使用者 ID 或設定組 ID 許可權的檔案的存在。選定的系統命令需要這些模式設定才能正常執行。但是,任何其他具有這些設定的檔案,尤其是當它們可以被使用者修改時,可能會對系統構成不可接受的風險水平。可以定期執行批處理作業來搜尋這些檔案的存在並將它們提請系統管理員注意。

注意:在 Linux 上,當執行 shell 指令碼時,系統會故意忽略所有 setuid 和 setgid 許可權。

目錄許可權

[編輯 | 編輯原始碼]

目錄的許可權與其對檔案的作用略有不同。目錄上的read 許可權允許ls命令在沒有引數的情況下列出該目錄的內容。但是,讀取模式只允許讀取檔名,而不是檔案許可權、所有者或大小。您也不能使用cd命令更改到您只有讀取許可權的目錄,也不能讀取該目錄中檔案的內容。

如果目錄允許您x或執行許可權,您就可以cd到該目錄,並讀取該目錄中您具有讀取許可權的任何檔案的內容。您還可以使用ls -l命令對目錄執行“長列表”。如果目錄允許您執行但沒有讀取許可權,那麼如果您嘗試使用ls列出該目錄,就會收到錯誤。但是,如果您知道該目錄中存在特定檔案,並且該檔案允許您讀取許可權,那麼您可以對該檔案執行“長列表”。

作為一個簡單的例子

$ id
uid=234(myacct) gid=100(mygrp)
$ mkdir test
$ touch test/test.txt
$ chmod 100 test
$ chmod 640 test/test.txt
$ cd test
$ ls
. unreadable
total 0
$ ls -l test.txt
-rw-r-----   1 myacct mygrp     0 Dec 9 12:00 test.txt

有關這些命令的更多資訊,請參見相應的聯機幫助頁。

  • 設定使用者 ID 或設定組 ID 許可權
  • 粘滯位。

正在建設中...

設定檔案許可權

[編輯 | 編輯原始碼]

可以使用chownchgrpchmod命令設定檔案的許可權。chown命令需要一個有效的帳戶名或數字識別符號,用於設定檔案或一組檔案的所有者。類似地,chgrp命令可以用來設定檔案的組。 (在某些作業系統上,chown命令可以用來設定檔案的擁有者和組。最後,chmod命令可以用來設定檔案模式。

以下是一個將檔案所有者設定為root,並將組設定為sys的組合chown命令的示例:

$ chown root:sys /usr/local/bin/bigjob
許可權
執行 (x) 1
寫入 (w) 2
讀取 (r) 4

chmod命令的原始格式允許為檔案或一組檔案設定整個模式。這可以透過傳遞給命令一個三位或四位數來完成,該數字定義了模式設定。數字中的最後三位中的每一個代表一組許可權標誌,如上所述。1表示啟用執行模式,2表示設定寫入模式,4表示設定讀取模式。可以透過將適當的值加起來來設定這些模式的任何組合。

例如:

$ chmod 550 /usr/local/bin/bigjob

使用者許可權為5,組許可權為5,世界許可權為0。5等於1加4,所以它為使用者和組都啟用了讀(4)和執行(1)標誌。世界對此檔案沒有許可權。

最近,chmod命令得到增強,允許使用逗號分隔的符號操作列表。這允許以更精確的方式修改檔案的模式。符號操作確定其影響的物件、操作型別以及受影響的許可權。例如:

$ chmod u+x,g-w,o=r /usr/local/bin/bigjob

這裡ugo分別代表使用者、組和其他(世界)許可權。+-=分別透過新增、刪除或設定由r(紅色)、w(寫入)或x(執行)模式位指定的位來修改許可權。此示例為使用者提供了執行許可權,刪除了檔案組的寫入許可權,並將其他(世界)許可權限制為僅讀取操作。

chownchgrpchmod命令通常有一個遞迴選項,它作用於目錄及其下的所有檔案。此選項通常使用-R啟用,但請參閱特定作業系統的聯機幫助頁。與chmod命令的符號操作結合使用時,這可以為管理目錄許可權提供一個強大的工具。例如:

$ chmod -R o-w /usr/bin

將遞迴地刪除/usr/bin目錄或該目錄樹下的任何檔案或目錄上的任何世界許可權位。

搜尋檔案許可權

[edit | edit source]

find命令是一個強大的工具,可以用來搜尋檔案系統中具有特定許可權設定、特定檔案所有者和組的檔案或目錄。在下面的示例中(它是為 HP-UX 編寫的),find命令用於搜尋/usr/bin目錄樹中允許世界寫入許可權的任何檔案。

$ /usr/bin/find /usr/bin -type f -perm -002 -exec ls -l {} \;

傳遞給find命令的引數形成一個表示式,該表示式確定命令在目錄樹/usr/bin中搜索什麼。引數-type f將搜尋範圍限制為檔案,而不是目錄、符號連結、裝置檔案等等。-perm -002設定要查詢的許可權型別;數字前面的減號表示僅匹配數字中設定的值。在本例中,第三位中的2匹配世界寫入位。最後,奇怪的-exec ls -al {} \;會導致ls -l命令在滿足先前條件的任何檔案上執行。(結尾的奇怪\;子句是命令的終止符。)find的一些變體具有-ls選項,它可以替換-exec ls -al {} \;

下面的示例顯示了對/home目錄樹的搜尋,以查詢所有者不在密碼資料庫中的任何檔案。

$ /usr/bin/find /home -nouser -exec ls -l {} \;

如果任何帳戶已從密碼資料庫中刪除,可以使用這樣的命令來搜尋孤立檔案。

請注意,無論何時系統管理員執行對檔案系統的長時間搜尋,使用nice命令以較低的優先順序執行find命令可能會讓使用者感到方便。否則,該作業可能會影響磁碟訪問效能。此外,還需要注意避免搜尋網路掛載的目錄樹,因為這會大大減慢搜尋時間;這可以透過使用-xdev選項來實現,該選項將find限制為僅搜尋當前檔案系統。

umask

[edit | edit source]

每個 UNIX 會話都有一個檔案模式建立掩碼,它定義了建立新檔案時許可權位的初始值。該掩碼包含一系列位標誌,這些標誌決定特定許可權設定是開啟還是關閉。此值類似於傳遞給chmod命令的數字,只是值在負意義上使用。也就是說,當掩碼中設定了某個值時,建立檔案時相應的許可權位將被關閉。

umask命令可以用來顯示當前會話的掩碼。

$ umask
027
$ touch testfile.txt
$ ls -al testfile.txt
-rw-r-----  1  bilbo  users    0    Jan 18 07:41 testfile.txt

在這個示例中,第一個零影響檔案的所有者許可權。零表示所有許可權位都將被設定,因此檔案所有者可以對該檔案具有讀、寫和執行許可權。(請注意,在上面的示例中,系統建立的檔案將關閉執行許可權,而不管umask的設定如何。)中間的數字2影響檔案組的許可權。'2'將關閉寫入許可權位,因此組成員只能讀取或執行檔案。最後,最後一個數字中的七將關閉世界的所有許可權。

要更改會話的掩碼,可以執行umask命令,並將新的掩碼作為引數傳遞。

$ umask 077
$ umask
077
$ touch testfile2.txt
$ ls -al testfile2.txt
-rw-------  1  bilbo  users    0    Jan 18 07:47 testfile.txt

建議將umask設定為077,以獲得最佳安全性。然後,使用者需要手動修改檔案或目錄的許可權,才能讓其他人訪問它們。相反,將umask設定為000會導致最弱的安全性設定,因為系統上的任何人都可以訪問該檔案,除非使用者記得限制許可權。為了應用基本umask設定,系統管理員可以在 shell 啟動檔案(如/etc/profile)中包含一個umask命令。

華夏公益教科書