Linux 用户和组的管理

Linux 用户和组的管理

本文基于CentOS6 和 CentOS7系统

Linux 属于多用户多任务管理系统,系统上一切皆文件,一切用户或程序首先得获得Linux系统分配的用户,通过用户所具有对文件访问、读取、执行的权限来获取Linux系统上的资源。

用户和组的概念

用户和组在Linux系统体现为用户名、UID和组名、GID,对于Linux系统只识别UID和GID,而用户名和组名是给人看的,便于记忆,有点类似域名和IP吧。也就是说修改了用户名和组名,UID和GID不变并不会影响用户和组所具有的权限,列如我们将UID为500的用户名删除后属主部分将变成UID-rw-r--r--. 1 500 zb10 0 Jul 23 09:47 1.txt,既然通过用户就可以获取系统资源,那我们为什么还需要组呢,都是为了权限分配的方便,比如有一类用户,对某些文件具有相同的读取、删除、修改等权限,若我们一个一个的将这些权限分配给这类用户,用户数量少还可以做到,大批量用户将累惨了。可以创建一个组,然后将这类用加入到组中,然后将权限分配给组,该组的用户将继承组中的权限。

用户和组的关系

一对一
一对多
多对一

一个用户既可以只有一个组(该组为这个用户的私有组), 也可以加入多个组中(其中与用户同名的是用户的基本组,其它为该用户的附加组)。当然一个组中也可以有多个用户,这是创建组的初衷。

用户和组配置文件

文件路径 描述
/etc/passwd 用户及属性信息
/etc/shadow 用户密码及属性信息
/etc/group 组及属性信息
/etc/gshadow 组密码及属性信息
/etc/login.defs 控制新建用户和组的属性
/etc/default/useradd 新建用户默认值
/etc/skel/ 此路径中存放用户家目录的模板文件

/etc/passwd 格式描述

UserName : x : UID : GID : Comment : HomeDir : ShellDir
包含7个字段,下面分别介绍

  • UserName : 用户名
  • x : 密码保留字段,该字段在早期的centos系统中的确是存放加密的密码的,由于安全原因,密码字段以移到/etc/shadow文件中,不过我们可以通过以下方法让其恢复到该字段喔。
[centos6@root app]# tail -n 1 /etc/passwd <=原来格式
user50:x:20004:20004::/home/user50:/bin/bash
[centos6@root app]# pwunconv <=使用pwunconv命令让密码恢复到x字段
user50:x:20004:20004::/home/user50:/bin/bash
[centos6@root app]# tail -n 1 /etc/passwd
user50:$1$CFGgwd3A$tpfBLi8PXu1h2mA34sPt9/:20004:20004::/home/user50:/bin/bash
  • UID : 用户ID,系统真正识别的是ID编号
  • GID : 组ID
  • Comment : 此处一般填写用户全名,当然你想写什么都是允许的,我们可以通过chfn命令添加该字段的详细信息,使用finger命令查看
[centos6@root app]# chfn user50 <=使用chfn添加Comment段内容
Changing finger information for user50.
Name []: user-fifty
Office []: microsoft
Office Phone []: 10086
Home Phone []: 10000

Finger information changed.
[centos6@root app]# finger user50 <=使用finger查看,此命令需自己安装喔
Login: user50 Name: user-fifty
Directory: /home/user50 Shell: /bin/bash
Office: microsoft, x1-0086 Home Phone: x1-0000
Never logged in.
No mail.
No Plan.
  • HomeDir : 家目录完整路径
  • ShellDir : Shell默认路径,默认shell是bash,还有csh, dash, sh, tcsh等,可以通过cat /etc/shells 查看系统所支持的shell,当前使用的shell也可以使用echo $SHELL查看。其中该段可能出现一个特殊的shell nologin,该shell是不需登录的系统用户使用,比如系统服务,要获取系统资源也得分配一个用户,但服务的运行不需要登录。

/etc/shadow 格式描述

UserName : Password : LastChangeDate : MinDays : MaxDays : WarningDays : InactiveDays : ExpireDays :
总共9个字段,最后一个保留未使用

  • UserName : 用户名,该字段与/etc/passwd中的UserName一样
  • Password : 加密密码字段,默认是使用SHA512加密,还有SHA216,MD5等加密算法,不过MD5已被破解,不推荐使用。该加密算法默认值是定义在/etc/login.defs配置文件中,我们可以使用命令authconfig改变加密算法,对新增用户生效
[centos6@root app]# tail -n 3 /etc/login.defs 
ENCRYPT_METHOD SHA512 <=默认是SHA512

MD5_CRYPT_ENAB no
[centos6@root app]# authconfig --passalgo=md5 --update <=改为MD5
[centos6@root app]# tail -n 3 /etc/login.defs
ENCRYPT_METHOD MD5

MD5_CRYPT_ENAB yes
  • LastChangeDate : 最近一次改变密码的日期,该日期是指从1970-01-01日距最近一次修改密码的天数。
  • MinDays : 普通用户两次修改密码的最短间隔天数,对root无效,root权限大,想怎么改都可以。
  • MaxDays : 普通用户两次修改密码的最长间隔天数
  • WarningDays : 距离密码失效日期前多少天提示用户修改密码(失效日期: 1970-01-01 + LastChangeDate + MaxDate)
  • InactiveDays : 密码失效后还宽限多少天让用户可以修改密码,挺民主的,再超过此日期未修改,密码将被锁定。
  • ExpireDate : 账户失效日期,也是距1970-01-01的天数,这与密码失效不同,到期后直接让用户无法登陆

/etc/group 格式描述

GroupName : x : GID : UserList
总共4个字段

  • GroupName : 组名
  • x : 密码保留字段 , 同样,为了安全考虑已将密码移到/etc/gpasswd中,可使用pwunconv 命令将密码恢复到此处
  • GID : 组ID
  • UserList : 该组的用户成员,注意:用户的主组并不在此处,这里是用户的附加组,用户主组定义在/etc/passwd GID字段中

/etc/gshadow 格式描述

GroupName : Password : Adminitrators : UserList
总共4个字段

  • GroupName : 用户名,与/etc/group中的UserName统一
  • Passwrod : 加密的组密码
  • Adminitrators : 组管理成员, 组管理员可不止一个
  • UserList : 该组的组成员,与 /etc/group中的统一

/etc/login.defs

此文件主要用来创建新用户时指定默认用户和组的属性,比如UID,GID的范围,日期,加密算法等
CentOS7.3 系统中/etc/login.defs部分内容

MAIL_DIR        /var/spool/mail
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最小
UID_MAX 60000 <=普通用户UID最大
# System accounts
SYS_UID_MIN 201 <=系统用户UID最小
SYS_UID_MAX 999 <=系统用户UID最大

#
# Min/max values for automatic gid selection in groupadd
#
GID_MIN 1000 <=普通组GID最小
GID_MAX 60000 <=普通组GID最大
# System accounts
SYS_GID_MIN 201 <=系统组GID最小
SYS_GID_MAX 999 <=系统组GID最大
# Use SHA512 to encrypt password.
ENCRYPT_METHOD SHA512 <=密码加密算法

/etc/default/useradd

当我们使用命令useradd USERNAME增加新用户时,发现不指定用户属性,系统仍然可以帮我们创建好家目录,bash等,这些默认值是从哪里来的呢,部分内容就是从/etc/default/useradd这个文件中读取的

下面是CentOS7中定义好的默认值

[centos7@root ~]# cat /etc/default/useradd
# useradd defaults file
GROUP=100 <=创建用户时若指定不创建同名的组,新用户会默认加入此组
HOME=/home <=家目录的父目录
INACTIVE=-1 <=默认密码失效后的宽限期,-1就是不设定
EXPIRE=
SHELL=/bin/bash <=默认shell
SKEL=/etc/skel <=默认创建用户复制模板的路径
CREATE_MAIL_SPOOL=yes <=是否为用户创建邮箱

/etc/skel/

当我们创建用户时,发现系统帮我们创建的家目录下面有几个隐藏文件,这些文件从哪里来的呢。这就是从/etc/skel/路径下复制的

[centos6@root app]# ls -d /home/user50/.[^.]*
/home/user50/.bash_history /home/user50/.gnome2
/home/user50/.bash_logout /home/user50/.mozilla
/home/user50/.bash_profile /home/user50/.Xauthority
/home/user50/.bashrc

用户和组管理命令

用户管理命令

增加用户 useradd
useradd [options] UserName

常用命令选项

-u UID #指定用户UID,不指定则自动生成(已有用户最大UID+1)
-g GID #指定用户基本组,不指定则自动创建一个与UID的ID号相同,名字相同的组
-G group1,group2… #添加用户附加组
-c comment #用户备注信息,此项可通过chfn username 来添加更详细的信息
-d home_dir #家目录完整路径
-b home #用户家目录的父目录
-s shell_dir #shell路径
-f days #密码失效后(超过max_days)还宽限的最后天数
-e YYYY-MM-DD #账户失效日期
-o #加上此项可创建uid相同的账户,不检查uid
-N #不创建和username同名的groupname,使用组users做为其主组
-r 创建系统账号

实例

# 为了演示附属组,我们提前创建几个组,创建组的命令请查看后面的内容
[centos6
@root app]# groupadd group1
[centos6@root app]# groupadd group2
[centos6@root app]# grep group /etc/group
group1
20005:
group220006

[centos6@root app]# useradd -u 3000 -G group1,group2 -c "hello" -f 5 -e 2018-10-10 user1

[centos6@root app]# id user1 <=id命令查看创建好的用户user1的信息
uid=3000(user1) gid=3000(user1) groups=3000(user1),20005(group1),20006(group2)

修改用户密码属性 usermod
当创建好用户后,我们想修改用户属性就用户usermod命令,修改密码使用passwd
usermod [options] UserName

常用选项

-l new_username
-u UID #修改用户ID,ID变了那权限将彻底改变
-g GID #修改基本组
-G user1,user2… 修改用户附加组,配合-a使用为追加附属组,若不配合-a使用,新添加的附属组将覆盖原来的附属组
-c comment #修改备注信息
-d home_dir #修改家目录
-s shell_dir #修改默认shell
-o no unique #不检查UID的唯一性,即可以修改UID与现有用户的UID重复
-e YYYY-MM-DD #用户账号的有效期限
-f #密码失效后到禁用的宽限天数
-m 修改用户家目录时,加上此项则经原家目录中的文件移动到新家目录下

实例

#先创建组group3做备用
[centos6@root app]# groupadd group3

#我们修改user1的附属组,备注信息,家目录路径,shell路径
[centos6@root app]# usermod -G group3 -c "nice" -d /app/user1 -m -s /bin/csh user1
[centos6@root app]# id user1
uid=3000(user1) gid=3000(user1) groups=3000(user1),20007(group3)
[centos6@root app]# grep user1 /etc/passwd
user1:x:3000:3000:nice:/app/user1:/bin/csh

删除用户 userdel
当我们不需要某个用户时就可以用户uerdel命令将此用户从系统中删除
userdel [-r] UserName

-r 删除用户的同时将于该用户有关的文件一起删除,如家目录,邮箱

实例

usrdel -r user1

修改密码及用户密码属性 passwd
passwd [options] UserName

刚创建的新用户,我们为设定密码之前,密码是空的,并且是被锁定的(/etc/shadow密码位置处有两个!!),此时我们可以通过passwd命令为用户添加密码,当然也可以为已有密码用户修改密码,普通用户只能修改自己的密码,root可以修改任何用户的密码

常用选项

-l #锁定用户密码,在/etc/shadow/ 密码字段前加!!
-u #解锁用户密码
-d #清空用户密码,用户将可以在本地无密码登录
-e #将/etc/shadow字段中最后修改密码日期字段清空为0,等同于强制用户下次登录必须修改密码
-n #设定/etc/shadow/ 中MinDays的天数
-x #设定/etc/shadow/ 中MaxDays的天数
-w #设定/etc/shadow/ 中warning_days的天数
-i #设定/etc/shadow/ 中宽限日期的天数
–stdin #标准输入获取密码,可通过管道获取 echo “password” | passwd –stdin

实例

# 我们刚创建好的用户密码栏是被!!锁定的,且密码是空的
[centos6@root app]# grep user1 /etc/shadow
user1:!!:17370:0:99999:7:5:17814:

# 给新用户user1添加密码,使用--stdin选项通过管道获取标准输入
[centos6@root app]# echo "1111" | passwd --stdin user1
Changing password for user user1.
passwd: all authentication tokens updated successfully.
[centos6@root app]# grep user1 /etc/shadow
user1:$1$M7xsQXk8$bJrO6Obc0RiC.0v/P57lD0:17370:0:99999:7:5:17814:

# 锁定用户,可以看到在密码前加了!!
[centos6@root app]# passwd -l user1
Locking password for user user1.
passwd: Success
[centos6@root app]# grep user1 /etc/shadow
user1:!!$1$M7xsQXk8$bJrO6Obc0RiC.0v/P57lD0:17370:0:99999:7:5:17814:

# 解锁密码
[centos6@root app]# passwd -u user1
Unlocking password for user user1.
passwd: Success
[centos6@root app]# grep user1 /etc/shadow
user1:$1$M7xsQXk8$bJrO6Obc0RiC.0v/P57lD0:17370:0:99999:7:5:17814:

#清空密码,此时用户user1就可以无密码在虚拟终端上登录系统
[centos6@root app]# passwd -d user1
Removing password for user user1.
passwd: Success
[centos6@root app]# grep user1 /etc/shadow
user1::17370:0:99999:7:5:17814:

另外一个修改用户密码属性(/etc/shadow)的命令是chage
chage [options] [username]

passwd虽然能修改用户密码属性某些字段的值,但对密码最短、最长日期却改不了,此时我们就可以用chage命令了

常用选项

-d last_change_passwd_date
-m min_days
-M max_days
-W warning_days
-I inactivity_days
-E expire_date
-l 列出上面各修改字段的详细信息

实例

[centos7@root ~]# grep user100 /etc/shadow
user100:!!:17368:0:99999:7::: <=修改前
[centos7@root ~]# chage -m 3 -M 22 -W 5 user100
[centos7@root ~]# grep user100 /etc/shadow
user100:!!:17368:3:22:5::: <=修改后

切换用户 su
当我们登录系统后,需要在登录状态下切换身份,就可以使用su

  • su UserName 不完全切换
    此时切换用户身份时,不执行配置文件,即切换后用户的环境仍然不变,所在路径都不改变
  • su -[l] UserName 完全切换
  • su [-][l] UserName -c “command” 切换身份执行命令

root 切换用户时不需输入密码,普通用户切换时需输入密码

实例

#当前用户时root,我们切换为user1的身份创建一个空文件
[centos6@root app]# su user1 -c "touch file1"
[centos6@root app]# ll file1
-rw-rw-r--. 1 user1 user1 0 Jul 23 15:47 file1 <=可以看到属主,属组是user1

组管理命令

添加组 groupadd
groupadd [options] GroupName

前面已经提到为了权限的集中分配,我们创建了组,然后将权限分配给组,该组所有用户将继承组所具有的权限,创建组使用groupadd命令

常用选项

-g GID #指定组ID,默认为已有组的最大ID+1
-r system_group #创建系统用组
-o 可创建重复GID #不建议这样做,GID是组的唯一标识

实例

# 创建组group5 组ID指定为1600
[centos7@root ~]# groupadd -g 1600 group5

#此时/etc/group 和 /etc/gshadow中将添加了group5的信息
[centos7@root ~]# grep group5 /etc/{group,gshadow}
/etc/group:group5:x:1600:
/etc/gshadow:group5:!::

组属性修改 groupmod
groupmod [options] GroupName

常用选项

-n 修改组名
-g 修改组ID

实例

# 将组名group5修改为grp5
groupmod -n grp5 group5

删除组 groupdel
groupdel GroupName

组不需要的时候就可以将其删除,但若该组是某个用户的基本组,而这个用户还存在时时无法删除该组的喔

实例

# 删除上面所创建的组grp5
groupdel grp5

组密码修改 gpasswd
gpasswd [otions] GroupName

组密码主要是用来让用户切换基本组时使用, 可以使用gpasswd来设定组密码,gpasswd不仅可以设定组密码,还可以添加和删除组成员, 这里指的组时用户的附属组

常用选项

-a user 将用户添加到组中
-d user 将用户从组中删除
-A user1,user2… 将用户添加到管理组中(Administrators)

实例

[centos7@root ~]# grep grp5 /etc/{group,gshadow}
/etc/group:grp5:x:1600:
/etc/gshadow:grp5:!::

# 将用户user1加入到组grp5中
[centos7@root ~]# gpasswd -a user1 grp5
Adding user user1 to group grp5
[centos7@root ~]# grep grp5 /etc/{group,gshadow}
/etc/group:grp5:x:1600:user1
/etc/gshadow:grp5:!::user1

# 将用户user1从组grp5中移除
[centos7@root ~]# gpasswd -d user1 grp5
Removing user user1 from group grp5
[centos7@root ~]# grep grp5 /etc/{group,gshadow}
/etc/group:grp5:x:1600:
/etc/gshadow:grp5:!::

# 将用户user1定义为组grp5的组管理员
[centos7@root ~]# gpasswd -A user1 grp5
[centos7@root ~]# grep grp5 /etc/{group,gshadow}
/etc/group:grp5:x:1600:
/etc/gshadow:grp5:!:user1:

添加和删除组成员除了gpasswd外,还可以使用与其功能类型的另外一个命令groupmems,此处就不再介绍