Linux學習——文件及目錄的特殊權限

Linux特殊權限概述

對於文件以及目錄。r(讀), w(寫), x(執行)三種基本權限是最基礎的權限。

當我們查詢一些系統權限時,會發現多了一種權限,如:

[root@oldboy ~]# ll /usr/bin/passwd 
-rwsr-xr-x. 1 root root 27856 Aug  9  2019 /usr/bin/passwd

在前三位權限中發現了s權限而不是x權限,我們稱這種權限爲SetUID權限。

特殊權限SUID

1.問題引入

在 Linux 系統中,每個普通用戶都可以更改自己的密碼,這是合理的設置。問題是,普通用戶的信息保存在 /etc/passwd 文件中,用戶的密碼在 /etc/shadow 文件中,也就是說,普通用戶在更改自己的密碼時修改了 /etc/shadow 文件中的加密密碼,但是文件權限顯示,普通用戶對這兩個文件其實都是沒有寫權限的,那爲什麼普通用戶可以修改自己的權限呢?…(難道學了個假的權限)

[root@oldboy ~]# ll /etc/passwd
-rw-r--r--. 1 root root 5677 Mar 26 17:06 /etc/passwd
[root@oldboy ~]# ll /etc/shadow
----------. 1 root root 4028 Mar 26 17:06 /etc/shadow
[root@oldboy ~]# 

2.解決方案

其實,普通用戶可以修改自己的密碼在於 passwd 命令。該命令擁有特殊權限 SetUID,也就是在屬主的權限位的執行權限上是 s。可以這樣來理解它:當一個具有執行權限的文件設置 SetUID 權限後,用戶在執行這個文件時將以文件所有者的身份來執行。

PS: 當普通用戶使用 passwd 命令更改自己的密碼時,實際上是在用 passwd 命令所有者 root 的身份在執行 passwd 命令,root 當然可以將密碼寫入 /etc/shadow 文件,所以普通用戶也可以修改 /etc/shadow 文件,命令執行完成後,該身份也隨之消失.

3.舉例

舉個例子,有一個用戶 jack,她可以修改自己的權限,因爲 passwd 命令擁有 SetUID 權限;但是她不能査看 /etc/shadow 文件的內容,因爲査看文件的命令(如 cat)沒有 SetUID 權限。命令如下:

[jack@oldboy ~]$ cat /etc/shadow
cat: /etc/shadow: Permission denied

4.分析

passwd 是系統命令,可以執行,所以可以賦予 SetUID 權限。
jack用戶對 passwd 命令擁有 x(執行)權限。
jack用戶在執行 passwd 命令的過程中,會暫時切換爲 root 身份,所以可以修改 /etc/shadow 文件。
命令結束,jack 用戶切換回自己的身份。
PS: cat命令沒有 SetUID權限,所以使用 jack用戶身份去訪問 /etc/shadow 文件,當然沒有相應權限了。
F: 但如果將passwd命令的suid去掉會發生什麼???

# chmod 4755 passwd
# chmod  u+s  passwd

5.suid的作用

1.讓普通用戶對可執行的二進制文件,臨時擁有二進制文件的所屬主權限。
2.如果設置的二進制文件沒有執行權限,那麼suid的權限顯示就是大S。
3.特殊權限suid僅對二進制可執行程序有效,其他文件或目錄則無效。
注意: suid極度危險,不信可以嘗試對vim或rm進行設定SetUID。

特殊權限SGID

將目錄設置爲sgid後,如果在該目錄下創建文件,都將與該目錄的所屬組保持一致,演示如下

[root@oldboy ~]# cd /tmp/ && mkdir dtest
[root@oldboy /tmp]# chmod g+s dtest/ && ll -d dtest/
drwxr-sr-x. 2 root root 6 Mar 27 08:48 dtest/
[root@oldboy /tmp]# chmod 777 dtest/
[root@oldboy /tmp]# su - jack
Last login: Fri Mar 27 08:21:32 CST 2020 on pts/0
[jack@oldboy ~]$ cd /tmp/dtest/
[jack@oldboy /tmp/dtest]$ touch jack_test
[jack@oldboy /tmp/dtest]$ ll
total 0
-rw-rw-r--. 1 jack root 0 Mar 27 08:49 jack_test

sgid授權方法:2000權限字符s(S),取決於屬組位置上的x

# chmod 2755  directory 
# chmod  g+s  directory

sgid作用
1.針對用戶組權限位修改,用戶創建的目錄或文件所屬組和該目錄的所屬組一致。
2.當某個目錄設置了sgid後,在該目錄中新建的文件不在是創建該文件的默認所屬組
3.使用sgid可以使得多個用戶之間共享一個目錄的所有文件變得簡單。

特殊權限SBIT

Sticky(SI TI KI)粘滯位目前只對目錄有效,作用如下:
普通用戶對該目錄擁有 w 和 x 權限,即普通用戶可以在此目錄中擁有寫入權限。如果沒有粘滯位,那麼普通用戶擁有 w 權限,就可以刪除此目錄下的所有文件,包括其他用戶建立的文件。但是一旦被賦予了粘滯位,除了 root 可以刪除所有文件,普通用戶就算擁有 w 權限,也只能刪除自己建立的文件,而不能刪除其他用戶建立的文件。

[root@oldboy /tmp]# ll -d /tmp/
drwxrwxrwt. 18 root root 4096 Mar 27 08:55 /tmp/

sticky授權方法,1000 權限字符t(T),其他用戶位的x位上設置。

# chmod 1755  /tmp
# chmod o+t /tmp

sticky作用
1.讓多個用戶都具有寫權限的目錄,並讓每個用戶只能刪自己的文件。
2.特殊sticky目錄表現在others的x位,用小t表示,如果沒有執行權限是T
3.一個目錄即使它的權限爲"777"如果是設置了粘滯位,除了目錄的屬主和"root"用戶有權限刪除,除此之外其他用戶都不允許刪除該目錄。

權限屬性chattr

chatrr 只有 root 用戶可以使用,用來修改文件系統的權限屬性,建立凌駕於 rwx 基礎權限之上的授權。
chatrr 命令格式:[root@bgx ~]# chattr [±=] [選項] 文件或目錄名

#選項: + 增加權限 -減少權限 =等於某個權限
# a:讓文件或目錄僅可追加內容
# i:不得任意更動文件或目錄

#1.創建文件並設置屬性
[root@oldboy /tmp]# touch file_a file_i
[root@oldboy /tmp]# lsattr file_a file_i
---------------- file_a
---------------- file_i

#2.使用chattr設置屬性,lsattr查看權限限制
[root@oldboy /tmp]# chattr +a file_a
[root@oldboy /tmp]# chattr +i file_i
[root@oldboy /tmp]# lsattr file_a file_i
-----a---------- file_a
----i----------- file_i

#3.a權限,無法寫入和刪除文件,但可以追加數據,適合/etc/passwd這樣的文件
[root@oldboy /tmp]# echo "aa" > file_a
-bash: file_a: Operation not permitted
[root@oldboy /tmp]# rm -f file_a
rm: cannot remove ‘file_a’: Operation not permitted
[root@oldboy /tmp]# echo "aa" >> file_a

#4.i權限, 無法寫入,無法刪除,適合不需要更改的重要文件加鎖
[root@oldboy /tmp]# echo "i" >file_i
-bash: file_i: Permission denied
[root@oldboy /tmp]# echo "i" >> file_i
-bash: file_i: Permission denied
[root@oldboy /tmp]# rm -f file_i
rm: cannot remove ‘file_i’: Operation not permitted

#5.解除限制
[root@oldboy /tmp]# chattr -a file_a
[root@oldboy /tmp]# chattr -i file_i

進程掩碼umask

1.umask是什麼?

當我們登錄系統之後創建一個文件總是有一個默認權限的,比如: 目錄755、文件644、那麼這個權限是怎麼來的呢?這就是umask乾的事情。umask設置了用戶創建文件的默認權限。

2.umask是如何改變創建新文件的權限

系統默認umask爲022,那麼當我們創建一個目錄時,正常情況下目錄的權限應該是777,但umask表示要減去的值,所以新目錄文件的權限應該是777 - 022 =755。至於文件的權限也依次類推666 - 022 =644。

3.umask涉及哪些配置文件
umask涉及到的相關文件/etc/bashrc /etc/profile ~/.bashrc ~/.bash_profile
shell (vim,touch) --umask–> 會影響創建的新文件或目錄權限
vsftpd服務如果修改–umask–> 會影響ftp服務中新創建文件或創建目錄權限
useradd如果修改umask–> 會影響用戶HOME家目錄權限

4.umask舉例

#1.假設umask值爲:022(所有位爲偶數)
#文件的起始權限值
6 6 6  -  0 2 2  = 6 4 4 

#2.假設umask值爲:045(其他用戶組位爲奇數)
#計算出來的權限。由於umask的最後一位數字是5,所以,在其他用戶組位再加1。
6 6 6  -   0 4 5 = 6 2 1

#3.默認目錄權限計算方法
7 7 7  -  0 2 2 = 7 5 5
 
#umask所有位全爲偶數時
# umask 044
# mkdir d044   目錄權限爲733
# touch f044   文件權限爲622

#umask部分位爲奇數時
# umask 023
# mkdir d023   目錄權限爲754
# touch f023   文件權限爲644

#umask值的所有位爲奇數時
# umask 035
# mkdir d035   目錄權限爲742
# touch f035   文件權限爲642

[root@oldboy /]# touch file0022
[root@oldboy /]# mkdir dir0022
[root@oldboy /]# ll -d file0022 dir0022/
drwxr-xr-x. 2 root root 6 Mar 27 09:09 dir0022/
-rw-r--r--. 1 root root 0 Mar 27 09:09 file0022

#修改umask值(臨時生效)
[root@oldboy /]# umask 000
[root@oldboy /]# mkdir dir000
[root@oldboy /]# touch file000
[root@oldboy /]# ll -d dir000 file000
drwxrwxrwx. 2 root root 6 Mar 27 09:10 dir000
-rw-rw-rw-. 1 root root 0 Mar 27 09:11 file000

#通過 umask 決定新建用戶 HOME 目錄的權限
[root@xuliangwei ~]# vim /etc/login.defs
UMASK 077
[root@xuliangwei ~]# useradd dba
[root@xuliangwei ~]# ll -d /home/dba/
drwx------. 4 dba dba 4096 3 月 11 19:50 /home/dba/

[root@tianyun ~]# vim /etc/login.defs
UMASK 000
[root@xuliangwei ~]# useradd sa
[root@xuliangwei ~]# ll -d /home/sa/
drwxrwxrwx. 4 sa sa 4096 3 月 11 19:53 /home/sa/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章