第六章 linux用戶組和權限管理
用戶組和權限管理
介紹安全3A
?資源分派:
Authentication:認證
Authorization:授權
Accouting|Audition:審計
用戶user
?令牌token,identity
登陸成功後拿到令牌。
?Linux用戶:Username/UID
?管理員:root, 0
?普通用戶:1-65535
系統用戶:1-499, 1-999(CentOS7)
對守護進程獲取資源進行權限分配
登錄用戶:500+, 1000+(CentOS7)
交互式登錄
組group
?Linux組:Groupname/GID
?管理員組:root, 0
?普通組:
系統組:1-499, 1-999(CENTOS7)
普通組:500+, 1000+(CENTOS7)
其實在Linux中並不分成管理員組和用戶組,主要分主組和附加組。
安全上下文
?Linux安全上下文
運行中的程序:進程(process)
以進程發起者的身份運行:
root: /bin/cat
mage: /bin/cat
進程所能夠訪問資源的權限取決於進程的運行者的身份
組的類別
?Linux組的類別
用戶的主要組(primary group)
用戶必須屬於一個且只有一個主組(並且主組不能刪除)
組名同用戶名,且僅包含一個用戶,私有組
用戶的附加組(supplementary group)
一個用戶可以屬於零個或多個輔助組
[root@localhost ~]#id postfix
uid=89(postfix) gid=89(postfix) groups=89(postfix),12(mail)
查看用戶的id和主組和附加組,一個組已經成為了某個賬號的主組,這個組是不能刪除的。
用戶和組的配置文件
?Linux用戶和組的主要配置文件:
/etc/passwd:用戶及其屬性信息(名稱、UID、主組ID等)
/etc/group:組及其屬性信息
/etc/shadow:用戶密碼及其相關屬性
/etc/gshadow:組密碼及其相關屬性
passwd文件格式 ?login name:登錄用名(wang) ?passwd:密碼(x) ?UID:用戶身份編號(1000) ?GID:登錄默認所在組編號(1000) ?GECOS:用戶全名或註釋 ?home directory:用戶主目錄(/home/wang) ?shell:用戶默認使用shell (/bin/bash) [root@localhost ~]#whatis passwd passwd (1) - update user‘s authentication tokens sslpasswd (1ssl) - compute password hashes passwd (5) - password file 查看/etc/passwd幫助,是在第5章。 [root@localhost ~]#man 5 passwd PASSWD(5) Linux Programmer‘s Manual PASSWD(5)
NAME passwd - password file
DESCRIPTION The /etc/passwd file is a text file that describes user login accounts for the system. name:password:UID:GID:GECOS:directory:shell 查看/etc/passwd的幫助,每個字段表示的意思如上面最後一行描述所示,字段間用冒號隔開,其中CECOS是用戶全名或註釋,其他的應該都是可以理解的。 [root@localhost ~]#getent passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin [root@localhost ~]#cat /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 上面兩條命令都能查看passwd內容,第一條命令方便點。 [root@localhost ~]#getent passwd sunan sunan:x:1000:1000:sunan:/home/sunan:/bin/bash 想查看某個用戶後面直接加上用戶名即可,這就是上面說的方便。 [root@localhost ~]#pwunconv [root@localhost ~]#getent passwd sunan sunan:$6$5ROKagTj/2yRGbuE$zwaSMvClYng4.oIE0fY90cY2SWL4HoIzZ.3da8x0BE1wJSn64fAXbS1E9leXiYvQ04tgv/Hf9E2lAl7BTOW/N0:1000:1000:sunan:/home/sunan:/bin/bash 使用上面命令是使/etc/shadow中的密碼回歸到/etc/passwd中,但是這樣不安全,並且使得/etc/shadow文件丟失。同時對修改用戶名,不建議在passwd中直接改, 因為不止passwd中有用戶名,shadow中也有,這樣就需要改多個文件。盡量使用命令改用戶名,這樣涉及這個用戶的所有文件都可以修改掉。 [root@localhost ~]#cat /etc/shadow cat: /etc/shadow: No such file or directory [root@localhost ~]#pwconv [root@localhost ~]#cat /etc/shadow root:$6$N23hSc6iqrrtt7A.$OL78oRDi5TwUd1fy6tnzQxeZIA3/jlU3WhGVynPTaymVsJdBftbL6jLGD2l41GLSWs4H0F1DaSV8C.deWCeDl1:17486:0:99999:7::: 再回到系統默認的文件,執行pwconv即可。 root@localhost ~]#vim /etc/passwd root:x:1000:0:root:/root:/bin/bash sunan:x:0:1000:sunan:/home/sunan:/bin/bash gentoo:x:1001:1001:Gentoo Distribution:/home/gentoo:/bin/csh "/etc/passwd" 42L, 2168C written 修改root UID為1000,sunan UID為0這樣孫安就擁有了超級管理員權限。如果是root和sunan的UID都不為0了怎麽辦,這樣就沒人擁有管理員權限了,其實只要有一個終端還沒退出管理員登陸,就可以形式管理員權限,因為在登錄的時候就已經授予管理員權限了,只要不退出就一直擁有管理員權限。創建個快照,我們試一試沒有管理員系統會發生什麽。 root@localhost ~]#vim /etc/passwd root:x:1000:0:root:/root:/bin/bash sunan:x:0:1000:sunan:/home/sunan:/bin/bash gentoo:x:1001:1001:Gentoo Distribution:/home/gentoo:/bin/csh "/etc/passwd" 42L, 2168C written 重啟發現啟動不了了,重啟進入菜單選項,centos7上選擇第一項按e鍵,進入編輯界面。
在上圖的最後添加 init=/bin/sh
最後的提示可以看到敲Ctrl+x啟動生效
上圖可以看到文件系統是只讀的,不能在 / 下面創建文件,通過命令把 / 改為可讀寫,這樣就可以創建文件了。然後,修改/etc/passwd文件中的root的UID為0,exit退出重啟即可。 Centos6.9上:
在上面的最後空格添加 init=/bin/bash 然後敲回車
可以看到文件系統是只讀的,不能在 / 下面創建文件,通過命令把 / 改為可讀寫,這樣就可以創建文件了。
通過nano修改root的UID為0,exit退出重啟。 [root@localhost ~]#chfn sunan Changing finger information for sunan. Name [sunan]: sunan Office []: opt Office Phone []: 12 Home Phone []: 12 Finger information changed. [root@localhost ~]#getent passwd sunan sunan:x:1000:1000:sunan,opt,12,12:/home/sunan:/bin/bash chfn修改用戶的信息說明,可以看到用戶信息已經修改 [root@localhost ~]#finger sunan Login: sunan Name: sunan Directory: /home/sunan Shell: /bin/bash Office: opt, 12 Home Phone: 12 Last login Thu Nov 16 10:29 (CST) on pts/1 No mail. No Plan. 使用finger查看信息,finger默認沒有安裝,需要手工進行安裝。 一般不推薦直接改文件,可能很多的相關文件沒有一起改過來導致許多問題。推薦使用命令改文件。 [root@localhost ~]#usermod -d /a sunan [root@localhost /]#getent passwd sunan sunan:x:1000:1000:sunan,opt,12,12:/a:/bin/bash usermod -d 修改文件的家目錄為/a. [root@localhost /]#usermod -s /bin/csh sunan [root@localhost /]#getent passwd sunan sunan:x:1000:1000:sunan,opt,12,12:/a:/bin/csh uermod -s修改文件的shell。 shadow文件格式 ?登錄用名 ?用戶密碼:一般用sha512加密 ?從1970年1月1日起到密碼最近一次被更改的時間 ?密碼再過幾天可以被變更(0表示隨時可被變更) ?密碼再過幾天必須被變更(99999表示永不過期) ?密碼過期前幾天系統提醒用戶(默認為一周) ?密碼過期幾天後帳號會被鎖定 ?從1970年1月1日算起,多少天後帳號失效 密碼加密 ?加密機制: 加密:明文--> 密文 解密:密文--> 明文 ?單向加密:哈希算法,原文不同,密文必不同 相同算法定長輸出,獲得密文不可逆推出原始數據 雪崩效應:初始條件的微小改變,引起結果的巨大改變 md5: message digest, 128bits(被山東大學的王曉雲破解) sha1: secure hash algorithm, 160bits sha224: 224bits sha256: 256bits sha384: 384bits sha512: 512bits ?更改加密算法authconfig--passalgo=sha256 --update 密碼的復雜性策略 ?使用數字、大寫字母、小寫字母及特殊字符中至少3種 ?足夠長 ?使用隨機密碼 ?定期更換,不要使用最近曾經使用過的密碼 密碼期限
[sunan@localhost ~]$cat /etc/passwd |tail -1 sunan:x:500:500::/home/sunan:/bin/bash [sunan@localhost ~]$cat /etc/shadow cat: /etc/shadow: Permission denied 普通用戶能夠查看/etc/passwd的文件內容,所以說把密碼放到/etc/passwd 中是不安全的。因為普通用戶無法查看/etc/shadow的文件內容,所以將密碼放到此文件中安全。 [root@localhost ~]#getent shadow sunan sunan:$6$5qiTgU8L79smDQjz$q0x9YtylUSvKk6we5vFxh0fniK/NztI5TvxYJiNUyKNbTq/UF4fDSW6v/SNcXs8b/Yc6XcA4TU4ptPznYBGrc1:17477:0:99999:7::: 查看文件的密碼格式,其中5qiTgU8L79smDQjz是salt作用是為了兩個口令一樣的用戶使得他們的加密口令不同。6代表使用sha512加密算法。 [root@localhost ~]#authconfig --passalgo=sha256 --update [root@localhost ~]#passwd sunan 修改加密算法 [root@localhost ~]#getent shadow sunan sunan:$5$SinBLQy1$Cp6PRG5sx4KwRrY/gaTbTCJ3Ucqyk8YhfWdbO5vxJy7:17480:0:99999:7::: 可以看到加密算法變成了5即sha256 [root@localhost ~]#openssl rand -base64 30 RJtQTh4g+npXoiU0YOoySeLZIZLLs4Gk8HgeSQgP 產生base64的30不是30位的隨機密碼,想要30位隨機密碼還需要處理。 [root@localhost ~]#cat /etc/login.defs 文件中設定的是什麽樣的加密算法,不建議直接更改。 [root@localhost ~]#useradd sun [root@localhost ~]#getent shadow sun sun:!!:17480:0:99999:7::: 系統默認創建的賬號不是空口令,看到密碼位是!!是鎖定的意思,不能空口令登陸,redhat使用usermod -U sun 兩次解鎖可以登陸,centos6就不行。 註意:關於將shell改為/sbin/nologin 則不可以進行交互式登陸了。 [root@localhost ~]#usermod -L sun [root@localhost ~]#getent shadow sun sun:!$6$.hHKjOk4$RFAVAXDBsABcPTQcPle1UMtD9KMUOtJthFKDyrnplYNVEUJUkw8.3UekyoeAskpblkrDW1USxvuopOnyTVyu41:17480:0:99999:7::: 可以看到加密密碼前面有個!,意思是被鎖定了,不能登陸。 [root@localhost ~]#usermod -U sun 將賬戶解鎖 [root@localhost ~]#echo 123456|passwd --stdin sunn Changing password for user sunn. passwd: all authentication tokens updated successfully. 直接修改口令。 [root@localhost ~]#HISTCONTROL=ignoreboth [root@localhost ~]# echo a a 將命令前面加空格的命令不記入history,這樣修改密碼就會不記入歷史了。 [root@localhost ~]#getent shadow sunn sunn:$6$K2cnHStn$6p5kCrPubFjOewLG0poYDbTsLsbGTUZK0tYQ2xlxQzz3hfb3G5F0Hry/L6ZMq2JLK10oSEqNcaIq2xbx7UuvD1:17486:0:99999:7::: [root@localhost ~]#passwd -e sunn Expiring password for user sunn. passwd: Success [root@localhost ~]#getent shadow sunn sunn:$6$K2cnHStn$6p5kCrPubFjOewLG0poYDbTsLsbGTUZK0tYQ2xlxQzz3hfb3G5F0Hry/L6ZMq2JLK10oSEqNcaIq2xbx7UuvD1:0:0:99999:7::: 使用戶的密碼馬上失效命令,即17486為0了,登陸這個賬號必須馬上改口令。 [root@localhost ~]#chage -d0 sunn [root@localhost ~]#getent shadow sunn sunn:$6$/GeZGBic$qREMr/tD.L4RVNdDuBPy3V09cU1f3Bjbm/UPkozpOdJf0bqVVPOuw3uUMDYU.8HEVOjWrFd9SCp1SbEFUplN.0:0:0:99999:7::: 這樣也可以。 [root@localhost ~]#chage -d chage: option requires an argument -- ‘d‘ Usage: chage [options] LOGIN
Options: -d, --lastday LAST_DAY set date of last password change to LAST_DAY -E, --expiredate EXPIRE_DATE set account expiration date to EXPIRE_DATE -h, --help display this help message and exit -I, --inactive INACTIVE set password inactive after expiration to INACTIVE -l, --list show account aging information -m, --mindays MIN_DAYS set minimum number of days before password change to MIN_DAYS -M, --maxdays MAX_DAYS set maximim number of days before password change to MAX_DAYS -R, --root CHROOT_DIR directory to chroot into -W, --warndays WARN_DAYS set expiration warning days to WARN_DAYS chage的使用用法。 [root@localhost ~]#chage sunn Changing the aging information for sunn Enter the new value, or press ENTER for the default
Minimum Password Age [0]: Maximum Password Age [99999]: 99999 Last Password Change (YYYY-MM-DD) [1970-01-01]: 2017-11-15 Password Expiration Warning [7]: 7 Password Inactive [-1]: -1 Account Expiration Date (YYYY-MM-DD) [-1]: --》-1是永不過期,設2018-11-11過期 一個一個改。 group文件格式 ?群組名稱:就是群組名稱 ?群組密碼:通常不需要設定,密碼是被記錄在/etc/gshadow ?GID:就是群組的ID ?以當前組為附加組的用戶列表(分隔符為逗號) 記錄一個問題: 同學問為什麽在/etc/group最後只能看到以這個組為附加組用戶,不能看到以這個組為主組用戶? 答:/etc/group記錄了 組名 組密碼 組ID 附加組列表,以當前組為主組的用戶是記錄到/etc/passwd中的,通過對應組ID就可以找到這個以這個組為主組的用戶。 修改group: id不加任何選項,查看的是當前登錄的當前信息。剛改的文件需要重新登錄,才能顯示出來。id後面加用戶名,系統認為你讀取的是別的用戶,即可讀取到新的信息。如果把當前用戶加到組裏面了,必須要重新登錄,用戶才知道自己加到這個新組了。 gshdow文件格式 ?群組名稱:就是群組名稱 ?群組密碼:(組默認沒有口令) ?組管理員列表:組管理員的列表,更改組密碼和成員(添加和刪除用戶賬號) 默認root賬號是組管理員 ?以當前組為附加組的用戶列表:(分隔符為逗號) same as /etc/group 文件操作 ?vipw和vigr:直接打開passwd、group,語法檢測功能。 ?pwck和grpck:檢查關於用戶賬號,和組賬號的相關的文件的格式是否正確。 用戶和組管理命令 ?用戶管理命令 ?useradd ?usermod ?userdel ?組帳號維護命令 ?groupadd ?groupmod ?groupdel 用戶創建:useradd ?useradd[options] LOGIN -u UID -o 配合-u 選項,不檢查UID的唯一性 -g GID:指明用戶所屬基本組,可為組名,也可以GID -c "COMMENT":用戶的註釋信息 -d HOME_DIR:以指定的路徑(不存在)為家目錄 -s SHELL: 指明用戶的默認shell程序 可用列表在/etc/shells文件中 -G GROUP1[,GROUP2,...]:為用戶指明附加組,組須事先存在 -N 不創建私用組做主組,使用users組做主組 -r: 創建系統用戶CentOS 6: ID<500,CentOS 7: ID<1000 -m 創建家目錄,用於系統用戶 -M 不創建家目錄,用於非系統用戶 [root@localhost ~]#useradd -u 1005 -o merry [root@localhost ~]#useradd -u 1005 -o lilei [root@localhost ~]#cat /etc/passwd | tail -2 merry:x:1005:1005::/home/merry:/bin/bash lilei:x:1005:1006::/home/lilei:/bin/bash 創建兩個相同的id的用戶可以看到UID相同但GID和家目錄都不相同,得到的權限一樣。這兩個用戶誰在前登陸顯示誰。 [root@localhost ~]#useradd -r -m -d /app/nginx nginx [root@localhost ~]#ls /app a aaa.log fstab ls.out new1win.txt who.out win.txt aa a.txt linux.txt man.txt newwin.txt win1.txt aaaa f lost+found name nginx win22.txt -r默認不創建家目錄,系統用戶,-m強制創建家目錄。有時候就是指定的1-500的uid,系統也認為是一個普通的用戶,因為沒有-r指定。 [root@localhost ~]#useradd -r -m -d /app/zabbix -s /sbin/nologin zabbix 設置一個服務使用的系統用戶。 [root@localhost /home/sunan]#cat /etc/default/useradd # useradd defaults file GROUP=100 HOME=/home INACTIVE=-1 EXPIRE= SHELL=/bin/bash SKEL=/etc/skel CREATE_MAIL_SPOOL=yes useadd默認生成的文件。 [root@localhost /home/sunn]#ls -a /home/lilei . .. .bash_logout .bash_profile .bashrc .mozilla [root@localhost /home/sunn]#ls -a /etc/skel . .. .bash_logout .bash_profile .bashrc .mozilla 默認生成的家目錄下面的文件和/etc/skel中的文件相同,因為來自於/etc/skel [root@localhost ~]#cp -r /etc/skel /home/suna 如果刪除一個用戶的家目錄,想要恢復,需要新建一個和原來一樣的文件名然後把/etc/skel下的文件全部拷貝過去。 [root@localhost ~]#cp -r /etc/skel/* /home/suna 上面這條命令很危險,會把skel中所有的文件和etc中所有的文件拷貝過去,因為目錄下包括.和.. [root@localhost ~]#cat /etc/login.defs UID_MIN 1000 UID_MAX 60000 # System accounts SYS_UID_MIN 201 SYS_UID_MAX 999 上面的文件存放許多登陸的默認信息 創建用戶:useradd ?默認值設定:/etc/default/useradd文件中 ?顯示或更改默認設置 useradd-D =cat /etc/default/useradd useradd–D -s SHELL useradd–D –b BASE_DIR useradd–D –g GROUP 新建用戶的相關文件和命令 ?/etc/default/useradd ?/etc/skel/* ?/etc/login.defs ?newusers passwd格式文件批量創建用戶 將和/etc/passwd文件中一樣的格式的內容保存到一個文件a.txt中 newusers a.txt即可批量創建用戶,即同時改變了那4個文件。 ?chpasswd 批量修改用戶口令 在b.txt文件中存放用戶名:密碼的格式,chpasswd b.txt
用戶屬性修改 ?usermod[OPTION] login -u UID: 新UID -g GID: 新主組 -G GROUP1[,GROUP2,...[,GROUPN]]]:新附加組,原來的附加組將會被覆蓋;若保留原有,則要同時使用-a選項 -s SHELL:新的默認SHELL -c ‘COMMENT‘:新的註釋信息 -d HOME: 新家目錄不會自動創建;若要創建新家目錄並移動原家數據,同時使用-m選項 -l login_name: 新的名字; -L: lock指定用戶,在/etc/shadow 密碼欄的增加! -U: unlock指定用戶,將/etc/shadow 密碼欄的! 拿掉 -e YYYY-MM-DD: 指明用戶賬號過期日期 -f INACTIVE: 設定非活動期限 [root@localhost ~]#id sunn uid=1002(sunn) gid=1002(sunn) groups=1002(sunn),0(root),1000(sunan) [root@localhost ~]#usermod -G "" sunn [root@localhost ~]#id sunn uid=1002(sunn) gid=1002(sunn) groups=1002(sunn) [root@localhost ~]#usermod -aG root,sunan sunn [root@localhost ~]#id uid=0(root) gid=0(root) groups=0(root) [root@localhost ~]#id sunn uid=1002(sunn) gid=1002(sunn) groups=1002(sunn),0(root),1000(sunan) [root@localhost ~]#usermod -G sunn sunn [root@localhost ~]#id sunn uid=1002(sunn) gid=1002(sunn) groups=1002(sunn) 上面是兩種去除用戶附加組的方法,一種是用空的去覆蓋原來的附加組,另一種是使用主組去覆蓋附加組,因為主組只能是主組不能是附加組,所以將附加組清空了。 [root@localhost ~]#usermod -d /app/sunn -m /home/sunn [root@localhost /app/sunn]#ls -a /app/sunn . .bash_history .bash_profile .cache .mozilla .. .bash_logout .bashrc .config 其中的-d是指定家目錄 -m是搬家。 刪除用戶 ?userdel[OPTION]... login -r: 刪除用戶家目錄 查看用戶相關的ID信息 ?id [OPTION]... [USER] -u: 顯示UID -g: 顯示GID -G: 顯示用戶所屬的組的ID -n: 顯示名稱,需配合ugG使用 [root@localhost /app]#userdel sunn [root@localhost /app]#cd /home [root@localhost /home]#ll total 24 drwx------ 5 bb sunan 4096 Nov 16 17:21 bb drwx------ 3 gentoo gentoo 4096 Nov 15 08:58 gentoo drwx------ 3 merry lilei 4096 Nov 16 18:46 lilei drwx------ 3 merry merry 4096 Nov 16 18:46 merry drwx------. 5 sunan sunan 4096 Nov 16 10:29 sunan drwx------ 5 1002 1002 4096 Nov 16 15:48 sunn 刪除用戶只是用戶名沒了,其他的一切還在。 [root@localhost /home]#useradd -u 1002 sunn useradd: warning: the home directory already exists. Not copying any file from skel directory into it. Creating mailbox file: File exists [root@localhost /home]#ll total 24 drwx------ 5 bb sunan 4096 Nov 16 17:21 bb drwx------ 3 gentoo gentoo 4096 Nov 15 08:58 gentoo drwx------ 3 merry lilei 4096 Nov 16 18:46 lilei drwx------ 3 merry merry 4096 Nov 16 18:46 merry drwx------. 5 sunan sunan 4096 Nov 16 10:29 sunan drwx------ 5 sunn sunn 4096 Nov 16 15:48 sunn 創建一個相同名字的用戶又可以找回原來用戶了 [root@localhost /home]#userdel -r sunn 這樣把家目錄和郵箱也刪除了,-r命令太危險。 [root@localhost /home]#userdel -r -f sunn userdel: user sunn is currently used by process 8453 即使有進程正在使用也可以使用-f選項直接刪除 切換用戶或以其他用戶身份執行命令 ?su[options...] [-] [user [args...]] ?切換用戶的方式: su UserName:非登錄式切換,即不會讀取目標用戶的配置文件,變量不切換,不改變當前工作目錄 su - UserName:登錄式切換,會讀取目標用戶的配置文件,切換至家目錄,完全切換 ?root su至其他用戶無須密碼;非root用戶切換時需要密碼 ?換個身份執行命令: su[-] UserName -c ‘COMMAND‘ ?選項:-l --login su-l UserName相當於su-UserName [sunn@localhost ~]$su - root -c ‘cat /etc/shadow‘ Password: root:$6$N23hSc6iqrrtt7A.$OL78oRDi5TwUd1fy6tnzQxeZIA3/jlU3WhGVynPTaymVsJdBftbL6jLGD2l41GLSWs4H0F1DaSV8C.deWCeDl1:17486:0:99999:7::: bin:*:17486:0:99999:7::: 使用管理員權限不用多次切換。 設置密碼 ?passwd[OPTIONS] UserName: 修改指定用戶的密碼,僅root用戶權限 ?passwd: 修改自己的密碼 ?常用選項: -l:鎖定指定用戶 -u:解鎖指定用戶 -e:強制用戶下次登錄修改密碼 -n mindays: 指定最短使用期限 -x maxdays:最大使用期限 -w warndays:提前多少天開始警告 -iinactivedays:非活動期限 --stdin:從標準輸入接收用戶密碼 echo "PASSWORD" | passwd—stdinUSERNAME 修改用戶密碼策略 ?chage[OPTION]... LOGIN -d LAST_DAY -E --expiredateEXPIRE_DATE -I --inactive INACTIVE -m --mindaysMIN_DAYS -M --maxdaysMAX_DAYS -W --warndaysWARN_DAYS –l 顯示密碼策略 ?示例: chage-d 0 tom 下一次登錄強制重設密碼 chage-m 0 –M 42 –W 14 –I 7 tom chage-E 2016-09-10 tom
用戶相關的其它命令 ?chfn指定個人信息 ?chsh指定shell ?finger 創建組 ?groupadd[OPTION]... group_name -g GID: 指明GID號;[GID_MIN, GID_MAX] -r: 創建系統組 CentOS 6: ID<500 CentOS 7: ID<1000 [root@localhost ~]#usermod -G sunan sunn [root@localhost ~]#id sunn uid=1002(sunn) gid=1002(sunn) groups=1002(sunn),1000(sunan) [root@localhost ~]#usermod -G root sunn [root@localhost ~]#id sunn uid=1002(sunn) gid=1002(sunn) groups=1002(sunn),0(root) 通過上面可以看到一個賬號用於一個附加組的情況下,再添加附加組會導致原來的附加組被替換掉。解決辦法添加-a(append)選項即可 [root@localhost ~]#groups sunn sunn : sunn root sunan 使用groups命令查看用戶屬於的所有組,其中第一個是主組,後面是附加組。 [sunn@localhost ~]$newgrp sunan [sunn@localhost ~]$id uid=1002(sunn) gid=1000(sunan) groups=1000(sunan),0(root),1002(sunn) 切換主組命令 newgrp
修改和刪除組 ?組屬性修改:groupmod groupmod[OPTION]... group -n group_name: 新名字 -g GID: 新的GID ?組刪除:groupdel groupdelGROUP [root@localhost /home]#groupdel sunn groupdel: cannot remove the primary group of user ‘sunn‘ 組下面存在以這個組為主組的用戶,那麽這個組不能刪除。 更改組密碼 ?組密碼:gpasswd ?gpasswd[OPTION] GROUP -a user 將user添加至指定組中 -d user 從指定組中移除用戶user -A user1,user2,... 設置有管理權限的用戶列表 ?newgrp命令:臨時切換主組 如果用戶本不屬於此組,則需要組密碼 [sunn@localhost ~]$newgrp aa Password: [sunn@localhost ~]$groups aa root sunan sunn 如果用戶本不屬於此組,則需要組密碼,組密碼設定gpasswd。但是newgrp只能臨時生效,沒有寫到配置文件中。 註意:一般情況下,組是不設口令的,因為不安全,普通用戶只要知道組口令就可以把自己加到組裏面,擁有一些權限。組不設口令,就只能使用root添加了。 sunn:!:: [root@localhost ~]#gpasswd sunn Changing the password for group sunn New Password: Re-enter new password: [root@localhost ~]#getent gshadow sunn sunn:$6$ZMWfIRMv$jbirRff67fLIEd9/VxdrQnpz0xLGuRYl068Bj3QRtdO/46Xll1bLD6z92nvQT252UTb94mNmjC/q.uHNv.zP20:: sunn組默認沒有密碼,通過gpasswd命令添加密碼。 [root@localhost ~]#getent gshadow aa aa:$6$FCDelTjwb4$r9SSfGGKi.fpb1ITJWczoeEUxHxlZMv7.CXT47hNDVLvGycLQ2IbSU9ZHy45WD4fPJTt9jqWMCZgeUu5XkDBC1:: [root@localhost ~]#gpasswd -A sunn aa [root@localhost ~]#getent gshadow aa aa:$6$FCDelTjwb4$r9SSfGGKi.fpb1ITJWczoeEUxHxlZMv7.CXT47hNDVLvGycLQ2IbSU9ZHy45WD4fPJTt9jqWMCZgeUu5XkDBC1:sunn: 組默認沒有管理員,使用gpasswd -A添加管理員。 [sunn@localhost ~]$gpasswd -a sunan aa Adding user sunan to group aa [sunn@localhost ~]$ 因為sunn用戶是aa組的管理員這樣sunn用戶就可以向aa組添加成員了。 更改和查看組成員 groupmems[options] [action] options: -g, --group groupname更改為指定組(只有root) Actions: -a, --add username 指定用戶加入組 -d, --delete username 從組中刪除用戶 -p, --purge 從組中清除所有成員(清空的是附屬組,主組不能清除) -l, --list 顯示組成員列表 groups [OPTION].[USERNAME]... 查看用戶所屬組列表 [root@localhost /home]#groups sunn sunn : sunn [root@localhost /home]#groupmems -l -g root Gentoo 顯示用戶所屬組,顯示組中用戶。 文件權限 文件屬性 有一個文件屬性圖解析沒畫 文件屬性操作 chown設置文件的所有者 chgrp設置文件的屬組信息 修改文件的屬主和屬組 ?修改文件的屬主:chown
chown[OPTION]... [OWNER][:[GROUP]] FILE... 用法: OWNER OWNER:GROUP :GROUP 命令中的冒號可用.替換 -R: 遞歸 chown[OPTION]... --reference=RFILE FILE... ?修改文件的屬組:chgrp chgrp[OPTION]... GROUP FILE... chgrp[OPTION]... --reference=RFILE FILE... -R 遞歸 文件權限 ?文件的權限主要針對三類對象進行定義 owner: 屬主, u group: 屬組, g other: 其他, o ?每個文件針對每類訪問者都定義了三種權限 r: Readable w: Writable x: eXcutable 文件權限 ?文件: r: 可使用文件查看類工具獲取其內容 w: 可修改其內容 x: 可以把此文件提請內核啟動為一個進程 ?目錄: r: 可以使用ls查看此目錄中文件列表 w: 可在此目錄中創建文件,也可刪除此目錄中的文件 x: 可以使用ls -l查看此目錄中文件列表,可以cd進入此目錄 X:只給目錄x權限,不給文件x權限 文件權限操作: 文件權限(rwx|W) |
||||||||||||
|
權限項 |
文件類型 |
讀 |
寫 |
執行 |
讀 |
寫 |
執行 |
讀 |
寫 |
執行 |
|
字符表示 |
(d|l|c|s|p) |
r |
w |
x |
r |
w |
x |
r |
w |
x |
||
|
數字表示 |
|
4 |
2 |
1 |
4 |
2 |
1 |
4 |
2 |
1 |
|
權限分配 |
|
文件所有者 |
文件所屬組 |
其他用戶 |
文件權限操作命令
chmod
八進制數字
?---000 0
?--x 001 1
?-w- 010 2
?-wx 011 3
?r-- 100 4
?r-x 101 5
?rw- 110 6
?rwx 111 7
?例如:
640: rw-r-----
755: rwxr-xr-x
fat文件系統不止權限設置,ext文件系統支持。
修改文件權限
?chmod[OPTION]... OCTAL-MODE FILE...
-R: 遞歸修改權限
?chmod[OPTION]... MODE[,MODE]... FILE...
MODE:
修改一類用戶的所有權限:
u= g= o= ug= a= u=,g=
修改一類用戶某位或某些位權限
u+ u-g+ g-o+ o-a+ a-+ -
?chmod[OPTION]... --reference=RFILE FILE...
參考RFILE文件的權限,將FILE的修改為同RFILE
權限設置示例
?chgrp sales testfile
?chown root:admins testfile
?chmod u+wx,g-r,o=rx file
?chmod -R g+rwX /testdir
?chmod 600 file
?chown mage testfile
所有者可以執行chgrp命令,不能執行chown,因為你不能把你生成的文件變成別人的。同時要刪除一個文件,必須要對文件所在的目錄有寫權限,不然刪除不掉,
因為文件名和節點對應信息在目錄的數據中存放。
讀和寫權限對root是不生效,但是執行權限對root生效。root比較特殊,只要是有執行權限就行不管是u g o上的,但其他用戶就必須嚴格執行先後匹配順序,先匹配了,後面的權限就不能再匹配了。
文件能不能刪不是 取決於文件本身,而是取決於文件的家目錄。
新建文件和目錄的默認權限
[root@localhost /home/wang]#chown -R wang /home/wang
遞歸創建用戶為wang
[root@localhost /home/wang]#chmod --reference f1 f2
參考f1權限設置f2
創建的文件默認沒有執行權限,危險。創建的目錄默認有執行權限。
[root@localhost /home/wang]#chmod -R a+X /app/
默認給目錄執行權限。-R遞歸賦予權限。
但是如果文件有一個選項有執行權限,+X全部有執行文件。
6.1 umask和suid權限
[root@centos7 ~]#useradd -p abcdef sunny
[root@centos7 ~]#getent passwd sunny
sunny:x:1001:1001::/home/sunny:/bin/bash
[root@centos7 ~]#getent shadow sunny
sunny:abcdef:17488:0:99999:7:::
[root@centos7 ~]#su - sunan
Last login: Wed Nov 8 11:01:40 CST 2017 on pts/0
[sunan@centos7 ~]$su - sunny
Password:
su: Authentication failure
可以看到使用useradd -p添加的明文密碼是不能登陸的。
[sunnyy@centos7 ~]$openssl passwd -1
Password:
Verifying - Password:
$1$VrT8vFZo$S0Nuf1g4EinoJ9wV09JTN/
[sunnyy@centos7 ~]$exit
logout
[root@centos7 ~]#useradd -p ‘$1$VrT8vFZo$S0Nuf1g4EinoJ9wV09JTN/‘ sun
[root@centos7 ~]#getent shadow sun
sun:$1$VrT8vFZo$S0Nuf1g4EinoJ9wV09JTN/:17488:0:99999:7:::
[root@centos7 ~]#su - sunan
Last login: Sat Nov 18 08:38:25 CST 2017 on pts/0
[sunan@centos7 ~]$su - sun
Password:
[sun@centos7 ~]$
使用openssl passwd -1產生密文密碼添加上去才能登陸。
?umask值 可以用來保留在創建文件權限
?新建FILE權限: 666-umask
如果所得結果某位存在執行(奇數)權限,則將其權限+1,偶數不變。
新建的文件為了安全考慮,默認不加執行權限。
?新建DIR權限: 777-umask
?非特權用戶umask是002
?root的umask是022
umask: 查看
?umask#: 設定
umask 002
?umask–S 模式方式顯示
?umask–p 輸出可被調用
?全局設置:/etc/bashrc用戶設置:~/.bashrc
[root@centos7 ~]#umask
0022
查看當前用戶的umask值
[sunan@centos7 ~]$umask 644
[sunan@centos7 ~]$touch a
[sunan@centos7 ~]$ll
total 0
-----w--w-. 1 sunan sunan 0 Nov 18 09:43 a
設定用戶的umask值,創建文件查看成功,但是只能臨時生效,註銷登陸失效。
[sunan@centos7 ~]$umask
0002
[sunan@centos7 ~]$pwd
/home/sunan
[sunan@centos7 ~]$nano .bashrc
umask 026
[sunan@centos7 ~]$. .bashrc
[sunan@centos7 ~]$umask
0026
永久生效修改用戶配置文件信息,添加umask 026執行生效,只是針對此用戶生效,如果是需要其他用戶生效,需要修改/etc/bashrc。
[root@centos7 ~]#umask 145 ;touch f1
[root@centos7 ~]#ll f1
-rw--w--w-. 1 root root 0 Nov 18 09:54 f1
可以看到將umask修改為145,默認創建的文件f1權限應該是521,但實際是622,因為文件默認沒有執行權限,奇數+1。
總結:其實真正的計算不是這樣的,是用666的二進制與掩碼的二進制記性計算
110110110
001100101 其中掩碼中的0表示不關心,1表示從最大權限中去掉對應權限。
110010010=622 只和文件有關系,和目錄沒關系,因為目錄不用考慮安全問題。
[root@centos7 ~]#umask -S
u=rw,g=wx,o=w
顯示生成目錄的權限
[root@centos7 ~]#umask u=rwx,g=w,o=r
設置生成目錄的權限,當然生成文件權限去計算一下就行,這裏不浪費時間講解
[root@localhost Desktop]# rpm -i /run/media/root/CentOS\ 7\ x86_64/Packages/man-pages-zh-CN-1.5.2-4.el7.noarch.rpm
warning: /run/media/root/CentOS 7 x86_64/Packages/man-pages-zh-CN-1.5.2-4.el7.noarch.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
安裝man手冊中文包。
設置環境變量:vim .bashrc
輸入內容:
alias cman=‘man -M /usr/local/share/man/zh_CN‘
生效:. .bashrc
cman ls 查看命令
Linux文件系統上的特殊權限
?SUID, SGID, Sticky
?三種常用權限:r, w, x user, group, other
?安全上下文
?前提:進程有屬主和屬組;文件有屬主和屬組
(1) 任何一個可執行程序文件能不能啟動為進程,取決發起者對程序文件是否擁有執行權限
(2) 啟動為進程之後,其進程的屬主為發起者,進程的屬組為發起者所屬的組
(3) 進程訪問文件時的權限,取決於進程的發起者
(a) 進程的發起者,同文件的屬主:則應用文件屬主權限
(b) 進程的發起者,屬於文件屬組;則應用文件屬組權限
(c) 應用文件“其它”權限
可執行文件上SUID權限
?任何一個可執行程序文件能不能啟動為進程:取決發起者對程序文件是否擁有執行權限
?啟動為進程之後,其進程的屬主為原程序文件的屬主
?SUID只對二進制可執行程序有效
?SUID設置在目錄上無意義
?權限設定:
chmod u+s FILE...
chmod u-s FILE...
可執行文件上SGID權限
?任何一個可執行程序文件能不能啟動為進程:取決發起者對程序文件是否擁有執行權限
?啟動為進程之後,其進程的屬組為原程序文件的屬組
?權限設定:
chmod g+s FILE...
chmod g-s FILE...
目錄上的SGID權限
默認情況下,用戶創建文件時,其屬組為此用戶所屬的主組
一旦某目錄被設定了SGID,則對此目錄有寫權限的用戶在此目錄中創建的文件所屬的組為此目錄的屬組
通常用於創建一個協作目錄
權限設定:
chmod g+s DIR...
chmod g-s DIR...
[root@centos7 ~]#chmod g+s aaaa/
[root@centos7 ~]#ll -d aaaa/
drwxr-sr-x. 2 root root 4096 Nov 18 14:21 aaaa/
[root@centos7 ~]#chmod 0755 aaaa/
[root@centos7 ~]#ll -d aaaa/
drwxr-sr-x. 2 root root 4096 Nov 18 14:21 aaaa/
[root@centos7 ~]#echo aaa>a.txt
[root@centos7 ~]#ll a.txt
-rw-r--r--. 1 root root 4 Nov 18 14:24 a.txt
[root@centos7 ~]#chmod g+s a.txt
[root@centos7 ~]#ll a.txt
-rw-r-Sr--. 1 root root 4 Nov 18 14:24 a.txt
[root@centos7 ~]#chmod g+x a.txt
[root@centos7 ~]#ll a.txt
-rw-r-sr--. 1 root root 4 Nov 18 14:24 a.txt
[root@centos7 ~]#chmod 0654 a.txt
[root@centos7 ~]#ll a.txt
-rw-r-xr--. 1 root root 4 Nov 18 14:24 a.txt
使用數字能去掉文件的SUID和SGID,但不能去掉目錄的SGID和SUID。man chmod給出了詳細的解釋。
Sticky 位
?具有寫權限的目錄通常用戶可以刪除該目錄中的任何文件,無論該文件的權限或擁有權
?在目錄設置Sticky 位,只有文件的所有者或root可以刪除該文件
?sticky 設置在文件上無意義,因為刪除文件要對文件所在目錄有權限。
目錄上有rwxrwxrws權限,不能刪除文件,不能對文件重命名,mv f1 f2不能重命名,因為重命名相當於刪了重建。可以讀文件,可以向文件中追加內容和清空文件內容。
[root@centos7 ~]#ll -d /tmp
drwxrwxrwt. 15 root root 4096 Nov 18 14:30 /tmp
tmp目錄是大家公用目錄,能在裏面創建文件但是不能刪除別人建的文件。
?權限設定:
chmod o+t DIR...
chmod o-t DIR...
?例如:
? ls-ld /tmp
drwxrwxrwt 12 root root 4096 Nov215:44 /tmp
[sunan@centos7 /aa]$passwd
Changing password for user sunan.
Changing password for sunan.
(current) UNIX password:
passwd: Authentication token manipulation error
sunan:$6$gVNv8Jd8$uSh2LL/4v2FAnMCfjdkMxw4pH4Yt4Iz4Jrke8w9UyAJuutKrGylYkId3e5afT3CIezdEGIFpx9SAdBIQTHyU70:17488:3:99999:7:::
不能修改密碼是因為密碼最小有效期時間是3天
[root@centos7 /aa]#chage -m 0 sunan
sunan:$6$gVNv8Jd8$uSh2LL/4v2FAnMCfjdkMxw4pH4Yt4Iz4Jrke8w9UyAJuutKrGylYkId3e5afT3CIezdEGIFpx9SAdBIQTHyU70:17488:0:99999:7:::
修改密碼最小時間有效期為0即可修改密碼。
[root@centos7 /aa]#ll /etc/shadow
----------. 1 root root 1346 Nov 18 12:35 /etc/shadow
sunan:$6$yBIaPLgZ$AHxtOXkPE0HZVto5.2zSbYWU/EBk3Hy0NzJO/NQ1ZCKFC9XvuWoD9QW8nGZ8IWiVlDm6rj8E2eJnIDhxK8kyh0:17488:0:99999:7:::
對於sunan用戶對文件/etc/shadow沒有任何權限為什麽修改了文件的內容。
[root@centos7 /aa]#ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd
是因為特殊權限s的作用,使得運行它的用戶臨時自動繼承它的所有者root的權限,他再通過passwd命令去修改/etc/shadow文件。
[root@centos7 /aa]#chmod u+s /usr/bin/nano
[root@centos7 /aa]#ll /usr/bin/nano
-rwsr-xr-x. 1 root root 205904 Jun 10 2014 /usr/bin/nano
[root@centos7 /aa]#chmod u-s /usr/bin/nano
[root@centos7 /aa]#ll /usr/bin/nano
-rwxr-xr-x. 1 root root 205904 Jun 10 2014 /usr/bin/nano
[root@centos7 /aa]#chmod 4755 /usr/bin/nano
[root@centos7 /aa]#ll /usr/bin/nano
-rwsr-xr-x. 1 root root 205904 Jun 10 2014 /usr/bin/nano
[root@centos7 /aa]#chmod 755 /usr/bin/nano
[root@centos7 /aa]#ll /usr/bin/nano
-rwxr-xr-x. 1 root root 205904 Jun 10 2014 /usr/bin/nano
為nano命令添加和刪除s權限。
[root@centos7 /aa]#chmod u-x /bin/passwd
[root@centos7 /aa]#ll /bin/passwd
-rwSr-xr-x. 1 root root 27832 Jun 10 2014 /bin/passwd
[root@centos7 /aa]#chmod u+x /bin/passwd
[root@centos7 /aa]#ll /bin/passwd
-rwsr-xr-x. 1 root root 27832 Jun 10 2014 /bin/passwd
去除x權限使得s變成了S,即s權限有問題了。
SUID一般不去手動設置,是開發者設置好,只要知道是做什麽的就行。
特殊權限數字法
?SUID SGID STICKY
000 0
001 1
010 2
011 3
100 4
101 5
110 6
111 7
?chmod4777 /tmp/a.txt
權限位映射
?SUID: user,占據屬主的執行權限位
s: 屬主擁有x權限
S:屬主沒有x權限
?SGID: group,占據屬組的執行權限位
s: group擁有x權限
S:group沒有x權限
?Sticky: other,占據other的執行權限位
t: other擁有x權限
T:other沒有x權限
設定文件特定屬性
?chattr +i 不能刪除,改名,更改(包括root)
-i 去除屬性。
?chattr +a 只能追加內容
nano不能追加,因為不知道你是不是在修改文件,即使你在最後加東西。
echo sdfa>>a.txt 可以追加。
chattr +A 不會更新讀時間
?lsattr 顯示特定屬性
[root@centos7 /app]#groupmems -l -g opts
sun sunny
[sunny@centos7 /app/sharegroup]$ll
total 0
-rw-rw-r--. 1 sun sun 0 Nov 18 15:00 sun
-rw-rw-r--. 1 sunny sunny 0 Nov 18 15:01 sunny
[sunny@centos7 /app/sharegroup]$echo new>>sun
bash: sun: Permission denied
雖然兩個用戶屬於一個組,但是相互之間還是改不了文件,因為文件的所屬組不一樣。
[root@centos7 /app]#chgrp opts sharegroup/sun*
[root@centos7 /app]#cd sharegroup/
[root@centos7 /app/sharegroup]#ll
total 0
-rw-rw-r--. 1 sun opts 0 Nov 18 15:00 sun
-rw-rw-r--. 1 sunny opts 0 Nov 18 15:01 sunny
[root@centos7 /app/sharegroup]#su sun
[sun@centos7 /app/sharegroup]$echo aa>>sunny
[sun@centos7 /app/sharegroup]$cat sunny
aa
把文件的所屬組改成一樣就可以相互修改數據了。 但是用戶每次新建的文件的所屬組每次都會變成原來的組,這樣需要每次都要修改文件的所屬組。解決辦法:只要在組權限上面天劍SGID權限即可解決。
[root@centos7 /app]#chmod g+s sharegroup/
[root@centos7 /app]#ll
drwxrws---. 2 root opts 4096 Nov 18 15:14 sharegroup
[sun@centos7 /app/sharegroup]$touch sun1
[sun@centos7 /app/sharegroup]$ll
total 4
-rw-rw-r--. 1 sun sun 0 Nov 18 15:14 a
-rw-rw-r--. 1 sun opts 0 Nov 18 15:00 sun
-rw-rw-r--. 1 sun opts 0 Nov 18 15:16 sun1
-rw-rw-r--. 1 sunny opts 3 Nov 18 15:09 sunny
g+s權限後,所有新建的文件的所屬組就變成了opts。一旦某目錄被設定了SGID,則對此目錄有寫權限的用戶在此目錄中創建的文件所屬的組為此目錄的屬組
通常用於創建一個協作目錄
註意:SUID和SGID、Sticky只是針對普通的用戶生效,對root無效。
訪問控制列表
?ACL:Access Control List,實現靈活的權限管理
?除了文件的所有者,所屬組和其它人,可以對更多的用戶設置權限
?CentOS7 默認創建的xfs和ext4文件系統具有ACL功能
?CentOS7 之前版本,裝完系統有新建的分區,即默認手工創建的ext4文件系統無ACL功能,需手動增加
tune2fs –o acl/dev/sdb1
mount –o acl/dev/sdb1 /mnt/test
[root@localhost ~]#tune2fs -l /dev/sda3
Default mount options: user_xattr acl
查看某個分區是否支持ACL功能,命令僅支持ext系列。
?ACL生效順序:所有者,自定義用戶,自定義組,其他人
訪問控制列表
?為多用戶或者組的文件和目錄賦予訪問權限rwx
mount -o acl /directory
getfacl file |directory
setfacl -m u:wang:rwx file|directory
-m:設置後續的參數給文件用。
setfacl -Rm g:sales:rwX directory
-R:遞歸賦予屬性
setfacl -M file.acl file|directory
setfacl -m g:salesgroup:rw file| directory
setfacl -m d:u:wang:rx directory
setfacl -x u:wang file |directory
setfacl -X file.acl directory
ACL文件上的group權限是mask值(自定義用戶,自定義組,擁有組的最大權限),而非傳統的組權限
getfacl 可看到特殊權限:flags
通過ACL賦予目錄默認x權限,目錄內文件也不會繼承x權限
base ACL 不能刪除
setfacl –k dir 刪除默認ACL權限
setfacl –b file1清除所有ACL權限
getfacl file1|setfacl --set-file=- file2 復制file1的acl權限給file2
?mask只影響除所有者和other的之外的人和組的最大權限
Mask需要與用戶的權限進行邏輯與運算後,才能變成有限的權限(Effective Permission)
用戶或組的設置必須存在於mask權限設定範圍內才會生效
setfacl-m mask::rxfile
?--set選項會把原有的ACL項都刪除,用新的替代,需要註意的是一定要包含UGO的設置,不能象-m一樣只是添加ACL就可以
?示例:
setfacl --set u::rw,u:wang:rw,g::r,o::-file1
?備份和恢復ACL
主要的文件操作命令cp和mv都支持ACL,只是cp命令需要加上-p 參數。但是tar等常見的備份工具是不會保留目錄和文件的ACL信息
getfacl -R /tmp/dir1 > acl.txt
setfacl -R -b /tmp/dir1
setfacl -R --set-file=acl.txt /tmp/dir1
setfacl --restore acl.txt
getfacl -R /tmp/dir1
[root@centos7 /app]#setfacl -m u:sun:rw f1
[root@centos7 /app]#getfacl f1
# file: f1
# owner: root
# group: root
user::rw-
user:sun:rw-
group::r--
mask::rw-
other::r--
mask:除了屬主和other的其他的用戶的最高權限不能超過mask。
同時設置group的權限不能使用chmod g+權限 f1這種方式,這種方式設置的是mask權限,要使用setfacl -m group::x f1這種形式。
[root@centos7 /app]#echo u:sun:rwx > sun.acl
[root@centos7 /app]#cat sun.acl
u:sun:rwx
[root@centos7 /app]#touch d2
[root@centos7 /app]#setfacl -R -M sun.acl d2
[root@centos7 /app]#getfacl d2
# file: d2
# owner: root
# group: root
user::rw-
user:sun:rwx
group::r--
mask::rwx
other::r--
通過文件創建權限 -M選項的作用。
[root@centos7 ~]#setfacl -R -m sunan:rw /app/html
[root@centos7 ~]#getfacl /app/html/c.html
getfacl: Removing leading ‘/‘ from absolute path names
# file: app/html/c.html
# owner: root
# group: root
user::rw-
user:sunan:rw-
group::r--
mask::rw-
other::r--
[root@centos7 ~]#touch /app/html/b.html
[root@centos7 ~]#getfacl !$
getfacl /app/html/b.html
getfacl: Removing leading ‘/‘ from absolute path names
# file: app/html/b.html
# owner: root
# group: root
user::rw-
group::r--
other::r--
事實表明上面創建的ACL權限只對設置ACL權限前生成的文件有效,對以後新的生成的文件無效。
[root@centos7 ~]#setfacl -R -m d:sunan:rw /app/html
[root@centos7 ~]#touch /app/html/d.html
[root@centos7 ~]#getfacl !$
getfacl /app/html/d.html
getfacl: Removing leading ‘/‘ from absolute path names
# file: app/html/d.html
# owner: root
# group: root
user::rw-
user:sunan:rw-
group::r-x #effective:r--
mask::rw-
other::r--
要相對以後的文件生效需要加上d選項。
[root@centos7 ~]#getfacl -R /app/html/ >/app/html.acl
getfacl: Removing leading ‘/‘ from absolute path names
[root@centos7 ~]#setfacl -Rb /app/html 清空ACL權限
[root@centos7 ~]#setfacl -R --set-file=/app/html.acl /app/html/ 恢復ACL權限
[root@centos7 /app]#setfacl --restore html.acl 這樣恢復更簡單些
第六章 linux用戶組和權限管理