更深入地瞭解 Linux 許可權
在 Linux 上檢視檔案許可權時,有時你會看到的不僅僅是普通的 r、w、x 和 -。如何更清晰地瞭解這些字元試圖告訴你什麼以及這些許可權如何工作?
在 Linux 上檢視檔案許可權時,有時你會看到的不僅僅是普通的 r
、w
、x
和 -
。除了在所有者、組和其他中看到 rwx
之外,你可能會看到 s
或者 t
,如下例所示:
drwxrwsrwt
要進一步明確的方法之一是使用 stat
命令檢視許可權。stat
的第四行輸出以八進位制和字串格式顯示檔案許可權:
$ stat /var/mail
File: /var/mail
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: 801h/2049d Inode: 1048833 Links: 2
Access: (3777/drwxrwsrwt) Uid: ( 0/ root) Gid: ( 8/ mail)
Access: 2019-05-21 19:23:15.769746004 -0400
Modify: 2019-05-21 19:03:48.226656344 -0400
Change: 2019-05-21 19:03:48.226656344 -0400
Birth: -
這個輸出提示我們,分配給檔案許可權的位數超過 9 位。事實上,有 12 位。這些額外的三位提供了一種分配超出通常的讀、寫和執行許可權的方法 - 例如,3777
(二進位制 011111111111
)表示使用了兩個額外的設定。
該值的第一個 1
(第二位)表示 SGID(設定 GID),為執行檔案而賦予臨時許可權,或以該關聯組的許可權來使用目錄。
011111111111
^
SGID 將正在使用該檔案的使用者作為該組成員之一而分配臨時許可權。
第二個 1
(第三位)是“粘連”位。它確保只有檔案的所有者能夠刪除或重新命名該檔案或目錄。
011111111111
^
如果許可權是 7777
而不是 3777
,我們知道 SUID(設定 UID)欄位也已設定。
111111111111
^
SUID 將正在使用該檔案的使用者作為檔案擁有者分配臨時許可權。
至於我們上面看到的 /var/mail
目錄,所有使用者都需要訪問,因此需要一些特殊值來提供它。
但現在讓我們更進一步。
特殊許可權位的一個常見用法是使用 passwd
之類的命令。如果檢視 /usr/bin/passwd
檔案,你會注意到 SUID 位已設定,它允許你更改密碼(以及 /etc/shadow
檔案的內容),即使你是以普通(非特權)使用者身份執行,並且對此檔案沒有讀取或寫入許可權。當然,passwd
命令很聰明,不允許你更改其他人的密碼,除非你是以 root 身份執行或使用 sudo
。
$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 63736 Mar 22 14:32 /usr/bin/passwd
$ ls -l /etc/shadow
-rw-r----- 1 root shadow 2195 Apr 22 10:46 /etc/shadow
現在,讓我們看一下使用這些特殊許可權可以做些什麼。
如何分配特殊檔案許可權
與 Linux 命令列中的許多東西一樣,你可以有不同的方法設定。 chmod
命令允許你以數字方式或使用字元表示式更改許可權。
要以數字方式更改檔案許可權,你可以使用這樣的命令來設定 SUID 和 SGID 位:
$ chmod 6775 tryme
或者你可以使用這樣的命令:
$ chmod ug+s tryme <== 用於 SUID 和 SGID 許可權
如果你要新增特殊許可權的檔案是指令碼,你可能會對它不符合你的期望感到驚訝。這是一個非常簡單的例子:
$ cat tryme
#!/bin/bash
echo I am $USER
即使設定了 SUID 和 SGID 位,並且 root 是檔案所有者,執行指令碼也不會產生你可能期望的 “I am root”。為什麼?因為 Linux 會忽略指令碼的 SUID 和 SGID 位。
$ ls -l tryme
-rwsrwsrwt 1 root root 29 May 26 12:22 tryme
$ ./tryme
I am jdoe
另一方面,如果你對一個編譯的程式之類進行類似的嘗試,就像下面這個簡單的 C 程式一樣,你會看到不同的效果。在此示例程式中,我們提示使用者輸入檔名並建立它,並給檔案寫入許可權。
#include <stdlib.h>
int main()
{
FILE *fp; /* file pointer*/
char fName[20];
printf("Enter the name of file to be created: ");
scanf("%s",fName);
/* create the file with write permission */
fp=fopen(fName,"w");
/* check if file was created */
if(fp==NULL)
{
printf("File not created");
exit(0);
}
printf("File created successfully\n");
return 0;
}
編譯程式並執行該命令以使 root 使用者成為所有者並設定所需許可權後,你將看到它以預期的 root 許可權執行 - 留下新建立的 root 為所有者的檔案。當然,你必須具有 sudo
許可權才能執行一些需要的命令。
$ cc -o mkfile mkfile.c <== 編譯程式
$ sudo chown root:root mkfile <== 更改所有者和組為 “root”
$ sudo chmod ug+s mkfile <== 新增 SUID and SGID 許可權
$ ./mkfile <== 執行程式
Enter name of file to be create: empty
File created successfully
$ ls -l empty
-rw-rw-r-- 1 root root 0 May 26 13:15 empty
請注意,檔案所有者是 root - 如果程式未以 root 許可權執行,則不會發生這種情況。
許可權字串中不常見設定的位置(例如,rwsrwsrwt)可以幫助提醒我們每個位的含義。至少第一個 “s”(SUID) 位於所有者許可權區域中,第二個 (SGID) 位於組許可權區域中。為什麼粘連位是 “t” 而不是 “s” 超出了我的理解。也許創造者想把它稱為 “tacky bit”,但由於這個詞的不太令人喜歡的第二個定義而改變了他們的想法。無論如何,額外的許可權設定為 Linux 和其他 Unix 系統提供了許多額外的功能。
via: https://www.networkworld.com/article/3397790/a-deeper-dive-into-linux-permissions.html
作者:Sandra Henry-Stocker 選題:lujun9972 譯者:geekpi 校對:wxy
訂閱“Linux 中國”官方小程式來檢視
相關文章
- 深入理解Linux許可權Linux
- Linux許可權Linux
- linux 檔案許可權 s 許可權和 t 許可權解析Linux
- Linux 特殊許可權Linux
- Linux特殊許可權之suid、sgid、sbit許可權LinuxUI
- Linux的檔案存取許可權和0644許可權Linux
- linux sudo許可權配置Linux
- Linux 檔案許可權Linux
- Linux的許可權控制Linux
- Linux檔案許可權Linux
- Linux提權-許可權升級Linux
- Linux常用檔案許可權命令詳解Linux
- [svc]linux檔案許可權Linux
- 全面介紹 Linux 許可權Linux
- Linux 中的許可權管理Linux
- Linux 許可權入門指南Linux
- linux使用者許可權Linux
- Linux 下許可權的管理Linux
- Linux 目錄許可權研究Linux
- django開發之許可權管理(一)——許可權管理詳解(許可權管理原理以及方案)、不使用許可權框架的原始授權方式詳解Django框架
- 『學了就忘』Linux許可權管理 — 55、檔案特殊許可權Linux
- MySQL 許可權詳解MySql
- 2分鐘快速瞭解企業使用者許可權
- 許可權之選單許可權
- linux許可權簡單介紹Linux
- Linux基礎之許可權管理Linux
- Linux使用者與許可權Linux
- Linux檔案許可權管理命令Linux
- Linux中檔案的許可權Linux
- Linux的檔案許可權管理Linux
- Linux中的許可權機制Linux
- Linux賬戶與許可權管理Linux
- Linux 如何設定特殊許可權?Linux
- 基本Linux許可權提升(Basic Linux Privilege Escalation)Linux
- 如何用 Vue 實現前端許可權控制(路由許可權 + 檢視許可權 + 請求許可權)Vue前端路由
- 『學了就忘』Linux許可權管理 — 56、不可改變位許可權(chattr)Linux
- 許可權修飾符,方法及異常瞭解一下
- 許可權系統:一文搞懂功能許可權、資料許可權