引言
大家无论安装完linux系统和windows系统后,都会要求你去新建一个用户去登录,不会让你们直接使用超级管理员身份去登录自己的系统,这样是为了安全性的考虑。
大家对于Windows的了解是否知道新加的用户默认分配到那个组(user组),详解下计算机管理的一些选项。可以演示一下如何修改密码,新加用户等操作。查看日志报错,等信息
Linux安全模型
Authentication:认证,验证用户身份 用户密码
Authorization:授权, 不同的用户设置不同权限
Accouting|Audition:审计 事后追责
在linux中主要分为三种用户:
1.普通用户 权限受到限制的用户
2.超级管理员 拥有至高无上的权限
3.程序用户 不是给人使用的,是给程序使用的(仅用于维持系统或某个程序的正常运 行 )。 不允许登录
其中,每个用户是通过user id (UID 用户的身份证号) 来唯一标识的 , 同时也是系统用来区别用户身份的。
uid范围:
centos7以后
超级管理员 默认是 0
普通用户 1000 + 60000
程序用户 1 - 999
centos6以前
超级管理员 uid=0
程序用户 1-499
普通用户 500+
在Linux中每个用户必须属于一个组,不能独立于组外。在Linux中每个文件有所有者,所在组,其他组的概念
组的标识号:GID
建立账户时,若没有指定账户所属的组,系统会建立一个和用户名相同的组,这个组就是私有组,这个组默认只容纳了一个用户。
在用户所属组中的第一个组称为基本组,基本组在 /etc/passwd 文件中指定
基本组: 必须要有,有且唯一
默认新建用户时自动添加 同名 的组
附加组:除了第一个组外的其他组为附加组或公共组,附加组在 /etc/group 文件中指定
附加组 可有可无
[root@test1 ~]# id lisi
uid=1004(lisi) gid=1004(lisi) 组=1004(lisi),1005(kgc)
1004为基本组或私有 1005为附加组或公共组
UID(User IDentity,用户标识号):Linux 操作系统中的每一个用户账号都有一个数字形式的身份标记,称为 UID(UserIDentity,用户标识号),对于操作系统核心来说,UID 是区分用户的基本依据,原则上每个用户的 UID 号应该是唯一的。
root 用户账号的 UID 号为固定值 0,而程序用户账号的 UID号默认为1~499,500~60000 的 UID 号默认分配给普通用户使用。
centos7以后
超级管理员 默认是 0
普通用户 1000 + 60000
程序用户 1 - 999
centos6以前
超级管理员 uid=0
程序用户 1-499
普通用户 500+
[root@test1 ~]# id root
[root@test1 ~]# id zhangsan
uid=1000(zhangsan) gid=1000(zhangsan) 组=1000(zhangsan),10(wheel)
[root@localhost ~]#vim /etc/login.defs
#uid 的范围定义在此文件中
GID(Group IDentify,组标识号):与 UID 类似,每一个组账号也有一个数字形式的身份标记,称为 GID(Group IDentity,组标识号)。root 组账号的 GID 号为固定值 0,而程序组账号的 GID 号默认为 1~499,500~60000 的 GID 号默认分配给普通组使用。
用户 是员工 组 是职位
员工 可以兼职多个岗位
总有一个最重要的身份 主要组合附加组
主要组 必须要一个组 有且唯一
附加组 可有可无 有可以有多个
默认行为当你创建一个新用户时会自动创建一个和之同名的主组
用户的主要组(primary group):用户必须属于一个且只有一个主组,默认创建用户时会自动创建和用户名同名的组,做为用户的主要组,由于此组中只有一个用户,又称为私有组
用户的附加组(supplementary group): 一个用户可以属于零个或多个辅助组,附属组
存放保存用户名称、宿主目录、登录 Shell 等基本信息
分为7段,每段用冒号( :)隔开
[root@localhost ~]#cat /etc/passwd
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
省略多行...
root : x : 0 : 0 : root : /root : /bin/bash
用户名 :密码占位符 :uid :gid :备注信息 :家目录位置 :默认shell类型
shell类型
/sbin/nologin 这个shell类型比较奇怪 设置后不让登录
分为9段,每段用冒号( :)隔开
[root@localhost ~]#head -n 1 /etc/shadow
root:$6$MrGGbapvXkHGvI03$Mv0DPZJRhuQh0Y20VAF7AjDXolxi/bbQkwiqp8gmK8mQrLr86tMOHk8zke0cKlNQzGLGku6yk4bUiLlCjoqN90::0:99999:7:::
为了方便理解,在里面添加了一些数据
root : $6$Mr(..省略..)N90 : 19717 : 7 : 99999 : 7 : 8 : 19718 :
1 2 3 4 5 6 7 8 9
1. root 用户名
2. $6$Mr(..省略..)N90 加密的密码 (* 或 !!代表不能登录)
3.19717 最后一次修改密码的时间
4.7 限制更改密码的期限(7天 , 0代表随意更改)
5.99999 密码有效时间 (99999 (天)代表永久有效)
6.7 密码过期的前7天会提醒你一次修改密码(不改就不给登录了)
7.8 密码过期8天后会被锁定 无法登录系统
8.19718 明天过期 用户的有效期(19718-19717=1天),超过登录不了系统
9. 保留字段 未使用
最后一次修改密码的时间如何计算:
1970 年 01 月 01 日这是linux诞生的第一年已他作为元年开始计算
date -d '1970-01-01 19717 days'
#计算实际修改日期
命令 :useradd [选项] 用户名
useradd 原理:
使用 useradd 命令 最后是在passwd 文件中 添加了7条记录
添加用户:查看是否在 passwd和shadow文件中生成信息
在/etc/passwd 文件和/etc/shadow 文件的末尾增加该用户账号的记录
若未明确指定用户的宿主目录,则在/home 目录下自动创建与该用户账号同名的宿 主目录,并在该目录中建立用户的各种初始配置文件。
若没有明确指定用户所属的组,则自动创建与该用户账号同名的基本组账号,组账 号的记录信息将保存到/etc/group 和/etc/shadow 文件中。
[root@localhost ~]#useradd nanshan
[root@localhost ~]#id nanshan
uid=1003(nanshan) gid=1003(nanshan) 组=1003(nanshan)
[root@localhost ~]#cat /etc/passwd | tail -n1
nanshan:x:1003:1003::/home/nanshan:/bin/bash
[root@localhost ~]#cat /etc/shadow | tail -n1
nanshan:!!:19717:0:99999:7:::
!! 代表无法登录
选项:
-u :指定用户的 UID 号,要求该 UID 号码未被其他用户使用。
-d :指定家目录(当与-M 一起使用时,不生效)。
-e :指定用户的账户失效时间,可使用 YYYY-MM-DD 的日期格式。
-M :不生成家目录
-g :指定用户的基本组名(或使用 GID 号)。
-G :指定用户的附加组名(或使用 GID 号)。
-s :指定用户的登录 Shell /sbin/nologin
-p :密码
[root@localhost ~]#useradd -u 1145 -d /data -g root -G nanshan cho
useradd:警告:此主目录已经存在。
不从 skel 目录里向其中复制任何文件。
[root@localhost ~]#id cho
uid=1145(cho) gid=0(root) 组=0(root),1003(nanshan)
useradd -u 2222 -M -s /sbin/nologin
指定用户的失效时间 -e
useradd aaa -e 2023-12-27
指定家目录:-d 目录
useradd aaa -d /data/aaa
命令 :passwd [选项]... 用户名
为用户账号设置密码
基本用法 不加选项 可以添加密码
[root@test1 /]# passwd lisi 修改lisi 用户密码输入两次密码
更改用户 lisi 的密码 。
新的 密码:
无效的密码: 密码少于 8 个字符
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
选项:
-d:清空指定用户的密码,仅使用用户名即可登录系统。
-l:锁定用户账户。
-S:查看用户账户的状态(是否被锁定)。
-u:解锁用户账户。
[root@localhost ~]#passwd cho
更改用户 cho 的密码 。
新的 密码:
无效的密码: 密码少于 8 个字符
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
[root@localhost ~]#
[root@localhost ~]#passwd -l cho
锁定用户 cho 的密码 。
passwd: 操作成功
[root@localhost ~]#tail -n1 /etc/shadow
cho:!!$6$2xcRE8cc$ewXTcXdPVgXhhnNWSiImENXlzkmUUWe4J2l.Mo3nZk.CWD7QI7V0jrpute5mRGYR8Xq1WEslozG3x2RD8nhtv0:19717:0:99999:7:::
[root@localhost ~]#passwd -d cho
清除用户的密码 cho。
passwd: 操作成功
[root@localhost ~]#passwd -S cho
cho NP 2023-12-26 0 99999 7 -1 (密码为空。)
[root@localhost ~]#passwd -u cho
解锁用户 cho 的密码。
passwd: 警告:未锁定的密码将是空的。
passwd: 不安全的操作(使用 -f 参数强制进行该操作)
[root@localhost ~]#passwd -fu cho
解锁用户 cho 的密码。
passwd: 操作成功
免交互输入密码:
[root@localhost ~]#echo '123'|passwd --stdin cho
更改用户 cho 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@localhost ~]#passwd -S cho
cho PS 2023-12-26 0 99999 7 -1 (密码已设置,使用 SHA512 算法。)
命令 :usermod [选项]... 用户名
选项:
-d :指定家目录(当与-M 一起使用时,不生效)。
-e :指定用户的账户失效时间,可使用 YYYY-MM-DD 的日期格式。
-g :指定用户的基本组名(或使用 GID 号)。
-G :指定用户的附加组名(或使用 GID 号)。
-s :指定用户的登录 Shell /sbin/nologin
[root@localhost ~]# echo "123123" | passwd --stdin zhou //无交互修改
更改用户 zhou 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@localhost ~]# usermod -L zhou //锁定用户
[root@localhost ~]# passwd -S zhou //查看状态
zhou LK 2021-07-02 0 99999 7 -1 (密码已被锁定。)
[root@localhost ~]# usermod -U zhou //解锁
[root@localhost ~]# passwd -S zhou //查看状态
zhou1 PS 2021-07-02 0 99999 7 -1 (密码已设置,使用 SHA512 算法。)
[root@localhost ~]#usermod -L cho
[root@localhost ~]#passwd -S cho
cho LK 2023-12-26 0 99999 7 -1 (密码已被锁定。)
[root@localhost ~]#passwd -u cho
解锁用户 cho 的密码。
passwd: 操作成功
[root@localhost ~]#passwd -S cho
cho PS 2023-12-26 0 99999 7 -1 (密码已设置,使用 SHA512 算法。)
[root@localhost ~]# usermod -l zhou1 zhou //修改用户名
[root@localhost ~]# id zhou //验证查看
id: zhou: no such user
[root@localhost ~]# id zhou1
uid=1002(zhou1) gid=10(wheel) 组=10(wheel),0(root)
[root@localhost ~]# cd /home/
[root@localhost home]# ls
lisi zhangsan zhou
[root@localhost home]# mv zhou/ /
[root@localhost home]# ls
lisi zhangsan
[root@localhost home]# usermod -d /zhou zhou
使用前要先手动更改目录,-d只是更新信息
随机生成密码
cat /dev/random | tr -cd [a-zA-Z0-9] | head -c 12
[a-zA-Z0-9]正则表达式的方框
匹配小写a-z 大写A-Z 数字0-9 的字符
命令: userdel [选项] 用户
-r 将家目录一起删除
[root@localhost etc]# userdel -r zhou1 //连宿主目录一起删除
[root@localhost etc]# id zhou1 //验证
id: zhou1: no such user
[root@localhost etc]# cd /home/
[root@localhost home]# ls
lisi zhangsan
用户账号的初始配置文件来源: /etc/skel 中复制来的
主要的用户初始配置文件
~/.bash_profile 开机启动时找不到~/.bashrc,会代替执行
~/.bashrc 开机启动时执行文件内的内容
~/.bash_logout 关机时使用的文件
与用户帐号文件相类似
/etc/group:保存组帐号基本信息
/etc/gshadow:保存组帐号的密码信息基本不使用
[root@test1 /]# grep "adm" /etc/group //过滤/etc/group文件下的adm文件
adm:x:4:
groupadd命令
groupadd -g [GID] 组账号名
[root@test1 /]# groupadd zhou //添加组账号
[root@test1 /]# tail -1 /etc/group
zhou:x:1002:
[root@test1 /]# groupadd -g 88 zhou //-g指定组id
[root@test1 /]# tail -1 /etc/group
zhou:x:88:
gpasswd 命令——添加、设置、删除组成员
-a:向组内添加一个用户
-d:从组内删除一个用户成员
-M:定义组成员列表,以逗号分隔
[root@test1 /]# useradd zhou1 //组内加入新成员
[root@test1 /]# gpasswd -a zhou1 zhou
正在将用户“zhou1”加入到“zhou”组中 用户在前,组在后
[root@test1 /]# gpasswd -d zhou1 zhou
正在将用户“zhou1”从“zhou”组中删除
[root@test1 /]# gpasswd -M zhou1,zhou zhou
[root@test1 /]# grep "^zhou" /etc/group
zhou:x:88:zhou1,zhou
groupdel 组帐号名
[root@test1 /]# groupdel zhou
[root@test1 /]#
finger命令查询用户帐号的详细信息(finger [用户名])
[root@test1 Packages]# finger zhangsan
Login: zhangsan Name: zhangsan
Directory: /home/zhangsan Shell: /bin/bash
Last login 五 7月 2 09:17 (CST) on pts/0
No mail.
No Plan.
w
查询已登录到主机的用户信息
[root@localhost ~]# w [选项] [用户名]
-h 不显示输出信息的标题
-l 用长格式输出
-s 用短格式输出,不显示登陆时间,JCPU 和 PCPU 时间
-V 显示版本信息
[root@test1 Packages]# w
11:20:58 up 2:05, 1 user, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.100.99 09:16 2.00s 0.74s 0.02s w
上面的输出信息中,第一行其实和 top 命令的第一行非常类似,主要显示了当前的系统时间、系统从启动至今已运行的时间、登陆到系统中的用户数和系统平均负载。平均负载(load average)指的是在 1 分钟、5 分钟、15 分钟内系统的负载状况
从第二行开始,显示的是当前所有登陆系统的用户信息,第二行是用户信息的各列标题,从第三行开始每行代表一个用户。这些标题的含义如表 所示
标题 | 含义 |
---|---|
USER | 登录到系统的用户。 |
TTY | 登录终端。 |
FROM | 表示用户从哪里登陆进来,一般显示远程登陆主机的 IP 地址或者主机名。 |
LOGIN@ | 用户登陆的日期和时间。 |
IDLE | 表示某个程序上次从终端开始执行到现在所持续的时间。 |
JCPU | 和该终端连接的所有进程占用的 CPU 运算时间。这个时间里并不包括过去的后台作业时间,但是包括当前正在运行的后台作业所占用的时间。 |
PCPU | 当前进程所占用的 CPU 运算时间。 |
WHAT | 当前用户正在执行的进程名称和选项,换句话说,就是表示用户当前执行的是什么命令。 |
相比较 w 命令,who 命令只能显示当前登陆的用户信息,但无法知晓每个用户正在执行的命令。 who 命令的基本格式如下:
[root@localhost ~]# who [选项] [file]
需要说明的是,who 命令默认是通过 /var/run/utmp 文件来获取登陆用户信息,但如果通过 file 指定另一个文件,则 who 命令将不再默认读取 /var/run/utmp 文件,而是读取该指定文件来获取信息。
选项 | 含义 |
---|---|
-a | 列出所有信息,相当于所有选项。 |
-b | 列出系统最近启动的时间日期。 |
-l | 列出所有可登陆的终端信息。 |
-m | 仅列出关于当前终端的信息,who -m 命令等同于 who am i 。 |
-q | 列出在本地系统上的用户和用户数的清单。 |
-r | 显示当前系统的运行级别。 |
-s | 仅显示名称、线路和时间字段信息,这是 who 命令的默认选项。 |
-u | 显示当前每个用户的用户名、登陆终端、登陆时间、线路活动和进程标识。 |
-T 或 -w | 显示 tty 终端的状态,“+”表示对任何人可写,“-”表示仅对 root 用户或所有者可写,“?”表示遇到线路故障。 |
[root@localhost ~]#users
root
r 可以看 (r,4)
w 可以改 (w,2)
x 可以执行 (x,1程序,脚本)
这些权限对于 文件夹 而言:
一定要有 x ,没有 x 有 rw 也没用
r 可以看文件夹有哪些文件
w 可以修改文件夹下所有的文件
x 执行 可以cd进入此目录,可以使用ls -l查看此目录中文件元数据(须配合r权限),属于目录的可访问的最小权限
这些权限对于 文件 而言:
r 可看文件的内容 比如:cat,可以获取其内容
w 可修改文件内容
x 可运行文件
[root@localhost nginx-1.18.0]#ll CHANGES
- rw- r-- r--. 1 lisi lisi 302863 4月 21 2020 CHANGES
- rw- r-- r--
文件类型 属主 属组 其他
rwx 有就写 ,没有就用 - 表示没有
如上所示
属主: rw 可读可写
属组: r 只可读
其他: r 只可读
注意:
一个文件夹能否被删除 跟所在文件夹权限有关。只要所在文件夹有 wx 权限 就可以删除。跟自身没关系。
要复制一个文件,看当前用户有没有读的权限。
有就可以复制。
能不能操作文件 文件夹 跟你当前登录的 用户权限是有关系的。
数字表示法
1 真 0 假
r 4
w 2
x 1
r w x
1 0 0 -------4
0 1 0 -------2
0 0 1 -------1
chmod 修改文件、文件夹权限
chmod 模式法:
u 属主 chomd u+rwx 文件
g 属组 chomd g+rwx 文件
o 其他用户 chomd o+rwx 文件
a 所有人 chomd a+rwx 给所有人加上rwx权限
+ 是在 原有的基础上 加上权限
- 是在 原有的基础上 减去权限
= 赋予 原有权限不看 ,写上等号后面的权限
权限:r,w,x(普通权限对root无效)
chmod 数字法:
1 2 4
x w r
chmod 777 文件名(文件、文件夹名)
-R 递归 所有都改
面试题:
文件夹 一定要有执行权限
你去切知道文件夹的名字才能
执行 cp /etc/issue /data/dir/ 所需要的最小权限?
/bin/cp 需要x权限
/etc/ 需要x权限
/etc/issue 需要r权限
/data 需要x权限
/data/dir 需要w,x权限
一般谁新建的文件谁就是所属主
chown 修改所属主
格式 :chown 用户:组名 文件名
#修改所属主,和所属组
-R 递归修改
[root@localhost aa]#chown -R zhangsan:zhangsan /opt/aa/
#递归修改
[root@localhost aa]#ll
总用量 0
-rw-r--r--. 1 zhangsan zhangsan 0 9月 17 21:53 1
-rw-r--r--. 1 zhangsan zhangsan 0 9月 17 21:53 10
-rw-r--r--. 1 zhangsan zhangsan 0 9月 17 21:53 2
-rw-r--r--. 1 zhangsan zhangsan 0 9月 17 21:53 3
-rw-r--r--. 1 zhangsan zhangsan 0 9月 17 21:53 4
-rw-r--r--. 1 zhangsan zhangsan 0 9月 17 21:53 5
-rw-r--r--. 1 zhangsan zhangsan 0 9月 17 21:53 6
-rw-r--r--. 1 zhangsan zhangsan 0 9月 17 21:53 7
-rw-r--r--. 1 zhangsan zhangsan 0 9月 17 21:53 8
-rw-r--r--. 1 zhangsan zhangsan 0 9月 17 21:53 9
##注意!!!
[root@localhost aa]#chown zhangsan:zhangsan /
#此命令效果不亚于删除根目录
作用:umask 命令用来控制「权限掩码」,为新建的文件或目录设置一个「初始权限」。
文件/目录创建时的初始权限 = 默认权限 - 权限掩码
[root@localhost ~]#umask
0022
这个四位数的 umask 值中:
第一位的0,表示「特殊权限」,暂时不用理会。
第二位的0,表示「属主权限」,从用户权限减0,也就是权限不变。
第三位的2,表示「属组权限」,从组权限减2,也就是减掉 写 的权限。
第四位的2,表示「其他用户权限」,从其他用户权限减2,即取消其他用户 写 的权限。
umask 命令后面直接跟权限掩码,可以 临时修改 权限掩码,重启后失效。
[root@localhost ~]#umask //修改前
0022
[root@localhost ~]#umask 0021
[root@localhost ~]#umask //修改后
0021
umask 的配置文件时 /etc/bashrc 。
vim /etc/bashrc
文件默认权限: - rw- rw- rw-
目录默认权限: d rwx rwx rwx
我们把 umask 的值设置为0,表示用户权限减0,然后再创建目录,可以看到,目录的默认权限
接下来,我们把 umask 的值设置为0011,表示用户组权限-1,其他用户权限-1,也就是取消用户组和其他用户的执行权限(文件夹)
数值 | 权限 | 含义 |
---|---|---|
0 | — | 无权限 |
1 | –x | 执行权限 |
2 | -w- | 写权限 |
3 | -wx | 写、执行权限 |
4 | r– | 只读权限 |
5 | r-x | 读、执行权限 |
6 | rw- | 读写权限 |
7 | rwx | 读、写、执行权限 |
umask值 | 文件权限 | 目录权限 | 含义 |
---|---|---|---|
002 | 664 | 775 | 取消其他用户写权限 |
006 | 660 | 771 | 取消其他用户读、写权限 |
022 | 644 | 755 | 取消用户组、其他用户的写权限 |
027 | 640 | 750 | 取消其他用户读、写权限;取消用户组的写权限 |
访问控制列表 ACL
ACL:Access Control List,实现灵活的权限管理
除了文件的所有者,所属组和其它人,可以对更多的用户设置权限
CentOS7 默认创建的xfs和ext4文件系统具有ACL功能
CentOS7 之前版本,默认手工创建的ext4文件系统无ACL功能,需手动增加
用法: setfacl [-bkndRLP] { -m|-M|-x|-X ... } file ...
-m, --modify-acl 更改文件的访问控制列表
-M, --modify-file=file 从文件读取访问控制列表条目更改
-x, --remove=acl 根据文件中访问控制列表移除条目
-X, --remove-file=file 从文件读取访问控制列表条目并删除
-b, --remove-all 删除所有扩展访问控制列表条目
-k, --remove-default 移除默认访问控制列表
--set=acl 设定替换当前的文件访问控制列表
--set-file=file 从文件中读取访问控制列表条目设定
--mask 重新计算有效权限掩码
-n, --no-mask 不重新计算有效权限掩码
-d, --default 应用到默认访问控制列表的操作
-R, --recursive 递归操作子目录
-L, --logical 依照系统逻辑,跟随符号链接
-P, --physical 依照自然逻辑,不跟随符号链接
--restore=file 恢复访问控制列表,和“getfacl -R”作用相反
--test 测试模式,并不真正修改访问控制列表属性
-v, --version 显示版本并退出
-h, --help 显示本帮助信息
————————————————
---------------------------------------------------------------------------------------------------------------------------------