Linux用户与用户组管理技术

GO

这部分知识在日常工作中用的并不多,但是这些都是属于基础知识,也必须要掌握。

1. 认识 /etc/passwd 和 /etc/shadow

这两个文件是Linux系统中最重要的文件之一。注意,Linux系统关于像这两个与用户和组有关的文件,都会在相应的目录下面自动备份成相应的名字后面加-,如:passwd-

- /etc/passwd 解说

每个用户都有自己的一行配置。查看该文件的内容:

1
2
3
4
5
6
7
8
9
10
11
# cat /etc/passwd | head
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

由内容可知,/etc/passwd 由”:”分割成7个字段,每个字段的具体含义如下:

字段 含义
1 用户名
2 账号的口令标识
3 用户标识号,UID(0-4294967294=2^32-2)
4 组标识号,GID
5 注释说明
6 家目录
7 可用shell

说明:

  1. 用户名可以是大小写字母、数字、减号(不能出现在首位)、点或下划线,其它字符不合法。虽然用户名中可以出现点,但不建议使用,尤其是首位。另外,减号也不建议使用,容易造成混淆。
  2. 口令标识在该文件里是一个x。早期的Unix系统口令确实存放在这里,但基于安全因素,后来就将其存放在 /etc/shadow 中了,这里只用了一个x代替。
  3. 系统是通过UID来识别用户身份的。root的UID为0,如果我们创建一个用户user,并把其UID设置为0,则user和root会被系统视为同一个用户。UID的取值范围是0~65535(但实际上已经可以支持到4294967294)。CentOS 7 的普通用户标识号从1000开始。
  4. 组标识号的这个字段对应着 /etc/group 中的一条记录,其是 /etc/group 和 /etc/passwd 基本类似。
  5. 注释说明没有实际意义,只是用来备注一些关于该用户的信息,例如电话、地址等。
  6. 家目录的字段,就是说当用户登陆系统后所处的就是他自己的家目录。可以修改该字段,来自定义家目录。
  7. 允许用户登陆的shell就是在此字段来设置的。例如,/sbin/nologin 表示不允许用户登陆。这个字段的默认值是 /bin/bash

- /etc/shadow 解说

查看该文件的内容:

1
2
3
4
5
6
7
8
9
10
11
# cat /etc/shadow | head
root:$6$SlsvE2F09ZCOaE2x$I71HiFKIJ1V349nJus7X8qYfryfXz9hWPcnkEHK1g88X9aXANQV2WjPXatvPcXWH4qTmcfh19.YrSEUJjWhw8/::0:99999:7:::
bin:*:17110:0:99999:7:::
daemon:*:17110:0:99999:7:::
adm:*:17110:0:99999:7:::
lp:*:17110:0:99999:7:::
sync:*:17110:0:99999:7:::
shutdown:*:17110:0:99999:7:::
halt:*:17110:0:99999:7:::
mail:*:17110:0:99999:7:::
operator:*:17110:0:99999:7:::

由内容可知,/etc/shadow 由”:”分割成9个字段,每个字段的具体含义如下:

字段 含义
1 用户名,与/etc/passwd对应
2 用户的真正的密码。这个密码已经加密。
3 上次更改密码的时间戳。这个数字以1970.1.1和上次更改密码的日期为基准计算而来。
4 表示要过多少天才可以更改密码,默认0,表示不受限制
5 表示密码多少天后到期,即在多少天内必须更改密码。例如,这里设置成30,则30天内必须要更改一次密码;否则,将不能登陆系统。默认99999,可以理解为永远不需要改
6 表示密码到期前的警告期限。若这个值设置为7,则表示当7天后密码过期时,系统就发出警告,提醒用户他的密码将在7天后过期
7 表示账号的失效期限。如果这个值设置为3,则表示密码已经到期,然而用户并没有在密码到期前修改密码,那么再过3天,这个账号便失效,即锁定
8 表示该账号的生命周期。和第3个字段一样,这个周期是按距离1970.1.1多少天换算的。它的含义是,账号在这个日期前可以使用,到期后账号将作废。
9 作为保留用的,没有什么意义

说明:

  1. 密码,默认用SHA-512加密过的,且不可逆解密
    • $1 : MD5加密
    • $5 : SHA-256加密
    • $6 : SHA-512加密
    • !! : 表示用户未设置密码
      • : 表示用户被锁定

2. 用户和用户组管理

下面的命令是用来创建、删除用户和组的,以及更改其属性的。

- groupadd

groupadd 用来创建用户组

格式 groupadd [-g GID] groupname

相关的配置文件为 /etc/group 和 /etc/gshadow

示例如下:

1
2
3
# groupadd greptest1
# tail -1 /etc/group
greptest1:x:1008:

如果不加-g选项,则按照系统默认的GID创建组。跟UID一样,GID也是从1000开始的。我们也可以按如下操作自定义GID:

1
2
3
4
# groupadd -g 1010 grouptest2
# tail -2 /etc/group
greptest1:x:1008:
grouptest2:x:1010:

- groupdel

groupdel 用来删除用户组

格式 groupdel groupname

示例如下:

1
2
3
4
# groupdel grouptest2
# tail -2 /etc/group
mysql:x:1007:
greptest1:x:1008:

命令groupdel没有特殊选项,但有一种情况不能删除组,如下所示:

1
2
# groupdel user1
groupdel:不能移除用户“user1”的主组

上例中,user1组中包含user1用户,只有在该组中移除了user1用户后才可以删除该组。

- useradd

useradd 用来添加用户。

格式 useradd [-u UID] [-g GID] [-d HOME] [-M] [-s] username

相关的配置文件为 /etc/passwd 和 /etc/shadow

选项 意义
-u 自定义UID
-g 使新用户属于已经存在的某个组,后面可以跟GID,也可以跟组名
-G 该选项可跟多个组名,为用户指定多个扩展组
-d 自定义用户的家目录
-M 表示不建立家目录
-s 自定义Shell

说明:

  • 如果useradd不加任何选项,直接跟用户名,则会创建一个跟用户名相同的组。
  • 如果 -g 选项后面跟一个不存在的GID,则会报错,提示该组不存在。
  • 加上 -M 选项后,则不建立用户家目录,但在/etc/passwd文件中仍然有这个字段,所以它的作用只是不创建那个目录。但是我们可以在之后为其创建家目录,并将其属主和属组的属性改为该用户:chmod -R user:user /home/user/;创建家目录后,还需要把相关的默认配置文件拷贝过去: cp -v /etc/skel/.b* /home/username 即可)

- userdel

userdel 用于删除用户。

格式 userdel [-r] username

说明:

  • 选项-r的作用是,当删除用户时,一并删除该用户的家目录和邮件目录。

- usermod

usermod 用于修改用户的属性

格式 usermod 选项 用户名

常用选项 含义
-s Shell类型 修改用户的Shell类型
-d 家目录绝对路径 修改用户家目录(只修改配置文件,并没有为其创建新的家目录)
-u UID 修改用户的UID
-g GID 为用户修改主组
-G 附加组名 为用户添加附加组
-L 锁定用户的账号
-U 解锁用户

- id

id 用户名 用来查看用户的UID和GID

- chfn

chfn 用于修改用户的finger,即/etc/passwd文件中第五个字段所显示的信息。这个命令在工作中几乎用不到。

格式 chfn username

3. 用户密码管理

密码对于一个用户来说是非常的关键,而密码管理也是系统管理员的一项非常重要的任务。

- 密码设置的规则

创建用户后,默认是没有设置密码的,只有设置好密码后,才可以登陆系统。为了安全,在为用户创建密码时,应该遵循一些密码设置的规则,这些规则是为了密码的安全性而考虑的。

  • 长度大于10个字符
  • 密码中包含大小写字母、数字以及特殊字符等
  • 不规则性(即不要出现常用的单词、类似于123456这样的密码等)
  • 密码中不要带有名字、电话、生日等信息

- passwd

passwd 用于设置密码。

格式 passwd [username]

说明:

  • passwd后面不加用户名,则为自己设置密码
  • passwd后面加上用户名,则为该用户设置密码(以root身份)
  • 注意:只有root才可以修改其他用户的密码,普通用户只能修改自己的密码
  • passwd --stdin username 即可实现只输入一次密码就更改成功的效果(这在脚本中经常使用)
  • echo "密码字符串" | passwd --stdin username 即可实现将用户的密码直接设置为密码字符串
  • echo -e "密码字符串第一遍\n密码字符串第二遍\n" | passwd username 也可实现上面的功能

- mkpasswd

mkpasswd 用于生成密码。

若是Linux没有这个命令,则需要安装一下expect: yum install -y expect

常用选项 选项说明
-l 数字 指定生成密码的长度
-s 数字 指定特殊字符的个数
-d 数字 指定数字的个数

4. 用户身份切换

- 查看当前用户

  • who am i 用于查看当前登陆的用户身份、登陆终端、登陆时间和来源IP
  • whoami 用于查看当前登陆的用户的名字
  • w 用于查看当前登陆系统的用户的详细信息

- su

su 用于切换用户身份。

格式 su [-] [username]

说明:

  • su 的后面可以跟-,也可以不跟。加上-,即表示完整切换用户身份,即环境变量也切换过来
  • 普通用户的su命令不加username,表示切换到root身份,需要输入root的密码才能成功切换
  • root用此命令切换身份时,不需要输入该用户的密码
  • su -c "命令" 用户名 用该用户的身份执行命令(这在以后写脚本的时候会用到)

- sudo

sudo 用于使用root身份执行一条命令。

  • 用su可以切换用户身份,而且每个普通用户都能切换到root身份。如果某个用户不小心泄露了root的密码,那岂不是系统非常不安全?为了改进这个问题,Linux系统工程师设计了sudo这个命令。
  • 使用sudo命令执行一个只有root才能执行的命令是可以办到的,但是需要输入密码。这个密码并不是root的密码,而是用户自己的密码。默认情况下,只有root用户能使用sudo命令,普通用户想要使用sudo,是需要root预先设定的。
  • 可以使用visudo命令编辑相关的配置文件/etc/sudoers。如果没有visudo这个命令,则需安装yum install -y sudo

默认root支持sudo,是因为在配置文件/etc/sudoers中有一行 root ALL=(ALL) ALL。在改行下面添加一行 test ALL=(ALL) ALL,就可以让test用户拥有使用sudo的特权。这行配置的含义如下:

段数 含义
第一段 用户名,指定让哪个用户有sudo特权
第二段 ALL=(ALL),左边的ALL指的是所有的主机,右边的ALL指的是获取哪个用户的身份。第二段几乎都不用配置
第三段 设定可以使用sudo执行的命令有哪些

一个例子:

1
aming ALL=(root) NOPASSWD: /bin/ls, /bin/su

上面例子的意思是:不允许aming用户修改root的密码,且切换root用户时不需要输入root密码)

如果每增加一个用户就设置一行,这样太麻烦了,所以可以这样设置:把#wheel ALL=(ALL) ALL前面的#去掉,让这一行生效。它的意思是,wheel这个组的所有用户都拥有了使用sudo的权利。接下来,只要把需要设置sudo权限的用户加入到wheel这个组中即可。

- 关于sudo命令的一个很实用的案例

需求:只允许使用普通账户登陆,并且普通用户登陆后,可以不用输入密码就能用sudo切换到root身份。

实现方法:

1
2
3
4
5
6
7
# visudo
然后在文件的最后加入如下三行:
User_Alias USER_SU = test,test1,aming
Cmnd_Alias SU = /usr/bin/su
USER_SU ALL=(ALL) NOPASSWD:SU

说明:

  • 第一行设置了一个user的别名,USER_SU相当于test、test1和aming三个用户。可以写多个用户
  • 第二行设定了一个命令别名,SU相当于/usr/bin/su,可以写多个命令
  • 第三行就是类似于 root ALL=(ALL) ALL 这条配置语句。其中NOPASSWD的意思是:普通用户使用sudo时,不需要输入自己的密码

注意:这种配置方法有一个问题,就是普通用户可以使用su -命令切换到root账户,然后他可以再修改root的密码就能直接登陆root了。还有一个更好的办法,那就是下面的”不允许root远程登陆Linux”

- 不允许root远程登陆Linux

/etc/ssh/sshd_config 为sshd服务的配置文件,默认允许root用户通过ssh远程登陆Linux。要想不允许root用户远程登陆Linux,具体的操作方法为:

  1. 修改配置文件/etc/ssh/sshd_config
  2. 在配置文件中查找 #PermitRootLogin yes 并把它修改为 PermitRootLogin no
  3. 保存配置文件后,需要重启sshd服务:systemctl restart sshd.service

注意:这个方法只适用于通过ssh远程登陆Linux的情况。

补充一个小知识:/etc/ssh/sshd_config( 为 sshd 服务的配置文件)中,将#UseDNS yes 改成 UseDNS no ,即可实现在远程登陆时的等待问题。

OK

0%