GO
这部分知识在日常工作中用的并不多,但是这些都是属于基础知识,也必须要掌握。
1. 认识 /etc/passwd 和 /etc/shadow
这两个文件是Linux系统中最重要的文件之一。注意,Linux系统关于像这两个与用户和组有关的文件,都会在相应的目录下面自动备份成相应的名字后面加-,如:passwd-
- /etc/passwd 解说
每个用户都有自己的一行配置。查看该文件的内容:
由内容可知,/etc/passwd 由”:”分割成7个字段,每个字段的具体含义如下:
字段 | 含义 |
---|---|
1 | 用户名 |
2 | 账号的口令标识 |
3 | 用户标识号,UID(0-4294967294=2^32-2) |
4 | 组标识号,GID |
5 | 注释说明 |
6 | 家目录 |
7 | 可用shell |
说明:
- 用户名可以是大小写字母、数字、减号(不能出现在首位)、点或下划线,其它字符不合法。虽然用户名中可以出现点,但不建议使用,尤其是首位。另外,减号也不建议使用,容易造成混淆。
- 口令标识在该文件里是一个x。早期的Unix系统口令确实存放在这里,但基于安全因素,后来就将其存放在 /etc/shadow 中了,这里只用了一个x代替。
- 系统是通过UID来识别用户身份的。root的UID为0,如果我们创建一个用户user,并把其UID设置为0,则user和root会被系统视为同一个用户。UID的取值范围是0~65535(但实际上已经可以支持到4294967294)。CentOS 7 的普通用户标识号从1000开始。
- 组标识号的这个字段对应着 /etc/group 中的一条记录,其是 /etc/group 和 /etc/passwd 基本类似。
- 注释说明没有实际意义,只是用来备注一些关于该用户的信息,例如电话、地址等。
- 家目录的字段,就是说当用户登陆系统后所处的就是他自己的家目录。可以修改该字段,来自定义家目录。
- 允许用户登陆的shell就是在此字段来设置的。例如,/sbin/nologin 表示不允许用户登陆。这个字段的默认值是 /bin/bash
- /etc/shadow 解说
查看该文件的内容:
由内容可知,/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 | 作为保留用的,没有什么意义 |
说明:
- 密码,默认用SHA-512加密过的,且不可逆解密
- $1 : MD5加密
- $5 : SHA-256加密
- $6 : SHA-512加密
- !! : 表示用户未设置密码
- : 表示用户被锁定
2. 用户和用户组管理
下面的命令是用来创建、删除用户和组的,以及更改其属性的。
- groupadd
groupadd 用来创建用户组
格式 groupadd [-g GID] groupname
相关的配置文件为 /etc/group 和 /etc/gshadow
示例如下:
如果不加-g选项,则按照系统默认的GID创建组。跟UID一样,GID也是从1000开始的。我们也可以按如下操作自定义GID:
- groupdel
groupdel 用来删除用户组
格式 groupdel groupname
示例如下:
命令groupdel没有特殊选项,但有一种情况不能删除组,如下所示:
上例中,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
用于查看当前登陆的用户身份、登陆终端、登陆时间和来源IPwhoami
用于查看当前登陆的用户的名字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执行的命令有哪些 |
一个例子:
上面例子的意思是:不允许aming用户修改root的密码,且切换root用户时不需要输入root密码)
如果每增加一个用户就设置一行,这样太麻烦了,所以可以这样设置:把#wheel ALL=(ALL) ALL
前面的#去掉,让这一行生效。它的意思是,wheel这个组的所有用户都拥有了使用sudo的权利。接下来,只要把需要设置sudo权限的用户加入到wheel这个组中即可。
- 关于sudo命令的一个很实用的案例
需求:只允许使用普通账户登陆,并且普通用户登陆后,可以不用输入密码就能用sudo切换到root身份。
实现方法:
说明:
- 第一行设置了一个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,具体的操作方法为:
- 修改配置文件/etc/ssh/sshd_config
- 在配置文件中查找
#PermitRootLogin yes
并把它修改为PermitRootLogin no
- 保存配置文件后,需要重启sshd服务:
systemctl restart sshd.service
注意:这个方法只适用于通过ssh远程登陆Linux的情况。
补充一个小知识:/etc/ssh/sshd_config( 为 sshd 服务的配置文件)中,将#UseDNS yes
改成 UseDNS no
,即可实现在远程登陆时的等待问题。
OK