1. 程式人生 > >Linux之特殊許可權及facl

Linux之特殊許可權及facl

Linux特殊許可權

Linux引入suid、sgid、sticky這三種特殊許可權,能夠更加方便、有效和安全地控制檔案。

    當在一個目錄或檔案上加入suid特殊許可權時,如過原來目錄或檔案的屬主具有x(執行)許可權,就會用小寫的s來替代x;如果原來檔案或目錄不具有x(執行)許可權,就會用大寫的S來代替x。

同樣,sgid和suid相同,如過原來目錄或檔案的屬組具有x(執行)許可權,就會用小寫的s來替代x;如果原來檔案或目錄不具有x(執行)許可權,就會用大寫的S來代替X。

    同樣,如果在一個檔案或目錄上加入sticky許可權時,若原檔案或目錄的其他使用者有x(可執行)許可權時,就用小寫t代替x;如果原檔案或目錄沒有x許可權時,就用大寫T替代x許可權

getfacl 檔名 檢視ACL許可權  (ACL許可權是為了防止許可權不夠用的情況)
setfacl 選項 檔名 -m設定ACL許可權 -x刪除指定的ACL許可權 -b刪除所有ACL許可權
-d設定預設的ACL許可權 -k刪除預設ACL許可權 -R 遞迴設定ACL許可權
setfacl -m u:使用者名稱:rx [檔名] g組 setfacl -x g:txt 刪除TXT組的ACL許可權
mask最大許可權 賦予許可權與最大許可權才是使用者的真許可權 setfacl -m m:rx 最大許可權讀執行
setfacl -m u:使用者名稱:許可權 -R 目錄 遞迴目錄下所有檔案linux目錄也是檔案
setfacl -m d:u:使用者名稱:許可權 -R 檔案 d預設 default 之後建立檔案都有此許可權
預設許可權 遞迴都賦予目錄的
SETUID 讓普通使用者暫時變成超級使用者,執行完變回普通使用者 u使用者(必須二進位制檔案,不針對目錄) 例usr/bin/passwd
chmod 4755 4 代表的是SUID 
SetGID 例/usr/bin/locate chmod 2777 2代表SGID 針對目錄檔案,針對目錄普通必須有xr許可權
Sticky BIT SBIT chmod 1777 針對目錄 普通使用者必須有xr許可權 目的,有粘著位,普通使用者只能刪除自己的檔案,不能刪除其他使用者原件 例子 ll -d /temp
chattr 檔案系統屬性許可權 chattr [-RVf][+-=] 檔案或目錄 
-R 遞迴處理,將指定目錄下的所有檔案及子目錄一併處理。
-V 顯示指令執行過程。
-f 顯示錯誤資訊。
1、i 針對檔案任何使用者不能修改刪除新增(包過ROOT),針對目錄,可以修改目錄下已有檔案的資料,但不能新建或刪除 目錄下的子目錄下可以操作。echo 123 >>/tmp/game/a1 往A1新增123 echo >/game/a1 用空白覆蓋(1位元組) cat /dev/null > a1(0位元組) chattr +i /etc/resolv.conf


2、a (鎖定現有檔案)針對檔案只可以用echo增加,針對目錄可以新建和修改檔案,但不能刪除
lsattr -a 檔名 檢視檔案系統屬性 -d 只列出目錄,不列出子檔案
sudo 賦予普通使用者root 許可權
visudo 相當於修改/etc/sudoers檔案
linux ALL=(ALL) /sbin/shuadown -r now
使用者 IP或主機=身份使用者 重啟的許可權
檢視sudo許可權 sudo -l
執行的時候 sudo /sbin/shuadown -r now

可以chmod的字元或數字的方式修改特殊許可權,下例以數字方式實現。

 # -rw-r--r-- 1 root root 0 Nov  6 07:40 test1  ugo都沒執行許可權 
# chmod 7644 test1                            原許可權是644,都加上特殊許可權 
# -rwSr-Sr-T 1 root root 0 Nov  6 07:43 test1  屬主、屬組、其他使用者執行許可權變為S、S、T. 
  
# -rwxr-xr-x 1 root root 0 Nov  6 07:43 test2  ugo都有執行許可權 
# chmod 7755 test2                            原許可權是655,都加上特殊許可權 
# -rwsr-sr-t 1 root root 0 Nov  6 07:49 test2  屬主、屬組、其他使用者執行許可權變為s、s、t. 
  
特殊許可權對可執行檔案的作用: 
suid特殊許可權是以可執行檔案的所有者的許可權來執行這一檔案,不是以執行者的許可權執行該命令。 
sgid特殊許可權是以可執行檔案的群組的許可權來執行這一檔案。下例說明: 
ls -l /bin/ping
-rwsr-xr-x 1 root root 35832 Apr 24  2009 /bin/ping
可見ping命令有suid特殊許可權。ping可以測試網路是否連通。切換到yaoyao使用者,ping一下可見網路確實連通。 
[

[email protected] test2]# ping www.baidu.com -c4 
PING www.linuxidc.com (61.135.169.121) 56(84) bytes of data. 
64 bytes from 61.135.169.121: icmp_seq=1 ttl=47 time=10.0 ms 
64 bytes from 61.135.169.121: icmp_seq=2 ttl=46 time=14.3 ms 
64 bytes from 61.135.169.121: icmp_seq=3 ttl=46 time=17.7 ms 
64 bytes from 61.135.169.121: icmp_seq=4 ttl=46 time=23.9 ms 
  
--- www.linuxidc.com ping statistics --- 
4 packets transmitted, 4 received, 0% packet loss, time 3000ms 
rtt min/avg/max/mdev = 10.090/16.539/23.938/5.067 ms 
切換到root使用者,用chmod命令去掉ping命令的suid許可權,再切換到yaoyao使用者,測試一下是否能ping通。 
# chmod u-s /bin/ping 
# ls -l /bin/ping 
# -rwxr-xr-x 1 root root 35832 Apr 24  2009 /bin/ping 
$ $ ping www.baidu.com 
  ping: icmp open socket: Operation not permitted 
這次就無法ping通,由此可見,suid特殊許可權是以可執行檔案的所有者的許可權來執行這一檔案,不是以執行者的許可權執行該命令。 
  
特殊許可權對目錄的作用: 
在一個目錄上設定了sticky特殊許可權,只有檔案的所有者和使用者才能刪除該目錄的檔案,而不理會屬組和其他使用者的寫許可權。 
在一個目錄上設定sgid特殊許可權,則只要是同組成員,都可以在此目錄檢視、建立、刪除檔案。 
經常會對目錄設定sticky和suid許可權以方便管理。即同組成員可以檢視和寫入本目錄下的各個檔案,卻不能刪除。如下: 
首先建立兩個使用者xiaoyao和linuxidc用於測試,再建立一個house目錄。建立一個love分組,於是xiaoyao和linuxidc便相愛了...將這對戀人xiaoyao和linuxidc加入love分組,house目錄屬組設定為love,再給house目錄設定sgid和sticky這兩個特殊許可權。 
  
# useradd xiaoyao 
# useradd linuxidc 
# mkdir house 
# groupadd love 
  
將xiaoyao和linuxidc加入love組內。 
# usermod -G love xiaoyao 
# usermod -G love linuxidc 
  
#id xiaoyao;id linuxidc 
 uid=503(xiaoyao) gid=504(xiaoyao) groups=504(xiaoyao),506(love) context=root:system_r:unco nfined_t:SystemLow-SystemHigh 
 uid=504(linuxidc) gid=505(linuxidc) groups=505(linuxidc),506(love) context=root:system_r:u nconfined_t:SystemLow-SystemHigh    可以看到使用者xiaoyao和linuxidc都在love組內。 
  
將house目錄屬組改為love組 
# chown :love house 
# ls -l 
  drwxr-xr-x 2 root love 4096 Nov  6 09:34 house 
  
新增sgid和sticky特殊許可權,並且屬組具有寫許可權(屬組內使用者可以建立檔案,否則不能)。 
# chmod 3775 house 
  drwxr-sr-t 2 root love 4096 Nov  6 09:34 house 
  
切換到使用者linuxidc,並建立檔案xiaoming,寫入一句話"I love you"
$ echo "I love you xiaoyao." > linuxidc 
  
切換到使用者xiaoyao,建立檔案xiaoyao,且寫入"Me too."
$ echo "Me too" > xiaoyao 
  
檢視house目錄內容,可發現所建立檔案屬組都是love。 
ls -l 
 -rw-rw-r-- 1 linuxidc love 19 Nov  6 09:40 linuxidc 
 -rw-rw-r-- 1 xiaoyao  love  6 Nov  6 09:41 xiaoyao 
  
使用者xiaoyao嘗試刪除house目錄下的linuxidc,這時提示不允許,但可以寫入,這就是共享資訊吧。 
[[email protected] house]$ rm linuxidc 
rm: cannot remove `linuxidc': Operation not permitted 
$ echo "Baby." >> linuxidc 
$ cat linuxidc 
  Me too. 
  Baby.

facl

 facl基於檔案的訪問控制列表 優先順序比ugo高

想要使用fac首先需要檢測檔案系統(分割槽)是否支援facl
tune2fs -l /dev/sda3 | grep acl
Default mount options:    user_xattr acl

讓不支援acl的分割槽支援
mount -o remount,acl /boot/

檢視檔案是否設定有facl
ll
總用量 16
-rw-rw-rw-+ 1 user1 user1 4 11月  4 16:54 1.txt

上例中如果有+號表示設定了facl

檢視檔案是否設定了facl
getfacl  a.txt
# file: a.txt
# owner: root
# group: root
user::rw-
group::r--
other::r--

setfacl [-bkndRLP] { -m|-M|-x|-X ... } file ...
        -m 修改facl
        -x 刪除某條facl
        -b 刪除所有的facl
        -d 設定目錄預設的facl
        -R 表示遞迴設定

設定facl 針對a.txt檔案為redhat使用者設定特殊的許可權
setfacl  -m u:redhat:rwx a.txt

getfacl  a.txt
# file: a.txt
# owner: root
# group: root
user::rw-
user:redhat:rwx
group::r--
mask::rwx
other::r--

setfacl  -m u:user1:r-x a.txt

取消user1的facl
setfacl  -x u:user1 a.txt

取消所有使用者的facl
setfacl -b  a.txt

基於組的設定
setfacl  -m g:IT:rwx a.txt

目錄的facl
目錄的default facl針對目錄有效  此設定對目錄本身無意義  其它人在此目錄下建立的文
件都繼承使用者對目錄設定的facl

設定目錄的facl
setfacl  -m d:u:redhat:rwx  test/

effective 最終效果

設定掩碼
setfac -m m::rw  /tmp/test/1.txt