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想要看一下我的項目,看看我寫的代碼有多流弊,然而我不好意思拒絕,這個時候我有三種選擇:
- 讓其成為所有者(這個當然不可能)
- 讓其成為項目組成員(然而她並沒有參與開發,再說她也基本看不懂代碼,萬一不小心刪掉了部分代碼咋弄?)
- 給其它人賦以
r-x
的權限(然而,other用戶太多了吧,萬一我代碼沒發布就被競爭對手給copy了呢?)
看來,以上三種手段都不靠譜啊,怪就怪other的用戶全太大了,唉,這可咋整?
那么,我們為什么不為Sherry開小灶呢?就是讓其不屬於任何一個組,只是以單用戶的身份被賦予特定權限。
這種“開小灶”的方式,其實就是ACL權限!
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,文件系統為XFS,XFS默認支持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
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
特點:永久開啟
完成修改后,需要重啟或者重新掛載你設置的分區,此處我需要重新掛載根分區:
- 掛載: 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