4: Linux 用戶须尚、組振愿、權(quán)限管理和進(jìn)程安全上下文

1. Linux安全模型

資源分派:

Authentication: 認(rèn)證, 驗(yàn)證用戶身份
Authorization: 授權(quán), 不同的用戶設(shè)置不同的權(quán)限
Accounting|Audition: 審計(jì)

當(dāng)用戶登錄成功時(shí), 系統(tǒng)會(huì)自動(dòng)分配令牌TOKEN, 包括: 用戶標(biāo)識(shí)和組成員等信息

1.1 用戶

Linux中每個(gè)用戶是通過User ID(UID)來唯一標(biāo)識(shí)的

  • 管理員: root, 0
  • 普通用戶: 1-60000 自動(dòng)分配
系統(tǒng)用戶: 1-499(CentOS6以前), 1-999(CentOS7以后)
          對(duì)守護(hù)進(jìn)程獲取資源進(jìn)行權(quán)限分配
登錄用戶: 500+(CentOS6以前), 1000+(CentOS7以后)
          給用戶進(jìn)行交互式登錄使用       
  • 如何區(qū)分root和普通用戶?
看用戶id, uid=0, 就是root賬戶, 非0就是普通用戶
  • 查看當(dāng)前登錄用戶uid:

echo $UID

[13:15:24 root@centos8-3 ~]#echo $UID
0
  • id USERNAME: 查看用戶id, 基本組id, 基本組和附加組信息
[10:36:16 root@centos8-3 ~]#id mysql
uid=27(mysql) gid=27(mysql) groups=27(mysql)
  • id - u: 查看當(dāng)前用戶id
[10:36:18 root@centos8-3 ~]#id -u
0
  • id -u USERNAME: 查看某個(gè)用戶的id(無需root權(quán)限, 因?yàn)?etc/passwd和/etc/group是644權(quán)限, 所有用戶都可以查看)
[10:37:19 root@centos8-3 ~]#id -u mysql
27

1.2 用戶組

Linux中可以將一個(gè)或多個(gè)用戶加入用戶組中, 用戶組是通過Group ID(GID)來唯一標(biāo)識(shí)的

  • 管理員組: root, 0
  • 普通組:
系統(tǒng)組: 1-499(CentOS6以前), 1-999(CentOS7以后), 對(duì)守護(hù)進(jìn)程獲取資源進(jìn)行權(quán)限分配
普通組: 500+(CentOS6以前), 1000+(CentOS7以后), 給用戶使用

用戶組是通過組id唯一標(biāo)識(shí), root組是0

1.3 用戶和組的關(guān)系

  • 用戶的主要組,(primary group): 用戶必須屬于一個(gè)且只有一個(gè)主組, 默認(rèn)創(chuàng)建用戶時(shí)會(huì)自動(dòng)創(chuàng)建和用戶名同名的組, 作為用戶的主要組, 由于此組只有一個(gè)用戶, 又稱為私有組

  • 用戶的附加組,(supplementary group): 一個(gè)用戶可以屬于零個(gè)或多個(gè)輔助組,附屬組

id postfix
                                          # 主組  # 附加組
uid=89(postfix) gid=89(postfix) groups=89(postfix),12(mail)

1.4 安全上下文

Linux安全上下文Context: 運(yùn)行中的程序, 即進(jìn)程(process), 以進(jìn)程發(fā)起者的身份運(yùn)行, 進(jìn)程所能夠訪問資源的權(quán)限取決于進(jìn)程的運(yùn)行者的身份

比如: 分別以root和普通用戶身份運(yùn)行, /bin/cat /etc/shadow, 得到的結(jié)果是不同的, 資源能否被訪問, 是由運(yùn)行者的身份決定, 非程序本身

# 以wang身份, 使用cat命令, 訪問/etc/shadow

[wang@demo-c8 ~]$ cat /etc/shadow
cat: /etc/shadow: Permission denied

# 以root身份, 使用cat命令, 訪問/etc/shadow

[root@demo-c8 ~]# cat /etc/shadow
root:$6$YD64S7fSNEcHhV6s$cR6V/rj9Te2GdnE.WJQvlVup9cn8cSDsKaDHazCloevgmSvrswUYC9enlpI5CCVPRQZwA58VyUxvCpval6BaW0::0:99999:7:::
bin:*:18358:0:99999:7:::
daemon:*:18358:0:99999:7:::
adm:*:18358:0:99999:7:::
...

用戶登錄系統(tǒng), 通過了驗(yàn)證后, 系統(tǒng)會(huì)自動(dòng)給用戶發(fā)放一個(gè)token令牌, 當(dāng)用戶運(yùn)行某一程序, 訪問系統(tǒng)資源時(shí), 該程序會(huì)攜帶用戶的token, 程序把token信息提交給資源, 資源檢查這個(gè)token是否有相應(yīng)的權(quán)限, 有權(quán)限則運(yùn)行, 沒權(quán)限則拒絕.

2 用戶和組的配置文件

2.1 用戶和組的主要配置文件

/etc/passwd: 用戶及其屬性信息(名稱, UID, 主組ID等)
/etc/shadow: 用戶密碼及其相關(guān)屬性
/etc/group: 組及其屬性信息
/etc/gshadow: 組密碼及其相關(guān)屬性

2.2 /etc/passwd

查看:

cat /etc/passwd
getent passwd
#只顯示對(duì)應(yīng)的用戶那一行
getent passwd root
[12:01:46 root@centos8-3 ~]#getent passwd root
root:x:0:0:root:/root:/bin/bash

格式:

man 5 passwd
name:password:UID:GID:GECOS:directory:shell
       name        This is the user's login name.  It should not contain capital let‐
                   ters.  ####用戶名不能有大寫字母

       password    This is either the encrypted user password, an  asterisk  (*),  or
                   the letter 'x'.  (See pwconv(8) for an explanation of 'x'.)

       UID         The privileged root login account (superuser) has the user ID 0.

       GID         This  is  the numeric primary group ID for this user.  (Additional
                   groups for the user are defined in  the  system  group  file;  see
                   group(5)).

       GECOS       This  field (sometimes called the "comment field") is optional and
                   used only for informational purposes.  Usually,  it  contains  the
                   full  username.   Some  programs  (for example, finger(1)) display
                   information from this field.

                   GECOS stands for "General Electric  Comprehensive  Operating  Sys‐
                   tem",  which  was renamed to GCOS when GE's large systems division
                   was sold to Honeywell.  Dennis Ritchie has reported: "Sometimes we
                   sent  printer  output or batch jobs to the GCOS machine.  The gcos
                   field in the password file was a place to  stash  the  information
                   for the $IDENTcard.  Not elegant."

       directory   This is the user's home directory: the initial directory where the
                   user is placed after logging in.  The value in this field is  used
                   to set the HOME environment variable.

       shell       This  is  the program to run at login (if empty, use /bin/sh).  If
                   set to a nonexistent executable, the user will be unable to  login
                   through  login(1).   The  value  in  this field is used to set the
                   SHELL environment variable.
name: 登錄用戶名(wang)
passwd: 密碼(x)
UID: 用戶身份編號(hào)(1000)
GID: 登錄默認(rèn)所在組編號(hào)(1000, 主組)
GECOS: 用戶全名或注釋
home directory: 用戶家目錄(/home/wang)
shell: 用戶默認(rèn)使用shell(/bin/bash), 系統(tǒng)程序無需登錄系統(tǒng), 所以shell類型是/sbin/nologin
  • 老的系統(tǒng), 直接把密碼放在這個(gè)文件里, 新的系統(tǒng), 密碼存到了/etc/shadow里, 在/etc/passwd中用'x'占位, 表示該用戶有密碼, 且放在了/etc/shadow文件里
  • 如果把x占位刪了, 那么用戶還是可以用密碼登錄, 不會(huì)造成影響
  • 即使用戶沒有密碼, 也會(huì)用x占位
#當(dāng)前用戶david有密碼, 且存到了/etc/shadow文件
[12:06:13 root@centos8-3 ~]#getent passwd david
david:x:1000:1000::/home/david:/bin/bash

[12:06:18 root@centos8-3 ~]#getent shadow david
david:$6$8d9jd740.1lroUmY$SPOZMn0cdtatKl.21dRoY/05NILIWdeCiGCpAxU..YmjnPcf.hPuL9BagSYshD2R.csft3O0RfPB1h64nRcAs/:18494:0:99999:7:::

#將/etc/passwd中david一行的x占位符刪除, shadow文件中, 加密的密碼還存在
[12:07:30 root@centos8-3 ~]#vim /etc/passwd
david::1000:1000::/home/david:/bin/bash

[12:07:30 root@centos8-3 ~]#getent shadow david
david:$6$8d9jd740.1lroUmY$SPOZMn0cdtatKl.21dRoY/05NILIWdeCiGCpAxU..YmjnPcf.hPuL9BagSYshD2R.csft3O0RfPB1h64nRcAs/:18494:0:99999:7:::
#david用戶也可以正常登錄
Last login: Thu Aug 20 12:10:27 2020
[12:11:26 david@centos8-3 ~]$

2.3 /etc/shadow

如果通過root賬戶把shadow文件權(quán)限改了, 那么普通用戶也可以查看, 修改該文件內(nèi)容

格式: man 5 shadow

   login name
       It must be a valid account name, which exist on the system. #

   encrypted password
       Refer to crypt(3) for details on how this string is interpreted.

       If the password field contains some string that is not a valid result of
       crypt(3), for instance ! or *, the user will not be able to use a unix
       password to log in (but the user may log in the system by other means).

       This field may be empty, in which case no passwords are required to
       authenticate as the specified login name. However, some applications which
       read the /etc/shadow file may decide not to permit any access at all if
       the password field is empty.

       A password field which starts with an exclamation mark means that the
       password is locked. The remaining characters on the line represent the
       password field before the password was locked.

   date of last password change
       The date of the last password change, expressed as the number of days
       since Jan 1, 1970 00:00 UTC.

       The value 0 has a special meaning, which is that the user should change
       her password the next time she will log in the system.

       An empty field means that password aging features are disabled.

   minimum password age
       The minimum password age is the number of days the user will have to wait
       before she will be allowed to change her password again.

       An empty field and value 0 mean that there are no minimum password age.

   maximum password age
       The maximum password age is the number of days after which the user will
       have to change her password.

       After this number of days is elapsed, the password may still be valid. The
       user should be asked to change her password the next time she will log in.

       An empty field means that there are no maximum password age, no password
       warning period, and no password inactivity period (see below).

       If the maximum password age is lower than the minimum password age, the
       user cannot change her password.

   password warning period
       The number of days before a password is going to expire (see the maximum
       password age above) during which the user should be warned.

       An empty field and value 0 mean that there are no password warning period.

   password inactivity period
       The number of days after a password has expired (see the maximum password
       age above) during which the password should still be accepted (and the
       user should update her password during the next login).

       After expiration of the password and this expiration period is elapsed, no
       login is possible for the user. The user should contact her administrator.

       An empty field means that there are no enforcement of an inactivity
       period.

   account expiration date
       The date of expiration of the account, expressed as the number of days
       since Jan 1, 1970 00:00 UTC.

       Note that an account expiration differs from a password expiration. In
       case of an account expiration, the user shall not be allowed to login. In
       case of a password expiration, the user is not allowed to login using her
       password.

       An empty field means that the account will never expire.

       The value 0 should not be used as it is interpreted as either an account
       with no expiration, or as an expiration on Jan 1, 1970.

   reserved field
       This field is reserved for future use.
[12:15:25 root@centos8-3 ~]#getent shadow root
root:$6$k2xA4YZard4r8z9L$URnVG1KSzOD4lxneh/1jGOeWllSWRbTrC2OGfkg5nbD5jdQn8NdM2khsXjkyDnX0XvIXM.bVTmx7MsYIoN/sf/::0:99999:7:::

login name: 用戶名

encrypted password: 加密的用戶密碼字符串, 一般用SHA512加密

$6$k2xA4YZard4r8z9L$URnVG1KSzOD4lxneh/1jGOeWllSWRbTrC2OGfkg5nbD5jdQn8NdM2khsXjkyDnX0XvIXM.bVTmx7MsYIoN/sf/

  • 6: 表示加密算法, 用戶密碼使用SHA512哈希算法加密. CentOS5用MD5, 從CentOS6開始, 就是SHA512了
  • k2xA4YZard4r8z9L: salt, 隨機(jī)字符串, 哈希算法, 單項(xiàng)加密時(shí), 如果數(shù)據(jù)一樣, 那么加密結(jié)果必定一樣, 因此, 在給用戶密碼加密時(shí), 要添加隨機(jī)字符串, 也就是salt, 之后會(huì)將salt和密碼一起加密,存放到shadow文件, 避免由于密碼相同造成泄漏
  • URnVG1KSzOD4lxneh/1jGOeWllSWRbTrC2OGfkg5nbD5jdQn8NdM2khsXjkyDnX0XvIXM.bVTmx7MsYIoN/sf/: 這是把salt和密碼加密后的字符串

范例: 利用openssl生成加密字符串, 對(duì)比salt的作用

假設(shè)root密碼是000000
可以看到, 用相同的salt, k2xA4YZard4r8z9Ll , 采用相同的加密算法,  -6: SHA512, 給相同的字符串加密時(shí), 得到的結(jié)果是一樣的
[12:32:30 root@centos8-3 ~]#getent shadow root
root:$6$k2xA4YZard4r8z9L$URnVG1KSzOD4lxneh/1jGOeWllSWRbTrC2OGfkg5nbD5jdQn8NdM2khsXjkyDnX0XvIXM.bVTmx7MsYIoN/sf/::0:99999:7:::
[12:32:34 root@centos8-3 ~]#openssl passwd -salt k2xA4YZard4r8z9Ll -6 000000
$6$k2xA4YZard4r8z9L$URnVG1KSzOD4lxneh/1jGOeWllSWRbTrC2OGfkg5nbD5jdQn8NdM2khsXjkyDnX0XvIXM.bVTmx7MsYIoN/sf/

  • 如果此處是'!!',表示密碼被鎖定,或者用戶沒有密碼, 那么用戶就會(huì)無法登錄. Ubuntu系統(tǒng)剛裝好時(shí), root賬號(hào)就是顯示'!!', 因此root無法登陸, 我們需要登錄到普通賬戶, sudo -i切換到root賬號(hào),然后給root重置密碼

date of last password change:
密碼下一位表示的是最近一次密碼的更改時(shí)間: 以1970年1月1號(hào)開始,到上一次修改密碼的天數(shù), 如果設(shè)置為0, 那么用戶下一次登錄就必須修改密碼

minimum password age:
下一位: 密碼最短有效期, 比如今天改了密碼, 那么要過了相應(yīng)的天數(shù)后才能再次修改. 如果數(shù)值是0, 表示沒有最短使用天數(shù)限制, 如果是3, 表示3天后才能修改. 這個(gè)只限制了普通用戶改自己的密碼, 如果是root用戶, 可以隨時(shí)修改任何人的密碼

maximum password age:
下一位: 密碼最長(zhǎng)有效期, 改了密碼后, 再過多少天密碼就會(huì)過期, 以天為單位. 可以修改此項(xiàng), 限制

password warning period:
下一位: 上一位定義的密碼有效期到期前, 提前幾天提醒用戶修改密碼

password inactivity period:
下一位: 密碼有效期到了之后, 寬限的天數(shù), 如果超過了這個(gè)寬限天數(shù), 還沒有修改, 那么賬號(hào)就被鎖定, 用戶無法登錄

account expiration date:
下一位: 賬戶有效期, 從1970年1月1號(hào), 到賬戶失效那天的天數(shù)

范例: 修改普通用戶david和root用戶的id, vim /etc/passwd, 普通用戶就會(huì)成為超級(jí)管理員, root成為普通用戶

[13:07:09 root@centos8-3 ~]#getent passwd root david
root:x:0:0:root:/root:/bin/bash
david:x:1000:1000::/home/david:/bin/bash

#修改passwd文檔后
[13:07:55 root@centos8-3 ~]#getent passwd root david
root:x:2000:0:root:/root:/bin/bash
david:x:0:1000::/home/david:/bin/bash

#退出終端,重新用root登錄
#嘗試修改其他用戶密碼, 發(fā)現(xiàn)權(quán)限不夠
[13:08:36 root@centos8-3 ~]$passwd david
passwd: Only root can specify a user name.


#登錄david賬戶, 發(fā)現(xiàn)可以修改原本的root密碼
[13:09:44 david@centos8-3 ~]#passwd root
Changing password for user root.
New password: 
Retype new password: 
passwd: all authentication tokens updated successfully.

#因此, 系統(tǒng)區(qū)分root用戶和普通用戶區(qū)別就是看uid

如果passwd文檔中, 除了root用戶, 還有其他用戶uid為0, 那么這些用戶也會(huì)被當(dāng)做root用戶

#修改了passwd文檔, root和david都是uid=0
[13:13:23 root@centos8-3 ~]#getent passwd root david
root:x:0:0:root:/root:/bin/bash
david:x:0:1000::/home/david:/bin/bash
#從root切換到david, 發(fā)現(xiàn)還是root用戶
[13:14:04 root@centos8-3 ~]#su - david
Last login: Thu Aug 20 13:14:03 AEST 2020 from 10.0.0.1 on pts/0
[13:14:06 root@centos8-3 ~]#

/etc/passwd文件的權(quán)限是644, 只有屬主owner(root)才有權(quán)限修改, 所以不會(huì)出現(xiàn)普通用戶修改該文件的情況

2.4 /etc/group

  • 包含:

組名

組密碼: 早期組也有密碼, 現(xiàn)在不需要了, 通過x占位. 因?yàn)橐坏┙o組制定了密碼, 那么普通用戶如果知道了組的密碼, 就可以把自己加到組里面, 隨即擁有了該組對(duì)應(yīng)的權(quán)限. 危險(xiǎn). 因此,現(xiàn)在組的添加都是root管理員負(fù)責(zé). 如果給組設(shè)定了密碼, 密碼會(huì)存在/etc/gshadow文件中

組id

組成員用戶名: 這些成員把該組作為附加組. 而用戶的主組信息, 存在/etc/passwd里, 用GID表示.

2.5 /etc/gshadow

  • 包含:

組名稱

組密碼

組管理員信息: 把用戶設(shè)定為該組的管理員, 之后可以管理組的信息, 添加刪除用戶, 設(shè)置組密碼

組成員用戶名: 這些成員把該組作為附加組. 用戶的主組, 在/etc/passwd里, gid.

這些文件里, 對(duì)應(yīng)的信息都要保持一致, 否則會(huì)有問題

2.6 文件操作

  • vipw和vigr
  • pwck和grpck

3 用戶和組管理命令

直接修改用戶和組配置文件很繁瑣, 容易出錯(cuò), 因此一般通過管理命令來修改

用戶管理命令

  • useradd 添加
  • usermod 修改
  • userdel 刪除

組賬戶維護(hù)命令

  • groupadd 添加
  • groupmod 修改
  • groupdel 刪除

3.1 用戶創(chuàng)建

創(chuàng)建一個(gè)用戶后, 用戶和組的四個(gè)配置文件都會(huì)被修改

格式:

useradd [options] 用戶名

選項(xiàng):

-u 指定UID
-o 配合-u, 不檢查UID唯一性, 允許UID重復(fù)
-g GID, 指明用戶所屬的基本組, 可以直接寫組名, 也可以寫GID, 創(chuàng)建用戶時(shí), 默認(rèn)會(huì)創(chuàng)建一個(gè)和用戶同名的組, 并且把該組作為用戶的基本組
-c "COMMENT" 用戶注釋信息
-d HOME_DIR, 設(shè)置用戶的家目錄, 注意, 該目錄必須是不存在的, 無論是普通用戶還是系統(tǒng)用戶, 若想創(chuàng)建家目錄, 并且自定義家目錄位置, 就用-d選項(xiàng). 之后, 該家目錄需要手動(dòng)創(chuàng)建, 如果需要修改目錄權(quán)限, 就用root賬戶去修改
-s SHELL, 指明用戶的默認(rèn)shell程序, 可用的shell程序在/etc/shells定義
-G GROUP1[,GROUP2,...], 為用戶指明附加組, 注意, 組必須是已經(jīng)存在的, 可以添加多個(gè)附加組
-N 不創(chuàng)建私用組也就是和用戶同名的組作為主組, 而是使用users這個(gè)組作為主組

[root@demo-c8 ~]# getent group users
users:x:100:

-r 創(chuàng)建系統(tǒng)用戶, CentOS6之前, 系統(tǒng)用戶UID為1-499, CentOS7之后, 系統(tǒng)用戶UID為1-999, 如果沒有指定UID, 那么會(huì)在1-999自動(dòng)分配一個(gè)
-m 創(chuàng)建用戶家目錄, 用于系統(tǒng)用戶, 默認(rèn)不會(huì)給系統(tǒng)用戶創(chuàng)建家目錄, 使用-m會(huì)在/home下給系統(tǒng)用戶創(chuàng)建家目錄
-M 不創(chuàng)建用戶家目錄, 用于非系統(tǒng)用戶, 普通用戶在創(chuàng)建時(shí)會(huì)自動(dòng)在/home下創(chuàng)建家目錄, 通過-M, 可以不創(chuàng)建家目錄

范例: 創(chuàng)建普通用戶, useradd lala

[13:21:34 root@centos8-3 ~]#useradd lala
l[13:32:56 root@centos8-3 ~]#ll /etc/passwd /etc/group /etc/shadow /etc/gshadow
-rw-r--r-- 1 root root  576 Aug 20 13:32 /etc/group
---------- 1 root root  452 Aug 20 13:32 /etc/gshadow
-rw-r--r-- 1 root root 1393 Aug 20 13:32 /etc/passwd
---------- 1 root root  911 Aug 20 13:32 /etc/shadow

[13:33:15 root@centos8-3 ~]#stat !*
stat /etc/passwd /etc/group /etc/shadow /etc/gshadow
  File: /etc/passwd
  Size: 1393        Blocks: 8          IO Block: 4096   regular file
Device: 802h/2050d  Inode: 134677492   Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2020-08-20 13:32:56.596705520 +1000
Modify: 2020-08-20 13:32:56.588705521 +1000
Change: 2020-08-20 13:32:56.589705521 +1000
 Birth: -
  File: /etc/group
  Size: 576         Blocks: 8          IO Block: 4096   regular file
Device: 802h/2050d  Inode: 134677440   Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2020-08-20 13:32:56.664705516 +1000
Modify: 2020-08-20 13:32:56.645705517 +1000
Change: 2020-08-20 13:32:56.646705517 +1000
 Birth: -
  File: /etc/shadow
  Size: 911         Blocks: 8          IO Block: 4096   regular file
Device: 802h/2050d  Inode: 134677475   Links: 1
Access: (0000/----------)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2020-08-20 13:32:56.612705519 +1000
Modify: 2020-08-20 13:32:56.612705519 +1000
Change: 2020-08-20 13:32:56.634705518 +1000
 Birth: -
  File: /etc/gshadow
  Size: 452         Blocks: 8          IO Block: 4096   regular file
Device: 802h/2050d  Inode: 134677484   Links: 1
Access: (0000/----------)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2020-08-20 13:32:56.650705517 +1000
Modify: 2020-08-20 13:32:56.650705517 +1000
Change: 2020-08-20 13:32:56.651705517 +1000
 Birth: -

useradd lala 創(chuàng)建了用戶后, 除了在四個(gè)配置文件里, 添加用戶名, uid, 基本組, gid,等賬號(hào)密碼信息, 還會(huì)在/home下創(chuàng)建以用戶名為目錄的家目錄, 以及給用戶分配默認(rèn)shell類型, 同時(shí)還會(huì)在/var/spool/mail下創(chuàng)建屬于該用戶的郵箱

[13:33:25 root@centos8-3 ~]#ls /home
david  lala
[13:35:29 root@centos8-3 ~]#ll /var/spool/mail
total 0
-rw-rw----  1 david mail 0 Aug 20 10:37 david
-rw-rw----  1 lala  mail 0 Aug 20 13:32 lala
-rw-rw----. 1 rpc   mail 0 Aug 12 20:07 rpc

范例: 創(chuàng)建系統(tǒng)賬戶, 指定各種屬性

useradd -r -u 48 -g apache -s /sbin/nologin -d /var/www -c "Apache" apache 

-r: 創(chuàng)建系統(tǒng)賬戶, 如果是系統(tǒng)用戶, 那么默認(rèn)就不會(huì)在/home創(chuàng)建用戶家目錄, 也不會(huì)在其他位置創(chuàng)建家目錄, 想要?jiǎng)?chuàng)建家目錄的話,需要在-d選項(xiàng)指明, 并且-d選項(xiàng)不會(huì)自動(dòng)創(chuàng)建指定的家目錄, 需要手動(dòng)創(chuàng)建該目錄
-u: UID
-g: 基本組, 必須已經(jīng)存在, 如果不存在, 默認(rèn)會(huì)創(chuàng)建一個(gè)和用戶同名的組,作為其基本組
-s: shell類型/ /bin/false和/sbin/nologin都是不允許用戶登錄, CentOS都支持, Ubuntu只有/bin/false
-d: 家目錄路徑
-c: 描述
  • useradd命令在創(chuàng)建用戶時(shí)的默認(rèn)屬性由/etc/default/useradd定義, 或者執(zhí)行useradd -D也能查看該文件的內(nèi)容
[14:05:07 root@centos8-3 ~]#vim /etc/default/useradd

# useradd defaults file
GROUP=100 
HOME=/home
INACTIVE=-1   # 對(duì)應(yīng)/etc/shadow文件第七列, 即用戶密碼過期的寬限期
EXPIRE=       # 對(duì)應(yīng)/etc/shadow文件第八列, 即用戶賬號(hào)的有效期
SHELL=/bin/bash
SKEL=/etc/skel  # 包含創(chuàng)建用戶家目錄的模板文件, 創(chuàng)建了用戶家目錄后, /home/xx里面會(huì)包含三個(gè)隱藏文件, 就是從該目錄拷貝過去的. 默認(rèn)是三個(gè)隱藏文件, 也可以自行創(chuàng)建普通文件放進(jìn)去, 這樣用戶創(chuàng)建后, 就會(huì)有自定義的普通文件, 這個(gè)普通文件也是從/etc/skel復(fù)制過去的
CREATE_MAIL_SPOOL=yes
[14:07:47 root@centos8-3 ~]#ls -a /home/lala
.  ..  .bash_logout  .bash_profile  .bashrc
[14:07:54 root@centos8-3 ~]#ls -a /etc/skel/
.  ..  .bash_logout  .bash_profile  .bashrc

練習(xí): 希望新建用戶的家目錄里有abc文件?

在/etc/skel目錄中, 創(chuàng)建abc文件, 這樣新建的用戶家目錄就會(huì)有abc文件.
修改完/etc/skel內(nèi)容后, 會(huì)立即生效, 不需要退出root賬戶, 直接創(chuàng)建新用戶, 就會(huì)在家目錄生成相應(yīng)文件

修改模板后, 只會(huì)影響新建用戶

[14:08:43 root@centos8-3 ~]#cd /etc/skel/
[14:17:45 root@centos8-3 /etc/skel]#touch abc.txt
[14:18:24 root@centos8-3 /etc/skel]#ls
abc.txt
[14:18:25 root@centos8-3 /etc/skel]#useradd oohh
[14:18:35 root@centos8-3 /etc/skel]#ls /home/oohh/
abc.txt

3.2 用戶屬性修改

usermod可以修改用戶屬性

格式:

usermod [option] 用戶名

常見選項(xiàng):

-u UID: 指定新的UID
-g GID: 指定新的主組GID
-G GROUP1[,GROUP2,...]: 指定新的附加組ID, 默認(rèn)會(huì)覆蓋原有的附加組, 如果想追加附加組, 需要配合-a選項(xiàng)
-s SHELL: 修改使用的shell
-c 'COMMENT' 添加注釋
-d HOME_DIRECTORY, 指定新的家目錄, 需要手動(dòng)創(chuàng)建目錄, 若要?jiǎng)?chuàng)建新家目錄并移動(dòng)原價(jià)目錄數(shù)據(jù), 同時(shí)使用-m選項(xiàng)
-l 用戶名, 指定新的用戶名
-L 用戶名, 鎖定用戶, 會(huì)在/etc/shadow密碼欄加!!
-U 用戶名, 解鎖用戶, 去掉/etc/shadow密碼欄的!!
-e YYYY-MM-DD, 指定用戶賬號(hào)過期時(shí)間
-f INACTIVE: 設(shè)定非活動(dòng)期間, 即密碼過期后的寬限期

3.3 刪除用戶

格式:

userdel [options] USERNAME

不加任何選項(xiàng), 只會(huì)刪除用戶, 但是家目錄, 郵箱都會(huì)保留, 如果想保留用戶數(shù)據(jù), 可以不加選項(xiàng)

userdel -r USERNAME, 會(huì)把數(shù)據(jù)都刪了, 包括用戶家目錄和郵箱
userdel -f, 強(qiáng)制刪除

3.4 查看用戶相關(guān)的ID信息

id命令可以查看用戶的UID, GID等信息

id [option]... [user]

常見選項(xiàng):

-u 顯示UID
-g 顯示GID
-G 顯示用戶所屬的組和ID
-n 顯示名稱, 需配合ugG使用

3.5 切換用戶或以其他用戶身份執(zhí)行命令

su: 即switch user, 該命令用于切換用戶身份, 并且以指定用戶的身份執(zhí)行命令

格式:

su [options] [-] [user [args...]]

常見選項(xiàng):

-l, --login su -l 用戶名, 相當(dāng)于  su - 用戶名
-c, --command <command>    pass a single command to the shell with -c 

切換用戶的方式:

  • su USERNAME: 非登錄式切換, 即不會(huì)讀取目標(biāo)用戶的配置文件, 也不會(huì)改變當(dāng)前工作目錄, 即不完全切換

  • su - USERNAME: 登錄式切換, 會(huì)讀取目標(biāo)用戶的配置文件, 切換至目標(biāo)用戶的家目錄, 即完全切換

說明: root通過su, 切換至其他用戶時(shí), 無需輸入密碼, 非root用戶, 通過su, 切換到其他用戶時(shí), 需要輸入對(duì)應(yīng)用戶的密碼

注意: su切換到新用戶后, 要使用exit退回至原來的用戶, 而不要使用su切換至原來的賬戶, 否則會(huì)生成很多的bash子進(jìn)程, 環(huán)境可能會(huì)混亂

su USERNAME vs su - USERNAME

su USERNAME: 非完全切換

  • 切換后的工作目錄,還停留在切換前的工作目錄
  • 切換后的PATH變量,保留了root的PATH變量信息
[14:28:07 root@centos8-3 ~]#su david
[14:31:02 david@centos8-3 /root]$echo $PATH
/home/david/.local/bin:/home/david/bin:/data/scripts:/data/scripts:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

su - USERNAME: 完全切換, 等于 su -l USERNAME

  • 切換后, 當(dāng)前工作目錄就是切換后的用戶的自己的家目錄
  • 切換后, PATH就是自己賬戶的PATH變量
  • 即使是從root su - 到普通用戶, 切換后的工作目錄也是普通用戶的家目錄
[14:37:33 root@centos8-3 ~]#su - david
Last login: Thu Aug 20 14:36:09 AEST 2020 on pts/0
[14:37:36 david@centos8-3 ~]$pwd
/home/david
[14:37:37 david@centos8-3 ~]$echo $PATH
/home/david/.local/bin:/home/david/bin:/data/scripts:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin

root用戶和普通用戶的PATH變量是不同的

[root@demo-c8 ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

[wang@demo-c8 ~]$ echo $PATH
/home/wang/.local/bin:/home/wang/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin
  • su - USERNAME -c CMD: 以別的用戶的身份執(zhí)行命令, 命令執(zhí)行完退回當(dāng)前用戶身份

  • 普通用戶臨時(shí)切換成root用戶執(zhí)行命令, 需要知道root密碼

[14:41:22 david@centos8-3 ~]$su - root -c 'cat /etc/passwd'
Password: 
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

3.6 設(shè)置密碼

image.png

passwd可以修改用戶密碼

格式:

passwd [options]  USERNAME

常用選項(xiàng):

-d: 刪除指定用戶密碼
-l: 鎖定指定用戶
-u: 解鎖指定用戶
-e: 強(qiáng)制用戶下次登錄時(shí)修改密碼
-f: 強(qiáng)制修改
-n MINDAYS: 指定密碼最短使用期限
-x MAXDAYS: 指定密碼最長(zhǎng)使用期限
-w WARNDAYS: 提前幾天開始密碼過期警告
-i INACTIVEDAYS: 非活動(dòng)期限
--stdin: 從標(biāo)準(zhǔn)輸入接收用戶密碼, Ubuntu無此選項(xiàng), Ubuntu可以用chpasswd

# CentOS獨(dú)有

echo 000000 | passwd --stdin wang

# CentOS和Ubunut通用的修改密碼方法
echo wang:000000 | chpasswd
echo -e "123456\n123456" | passwd wang

-e: 創(chuàng)建用戶后, 先通過passwd USERNAME給用戶設(shè)置一個(gè)初始密碼, 這樣用戶能夠完成登錄 之后管理員再通過passwd -e USERNAME選項(xiàng)強(qiáng)制用戶下次登錄修改密碼. 該命令實(shí)際修改了/etc/shadow文件, 對(duì)應(yīng)用戶在date of last password change字段的值, 修改為0了, 也就是從1970年1月1日到上次修改密碼是0天, 所有下次登錄必須修改密碼

# 先創(chuàng)建owen用戶, 設(shè)置密碼, 然后使用-e選項(xiàng), 強(qiáng)制用戶下次登錄修改密碼
[root@demo-c8 ~]# useradd owen
[root@demo-c8 ~]# passwd owen
Changing password for user owen.
New password: 
BAD PASSWORD: The password is a palindrome
Retype new password: 
passwd: all authentication tokens updated successfully.
[root@demo-c8 ~]# passwd -e owen
Expiring password for user owen.
passwd: Success

# owen用戶登錄

[root@demo-c8 ~]# clear
[root@demo-c8 ~]# ssh owen@10.0.0.108
owen@10.0.0.108's password:   #1. 先通過原始密碼登錄
You are required to change your password immediately (administrator enforced)
Activate the web console with: systemctl enable --now cockpit.socket

Last login: Sat Aug 20 23:00:50 2022 from 10.0.0.108
WARNING: Your password has expired.
You must change your password now and login again!
Changing password for user owen.
Current password:     #2. 輸入原始密碼
New password:         #3. 輸入新的密碼, 因?yàn)槭瞧胀ㄓ脩粜薷淖约旱拿艽a, 所以必須符合復(fù)雜度要求
Retype new password:  #4. 重復(fù)輸入新密碼
passwd: all authentication tokens updated successfully.
Connection to 10.0.0.108 closed.

[root@demo-c8 ~]# ssh owen@10.0.0.108
owen@10.0.0.108's password:  #5. 用新密碼登錄 
Activate the web console with: systemctl enable --now cockpit.socket

Last login: Sat Aug 20 23:01:02 2022 from 10.0.0.108
[owen@demo-c8 ~]$ 

修改用戶密碼方法

  1. passwd USERNAME # 需要輸入兩次密碼
  2. echo USERNAME:PASSWORD | chpasswd # 可以直接修改密碼
  3. echo PASSWORD | passwd --stdin USERNAME # 僅適用于紅帽系統(tǒng)
  4. 非交互式修改密碼
#此方式適用于各種Linux版本,
[14:56:57 root@centos8-3 ~]#echo -e 'ilovelinux\nilovelinux' | passwd david
Changing password for user david.
New password: Retype new password: passwd: all authentication tokens updated successfully.

#此方式只用于紅帽系列
[14:57:55 root@centos8-3 ~]#echo 'linuxloveme' | passwd --stdin david
Changing password for user david.
passwd: all authentication tokens updated successfully.

3.7 修改用戶密碼策略

如果是普通用戶給自己修改密碼,必須符合密碼組合條件, 比如大于8個(gè)字符, 大小寫都要有等等. 而通過root用戶給自己或者給其他用戶設(shè)置密碼, 是沒有復(fù)雜度要求的

  • chage -l USERNAME: 查看用戶密碼策略, 看的是shadow文件里的內(nèi)容, 因此只有root用戶可以執(zhí)行

常見選項(xiàng):

-d  表示的是最近一次密碼的更改時(shí)間: 以1970年1月1號(hào)開始,到上一次修改密碼的天數(shù), 如果設(shè)置為0, 那么用戶下一次登錄就必須修改密碼

-m 密碼最短有效期, 比如今天改了密碼, 那么要過了相應(yīng)的天數(shù)后才能再次修改. 如果數(shù)值是0, 表示沒有最短使用天數(shù)限制, 如果是3, 表示3天后才能修改. 這個(gè)只限制了普通用戶改自己的密碼, 如果是root用戶, 可以隨時(shí)修改任何人的密碼

-M  密碼最長(zhǎng)有效期, 改了密碼后, 再過多少天密碼就會(huì)過期, 以天為單位. 可以修改此項(xiàng), 限制

-W 上一位定義的密碼有效期到期前, 提前幾天提醒用戶修改密碼

-I 密碼有效期到了之后, 寬限的天數(shù), 如果超過了這個(gè)寬限天數(shù), 還沒有修改, 那么賬號(hào)就被鎖定, 用戶無法登錄

-E 賬戶有效期, 從1970年1月1號(hào), 到賬戶失效那天的天數(shù)
[14:57:59 root@centos8-3 ~]#chage -l david
Last password change                    : Aug 20, 2020
Password expires                    : never
Password inactive                   : never  # 寬限期
Account expires                     : never
Minimum number of days between password change      : 0
Maximum number of days between password change      : 99999
Number of days of warning before password expires   : 7
[15:00:41 root@centos8-3 ~]#chage -l root
Last password change                    : Aug 20, 2020
Password expires                    : never
Password inactive                   : never
Account expires                     : never
Minimum number of days between password change      : 0
Maximum number of days between password change      : 99999
Number of days of warning before password expires   : 7
[15:00:44 root@centos8-3 ~]#su - david
Last login: Thu Aug 20 14:37:36 AEST 2020 on pts/0
[15:00:48 david@centos8-3 ~]$chage -l root
chage: Permission denied.

范例: 修改用戶密碼策略

[root@demo-c8 ~]# chage -m 3 -M 42 -W 14 -I 7 -E 2022-11-11 wang
[root@demo-c8 ~]# chage -l wang
Last password change                    : never
Password expires                    : never
Password inactive                   : never
Account expires                     : Nov 11, 2022
Minimum number of days between password change      : 3
Maximum number of days between password change      : 42
Number of days of warning before password expires   : 14

范例: 強(qiáng)制用戶下次登錄修改密碼

# 把date of last password change設(shè)置為0, 這樣下次登錄就必須修改密碼
chage -d 0 wang

# 或者passwd -e USERNAME

3.8 用戶相關(guān)的其他命令

  • chfn 指定個(gè)人信息. COMMENT列的內(nèi)容
  • chsh 指定shell, 相當(dāng)于usermod -s
  • finger 可查看用戶個(gè)人信息
root@demo-c8 ~]# chfn wang
Changing finger information for wang.
Name [wang]: wangxiaoning      
Office []: it
Office Phone []: 100000
Home Phone []: 11111


Finger information changed.
[root@demo-c8 ~]# getent passwd wang
wang:x:1000:1000:wangxiaoning,it,100000,11111:/home/wang:/bin/bash
root@demo-c8 ~]# chsh -s /bin/sh wang
Changing shell for wang.
Shell changed.
[root@demo-c8 ~]# getent passwd wang
wang:x:1000:1000:wangxiaoning,it,100000,11111:/home/wang:/bin/sh

3.9 創(chuàng)建組

groupadd實(shí)現(xiàn)創(chuàng)建組, 把用戶加到組里, 用戶就有了該組的權(quán)限

常見選項(xiàng):

-g GID 指明組ID
-r 創(chuàng)建系統(tǒng)組, CentOS6之前, ID 1-499, CentOS7之后, ID 1-999 

范例:

[root@demo-c8 ~]# groupadd -g 48 -r apache
[root@demo-c8 ~]# getent group apache
apache:x:48:

3.10 修改組

groupmod 組屬性修改
usermod -g: 修改用戶的基本組信息
usermod -G: 修改用戶的附加組信息

格式:

groupmod [option] group

常見選項(xiàng):

-n 組的新名字
-g 組的新ID

一般都是把用戶添加到一個(gè)附加組, 基本組很少動(dòng)
用戶必須屬于一個(gè)且只有一個(gè)主組
一個(gè)用戶可以屬于零個(gè)或多個(gè)附屬組

usermod -G GROUPNAME USERNAME: 該命令會(huì)把用戶加入到指定附加組, 但是如果給同一個(gè)用戶添加不同附加組時(shí), 先加入的會(huì)被后面的組取代, 無法保留多個(gè)附加組

[15:02:12 root@centos8-3 ~]#groupadd g1
[15:13:41 root@centos8-3 ~]#groupadd g2
[15:13:43 root@centos8-3 ~]#groupadd g3
[15:13:44 root@centos8-3 ~]#usermod -G g1 david
[15:13:50 root@centos8-3 ~]#usermod -G g2 david
[15:13:52 root@centos8-3 ~]#id david
uid=1000(david) gid=1000(david) groups=1000(david),1006(g2)
[15:13:57 root@centos8-3 ~]#usermod -G g3 david
[15:14:10 root@centos8-3 ~]#id david
uid=1000(david) gid=1000(david) groups=1000(david),1007(g3)

如果想把一個(gè)用戶添加到多個(gè)附加組, 需要再加 -a 選項(xiàng)
-a 要在 -G 選項(xiàng)前面, 組名之間逗號(hào)隔開, 不能用空格,

[15:17:43 root@centos8-3 ~]#usermod -a -G  g1,g2,g3 david
[15:17:47 root@centos8-3 ~]#id david
uid=1000(david) gid=1000(david) groups=1000(david),1005(g1),1006(g2),1007(g3)
  • groupmems: 查看, 修改組信息的命令

查看組成員:

groupmems -l -g g1 # -l 在前 -g 在后 Usage: groupmems [options] [action]
[15:18:28 root@centos8-3 ~]#groupmems -l -g g1
david 
[15:19:45 root@centos8-3 ~]#groupmems -l -G g1
groupmems: invalid option -- 'G'
Usage: groupmems [options] [action]

Options:
  -g, --group groupname         change groupname instead of the user's group
                                (root only)
  -R, --root CHROOT_DIR         directory to chroot into

Actions:
  -a, --add username            add username to the members of the group
  -d, --delete username         remove username from the members of the group
  -h, --help                    display this help message and exit
  -p, --purge                   purge all members from the group
  -l, --list                    list the members of the group

3.11 組刪除

groupdel 可以刪除組

格式:

groupdel [options] GROUP

常見選項(xiàng):

-f 強(qiáng)制刪除, 即使是用戶的主組也會(huì)被強(qiáng)制刪除

把某用戶, 從其所有的附加組中移除

usermod -G "" david # 組名為空, 就是從附加組移除

附加組, 即使里面有人, 也可以隨便刪

[15:24:42 root@centos8-3 ~]#groupmems -l -g g2
david 
[15:24:51 root@centos8-3 ~]#groupdel g2

基本組刪除需要使用-f選項(xiàng), groupdel -f, 會(huì)把基本組刪除

[root@demo-c8 ~]# id wang
uid=1000(wang) gid=1000(wang) groups=1000(wang)
[root@demo-c8 ~]# groupdel -f wang
[root@demo-c8 ~]# getent group wang
[root@demo-c8 ~]# id wang
uid=1000(wang) gid=1000 groups=1000

3.11 更改組密碼

gpasswd命令, 可以修改組密碼. 也可以修改附加組的成員關(guān)系

格式:

gpasswd [option] GROUP

常見選項(xiàng):

-a user 將user添加到指定組
-d user 從指定附加組中移除指定用戶
-A user1, user2, ... 設(shè)置有組管理權(quán)限的用戶列表
# 增加組成員

[root@demo-c8 ~]# groupadd -g 1002 admins
[root@demo-c8 ~]# id wang
uid=1000(wang) gid=1000(wang) groups=1000(wang)
[root@demo-c8 ~]# gpasswd -a wang admins
Adding user wang to group admins
[root@demo-c8 ~]# id wang
uid=1000(wang) gid=1000(wang) groups=1000(wang),1002(admins)
[root@demo-c8 ~]# groups wang
wang : wang admins
[root@demo-c8 ~]# getent group admins
admins:x:1002:wang
# 刪除組成員

[root@demo-c8 ~]# gpasswd -d wang admins
Removing user wang from group admins
[root@demo-c8 ~]# groups wang
wang : wang
[root@demo-c8 ~]# id wang
uid=1000(wang) gid=1000(wang) groups=1000(wang)
[root@demo-c8 ~]# getent group admins
admins:x:1002:

3.12 臨時(shí)切換主組

newgrp命令可以臨時(shí)切換主組, 如果用戶本身不屬于此組, 則需要組密碼

基本組和附加組使用場(chǎng)景

臨時(shí)切換基本組, 這樣同一個(gè)賬戶可以創(chuàng)建屬組不同的文件. 先切換到一個(gè)主組1, 這樣該用戶創(chuàng)建的文件的屬主是自己, 屬組是臨時(shí)切換的主組1. 創(chuàng)建完畢, 執(zhí)行exit, 退回到默認(rèn)狀態(tài), 這樣再創(chuàng)建的文件, 屬主是自己, 屬組也是自己本身的主組了

格式:

newgrp [-] [group]

如果使用[-]選項(xiàng), 可以初始化用戶環(huán)境

# 給root組添加密碼

[root@demo-c8 ~]# gpasswd root
Changing the password for group root
New Password:  000000
Re-enter new password: 000000 

# 驗(yàn)證組密碼被創(chuàng)建
 
[root@demo-c8 ~]# getent gshadow root
root:$6$KCTQwDsFxse$o10OqHuwjlhYyCdL5W7GunQpQb6abRq.xUlajdCV2C99TeEVEVVt25fas3c8ynqRgnVAj370Gr79NXfJ95Zlh.::

# 登錄wang賬戶, 執(zhí)行newgrp root, 臨時(shí)切換wang的主組為root

[root@demo-c8 ~]# id wang # wang的主組是wang
uid=1000(wang) gid=1000(wang) groups=1000(wang)

[root@demo-c8 ~]# su - wang
[wang@demo-c8 ~]$ newgrp root
Password: 
[wang@demo-c8 ~]$ id
uid=1000(wang) gid=0(root) groups=0(root),1000(wang)

[wang@demo-c8 ~]$ touch wang1.txt
[wang@demo-c8 ~]$ ll
-rw-r--r--. 1 wang root 0 Aug 20 23:46 wang1.txt


# 執(zhí)行newgrp切換主組后, 需要執(zhí)行exit退出, 退出后, 主組信息就回到默認(rèn)的主組了
[wang@demo-c8 ~]$ exit
exit
[wang@demo-c8 ~]$ id
uid=1000(wang) gid=1000(wang) groups=1000(wang) 
[wang@demo-c8 ~]$ touch wang2.txt
[wang@demo-c8 ~]$ ll wang2.txt -d
-rw-rw-r--. 1 wang wang 0 Aug 20 23:47 wang2.txt

3.13 更改和查看組成員

groupmems可以管理附加組的成員關(guān)系

格式:

groupmems [options] [action]

常見選項(xiàng):

-g  組名  # 指定管理的組名
-a  用戶名 # 配合-g 組名, 將用戶添加到該組, 作為附加組
-d 用戶名 # 配合-g 組名, 將用戶從該附加組中刪除
-p 組名 # 從組中清除所有成員
-l  組名 # 配合-g 組名, 顯示組成員列表

groups命令可查看用戶組關(guān)系

格式:

# 查看用戶所屬組列表

groups [options] [username]

[wang@demo-c8 ~]$ groups wang
wang : wang

范例:

[root@demo-c8 ~]# usermod -G admins -a wang
[root@demo-c8 ~]# groups wang
wang : wang admins
[root@demo-c8 ~]# id wang                # 主組  # 附加組
uid=1000(wang) gid=1000(wang) groups=1000(wang),1002(admins)

# 查看該附加組的成員

[root@demo-c8 ~]# groupmems -g admins -l
wang 

# 將root添加到admins組, 將其作為root的附加組

[root@demo-c8 ~]# groupmems -a root -g admins
[root@demo-c8 ~]# groups admins
groups: ‘a(chǎn)dmins’: no such user
[root@demo-c8 ~]# groupmems -g admins -l
wang  root 

# 將wang和root從附加組admins刪除

[root@demo-c8 ~]# groupmems -g admins -d wang 
[root@demo-c8 ~]# groupmems -g admins -d root
[root@demo-c8 ~]# groupmems -g admins -l
[root@demo-c8 ~]# id wang
uid=1000(wang) gid=1000(wang) groups=1000(wang)
[root@demo-c8 ~]# id root
uid=0(root) gid=0(root) groups=0(root)

# 情況admins附加組所有成員信息

[root@demo-c8 ~]# groupmems -g admins -p

3.14 練習(xí)

  1. 創(chuàng)建用戶gentoo, 附加組為bin和root, 默認(rèn)shell為/bin/csh, 注釋信息為"Gentoo Distribution"

  2. 創(chuàng)建下面的用戶, 組和成員關(guān)系

名字為webs的組
用戶nginx, 使用webs作為附加組
用戶varnish, 使用webs作為附加組
用戶mysql, 不可交互式登錄系統(tǒng), 且不是webs的成員, nginx, varnish, mysql密碼都是000000

文件權(quán)限管理

image.png

4.1 文件所有者和屬組屬性操作

4.1.1 設(shè)置文件的所有者chown

chown命令可以修改文件的屬主, 也可以修改文件屬組

格式:

chown [OPTION]... [OWNER][:[GROUP]] FILE...
chown [OPTION]... --reference=RFILE FILE...

用法說明:

OWNER # 只修改所有者
OWNER:GROUP # 同時(shí)修改所有者和屬組
:GROUP # 只修改屬組, 冒號(hào)也可用.替換
--reference=RFILE # 參考指定的屬性, 來修改, 也就是按照RFILE文件的屬主和屬組來修改其他的文件的屬主和屬組
-R # 遞歸修改, 非常危險(xiǎn)!

范例:

# 準(zhǔn)備測(cè)試文件

[root@demo-c8 ~]# cd /data
[root@demo-c8 data]# cp /etc/fstab f1.txt
[root@demo-c8 data]# ll
total 4
-rw-r--r--. 1 root root 709 Aug 21 20:18 f1.txt
# 修改f1.txt的屬主為wang賬號(hào)

[root@demo-c8 data]# chown wang f1.txt
[root@demo-c8 data]# ll
total 4
-rw-r--r--. 1 wang root 709 Aug 21 20:18 f1.txt
# 修改f1.txt的屬組為admins

[root@demo-c8 data]# groupadd -g 1002 admins
[root@demo-c8 data]# getent group admins
admins:x:1002:
[root@demo-c8 data]# chown :admins f1.txt
[root@demo-c8 data]# ll 
total 4
-rw-r--r--. 1 wang admins 709 Aug 21 20:18 f1.tx
# 修改f1.txt的屬主為root, 修改屬組為bin

[root@demo-c8 data]# chown root.bin f1.txt
[root@demo-c8 data]# ll
total 4
-rw-r--r--. 1 root bin 709 Aug 21 20:18 f1.txt
# 修改f1.txt的屬主為wang, 修改屬組為admins

[root@demo-c8 data]# chown wang:admins f1.txt 
[root@demo-c8 data]# ll
total 4
-rw-r--r--. 1 wang admins 709 Aug 21 20:18 f1.txt
# 根據(jù)f1.txt的屬主和屬組, 修改f2.txt的屬主和屬組

[root@demo-c8 data]# cp /etc/fstab f2.txt
[root@demo-c8 data]# ll
total 8
-rw-r--r--. 1 wang admins 709 Aug 21 20:18 f1.txt
-rw-r--r--. 1 root root   709 Aug 21 20:26 f2.txt
[root@demo-c8 data]# chown --reference=f1.txt f2.txt
[root@demo-c8 data]# ll
total 8
-rw-r--r--. 1 wang admins 709 Aug 21 20:18 f1.txt
-rw-r--r--. 1 wang admins 709 Aug 21 20:26 f2.txt
  • chown -R, 遞歸修改目錄, 以目錄內(nèi)所有文件的所有者和所屬組

遞歸修改會(huì)修改目錄本身權(quán)限, 目錄內(nèi)的文件和子目錄權(quán)限, 子目錄內(nèi)的文件和子子目錄權(quán)限...

[15:33:47 root@centos8-3 ~]#cp -r /boot /data/prac
[16:28:26 root@centos8-3 ~]#cd /data/prac
[16:28:29 root@centos8-3 /data/prac]#ls
boot
[16:28:29 root@centos8-3 /data/prac]#ll -d boot/
dr-xr-xr-x 6 root root 4096 Aug 20 16:28 boot/
[16:28:34 root@centos8-3 /data/prac]#chown -R david:g1 boot
[16:28:46 root@centos8-3 /data/prac]#ll -d boot/
dr-xr-xr-x 6 david g1 4096 Aug 20 16:28 boot/
[16:28:55 root@centos8-3 /data/prac]#ll boot/
total 129432
-rw-r--r-- 1 david g1   187648 Aug 20 16:28 config-4.18.0-193.el8.x86_64
drwxr-xr-x 3 david g1       17 Aug 20 16:28 efi
drwx------ 4 david g1       83 Aug 20 16:28 grub2
-rw------- 1 david g1 65603976 Aug 20 16:28 initramfs-0-rescue-f072eccf217a4374b5b44dc4461b3c54.img
-rw------- 1 david g1 27486526 Aug 20 16:28 initramfs-4.18.0-193.el8.x86_64.img
-rw------- 1 david g1 17507504 Aug 20 16:28 initramfs-4.18.0-193.el8.x86_64kdump.img
drwxr-xr-x 3 david g1       21 Aug 20 16:28 loader
drwx------ 2 david g1        6 Aug 20 16:28 lost+found
-rw------- 1 david g1  3909996 Aug 20 16:28 System.map-4.18.0-193.el8.x86_64
-rwxr-xr-x 1 david g1  8913656 Aug 20 16:28 vmlinuz-0-rescue-f072eccf217a4374b5b44dc4461b3c54
-rwxr-xr-x 1 david g1  8913656 Aug 20 16:28 vmlinuz-4.18.0-193.el8.x86_64

chown -R是及其危險(xiǎn)的命令, 很容易失誤把整個(gè)根/目錄全部遞歸修改了

范例: / 和boot中間加了個(gè)空格, 直接把整個(gè)根目錄及其內(nèi)部所有內(nèi)容的所有者和所屬組全改了

chown -R g1:g2 / boot

4.1.2 設(shè)置文件的屬組信息chgrp

chgrp命令只可以修改文件的屬組

格式:

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

-R遞歸

范例:

[root@demo-c8 data]# chgrp bin f1.txt
[root@demo-c8 data]# ll
total 12
-rw-r--r--. 1 wang bin     709 Aug 21 20:18 f1.txt

4.2 文件權(quán)限

4.2.1 文件權(quán)限說明

文件的權(quán)限主要針對(duì)三類對(duì)象進(jìn)行定義

owner 屬主 u
group 屬組 g
other 其他 o

注意: 用戶的最終權(quán)限, 是從左向右進(jìn)行順序匹配, 即, 所有者, 所屬組, 其他人, 一旦匹配到相應(yīng)權(quán)限, 那么立即生效, 不再向右查看其權(quán)限

  • 是不是文件所有者
  • 是不是文件所屬組的成員, id命令查看, 不管是基本組還是附加組, 只要是該組成員即可
  • 都不是那就是其他用戶

每個(gè)文件,針對(duì)每類訪問者都定義了三種權(quán)限

r readable 可讀
w writable 可寫
x excutable 可執(zhí)行

rwx讀寫執(zhí)行, 對(duì)于文件和目錄的含義是不同的

對(duì)于文件:

r: 可使用文件查看類工具,比如:cat红选,可以查看文件內(nèi)容
w: 可修改其內(nèi)容, vim編輯, echo重定向
x: 可以把此文件提請(qǐng)內(nèi)核啟動(dòng)為一個(gè)進(jìn)程澜公,即可以執(zhí)行(運(yùn)行)此文件(此文件的內(nèi)容必須是可執(zhí)行的, 比如腳本或者編譯好的命令. 即使是root賬戶, 如果沒有文件的x權(quán)限, 也是無法執(zhí)行文件的

對(duì)于目錄:

r: 可以使用ls查看此目錄中文件列表, 并且需要對(duì)目錄有x權(quán)限, 如果沒有x權(quán)限, 雖然也能看見文件列表, 但會(huì)有以下報(bào)錯(cuò)

# /root目錄默認(rèn)權(quán)限是550, 其他用戶沒有讀寫執(zhí)行權(quán)限
[root@demo-c8 ~]# ll -d /root
dr-xr-x---. 15 root root 4096 Aug 21 20:18 /root

# 通過root賬號(hào), 給/root目錄, 添加其他用戶可讀的權(quán)限
[root@demo-c8 ~]# chmod o+r /root -R
[root@demo-c8 ~]# ll -d /root
dr-xr-xr--. 15 root root 4096 Aug 21 20:18 /root

# 切換到wang賬號(hào), 執(zhí)行l(wèi)s /root
[root@demo-c8 ~]# su - wang
[wang@demo-c8 ~]$ ls /root
ls: cannot access '/root/anaconda-ks.cfg': Permission denied
ls: cannot access '/root/initial-setup-ks.cfg': Permission denied
ls: cannot access '/root/Desktop': Permission denied
ls: cannot access '/root/Downloads': Permission denied
ls: cannot access '/root/Templates': Permission denied
ls: cannot access '/root/Public': Permission denied
ls: cannot access '/root/Documents': Permission denied
ls: cannot access '/root/Music': Permission denied
ls: cannot access '/root/Pictures': Permission denied
ls: cannot access '/root/Videos': Permission denied
ls: cannot access '/root/f1.txt': Permission denied
# wang賬號(hào)仍然可以查看/root目錄內(nèi)的文件列表, 但是會(huì)有Permission denied報(bào)錯(cuò)
anaconda-ks.cfg  Desktop  Documents  Downloads  f1.txt  initial-setup-ks.cfg  Music  Pictures  Public  Templates  Videos
# 給其他用戶添加x權(quán)限后, 再次查看/root目錄就不會(huì)報(bào)錯(cuò)了
[root@demo-c8 ~]# chmod o+x /root -R
[root@demo-c8 ~]# su - wang
[wang@demo-c8 ~]$ ls /root
anaconda-ks.cfg  Desktop  Documents  Downloads  f1.txt  initial-setup-ks.cfg  Music  Pictures  Public  Templates  Videos

w: 可在此目錄中創(chuàng)建文件,也可刪除此目錄中的文件,或者改名, 刪除和修改文件名的權(quán)限和此被刪除或修改的文件的本身rwx權(quán)限無關(guān). 因?yàn)槲募麑儆谀夸浀臄?shù)據(jù)內(nèi)容, 一個(gè)目錄的數(shù)據(jù)內(nèi)容包含文件名/目錄名, 以及對(duì)應(yīng)的inode編號(hào)
x: 可以cd進(jìn)入此目錄,可以使用ls -l查看此目錄中的文件和目錄的元數(shù)據(jù)(須配合r權(quán)限)坟乾,x屬于目錄的可訪問的最小權(quán)限, 也就是只給用戶某個(gè)目錄x權(quán)限, 那么該用戶只能進(jìn)入到該目錄,但是什么也不能干, 無法ls查看目錄里內(nèi)容, 無法創(chuàng)建刪除修改文件

[root@demo-c8 ~]# ll -d /root
dr-xr-xr-x. 15 root root 4096 Aug 21 20:18 /root
[root@demo-c8 ~]# chmod o-r -R /root
[root@demo-c8 ~]# ll -d /root
dr-xr-x--x. 15 root root 4096 Aug 21 20:18 /root
[root@demo-c8 ~]# su - wang
[wang@demo-c8 ~]$ cd /root
[wang@demo-c8 root]$ ll
ls: cannot open directory '.': Permission denied
[wang@demo-c8 root]$ touch f1.txt
touch: cannot touch 'f1.txt': Permission denied

X : 只給目錄x權(quán)限, 不給無執(zhí)行權(quán)限的文件x權(quán)限, 用于-R遞歸修改權(quán)限, 比如

chmod -R a=rwx /data: 如果這樣執(zhí)行, 那么data和data里面所有文件和目錄(包含子文件和目錄)就都有rwx權(quán)限

chmod -R a=rwX /data: 如果這樣執(zhí)行, data和data里面的目錄(包含子文件和目錄),都賦予rwx權(quán)限, 但是文件不同, 如果文件本身就是x權(quán)限, 那么最終就rwx, 如果文件本身沒有x權(quán)限, 那么就是rw權(quán)限, 不會(huì)賦予x權(quán)限

目錄可以有x權(quán)限, 讓用戶能進(jìn)來, 但是文件不能輕易給x權(quán)限, 因?yàn)橐苊饽_本或程序被惡意執(zhí)行

練習(xí): Linux中的目錄和文件的權(quán)限區(qū)別? 分別說明讀寫和執(zhí)行權(quán)限對(duì)于文件和目錄的區(qū)別?

4.2.2 修改文件權(quán)限chmod

格式:

chmod [option]... MODE[,MODE]... FILE...
chmod [option]... OCTAL-MODE FILE...
# 參考RFILE文件的權(quán)限, 將FILE的權(quán)限修改為和RFILE一樣的權(quán)限

說明:

MODE模式: 
who: 針對(duì)哪類用戶, u(所有者), g(所屬組), o(其他用戶), a(所有者, 所屬組, 其他用戶, 也就是任何人)
opt: +(添加權(quán)限), -(刪除權(quán)限), =(直接指明權(quán)限)
permission: r, w, x
修改指定某類用戶的所有權(quán)限: 
u=  g=  o=  ug=  a=  u=  g=
修改指定某類用戶的某個(gè)權(quán)限
u+  u-  g+  g-  o+  o-  a+  a-  + -

-R: 遞歸修改權(quán)限

范例:

chmod u+wx, g-r,o=rx FILE
chmod -R g+rwx /testdir
chmod 600 FILE

范例: 一旦匹配到對(duì)應(yīng)的權(quán)限, 就不再向右匹配

# 準(zhǔn)備測(cè)試文件

[root@demo-c8 ~]# cd /data
[root@demo-c8 data]# ls
[root@demo-c8 data]# cp /etc/fstab .
[root@demo-c8 data]# ll
total 4
-rw-r--r--. 1 root root 709 Aug 21 22:05 fstab

# 修改測(cè)試文件的所有者為wang賬號(hào), 文件的權(quán)限為u=, g=r, o=rw

[root@demo-c8 data]# chown wang fstab 
[root@demo-c8 data]# chmod u=,g=r,o=rw fstab 
[root@demo-c8 data]# ll 
total 4
----r--rw-. 1 wang root 709 Aug 21 22:05 fstab
# 切換到wang賬號(hào)進(jìn)行驗(yàn)證

[wang@demo-c8 ~]$ cat /data/fstab 
cat: /data/fstab: Permission denied

普通用戶即使被加入到了root組, 也不一定就有和root用戶一樣的權(quán)限

范例: /etc/shadow文件

即使把普通用戶加入到了root組, 也無法查看shadow文件, 因?yàn)榧尤氲絩oot組了, 就有了root組權(quán)限, 但是root組也沒有權(quán)限查看該文件, 而root能查看是因?yàn)槭枪芾韱T

[root@demo-c8 ~]# ll /etc/shadow
----------. 1 root root 1359 Aug 15 17:05 /etc/shadow
[root@demo-c8 ~]# usermod -G root wang
d[root@demo-c8 ~]# id wang
uid=1000(wang) gid=1000(wang) groups=1000(wang),0(root)

[root@demo-c8 ~]# su - wang
[wang@demo-c8 ~]$ cat /etc/shadow
cat: /etc/shadow: Permission denied
  • 文件權(quán)限設(shè)置規(guī)范: 所有者權(quán)限最大; 所屬組次之, other權(quán)限最小

文件的權(quán)限以及所有者所屬組信息,誰能修改? 需要什么權(quán)限

  • 普通用戶不能修改文件權(quán)限和所有者以及所屬組信息, 除非自己是文件所有者
  • root用戶可以隨意修改文件的權(quán)限, 所有者和所屬組信息

一個(gè)文件能不能被某個(gè)用戶刪除,需要看用戶的什么權(quán)限?:對(duì)目錄有寫和執(zhí)行權(quán)限

  • 需要看用戶對(duì)于文件所在目錄的權(quán)限
  • 文件名, 文件列表屬于目錄的數(shù)據(jù)部分, 目錄的元數(shù)據(jù)并不包括文件名, 而是包含的文件inode編號(hào).
  • 因此, 刪除文件, 就是修改目錄的數(shù)據(jù)內(nèi)容, 要對(duì)該目錄有寫和執(zhí)行權(quán)限, 執(zhí)行權(quán)限使得用戶能進(jìn)到目錄, 寫權(quán)限使得用戶的在該目錄內(nèi)創(chuàng)建,修改,刪除文件
  • 如果用戶對(duì)于一個(gè)目錄, 只有w權(quán)限沒有x權(quán)限, 也無法刪除文件, 用戶做修改, 必須能進(jìn)去到目錄, 因此, 想刪除某個(gè)文件, 那么用戶必須對(duì)該文件所在目錄擁有wx權(quán)限, r無所謂, 刪除文件不需要查看文件列表

ls一個(gè)目錄結(jié)構(gòu)需要對(duì)目錄有rx權(quán)限

如果沒有r權(quán)限, 也可以ls但是會(huì)報(bào)錯(cuò), 沒有r權(quán)限, 如果能記住文件名, 也能cat該文件, 只要對(duì)文件有r權(quán)限即可. 因?yàn)閤決定了用戶是否能進(jìn)到目錄, 而r決定用戶能否查看文件內(nèi)容, 如果記住了文件路徑, 那就不用先進(jìn)到目錄再查看文件內(nèi)容了

刪除文件的最小權(quán)限: 對(duì)所在目錄有wx權(quán)限

無需r權(quán)限, 但是沒有r權(quán)限, 刪除文件時(shí),如果不進(jìn)去到目錄里, 使用絕對(duì)路徑是無法自動(dòng)補(bǔ)齊文件名的, 因此想要對(duì)一個(gè)目錄里的內(nèi)容能自動(dòng)補(bǔ)齊, 就要對(duì)該目錄有r權(quán)限, 沒有r權(quán)限, 不能自動(dòng)補(bǔ)齊, 也無法ls查看文件列表

范例:

[17:16:16 root@centos8-3 ~]#cd /data
[17:19:28 root@centos8-3 /data]#ls
abc.txt  prac  scripts  testing_scripts
[17:19:29 root@centos8-3 /data]#ll -d /data
drw-r----x. 5 root root 71 Aug 20 16:56 /data

# 給/data目錄, 其他用戶rx權(quán)限

[17:19:34 root@centos8-3 /data]#chmod o+w /data
[17:19:44 root@centos8-3 /data]#ll -d /data
drw-r---wx. 5 root root 71 Aug 20 16:56 /data

# 切換到david用戶
[17:19:50 root@centos8-3 /data]#su - david
Last login: Thu Aug 20 17:14:33 AEST 2020 on pts/0

# 因?yàn)閐avid屬于其他用戶, 所以有wx權(quán)限, 可以刪除/data目錄內(nèi)的文件

[17:19:55 david@centos8-3 ~]$rm -rf /data/abc.txt

# 但是因?yàn)閐avid是其他用戶, 對(duì)于/data目錄沒有r權(quán)限, 所以無法執(zhí)行l(wèi)s查看/data的目錄列表
[17:20:09 david@centos8-3 ~]$ll /data/
ls: cannot open directory '/data/': Permission denied

# david有x權(quán)限, 可以進(jìn)入/data目錄
[17:20:15 david@centos8-3 ~]$cd /data

# 無法查看目錄列表
[17:20:21 david@centos8-3 /data]$ll
ls: cannot open directory '.': Permission denied

[17:20:22 david@centos8-3 /data]$su - 
Password: 
Last login: Thu Aug 20 17:16:16 AEST 2020 on pts/0
[17:20:26 root@centos8-3 ~]#ls /data
prac  scripts  testing_scripts

練習(xí): 執(zhí)行cp /etc/issue /data/dir/ 所需要的最小權(quán)限迹辐?

/bin/ 需要x權(quán)限
/bin/cp     需要x權(quán)限
/etc/       需要x權(quán)限
/etc/issue  需要r權(quán)限
/data/       需要x權(quán)限
/data/dir/   需要w,x權(quán)限
  • /bin/cp: 一個(gè)命令程序, 本身也是文件, 想要被執(zhí)行, 執(zhí)行者需要x權(quán)限, 沒有x權(quán)限的用戶是無法運(yùn)行該命令的, 并且, 也需要對(duì)命令所在的目錄有x權(quán)限
[17:30:40 root@centos8-3 /data]#ll /bin/cp
-rwxr-xr-x. 1 root root 333128 Apr 10 04:53 /bin/cp
[17:30:51 root@centos8-3 /data]#chmod o-x /bin/cp
[17:31:02 root@centos8-3 /data]#su - david
Last login: Thu Aug 20 17:19:55 AEST 2020 on pts/0
[17:31:04 david@centos8-3 ~]$touch f1.txt
[17:31:10 david@centos8-3 ~]$cp f1.txt /tmp
-bash: /usr/bin/cp: Permission denied
  • /etc: 對(duì)于/etc/目錄, 需要x權(quán)限, 能進(jìn)到目錄才能操作文件

  • /etc/issue: 復(fù)制一個(gè)文件, 需要對(duì)該文件有r權(quán)限,并且對(duì)文件所在目錄至少有x權(quán)限, 因?yàn)橐M(jìn)入所在目錄

[17:34:33 david@centos8-3 ~]$ll
total 0
-rw-r----- 1 david g1 0 Aug 20 17:31 f1.txt
-rw-r----- 1 david g1 0 Aug 20 17:34 f2.txt
-rw-rwxr-- 1 david g1 0 Aug 20 16:49 david.txt
[17:34:35 david@centos8-3 ~]$chmod u-r f1.txt
[17:34:44 david@centos8-3 ~]$cp f1.txt /tmp
cp: cannot open 'f1.txt' for reading: Permission denied
  • 執(zhí)行文件, 需要對(duì)目錄有x, 如果是普通腳本文件, 需要對(duì)文件有rx權(quán)限, 如果是二進(jìn)制程序文件, 有x權(quán)限即可
[wang@demo-c8 ~]$ touch hello.sh
[wang@demo-c8 ~]$ ll
total 0
-rw-rw-r--. 1 wang wang 0 Aug 21 22:52 hello.sh
[wang@demo-c8 ~]$ chmod u=x hello.sh
[wang@demo-c8 ~]$ ll
total 0
---xrw-r--. 1 wang wang 0 Aug 21 22:52 hello.sh
[wang@demo-c8 ~]$ bash hello.sh 
bash: hello.sh: Permission denied
[wang@demo-c8 ~]$ chmod u=rx hello.sh
[wang@demo-c8 ~]$ bash hello.sh 
  • 復(fù)制一個(gè)文件.需要對(duì)該文件有r權(quán)限
[wang@demo-c8 ~]$ ll
total 0
-r-xrw-r--. 1 wang wang 0 Aug 21 22:52 hello.sh
[wang@demo-c8 ~]$ chmod u-x hello.sh 
[wang@demo-c8 ~]$ cp hello.sh hello.sh.bak
[wang@demo-c8 ~]$ ll
total 0
-r--rw-r--. 1 wang wang 0 Aug 21 22:52 hello.sh
-r--rw-r--. 1 wang wang 0 Aug 21 22:53 hello.sh.bak
  • 想對(duì)文件操作, 不管是讀,寫還是執(zhí)行,都需要能先進(jìn)入到文件所在的目錄, 也就是需要對(duì)文件所在的目錄有x權(quán)限

  • 讀一個(gè)文件: 需要對(duì)該文件有r權(quán)限, 對(duì)文件所在的目錄有x權(quán)限,

  • 創(chuàng)建刪除或者改名: 和文件的權(quán)限無關(guān), 看的是用戶對(duì)文件所在目錄的權(quán)限, 創(chuàng)建刪除或改名, 需要對(duì)目錄最小的權(quán)限是wx, 能不能讀目錄的文件列表無所謂, 可以手寫路徑文件名, 不自動(dòng)補(bǔ)齊

  • 執(zhí)行文件, 需要對(duì)目錄有x, 如果是普通腳本文件, 需要對(duì)文件有rx權(quán)限, 如果是二進(jìn)制程序文件, 有x權(quán)限即可

  • 想要對(duì)一個(gè)目錄里的內(nèi)容能自動(dòng)補(bǔ)齊, 就要對(duì)該目錄有r權(quán)限, 沒有r權(quán)限, 不能自動(dòng)補(bǔ)齊, 也無法ls查看文件列表. 沒有目錄r權(quán)限, 想要操作目錄內(nèi)的文件, 就只能記住文件名, 然后手寫全路徑

[22:26:23 wang@c7node1 ~]$ll
total 0
---xr--r-- 1 wang wang 0 Oct  4 22:26 test.sh
[22:26:38 wang@c7node1 ~]$./test.sh 
bash: ./test.sh: Permission denied
[22:26:49 wang@c7node1 ~]$chmod 544 test.sh 
[22:27:08 wang@c7node1 ~]$ll
total 0
-r-xr--r-- 1 wang wang 0 Oct  4 22:26 test.sh
[22:27:11 wang@c7node1 ~]$./test.sh 
[22:27:13 wang@c7node1 ~]$
  • 即使是root賬戶, 沒有x權(quán)限也無法執(zhí)行文件

  • 如果把chmod文件的x權(quán)限取消了, 那么root也不能執(zhí)行chmod

解決方案:

可以從別處scp復(fù)制一份過來, 要求版本一樣, 然后通過cp -a命令把chmod執(zhí)行命令, 復(fù)制到/bin目錄下
或者使用救援模式
或者通過acl
  • 工作時(shí)文件權(quán)限設(shè)置600比較多, 給所有者讀寫權(quán)限, 所屬組和其他人不給任何權(quán)限

4.3 新建文件和目錄的默認(rèn)權(quán)限

umask的值可以用來決定新建文件和目錄的默認(rèn)權(quán)限

umask的值不會(huì)受到chmod命令的影響, 比如給一個(gè)目錄設(shè)置了777的遞歸權(quán)限, 之后無論在該目錄里創(chuàng)建文件還是目錄, 都還是遵循umask的規(guī)則

實(shí)現(xiàn)方式:

  • 新建文件默認(rèn)權(quán)限: 666-umask, 如果所得結(jié)果某位存在執(zhí)行(奇數(shù))權(quán)限, 則將其權(quán)限+1, 偶數(shù)不變

  • 權(quán)限位xxx xxx xxx, r=4, w=2,x=1. 一旦某一組xxx出現(xiàn)了奇數(shù), 就說明這組肯定是有x權(quán)限的, LInux安全策略不允許新建的文件默認(rèn)有x權(quán)限, root也不行, 讀和寫沒有x帶來的風(fēng)險(xiǎn)大

  • 新建目錄默認(rèn)權(quán)限: 777-umask, 沒有奇偶限制

  • 非特權(quán)用戶umask默認(rèn)是002

[21:16:56 linux@centos8-3 ~]$umask
0002 #第一位的0表示8進(jìn)制, 可以忽略
  • root的umask默認(rèn)是022
[21:09:49 root@centos8-3 ~]#umask
0022 #第一位的0表示8進(jìn)制, 可以忽略

總結(jié):

對(duì)于root賬戶,新建文件的默認(rèn)權(quán)限就是666-022=644, rw-r--r--
對(duì)于root賬戶,新建目錄的默認(rèn)權(quán)限就是777-022=755, rwx-r-x-r-x
對(duì)于普通賬戶, 新建文件的默認(rèn)權(quán)限就是666-002=664, rw-rw-r
對(duì)于普通賬戶,新建目錄的默認(rèn)權(quán)限就是777-002=775,rwx-rwxr-x

查看umask:

# umask
[root@demo-c8 ~]# umask
0022

# 模式方式顯示
umask -S
[root@demo-c8 ~]# umask -S
u=rwx,g=rx,o=rx

# 輸出可被調(diào)用
umask -p
[root@demo-c8 ~]# umask -p
umask 0022

修改umask:

范例:

umask  022
umask u=rw,g=r,o=
  • 臨時(shí)修改,只在當(dāng)前終端,當(dāng)前進(jìn)程有效: 直接在命令行執(zhí)行, umask xxx, 第一位可以省略
[21:17:43 root@centos8-3 ~]#umask 223 # 666-223=443, 新建文件, 其他人的x位是奇數(shù),默認(rèn)加1變成偶數(shù), 所以是444, r--r--r--
[21:22:12 root@centos8-3 ~]#umask
0223
[21:22:07 root@centos8-3 ~]#touch a.txt
[21:22:11 root@centos8-3 ~]#ll
total 4
-r--r--r--  1 root root    0 Aug 20 21:22 a.txt
  • 持久保存, 寫到每個(gè)用戶家目錄的.bashrc文件, 或者保存到/etc/bashrc全局生效
[21:25:28 root@centos8-3 ~]#vim .bashrc

# .bashrc
  
# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi
umask 033
# . or source 使.bashrc文件生效
[21:30:35 root@centos8-3 ~]#. .bashrc
[21:30:42 root@centos8-3 ~]#touch d.txt
[21:30:46 root@centos8-3 ~]#ll -d d.txt 
-rw-r--r-- 1 root root 0 Aug 20 21:30 d.txt
[21:30:48 root@centos8-3 ~]#666-033=633>644

#directory
[21:30:48 root@centos8-3 ~]#mkdir a
[21:31:32 root@centos8-3 ~]#ll -d a
drwxr--r-- 2 root root 6 Aug 20 21:31 a
[21:31:35 root@centos8-3 ~]#777-033=744

  • 在不影響當(dāng)前bash進(jìn)程的umask情況下, 修改文件的默認(rèn)umask, 并且創(chuàng)建文件和目錄
[root@demo-c8 ~]# umask
0022
[root@demo-c8 ~]# ( umask 666; touch f2.txt )  # (cmd1; cmd2; cmd3...)會(huì)開啟子進(jìn)程, 執(zhí)行括號(hào)內(nèi)的命令, 子進(jìn)程的bash環(huán)境不影響父進(jìn)程
[root@demo-c8 ~]# umask
0022
[root@demo-c8 ~]# ll f2.txt 
----------. 1 root root 0 Aug 21 23:26 f2.txt

練習(xí):

  1. 當(dāng)用戶docker對(duì)/testdir目錄物質(zhì)性權(quán)限時(shí), 意味著無法做哪些操作?
  2. 當(dāng)用戶mongodb對(duì)/testdir目錄無讀權(quán)限時(shí), 意味著無法做哪些操作?
  3. 當(dāng)用戶redis對(duì)/testdir目錄無寫權(quán)限時(shí), 該目錄下的只讀文件file1.txt是否可以被修改和刪除?
  4. 當(dāng)用戶zabbix對(duì)/testdir目錄有寫和執(zhí)行權(quán)限時(shí), 該目錄下的只讀文件file1.txt是否可以被修改和刪除?
  5. 復(fù)制/etc/fstab文件到/var/tmp目錄下, 設(shè)置文件所有者為tomcat讀寫權(quán)限, 所屬組為apps, 并且有讀寫權(quán)限, 其他人無權(quán)限
  6. 誤刪除了用戶git的家目錄, 請(qǐng)重建并恢復(fù)該用戶家目錄及相應(yīng)的權(quán)限屬性

練習(xí):

  1. 在/testdir/dir里創(chuàng)建的新文件自動(dòng)屬于webs組, 組apps的成員如: tomcat能對(duì)這些文件有讀寫權(quán)限, 組dbs的成員如: mysql只能對(duì)新文件有讀權(quán)限, 其他用戶(不屬于webs, appd, dbs)不能訪問這個(gè)文件夾

  2. 誤將/bin/chmod文件的執(zhí)行權(quán)限刪除, 如何恢復(fù)?

#1. 確定操作系統(tǒng)發(fā)行版本, 和chmod命令的版本

#2. 找一個(gè)相同版本的系統(tǒng), 把chmod命令文件通過scp復(fù)制到刪除了chmod命令的系統(tǒng)
# scp不會(huì)丟失屬性


#3. 將復(fù)制來的chmod命令, cp -a到/bin目錄下, 測(cè)試即可

4.4 Linux文件系統(tǒng)上的特殊權(quán)限

前面介紹了三種常見的權(quán)限: r,w,x, 還有三種特殊權(quán)限: SUID, SGID, Sticky

4.4.1 特殊權(quán)限SUID

前提: 一個(gè)進(jìn)程有其屬主和屬組; 一個(gè)文件也有屬主和屬組

  1. 任何一個(gè)可執(zhí)行程序文件能不能啟動(dòng)為進(jìn)程, 取決于發(fā)起者對(duì)程序文件是否擁有執(zhí)行權(quán)限
  2. 啟動(dòng)為進(jìn)程之后, 其進(jìn)程的屬主為發(fā)起者, 進(jìn)程的屬組為發(fā)起者所屬的組
  3. 進(jìn)程訪問文件時(shí)的權(quán)限, 取決于進(jìn)程的發(fā)起者

(a)進(jìn)程的發(fā)起者, 是文件的屬主, 則應(yīng)用文件屬主權(quán)限
(b)進(jìn)程的發(fā)起者, 屬于文件屬組, 則應(yīng)用文件屬組權(quán)限
(c)進(jìn)程的發(fā)起者, 屬于其他用戶, 則應(yīng)用文件Other權(quán)限

二進(jìn)制的可執(zhí)行文件(程序)上設(shè)置SUID權(quán)限功能:

  • 任何一個(gè)可執(zhí)行程序文件能不能啟動(dòng)為進(jìn)程: 取決于發(fā)起者對(duì)程序文件是否擁有執(zhí)行權(quán)限
  • 啟動(dòng)為進(jìn)程后, 其進(jìn)程的屬主為原程序文件的屬主
  • SUID只對(duì)二進(jìn)制可執(zhí)行程序有效
  • SUID設(shè)置在目錄上無意義, SUID作用在一個(gè)二進(jìn)制程序的屬主的執(zhí)行權(quán)限位上
  • 給一個(gè)二進(jìn)制可執(zhí)行程序文件添加了SUID功能后, 那么任何對(duì)該程序有執(zhí)行權(quán)限的用戶, 在執(zhí)行該程序去操作文件時(shí), 都會(huì)臨時(shí)變成該二進(jìn)制程序的屬主身份
  • 當(dāng)用戶臨時(shí)變成該二進(jìn)制程序的屬主身份后, 是否能操作相應(yīng)的文件, 就看這個(gè)屬主身份的權(quán)限了

SUID權(quán)限設(shè)定:

chmod u+s FILE...  # 添加SUID
chmod 4644 FILE # 添加SUID, 特殊權(quán)限位寫在權(quán)限的第一位, 后三位為正常的文件權(quán)限
chmod u-s FILE... # 刪除SUID

范例:

[root@demo-c8 ~]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 33600 Apr  7  2020 /usr/bin/passwd

passwd命令可以被任何用戶使用去重置密碼, 這是因?yàn)?code>/usr/bin/passwd被添加了SUID權(quán)限, 而默認(rèn)情況下, 屬主, 屬組和其他用戶對(duì)于該文件都有執(zhí)行權(quán)限. 所以, 當(dāng)任何用戶執(zhí)行該程序命令時(shí), 都會(huì)臨時(shí)變成root賬號(hào).

修改密碼, 最終修改的是/etc/shadow文件, 這個(gè)文件默認(rèn)只有root用戶可以訪問, 修改, 但是因?yàn)閜asswd程序有SUID權(quán)限, 因此, 任何用戶運(yùn)行了此命令后, 都會(huì)變成root, 也就對(duì)/etc/shadow文件有了權(quán)限, 也就可以修改密碼了

SUID權(quán)限不要隨便設(shè)置: 比如cat命令是一個(gè)二進(jìn)制可執(zhí)行程序. 任何用戶對(duì)于cat命令都是有執(zhí)行權(quán)限的, 一旦給/bin/cat添加了SUID, 那么所有用戶在執(zhí)行cat命令時(shí), 都會(huì)繼承root用戶權(quán)限, 也就可以查看任何文件了.

范例:

[root@demo-c8 data]# ll /bin/cat
-rwxr-xr-x. 1 root root 87496 Apr 10  2020 /bin/cat
# 給/bin/cat添加SUID

[root@demo-c8 data]# chmod u+s /bin/cat
[root@demo-c8 data]# ll /bin/cat
-rwsr-xr-x. 1 root root 87496 Apr 10  2020 /bin/cat
# 切換到wang賬號(hào), 驗(yàn)證其可以打開/etc/shadow文件

[root@demo-c8 data]# su - wang
[wang@demo-c8 ~]$ cat /etc/shadow
root:$6$YD64S7fSNEcHhV6s$cR6V/rj9Te2GdnE.WJQvlVup9cn8cSDsKaDHazCloevgmSvrswUYC9enlpI5CCVPRQZwA58VyUxvCpval6BaW0::0:99999:7:::
bin:*:18358:0:99999:7:::
daemon:*:18358:0:99999:7:::
adm:*:18358:0:99999:7:::
lp:*:18358:0:99999:7:::
sync:*:18358:0:99999:7:::
shutdown:*:18358:0:99999:7:::
halt:*:18358:0:99999:7:::
mail:*:18358:0:99999:7:::
...
# 切換回root, 取消/bin/cat的SUID

root@demo-c8 data]# chmod u-s /bin/cat
[root@demo-c8 data]# ll /bin/cat
-rwxr-xr-x. 1 root root 87496 Apr 10  2020 /bin/cat

4.4.2 特殊權(quán)限SGID

二進(jìn)制的可執(zhí)行文件上SGID權(quán)限功能:

  • 任何一個(gè)可執(zhí)行程序文件能不能啟動(dòng)為進(jìn)程: 取決于發(fā)起者對(duì)程序文件是否擁有執(zhí)行權(quán)限
  • 啟動(dòng)為進(jìn)程之后, 其進(jìn)程的屬組為原程序文件的屬組

SGID權(quán)限設(shè)定:

chmod g+s FILE...
chmod 2xxx FILE
chmod g-s FILE...

目錄上的SGID權(quán)限功能:

默認(rèn)情況下, 用戶創(chuàng)建的文件, 其屬組為此用戶所屬的主組, 一旦某目錄被設(shè)定了SGID, 則對(duì)此目錄有寫權(quán)限的用戶, 也就是能在此目錄創(chuàng)建/刪除/修改文件名的用戶, 在此目錄中創(chuàng)建的文件所屬的組為此目錄本身的屬組, 而不是用戶自己的主組了, 通常用于創(chuàng)建一個(gè)協(xié)作目錄

范例:

# 創(chuàng)建測(cè)試目錄, 并且設(shè)置權(quán)限為777, 這樣任何用戶都可以在該目錄, 創(chuàng)建文件, 刪除文件, 修改文件名

[root@demo-c8 data]# mkdir dir
[root@demo-c8 data]# ll
total 0
drwxr-xr-x. 2 root root 6 Aug 22 13:22 dir
[root@demo-c8 data]# chmod 777 dir
[root@demo-c8 data]# ll
total 0
drwxrwxrwx. 2 root root 6 Aug 22 13:22 dir
# 默認(rèn)情況, 任何用戶在該目錄創(chuàng)建的文件的屬組, 都是該用戶的主組

[root@demo-c8 data]# cd dir
[root@demo-c8 dir]# touch root.txt
[root@demo-c8 dir]# ll
total 0
-rw-r--r--. 1 root root 0 Aug 22 13:23 root.txt  # root創(chuàng)建的文件, 屬組為root
[root@demo-c8 dir]# su - wang

# 想進(jìn)入子目錄, 必須對(duì)父目錄也有x權(quán)限, 所以這里直接給/data目錄777權(quán)限
[wang@demo-c8 ~]$ cd /data/dir
-bash: cd: /data/dir: Permission denied
[wang@demo-c8 ~]$ ll -d /data
drw----r--. 3 root root 17 Aug 22 13:22 /data
[wang@demo-c8 ~]$ su - 
Password: 
[root@demo-c8 ~]# chmod 777 /data
[root@demo-c8 ~]# su - wang
[wang@demo-c8 ~]$ cd /data/dir
[wang@demo-c8 dir]$ touch wang.txt
[wang@demo-c8 dir]$ ll
total 0
-rw-r--r--. 1 root root 0 Aug 22 13:23 root.txt
-rw-rw-r--. 1 wang wang 0 Aug 22 13:24 wang.txt  # wang創(chuàng)建的文件屬組為wang
# 給/data/dir目錄加上SGID

[root@demo-c8 ~]# chmod 2777 /data/dir
[root@demo-c8 ~]# ll /data/dir -d 
drwsrwsrwx. 2 root root 38 Aug 22 13:24 /data/dir
# 修改/data/dir目錄的屬組為bin, 這樣任何人在dir目錄創(chuàng)建的文件的屬組就是bin

[root@demo-c8 dir]# chown .bin /data/dir
[root@demo-c8 dir]# ll -d /data/dir
drwsrwsrwx. 2 root bin 55 Aug 22 13:26 /data/dir

[root@demo-c8 dir]# touch root1.txt
[root@demo-c8 dir]# ll
total 0
-rw-r--r--. 1 root bin  0 Aug 22 13:34 root1.txt # root新建的文件的屬組也是bin
-rw-r--r--. 1 root root 0 Aug 22 13:23 root.txt
-rw-rw-r--. 1 wang wang 0 Aug 22 13:24 wang.txt

[root@demo-c8 dir]# su - wang
[wang@demo-c8 ~]$ cd /data/dir
[wang@demo-c8 dir]$ touch wang1.txt
[wang@demo-c8 dir]$ ll
total 0
-rw-r--r--. 1 root bin  0 Aug 22 13:34 root1.txt
-rw-r--r--. 1 root root 0 Aug 22 13:23 root.txt
-rw-rw-r--. 1 wang bin  0 Aug 22 13:35 wang1.txt # wang新建的文件的屬組也是bin
-rw-rw-r--. 1 wang wang 0 Aug 22 13:24 wang.txt
  • 針對(duì)目錄的SGID, 一般用于多個(gè)用戶對(duì)于一個(gè)目錄的共同協(xié)作使用. 即使沒有加-R遞歸, 設(shè)定了SGID的目錄的子目錄也會(huì)繼承SGID的設(shè)置, 只要是在該目錄或者子目錄內(nèi)創(chuàng)建的所有文件的屬組, 都是該目錄的屬組

  • 工作中一般很少需要手動(dòng)設(shè)置這三種特殊權(quán)限

4.4.3 特殊權(quán)限Sticky位

當(dāng)用戶對(duì)目錄具有寫權(quán)限時(shí), 用戶可以刪除目錄內(nèi)的任何文件, 無論被刪除的文件的權(quán)限是什么, 屬主或?qū)俳M是什么

在目錄設(shè)置Sticky位后, 那么只有目錄內(nèi), 文件的所有者或者root, 可以刪除該目錄內(nèi)文件

Sticky設(shè)置在文件上無意義

范例:

[root@demo-c8 ~]# ll -d /tmp
drwxrwxrwt. 20 root root 4096 Aug 22 11:57 /tmp
  • 通過Sticky, 可以避免, 多個(gè)對(duì)同一個(gè)目錄有wx權(quán)限的用戶, 可以互相刪除彼此的文件
假如a和b對(duì)/data/dir目錄都有wx權(quán)限, 那么a和b就可以互相刪除/data/dir目錄中, 屬主是彼此的任何文件

總結(jié):

默認(rèn)情況:
1. 一個(gè)二進(jìn)制程序能不能被執(zhí)行, 看的是命令發(fā)起者對(duì)于這個(gè)二進(jìn)制程序文件是否有x權(quán)限
2. 如果有x權(quán)限, 那么用戶就能執(zhí)行這個(gè)程序
3. 至于執(zhí)行了這個(gè)程序后, 能不能操作其他文件, 就要看這個(gè)用戶對(duì)操作的文件是否有權(quán)限, 和執(zhí)行的程序本身無關(guān)

# 使用了SUID后: SUID只能作用于二進(jìn)制可執(zhí)行程序
1. 二進(jìn)制程序文件的屬主執(zhí)行位會(huì)顯示為s/S, s表示屬主原本就有x權(quán)限, S表示屬主原本沒有x權(quán)限
2. 任何對(duì)這個(gè)二進(jìn)制程序文件有x權(quán)限的用戶, 執(zhí)行了這個(gè)命令后, 都會(huì)臨時(shí)變成這個(gè)程序?qū)僦鞯纳矸?3. 對(duì)于要操作的文件來說, 此時(shí)就要看這個(gè)臨時(shí)的屬主身份, 對(duì)于該文件有什么權(quán)限了, 和原本的用戶無關(guān)

# 使用了SGID: SGID即可作用在二進(jìn)制可執(zhí)行程序, 也可作用在目錄上
#1. 作用在二進(jìn)制可執(zhí)行程序的效果類似SUID, 用戶會(huì)臨時(shí)被加入到該二進(jìn)制程序的屬組中.
#2. 當(dāng)操作文件時(shí), 就看這個(gè)用戶本身是不是備操作文件的屬主, 如果是的話, 直接使用原本的屬主權(quán)限, 如果不是, 就看該用戶被臨時(shí)加到的組是不是這個(gè)被操作文件的屬組, 如果是的話, 就行駛屬組權(quán)限, 否則就用Other權(quán)限 

#3. 當(dāng)把SGID設(shè)置在目錄上時(shí)

默認(rèn)情況下, 用戶創(chuàng)建的文件, 其屬組為此用戶所屬的主組, 一旦某目錄被設(shè)定了SGID, 則對(duì)此目錄有寫權(quán)限的用戶, 也就是能在此目錄創(chuàng)建/刪除/修改文件名的用戶, 在此目錄中創(chuàng)建的文件所屬的組為此目錄本身的屬組, 而不是用戶自己的主組了, 通常用于創(chuàng)建一個(gè)協(xié)作目錄

4.4.4 特殊權(quán)限數(shù)字法

SUID SGID STICKY

000 0
001 1
010 2
011 3
100 4
101 5
110 6
111 7
4 SUID
2 SGID
1 Sticky

范例:

chmod 4777 /bin/cat # 給cat命令添加SUID, 并且普通權(quán)限為777

權(quán)限位映射:

SUID: user, 占據(jù)屬主的執(zhí)行權(quán)限位
  s: 屬本身擁有x權(quán)限
  S: 屬主本身沒有x權(quán)限

SGID:  group, 占據(jù)屬組的執(zhí)行權(quán)限位
  s: group本身擁有x權(quán)限
  S: group本身沒有x權(quán)限

Sticky: other, 占據(jù)other的執(zhí)行權(quán)限位
  t: other本身擁有x權(quán)限
  T: other本身沒有x權(quán)限

4.5 設(shè)定文件特殊屬性

通過設(shè)置文件的特殊屬性, 可以防止root用戶誤刪除或者修改文件內(nèi)容, 設(shè)置特殊權(quán)限

  • 任何人都不能刪除, 改名, 更改文件內(nèi)容, 這個(gè)文件所屬的文件夾及父目錄也不能被刪除, 即使是root用戶也會(huì)被限制
chattr +i  # 文件變成只讀
  • 只能追加內(nèi)容, 不能刪除, 改名, 即使是root也會(huì)被限制
chattr +a
  • 顯示文件特殊屬性
lsattr

[root@demo-c8 dir3]# lsattr f1.txt 
----i--------------- f1.txt

范例:

# 構(gòu)建測(cè)試文件

[root@demo-c8 ~]# mkdir /data/dir1/dir2/dir3 -pv
mkdir: created directory '/data/dir1'
mkdir: created directory '/data/dir1/dir2'
mkdir: created directory '/data/dir1/dir2/dir3'
[root@demo-c8 ~]# cd /data/dir1/dir2/dir3
[root@demo-c8 dir3]# touch f1.txt
# 添加chattr +i
[root@demo-c8 dir3]# chattr +i f1.txt 
[root@demo-c8 dir3]# lsattr f1.txt 
----i--------------- f1.txt 
[root@demo-c8 dir3]# rm -rf f1.txt   # 文件不能刪除
rm: cannot remove 'f1.txt': Operation not permitted
[root@demo-c8 dir3]# rm -rf /data  # 父目錄也不讓刪除
rm: cannot remove '/data/dir1/dir2/dir3/f1.txt': Operation not permitted
[root@demo-c8 dir3]# cat /dev/null > f1.txt  # 不能修改
-bash: f1.txt: Operation not permitted
[root@demo-c8 dir3]# mv f1.txt f1.txt.bak # 不能改名
mv: cannot move 'f1.txt' to 'f1.txt.bak': Operation not permitted

4.6 訪問控制列表

4.6.1 ACL權(quán)限功能

ACL: Access Control List, 實(shí)現(xiàn)靈活的權(quán)限管理

除了文件的所有者, 所屬組和其他用戶, ACL可以對(duì)更多的用戶設(shè)置權(quán)限

比如: 想讓wang賬號(hào)對(duì)文件f1.txt沒有任何權(quán)限, 而david賬號(hào)對(duì)f1.txt擁有任何權(quán)限, 光靠傳統(tǒng)的三類權(quán)限分組(屬主, 屬組, Other)是無法實(shí)現(xiàn)的, 所以此時(shí)需要用ACL做到精準(zhǔn)控制

CentOS7以后, 默認(rèn)創(chuàng)建的xfs和ext4文件系統(tǒng)具有ACL功能
CentOS7以前, 默認(rèn)手動(dòng)創(chuàng)建的ext4文件系統(tǒng), 沒有ACL功能, 需要手動(dòng)增加

tune2fs -o acl /dev/sdb1
mount -o acl /dev/sdb1 /mnt/test
  • ACL生效順序: 所有者, 自定義用戶(指的就是ACL權(quán)限), 所屬組|自定義組, 其他人

4.6.2 ACL相關(guān)命令

setfacl 可以設(shè)置ACL權(quán)限, 對(duì)一個(gè)文件設(shè)置ACL, 只有文件的屬主或者屬組用戶才有權(quán)限設(shè)置ACL

范例: 針對(duì)f1.txt, wang沒有任何權(quán)限, david可以讀寫, 其他Other用戶只能讀

# wang賬號(hào)權(quán)限設(shè)置

[root@demo-c8 data]# touch f1.txt
[root@demo-c8 data]# ll
total 0
-rw-r--r--. 1 root root 0 Aug 22 14:17 f1.txt
[root@demo-c8 data]# setfacl -m u:wang:0 f1.txt   # u:wang:0 u表示針對(duì)哪個(gè)用戶, wang是用戶名, 0或者-都表示沒有讀寫執(zhí)行權(quán)限
[root@demo-c8 data]# ll
total 0
-rw-r--r--+ 1 root root 0 Aug 22 14:17 f1.txt # 添加了ACL權(quán)限的文件會(huì)在權(quán)限的最后一位多一個(gè)加號(hào), 表示設(shè)置了ACL權(quán)限
[root@demo-c8 data]# getfacl f1.txt 
# file: f1.txt
# owner: root
# group: root
user::rw-  屬主權(quán)限為讀寫
user:wang:---  # 用戶wang沒有任何權(quán)限
group::r-- # 屬組權(quán)限為讀
mask::r-- 
other::r-- # 其他人的權(quán)限為讀
# 切換到wang賬號(hào)進(jìn)行測(cè)試

[root@demo-c8 ~]# su - wang
[wang@demo-c8 ~]$ cd /data/
[wang@demo-c8 data]$ cat f1.txt 
cat: f1.txt: Permission denied
[wang@demo-c8 data]$ touch f1.txt 
touch: cannot touch 'f1.txt': Permission denied
[wang@demo-c8 data]$ echo 1 >> f1.txt 
-bash: f1.txt: Permission denied
# david賬號(hào)權(quán)限設(shè)置

[root@demo-c8 data]# useradd david
[root@demo-c8 data]# id david
uid=1001(david) gid=1001(david) groups=1001(david)

[root@demo-c8 data]# setfacl -m u:david:rw f1.txt 
[root@demo-c8 data]# getfacl f1.txt 
# file: f1.txt
# owner: root
# group: root
user::rw-
user:wang:---
user:david:rw-
group::r--
mask::rw-
other::r--
# 切換到david賬號(hào)進(jìn)行測(cè)試

[root@demo-c8 ~]# su - david
[david@demo-c8 ~]$ cd /data
[david@demo-c8 data]$ cat f1.txt 
[david@demo-c8 data]$ echo 1 >> f1.txt 
# 創(chuàng)建john作為其他用戶

[root@demo-c8 data]# useradd john
[root@demo-c8 data]# id john
uid=1002(john) gid=1002(john) groups=1002(john)

[root@demo-c8 ~]# su - john
[john@demo-c8 ~]$ cd /data
[john@demo-c8 data]$ cat f1.txt   # Other可讀
1
[john@demo-c8 data]$ echo 11>> f1.txt  # Other不可寫
-bash: f1.txt: Permission denied

getfacl 可以查看設(shè)置的ACL權(quán)限

# 執(zhí)行g(shù)etfacl查看一個(gè)文件的ACL權(quán)限是不需要對(duì)該文件有任何權(quán)限的

[wang@demo-c8 data]$ getfacl f1.txt 
# file: f1.txt
# owner: root
# group: root
user::rw-
user:wang:---
user:david:rw-
group::r--
mask::rw-
other::r--
  • 針對(duì)組, 設(shè)置ACL權(quán)限
setfacl -m g:bin:rw f1.txt
  • 當(dāng)一個(gè)用戶屬于多個(gè)組時(shí), 那么其ACL權(quán)限就是多個(gè)組的權(quán)限疊加后的權(quán)限

  • 刪除單個(gè)用戶ACL

# 刪除david用戶的ACL
setfacl -x u:david f1.txt
  • 清空文件的ACL
setfacl -b f1.txt 
  • 針對(duì)目錄遞歸設(shè)置ACL
# wang賬號(hào)對(duì)/data目錄和子目錄內(nèi)的所有文件都有rwx權(quán)限
setfacl -R -u:wang:rwx /data

mask權(quán)限:

  • mask只影響除了所有者和Other之外的人和組的最大權(quán)限, 也就是自定義ACL用戶, 所屬組和自定義組
  • mask需要與用戶/組的權(quán)限進(jìn)行邏輯運(yùn)算后, 才能變成有效的權(quán)限(Effective Permission)
  • 自定義ACL用戶, 所屬組和自定義組的權(quán)限設(shè)置必須小于mask權(quán)限設(shè)定范圍內(nèi)才會(huì)生效, 所以mask就是個(gè)限高桿, 如果mask權(quán)限是rw, 那么自定義ACL用戶, 所屬組和自定義組的權(quán)限只能是r, w, 或者rw, 不能有x權(quán)限

一旦給文件添加了ACL權(quán)限, 那么針對(duì)文件的屬組設(shè)置的權(quán)限, 就會(huì)變成mask的權(quán)限. 兩者的權(quán)限值是實(shí)時(shí)相等的
設(shè)置了ACL后, 修改屬組權(quán)限, 那么mask權(quán)限也會(huì)跟著被修改為同樣的權(quán)限. 修改mask權(quán)限, 那么屬組權(quán)限也會(huì)被修改為同樣的權(quán)限

# 目前f1.txt有ACL權(quán)限, mask權(quán)限是rwx

[root@demo-c8 data]# ll f1.txt 
-rw-rwxr--+ 1 root root 2 Aug 22 14:22 f1.txt
[root@demo-c8 data]# getfacl f1.txt 
# file: f1.txt
# owner: root
# group: root
user::rw-
user:wang:rwx
user:david:rw-
group::r--
mask::rwx
other::r--
# 修改f1.txt的屬組權(quán)限為rw

[root@demo-c8 data]# chmod g=rw f1.txt 
[root@demo-c8 data]# ll f1.txt 
-rw-rw-r--+ 1 root root 2 Aug 22 14:22 f1.txt
# 再次查看f1.txt的ACL

[root@demo-c8 data]# getfacl f1.txt 
# file: f1.txt
# owner: root
# group: root
user::rw-
user:wang:rwx       #effective:rw-   # 用戶wang的rwx權(quán)限, 也變成了只有rw生效. 因?yàn)閣ang是自定義用戶, 所以其生效權(quán)限是受到mask控制
user:david:rw-
group::r--
mask::rw-   # mask變成了rw權(quán)限
other::r--

設(shè)置mask權(quán)限:

# 目前f1.txt的mask權(quán)限是rw

[root@demo-c8 data]# getfacl f1.txt 
# file: f1.txt
# owner: root
# group: root
user::rw-
user:wang:rwx           #effective:rw-
user:david:rw-
group::r--
mask::rw-
other::r--
# 將mask修改為rwx

oot@demo-c8 data]# setfacl -m mask::rwx f1.txt 
[root@demo-c8 data]# getfacl f1.txt 
# file: f1.txt
# owner: root
# group: root
user::rw-
user:wang:rwx  # 自定義用戶wang的rwx權(quán)限都可以生效
user:david:rw-
group::r--
mask::rwx  # mask變成rwx, 那么自定義用戶, 屬組和自定義組的權(quán)限限高就變成了rwx
other::r--
  • 針對(duì)屬組或自定義組設(shè)置ACL
setfacl -m g:daemon:rw f1.txt
  • mask的權(quán)限和自定義用戶, 自定義組和屬組的權(quán)限是相互作用的, 設(shè)置了mask后, 自定義用戶, 自定義組和屬組原有的權(quán)限, 需要按照mask限高桿調(diào)低. 而如果給自定義用戶, 組和屬組設(shè)置了高于限高桿的權(quán)限后, 那么mask的權(quán)限也會(huì)跟著調(diào)整, 來滿足自定義用戶, 組和屬組的權(quán)限需求

--set選項(xiàng)會(huì)把原有的ACL項(xiàng)都刪除, 用新的替代, 需要注意的是一定要包含UGO的設(shè)置, 不能像-m一樣, 只是添加ACL就可以

范例:

setfacl --set u::rw,u:wang:rw,g::r,o::- file1

4.6.3 備份和還原ACL

主要的文件操作命令如cp和mv都支持ACL, 只是cp命令需要加上-p參數(shù). 但是tar等常見的備份工具是不會(huì)保留目錄和文件的ACL信息的

范例:

# 備份ACL

[root@demo-c8 data]# getfacl f1.txt 
# file: f1.txt
# owner: root
# group: root
user::rw-
user:wang:rwx
user:david:rw-
group::r--
mask::rwx
other::r--

[root@demo-c8 data]# getfacl -R f1.txt > f1_acl.bak
[root@demo-c8 data]# cat f1_acl.bak 
# file: f1.txt
# owner: root
# group: root
user::rw-
user:wang:rwx
user:david:rw-
group::r--
mask::rwx
other::r--
# 清空ACL權(quán)限

[root@demo-c8 data]# setfacl -b f1.txt 
[root@demo-c8 data]# getfacl f1.txt 
# file: f1.txt
# owner: root
# group: root
user::rw-
group::r--
other::r--
# 還原ACL權(quán)限

[root@demo-c8 data]# setfacl -R --set-file=f1_acl.bak f1.txt
[root@demo-c8 data]# getfacl f1.txt 
# file: f1.txt
# owner: root
# group: root
user::rw-
user:wang:rwx
user:david:rw-
group::r--
mask::rwx
other::r--
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市甚侣,隨后出現(xiàn)的幾起案子明吩,更是在濱河造成了極大的恐慌,老刑警劉巖殷费,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件印荔,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡详羡,警方通過查閱死者的電腦和手機(jī)仍律,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來实柠,“玉大人水泉,你說我怎么就攤上這事≈涎危” “怎么了草则?”我有些...
    開封第一講書人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)蟹漓。 經(jīng)常有香客問我炕横,道長(zhǎng),這世上最難降的妖魔是什么牧牢? 我笑而不...
    開封第一講書人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任看锉,我火速辦了婚禮,結(jié)果婚禮上塔鳍,老公的妹妹穿的比我還像新娘伯铣。我一直安慰自己,他們只是感情好轮纫,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開白布腔寡。 她就那樣靜靜地躺著,像睡著了一般掌唾。 火紅的嫁衣襯著肌膚如雪放前。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,488評(píng)論 1 302
  • 那天糯彬,我揣著相機(jī)與錄音凭语,去河邊找鬼。 笑死撩扒,一個(gè)胖子當(dāng)著我的面吹牛似扔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼炒辉,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼豪墅!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起黔寇,我...
    開封第一講書人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤偶器,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后缝裤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體屏轰,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年倘是,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了亭枷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡搀崭,死狀恐怖叨粘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情瘤睹,我是刑警寧澤升敲,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站轰传,受9級(jí)特大地震影響驴党,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜获茬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一港庄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧恕曲,春花似錦鹏氧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至茸俭,卻和暖如春吊履,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背调鬓。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工艇炎, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人腾窝。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓冕臭,卻偏偏與公主長(zhǎng)得像腺晾,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子辜贵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容