04 Linux用户和權限管理

1、Linux安全模型

資源分派:

  • Authentication:認證,驗證用户身份
  • Authorization:授權,不同的用户設置不同權限
  • Accouting:審計,事後行為

在Linux中,當用户登錄成功時,系統會自動分配令牌token,包括:用户標識和組成員等信息

3A認證:

又稱AAA認證,是一套針對網絡設備的網絡訪問控制策略安全模型

#用於審計的登錄日誌
#rocky 8.6
cat /var/log/secure

tail /var/log/auth.log

1.1 用户

Linux系統中,每個用户通過User id(UID)來唯一標識的

用户類型

用户名

用户ID(UID)

作用

超級管理員

root(可改)

0

超級管理員用

普通用户-系統用户

自定義

1-499(CentOS6以前),1-999(CentOS7以後)

給後台程序使用,比如nginx,MySQL等

普通用户-登錄用户

自定義

500+(CentOS6以前),1000+(CentOS7以後)

給用户進行交互式登錄

1.2 用户組

Linux中可以將一個或多個用户加入用户組中,組就是包含0個或是多個用户的集合,用户組是通過Group ID(GID)來表示的

組類型

組名

組ID(GID)

作用

超級管理員組

root

0

超級管理員用

普通用户組-系統組

自定義

1-499(CentOS6以前),1-999(CentOS7以後)

給後台用户使用

普通用户組-普通組

自定義

500+(CentOS6以前),1000+(CentOS7以後)

給登錄用户使用

1.3 用户和組的關係

  • 一個用户至少有一個組,也可以有多個組
  • 一個組至少有0個用户,也可以有多個用户
  • 用户的主要組(primary group):又稱私有組,一個用户必須屬於且只有一個主組,創建用户時,默認會創建與其同名的組作為主組
  • 用户的附加組(supplementary group):又稱輔助組,一個用户可以屬於0個或多個附加組
  • 使用組,可以對用户進行批量管理,你比如對一個組授權,則該組下所有的用户能集成這個組的權限

2、用户和組的配置文件

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

  • /etc/passwd:用户及其屬性信息(名稱、UID、主組ID等)
  • /etc/shadow:用户密碼及其相關屬性
  • /etc/group:組及其屬性信息
  • /etc/gshowdow:組密碼及其相關屬性

2.2 文件操作

vipw&vigr

#vipw|vigr
#編輯/etc/passwd,/etc/group/,/etc/shadow,/etc/gshadow
#vipw		默認編輯/etc/passwd文件
#vigr		默認編輯/etc/group文件

pwck&grpck

#pwck [options] [passwd [shadow]]
#對用户相關配置文件進行檢查,默認檢查文件為/etc/passwd

-q|--quiet					#只報告錯誤,忽略警告
-r|--read-only				#顯示錯誤和警告,但不改變文件
-R|--root CHEROOT_DIR		#chroot到的目錄
-s|--sort					#通過UID排序項目


#grpck [option][group [gshadow]]
#對用户組相關配置文件進行檢查,默認檢查文件為/etc/shadow,/etc/gshadow
-r|--read-only				#顯示錯誤和警告,但不改變文件
-R|--root  CHROOT_DIR		#chroot到的目錄
-s|--sort					#通過UID排序項目

getent

getent passwd|shadow|group|gshadow uname[......]
#根據用户名查看配置項

3、用户和組管理命令

用户管理命令:

  • useradd
  • usermod
  • userdel

組帳號維護命令:

  • groupadd
  • groupmod
  • groupdel

3.1 用户創建

#創建用户之前可以先建組,確保組ID是已知的

useradd -u 336 -g mysql -s /sbin/nologin -d /data/mysql -M -r mysql
-b, --base-dir BASE_DIR  # 如果未指定 -d HOME_DIR,則系統的默認基本目錄。如果未指定此選項,useradd 將使用 /etc/default/useradd 中的 HOME 變量指定的基本目錄,或默認使用 /home。
-c, --comment COMMENT    # 加上備註文字。任何文本字符串。它通常是對登錄名的簡短描述,目前用作用户全名的字段。
-d, --home HOME_DIR      # 將使用 HOME_DIR 作為用户登錄目錄的值來創建新用户。 
-D, --defaults           # 變更預設值。
-e, --expiredate EXPIRE_DATE # 用户帳户將被禁用的日期。 日期以 YYYY-MM-DD 格式指定。
-f, --inactive INACTIVE      # 密碼過期後到帳户被永久禁用的天數。
-g, --gid GROUP   # 用户初始登錄組的組名或編號。組名必須存在。組號必須引用已經存在的組。
-G, --groups GROUP1[,GROUP2,...[,GROUPN]]] # 用户也是其成員的補充組列表。每個組用逗號隔開,中間沒有空格。
-h, --help # 顯示幫助信息並退出。
-k, --skel SKEL_DIR # 骨架目錄,其中包含要在用户的主目錄中複製的文件和目錄,當主目錄由 useradd 創建時。
-K, --key KEY=VALUE # 覆蓋 /etc/login.defs 默認值(UID_MIN、UID_MAX、UMASK、PASS_MAX_DAYS 等)。
-l, --no-log-init   # 不要將用户添加到 lastlog 和 faillog 數據庫。
-m, --create-home   # 如果用户的主目錄不存在,則創建它。
-M                  # 不要創建用户的主目錄,即使 /etc/login.defs (CREATE_HOME) 中的系統範圍設置設置為 yes。
-N, --no-user-group # 不要創建與用户同名的組,而是將用户添加到由 -g 選項或 /etc/default/useradd 中的 GROUP 變量指定的組中。
-o, --non-unique    # 允許創建具有重複(非唯一)UID 的用户帳户。 此選項僅在與 -o 選項結合使用時有效。
-p, --password PASSWORD # crypt(3) 返回的加密密碼。 默認是禁用密碼。
-r, --system        # 創建一個系統帳户。
-s, --shell SHELL   # 用户登錄 shell 的名稱。
-u, --uid UID       # 用户 ID 的數值。
-U, --user-group    # 創建一個與用户同名的組,並將用户添加到該組。
-Z, --selinux-user SEUSER # 用户登錄的 SELinux 用户。 默認情況下將此字段留空,這會導致系統選擇默認的 SELinux 用户。
#Ubuntu中默認創建
useradd tom
#沒有創建家目錄


#useradd命令,不同的系統,默認的創建模板不同
cat /etc/default/useradd

#家目錄模板【修改此目錄後,新創建的用户家目錄中的內容會發生改變】
/etc/skel/

新建用户的相關文件

  • /etc/default/useradd
  • /etc/skel/*
  • /etc/login.defs
#批量創建用户
newusers user.txt

cat user.txt
u1:123456:1024:1024::/home/u1:/bin/bash
u2:123456:1025:1025::/home/u2:/bin/bash

3.2 用户信息修改

usermod [OPTIONS] LOGIN

-d				#修改家目錄
-g				#修改組
-L				#鎖定用户帳號
-s				#修改shell
-U				#解鎖用户帳號
-u				#修改UID
-l				#新的登錄名稱

#把登錄名tom改成jerry
usermod -c “tom to jerry” -l jerry tom

3.3 刪除用户

userdel [OPTIONS] LOGIN
#常見選項
-f|--force				#強制刪除,哪怕用户正在登錄狀態
-r|--remove				#刪除家目錄和郵件目錄

3.4 修改密碼

passwd

#設置用户下次必須更改密碼
passwd -e USER

3.5 修改用户密碼策略

change USER

3.6 創建組

groupadd [OPTIONS] GROUP

3.7 修改組

groupmod

3.8 刪除組

groupdel


#常見選項
-f|--force				#強制刪除,即使是用户的主組也強制刪除組,但會導致無主組的用户不可用無法登錄

刪除組:如果該組下有用户將組作為主組,則不能刪除

刪除用户,會把與其同ID的主組也給刪了,前提是該組下沒有其它用户

3.9 更改組成員和密碼

gpasswd命令,可以更改組密碼,也可以修改附加組的成員關係

組沒有密碼的情況下,加組只能由root來操作

gpasswd [OPTION] GROUP


#常見選項
-a						#向組中添加用户
-d						#從組中移除用户
-r						#刪除組密碼
-R						#向其成員限制訪問組
-M						#批量加組
-A						#批量設置組管理員

3.10 更改和查看組成員

groupmens可以管理附加組的成員關係

groupmems [options][action]
-g						#更改為指定組(只有root)
-a						#指定用户加入組
-d						#從組中刪除成員
-p						#從組中清除所有成員
-l						#顯示組成員列表

4、文件權限管理

4.1 Linux中的權限體系

三種角色:

角色

英文表示

字符表示

屬主:所有者

owner|OWNER|user

u

屬組:屬於哪個組

group|GROUP

g

其他用户:不是所有者,也不在屬組中的用户

other|OTHER

o

三種權限:

權限

英文表示

字符表示

八進制表示

讀權限

read|Readable

r

4

寫權限

write|Writable

w

2

執行權限

execute|eXcutable

x

1

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

4.2.1 設置文件的所有者chown

chown [OPTION]...[OWNER]:[:[GROUP]]FILE...

#用法説明
OWNER						#只修改所有者
OWNER:GROUP					#同時修改所有者和屬組
:GROUP						#只修改數組,冒號也可用.替換

-R							#遞歸操作
#下列選項配合-R使用
-H							#如果參數是指向目錄的軟鏈接,則之修改指向的目錄,不改變目錄裏面文件的屬主屬組
-L							#更改所有遇到的符號鏈接指向的目錄
-P							#不更改符號鏈接指向的目錄

4.3 文件權限

注意:

  • 用户的最終權限,是從左向右進行順序匹配,即,所有者,所屬組,其他人,一旦匹配權限立即生效,不再向右查看其權限
  • r和w權限對root用户無效,對沒有讀寫權限的文件,root用户也可讀可寫
  • 只要所有者,所屬組或other三者之一有x權限,root就可以執行

修改文件權限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

可讀可寫可執行

字符表示

八進制數字表示

備註

rw-r-----

640

屬主可讀寫,屬組可讀,其他用户無任何權限

rw-r--r--

644

屬主可讀寫,屬組可讀,其他用户可讀

rwxr-xr-x

755

屬主可讀寫,可執行,屬組可讀可執行,其它用户可讀可執行

4.4 新建文件和目錄的默認權限

在Linux中,新建文件或目錄,都有一個默認權限:umask

umask值間接影響新建文件和新建目錄的權限:

  • 新建文件:666-umask,按位對應相減,如果所得結果某位存在執行(奇數)權限,賊該位+1
  • 新建目錄:777-umask

非特權用户umask默認是002

root的umask默認是022

持久保存umask

  • 全局設置:/etc/bashrc,/etc/bash.bashrc(ubuntu)
  • 用户設置:~/.bashrc

4.5 Linux文件系統上的特殊權限

在Linux中,除了rwx這三種常見的權限之外,還有三個特殊權限,分別是SUID,SGID,Sticky;這三個特殊權限獨立於rwx權限體系

特殊權限:

  • SUID:作用於二進制可執行文件上,用户將繼承此程序所有者的權限
  • SGID:作用於二進制可執行文件上,用户將繼承此程序所有組的權限
  • 作用於目錄上,此目錄中新建的文件的所屬組將自動從此目錄繼承
  • STICKY:作用於目錄上,此目錄中的文件只能由所有者自己來刪除

權限

字符表示

八進制表示

備註

SUID

s

4

如果原屬主沒有可執行權限,再加SUID權限,則顯示為S

SGID

s

2

如果原屬組沒有可執行權限,再加SGID權限,則顯示為S

STICKY

t

1

如果other沒有可執行權限,再加STICKT權限,則顯示為T

4.5.1 特殊權限SUID

前提:進程有屬主和數組;文件有屬主和屬組

  • 任何一個可執行程序文件能不能啓動為進程,取決於發起者對程序文件是否擁有執行權限
  • 啓動為進程之後,其進程的屬主為發起者,進程的屬組為發起者所屬的組
  • 進程訪問文件時的權限,取決於進程的發起者

二進制的可執行文件上SUID權限功能:

  • 任何一個可執行程序文件能不能啓動為進程:屈居於發起者對程序文件是否擁有執行權限
  • 啓動為進城之後,其進程的屬主為原程序文件的屬主
  • SUID只對二進制可執行程序有效
  • SUID設置在目錄上無意義

SUID權限設定:

chomd u+s FILE...
chmod 4xxx FILE
chmod u-s FILE...

意義:普通用户可調用部分命令,以root用户的身份對某些文件進行調整(個人理解)

4.5.2 特殊權限SGID

二進制的可執行文件上SGID權限功能:

  • 任何一個可執行程序文件能不能啓動為進程:取決於發起者對程序文件是否擁有執行權限
  • 啓動為進程之後,其進程的屬組為原程序文件的屬組

SGID權限設定:

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

目錄上的SGID權限功能:

默認情況下,用户創建文件時,其屬組為此用户所屬的主組,一旦某目錄被設定了SGID,則對此目錄有寫權限的用户在此目錄中創建的文件所屬的組為此目錄的屬組,通常用於創建一個協作目錄

SGID權限設定:

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

4.5.3 特殊權限Sticky位

具有寫權限的目錄通常用户可以刪除該目錄中的任何文件,無論該文件的權限或擁有權

在目錄設置Sticky位,只有文件的所有者或root可以刪除該文件

sticky設置在文件上無意義

Sticky權限設定:

chmod o+t DIR...
chmod 1xxx DIR
chmod o-t DIR...

4.5.4 特殊權限數字法

字符表示

二進制表示

八進制表示

備註

---------

000

0

無任何特殊權限

--------t

001

1

Sticky

-----s---

010

2

SGID

-----s--t

011

3

SGID,Sticky

--s------

100

4

SUID

--s-----t

101

5

SUID,SGID

--s---s--

110

6

SUID,SGID

--s--s--t

111

7

SUID,SGID,Sticky

權限位映射

SUID:user,佔據屬主的執行權限位

s:屬主擁有x權限

S:屬主沒有x權限

SGID:group,佔據屬組的執行權限位

s:group擁有x權限

S:group沒有x權限

Sticky:other,佔據other的執行權限位

t:other擁有x權限

T:other沒有x權限

4.5.5 設定文件特殊屬性

某些文件可能會出現無法刪除的情況,可參考下列命令

chattr [-pRVF] [-v version] files...

#常用選項
-p					#設置文件項目編號
-R					#遞歸執行
-V					#顯示過程,並輸出chattr版本
-f					#不輸出錯誤信息
-v					#設置版本

#操作符
+attribute			#添加該屬性
-attribute			#去掉該屬性
=attribute			#僅有該屬性


#常用屬性
e					#文件系統自帶的 
a					#對文件:可追加內容,不可被刪除,不可被修改,不可被重命名;對目錄,可新建,修改文件,但不可刪除文件
A					#不更新atime,節省IO
c					#文件會被壓縮保存
i					#對文件:不可被刪除不可被修改不可重命名;對目錄:可修改查看目錄中的文件,補課新建文件,不可刪除文件
s					#徹底刪除文件,用0填充原來的數據塊
u					#防止誤刪除,這裏是指原來存儲該文件的塊不會被新的數據覆蓋

顯示文件特殊屬性

lsattr

4.6 訪問控制列表ACL

4.6.1 ACL權限功能

rwx權限體系中,僅僅只能將用户分成三種角色,如果要對單獨用户設置額外的權限,則無法完成;

而ACL可以單獨對指定的用户設定各不相同的權限;提供顆粒度更細的權限控制;

CentOS7默認創建的xfs和ext4文件系統具有ACL功能

ACL生效順序

所有者,自定義用户,所屬組,自定義組,其他人

4.6.2 ACL相關命令

apt install acl

#使用setfacl可設置ACL權限
#使用getfacl可查看設置的ACL權限

setfacl 

#常用選項
-m					#修改ACL權限
-M					#從文件讀取規則
-x					#刪除文件acl權限
-X					#從文件讀取規則並刪除文件acl規則
-b					#刪除文件所有acl權限
-k					#刪除默認acl規則
--set=acl			#用新規則替換舊規則,會刪除原有ACL項,用心的替代,一定要包含UGO的設置,不像-m一樣只有ACL
--set-file=file		#從文件讀取新規則
--mask				#重新計算mask值
-n					#不重新計算mask值
-d					#在目錄上設置默認acl
-R					#遞歸執行
-L					#將ACL應用在軟鏈接指向的目標文件上,與-R一起使用
-P					#將ACL不應用在軟鏈接指向的目標文件上,與-R一起使用

mask權限

  • mask隻影響除所有者和other的之外的人和組的最大權限
  • mask需要與用户的權限進行邏輯與運算後,才能變成有限的權限(Effective Permission)
  • 用户或組的設置必須存在於mask權限設定範圍內才會生效

對於腳本程序來講,必須先要有讀權限,才能執行。