用户和权限管理

概述重点(文章很长着急可看概述和目录谢谢)

  • 了解用户,组,权限的关系
  • 了解用户和组的配置文件内容
  • 熟练对用户和组操作命令(创建,修改,删除,设置密码)
  • 了解文件特殊权限

1 Linux安全模型

总结:

【认证用户,授权操作,审计日常】
认证
1.要去系统中找,有没有此用户
2.如果用户不存在,
3.报错,给出提示
4.如果用户存在
5.输密码,然后校验密码

授权
1.把此用户有哪些权限,记下来,跟用户绑定
2.用户在执行某个操作的时候,先去检查是否有权限
审计
保存操作数据,已供后续审查。

资源分派:
Authentication:认证,验证用户身份
Authorization:授权,不同的用户设置不同权限
Accouting:审计,事后行为
在Linux系统中,当用户登录成功时,系统会自动分配令牌 token,包括:用户标识和组成员等信息。
3A认证:
又称AAA认证,是一套针对网络设备的网络访问控制策略安全模型。

#用于审计的登录日志
#rocky8.6
[root@rocky8 ~]# cat /var/log/secure
Jun 25 07:50:35 rocky8 polkitd[965]: Registered Authentication Agent for unixsession:c1 (system bus name :1.52 [/usr/bin/gnome-shell], object path 
/org/freedesktop/PolicyKit1/AuthenticationAgent, locale en_US.UTF-8)
Jun 25 07:51:52 rocky8 sshd[2413]: Accepted password for root from 10.0.0.1 port 
53734 ssh2
Jun 25 07:51:52 rocky8 systemd[2420]: pam_unix(systemd-user:session): session 
opened for user root by (uid=0)
Jun 25 07:51:52 rocky8 sshd[2413]: pam_unix(sshd:session): session opened for
user root by (uid=0)

[root@ubuntu2204 ~]# tail /var/log/auth.log
May  9 16:34:13 ubuntu2204 passwd[8219]: pam_unix(passwd:chauthtok): password 
changed for jose
May  9 17:13:30 ubuntu2204 sshd[1805]: pam_unix(sshd:session): session closed 
for user root
May  9 17:13:30 ubuntu2204 systemd-logind[890]: Session 4 logged out. Waiting 
for processes to exit.
May  9 17:13:30 ubuntu2204 systemd-logind[890]: Removed session 4.
May  9 17:13:45 ubuntu2204 sshd[8275]: Accepted password for root from 10.0.0.1 
port 58443 ssh2
May  9 17:13:45 ubuntu2204 sshd[8275]: pam_unix(sshd:session): session opened 
for user root(uid=0) by (uid=0)
May  9 17:13:45 ubuntu2204 systemd-logind[890]: New session 7 of user root.

1.1 用户

总结:

【UID为0是管理员,系统用户(提供守护进程)】
Linux系统是多用户系统,可以同时存在多个用户,每个用户之间都是互相隔离的。
在Linux系统中,每个用户是通过User Id (UID)来唯一标识的。
image.png
—管理员:root, 0
—普通用户:1-60000 自动分配
系统用户:1-499 (CentOS 6以前), 1-999 (CentOS 7以后) 对守护进程获取资源进行权限分

登录用户:500+ (CentOS6以前), 1000+(CentOS7以后) 给用户进行交互式登录使用
在Linux中,root以下,都是普能用户,其用户id为1-60000
image.png

1.2 用户组

【系统组 为守护进程分配权限】
Linux中可以将一个或多个用户加入用户组中,组就是包含0个或多个用户的集合,用户组是通过Group
ID(GID) 来唯一标识的。
image.png
—管理员组:root, 0
—普通组:
系统组:1-499(CentOS 6以前), 1-999(CentOS7以后), 对守护进程获取资源进行权限分配
普通组:500+(CentOS 6以前), 1000+(CentOS7以后), 给用户使用
image.png

1.3 用户和组的关系

总结:

【用户创建完成就有一个主组(主要组),所以用户至少有一个组,也可以有多个组,附加组适用于给用户增加权限或选择集合用户 所以:一个组至少有0个用户,也可以有多个用户】

1.一个用户至少有一个组,也可以有多个组;
2.一个组至少有0个用户,也可以有多个用户;
3.用户的主要组(primary group):又称私有组,一个用户必须属于且只有一个主组,创建用户时,
默认会创建与其同名的组作为主组;
4.用户的附加组(supplementary group):又称辅助组,一个用户可以属于0个或多个附加组;
5.使用组,可以对用户进行批量管理,比如对一个组授权,则该组下所有的用户能能继承这个组的权
限;

[root@10 ~]# id wang
uid=1001(wang) gid=1001(wang) groups=1001(wang)
[root@10 ~]# id root
uid=0(root) gid=0(root) groups=0(root)

1.4 安全上下文

总结

【程序是可运行的二进制文件,进程是运行中的程序】
【 重要关系:程序—(运行)—进程—(被执行)—用户 —(权限)—程序】

**Linux安全上下文Context: **
在Linux系统中,运行中的程序(即进程process),都是以进程发起者的身份运行;
进程所能够访问的资源权限取决于进程的运行者的身份;
**首先,什么是程序 **
一个程序或一个命令,本质上也是一个可执行的二进制文件或一个可执行的脚本文件;
在服务器上有很多文件,只有那些特定的,可以被执行的二进制文件,才能被称为程序;
**其次,什么是进程 **
运行中的程序,就是进程;
**第三,程序,进程,用户之间的关系是怎样的 **
只有可以被执行的文件,才能叫作程序;
对于同一个程序,也不是所有用户都可以运行的,这要取决于当前用户对该程序有没有可执行权限;
用户张三,运行了某个程序,那么,张三就发起了一个进程,该进程的发起者,就是张三,该进程是以
张三的身份在运行;
打个比方,在交通工具中,只有能在天上飞的,才能叫作飞机;
对于同一架飞机,也不是所有人都能上去的,这要取决于有没有买机票,有没有登机牌;
**第四,进程的访问资源 **
一个进程能不能访问某些资源,是由进程发起者决定的(跟进程本身的程序文件无关),比如某进程要
读写某个文件,则要看该进程发起者有没有权限读取该文件;
一个旅客能不能坐头等舱,是由旅客自己决定的,跟飞机本身无关;

2 用户和组的配置文件

2.1 用户和组的主要配置文件

/etc/passwd:用户及其属性信息(名称、UID、主组ID等)
/etc/shadow:用户密码及其相关属性
/etc/group:组及其属性信息
/etc/gshadow:组密码及其相关属性

2.2 passwd文件格式

总结

【passwd :存储的是用户重要信息就(认证就是调用这里)】
主要内容:
login name #登录用户名
password #密码位,x只是表示一个占位符,可为空
UID #用户ID,0 表示超级管理员
GID #所属组ID
GECOS #用户全名或注释,描述信息,可为空
directory #用户家目录,在创建用户时,默认会创建在/home 目录下
shell #用户默认shell,/sbin/nologin 表示不用登录的 shell,一般用 chsh 命令修
改 chsh -s /bin/csh mage

/etc/passwd

####man帮助passwd####
whatis passwd
openssl-passwd (1ssl) - compute password hashes
passwd (1)           - update user's authentication tokens
passwd (5)           - password file
man 5 passwd #查看帮助手册
#文件格式
#login name:password:UID:GID:GECOS:directory:shell
root:x:0:0:root:/root:/bin/bash
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
  mage:x:1002:1002::/home/mage:/bin/bash
  ...............................
login name #登录用户名
password #密码位,x只是表示一个占位符,可为空
UID #用户ID,0 表示超级管理员
GID #所属组ID
GECOS #用户全名或注释,描述信息,可为空
directory #用户家目录,在创建用户时,默认会创建在/home 目录下
shell #用户默认shell,/sbin/nologin 表示不用登录的 shell,一般用 chsh 命令修
改 chsh -s /bin/csh mage

2.3 shadow文件格式

总结

【【shadow :存储的是密码重要信息就对应passwd的密码(认证也就是调用这里)】】
此文件中存储的是用户密码信息,任何用户都无权限

root@ubuntu22:~# ll /etc/shadow
-rw-r----- 1 root shadow 1019 Dec 15 06:14 /etc/shadow
[root@10 ~]# ll /etc/shadow
----------. 1 root root 912 Dec 19 09:52 /etc/shadow

主要内容:
login name #登录用户名
encrypted password #加密后的密文,一般用sha512加密,可为空,!表示该用户被锁
定,不能登录系统
date of last password change #上次修改密码的时间,自1970年开始,0表示下次登录之后就要改密
码,为空表示密码时效功能无效
minimum password age #最小时间间隔,当前密码最少能使用多少天,0表示随时可被变更
maximum password age #最大时间间隔,当前密码最多能使用多少天,99999表示可以一直使

password warning period #警告时间,密码过期前几天开始提醒用户,默认为7
password inactivity period #不活动时间,密码过期几天后帐号会被锁定,在此期间,用户仍然可
以登录,为空表示不使用此规则
account expiration date #失效时间,从1970年1月1日算起,多少天后帐号失效,为空表示永
不过期
reserved field #保留字段,无意义

whatis shadow
shadow (5)           - shadowed password file
shadow (3)           - encrypted password file routines
man 5 shadow
#文件格式
#login name:encrypted password:date of last password change:minimum password 
age:maximum password age:password warning period:password inactivity 
period:account expiration date:reserved field
root:$6$lwdNTBEpfKFnUipo$Zm4JTG7vVVg6lJaMJ7sPTqmbc/I6GGMIjp7yO.rd6TsKb0lEeRHn4q7
Z/LWJvV/FAWgTJVta9Gd78NPVNfld.1::0:99999:7:::
ftp:*:18700:0:99999:7:::
postfix:!!:19424::::::
jose:$6$Cvfl7WE8khYDd/xb$4pNMm.C46MEOUElWyFbRvO2FcGFv/a.EdD9rtWa0jvZdoThq8spMGw4
rPbcQzqsY99hW3aImVK4SPR/KJaoSh0:19168:0:99999:7:::
.......................................................................
login name  #登录用户名
encrypted password  #加密后的密文,一般用sha512加密,可为空,!表示该用户被锁
定,不能登录系统
date of last password change  #上次修改密码的时间,自1970年开始,0表示下次登录之后就要改密
码,为空表示密码时效功能无效
minimum password age  #最小时间间隔,当前密码最少能使用多少天,0表示随时可被变更
maximum password age  #最大时间间隔,当前密码最多能使用多少天,99999表示可以一直使
用
password warning period  #警告时间,密码过期前几天开始提醒用户,默认为7
password inactivity period    #不活动时间,密码过期几天后帐号会被锁定,在此期间,用户仍然可
以登录,为空表示不使用此规则
account expiration date       #失效时间,从1970年1月1日算起,多少天后帐号失效,为空表示永
不过期
reserved field           #保留字段,无意义

所有伪用户的密码都是 “!!” 或 “*”,代表没有密码是不能登录的,新建用户还没设密码时为!!,禁用账
号,可以直接在密码字段前加 !

2.4 group文件格式

总结

【用户组的重要内容】
group_name #组名
password #组密码,当用户加组时,需要用此密码验证
GID #组ID
user_list #用户列表,多个用户用,分隔, 此处的用户将当前组作为附加组


man group
#文件格式
#group_name:password:GID:user_list
ftp:x:50:
mage:x:1002:
group_name     #组名
password   #组密码,当用户加组时,需要用此密码验证
GID       #组ID
user_list #用户列表,多个用户用,分隔, 此处的用户将当前组作为附加组

2.5 gshadow文件格式

总结

【用户组密码以及详细信息】对应group

group name #组名
encrypted password #组密码,加密后的密文,!表示还没设密码
administrators #组管理员
members #用户列表,多个用户用,分隔, 此处的用户将当前组作为附加组

man gshadow
#文件格式
#group name:encrypted password:administrators:members
ftp:::
mage:!::
group name #组名
encrypted password #组密码,加密后的密文,!表示还没设密码
administrators #组管理员
members #用户列表,多个用户用,分隔, 此处的用户将当前组作为附加组

2.6 文件操作

【知道了解即可】
可以直接用编辑工具来修改上述文件,但由于跟用户和权限有关的文件具有敏感性,所以系统提供了专用的工具来修改这几个文件。
**vipw & vigr **
pwck & grpck

【重要可以直接掉用passwd中的信息】
getent

root@ubuntu22:~# getent passwd root
root:x:0:0:root:/root:/bin/bash

3 用户和组管理命令

用户管理命令
useradd
usermod
usermod
组帐号维护命令
groupadd
groupmod
groupdel

3.1 用户创建

总结:

【用户创建,修改(选项基本相通) 删除和rm重要选项一样】
【配置文件内容都有出处】
useradd 命令可以创建新的Linux用户
image.png
格式:
-u:指定用户id,-g:指定组用户 , -d:指定家目录, -s指定shell类型,-r:创建系统用户,-m创建用户家目录,-M:不创建家目录,一般用于不用登录的用户,-D:显示或修改默认配置文件 -o -p(了解)

useradd [options] LOGIN
useradd -D
useradd -D [options]
#常见选项
-u|--uid UID             #指定UID
-g|--gid GID             #指定用户组,-g groupname|--gid GID
-c|--comment COMMENT         #新账户的 GECOS 字段
-d|--home-dir HOME_DIR       #指定家目录,可以是不存在的,指定家目录,并不代表创建
家目录
-s|--shell SHELL         #指定 shell,可用shell在/etc/shells 中可以查看
-r|--system               #创建系统用户,CentOS 6之前 ID<500,CentOS7 以后
ID<1000,不会创建登录用户相关信息
-m|--create-home         #创建家目录,一般用于登录用户
-M|--no-create-home       #不创建家目录,一般用于不用登录的用户
-p|--password PASSWORD   #设置密码,这里的密码是以明文的形式存在
于/etc/shadow 文件中
-o|--non-unique           #允许使用重复的 UID 创建用户
-G|--groups GROUP1[,GROUP2,...]   #为用户指明附加组,组须事先存在
-N|--no-user-group       #不创建同名的组,使用users组做主组
-D|--defaults               #显示或更改默认的 useradd 配置,默认配置文件是
/etc/default/useradd
-e|--expiredate EXPIRE_DATE #指定账户的过期日期 YYYY-MM-DD 格式
-f|--inactive INACTIVE       #密码过期之后,账户被彻底禁用之前的天数,0 表示密码过
期立即禁用,-1表示不使用此功能
-k|--skel SKEL_DIR #指定家目录模板,创建家目录,会生成一些默认文件,如果指定,就从该目录复制
文件,默认是/etc/skel/,要配合-m
-K|--key KEY=VALUE   #不使用 /etc/login.defs 中的默认值,自己指定,比如
-K UID_MIN=100 
-l|--no-log-init #不将用户添加到最近登录和登录失败记录,前面讲到的3a认证审计,就在此处
lastlog|lastb|cat /var/log/secure
****设置主组之前,主组不存在,报错****
root@ubuntu22:~# useradd -g 666 bai
useradd: group '666' does not exist

****在设置主组之前,主组必须存在****
root@ubuntu22:~# groupadd -g 666 zhang
root@ubuntu22:~# 
root@ubuntu22:~# useradd -g 666 bai
root@ubuntu22:~# id bai
uid=1001(bai) gid=666(zhang) groups=666(zhang)
root@ubuntu22:~#
root@ubuntu22:~# userdel -rf bai
userdel: bai mail spool (/var/mail/bai) not found
userdel: bai home directory (/home/bai) not found
root@ubuntu22:~# 
root@ubuntu22:~# useradd bai
root@ubuntu22:~# id bai
uid=1001(bai) gid=1001(bai) groups=1001(bai)
#创建用户(以创建系统用户为主)
useradd -u 336 -g mysql -s /sbin/nologin -d /data/mysql -M -r mysql
#查看
[root@ubuntu2204 ~]# useradd -u 336 -g mysql -s /sbin/nologin -d /data/mysql -M 
-r mysql
[root@ubuntu2204 ~]# getent passwd mysql
mysql:x:336:336::/data/mysql:/sbin/nologin
[root@ubuntu2204 ~]# getent shadow mysql
mysql:!!:19168::::::

#创建用户(以创建交互式用户为主)
root@ubuntu22:~# useradd -u 512 -g zhang -s /bin/bash -d /data/mysql -m haha
root@ubuntu22:~# 
root@ubuntu22:~# id haha 
uid=512(haha) gid=666(zhang) groups=666(zhang)
root@ubuntu22:~# getent passwd haha 
haha:x:512:666::/data/mysql:/bin/bash


默认创建

root@ubuntu22:~# useradd bai
root@ubuntu22:~# id bai
uid=1001(bai) gid=1001(bai) groups=1001(bai)
root@ubuntu22:~# getent passwd bai
bai:x:1001:1001::/home/bai:/bin/sh
root@ubuntu22:~# getent shadow bai
bai:!:19710:0:99999:7:::
root@ubuntu22:~# getent group bai
bai:x:1001:
root@ubuntu22:~# getent gshadow bai
bai:!::
***Racky默认不创建家目录***
root@ubuntu22:~# ls /home/bai
ls: cannot access '/home/bai': No such file or directory


***Racky默认创建家目录***
[root@10 ~]# useradd mage
[root@10 ~]# geten
getenforce  getent      
[root@10 ~]# getent passwd mage
mage:x:1002:1002::/home/mage:/bin/bash
[root@10 ~]# ls -a /home/mage/
.  ..  .bash_logout  .bash_profile  .bashrc


useradd 命令默认值设定由/etc/default/useradd定义

[root@rocky8 ~]# cat /etc/default/useradd
# useradd defaults file
GROUP=100 #useradd不指定组,且/etc/login.defs中的USERGROUPS_ENAB为no或
useradd -N时,group 为100
HOME=/home #默认家目录父目录
INACTIVE=-1   #对应/etc/shadow文件第7列,即用户密码过期后的帐号锁定的宽限期,-1
表示不锁定
EXPIRE=       #对应/etc/shadow文件第8列,即用户帐号的有效期
SHELL=/bin/bash #默认bash
SKEL=/etc/skel #用于生成新建用户家目录的模版文件
CREATE_MAIL_SPOOL=yes #默认创建收件箱

显示或更改默认设置

#useradd -D 
#useradd –D -s SHELL
#useradd –D –b BASE_DIR
#useradd –D –g GROUP
#查看
[root@ubuntu2204 ~]# useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/sh
SKEL=/etc/skel
CREATE_MAIL_SPOOL=no
#更改默认 shell
[root@ubuntu2204 ~]# useradd -D -s /bin/bash
#再次更改
[root@ubuntu2204 ~]# useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=no

家目录模板

[root@ubuntu2204 ~]# ls -a /etc/skel/
. .. .bash_logout .bash_profile .bashrc
#修改此目录内容后,新创建的用户家目录中的内容会发生改变

新建用户的相关文件
/etc/default/useradd
/etc/skel/*
/etc/login.defs

批量创建用户

[root@10 ~]# newusers file

实例:

[root@ubuntu2204 ~]# cat user.txt 
u1:123456:1024:1024::/home/u1:/bin/bash
u2:123456:1025:1025::/home/u2:/bin/bash
[root@ubuntu2204 ~]# newusers user.txt 
[root@ubuntu2204 ~]# id u1
uid=1024(u1) gid=1024(u1) groups=1024(u1)
[root@ubuntu2204 ~]# id u2
uid=1025(u2) gid=1025(u2) groups=1025(u2)




chpasswd < file
[root@ubuntu2204 ~]# cat pwd.txt
u1:1234567
u2:1234567
#标准输入重定向
[root@ubuntu2204 ~]# chpasswd < pwd.txt
#多行重定向
[root@ubuntu2204 ~]# chpasswd <<EOF
> u1:1234567
> u2:1234567
> EOF
#管道重定向
[root@ubuntu2204 ~]# echo u1:123456 | chpass

批量修改用户口令

****批量修改用户口令***8
chpasswd < file

实例:

[root@ubuntu2204 ~]# cat pwd.txt
u1:1234567
u2:1234567
#标准输入重定向
[root@ubuntu2204 ~]# chpasswd < pwd.txt
#多行重定向
[root@ubuntu2204 ~]# chpasswd <<EOF
> u1:1234567
> u2:1234567
> EOF
#管道重定向
[root@ubuntu2204 ~]# echo u1:123456 | chpasswd

加密密码

image.png
image.png

3.2 用户属性修改

总结:

【可以创建的就可以修改】
-c 修改注释 -l 修改主机名

usermod [options] LOGIN
#常见选项
-c|--comment COMMENT         #修改注释
-d|--home HOME_DIR           #修改家目录
-e|--expiredate EXPIRE_DATE  #修改过期的日期,YYYY-MM-DD 格式
-f|--inactive INACTIVE       #密码过期之后,账户被彻底禁用之前的天数,0 表示密码过期立即禁
用,-1表示不使用此功能
-g|--gid GROUP               #修改组
-G|--groups GROUPS           #groupName|GID... 新附加组,原来的附加组将会被覆盖;若保留
原有,则要同时使用-a选项
-a|--append GROUP            #将用户追加至上边 -G 中提到的附加组中,并不从其它组中删除此用
户
-l|--login LOGIN             #新的登录名称
-L|--lock                    #锁定用户帐号,在/etc/shadow 密码栏的增加 !
-m|--move-home               #将家目录内容移至新位置,和 -d 一起使用
-o|--non-unique              #允许使用重复的(非唯一的) UID
-p|--password PASSWORD       #修改密码,这里是明文,如果要在此处修改密码,则要用加密后的字
符串
-s|--shell SHELL             #修改 shell
-u|--uid UID                 #修改 UID
-U|--unlock                  #解锁用户帐号,将 /etc/shadow 密码栏的!拿掉

修改用户信息

***“修改注释”
[root@10 home]# usermod -c "tom to zhang de wife" bai
[root@10 home]#    
[root@10 home]# getent passwd bai
bai:x:1025:1025:tom to zhang de wife:/home/bai:/bin/bash
***“修改主机名”
[root@10 home]# usermod -l zhang  bai
[root@10 home]# id zhang
uid=1025(zhang) gid=1025(bai) groups=1025(bai)

锁定用户
用户被锁定之后将无法登录
image.png
-L 锁定密码 -U 解锁密码
image.png
image.png

3.3 删除用户

总结:

【和rm -rf 属性相同 注意 :被删除的用户 pid被人占用了源文件就会转到现有的用户下】
-r 删除用户下的文件 -f 强制删除(在运行也删除)
格式:

userdel [options] LOGIN
#常见选项
-f|--force     #强制删除,哪怕用户正在登录状态
-r|--remove    #删除家目录和邮件目录

范例:

#创建用户并设置密码
[root@ubuntu2204 ~]# useradd -m zhangsan
[root@ubuntu2204 ~]# passwd zhangsan
New password: 
Retype new password: 
passwd: password updated successfully
#查看相关数据
[root@ubuntu2204 ~]# id zhangsan
uid=1026(zhangsan) gid=1026(zhangsan) groups=1026(zhangsan)
[root@ubuntu2204 ~]# ll -a /home/zhangsan/
total 20
drwxr-x--- 2 zhangsan zhangsan 4096 May  9 20:12 ./
drwxr-xr-x 7 root     root     4096 May  9 20:12 ../
-rw-r--r-- 1 zhangsan zhangsan  220 Jan  7  2022 .bash_logout
-rw-r--r-- 1 zhangsan zhangsan 3771 Jan  7  2022 .bashrc
-rw-r--r-- 1 zhangsan zhangsan  807 Jan  7  2022 .profile
#在另一个终端登录zhangsan
zhangsan@ubuntu2204:~$ id
uid=1026(zhangsan) gid=1026(zhangsan) groups=1026(zhangsan)
#删除登录中的用户失败
[root@ubuntu2204 ~]# userdel zhangsan
userdel: user zhangsan is currently used by process 2454

****#强制删除******

[root@ubuntu2204 ~]# userdel -f zhangsan
userdel: user zhangsan is currently used by process 2454
[root@ubuntu2204 ~]# id zhangsan
id: ‘zhangsan’: no such user
#报错
zhangsan@ubuntu2204:~$ whoami
whoami: cannot find name for user ID 1026
zhangsan@ubuntu2204:~$ id
uid=1026 gid=1026 groups=1026

用户被删除后,其名下的文件无法显示属主属组,只能显示UID

[root@ubuntu2204 ~]# ll /home/zhangsan -d
drwxr-x--- 3 1026 1026 4096 May  9 20:15 /home/zhangsan/

如果新建用户,使用了原用户的UID,则可以继承原用户文件

[root@ubuntu2204 ~]# useradd -m -u 1026 lisi
[root@ubuntu2204 ~]# ll /home/{lisi,zhangsan} -d
drwxr-x--- 2 lisi lisi 4096 May  9 20:17 /home/lisi/
drwxr-x--- 3 lisi lisi 4096 May  9 20:15 /home/zhangsan/

删除用户文件

[root@ubuntu2204 ~]# userdel -r lisi
userdel: lisi mail spool (/var/mail/lisi) not found
[root@ubuntu2204 ~]# ll /home/lisi
ls: cannot access '/home/lisi': No such file or directory

3.4 查看用户相关的ID信息

id 命令可以查看用户的 UID,GID等信息(id -a …即可)
格式:
id [OPTION]… [USER]
#常见选项
-a #显示详细信息,默认选项
-Z|–context #仅显示安全上下文信息,要开启selinux 配置才有
-g|–group #仅显示GID,就是只显示主组ID
-G|–groups #显示主组和附加组ID,就是所有组ID
-n|–name #显示用户名或组名,要组合使用 -nu|-ng|-nG
-u|–user #仅显示UID
范例:

#centos8中如果没有关闭 selinux,会出现安全上下文相关内容#

[root@rocky8 ~]# id
uid=0(root) gid=0(root) groups=0(root) 
context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[root@rocky8 ~]# id -a
uid=0(root) gid=0(root) groups=0(root) 
context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[root@rocky8 ~]# id -nu
root
[root@rocky8 ~]# id postfix
uid=89(postfix) gid=89(postfix) groups=89(postfix),12(mail)
[root@rocky8 ~]# id -G postfix
89 12
[root@rocky8 ~]# id -nG postfix
postfix mail
[root@ubuntu2204 ~]# id
uid=0(root) gid=0(root) groups=0(root)
[root@ubuntu2204 ~]# id tom
id: ‘tom’: no such user
[root@ubuntu2204 ~]# id jose
uid=1001(jose) gid=1001(jose) groups=1001(jose)

3.5 切换用户或以其他用户身份执行命令

总结:

【】
如果在当前登录终端中,要执行某条命令,但当前登录用户又没有可执行权限或没有某些资源权限; 则在此种情况下,我们可以:
1. 让有权限的用户登录终端,再执行相应的操作;
2. 在当前终端终,临时切换,以有权限的用户的身份去执行命令;
su: 即 switch user,命令可以切换用户身份,并且以指定用户的身份执行命令
格式:
su [options…] [-] [user [args…]]
#常见选项
-m|-p|–preserve-environment #不重置环境变量
-g|–group group #指定主组,只有root 切普通用户才能指定此参数
-|-l|–login #完全切换
-c|–command command #不切换用户,而是临时使用该用户权限和环境执行命令
–session-command command #使用上同 -c 选项,但不会创建会话
-f|–fast #向shell 传递 -f 选项(csh 或 tcsh)
-s|–shell shell #切换用户后,指定新环境的shell环境,必须在 /etc/shells
中存在
-P|–pty #开一个新的终端

切换用户的方式: (登录就要进入家目录)

  • su UserName:非登录式切换,即不会读取目标用户的配置文件,不改变当前工作目录,即不完

全切换

  • su - UserName:登录式切换,会读取目标用户的配置文件,切换至自已的家目录,即完全切换

说明:root su至其他用户无须密码;非root用户切换时需要密码
注意:su 切换新用户后,使用 exit 退回至旧的用户身份,而不要再用 su 切换至旧用户,否则会生成很
多的bash子进程,环境可能会混乱。

完全切换和不完全切换的区别(不仅家目录会被替换 $PATH路径也会变化)

jose@ubuntu2204:~$ pwd
/home/jose
jose@ubuntu2204:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/loc
al/games:/snap/bin

#不完全切换
jose@ubuntu2204:~$ su root
Password: 
[root@ubuntu2204 jose]# pwd
/home/jose
[root@ubuntu2204 jose]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/loc
al/games:/snap/bin
#完全切换
jose@ubuntu2204:~$ su - root
Password: 
[root@ubuntu2204 ~]# pwd
/root
[root@ubuntu2204 ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/loc
al/games:/snap/bin:/root/bin

切换完用户(一定要exit退出不然会造成bash子进程太多而宕机)
(su -c 三步变一步节省登录步骤)

[root@ubuntu2204 ~]# su - jose
jose@ubuntu2204:~$ touch jose-1.txt
jose@ubuntu2204:~$ exit
logout
#三步变一步
[root@ubuntu2204 ~]# su - jose -c "touch jose-2.txt"
[root@ubuntu2204 ~]# ll /home/jose/*txt
-rw-rw-r-- 1 jose jose 0 May  9 20:32 /home/jose/jose-1.txt
-rw-rw-r-- 1 jose jose 0 May  9 20:33 /home/jose/jose-2.txt
[root@ubuntu2204 ~]# su - jose
jose@ubuntu2204:~$ id
uid=1001(jose) gid=1001(jose) groups=1001(jose)
jose@ubuntu2204:~$ exit
logout
#三步变一步
[root@ubuntu2204 ~]# su - jose -c "id"
uid=1001(jose) gid=1001(jose) groups=1001(jose)

使用 /sbin/nologin shell的用户无法切换,ubnutn 中 使用/bin/false shell 的用户同样无法切换

[root@rocky8 ~]# getent passwd mysql
mysql:x:336:336::/data/mysql:/sbin/nologin
[root@rocky8 ~]# su - mysql
This account is currently not available.
[root@rocky8 ~]# su - mysql -c "echo nologin"
This account is currently not available.
#但可以指定可切换的Shell
[root@rocky8 ~]# su - mysql -s /bin/bash
[mysql@rocky8 ~]$ id
uid=336(mysql) gid=336(mysql) groups=336(mysql)
[root@rocky8 ~]# su - mysql -s /bin/bash -c "echo 弄login"
nologin

3.6 设置密码

总结:

【不同用户修改的标准不同】
passwd 可以修改用户密码

格式:
passwd [OPTION…]
#常用选项
-k|–keep-tokens #保持身份验证令牌不过期
-d|–delete #删除用户密码,也删除密码锁,仅root有权限操作
-l|–lock #锁定用户密码,仅root有权限操作
-u|–unlock #解锁用户密码,仅root有权限操作
-e|–expire #终止用户密码,此操作完成后,用户下次登录成功后要立马修改,仅root有
权限操作
-f|–force #强制执行操作
-x|–maximum=DAYS #指定用户密码最长有效期,仅root有权限操作
-n|–minimum=DAYS #指定用户密码最短有效期,仅root有权限操作
-w|–warning=DAYS #在密码过期前多少天开始提醒用户,仅root有权限操作

错误合集 (密码必须是一个8个以上三种字符)(超级用户不用遵守)

New password: 
BAD PASSWORD: The password is shorter than 8 characters

密码错误:密码长度小于8个字符



New password: 
BAD PASSWORD: The password fails the dictionary check - it does not contain enough DIFFERENT characters
passwd: Have exhausted maximum number of retries for service


糟糕的密码:密码字典检查失败-它没有包含足够的不同字符
passwd:已耗尽重试服务的最大次数

####只有root才可以更改密码
[baishuangqi@10 home]$ passwd baishuangqi
passwd: Only root can specify a user name.
[baishuangqi@10 home]$ 
[baishuangqi@10 home]$ 
####创建也是
[baishuangqi@10 home]$ useradd wang
useradd: Permission denied.
useradd: cannot lock /etc/passwd; try again later.

普通用户修改自己密码,要先验证当前使用的密码

[wang@10 ~]$ passwd
Changing password for user wang.
Current password: 
New password: 
Retype new password: 
passwd: all authentication tokens updated successfully.

root修改其它用户密码

[root@10 ~]# passwd wang
Changing password for user wang.
New password: 
BAD PASSWORD: The password is a palindrome
Retype new password: 
passwd: all authentication tokens updated successfully.

修改密码其实就是更新 /etc/shadow 文件

[root@10 ~]# ll /etc/shadow
----------. 1 root root 1126 Dec 19 21:29 /etc/shadow

非交互式修改用户密码

#适用于红帽系列的Linux版本
[root@rocky8 ~]# echo '123456' | passwd --stdin jose
Changing password for user jose.
passwd: all authentication tokens updated successfully.
[root@rocky8 ~]# passwd --stdin jose <<<123456
Changing password for user jose.
passwd: all authentication tokens updated successfully.
#Ubuntu中 passwd 无 --stdin 选项
#此写法在centos中也支持,更通用
root@ubuntu20:~# echo -e '123456\n123456' | passwd jose
New password: Retype new password: passwd: password updated successfully

设置用户下次必须更改密码

[root@ubuntu2204 ~]# passwd -e jose
passwd: password expiry information changed.
#jose 用户登录后提示
WARNING: Your password has expired.
You must change your password now and login again!
Changing password for jose.
Current password:

3.7 修改用户密码策略

chage 可以修改用户密码策略

格式:
chage [options] LOGIN
#常见选项
-d LAST_DAY #更改密码的时间
-m|–mindays MIN_DAYS
-M|–maxdays MAX_DAYS
-W|–warndays WARN_DAYS
-I|–inactive INACTIVE #密码过期后的宽限期
-E|–expiredate EXPIRE_DATE #用户的有效期
-l#显示密码策略

查看用户密码策略

[root@ubuntu2204 ~]# chage -l jose
Last password change : May 09, 2023
Password expires : never
Password inactive : never
Account expires : never
Minimum number of days between password change : 0
Maximum number of days between password change : 99999
Number of days of warning before password expires : 7

范例:

[root@ubuntu2204 ~]# chage jose
Changing the aging information for jose
Enter the new value, or press ENTER for the default
 Minimum Password Age [0]: 3
 Maximum Password Age [99999]: 42
 Last Password Change (YYYY-MM-DD) [2023-05-09]: 2023-05-01
 Password Expiration Warning [7]: 10
 Password Inactive [-1]: 20
 Account Expiration Date (YYYY-MM-DD) [-1]: 
 
[root@ubuntu2204 ~]# getent shadow jose
jose:$y$j9T$RjraLGxq.YMdIUlVFoHGo.$YYxkTHpzzUwxc5i1hnu/aLkkwF2g.DioQx5fXoPssc4:1
9478:3:42:10:20::
#只修改单项
[root@ubuntu2204 ~]# chage -d 2022-06-25 jose

image.png

3.8 创建组

总结:

【-g ,-o,-r 】
groupadd实现创建组
格式:
groupadd [options] GROUP
#常见选项
-f|–force #如果组已经存在则成功退出
-g|–gid GID #新建组时指定组ID,默认是系统分配,指定值不要超过[GID_MIN,
GID_MAX]
-K|–key KEY=VALUE #不使用 /etc/login.defs 中的默认值,自己指定,比如 -K
GID_MIN=100
-o|–non-unique #允许创建有重复 GID 的组
-p|–password PASSWORD #为新组使用此加密过的密码,这里要用加密后的密文,不然就是直接是明文
在/etc/gshadow 里面
-r|–system #创建一个系统组 CentOS 6之前: ID<500,CentOS 7以后: ID<1000

[root@10 ~]# groupadd -g 46 -r hhhh
[root@10 ~]# 
[root@10 ~]# getent group hhhh
hhhh:x:46:
#不加 -f 会提示己存在
[root@ubuntu2204 ~]# groupadd apache
groupadd: group 'apache' already exists
# -f 直接结束
[root@ubuntu2204 ~]# groupadd -f apache

3.9 修改组

总结:

【-g -n】
groupmod 组属性修改
格式
groupmod [options] GROUP
#常见选项
-g|–gid GID #将组 ID 改为 GID
-n|–new-name NEW_GROUP #改名为 NEW_GROUP
-o|–non-unique #允许使用重复的 GID
-p|–password PASSWORD #将密码更改为(加密过的) PASSWORD

范例:

[root@10 ~]# groupadd -g 46 -r hhhh
[root@10 ~]# 
[root@10 ~]# getent group hhhh
hhhh:x:46:


[root@10 ~]# groupmod -g 66 -n hh hhhh
[root@10 ~]# 
[root@10 ~]# getent group hh
hh:x:66:

3.10 组删除

groupdel 可以删除组
范例:
groupdel [options] GROUP
#常见选项
-f|–force #强制删除,即使是用户的主组也强制删除组,但会导致无主组的用户不可用无法登录

[root@ubuntu2204 ~]# groupdel apache2
[root@ubuntu2204 ~]# getent group apache2
[root@ubuntu2204 ~]# groupdel jose
groupdel: cannot remove the primary group of user 'jose'
#-f 强制删除有用户的组
#强制删除之后,显示该组名的地方,只能显示该组ID,如果此时新建与组ID相同的新组,则被删除的组的数
据会被新组关联
[root@ubuntu2204 ~]# groupdel -f jose
[root@ubuntu2204 ~]# id jose
uid=1001(jose) gid=1001 groups=1001

删除组:如果该组下有用户将组作为主组,则不能删除
删除用户:会把与其同ID的主组也给删了,前提是该组下没有其它用户

3.11 更改组成员和密码

【-a -d 】
gpasswd 命令,可以更改组密码,也可以修改附加组的成员关系
组没有密码的情况下,加组只能由root来操作

格式:

gpasswd [option] GROUP
#常见选项
-a|–add USER #向组中添加用户
-d|–delete USER #从组中移除用户
-r|–delete-password #删除组密码
-R|–restrict #向其成员限制访问组 GROUP
-M|–members USER,… #批量加组
-A|–administrators ADMIN,… #批量设组管理员

3.12 更改和查看组成员

groupmems 可以管理附加组的成员关系
格式:
groupmems [options] [action]
#常见选项
-g|–group groupname #更改为指定组 (只有root)
-a|–add username #指定用户加入组
-d|–delete username #从组中删除用户
-p|–purge #从组中清除所有成员
-l|–list #显示组成员列表

[root@10 home]# gpasswd -a wang  zhu
Adding user wang to group zhu

[root@10 home]# id wang
uid=1028(wang) gid=1028(wang) groups=1028(wang),1029(zhu)
[root@10 home]# groups wang

****设置组密码
[root@10 home]# gpasswd zhu
Changing the password for group zhu
New Password: 
Re-enter new password: 
[root@10 home]# getent gshadow zhu
zhu:$6$2xOqR/Xugd8$DUt9BQUyHGPW6lpn8K7tqJhNGlIrt.RuP0ZD/rH2j3nvjjWLxRmDOaagYuWBFUrMPStwu6WICGtuPRZhCWUv51::wang
[root@10 home]# 

[root@10 home]# gpasswd -d wang zhu
Removing user wang from group zhu
[root@10 home]# groups wang
wang : wang

4 文件权限管理

4.1 Linux中的权限体系介绍

【文件的三种角色和三种权限, 文件执行的权限,取决于此程序的发起者 (角色)】
在Linux系统中,一切皆文件;
对文件来讲,系统中的用户,分属于三类不同的角色,分别是属主,属组,其它用户;
而每个角色用户,对该文件的权限,也分三种,分别是读,写,执行;
image.png
image.png
程序访问文件时的权限,取决于此程序的发起者

  • 进程的发起者,同文件的属主:则应用文件属主权限
  • 进程的发起者,属于文件属组;则应用文件属组权限
  • 应用文件“其它”权限

image.png

4.2 文件所有者和属组属性操作

4.2.1 设置文件的所有者chown
【 属主:属组 -R 递归 】

chown 命令可以修改文件的属主,也可以修改文件属组
格式:
chown [OPTION]… [OWNER][:[GROUP]] FILE…
chown [OPTION]… --reference=RFILE FILE…
#用法说明
OWNER #只修改所有者
OWNER:GROUP #同时修改所有者和属组
:GROUP #只修改属组,冒号也可用 . 替换
#常用选项
-c|–changes #同-v选项,但只显示更新成功的信息
-f|–silent|–quiet #不显示错误信息
-v|–verbose #显示过程
–dereference #修改的是符号链接指向的文件,而不是链接文件本身
-h|–no-dereference #修改的是符号链接文件,而不是其指向的目标文件(只有当前系统支持修改符号
链接文件属性时,此项才有效)
–from=user:group #根据原属主属组来修改,相当于一个查询条件
–no-preserve-root #不特别对待“/”,意思就是将根目录当成普通目录来执行,默认如此,所以不要
对根目录进行操作
–preserve-root #不允许在"/"上递归操作
–reference=RFILE #根据其它文件权限来操作,就是复制该文件的属主属组信息给指定文件
-R|–recursive #递归操作
#下列选项配合 -R 使用
-H #如果参数是指向目录的软链接,则只修改指向的目录,不改变目录里面文件的
属主属组
-L #更改所有遇到的符号链接指向的目录
-P #不更改符号链接指向的目录

范例: 修改属主属组

[root@10 ~]# chown mage a.txt 
[root@10 ~]# ll
-rw-------. 1 root root 1206 Dec 15 13:59 anaconda-ks.cfg
-rw-r--r--. 1 mage root    0 Dec 18 15:29 a.txt
[root@10 ~]# chown mage. a.txt 
[root@10 ~]# ll
total 12
-rw-------. 1 root root 1206 Dec 15 13:59 anaconda-ks.cfg
-rw-r--r--. 1 mage mage    0 Dec 18 15:29 a.txt
[root@10 ~]# chown mage.ha a.txt 
[root@10 ~]# ll
-rw-------. 1 root root 1206 Dec 15 13:59 anaconda-ks.cfg
-rw-r--r--. 1 mage ha      0 Dec 18 15:29 a.txt


#上述写法,使用的组,是属主用户的主组
#使用UID来修改属主,UID不支持省略写法
[root@ubuntu2204 0509]# chown 1000 a4.txt
[root@ubuntu2204 0509]# chown 1000. a5.txt
chown: invalid user: ‘1000.’
[root@ubuntu2204 0509]# chown 1000: a6.txt
chown: invalid spec: ‘1000:’
[root@rocky8 0626]# ll a4.txt a5.txt a6.txt
-rw-r--r-- 1 jose root 0 Jun 26 10:34 a4.txt
-rw-r--r-- 1 root root 0 Jun 26 10:34 a5.txt
-rw-r--r-- 1 root root 0 Jun 26 10:34 a6.txt

[root@10 ~]# chown .mage a.txt 
[root@10 ~]# 
[root@10 ~]# ll
total 12
-rw-------. 1 root root 1206 Dec 15 13:59 anaconda-ks.cfg
-rw-r--r--. 1 1234 mage    0 Dec 18 15:29 a.txt
-rw-r--r--. 1 root root    3 Dec 18 15:23 b.txt
-rw-r--r--. 1 root root    7 Dec 19 21:04 wang.txt
[root@10 ~]# 
[root@10 ~]# 
[root@10 ~]# 
[root@10 ~]# chown mage.mage a.txt 
[root@10 ~]# ll
total 12
-rw-------. 1 root root 1206 Dec 15 13:59 anaconda-ks.cfg
-rw-r--r--. 1 mage mage    0 Dec 18 15:29 a.txt
-rw-r--r--. 1 root root    3 Dec 18 15:23 b.txt
-rw-r--r--. 1 root root    7 Dec 19 21:04 wang.txt
[root@10 ~]# 


 #组不存在会报错
[root@ubuntu2204 0509]# chown jose:nogroup c3.txt   #组不存在会报错
chown: invalid group: ‘jose:nogroup‘

#递归写法
chown -R jose.tom dir1/

4.3 文件权限

**4.3.1 文件权限说明 **
角色定义
image.png

常用写法

u+r #属主加读权限
g-x #属组去掉执行权限
ug=rx #属主属组权限改为读和执行
o= #other用户无任何权限
a=rwx #所有用户都有读写执行权限

注意:

  • 用户的最终权限,是从左向右进行顺序匹配,即,所有者,所属组,其他人,一旦匹配权限立即生

效,不再向右查看其权限

  • r和w权限对root 用户无效,对没有读写权限的文件,root用户也可读可写
  • 只要所有者,所属组或other三者之一有x权限,root就可以执行

image.png
image.png

4.3.2 修改文件权限chmod

格式:
chomod [OPTION]… MODE[,MODE]… FILE…
chmod [OPTION]… OCTAL-MODE FILE…
chmod [OPTION]… --reference=RFILE FILE…
#常用选项
-c|–changes #同-v选项,但只显示更新成功的信息
-f|–silent|–quiet #不显示错误信息
-v|–verbose #显示过程
–no-preserve-root #不特别对待“/”,意思就是将家目录当成普通目录来执行,默认如此,所以
不要对根目录进行操作
–preserve-root #不允许在"/"上递归操作
–reference=RFILE #根据其它文件权限来操作,就是复制该文件的权限信息给指定文件
-R|–recursive #递归操作
#MODE
who opt permisson
who# u|g|o|a
opt # +|-|=
permission # r|w|x
范例: 以子母的形式更改文件的权限



[root@10 ~]# chmod u=rwx,g=w,o=x a.txt 
[root@10 ~]# ll
total 12
-rw-------. 1 root root 1206 Dec 15 13:59 anaconda-ks.cfg
-rwx-w---x. 1 mage mage    0 Dec 18 15:29 a.txt
-rw-r--r--. 1 root root    3 Dec 18 15:23 b.txt
-rw-r--r--. 1 root root    7 Dec 19 21:04 wang.txt
[root@10 ~]# chmod u=rwx,g=,o= a.txt 
[root@10 ~]# ll
total 12
-rw-------. 1 root root 1206 Dec 15 13:59 anaconda-ks.cfg
-rwx------. 1 mage mage    0 Dec 18 15:29 a.txt
-rw-r--r--. 1 root root    3 Dec 18 15:23 b.txt
-rw-r--r--. 1 root root    7 Dec 19 21:04 wang.txt
[root@10 ~]# chmod a=rwx a.txt 
[root@10 ~]# ll
total 12
-rw-------. 1 root root 1206 Dec 15 13:59 anaconda-ks.cfg
-rwxrwxrwx. 1 mage mage    0 Dec 18 15:29 a.txt
-rw-r--r--. 1 root root    3 Dec 18 15:23 b.txt
-rw-r--r--. 1 root root    7 Dec 19 21:04 wang.txt
[root@10 ~]# 

错误案例:

****要有逗号*****
[root@10 ~]# chmod u=rwx g=w o=x  a.txt 
chmod: cannot access 'g=w': No such file or directory
chmod: cannot access 'o=x': No such file or directory
[root@10 ~]# chmod u=rwx g=w o=x a.txt 
chmod: cannot access 'g=w': No such file or directory
chmod: cannot access 'o=x': No such file or directory

chmod u=rwx,g=w,o=x a.txt 

image.png

范例:以数字的形式更改权限

-rw-------. 1 root root 1206 Dec 15 13:59 anaconda-ks.cfg

-rwxrwxrwx. 1 mage mage    0 Dec 18 15:29 a.txt
-rw-r--r--. 1 root root    3 Dec 18 15:23 b.txt
-rw-r--r--. 1 root root    7 Dec 19 21:04 wang.txt
[root@10 ~]# 
[root@10 ~]# 
[root@10 ~]# 
[root@10 ~]# chmod 777 b.txt 
[root@10 ~]# ll
total 12
-rw-------. 1 root root 1206 Dec 15 13:59 anaconda-ks.cfg
-rwxrwxrwx. 1 mage mage    0 Dec 18 15:29 a.txt
-rwxrwxrwx. 1 root root    3 Dec 18 15:23 b.txt
-rw-r--r--. 1 root root    7 Dec 19 21:04 wang.txt

image.png

范例:目录权限

[jose@rocky8 ~]$ ll -d dir1/
drwxrwxr-x. 2 jose jose 24 Jun 26 17:22 dir1/
[jose@rocky8 ~]$ ll dir1/
total 8
-rw-rw-r--. 1 jose jose 12 Jun 26 17:22 a
-rw-rw-r--. 1 jose jose 12 Jun 26 17:22 b
[jose@rocky8 ~]$ 
#去掉目录所有权限
[jose@rocky8 ~]$ chmod a= dir1/
[jose@rocky8 ~]$ ll -d dir1/
d---------. 2 jose jose 24 Jun 26 17:22 dir1/
[jose@rocky8 ~]$ ls dir1/
ls: cannot open directory 'dir1/': Permission denied

###干什么都没用权限
[jose@rocky86 ~]$ cat dir1/a 
cat: dir1/a: Permission denied
[jose@rocky8 ~]$ stat dir1/a
stat: cannot statx 'dir1/a': Permission denied
[jose@rocky8 ~]$ rm dir1/a
rm: cannot remove 'dir1/a': Permission denied
[jose@rocky86 ~]$ cd dir1/
-bash: cd: dir1/: Permission denied

****加用户可读****
#+r权限
[jose@rocky8 ~]$ chmod u+r dir1/
[jose@rocky8 ~]$ ls dir1/
ls: cannot access 'dir1/a': Permission denied
ls: cannot access 'dir1/b': Permission denied
a b
[jose@rocky86 ~]$ cat dir1/a
cat: dir1/a: Permission denied
[jose@rocky8 ~]$ stat dir1/a
stat: cannot statx 'dir1/a': Permission denied
[jose@rocky8 ~]$ rm dir1/a
rm: cannot remove 'dir1/a': Permission denied
[jose@rocky8 ~]$ cd dir1/
-bash: cd: dir1/: Permission denied

****加root 可写
#+w权限
[jose@rocky8 ~]$ chmod u+w dir1/
[jose@rocky8 ~]$ ll -d dir1/
drw-------. 2 jose jose 24 Jun 26 17:22 dir1/
[jose@rocky8 ~]$ ls dir1/
ls: cannot access 'dir1/a': Permission denied
ls: cannot access 'dir1/b': Permission denied
a b
[jose@rocky8 ~]$ ll dir1/
ls: cannot access 'dir1/a': Permission denied
ls: cannot access 'dir1/b': Permission denied
total 0
-????????? ? ? ? ?           ? a
-????????? ? ? ? ?           ? b
[jose@rocky86 ~]$ cat dir1/a
cat: dir1/a: Permission denied
[jose@rocky8 ~]$ cd dir1/
-bash: cd: dir1/: Permission denied
[jose@rocky8 ~]$ rm dir1/a
rm: cannot remove 'dir1/a': Permission denied
[jose@rocky8 ~]$ touch dir1/c
touch: cannot touch 'dir1/c': Permission denied

****root用户加可执行****
#+x权限
[jose@rocky8 ~]$ chmod u+x dir1/
[jose@rocky8 ~]$ ll -d dir1/
drwx------. 2 jose jose 24 Jun 26 17:22 dir1/
[jose@rocky8 ~]$ ll dir1/
total 8
-rw-rw-r--. 1 jose jose 12 Jun 26 17:22 a
-rw-rw-r--. 1 jose jose 12 Jun 26 17:22 b
[jose@rocky8 ~]$ cd dir1/
[jose@rocky8 dir1]$ touch c
[jose@rocky8 dir1]$ rm -f a
[jose@rocky8 dir1]$ ls
b c

4.4 新建文件和目录的默认权限

在linux 系统中,新建文件或目录,都有一个默认权限;
umask 值间接影响新建文件和新建目录的权限:

  • 新建文件:666-umask,按位对应相减,如果所得结果某位存在执行(奇数)权限,则该位+1;
  • 新建目录:777-umask;

umask [-p] [-S] [mode]
#显示或设定文件模式掩码。
-p #如果省略 MODE 模式,以可重用为输入的格式输入
-S #以字符显示

范例:umask-默认值

###root用户###

[root@ubuntu2204 ~]# umask
0022
[root@ubuntu2204 ~]# umask -p
umask 0022
[root@ubuntu2204 ~]# umask -S
u=rwx,g=rx,o=rx

###普通用户###
mage@ubuntu22:~$ umask
0002

范例:修改umask

[root@ubuntu2204 ~]# umask 123
[root@ubuntu2204 ~]# umask 
0123
[root@ubuntu2204 ~]# umask u=rw,g=r,o=
[root@ubuntu2204 ~]# umask
013

非特权用户 umask 默认是 002
root 的 umask 默认是 022
ubuntu 中都 022

持久保存umask
全局设置: /etc/bashrc , /etc/bash.bashrc(ubuntu)
用户设置:~/.bashrc
范例:

[root@ubuntu2204 ~]# umask
0022
[root@ubuntu2204 ~]# ( umask 666; touch /data/f1.txt )
[root@ubuntu2204 ~]# umask
0022
[root@ubuntu2204 ~]# ll /data/f1.txt
---------- 1 root root 0 Mar 27 14:55 /data/f1.txt

4.5 Linux文件系统上的特殊权限

【SUID 给二进制文件提升权限,所用者(相当于root用户)的权限passwd 命令执行文件就用了-这个命 令,SGID (有两种) 第一种:同SUID 只不过范围更大了,第二种 作用于目录给目录设置权限则谁在这个目录中创建文件谁就会用户组的权限,(主要用于共享文件夹 创建用权限)用于批量提升权限 。STICKY 也是作用于目录只不过是对一个目录做了一个限制文件只能由所有者自已来删除; 】

在Linux中,除了rwx 这三种常⻅的权限之外,还有三个特殊权限,分别是 SUID, SGID,Sticky;这三
个特殊权限独⽴于rwx权限体系;
特殊权限

  • SUID:作用于二进制可执行文件上,用户将继承此程序所有者的权限;

  • SGID:作用于二进制可执行文件上,用户将继承此程序所有组的权限;

                作用于目录上,此目录中新建的文件的所属组将自动从此目录继承; 
    
  • STICKY:作用于目录上,此目录中的文件只能由所有者自已来删除;

image.png

4.5.1 特殊权限SUID

前提:进程有属主和属组;文件有属主和属组
任何一个可执行程序文件能不能启动为进程,取决发起者对程序文件是否拥有执行权限
启动为进程之后,其进程的属主为发起者,进程的属组为发起者所属的组
进程访问文件时的权限,取决于进程的发起者
二进制的可执行文件上SUID权限功能:
任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限
启动为进程之后,其进程的属主为原程序文件的属主
SUID只对二进制可执行程序有效
SUID设置在目录上无意义

SUID权限设定:
chmod u+s FILE…
chmod 4xxx FILE
chmod u-s FILE…
范例:为什么 可以通过passwd 命令来修改密码

spike@ubuntu2204:~$ ll /etc/shadow
-rw-r----- 1 root shadow 1676 May  9 22:19 /etc/shadow
#普通用户无法打开 /etc/shadow文件,因为没有任何权限,根据前面的学习,我们知道,此文件存放的是用
户密码
spike@ubuntu2204:~$ cat /etc/shadow
cat: /etc/shadow: Permission denied
#但是可以通过passwd 命令来修改密码,也就是说,普通用户可以通过 passwd 命令来修改
/etc/shadow 文件
spike@ubuntu2204:~$ passwd
Changing password for user jose.
Current password: 
New password: 
Retype new password: 
passwd: all authentication tokens updated successfully.

image.png

image.png

spike@ubuntu2204:~# chmod u+s /usr/bin/cat

#有权限了
spike@ubuntu2204:~$ cat /etc/shadow
root:$y$j9T$t5mN9mqOFKcEqsSsfW.0M1$W3iaFffP251p7PD0Lnvk4T0e7QTCsD4cXv3pBdG3/z0:1
9485:0:99999:7:::
daemon:*:19103:0:99999:7:::
bin:*:19103:0:99999:7:::






**4.5.2 特殊权限SGID **
二进制的可执行文件上SGID权限功能:
任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限
启动为进程之后,其进程的属组为原程序文件的属组

目录上的SGID权限功能:
默认情况下,用户创建文件时,其属组为此用户所属的主组,一旦某目录被设定了SGID,则对此目录有
写权限的用户在此目录中创建的文件所属的组为此目录的属组,通常用于创建一个协作目录

SGID权限设定:
chmod g+s FILE…
chmod 2xxx FILE
chmod g-s FILE…

#普通用户 tom 在 /tmp 下创建目录
tom@ubuntu2204:~$ mkdir dir1
tom@ubuntu2204:~$ ll -d dir1/
drwxrwxr-x 2 tom tom 4096 May  9 22:40 dir1//
#普通用户 tom 创建文件
tom@ubuntu2204:~$ touch dir1/tom1.txt
#root 创建文件
[root@ubuntu2204 ~]# touch /home/tom/dir1/root1.txt
#查看
tom@ubuntu2204:~$ ll dir1/*txt
-rw-r--r-- 1 root root 0 May  9 22:43 dir1/root1.txt
-rw-rw-r-- 1 tom tom  0 May  9 22:43 dir1/tom1.txt
#加权限
tom@ubuntu2204:~$ chmod g+s dir1/
#小 s
tom@ubuntu2204:~$ ll dir1/ -d
drwxrwsr-x 2 tom tom 4096 May  9 22:43 dir1//
#再次创建
tom@ubuntu2204:~$ touch dir1/tom2.txt
[root@ubuntu2204 ~]# touch /home/tom/dir1/root2.txt
#查看
tom@ubuntu2204:~$ ll dir1/*txt
-rw-r--r-- 1 root root 0 May  9 22:43 dir1/root1.txt
-rw-r--r-- 1 root tom  0 May  9 22:45 dir1/root2.txt #新建文件属组变成了目录属
组
-rw-rw-r-- 1 tom tom  0 May  9 22:43 dir1/tom1.txt
-rw-rw-r-- 1 tom tom  0 May  9 22:45 dir1/tom2.txt


#新的
drwxrwsr-x 2 mage mage 4096 Dec 23 07:51 ./
drwxr-x--- 6 mage mage 4096 Dec 23 07:45 ../
-rw-rw-r-- 1 mage mage    0 Dec 23 07:48 222
-rw-r--r-- 1 root mage    0 Dec 23 07:51 333
-rw-rw-r-- 1 mage mage    0 Dec 23 07:46 bai

**4.5.3 特殊权限 Sticky 位 **
具有写权限的目录通常用户可以删除该目录中的任何文件,无论该文件的权限或拥有权
在目录设置Sticky 位,只有文件的所有者或 root 可以删除该文件
sticky 设置在文件上无意义

Sticky权限设定:
chmod o+t DIR…
chmod 1xxx DIR
chmod o-t DIR…

#在根目录下创建dir1,权限打满
[root@ubuntu2204 ~]# cd /
[root@ubuntu2204 /]# mkdir dir1
[root@ubuntu2204 /]# chmod a=rwx /dir1/
#不同用户创建
[root@ubuntu2204 /]# touch /dir1/root1.txt
jose@ubuntu2204:~$ touch /dir1/jose1.txt
tom@ubuntu2204:~$ touch /dir1/tom1.txt
[root@ubuntu2204 /]# ll /dir1/ -d
drwxrwxrwx 2 root root 4096 May  9 22:54 /dir1//

#查看,三个文件分属于不同的属主属组
[root@ubuntu2204 /]# ll /dir1/*txt
-rw-rw-r-- 1 jose jose 0 May  9 22:54 /dir1/jose1.txt
-rw-r--r-- 1 root root 0 May  9 22:54 /dir1/root1.txt
-rw-rw-r-- 1 tom tom  0 May  9 22:58 /dir1/tom1.txt
#普通用户可以删除其它用户的文件
tom@ubuntu2204:~$ rm -f /dir1/jose1.txt 
tom@ubuntu2204:~$ rm -f /dir1/tom1.txt 
tom@ubuntu2204:~$ rm -f /dir1/root1.txt
#目录为空
tom@ubuntu2204:~$ ls /dir1/
#加权限
[root@ubuntu2204 /]# chmod o+t /dir1/
[root@ubuntu2204 /]# ll /dir1/ -d
drwxrwxrwt 2 root root 4096 May  9 22:54 /dir1//

#不同用户再次创建
[root@ubuntu2204 /]# touch /dir1/root2.txt
jose@ubuntu2204:~$ touch /dir1/jose2.txt
tom@ubuntu2204:~$ touch /dir1/tom2.txt
#查看,三个文件分属于不同的属主属组
[root@ubuntu2204 /]# ll /dir1/*txt
-rw-rw-r-- 1 jose jose 0 May  9 23:05 /dir1/jose2.txt
-rw-r--r-- 1 root root 0 May  9 23:04 /dir1/root2.txt
-rw-rw-r-- 1 tom tom  0 May  9 23:05 /dir1/tom2.txt
#但普通用户无法删除没权限的文件
tom@ubuntu2204:~$ ls /dir1/
jose2.txt root2.txt tom2.txt
tom@ubuntu2204:~$ rm -f /dir1/jose2.txt 
rm: cannot remove '/dir1/jose2.txt': Operation not permitted
tom@ubuntu2204:~$ rm -f /dir1/root2.txt 
rm: cannot remove '/dir1/root2.txt': Operation not permitted
tom@ubuntu2204:~$ rm -f /dir1/tom2.txt 
tom@ubuntu2204:~$ ls /dir1/
jose2.txt root2.txt

image.png

4.5.5 设定文件特殊属性

总结:
【+a 和 +I 的用法】
格式:
chattr [-pRVf] [-+=aAcCdDeijPsStTuF] [-v version] files…
#常用选项
-p project #设置文件项目编号
-R #递归执行
-V #显示过程,并输出chattr 版本
-f #不输出错误信息
-v version #设置版本
#操作符
+attribute #添加该属性
-attribute#去掉该属性
=attribute #仅有该属性
#常用属性
a #对文件:可追加内容,不可被删除,不可被修改,不可被重命名;对目录,可新建,修
改文件,但不可删除文件
A #不更新atime,节省IO
c #文件会被压缩保存
i #对文件:不可被删除不可被修改不可重命名;对目录:可修改查看目录中的文件,不可
新建文件,不可删除文件
s #彻底删除文件,用0填充原来的数据块
u #防止误删除,这里是指原来存储该文件的块不会被新的数据覆盖

image.png
【+a 和 +I 的用法】

root@ubuntu22:~# lsattr bai.log 
--------------e------- bai.log
root@ubuntu22:~# 
root@ubuntu22:~# 
root@ubuntu22:~# chattr +i bai.log
root@ubuntu22:~# 
root@ubuntu22:~# 
root@ubuntu22:~# echo hfdhas >> bai.log 
-bash: bai.log: Operation not permitted
root@ubuntu22:~# 
root@ubuntu22:~# 
root@ubuntu22:~# rm -rf bai.log 
rm: cannot remove 'bai.log': Operation not permitted
root@ubuntu22:~# 
root@ubuntu22:~# 
root@ubuntu22:~# chattr -i bai.log
root@ubuntu22:~# chattr +a bai.log
root@ubuntu22:~# lsattr bai.log 
-----a--------e------- bai.log
root@ubuntu22:~# 
root@ubuntu22:~# 
root@ubuntu22:~# rm -rf  bai.log
rm: cannot remove 'bai.log': Operation not permitted
root@ubuntu22:~# echo dff >> bai.log 
root@ubuntu22:~# 

4.6 访问控制列表 ACL

4.6.1 ACL权限功能

【可以给指定的用户远超rwx 的更细颗粒度权限】
rwx 权限体系中,仅仅只能将用户分成三种角色,如果要对单独用户设置额外的权限,则无法完成;
而ACL可以单独对指定的用户设定各不相同的权限;提供颗粒度更细的权限控制;
CentOS7 默认创建的xfs和ext4文件系统具有ACL功能
CentOS7 之前版本,默认手工创建的ext4文件系统无ACL功能,需手动增加

image.png

**4.6.2 ACL相关命令 **
setfacl 可设置ACL权限
getfacl 可查看设置的ACL权限

格式:
setfacl [-bkndRLPvh] [{-m|-x} acl_spec] [{-M|-X} acl_file] file …

#常用选项
-m|–modify=acl #修改acl权限
-M|–modify-file=file #从文件读取规则
-x|–remove=acl #删除文件acl 权限
-X|–remove-file=file #从文件读取规则
-b|–remove-all #删除文件所有acl权限
-k|–remove-default #删除默认acl规则
–set=acl #用新规则替换旧规则,会删除原有ACL项,用新的替代,一定要包含
UGO的设置,不能象 -m一样只有 ACL
–set-file=file #从文件读取新规则
–mask #重新计算mask值
-n|–no-mask #不重新计算mask值
-d|–default #在目录上设置默认acl
-R|–recursive #递归执行
-L|–logical #将acl 应用在软链接指向的目标文件上,与-R一起使用
-P|–physical #将acl 不应用在软链接指向的目标文件上,与-R一起使用

范例:【 -m (:*例:u:tom:rw)】


[root@ubuntu2204 tmp]# echo "abcd">f1
[root@ubuntu2204 tmp]# ll f1 
-rw-r--r-- 1 root root 5 May  9 23:22 f1
[root@ubuntu2204 tmp]# su - tom -c "cat /tmp/f1"
abcd
#无 acl 设置
[root@ubuntu2204 tmp]# getfacl f1
# file: f1
# owner: root
# group: root
user::rwgroup::r--
other::r--
#other 用户可读
[root@ubuntu2204 tmp]# su - tom -c "cat /tmp/f1"
abcd
#设置 tom 无任何权限
[root@ubuntu2204 tmp]# setfacl -m u:tom:- f1
[root@ubuntu2204 tmp]# getfacl f1
# file: f1
# owner: root
# group: root
user::rwuser:tom:---
group::r--
mask::r--
other::r--
#查看文件,多了一个小 +
[root@ubuntu2204 tmp]# ll f1
-rw-r--r--+ 1 root root 5 May  9 23:22 f1
#tom 己经不可读
[root@ubuntu2204 tmp]# su - tom -c "cat /tmp/f1"
cat: /tmp/f1: Permission denied
#其它other可读
[root@ubuntu2204 tmp]# su - jose -c "cat /tmp/f1"
abcd
#但不可写
[root@ubuntu2204 tmp]# su - jose -c "echo 1234 >> /tmp/f1"
-bash: line 1: /tmp/f1: Permission denied
#给 jose 加写权限
[root@ubuntu2204 tmp]# setfacl -m u:jose:rw f1
[root@ubuntu2204 tmp]# su - jose -c "echo 1234 >> /tmp/f1"
[root@ubuntu2204 tmp]# su - jose -c "cat /tmp/f1"
abcd
1234
#查看
[root@ubuntu2204 tmp]# getfacl f1
# file: f1
# owner: root
# group: root
user::rwuser:jose:rwuser:tom:---
group::r--
mask::rwother::r--

范例:【移除文件上所有ACL权限】

[root@ubuntu2204 tmp]# ll f1
-rw-rw-r--+ 1 root root 10 Jun 26 20:19 f1
[root@ubuntu2204 tmp]# setfacl -b f1
[root@ubuntu2204 tmp]# getfacl f1
# file: f1
# owner: root
# group: root
user::rwgroup::r--
other::r--
#小+号没了
[root@ubuntu2204 tmp]#ll f1
-rw-r--r--. 1 root root 10 Jun 26 20:19 f1

范例:–set替换

[root@ubuntu2204 tmp]# ll f2
-rw-rwxr--+ 1 root root 3 Jun 26 20:17 f2
[root@ubuntu2204 tmp]# getfacl f2
# file: f2
# owner: root
# group: root
user::rwuser:mage:---
user:jerry:rwgroup::r--
group:tom:rwx
mask::rwx
other::r--
[root@ubuntu2204 tmp]# setfacl --set u::rw,u:jerry:-,g::-,o::- f2
[root@ubuntu2204 tmp]# ll f2
-rw-------+ 1 root root 3 Jun 26 20:17 f2
[root@ubuntu2204 tmp]# getfacl f2
# file: f2
# owner: root
# group: root
user::rwuser:jerry:---
group::---
mask::---
other::---

image.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值