用户身份与权限-用户的管理

文章目录[x]
  1. 0.1:useradd命令
  2. 0.2:groupadd 命令
  3. 0.3:usermod 命令
  4. 0.4:passwd 命令

Linux系统为了实现多用户同时工作,必须要有一套非常安全完善的用户权限规则。Linux中root用户是系统的神,root“超级管理员”几乎不受系统的任何制约,但所谓“with great power comes great responsiblity”。在实际生产环境中使用普通用户操作更加安全,在Linux的安全规则下,可以减少出现风险的可能。Linux中使用sudo命令第一次调用最高权限时,会出现以下提示:

We trust you have received the usual lecture from the local System Administrator. 
It usually boils down to these three things:
		
		
#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.
		
我们信任您已经从系统管理员那里了解了日常注意事项。
总结起来无外乎这三点:
		
		
 #1) 尊重别人的隐私。
 #2) 输入前要先考虑(后果和风险)。
 #3) 权力越大,责任越大。

所以我们使用root权限进行操作时需要更加认真才可以。
但是root是系统管理员不是因为他的用户名是root,用户的身份划分是根据UID(User IDentification)来规定的。他就像是用户的身份证号码,具有唯一标识性

Linux中有三种用户身份:
	1.管理员:root                           UID:0
	2.系统用户/伪用户/虚拟用户                UID:1~999
					                         RHEL5/6中为:1~499
	3.普通用户                               UID:1000~∞
					                         RHEL5/6中为:1000~65535  (65535为2字节可以计数的最大数字)

默认情况下,新的普通用户UID从1000开始计数。Linux中还规定了组的概念,每个用户创建出来时就加入了一个以自己用户名命名的组,称为“基本组”,这就像是人的出生就加入了自己的家一样。同时我们也可以让用户加入基本组以外的组,称为拓展组,这就像人长大之后加入公司,团体一样。基本组每个用户只能加入一个,扩展组可以加入多个。使用组,管理员就可以批量划定用户的权限以及任务

useradd命令

useradd命令
用于:创建新用户 格式:useradd [参数] 用户名
adduser与useradd命令相同,adduser为useradd的软连接

 	-D :default,查看useradd默认参数,可更改默认参数:-e,-f,-g,-b,-s
	-d :home dir,指定家目录
	-b :base dir,指定基目录
	-u :指定UID,这个UID必须唯一
	-o :no unique,允许使用重复UID创建用户,这个选项必须和-u同时使用
	-g :指定一个已经存在的组作为用户基本组
	-G :指定一个或多个已存在的组作为拓展组
	-s :指定shell解释器
	-c : 指定“用户描述”
	-e :expiredate,指定账户期限(YY-mm-dd)
	-f :inactive,指定过期天数,指密码到期后彻底禁用用户的天数
	-m :creat home,临时开关,若(指定的)家目录不存在,则创建家目录,优于/etc/login.defs的变量
	-M :no creat home,临时开关,不创建家目录,优于/etc/login.defs的变量
	-U :usergroup,临时开关,创建与用户同名的基本组,优于/etc/login.defs的变量
	-N :no user group,临时开关,不创建与用户同名的基本组,优于/etc/login.defs的变量
	-k : skel,指定骨架目录,只在与-m一起使用时生效,默认值为/etc/skel/
	-r : system,创建系统用户,useradd不会为系统用户创建家目录,除非使用-m选项
	-p :password,指定密码,这个密码必须是符合Linux当前加密规则的密文

使用-D参数查看useradd默认值

[root@Aki ~]# useradd -D
GROUP=100                  如果使用-N或者login.defs文件创建基本组的开关没有打开,将把新用户加入到这个GID的组中,默认GID100,users组
HOME=/home                 默认基目录
INACTIVE=-1                默认过期天数,默认不使用
EXPIRE=                    默认账户期限,默认不设定
SHELL=/bin/bash            默认shell
SKEL=/etc/skel             默认骨架目录
CREATE_MAIL_SPOOL=yes      是否创建邮箱文件,默认创建

使用-D参数修改过期天数

[root@Aki ~]# useradd -D -f 0
[root@Aki ~]# useradd -D
GROUP=100
HOME=/home
INACTIVE=0
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes

过期天数变量 INACTIVE,默认-1表示不启用,0表示密码过期后立即停用

创建Aki用户

[root@Aki ~]# useradd Aki
[root@Aki ~]# tail -n 5 /etc/passwd
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
leaves:x:1000:1000:Leaves:/home/leaves:/bin/bash
zzy:x:1001:1001::/zzy:/bin/bash
Aki:x:1002:1002::/home/Aki:/bin/bash

用户的基础信息存放在/etc/passwd文件中
用户名:密码占位符:UID:GID:用户描述:用户家目录:用户使用的shell解释器
passwd文件任何人都可以查看,所以密码位使用占位符x代替,密码信息存放在另一个权限等级更高的文件中:/etc/shadow

[root@Aki ~]# tail -n 5 /etc/shadow
postfix:!!:18167::::::
sshd:!!:18167::::::
tcpdump:!!:18167::::::
leaves:$6$RaYqjtOo$3QHT73D9zFvIh/T1SKVkHqlZykU5I5IN6v1SqA26OqUTkwdJ9rJpYQPzmgwFPUasJKB7uPxvmX5esddwWXZjs/:18234:0:99999:7:::
zzy:!!:18288:0:99999:7:::

shadow,影子文件只有root管理员用户有权限进行读写,其他用户没有任何操作权限
用户名:加密密码:最后一次密码修改时间:最小修改间隔:密码有效期:密码需要变更前的警告天数:密码失效后的过期天数:账号失效时间:保留字段

有关shadow文件
密码域特殊字符:

If the password field contains some string that is not a valid result of crypt(3), for instance ! or *, the user will not be able to use a unix password to log in (but the user may log in the system by other means).
		
This field may be empty, in which case no passwords are required to authenticate as the specified login name. However, some applications which read the /etc/shadow file may decide not to permit any access at all if the password field is empty.
		
A password field which starts with a exclamation mark means that the password is locked. The remaining characters on the line represent the password field before the password was locked.
——man 5 shadow

密码为“!!”表示用户从未设置过密码,无法通过密码进行登录
密码为空表示没有密码,不需要进行密码验证即可登录,但是可能被某些程序禁止登入
密码开头为“!”表示密码被锁定
密码中如果出现不属于加密结果的字符,则无法使用密码登录(以此来进行攻击,修改shadow文件,使用户无法登录)

密码组成与生成:

SYNOPSIS
	#define _XOPEN_SOURCE       /* See feature_test_macros(7) */
	#include 
		
	char *crypt(const char *key, const char *salt);
		
NOTES
	Glibc notes
		The glibc2 version of this function supports additional encryption algorithms.
		
		If salt is a character string starting with the characters "$id$" followed by a string terminated by "$":
		
		$id$salt$encrypted
		
		then instead of using the DES machine, id identifies the encryption method used and this then determines how the rest of the password string is interpreted.  The following values of id are supported:
		
		      ID  | Method
		      ─────────────────────────────────────────────────────────
		      	1   | MD5
		      2a  | Blowfish (not in mainline glibc; added in some
		          | Linux distributions)
		      5   | SHA-256 (since glibc 2.7)
		      6   | SHA-512 (since glibc 2.7)
		
		So $5$salt$encrypted is an SHA-256 encoded password and $6$salt$encrypted is an SHA-512 encoded one.
		
		"salt"  stands  for  the  up  to  16 characters following "$id$" in the salt.  The encrypted part of the password string is the actual computed password.  The size of this string is fixed:
		
		 	MD5     | 22 characters
		SHA-256 | 43 characters
		SHA-512 | 86 characters
		
	The characters in "salt" and "encrypted" are drawn from the set [a–zA–Z0–9./].  In the MD5 and SHA implementations the entire key is significant (instead of only the first 8 bytes in DES).
		
	——man 3 crypt

密码位由三个“$”进行区域划分。id位记录了使用的加密方法。生成的salt被记录在第二位中,以便下次计算加密结果使用。加密结果在第三位中,不同的加密方法会取不同的结果位数,salt最多有16位
查看passwd.c源码可以发现,加密部分是由明文密码+salt得到的,使用了crypt()库函数。salt是由crypt_make_salt函数进行生成的,是一个长度固定的随机字符串。每次进行密码更改时会重新生成salt,用户进行登陆时会取出shadow文件中的salt重新进行加密计算比对计算结果。
salt并没有提高运算的难度,但是它提高了Linux的安全性:
1.进行密码爆破时,如果没有salt,黑客可以提前进行字典加密运算,比对密码结果。但是由于salt,必须一个个进行加盐加密运算,大大提高爆破工作量。
2.如果出现重复密码,有salt就会得出不同的hash值,密码相同从而连带暴露的可能性很小,并且如果为新用户统一设置初始密码,也不可以从sahdow文件中看出谁还在使用初始默认密码,提高了安全性。

最后一次密码修改时间:这是从1970-1-1来开始计算的天数值,使用date -d可以计算得出具体时间

[root@Aki ~]# date -d "1970-1-1 18234 days"
Wed Dec  4 00:00:00 CST 2019

最小修改间隔:密码修改过后多久不能再修改密码,单位为天,0为随时都可以修改
密码有效期:密码多久内必须修改一次,单位为天,否则用户将进行过期处理
密码需要变更前的警告天数:密码过期的前几天,系统会进行警告提示
缓冲天数:密码过期后,在这几天内还是可以登录系统的,过后则密码失效。0表示立即失效,-1表示永远不会失效
账号失效时间:从1970-1-1计算的天数值,表示,在此时间之外,不论如何,账号都将失效

另外,shadow之所以叫这个名字,因为他的密码是被“投影”下来的。
pwconv 命令:
用于:投影passwd和group中的密码信息到shadow和gshadow文件中
pwconv:开启投影,恢复文件
pwunconv:关闭投影,shadow的密码会放回passwd的密码域,shadow变为shadow-备份文件
恢复shadow-文件后,新的shadow文件权限为400,shadow-文件依然存在,权限为000
在通过修改passwd文件进行添加用户时,使用pwconv进行与shadow文件的同步,否则无法设置密码。
使用pwconv创建shadow文件时,密码修改时间会变。

/etc/login.defs:
shadow的密码套件配置文件是:/etc/login.defs ,里面规定着许多与用户建立和密码配置有关的参数,但是这个文件的参数对root没有制约作用,并且如果有与passwd与shadow文件冲突的参数,以passwd和shadow文件为准(两个密码文件优先级大于login.defs)

#   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                                       密码有效期,-1表示不启用
PASS_MIN_DAYS	0                                           最小修改间隔,-1表示不启用
PASS_MIN_LEN	5                                           密码最小长度,root不受限制                
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

规定了普通用户和系统用户的UID范围

# 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

规定了普通组和系统组的GID范围

# 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

规定了使用useradd创建用户时是否创建家目录

# This enables userdel to remove user groups if no members exist.
#
USERGROUPS_ENAB yes

规定了使用useradd时创建用户时是否创建与用户同名的基本组

# Use SHA512 to encrypt password.
ENCRYPT_METHOD SHA512 

shadow文件中使用的加密方法

useradd实例
使用useradd创建用户

[root@Aki ~]# useradd Aki
[root@Aki ~]# ls -a /home/Aki
.  ..  .bash_logout  .bash_profile  .bashrc  .mozilla

将Aki.sh复制到骨架目录中,家目录中所有原始文件将从骨架目录中复制

[root@Aki ~]# ls -a /etc/skel/
.  ..  Aki.sh  .bash_logout  .bash_profile  .bashrc  .mozilla

使用useradd -b 与 -d 指定基目录和家目录位置

[root@Aki ~]# useradd -b / Aki
[root@Aki ~]# tail -n 1 /etc/passwd
Aki:x:1001:1001::/Aki:/bin/bash
[root@Aki ~]# ls -a /Aki/
.  ..  Aki.sh  .bash_logout  .bash_profile  .bashrc  .mozilla

指定基目录为 / ,创建Aki用户

[root@Aki ~]# useradd -d /Aki Aki
[root@Aki ~]# tail -n 1 /etc/passwd
Aki:x:1001:1001:://Aki:/bin/bash
[root@Aki ~]# ls -a /Aki/
.  ..  Aki.sh  .bash_logout  .bash_profile  .bashrc  .mozilla

指定家目录为/Aki,创建Aki用户

使用-M指定不创建家目录,创建Aki用户

[root@Aki ~]# useradd -M -d /Aki Aki
[root@Aki ~]# ls -a /Aki
ls: cannot access /Aki: No such file or directory
[root@Aki ~]# id Aki
uid=1001(Aki) gid=1001(Aki) groups=1001(Aki)

这时,用户没有家目录,是无法进入图像化界面的,因为没有地方加载用户的个人桌面信息。使用tty登录会出现以下提示

Last login: Wed Feb  5 14:34:19 2020
Could not chdir to home directory /home/zzy: No such file or directory
/usr/bin/xauth:  error in locking authority file /home/zzy/.Xauthority
mkdir: cannot create directory '/home/zzy': Permission denied
-bash-4.2$ 

用户的工作目录被定位到了 / 下,作为一个普通用户,没有家目录,基本没有什么有权限的地方,在系统中只能查看简单的文件,连目录都创建不了……太可怜了(T▽T)

修改login.defs文件,关闭创建家目录开关,创建Aki用户

[root@Aki ~]# vim /etc/login.defs 
[root@Aki ~]# useradd -d /Aki Aki
[root@Aki ~]# ls -a /Aki
ls: cannot access /Aki: No such file or directory
[root@Aki ~]# userdel -rf Aki
[root@Aki ~]# useradd -b / Aki
[root@Aki ~]# ls -a /Aki
ls: cannot access /Aki: No such file or directory

使用-m,在创建家目录开关关闭时指定创建家目录,创建Aki用户

[root@Aki ~]# useradd -m -d /Aki Aki
[root@Aki ~]# ls -a /Aki/
.  ..  Aki.sh  .bash_logout  .bash_profile  .bashrc  .mozilla
[root@Aki ~]# userdel -rf Aki
[root@Aki ~]# useradd -m -b / Aki
[root@Aki ~]# ls -a /Aki/
.  ..  Aki.sh  .bash_logout  .bash_profile  .bashrc  .mozilla

可以看出,指定的目录不同,这是由于useradd创建家目录有一套规则。创建目录时,命令useradd会先去查看是否有-m 与-M 参数,如果有执行参数,不会去查看login.defs文件建立家目录的开关是否打开,这两个参数的优先级大于login.defs文件。
如果创建家目录开关打开,先查看是否使用了-d参数指定了一个家目录位置,如果有则复制所有骨架目录的文件到这个目录创建家目录。如果没有-d,则查看-b是否指定,-b指定则把指定的基目录连接用户名创建家目录,没有指定-b则读取/etc/default/useradd文件中的HOME参数作为基目录。如果HOME参数没有值,则必须指定-b,否则将 / 作为基目录。默认情况不指定-d 与-b ,直接使用useradd文件中参数作为基目录。

[root@Aki ~]# useradd -D
GROUP=100
HOME=
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
[root@Aki ~]# useradd zzy
[root@Aki ~]# tail -n 1 /etc/passwd
zzy:x:1001:1001::/zzy:/bin/bash
[root@Aki ~]# ls /
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  zzy
[root@Aki ~]# [root@Aki ~]# useradd -rou 1000 -s /sbin/nologin -c "zzy love Aki" -mk /root/ -e "2020/7/28" -N Aki
[root@Aki ~]# tail -n 2 /etc/passwd
leaves:x:1000:1000:Leaves:/home/leaves:/bin/bash
Aki:x:1000:100:zzy love Aki:/home/Aki:/sbin/nologin
[root@Aki ~]# tail -n 1 /etc/shadow
Aki:!!:18293::::::
[root@Aki ~]# ls /home/Aki/
Aki.sh  anaconda-ks.cfg  Desktop  Documents  Downloads  initial-setup-ks.cfg  Music  Pictures  Public  Templates  Videos

创建Aki系统用户,指定UID为1000并允许UID重复,不允许登录,用户描述为“zzy love Aki”,指定需要创建家目录,将/root/作为骨架目录,指定账户期限到2020-7-28,不创建与用户名同名的基本组
因为是系统用户,所以没有账户密码到期限制,-e设置失效

userdel 命令
用于:删除指定的用户及与该用户相关的文件 格式:userdel [参数] [用户名]

	-f :force,强制删除用户
	-r :remove,删除用户家目录中的任何文件
[root@Aki ~]# tail -n 3 /etc/passwd
tcpdump:x:72:72::/:/sbin/nologin
leaves:x:1000:1000:Leaves:/home/leaves:/bin/bash
Aki:x:1001:1001::/home/Aki:/bin/bash
[root@Aki ~]# tail -n 3 /etc/group
tcpdump:x:72:
leaves:x:1000:
Aki:x:1001:Aki
[root@Aki ~]# ls /home/
Aki leaves
[root@Aki ~]# ls /var/spool/mail/
Aki leaves root rpc

[root@Aki ~]# userdel Aki
[root@Aki ~]# tail -n 3 /etc/passwd
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
leaves:x:1000:1000:Leaves:/home/leaves:/bin/bash
[root@Aki ~]# tail -n 3 /etc/group
sshd:x:74:
tcpdump:x:72:
leaves:x:1000:
[root@Aki ~]# ls /home/
Aki leaves
[root@Aki ~]# ls /var/spool/mail/
Aki leaves root rpc

[root@Aki ~]# userdel -r Aki
[root@Aki ~]# tail -n 3 /etc/passwd
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
leaves:x:1000:1000:Leaves:/home/leaves:/bin/bash
[root@Aki ~]# tail -n 3 /etc/group
sshd:x:74:
tcpdump:x:72:
leaves:x:1000:
[root@Aki ~]# ls /var/spool/mail/
leaves root rpc
[root@Aki ~]# ls /home/
leaves

userdel 删除的是passwd,shadow,group,gshadow文件中的用户信息,对用户残留下的文件不做修改
userdel -r 除用户信息之外,还删除用户的家目录和邮箱文件
对组进行操作时,会尝试删除与用户同名的组,仅在该组为用户基本组时删除

id 命令
用于:显示有效用户的UID与GID 格式:id [参数] [用户名]

	-g :显示用户的有效GID
	-G :显示用户所有有效组的GID
	-u :显示用户的UID
	-n :name,组合参数,显示名称而不是数字ID
	-r :real,显示真实ID而非有效ID
	-Z :显示用户的SElinux安全环境

显示当前用户的所有ID信息

[root@Aki ~]# id
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

查看某用户的ID信息

[root@Aki ~]# id leaves
uid=1000(leaves) gid=1000(leaves) groups=1000(leaves)

groupadd 命令

groupadd 命令
用于:创建工作组 格式:groupadd [参数] [组]

	-g :指定GID,这个GID必须唯一
	-o :no unique,允许添加非唯一GID,这个选项必须和-g同时使用
	-f :force,强制创建组
	-r :system,创建系统组
	-p :password,指定组密码,这个密码必须是符合Linux当前加密规则的密文

Linux系统中工作组的基本信息存放在/etc/group文件中

[root@Aki ~]# tail -n 1 /etc/group
leaves:x:1000:

组名:密码(占位符x):GID:组用户
GID指的是用户唯一的基本组组用户指的是在该组作为扩展组存在时,组中的用户

group文件任何人皆可阅读内容,为了提高密码的安全性,group文件的密码也进行”投影“,组密码信息存放在/etc/gshadow文件中,只有管理员可以读写,其他人无任何权限

[root@Aki ~]# tail -n 1 /etc/gshadow
leaves:!!::

组名:加密密码:组管理员:组成员

groupadd实例:
使用groupadd -f,创建Aki用户

[root@Aki ~]# groupadd leaves
groupadd: group 'leaves' already exists
[root@Aki ~]# groupadd -f leaves
[root@Aki ~]# tail -n 3 /etc/group
sshd:x:74:
tcpdump:x:72:
leaves:x:1000:leaves

直接创建一个同名已存在的组会报错,使用-f 参数强制创建组不会有错误输出,但是groupadd也不会做出任何操作

[root@Aki ~]# groupadd -g 1000 Aki
groupadd: GID '1000' already exists
[root@Aki ~]# groupadd -fg 1000 Aki
[root@Aki ~]# tail -n 3 /etc/group
tcpdump:x:72:
leaves:x:1000:leaves
Aki:x:1001:

直接创建一个指定GID已存在的组会报错,使用-f 参数强制创建组,groupadd将取GID大于指定值的最小取值创建组

[root@Aki ~]# groupadd -og 1000 Aki
[root@Aki ~]# tail -n 3 /etc/group
tcpdump:x:72:
leaves:x:1000:leaves
Aki:x:1000:
使用-o 参数,可以直接创建任何使用指定GID的组
[root@Aki ~]# groupdel Aki
groupdel: cannot remove the primary group of user 'leaves'

但是删的时候就麻烦了,组的匹配只能匹配到GID和组名(group文件中的属性),Aki组名匹配到两个相同的GID,而leaves组作为leaves用户的基本组(prime group)不能删除,安全起见Aki组也不能删除

[root@Aki ~]# groupadd zzy
[root@Aki ~]# usermod -g zzy leaves
[root@Aki ~]# groupdel Aki 
[root@Aki ~]# tail -n 3 /etc/group
tcpdump:x:72:
leaves:x:1000:
zzy:x:1001:leaves

将leaves的基本组迁移到其他组,即可删除Aki组

删除组使用groupdel 命令,格式:groupdel [组],这个命令没有特殊参数,不加赘述

gpasswd 命令
用于:管理/etc/group,与/etc/gshadow文件 格式:gpasswd[参数][用户]

	-a :add user,添加用户到组,一次一个~
	-d :delete user,删除组中的用户,一次一个~
	-r :remove passwd,删除组密码
	-M :members,设置组成员列表,会覆盖之前的列表
	-A :administrator,设置组管理员列表,会覆盖之前的列表

gpasswd实例:
管理组:

[root@Aki ~]# tail -n 3 /etc/gshadow
leaves:::
Aki:::
zzy:::
[root@Aki ~]# gpasswd -a leaves Aki
[root@Aki ~]# gpasswd Aki
Changing the password for group Aki
New Password: 
Re-enter new password: 
[root@Aki ~]# grep Aki /etc/gshadow
Aki:$6$73sBb/apieuBCTh$Ovn.216YNsQmd6jxQcSFO1vkM5YyxvYfvxXJJyN2QRq6oOJrQZymhqigqK2eHk.rzyxezWYK5MFbx1qnrzRwm.::leaves
[root@Aki ~]# gpasswd -d leaves Aki
Removing user leaves from group Aki
[root@Aki ~]# gpasswd -r Aki
[root@Aki ~]# grep Aki /etc/gshadow
Aki:::

设定组成员列表:

[root@Aki ~]# grep leaves /etc/gshadow
leaves:::Aki,leaves,zzy
[root@Aki ~]# gpasswd -M  root,Aki leaves
[root@Aki ~]# grep leaves /etc/gshadow
leaves:::root,Aki
[root@Aki ~]# gpasswd -A root,Aki -M root,leaves,Aki,zzy leaves
[root@Aki ~]# grep leaves /etc/gshadow
leaves::root,Aki:root,leaves,Aki,zzy

设置列表的方式会覆盖之前的列表,列表中的成员用“,”隔开

usermod 命令

usermod 命令
用于:修改用户的各项设定 格式:usermod [参数][用户名]

<chome,转移家目录,必须与-d一起使用
	-g :强制修改基本组,指定UID/组名必须存在
	-G :新的扩展组列表,原先扩展组列表被覆盖,指定UID/组名必须存在
	-u :修改UID,指定UID必须唯一
	-s :修改用户shell
	-L :lock,锁定账户
	-U :unlock,解锁账户
	-c :修改“用户描述”
	-e :expiredate,修改账户期限
	-f :inactive,修改过期天数

usermod实例:
使用-m与-d修改家目录

[root@Aki ~]# useradd -c "zzy love Aki" Aki
[root@Aki ~]# cat /etc/passwd | grep Aki
Aki:x:1001:1001:zzy love Aki:/home/Aki:/bin/bash
[root@Aki ~]# usermod -d /opt/Aki/ Aki
[root@Aki ~]# cat /etc/passwd | grep Aki
Aki:x:1001:1001:zzy love Aki:/opt/Aki/:/bin/bash
[root@Aki ~]# ls /opt/
rh

可以看出,-d参数只是简单修改了passwd文件中的内容,不会操作家目录

[root@Aki ~]# usermod -md /opt/Aki Aki
[root@Aki ~]# cat /etc/passwd | grep Aki
Aki:x:1001:1001:zzy love Aki:/opt/Aki:/bin/bash
[root@Aki ~]# ls /opt/
Aki  rh
[root@Aki ~]# ls -a /opt/Aki/
.  ..  Aki.sh  .bash_logout  .bash_profile  .bashrc  .mozilla

使用-m参数,会进行passwd文件内容修改和移动家目录

使用-G设置新的拓展组列表

[root@Aki ~]# usermod -G users Aki
[root@Aki ~]# cat /etc/group | grep Aki
users:x:100:Aki
Aki:x:1001:
[root@Aki ~]# id Aki
uid=1001(Aki) gid=1001(Aki) groups=1001(Aki),100(users)
[root@Aki ~]# usermod -G root,leaves,Aki  Aki
[root@Aki ~]# id Aki
uid=1001(Aki) gid=1001(Aki) groups=1001(Aki),0(root),1000(leaves)
[root@Aki ~]# cat /etc/group | grep Aki
root:x:0:Aki
users:x:100:Aki
leaves:x:1000:Aki
Aki:x:1001:Aki

拓展组列表中的组用“,”隔开

[root@Aki ~]# cat /etc/passwd | grep Aki
Aki:x:1001:1001:zzy love Aki:/home/Aki:/bin/bash
[root@Aki ~]# cat /etc/shadow | grep Aki
Aki:!!:18295:0:99999:7:::
[root@Aki ~]# cat /etc/group | grep Aki
Aki:x:1001:
[root@Aki ~]# usermod -c "Aki~" -L -e "2020-7-28" -f 7 -s /sbin/nologin -u 6666 -g leaves -G leaves Aki
[root@Aki ~]# cat /etc/passwd | grep Aki
Aki:x:6666:1000:Aki~:/home/Aki:/sbin/nologin
[root@Aki ~]# cat /etc/shadow | grep Aki
Aki:!!:18295:0:99999:7:7:18471:
[root@Aki ~]# cat /etc/group | grep Aki
leaves:x:1000:Aki
Aki:x:1001:

修改Aki用户的用户描述为“Aki~”,锁定账户,账户期限到“2020-7-28”,过期天数为7天,禁止登陆,指定新的UID为6666,GID为1000,加入leaves组作为拓展组
因为本来没有设置密码,所以账户锁定设置失效

[root@Aki ~]# cat /etc/shadow | grep leaves	leaves:$6$MOVdvJsyxK.6bpKC$tWz8eaaA9cZ8ZhWdFvJjr9CgHayRNSMoY3TjRXVg48DlFBL5qa4s72yHbLLuAPLQIGcSIIFG453eRWhoIEbJA/:18167:0:99999:7:::
[root@Aki ~]# usermod -L leaves 
[root@Aki ~]# cat /etc/shadow | grep leaves
leaves:!$6$MOVdvJsyxK.6bpKC$tWz8eaaA9cZ8ZhWdFvJjr9CgHayRNSMoY3TjRXVg48DlFBL5qa4s72yHbLLuAPLQIGcSIIFG453eRWhoIEbJA/:18167:0:99999:7:::

-L参数锁定账户是在用户密码前加“!”实现的,-U则是删除首位的“!”

passwd 命令

passwd 命令
用于:设置用户的认证信息 格式:passwd [参数][用户]
用户管理命令中,passwd命令普通用户和管理员都可以使用,但是普通用户只有对自己密码进行修改的权限(还必须遵守创建密码规范)且无法使用passwd参数,管理员可以操作一切和密码有关的参数

	--stdin :read the new password from standard input,从标准输入读取密码,标准输入可以来自管道符
	-S :status,查看指定用户的密码状态
	-l :lock,锁定用户密码,等同于usermod -L
	-u :unlock,解锁用户密码,等同于usermod -U
	-d :delete,删除用户密码,这时用户处于空密码的状态
	-e :expire,立即过期用户密码
	-x :maxmum days,设置密码使用天数
	-n :minimum days,设置密码最小修改天数
	-w :warning days,设置密码过期前警告天数
	-I :inactive days,设置密码失效后的过期天数
	-f :force,强制执行指定动作

passwd实例:
使用-S查看各种情况下的用户密码

[root@Aki ~]# passwd -S leaves
leaves PS 2020-02-04 0 99999 7 -1 (Password set, SHA512 crypt.)
[root@Aki ~]# passwd -d leaves
Removing password for user leaves.
passwd: Success
[root@Aki ~]# passwd -S leaves
leaves NP 2020-02-04 0 99999 7 -1 (Empty password.)
[root@Aki ~]# tail -n 1 /etc/shadow
leaves::18296:0:99999:7:::
[root@Aki ~]# passwd -l leaves
Locking password for user leaves.
passwd: Success
[root@Aki ~]# passwd -S leaves
leaves LK 2020-02-04 0 99999 7 -1 (Password locked.)
[root@Aki ~]# tail -n 1 /etc/shadow
leaves:!!:18296:0:99999:7:::

PS:password set , NP: no passwd , LK :lock 。空密码锁定之后密码域会出现“!!”,就像没有设置过密码一样。

[root@Aki ~]# passwd -e leaves
Expiring password for user leaves.
passwd: Success
[root@Aki ~]# tail -n 1 /etc/shadow
leaves:!!:0:0:99999:7:::
[root@Aki ~]# passwd leaves
Changing password for user leaves.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
[root@Aki ~]# tail -n 1 /etc/shadow
leaves:$6$a1aRPZai$vI2c7oAkLkGDLuC0ntli7UEaya/P76To32XNfqMJmogeRcu5fq1wGquY80eR7KMF8Eu2lf0vSvz3f15kfrkVA1:18296:0:99999:7:::

使用-e 立即过期账户,密码修改时间会立即归零,用户在下次登录时必须先修改密码才可以登录,密码修改后恢复正常。

[root@Aki ~]# passwd -x 365 -m 30 -w 10 -i 7 leaves
passwd: bad argument -m: unknown option
[root@Aki ~]# passwd -x 365 -n 30 -w 10 -i 7 leaves
Adjusting aging data for user leaves.
passwd: Success
[root@Aki ~]# tail -n 1 /etc/shadow
leaves:$6$a1aRPZai$vI2c7oAkLkGDLuC0ntli7UEaya/P76To32XNfqMJmogeRcu5fq1wGquY80eR7KMF8Eu2lf0vSvz3f15kfrkVA1:18296:30:365:10:7::

修改密码有效期为365天,最少30天修改一次密码,密码失效前10天警告,密码失效后用户7天后过期

用户锁定
1.密码锁定
passwd与usermod使用各自的参数进行锁定,原理相同,在shadow文件的密码域前加上感叹号表示该用户密码被锁定,用户将无法通过密码验证登录

[root@Aki ~]# tail -n 1 /etc/shadow
leaves:$6$95KBNm8F$SNR5mg/Nz/LoF6jT.qKNR.uvqs4KZ8GlieMRlOwi/PI.2oMm6gHZMAwTecSy4tA1zTvMXCGAYPeaDaUhVJWDQ.:18296:0:99999:7:::
[root@Aki ~]# passwd -l leaves
Locking password for user leaves.
passwd: Success
[root@Aki ~]# tail -n 1 /etc/shadow
leaves:!!$6$95KBNm8F$SNR5mg/Nz/LoF6jT.qKNR.uvqs4KZ8GlieMRlOwi/PI.2oMm6gHZMAwTecSy4tA1zTvMXCGAYPeaDaUhVJWDQ.:18296:0:99999:7:::
[root@Aki ~]# passwd -u leaves
Unlocking password for user leaves.
passwd: Success
[root@Aki ~]# tail -n 1 /etc/shadow
leaves:$6$95KBNm8F$SNR5mg/Nz/LoF6jT.qKNR.uvqs4KZ8GlieMRlOwi/PI.2oMm6gHZMAwTecSy4tA1zTvMXCGAYPeaDaUhVJWDQ.:18296:0:99999:7:::

其中passwd在密码前加上“!!”表示锁定,usermod加上“!”。但是他们的解锁方式可以互用
这时使用锁定后的用户进行正常登录和ssh登录

[root@Aki ~]# passwd -S leaves
leaves LK 2020-02-04 0 99999 7 -1 (Password locked.)
Aki login : leaves
Password:
Login incorrect

[root@Aki ~]# ssh leaves@192.168.52.149
leaves@192.168.52.149's password:
Permission denied, please try again.

可以发现认证失败,无法登录,但是可以使用su 从 root 账户切换过来。特殊的,ssh互信的主机可以正常登录,ssh公钥验证

[root@Aki ~]# su - leaves
Last login: Tue Feb 4 16:35:20 CST 2020 from 192.168.52.148 on pts/3
[Aki@Aki ~]$

使用命令锁定的密码会使任何密码验证的方式全部失效,但是也可以用其他不使用密码验证的方式登录

还有一种密码锁定的方法,直接将用户shadow文件的密码域改为“*”,用户无法登录,但是当被root重置密码后就可以正常登陆了。

[root@Aki ~]# vim /etc/shadow
[root@Aki ~]# tail -n 1 /etc/shadow
leaves:*:18296:0:99999:7:::
[root@Aki ~]# passwd -S leaves
leaves LK 2020-02-04 0 99999 7 -1 (Alternate authentication scheme in use.)             备用验证方式
[root@Aki ~]# ssh leaves@192.168.52.149
leaves@192.168.52.149's password:
Permission denied, please try again.

Aki login : leaves
Password:
Login incorrect

[root@Aki ~]# echo "Akizzy" | passwd --stdin leaves
Changing password for user leaves.
passwd: all authentication tokens updated successfully.
[root@Aki ~]# passwd -S leaves
leaves PS 2020-02-05 0 99999 7 -1 (Password set, SHA512 crypt.)

而且“!”“*”这类符号加在密码域前面,都相当于锁定密码,但是如果加的是“*”,没法被命令识别出来,也就无法用命令解锁。

[root@Aki ~]# tail -n 2 /etc/shadow
leaves:*$6$oz6PQuBp$996fhYwKUTHtrqziQN3Ytg/KrESC/FixFhq2Zv29KbAm6Pr8cBHoemVO9rANRW.9pj.K7rcU87T/x53qC0dh51:18297:0:99999:7:::
Aki:$6$DpOKwVb0$h4hy9ZxyU8/b4oUT9XWK2NQnHU3tCjQBavLwhcm7Yfn7f246d66PG5iMGpucFon2S601nWFbspXL774N7Jq/t.:18296:0:99999:7:::
[root@Aki ~]# passwd -S leaves
leaves PS 2020-02-05 0 99999 7 -1 (Password set, DES crypt.)

其实是因为首字符不是“$”而被当成DES的加密方式了,然而用DES算法也匹配不上密码,所以验证失败

2.shell锁定
更改用户shell为/sbin/nologin 使其不能登录

[root@Aki ~]# usermod -s /sbin/nologin leaves
[root@Aki ~]# su - leaves
Last login: Tue Feb 4 16:59:46 CST 2020 from 192.168.52.1 on pts/1
This account is currently not available.
[root@Aki ~]# ssh leaves@192.168.52.148
leaves@192.168.52.148's password:
Last login: Tue Feb 4 17:10:30 2020 from 192.168.52.1
This account is currently not available.
Connection to 192.168.52.148 closed.

使用su 从root 或普通用户切换和ssh登录,即使验证密码正确,也无法登录
/sbin/nologin 作为一个特殊的shell,其实严格来说并不是指不允许登录,而是不允许使用bash在内的shell来操作系统被划为/sbin/nologin shell的用户还是可以使用系统资源的,比如www服务器有nginix,apache用户来进行管理,邮箱有mail用户来管理,这些用户作为系统用户,依然可以调配系统资源,但是无法使用shell进行操作。这也是为了安全考虑,当有不允许操作shell(划到/sbin/nologin)的用户请求使用shell进行操作时,可以被系统直接拒绝。
特殊的,如果给root的shell设置为/sbin/nologin,root也将无法登录(作死)
如果/etc/目录下有nologin.txt文件的话,里面可以写上不允许用户使用shell的原因,在用户尝试登录shell时会显示这段信息,而不是默认提示。

[root@Aki ~]# vim /etc/nologin.txt
Aki with zzy, do not bother us.
[root@Aki ~]# su - leaves
Last login: Tue Feb 4 17:11:03 CST 2020 from 192.168.52.148 on pts/2
Aki with zzy, do not bother us.
[root@Aki ~]# ssh leaves@192.168.52.149
leaves@192.168.52.149's password:
Last login: Tue Feb 4 17:11:03 CST 2020
Aki with zzy, do not bother us.
Connection to 192.168.52.149 closed.

还有一种情况,如果系统正在维护,这时需要禁止所有的用户进行登录就要在/etc/目录下建立一个nologin文件,只要有这个文件,所有用户(除了root)将无法登陆shell,不论是ssh还是正常登录。文件中可以写入不能登陆的原因,这会在用户尝试登录的时候显示,而不是显示默认提示

[root@Aki ~]# tail -n 2 /etc/passwd
leaves:x:1000:1000:Leaves:/home/leaves:/sbin/nologin
Aki:x:1002:1002::/home/Aki:/bin/bash
[root@Aki ~]# vim /etc/nologin
Stop service for system maintenance
[root@Aki ~]# ssh leaves@192.168.52.149
leaves@192.168.52.149's password:
Stop service for system maintenance
[root@Aki ~]# ssh Aki@192.168.52.149
Aki@192.168.52.149's password:
Stop service for system maintenance

Aki login : leaves
Password:
Stop service for system maintenance

Authentication failure

Aki login :Aki
Password:
Stop service for system maintenance

Authentication failure

但是当系统重启后,/etc/nologin文件会被自动删除。并且在这种“维护模式”下,使用root su 切换到shell原本正常使用的用户,以及普通用户之间互相切换都是可以的

[root@Aki ~]# su - Aki
Last login: Wed Feb 5 11:19:24 CST 2020 on :0
[Aki@Aki ~]$
chpasswd 命令
用于:批量更改密码 格式:chpasswd[参数]+[密码列表]

	-c : crypt method,指定加密方式,有:NONE,DES,MD5,SHA-256,SHA-512
	-m :md5 method
	-e :encrypted,使用已加密的密文

chpasswd实例:
创建密码列表并批量更改密码

[root@Aki ~]# cat list.txt 
leaves:Akizzy
zzy:Akizzy
[root@Aki ~]# chpasswd -m < list.txt 
[root@Aki ~]# passwd -S leaves 
leaves PS 2020-02-06 0 99999 7 -1 (Password set, MD5 crypt.)
[root@Aki ~]# passwd -S zzy 
zzy PS 2020-02-06 0 99999 7 -1 (Password set, MD5 crypt.)

指定使用md5加密方式,重定向密码列表
需要注意,密码列表必须遵循格式:用户名:密码 ,密码列表可以使用重定向读取,也可以交互式读取,但是内容必须遵循格式,且密码列表不能有空行,否则会读取失败

[root@Aki ~]# chpasswd -c DES 
leaves:Akizzy
zzy:Akizzy
[root@Aki ~]# passwd -S leaves 
leaves PS 2020-02-06 0 99999 7 -1 (Password set, DES crypt.)
[root@Aki ~]# passwd -S zzy 
zzy PS 2020-02-06 0 99999 7 -1 (Password set, DES crypt.)

指定使用DES(辣鸡)加密方式,交互式输入密码列表,结束时使用ctrl+D

查看Linux系统中所有的shell
[root@Aki ~]# cat /etc/shells 
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh

shell列表在/etc/shells文件中

点赞

发表评论

昵称和uid可以选填一个,填邮箱必填(留言回复后将会发邮件给你)
tips:输入uid可以快速获得你的昵称和头像

Title - Artist
0:00