1. 程式人生 > >Linux中的使用者、組和許可權管理

Linux中的使用者、組和許可權管理

1、使用者和組的概念

Linux是多使用者多工(Multi-Users,Multi-tasks)的作業系統,對於每個使用者,使用使用者標識(ID)、密碼(Passwd)來唯一標識使用者。對於使用者的管理有3A認證:Authentication(認證)、Authorization(授權)、Audition(審計)。

使用者類別分為管理員和普通使用者,普通使用者又分為系統使用者和登入使用者。
在此要說明一下,Linux中的程序以其發起者的身份執行,程序對檔案的訪問許可權取決於發起此程序的使用者及其所屬組的許可權。在Linux中,系統使用者是普通使用者,Linux為了能夠讓那些後臺程序或服務類程序以非管理員的身份執行,通常需要為此建立多個普通使用者,這類使用者從不用登入系統,但是執行的是Linux後臺的程序或服務,這樣的使用者為系統使用者。Linux中的這個機制叫做安全上下文。

使用者標識,英文全稱為UserID,簡寫為UID,是16位的二進位制數字,範圍0-65535。管理員的UID為0,普通使用者UID的範圍為1-65535,其中系統使用者的UID範圍為1-499(CentOS6),1-999(CentOS7),登入使用者的UID範圍為500-60000(CentOS6),1000-60000(CentOS7)。Linux通過查詢/etc/passwd來進行Username和對應的UID之間的轉換。

而使用者組即是多個使用者的容器。
組的按照是不是管理員組可分為管理員組和普通使用者組,而普通使用者組又分為系統組和登入組。
組標識,英文全稱GroupID,簡寫為GID。管理員組的GID為0,普通使用者組的GID範圍為1-65535,其中系統使用者組的範圍為1-499(CentOS6),1-999(CentOS7),登入使用者組的範圍為500-60000(CentOS6), 1000-60000(CentOS7) 。Linux通過查詢/etc/group來進行GroupName和GID之間的轉換。
按照是不是使用者的主組,可以將組分類為使用者的基本組和使用者的附加組。
按照組中有的使用者的個數,可以將組分類為私有組(組名同用戶名,且只包含一個使用者)和公共組(組內包含了多個使用者)。

2、使用者和組的認證管理

認證資訊:通過比對事先儲存的使用者資訊與登入時提供的資訊是否一致來進行使用者和組的認證。
使用者密碼的存放檔案:/etc/shadow;
組密碼的存放檔案/etc/gshadow。
密碼的使用策略:

  1. 使用隨機密碼;
  2. 最短長度不要低於8位;
  3. 應該使用大寫字母、小寫字母、數字和標點符號四類字元中至少三類;
  4. 定期更換。

MD5加密例:

[[email protected] ~]# echo "How are you?" | md5sum
2f065f71bdbbfe3637ae14b43f1ae015  -

MD5輸出密文128bits。
雪崩效應:

[[email protected]
~]# echo "How are you." | md5sum 054cac27898d2b0dd9bacebbeb7777f4 -

SHA加密例:

[[email protected] ~]# echo "How are you." | sha

SHA分為以下型別:
sha1sum、sha224sum、sha256sum、sha384sum、sha512sum。
SHA1Sum輸出密文為160bits。
SHA512加密例:

[[email protected] ~]# echo "How are you." | sha512sum
b4cc87f93105567c448f0146b7e66a14a1578f5d2df2a8fa8dbb1cf493f6b35e1a52b15b8163c24fd8d3f91fb75a7562d83010493f6f26b1ab20491059d471ab  -

SHA512輸出密文為十六進位制數字。

檔案/etc/passwd是使用者的資訊庫,檔案格式:
name:password:UID:GID:GECOS:directory:shell
檔案格式說明:
1)name:使用者名稱;
2)password:可以是加密的密碼,也可是佔位符x;
3)UID:使用者標識;
4)GID:使用者所屬的主組的ID號;
5)GECOS:註釋資訊;
6)directory:使用者的家目錄(即使用者的主目錄,是一個概念);
7)shell:使用者的預設shell,登入時預設shell程式。

檔案/etc/shadow存放使用者密碼,檔案格式:
使用者名稱:加密的密碼:最近一次修改密碼的時間:最短使用期限:最長使用期限:警告期段:密碼禁用期:賬戶過期期限:保留欄位
檔案格式說明:
1)加密的密碼以分割,第一個和第二個之間的數字代表加密演算法,1:md5, 2:sha1, 3:sha224, 4:sha256, 5:sha384, 6:sha512;第二個和第三個salt之間的字元為隨機數salt;第二個和第三個之間的字元為加密後的密碼;
2)最近一次修改密碼的時間:從1970年1月1日到上一次修改密碼所經過的天數;0代表使用者應該在下次登入系統時更改密碼;
3)密碼禁用期:密碼過期後,仍然接受此密碼的天數(在此期間,使用者應該在下次登入時修改密碼)。密碼到期並且過了這個寬期限之後,使用使用者的當前密碼將會不能登入;
4)賬戶過期期限:賬戶過期不同於密碼過期,賬戶過期時,使用者將不被允許登入,時間處於寬限期之後;密碼過期時,使用者將不被允許使用其密碼登入,時間處於密碼過期之後的寬限期;
5)保留欄位:保留作將來使用。

檔案/etc/group是組的資訊庫,檔案格式:
group_name:password:GID:user_list
檔案格式說明:
1)組的password儲存在/etc/gshadow中;
2)user_list:該組的使用者成員,即以此組為附加組的使用者的使用者列表(使用者的基本組儲存在/etc/passwd檔案的GID屬性中)。、

3、使用者和組管理的常用命令

(1)groupadd命令
該命令用於新增組。命令格式:

groupadd [選項] group_name
-g GID:指定GID;預設是上一個組的GID+1;
-r: 建立系統組;
[[email protected] ~]# groupadd mygrp
[[email protected] ~]# groupadd -r testgrp
[[email protected] ~]# groupadd -g 2000 grp1
[[email protected] ~]# groupadd -r -g 306 mariadb

(2)groupmod命令
該命令用於修改組屬性。命令格式:

groupmod [選項] GROUP
-g GID:修改GID;
-n new_name:修改組名;
[[email protected] ~]# groupmod -g 702 mariadb
[[email protected] ~]# groupmod -n perconaserver mariadb
		                                               new_name    old_name

(3)groupdel命令
該命令用於刪除組。命令格式:

groupdel [選項] GROUP
[[email protected] ~]# groupdel perconaserver

(4)useradd命令
該命令用於建立使用者。命令格式:

useradd [選項] 登入名
-u, --uid UID:指定UID;
-g, --gid GROUP:指定基本組ID,此組得事先存在;
-G, --groups GROUP1[,GROUP2,...[,GROUPN]]]:指明使用者所屬的附加組,多個組之間用逗號分隔;
-c, --comment COMMENT:指明註釋資訊,可以寫使用者全名;
-d, --home HOME_DIR:以指定的路徑為使用者的家目錄;通過複製/etc/skel目錄並重命名實現;指定的家目錄路徑如果事先存在,則不會為使用者複製環境配置檔案;
-s, --shell SHELL:指定使用者的預設shell,可用的所有shell列表儲存在/etc/shells檔案中;
-r, --system:建立系統使用者;
-m, --create-home:如果不存在,則建立使用者主目錄。骨架目錄中的檔案和目錄(可以使用-k選項指定),將會複製到主目錄;
-M, :不建立使用者主目錄,即使系統在/etc/login.defs中的設定(CREATE_HOME)為yes;
-f, --inactive INACTIVE:密碼過期後,賬戶被徹底禁用的天數。0表示立即禁用,-1表示禁用這個功能;如果未指定,useradd將使用/etc/default/useradd中的INACTIVE指定的預設禁用週期,或者預設為-1;

建立使用者時的諸多預設設定配置檔案為/etc/login.defs。

useradd -D:顯示建立使用者的預設配置;
useradd -D 選項: 修改預設選項的值;
修改的結果保存於/etc/default/useradd檔案中;也可以通過直接編輯此檔案實現修改useradd;
[[email protected] ~]# which adduser
/usr/sbin/adduser
[[email protected] ~]# file `which adduser`          `   ` 命令引用,檢視該命令的型別
/usr/sbin/adduser: symbolic link to `useradd'
[[email protected] ~]# useradd -u 3000 openstack
[[email protected] ~]# useradd -g cloud cloudstack
[[email protected] ~]# useradd -c "MogileFS DFS" mogilefs
[[email protected] ~]# groupadd mygrp
[[email protected] ~]# useradd -G mygrp archlinux
[[email protected] ~]# useradd -d /exercise/moosefs moosefs
[[email protected] exercise]# mkdir mytest
[[email protected] exercise]# useradd -d /exercise/mytest mytest
useradd: warning: the home directory already exists.
Not copying any file from skel directory into it.
[[email protected] exercise]# ls -a /exercise/mytest/
.  ..
[[email protected] exercise]# ls -a /etc/skel
.  ..  .bash_logout  .bash_profile  .bashrc  .mozilla
[[email protected] exercise]# useradd -s /bin/csh keystone
[[email protected] exercise]# useradd -D
GROUP=100              建立使用者時,要為其新增一個與使用者同名的私有組
HOME=/home             使用者建立時,是否為其建立家目錄,如果建立,家目錄的起始位置
INACTIVE=-1            非活動期限,-1代表禁用
EXPIRE=                過期期限,沒有時間代表永不過期,預設為99999
SHELL=/bin/bash        預設SHELL
SKEL=/etc/skel         從哪複製使用者的骨架資訊
CREATE_MAIL_SPOOL=yes  是否給使用者建立郵件緩衝佇列,yes代表每建立一個使用者,會在/var/spool/mail中為使用者建立一個郵筒,用以接收郵件

(5)usermod命令
該命令用於修改使用者屬性。命令格式:

usermod [選項] 登入
-u, --uid UID:修改使用者的ID為此處指定的新UID;
-g, --gid GROUP:修改使用者所屬的基本組;該組必須事先存在;
-G, --groups GROUP1[,GROUP2,...[,GROUPN]]]:修改使用者所屬的附加組;原來的附加組會被覆蓋;附加組必須事先存在;
-a, --append:與-G一同使用,用於為使用者追加新的附加組;
-c, --comment COMMENT:修改註釋資訊;
-d, --home HOME_DIR:修改使用者的家目錄;使用者原有的檔案不會被轉移至新位置;
-m, --move-home:只能與-d選項一同使用,用於將原來的家目錄移動為新的家目錄;
-l, --login NEW_LOGIN:修改使用者名稱;
-s, --shell SHELL:修改使用者的預設shell;
-L, --lock:鎖定使用者密碼;即在使用者原來的密碼字串之前新增一個"!";
-U, --unlock:解鎖使用者的密碼;去掉"!";

(6) userdel命令
該命令用於刪除使用者。命令格式:

userdel [選項] 登入
-r:刪除使用者時一併刪除其家目錄;預設不會刪除使用者的家目錄;

例1:建立使用者gentoo,UID為4001,基本組為gentoo,附加組為distro(GID為5000)和peguin(GID為5001)。

[[email protected] exercise]# groupadd -g 5000 distro
[[email protected] exercise]# groupadd -g 5001 peguin
[[email protected] exercise]# useradd -u 4001 -G distro,peguin gentoo

例2:建立使用者fedora,其註釋資訊為"Fedora Core",預設shell為/bin/tcsh。

[[email protected] exercise]# useradd -c "Fedora Core" -s /bin/tcsh fedora

例3:修改gentoo使用者的家目錄為/var/tmp/gentoo;要求其原有檔案仍能被使用者訪問。

[[email protected] tmp]# usermod -d /var/tmp/gentoo -m gentoo

例4:為gentoo新增附加組netadmin。

[[email protected] exercise]# usermod -a -G netadmin gentoo

(7)passwd命令
命令格式:

passwd [-k] [-l] [-u [-f]] [-d] [-e] [-n mindays] [-x maxdays] [-w warndays] [-i inactivedays] [-S] [--stdin] [username]
-l, -u:鎖定和解鎖使用者;
-d:清除使用者密碼串;
-e DATE: 過期期限,日期;
-i DAYS:非活動期限;
-n DAYS:密碼的最短使用期限;
-x DAYS:密碼的最長使用期限;
-w DAYS:警告期限;
--stdin:從標準輸入讀入新密碼,該標準輸入可以是一個管道

passwd:修改使用者自己的密碼;
passwd USERNAME:修改指定使用者的密碼,但僅root有此許可權,管理員修改任何使用者的密碼都不需要知道原來的密碼。

[[email protected] home]# passwd -d keystone
Removing password for user keystone.
passwd: Success
[[email protected] exercise]# echo "mageedu" | passwd --stdin keystone
Changing password for user keystone.
passwd: all authentication tokens updated successfully.
[[email protected] exercise]# echo "mageedu" | passwd --stdin keystone &> /dev/null
[[email protected] exercise]# echo $?
0

(8)gpasswd命令
命令格式:

gpasswd [選項] group
-a USERNAME:向組中新增使用者,讓使用者以此組為附加組
-d USERNAME:從組中移除使用者

給組設定密碼,可以防止使用者隨意將其基本組切換為該組,如果該組沒有密碼,使用者則不能將其基本組切換為該組,如果該組為使用者的附加組,則切換不需要密碼。
(9)newgrp命令
該命令用於臨時切換指定的組為基本組;使用exit退出切換。
命令格式:

newgrp [-] [group]
-: 會模擬使用者重新登入以實現重新初始化其工作環境;

(10)chage命令
該命令用於更改使用者密碼過期資訊。命令格式:

chage [選項] 登入名
-d
-E
-W
-m
-M

(11)id命令
該命令用於顯示使用者的真實和有效ID。

id [OPTION]... [USER]
-u: 僅顯示有效的UID;
-g: 僅顯示使用者的基本組ID; 
-G:僅顯示使用者所屬的所有組的ID;
-n: 顯示名字而非ID;

(12)su命令
該命令用於切換使用者。

  1. 登入式切換:會通過讀取目標使用者的配置檔案來重新初始化;
su - USERNAME
su -l USERNAME
  1. 非登入式切換:不會讀取目標使用者的配置檔案進行初始化;
su USERNAME

管理員可無密碼切換至其它任何使用者,非管理員切換至任何使用者時都必須給定目標使用者的密碼。

-c 'COMMAND':僅以指定使用者的身份執行此處指定的命令;

(13)chsh命令
該命令用於修改當前使用者或指定使用者的shell,只有管理員才可以修改其他使用者的shell。
(14)chfn命令
該命令用於修改finger資訊。
(15)finger命令
該命令用於使用者資訊查詢。

[[email protected] exercise]# finger
bash: finger: command not found...
[[email protected] exercise]# yum install finger
Complete!
[[email protected] exercise]# finger keystone
Login: keystone       			Name: 
Directory: /home/keystone           	Shell: /bin/csh
Last login Sun Nov 20 12:27 (CST) on pts/0
No mail.
No Plan.

(16)pwck命令
該命令用於檢查使用者密碼是否存在異常。
(17)grpck: 命令
該命令用於檢查組是否存在異常。
pwck和grpck這兩個命令用來做使用者的健康狀態審計。

4、許可權管理

ls -l 
rwxrwxrwx

左三位:定義user(owner)的許可權,即屬主許可權;
中三位:定義group的許可權,即屬組許可權;
右三位:定義other的許可權,即其他人許可權。

程序安全上下文
程序的屬主與檔案的屬主是否相同:
如果相同,則應用屬主許可權;
否則,則檢查程序的屬主是否屬於檔案的屬組:
如果是,則應用屬組許可權;
否則,就只能應用other的許可權;
(程序的屬主:程序的發起者,即當前執行程序命令的使用者)

其中,
r:readable, 讀
w:writable, 寫
x:excutable,執行
對於檔案:
r 代表可獲取檔案的資料,即可執行cat, head, tail, more, less命令;
w 代表可修改檔案的資料;
x 代表可將此檔案執行為程序。
對於目錄:
r 代表可使用ls命令獲取其下的所有檔案列表;不能獲取詳細資訊,即不能使用ls -l命令;
w 代表可修改此目錄下的檔案列表,即建立或刪除檔案,也可以建立或刪除其子目錄;
x 代表可cd至此目錄中,且可使用ls -l來獲取所有檔案的詳細屬性資訊。

許可權組合機制:
— 000 0
–x 001 1
-w- 010 2
-wx 011 3
r-- 100 4
r-x 101 5
rw- 110 6
rwx 111 7

5、許可權管理常用命令

(1)chmod命令

chmod [OPTION]... MODE[,MODE]... FILE...
chmod [OPTION]... OCTAL-MODE FILE...
chmod [OPTION]... --reference=RFILE FILE...

chmod [OPTION]... MODE[,MODE]... FILE...
MODE表示法:
1)賦權表示法:直接操作一類使用者的所有許可權位rwx。
u=,g=,o=,a=,ug=

[[email protected] exercise]# ll fstab
-rw-r--r--. 1 root root 689 Nov 20 16:44 fstab
[[email protected] exercise]# chmod g=rw fstab
[[email protected] exercise]# chmod ug=r fstab
[[email protected] exercise]# chmod u=rwx,g=rw,o= fstab
[[email protected] exercise]# ll fstab
-rwxrw----. 1 root root 689 Nov 20 16:44 fstab

2)授權表示法:直接操作一類使用者的一個許可權位r,w,x;
u+,u-,g+, g-,o+,o-,a+,a-

[[email protected] exercise]# chmod +x fstab
[[email protected] exercise]# ll fstab
-r-xr-xr-x. 1 root root 689 Nov 20 16:44 fstab
[[email protected] exercise]# chmod -x fstab
[[email protected] exercise]# ll fstab
-r--r--r--. 1 root root 689 Nov 20 16:44 fstab
[[email protected] exercise]# chmod +w fstab             全域性寫僅對屬主有效
[[email protected] exercise]# ll fstab
-rw-r--r--. 1 root root 689 Nov 20 16:44 fstab

chmod [OPTION]... OCTAL-MODE FILE...

[[email protected] exercise]# chmod 660 fstab
[[email protected] exercise]# ll fstab
-rw-rw----. 1 root root 689 Nov 20 16:44 fstab
[[email protected] exercise]# chmod 66 fstab
[[email protected] exercise]# ll fstab
----rw-rw-. 1 root root 689 Nov 20 16:44 fstab           66左側補零

chmod [OPTION]... --reference=RFILE FILE...
根據參考檔案RFILE修改FILE的許可權。

[[email protected] exercise]# chmod --reference=/var/log/messages fstab
[[email protected] exercise]# ll fstab
-rw-------. 1 root root 689 Nov 20 16:44 fstab								
選項:
-R, --recursive:遞迴修改,修改該目錄及該目錄下的子目錄、檔案的許可權為該許可權;

一般在上述授權表示法、賦權表示法中使用,目錄一般有x許可權,檔案不應有x許可權。一般用於建立許多空目錄,形成目錄樹。
使用者僅能修改屬主為自己的那些檔案的許可權。
(2)chown命令

chown [OPTION]... [OWNER][:[GROUP]] FILE...
chown [OPTION]... --reference=RFILE FILE...
選項:
-R:遞迴修改,修改該目錄及該目錄下的子目錄、檔案的許可權;
[[email protected] exercise]# chown -R keystone skel                   修改屬主
[[email protected] exercise]# chown -R archlinux:mygrp skel            修改屬主和屬組,:分割
[[email protected] exercise]# chown -R root.root skel                  修改屬主和屬組,.分割
[[email protected] exercise]# chown :mygrp mytest                      可以用來只改屬組
[[email protected] exercise]# chown -R --reference=/exercise/mytest skel

(3)chgrp命令

chgrp [OPTION]... GROUP FILE...
chgrp [OPTION]... --reference=RFILE FILE...

僅管理員可修改檔案的屬主和屬組。
使用者對目錄有寫許可權,但對目錄下的檔案沒有寫許可權時,不能修改檔案內容,但可以刪除此檔案。
(4)umask命令
umask為檔案的許可權反向掩碼,遮罩碼。
對於檔案,666-umask得到檔案的預設許可權;
對於目錄,777-umask得到目錄的預設許可權。
(注:之所以檔案用666去減,表示檔案預設不能擁有執行許可權;如果減得的結果中有執行許可權,則需要將其加1;
例umask為023,對於檔案:666-023=644,對於目錄:777-023=754)

umask:檢視當前umask
umask MASK: 設定umask

此類設定僅對當前shell程序有效;
(5) install命令
該檔案用於拷貝命令並設定屬性。
單源複製:
install [OPTION]... [-T] SOURCE DEST
多源複製:
install [OPTION]... SOURCE... DIRECTORY
install [OPTION]... -t DIRECTORY SOURCE...
建立目錄:
install [OPTION]... -d DIRECTORY...

常用選項:
-m, --mode=MODE:設定目標檔案許可權,預設為755;
-o, --owner=OWNER:設定目標檔案屬主;
-g, --group=GROUP:設定目標檔案屬組;
[[email protected] exercise]# install -o archlinux -g mygrp -m 640 /etc/inittab ./inittab
[[email protected] exercise]# ll inittab
-rw-r-----. 1 archlinux mygrp 511 Nov 20 19:46 inittab
[[email protected] exercise]# install -d hello                     建立空目錄
[[email protected] exercise]# ll -d hello
drwxr-xr-x. 2 root root 4096 Nov 20 19:46 hello

(6)mktemp命令
該命令用於建立臨時檔案或臨時目錄。

mktemp [OPTION]... [TEMPLATE]
常用選項:
-d:建立臨時目錄;
-u: 只是寫個名字,不會真正建立該檔案;用來測試,可否建立;

注意:mktemp會將建立的臨時檔名直接返回,因此,可直接通過命令引用儲存起來。建立的臨時檔案一個月後會被刪除,但應在/tmp下建立,其他目錄下可能不會被刪除;檔案字尾名至少有三個X。

6、綜合練習

  1. 新建系統組mariadb, 新建系統使用者mariadb, 屬於mariadb組,要求其沒有家目錄,且shell為/sbin/nologin;嘗試root切換至使用者,檢視其命令提示符。
[[email protected] ~]# groupadd -r mariadb
[[email protected] ~]# useradd  -r -M -g mariadb -s /sbin/nologin mariadb
[[email protected] ~]# tail /etc/passwd
chrony:x:990:985::/var/lib/chrony:/sbin/nologin
mysql:x:27:27:MariaDB Server:/var/lib/mysql:/sbin/nologin
gnome-initial-setup:x:989:984::/run/gnome-initial-setup/:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
yanyan:x:1000:1000:yanyan:/home/yanyan:/bin/bash
mariadb:x:988:983::/home/mariadb:/sbin/nologin
[[email protected] ~]# cd /home
[[email protected] home]# ls
centos  docker  gentoo  lost+found  yanyan
[[email protected] home]# su - mariadb
su: warning: cannot change directory to /home/mariadb: No such file or directory
This account is currently not available.
  1. 新建GID為5000的組mageedu,新建使用者gentoo,要求其家目錄為/users/gentoo,密碼同用戶名。
[[email protected] home]# groupadd -g 5000 mageedu
[[email protected] home]# mkdir /users
[[email protected] home]# useradd -m -d /users/gentoo gentoo
[[email protected] home]# passwd gentoo
Changing password for user gentoo.
New password: 
BAD PASSWORD: The password is shorter than 8 characters
Retype new password: 
passwd: all authentication tokens updated successfully.

  1. 新建使用者fedora,其家目錄為/users/fedora,密碼同用戶名。
[[email protected] home]# useradd -m -d /users/fedora fedora
[[email protected] home]# passwd fedora
Changing password for user fedora.
New password: 
BAD PASSWORD: The password is shorter than 8 characters
Retype new password: 
passwd: all authentication tokens updated successfully.
  1. 新建使用者www, 其家目錄為/users/www;刪除www使用者,但保留其家目錄。
[[email protected] home]# useradd -m -d /users/www www
[[email protected] home]# userdel www
  1. 為使用者gentoo和fedora新增附加組mageedu。
[[email protected] home]# usermod -a -G mageedu gentoo
[[email protected] home]# usermod -a -G mageedu fedora
  1. 複製目錄/var/log至/tmp/目錄,修改/tmp/log及其內部的所有檔案的屬組為mageedu,並讓屬組對目錄本身擁有寫許可權。
[[email protected] home]# cp -r /var/log /tmp
[[email protected] home]# chown -R :mageedu /tmp/log
[[email protected] home]# ll -d /tmp/log
drwxr-xr-x. 17 root mageedu 4096 Nov 20 21:32 /tmp/log
[[email protected] home]# chmod g+w /tmp/log
[[email protected] home]# ll -d /tmp/log
drwxrwxr-x. 17 root mageedu 4096 Nov 20 21:32 /tmp/log

7、Linux系統上的特殊許可權

特殊許可權:SUID, SGID, STICKY。
(1)安全上下文

  1. 程序以某使用者的身份執行; 程序是發起此程序使用者的代理,因此以此使用者的身份和許可權完成所有操作;
  2. 許可權匹配模型
    1)判斷程序的屬主,是否為被訪問的檔案屬主;如果是,則應用屬主的許可權;否則進入第2步;
    2)判斷程序的屬主,是否屬於被訪問的檔案屬組;如果是,則應用屬組的許可權;否則進入第3步;
    3)應用other的許可權。

(2)SUID
1)SUID的作用
預設情況下:使用者發起的程序,程序的屬主是其發起者;因此,其以發起者的身份在執行。使用者執行某程式時,如果此程式擁有SUID許可權,那麼程式執行為程序時,程序的屬主不是發起者,而是程式檔案自己的屬主。
2)管理檔案的SUID許可權

chmod u+|-s FILE...

3)展示位置
屬主的執行許可權位,如果屬主原本有執行許可權,顯示為小寫s,否則,顯示為大寫S。

[[email protected] ~]$ ll /bin/cat
-rwxr-xr-x. 1 root root 54048 Nov 20  2015 /bin/cat
[[email protected] ~]chmod u+s /tmp/cat                      執行/tmp/cat命令,普通使用者才可以訪問/etc/shadow檔案,因為/tmp/cat是以屬主root身份在執行
[[email protected] ~]# ll /bin/passwd
-rwsr-xr-x. 1 root root 27832 Jun 10  2014 /bin/passwd    普通使用者才可以用passwd命令修改自己的密碼,因為passwd程序是以屬主root的身份在執行

(3)SGID
1)SGID的作用
當目錄屬組有寫許可權,且有SGID許可權時,那麼所有屬於此目錄屬組的使用者在該目錄中建立檔案時,新檔案的屬組不是使用者的基本組,而是此目錄的屬組。
2)管理檔案的SGID許可權

chmod g+|-s FILE...

3)展示位置
屬組的執行許可權位,如果屬組原本有執行許可權,顯示為小寫s,否則,顯示為大寫S。

[[email protected] ~]# useradd fedora
[[email protected] ~]# useradd centos
[[email protected] ~]# groupadd mygrp
[[email protected] ~]# usermod -a -G mygrp centos
[[email protected] ~]# usermod -a -G mygrp fedora
[[email protected] ~]# id fedora
uid=1004(fedora) gid=1004(fedora) groups=1004(fedora),5001(mygrp)
[[email protected] ~]# id centos
uid=1005(centos) gid=1005(centos) groups=1005(centos),5001(mygrp)
[[email protected] ~]# mkdir /exercise/test
[[email protected] ~]# chown :mygrp /exercise/test
[[email protected] ~]# ll -d /exercise/test
drwxr-xr-x. 2 root mygrp 4096 Dec  1 20:07 /exercise/test
[[email protected] ~]# chmod g+w /exercise/test
[[email protected] ~]# ll -d /exercise/test
drwxrwxr-x. 2 root mygrp 4096 Dec  1 20:07 /exercise/test
[[email protected] ~]# su - fedora
[[email protected] ~]$ cd /exercise/test
[[email protected] test]$ touch a.fedora
[[email protected] test]$ ll
total 0
-rw-rw-r--. 1 fedora fedora 0 Dec  1 20:10 a.fedora
[[email protected] test]$ exit
logout
[[email protected] ~]# su - centos
[[email protected] ~]$ cd /exercise/test
[[email protected] test]$ touch a.centos
[[email protected] test]$ ll
total 0
-rw-rw-r--. 1 centos centos 0 Dec  1 20:11 a.centos
-rw-rw-r--. 1 fedora fedora 0 Dec  1 20:10 a.fedora
[[email protected] test]$ exit
logout
[[email protected] ~]# chmod g+s /exercise/test
[[email protected] ~]# ll -d /exercise/test
drwxrwsr-x. 2 root mygrp 4096 Dec  1 20:11 /exercise/test
[[email protected] ~]# su - centos
Last login: Thu Dec  1 20:10:37 CST 2016 on pts/0
[[email protected] ~]$ cd /exercise/test
[[email protected] test]$ touch b.centos
[[email protected] test]$ ll
total 0
-rw-rw-r--. 1 centos centos 0 Dec  1 20:11 a.centos
-rw-rw-r--. 1 fedora fedora 0 Dec  1 20:10 a.fedora
-rw-rw-r--. 1 centos mygrp  0 Dec  1 20:13 b.centos
[[email protected] test]$ exit
logout
[[email protected] ~]# su - fedora
Last login: Thu Dec  1 20:09:00 CST 2016 on pts/0
[[email protected] ~]$ cd /exercise/test
[[email protected] test]$ touch b.fedora
[[email protected] test]$ ll
total 0
-rw-rw-r--. 1 centos centos 0 Dec  1 20:11 a.centos
-rw-rw-r--. 1 fedora fedora 0 Dec  1 20:10 a.fedora
-rw-rw-r--. 1 centos mygrp  0 Dec  1 20:13 b.centos
-rw-rw-r--. 1 fedora mygrp  0 Dec  1 20:14 b.fedora

(4)Sticky
1)Sticky的作用
對於屬組或全域性可寫的目錄,組內的所有使用者或系統上的所有使用者在此目錄中都能建立新檔案或刪除所有的已有檔案;如果為此類目錄設定Sticky許可權,則每個使用者能建立新檔案,且只能刪除自己為屬主的檔案。
2)管理檔案的Sticky許可權

chmod o+|-t FILE...

3)展示位置
其它使用者的執行許可權位,如果其它使用者原本有執行許可權,顯示為小寫t,否則,顯示為大寫T。
系統上的/tmp和/var/tmp目錄預設均有sticky許可權。

[[email protected] ~]# chmod o+t /exercise/test
[[email protected] ~]# ll -d /exercise/test
drwxrwsr-t. 2 root mygrp 4096 Dec  1 20:14 /exercise/test

(5)管理特殊許可權的另一方式
suid sgid sticky 八進位制許可權
0 0 0 0
0 0 1 1
0 1 0 2
0 1 1 3
1 0 0 4
1 0 1 5
1 1 0 6
1 1 1 7
基於八進位制方式賦權時,可於預設的三位八進位制數字左側再加一位八進位制數字。例如:chmod 1777 。
(6)facl
facl為file access control lists,檔案訪問控制列表。
檔案的額外賦權機制:在原來的u,g,o之外,另一層讓普通使用者能控制賦權給另外的使用者或組的賦權機制。
1)getfacl命令: 檢視某檔案的訪問控制列表

getfacl FILE...
user:USERNAME:MODE
group:GROUPNAME:MODE

2)setfacl命令
賦權給使用者:

setfacl  -m  u:USERNAME:MODE  FILE...

賦權給組:

setfacl  -m  g:GROUPNAME:MODE FILE...

撤銷賦權:

setfacl  -x u:USERNAME  FILE...
setfacl  -x  g:GROUPNAME  FILE...

例:

setfacl -m u:hadoop:--- test.centos
[[email protected] exercise]$ cd /tmp
[[email protected] tmp]$ ll -d
drwxrwxrwt. 18 root root 4096 Dec  1 20:26 .
[[email protected] tmp]$ touch test.centos
[[email protected] tmp]$ getfacl test.centos
# file: test.centos
# owner: centos
# group: centos
user::rw-
group::rw-
other::r--

[[email protected] tmp]$ setfacl -m u:fedora:rw test.centos
[[email protected] tmp]$ getfacl test.centos
# file: test.centos
# owner: centos
# group: centos
user::rw-
user:fedora:rw-
group::rw-
mask::rw-
other::r--

[[email protected] tmp]$ setfacl -m g:mygrp:rw test.centos
[[email protected] tmp]$ getfacl test.centos
# file: test.centos
# owner: centos
# group: centos
user::rw-
user:fedora:rw-
group::rw-
group:mygrp:rw-
mask::rw-
other::r--

[[email protected] tmp]$ ll test.centos
-rw-rw-r--+ 1 centos centos 0 Dec  1 20:28 test.centos
[[email protected] tmp]$ exit
logout
[[email protected] ~]# su - fedora
Last login: Thu Dec  1 20:14:01 CST 2016 on pts/0
[[email protected] ~]$ vim /tmp/test.centos