天天看點

linux基礎知識---權限

權限

一、檔案的基本權限

    所謂的權限就是使用者通路檔案的能力,檔案的基本權限包括 r(讀),write(寫),x(可執行)。

    用ls -ld file 檢視檔案的權限屬性:

    drwxr-xr-x 4 root root 4096 Jul  3 21:29 file

        drwxr-xr-x:說明檔案類型,常見的檔案類型有:d 目錄檔案,l 連結檔案,c 線性裝置檔案,b 塊裝置檔案,s sorket檔案,- 一般檔案,p 管道檔案

        drwxr-xr-x:此檔案(目錄)屬主使用者權限

        drwxr-xr-x:此檔案(目錄)屬組使用者權限

        drwxr-xr-x:此檔案(目錄)其他使用者權限

1)權限對于目錄和檔案具體含義如下:

    目錄:

        r:可以用ls指令檢視目錄中的檔案清單(用ls -l參數也不能檢視裡面的内容)

        w:可以在目錄中建立和删除檔案

        x:可以cd到此目錄中,并且可以使用ls -l顯示此檔案的中繼資料資訊

    檔案:

        r:可以檢視檔案内容

        w:可修改檔案内容

        x:可以将此檔案做為一個腳本執行

2)使用者通路檔案時的權限模型:

    if(運作程式的屬主 = 此程式正在通路檔案的屬主)

        以屬主的身份權限通路檔案;

    else if(運作程式的屬組 = 此程式正在通路檔案的屬組)

        以屬組的身份權限通路檔案;

    else

        以其他使用者身份權限通路;

3)常見的檔案權限管理指令

    chmod 改變檔案權限

    Usage:chmod [選項]... 模式[,模式]... 檔案...

    或:chmod [選項]... 八進制模式 檔案...

    或:chmod [選項]... --reference=參考檔案 檔案...

操作對象

權限設定

權限值

示例

u 檔案屬主權限

g 同組使用者權限

o 其它使用者權限

a 所有使用者(包括以上三種)

+ 增權重限

- 取消權限

=  唯一設定權限

r-->4

w-->2

x-->1

1、修改/tmp/test檔案屬主的權限是rwx,屬組的權限是r-x,其他使用者權限r-x

chmod 755 /tmp/test

或者:chmod u=rwx,go=r-x /tmp/test

2、在1問題的基礎上,屬主,屬組,其他使用者都要去掉x權限

chmod a-x /tmp/test

或者:chmod u-x,g-x,o-x /tmp/test

或者:chmod 644 /tmp/tes

3、修改/tmp/test1目錄檔案的屬主的權限是rwx,屬組的權限是r-x,其他使用者權限r-x,以及所在目錄下所有檔案都是此權限

chmod -R 755 /tmp/test1

或者:chmod -R u=rwx,go=r-x /tmp/test1

4、在問題1基礎上,屬組的權限變為rwx

chmod 775 /tmp/test

或者:chmod g+w /tmp/test

5、以/tmp/test的權限為基準,讓/tmp/test2檔案的權限和他一樣

chmod --reference=/tmp/test /tmp/test2

1

2

3

4

<code>    </code><code>一般情況下,可根據個人喜好程度選擇一種修改權限的模式。</code>

<code>    </code> 

<code>    </code><code>umask</code><code>:設定系統預設掩碼,在新檔案或目錄首次建立時的權限。</code>

<code>    </code><code>對目錄來說,新建立的目錄權限是 777-umask_value;對于檔案來說,新建立的檔案權限是666-umask_value.</code>

5

6

7

8

9

10

<code>[root@server </code><code>test</code><code>]</code><code># umask </code>

<code>0022</code>

<code>[centos@server </code><code>test</code><code>]$ </code><code>umask</code> 

<code>0002</code>

<code>[centos@server </code><code>test</code><code>]$ </code><code>id</code> <code>centos</code>

<code>uid=500(centos) gid=500(centos) </code><code>groups</code><code>=500(centos),600(magedu)</code>

<code>[mandriva@server ~]$ </code><code>umask</code> 

<code>[mandriva@server ~]$ </code><code>id</code>

<code>uid=4400(mandriva) gid=3302(linux) </code><code>groups</code><code>=3302(linux),2201(gentoo),3300(distro),3301(peguin)</code>

    管理者和普通使用者的掩碼一般都不相同。對于屬組和屬主使用者名相同的,新建立的檔案或目錄的掩碼值是0002;對于屬組和屬主使用者名不相同的,新建立的檔案或目錄的掩碼值與管理者使用者的掩碼值一樣是0022。

二、特殊權限

    特殊權限由三種:suid,sgid,sticky。引入特殊權限是為了更好的管理檔案或者說為了實作在某種特使情況下的需求。下面對着三種特殊權限意義說明。

特殊權限

具體意義

suid

設定前提:檔案屬主具有x權限

    此設定一般是對指令設定的,設定此特殊權限後,在執行此指令是不是一發起者程序的使用者運作,而是以次指令檔案的屬主運作。

chmod u+s /path/to/somefile

最典型的例子是:passwd這個指令。

    我們發現普通使用者也是可以修改自己的密碼的,實際上是将密碼資訊寫入到/etc/shadow檔案中去,而這個檔案是沒有任何權限的。這就是suid的作用,普通使用者在設定密碼時候,實際上是一passwd指令的屬主使用者root身份執行的

sgid

設定前提:檔案屬組具有x權限

    此設定一般用法是對目錄進行設定的,設定了這個權限之後,以後再這個目錄下所建立的任何檔案的屬組都和這個目錄的屬組一樣。

chmod g+s /path/to/somefile

例如:

    某公司開發項目時,需要将每個人寫的代碼檔案都歸屬到同一個組當中,友善大家檢視。

stiky

設定前提:檔案其他具有x權限

    此設定的作用是使用者隻能自己建立的檔案

chmod o+t /path/to/somefile

    在上一個示例中,每個人都可以删除其他人上傳的代碼,這是我們不願意看到的,是以在設定了stiky位後,每個人隻能删除自己的檔案

練習:

1、讓普通使用者使用/tmp/cat能檢視管理者才有權限通路的檔案;

<code>[root@server ~]</code><code>#cp `which cat` /tmp/cat</code>

<code>[root@server ~]</code><code>#chmod u+s /tmp/cat</code>

<code>[root@server ~]</code><code>#su - centos</code>

<code>[centos@server ~]</code><code>#/tmp/cat /etc/shadow #可以看到/etc/shadow的内容</code>

2、建立目錄/project/test,讓普通使用者hadoop和openstack對此目錄都能建立檔案,且建立的檔案的屬組為此目錄的屬組,而非使用者自身的屬組,此外還要求,每個使用者不能删除其它人的檔案;

<code>[root@server ~]</code><code>#mkdir -p /project/test</code>

<code>[root@server ~]</code><code>#chmod g+s /project/test</code>

<code>[root@server ~]</code><code>#chmod o+t /project/test</code>

三、ACL(Access Control List)機制

    在這樣的情況下:某一公司中的财務表,一般情況下,在财務部門中的職員A建立的财務表本人可以讀寫,屬組(在财務部門的職員)可以檢視A職員财務表,其他人沒有任何權限更改或者檢視A職員的财務表。那麼,作為公司的CEO或者說是頭,難道也沒有權限檢視這個财務表嗎?顯然這是不符合我們的要求的,ACL機制的出現就解決了這樣的問題。

    facl(File Access Control List):檔案通路控制清單,它的主要作用是針對某些特定讓普通使用者設定專有的權限的一種機制,與檔案原來的屬主、屬組、其他、特殊權限沒有任何沖突。相當于在檔案原有的權限基礎上,針對某些使用者設定的擴充權限。

    檢視和設定檔案ACL屬性的指令是:getfacl和setfacl,具體的常用用法如下:

getfacl

getfal 檔案名

getfacl /etc/passwd 檢視/etc/passwd檔案的acl屬性

setfacl

setfacl {-m|-x} 目标:MODE FILE...

設定centos使用者對/etc/fstable的acl屬性

setfacl -m u:centos:rw- /etc/fstable

設定centos組對/etc/fstable的acl屬性

setfacl -x g:centos /etc/fstable

file2檔案參照file1檔案的acl權限

getfacl file1 | setfacl --set-file=- file2

    注意:acl機制是在建立檔案系統時添加的屬性,如果在建立檔案系統時,沒有添加此屬性,在這裡就不能使用acl機制。

    加入acl機制後使用者通路檔案時的權限模型:(假語言表示)

        if(運作程式的屬主 = 此程式正在通路檔案的屬主 || 運作程式的屬主有acl機制)

            以屬主的身份權限通路檔案;(運作程式的屬主 = 此程式正在通路檔案的屬主)

            使用者級别的facl(運作程式的屬主有acl機制);

        else if(運作程式的屬組 = 此程式正在通路檔案的屬組 || 運作程式的屬組有acl機制)

            以屬組的身份權限通路檔案(運作程式的屬組 = 此程式正在通路檔案的屬組);

            使用者級别的facl(運作程式的屬組有acl機制);

        else

            以其他使用者身份權限通路;

解決開始引入的問題:

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

<code>#财務組A職員使用者是Alex,她屬組是FinaDept。公司經理使用者是boss</code>

<code>[root@server ~]</code><code># mkdir -p /test/FinaDept/</code>

<code>[root@server ~]</code><code># chown .FinaDept /test/FinaDept/</code>

<code>[root@server ~]</code><code># chmod 3777 /test/FinaDept/</code>

<code>#Alex使用者所建立的檔案</code>

<code>[Alex@server FinaDept]$ </code><code>touch</code> <code>fina.txt </code>

<code>[Alex@server FinaDept]$ ll</code>

<code>total 0</code>

<code>-rw-r----- 1 Alex FinaDept 0 Jul 12 00:41 fina.txt</code>

<code>#boss使用者沒有設定acl機制之前</code>

<code>[boss@server FinaDept]$ </code><code>cat</code> <code>fina.txt </code>

<code>cat</code><code>: fina.txt: Permission denied</code>

<code>#設定acl之後</code>

<code>[Alex@server FinaDept]$ setfacl -m u:boss:r-- fina.txt </code>

<code>[Alex@server FinaDept]$ getfacl fina.txt </code>

<code># file: fina.txt</code>

<code># owner: Alex</code>

<code># group: FinaDept</code>

<code>user::rw-</code>

<code>user:boss:r--</code>

<code>group::r--</code>

<code>mask::rw-</code>

<code>other::---</code>

<code>##boss使用者隻能檢視,不能修改</code>

<code>a:123</code>

<code>b:1234</code>

<code>[boss@server FinaDept]$ </code><code>echo</code> <code>"c:234"</code> <code>&gt;&gt; fina.txt</code>

<code>-</code><code>bash</code><code>: fina.txt: Permission denied</code>

本文轉自 羊木狼 51CTO部落格,原文連結:http://blog.51cto.com/guoting/1435019,如需轉載請自行聯系原作者

繼續閱讀