Linux 系統許可權介紹與使用

来源:https://www.cnblogs.com/librarookie/archive/2022/12/01/16941369.html
-Advertisement-
Play Games

Linux 系統許可權介紹與使用 介紹 linux中除了常見的讀(r)、寫(w)、執行(x)許可權以外,還有其他的一些特殊或隱藏許可權,熟練掌握這些許可權知識的使用,可以大大提高我們運維工作的效率。 讀寫執行(rwx) 在linux系統中文件(文件和目錄)的許可權有三種(r, w, x),分別對應數字許可權 ( ...


Linux 系統許可權介紹與使用



介紹

linux中除了常見的讀(r)、寫(w)、執行(x)許可權以外,還有其他的一些特殊或隱藏許可權,熟練掌握這些許可權知識的使用,可以大大提高我們運維工作的效率。

讀寫執行(rwx)

在linux系統中文件(文件和目錄)的許可權有三種(r, w, x),分別對應數字許可權 (4, 2, 1),而這三種許可權對 文件目錄 的意義有所不同。

許可權前的字元,表示文件的具體類型。比如 d 表示目錄,- 表示普通文件,l 表示連接文件,b 表示設備文件,等等。

  • 許可權對 文件

    r(read): 可讀取該文件的實際內容;
    w(write): 可以編輯,新增或者修改該文件的內容(但不含刪除該文件);
    x(execute): 代表該文件可以被系統執行。
    

    Tips: 對於文件的 r, w, x 來說,主要針對的 "文件的內容" 而言,與文件名的存在與否沒有關係;

  • 許可權對 目錄

    r(read): 表示具有讀取目錄結構列表的許可權。不如可以用ls查看一下目錄有什麼;
    w(write): 表示具有更改該目錄結構列表的許可權。目錄可寫操作包括:新建文件或目錄、刪除文件或目錄(不論文件的許可權是什麼)、對文件或目錄重命名、移動文件或目錄等;
    x(execute): 表示用戶能否進入該目錄稱為工作目錄。擁有此許可權,就可以cd進去,否則,將不能進入目錄內部。
    

許可權碼(umask)

umask 是許可權碼,root用戶預設是 0022,普通用戶預設是 0002.

umask 預設許可權確實由 4 個八進位數組成,但第 1 個數代表的是文件所具有的特殊許可權(SetUID、SetGID、Sticky BIT),也就是說,後 3 位數字 "022" 才是本節真正要用到的 umask 許可權值,將其轉變為字母形式為 ----w--w-

使用命令 "umask" 就能查詢出來

文件預設的許可權是 666,目錄預設的許可權是 777

  • 對文件來講,其可擁有的最大預設許可權是 666,即 rw-rw-rw-。也就是說,使用文件的任何用戶都沒有執行(x)許可權。原因很簡單,執行許可權是文件的最高許可權,賦予時絕對要慎重,因此絕不能在新建文件的時候就預設賦予,只能通過用戶手工賦予。
  • 對目錄來講,其可擁有的最大預設許可權是 777,即 rwxrwxrwx。

文件和目錄的真正初始許可權,可通過以下的計算得到:

文件(或目錄)的初始許可權 = 文件(或目錄)的最大預設許可權 - umask許可權

  • 新建文件許可權: 666-022=644
  • 新建目錄許可權: 777-022=755

特殊許可權:SUID、SGID、SBIT

在Linux中有三種特殊許可權,分別為:

  • SUID(s) = 4: 執行時設置用戶ID(SetUID, set user ID upon execution);當文件所有者許可權中的 x 許可權位,卻出現了 s 許可權時,就被稱為 SetUID,簡稱 SUID 特殊許可權。
  • SGID(s) = 2: 執行時設置組ID(SetGID, set group ID upon execution);當 s 許可權位於所屬組的 x 許可權位時,就被稱為 SetGID,簡稱 SGID 特殊許可權。
  • SBIT(t) = 1: 限制刪除標誌或粘性位(Sticky BIT, the restricted deletion flag or sticky bit);當 t 許可權位於其他者的 x 許可權位時,就被稱為 Sticky BIT,簡稱 SBIT 特殊許可權。

Tips

  • SetUID(s),SetGID(s) 和SBIT(t)分別顯示在 ugo 的 x 位置,如果本來在該位上有執行許可權(x), 則這些特殊標誌顯示為小寫字母 (s, s, t). 否則, 顯示為大寫字母 (S, S, T)
  • SUID、SGID、SBIT 許可權都是為了實現特殊功能而設計的,其目的是彌補 ugo 許可權無法實現的一些使用場景。

SetUID

SUID 特殊許可權僅適用於可執行文件,所具有的功能是,只要用戶對設有 SUID 的文件有執行許可權,那麼當用戶執行此文件時,會以文件所有者的身份去執行此文件,一旦文件執行結束,身份的切換也隨之消失。

在 Linux 中,普通用戶修改密碼,就是通過SUID來實現,下麵我們來瞭解一次此過程:

  • 在 Linux 中,所有賬號的密碼記錄在 /etc/shadow 這個文件中,並且只有 root 可以讀寫入這個文件;也就是說,普通用戶對此文件沒有任何操作許可權。;
  • 普通用戶可以使用 /usr/bin/passwd 命令修改自己的密碼;

如果另一個普通賬號 tester 需要修改自己的密碼,就要訪問 /etc/shadow 這個文件。但是只有 root 才能訪問 /etc/shadow 這個文件,這究竟是如何做到的呢?
事實上,tester 用戶是可以修改 /etc/shadow 這個文件內的密碼的,就是通過 passwd程式文件的 SUID 功能。讓我們看看 passwd 程式文件的許可權信息:

202211231602311

顯示了 passwd 命令的許可權配置,可以看到,此命令擁有 SUID 特殊許可權,而且其他人對此文件也有執行許可權,這就意味著,任何一個用戶都可以用文件所有者,也就是 root 的身份去執行 passwd 命令。

上圖中的許可權信息可以看出,passwd 文件所屬者的信息為 rws 而不是 rwx。當 s 出現在文件擁有者的 x 許可權上時,就被稱為 SETUID BITS 或 SETUID ,其特點如下:

  • SUID 許可權僅對二進位可執行文件有效
  • 如果執行者對於該二進位可執行文件具有 x 的許可權,執行者將具有該文件的所有者的許可權
  • 本許可權僅在執行該二進位可執行文件的過程中有效

整理一下已知條件:

  1. 修改密碼是通過 passwd 程式將密碼保存到 /etc/shadow 文件;
  2. 普通用戶對於 /usr/bin/passwd 這個程式具有執行許可權;
  3. passwd 程式擁有 SUID 許可權;
  4. passwd 程式的所有者為 root;
  5. 只有 root 才能訪問 /etc/shadow 文件;

下麵我們來看 tester 用戶是如何利用 SUID 許可權完成密碼修改的:

  1. 普通用戶 tester 執行 passwd 程式修改密碼;
  2. 在此過程中會通過 SUID 許可權暫時獲得 /usr/bin/passwd 程式的所有者許可權,即 root 許可權;
  3. 因此 tester 用戶在執行 passwd 程式的過程中暫時利用 root 身份修改 /etc/shadow 文件;
  4. passwd 程式執行完成後,普通用戶 tester 所具有的 root身份也隨之消失;

但是如果由普通用戶執行 cat 命令去讀取 /etc/shadow 文件確是不行的,如:

202211251031780

從圖中可以看出,cat 只比 passwd 程式缺少 SUID 許可權,其他條件一致。

原因很清楚,普通用戶沒有讀 /etc/shadow 文件的許可權,同時 cat 程式也沒有被設置 SUID。我們可以通過下圖來理解這兩種情況:

202211251036118

如果想讓任意用戶通過 cat 命令讀取 /etc/shadow 文件的內容也是非常容易的,給它設置 SUID 許可權就可以了:

$ sudo chmod 4755 /usr/bin/cat
## Or
$ sudo chmod u+s /usr/bin/cat

現在 cat 已經具有了 SUID 許可權,試試看,是不是已經可以 cat 到 /etc/shadow 的內容了。

202211251038955

因為這樣做非常不安全,所以趕快通過下麵的命令把 cat 的 SUID 許可權移除掉:

$ sudo chmod 755 /usr/bin/cat
## Or
$ sudo chmod u-s /usr/bin/cat

由此,我們可以總結出,SUID 特殊許可權具有如下特點:

  • 只有可執行文件才能設定 SetUID 許可權,對目錄設定 SUID 是無效的。
  • 用戶要對該文件擁有 x(執行)許可權。
  • 用戶在執行該文件時,會以文件所有者的身份執行。
  • SetUID 許可權只在文件執行過程中有效,一旦執行完畢,身份的切換也隨之消失。

SetGID

SGID 的特點與 SUID 相同,當 s 許可權位於所屬組的 x 許可權位時,就被稱為 SetGID,簡稱 SGID 特殊許可權;與 SUID 不同的是,SGID 既可以對文件進行配置,也可以對目錄進行配置。

下麵通過 /usr/bin/mlocate 程式來演示其用法:

mlocate 程式通過查詢資料庫文件 /var/lib/mlocate/mlocate.db 實現快速的文件查找。 mlocate 程式的許可權如下圖所示:

202211251533618

很明顯,它被設置了 SGID 許可權。下麵是資料庫文件 /var/lib/mlocate/mlocate.db 的許可權信息:很明顯,它被設置了 SGID 許可權。下麵是資料庫文件 /var/lib/mlocate/mlocate.db 的許可權信息:

202211251533771

普通用戶 tester 執行 mlocate 命令時,程式的執行過程如下圖所示:

202211251535278

tester 就會獲得用戶組 mlocate 的執行許可權,又由於用戶組 mlocate 對 mlocate.db 具有讀許可權,所以 tester 就可以讀取 mlocate.db 了。

除二進位程式外,SGID 也可以用在目錄上。當一個目錄設置了 SGID 許可權後,它具有如下功能:

  • 用戶若對此目錄具有 r 和 x 許可權,該用戶能夠進入該目錄;
  • 用戶在此目錄下的有效用戶組將變成該目錄的用戶組;
  • 若用戶在此目錄下擁有 w 許可權,則用戶所創建的新文件的用戶組與該目錄的用戶組相同。

SetGID 授權與取消:

# 授權
$ sudo chmod 2755 /usr/bin/mlocate
## Or
$ sudo chmod g+s /usr/bin/mlocate

# 取消
$ sudo chmod 755 /usr/bin/mlocate
## Or
$ sudo chmod g-s /usr/bin/mlocate

總結一下:

  1. SetGID(SGID)對文件的作用(同 SUID 類似)

    • SGID 只針對可執行文件有效,換句話說,只有可執行文件才可以被賦予 SGID 許可權,普通文件賦予 SGID 沒有意義。
    • 用戶需要對此可執行文件有 x 許可權;
    • 用戶在執行具有 SGID 許可權的可執行文件時,用戶的群組身份會變為文件所屬群組;
    • SGID 許可權賦予用戶改變組身份的效果,只在可執行文件運行過程中有效;
  2. SetGID(SGID)對目錄的作用

    • 當一個目錄被賦予 SGID 許可權後,進入此目錄的普通用戶,其有效群組會變為該目錄的所屬組,會就使得用戶在創建文件(或目錄)時,該文件(或目錄)的所屬組將不再是用戶的所屬組,而使用的是目錄的所屬組。
    • 也就是說,只有當普通用戶對具有 SGID 許可權的目錄有 rwx 許可權時,SGID 的功能才能完全發揮。
    • 比如說,如果用戶對該目錄僅有 rx 許可權,則用戶進入此目錄後,雖然其有效群組變為此目錄的所屬組,但由於沒有 x 許可權,用戶無法在目錄中創建文件或目錄,SGID 許可權也就無法發揮它的作用。

簡言之:

  1. 當 SGID 作用於普通文件時,和 SUID 類似,在執行該文件時,用戶將獲得該文件所屬組的許可權。
  2. 當 SGID 作用於目錄時,當用戶對某一目錄有寫(w)和執行(x)許可權時,該用戶就可以在該目錄下建立文件,如果該目錄用 SGID 修飾,則該用戶在這個目錄下建立的文件都是屬於這個目錄所屬的組。

Tips:

  • 與 SUID 不同的是,SGID 既可以對文件進行配置,也可以對目錄進行配置。
  • SGID 和 SUID 的不同之處就在於,SUID 賦予用戶的是文件所有者的許可權,而 SGID 賦予用戶的是文件所屬組的許可權,就這麼簡單。
  • 無論是 SUID,還是 SGID,它們對用戶身份的轉換,只有在命令執行的過程中有效,一旦命令執行完畢,身份轉換也隨之失效。

小知識點:

# 將一個用戶添加到一個組內
$ gpasswd -a 用戶名 組名
$ usermod -G 組名 用戶名

# 將一個用戶從組內刪除
$ gpasswd -d 用戶名 組名

Sticky BIT

Sticky BIT,簡稱 SBIT 特殊許可權,可意為粘著位、粘滯位、防刪除位等。

  • SBIT 許可權僅對目錄有效,對於⽂件⽆效;一旦目錄設定了 SBIT 許可權,則用戶在此目錄下創建的文件或目錄,就只有所屬者自己和 root 才有權利修改或刪除該文件。
  • 允許各用戶在 SBIT 許可權目錄中任意新建、刪除自己的文件或目錄,但是禁止修改(刪除和移動/更名)其他用戶的文件或目錄;
  • 雖然其他用戶不能對 SBIT 許可權目錄里的文件進行刪除或者移動操作,但是如若其他用戶對該文件有 w 許可權,還是可以進行修改文件內容的。 (即粘滯位保護的是目錄里的文件本身不被其他用戶修改,即使文件對其他用戶有寫許可權,777都不行!)
  • SBIT 許可權都是針對 其他用戶(Other) 設置;

在linux系統的實際應用中,粘滯位一般用於 /tmp 目錄,以防止普通用戶刪除或移動其他用戶的文件。

202211251707191

Sticky BIT 授權與取消:

# 授權
$ sudo chmod 1777 /tmp
## Or
$ sudo chmod o+t /tmp

# 取消
$ sudo chmod 777 /tmp
## Or
$ sudo chmod o-t /tmp

用戶身份許可權(su, sudo)

su - 以替代用戶和組的身份運行一個命令

su 命令可以在用戶之間切換,但需要知道對方密碼。比如su切換到root下,需要知道root密碼。這就導致很多人都知道 root 的密碼;

  1. su 切換時,註意有個 -

    • - ,表示不僅切換到用戶下,連同用戶的系統環境變數也切換進來了 【切換前後執行env看下環境變數】;
    • 不加 - ,表示僅僅切換到用戶狀態下,用戶的系統環境變數沒有切換進來;
  2. 缺點

    • 系統安全;僅僅為了一個特權操作就直接賦予普通用戶控制系統的完整許可權;
    • root 密碼泄露;需要把 root 密碼告知每個需要 root 許可權的人。
  3. 配置禁止 su 到root賬號

    關於su的相關許可權涉及到兩個文件,分別為 /etc/pam.d/su/etc/login.defs 兩個配置文件。

    • 禁止普通用戶 su 到root
      $ sudo vim /etc/pam.d/su

      auth sufficient pam_rootok.so
      # Uncomment the following line to implicitly trust users in the "wheel" group.
      #auth sufficient pam_wheel.so trust use_uid
      # Uncomment the following line to require a user to be in the "wheel" group.
      #auth required pam_wheel.so use_uid     #<-- 取消此行註釋即可(保存後即生效)
      

      Tips:

      • 預設狀態下是允許所有用戶間使用 su 命令進行切換的!
      • 取消上面註釋後,表示只有 root 用戶和 wheel 組內的用戶才可以使用su命令。
    • 只允許指定的普通用戶可以 su 到 root

      在 /etc/login.defs 文件中加入 SU_WHEEL_ONLY yes (保存後生效),然後將指定的用戶加入 wheel 組即可。(表示只有wheel組內的用戶才能使用su命令,root用戶也被禁用su命令)

  4. 用戶組管理(組內添加和刪除用戶)以及組許可權管理設置

    將需要 su到 root 用戶的用戶名添加至 wheel 組中;

    $ sudo usermod -G wheel 用戶名

    將一個用戶拉入到一個組內,有下麵兩種方法:

    # 添加到組內
    usermod -G 組名 用戶名
    gpasswd -a 用戶名 組名
    
    # 從組內刪除
    gpasswd -d 用戶名 組名
    

sudo - 以其他用戶身份執行命令

普通用戶執行只有 root 用戶才能執行的操作命令,且不需要知道root密碼,只需要輸入自己賬號密碼即可(前提是需要將相關賬號設置sudo許可權)

sudo 介紹

考慮到使用 su 命令可能對系統安裝造成的隱患,最常見的解決方法是使用 sudo 命令,此命令也可以讓你切換至其他用戶的身份去執行命令。

  1. sudo的特性:

    • sudo 能夠限制用戶只在某台主機上運行某些命令。
    • sudo 提供了豐富的日誌,詳細地記錄了每個用戶幹了什麼。它能夠將日誌傳到中心主機或者日誌伺服器。
    • sudo 使用時間戳文件來執行類似的“檢票”系統。當用戶調用sudo並且輸入它的密碼時,用戶獲得了一張存活期為5分鐘的票(這個值可以在編譯的時候改變)。也就是說,我剛剛輸入了 sudo cat /etc/issue 然後可以再次只需要輸入 cat/etc/issue 即可,不需要再次輸入sudo。
    • sudo 的配置文件是 /etc/sudoers 文件,它允許系統管理員集中的管理用戶的使用許可權和使用的主機。
    • root 執行 sudo 時不需要輸入密碼(sudoers文件中預設有配置 “root ALL=(ALL) ALL” 規則);
    • 若欲切換的身份與執行者的身份相同,也不需要輸入密碼。
    • 可以通過手動修改 sudo 的配置文件,使其無需任何密碼即可運行。
  2. sudo的工作過程:

    1. 當用戶運行 sudo 命令時,系統會先通過 /etc/sudoers 文件,驗證該用戶是否有運行 sudo 的許可權;
    2. 確定用戶具有使用 sudo 命令的許可權後,還要讓用戶輸入自己的密碼進行確認。出於對系統安全性的考慮,如果用戶在預設時間內(預設是 5 分鐘)不使用 sudo 命令,此後使用時需要再次輸入密碼;
    3. 密碼輸入成功後,才會執行 sudo 命令後接的命令。
    
  3. sudo 的應用

    • 用法:

      sudo [-b] [-u username] commands

    • 常用的選項與參數:

      -b  :將後續的命令放到背景中讓系統自行運行,不對當前的 shell 環境產生影響。
      -u  :後面可以接欲切換的用戶名(預設切換身份為 root)
      -l  :此選項的用法為 sudo -l,用於顯示當前用戶可以用 sudo 執行那些命令。
      

sudo 配置

修改 /etc/sudoers,不建議直接使用 vim,而是使用 visudo。因為修改 /etc/sudoers 文件需遵循一定的語法規則,使用 visudo 的好處就在於,當修改完畢 /etc/sudoers 文件,離開修改頁面時,系統會自行檢驗 /etc/sudoers 文件的語法。

/etc/sudoers 中模板的含義分為是:

root ALL=(ALL) ALL
#用戶名 被管理主機的地址=(可使用的身份) 授權命令(絕對路徑)
%wheel ALL=(ALL) ALL
#%組名 被管理主機的地址=(可使用的身份) 授權命令(絕對路徑)

參數:

  • 用戶名或群組名: 表示系統中的那個用戶或群組(也可以是別名),可以使用 sudo 這個命令。每個用戶設置一行,多個用戶設置多行,也可以將多個用戶設置成一個別名後再進行設置。
  • 被管理主機的地址: 用戶可以管理指定 IP 地址的伺服器。這裡如果寫 ALL,則代表用戶可以管理任何主機;如果寫固定 IP,則代表用戶可以管理指定的伺服器。如果我們在這裡寫本機的 IP 地址,不代表只允許本機的用戶使用指定命令,而是代表指定的用戶可以從任何 IP 地址來管理當前伺服器。
  • 可使用的身份: 就是把來源用戶切換成什麼身份使用,(ALL)代表可以切換成任意身份。如果要排除個別用戶,可以在括弧內設置,比如ALL=(ALL,!root,!ops)。也可以設置別名(這個欄位可以省略,如:admin ALL=/sbin/shutdown -r now)
  • 授權命令: 即使用sudo後可以執行所有的命令列表。需要註意的是,此命令必須使用絕對路徑寫。NOPASSWD: ALL 表示使用sudo的不需要輸入密碼。(預設值是 ALL,表示可以執行任何命令。也可以設置別名)

常用 sudo 許可權的安全設置一般可以滿足下麵4個條件:

  1. 禁止普通用戶使用sudo 命令切換到root模式下
    眾所周知,只要給普通用戶設置了sudo許可權,那麼它就可以使用“sudo su root”命令切換到root用戶下(sudo許可權只要輸入自己的密碼),這是很不安全的。必須禁止這種做法。配置如下:

    202211301740569

    如上設置,表示 wangshibo 用戶在使用sudo許可權後,禁止使用 bashsu 命令。也就是說:禁止了該用戶使用sudo切換到root模式下了。
    其中:

    • !/bin/bash : 是禁止了sudo -s的切換
    • !/bin/su : 是禁止了sudo中帶su的切換

    限制用戶使用 root 身份

    202211301745197

    以上設置表示:wangshibo 賬號在sudo狀態下享有除root之外的其他用戶狀態下的許可權。預設是(ALL),即sudo享有所有用戶狀態下的許可權。

  2. 用戶使用sudo命令,必須每次都輸入密碼

    在 /etc/sudoers 文件里添加內容 Defaults timestamp_timeout=0 , 即表示每次使用sudo命令時都要輸入密碼。

    202211301749514

    當然也能設置普通用戶的sudo無密碼登錄,配置如下:

    # User privilege specification
    root    ALL=(ALL:ALL) ALL
    wangshibo   ALL=(ALL) NOPASSWD: ALL
    
    # Allow members of group sudo to execute any command
    %sudo   ALL=(ALL:ALL) NOPASSWD:ALL      #這一行也要添加"NOPASSWD",否則前面的普通用戶設置的sudo無密碼切換無效!
    
  3. 用戶組管理(組內添加和刪除用戶)以及組許可權管理設置

    進行用戶許可權管理,設置sudo許可權時,可以設置 的許可權,不同的組有不同的許可權,然後將用戶拉到相應許可權的組內。

    202211301752573

    以上設置表示: wheel 組內的用戶在使用sudo許可權後,禁止使用bash和su命令,也就是禁止了該組內用戶使用sudo切換到root模式下了。

  4. 使用別名(用戶名以及命令的別名)進行設置

    Alise設置別名有以下四種情況(別名一定要是大寫字母):

    • 別名定義:

      #1. Host_Alias :主機的列表,可以使用IP、主機名;不過在同一個別名內不能同時混用主機名和ip地址,如:
          - Host_Alias HOST_FLAG = hostname1, hostname2, hostname3
          - Host_Alias HOST_FLAG1 = 192.168.1.12, 192.1681.13, 192.168.1.14
          - Host_Alias HOST_FLAG2 = hostname1, 192.1681.13, 192.168.1.14    # 這種設置是錯誤的!不能在同一個別名內混用主機名和ip
      
      #2. Cmnd_Alias :允許執行的命令列表,命令前加上 "!" 表示不能執行此命令。命令一定要使用絕對路徑(避免其他目錄的同名命令被執行,造成安全隱患)
          - Cmnd_Alias COMMAND_FLAG = command1, command2, command3 ,!command4
      
      #3. User_Alias :具有sudo許可權的用戶列表
          - User_Alias USER_FLAG = user1, user2, user3
      
      #4. Runas_Alias :就是用戶以什麼身份執行(例如root)的列表
          - Runas_Alias RUNAS_FLAG = operator1, operator2, operator3
      
    • 別名使用:

      # 使用別名配置許可權的格式如下:
      USER_FLAG HOST_FLAG=(RUNAS_FLAG) COMMAND_FLAG
      
      # 如果不需要密碼驗證的話,就加上 “NOPASSWD”
      USER_FLAG HOST_FLAG=(RUNAS_FLAG) NOPASSWD:COMMAND_FLAG
      
    • 慄子:通過設置命令的別名進行許可權設置。

      即將一系列命令放在一起設置一個別名,然後對別名進行許可權設置。註意:Delegating permissions 代理許可權相關命令別名

      202211301750021

      202211301750320

      以上設置說明:wnagshibo用戶在sudo許可權下只能使用ls,rm,tail命令


sudo 日誌審計

作為一個Linux系統的管理員,不僅可以讓指定的用戶或用戶組作為root用戶或其它用戶來運行某些命令,還能將指定的用戶所輸入的命令和參數作詳細的記錄。而sudo的日誌功能就可以用戶跟蹤用戶輸入的命令,這不僅能增進系統的安全性,還能用來進行故障檢修。

1. 檢查伺服器系統版本
# Centos 5.x 為syslog,對應的日誌配置文件為/etc/syslog.conf
# Centos 6.x 為rsyslog,對應的日誌配置文件為/etc/rsyslog.conf

1. 配置日誌服務
$ echo "local2.debug /var/log/sudo.log" >> /etc/rsyslog.conf
## 查看配置是否添加成功
$ tail -1 /etc/rsyslog.conf

1. 配置sudoers
$ echo "Defaults logfile=/var/log/sudo.log" >> /etc/sudoers
## 查看配置
$ tail -1 /etc/sudoers

1. 重啟日誌服務
$ systemctl restart rsyslog

普通許可權(chmod, chown, chgrp)

數字許可權(chmod)

chmod 設置數字許可權4,2,1,分別對應的是可讀(r),可寫(w) 和可執行(x)。對目錄設置許可權時,可以加 -R 遞歸地改變文件和目錄;(幫助理解:chchange, modmodify)

chmod 當許可權數字存在四位時,第一位表示的是特殊許可權,許可權數字4,2,1,分別對應的是SetUID(s),SetGID(s) 和SBIT(t)。

  • Usage:

    chmod [OPTION]... MODE[,MODE]... FILE...
    # Or
    chmod [OPTION]... --reference=RFILE FILE...
    
  • Options:

    -v, --verbose          對每一個被處理的文件輸出一個診斷報告
    -c, --changes          與 verbose 相似,但只在有變化時報告
    -f, --silent, --quiet         抑制大多數錯誤信息
        --no-preserve-root        不特別處理'/'(預設)
        --preserve-root           不能對'/'進行遞歸操作
        --reference=RFILE         使用 RFILE(參考文件) 的許可權模式而不是 MODE 值
    -R, --recursive        遞歸地改變文件和目錄
        --help        顯示此幫助並退出
        --version     輸出版本信息並退出
    

    Tips: 每個 MODE 的形式: [ugoa]-+=[rwxXst][ugoa]-+=[ugo][-+=]0-7 (+ 表示給文件或目錄添加屬性,- 表示移除文件或目錄擁有的某些屬性,= 表示使文件或目錄只有這些屬性。)


字元許可權(chown, chgrp)

字元許可權設置;chown 預設表示所屬者許可權,chgrp 表示所屬組許可權。(幫助理解:chchange, ownowner, grp==group)

  • Usage:

    chown [OPTION]... [OWNER][:[GROUP]] FILE...
    # Or:  
    chown [OPTION]... --reference=RFILE FILE...
    
    chgrp [OPTION]... GROUP FILE...
    # Or:  
    chgrp [OPTION]... --reference=RFILE FILE...
    
  • Options:

    -v, --verbose           對每個被處理的文件輸出診斷信息
    -c, --changes           與 verbose 相似,但只在做出改變時報告
    -f, --silent, --quiet   抑制大多數錯誤信息
        --no-preserve-root  不特別處理'/'(預設)。
        --preserve-root     不對'/'進行遞歸操作。
        --reference=RFILE   使用RFILE的所有者和組,而不是指定OWNER:GROUP值。指定OWNER:GROUP值
    -R, --recursive         對文件和目錄進行遞歸操作
        --help          顯示此幫助並退出
        --version       輸出版本信息並退出
    
        --dereference       影響每個符號鏈接的引用者(這是預設情況下),而不是符號鏈接本身。
    -h, --no-dereference    影響符號鏈接而不是任何被引用的文件(只在可以改變符號鏈接所有權的系統上有用符號鏈接的所有權)。
    
        --from=CURRENT_OWNER:CURRENT_GROUP
                        改變每個文件的所有者和/或組,只有在它的當前所有者和/或組與這裡指定的這裡。兩者都可以省略,在這種情況下,匹配的不需要與被省略的屬性相匹配。
    
    下麵的選項修改了當-R 選項時,下列選項修改了層次結構的遍歷方式。 如果指定了一個以上的選項,只有最後的選項才會生效。
    
    -H          如果一個命令行參數是一個符號鏈接到一個目錄的符號鏈接,則遍歷它
    -L          遍歷每個目錄的符號鏈接遇到的
    -P          不遍歷任何符號鏈接(預設值)
    

    Tips: OWNER 和 GROUP 可以是數字的,也可以是符號的。

  • Examples:

    chown root /test          # 將 /test 的所有者改為 "root";
    chown root:staff /test    # 將 /test 的所有者改為 "root",組改為 "staff";
    chown -hR root /test      # 將 /test 和子文件的所有者改為 "root";
    
    chown --reference=/home /test   # 將 /test 的所有者和組都改成 /home 一樣;
    
    chgrp staff /test       # 將 /test 的組改為 "staff";
    chgrp -hR staff /test   # 將 /test 和子文件的組別改為 "staff";
    
    chgrp --reference=/home /test   # 將 /test 組改成 /home 一樣;
    

隱藏許可權(chattr, lsattr)

管理 Linux 系統中的文件和目錄,除了可以設定普通許可權和特殊許可權外,還可以利用文件和目錄具有的一些隱藏屬性。(幫助理解:lslist, chchange, attr==attribute)

  1. lsattr--列出Linux第二擴展文件系統的文件屬性

    • Usage:

      lsattr [ -RVadlpv ] [ files... ]
      
    • Options:

      -R     遞歸地列出目錄的屬性和它們的內容。
      -V     顯示程式版本。
      -a     列出目錄中的所有文件,包括以`.'開頭的文件。
      -d     像其他文件一樣列出目錄,而不是列出其內容。(類似ls 的 -d 參數)
      -l     使用長名稱而不是單字元縮寫來列印選項。
      -p     列出文件的項目編號。
      -v     列出文件的版本/代號。
      
  2. chattr--改變Linux文件系統中的文件屬性

    • Usage:

      chattr [ -RVf ] [ -v version ] [ -p project ] [-+=aAcCdDeijPsStTuFx] files...
      
    • Options:

      -R     遞歸地改變目錄及其內容的屬性。
      -V     對chattr的輸出保持粗略,並列印程式版本。
      -f     抑制大多數錯誤信息。。
      -v     設置文件的版本/代號。
      -p     設置文件的項目編號。
      
    • Attributes [aAcCdDeFijmPsStTux]:

      # 常用屬性
      i   不能修改(Immutable)。
              如果對 "文件" 設置,那麼不允許對文件進行進行任何的修改(刪除、重命名,創建鏈接和寫入數據等);
              如果對 "目錄" 設置,那麼只能修改目錄下文件中的數據,但不允許新建、重命名和刪除文件;
              (只有超級用戶或擁有 CAP_LINUX_IMMUTABLE 能力的進程可以設置或清除這個屬性。)
      a   只能附加數據(Append)。
              如果對 "文件" 設置,那麼只能在文件中追加數據,但不能刪除和修改數據;
              如果對 "目錄" 設置,那麼只允許在目錄中新建和修改文件,但不允許重命名和刪除文件;
              (只有超級用戶或擁有 CAP_LINUX_IMMUTABLE 能力的進程可以設置或清除這個屬性。)
      u   文件被刪除時(undeletable),設置了'u'屬性的文件被刪除時,其內容被保存。 這允許用戶要求撤銷其刪除。常用來防止意外刪除文件或目錄
      s   安全刪除(secure)。和 u 相反,刪除文件或目錄時,會被徹底刪除(直接從硬碟上刪除,然後用 0 填充所占用的區域),不可恢復。
      
      # 其他屬性
      A   不修改訪問時間(Atime)。不修改文件的最後訪問時間。
      c   壓縮文件(Compressed)。將文件或目錄壓縮後存放;設置了'c'屬性的文件被內核自動壓縮到磁碟上。 從這個文件中讀出的數據是未經壓縮的。 寫入這個文件時,在將數據存儲在磁碟上之前會對其進行壓縮。
      C   不執行寫入時複製(Copy) 。多個調用者獲取同一個資源,這時,另一個調用者對這資源進行了修改,不生成一個副本給(對於btrfs,'C'標誌應該被設置在新的或空的文件上。如果'C'標誌被設置了,那麼'c'標誌就不能被設置。)
      d   不轉儲(Dump)。當dump程式執行時,該文件或目錄不會被dump備份。
      D   同步目錄更新(Directory)。當設置了'D'屬性的目錄被修改時,修改內容會同步寫入磁碟;這相當於'dirsync'掛載選項應用於文件的一個子集。
      e   extent格式(一種文件系統格式)。表示該文件使用extents來映射磁碟上的塊。它不能用 chattr(1)刪除。
      F   設置了'F'屬性的目錄表示該目錄內的所有路徑查詢都是不區分大小寫的。 這個屬性只能在啟用了大小寫功能的文件系統上的空目錄中被改變。
      j   數據日誌(Journaling)
              如果文件系統是用 "data=ordered "或 "data=writeback "選項掛載的,並且文件系統有一個日誌,那麼具有'j'屬性的文件在被寫入文件本身之前,其所有的數據都被寫入ext3或ext4日誌。
              當文件系統以 "data=journal "選項掛載時,所有的文件數據都已經有了日誌,這個屬性沒有影響。(只有超級用戶或具有 CAP_SYS_RESOURCE 能力的進程才能設置或清除這個屬性。)
      m   不要壓縮(compress),具有'm'屬性的文件在支持每個文件壓縮的文件系統中被排除在壓縮之外。
      P   設置了'P'屬性的目錄將為項目ID強制執行一個層次結構。
      S   同步更新(synchronous),一旦應用程式對這個文件執行了寫操作,使系統立刻把修改的結果寫到磁碟。
      t   無尾部合併(tail-merging)。具有't'屬性的文件不會在文件的末尾有部分塊碎片與其他文件合併(對於那些支持尾部合併的文件系統)。 
      T   目錄層次結構的頂部(Top)。帶有'T'屬性的目錄將被認為是目錄層次的頂端,以便於Orlov塊分配器的使用。
      x   該屬性可以設置在一個目錄或文件上。 
              如果該屬性被設置在一個現有的目錄上,它將被隨後在該目錄中創建的所有文件和子目錄所繼承。  
              如果一個現有的目錄已經包含了一些文件和子目錄,在父目錄上修改屬性不會改變這些文件和子目錄的屬性。
      
      # 下麵的屬性是只讀的,不能用 chattr(1) 來設置或清除,但可以被 lsattr(1) 顯示。
      E   加密(encrypted),設置了'E'屬性的文件、目錄或符號鏈接是由文件系統加密的。 它
      I   索引目錄(indexed),"I "屬性被htree代碼使用,以表示一個目錄正在使用散列樹進行索引。 
      N   線上數據,設置了'N'屬性的文件表示該文件有內聯存儲的數據,在inode本身中。
      V   和真實性(verity),設置了'V'屬性的文件啟用了fs-verity。  它不能被寫入,文件系統將自動根據涵蓋整個文件內容的加密哈希值來驗證從它那裡讀出的所有數據,例如,通過Merkle樹。 這使得有效地驗證文件成為可能。
      
  3. Examples

    • lsattr:

      # 查看文件 屬性
      $ lsattr 文件名
      
      # 查看目錄 屬性
      $ lsattr -d 目錄名
      
      # 查看目錄下全部文件的屬性(本級目錄)
      $ lsattr -a 目錄名
      
      # 查看目錄下所有文件的屬性(本級目錄及子目錄)
      $ lsattr -R 目錄名
      
    • chattr:

      # 賦予 a 屬性
      $ chattr +a  文件名
      
      # 刪除 a 屬性
      $ chattr -a 文件名
      

ACL 訪問控制許可權(setfac, getfacl)

ACL,是 Access Control List(訪問控制列表)的縮寫,在 Linux 系統中, ACL 可實現對單一用戶設定訪問文件的許可權。也可以這麼說,設定文件的訪問許可權,除了用傳統方式(3 種身份ugo搭配 3 種許可權rwx),還可以使用 ACL 進行設定。

ACL 使用場景

202211161432213

如圖所示,根目錄中有一個 /project 目錄,這是班級的項目目錄。

  1. 場景一

    老師需要擁有對該目錄的最高許可權,本班級中的每個學員都可以訪問和修改這個目錄,其他班級的學員不能訪問這個目錄。需要怎麼規劃這個目錄的許可權呢?

    許可權分配(ugo + rwx):

    1. 老師使用 root 用戶,作為這個目錄的屬主,許可權為 rwx;
    2. 班級所有的學員都加入 tgroup 組,使 tgroup 組作為 /project 目錄的屬組,許可權是 rwx;
    3. 其他人的許可權設定為 0(即許可權為 ---)。
    
  2. 場景二

    接場景一後,班裡來了一位試聽的學員 stu ,她必須能夠訪問 /project 目錄,所以必須對這個目錄擁有 r 和 x 許可權;但是她又沒有學習過以前的課程,怕她改錯了目錄中的內容,所以不能賦予她 w 許可權;所以學員 stu 的許可權就是 r-x 。

    可是如何分配她的身份呢?

    • 變為屬主?當然不行,要不 root 該放哪裡?
    • 加入 tgroup 組?也不行,因為 tgroup 組的許可權是 rwx,
    • 而我們要求學員 stu 的許可權是 r-x 。如果把其他人的許可權改為 r-x 呢?這樣一來,其他班級的所有學員都可以訪問 /project 目錄了。

    顯然,普通許可權的三種身份不夠用了,無法實現對某個單獨的用戶設定訪問許可權,這種情況下,就需要使用 ACL 訪問控制許可權。


ACL 許可權應用

主要目的是提供傳統的owner, group, others的read, write, execute許可權之外的具體許可權設置。

設定 ACl 許可權,常用命令有 2 個,分別是 setfaclgetfacl 命令,前者用於給指定文件或目錄設定 ACL 許可權,後者用於查看是否配置成功。

  1. getfacl--獲取文件訪問控制列表

    • Usage:

      getfacl [-aceEsRLPtpndvh] file ...
      

      Tips: 如果發現在許可權位後面多了一個"+",表示此目錄擁有ACL許可權。

    • Options:

      -a, --access            只顯示文件訪問控制列表(預設,顯示所有信息)
      -d, --default           只顯示預設訪問控制列表(只顯示文件名,所屬者和所屬組)
      -c, --omit-header       不顯示註釋頭(不顯示文件名,所屬者和所屬組)
      -e, --all-effective     列印所有有效許可權
      -E, --no-effective      列印沒有生效的權利
      -s, --skip-base         跳過只有基本條目的文件(只顯示 setfacl 授權的文件)
      -R, --recursive         遞歸到子目錄里(遞歸顯示目錄和子目錄)
      -L, --logical           跟蹤符號鏈接
      -P, --physical          跳過所有符號鏈接,包括符號鏈接文件
      -t, --tabular           使用表格式輸出
      -n, --numeric           列印數字的用戶/組標識符(用戶名/組名使用 數字ID 顯示)
          --one-file-system   跳過不同文件系統上的文件
      -p, --absolute-names    在路徑名中不去除前面的'/' (不從絕對路徑名稱中刪除根的'/')
      -v, --version           版本
      -h, --help              幫助
      
    • getfacl的輸出格式如下:

       1. # file: somedir/
       2. # owner: lisa
       3. # group: staff
       4. # flags: -s-
       5. user::rwx
       6. user:joe:rwx               #effective:r-x
       7. group::rwx                 #effective:r-x
       8. group:cool:r-x
       9. mask::r-x
      10. other::r-x
      11. default:user::rwx
      12. default:user:joe:rwx       #effective:r-x
      13. default:group::r-x
      14. default:mask::r-x
      15. default:other::---
      
      # 第 1-3 行表示文件名、所有者和擁有組。
      # 第 4 行表示setuid(s)、setgid(s)和sticky(t)位:代表該位的字母,否則就是破折號(-)。(如果這些位中的任何一個被設置了,這一行就會被包括進去,否則就會被省略,所以它不會被顯示在大多數文件中。)
      # 第 5、7 和10 行對應於文件模式許可權位的用戶(u)、組(g)和其他(o)。這三條被稱為基本ACL條目。
      # 第 6行和第 8行是 “命名用戶” 和 “命名組” 條目。
      # 第 9 行是有效權利屏蔽。這個條目限制了授予 “所有組” 和 “命名用戶” 的有效權利。(文件所有者和其他人的許可權不受有效權利掩碼的影響;所有其他條目都受影響。)。
      # 第 11-15 行顯示與該目錄相關的預設ACL。(目錄可以有一個預設的ACL。普通文件沒有預設的ACL。)
      
      # getfacl的預設行為是同時顯示ACL和預設ACL,並且在條目的許可權與有效許可權不同的行中包含一個有效許可權註釋。
      # getfacl的輸出也可以作為setfacl的輸入。
      
  2. setfacl--設置文件訪問控制列表

    • Usage:

      setfacl [-bkndRLP] { -m|-M|-x|-X ... } file ...
      
    • Options:

      -m, --modify=acl        設置文件的當前ACL(添加 ACL 許可權)
      -M, --modify-file=file  從文件讀取訪問控制列表條目並更改
      -x, --remove=acl        從文件的ACL中刪除條目(刪除指定 ACL 許可權)
      -X, --remove-file=file  從文件讀取訪問控制列表條目並刪除
      -b, --remove-all        刪除所有擴展ACL條目(刪除全部 ACL 許可權)
      -k, --remove-default    刪除預設 ACL 許可權(如果沒有預設規則,將不提示)
          --set=acl           設置文件的 ACL,替換當前的 ACL
          --set-file=file     從文件中讀設置ACL規則
          --mask              重新計算有效的權利掩碼,即使ACL mask被明確指定
      -n, --no-mask           不重新計算有效的權利掩碼。setfacl預設會重新計算ACL mask,除非mask被明確的制定
      -d, --default           操作適用於預設ACL(設定預設的acl許可權,針對目錄而言)
      -R, --recursive         遞歸到子目錄中去(遞歸的對所有文件及目錄進行操作)
      -L, --logical           跟蹤符號鏈接(預設情況下只跟蹤符號鏈接文件,跳過符號鏈接目錄)
      -P, --physical          跳過所有符號鏈接,包括符號鏈接文件
          --restore=file      從文件恢復備份的acl規則(這些文件可由getfacl -R產生)。通過這種機制可以恢復整個目錄樹的acl規則。此參數不能和除--test以外的任何參數一同執行
          --test              測試模式,不會改變任何文件的acl規則,操作後的acl規格將被列出
      -v, --version           版本
      -h, --help              幫助
      
      --          命令行選項結束。所有剩下的參數都被解釋為文件名,即使它們以破折號開始。
      -           如果文件名參數是一個破折號,setfacl會從標準輸入中讀取一個文件列表。
      
    • ACL ENTRIES(條目):

      # setfacl工具可以設置以下ACL條目格式(為清晰起見,插入了空白):
      [d[efault]:] [u[ser]:]uid [:perms]
          # 一個指定的用戶的許可權。如果uid為空,則為文件所有者的許可權。
      
      [d[efault]:] g[roup]:gid [:perms]
          # 一個指定的組的許可權。如果gid為空,則為擁有組的許可權。
      
      [d[efault]:] m[ask][:] [:perms]
          # 有效的權利屏蔽
      
      [d[efault]:] o[ther][:] [:perms]
          # 其他人的許可權
      
      # 在修改和設置操作中使用適當的ACL條目包括許可權。(選項-m、-M、-set和-set-file)。 沒有perms欄位的條目被用於刪除條目(選項-x和-X)。
      
  3. Examples

    • getfacl:

      # 查看文件
      $ getfacl 文件名
      
      # 只查看目錄下 擁有 ACL許可權的文件
      $ getfacl -s 目錄名
      
      # 查看目錄下 所有文件
      $ getfacl -R 目錄名
      
    • setfacl:

      # 添加 ACL許可權
      $ setfacl -m u:用戶名:許可權 文件名       # 通過 所屬者方式
      $ setfacl -m g:組名:許可權 文件名        # 通過 所屬組方式
      
      $ setfacl -R -m u:用戶名:許可權 目錄名    # 通過 所屬者方式(如果這個目錄被mount掛載或nfs掛載上了,就不支持setfacl許可權操作了)
      $ setfacl -R -m g:組名:許可權 目錄名      # 通過 所屬組方式     
      
      # 刪除指定 ACL許可權
      $ setfacl -x u:用戶名 文件名            # 刪除文件上的這個 用戶的acl許可權
      $ setfacl -x g:組名 文件名             # 刪除文件上的這個 所屬組的acl許可權
      
      $ setfacl -R -x u:用戶名 目錄名           # 刪除目錄 上的這個用戶的acl許可權
      $ setfacl -R -x g:組名 目錄名           # 刪除目錄 上的這個所屬組的acl許可權
      
      # 刪除所有 ACL許可權
      $ setfacl -b 文件名            # 刪除文件 上的全部acl許可權
      $ setfacl -R -b 目錄名         # 刪除目錄 上的全部acl許可權
      
      # 預設 ACL許可權
      $ setfacl -m d:u:用戶名:許可權 目錄名     # 添加預設acl許可權
      $ setfacl -m d:g:組名:許可權 目錄名     # 添加預設acl許可權
      $ setfacl -k 目錄名                  # 刪除上預設acl許可權
      # 預設 ACL 許可權的作用是,如果給父目錄設定了預設 ACL 許可權,那麼父目錄中所有新建的子文件都會繼承父目錄的 ACL 許可權。需要註意的是,預設 ACL 許可權只對目錄生效。
      
    • setfacl 2:

      # 撤銷所有組和所有指定用戶的寫許可權(使用有效的權利屏蔽,限制了授予 “所有組” 和 “命名用戶” 的有效權利(文件所有者和其他人的許可權不受有效權利掩碼的影響;所有其他條目都受影響))
      $ setfacl -m m::rx file
      
      # 將一個文件的ACL複製到另一個文件上
      $ getfacl file1 | setfacl --set-file=- file2
      
      # 將訪問ACL複製到預設ACL中
      $ getfacl [-a] dir1 | setfacl -d -M- dir1
      

慄子

常用許可權慄子(rwx, SetUID、SetGID 和 SBIT)

我們先瞭解一下文件:

$ ls -l

drwxrwxr-x 2 noname noname 4096 Dec  1 10:51 dir/
-rw-rw-r-- 1 noname noname    0 Nov 24 09:25 test.txt

從左到右分別是: 文件類型、所屬者許可權、所屬組許可權、其他者許可權 所屬者 所屬組。。。

  • 文件類型: d -分別表示目錄和文件;
  • 所屬者許可權(u): 分表表示 讀(r)、寫(w)、執行(x) 和 SetUID(特殊許可權)
  • 所屬組許可權(g): 分表表示 讀(r)、寫(w)、執行(x) 和 SetGID(特殊許可權)
  • 其他者許可權(o): 分表表示 讀(r)、寫(w)、執行(x) 和 Sticky BIT(特殊許可權)
  • 所屬者、所屬組: 表示該文件的擁有者、所屬用戶組;
  • 其他者: 既不屬於文件或目錄的擁有者也不屬於文件或目錄的所屬組;

SetUID(s),SetGID(s) 和SBIT(t)分別顯示在 ugo 的 x 位置,如果本來在該位上有執行許可權(x), 則這些特殊標誌顯示為小寫字母 (s, s, t). 否則, 顯示為大寫字母 (S, S, T)

ugo中每一個rwx對應數字許可權:

  • 讀(r) = 4
  • 寫(w) = 2
  • 執行(x) = 1
  • 無 = 0

而特殊許可權是數字許可權的第一位,分別對應:

  • SetUID(s) = 4
  • SetGID(s) = 2
  • SBIT(t) = 1
  • 無 = 0 或空

case 1.普通許可權(rwx): rw-rw-r--

  • 數字授權

    $ chmod 644 test.txt
    # Or
    $ chmod 0644 test.txt
    
  • 字元授權

    $ chmod a+r test.txt
    $ chmod ug+w test.txt
    # Or
    $ chmod ug=rw test.txt
    $ chmod o=r test.txt
    

case 2.特殊許可權(sst), rw-rw-r--

  • 數字授權

    # 特權許可權在第一位
    $ chmod 0644 test.txt       # rw-rw-r--
    $ chmod 4644 test.txt       # rwSrw-r--
    $ chmod 2644 test.txt       # rw-rwSr--
    $ chmod 1644 test.txt       # rw-rw-r-T
    $ chmod 7644 test.txt       # rwSrwSr-T
    
    $ chmod ug+s test.txt       # rwSrwSr--
    $ chmod o+t test.txt       # rw-rw-r-T
    # Or
    $ chmod ug=rw test.txt
    $ chmod 7644 test.txt 
    
  • 字元授權

    $ chmod ug+s test.txt       # rwSrwSr--
    $ chmod o+t test.txt       # rw-rw-r-T
    # 取消授權,則使用 - 即可
    

case 3.所屬者和所屬組

  • 授權

    # 如果需要連帶子目錄一起,則加上 ‘-R’
    $ chgrp noname test.txt     # 將 test.txt 文件的所屬組改為 noname
    $ chown noname test.txt     # 將 test.txt 文件的所屬者改為 noname
    
    # 將 test.txt 文件的所屬者改為 noname ,所屬組改為 noname
    $ chown noname:noname test.txt
    $ chown noname.noname test.txt
    

setfacl 慄子

ACL可以針對單一用戶、單一文件或目錄來進行r,w,x的許可權控制,對於需要特殊許可權的使用狀況有一定幫助。如,某一個文件不讓單一的某個用戶訪問等。

setfacl -m:給用戶或群組添加 ACL 許可權

回歸上面的案例,解決方案如下:

  • 老師使用 root 用戶,並作為 /project 的所有者,對 project 目錄擁有 rwx 許可權;
  • 新建 tgroup 群組,並作為 project 目錄的所屬組,包含本班所有的班級學員(假定只有 zhangsan 和 lisi),擁有對 project 的 rwx 許可權;
  • 將其他用戶訪問 project 目錄的許可權設定為 0(也就是 ---)。
  • 對於試聽學員 stu 來說,我們對其設定 ACL 許可權,令該用戶對 project 擁有 rx 許可權
  1. 準備環境

    # 添加需要試驗的用戶和用戶組,省略設定密碼的過程
    [root@localhost ~]# useradd zhangsan
    [root@localhost ~]# useradd lisi
    [root@localhost ~]# useradd stu
    [root@localhost ~]# groupadd tgroup
    
    # 建立需要分配許可權的目錄
    [root@localhost ~]# mkdir /project
    
    # 改變/project目錄的所有者和所屬組
    [root@localhost ~]# chown root:tgroup /project
    
    # 指定/project目錄的許可權
    [root@localhost ~]# chmod 770 /project
    
    [root@localhost ~]# ll -d /project
    drwxrwx---. 2 root tgroup 4096 Apr 16 12:55 /project
    
  2. 分配許可權

    這時 stu 學員來試聽了,如何給她分配許可權

    # 給用戶 stu 賦予r-x許可權,使用"u:用戶名:許可權" 格式
    [root@localhost ~]# setfacl -m u:stu:rx /project
    [root@localhost /]# cd /
    [root@localhost /]# ll -d /project
    drwxrwx---+ 2 root tgroup 4096 Apr 16 12:55 /project
    ## 如果查詢時會發現,在許可權位後面多了一個"+",表示此目錄擁有ACL許可權
    
  3. 查看許可權

    # 查看/prpject目錄的ACL許可權
    [root@localhost /]# getfacl project
    # file:project  #<--文件名
    # owner:root  #<--文件的所有者
    # group:tgroup  #<--文件的所屬組
    user::rwx  #<--用戶名欄是空的,說明是所有者的許可權
    user:stu:r-x  #<--用戶stu的許可權
    group::rwx  #<--組名欄是空的,說明是所屬組的許可權
    mask::rwx  #<--mask許可權
    other::---  #<--其他人的許可權
    
  4. 同理分配組許可權

    [root@localhost /]# groupadd tgroup2
    # 添加新群組
    [root@localhost /]# setfacl -m g:tgroup2:rwx project
    # 為組tgroup2紛配ACL許可權
    [root@localhost /]# ll -d project
    drwxrwx---+ 2 root tgroup 4096 1月19 04:21 project
    # 屬組並沒有更改
    [root@localhost /]# getfacl project
    # file: project
    # owner: root
    # group: tgroup
    user::rwx
    user:stu:r-x
    group::rwx
    group:tgroup2:rwx  #<-用戶組tgroup2擁有了rwx許可權
    mask::rwx
    other::---
    

setfacl -m d:設定預設 ACL 許可權

預設 ACL 許可權的作用是,如果給父目錄設定了預設 ACL 許可權,那麼父目錄中所有新建的子文件都會繼承父目錄的 ACL 許可權。需要註意的是,預設 ACL 許可權只能對目錄設置。

  1. 準備環境

    前面已經對 project 目錄設定了 ACL 許可權,現在在此目錄中新建一些子文件和子目錄,檢驗這些文件是否會繼承父目錄的 ACL 許可權,如下:

    [root@localhost /]# cd /project
    
    #在/project目錄中新建了 file1.txt 文件和 dir1 目錄
    [root@localhost project]# touch file1.txt
    [root@localhost project]# mkdir dir1
    [root@localhost project]# ll
    總用量4
    -rw-r--r-- 1 root root 01月19 05:20 file1.txt
    drwxr-xr-x 2 root root 4096 1月19 05:20 dir1
    

    可以看到,這兩個新建立的文件許可權位後面並沒有 "+",表示它們沒有繼承 ACL 許可權。這說明,後建立的子文件或子目錄,並不會繼承父目錄的 ACL 許可權。

  2. 分配許可權--給 project 文件設定 stu 用戶訪問 rx 的預設 ACL 許可權,如下:

    [root@localhost /]# setfacl -m d:u:stu:rx project
    [root@localhost project]# getfacl project
    # file: project
    # owner: root
    # group: tgroup
    user:: rwx
    user:stu:r-x
    group::rwx
    group:tgroup2:rwx
    mask::rwx
    other::---
    default:user::rwx  #<--多出了default欄位
    default:user:stu:r-x
    default:group::rwx
    default:mask::rwx
    default:other::---
    
  3. 查看許可權

    新建子文件和子目錄,與賦予預設許可權前的子文件做比對

    [root@localhost /]# cd project
    [root@localhost project]# touch file2.txt
    [root@localhost project]# mkdir dir2
    [root@localhost project]# ll 總用量8
    -rw-r--r-- 1 root root 01月19 05:20 file1.txt
    -rw-rw----+ 1 root root 01月19 05:33 file2.txt
    drwxr-xr-x 2 root root 4096 1月19 05:20 dir1
    drwxrwx---+ 2 root root 4096 1月19 05:33 dir2
    

    新建的file2.txt和dir2已經繼承了父目錄的ACL許可權,而原先的 file1.txt 和 dir1 還是沒有 ACL 許可權,因為預設 ACL 許可權是針對新建立的文件生效的。


setfacl 刪除 ACL 許可權(-k, -x, -b)

  1. 刪除預設許可權(-k)

    使用 setfacl -k 命令,可以刪除指定文件的 ACL 預設許可權,如刪除前面 project 目錄的 ACL 預設許可權:

    # 需要一起移除子目錄的許可權,則加上 ‘-R’ 參數即可。
    [root@localhost /]# setfacl -k project
    # project 目錄的預設許可權以被刪除
    [root@localhost /]# getfacl project
    # file: project
    # owner: root
    # group: tgroup
    user:: rwx
    user:stu:r-x
    group::rwx
    group:tgroup2:rwx
    mask::rwx
    other::---
    
  2. 刪除指定的 ACL 許可權(-x)

    使用 setfacl -x 命令,可以刪除指定的 ACL 許可權,如刪除前面建立的 st 用戶對 project 目錄的 ACL 許可權:

    [root@localhost /]# setfacl -x u:st project
    # st用戶的許可權已被刪除
    [root@localhost /]# getfacl project
    # file: project
    # owner: root
    # group: tgroup
    user::rwx
    group::rwx
    group:tgroup2:rwx
    mask::rwx
    other::---
    
  3. 刪除指定文件的所有 ACL 許可權(-b)

    使用 setfacl -b 命令,可刪除所有與指定文件或目錄相關的 ACL 許可權。如現在我們刪除一切與 project 目錄相關的 ACL 許可權:

    [root@localhost /]# setfacl -b project
    # 所有ACL許可權已被刪除
    [root@localhost /]# getfacl project
    # file: project
    # owner: root
    # group: tgroup
    user::rwx
    group::rwx
    other::---
    

setfacl -m m:設定限制已授予的 “所有組” 和 “命名用戶” 的有效權利

這個條目只能限制已授予 “所有組” 和 “命名用戶” 的有效權利。(文件所有者和其他人的許可權不受有效權利掩碼的影響;所有其他條目都受影響。)

  • 環境

    # 環境目錄 project
    [root@localhost /]# getfacl project
    # file: project  #<--文件名
    # owner: root  #<--文件的屬主
    # group: tgroup  #<--文件的屬組
    user::rwx  #<--用戶名欄是空的,說明是所有者的許可權
    group::rwx  #<--組名欄是空的,說明是所屬組的許可權
    other::---  #<--其他人的許可權
    
    #給用戶stu設定針對project目錄的rx許可權
    [root@localhost /]# setfacl -m u:stu:rx /project
    [root@localhost /]# getfacl project
    # file: project 
    # owner: root
    # group: tgroup 
    user::rwx 
    user:stu:r-x  #<--用戶 stu 的許可權
    group::rwx
    mask::rwx  #<--mask 許可權
    other::---
    

    對比添加 ACL 許可權前後 getfacl 命令的輸出信息,後者多了 2 行信息,一行是我們對 st 用戶設定的 r-x 許可權,另一行就是 mask 許可權。

    mask 許可權,指的是用戶或群組能擁有的最大 ACL 許可權,也就是說,給用戶或群組設定的 ACL 許可權不能超過 mask 規定的許可權範圍,超出部分做無效處理。

  • 分配限制許可權

    mask 許可權可以使用 setfacl 命令手動更改,比如,更改 project 目錄 mask 許可權值為 r-x,如下:

    # 設定mask許可權為r-x,使用"m:許可權"格式
    [root@localhost ~]# setfacl -m m:rx /project
    [root@localhost ~]# getfacl /project
    # file:project
    # owner:root
    # group:tgroup
    user::rwx
    group::rwx      #effective:r-x
    mask::r-x  #<--mask許可權變為r-x
    other::---
    

    如上所示,給 stu 用戶賦予訪問 project 目錄的 r-x 許可權,還需要和 mask 許可權對比,r-x 確實是在 rwx 範圍內,這時才能說 st 用戶擁有 r-x 許可權。(#effective:r-x 表示該項實際許可權)

    不過,我們一般不更改 mask 許可權,只要賦予 mask 最大許可權(也就是 rwx),則給用戶或群組設定的 ACL 許可權本身就是有效的。


sudo 慄子

case 1.把wangsb,wangbz,songj用戶設置成別名ADMINS,都擁有sudo許可權

  • # visudo

    # 定義用戶列表
    User_Alias ADMINS = wangsb, songj,wangbz
    # 使用用戶別名
    ADMINS ALL=(ALL) ALL
    

case 2.把visudo、chown、chmod等命令設置成別名DELEGATING,別名ADMINS裡面的用戶都禁用DELEGATING裡面的命令

  • # visudo

    # 定義命令列表
    Cmnd_Alias DELEGATING = /usr/sbin/visudo, /bin/chown, /bin/chmod, /bin/chgrp
    # 使用命令別名
    ADMINS ALL=(ALL) ALL,!DELEGATING
    

case 3.同時給多個用戶授予同樣的許可權

  • # visudo

    # 定義別名列表
    User_Alias ADMINS = wangbz,zhoulw,songj,wangsb
    Cmnd_Alias DELEGATING = /usr/sbin/visudo, /bin/chown, /bin/chmod, /bin/chgrp
    
    # 使用別名
    root ALL=(ALL) ALL
    ADMINS ALL=(ALL) ALL,!DELEGATING,!/bin/bash,!/bin/su
    
    # 每次使用sudo 都需要輸入密碼
    Defaults timestamp_timeout = 0
    

case 4.同時給多個用戶授予同樣的許可權

  • # visudo

    # 此配置信息表示: sudoGroup 這個群組中的所有用戶都能夠使用 sudo 切換任何身份,執行任何命令。
    %sudoGroup ALL=(ALL) ALL
    

    這樣配置的

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.面向對象 面向對象編程是在面向過程編程的基礎上發展來的,它比面向過程編程具有更強的靈活性和擴展性,所以可以先瞭解下什麼是面向過程編程: 面向過程編程的核心是過程,就是分析出實現需求所需要的步驟,通過函數一步一步實現這些步驟,接著依次調用即可,再簡單理解就是程式 從上到下一步步執行,從頭到尾的解決 ...
  • 來源:https://developer.aliyun.com/article/694020 非同步調用幾乎是處理高併發Web應用性能問題的萬金油,那麼什麼是“非同步調用”? “非同步調用”對應的是“同步調用”,同步調用指程式按照定義順序依次執行,每一行程式都必須等待上一行程式執行完成之後才能執行;非同步調 ...
  • Maven可以使我們在構建項目時需要用到很多第三方類jar包,如下一些常用jar包 而maven的出現可以讓我們避免手動導入jar包出現的某些問題,它可以自動下載那須所需要的jar包 我們只需要在創建的maven項目自動生成的pom.xml中輸入如下代碼 <dependencies> <!--ser ...
  • 很多軟體工程師都認為MD5是一種加密演算法,然而這種觀點是不對的。作為一個 1992 年第一次被公開的演算法,到今天為止已經被髮現了一些致命的漏洞。本文討論MD5在密碼保存方面的一些問題。 ...
  • 經常看到有群友調侃“為什麼搞Java的總在學習JVM調優?那是因為Java爛!我們.NET就不需要搞這些!”真的是這樣嗎?今天我就用一個案例來分析一下。 昨天,一位學生問了我一個問題:他建了一個預設的ASP.NET Core Web API的項目,也就是那個WeatherForecast的預設項目模 ...
  • 這篇文章主要是想針對多進程的創建和一些通信手段來進行一下記錄 創建子進程 關於創建子進程的原型一般都是用的這個,直接fork,這個函數在父進程中調用,在父子進程中各有一個pid_t類型的返回值,父進程中得到的是子進程的ID,子進程中得到的是0值。當然調用失敗就是-1。 //創建進程,然後複製出另一份 ...
  • win11 22h2更穩定了 在win11 22h2發佈後沒多久,我就升級到了這個版本,截止目前已經使用半個月了,談談我的使用感受。 總體要比之前的版本更穩定,表現為筆記本風扇不會突然響,突然卡頓,不過系統更新頻繁比win10多很多。 界面變好看了 外觀上變化較大的就是資源管理器支持標簽頁化 資源管 ...
  • Linux 下使用 Shell 處理文本時最常用的工具有: find、grep、xargs、sort、uniq、tr、cut、paste、wc、sed、awk。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...