# 学习运维第四天:用户和权限管理

用户和权限管理

Linux安全模型

资源分派:

  • Authentication:认证,验证用户身份

  • Authorization:授权,不同的用户设置不同权限

  • Accouting:审计,事后行为

在Linux系统中,当用户登录成功时,系统会自动分配令牌 token,包括:用户标识和组成员等信息。

#用于审计的登录日志

#rocky8.6
[root@rocky8 ~]# cat /var/log/secure

#ubuntu
[root@ubuntu2204 ~]# tail /var/log/auth.log
用户

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(CentOS 6及以前)1-999(CentOS 7及以后)给后台程序使用,如nginx,mysql等
普通用户-登录用户自定义500+(CentOS6及以前),1000+(CentOS7及 以后)给用户进行交互式登录

用户和组的关系
  • 一个用户至少有一个组,也可以有多个组;

  • 一个组至少有0个用户,也可以有多个用户;

  • 用户的主要组(primary group):又称私有组,一个用户必须属于且只有一个主组,创建用户时, 默认会创建与其同名的组作为主组;

  • 用户的附加组(supplementary group):又称辅助组,一个用户可以属于0个或多个附加组;

  • 使用组,可以对用户进行批量管理,比如对一个组授权,则该组下所有的用户能能继承这个组的权限;

#示例

[root@ubuntu2204 ~]# id jose
uid=1001(jose) gid=1001(jose) groups=1001(jose)
安全上下文
Linux安全上下文Context:

在Linux系统中,运行中的程序(即进程process),都是以进程发起者的身份运行;

进程所能够访问的资源权限取决于进程的运行者的身份;

首先,什么是程序

一个程序或一个命令,本质上也是一个可执行的二进制文件或一个可执行的脚本文件;

在服务器上有很多文件,只有那些特定的,可以被执行的二进制文件,才能被称为程序;

其次,什么是进程

运行中的程序,就是进程;

第三,程序,进程,用户之间的关系是怎样的

只有可以被执行的文件,才能叫作程序;

对于同一个程序,也不是所有用户都可以运行的,这要取决于当前用户对该程序有没有可执行权限;

用户张三,运行了某个程序,那么,张三就发起了一个进程,该进程的发起者,就是张三,该进程是以 张三的身份在运行;

打个比方,在交通工具中,只有能在天上飞的,才能叫作飞机;

对于同一架飞机,也不是所有人都能上去的,这要取决于有没有买机票,有没有登机牌;

第四,进程的访问资源

一个进程能不能访问某些资源,是由进程发起者决定的(跟进程本身的程序文件无关),比如某进程要 读写某个文件,则要看该进程发起者有没有权限读取该文件;

一个旅客能不能坐头等舱,是由旅客自己决定的,跟飞机本身无关;

用户和组的配置文件

用户和组的主要配置文件
  • /etc/passwd:用户及其属性信息(名称、UID、主组ID等)

  • /etc/shadow:用户密码及其相关属性

  • /etc/group:组及其属性信息

  • /etc/gshadow:组密码及其相关属性

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
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      #保留字段,无意义


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

group文件格式
man group

#文件格式
#group_name:password:GID:user_list

ftp:x:50:
mage:x:1002:

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

#文件格式
#group name:encrypted password:administrators:members

ftp:::
mage:!::

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

可以直接用编辑工具来修改上述文件,但由于跟用户和权限有关的文件具有敏感性,所以系统提供了专 用的工具来修改这几个文件。

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 [,...]
#根据用户名查看配置项
用户和组管理命令

用户管理命令

  • useradd

  • usermod

  • userdel

组帐号维护命令

  • groupadd

  • groupmod

  • groupdel

用户创建

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

# 示例

#创建用户前先建组,可以确保组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 命令默认值设定由/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
用户属性修改

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:::
[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

解锁用户

[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 文件,将密码栏置空产生空密码用户
删除用户

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
查看用户相关的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
切换用户或以其他用户身份执行命令

如果在当前登录终端中,要执行某条命令,但当前登录用户又没有可执行权限或没有某些资源权限;

则在此种情况下,我们可以:

  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子进程,环境可能会混乱。

设置密码

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

#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:
修改用户密码策略

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:
创建组

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@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
修改组

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:
组删除

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的主组也给删了,前提是该组下没有其它用户

useradd user123

user user123 -------------del user123 顺便把 group user123 删除

group user123 ----------如果组里面有用户将该组作为主组,则删不掉

更改组成员和密码

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
更改和查看组成员

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

文件权限管理

Linux中的权限体系介绍

在Linux系统中,一切皆文件;

对文件来讲,系统中的用户,分属于三类不同的角色,分别是属主,属组,其它用户;

而每个角色用户,对该文件的权限,也分三种,分别是读,写,执行;

三种角色:

角色英文表示字符表示
属主:所有者owner|OWENER|useru
属组:属于那个组group|GROUPg
其他用户:不是所有者,也不在属组中的用户other| OTHERo

三种权限:

权限英文表示符号表示八进制表示
读权限read|Readabler4
写权限write|Writablew2
执行权限execute|eXecutablex1

程序访问文件时的权限,取决于此程序的发起者

  • 进程的发起者,同文件的属主:则应用文件属主权限

  • 进程的发起者,属于文件属组;则应用文件属组权限

  • 应用文件“其它”权限

文件所有者和属组属性操作
设置文件的所有者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                    #不更改符号链接指向的目录
设置文件的属组信息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                    #不更改符号链接指向的目录
文件权限
文件权限说明
角色定义
角色在命令中的字符备注
owneru属主
groupg属组
othero其他用户
alla所有人,包括属主属组和其他用户
赋值写法
在命令中的字符备注
+增加某些权限
-删除某些权限
=只保留某些权限,覆盖写法
权限表示方法
权限在命令中的字符八进制数字表示备注
Readabler4读权限
Writablew2写权限
eXcutablex1执行权限

常用写法

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

注意

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

  • r和w权限对root 用户无效,对没有读写权限的文件,root用户也可读可写

  • 只要所有者,所属组或other三者之一有x权限,root就可以执行

权限作用
权限对文件对目录
r可查看文件内容可读取目录中的文件名,但文件元数据无法查看
w可修改文件内容可在目录中创建文件和删除文件
x可执行,发起为一个进程可进入目录,可查看文件元数据,可查看文件内容,属于目录最小权限

修改文件权限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]# chmod o+rwx -R dir1/
#大写X,只会给子目录加x权限
[root@ubuntu2204 0509]# chmod o+X -R dir1/
新建文件和目录的默认权限

在linux 系统中,新建文件或目录,都有一个默认权限;

umask 值间接影响新建文件和新建目录的权限:

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

  • 新建目录:777-umask;

umask [-p] [-S] [mode]
#显示或设定文件模式掩码。

-p    #如果省略 MODE 模式,以可重用为输入的格式输入
-S    #以字符显示

#非特权用户 umask 默认是 002
#root 的 umask 默认是 022

#持久保存umask
#全局设置: /etc/bashrc , /etc/bash.bashrc(ubuntu)
#用户设置:~/.bashrc
Linux文件系统上的特殊权限

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

特殊权限

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

  • SGID:作用于二进制可执行文件上,用户将继承此程序所有组的权限; 作用于目录上,此目录中新建的文件的所属组将自动从此目 录继承;

  • STICKY:作用于目录上,此目录中的文件只能由所有者自已来删除;

权限字符表示八进制表示备注
SUIDs4如果原属主没有可执行权限,在加SUID权限,则显示为S
SGIDs2如果原属组没有可执行权限,再加SUID权限,则表示为S
STICKYt1如果other没有可执行权限,再加STICKY权限,则表示为T

特殊权限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:::
......
特殊权限SGID

二进制的可执行文件上SGID权限功能:

  • 任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限

  • 启动为进程之后,其进程的属组为原程序文件的属组

SGID权限设定:

chmod g+s FILE... 
chmod 2xxx FILE
chmod g-s FILE...

目录上的SGID权限功能:

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

特殊权限 Sticky 位

具有写权限的目录通常用户可以删除该目录中的任何文件,无论该文件的权限或拥有权

在目录设置Sticky 位,只有文件的所有者或 root 可以删除该文件

sticky 设置在文件上无意义

Sticky权限设定:

chmod o+t DIR...
chmod 1xxx DIR
chmod o-t DIR...
特殊权限数字法
字符表示二进制表示八进制表示备注
---------0000无任何特殊权限
--------t0011Sticky
-----s---0102SGID
-----s--t0113SGID,Sticky
--s------1004SUID
--s-----t1015SUID,Sticky
--s---s---1106SUID,SGID
--s--s--t1117SUID,SGID,Sticky

权限位映射

SUID: user,占据属主的执行权限位

s:属主拥有x权限

S:属主没有x权限

SGID: group,占据属组的执行权限位

s: group拥有x权限

S:group没有x权限

Sticky: other,占据other的执行权限位

t:other拥有x权限

T:other没有x权限

设定文件特殊属性

格式:

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 一般用于日志文件:
#不可删除
#不可覆盖
####可追加
#不可移动
#可复制
#可查看
访问控制列表 ACL
ACL权限功能

rwx权限体系中,仅仅只能将用户分成三种角色,如果要对单独用户设置额外的权限,则无法完成;

而ACL可以单独对指定的用户设定各不相同的权限;提供颗粒度更细的权限控制;

CentOS7 默认创建的xfs和ext4文件系统具有ACL功能

CentOS7 之前版本,默认手工创建的ext4文件系统无ACL功能,需手动增加

ACL生效顺序:

所有者,自定义用户,所属组,自定义组,其他人

ACL相关命令

setfacl 可设置ACL权限

getfacl 可查看设置的ACL权限

格式:

#### 访问控制列表 ACL

##### ACL权限功能

rwx权限体系中,仅仅只能将用户分成三种角色,如果要对单独用户设置额外的权限,则无法完成; 

而ACL可以单独对指定的用户设定各不相同的权限;提供颗粒度更细的权限控制; 

CentOS7 默认创建的xfs和ext4文件系统具有ACL功能 

CentOS7 之前版本,默认手工创建的ext4文件系统无ACL功能,需手动增加

##### ACL生效顺序:

所有者,自定义用户,所属组,自定义组,其他人



##### ACL相关命令

setfacl 可设置ACL权限

getfacl 可查看设置的ACL权限

格式:
mask 权限
  • mask只影响除所有者和other的之外的人和组的最大权限

  • mask需要与用户的权限进行逻辑与运算后,才能变成有限的权限(Effective Permission)

  • 用户或组的设置必须存在于mask权限设定范围内才会生效

对于脚本程序来讲,必须先要有读权限,才能执行。

  • 16
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值