在linux文件系統中使用ls -l命令可以查看文件的屬性,但是我們明白其中屬性各自代表的意思嗎?下面我們就來看一看,這其中的奧義。。。
文件屬性
使用ls命令查看文件,可以發現列表分為幾個部分,各自所代表的意義如圖所示:
文件屬性操作
chown 設置文件的所有者
chgrp 設置文件的屬組信息
修改文件的屬主:chown
語法:chown[OPTION]… [OWNER][:[GROUP]] FILE…
用法:
OWNER
OWNER:GROUP
:GROUP
命令中的冒號可用.替換;
-R: 遞歸
chown[OPTION]… –reference=RFILE FILE…
修改文件的屬組:chgrp
語法:
chgrp[OPTION]… GROUP FILE…
chgrp[OPTION]… –reference=RFILE FILE…參考RFILE文件的屬組,將FILE的修改為同RFILE
用法:-R 遞歸
文件權限
文件的權限主要針對三類對象進行定義:
owner: 屬主, u
group: 屬組, g
other: 其他, o
每個文件針對每類訪問者都定義了三種權限:
r: Readable
w: Writable
x: eXcutable
同樣的權限作用于不同的文件是所代表的意義有所不同:
文件:
r: 可使用文件查看類工具獲取其內容
w: 可修改其內容
x: 可以把此文件提請內核啟動為一個進程
目錄:
r: 可以使用ls查看此目錄中文件列表
w: 可在此目錄中創建文件,也可刪除此目錄中的文件
x: 可以使用ls -l查看此目錄中文件列表,可以cd進入此目錄
X:只給目錄x權限,不給文件x權限
文件權限對照表:
權限也可以使用八進制數字表示,相對應的
— 000 0
–x 001 1
-w- 010 2
-wx 011 3
r– 100 4
r-x 101 5
rw- 110 6
rwx 111 7
例如:
rw- r– —:640
rwx r-x r-x: 755
修改文件權限
語法:
chmod[OPTION]… OCTAL-MODE FILE…
-R: 遞歸修改權限
chmod[OPTION]… MODE[,MODE]… FILE…
MODE:
修改一類用戶的所有權限:
u= g= o= ug= a= u=,g=
修改一類用戶某位或某些位權限
u+ u-g+ g-o+ o-a+ a-+ –
chmod[OPTION]… –reference=RFILE FILE…
參考RFILE文件的權限,將FILE的修改為同RFILE;
X:只給目錄x權限,不給文件x權限(若文件初始有x權限,則增加)
也可數字表示權限
新建文件和目錄的默認權限
新建普通文件
用戶新建文件就會發現新建文件的權限不是完整的權限,
而普通用戶所新建的文件的權限和root所創建的文件的權限又有所不同
新建目錄
新建目錄可以發現新建目錄的權限也是不完整,但是和新建的普通文件的權限還是有些不同
普通用戶所新建的目錄的權限也和root新建的目錄權限有所不同。
這是因為有umask的存在:
什么是umask?
umask一般是用在你初始創建一個目錄或者文件的時候賦予他們的權限,umask設置了用戶創建文件的默認權限,它與chmod的效果剛好相反,umask設置的是權限“補碼”,而chmod設置的是文件權限碼。一般在/etc/profile、$ [HOME]/.bash_profile或$[HOME]/.profile中設置umask值。
系統管理員可以根據需要來自己設定一個合理的umask值,
root和普通用戶的 umask值有所不同
非特權用戶umask是002
root的umask是022
這四個數字分別代表著什么意思?( 注:一般使用時只使用后三位)
前面提到用戶的權限可以使用數字的方式來表達,這里同樣是使用數字來表達權限的意思,只是這里的數字代表的是賦值權限的時候所舍棄的值。
這里首先要說明兩點:
1、針對目錄來說x權限代表可以進入該目錄,所以說對于這個權限初始賦值是沒什么問題的;
2、針對文件的x的權限代表執行,這個風險太高,所以一般權限初始賦值必須去掉x的;
第一個數字表示:suid丟棄的權限
第二個數字表示:文件或目錄屬主所需要丟棄的值
第三個數字表示:文件或目錄屬組所需要丟棄的值
第四個數字表示:文件或目錄的其他用戶所需要丟棄的值,
因為文件一般情況下不給予執行權限,所以:
新建FILE權限: 666-umask
如果所得結果某位存在執行(奇數)權限,則將其權限+1
那么現在就可以解釋root用戶創建新文件的權限為:
666 – 022 = 644,與上圖相對應
因為要進入目錄需要執行權限,所以:
新建DIR權限: 777-umask
umask命令:
umask: 查看
umask#: 設定
umask002
umask –S 模式方式顯示
umask –p 輸出可被調用(經常使用于腳本文件)
使用命令設置只在當前shell有效,要永久生效就需要寫入配置文件了。
全局設置:/etc/bashrc 用戶設置:~/.bashrc
這里可以使用umask命令設置后在使用的-p選項寫入文件:
例:誤刪除了用戶user1的家目錄,請重建并恢復該用戶家目錄及相應的權限屬性
1、[root@localhost ~]# cp -r /etc/skel/. /testdir/user1name
2、[root@localhost ~]# chown -R user1:user1 /testdir/user1name/
3、[root@localhost ~]# chmod 700 /testdir/user1name/
linux文件系統上的特殊權限:
linux文件系統中不僅僅只有rwx三種權限,為了滿足工作的需要,linux文件系統中還有三種特殊權限,SUID,SGID,Sticky,他們所面對的對象分別是 USER,GROUPS,OTHER.說著三種特殊權限 ,就要提一下linux中的安全上下文觀念了,
什么是安全上下文呢?
linux安全上下文:
用戶不同,所擁有的權限也有所不同,不同的用戶可以使用同一個命令,但是所達到的效果往往有所不同,這是因為,用戶在系統中所發起的進程,能夠訪問資源的權限取決于進程的運行者身份。
運行中的程序以進程發起者的身份運行:
root: /bin/cat
mage: /bin/cat
可以看到,root用戶和普通用戶執行同一個命令出現了兩種不同的現象。
文件有屬主和屬組;進程也有屬主和屬組;
(1) 任何一個可執行程序文件能不能啟動為進程:取決發起者對程序文件是否擁有執行權限
(2) 啟動為進程之后,其進程的屬主為發起者;進程的屬組為發起者所屬的組
(3) 進程訪問文件時的權限,取決于進程的發起者
(a) 進程的發起者,同文件的屬主:則應用文件屬主權限
(b) 進程的發起者,屬于文件屬組;則應用文件屬組權限
(c) 應用文件“其它”權限
可執行文件上SUID權限
任何一個可執行程序文件能不能啟動為進程:取決發起者對程序文件是否擁有執行權限
啟動為進程之后,其進程的屬主為原程序文件的屬主
SUID只對二進制可執行程序有效
SUID設置在目錄上無意義
權限設定:
chmod u+s FILE…
chmod u-s FILE…
權限位映射:
SUID: user,占據屬主的執行權限位
s: 屬主擁有x權限
S:屬主沒有x權限
文件必須有x權限才能生效,若沒有x權限,加上SUID權限后不生效,而且將以“S”的形式展現
例:
平時用戶修改密碼使用passwd命令,可以看下passwd命令的二進制文件權限和/etc/passwd文件的屬性可以發現普通用戶可以更改密碼的原因;
因為:/etc/passwd文件屬組和其他用戶是沒有寫權限的,所以普通用戶無法更改密碼文件,可以平時普通用戶確實可以修改自己的密碼,這是因為當普通用戶執行passwd命令時,因為/bin/passwd文件具SUID權限,所以當執行passwd命令時,是以進程屬主身份也就是root發起的,這樣就可以修改密碼了。
可執行文件上SGID權限
任何一個可執行程序文件能不能啟動為進程:取決發起者對程序文件是否擁有執行權限
啟動為進程之后,其進程的屬主為原程序文件的屬組
權限設定:
chmod g+s FILE…
chmod g-s FILE…
權限位映射:
SGID: group,占據屬組的執行權限位
s: group擁有x權限
S:group沒有x權限
例:
如cat命令文件原本權限為755其他用戶也有執行權限,更改為750,使其他用戶沒有執行權限;
賦予cat文件SGID權限
將user1用戶加入root組,再使用cat命令可以正常查看。
所以:具有SGID權限的可執行文件,啟動為進程之后,其進程的屬主為原程序文件的屬組
目錄上的SGID權限
默認情況下,用戶創建文件時,其屬組為此用戶所屬的主組
一旦某目錄被設定了SGID,則對此目錄有寫權限的用戶在此目錄中創建的文件所屬的組為此目錄的屬組
通常用于創建一個協作目錄
權限設定:
chmod g+s DIR…
chmod g-s DIR…
更改目錄權限[root@localhost ~]# chmod g+s /home/user1/ff
再創建文件可以看到屬組和目錄屬組一致:
Sticky 位
具有寫權限的目錄通常用戶可以刪除該目錄中的任何文件,無論該文件的權限或擁有權
在目錄設置Sticky 位,只有文件的所有者或root可以刪除該文件
sticky 設置在文件上無意義
權限設定:
chmod o+t DIR…
chmod o-t DIR…
權限位映射:
Sticky: other,占據other的執行權限位
t: other擁有x權限
T:other沒有x權限
如:在/testdir目錄下有三個文件屬主屬組都不同
使用任意用戶可以刪除其他用戶的文件
給/testidr目錄加上Sticky權限后,可以發現只能刪除屬于自己的文件
linux中普通權限可以使用使用數字使用,特殊權限同樣可以使用數字表示
計算方法和普通權限的計算方法相同
SUID SGID STICKY
000 0
001 1
010 2
011 3
100 4
101 5
110 6
111 7
如:添加SUID權限
chmod 4777 FILENAME
有時為了保護重要文件,可能需要設定一些特定的屬性,如:不能更改,刪除。這是就需要用到
命令:chattr
禁止刪除,改名,更改:
chattr +i
取消:chattr -i
只能增加:
chattr +a
取消:chattr -a
lsattr 顯示特定屬性
訪問控制列表
上述介紹的幾種權限只是針對三種用戶,屬主,屬組,其他人。遠遠不夠滿足平時的使用,如想讓某個用戶查看文件,而又不影響屬組其他人的權限,這時就需要使用訪問控制列表了。它可以實現靈活的管理權限管理。
ACL:Access Control List,實現靈活的權限管理
除了文件的所有者,所屬組和其它人,可以對更多的用戶設置權限
在CentOS7.0默認創建的xfs和ext4文件系統有ACL功能。CentOS7.X之前版本,默認手工創建的ext4文件系統無ACL功能。需手動增加:
tune2fs –o acl/dev/sdb1
mount –o acl/dev/sdb1 /mnt
ACL生效順序:所有者,自定義用戶,自定義組,其他人
setfacl設置文件的ACL權限
-m :修改后續的acl參數給文件使用 u:USERNAME:權限 filename
-x: 刪除后續的參數 u:USERNAME
-b:刪除所有的acl設置參數
-k:刪除默認的acl參數
-R:遞歸設置acl
-d:設置默認的acl參數,只對目錄有效。
–set選項會把原有的ACL項都刪除,用新的替代,需要注意的是一定要包含UGO的設置,不能象 -m一樣只是添加ACL就可以.如:
setfacl –set u::rw,u:wang:rw,g::r,o::-file1
遞歸創建ACL權限:
setfacl -Rm g:GROUP:rwX directory
對目錄下新建的文件繼承目錄ACL權限:
setfacl -m d:u:USER:rx directory
setfacl-k dir 刪除默認ACL權限
setfacl -b file1清除所有ACL權限
getfacl:查看文件的acl權限
參數基本和setfacl相同
getfacl file1 | setfacl –set-file=- file2 復制file1的acl權限給file2
批量修改acl權限:
1、編輯一個文件,
格式: u:USERNAME:權限
g:GROUPNAME:權限
2、setfacl -M file.acl file|directory
批量刪除acl權限:
1、編輯一個文件
格式:u:username
g : groupname
2、setfacl -X file.acl file|directory
ACL文件上的group權限是mask 值(自定義用戶,自定義組,擁有組的最大權限),而非傳統的組權限
getfacl可看到特殊權限:flags
默認ACL權限給了x,文件也不會繼承x權限。
mask權限:
mask權限惡意理解為“有效權限”的意思,它的意思為用戶或組所設置的權限必須要存在于mask的權限范圍內才會生效。
mask只影響除所有者和other的之外的人和組的最大權限,mask需要與用戶的權限進行邏輯與運算后,才能變成有限的權限(Effective Permission)
設置mask值
setfacl-m mask::rx file
前文曾提到umask,那么和這個mask有什么區別呢?
umask:是在設置初始文件時賦予它們默認的權限,是做 “減法”,通過文件的最大權限減去umask的值就是文件初始的權限的值。也可以叫做權限的“補碼”。
而acl中的mask值,是針對特定的對象,設置一個硬性的標準,針對的對象所有權限不能超過mask權限。 umask與mask相同點就是都是對權限進行限制。不同點就是umask是文件權限的“補碼”,而mask是針對對象的權限最大值。
備份和恢復ACL
有時備份或轉移文件時,文件會丟失ACL權限,而主要的文件操作命令cp和mv都支持ACL,只是cp命令需要加上-p 參數。但是tar等常見的備份工具是不會保留目錄和文件的ACL信息。這是就需要先將文件的acl屬性保存至一個文件,備份文件后,在用保存的屬性文件恢復本份文件的acl權限。
#getfacl -R /tmp/dir1 > acl.txt
#setfacl -R -b /tmp/dir1
#setfacl -R –set-file=acl.txt /tmp/dir1
#getfacl -R /tmp/dir1
例:
在/data/testdir里創建的新文件自動屬于g1組,組g2的成員如:user2能對這些新文件有讀寫權限,組g3的成員如:user3只能對新文件有讀權限,其它用戶(不屬于g1,g2,g3)不能訪問這個文件夾。
1、將文件的屬組更改為g1,
·# chgrp g1 /data/testdir/
2、將文件加上SGID權限,其他人權限為0
·#chmod 2770 /data/testdir/
3、設置acl權限
·#setfacl -m g:g2:rwx /data/testdir/
·#setfacl -m g:g3:rx /data/testdir/
·#setfacl -m d:g:g2:rw /data/testdir/
·# setfacl -m d:g:g3:r /data/testdir/
目錄的acl權限:
目錄下新建文件的acl權限
user2可以讀寫:
user3只有寫權限:
其他人不能訪問文件夾:
原創文章,作者:Groot,如若轉載,請注明出處:http://www.www58058.com/29029
寫的很好,對特殊權限的用法和應用場景有了不錯的了解。但是為什么文章中會有損壞的文件?這需要自己找找原因了。