1. 程式人生 > 實用技巧 >Linux系統上檔案的特殊許可權及檔案acl

Linux系統上檔案的特殊許可權及檔案acl

Linux系統上檔案的特殊許可權及檔案acl

新建

歡迎來到 來到大浪濤天的部落格

一、Linux系統上檔案的特殊許可權及檔案acl

在Linux作業系統中所有檔案都是有許可權匹配的,當某一使用者執行某一程式開開啟對應的檔案的時候,放慢動作其實是這樣的:

  1. 系統匹配程式檔案的許可權,該使用者是否具有該程式的執行許可權,當然包括匹配屬主,屬組和other,如果該使用者具有該程式的執行許可權,那由shell(許可權為當前啟動shell使用者的許可權)代理啟動該程序。
  2. 當程序被啟動後,程序的許可權其實是被映射了當前使用者的許可權,系統進行匹配需要讀寫的檔案的許可權,該使用者是否具有該程式的執行許可權,當然包括匹配屬主,屬組和other。
  3. 當用戶的許可權滿足需要被讀寫的檔案的許可權時,該檔案可以被正常讀取或者寫入,否則提示許可權不足,這其實就是安全上下文的概念,特殊許可權除外。

1. 特殊許可權分類

  1. SUID
  2. SGID
  3. STICKY

2. 安全上下文的概念

  1. 程序以某使用者的身份執行;程序是發起此程序程序使用者的代理,因此以此使用者的身份和許可權來完成所有操作;
    例如我們執行任何一個程式都是由shell程序來幫忙完成的,如果最開始為root使用者,則shell是以root的身份來發起的,當執行了su - hadoop切換到hadoop使用者來執行
    命令,則shell是以hadoop使用者的身份來完成的。
[root@test01 ~]# pstree |grep bash
        |-sshd---sshd---bash-+-grep
[root@test01 ~]# su - hadoop
[hadoop@test01 ~]$ pstree |grep bash
        |-sshd---sshd---bash---su---bash-+-grep
  1. 許可權匹配模型:
  • 程序的屬主是否為被訪問的檔案的屬主;如果是,則應用屬主的許可權;否則進入第二步,注意這裡的屬主是指程序的發起者。
  • 程序的屬主是否為被訪問的檔案的屬組;如果是,則應用屬組的許可權;否則進入第三步;
  • 應用other的許可權;

3. 特殊許可權SUID的介紹

  1. 預設的情況下,使用者執行程式是程式檔案,當程式檔案起來成為程序後,是以使用者的身份讀寫檔案的:
[root@test01 ~]# cp /bin/cat /tmp/cat
[root@test01 ~]# ls -l /tmp/cat
-rwxr-xr-x 1 root root 54080 5月  30 22:10 /tmp/cat
[hadoop@test01 ~]$ ps -aux |grep bash
hadoop   11450  0.0  1.7 116688  3260 pts/0    S    22:12   0:00 -bash
[root@test01 ~]# su - hadoop
[hadoop@test01 ~]$ /tmp/cat /etc/shadow
/tmp/cat: /etc/shadow: 許可權不夠
  1. 當程式檔案裡含有SUID的許可權後,使用者執行程式檔案來讀寫某檔案時,當程式檔案起來成為程序後,是以程式檔案本身的身份來讀寫檔案的,非常有風險不建議使用
[root@test01 ~]# chmod u+s /tmp/cat 
[root@test01 ~]# ls -l /tmp/cat 
-rwsr-xr-x 1 root root 54080 5月  30 22:10 /tmp/cat
[hadoop@test01 ~]$ /tmp/cat /etc/shadow
root:$6$4ec6LVk0R48G1cGN$rqhHG7nRA/SJM8
  1. 管理檔案的SUID許可權:
chmod u+/- s FILE
展示位置:屬主的執行許可權位
如果屬主原本有執行許可權,則顯示為小寫的s
如果屬主原本沒有執行許可權,則顯示為大寫的S

4. 特殊許可權SGID的介紹

預設的情況下,如果在同一個開發組或者應用團隊在自己組內有一個公用目錄,可以方便自己組內使用者都自由讀寫,我們只能改這個公用目錄的許可權,把other位開放寫的許可權,
那這種情況得出來的影響是每個人都對這個目錄進行增刪改查,為了達到一個小的目的對安全造成了極大的影響,因此產生了SGID這樣一個許可權。

  1. 預設情況下使用者對某一個目錄有執行寫入許可權,那使用者建立的檔案的屬組為使用者的主組或者基本組
[root@test01 ~]# useradd  -G mygrp hadoop1 
[root@test01 ~]# id hadoop1
uid=1002(hadoop1) gid=1003(hadoop1) 組=1003(hadoop1),1002(mygrp)
[root@test01 ~]# usermod -G mygrp hadoop 
[root@test01 ~]# id hadoop
uid=1001(hadoop) gid=1001(hadoop) 組=1001(hadoop),1002(mygrp)
[root@test01 ~]# mkdir -p /tmp/test/hadoop
[root@test01 ~]# chown :mygrp !$
chown :mygrp /tmp/test/hadoop
[root@test01 ~]# chmod g+w /tmp/test/hadoop/
[root@test01 ~]# su - hadoop
[hadoop@test01 ~]$ cd /tmp/test/hadoop/
[hadoop@test01 hadoop]$ touch hadoop.a
[hadoop@test01 hadoop]$ ls -l
-rw-rw-r-- 1 hadoop hadoop 0 5月  30 22:58 hadoop.a
[root@test01 ~]# su - hadoop1
[hadoop1@test01 ~]$ cd /tmp/test/hadoop
[hadoop1@test01 hadoop]$ touch hadoop1.b
[hadoop1@test01 hadoop]$ ls -l
-rw-rw-r-- 1 hadoop1 hadoop1 0 5月  30 22:59 hadoop1.b
  1. 當對該目錄設定了SGID的許可權後,使用者在該使用者建立的檔案的屬組為該目錄的組,而不是使用者的主組或者基本組
[root@test01 ~]# chmod g+s /tmp/test/hadoop/
[root@test01 ~]# ls -ld /tmp/test/hadoop/
drwxrwsr-x 2 root mygrp 39 5月  30 22:59 /tmp/test/hadoop/
[root@test01 ~]# rm -rf /tmp/test/hadoop/*
[root@test01 ~]# su - hadoop
[hadoop@test01 ~]$ cd /tmp/test/hadoop/
[hadoop@test01 hadoop]$ touch hadoop.a
[hadoop@test01 hadoop]$ ls -l hadoop.1
[hadoop@test01 hadoop]$ ls -l hadoop.a
-rw-rw-r-- 1 hadoop mygrp 0 5月  30 23:03 hadoop.a
[root@test01 ~]# su - hadoop1
[hadoop1@test01 ~]$ cd /tmp/test/hadoop/
[hadoop1@test01 hadoop]$ touch hadoop1.b
[hadoop1@test01 hadoop]$ ls -l hadoop1.b
-rw-rw-r-- 1 hadoop1 mygrp 0 5月  30 23:04 hadoop1.b
  1. 當把目錄的許可權設定為某個組,然後把該組新增SGID的許可權,最後把一個需要公用的團隊的使用者都增加該組為附加組,這樣屬於該附加組的使用者都可以自由讀取和寫入該目錄的許可權
  2. 管理檔案的SUID許可權:
chmod u+/- s DIR
展示位置:屬組的執行許可權位
如果屬組原本有執行許可權,則顯示為小寫的s
如果屬組原本沒有執行許可權,則顯示為大寫的S

5. 特殊許可權Sticky的介紹

  1. 預設情況下對於屬組或全域性可寫的目錄,組內的使用者或系統上的所有使用者對在此目錄中都能建立新檔案或刪除所有的已有的檔案;如果為此目錄設定為Sticky許可權,則每個使用者能建立新檔案,且只能刪除自己的檔案。
  2. 類似於tmp及/var/tmp目錄,如果某系統用於所有使用者都可以在一個公共目錄上讀寫刪除自己的檔案的話,別人不能刪除自己的檔案,可以將該公共目錄許可權設定為Sticky位
  3. 如果上一個問題,hadoop的公用目錄上,設定了SGID的許可權,只要是mygrp組的使用者都可以任意更改刪除任意使用者的檔案,那如果需要限制的話可以在該目錄上設定一個Sticky許可權,再把該目錄的other去除rx許可權,防止普通使用者進去
[root@test01 ~]# chmod o+t /tmp/test/hadoop/
[root@test01 ~]# chmod o-rx !$
chmod o-rx /tmp/test/hadoop
[root@test01 ~]# ls -ld /tmp/test/hadoop
drwxrws--T 2 root mygrp 39 5月  30 23:04 /tmp/test/hadoop
[root@test01 ~]# su - hadoop
[hadoop@test01 ~]$ cd /tmp/test/hadoop/
[hadoop@test01 hadoop]$ echo "hello hadoop" >hadoop.1
[root@test01 ~]# su - test 
[test@test01 ~]$ cat /tmp/test/hadoop/hadoop.1
cat: /tmp/test/hadoop/hadoop.1: 許可權不夠
[test@test01 ~]$ /tmp/cat /tmp/test/hadoop/hadoop.1
hello hadoop
[root@test01 ~]# su - hadoop1
[hadoop1@test01 ~]$ cd /tmp/test/hadoop/
[hadoop1@test01 hadoop]$ rm -rf hadoop.1
rm: 無法刪除"hadoop.1": 不允許的操作
  1. 管理檔案的SUID許可權:
chmod u+/- t DIR
展示位置:屬組的執行許可權位
如果屬主原本有執行許可權,則顯示為小寫的t
如果屬主原本沒有執行許可權,則顯示為大寫的T

6. facl: file access control lists

  1. 檔案的額外賦權機制,在原來的u,g,o許可權外,另一層讓普通使用者能控制賦權給另外使用者的使用者或組的賦權機制。
  2. 檢視檔案的facl的許可權,getfacl File.
  3. 設定facl:
  • 賦權給使用者:setfacl -m u:test:rw- File.
  • 賦權給組: setfacl -m g:mygrp:rw- File.
[root@test01 tmp]# su - test
[test@test01 ~]$ echo "test" >/tmp/test.1
[root@test01 tmp]# su - hadoop
[hadoop@test01 ~]$ echo "hadoop" >/tmp/test.1 
-bash: /tmp/test.1: 許可權不夠
[root@test01 tmp]# setfacl -m u:hadoop:rw- /tmp/test.1
[root@test01 tmp]# su - hadoop
[hadoop@test01 ~]$ echo "hadoop" >/tmp/test.1 
[hadoop@test01 ~]$ getfacl /tmp/test.1
getfacl: Removing leading '/' from absolute path names
# file: tmp/test.1
# owner: test
# group: test
user::rw-
user:test:rw-
user:hadoop:rw-
group::rw-
mask::rw-
other::r--
  1. 撤銷賦權facl:
  • 針對使用者: setfacl -x u:test File.
  • 針對組:setfacl -x g:mygrp- File.
  1. 可以針對某個檔案限制不讓某個使用者訪問,如:
[test@test01 ~]$ cat /tmp/1.hadoop 
hello hadoop
[root@test01 tmp]# setfacl -m u:test:--- 1.hadoop 
[test@test01 ~]$ cat /tmp/1.hadoop 
cat: /tmp/1.hadoop: 許可權不夠
[test@test01 ~]$ getfacl /tmp/1.hadoop 
getfacl: Removing leading '/' from absolute path names
# file: tmp/1.hadoop
# owner: hadoop
# group: hadoop
user::rw-
user:test:---
group::rw-
mask::rw-
other::r--