內容綱要
- 用戶、組
- 用戶、組的配置文件
- 用戶和組管理命令
一、用戶、組
用戶
- 系統在用戶登錄時為用戶分配一個令牌便于權限管理,在linux系統中令牌即為UID
- UID編碼規則:
- root用戶的UID為0,普通用戶的UID為1-60000,其中系統用戶與登錄用戶的分配如下:
- 系統用戶:1-499(CentOS 6),1-999(CentOS 7)
- 登錄用戶:500+(CentOS 6),1000+(CentOS 7)
- root用戶的UID為0,普通用戶的UID為1-60000,其中系統用戶與登錄用戶的分配如下:
- 系統用戶主要為系統運行的程序準備。
組
- 系統為了方便管理,設立組的概念,組內用戶的權限繼承自組權限
- 組同樣設置GID,其編碼規則同UID
- 建立新用戶時系統默認同時建立同名組,其UID和GID號相同
安全上下文
- 進程所能夠訪問資源的權限取決于進程的運行者的身份
組的類別
- 用戶的主要組:一個用戶有且只屬于一個主組,默認其名稱與用戶名相同
- 用戶的輔助組:一個用戶可以屬于零個或多個輔助組
二、用戶、組的配置文件
- linux用戶、組的配置文件主要如下四個:
/etc/passwd 用戶賬號相關屬性配置文件
/etc/shadow 用戶密碼相關屬性配置文件
/etc/gpasswd 組賬號相關屬性配置文件
/etc/gshadow 組密碼相關屬性配置文件
-
passwd文件格式:
name:passwd:UID:GID:GECOS:directory:shell
- name: 用戶登錄名
- passwd: 用戶密碼,現在密碼已經移至
/etc/shadow
文件,被占位符x
代替 - UID: 用戶ID號
- GID: 用戶所屬的主組ID號
- GECO: 用戶信息注釋
- directory: 用戶家目錄路徑
- shell: 用戶默認shell
-
shadow文件格式:
login name:encrypted password:date of last password change:minimum password age:maximum password age:password warning period:password inactivity period:account expiration date:reserved field
- login name:用戶登錄名
- encrypted password: 加密的密碼
- 加密密碼如圖
$6
代表加密方式為SHA512,加密方式很多,例如$1
代表MD5加密$AArU9fX$
中兩個$符號間是一段隨機字符,稱作鹽(salt),用于確保即使是相同密碼加密的結果也不同,進一步加強密碼安全性- 后面的字符是加密密文正文,不同加密方式長度不同,但是只要加密方式相同,密碼位數不同加密后的密文位數是相同的
- 更改密碼加密方式:
authconfig --passalgo=sha256 --update
date of last password change: 上次修改密碼時間,從1970-1-1起算的天數
minimum password age: 最短密碼時間,普通用戶更換密碼的最短間隔天數,0表示隨時可以變更
maximum password age: 最長密碼時間,用戶使用一個密碼最長時間,99999表示永不過期
password warning period: 密碼達到最長時間前提前報警提示的天數,默認7天
password inactivity period: 密碼達到最長時間后允許修改密碼的寬限期,超出后用戶被鎖定
account expiration date: 用戶賬戶有效期,從1970-1-1起算的天數
-
group文件格式:
group name:passwd:GID:user list
- group name: 組名稱
- passwd: 組密碼,用占位符
x
代替,加密密碼移至/etc/gpasswd
文件 - GID: 組ID號
- user list: 以當前組為輔助組的用戶,多用戶用
,
分隔
-
gshadow文件格式:
group name:encrypted password:administrators:members
- group name: 組名稱
- encrypted password: 加密的密碼,與
/etc/shadow
文件中的密碼加密方式相同 - administrators: 組管理員,可以修改組密碼,多名管理員用
,
分隔 - members: 以當前組為輔助組的用戶,內容必須與
/etc/group
文件中的user list相同
注意:修改賬號相關設置(e.g. /etc/passwd /etc/shadow /etc/group /etc/gpasswd)時,必須重新登錄才能夠生效
三、用戶和組管理命令
(一)用戶管理命令
(1)useradd 用戶創建
- 語法:
useradd [options] LOGIN
- 用法:
-u UID <!--指定UID,[UID_MIN, UID_MAX]定義在/etc/login.defs-->
-o <!--配合-u 選項,不檢查UID的唯一性-->
-g GID <!--指明用戶所屬基本組,可為組名,也可以GID-->
-c "COMMENT" <!--用戶的注釋信息-->
-d HOME_DIR <!--以指定的路徑(不存在)為家目錄-->
-s SHELL <!--指明用戶的默認shell程序,可用列表在/etc/shells文件中-->
-G GROUP1[,GROUP2,...] <!--為用戶指明附加組,組須事先存在-->
-N <!--不創建私用組做主組,使用users組做主組-->
-r <!--創建系統用戶,默認不創建家目錄,shell為/sbin/nologin-->
- 實驗:創建一個用戶billy,指明UID=1010,屬于附加組hellopeiyang和natasha,家目錄為/app/billy,使用的shell為csh。
-
命令:
useradd -u 1010 -G hellopeiyang,natasha -d /app/billy -s /bin/csh billy
用
getent
命令檢查hellopeiyang,natasha,billy三個組的/etc/group文件,確認用戶列表存放的是以此組作為輔助組的用戶
-
- 用戶創建默認配置文件
/etc/default/useradd
- 使用
useradd -D
命令修改用戶創建默認配置文件
useradd -D -b /app <!--當不指定家目錄時,自動在/app下新建用戶家目錄-->
useradd -D -g group <!--當使用useradd -N選項時,使用設置的組作為主組,默認為users組-->
useradd -D -s shell <!--當不指定默認shell時,自動使用設置的shell-->
- 用戶家目錄默認配置文件
/etc/skel
使用useradd
建立用戶家目錄時,將/etc/skel
下的所有文件復制到家目錄中,相當于執行命令cp -a /etc/skel/.[^.]* /home/user
-
newusers passwd格式文件
批量創建用戶 -
cat 格式文件 | chpasswd
批量修改用戶密碼,格式文件格式user name:password
(2)usermod 用戶屬性修改
- 語法:
usermod [OPTION] login
- 用法:
-u UID <!--新UID,必須唯一不重復,除非使用-o 選項-->
-g GID <!--新主組-->
-G GROUP1[,GROUP2,...[,GROUPN]]
<!--新附加組,原來的附加組將會被覆蓋;若保留原有,則要同時使用-a選項-->
-s SHELL <!--新的默認SHELL-->
-c 'COMMENT' <!--新的注釋信息-->
-d HOME <!--新家目錄不會自動創建;若要創建新家目錄并移動原家數據,同時使用-m選項-->
-l login_name <!--新的名字-->
-L <!--lock指定用戶,在/etc/shadow 密碼欄首增加!-->
-U <!--unlock指定用戶,刪除/etc/shadow 密碼欄首的"!" -->
-e YYYY-MM-DD <!--指明用戶賬號過期日期-->
-f INACTIVE <!--設定非活動期限-->
- 實驗:將billy用戶的主組改為harry,附加組增加sarah,家目錄遷移到/home/billy下,賬號于2018年8月31日過期,最后將billy賬戶鎖定
- 命令:
getent group harry
usermod -g 1004 -aG sarah -md /home/billy -e 2018-08-31 billy <!--注意a在G前,m在d前-->
usermod -L billy
(3)userdel 刪除用戶
userdel login <!--刪除login用戶-->
userdel -r login <!--刪除login用戶同時刪除家目錄-->
(4)id 查看用戶相關ID信息
語法:id [OPTION]... [USER]
用法:
-u <!--顯示UID-->
-g <!--顯示GID-->
-G <!--顯示用戶所屬組的ID-->
-n <!--顯示名稱,需配合ugG使用-->
(5)切換用戶 su
su user <!--切換至user用戶,但是不切換至user目錄、不讀取user用戶配置文件-->
su - user <!--切換至user用戶,同時切換至user目錄并讀取user用戶配置文件-->
su/ su - <!--不寫用戶名默認切換至root用戶-->
exit <!--退出切換的用戶,注意不要在切換的用戶下再切換用戶,會導致系統異常-->
su - root -c 'command' <!--只使用root身份執行一次command命令即切換回原用戶-->
- root用戶切換至普通用戶不需要密碼,普通用戶切換至root用戶需要root密碼
(6)設置密碼 passwd
- 語法:
passwd [OPTIONS] UserName
- 用法:
-l <!--鎖定指定用戶-->
-u <!--解鎖指定用戶-->
-e <!--強制用戶下次登錄修改密碼-->
-n mindays <!--指定最短使用期限-->
-x maxdays <!--最長使用期限-->
-w warndays <!--提前多少天開始警告-->
-i inactivedays <!--非活動期限-->
--stdin <!--從標準輸入接收用戶密碼-->
- 實驗:將harry的密碼改為"hello",同時密碼最短使用期限3天,最長使用期限42天,密碼到期前7天提示修改,過期后5天將賬戶鎖定
- 命令:
echo "hello" | passwd -n 3 -x 42 -w 7 -i 5 --stdin harry
(7) 修改用戶密碼策略 chage
語法:chage [OPTION]... LOGIN
用法:
-d <!--LAST_DAY,修改密碼上次修改時間-->
-E --expiredate <!--EXPIRE_DATE,設置賬戶失效時間-->
-I --inactive <!--INACTIVE,設置密碼修改寬限期-->
-m --mindays <!--MIN_DAYS,設置密碼修改最短間隔時間-->
-M --maxdays <!--MAX_DAYS,設置密碼使用最長期限-->
-W --warndays <!--WARN_DAYS,設置密碼過期前的提前警告時間-->
–l <!--顯示密碼策略信息-->
(8)其他用戶管理命令
- chsh -s shell 修改shell
- chfn 修改用戶注釋信息
- finger 查看用戶詳細信息
(二)組管理命令
(1)創建組 groupadd
- 語法:
groupadd [OPTION]... group_name
- 用法:
-g GID <!--指明GID號;[GID_MIN, GID_MAX]定義在/etc/login.defs-->
-o <!--配合-g屬性,不檢查GID的唯一性-->
-r <!--創建系統組-->
(2)修改組屬性 groupmod
- 語法:
groupmod [OPTION]... group
- 用法:
-n group_name <!--設置新名字-->
-g GID <!--設置新的GID-->
-o <!--配合-g屬性,不檢查GID的唯一性-->
(3)刪除組 groupdel
- 語法
groupdel group_name
(4)更改組密碼 gpasswd
- 語法:gpasswd [OPTION] GROUP
- 用法:
-a user <!--將user添加至指定組中-->
-d user <!--從指定組中移除用戶user-->
-A user1,user2,... <!--設置有管理權限的用戶列表-->
- 實驗:創建組david,將用戶hellopeiyang,natasha,sarah加入到組中,將natasha從組中移除
- 命令:
groupadd david
gpasswd -a hellopeiyang,natasha,sarah david
gpasswd -d natasha
-
結果如下圖
-
第1步,建立組david;
-
第2步,為組david添加用戶hellopeiyang,natasha,sarah;
-
第3步,將natasha從組david中刪除。
-
newgrp命令:臨時切換主組,如果用戶本不屬于此組,則需要組密碼
語法:newgrp group_name
(5)更改和查看組成員 groupmems
- 語法:
groupmems [options] [actions]
- 用法:
options:
-g, --group group_name <!--更改為指定組,只有root可以執行,普通用戶只能修改所在組-->
actions:
-a, --add username <!--指定用戶加入組-->
-d, --delete username <!--從組中刪除用戶-->
-p, --purge <!--從組中清除所有成員-->
-l, --list <!--顯示組成員列表-->
- groups 顯示用戶所屬于的組
groups user_name