眾所周知,Linux是一個多用戶、多任務(Multi-Tasks、Multi-Users)的操作系統。那么Linux是如何區分和認證用戶的,系統對每個用戶的授權是如何管理的,出現問題如何追溯每個用戶在系統內的操作記錄,等等,這些就涉及到Linux中用戶和組的管理。
- AAA介紹
- Linux用戶類別
- Linux用戶標識(UID)
- Linux組類別
- Linux組標識(GID)
- Linux中用戶和組的相關數據庫文件
- Linux用戶和組管理命令
(1) groupadd命令
(2) groupmod命令
(3) groupdel命令
(4) useradd命令
(5) usermod命令
(6) userdel命令
(7) passwd命令
(8) gpasswd命令
(9) newgrp命令
(10) chage命令
(11) id命令
(12) su命令
(13) 其它幾個用戶和組管理相關命令- Linux用戶和組管理命令的相關示例
- 通過更改用戶和組的配置文件,直接添加或修改用戶和組
首先介紹以下AAA。
1、AAA介紹
AAA指的是Authentication、Authorization、Accounting,即認證、授權和審計。
- 認證:驗證用戶是否可以獲得權限,是3A的第一步,即驗證身份;
- 授權:授權用戶可以使用那些服務或資源,即身份驗證成功后,賦予這個身份相應的權限;
- 審計:記錄用戶的操作情況,在Linux中,日志就是審計的一種手段。
Linux的用戶和組管理可以說是基于AAA進行的,首先用戶登錄輸入用戶名密碼,就是認證的過程;其次,在用戶登錄成功后,所擁有的權限各不相同,這就是授權;最后,用戶的操作歷史會記錄在日志中,這是審計。
接下來介紹Linux中用戶和組的類別,以及Linux是如何標識每個用戶和組的:
2、Linux用戶類別
Linux中,用戶分為兩大類、三小類:
分別為管理員(一般為root)和普通用戶 。
普通用戶中,又劃分為兩類,分別為系統用戶和登錄用戶。
- 管理員
即超級用戶,可以操作系統中任意文件和命令,擁有最高的管理權限。
Tips:一般情況下盡量不要使用root登錄系統,避免誤操作。 - 普通用戶
又分為登錄用戶和系統用戶:- 登錄用戶
一般為管理員手動添加的用戶,默認僅擁有操作自身家目錄中文件及目錄的權限,以及進入與瀏覽相關目錄文件的權限(如/etc、/var/log等),但沒有創建、修改、刪除等權限。 - 系統用戶
一般為系統安裝后默認存在的,且默認情況下不能登錄系統,它們的存在主要是為了滿足系統進程對文件屬主的需求。
Tips:在部署某些服務是,也可以手動添加某些系統用戶。
- 登錄用戶
3、Linux用戶標識(UID)
Linux系統使用UID(User ID)來標識不同用戶。
UID是16bits的二進制數字,所以換算成十進制,UID的范圍是0~65535,Linux根據用戶類別,對UID劃分做了規定:
- 管理員
UID為0
Tips:當用戶UID為0時,該用戶就是管理員,所以不只root才是管理員,可以手動指定,但不建議。 - 普通用戶(1~65535)
- 系統用戶
一般發行版為1499(CentOS7為1999) - 登錄用戶
一般發行版為50065535(CentOS7為100065535)
- 系統用戶
Tips:Linux是根據“名稱解析庫”(/etc/passwd)來進行用戶名和UID的解析的,后面會詳細介紹Linux中用戶和組的相關信息庫文件。
4、Linux組類別
Linux對組有三種劃分方法:
- 第一種組類別,和用戶劃分類似,兩大類三小類
- 管理員組
- 普通用戶組(包括系統用戶組和登錄用戶組)
- 第二種組類別
- 用戶的基本組(主組)
用戶必須有且只能有一個基本組。 - 用戶的附加組 (附屬組)
用戶可以有0個、1個或多個附加組。
基本組和附加組就比如,每個人有一個用來安家的房子(基本組),還可以有N個用于投資的房子(附屬組)。
- 用戶的基本組(主組)
- 第三種組類別
- 私有組
每新建一個用戶,如果不指定-g參數,都會自動創建一個和用戶名同名的組,且組內只包含用戶本身。 - 公共組
組內可包含多個用戶。
- 私有組
5、Linux組標識(GID)
Linux系統使用GID(Group ID)來標識不同組。
GID的劃分和UID相同,這里不再贅述。
6、Linux中用戶和組的相關數據庫文件
Linux中,與用戶和組相關的信息主要存儲在/etc/passwd、/etc/shadow、/etc/group三個文件中(存儲格式中各字段用:分隔):
- /etc/passwd:存儲用戶賬戶信息
存儲格式為,name:password:UID:GID:comment:directory:shell- name:用戶登錄名;
- password:用戶口令,用占位符x表示;
- UID:用戶ID,用戶登錄時,系統根據UID,而非用戶名來識別用戶;
- GID:用戶所屬的主組ID;
- comment:用戶的注釋信息;
- directory:用戶家目錄的絕對路徑;
- shell:用戶的默認shell。
- /etc/shadow:存儲用戶密碼信息
存儲格式為,
登錄名:$加密算法$salt$加密了的密碼:最后一次更改密碼的日期:密碼最小期限:密碼最大期限:密碼警告時間段:密碼禁用期:賬戶過期日期:保留字段- 字段1:name用戶登錄名;
- 字段2:加密的密碼,$為分隔符,首先是使用的加密算法,其次是salt(隨機數),最后才是加密了的密碼本身;
- 字段3:從1970年1月1日算起,密碼被修改的天數(最近一次更改密碼);
- 字段4:密碼最小期限,即密碼最近更改日期到下次允許更改日期之間的天數(比如設置為10,則表示更改密碼后10天內不允許再次更改;0表示無限制,可在任何時間修改);
- 字段5:密碼最大期限,密碼最近更改日期到系統強制用戶更改密碼日期之間的天數(比如設置為100,則表示更改密碼后100天,系統將強制要求再次更改密碼;1表示永不修改);
- 字段6:密碼警告時間段,密碼過期前,用戶被警告的天數(比如,上個例子設置密碼最大期限為100,密碼警告時間段設為5,則表示更改密碼后第96-100這5天,用戶將被警告“密碼即將過期”;-1表示沒有警告);
- 字段7:密碼禁用期,密碼過期后,到系統自動禁用賬戶的天數(-1表示永遠不會禁用);
- 字段8:賬戶過期日期(-1表示該賬戶被啟用);
- 字段9:保留條目,目前沒用。
- /etc/group:存儲用戶組信息
存儲格式為,group_name:password:GID:user_list- group_name:組名;
- password:用戶組的口令,用占位符x表示,一般Linux用戶組都沒有口令;
- GID:組ID;
- user_list:用戶列表,注意,這里列出的是以該組為附加組的用戶列表,以此組為主組的用戶沒有列在此處。
7、Linux用戶和組管理命令
- 組管理:groupadd,groupmod,groupdel
- 用戶管理:useradd,usermod,userdel
- 密碼管理:passwd,gpasswd
- 其它相關命令:newgrp,chage,chsh,id,su
(1) groupadd命令
groupadd - create a new group
新建組-
groupadd [options] group
- -g GID:指定GID:默認是上一個組的GID+1
- -r:創建系統組
例如,現在創建名為mygroup1和mygroup2兩個組,查看其GID,分別為1000和1001,GID加1:
[root@localhost ~]# groupadd mygroup1;groupadd mygroup2
[root@localhost ~]# tail -2 /etc/group
mygroup1:x:1000:
mygroup2:x:1001:
再創建一個名為mygroup3的組,指定其GID為2222:
[root@localhost ~]# groupadd -g 2222 mygroup3
[root@localhost ~]# tail -1 /etc/group
mygroup3:x:2222:
(2) gourpmod命令
- groupmod - modify a group definition on the system
更改用戶組屬性 - groupmod [options] GROUP
- -g GID:--gid GID:修改GID
- -n NEW_NAME,修改組名
- 例如:將mygroup1的GID改為1111,組名改為MYGROUP:
[root@localhost ~]# groupmod -g 1111 -n MYGOURP mygroup1
[root@localhost ~]# tail -1 /etc/group
MYGOURP:x:1111:
(3) groupdel命令
- groupdel - delete a group
刪除組 - groupdel [options] GROUP
- 當某user以某group為主組時,是無法使用groupdel命令刪除該group的,但附加組不受影響
[root@localhost ~]# useradd user2 -g mygroup2 \\創建user2用戶,指定主組為mygroup2
[root@localhost ~]# groupdel mygroup2 \\刪除mygroup2
groupdel: cannot remove the primary group of user 'user2' \\提示無法刪除
[root@localhost ~]# useradd user3 -G mygroup3 \\新建user3用戶,添加附加組mygroup3
[root@localhost ~]# groupdel mygroup3 \\直接刪除
(4) useradd命令
useradd - create a new user or update default new user information
新建用戶或修改新建用戶時的默認屬性-
useradd [options] LOGIN
- -u UID:--uid UID:指定UID,默認是上一個用戶UID+1
- -g GROUP:--gid GROUP:指定用戶的基本組,此組必須事先存在
- -G:--groups GROUP1,GROUP2...,指定用戶的附加組,這些組必須事先存在
- -c COMMENT:--comment COMMENT:添加注釋
- -d:--home HOME_DIR:指定用戶家目錄,通過復制/etc/skel并重命名實現的,指定的家目錄路徑如果事先存在,則不會為用戶復制環境初始化配置文件(如.bashrc等)
- -s:--shell SHELL:指定用戶默認shell,可用的所有shell列表存儲在/etc/shells文件中
- -r:--system:創建系統用戶
例如,創建suse用戶,指定其UID為1100,指定其主組/基本組為slackware,指定附加組為group1,group2,添加注釋“slackware management”,指定家目錄為/home/susehome,默認shell為/bin/zsh:
[root@localhost ~]# useradd -u 1100 -g slackware -G "group1,group2" -c "slackware management" -d /home/susehome -s /bin/zsh suse
[root@localhost ~]# tail -1 /etc/passwd
suse:x:1100:2224:slackware management:/home/susehome:/bin/zsh
這里-d指明的家目錄事先不存在,所以會將骨架信息復制過來:
[root@localhost susehome]# ls -A /home/susehome/
.bash_logout .bash_profile .bashrc .mozilla
如果指定的家目錄事先存在,則不會從/etc/skel復制信息:
[root@localhost home]# mkdir /home/suse2home
[root@localhost home]# useradd -d /home/suse2home suse2
useradd: warning: the home directory already exists.
Not copying any file from skel directory into it.
[root@localhost home]# ls -A /home/suse2home
[root@localhost home]#
-
useradd -D [options]:顯示或修改用戶創建時的默認配置屬性
用戶創建時的配置屬性如下:- GROUP:是否創建用戶私有組,默認100,是
- HOME:家目錄起始位置,默認/home
- INACTIVE:密碼過期到用戶注銷的時間,默認-1,不注銷
- EXPIRE:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
- SHELL:默認shell,默認為xxxxxxxxxxxxxxxxxxx
- SKEL:從哪復制用戶骨架信息,默認/etc/skel
- CREATE_MAIL_SPOOL:是否創建郵件目錄,默認yes,(在/var/spool/mail/)
-
Tips:
- 創建用戶時的諸多默認配置保存在/etc/login.defs文件中;
- useradd -D 修改的配置結果保存在/etc/default/useradd文件中。
useradd -D顯示的內容
[root@localhost home]# useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
/etc/default/useradd文件中的內容:
[root@localhost mail]# cat /etc/default/useradd
# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
(5) usermod命令
- usermod - modify a user account
修改用戶屬性 - usermod [options] LOGIN
和useradd的選項大致相同- -u UID:--uid UID:修改UID
- -g GROUP:--gid GROUP:修改用戶的基本組,此組必須事先存在
- -G:--groups GROUP1,GROUP2...,修改用戶的附加組,這些組須事先存在。
注意,原來的附加組會被覆蓋。
如果只添加不覆蓋,則配合使用-a選項。 - -a:--append:與-G一同使用,添加用戶的附加組
- -c COMMENT:--comment COMMENT:修改注釋
- -d:--home HOME_DIR:修改用戶家目錄
用戶原有的文件不會被轉移至新位置。
如果需要轉移,則配合使用-m選項。 - -m:--move-home:只能與-d選項一同使用,用于將原來的家目錄移動為新的家目錄。
- -l:--login NEW_LOGIN:修改用戶登錄名
- -s:--shell SHELL:修改用戶默認shell
- -L:--lock:鎖定用戶的密碼,即禁止用戶登錄。
其實就是在/etc/passwd文件中用戶原來的密碼字符串前添加一個“!”,使其不能匹配。 - -U:--unlock:解鎖用戶的密碼
- usermod的常用選項和useradd相同,只需注意-d和-G兩個選項
- 例如只修改suse用戶的家目錄為/home/suse_newhome,不移動之前家目錄的內容,則用-d選項(此目錄須事先存在,否則只是更改了/etc/passwd中的記錄,實際的目錄是不會自動創建的):
[root@localhost ~]# mkdir /home/suse_newhome
[root@localhost ~]# usermod -d /home/suse_newhome suse
[root@localhost ~]# ls -A /home/suse_newhome/
[root@localhost ~]#
- 如果想修改家目錄的同時,移動以前家目錄的內容,則將-d和-m選項同時使用(這里要注意一下,目標目錄不要事先存在,否則和只用-d的效果是一樣的):
[root@localhost ~]# rm -rf /home/suse_newhome/ \\這里先刪除之前創建的目錄
[root@localhost ~]# usermod -md /home/suse_newhome suse
[root@localhost ~]# cd ~suse
[root@localhost suse_newhome]# ls -A
.bash_logout .bash_profile .bashrc .mozilla
- 例如只修改suse用戶的家目錄為/home/suse_newhome,不移動之前家目錄的內容,則用-d選項(此目錄須事先存在,否則只是更改了/etc/passwd中的記錄,實際的目錄是不會自動創建的):
(6) userdel命令
- userdel - delete a user account and related files
刪除用戶賬戶和相關文件 - userdel [options] LOGIN
- -r:刪除用戶時一并刪除用戶家目錄
- userdel命令只需注意加不加-r選項的區別就可以,-r會在刪除用戶的同時,刪除和用戶相關的家目錄和郵件文件。
(7) passwd命令
- passwd - update user's authentication tokens
- passwd [-k] [-l] [-u [-f]] [-d] [-e] [-n mindays] [-x maxdays] [-w warndays] [-i inactivedays] [-S] [--stdin] [username]
- passwd:不帶任何選項:修改當前登錄用戶自己的密碼
- passwd USER:修改指定用戶的密碼,默認僅root用戶有此權限
- -l:--lock:鎖定用戶
- -u:--unlock:解鎖用戶
- -d:--delete:清除用戶密碼
- -e:--expire DATE:過期期限(日期)
- -i:--inactive DAYS:非活動期限(時長)
- -n:--minimum DAYS:密碼的最短使用期限
- -m:--maximum DAYS:密碼的最長使用期限
- -w:--warning DAYS:警告期限
- tips:
- 修改密碼也可以用如下命令:
echo "PASSWORD" | passwd --stdin USER \\多用于shell腳本中
- 修改密碼也可以用如下命令:
(8) gpasswd命令
- gpasswd - administer /etc/group and /etc/gshadow
- gpasswd [option] group
- -a:--add USER:向組中添加用戶
- -d:--delete USER:從組中移除用戶
- tips:
- 組密碼文件:/etc/gshadow
- 組一般是沒有密碼的,給組設定密碼的作用:避免用戶隨意切換基本組。
- newgrp GROUP:臨時切換當前用戶的基本組(exit:切換回之前的基本組)
(9) newgrp命令
- newgrp - log in to a new group
- newgrp [-] [group]
- -:會模擬用戶重新登錄,以實現重新初始化其工作環境
- exit:切換回去
- 例如,將root用戶的主組臨時切換為group1:
[root@localhost ~]# id -gn
root
[root@localhost ~]# newgrp - group1
[root@localhost ~]# id -gn
group1
(10) chage命令
- chage - change user password expiry information
修改密碼的各類過期信息 - chage [options] LOGIN
- -d,-E,-W,-m,-M
- chage命令用的不多,因為passwd命令中也可以修改密碼的各類過期信息。
(11) id命令
- id - print real and effective user and group IDs(實際的和有效的ID是不同的)
- id [OPTION]... [USER]
- id:不帶任何選項:顯示當前登錄用戶自己的信息
- -u:--user:僅顯示UID
- -r:--real:僅顯示實際的ID
- -g:--group:僅顯示用戶的基本組ID
- -G:--groups:僅顯示用戶所屬的所有組的ID
- -n:--name:顯示名稱,而非ID
- 例如,在suse用戶下,使用id命令:
[suse@localhost ~]$ id
uid=1100(suse) gid=2224(slackware) groups=2224(slackware),2225(group1),2226(group2) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
- 使用id -u,僅顯示suse的UID:
[suse@localhost ~]$ id -u
1100
- 使用id -g,僅顯示suse的主組GID,即slackware的GID:
[suse@localhost ~]$ id -g
2224
- 使用id -G,顯示suse的主組和附加組的GID:
[suse@localhost ~]$ id -G
2224 2225 2226
- 配合-n選項,顯示用戶名或組名,而非ID號:
[suse@localhost ~]$ id -un
suse
[suse@localhost ~]$ id -gn
slackware
[suse@localhost ~]$ id -Gn
slackware group1 group2
(12) su命令
- su - run a command with substitute user and group ID
- su [options...] [-] [user [args...]]
- 登錄式切換:會通過重新讀取目標用戶的配置文件來重新初始化
su - USER
or
su -l USER - 非登錄式切換:不會讀取目標用戶的配置文件進行初始化
su USER - -c COMMAND:僅以指定用戶的身份運行此處指定的命令
- 登錄式切換:會通過重新讀取目標用戶的配置文件來重新初始化
- tips:
管理員可無密碼切換至其他任何用戶
(13) 其它幾個用戶和組管理相關命令
- chsh:修改shell
- finger:查看信息
- chfn:修改finger信息
- whoami:我是誰呵呵
- pwck:檢查用戶信息是否有異常
- grpck:檢查組信息是否有異常
Linux用戶和組管理命令的相關示例
- 創建組distro,其GID為2016;
[root@localhost ~]# groupadd -g 2016 distro
[root@localhost ~]# tail -1 /etc/group
distro:x:2016:
- 創建用戶mandriva, 其ID號為1005;基本組為distro;
[root@localhost ~]# useradd -u 1005 -g distro mandriva
[root@localhost ~]# tail -1 /etc/passwd
mandriva:x:1005:2016::/home/mandriva:/bin/bash
- 創建用戶mageia,其ID號為1100,家目錄為/home/linux;
[root@localhost ~]# useradd -u 1100 -d /home/linux mageia
[root@localhost ~]# tail -1 /etc/passwd
mageia:x:1100:1100::/home/linux:/bin/bash
- 給用戶mageia添加密碼,密碼為mageedu;
[root@localhost ~]# echo "mageedu" | passwd --stdin mageia
Changing password for user mageia.
passwd: all authentication tokens updated successfully.
- 刪除mandriva,但保留其家目錄;
[root@localhost ~]# userdel mandriva
[root@localhost ~]# ls /home/ |grep linux
linux
- 創建用戶slackware,其ID號為2002,基本組為distro,附加組peguin;
[root@localhost ~]# groupadd peguin
[root@localhost ~]# useradd slackware -u 2002 -g distro -G peguin
[root@localhost ~]# tail -1 /etc/passwd
slackware:x:2002:2016::/home/slackware:/bin/bash
- 修改slackware的默認shell為/bin/tcsh;
[root@localhost ~]# usermod -s /bin/tcsh slackware
[root@localhost ~]# tail -1 /etc/passwd
slackware:x:2002:2016::/home/slackware:/bin/tcsh
- 為用戶slackware新增附加組admins;
[root@localhost ~]# groupadd admins
[root@localhost ~]# usermod -aG admins slackware
[root@localhost ~]# id -Gn slackware
distro peguin admins
通過更改用戶和組的配置文件,直接添加或修改用戶和組
為了更深入了解用戶和組的相關配置文件,可以手動更改配置文件以達到命令的執行效果。
復制/etc/skel目錄為/home/tuser1,要求/home/tuser1及其內部文件的屬組和其它用戶均沒有任何訪問權限。
[root@localhost ~]# cp -r /etc/skel /home/tuser1
\\這里我使用root用戶復制,注意目標目錄/home/tuser1不能事先存在,否則復制的結果為/home/tuser1/skel
[root@localhost ~]# ls -Al /home/tuser1/
total 16
-rw-r--r--. 1 root root 18 May 8 17:56 .bash_logout
-rw-r--r--. 1 root root 193 May 8 17:56 .bash_profile
-rw-r--r--. 1 root root 231 May 8 17:56 .bashrc
drwxr-xr-x. 4 root root 4096 May 8 17:56 .mozilla
[root@localhost ~]# chmod -R 700 /home/tuser1
[root@localhost ~]# ll -al /home/tuser1
total 24
drwx------. 3 root root 4096 May 8 17:56 .
drwxr-xr-x. 3 root root 4096 May 8 17:56 ..
-rwx------. 1 root root 18 May 8 17:56 .bash_logout
-rwx------. 1 root root 193 May 8 17:56 .bash_profile
-rwx------. 1 root root 231 May 8 17:56 .bashrc
drwx------. 4 root root 4096 May 8 17:56 .mozilla
編輯/etc/group文件,添加組hadoop。
[root@localhost ~]# vim + /etc/group
...
hadoop:x:1500:
手動編輯/etc/passwd文件新增一行,添加用戶hadoop,其基本組ID為hadoop組的id號;其家目錄為/home/hadoop。
[root@localhost ~]# vim + /etc/passwd
...
hadoop:x:1500:1500::/home/hadoop:/bin/bash
[root@localhost ~]# id hadoop
uid=1500(hadoop) gid=1500(hadoop) groups=1500(hadoop)
復制/etc/skel目錄為/home/hadoop,要求修改hadoop目錄的屬組和其它用戶沒有任何訪問權限。
[root@localhost ~]# cp -R /etc/skel /home/hadoop
[root@localhost ~]# chmod 700 /home/hadoop
[root@localhost ~]# chmod g=,o= /home/hadoop/
[root@localhost ~]# ll -d /home/hadoop
drwx------. 3 root root 4096 May 14 11:20 /home/hadoop
修改/home/hadoop目錄及其內部所有文件的屬主為hadoop,屬組為hadoop。
[root@localhost ~]# chown -R hadoop:hadoop /home/hadoop/
[root@localhost ~]# ll -a /home/hadoop/
total 24
drwx------. 3 hadoop hadoop 4096 May 14 11:20 .
drwxr-xr-x. 4 root root 4096 May 14 11:20 ..
-rw-r--r--. 1 hadoop hadoop 18 May 14 11:20 .bash_logout
-rw-r--r--. 1 hadoop hadoop 193 May 14 11:20 .bash_profile
-rw-r--r--. 1 hadoop hadoop 231 May 14 11:20 .bashrc
drwxr-xr-x. 4 hadoop hadoop 4096 May 14 11:20 .mozilla