linux用户与用户组管理的基本理念和命令
用户分为普通用户、系统用户、系统管理员(root)。 而用户组则与用户所对应,也分为普通用户组、系统用户组、和系统管理员组。
在Linux中,系统并非直接通过我们的账户名称进行识别。由于计算机只能识别二进制的0和1,所以对于计算机而言数字才是其识别的最佳方式。
而账户名称不过是为了方便使用者记忆,其实每个账户都有其对应的 ID(数字串)号码,换而言之无论是用户名称还是用户组名称,都有其对应的一组ID。
用户 ID 简写为 UID,用户组 ID 简写为 GID。
理解了上述概念,再让我们来看看Linux为我们预设的一些ID划分。
用户与用户组基本划分
系统分配了 0-65535 之间的数字作为用户与用户组ID,Centos6 与 Centos7 有些许细微差别,随后将会其列出。
用户分类 | Centos6 UID | Centos7 UID | Centos6 GID | Centos7 GID |
---|---|---|---|---|
Root | 0 | 0 | 0 | 0 |
系统用户 | 1-499 | 1-999 | 1-499 | 1-999 |
普通用户 | 500+ | 1000+ | 500+ | 1000+ |
上述分配是系统默认划分,可手动指定划分ID范围,但是为了方便管理与识别,不建议打乱划分范围,或做有规则的划分(避免新建用户UID与GID无法成对等干扰识别效率的分配)。
用户与用户组配置文件
当用户登录时,系统会首先寻找 /etc/passed 里面是否有其输入的账号,若没有则跳出,若匹配到则读取/etc/group所对应 UID 与 GID,加载其主文件夹与shell 设置。 然后读取 /etc/shadow 寻找对应账户与 UID,核对输入的密码,核对成功进入shell 控管阶段。
从上述流程中可看出,用户想要登录系统 etc/passed;/etc/group;/etc/shadow; 三个文件非常重要,那么我们来看看这三个文件中都有什么信息呢?
/etc/passwd 文件结构
我们用 cat 命令查看一下/etc/passwd文件的内容:
[root@ZhangSir ~]#cat /etc/passwd
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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
......(此处省略)
此文件中没一行都代表了一个账号,有几行就有几个账号,不过里面很多账号本来就是系统正常运行所必须的菂,我们简称为系统账号,如:bin,daemon,adm,nobody 等等,这些账号不要随意删掉。
root:x:0:0:root:/root:/bin/bash
我们以 root 这一行为例,一行中以 ' : ' 作为分隔,隔成了7个字段,而这7个字段分别代表了:
-
1.账户名称:登录所需账户名。
-
2.密码:早期密码存放的地方,因安全考虑改存/etc/shadow,但为兼容问题,此处用x代替。
-
3.UID:用户账号锁对应ID号码。
-
4.GID:用户基本组(为什么会是基本组呢?我们下面解释!)ID号码。
-
5.用户全名或说明,可以为空,方便识别与管理而已。
-
6.用户主目录路径。
-
7.用户所用shell。
/etc/group 文件结构
首先,我们还是 cat 一下,来看看此文件中都有什么。
#cat /etc/group
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
adm:x:4:
tty:x:5:
disk:x:6:
lp:x:7:
mem:x:8:
kmem:x:9:
wheel:x:10:zhangdeng
cdrom:x:11:
mail:x:12:postfix
man:x:15:
......(此处省略)
可以看出,这个文件同 /etc/passwd 事一样的格式,不过其只有四个分段,那么我来解释一下每个分段代表的含义:
-
1.用户组名称(每一行记录一个用户组)。
-
2.用户组密码:同 /etc/passwd 一样原因,密码被移至 /etc/gpasswd,此处用 x 代替。当用户切换没有添加自己的用户组时需要输入用户组密码,管理员可以设置用户组管理员对当前组进行管理。
-
3.GID,我们 /etc/passwd 第4字段的GID号码对应的组名称就是从此处而来的啦。
-
4.该用户组成员,多个成员 ' , ' 隔开。
/etc/shadow 文件结构
还是先来看看这个文件的内容:
#cat /etc/shadow
root:$6$cJ9qgQmt$NcHYa2uYOXMcE8JlkTxCLjWLbem6NuKPYEu3OunUzkCNP0otsQBqHBi.8IoR.ENkzTTWWIUu4ywoOnizXJ5tY0:17095:0:99999:7:::
bin:*:17095:0:99999:7:::
daemon:*:17095:0:99999:7:::
adm:*:17095:0:99999:7:::
lp:*:17095:0:99999:7:::
sync:*:17095:0:99999:7:::
shutdown:*:17095:0:99999:7:::
halt:*:17095:0:99999:7:::
mail:*:17095:0:99999:7:::
operator:*:17095:0:99999:7:::
games:*:17095:0:99999:7:::
ftp:*:17095:0:99999:7:::
nobody:*:17095:0:99999:7:::
......(此处省略)
是的,没错,同样的一行代表一个账户,以:隔开成段。那么我们来看看这个文件每段代表的含义:
- 1.账户名称。
- 2.密码:加密后的字符串,如果有密码位有 ' ! ' 则表示账户被锁定禁止登录,如果是
*
则代表是系统用户无法登录。 - 3.最近一次修改密码的时间,1970年1月1日至此时间天数。
- 4.最小密码修改间隔(相对上次修改密码的天数)。
- 5.最大密码修改间隔(相对上次修改密码的天数)。
- 6.密码过期前警告日期(相对密码有效天数截止时间)。
- 7.密码失效日期(相对密码有效天数截止时间)。
- 8.账户失效日期,自1970年1月1日算起。
- 9.保留字段,留待以后添加功能。
/etc/gshadow 文件结构
既然用户配置文件 /etc/passwd 有对应的 /etc/shadow 文件来记录管理密码信息,那么用户组配置文件有没有对应的密码记录与管理文件呢?当然是有的,它就是 /etc/gshadow,我们也来看看他的文件结构吧!
#cat /etc/gshadow
root:::
bin:::
daemon:::
sys:::
adm:::
tty:::
disk:::
lp:::
mem:::
kmem:::
wheel:::zhangdeng
cdrom:::
mail:::postfix
man:::
dialout:::
floppy:::
......(此处省略)
可以发现这四个文件的结构都是一样的,一行记录一个以 ' : ' 分隔。此文件分了4个段落,其含义为下:
- 1.用户组名。
- 2.密码列,留空为无密码,开头为 ' ! ' 为锁定状态。
- 3.用户组管理员账号。 4.用户组成员(与 /etc/group 成员相同)。
用户管理
介绍完了配置文件,可是我们增删查改用户与用户组总不能去一点一点修改配置文件吧!下面我们看看如何用命令来管理用户与用户组。
useradd新增用户
我们可以通过 useradd 命令快捷的添加用户。
useradd
-
-u 创建时指定用户UID。
-
-g 创建时指定用户GID(初始用户组或叫做基本组)。
-
-G 创建时直接添加其附加组。
-
-m 强制创建用户主目录(一般账号默认值)。
-
-M 强制不创建用户主目录(系统账号默认值)。
-
-c 账号说明,/etc/passwd 第5段内容。
-
-d 指定某个目录为用户主目录,而不使用默认值。
-
-r 创建一个系统账户 UID会依据/etc/login.defs -s 指定用户shell。
-
-e 指定账户失效日期 YYYY-MM-DD,/etc/shadow第8字段。
-
-f 密码失效日期 0为立即失效 -1为永不失效,/etc/shadow第7字段。
useradd创建账号默认属性
useradd 直接创建账号时,系统默认已经为我们配置好了很多的默认值,这些配置存放在 /etc/default/useradd
useradd -D可以调用出其默认值
#useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
/etc/default/useradd
这个文件是useradd创建用户时的基本账户设置默认参数配置文件。
group=100
新建账户的初始用户组使用的 GID 为 100 者。
系统上 GID 为 100 的组为 users 这个用户组,此设置让新建用户默认初始使用组为 users 这个组,但是在 Centos 上面我们创建用户,其默认的初始用户组并非 users 这个用户组,而是与用户名同名的用户组,这是因为针对用户组有两种不同的机制。
私有用户组机制
系统会创建一个与账户同名的用户组作为用户初始用户组,且默认主文件夹权限通常为 700,这种机制会比较有保密性,使用这种机制将不会参考 GROUP=100 这个设置值。代表性发行版有 RHEL、Fedora、Centos 等等
公有用户组机制
就是以 GROUP=100 这个设置值为新用户初始用户组,因此每个账户都属于 users 这个用户组,且默认主文件夹权限通常为 755,这种机制便于用户互相分享文件。代表发行版有 SuSE 等等。
home=/home
用户主目录的基准目录,新建账户的默认主目录将会创建在此目录下。
inactive=-1
/etc/shadow 第7字段,若为 0,则代表立即失效,若为 -1,则代表永不失效,如 30,则代表 30 天后失效。
expire=
/etc/shadow 第8字段,账号失效日期。
shell=/bin/bash
新建用户默认使用的 shell,若是改为 /sbin/nologin 则新建用户默认无法登陆系统。
skel=/etc/skel
用户主目录配置文件参考基准目录,新建用户的配置将会复制此文件夹的数据。
create_mail_spool=yes
创建用户的 mailbox,/var/spool/mail/xxxx。
/etc/login.defs
useradd 创建用户密码参数默认配置文件。
# Please note that the parameters in this configuration file control the
# behavior of the tools from the shadow-utils component. None of these
# tools uses the PAM mechanism, and the utilities that use PAM (such as the
# passwd command) should therefore be configured elsewhere. Refer to
# /etc/pam.d/system-auth for more information.
#
# *REQUIRED*
# Directory where mailboxes reside, _or_ name of file, relative to the
# home directory. If you _do_ define both, MAIL_DIR takes precedence.
# QMAIL_DIR is for Qmail
#
#QMAIL_DIR Maildir
MAIL_DIR /var/spool/mail
#MAIL_FILE .mail
# Password aging controls:
#
# PASS_MAX_DAYS Maximum number of days a password may be used.
# PASS_MIN_DAYS Minimum number of days allowed between password changes.
# PASS_MIN_LEN Minimum acceptable password length.
# PASS_WARN_AGE Number of days warning given before a password expires.
#
PASS_MAX_DAYS 99999
PASS_MIN_DAYS 0
PASS_MIN_LEN 5
PASS_WARN_AGE 7
#
# Min/max values for automatic uid selection in useradd
#
UID_MIN 1000
UID_MAX 60000
# System accounts
SYS_UID_MIN 201
SYS_UID_MAX 999
#
# Min/max values for automatic gid selection in groupadd
#
GID_MIN 1000
GID_MAX 60000
# System accounts
SYS_GID_MIN 201
SYS_GID_MAX 999
#
# If defined, this command is run when removing a user.
# It should remove any at/cron/print jobs etc. owned by
# the user to be removed (passed as the first argument).
#
#USERDEL_CMD /usr/sbin/userdel_local
#
# If useradd should create home directories for users by default
# On RH systems, we do. This option is overridden with the -m flag on
# useradd command line.
#
CREATE_HOME yes
# The permission mask is initialized to this value. If not specified,
# the permission mask will be initialized to 022.
UMASK 077
# This enables userdel to remove user groups if no members exist.
#
USERGROUPS_ENAB yes
# Use SHA512 to encrypt password.
ENCRYPT_METHOD SHA512
其文件中已经详细的说明了各个参数的含义,在这里我在大略的概括一下。
mail_dir /var/spool/mail
用户默认邮箱目录基准目录。
pass_max_days 99999
/etc/shadow 第5段落,最大更改密码间隔。
pass_min_days 0
/etc/shadow 第4段落,最小更改密码间隔。
pass_min_len 5
密码最短字符长度,已被pam模块替代,失去效用。
pass_warn_age 7
/etc/shadow 第6段落,密码过期前警告天数。
uid_min 1000
普通用户最小 ID 小于 1000 的 GID 默认为系统用户保留
uid_max 60000
普通用户最大 ID,用户能使用的最大 GID。
gid_min 1000
普通用户组最小 ID,小于 1000 的 GID 默认为系统用户组保留。
gid_max 60000
普通用户组最大 ID,用户组能使用的最大 GID。
sys_uid_min 201
系统用户最小ID 。
sys_uid_max 999
系统用户组最大 ID,大于999的 ID 默认为普通用户使用 ID
sys_gid_min 201
系统用户组最小 ID 。
sys_gid_max 999
系统用户组最大 ID,大于999的 ID默认为普通用户使用 ID。
create_home yes
在不加 -m 或 -M 时是否主动创建用户主文件夹。
umask 077
用户主文件夹创建的 umask ,因此权限会是 700。
usergroups_enab yes
使用 userdel 删除用户时是否删除其初始用户组。
encrypt_method sha512
密码默认加密使用SHA512 总结:useradd创建用户时参考了 /etc/default、/etc/login.defs、/etc/skel/*,并修改了 /etc/passwd、/etc/shadow、/etc/group、/etc/gshadow
passwd 修改账户密码和属性
使用 useradd 创建账户后,在默认情况下,该账号是暂时被锁定,无法登录系统的,此时就需要 passwd 来进行管理了。
passwd
- --stdin:可接受前一个管道传来的数据,作为密码输入。
- -l:锁定账户,在/etc/shadow 第2字段前面加上 ' ! ' 使密码失效。
- -u:解锁账号,与-l相对应。
- -S:列出密码相关参数,即/etc/shadow文件内大部分内容。
- -n:天数 shadow第4字段,修改密码间隔天数。
- -x:天数 shadow第5字段,距离上次修改密码最大间隔。
- -w:天数 shadow第6字段,密码过期前警告天数。
- -i:天数 shadow第7字段,密码过期时间。
chage 修改账户密码属性
chage
- -l:列出该账户详细密码参数。
- -d:日期 shadow第3字段,最近一次修改密码日期(YYYY-MM-DD)。
- -m:天数 shadow第4字段,最小修改密码间隔。
- -M:天数 shadow第5字段,最大修改密码间隔。
- -W:天数 shadow第6字段,密码过期前警告天数。
- -I:天数 shadow第7字段,密码失效天数。
- -E:日期 shadow第8字段,账户失效日期(YYYY-MM-DD)。
usermod 修改账户密码属性
usermod
- -l:passwd第1字段,修改账户名称。
- -u:passwd第3字段,修改UID。
- -g:passwd第4字段,修改GID。
- -G:group第4字段,修改用户组。
- -a:配合-G,追加而非覆盖。
- -c:passwd第5字段,账户说明信息。
- -d:passwd第6字段,修改用户主文件夹。
- -s:passwd第7字段,修改用户默认shell。
- -f:shadow第7字段,密码失效天数。
- -e:shadow第8字段,账户失效日期。
- -L:锁定账户(加' ! ')。
- -U:解锁账户(去' ! ')。
userdel 删除账户
userdel
不加参数仅仅删除账户。 -r 同时删除主文件夹和 email(/var/spool/mail/xxx)。
用户附加信息查询与修改
finger 查阅用户属性
[root@ZhangSir ~]#finger zhang
Login: zhang Name:
Directory: /home/zhang Shell: /bin/bash
Never logged in.
No mail.
No Plan.
chfn 修改用户附加信息
[root@ZhangSir ~]#chfn
Changing finger information for root.
名称 [root]: root
办公 []: MaGeLinux
办公电话 []: 12580
住宅电话 []: 114
Finger information changed.
chsh 修改默认shell
chsh
- -l :列出当前系统可用shell。
- -s:修改自己的shell。
id 查询uid和gid
[root@ZhangSir ~]#id
uid=0(root) gid=0(root) 组=0(root) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
用户组管理
了解了用户的增删查改后,我们再来看看用户组的管理命令。
groupadd 新建用户组
groupadd
- -g GID :后面接指定的GID,用来直接给予某个GID。
- -r :新建系统用户组,与/etc/login.defs内的GID_MIN有关。
groupmod 修改用户组相关参数
groupmod
- -g :修改用户组GID。
- -n :修改用户组名。
groupdel 删除用户组
groupdel 接上用户组名即可删除用户组,但是组内有成员便无法删除。
gpasswd 用户组管理员功能
gpasswd
不添加参数时,则表示给组设置组密码。
- -A:添加组管理员。
- -M:批量添加组成员,多个成员以 ' , ' 隔开。
- -R:让组密码失效。
- -r:删除组密码。
- -a:添加某位用户到用户组。
- -d:从用户组中删除某位用户。
