Linux文件權限與屬性詳解 之 ACL


Linux文件權限與屬性詳解 之 一般權限
Linux文件權限與屬性詳解 之 ACL
Linux文件權限與屬性詳解 之 SUID、SGID & SBIT
Linux文件權限與屬性詳解 之 chattr & lsattr
Linux文件權限與屬性詳解 之 su & sudo

ACL權限

1. 什么是ACL

ACL(Access Control List),訪問控制列表。
那么這玩意有啥用處呢?下面我們考慮一種場景:

假設我Jimmy創建了一個項目文件夾,我和我的開發團隊Rocket對該目錄均具備 rwx 的權限,因為我該文件夾下有源碼等,不能對外開放,所以對其他用戶的權限為0,即我的文件夾目錄為 drwxrwx---;
然而有一天,我的一個灰常好的盆友Sherry想要看一下我的項目,看看我寫的代碼有多流弊,然而我不好意思拒絕,這個時候我有三種選擇:

  1. 讓其成為所有者(這個當然不可能)
  2. 讓其成為項目組成員(然而她並沒有參與開發,再說她也基本看不懂代碼,萬一不小心刪掉了部分代碼咋弄?)
  3. 給其它人賦以 r-x 的權限(然而,other用戶太多了吧,萬一我代碼沒發布就被競爭對手給copy了呢?)
    看來,以上三種手段都不靠譜啊,怪就怪other的用戶全太大了,唉,這可咋整?

那么,我們為什么不為Sherry開小灶呢?就是讓其不屬於任何一個組,只是以單用戶的身份被賦予特定權限。
這種“開小灶”的方式,其實就是ACL權限!
mark
ACL可以針對單一用戶、單一文件或目錄來進行r、w、x的權限設置,對於需要特殊權限的使用狀況非常有幫助

2. ACL的操作

0). 查看系統是否支持ACL

首先,我們看一下自己的Linux系統存在着那些硬盤:

[niesh@niesh ~]$ df -Th
文件系統                      類型      容量  已用  可用 已用% 掛載點
/dev/mapper/centos_niesh-root xfs        18G  8.5G  9.1G   49% /
devtmpfs                      devtmpfs  348M     0  348M    0% /dev
tmpfs                         tmpfs     363M   84K  363M    1% /dev/shm
tmpfs                         tmpfs     363M  5.5M  358M    2% /run
tmpfs                         tmpfs     363M     0  363M    0% /sys/fs/cgroup
/dev/sda1                     xfs       497M  158M  339M   32% /boot
.host:/                       vmhgfs    271G   42G  229G   16% /mnt/hgfs
tmpfs                         tmpfs      73M   16K   73M    1% /run/user/42
tmpfs                         tmpfs      73M     0   73M    0% /run/user/1000

根目錄(/)的掛載點此處為/dev/mapper/centos_niesh-root,我們可以查看其是否支持ACL權限

[root@niesh ~]# dumpe2fs -h /dev/centos_niesh/root
dumpe2fs 1.42.9 (28-Dec-2013)
dumpe2fs: Bad magic number in super-block 當嘗試打開 /dev/centos_niesh/root 時
找不到有效的文件系統超級塊.

很郁悶,居然報這個錯誤,查了很多資料,發現dumpe2fs命令為ext文件系統家族的命令,我的系統為CentOS7,文件系統為XFSXFS默認支持ACL:

[root@niesh ~]# lsb_release -a
LSB Version:    :core-4.1-amd64:core-4.1-noarch:cxx-4.1-amd64:cxx-4.1-noarch:desktop-4.1-amd64:desktop-4.1-noarch:languages-4.1-amd64:languages-4.1-noarch:printing-4.1-amd64:printing-4.1-noarch
Distributor ID: CentOS
Description:    CentOS Linux release 7.2.1511 (Core)
Release:        7.2.1511
Codename:       Core

[root@niesh ~]# df -Th
文件系統                      類型      容量  已用  可用 已用% 掛載點
/dev/mapper/centos_niesh-root xfs        18G  8.5G  9.1G   49% /

可以使用 xfs_info /dev/xxx查看'XFS`文件系統信息:

[root@niesh ~]# xfs_info /dev/centos_niesh/root
meta-data=/dev/mapper/centos_niesh-root isize=256    agcount=4, agsize=1144832 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=0        finobt=0
data     =                       bsize=4096   blocks=4579328, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=0
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

但是,貌似看不到是否支持ACL權限,我也只能這樣了 *(誰知道怎么查看請留言告訴我,不勝感激) * !

1). 安裝ACL

系統默認的是不會安裝ACL權限的,因此需要我們自己動手:

  • RPM 包
    前提:能夠獲取到系統安裝包
    命令:rpm -ivh libacl-x.x.xx-x.x acl-x.x.xx-x.x.rpm
  • yum:
    前提:主機已經聯網,且yum可用
    命令:yum -y insatll libacl acl

mark

2). 開啟ACL

首先,我們查看一下我們Linux系統的ACL權限有沒有開啟:
使用 mount命令:

[root@niesh ~]# mount
/dev/mapper/centos_niesh-root on / type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
selinuxfs on /sys/fs/selinux type selinuxfs (rw,relatime)
systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=34,pgrp=1,timeout=300,minproto=5,maxproto=5,direct)

很明顯,/dev/mapper/centos_nie-root沒有ACL權限,我們需要自己手動開啟。
開啟的方式有兩種:

  • 命令開啟
    命令: mount -o remount,acl /
    特點:臨時性,重啟失效
  • 文件開啟
    命令: vim /etc/fstab
    特點:永久開啟

mark

完成修改后,需要重啟或者重新掛載你設置的分區,此處我需要重新掛載根分區:

  • 掛載: mount -o remount /
  • 重啟: restart

3). ACL文件設置

最常用的有以下2個命令:

  • getfacl: 獲取文件或目錄的ACL設置信息
    命令: getfacl [-bkndRLP] { -m|-M|-x|-X ... } file ...
    參數:

-a , --access:顯示文件或目錄的訪問控制列表
-d , --default:顯示文件或目錄的默認(缺省)的訪問控制列表
-c , --omit-header:不顯示默認的訪問控制列表
-R , --recursive:操作遞歸到子目錄

  • setfacl: 設置文件或目錄的ACL設置信息
    命令:setfacl [-bkndRLP] { -m|-M|-x|-X ... } file ...
    參數:

-m, --modify=acl:修改文件或目錄的擴展ACL設置信息
-x, --remove=acl:從文件或目錄刪除一個擴展的ACL設置信息
-b, --remove-all:刪除所有的擴展的ACL設置信息
-k, --remove-default:刪除缺省的acl設置信息
-n, --no-mask:不要重新計算有效權限。setfacl默認會重新計算ACL mask,除非mask被明確的制定
-d, --default:設置默認的ACL設置信息(只對目錄有效)
-R, --recursive:操作遞歸到所有子目錄和 文件

針對我們最開始討論問題,此處我們進行實戰練習。
首先,我建立一個目錄Project:

[niesh@niesh tmp]$ mkdir -m 770 Project
[niesh@niesh tmp]$ ll
總用量 0
drwxrwx---. 2 niesh niesh 6 7月  28 15:44 Project

其次,我增加一個新用戶叫做Sherry:

[root@niesh ~]# useradd Sherry
[root@niesh ~]# passwd Sherry
[root@niesh ~]# 

再次,查看我和Sherry分別屬於哪一個組:

[root@niesh ~]# groups Sherry
Sherry : Sherry
[root@niesh ~]# groups niesh
niesh : niesh wheel

很明顯我倆不屬於同一個組,因此Sherry對我建立的 Project 目錄不具備任何權限:

[Sherry@niesh tmp]$ cd Project/
bash: cd: Project/: 權限不夠
[Sherry@niesh tmp]$ ^C
[Sherry@niesh tmp]$ ll Project/
ls: 無法打開目錄Project/: 權限不夠

然后,我增加Sherry的ACL權限:

[niesh@niesh tmp]$ setfacl -m u:Sherry:rx Project/
[niesh@niesh tmp]$ ll
總用量 4
drwxrwx---+ 2 niesh niesh 6 7月  28 15:44 Project

看到了吧,以上權限第11位有一個 + 號,代表的就是ACL權限

4). 查看ACL權限

我們可以使用 getfacl命令查看剛才設置好的權限:
設置之前:

[niesh@niesh tmp]$ getfacl Project/
# file: Project/
# owner: niesh
# group: niesh
user::rwx
group::rwx
other::---

設置之后:

[niesh@niesh tmp]$ getfacl Project/
# file: Project/
# owner: niesh
# group: niesh
user::rwx
user:Sherry:r-x
group::rwx
mask::rwx
other::---

多了幾行:

  • user:Sherry:r-x: 表示Sherry具備的ACL權限為 r-x
  • mask::rwx: 表示ACL的最大權限,用你分配給用戶的權限與mask相與(類似於子網掩碼)

5). 刪除ACL

采用 setfacl -d <dir>命令:

[niesh@niesh tmp]$ setfacl -b Project/
[niesh@niesh tmp]$ ll
總用量 0
drwxrwx---. 2 niesh niesh 6 7月  28 15:44 Project

[niesh@niesh tmp]$ getfacl Project/
# file: Project/
# owner: niesh
# group: niesh
user::rwx
group::rwx
other::---

刪除我剛才建立的Sherry用戶:

[root@niesh ~]# userdel -r Sherry
[root@niesh ~]# cat /etc/passwd


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM