六、用户和权限管理
6.0.内容概述
- Linux的安全模型
- 用户和组相关文件
- 用户和组管理命令
- 理解并设置文件权限
- 默认权限
- 特殊权限
- 文件访问控制列表
6.1.Linux安全模型
资源分派:
- Authentication:认证,验证用户身份
- Authorization:授权,不同的用户设置不同权限
- Accouting:审计,事后行为
在Linux系统中,当用户登录成功时,系统会自动分配令牌 token,包括:用户标识和组成员等信息。
3A认证:又称AAA认证,是一套针对网络设备的网络访问控制策略安全模型。
#用于审计的登录日志
#rocky8.6
[root@rocky8 ~]# cat /var/log/secure
[root@ubuntu2204 ~]# tail /var/log/auth.log
6.1.1.用户
-
Linux系统是多用户系统,可以同时存在多个用户,每个用户之间都是互相隔离的。
-
在Linux系统中,每个用户是通过User Id (UID)来唯一标识的。
-
管理员:root, 0
-
普通用户:1-60000 自动分配
-
系统用户:1-499 (CentOS 6以前), 1-999 (CentOS 7以后) 对守护进程获取资源进行权限分配
-
登录用户:500+ (CentOS6以前), 1000+(CentOS7以后) 给用户进行交互式登录使用
在Linux中,root以下,都是普能用户,其用户id为1-60000
用户类型 | 用户名 | 用户ID (uid) | 作用 |
---|---|---|---|
超级管理员 | root(可改) | 0 | 超级管理员 |
普通用户 – 系统用户 | 自定义 | 1-499(CentOS6及以前),1-999(CentOS7及以后) | 给后台程序使用,像nginx,mysql等 |
普通用户 – 登录用户 | 自定义 | 500+(CentOS6及以前),1000+(CentOS7及以后) | 给用户进行交互式登录 |
6.1.2.用户组
Linux中可以将一个或多个用户加入用户组中,组就是包含0个或多个用户的集合,用户组是通过Group ID(GID) 来唯一标识的。
- 管理员组:root, 0
- 普通组:
- 系统组:1-499(CentOS 6以前), 1-999(CentOS7以后), 对守护进程获取资源进行权限分配
- 普通组:500+(CentOS 6以前), 1000+(CentOS7以后), 给用户使用
组类型 | 组名 | 组ID(gid) | 作用 |
---|---|---|---|
超级管理员组 | root | 0 | 给超级管理员使用 |
普通用户组 – 系统组 | 自定义 | 1-499(CentOS6及以前),1-999(CentOS7及以后) | 给后台用户使用 |
普通用户组 – 普通组 | 自定义 | 500+(CentOS6及以前),1000+(CentOS7及以后) | 给登录用户使用 |
6.1.3.用户和组的关系
-
一个用户至少有一个组,也可以有多个组;
-
一个组至少有0个用户,也可以有多个用户;
-
用户的主要组(primary group):又称私有组,一个用户必须属于且只有一个主组,创建用户时,默认会创建与其同名的组作为主组;
-
用户的附加组(supplementary group):又称辅助组,一个用户可以属于0个或多个附加组;
-
使用组,可以对用户进行批量管理,比如对一个组授权,则该组下所有的用户能能继承这个组的权限;
-
范例:
[root@ubuntu2204 ~]# id jose
uid=1001(jose) gid=1001(jose) groups=1001(jose)
[root@rocky8 ~]# id postfix
uid=89(postfix) gid=89(postfix) groups=89(postfix),12(mail)
6.1.4.安全上下文
-
Linux安全上下文Context:
- 在Linux系统中,运行中的程序(即进程process),都是以进程发起者的身份运行;
- 进程所能够访问的资源权限取决于进程的运行者的身份;
-
1️⃣ 首先,什么是程序
- 一个程序或一个命令,本质上也是一个可执行的二进制文件或一个可执行的脚本文件;
- 在服务器上有很多文件,只有那些特定的,可以被执行的二进制文件,才能被称为程序;
-
2️⃣ 其次,什么是进程
- 运行中的程序,就是进程;
-
3️⃣ 第三,程序,进程,用户之间的关系是怎样的
- 只有可以被执行的文件,才能叫作程序;
- 对于同一个程序,也不是所有用户都可以运行的,这要取决于当前用户对该程序有没有可执行权限;
- 用户张三,运行了某个程序,那么,张三就发起了一个进程,该进程的发起者,就是张三,该进程是以张三的身份在运行;
- 打个比方,在交通工具中,只有能在天上飞的,才能叫作飞机;
- 对于同一架飞机,也不是所有人都能上去的,这要取决于有没有买机票,有没有登机牌;
-
4️⃣ 第四,进程的访问资源
- 一个进程能不能访问某些资源,是由进程发起者决定的(跟进程本身的程序文件无关),比如某进程要读写某个文件,则要看该进程发起者有没有权限读取该文件;
- 一个旅客能不能坐头等舱,是由旅客自己决定的,跟飞机本身无关;
-
范例:
#reboot命令,只有root用户才有权限执行
[root@ubuntu2204 ~]# reboot
Connection closing...Socket close.
Connection closed by foreign host.
Disconnected from remote host(rocky8.5-2-153) at 11:19:02.
Type `help' to learn how to use Xshell prompt.
#普通用户无权限执行
[root@ubuntu2204 ~]# su - jose
jose@ubuntu2204 reboot
User root is logged in on sshd.
Please retry operation after closing inhibitors and logging out other users.
Alternatively, ignore inhibitors and users with 'systemctl reboot -i'.
- 范例:
#root 和普通用户都能执行cat命令,但对于某些文件,只有root 用户才能打开
[root@ubuntu2204 ~]# cat /etc/shadow
root:$6$10pvyo2c4EI8tYh1$PT2yiAT6nrxs9rtjhQFWfDuHyFaV5HARXzn9YZ6wpJKveHccpl5Qolj
t7iIlmHxWuy//::0:99999:7:::
bin:*:18700:0:99999:7:::
daemon:*:18700:0:99999:7:::
adm:*:18700:0:99999:7:::
......
jose@ubuntu2204 cat /etc/shadow
cat: /etc/shadow: Permission denied
6.2.用户和组的配置文件
6.2.1 用户和组的主要配置文件
配置文件路径 | 含义 |
---|---|
/etc/passwd | 用户及其属性信息(名称、UID、主组ID等) |
/etc/shadow | 用户密码及其相关属性 |
/etc/group | 组及其属性信息 |
/etc/gshadow | 组密码及其相关属性 |
6.2.2 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 |
- 修改用户shell
[root@ubuntu2204 ~]# getent passwd jose
jose:x:1001:1001::/home/jose:/bin/bash
[root@ubuntu2204 ~]# chsh -s /bin/sh jose
[root@ubuntu2204 ~]# getent passwd jose
jose:x:1001:1001::/home/jose:/bin/sh
6.2.3 shadow文件格式
- 此文件中存储的是用户密码信息,任何用户都无权限
[root@rocky ~]# ll /etc/shadow
---------- 1 root root 1344 May 22 10:27 /etc/shadow
#ubuntu 中有权限
[root@ubuntu2204 ~]# ll /etc/shadow
-rw-r----- 1 root shadow 1218 May 9 16:34 /etc/shadow
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 | 保留字段,无意义 |
所有伪用户的密码都是 “!!” 或 “*”,代表没有密码是不能登录的,新建用户还没设密码时为!!,禁用账
号,可以直接在密码字段前加 !
6.2.4 group文件格式
man group
#文件格式
#group_name:password:GID:user_list
ftp:x:50:
mage:x:1002:
英文 | 含义 |
---|---|
group_name | 组名 |
password | 组密码,当用户加组时,需要用此密码验证 |
GID | 组ID |
user_list | 用户列表,多个用户用,分隔, 此处的用户将当前组作为附加组 |
6.2.5 gshadow文件格式
man gshadow
#文件格式
#group name:encrypted password:administrators:members
ftp:::
mage:!::
英文 | 含义 |
---|---|
group name | 组名 |
encrypted password | 组密码,加密后的密文,!表示还没设密码 |
administrators | 组管理员 |
members | 用户列表,多个用户用,分隔, 此处的用户将当前组作为附加组 |
6.2.6 文件操作
-
可以直接用编辑工具来修改上述文件,但由于跟用户和权限有关的文件具有敏感性,所以系统提供了专用的工具来修改这几个文件。
-
vipw & vigr
#vipw|vigr
#编辑/etc/passwd,/etc/group,/etc/shadow,/etc/gshadow
#vipw 默认编辑 /etc/passwd 文件
#vigr 默认编辑 /etc/group 文件
-g|--group #编辑 group 文件
-p|--passwd #编辑 passwd 文件
-s|--shadow #编辑 /etc/shadow 或 /etc/gshadow 文件
- pwck & grpck
#pwck [options] [passwd [shadow]]
#对用户相关配置文件进行检查,默认检查文件为 /etc/passwd
-q|--quiet #只报告错误,忽略警告
-r|--read-only #显示错误和警告,但不改变文件
-R|--root CHROOT_DIR #chroot 到的目录
-s|--sort #通过 UID 排序项目
#grpck [options] [group [gshadow]]
#对用户组相关配置文件进行检查,默认检查文件为 /etc/group,/etc/gshadow
-r|--read-only #显示错误和警告,但不改变文件
-R|--root CHROOT_DIR #chroot 到的目录
-s|--sort #通过 UID 排序项目
- getent
getent passwd|shadow|group|gshadow [uname]
#根据用户名查看配置项
6.3 用户和组管理命令
- 用户管理命令
- useradd
- usermod
- userdel
- 组帐号维护命令
- groupadd
- groupmod
- groupdel
6.3.1 用户创建
- useradd 命令可以创建新的Linux用户
- 格式:
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@rocky8 ~]# rpm -q --scripts postfix
preinstall scriptlet (using /bin/sh):
# Add user and groups if necessary
/usr/sbin/groupadd -g 90 -r postdrop 2>/dev/null
/usr/sbin/groupadd -g 89 -r postfix 2>/dev/null
/usr/sbin/groupadd -g 12 -r mail 2>/dev/null
/usr/sbin/useradd -d /var/spool/postfix -s /sbin/nologin -g postfix -G mail -M -r -u 89 postfix 2>/dev/null
- 范例:
#创建用户前先建组,可以确保组ID是己知的
#不可占用己存在的组ID
[root@ubuntu2204 ~]# groupadd -g 33 mysql
groupadd: GID '33' already exists
#创建系统组
[root@ubuntu2204 ~]# groupadd -g 336 -r mysql
#查看
[root@ubuntu2204 ~]# getent group mysql
mysql:x:336:
[root@ubuntu2204 ~]# getent gshadow mysql
mysql:!::
#创建用户
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@ubuntu2204 ~]# useradd tom
#查看
[root@ubuntu2204 ~]# getent passwd tom
tom:x:1002:1002::/home/tom:/bin/sh
[root@ubuntu2204 ~]# getent shadow tom
tom:!:19486:0:99999:7:::
[root@ubuntu2204 ~]# getent group tom
tom:x:1002:
[root@ubuntu2204 ~]# getent gshadow tom
tom:!::
[root@ubuntu2204 ~]# ls /home/tom
ls: cannot access '/home/tom': No such file or directory
#rocky中默认创建
[root@rocky8 ~]# ls -a /home/tom/
. .. .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
- 批量创建用户
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 | chpasswd
范例: CentOS8 生成sha512加密密码
[root@rocky8 ~]# openssl passwd -6 magedu
$6$UOyYOao.iM2.rPnM$jCpTnBVIQBuGCLOm4N5hqh5YUc3wWXcDzkDMddthpKNL3scOZjTHh9fXds8E
u6gNdEQqLMQgOboipZ08mnz2V.
范例: CentOS7 利用Python程序在 生成sha512加密密码
[root@centos7 ~]# python -c 'import
crypt,getpass;pw="magedu";print(crypt.crypt(pw))'
$6$pt0SFMf6YqKea3mh$.7Hkslg17uI.Wu7BcMJStVVtkzrwktXrOC8DxcMFC4JO1igrqR7VAi87H5PH
OuLTUEjl7eJqKUhMT1e9ixojn1
范例: CentOS 6 创建并指定基于sha512的用户密码
[root@centos6 ~]# grub-crypt --help
Usage: grub-crypt [OPTION]...
Encrypt a password.
-h, --help Print this message and exit
-v, --version Print the version information and exit
--md5 Use MD5 to encrypt the password
--sha-256 Use SHA-256 to encrypt the password
--sha-512 Use SHA-512 to encrypt the password (default)
Report bugs to <bug-grub@gnu.org>.
EOF
[root@centos6 ~]# grub-crypt --sha-512
Password:
Retype password:
$6$v9A2/xUNwAWwEmHN$q7Wz.uscsV/8J5Gss3KslX8hKXOoaP3hDpOBWeBfMQHVIRZiwHUUkii84cvQ
WIMnvtnXYsdVHuLO4KhOiSOMh/
[root@centos6 ~]# useradd -p
'$6$v9A2/xUNwAWwEmHN$q7Wz.uscsV/8J5Gss3KslX8hKXOoaP3hDpOBWeBfMQHVIRZiwHUUkii84cv
QWIMnvtnXYsdVHuLO4KhOiSOMh/' test
[root@centos6 ~]# getent shadow test
test:$6$v9A2/xUNwAWwEmHN$q7Wz.uscsV/8J5Gss3KslX8hKXOoaP3hDpOBWeBfMQHVIRZiwHUUkii
84cvQWIMnvtnXYsdVHuLO4KhOiSOMh/:18459:0:99999:7:::
范例: Ubuntu2204 创建sha512加密密码
[root@ubuntu2204 ~]# openssl passwd -6 123456
$6$RyaXh7L.7fORQBjB$0WXRATSjh3IU.eufhsY5uJpKZwCAGjyAj5r/et9ymohEKsTdMvagEW92t1IA
kNte0yVZ88YyMUqx1b6uHIrxM/
范例: Rockey9 创建sha512加密密码
[root@Rockey9-1 ~]# openssl passwd -6 123456
$6$Msmt4tnwyFBkBhJ0$TXlygW29i6L2GC2HnuTTXDGhsLZuP1yVNnWn/u.XRZxMNYa1knQv39/NxUmx1DN9AJcYUevzfLj5hdHApOXin.
[root@Rockey9-1 ~]# openssl passwd -6 123456
$6$CEpEDpkFPCFS/Sbv$FMPGI0yx.h42L1IXZza8sPQTZND3P1j5s2gzY0661cmmMEg3mjlUCMR6LZ1x5.9TAQKIcF3TCUJ5DYykHnfjH.
[root@Rockey9-1 ~]# openssl passwd -6 123456
$6$RBMKzNqtA4GKgvYR$CgQ6.dkAkZ5wnDIEGsJbwTyNJK9q.O9eyE0IMNbmeGoARTrjwi9zrK6pXz5gTEm299Vdgil8cVMTOehcSrdW61
[root@Rockey9-1 ~]# openssl passwd -6 --salt abcdefg 123456
$6$abcdefg$SVqgF31LWsg8o0zQyy63h/NIcgk3RP516ZKxuWJasoxHYEkq0YWf.WgIhFz5uK19zJrEK61oiA.TFD5ROrPxH0
[root@Rockey9-1 ~]# openssl passwd -6 --salt abcdefg 123456
$6$abcdefg$SVqgF31LWsg8o0zQyy63h/NIcgk3RP516ZKxuWJasoxHYEkq0YWf.WgIhFz5uK19zJrEK61oiA.TFD5ROrPxH0
6.3.2 用户属性修改
- usermod 命令可以修改用户属性
- 格式:
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@ubuntu2204 ~]# id tom
uid=1002(tom) gid=1002(tom) groups=1002(tom)
#把tom改成jerry
[root@ubuntu2204 ~]# usermod -c "tom to jerry" -l jerry tom
[root@ubuntu2204 ~]# id jerry
uid=1002(jerry) gid=1002(tom) groups=1002(tom)
- 锁定用户:用户被锁定之后将无法登录
[root@rocky8 ~]# getent shadow jose
jose:$6$1gfAZcky1hjTfVX0$dcImV6yr9xWzfcfeUI0zXH3p0t0OG71nzUcqD7MoLID8bzsoPKS60Cu
oGbWv.e.qXzzXknAqTfTWvMlZzpp.i/:19158:0:99999:7:::
[root@rocky8 ~]# usermod -L jose
[root@rocky8 ~]# getent shadow jose
jose:!$6$1gfAZcky1hjTfVX0$dcImV6yr9xWzfcfeUI0zXH3p0t0OG71nzUcqD7MoLID8bzsoPKS60C
uoGbWv.e.qXzzXknAqTfTWvMlZzpp.i/:19158:0:99999:7:::
[root@ubuntu2204 ~]# getent shadow jose
jose:$y$j9T$d7EfLYe7v5FrllBSZQ3PH.$LsgwS9XAyBaB.GTGqfiZND6/e8P0xrKeXZhpH2IIO.9:1
9486:0:99999:7:::
[root@ubuntu2204 ~]# usermod -L jose
[root@ubuntu2204 ~]# getent shadow jose
jose:!$y$j9T$d7EfLYe7v5FrllBSZQ3PH.$LsgwS9XAyBaB.GTGqfiZND6/e8P0xrKeXZhpH2IIO.9:
19486:0:99999:7:::
- 解锁用户
[root@rocky8 ~]# usermod -U jose
[root@rocky8 ~]# getent shadow jose
jose:$6$1gfAZcky1hjTfVX0$dcImV6yr9xWzfcfeUI0zXH3p0t0OG71nzUcqD7MoLID8bzsoPKS60Cu
oGbWv.e.qXzzXknAqTfTWvMlZzpp.i/:19158:0:99999:7:::
- centos 允许空密码用户登录,所以两个 !!,无法用 -U 选项解锁
- 所谓解锁,只针对于有密码的用户来说,但是,可以直接修改/etc/shadow 文件,将密码栏置空产生空密码用户
[root@rocky8 ~]# getent shadow jerry
jerry:!!:19168:0:99999:7:::
[root@rocky8 ~]# usermod -U jerry
usermod: unlocking the user's password would result in a passwordless account.
You should set a password with usermod -p to unlock this user's password.
[root@rocky8 ~]# getent shadow jerry
jerry:!!:19168:0:99999:7:::
6.3.3 删除用户
- userdel 可删除 Linux 用户
- 格式:
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
6.3.4 查看用户相关的ID信息
- id 命令可以查看用户的 UID,GID等信息
- 格式:
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)
6.3.5 切换用户或以其他用户身份执行命令
如果在当前登录终端中,要执行某条命令,但当前登录用户又没有可执行权限或没有某些资源权限;
则在此种情况下,我们可以:
- 让有权限的用户登录终端,再执行相应的操作;
- 在当前终端终,临时切换,以有权限的用户的身份去执行命令;
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子进程,环境可能会混乱。
- 完全切换和不完全切换的区别
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
- 直接以另一个用户执行命令,而不切换用户
[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 nologin"
nologin
6.3.6 设置密码
- passwd 可以修改用户密码
- 格式:
passwd [OPTION...] <accountName>
常见选项 | 含义 |
---|---|
-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有权限操作 |
-i|–inactive=DAYS | 当密码过期后经过多少天该用户账号会被禁用,仅root有权限操作 |
-S|–status | 查询用户的密码状态,仅root有权限操作 |
–stdin | 从标准输入接收密码,Ubuntu无此选项 |
- 普通用户修改自己密码,要先验证当前使用的密码
jose@ubuntu2204:~$ passwd
Changing password for jose.
Current password:
New password:
Retype new password:
passwd: password updated successfully
echo -e '123456\n123456' | passwd mage
- root修改其它用户密码
[root@ubuntu2204 ~]# passwd jose
New password:
Retype new password:
passwd: password updated successfully
- 修改密码其实就是更新 /etc/shadow 文件
[root@ubuntu2204 ~]# ll /etc/shadow
-rw-r----- 1 root shadow 1577 May 9 20:36 /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:
6.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
[root@ubuntu2204 ~]# getent shadow jose
jose:$y$j9T$RjraLGxq.YMdIUlVFoHGo.$YYxkTHpzzUwxc5i1hnu/aLkkwF2g.DioQx5fXoPssc4:1
9168:3:42:10:20:
- 账号过期提示
[D:\~]$ ssh jose@10.0.0.153
Connecting to 10.0.0.153:22...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.
Your account has expired; please contact your system administrator.
Connection closing...Socket close.
Connection closed by foreign host.
Disconnected from remote host(10.0.0.153:22) at 18:13:51.
Type `help' to learn how to use Xshell prompt.
[D:\~]$ ssh jose@10.0.0.153
Connecting to 10.0.0.153:22...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.
You are required to change your password immediately (password expired).
You are required to change your password immediately (password expired).
Last login: Thu Apr 25 18:16:32 2024 from 10.0.0.1
WARNING: Your password has expired.
You must change your password now and login again!
Changing password for user jose.
Current password:
[D:\~]$ ssh jose@10.0.0.153
Connecting to 10.0.0.153:22...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.
Warning: your password will expire in 4 days.
Warning: your password will expire in 4 days.
Last login: Thu Apr 25 18:16:55 2024 from 10.0.0.1
密码文件中各时间字段的表示:
6.3.8 创建组
- groupadd 实现创建组
- 格式
groupadd [options] GROUP
常见选项 | 含义 |
---|---|
-f|–force | 如果组已经存在则成功退出 |
-g|–gid GID | 新建组时指定组ID,默认是系统分配,指定值不要超过[GID_MIN,GID_MAX] |
-K|–key KEY=VALUE | 不使用 /etc/login.defs 中的默认值,自己指定,比如 -KGID_MIN=100 |
-o|–non-unique | 允许创建有重复 GID 的组 |
-p|–password PASSWORD | 为新组使用此加密过的密码,这里要用加密后的密文,不然就是直接是明文在/etc/gshadow 里面 |
-r|–system | 创建一个系统组 CentOS 6之前: ID<500,CentOS 7以后: ID<1000 |
- 范例:
[root@ubuntu2204 ~]# groupadd -g 48 -r apache
[root@ubuntu2204 ~]# getent group apache
apache:x:48:
#不加 -f 会提示己存在
[root@ubuntu2204 ~]# groupadd apache
groupadd: group 'apache' already exists
# -f 直接结束
[root@ubuntu2204 ~]# groupadd -f apache
6.3.9 修改组
- 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@ubuntu2204 ~]# getent group apache
apache:x:48:
[root@ubuntu2204 ~]# groupmod -g 123 apache
[root@ubuntu2204 ~]# getent group apache
apache:x:123:
[root@ubuntu2204 ~]# groupmod -n apache2 apache
[root@ubuntu2204 ~]# getent group apache2
apache2:x:123:
[root@ubuntu2204 ~]$ groupadd -g 123 g1
[root@ubuntu2204 ~]$ getent group g1
g1:x:123:
[root@ubuntu2204 ~]$ useradd -u 123 -g g1 user1
[root@ubuntu2204 ~]$ id user1
uid=123(user1) gid=123(g1) groups=123(g1)
6.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的主组也给删了,前提是该组下没有其它用户
6.3.11 更改组成员和密码
-
gpasswd 命令,可以更改组密码,也可以修改附加组的成员关系
-
组没有密码的情况下,加组只能由root来操作
-
格式:
gpasswd [option] GROUP
常见选项 | 含义 |
---|---|
-a|–add USER | 向组中添加用户 |
-d|–delete USER | 从组中移除用户 |
-r|–delete-password | 删除组密码 |
-R|–restrict | 向其成员限制访问组 GROUP |
-M|–members USER,… | 批量加组 |
-A|–administrators ADMIN,… | 批量设组管理员 |
- 范例:
[root@ubuntu2204 ~]# id jose
uid=1001(jose) gid=1001(jose) groups=1001(jose)
[root@ubuntu2204 ~]# groups jose
jose : jose
#创建新组
[root@ubuntu2204 ~]# groupadd group1
[root@ubuntu2204 ~]# getent gshadow group1
group1:!::
#给用户加组
[root@ubuntu2204 ~]# gpasswd -a jose group1
Adding user jose to group group1
[root@ubuntu2204 ~]# getent gshadow group1
group1:!::jose
#查看用户的组
[root@ubuntu2204 ~]# id jose
uid=1001(jose) gid=1001(jose) groups=1001(jose),1026(group1)
[root@ubuntu2204 ~]# groups jose
jose : jose group1
范例:设置组密码
[root@ubuntu2204 ~]# gpasswd group1
Changing the password for group group1
New Password:
Re-enter new password:
[root@ubuntu2204 ~]# getent gshadow group1
group1:$6$Q4W8lH5V1P/A$qQut0/mMl3SrScLcq4LRQljvY8jmkPHCPQn0VE9pxHIrbbxvYuACTTAGt
C3YPyQ4Ous/nk6Vzu.tXwIdCYOn./::jose
范例:移除组成员
[root@ubuntu2204 ~]# gpasswd -d jose group1
Removing user jose from group group1
[root@ubuntu2204 ~]# groups jose
jose : jose
6.3.12 更改和查看组成员
- groupmems 可以管理附加组的成员关系
- 格式:
groupmems [options] [action]
常见选项 | 含义 |
---|---|
-g|–group groupname | 更改为指定组 (只有root) |
-a|–add username | 指定用户加入组 |
-d|–delete username | 从组中删除用户 |
-p|–purge | 从组中清除所有成员 |
-l|–list | 显示组成员列表 |
- 范例:
#列出以group1 组为附加组的用户
[root@ubuntu2204 ~]# groupmems -g group1 -l
#将jose 加到group1 组
[root@ubuntu2204 ~]# groupmems -g group1 -a jose
[root@ubuntu2204 ~]# groupmems -g group1 -l
jose
[root@ubuntu2204 ~]# id jose
uid=1000(jose) gid=1000(jose) groups=1000(jose),1004(group1)
- groups 可查看用户组关系
- 格式:
#查看用户所属组列表
groups [OPTION].[USERNAME]...
- 临时切换组
#newgrp [-] [group]
#临时切换用户组,这里就要用到上面gpasswd 给组设置的密码
#普通用户切组需要密码,root用户切组不需要密码
newprp mage #切换之后创建的文件属组就是mage
6.4 文件权限管理
6.4.1 Linux中的权限体系介绍
- 在Linux系统中,一切皆文件;
- 对文件来讲,系统中的用户,分属于三类不同的角色,分别是属主,属组,其它用户;
- 而每个角色用户,对该文件的权限,也分三种,分别是读,写,执行;
- 三种角色:
角色 | 英文表示 | 字符表示 |
---|---|---|
属主:所有者 | owner|OWNER|user | u |
属组:属于哪个组 | group|GROUP | g |
其它用户:不是所有者,也不在属组中的用户 | other|OTHER | o |
- 三种权限:
权限 | 英文表示 | 字符表示 | 八进制表示 |
---|---|---|---|
读权限 | read|Readable | r | 4 |
写权限 | write|Writable | w | 2 |
执行权限 | execute|eXcutable | x | 1 |
- 程序访问文件时的权限,取决于此程序的发起者
- 进程的发起者,同文件的属主:则应用文件属主权限
- 进程的发起者,属于文件属组;则应用文件属组权限
- 应用文件“其它”权限
6.4.2 文件所有者和属组属性操作
6.4.2.1 设置文件的所有者chown
- 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@ubuntu2204 0509]# ll
total 8
drwxr-xr-x 2 root root 4096 May 9 21:01 ./
drwx------ 11 root root 4096 May 9 20:35 ../
-rw-r--r-- 1 root root 0 May 9 21:01 a1.txt
-rw-r--r-- 1 root root 0 May 9 21:01 a2.txt
-rw-r--r-- 1 root root 0 May 9 21:01 a3.txt
-rw-r--r-- 1 root root 0 May 9 21:01 a4.txt
-rw-r--r-- 1 root root 0 May 9 21:01 a5.txt
-rw-r--r-- 1 root root 0 May 9 21:01 a6.txt
#修改属主
[root@ubuntu2204 0509]# chown jose a1.txt #只修改属主
[root@ubuntu2204 0509]# chown jose. a2.txt #同时修改属主和属组
[root@ubuntu2204 0509]# chown jose: a3.txt #同时修改属主和属组
#查看
[root@ubuntu2204 0509]# ll a1.txt a2.txt a3.txt
-rw-r--r-- 1 jose root 0 Jun 26 10:34 a1.txt
-rw-r--r-- 1 jose jose 0 Jun 26 10:34 a2.txt
-rw-r--r-- 1 jose jose 0 Jun 26 10:34 a3.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@ubuntu2204 0509]$ chown 1000:1000 a6.txt
[root@ubuntu2204 0509]$ chown 1000.1000 a6.txt
[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@ubuntu2204 0509]# touch b{1..6}.txt
[root@ubuntu2204 0509]# ll b*
-rw-r--r-- 1 root root 0 Jun 26 10:40 b1.txt
-rw-r--r-- 1 root root 0 Jun 26 10:40 b2.txt
-rw-r--r-- 1 root root 0 Jun 26 10:40 b3.txt
-rw-r--r-- 1 root root 0 Jun 26 10:40 b4.txt
-rw-r--r-- 1 root root 0 Jun 26 10:40 b5.txt
-rw-r--r-- 1 root root 0 Jun 26 10:40 b6.txt
#以组名修改
[root@ubuntu2204 0509]# chown .jose b1.txt
[root@ubuntu2204 0509]# chown :jose b2.txt
#查看
[root@ubuntu2204 0509]# ll b1.txt b2.txt
-rw-r--r-- 1 root jose 0 Jun 26 10:40 b1.txt
-rw-r--r-- 1 root jose 0 Jun 26 10:40 b2.txt
#以GID修改
[root@ubuntu2204 0509]# chown .1000 b4.txt
[root@ubuntu2204 0509]# chown :1000 b5.txt
[root@ubuntu2204 0509]# chown .789 b6.txt
[root@ubuntu2204 0509]# ll b4.txt b5.txt b6.txt
-rw-r--r-- 1 root jose 0 Jun 26 10:40 b4.txt
-rw-r--r-- 1 root jose 0 Jun 26 10:40 b5.txt
-rw-r--r-- 1 root 789 0 Jun 26 10:40 b6.txt
- 范例:同时修改
[root@ubuntu2204 0509]# ll c*
-rw-r--r-- 1 root root 0 Jun 26 10:46 c1.txt
-rw-r--r-- 1 root root 0 Jun 26 10:46 c2.txt
-rw-r--r-- 1 root root 0 Jun 26 10:46 c3.txt
-rw-r--r-- 1 root root 0 Jun 26 10:46 c4.txt
-rw-r--r-- 1 root root 0 Jun 26 10:46 c5.txt
[root@ubuntu2204 0509]# chown jose:tom c1.txt
[root@ubuntu2204 0509]# chown jose.123 c2.txt
[root@ubuntu2204 0509]# chown jose:nogroup c3.txt #组不存在会报错
chown: invalid group: ‘jose:nogroup’
[root@ubuntu2204 0509]# chown 1003.jose c4.txt
[root@ubuntu2204 0509]# chown 123:456 c5.txt
[root@ubuntu2204 0509]# ll c*
-rw-r--r-- 1 jose tom 0 Jun 26 10:58 c1.txt
-rw-r--r-- 1 jose 123 0 Jun 26 10:58 c2.txt
-rw-r--r-- 1 root root 0 Jun 26 10:58 c3.txt
-rw-r--r-- 1 jerry jose 0 Jun 26 10:58 c4.txt
-rw-r--r-- 1 123 456 0 Jun 26 10:58 c5.txt
- 范例:
[root@ubuntu2204 0509]# ll f*
-rw-r--r-- 1 123 456 0 Jun 26 11:02 f1.txt
-rw-r--r-- 1 root root 0 Jun 26 11:02 f2.txt
#根据文件修改
[root@ubuntu2204 0509]# chown --reference=f1.txt f2.txt
#查看
[root@ubuntu2204 0509]# ll f*
-rw-r--r-- 1 123 456 0 Jun 26 11:02 f1.txt
-rw-r--r-- 1 123 456 0 Jun 26 11:02 f2.txt
#递归写法
chown -R jose.tom dir1/
6.4.2.2 设置文件的属组信息chgrp
- chgrp 命令可以只修改文件的属组
- 格式:
chgrp [OPTION]... GROUP FILE...
chgrp [OPTION]... --reference=RFILE FILE...
常用选项 | 含义 |
---|---|
-c|–changes | 同-v选项,但只显示更新成功的信息 |
-f|–silent|–quiet | 不显示错误信息 |
-v|–verbose | 显示过程 |
–dereference | 修改的是符号链接指向的文件,而不是链接文件本身 |
-h|–no-dereference | 修改的是符号链接文件,而不是其指向的目标文件(只有当前系统支持修改符号链接文件属性时,此项才有效) |
–no-preserve-root | 不特别对待“/”,意思就是将家目录当成普通目录来执行,默认如此,所以不要对根目录进行操作 |
–preserve-root | 不允许在"/"上递归操作 |
–reference=RFILE | 根据其它文件权限来操作,就是复制该文件的属主属组信息给指定文件 |
-R|–recursive | 递归操作 |
下列选项配合 -R 使用 | |
-H | 如果参数是指向目录的软链接,则只修改指向的目录,不改变目录里面文件的属主属组 |
-L | 更改所有遇到的符号链接指向的目录 |
-P | 不更改符号链接指向的目录 |
- 范例:
[root@ubuntu2204 0509]# ll
total 0
-rw-r--r--. 1 root root 0 Jun 26 11:14 f1.txt
-rw-r--r--. 1 root root 0 Jun 26 11:14 f2.txt
-rw-r--r--. 1 root root 0 Jun 26 11:14 f3.txt
[root@ubuntu2204 0509]# chgrp jose f1.txt
[root@ubuntu2204 0509]# chgrp 123 f2.txt
[root@ubuntu2204 0509]# ll
total 0
-rw-r--r-- 1 root jose 0 Jun 26 11:14 f1.txt
-rw-r--r-- 1 root 123 0 Jun 26 11:14 f2.txt
[root@ubuntu2204 0509]# chgrp mage -R dir1/ #将 dir1 及其目录内的所有文件属组都改为 mage
[root@ubuntu2204 0509]# ll
total 0
-rw-r--r-- 1 root root 0 Jun 26 11:17 a
lrwxrwxrwx 1 root root 1 Jun 26 11:17 a.link -> a
[root@ubuntu2204 0509]# chgrp mage --dereference a.link #修改a.link 指向的文件的属主属组
[root@ubuntu2204 0509]# ll
total 0
-rw-r--r-- 1 root mage 0 Jun 26 11:17 a
lrwxrwxrwx 1 root root 1 Jun 26 11:17 a.link -> a
[root@ubuntu2204 0509]# chgrp 123 --no-dereference a.link #修改a.link 本身的属主属组
[root@ubuntu2204 0509]# ll
total 0
-rw-r--r-- 1 root mage 0 Jun 26 11:17 a
lrwxrwxrwx 1 root 123 1 Jun 26 11:17 a.link -> a
6.4.3 文件权限
6.4.3.1 文件权限说明
- 角色定义
角色 | 在命令中的字符 | 备注 |
---|---|---|
owner | u | 属主 |
group | g | 属组 |
other | o | 其它用户 |
all | a | 所有人,包括属主属组和其它用户 |
- 赋值写法
在命令中的字符 | 备注 |
---|---|
+ | 增加某些权限 |
- | 删除某些权限 |
= | 只保留某些权限,覆盖写法 |
- 权限表示方法
权限 | 在命令中的字符 | 八进制数字表示 | 备注 |
---|---|---|---|
Readable | r | 4 | 读权限 |
Writable | w | 2 | 写权限 |
eXcutable | x | 1 | 执行权限 |
常用写法 | 含义 |
---|---|
u+r | 属主加读权限 |
g-x | 属组去掉执行权限 |
ug=rx | 属主属组权限改为读和执行 |
o= | other用户无任何权限 |
a=rwx | 所有用户都有读写执行权限 |
u+r,g-x | 同时指定 |
-
注意:
- 用户的最终权限,是从左向右进行顺序匹配,即,所有者,所属组,其他人,一旦匹配权限立即生效,不再向右查看其权限
- r和w权限对root 用户无效,对没有读写权限的文件,root用户也可读可写
- 只要所有者,所属组或other三者之一有x权限,root就可以执行
-
权限作用
权限 | 对文件 | 对目录 |
---|---|---|
r | 可查看文件内容 | 可读取目录中的文件名,但文件元数据无法查看 |
w | 可修改文件内容 | 可在目录中创建文件和删除文件 |
x | 可执行,发起为一个进程 | 可进入目录,可查看文件元数据,可查看文件内容,属于目录最小权限 |
- 面试题:
Linux中的目录和文件的权限区别?分别说明读,写和执行权限的区别
- 数学法的权限
字符表示 | 二进制表示 | 八进制表示 | 备注 |
---|---|---|---|
- - - | 000 | 0 | 无任何权限 |
- -x | 001 | 1 | 可执行 |
-w- | 010 | 2 | 可写 |
-wx | 011 | 3 | 可写可执行 |
r- - | 100 | 4 | 可读 |
r-x | 101 | 5 | 可读可执行 |
rw- | 110 | 6 | 可读可写 |
rwx | 111 | 7 | 可读可写可执行 |
- 示例:
字符表示 | 八进制数字表示 | 备注 |
---|---|---|
rw-r- - - - - | 640 | 属主可读写,属组可读,其它用户无任何权限 |
rw-r- -r- - | 644 | 属主可读写,属组可读,其它用户可读 |
rwxr-xr-x | 755 | 属主可读写,可执行,属组可读可执行,其它用户可读可执行 |
6.4.3.2 修改文件权限chmod
- 格式
chmod [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@ubuntu2204 0509]# ll
total 0
-rw-r--r-- 1 root root 0 Jun 26 12:44 f1
-rw-r--r-- 1 root root 0 Jun 26 12:44 f2
-rw-r--r-- 1 root root 0 Jun 26 12:44 f3
-rw-r--r-- 1 root root 0 Jun 26 12:44 f4
[root@ubuntu2204 0509]# chmod a= f1
[root@ubuntu2204 0509]# chmod u=r,g=w,o=x f2
[root@ubuntu2204 0509]# chmod u+w,g-x,o-r f3
[root@ubuntu2204 0509]# chmod a=rwx f4
[root@ubuntu2204 0509]# ll
total 0
drwxr-xr-x 2 root root 4096 May 9 21:10 ./
drwx------ 11 root root 4096 May 9 20:35 ../
---------- 1 root root 0 May 9 21:10 f1
-r---w---x 1 root root 0 May 9 21:10 f2*
-rw-r----- 1 root root 0 May 9 21:10 f3
-rwxrwxrwx 1 root root 0 May 9 21:10 f4*
- 范例:
[root@ubuntu2204 0509]# ll
total 0
-rw-r--r-- 1 root root 0 Jun 26 12:44 a1
-rw-r--r-- 1 root root 0 Jun 26 12:44 a2
-rw-r--r-- 1 root root 0 Jun 26 12:44 a3
#数字
[root@ubuntu2204 0509]# chmod 644 a1
[root@ubuntu2204 0509]# chmod 0 a2
[root@ubuntu2204 0509]# chmod 777 a3
[root@ubuntu2204 0509]# ll
total 0
-rw-r--r-- 1 root root 0 Jun 26 13:34 a1
---------- 1 root root 0 Jun 26 13:34 a2
-rwxrwxrwx 1 root root 0 Jun 26 13:34 a3
- 范例:错误写法
[root@ubuntu2204 0509]# chmod u+4 a1
chmod: invalid mode: ‘u+4’
Try 'chmod --help' for more information.
- 范例:递归操作
[root@ubuntu2204 0509]# chmod o+rwx -R dir1/
#大写X,只会给子目录加x权限
[root@ubuntu2204 0509]# chmod o+X -R dir1/
- 范例:目录权限
[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
#+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
#+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
- 范例:面试题
执行 cp /etc/issue /data/dir/ 所需要的最小权限?
/bin/cp 需要x权限
/etc/ 需要x权限
/etc/issue 需要r权限
/data 需要x权限
/data/dir 需要w,x权限
6.4.4 新建文件和目录的默认权限
- 在linux 系统中,新建文件或目录,都有一个默认权限;
user | file | dir | umask |
---|---|---|---|
root | 644 | 755 | 022 |
jose | 664 | 775 | 002 |
- umask 值间接影响新建文件和新建目录的权限:
- 新建文件:666-umask,按位对应相减,如果所得结果某位存在执行(奇数)权限,则该位+1;
- 要确保新创建出来的文件不能有可执行权限
- 新建目录:777-umask;
- 新建文件:666-umask,按位对应相减,如果所得结果某位存在执行(奇数)权限,则该位+1;
umask [-p] [-S] [mode]
#显示或设定文件模式掩码。
-p #如果省略 MODE 模式,以可重用为输入的格式输入
-S #以字符显示
- 范例:查看umask
[root@ubuntu2204 ~]# umask
0022
[root@ubuntu2204 ~]# umask -p
umask 0022
[root@ubuntu2204 ~]# umask -S
u=rwx,g=rx,o=rx
- 范例:修改umask
[root@ubuntu2204 ~]# umask 123
[root@ubuntu2204 ~]# umask
0123
[root@ubuntu2204 ~]# umask u=rw,g=r,o=
[root@ubuntu2204 ~]# umask
0137
- 非特权用户 umask 默认是 002
- root 的 umask 默认是 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
6.4.5 Linux文件系统上的特殊权限
- 在Linux中,除了rwx 这三种常⻅的权限之外,还有三个特殊权限,分别是 SUID, SGID,Sticky;
- 这三个特殊权限独⽴于rwx权限体系;
- 特殊权限
- SUID:作用于二进制可执行文件上,用户将继承此程序所有者的权限;
- SGID:
- 作用于二进制可执行文件上,用户将继承此程序所有组的权限;
- 作用于目录上,此目录中新建的文件的所属组将自动从此目录继承;
- STICKY:作用于目录上,此目录中的文件只能由所有者自已来删除;
权限 | 字符表示 | 八进制表示 | 备注 |
---|---|---|---|
SUID | s | 4 | 如果原属主没有可执行权限,再加SUID权限,则显示为S |
SGID | s | 2 | 如果原属组没有可执行权限,再加SGID权限,则显示为S |
STICKY | t | 1 | 如果other没有可执行权限,再加STICKY权限,则显示为T |
apt update; apt -y install g++
#include <stdio.h>
#include <unistd.h>
#include <iostream>
int main(){
while(true){
printf("hello world\n");
sleep(1);
}
return 0;
}
g++ main.cpp -o main
[root@ubuntu2204 ~]$ ls -lh
total 24K
-rwxr-xr-x 1 root root 16K Apr 25 21:15 main
-rw-r--r-- 1 root root 141 Apr 25 21:14 main.cpp
drwx------ 3 root root 4.0K Apr 10 18:14 snap
[root@ubuntu2204 ~]$ cat main.cpp
#include <stdio.h>
#include <unistd.h>
#include <iostream>
int main(){
while(true){
printf("hello world\n");
sleep(1);
}
return 0;
}
6.4.5.1 特殊权限SUID
- 前提:进程有属主和属组;文件有属主和属组
- 任何一个可执行程序文件能不能启动为进程,取决发起者对程序文件是否拥有执行权限
- 启动为进程之后,其进程的属主为发起者,进程的属组为发起者所属的组
- 进程访问文件时的权限,取决于进程的发起者
- 二进制的可执行文件上SUID权限功能:
- 任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限
- 启动为进程之后,其进程的属主为原程序文件的属主
- SUID只对二进制可执行程序有效
- SUID设置在目录上无意义
- SUID权限设定:
chmod u+s FILE...
chmod 4xxx FILE
chmod u-s FILE...
- 范例:
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.
- 范例:
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:::
......
6.4.5.2 特殊权限SGID
- 二进制的可执行文件上SGID权限功能:
- 任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限
- 启动为进程之后,其进程的属组为原程序文件的属组
- SGID权限设定:
chmod g+s FILE...
chmod 2xxx FILE
chmod g-s FILE...
目录上的SGID权限功能:
默认情况下,用户创建文件时,其属组为此用户所属的主组,一旦某目录被设定了SGID,则对此目录有写权限的用户在此目录中创建的文件所属的组为此目录的属组,通常用于创建一个协作目录
SGID权限设定:
chmod g+s DIR...
chmod 2xxx DIR
chmod g-s DIR...
范例:
#普通用户 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
6.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
范例:查看目录中的sticky权限
[root@ubuntu2204 /]# ll -d /dir1/
drwxrwxrwt 2 root root 4096 May 9 23:06 /dir1//
[root@ubuntu2204 /]# file /dir1/
/dir1/: sticky, directory
6.4.5.4 特殊权限数字法
字符表示 | 二进制表示 | 八进制表示 | 备注 |
---|---|---|---|
--------- | 000 | 0 | 无任何特殊权限 |
--------t | 001 | 1 | Sticky |
-----s— | 010 | 2 | SGID |
-----s–t | 011 | 3 | SGID,Sticky |
–s------ | 100 | 4 | SUID |
–s-----t | 101 | 5 | SUID,Sticky |
–s—s— | 110 | 6 | SUID,SGID |
–s–s–t | 111 | 7 | SUID,SGID,Sticky |
范例:
chmod 4777 /tmp/a.txt
- 权限位映射
- SUID: user,占据属主的执行权限位
- s:属主拥有x权限
- S:属主没有x权限
- SGID: group,占据属组的执行权限位
- s: group拥有x权限
- S:group没有x权限
- Sticky: other,占据other的执行权限位
- t:other拥有x权限
- T:other没有x权限
6.4.5.5 设定文件特殊属性
- 格式:
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 | 防止误删除,这里是指原来存储该文件的块不会被新的数据覆盖 |
显示文件特殊属性
lsattr [-RVadlpv] [files...]
范例:+i 防止误删除
[root@ubuntu2204 0508]# echo "abcd">a.txt
[root@ubuntu2204 0508]# chattr +i a.txt
[root@ubuntu2204 0508]# ll a.txt
-rw-r--r-- 1 root root 5 May 9 23:09 a.txt
[root@ubuntu2204 0508]# lsattr a.txt
----i---------e------- a.txt # i 是手动设置的, e是文件系统自带的,
#不可删除
[root@ubuntu2204 0508]# rm -rf a.txt
rm: cannot remove 'a.txt': Operation not permitted
[root@ubuntu2204 0508]# rm -rf *
rm: cannot remove 'a.txt': Operation not permitted
#不可覆盖
[root@ubuntu2204 0508]# echo "1234" > a.txt
-bash: a.txt: Operation not permitted
#不可追加
[root@ubuntu2204 0508]# echo "1234" >> a.txt
-bash: a.txt: Operation not permitted
#不可移动
[root@ubuntu2204 0508]# mv a.txt /tmp/
mv: cannot move 'a.txt' to '/tmp/a.txt': Operation not permitted
#不可移动
[root@ubuntu2204 0508]# mv a.txt b.txt
mv: cannot move 'a.txt' to 'b.txt': Operation not permitted
#可复制
[root@ubuntu2204 0508]# cp a.txt /tmp/
#可复制
[root@ubuntu2204 0508]# cp a.txt b.txt
[root@ubuntu2204 0508]# ls
a.txt b.txt
#可查看
[root@ubuntu2204 0508]# cat a.txt
abcd
范例:+a 一般用于日志文件
[root@ubuntu2204 0508]# lsattr a.txt
----i---------e------- a.txt
[root@ubuntu2204 0508]# chattr -i a.txt
[root@ubuntu2204 0508]# chattr +a a.txt
[root@ubuntu2204 0508]# ll a.txt
-rw-r--r-- 1 root root 5 May 9 23:09 a.txt
[root@ubuntu2204 0508]# lsattr a.txt
-----a--------e------- a.txt
#不可删除
[root@ubuntu2204 0508]# rm -rf a.txt
rm: cannot remove 'a.txt': Operation not permitted
[root@ubuntu2204 0508]# rm -rf *
rm: cannot remove 'a.txt': Operation not permitted
#不可覆盖
[root@ubuntu2204 0508]# echo "1234" > a.txt
-bash: a.txt: Operation not permitted
#可追加
[root@ubuntu2204 0508]# echo "1234" >> a.txt
#不可移动
[root@ubuntu2204 0508]# mv a.txt b.txt
mv: cannot move 'a.txt' to 'b.txt': Operation not permitted
#可复制
[root@ubuntu2204 0508]# cp a.txt b.txt
#可查看
[root@ubuntu2204 0508]# cat a.txt
abcd
1234
6.4.6 访问控制列表 ACL
6.4.6.1 ACL权限功能
- rwx 权限体系中,仅仅只能将用户分成三种角色,如果要对单独用户设置额外的权限,则无法完成;
- 而ACL可以单独对指定的用户设定各不相同的权限;提供颗粒度更细的权限控制;
- CentOS7 默认创建的xfs和ext4文件系统具有ACL功能
- CentOS7 之前版本,默认手工创建的ext4文件系统无ACL功能,需手动增加
tune2fs –o acl /dev/sdb1
mount –o acl /dev/sdb1 /mnt/test
- ACL生效顺序:
所有者,自定义用户,所属组,自定义组,其他人
6.4.6.2 ACL相关命令
- setfacl 可设置ACL权限
- getfacl 可查看设置的ACL权限
apt install 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一起使用 |
- 范例:
[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::rw-
group::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::rw-
user: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::rw-
user:jose:rw--
user:tom:---
group::r--
mask::rw-
other::r--
范例:给组加ACL
[root@ubuntu2204 tmp]# setfacl -m g:tom:rwx f1
[root@ubuntu2204 tmp]# getfacl f1
# file: f1
# owner: root
# group: root
user::rw-
user:mage:---
user:jerry:rw-
group::r--
group:tom:rwx
mask::rwx
other::r--
范例:从文件复制ACL
[root@ubuntu2204 tmp]# getfacl f1 f2
# file: f1
# owner: root
# group: root
user::rw-
user:mage:---
user:jerry:rw-
group::r--
group:tom:rwx
mask::rwx
other::r--
# file: f2
# owner: root
# group: root
user::rw-
group::r--
other::r--
[root@ubuntu2204 tmp]# getfacl f1 | setfacl --set-file=- f2
[root@ubuntu2204 tmp]# getfacl f1 f2
# file: f1
# owner: root
# group: root
user::rw-
user:mage:---
user:jerry:rw-
group::r--
group:tom:rwx
mask::rwx
other::r--
# file: f2
# owner: root
# group: root
user::rw-
user:mage:---
user:jerry:rw-
group::r--
group:tom:rwx
mask::rwx
other::r--
范例:移除ACL权限
[root@ubuntu2204 tmp]# setfacl -x u:mage f1
[root@ubuntu2204 tmp]# setfacl -x g:tom f1
[root@ubuntu2204 tmp]# getfacl f1
# file: f1
# owner: root
# group: root
user::rw-
user:jerry:rw-
group::r--
mask::rw-
other::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::rw-
group::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::rw-
user:mage:---
user:jerry:rw-
group::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::rw-
user:jerry:---
group::---
mask::---
other::---
- mask 权限
- mask只影响除所有者和other的之外的人和组的最大权限
- mask需要与用户的权限进行逻辑与运算后,才能变成有限的权限(Effective Permission)
- 用户或组的设置必须存在于mask权限设定范围内才会生效
- 范例:
setfacl -m mask::rx file
对于脚本程序来讲,必须先要有读权限,才能执行。