1. 程式人生 > 實用技巧 >linux特殊許可權

linux特殊許可權

1.0隱藏許可權lsattr_chattr

chattr隱藏許可權

man chattr 檢視用法

語法:chattr[+-=][Asaci][檔案或者目錄]

[root@linux1 ~]# chattr --help
Usage: chattr [-RVf] [-+=aAcCdDeijsStTu] [-v version] files...
  -R 遞迴處理,將指定目錄下的所有檔案及子目錄一併處理。

  -v<版本編號> 設定檔案或目錄版本。

  -V 顯示指令執行過程。

  +<屬性> 開啟檔案或目錄的該項屬性。

  -<屬性> 關閉檔案或目錄的該項屬性。

  =<屬性> 指定檔案或目錄的該項屬性。
  • 演示
[root@linux1 ~]# chattr +i 1.txt 
[root@linux1 ~]# vi 1.txt 
  • 提示檔案許可權不夠
[root@linux1 ~]# head -n2 /etc/passwd > 1.txt 
-bash: 1.txt: 許可權不夠
  • 檢視許可權是777怎麼沒許可權呢?
[root@linux1 ~]# ls -l 1.txt 
-rwxrwxrwx. 1 centos centos 0 8月  29 11:26 1.txt
  • 這時候考慮有沒有隱藏許可權

lsattr檢視隱藏許可權

[root@linux1 ~]# lsattr 1.txt 
----i----------- 1.txt

注:正常情況下新建一個檔案是沒有隱藏許可權的,加了i許可權之後不能mv(重新命名,移動)rm(刪除)vi(編輯)touch(更改時間)>(覆蓋)

去掉 i許可權

[root@linux1 ~]# chattr -i 1.txt 

chattr +a 1.txt只能追加 不允許其他操作

[root@linux1 ~]# chattr +a 1.txt 
[root@linux1 ~]# mv 1.txt 2.txt
mv: 無法將"1.txt" 移動至"2.txt": 不允許的操作
[root@linux1 ~]# rm 1.txt 
rm:是否刪除普通空檔案 "1.txt"?y
rm: 無法刪除"1.txt": 不允許的操作
[root@linux1 ~]# head -n2 /etc/passwd > 1.txt 
-bash: 1.txt: 不允許的操作
[root@linux1 ~]# head -n2 /etc/passwd >> 1.txt 
[root@linux1 ~]# cat 1.txt 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin

可以看的出賦予1.txt a隱藏許可權。允許追加,類似日誌,還允許touch(更改時間)不允許其他操作

如何全掉a許可權?

[root@linux1 ~]# chattr -a 1.txt

2.特殊許可權set_uid

概述:

1.set_uid 只能作用於二進位制可執行檔案,對普通文字檔案無效
2.普通使用者執行擁有該許可權的二進位制檔案時,可以使普通使用者臨時擁有root許可權(例如:更改密碼的命令 /usr/bin/passwd 對除 root 以外的使用者不可讀、不可寫和不可執行,但是普通使用者同樣可以使用該命令更改自己的密碼)

  • s 就是set_uid的許可權
  • 代表普通使用者臨時擁有root許可權
  • 是二進位制檔案,是一個可執行的檔案
  • 當普通使用者執行這種型別的檔案,臨時擁有所屬者的許可權

如何給檔案賦予set_uid許可權

[root@linux1 ~]# ls -l /usr/bin/ls
-rwxr-xr-x. 1 root root 117680 10月 31 2018 /usr/bin/ls
[root@linux1 ~]# chmod u+s /usr/bin/ls
[root@linux1 ~]# ls -l /usr/bin/ls
-rwsr-xr-x. 1 root root 117680 10月 31 2018 /usr/bin/ls

賦予set_uid許可權是讓普通使用者擁有所有者身份(臨時擁有root許可權)

測試用普通使用者登入系統

[root@linux1 ~]# su - centos
[centos@linux1 ~]$ ls -l
總用量 0
[centos@linux1 ~]$ ls -l /root/
總用量 24
drwxrwxrwx. 2 centos centos    32 8月  29 11:44 123
-rwxrwxrwx. 1 centos centos    65 8月  30 12:26 1.txt
-rw-rw-r--. 1 root   root       0 8月  29 12:07 3.txt
-rw-------. 1 root   root    1177 8月  27 00:40 anaconda-ks.cfg

如何給檔案全掉set_uid許可權

[root@linux1 ~]# chmod u-s /usr/bin/ls
[root@linux1 ~]# ls -l /usr/bin/ls
-rwxr-xr-x. 1 root root 117680 10月 31 2018 /usr/bin/ls

再用普通使用者執行命令

[centos@linux1 ~]$ ls -l /root/
ls: 無法開啟目錄/root/: 許可權不夠

另外一種方法賦予set_uid許可權

[root@linux1 ~]# chmod u=rws /usr/bin/ls
[root@linux1 ~]# ls -l /usr/bin/ls
-rwSr-xr-x. 1 root root 117680 10月 31 2018 /usr/bin/ls

這時候看到許可權是rwS,是因為沒有x可執行許可權。但是不影響,普通使用者還是可以執行,可以賦予x可執行許可權就會S變s

[root@linux1 ~]# chmod u+x /usr/bin/ls
[root@linux1 ~]# ls -l /usr/bin/ls
-rwsr-xr-x. 1 root root 117680 10月 31 2018 /usr/bin/ls

沒有x許可權也可以直接執行?

s也有執行許可權,所以可以直接執行、ls命令普通使用者許可權本來就可以執行

目錄也可以加s許可權,但是沒有意義

3.特殊許可權set_gid

概況:

可以應用在檔案上同樣可以作用在目錄。設定檔案上和set_uid類似,前提兩個檔案是可以執行的二進位制檔案,設定set_gid,執行檔案的使用者臨時以該檔案所屬組的身份執行。要是目錄被設定這個許可權,在此目錄下建立檔案或者目錄與子目錄和該目錄的所屬組相同。

set_gid作用在組許可權位上

s許可權意味著,除了這個檔案的所屬組之外。其他使用者在執行命令一瞬間擁有所屬組的許可權

[root@linux1 ~]# ls -ld /root/
dr-xr-x---. 4 root root 227 8月  30 12:25 /root/

root所屬組許可權位r-x,可讀可執行,所以普通使用者擁有set_gid許可權,所以可以使用root所屬組許可權可以檢視root目錄檔案

[root@linux1 ~]# su - centos
[centos@linux1 ~]$ ls -l /root/
總用量 24
drwxrwxrwx. 2 centos centos    32 8月  29 11:44 123
-rwxrwxrwx. 1 centos centos    65 8月  30 12:26 1.txt
-rw-rw-r--. 1 root   root       0 8月  29 12:07 3.txt
-rw-------. 1 root   root    1177 8月  27 00:40 anaconda-ks.cfg

沒有所屬組許可權沒有set_gid許可權,會提示許可權不夠

[root@linux1 ~]# chmod g-s /usr/bin/ls //root使用者先減set_gid許可權

[centos@linux1 ~]$ ls -l /root/ //普通使用者執行
ls: 無法開啟目錄/root/: 許可權不夠

set_gid許可權可以作用在目錄上。給123目錄賦予s許可權

[root@linux1 ~]# chmod g+s 123/

檢視許可權

[root@linux1 ~]# ls -ld 123
drwxrwsrwx. 2 centos centos 32 8月  29 11:44 123

更改使用者組

[root@linux1 ~]# chown root:centos 123
[root@linux1 ~]# ls -ld 123
drwxrwsrwx. 2 root centos 32 8月  29 11:44 123

在123目錄下建立一個檔案

[root@linux1 ~]# touch 123/3.txt
[root@linux1 ~]# ls -ld 123/3.txt 
-rw-r--r--. 1 root centos 0 8月  30 13:15 123/3.txt

新建檔案所屬組也是centos

注:當給目錄set_gid許可權時,它下面建立子目錄和檔案都會跟著父級目錄。

4.0特殊許可權stick_bit

系統中的/tmp/目錄是擁有stick_bit許可權的

[root@linux1 ~]# ls -ld /tmp/
drwxrwxrwt. 21 root root 4096 8月  29 19:04 /tmp/
  • 注:它的許可權位在其他使用者上,防刪除位,防止別人刪除自己的檔案,root使用者除外

普通使用者(centos這是使用者)在tmp建立一個檔案

[centos@linux1 tmp]$ touch 1.txt

用centos1使用者去刪除centos使用者的檔案

[centos1@linux1 tmp]$ rm 1.txt 
rm:是否刪除有防寫的普通空檔案 "1.txt"?y
rm: 無法刪除"1.txt": 不允許的操作

增加stick_bit放刪除位

chmod o+t 目錄

總結:

1.這drwxrwxrwt.裡面的t(t裡面包含x許可權),就是stick_bit許可權,stick_bit(t):又叫做防刪除位。

2.只對目錄有效,對檔案無效。

3.在/tmp/下有很多類似的檔案,擁有777許可權,說明任何一個使用者都可對這個目錄可寫,並建立自己的檔案

5.0軟連線

軟連線
命令:  ln -s 原檔案 目標檔案
特徵:
1.相當於windows的快捷方式
2.只是一個符號連線,所以軟連線檔案大小都很小
3.當執行軟連線的時候,會根據連線指向找到真正的檔案,然後執行
4.所有軟連線檔案的許可權是777,而真正的許可權是由指向的那個檔案決定的
5.原檔案丟失,軟連線無法訪問,會報找不到的錯誤
6.ls -al以後,軟連線後面箭頭指向的是原檔案

/bin相當於/usr/bin的快捷方式

[root@linux1 ~]# ls -l /bin
lrwxrwxrwx. 1 root root 7 8月  27 00:34 /bin -> usr/bin

連結檔案的大小和路徑有關,路徑越長,檔案越大。

如何建立軟連線

ls -s 原始檔 建立軟連線檔案

[root@linux1 ~]# tree 123
123
├── 1.txt
├── 234
│ └── 1.txt
├── 2.txt
└── 3.txt

建立軟連線

[root@linux1 ~]# ln -s /root/123/2.txt /root/123/234/2.txt 
[root@linux1 ~]# tree 123
123
├── 1.txt
├── 234
│ ├── 1.txt
│ └── 2.txt -> /root/123/2.txt
├── 2.txt
└── 3.txt

1 directory, 5 files

軟連線也可以連結目錄

[root@linux1 ~]# ln -s /root/123/234/ /root/123/345/
[root@linux1 ~]# tree 123
123
├── 1.txt
├── 234
│ ├── 1.txt
│ └── 2.txt -> /root/123/2.txt
├── 2.txt
├── 345
│ └── 234 -> /root/123/234/
└── 3.txt

3 directories, 5 files
  • 注:刪除軟連線目錄時,後面不要加/

相對路徑軟連線有弊端,之前我們用到的是絕對路徑,在同一個路徑建立軟連線就是相對路徑

[root@linux1 tmp]# touch 1.txt
[root@linux1 tmp]# ln -s 1.txt 2.txt 注:2.txt前提沒有建立
[root@linux1 tmp]# ll
總用量 64
-rw-r--r--. 1 root root     0 8月  30 21:15 1.txt
lrwxrwxrwx. 1 root root     5 8月  30 21:15 2.txt -> 1.txt

如果複製到另外一臺機器上或者目錄改動,那麼軟連線就會失效,儘量使用絕對路徑。將22.txt移動到/root/123目錄下,檢視

[root@linux1 tmp]# mv 1.txt /root/123/
[root@linux1 tmp]# ll
總用量 64
lrwxrwxrwx. 1 root root     5 8月  30 21:15 2.txt -> 1.txt 這時候1.txt在閃爍

但是新建一個改檔案,恢復正常

[root@linux1 tmp]# touch 1.txt

軟連線的使用場景演示:

假設現在有一個伺服器server,會生成一個日誌檔案run.log,路徑在/boot/run.log,但是boot目錄空間要滿了,這時候可以把run.log複製到/目錄下

# cp -i /boot/run.log /root/run.log

馬上刪除/boot下的run.log

rm /boot/run.log

做個軟連線

ln -s /root/run.log /boot/run.log

這時候server服務繼續使用的是/boot/run.log這個日誌檔案,是實上是個軟連線,真正的位置是在/root目錄,有效解決/boot空間記憶體不足問題。

6.0硬連結

硬連線
命令:  ln 原檔案 目標檔案
特徵:
1.原檔案和連線檔案的屬性完全一樣
2.連線檔案和原檔案的關係類似於:複製+同步更新
3.當原檔案丟失,硬連線檔案還可以訪問
4.不能跨分割槽,不能針對目錄使用
5.原理:
原文和硬連結檔案的i節點號是相同的(ls -i),1個檔名對應一個i節點,1個i節點可以通過多個檔名訪問,所以,他們的屬性完全相同,並且修改了其中一個的內容另一個也會跟著修改件

語法:ln 原始檔 硬連結檔案

[root@linux1 ~]# touch 1.log
[root@linux1 ~]# ln 1.log 2.log 注:2.log存在

1.log和2.log inode相同

執行上面這條命令以後,原始檔與目標檔案inode號碼相同,都是指向同一個inode,inode資訊中的一項叫做硬連結,記錄指向該inode的檔案總數,這時就會增加1.

反過來說,刪除一個檔名,就會使得inode節點“連線數”減1。當值為0時,表示沒有檔名指向這個inode,系統就會回收這個inode號碼和對應的block區域