google 程序员 微软 java wordpress shell Android 云计算 Windows Firefox apache linux 编程 nginx Ubuntu php Python 开源 centos mysql

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

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

     

    umask:設置系統默認掩碼,在新文件或目錄首次創建時的權限。

    對目錄來說,新創建的目錄權限是 777-umask_value;對於文件來說,新創建的文件權限是666-umask_value.

1

2

3

4

5

6

7

8

9

10

[root@server test]# umask 

0022

[CentOS@server test]$ umask 

0002

[centos@server test]$ id centos

uid=500(centos) gid=500(centos) groups=500(centos),600(magedu)

[mandriva@server ~]$ umask 

0022

[mandriva@server ~]$ id

uid=4400(mandriva) gid=3302(Linux) groups=3302(linux),2201(Gentoo),3300(distro),3301(peguin)

    管理員和普通用戶的掩碼一般都不相同。對於屬組和屬主用戶名相同的,新創建的文件或目錄的掩碼值是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能查看管理員才有權限訪問的文件;

1

2

3

4

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

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

[root@server ~]#su - centos

[centos@server ~]#/tmp/cat /etc/shadow #可以看到/etc/shadow的內容

2、新建目錄/project/test,讓普通用戶hadoop和openstack對此目錄都能創建文件,且創建的文件的屬組為此目錄的屬組,而非用戶自身的屬組,此外還要求,每個用戶不能刪除其它人的文件;

1

2

3

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

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

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

三、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

            以其他用戶身份權限訪問;

解決開始引入的問題:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

#財務組A職員用戶是Alex,她屬組是FinaDept。公司經理用戶是boss

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

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

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

#Alex用戶所創建的文件

[Alex@server FinaDept]$ touch fina.txt 

[Alex@server FinaDept]$ ll

total 0

-rw-r----- 1 Alex FinaDept 0 Jul 12 00:41 fina.txt

#boss用戶沒有設置acl機制之前

[boss@server FinaDept]$ cat fina.txt 

cat: fina.txt: Permission denied

#設置acl之後

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

[Alex@server FinaDept]$ getfacl fina.txt 

# file: fina.txt

# owner: Alex

# group: FinaDept

user::rw-

user:boss:r--

group::r--

mask::rw-

other::---

##boss用戶只能查看,不能修改

[boss@server FinaDept]$ cat fina.txt 

a:123

b:1234

[boss@server FinaDept]$ echo "c:234" >> fina.txt

-bash: fina.txt: Permission denied

延伸阅读

    评论