一文帶你徹底搞懂Linux 文件權限管理

Linux下文件/目錄的權限和歸屬

訪問權限


  • 讀取(r): 允許查看文件內容,顯示目錄列表
  • 寫入(w): 允許修改文件內容,允許在目錄中新建、刪除、移動文件或者子目錄
  • 可執行(x): 允許運行程序,切換目錄
  • 無權限(-): 沒有權限

權限介紹

- rw-r–r-- . 1 root root 1258 Jun 3 2019 initial-setup-ks.cfg
d rwxr-xr-x . 2 root root 6 Jun 3 2019 Music

- 代表普通文件
d 代表目錄
c 代表字符型文件
l 代表鏈接文件
rwx r-x r-x root root
屬主權限 屬組權限 其他人權限 屬主 屬組
權限項 執行 執行 執行
字符表示 r w x r w x r w x
數字表示 4 2 1 4 2 1 4 2 1
權限分配 文件所有者(屬主) 文件所有者(屬主) 文件所有者(屬主) 文件所屬組(屬組) 文件所屬組(屬組) 文件所屬組(屬組) 其他用戶 其他用戶 其他用戶
r w - r - - r - -
4 2 0 4 0 0 4 0 0
  • 這個文件權限就是 6 4 4

權限修改


  • 格式一:

    • chmod [ugoa][±=][rwx] 文件/目錄

      • u,g,o,a 分別代表 屬主,數組,其他用戶,所有用戶
      • +,-,= 分別代表 增加,減去,設置一個權限
    • ex:

        [root@localhost ~]# touch /root/a.txt
        [root@localhost ~]# ls a.txt -l
        -rw-r--r--. 1 root root 0 May 21 05:56 a.txt
        [root@localhost ~]# chmod g+w,o+w /root/a.txt 
        [root@localhost ~]# ls a.txt -l
        -rw-rw-rw-. 1 root root 0 May 21 05:56 a.txt
      
  • 格式二

    • chmod nnn(三位八進制數) 文件/目錄

    • ex:

        [root@localhost ~]# chmod 644 /root/a.txt 
        [root@localhost ~]# ls a.txt -l
        -rw-r--r--. 1 root root 0 May 21 05:56 a.txt
      
  • 常用選項

    • -R 遞歸修改指定目錄下所有文件或子目錄的權限

歸屬(所有權)


  • 屬主: 擁有該文件或目錄的用戶賬號
  • 屬組: 擁有該文件或目錄的組賬號

權限修改


  • 格式:

    • chown 屬主 文件/目錄
    • chown :屬組 文件/目錄
    • chown 屬主:屬組 文件/目錄
  • 常用選項

    • -R: 遞歸修改指定目錄下所有文件或子目錄的歸屬權限

    • ex:

        [root@localhost ~]# chown tom a.txt 
        [root@localhost ~]# chown :manager a.txt
        [root@localhost ~]# ls a.txt -l
        -rw-r--r--. 1 tom manager 0 May 21 05:56 a.txt
        [root@localhost ~]# chown root:root a.txt 
        [root@localhost ~]# ls a.txt -l
        -rw-r--r--. 1 root root 0 May 21 05:56 a.txt
        [root@localhost ~]# 
      

練習題-01


  • 新建文件 /root/bb.txt,屬主爲 harry,屬組爲manager,屬主可以讀寫執行,屬組可以讀寫執行,其他人只讀

      [root@localhost ~]# touch /root/bb.txt
      [root@localhost ~]# useradd harry
      [root@localhost ~]# groupadd manager
      [root@localhost ~]# chown harry:manager /root/bb.txt
      [root@localhost ~]# chmod 774 /root/bb.txt
      [root@localhost ~]# ls bb.txt -l
      -rwxrwxr--. 1 harry manager 0 May 21 10:40 bb.txt
    
  • 新需求

    • 設置susa用戶對文件擁有讀和執行權限

    • 設置group組內的成員對文件擁有讀的權限

    • 此需求根據上面知識無法解決,需要設置 ACL 權限

        [root@localhost ~]# useradd susa
        [root@localhost ~]# setfacl -m u:susa:rw bb.txt 
        [root@localhost ~]# getfacl bb.txt 
        # file: bb.txt
        # owner: harry
        # group: manager
        user::rwx
        user:susa:rw-
        group::rwx
        mask::rwx
        other::r--
        [root@localhost ~]# groupadd group
        [root@localhost ~]# setfacl -m g:group:r bb.txt 
        [root@localhost ~]# getfacl bb.txt 
        # file: bb.txt
        # owner: harry
        # group: manager
        user::rwx
        user:susa:rw-
        group::rwx
        group:group:r--
        mask::rwx
        other::r--
      

ACL權限


  • ACL(Access Control List),主要目錄是在提供傳統的owner,group,otherd的read,write,execute權限之外細部權限設頂

  • ACL 可以針對單一使用者,或者單一文件/目錄進行r,w,x的權限使用規範

  • 設置ACL

      setfacl -m u:username:rwx filename
      	u: 屬主
      	username: 用戶名稱
      	rwx: 權限
      	filename: 文件
      setfacl -m g:groupname:rwx filename
      	g: 屬組
      	groupname: 組名稱
      查看
      	getfacl filename
      刪除
      	setfacl -x u:username filename
    
    
      刪除用戶權限
      	[root@localhost ~]# setfacl -m u:susa:rw a.txt 
      	[root@localhost ~]# getfacl a.txt 
      	# file: a.txt
      	# owner: root
      	# group: root
      	user::rw-
      	user:susa:rw-
      	group::r--
      	mask::rw-
      	other::r--
      	[root@localhost ~]# setfacl -x u:susa a.txt 
      	[root@localhost ~]# getfacl a.txt 
      	# file: a.txt
      	# owner: root
      	# group: root
      	user::rw-
      	group::r--
      	mask::r--
      	other::r--
    
      刪除組權限
      	[root@localhost ~]# setfacl -m g:group:r a.txt 
      	[root@localhost ~]# getfacl a.txt 
      	# file: a.txt
      	# owner: root
      	# group: root
      	user::rw-
      	group::r--
      	group:group:r--
      	mask::r--
      	other::r--
      	
      	[root@localhost ~]# setfacl -x g:group a.txt 
      	[root@localhost ~]# getfacl a.txt 
      	# file: a.txt
      	# owner: root
      	# group: root
      	user::rw-
      	group::r--
      	mask::r--
      	other::r--
    

練習題-02


  • 拷貝文件 /etc/fstab到 /var/tmp/fstab,配置文件 /var/tmp/fstab的權限
    • 文件 /var/tmp/fstab的擁有者是root用戶

    • 文件 /var/tmp/fstab屬於root組

    • 文件 /var/tmp/fstab對任何人都不可執行

    • 用戶natasha 能夠對文件 /var/tmp/fstab執行讀和寫操作

    • 用戶harry 對文件 /var/tmp/fstab既不能讀,也不能寫

    • 所有其他用戶(當前的和將來的)能夠對文件 /var/tmp/fstab進行讀操作

        [root@localhost ~]# useradd harry
        [root@localhost ~]# useradd natasha
        [root@localhost ~]# cp /etc/fstab /var/tmp/fstab
        [root@localhost ~]# cd /var/tmp/
        [root@localhost tmp]# ls fstab -l
        -rw-r--r--. 1 root root 465 May 21 11:09 fstab
        [root@localhost tmp]# setfacl -m u:natasha:rw fstab 
        [root@localhost tmp]# setfacl -m u:harry:-- fstab 
        [root@localhost tmp]# getfacl fstab 
        # file: fstab
        # owner: root
        # group: root
        user::rw-
        user:harry:---
        user:natasha:rw-
        group::r--
        mask::rw-
        other::r--
      

特殊權限

  • umask 反掩碼 0022 權限的一種補碼 777-022=755

      # root身份默認權限
      [root@localhost ~]# mkdir root_dir
      [root@localhost ~]# touch root_file
      drwxr-xr-x. 2 root root     6 May 22 08:46 root_dir 755
      -rw-r--r--. 1 root root     0 May 22 08:46 root_file 644
    
      # 普通用戶身份默認權限
      [ruochen@localhost ~]$ touch ruochen_file
      [ruochen@localhost ~]$ mkdir ruochen_dir
      drwxrwxr-x. 2 ruochen ruochen 6 May 22 08:49 ruochen_dir 775
      -rw-rw-r--. 1 ruochen ruochen 0 May 22 08:49 ruochen_file 664
    
      [root@localhost ~]# umask 0
      [root@localhost ~]# umask
      0000
      [root@localhost ~]# touch new_file
      [root@localhost ~]# mkdir new_dir
      drwxrwxrwx. 2 root root     6 May 22 08:55 new_dir
      -rw-rw-rw-. 1 root root     0 May 22 08:55 new_file
    

附加權限

SET位權限


  • SUID:

    • 爲可執行文件設置(文件具有x位權限),

    • 權限標識字符: ‘s’ u+s 4 4***

    • 當執行這個可執行文件時,調用該文件的屬主的身份執行

        [root@localhost ~]# ll /etc/shadow
        ----------. 1 root root 1585 May 22 07:33 /etc/shadow
      
    • shadow/\color{red}爲什麼shadow 文件無權限,普通用戶還能登錄/修改密碼?

    • 我們先拿一個 ping 命令來舉例,先將 /bin/ping 拷貝到 /home/ruochen 這個用戶下,然後執行 /home/ruochen/ping 127.0.0.1 看看會發生什麼?

        [ruochen@localhost ~]$ /home/ruochen/ping 127.0.0.1
        ping: icmp open socket: Operation not permitted
      
    • 顯然,沒有權限。那麼我們如果給他設置 SUID 權限會怎麼樣?

        [root@localhost ~]# chmod u+s /home/ruochen/ping
      
    • 現在再來執行

        [ruochen@localhost ~]$ /home/ruochen/ping 127.0.0.1
        PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
        64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.019 ms
        64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.069 ms
      
    • 顯然,現在可執行。

    • SUID\color{red}由此,我們可以看出SUID權限的作用/\color{red}也就能解釋前面所說的普通用戶登錄/修改密碼問題

  • SGID: 老鼠的兒子會打洞 2***

    • 一般設置在目錄上,這時候在該目錄下新建的文件/目錄自動繼承父目錄的屬組

    • 我們先在ruochen 用戶下新建一個文件夾和一個文件

        [ruochen@localhost ~]$ mkdir sgid_dir
        [ruochen@localhost ~]$ cd sgid_dir/
        [ruochen@localhost sgid_dir]$ touch ruochen.txt
      
    • 然後,我們在root 用戶下,切換到/home/ruochen/sgid_dir 目錄下,新建一個 root.txt 文件

        [root@localhost ~]# cd /home/ruochen/sgid_dir/
        [root@localhost sgid_dir]# touch root.txt
      
    • 然後,我們給剛纔新建的目錄加一個 sgid 權限

        [root@localhost ruochen]# chmod g+s sgid_dir/
      
    • 在root 用戶下,在 sgid_dir 文件夾中繼續新建一個目錄

        [root@localhost sgid_dir]# mkdir root_dir
        [root@localhost sgid_dir]# ll
        total 0
        drwxr-sr-x. 2 root    ruochen 6 May 22 09:37 root_dir
        -rw-r--r--. 1 root    root    0 May 22 09:32 root.txt
        -rw-rw-r--. 1 ruochen ruochen 0 May 22 09:30 ruochen.txt
      
    • 這時,我們發現 root_dirrootruochen\color{red}root\_dir 的屬組不是root,而是 ruochen,我們看一下 root_dir 父目錄的屬組

        [root@localhost sgid_dir]# cd ..
        [root@localhost ruochen]# ll
        total 0
        drwxrwxr-x. 2 ruochen ruochen  6 May 22 08:49 ruochen_dir
        -rw-rw-r--. 1 ruochen ruochen  0 May 22 08:49 ruochen_file
        drwxrwsr-x. 3 ruochen ruochen 54 May 22 09:37 sgid_dir
      
    • 由此,我們可看出 sgid 權限的作用,也即 \color{red}“老鼠的兒子會打洞”

粘滯位權限(Sticky)


  • 爲公共目錄設置(777), 標識爲 ‘t’

  • 1***

  • 用戶不能刪除其目錄中其他用戶的文件

  • /tmp, /var/tmp

      drwxrwxrwt.  17 root  root  4096 May 22 09:42 tmp
    
    • 在roor 用戶下新建一個 /test 目錄

        [root@localhost ~]# mkdir /test
        drwxr-xr-x.   2 root  root     6 May 22 09:50 test
      
    • 將其權限改爲 777,並在目錄下新建一個 root.txt 文件

        [root@localhost ~]# chmod 777 /test/
        drwxrwxrwx.   2 root  root     6 May 22 09:50 test
        [root@localhost test]# touch root.txt
      
    • 然後我們切換到 ruochen 用戶,發現可以切換到 /test 目錄,也能創建和查看文件

        [ruochen@localhost share]$ cd /test/
        [ruochen@localhost test]$ touch ruochen.txt
        [ruochen@localhost test]$ ll
        total 0
        -rw-r--r--. 1 root    root    0 May 22 09:53 root.txt
        -rw-rw-r--. 1 ruochen ruochen 0 May 22 09:54 ruochen.txt
      
    • 我們嘗試在ruochen 用戶下,刪除 /test 目錄中的文件

        [ruochen@localhost test]$ rm -rf root.txt
        [ruochen@localhost test]$ ll
        total 0
        -rw-rw-r--. 1 ruochen ruochen 0 May 22 09:54 ruochen.txt
        **[ruochen@localhost test]$ rm -rf ruochen.txt 
        [ruochen@localhost test]$ ll
        total 0
      
    • 我們發現 ruochen 用戶可以把裏面所有的文件都刪除,這樣,\color{red}共享文件就可以被隨意刪除,這是不可以的, 這時,\color{red}粘滯位權限就派上用場了,其可以防止用戶刪除其他用戶的文件

    • 我們在root 用戶下,給 /test/ 目錄加一個粘滯位權限,然後在該目錄下新建一個 root.txt 文件

        [root@localhost ~]# chmod o+t /test/
        [root@localhost test]# touch root.txt
      
    • 我們再次嘗試在 ruochen 用戶下刪除 root.txt 文件

        [ruochen@localhost test]$ rm -rf root.txt 
        rm: cannot remove ‘root.txt’: Operation not permitted
      
    • 發現刪除被拒絕,這樣,我們就可以理解粘滯位權限了

練習題-03


  • 創建一個共享目錄 /home/cnrts, 特性如下
    • /home/cnrts 目錄的組所有權是 manager

    • manager組的成員對目錄有讀寫和執行的權限,除此之外的其他所有用戶沒有任何權限(root用戶能夠訪問系統中的所有文件和目錄)

    • 在/home/cnrts 目錄中創建文件,其組所有權會自動設置爲屬於manager組

        [root@localhost ~]# mkdir /home/cnrts
        [root@localhost ~]# groupadd manager
        [root@localhost ~]# chown :manager /home/cnrts/
        [root@localhost ~]# chmod 2770 /home/cnrts/
      
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章