理解Linux文件權限

0x00 概述

Linux文件權限是用來管理所有用戶使用文件的程度。而設置權限的目的是為了方便管理者保護文件以及確保用戶只能使用自己有權限的文件。

0x01 Ownership of Linux files

使用者(User or Owner)

文件的持有人。在預設下,文件的作者會是文件的擁有人也等同於使用者。

用戶所在群组(Group)

群組裡面可存在多個用戶。處於同一個群組裡面的所有用戶會具有相同的文件訪問權限。你可以把用戶加進同一個群組,然後再把文件權限交給此群組,這樣群裡的每個用戶都能有相同的訪問權限。

其他人(Other)

不屬於User和Group的使用者就是所謂的其他人。

0x02 文件屬性

ls -al能用來查看文件的權限。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@study ~]# ls -al
total 48
dr-xr-x---. 5 root root 4096 May 29 16:08 .
dr-xr-xr-x. 17 root root 4096 May 4 17:56 ..
-rw-------. 1 root root 1816 May 4 17:57 anaconda-ks.cfg
-rw-------. 1 root root 927 Jun 2 11:27 .bash_history
-rw-r--r--. 1 root root 18 Dec 29 2013 .bash_logout
-rw-r--r--. 1 root root 176 Dec 29 2013 .bash_profile
-rw-r--r--. 1 root root 176 Dec 29 2013 .bashrc
drwxr-xr-x. 3 root root 17 May 6 00:14 .config <=範例說明處
drwx------. 3 root root 24 May 4 17:59 .dbus
-rw-r--r--. 1 root root 1864 May 4 18:01 initial-setup-ks.cfg <=範例說明處
[ 1 ][ 2 ][ 3 ][ 4 ][ 5 ][ 6 ] [ 7 ]
[ 文件種類 ][連結][擁有者][群組][文件容量][ 修改日期 ] [ 文件名 ]

當指令執行後,可以看到文件的屬性有7個欄位。下圖為7個欄位代表的意思。

第一欄位:文件種類以及權限

第一個字元的意義

  • d 為目錄(Directory)。
  • - 為一般文件。
  • l 為鏈接文件(Link file)。
  • b 為區塊(block)文件, 儲存數據, 以提供系統隨機存取的介面設備。
  • c 為字元(character)設備文件, 一些串列埠的介面設備, 例如鍵盤、滑鼠(一次性讀取裝置)。
  • s 為數據介面文件(sockets), 通常被用在網路上的數據傳輸。
  • f 為數據輸送文件(FIFO, pipe), 解決多個程序同時存取一個文件所造成的錯誤問題。

接下來的字元意義【權限】

接下來的字元中,以三個為一組,且均為『rwx』的三個參數的組合。

  • r代表可讀(read)。
  • w代表可寫(write)。
  • x代表可執行(execute)。

附錄:三個權限的位置不會改變,如果沒有權限,就會出現減號[ - ]作為代表。

三組代表的含義

  • 第一組為『文件擁有者可具備的權限』。
  • 第二組為『加入此群組帳號的權限』。
  • 第三組為『非本人且沒有加入本群組之其他帳號的權限』。

第二欄位:節點(i-node)

不重要先跳過。

關於I-note的筆記
自我提醒需看Linux磁碟與檔案系統管理

0x03 改變文件的屬性和權限

常用指令有三個:

  • chmod:改變文件權限
  • chown:改變文件擁有者
  • chgrp:改變文件所屬的群組

chmod

Change access permissions, change mode.

格式如下:
chmod [-cfvR] [--help] [--version] mode file

參數列表:

  • -c : 若權限確實已經更改,才顯示其更改動作。
  • -f : 若權限無法被更改也不要顯示錯誤的信息。
  • -v : 顯示權限變更的詳細資料。
  • -R : 對目前目錄下的所有檔案和子目錄進行相同的權限變更。

設置文字權限方式:

  • 數字方式
  • 字符方式

數字方式

在設置權限時,你可以使用數字來代表不同的權限。權限的數字對照表如下:

  • r:4 Read
  • w:2 Write
  • x:1 Execute

例子

  • chmod 400 file 文件file只能讓Owner讀取。
  • chmod 777 file 文件file能讓Owner,Group,以及Others讀取,寫入以及執行。 【7=4+2+1】

字符方式

這種方式比較容易一眼看的明白所設置的權限。

Operator的用途:

Operator Description
+ Adds a permission to a file or directory
- Removes the permission
= Sets the permission and overrides the permissions set earlier.

例子

  • chmod a-x file 全部用戶不能執行file。
  • chmod a+r file 全部用戶只能讀取file。
  • chmod go+rw file Others和Group可以讀取和寫入文件file。
  • chmod u+x myscript.sh 只有Owner可以執行mycript.sh。
  • chmod =rwx,g+s file 全部用戶都可以讀取,寫入和執行以及使用Group的ID。

chown

Change owner, change the user and/or group ownership of each given File to a new Owner.Chown can also change the ownership of a file to match the user/group of an existing reference file.

格式如下:

  • chown [Options] NewOwner File
  • chown [Options] Group File
  • chown [Options] reference=RFILE File

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@study ~]# chown [-R] 帳號名稱 檔案或目錄
[root@study ~]# chown [-R] 帳號名稱:群組名稱 檔案或目錄
選項與參數:
-R : 進行遞迴(recursive)的持續變更,亦即連同次目錄下的所有檔案都變更

範例:將 initial-setup-ks.cfg 的擁有者改為bin這個帳號:
[root@study ~]# chown bin initial-setup-ks.cfg
[root@study ~]# ls -l
-rw-r--r--. 1 bin users 1864 May 4 18:01 initial-setup-ks.cfg

範例:將 initial-setup-ks.cfg 的擁有者與群組改回為root
[root@study ~]# chown root:root initial-setup-ks.cfg
[root@study ~]# ls -l
-rw-r--r--. 1 root root 1864 May 4 18:01 initial-setup-ks.cfg

chgrp

Change group ownership.’chgrp’ changes the group ownership of each given File to Group (which can be either a group name or a numeric group id) or to match the same group as an existing reference file.

格式如下
chgrp [Options] {Group | --reference=File} File

例子:

1
2
3
4
把initial-etup-ks.cfg 的群組改成users。
[root@study ~]# chgrp users initial-setup-ks.cfg
[root@study ~]# ls -l
-rw-r--r--. 1 root users 1864 May 4 18:01 initial-setup-ks.cfg

0x04 文件的特殊權限

除了之前的rwx權限,對於文件以及目錄還能用特殊權限來彌補之前三個權限的缺陷。特殊權限一共有3種:SUID(Set user ID),SGID (Set group ID)以及Sticky Bit。

SUID

SUID(Set owner User ID up on execution)通常用在程序執行時,給予用戶提供臨時的權限,以便用戶能使用該文件擁有者的權限去運行程序或文件。

SUID的基本限制與功能:

  • SUID 權限僅對二進位程式(binary program)有效。
  • 執行者對於該程式需要具備可執行x的權限。
  • 只在執行過程中有效(run-time)。
  • 執行者將具有該程式擁有者(owner)的權限。
  • 4為其代表數字,

特殊權限的表示:

1
2
3
$ ls -l /usr/bin/chsh /etc/passwd ←列出〝/usr/bin/chsh〞和〝/etc/passwd〞文件資訊。
-rw-r--r-- 1 root root 1783 2015-07-21 16:58 /etc/passwd
-rws--x--x 1 root root 14472 2007-10-17 04:48 /usr/bin/chsh ←注意看,擁有者權限的〝小s〞就是SUID。

更換SUID:

  • 數字方法 chmod 4755 filename
  • 字符方法 chmod g+s filename

SGID

SGID(Set Group ID up on execution)通常用在程序執行或者目錄時,給予用戶臨時權限,能讓該用戶為該群組的成員之一。此外,用戶也能使用擁有文件群組的權限來執行該程序。

SGID的基本限制與功能:

  • SGID 對二進位程式有用。
  • 程式執行者對於該程式來說,需具備可執行x的權限。
  • 執行者在執行的過程中將會獲得該程式群組的支援!
  • 2為其代表數字。

用在目錄上的功能:

  • 使用者若對於該目錄具有rx的權限時,該使用者能夠進入此目錄。
  • 使用者對該目錄下的有效群組(effective group)將會變成該目錄的群組。
  • 用途:假如使用者在該目錄下具有w的權限(可以新建文件),則使用者所建立的新文件的群組也會與此目錄的群組相同。

特殊權限的表示:

1
2
$ ls -l /usr/bin/wall
-r-xr-sr-x 1 root tty 10712 2007-10-11 03:54 /usr/bin/wall ←注意觀察,群組為tty,但權限的〝x〞變成了〝小s〞,也就是SGID。

更換SUID:

  • 數字方法 chmod 2750 filename
  • 字符方法 chmod g+s filename

應用在目錄的詳細例子:
在我的Linux系統裡面,擁有ning和yan這兩個帳號。這兩個帳戶都同時支持自己以及project群組。現在我需要令到這兩個用戶需要共同擁有 /foryou/lovestory/ 目錄的開發權,且此目錄不能讓其他人進行查閱。

第一步:我會先設好這兩個帳戶的資料。

1
2
3
4
5
6
7
[root@Milo ~]# groupadd project        <==增加新的群組
[root@Milo ~]# useradd -G project ning <==建立ning帳號,且支援project
[root@Milo ~]# useradd -G project yan <==建立yan帳號,且支援project
[root@Milo ~]# id ning <==查閱ning帳號的屬性
uid=1001(ning) gid=1002(ning) groups=1002(ning),1001(project) <==確實有支援!
[root@Milo ~]# id arod
uid=1002(yan) gid=1003(yan) groups=1003(yan),1001(project) <==確實有支援!

第二步:建立目錄

1
2
3
[root@Milo ~]# mkdir /foryou/lovestory
[root@Milo ~]# ll -d /foryou/lovestory
drwxr-xr-x. 2 root root 12 March 18 00:22 /foryou/lovestory

第三步:開始設置SUID權限

1
2
3
4
[root@Milo ~]# chgrp project /foryou/lovestory
[root@Milo ~]# chmod 2770 /foryou/lovestory <== 在第一個位置那裡輸入其SGID代表數字2。
[root@Milo ~]# ll -d /foryou/lovestory
drwxrws---. 2 root project 12 March 18 00:25 /foryou/lovestory <==可以看到設置後2個帳戶都可以在此目錄建立新文件了。

Sticky Bit

特殊權限的混合應用

Unmask

目標: Linux File 權限
小目標:特殊權限

Sticky Bit
1.用在Owner對目錄有W,x權限時。
2.在該目錄建立文件或者目錄時,只有自己和Root才有權利
刪除該文件。

例子
Noel - 對於目錄A有群組和其他人的身份,且擁有對該目錄A的寫入權限。
他能對目錄內任何人建立的目錄以及文件均可進行刪除/換名或者搬遷等動作,但只要加了SBIT,Noel就只能對自己建立的檔案或目錄進行刪除/換名或者搬遷移動等動作,而無法刪除他人的檔案。

未完待續

0%