首頁 > 軟體

Linux檔案系統許可權範例分析

2020-06-16 16:38:02

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

IT145.com E-mail:sddin#qq.com