文件類型
Linux下的文件可以分為5種不同的類型:普通文件、目錄文件、鏈接文件、設(shè)備文件和管道文件。
1.普通文件
這是一類常見的文件,也是常使用的一類文件,其特點是不包含有文件系統(tǒng)的結(jié)構(gòu)信息。通常所接觸到的文件,包括圖形文件、數(shù)據(jù)文件、文檔文件、聲音文件等都屬于這種文件。這種類型的文件按其內(nèi)部結(jié)構(gòu)又可細分為文本文件和二進制文件。
2.目錄文件
目錄文件是用于存放文件名及其相關(guān)信息的文件,是內(nèi)核組織文件系統(tǒng)的基本節(jié)點。目錄文件可以包含下一級目錄文件或普通。對于習慣于使用 Windows的用戶來說,這可能有些難于理解,目錄怎么會是文件呢?的確,在Linux中,目錄文件是一種文件。但Linux的目錄文件和其它操作系統(tǒng) 中的“目錄”的概念不同,它是Linux文件中的一種。當然,在實際使用中可以不仔細區(qū)分這兩種說法。實際上,在很多Linux的書籍和資料中就是將目錄 文件簡稱為目錄的。不過,我們必需清楚此“目錄”非彼“目錄”。
3.鏈接文件
鏈接文件是一種特殊的文件,實際上是指向一個真實存在的文件的鏈接。這有點類似于Windows下的快捷方式。根據(jù)鏈接文件的不同,它又可以細分為硬鏈接文件和符號鏈接文件。
4.設(shè)備文件
設(shè)備文件是Linux中最特殊的文件。正是由于它的存在,使得Linux系統(tǒng)可以十分方便地訪問外部設(shè)備。Linux系統(tǒng)為外部設(shè)備提供一種 標準接口,將外部設(shè)備視為一種特殊的文件。用戶可以像訪問普通文件一樣訪問外部設(shè)備,使Linux系統(tǒng)可以很方便地適應(yīng)不斷發(fā)展的外部設(shè)備。通常 Linux系統(tǒng)將設(shè)備文件放在/dev目錄下,設(shè)備文件使用設(shè)備的主設(shè)備號和次設(shè)備號來指定某外部設(shè)備。根據(jù)訪問數(shù)據(jù)方式的不同,設(shè)備文件又可以細分為塊 設(shè)備和字符設(shè)備文件。
5.管道文件
管道文件是一種很特殊的文件,主要用于不同進程間的信息傳遞。當兩個進程間需要進行數(shù)據(jù)或信息傳遞時,可以通過管道文件。一個進程將需傳遞的數(shù)據(jù)或信息寫入管道的一端,另一進程則從管道的另一端取得所需的數(shù)據(jù)或信息。通常管道是建立在調(diào)整緩存中。
文件的權(quán)限
Linux系統(tǒng)是一個典型的多用戶系統(tǒng),不同的用戶處于不同的地位。為了保護系統(tǒng)的安全性,Linux系統(tǒng)對不同用戶訪問同一文件的權(quán)限做了不同的規(guī)定。
對于一個Linux系統(tǒng)中的文件來說,它的權(quán)限可以分為三種:讀的權(quán)限、寫的權(quán)限和執(zhí)行的權(quán)限,分別用r、w和x表示。不同的用戶具有不同的讀、寫和執(zhí)行的權(quán)限。
對于一個文件來說,它都有一個特定的所有者,也就是對文件具有所有權(quán)的用戶。同時,由于在Linux系統(tǒng)中,用戶是按組分類的,一個用戶屬于 一個或多個組。文件所有者以外的用戶又可以分為文件所有者的同組用戶和其它用戶。因此,Linux系統(tǒng)按文件所有者、文件所有者同組用戶和其它用戶三類規(guī) 定不同的文件訪問權(quán)限。
權(quán)限的概念
Linux文件系統(tǒng)安全模型是通過給系統(tǒng)中的文件賦予兩個屬性來起作用的,這兩個賦予每個文件的屬性稱為所有者(ownership)和訪問權(quán)限(access rights)。Linux下的每一個文件必須嚴格地屬于一個用戶和一個組。
??? 每個文件的目錄條目都是以下面類似的一些符號開始:
??? -rw-r--r--
這些符號用來描述文件的訪問權(quán)限類別,也就是常說的文件權(quán)限。這些訪問權(quán)限指導(dǎo)Linux根據(jù)文件的用戶和組所有權(quán)來處理所有訪問文件的用戶請求。總共有10種權(quán)限屬性,因此一個權(quán)限列表總是10個字符的長度。它的格式遵循下列規(guī)則:
◆ 第1個字符表示一種特殊的文件類型。其中字符可為d(表示該文件是一個目錄)、b(表示該文件是一個系統(tǒng)設(shè)備,使用塊輸入/輸出與外界交互,通常為一個磁 盤)、c(表示該文件是一個系統(tǒng)設(shè)備,使用連續(xù)的字符輸入/輸出與外界交互,如串口和聲音設(shè)備),“.”表示該文件是一個普通文件,沒有特殊屬性。
◆ 2~4個字符用來確定文件的用戶(user)權(quán)限,5~7個字符用來確定文件的組(group)權(quán)限,8~10個字符用來確定文件的其它用戶(other user,既不是文件所有者,也不是組成員的用戶)的權(quán)限。其中,2、5、8個字符是用來控制文件的讀權(quán)限的,該位字符為r表示允許用戶、組成員或其它人 可從該文件中讀取數(shù)據(jù)。短線“-”則表示不允許該成員讀取數(shù)據(jù)。與此類似,3、6、9位的字符控制文件的寫權(quán)限,該位若為w表示允許寫,若為“-”表示不 允許寫。4、7、10位的字符用來控制文件的制造權(quán)限,該位若為x表示允許執(zhí)行,若為“-”表示不允許執(zhí)行。
任何列在/etc/passwd文件中的用戶都可以是一個文件的所有者,也稱為該文件的用戶。同樣任何列在/etc/group文件中的組都可以是文件組的所有者,也簡稱為文件的組。
下面來看兩個例子,以便加深理解。首先來看一看:
drwxrwxr-- 2 root root 4096 2月 11 10:36 guo
因為guo的第1個位置的字符是d,所以由此知道guo是一個目錄。第2至4位置上的屬性是rwx,表示用戶root擁有權(quán)限列表顯示guo 中所有的文件、創(chuàng)建新文件或者刪除guo中現(xiàn)有的文件,或者將guo作為當前工作目錄。第5至7個位置上的權(quán)限是rwx,表示root組的成員擁有和 root一樣的權(quán)限。第8至10位上的權(quán)限僅是r--,表示不是root的用戶及不屬于root組的成員只有對guo目錄列表的權(quán)限。這些用戶不能創(chuàng)建或 者刪除guo中的文件、執(zhí)行junk中的可執(zhí)行文件,或者將junk作為他們的當前工作目錄。
下面再來看一看:
-rwxr-xr-- 1 user admin 20480 11月 11 09:23 Readme.txt
在該項中,第1個位置是短線“-”,表示該文件是一個普通文件,沒有特殊屬性。該文件對任何人都可讀,只對user可寫,user和admin的組成員可以執(zhí)行該文件。
另外需要注意的是,當用戶訪問一個文件時,權(quán)限檢查是從左到右的。假設(shè)上述的readme.txt文件具有以下權(quán)限:
-r--rw-r--
那么即使user是屬于admin組的一個成員,也不能對該文件進行寫操作,因為已經(jīng)被左邊的寫權(quán)限設(shè)置拒絕了。
修改文件或者目錄權(quán)限
文件或者目錄的用戶能夠使用chmod命令修改文件的權(quán)限。Chmod命令有兩種方式:一種是字符方式,使用字符來修改文件的權(quán)限;另外一種是數(shù)字方式,使用3個數(shù)字的組合來修改文件的權(quán)限。
字符方式的基本語法是:chmod [ugoa] +或者-或者= [rwx] [文件...]
在上述命令中,使用“+”或者“-”是在保存原來權(quán)限設(shè)置的基礎(chǔ)上修改權(quán)限。當使用“=”時,權(quán)限被明確地賦予要修改的文件。其中字符u表示文件或者目錄的所有者,g表示文件或者目錄所屬組,o除所有者和所屬組以外的用戶,a表示全部用戶。
數(shù)字方式的基本語法是:chmod nnn 文件
其中第1、2、3個n分別表示用戶、組成員和所有其它用戶。各個位置上的n要么是一個0,或者是一個由賦予權(quán)限的相關(guān)值相加得到的單個阿拉伯數(shù)字之和。這些數(shù)字的意義如表1所示。
表1 數(shù)字的含義
值 表示的意義
4 表示文件或者目錄的讀權(quán)限
2 表示文件或者目錄的寫權(quán)限
1 表示文件或者目錄的執(zhí)行權(quán)限
很顯然,當使用數(shù)字方式時,這3個數(shù)字必須為0至7中的一個。
一般而言,作為系統(tǒng)管理員,更喜歡使用數(shù)字方式,因為這種方式的速度明顯快得多。
很顯然,系統(tǒng)中各種文件的權(quán)限設(shè)置對特定用戶的數(shù)據(jù)安全有很大影響。但是要求用戶逐一明確設(shè)置系統(tǒng)中每個文件的權(quán)限也是不現(xiàn)實的,為此,需要 使用umask命令,該命令可以為用戶賬號中新文件的創(chuàng)建進行缺省設(shè)置。具體來說,umask是用來設(shè)置權(quán)限掩碼的,權(quán)限掩碼由3個數(shù)字組成,將現(xiàn)有的存 取權(quán)限減掉權(quán)限掩碼后,即可產(chǎn)生建立文件時默認的權(quán)限。例如,root的權(quán)限為777,若權(quán)限掩碼設(shè)為022,那么兩都相減后可得755。下面是在我的系 統(tǒng)更改umask的一些情況:
[root@linuxserver root]# umask
022
上述命令顯示表示我的系統(tǒng)的umask值為022。
[root@linuxserver root]# umask -S
u=rwx,g=rx,o=rx
當umask值為022時,默認情況下各用戶的權(quán)限。注意這里的參數(shù)“S”是大寫。
[root@linuxserver root]# umask 177
[root@linuxserver root]# umask -S
u=rw,g=,o=
上述兩行命令把umask值改為177,結(jié)果只有文件所有者具有讀寫文件的權(quán)限,其它用戶不能訪問該文件。這顯然是一種非常安全的狀態(tài)。
其它問題
事實上,一個系統(tǒng)中的文件安全是一個綜合問題,對于一些特殊的情況要做特殊的考慮。比如,對于設(shè)備文件的安全性、SUID/SGID的設(shè)置等。
一般來說,各Linux發(fā)行版在安裝時就已經(jīng)把設(shè)備文件的設(shè)置做得非常不錯。但是對于磁盤設(shè)備而言,我認為惟一安全的還是只允許root用戶進行讀寫。否則,其它用戶的賬號一旦被攻破,黑客通過訪問磁盤很快就可以讓系統(tǒng)崩潰。要做到這一點,可以使用以下命令:
#cd /dev
#chmod 600 sd* hd *
Suid和Sgid是Linux系統(tǒng)中最復(fù)雜的屬性,它跟一個系統(tǒng)的安全息息相關(guān)。我們可以利用chmod命令來清除或者設(shè)置一個文件的Suid/Sgid屬性,具體方法如下所示。
將/usr/sbin/pppd程序設(shè)置為Suid/Sgid狀態(tài),使用的命令是:
#chmod ug+s /usr/sbin/pppd
要清除Sgid狀態(tài)而保留Suid狀態(tài),可用以下命令:
#chmod g-s /usr/sbin/pppd
此外,如何裝載文件系統(tǒng),特別是將root文件系統(tǒng)裝載為只讀,以防止非授權(quán)的修改也比較重要。
總之,Linux下文件系統(tǒng)的安全問題是一個非常復(fù)雜的問題。通過本文的學習,讀者對此應(yīng)該有了一個較全面的了解,并且可以處理日常工作中常見的有關(guān)文件系統(tǒng)安全問題。
Linux下的文件可以分為5種不同的類型:普通文件、目錄文件、鏈接文件、設(shè)備文件和管道文件。
1.普通文件
這是一類常見的文件,也是常使用的一類文件,其特點是不包含有文件系統(tǒng)的結(jié)構(gòu)信息。通常所接觸到的文件,包括圖形文件、數(shù)據(jù)文件、文檔文件、聲音文件等都屬于這種文件。這種類型的文件按其內(nèi)部結(jié)構(gòu)又可細分為文本文件和二進制文件。
2.目錄文件
目錄文件是用于存放文件名及其相關(guān)信息的文件,是內(nèi)核組織文件系統(tǒng)的基本節(jié)點。目錄文件可以包含下一級目錄文件或普通。對于習慣于使用 Windows的用戶來說,這可能有些難于理解,目錄怎么會是文件呢?的確,在Linux中,目錄文件是一種文件。但Linux的目錄文件和其它操作系統(tǒng) 中的“目錄”的概念不同,它是Linux文件中的一種。當然,在實際使用中可以不仔細區(qū)分這兩種說法。實際上,在很多Linux的書籍和資料中就是將目錄 文件簡稱為目錄的。不過,我們必需清楚此“目錄”非彼“目錄”。
3.鏈接文件
鏈接文件是一種特殊的文件,實際上是指向一個真實存在的文件的鏈接。這有點類似于Windows下的快捷方式。根據(jù)鏈接文件的不同,它又可以細分為硬鏈接文件和符號鏈接文件。
4.設(shè)備文件
設(shè)備文件是Linux中最特殊的文件。正是由于它的存在,使得Linux系統(tǒng)可以十分方便地訪問外部設(shè)備。Linux系統(tǒng)為外部設(shè)備提供一種 標準接口,將外部設(shè)備視為一種特殊的文件。用戶可以像訪問普通文件一樣訪問外部設(shè)備,使Linux系統(tǒng)可以很方便地適應(yīng)不斷發(fā)展的外部設(shè)備。通常 Linux系統(tǒng)將設(shè)備文件放在/dev目錄下,設(shè)備文件使用設(shè)備的主設(shè)備號和次設(shè)備號來指定某外部設(shè)備。根據(jù)訪問數(shù)據(jù)方式的不同,設(shè)備文件又可以細分為塊 設(shè)備和字符設(shè)備文件。
5.管道文件
管道文件是一種很特殊的文件,主要用于不同進程間的信息傳遞。當兩個進程間需要進行數(shù)據(jù)或信息傳遞時,可以通過管道文件。一個進程將需傳遞的數(shù)據(jù)或信息寫入管道的一端,另一進程則從管道的另一端取得所需的數(shù)據(jù)或信息。通常管道是建立在調(diào)整緩存中。
文件的權(quán)限
Linux系統(tǒng)是一個典型的多用戶系統(tǒng),不同的用戶處于不同的地位。為了保護系統(tǒng)的安全性,Linux系統(tǒng)對不同用戶訪問同一文件的權(quán)限做了不同的規(guī)定。
對于一個Linux系統(tǒng)中的文件來說,它的權(quán)限可以分為三種:讀的權(quán)限、寫的權(quán)限和執(zhí)行的權(quán)限,分別用r、w和x表示。不同的用戶具有不同的讀、寫和執(zhí)行的權(quán)限。
對于一個文件來說,它都有一個特定的所有者,也就是對文件具有所有權(quán)的用戶。同時,由于在Linux系統(tǒng)中,用戶是按組分類的,一個用戶屬于 一個或多個組。文件所有者以外的用戶又可以分為文件所有者的同組用戶和其它用戶。因此,Linux系統(tǒng)按文件所有者、文件所有者同組用戶和其它用戶三類規(guī) 定不同的文件訪問權(quán)限。
權(quán)限的概念
Linux文件系統(tǒng)安全模型是通過給系統(tǒng)中的文件賦予兩個屬性來起作用的,這兩個賦予每個文件的屬性稱為所有者(ownership)和訪問權(quán)限(access rights)。Linux下的每一個文件必須嚴格地屬于一個用戶和一個組。
??? 每個文件的目錄條目都是以下面類似的一些符號開始:
??? -rw-r--r--
這些符號用來描述文件的訪問權(quán)限類別,也就是常說的文件權(quán)限。這些訪問權(quán)限指導(dǎo)Linux根據(jù)文件的用戶和組所有權(quán)來處理所有訪問文件的用戶請求。總共有10種權(quán)限屬性,因此一個權(quán)限列表總是10個字符的長度。它的格式遵循下列規(guī)則:
◆ 第1個字符表示一種特殊的文件類型。其中字符可為d(表示該文件是一個目錄)、b(表示該文件是一個系統(tǒng)設(shè)備,使用塊輸入/輸出與外界交互,通常為一個磁 盤)、c(表示該文件是一個系統(tǒng)設(shè)備,使用連續(xù)的字符輸入/輸出與外界交互,如串口和聲音設(shè)備),“.”表示該文件是一個普通文件,沒有特殊屬性。
◆ 2~4個字符用來確定文件的用戶(user)權(quán)限,5~7個字符用來確定文件的組(group)權(quán)限,8~10個字符用來確定文件的其它用戶(other user,既不是文件所有者,也不是組成員的用戶)的權(quán)限。其中,2、5、8個字符是用來控制文件的讀權(quán)限的,該位字符為r表示允許用戶、組成員或其它人 可從該文件中讀取數(shù)據(jù)。短線“-”則表示不允許該成員讀取數(shù)據(jù)。與此類似,3、6、9位的字符控制文件的寫權(quán)限,該位若為w表示允許寫,若為“-”表示不 允許寫。4、7、10位的字符用來控制文件的制造權(quán)限,該位若為x表示允許執(zhí)行,若為“-”表示不允許執(zhí)行。
任何列在/etc/passwd文件中的用戶都可以是一個文件的所有者,也稱為該文件的用戶。同樣任何列在/etc/group文件中的組都可以是文件組的所有者,也簡稱為文件的組。
下面來看兩個例子,以便加深理解。首先來看一看:
drwxrwxr-- 2 root root 4096 2月 11 10:36 guo
因為guo的第1個位置的字符是d,所以由此知道guo是一個目錄。第2至4位置上的屬性是rwx,表示用戶root擁有權(quán)限列表顯示guo 中所有的文件、創(chuàng)建新文件或者刪除guo中現(xiàn)有的文件,或者將guo作為當前工作目錄。第5至7個位置上的權(quán)限是rwx,表示root組的成員擁有和 root一樣的權(quán)限。第8至10位上的權(quán)限僅是r--,表示不是root的用戶及不屬于root組的成員只有對guo目錄列表的權(quán)限。這些用戶不能創(chuàng)建或 者刪除guo中的文件、執(zhí)行junk中的可執(zhí)行文件,或者將junk作為他們的當前工作目錄。
下面再來看一看:
-rwxr-xr-- 1 user admin 20480 11月 11 09:23 Readme.txt
在該項中,第1個位置是短線“-”,表示該文件是一個普通文件,沒有特殊屬性。該文件對任何人都可讀,只對user可寫,user和admin的組成員可以執(zhí)行該文件。
另外需要注意的是,當用戶訪問一個文件時,權(quán)限檢查是從左到右的。假設(shè)上述的readme.txt文件具有以下權(quán)限:
-r--rw-r--
那么即使user是屬于admin組的一個成員,也不能對該文件進行寫操作,因為已經(jīng)被左邊的寫權(quán)限設(shè)置拒絕了。
修改文件或者目錄權(quán)限
文件或者目錄的用戶能夠使用chmod命令修改文件的權(quán)限。Chmod命令有兩種方式:一種是字符方式,使用字符來修改文件的權(quán)限;另外一種是數(shù)字方式,使用3個數(shù)字的組合來修改文件的權(quán)限。
字符方式的基本語法是:chmod [ugoa] +或者-或者= [rwx] [文件...]
在上述命令中,使用“+”或者“-”是在保存原來權(quán)限設(shè)置的基礎(chǔ)上修改權(quán)限。當使用“=”時,權(quán)限被明確地賦予要修改的文件。其中字符u表示文件或者目錄的所有者,g表示文件或者目錄所屬組,o除所有者和所屬組以外的用戶,a表示全部用戶。
數(shù)字方式的基本語法是:chmod nnn 文件
其中第1、2、3個n分別表示用戶、組成員和所有其它用戶。各個位置上的n要么是一個0,或者是一個由賦予權(quán)限的相關(guān)值相加得到的單個阿拉伯數(shù)字之和。這些數(shù)字的意義如表1所示。
表1 數(shù)字的含義
值 表示的意義
4 表示文件或者目錄的讀權(quán)限
2 表示文件或者目錄的寫權(quán)限
1 表示文件或者目錄的執(zhí)行權(quán)限
很顯然,當使用數(shù)字方式時,這3個數(shù)字必須為0至7中的一個。
一般而言,作為系統(tǒng)管理員,更喜歡使用數(shù)字方式,因為這種方式的速度明顯快得多。
很顯然,系統(tǒng)中各種文件的權(quán)限設(shè)置對特定用戶的數(shù)據(jù)安全有很大影響。但是要求用戶逐一明確設(shè)置系統(tǒng)中每個文件的權(quán)限也是不現(xiàn)實的,為此,需要 使用umask命令,該命令可以為用戶賬號中新文件的創(chuàng)建進行缺省設(shè)置。具體來說,umask是用來設(shè)置權(quán)限掩碼的,權(quán)限掩碼由3個數(shù)字組成,將現(xiàn)有的存 取權(quán)限減掉權(quán)限掩碼后,即可產(chǎn)生建立文件時默認的權(quán)限。例如,root的權(quán)限為777,若權(quán)限掩碼設(shè)為022,那么兩都相減后可得755。下面是在我的系 統(tǒng)更改umask的一些情況:
[root@linuxserver root]# umask
022
上述命令顯示表示我的系統(tǒng)的umask值為022。
[root@linuxserver root]# umask -S
u=rwx,g=rx,o=rx
當umask值為022時,默認情況下各用戶的權(quán)限。注意這里的參數(shù)“S”是大寫。
[root@linuxserver root]# umask 177
[root@linuxserver root]# umask -S
u=rw,g=,o=
上述兩行命令把umask值改為177,結(jié)果只有文件所有者具有讀寫文件的權(quán)限,其它用戶不能訪問該文件。這顯然是一種非常安全的狀態(tài)。
其它問題
事實上,一個系統(tǒng)中的文件安全是一個綜合問題,對于一些特殊的情況要做特殊的考慮。比如,對于設(shè)備文件的安全性、SUID/SGID的設(shè)置等。
一般來說,各Linux發(fā)行版在安裝時就已經(jīng)把設(shè)備文件的設(shè)置做得非常不錯。但是對于磁盤設(shè)備而言,我認為惟一安全的還是只允許root用戶進行讀寫。否則,其它用戶的賬號一旦被攻破,黑客通過訪問磁盤很快就可以讓系統(tǒng)崩潰。要做到這一點,可以使用以下命令:
#cd /dev
#chmod 600 sd* hd *
Suid和Sgid是Linux系統(tǒng)中最復(fù)雜的屬性,它跟一個系統(tǒng)的安全息息相關(guān)。我們可以利用chmod命令來清除或者設(shè)置一個文件的Suid/Sgid屬性,具體方法如下所示。
將/usr/sbin/pppd程序設(shè)置為Suid/Sgid狀態(tài),使用的命令是:
#chmod ug+s /usr/sbin/pppd
要清除Sgid狀態(tài)而保留Suid狀態(tài),可用以下命令:
#chmod g-s /usr/sbin/pppd
此外,如何裝載文件系統(tǒng),特別是將root文件系統(tǒng)裝載為只讀,以防止非授權(quán)的修改也比較重要。
總之,Linux下文件系統(tǒng)的安全問題是一個非常復(fù)雜的問題。通過本文的學習,讀者對此應(yīng)該有了一個較全面的了解,并且可以處理日常工作中常見的有關(guān)文件系統(tǒng)安全問題。