Day 04 用户组管理,文件权限
一、Linux用户介绍
1.什么是用户
用户对硬件资源的操作都需要通过操作系统,比如用户要读取硬盘中的一份关键数据 出于安全考虑,操作系统的开发者们都专门开发了安全机制,要使用操作系统必须事先输入正确的用户名与密 码 这便是用户的由来
2.为何要有用户?或者为什么
# 主要就是权限问题
1、系统上的每一个进程,都需要一个特定的用户运行,一个用户拥有特定的权限,该用户运行的进程与用户 权限一致
2、通常在公司是使用普通用户管理服务器,因为root权限过大,容易出问题
3.查看用户信息
3.1 查看当前用户(id)
id # 查看当前用户
--------------------------------------------
uid=0(root) gid=0(root) groups=0(root)
3.2 查看当前用户是谁(whoami)
whoami # 查看当前用户是谁
--------------------------------------------
root
3.3 查看指定用户(id 用户名)
id user01 # 查看user01用户
--------------------------------------------
uid=1006(user01) gid=1007(user01) groups=1007(user01)
id root
--------------------------------------------
uid=0(root) gid=0(root) groups=0(root)
3.4 查看当前登录用户是谁(who)
who # 查看当前登录用户是谁
--------------------------------------------
root pts/0 2020-11-24 14:26 (139.226.12.198)
3.5 查看每个进程中的用户
# (ps)process status
ps aux |grep [s]sh # 显示所有(axu)进程(ps)中过滤出(grep)通过ssh链接客户端的进程
--------------------------------------------
root 1737 0.0 0.2 112920 4348 ? Ss Nov18 0:00 /usr/sbin/sshd -D
root 3166 0.0 0.3 157316 5940 ? Ss 14:26 0:00 sshd: root@pts/0
4.linux系统中用户角色的划分
在linux系统中的用户分为管理员用户与其他用户 管理员用户拥有最高权限 其他用户根据管理员的分配拥有不同的权限
需要强调的是:
对于linux系统来说,用户的角色是通过UID和GID识别的;用户系统帐号的名称(如user01)其实给人(管理 员)看的,linux系统能够识别的仅仅是UID和GID这样的数字。
UID(user indentify)用户ID
唯一标识一个系统用户的账号,uid在系统中是唯一的,uid相当于一个人的身份证,用户名就相当于这个人的名字
GID(group indentify)组ID
如果把一个操作系统当成一家公司,uid相当于这个人的员工号, gid相当于他的部门编号。
关于UID之间的约定(now)
- 0 超级管理员一般是(root),最高权限,
rm -rf/-*
- 1-1000 一般是系统用户,用来运行安装的程序,所以此类无需登录验证
- 1000+ 普通用户,正常可以登录系统的用户,权限比较小,能执行的任务有限
5.用户和组之间的关系
一对一(一个用户对应一个组)
多对一 (多个用户属于一个组)
一对多(一个用户属于多个组)
多对多(多个用户多个组)
6.超级用户
默认是root用户,其UID和GID均为0。root用户在每台unix/linux操作系统中都是唯一且真实存在的,通 过它可以登录系统,可以操作系统中任何文件和命令,拥有最高的管理权限。
二、用户和组文件
和用户、组相关的文件
etc/passwd
存放于密码相关的文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Nw23Fl94-1606263953716)(https://i.loli.net/2020/11/24/gUNL5QGSy39C1ZE.png)]
-
etc/shadow shadow
影藏的信息user01:!!:18590:0:99999:7:::
以’:'为分隔符,分成九列
列名 | 作用 |
---|---|
user01 | 用户名称 |
!! | 密码是一个长字符串 !!代表没有密码 |
18590 | 最近一次变更密码,距离1970到现在过了多少天,一般用作判断修改密码时间,root100天换一次 |
0 | 密码最少使用天数 0表示无限制 |
99999 | 密码最长使用天数 99999代表无限制 |
7 | 密码过期预警天数 |
:x1:x2:x3—x1 | 在口令过期之后多少天禁用此用户;此字段表示用户口令作废多少天后,系统会禁用此用户,也就 是说系统会不能再让此用户登录,也不会提示用户过期,是完全禁用; |
:x1:x2:x3—x2 | 用户过期日期;此字段指定了用户作废的天数(从1970年的1月1日开始的天数),如果这个字段的 值为空,帐号永久可用; |
:x1:x2:x3—x3 | 保留字段,目前为空,以备将来Linux发展之用; |
etc/group
组文件
user01:x:1007:
列数 | 含义 |
---|---|
第一列 user01 | 二户组名称 |
第二列x | 用户组密码占位符 |
第一列 1007 | 用户组id/gid |
第一列 | 显示该用户的组作为哪个用户的附加组,多个用逗号分隔 一对多 |
etc/gshadow
组密码文件
user01:!::
列数 | 含义 |
---|---|
第一列 user01 | 用户组名称 |
第二列 ! | 用户组密码,这个段可以是空或!,如果是空的或者有!,表示没有面; |
第三列 | 用户组管理者,这个字段也可以为空,如果有多个用户组管理者,用 , 分隔 |
第四列 | 显示该用户的组作为哪个用户的附加组,多个用逗号分隔 一对多 |
etc/skel/
用户老家的模板/home/xxx
用户家目录/var/spool/mail/xxx
用户邮箱文件
三、用户管理命令
1.用户管理命令汇总
-
useradd
添加用户-
useradd user99 cat /etc/passwd ------------------------------------- .... user05:x:1004:1004::/home/user05:/bin/bash user06:x:1005:1005::/home/user06:/bin/bash user01:x:1006:1007::/home/user01:/bin/bash user99:x:1007:1008::/home/user99:/bin/bash
注意:当创建一个用户时,如果没有指定用户的主组,将会创建一个同名的组作为用户的主组。 练习:查看所有与用户相关的文件及目录
-
-
userdel
删除用户-
userdel user01 # 删除用户user1,但不删除用户家目录和mail 如果要完整删除需要加 -r userdel -user06 -r ------------------------------------- userdel: invalid option -- 'u' Usage: userdel [options] LOGIN Options: -f, --force force some actions that would fail otherwise e.g. removal of user still logged in or files, even if not owned by the user -h, --help display this help message and exit -r, --remove remove home directory and mail spool -R, --root CHROOT_DIR directory to chroot into -P, --prefix PREFIX_DIR prefix directory where are located the /etc/* files -Z, --selinux-user remove any SELinux user mapping for the user
-
-
usermod
修改用户信息
2.useradd命令详解:创建用户的同时指定选项
- –u:指定用户的UID
- –g:指定用户所属的主群
- –G:指定用户所属的附加群
- –d:指定用户的家目录
- –c:指定用户的备注信息
- –s:指定用户所用的shell
- -e:修改过期时间
- -M: 不创建家目录
- -r: 创建系统账户,uid处于系统用户范围内,默认就没有家目录
灵活应用useradd命令的举例:
- 在系统中新增一个fox(狐狸)用户的命令:useradd fox 实质就是添加普通用户
- 在系统中新增一个用户user01,属组为police以及uid为600的命令: useradd –u 600 –g police user01
其他练习
useradd fox -u 503 # 创建用户fox 指定uid
useradd user08 -d /user08-home # 创建用户user08 指定家目录 创建好的家目录 直接 cd /名字就可以进入
useradd user09 -M # 创建用户user04,不创建家目录
useradd user05 -s /sbin/nologin # 创建用户并指定shell
useradd user06 -g hr # 创建用户,指定主组
useradd user07 -G sale # 创建用户,指定附加组
useradd user08 -e 2014-04-01 # 指定过期时间
useradd user10 -u 4000 -s /sbin/nologin
useradd xxx -M -s /sbin/nologin # 创建普通用户,但是没有家目录,不能登录系统
useradd -r yyy -s /sbin/nologin # yyy属于系统用户,uid处于系统用户uid范围内
3.usermod命令
同useradd参数基一致,只不过useradd是添加,usermod是修改
-u
#指定要修改用户的UID-g
#指定要修改用户基本组-a
#将用户添加到补充组。仅与-G选项一起使用-G
#指定要修改用户附加组,使用逗号隔开多个附加组, 覆盖原有的附加组-d
#指定要修改用户家目录-c
#指定要修改用户注释信息-s
#指定要修改用户的bash shellusermod -e 2013-02-11 user1000
# 修改过期时间usermod -g group1 jj
# 修改主组usermod -a -G group2 jj
# 修改附加组,-a添加,不加-a代表覆盖
其它选项
-
-m #将用户主目录的内容移动到新位置。如果当前主目录不存在,则不会创建新的主目录
-
-
-l #指定要修改用户的登陆名
-
usermod -l new fox #修改fox用户名为new
-
-
-L #指定要锁定的用户 lock
-
usermod -L new # 锁定 new用户
-
-
-U #指定要解锁的用户 unlock
-
usermod -U new # 解除锁定
-
4.设定和修改密码
4.1 passwd
passwd # 默认给当前用户设定密码
passwd
---------------------------------------
Changing password for user root.
New password:
4.2 passwd 用户名
# root用户可以给自己以及所有其他用户设定密码,普通用户只能设定自己的密码
passwd new
--------------------------------------------
Changing password for user new.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
4.3 echo '密码' | passwd --stdin 用户名
非交互式
echo '123456'|passwd --stdin new
--------------------------------------------
Changing password for user new.
passwd: all authentication tokens updated successfully.
4.4 查看修改
grep 'new' /etc/shadow
--------------------------------------------
new:$6$SmiynmEk$WlumJWUytUoRzviaCDUO.WNma0BtbrleyTrmhWz.CLPsafdgLBBJ59Yr4sQ1XYZ5vy5CHd0IfhvLs8ZPxY9BD0:18590:0:99999:7:::
扩展阅读
useradd创建用户时,对于未指定的选项(-u、-g等等),会以/etc/login.defs、/etc/default/useradd两个配置文件中的配置作为参照物
#配置文件/etc/login.defs详解
[root@egon ~]# 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 #密码加密规则
#配置文件/etc/default/useradd详解
[root@egon ~]# 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 ~]# #重新连接即可恢复
12345678910111213141516171819202122232425262728293031323334353637383940
四.组管理
组管理命令汇总
groupadd
groupmod
groupdel
gpasswd # 设置组密码
newgrp #切换主组
123456
创建组
参数说明:
-g:指定新建工作组的 id;
-r:创建系统工作组,系统工作组的组ID小于500;
-K:覆盖配置文件 "/ect/login.defs";
-o:允许添加组 ID 号不唯一的工作组。
-f,--force: 如果指定的组已经存在,此选项将示明了仅以成功状态退出。当与 -g 一起使用,并且指定的GID_MIN已经存在时,选择另一个唯一的GID(即-g关闭)。
[root@aliyum ~]# groupadd gg1 #创建基本组,不指定gid
[root@aliyum ~]# tail -1 /etc/group
gg1:x:2005:
[root@aliyum ~]# groupadd -g 5555 gg2 #创建基本组, 指定gid为5555
[root@aliyum ~]# tail -1 /etc/group
gg2:x:5555:
[root@aliyum ~]# groupadd -r gg3 # 创建系统组,gid从201-999
[root@aliyum ~]# tail -1 /etc/group
gg3:x:991:
12345678910111213141516
修改组
参数:
-g <群组识别码> 设置欲使用的群组识别码。
-o 重复使用群组识别码。
-n <新群组名称> 设置欲使用的群组名称。
[root@aliyum ~]# groupmod -g 1111 gg3
[root@aliyum ~]# tail -1 /etc/group
gg3:x:1111:
[root@aliyum ~]# groupmod -n new_gg3 gg3 # -n 修改组名称
[root@aliyum ~]# tail -1 /etc/group
new_gg3:x:1111:
123456789101112
12345678910111213
删除组
如果一个组是一个用户的主组,那么该组不能被删除,删掉用户会默认一起删掉他的主组
[root@aliyum ~]# useradd cm
[root@aliyum ~]# groupadd devops
[root@aliyum ~]# usermod -G devops cm
[root@aliyum ~]# id cm
uid=1004(cm) gid=1004(cm)
groups=1004(cm),1005(devops)
[root@aliyum ~]# groupdel devops # 附加组可以删除
[root@aliyum ~]# id cm # 查看用户,发现他的附加组没有了
uid=1004(cm) gid=1004(cm) groups=1004(cm)
[root@aliyum ~]# groupdel cm # 无法删除组cm,因为组cm属于cm用户的主组
groupdel: cannot remove the primary group
of user 'egon1'
123456789101112131415
组成员管理
对于用户来说,组是分类的
1、一类是基本组或称主组,用户只能有一个基本组,创建时可通过-g指定,如未指定则创建一个默认的组(与用户同名)
2、附加组,基本组不能满足授权要求,创建附加组,将用户加入该组,用户可以属于多个附加组,加入一个组后就拥有了该组的权限
可选项参数:
-a:添加用户到组;
-d:从组删除用户;
-A:指定管理员;
-M:指定组成员和-A的用途差不多;
-r:删除密码;
-R:限制用户登入组,只有组中的成员才可以用newgrp加入该组。
注意:gpasswd将用户添加到组或从组中删除,只针对已存在的用户
[root@root ~]# groupadd it
[root@root ~]# gpasswd -a user07 it
# 将某个用户加入到某个组
[root@root ~]# gpasswd -M user02,user03,user04 it # 将多个用户加入到it组
[root@root ~]# gpasswd -A cm it # 指定cm为组it的组长,除了root用户外cm用户也可以采用第一条命令往it组里添加成员
[root@root ~]# grep 'it' /etc/group
# 查看it组中的成员
it:x:505:user02,user03,user04
[root@root ~]# gpasswd -d user07 it
# 删除用户usr07从it组
123456789101112131415161718
我们可以为组设置密码,然后让一些非组成员的用户通过命令”newgrp 组”临时切换到组内并输入密码的方式获取用户组的权限和特性,如下
[root@localhost ~]# groupadd group1
[root@localhost ~]# gpasswd group1
正在修改 group1 组的密码
新密码:
请重新输入新密码:
[root@localhost ~]# touch /tmp/a.txt
[root@localhost ~]# ll /tmp/a.txt
-rw-r--r-- 1 root root 0 8月 10 21:01
/tmp/a.txt
[root@localhost ~]# chown .group1 /tmp/a.txt //将a.txt添加到组group1中
[root@localhost ~]# !ll
ll /tmp/a.txt
-rw-r--r-- 1 root group1 0 8月 10 21:01
/tmp/a.txt
[root@localhost ~]# chmod g+w /tmp/a.txt //为文件所在的组设置写权限
[root@localhost ~]# gpasswd group1
[root@localhost ~]# su - cm
上一次登录:一 8月 10 21:01:46 CST 2020pts/0
上
[cm@localhost ~]$ echo "123" >> /tmp/a.txt # 此时没有权限
-bash: /tmp/a.txt: 权限不够
[cm@localhost ~]$ newgrp group1 # 临时切换到组group1下,拥有其权限
密码:
[cm@localhost ~]$ echo "123" >> /tmp/a.txt
[cm@localhost ~]$ cat /tmp/a.txt
123
1234567891011121314151617181920212223242526
五 手动创建用户
1. /etc/passwd
[root@localhost ~]# vim /etc/passwd # 新加一行
[root@localhost ~]# tail -1 /etc/passwd
cm2:x:1123:1123::/home/cm2:/bin/bash
123
2. /etc/shadow
[root@localhost ~]# openssl passwd -1 -salt 'i have a dream'
Password:
$1$i have a$UEsc7yzrB5DWmTvxRpTsp.
[root@localhost ~]# vim /etc/shadow
[root@localhost ~]# tail -1 /etc/shadow
cm2:$1$i have a$UEsc7yzrB5DWmTvxRpTsp.:18588:0:99999:7:::
1234567
制作密码
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 ##这是 生成的密文密码 $1$i have a$UEsc7yzrB5DWmTvxRpTsp.
##将生成的密码串,手动添加到/etc/shadow中就可用作用户的登陆密码了。
1234567891011121314
3. /etc/group
[root@localhost ~]# vim /etc/group
[root@localhost ~]# tail -1 /etc/group
cm2:x:1123:
123
4. /etc/gshadow
[root@localhost ~]# vim /etc/gshadow
[root@localhost ~]# tail -1 /etc/gshadow
cm2:!::
123
5. 创建用户家目录,并用用户老家的模板/etc/skel/ 装 修一下,注意权限
[root@localhost ~]# mkdir /home/cm2
[root@localhost ~]# ll /home/cm2
total 0
[root@localhost ~]# ll /home/
total 0
drwxr-xr-x. 2 root root 6 Nov 25 04:18 cm2
drwx------. 2 user6 hr 59 Nov 24 23:36 ll
drwx------. 2 lm lm 79 Nov 25 03:00 lm
drwx------. 2 root user03 59 Nov 24 23:21 user03
drwx------. 2 user05 user05 59 Nov 24 23:51 user05
drwx------. 2 user06 user06 59 Nov 24 23:26 user06
drwx------. 2 user6 hr 79 Nov 25 00:25 user6
drwx------. 2 y y 79 Nov 25 00:49 y
[root@localhost ~]# chown -R cm2:cm2 /home/cm2
[root@localhost ~]# cp -a /etc/skel/.bash* /home/cm2
12345678910111213141516
6. /var/spool/mail/xxx 用户邮箱文件
[root@localhost ~]# touch /var/spool/mail/cm2
[root@localhost ~]# chmod 660 /var/spool/mail/cm2
[root@localhost ~]# ll /var/spool/mail/
total 4
-rw-rw----. 1 root root 0 Nov 25 04:21 cm2
-rw-rw----. 1 gy mail 0 Nov 20 17:23 gy
-rw-rw----. 1 user6 mail 0 Nov 24 23:36 ll
-rw-rw----. 1 lm mail 0 Nov 25 02:39 lm
-rw-------. 1 root mail 1344 Nov 24 19:18 root
-rw-rw----. 1 root mail 0 Nov 24 23:21 user03
-rw-rw----. 1 user04 mail 0 Nov 24 23:22 user04
-rw-rw----. 1 user05 mail 0 Nov 24 23:51 user05
-rw-rw----. 1 user06 mail 0 Nov 24 23:26 user06
-rw-rw----. 1 user1 mail 0 Nov 24 17:29 user1
-rw-rw----. 1 user2 mail 0 Nov 24 18:08 user2
-rw-rw----. 1 user5 mail 0 Nov 24 23:16 user5
-rw-rw----. 1 user6 mail 0 Nov 24 23:44 user6
-rw-rw----. 1 y mail 0 Nov 25 00:47 y
[root@localhost ~]# chown -R cm2:cm2 /var/spool/mail/cm2
12345678910111213141516171819