在了解到Linux系統上的文件目錄權限,有時候你會發現為什么剛創建的文件是-rw-r--r--這個權限,目錄是drwxr-xr-x權限,有些是-rwsr-xr-x,又有些是drwsrws--T?這些則與umask、特殊權限有關。
一.umask:
什么是umask?umask一般是用在你初始創建一個目錄或者文件的時候賦予他們的權限。它與chmod的效果剛好相反,umask設置的是權限“補碼”,而chmod設置的是文件權限碼。一般在/etc/profile、
或用戶家目錄下的.bash_profile或.profile中設置umask值。
0022
[root@centos7 ~]#umask -S
u=rwx,g=rx,o=rx
默認的umask是0022,0022四個數字代表是賦值初始化準備丟棄的權限。(相對應文件來說,x權限就算沒說明出來丟棄一樣必須默認丟棄)
第一個0代表suid 丟棄的權限;
第二個0代表本文件/目錄擁有者什么權限都沒丟棄;
第三個2代表本文件/目錄的用戶組丟棄了w權限;
第四個2代表本文件/目錄的文件/目錄的用戶組丟棄了w權限。
一般我們會這樣表示:
umask +default permission(默認權限) =777(目錄)/666(文件)
例:[root@centos7 ~]#umask 002
[root@centos7 ~]#touch bb
[root@centos7 ~]#mkdir cc
[root@centos7 ~]#ll
-rw-rw-r--. 1 root root 0 May 31 20:20 bb
drwxrwxr-x. 2 root root 6 May 31 20:20 cc
bb文件權限rw-rw-r--:664 符合666-002=664
cc目錄權限rwxrwxr-x:775符合777-002=775
但存在特殊情況如果把umask設為135呢?
[root@centos7 ~]#umask 135
[root@centos7 ~]#touch dd
[root@centos7 ~]#mkdir ee
[root@centos7 ~]#ll
-rw-r---w-. 1 root root 0 May 31 20:23 dd
drw-r---w-. 2 root root 6 May 31 20:24 ee
dd文件的權限變為rw-r---w-:642不符合666-135=531
目錄的權限rw-r---w-:642符合777-135=642
為什么文件的會變化,這是因為:轉換成二進制可看出
把上面的減去下面的,沒有權限減則保留原權限(110100010)轉換成八進制為642.
則:文件權限用666-umask ,如果所得結果某位存在執行(奇數)權限,則將其權限+1,偶數不變。
目錄權限用777-umask ,得到的權限即為目錄的權限。
二.特殊權限SUID, SGID, Sticky
要了解特殊權限需對安全上下文有一個概念:
前提:進程有屬主和屬組;文件有屬主和屬組
(1) 任何一個可執行程序文件能不能啟動為進程,取決發起者對程序文件是否擁有執行權限
(2) 啟動為進程之后,其進程的屬主為發起者,進程的屬組為發起者所屬的組
(3) 進程訪問文件時的權限,取決于進程的發起者
(a) 進程的發起者,同文件的屬主:則應用文件屬主權限
(b) 進程的發起者,屬于文件屬組;則應用文件屬組權限
(c) 應用文件“其它”權限
SUID:
1.SUID 權限僅對二進制程序(binary program)有效;
2.執行者對于該程序需要具有x 的可執行權限;
3.本權限僅在執行該程序的過程中有效(run-time);
4.執行者將具有該程序擁有者(owner) 的權限。
5.SUID設置在目錄上無意義
權限設定:
chmod u+s FILE...
chmod u-s FILE...
[root@centos7 ~]# ls -ld /tmp ; ls -l /usr/bin/passwd
drwxrwxrwt. 14 root root 4096 Jun 16 01:27 /tmp
-rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd
在Linux系統中,所有賬號的密碼都記錄在/etc/shadow 這個文件里面,這個文件的權限為:
[root@centos7 ~]#ll /etc/shadow
----------. 1 root root 1572 May 31 17:42 /etc/shadow
這個文件僅有root 可讀且僅有root 可以強制寫入而已。既然這個文件僅有root 可以修改,那么普通用戶呢?
[xiaoming@centos7 ~]$passwd
Changing password for user xiaoming.
Changing password for xiaoming.
(current) UNIX password:
New password:
Retype new password:
passwd: all authentication tokens updated successfully.也可修改密碼。這就是加了SUID特殊權限功能。
- xiaoming對于/usr/bin/passwd 這個程序來說是具有x 權限的,表示dmtsai 能執行passwd;
- passwd 的擁有者是root 這個賬號;
- xiaoming執行passwd 的過程中,會『暫時』獲得root 的權限;
- /etc/shadow 就可以被xiaoming 所執行的passwd 所修改。
[xiaoming@centos7 ~]$cat /etc/shadow
cat: /etc/shadow: Permission denied
xiaoming 使用cat 去讀取/etc/shadow 時,cat 不具有SUID 的權限,所
以xiaoming 執行『cat /etc/shadow』時,是不能讀取/etc/shadow 的。
SGID:
s 標志在文件擁有者的x 項目為SUID,那s 在群組的x 時則稱為Set GID
[root@centos7 ~]# ls -l /usr/bin/locate
-rwx--s--x. 1 root slocate 40496 Jun 10 2014 /usr/bin/locate
與SUID 不同的是,SGID 可以針對文件或目錄來設定!如果是對文件來說, SGID 有如下的功能:
-1.SGID 對二進制程序有用;
-2.程序執行者對于該程序來說,需具備x 的權限;
-3.執行者在執行的過程中將會獲得該程序群組的支持!
[root@centos7 ~]# ll /usr/bin/locate /var/lib/mlocate/mlocate.db
-rwx--s--x. 1 root slocate 40496 Jun 10 2014 /usr/bin/locate
-rw-r-----. 1 root slocate 2349055 Jun 15 03:44 /var/lib/mlocate/mlocate.db
與SUID 非常的類似,使用xiaoming 這個賬號去執行locate 時,那xiaoming將會取得slocate 群組的支持, 因此就能夠去讀取 mlocate.db 。
SGID 也能夠用在目錄上,這也是非常常見的一種用途
目錄設定了SGID 的權限后,他將具有如下的功能:
-1. 用戶若對于此目錄具有r 與x 的權限時,該用戶能夠進入此目錄;
-2.用戶在此目錄下的有效群組(effective group)將會變成該目錄的群組;
-3.用途:若用戶在此目錄下具有w 的權限(可以新建文件),則使用者所建立的新文件,該新文件的群組與此目錄的群組相同。
Sticky Bit
這個 Sticky Bit, SBIT 目前只針對目錄有效,sticky 設置在文件上無意義。SBIT 對于目錄的作用是:
-1.當用戶對于此目錄具有w, x 權限,亦即具有寫入的權限時;
-2.當用戶在該目錄下建立文件或目錄時,僅有自己與root 才有權力刪除該文件
SUID/SGID/SBIT 權限設定
4 為SUID、 2 為SGID、 1 為SBIT
[root@centos7 ~]# cd /tmp
[root@centos7 tmp]# touch test
[root@centos7 tmp]# chmod 4755 test; ls -l test
-rwsr-xr-x 1 root root 0 Jun 16 02:53 test
[root@centos7 tmp]# chmod 6755 test; ls -l test
-rwsr-sr-x 1 root root 0 Jun 16 02:53 test
[root@centos7 tmp]# chmod 1755 test; ls -l test
-rwxr-xr-t 1 root root 0 Jun 16 02:53 test
[root@centos7 tmp]# chmod 7666 test; ls -l tes
-rwSrwSrwT 1 root root 0 Jun 16 02:53 test
設定權限成為 -rws--x--x 的模樣:
[root@centos7 tmp]# chmod u=rwxs,go=x test; ls -l test
-rws--x--x 1 root root 0 Jun 16 02:53 test
承上,加上 SGID 與 SBIT 在上述的文件權限中!
[root@centos7 tmp]# chmod g+s,o+t test; ls -l test
-rws--s--t 1 root root 0 Jun 16 02:53 test
三、ACL權限
1】ACL 是Access Control List 的縮寫,主要的目的是在提供傳統的owner,group,others 的read,write,execute 權限之外的細部權限設定。ACL 可以針對單一使用者,單一文件或目錄來進行
ACL 主要可以針以下來控制權限呢:
1.使用者 (user):可以針對使用者來設定權限;
2.群組 (group):針對群組為對象來設定其權限;
3.默認屬性(mask):還可以針對在該目錄下在建立新文件/目錄時,規范新數據的默認權限;
及1.ACL:Access Control List,實現靈活的權限管理;2.CentOS7默認創建的xfs和ext4文件系統具有ACL功能;3.CentOS7之前版本,默認手工創建的ext4文件系統無ACL功能,需手動增加tune2fs –o acl/dev/sdb1
mount –o acl/dev/sdb1 /mnt/test
4.ACL生效順序:所有者,自定義用戶,自定義組,其他人
為多用戶或者組的文件和目錄賦予訪問權限rwx
2】ACL 的設定技巧: getfacl, setfacl
- getfacl:取得某個文件/目錄的ACL 設定項目;
2.setfacl:設定某個目錄/文件的ACL 規范。
1.setfacl 指令用法介紹及『u:賬號:權限』設定
[root@centos7 ~]# setfacl [-bkRd] [{-m|-x} acl 參數] 目標文件名
選項與參數:
-m :設定后續的 acl 參數給文件使用,不可與 -x 合用;
-x :刪除后續的 acl 參數,不可與 -m 合用;
-b :移除『所有的』 ACL 設定參數;
-k :移除『預設的』 ACL 參數,
-R :遞歸設定 acl ,亦即包括次目錄都會被設定起來;
-d :設定『預設 acl 參數』的意思!只對目錄有效,在該目錄新建的數據會引用此默認值
例:[root@centos7 ~]# touch acl_test1
[root@centos7 ~]# ll acl_test1
-rw-r--r--. 1 root root 0 Jul 21 17:33 acl_test1
[root@centos7 ~]# setfacl -m u:xiaoming:rx acl_test1
[root@centos7 ~]# ll acl_test1
-rw-r-xr--+ 1 root root 0 Jul 21 17:33 acl_test1
[root@centos7 ~]# setfacl -m u::rwx acl_test1
[root@centos7 ~]# ll acl_test1
-rwxr-xr--+ 1 root root 0 Jul 21 17:33 acl_test1
設定值中的 u 后面無使用者列表,代表設定該文件擁有者
2.getfacl 指令用法余setfacl一樣
例:[root@centos7 ~]# getfacl acl_test1
file: acl_test1 <==說明檔名而已!
owner: root <==說明此文件的擁有者,亦即 ls -l 看到的第三使用者字段
group: root <==此文件的所屬群組,亦即 ls -l 看到的第四群組字段
user::rwx <==使用者列表欄是空的,代表文件擁有者的權限
user:xiaoming:r-x <==針對xiaoming 的權限設定為 rx ,與擁有者并不同!
group::r-- <==針對文件群組的權限設定僅有 r
mask::r-x <==此文件預設的有效權限 (mask)
other::r--
3】特定的單一群組的權限設定:『g:群組名:權限』
- 針對特定群組的方式:
設定規范:『 g:[所屬組]:[rwx] 』,例如針對 g1 的權限規范 rx :
[root@centos7 ~]# setfacl -m g:g1:rx acl_test1 - 針對有效權限 mask 的設定方式:
設定規范:『 m:[rwx] 』,例如針對剛剛的文件規范為僅有 r :
[root@centos7 ~]# setfacl -m m:r acl_test1
3 針對預設權限的設定方式:
設定規范:『 d:[ug]:使用者列表:[rwx] 』
讓 xiaoming 在 /srv/projecta 底下一直具有 rx 的預設權限!
[root@centos7 ~]# setfacl -m d:u:xiaoming:rx /srv/projecta
4】主要的文件操作命令cp和mv都支持ACL,只是cp命令需要加上-p 參數。但是tar等常見的備份工具是不會保留目錄和文件的ACL信息
getfacl -R /tmp/dir1 > acl.txt
setfacl -R -b /tmp/dir1
清除dir目錄的ACL權限
setfacl -R --set-file=acl.txt /tmp/dir1
setfacl --restore acl.txt
getfacl -R /tmp/dir1