Linux文件系統權限
一、屬主、屬組
在linux文件系統中,用戶如果要對文件進行操作,首先要對文件的權限進行檢查,先判斷用戶是否是此文件的屬主如果是則執行屬主權限,如果不是那就查看該用戶是否是該文件屬組內的用戶,如果是則執行屬組權限,如果不是執行other權限。
二、文件和目錄的讀寫執行
1. 文件的讀、寫、執行
文件能否讀寫取決於用戶對文件是否有讀寫執行權限。
用戶有對文件讀權限則可以訪問此文件,查看文件內的內容,但無法對內容進行修改
示例:
[root@centos7 data]# echo hello world > a [root@centos7 data]# cat a hello world [root@centos7 data]# chmod 004 a [root@centos7 data]# ll total 4 -------r-- 1 root root 12 Mar 14 23:20 a [root@centos7 data]# su masuri [masuri@centos7 data]$ ll total 4 -------r-- 1 root root 12 Mar 14 23:20 a [masuri@centos7 data]$ cat a hello world [masuri@centos7 data]$ echo hello word >a bash: a: Permission denied
用戶有對文件寫權限則可以對此文件的內容進行修改,如果用戶只有寫權限,則無法查看內部容,但可以修改其內部的內容。
示例:
[root@centos7 data]# chmod 002 a [root@centos7 data]# cat a hello world [root@centos7 data]# ls a a [root@centos7 data]# ll a --------w- 1 root root 12 Mar 14 23:20 a [root@centos7 data]# su masuri [masuri@centos7 data]$ cat a cat: a: Permission denied [masuri@centos7 data]$ echo abc >> a [masuri@centos7 data]$ exit exit [root@centos7 data]# cat a hello world abc
註意:用戶有對文件的執行權限則可以將文件進行執行,此類操作非常危險。一般文件不建議有執行權限。
2.目錄的讀寫執行
目錄的讀權限:
目錄有讀權限則表示用戶可以查看目錄,可以復制目錄,但無法對目錄內的文件進行操作,若要對目錄內的文件進行操作則必須要有執行權限
示例1:只有讀權限沒有執行權限時
[root@centos7 data]# mkdir -m 004 test [root@centos7 data]# echo hello world > test/a [root@centos7 data]# su masuri [masuri@centos7 data]$ ls test ls: cannot access test/a: Permission denied 沒有執行權限無法查看文件 a [masuri@centos7 data]$ cp -R test test2 cp: cannot stat ‘test/a’: Permission denied 沒有執行權限無法復制目錄下的內容只能復制目錄本身 [masuri@centos7 data]$ ll total 0 d------r-- 2 root root 15 Mar 14 23:37 test d------r-- 2 masuri masuri 6 Mar 14 23:49 test2 [masuri@centos7 data]$ rm test/a rm: cannot remove ‘test/a’: Permission denied 沒有寫和執行無法刪除文件
示例2:有讀和執行權限
[root@centos7 data]# chmod 005 test
[root@centos7 data]# ll test -d
d------r-x 2 root root 15 Mar 14 23:37 test
[root@centos7 data]# su masuri
[masuri@centos7 data]$ cp -R test test3 可復制
[masuri@centos7 data]$ ls
test test2 test3
[masuri@centos7 data]$ ls test
a
[masuri@centos7 data]$ cat test/a
hello world
[masuri@centos7 data]$ rm test/a
rm: remove write-protected regular file ‘test/a’? y
rm: cannot remove ‘test/a’: Permission denied 無法刪除
目錄的寫權限:
當目錄只有寫權限時,無法對目錄下的文件執行任何操作。若要能實現對目錄下的文件進行操作,必須要有執行權限
示例:
1.只有寫權限
[root@centos7 data]# mkdir -m 002 test
[root@centos7 data]# echo helloworld > test/a
[root@centos7 data]# ll
total 0
d-------w- 2 root root 15 Mar 15 00:10 test
[root@centos7 data]# su masuri
[masuri@centos7 data]$ echo hello > test/a
bash: test/a: Permission denied
[masuri@centos7 data]$ ls test
ls: cannot open directory test: Permission denied
[masuri@centos7 data]$ ls test/a
ls: cannot access test/a: Permission denied
2.有寫和執行時
[root@centos7 data]# chmod 003 test
[root@centos7 data]# ll -d test
d-------wx 2 root root 15 Mar 15 00:10 test
[root@centos7 data]# ls test
a
[root@centos7 data]# su masuri
[masuri@centos7 data]$ ls test
ls: cannot open directory test: Permission denied 沒有讀權限無法查看
[masuri@centos7 data]$ echo hello > test/b 好像可以寫入?
[masuri@centos7 data]$ rm test/a 要想也可以刪除?
rm: remove write-protected regular file ‘test/a’? y
[masuri@centos7 data]$ exit 轉回root看結果。
exit
[root@centos7 data]# ls
test
[root@centos7 data]# ls test\ 原來的按文件被刪除
b
[root@centos7 data]# cat b
cat: b: No such file or directory
[root@centos7 data]# cat test/b b文件內為剛才寫入的數據
hello
總結:目錄的執行權限非常重要,沒有執行權,即使有目錄的讀寫權限也無法對目錄下的文件進行操作。
3.chmod中大寫X的意義
當對目錄遞歸施加大X時,其下的所有目錄自動添加執行權限,但文件不會添加
但若文件原本有執行權限時,則會為其添加執行權限
示例:
[root@centos7 data]# mkdir testdir
[root@centos7 data]# cd testdir
[root@centos7 testdir]# touch a b 創建a b兩個文件
[root@centos7 testdir]# chmod 100 a 修改權限a為可執行
[root@centos7 testdir]# chmod 000 b 修改權限b為什麽都沒有
[root@centos7 testdir]# mkdir -m 000 dir 創建一個dir目錄並設置權限為000
[root@centos7 testdir]# ll
total 0
---x------ 1 root root 0 Mar 15 00:48 a
---------- 1 root root 0 Mar 15 00:48 b
d--------- 2 root root 6 Mar 15 00:48 dir
[root@centos7 testdir]# cd ..
[root@centos7 data]# chmod -R a+X testdir 對testdir目錄遞歸設置大X權限
[root@centos7 data]# cd testdir/
[root@centos7 testdir]# ll
total 0
---x--x--x 1 root root 0 Mar 15 00:48 a 對比上面當文件有執行權限時全部都加了執行權限
---------- 1 root root 0 Mar 15 00:48 b 當文件沒有執行權限時則不添加
d--x--x--x 2 root root 6 Mar 15 00:48 dir
三、特殊權限位
SUID:
作用在二進制程序上,當用戶執行該程序時,運行該程序的身份為該程序的屬主而非用戶自身
示例:
[root@centos7 data]# su masuri
[masuri@centos7 data]$ ll `which cat` 此時suid沒有修改
-rwxr-xr-x. 1 root root 54160 Oct 31 03:16 /usr/bin/cat
[masuri@centos7 data]$ cat /etc/shadow shadow文件無法訪問
cat: /etc/shadow: Permission denied
[masuri@centos7 data]$ exit
exit
[root@centos7 data]# chmod u+s `which cat` 修改suid
[root@centos7 data]# ll `which cat`
-rwsr-xr-x. 1 root root 54160 Oct 31 03:16 /usr/bin/cat
[masuri@centos7 data]$ cat /etc/shadow 此時shadow文件可以訪問
root:$6$FBXKJJRgWCz23UDt$ji24UW5dVeYK55JOkBzBbmXaSGKAwhM1sjY9rg3TguL1GaTEmrlSzbDYNIu7p57/hehYEIE3LYLMHv2IqxIb70::0:99999:7:::
bin:*:17834:0:99999:7:::
daemon:*:17834:0:99999:7:::
adm:*:17834:0:99999:7:::
lp:*:17834:0:99999:7:::
SGID:
作用在目錄上,當用戶在擁有SGID權限的目錄下創建文件時,該文件的屬組自動變為該目錄的屬組。
示例:
[root@centos7 data]# groupadd wang
[root@centos7 data]# mkdir testdir
[root@centos7 data]# chown .wang testdir
[root@centos7 data]# ll
total 0
drwxr-xr-x 2 root wang 6 Mar 15 01:01 testdir
[root@centos7 data]# chmod g+s testdir
[root@centos7 data]# touch testdir/{a,b}
[root@centos7 data]# ll testdir/
total 0
-rw-r--r-- 1 root wang 0 Mar 15 01:03 a
-rw-r--r-- 1 root wang 0 Mar 15 01:03 b
STICKY:
作用在目錄上,表示該目錄下創建的文件只有該文件的屬主才能進行刪除。
示例:
[root@centos7 data]# mkdir -m 777 testdir 創建目錄並賦予777的權限
[root@centos7 data]# ll
total 0
drwxrwxrwx 2 root root 6 Mar 15 01:13 testdir
[root@centos7 data]# touch testdir/{a,b} 在目錄下創建a和b兩個文件
[root@centos7 data]# ls testdir/
a b
[root@centos7 data]# su masuri 切換至masuri用戶
[masuri@centos7 data]$ rm -rf testdir/a 此時可以刪除root創建的a文件
[masuri@centos7 data]$ ll testdir/
total 0
-rw-r--r-- 1 root root 0 Mar 15 01:13 b
[masuri@centos7 data]$ exit 切回root
exit
[root@centos7 data]# chmod o+t testdir 對testdir加sticky權限
[root@centos7 data]# su masuri 切回masuri用戶
[masuri@centos7 data]$ touch testdir/a 在testder目錄下添加a文件
[masuri@centos7 data]$ exit
exit
[root@centos7 data]# su wang 切換至wang用戶
[wang@centos7 data]$ touch testdir/c 創建一個c文件
[wang@centos7 data]$ rm testdir/a
rm: remove write-protected regular empty file ‘testdir/a’? y 刪除masuri用戶的a文件
rm: cannot remove ‘testdir/a’: Operation not permitted 無法刪除
[wang@centos7 data]$ rm testdir/c 但是可以刪除自己創建的C文件
[wang@centos7 data]$ ll testdir/
total 0
-rw-rw-r-- 1 masuri masuri 0 Mar 15 01:20 a
-rw-r--r-- 1 root root 0 Mar 15 01:13 b
四、訪問控制列表acl
setfacl:
命令格式:
setfacl [-bkndRLPvh] [{-m|-x} acl_spec] [{-M|-X} acl_file] file ...
setfacl --restore=file
說明: 訪問控制列表給與了文件更加靈活的權限設置,除了文件的所有者,所屬組和其它人,可以對更多的用戶設置權限 |
選項 | 參數 |
---|---|---|
-m | 設置權限 | |
-R | 遞歸 | |
-M | ||
-x | 刪除acl權限 | |
-X file | 參照file 文件刪除acl 權限 | |
-k dir | 刪除默認acl設置權限 | |
-b file | 清空acl權限 |
示例:
1.對用戶設置訪問控制權限
[root@centos7 data]# mkdir testdir
[root@centos7 data]# touch testdir/{a,b}
[root@centos7 data]# setfacl -m u:masuri:--- testdir
[root@centos7 data]# su masuri
[masuri@centos7 data]$ cd testdir
bash: cd: testdir: Permission denied
[masuri@centos7 data]$ ll
total 0
drwxr-xr-x+ 2 root root 24 Mar 15 03:19 testdir
[masuri@centos7 data]$ getfacl testdir
# file: testdir
# owner: root
# group: root
user::rwx
user:masuri:---
group::r-x
mask::r-x
other::r-x
2.備份acl權限和恢復acl權限
[root@centos7 data]# getfacl testdir
# file: testdir
# owner: root
# group: root
user::rwx
user:masuri:---
group::r-x
mask::r-x
other::r-x
[root@centos7 data]# getfacl testdir > acl.txt 讀acl權限保存至文件中
[root@centos7 data]# setfacl -b testdir 清除所有acl權限
[root@centos7 data]# ll
total 4
-rw-r--r-- 1 root root 103 Mar 15 03:24 acl.txt
drwxr-xr-x 2 root root 24 Mar 15 03:19 testdir
[root@centos7 data]# setfacl --restore=acl.txt 從文件中讀取acl權限並設置
[root@centos7 data]# ll
total 4
-rw-r--r-- 1 root root 103 Mar 15 03:24 acl.txt
drwxr-xr-x+ 2 root root 24 Mar 15 03:19 testdir
[root@centos7 data]# getfacl testdir/
# file: testdir/
# owner: root
# group: root
user::rwx
user:masuri:---
group::r-x
mask::r-x
other::r-x
3.mask屬性,mask的作用為限高桿,顯示文件或目錄被讀取時的最高權限。
[root@centos7 data]# mkdir testdir
[root@centos7 data]# ll testdir -d
drwxr-xr-x 2 root root 6 Mar 15 03:35 testdir
[root@centos7 data]# setfacl -m u:masuri:rwx testdir 給masuri設acl權限rwx
[root@centos7 data]# setfacl -m mask::r testdir 設置mask屬性r
[root@centos7 data]# su masuri 切換至masuri
[masuri@centos7 data]$ touch testdir/a 在testdir下創建文件
touch: cannot touch ‘testdir/a’: Permission denied 無法創建
[masuri@centos7 data]$ getfacl testdir
# file: testdir
# owner: root
# group: root
user::rwx
user:masuri:rwx #effective:r-- 最大權限為r
group::r-x #effective:r--
mask::r--
other::r-x
需要註意的事項:
1.復制帶有acl的文件時,需要時用cp -a 或者 -p 參數否則acl屬性會丟失
2.acl的生效順序:所有者,自定義用戶,自定義組,其他人。
五、其他
chattr +i 此命令可以鎖定重要文件防止誤刪,即使為root用戶也無法刪除,無法修改
chattr +a 此命令可以防止文件刪除,可以追加文件
lsattr 查看用chattr所設置的權限。
[root@centos7 ~]# chattr +i a.txt 鎖定a.txt文件
[root@centos7 ~]# lsattr a.txt
----i----------- a.txt
[root@centos7 ~]# rm -rf a.txt 無法刪除
rm: cannot remove ‘a.txt’: Operation not permitted
[root@centos7 ~]# echo lsafjla >a.txt 無法覆蓋
-bash: a.txt: Permission denied
[root@centos7 ~]# chattr -i a.txt 解除鎖定
[root@centos7 ~]# echo hello world > a.txt 可以寫入
[root@centos7 ~]# chattr +a a.txt 鎖定a.txt設置為只能追加
[root@centos7 ~]# echo hello world > a.txt 無法覆蓋文件內容
-bash: a.txt: Operation not permitted
[root@centos7 ~]# echo hello world >> a.txt 可以追加
[root@centos7 ~]# cat a.txt
hello world
hello world
[root@centos7 ~]# lsattr a.txt
-----a---------- a.txt
[root@centos7 ~]# chattr -i a.txt
Linux文件系統權限