1. 程式人生 > >Linux文件系統權限

Linux文件系統權限

protected 刪除文件 mis chmod u+s groupadd 設置 對比 即使 ACL設置

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文件系統權限