什么是用户
用户对硬件资源的操作都需要通过操作系统,⽐如⽤户要读取硬盘中的⼀份关键数据,出于安全考虑,操作系统的开发者们都专⻔开发了安全机制,要使⽤操作系统必须事先输⼊正确的⽤户名与密码, 这便是⽤户的由来。能够正常登录系统的都称作为用户。
为何要有用户?
主要就是权限问题。用户就是权限的化身,每个用户都有特定的权限,为了划分权限,增加安全性
如何查看用户信息
[root@localhost ~]# id # 查看当前用户 uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 [root@localhost ~]# whoami # 查看当前用户是谁 root [root@localhost ~]# who # 查看所有登录用户的信息 root tty1 2021-06-30 08:09 root pts/0 2021-06-30 23:33 (192.168.138.10)
Linux系统中用户的角色划分
在Linux系统中用户分为管理员用户与其他用户,管理员用户拥有最高权限,其他用户根据管理员的分配具有不同权限。
对于Linux系统来说,用户的角色是通过UID和GID识别的,用户系统账号的名称如(bertwu),是给人(管理员看的),Linux系统识别的仅仅是UID和GID这样的数字。
UID(User Identify)
用户ID,唯一标识一个系统用户的账号,uid 在系统内是唯一的, uid相当于人的身份证号,用户名就相当于这个人的名字。
GID(Group Identify)
组ID,如果把操作系统当做一家公司,UID为这个人的员工号,GID为部门号。
centos7系统之前约定 uid: 0 由超级用户或具备超级用户权限的用户创建的用户(贫民老百姓,大臣,布衣/bin/bash) uid: 1~499 系统虚拟用户:UID范围1-499,存在满足文件或服务启动的需要。一般不能登录,只是傀儡 uid: 500-65535 普通用户 centos7系统约定: 0 超级管理员,最高权限,有着极强的破坏能力 1~200 系统用户,用来运行系统自带的进程,默认已创建 201~999 系统用户,用来运行安装的程序,所以此类用户无需登录系统 1000+ 普通用户,正常可以登录系统的用户,权限比较小,能执行的任务有限 ps: 用户和组的关系: 一对一,多对一,一对多,多对多 一个用户可以属于一个组,用户默认就在自己的主组下 一个用户可以属于多个组,主组只有一个,但是可以为用户添加多个附加组
需要注意的是:
# Linux/Unix是一个多用户、多任务的操作系统 # windows是一个单用户多任务操作系统 多用户不是说可以创建多个用户,而是指一次可以登录多个用户 多任务指的是可以并发执行多个进程 linux发展史: multics-》unix-》linux,所以linux是多用户的,天然支持多个连机终端,连机终端在没有互联网的情况下是有意义的, 多个人可以用不同的连机终端连到一台机器/服务器上使用,而有了互联网之后, 多个人可通过网络访问服务器,这个时候多用户or单用户的概念就不再那么重要
创建用户后默认会修改如下文件
/etc/passwd /etc/shadow /etc/group /etc/gshadow
[root@localhost tmp]# head -1 /etc/passwd # 查看/etc/passwd 文件的第一行内容 root:x:0:0:root:/root:/bin/bash
解释:
以:分割,分为七列。 root:x:0:0:root:/root:/bin/bash 第一字段:用户名(也被称为登录名); 第二字段:密码占位符;在例子中我们看到的是一个x,其实密码已被映射到/etc/shadow 文件中; 第三字段:UID ;请参看本文的UID的解说; 第四字段:GID;请参看本文的GID的解说; 第五字段:描述信息,可选 第六字段:用户的家目录所在位置; 第七字段:用户所用SHELL的类型
[root@localhost tmp]# head -1 /etc/shadow # 查看/etc/shadow 文件的第一行内容 root:$6$oNadXTBd$c1Wb4b/MPqw87bp/NM1WyAEAOCQztvuUf5eNsgFbcirqrOxb95391R5a1nEQs5hWjkojgDGdH90Vo2YSFeQqO.:18809:0:99999:7:::
解释: 以:分割,分割成9列
第一字段:用户名(也被称为登录名),在/etc/shadow中,用户名和/etc/passwd 是相同的, 这样就把passwd 和shadow中用的用户记录联系在一起;这个字段是非空的; 第二字段:密码(已被加密),如果是有些用户在这段是x,表示这个用户不能登录到系统; 这个字段是非空的;!!表示没有密码 第三字段:上次修改口令的时间;这个时间是从1970年01月01日算起到最近一次修改口令的时间间隔(天数), 您可以通过passwd 来修改用户的密码,然后查看/etc/shadow中此字段的变化; 第四字段:两次修改口令间隔最少的天数;如果设置为0,则禁用此功能;也就是说用户必须经过 多少天才能修改其口令;此项功能用处不是太大;默认值是通过/etc/login.defs文件定义中获取, PASS_MIN_DAYS 中有定义; 第五字段:两次修改口令间隔最多的天数;这个能增强管理员管理用户口令的时效性, 应该说在增强了系统的安全性;如果是系统默认值,是在添加用户时由/etc/login.defs文件定义中获取,在PASS_MAX_DAYS 中定义; 第六字段:提前多少天警告用户口令将过期;当用户登录系统后,系统登录程序提醒用户口令将要作废; 如果是系统默认值,是在添加用户时由/etc/login.defs文件定义中获取,在PASS_WARN_AGE 中定义; 第七字段:在口令过期之后多少天禁用此用户;此字段表示用户口令作废多少天后,系统会禁用此用户, 也就是说系统会不能再让此用户登录,也不会提示用户过期,是完全禁用; 第八字段:用户过期日期;此字段指定了用户作废的天数(从1970年的1月1日开始的天数), 如果这个字段的值为空,帐号永久可用; www.hackdig.com 第九字段:保留字段,目前为空,以备将来Linux发展之用; 如果更为详细的,请用 man shadow来查看帮助,您会得到更为详尽的资料;
[root@localhost tmp]# head -1 /etc/group root:x:0:
解释: 以:
为分隔符,分成四列
4、/etc/gshadow 组密码文件
[root@10-23-117-188 ~]# head -1 /etc/gshadow root:::
解释: 以:
为分隔符,分成四列
创建用户时,还会默认创建如下
/etc/skel/ # 用户老家的模板,会将此处的.bash开头的文件拷贝到自己的家目录里 /home/xxx # 用户家目录 /var/spool/mail/xxx # 用户邮箱文件
useradd # 添加用户 usermod # 修改用户 userdel # 删除用户
选项 | 功能描述 |
---|---|
-u | 指定要创建用户的UID,不允许冲突 |
-g | 指定要创建用户的基本组 |
-G | 指定要创建用户附加组,逗号隔开可添加多个附加组 |
-d | 指定要创建用户的家目录路径 |
-s | 指定创建用户的bash shell |
-c | 指定要创建用户的注释信息 |
-M | 创建用户不创建家目录 |
-r | 创建系统账户,默认无家目录 |
-e | 修改过期时间 |
1.1.1 示例
创建tom用户,uid为6666,基本组为ops,附加组为dev,注释信息 good man 登录shell /bin/bash
[root@localhost ~]# groupadd ops # 先创建两个组ops和dev [root@localhost ~]# groupadd dev [root@localhost ~]# useradd tom -u 6666 -g ops -G dev -c "good man" -s /bin/shell [root@localhost ~]# id tom # 查看tom用户 uid=6666(tom) gid=1000(ops) groups=1000(ops),1001(dev) [root@localhost ~]# tail -1 /etc/passwd # 分别查看如下文件 tom:x:6666:1000:good man:/home/tom:/bin/shell [root@localhost ~]# tail -1 /etc/group dev:x:1001:tom [root@localhost ~]# tail -1 /etc/shadow tom:!!:18829:0:99999:7::: [root@localhost ~]# tail -1 /etc/gshadow dev:!::tom [root@localhost ~]#
1.1.2 创建 mysql系统用户[201-999] ,该用户不需要家目录,该用户不需要登录系统
[root@localhost ~]# useradd -r mysql -M -s /sbin/nologin [root@localhost ~]# id mysql uid=998(mysql) gid=995(mysql) groups=995(mysql) [root@localhost ~]#
若想要修改 Linux 系统普通用户,可以使用 usermod 命令,使用 root 账号登录 Linux 系统之后就可以修改系统普通用户了
-G -a 表示添加附加组,不覆盖原来的组
2.1.1 修改tom用户UID为5000,基本组为network,附加组为ops,dev, sa, 注释为student ,用户名为 tom123
[root@localhost ~]# usermod tom -u 5000 -g network -aG ops,sa -l tom123 -c student # -a表示在先前的附加组后继续添加,否则会覆盖原先附加组 [root@localhost ~]# id tom123 uid=5000(tom123) gid=1002(network) groups=1002(network),1000(ops),1001(dev),1003(sa) [root@localhost bob]#
若想要删除 Linux 系统普通用户,可以使用 userdel 命令,使用 root 账号登录 Linux 系统之后就可以删除系统普通用户了
例3.1 删除tom123用户,连同家目录和邮箱一起删掉
[root@localhost ~]# userdel -r tom123 [root@localhost ~]#
例3.2 批量删除系统中此前创建过的所有无用的用户(例如uid>=1000)
先写脚本模拟创建100个用户
#!/bin/bash for i in {1..100} do useradd tom_$i echo "tom_$i is created ok!" done
1.找出uid>=1000 [root@localhost ~]# awk -F: '$3>=1000' /etc/passwd 2.提取出用户名 [root@localhost ~]# awk -F: '$3>=1000' /etc/passwd | awk -F: '{print $1}' 或者 [root@localhost ~]# awk -F: '$3>=1000{print $1}' /etc/passwd 3.拼接命令 [root@localhost ~]# awk -F: '$3>=1000' /etc/passwd | awk -F: '{print $1}' | sed -r 's#(.*)#userdel -r \1#g' 4. 删除 [root@localhost ~]# awk -F: '$3>=1000' /etc/passwd | awk -F: '{print $1}' | sed -r 's#(.*)#userdel -r \1#g' | bash 5.查看是否删除成功 [root@localhost ~]# ls /home
创建用户后,如需要使用该用户进行远程登陆系统则需要为用户设定密码,设定密码使用 passwd
1.普通用户只允许变更自己的密码,无法修改其他人密码,并且密码长度必须8位字符
2.管理员用户允许修改任何人的密码,无论密码长度多长或多短。
3.普通用户不可以变更系统的状态(权限不够)
4.如果root将【软件|系统】的部分权限分配给普通用户,普通用户就可以有权限修改或变更。
推荐密码保存套件工具,支持 windows、MacOS、
[root@localhost ~]# passwd # 给当前用户修改密码 [root@localhost ~]# passwd tom # 给tom用户修改密码 [root@localhost ~]# passwd root # 给root用户修改密码
[root@localhost ~]# echo "123" | passwd --stdin tom # 仅限于root用户可以这样做
[root@localhost ~]# yum install -y expect [root@localhost ~]# echo $(mkpasswd -l 10 -d 2 -c 2 -C 2 -s 4) |tee pass.txt| passwd --stdin tom # 会在当前目录下pass.txt文件里记录下密码 # 补充:可以利用系统内置变量生成随机字符串来充当密码 [root@localhost ~]# echo $RANDOM|md5sum|cut -c 1-10 70ba11a74b [root@localhost ~]#
脚本创建用户设定随机密码
[root@localhost ~]# cat useradd_new.sh #!/bin/bash for i in mg bob alice do pass=$(mkpasswd -l 10 -d 2 -c 2 -C 2 -s 4) useradd $i echo "$pass" | passwd --stdin $i &>/dev/null echo "User: $i Pass: $pass" echo "User: $i Pass: $pass" >> user_pass.txt done
手动创建密码方式(了解)
openssl passwd 手动生成密码 引言:在Linux系统中我们要向手动生成一个密码可以采用opensll passwd来生成一个密码作为用户账号的密码。 Linux系统中的密码存放在/etc/shadow文件中,并且是以加密的方式存放的,根据加密方式的不同,所产生的加密后的密码的位数也不同。 openssl passwd的作用是用来计算密码hash的,目的是为了防止密码以明文的形式出现。 语法格式: openssl passwd [option] passwd openssl passwd常用的选项如下: -1:表示采用的是MD5加密算法。 -salt:指定salt值,不使用随机产生的salt。在使用加密算法进行加密时,即使密码一样,salt不一样,所计算出来的hash值也不一样, 除非密码一样,salt值也一样,计算出来的hash值才一样。salt为8字节的字符串。 示例: [tom@localhost ~]$ openssl passwd -1 -salt 'i have a dream' ##注意'i have a dream' 不是密码而是密码的盐,注意密码的盐里不要有中文 Password: ##这里输入的是密码 $1$12345678$1qWiC4czIc07B4J8bPjfC0 ##这是生成的密文密码 ##将生成的密码串,手动添加到/etc/shadow中就可用作用户的登陆密码了。
useradd创建用户时,会以/etc/login.defs
、/etc/default/useradd
两个配置文件中的配置作为参照物。如果在创建用户时指定了参数则会覆盖系统默认的配置,如果没有指定参数则遵循默认配置建立用户
[root@localhost ~]# grep -Ev "^#|^$" /etc/login.defs MAIL_DIR /var/spool/mail PASS_MAX_DAYS 99999 #密码最大有效期 PASS_MIN_DAYS 0 #两次修改密码的最小间隔时间 PASS_MIN_LEN 5 #密码最小长度,对于root无效 PASS_WARN_AGE 7 #密码过期前多少天开始提示 UID_MIN 1000 #用户ID的最小值 UID_MAX 60000 #用户ID的最大值 SYS_UID_MIN 201 #系统用户ID的最小值 SYS_UID_MAX 999 #系统用户ID的最大值 GID_MIN 1000 #组ID的最小值 GID_MAX 60000 #组ID的最大值 SYS_GID_MIN 201 #系统用户组ID的最小值 SYS_GID_MAX 999 #系统用户组ID的最大值 CREATE_HOME yes #使用useradd的时候是可以创建用户家目录 UMASK 077 #创建家目录时umask的默认控制权限 USERGROUPS_ENAB yes #删除用户的时候是否同时删除用户组 ENCRYPT_METHOD SHA512 #密码加密规则
[root@localhost ~]# cat /etc/default/useradd GROUP=100 #依赖于/etc/login.defs的USERGRUUPS_ENAB参数,如果为no,则在此处控制 HOME=/home #把用户的家目录建在/home中。 INACTIVE=-1 #是否启用账号过期停权,-1表示不启用。 EXPIRE= #账号终止日期,不设置表示不启用。 SHELL=/bin/bash #新用户默认所有的shell类型。 SKEL=/etc/skel #配置新用户家目录的默认文件存放路径。 CREATE_MAIL_SPOOL=yes #创建mail文件。 当使用useradd创建用户时,创建的用户家目录下会存在.bash* 环境变量相关的文件,这些环境变量文件默认 从/etc/skel目录中拷贝。这个默认拷贝环境变量位置是由/etc/default/useradd配置文件中定义的。 #故障案例,在当前用户家目录下执行了rm -rf .*命令,下次登录系统时出现-bash-4.1$,如何解决! -bash-4.1$ cp -a /etc/skel/.bash* ./ -bash-4.1$ exit [root@egon ~]# #重新连接即可恢复
组是一种逻辑层面的定义,逻辑上将多个用户归纳至一个组,当我们对组操作,其实就相当于对组中的所有用户进行操作。
对于普通用户来说,组分为如下几类
默认组:创建用户时不指定组,则默认创建与用户同名的组;
基本组:用户有且只能有一个基本组,创建时可通过-g指定(相当于亲爹)
附加组:用户可以有多个附加组,创建时通过-G指定(相当于干爹)
组管理命令
groupadd # 添加组 groupmod # 修改组 groupdel #删除组 gpasswd # 设置组密码 newgrp # 切换主组
若想要添加 Linux 用户组,可以使用 groupadd 命令,使用 root 账号登录 Linux 系统之后就可以添加用户组了
例1. 添加一个 salary的组 gid为10000
[root@localhost tom]# groupadd salary -g 10000 [root@localhost tom]# tail -1 /etc/group salary:x:10000: [root@localhost tom]#
例2. 添加一个系统组 test
[root@localhost tom]# groupadd test -r [root@localhost tom]# tail -1 /etc/group test:x:994: [root@localhost tom]#
若想要修改 Linux 用户组,可以使用 groupmod 命令,使用 root 账号登录 Linux 系统之后就可以修改用户组了。
例1 修改salary组组名为 salary1 GID为5050
[root@localhost tom]# groupmod salary -g 5050 -n salary1 [root@localhost tom]# tail -1 /etc/group salary1:x:5050: [root@localhost tom]
如果组中存在用户是无法删除该组,必先删除用户后在删除组
[root@localhost home]# useradd bertwu1 # 创建用户 [root@localhost home]# groupadd devops # 创建组 [root@localhost home]# usermod -G devops bertwu1 # 指定用户所属的附加组 [root@localhost home]# id bertwu1 # 查看 uid=2002(bertwu1) gid=5556(bertwu1) groups=5556(bertwu1),5557(devops) [root@localhost home]# groupdel devops # 附加组可以删除 [root@localhost home]# id bertwu1 # 查看用户,发现附加组的确被删除 uid=2002(bertwu1) gid=5556(bertwu1) groups=5556(bertwu1) [root@localhost home]# groupdel bertwu1 # 无法删除bertwu1,因为bertwu1属于bertwu1 的主组 groupdel: cannot remove the primary group of user 'bertwu1' [root@localhost home]#
对于用户来说,组是分类的
gpasswd
gpasswd -M user1,user2,user3 ,group # 给组group里添加 user0 user02 user03 usermod -a -G group01 ,group02,group03 user # 给user添加附属组
注意:gpasswd将用户添加到组或从组中删除,只针对已存在的用户 [root@root ~]# gpasswd -a user07 it # 将某个用户加入到it组 [root@root ~]# gpasswd -M user02,user03,user04 it # 将多个用户加入到it组 [root@root ~]# gpasswd -A jjj it # 指定jjj为组it的组长,除了root用户外jjj用户也可以采用第一条命令往it组里添加成员 [root@root ~]# grep 'it' /etc/group # 查看it组中的成员 it:x:505:user02,user03,user04 [root@root ~]# gpasswd -d user07 it # 删除用户usr07从it组
我们可以为组设置密码,然后让一些非组成员的用户通过命令”newgrp 组”临时切换到组内并输入密码的方式获取用户组的权限和特性