账号和权限管理

发布时间 2023-11-05 16:32:14作者: 一个低调的wy


账号和权限管理

账号管理

1. 基本概念

Linux安全模型

3A认证

Authentication:验证用户身份。认证

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

Accouting|Audition:审计

当用户登录成功后,系统会自动给用户分配令牌token,令牌包括用户标识和组成员等信息

双因子认证:当用户通过账号和密码登录时,还会验证验证码,这就是双因子认证

Linux是通过用户身份对资源访问进行控制


2. 用户

2.1 基本概念

用户账号

​ 管理员

​ 普通用户

​ 程序用户

UID

​ 用户标识号,唯一,相当于用户身份证

​ uid可以重复;我们可以创建同一个uid,两个不同的用户名,等于这一个人有两个名字大名和小名,建议不要创建重复的uid,避免出现混乱

GID

​ 组标识号,唯一


linux中都是通过User id(UID)来唯一标识用户的


超级用户 管理员

​ 超级用户,root用户是linux操作系统中的默认的超级用户账号,对本级拥有所有权限,类似与windows中的admin用户

​ 建议:当进行系统管理、维护任务时,才建议使用root用户;日常建议使用普通用户

​ uid为0


​ 问题:超级管理员是否安装用户名称来定义?

​ 不是,uid=0的用户为超级管理员


程序用户

​ 如bin、ftp、mysql,这些用户一般不允许登录到系统,仅用于维持系统或某个程序的正常运行

​ cnetos 6 1-499

​ centos 7 1-999

​ 作用:让程序以用户的方式运行,但是不给登录


普通用户

​ centos 6 500--60000(值可以调整)

​ centos 7 1000-60000(值可以调整)

​ 普通用户需要由root用户或者其他管理员用户创建,拥有的权限受到一定限制,处理问题受到限制,一般只在用户自己的目录中拥有完整权限


组账号

​ 基本组(私有组)

​ 附加组(公共组)


​ 组可以理解为小组,是多个用户的集合,统一开通或分配相同的权限

[root@localhost ~]# useradd p1
[root@localhost ~]# id p1              # 查看用户的信息
uid=1001(p1) gid=1001(p1) 组=1001(p1)
[root@localhost ~]# 

​ 当我们创建一个用户时,会生成一个和用户同名的组id,并且这个组id为基本组

​ windows中,我们创建一个用户属于user组


基本组

​ 建立账号时,若灭有指定账户所属的组时,系统会自动建立一个和用户名相同的组,这个组就是私有组(基本组),该组默认只能容纳一个用户

​ 在用户所属组的第一个组称为基本组,它在/etc/passwd文件中指定

​ 基本组:有且仅有一个

​ 默认新建用户时,自动添加同名的组


附加组(公共组)

​ 除了第一个组外的其他组为附加组或公共组,它在/etc/group文件中指定


用户与组的关系

​ 用户表示员工,组表示职位

​ 用户肯定有一个主职位,0或多个兼职位

​ 用户的主要组:用户必须属于一个且仅有一个主要组,linux中默认创建用户时,自动创建和用户名同名的组,作为该用户的主要组;由于此组中只有一个用户,又称为私有组

​ 用户的附加组:一个用户可以属于0或多个附属组,也就是附加组


who

# 查看当前登录的用户信息

[root@localhost ~]# who        # 查看当前登录的用户信息
root     pts/0        2023-10-30 09:59 (192.168.32.1)
[root@localhost ~]# 


[root@localhost ~]# whoami     # 查看当前用户
root
[root@localhost ~]#


[root@localhost ~]# who -b       # 上次系统启动时间
         系统引导 2023-10-30 08:29
[root@localhost ~]# 


[root@localhost ~]# who -d   # 显示已死的进程
[root@localhost ~]#

2.2 用户账号文件

存放用户信息的文件路径 /etc/passwd

[root@localhost ~]# tail -n 1 /etc/passwd
u1:x:1001:1001::/home/u1:/bin/bash

以":"冒号作为分隔符

u1         用户名
x          密码占位符
1001       uid
1001       gid
::         中间是空的,这位表示备注信息
/home/u1   家目录的路径
/bin/bash  默认使用的shell解释器类型

​ /sbin/nologin

​ 不能登录


​ 为什么程序不以root用户登录,而是以程序用户的方式登录呢

​ 因为你不知道该程序中是否有漏洞,root用户权限太高了,为了安全考虑,以程序用户登录


2.3 用户密码文件

​ 存放用户密码的文件路径 /etc/shadow

wy:$6$U9dDFPQ.zXNmsX.w$9uB9yn0YMRNL2NK1DJt4m32o2u/rwxGHK53l4OZSzIaGAKa7w4I8Z8Jpaca9BSM/1U8iTcNmkvuGePE5d22Fm0::0:99999:7:::
sshd:!!:19653::::::

以":"冒号作为分隔符

1.wy           用户名

2.$6$U9dDFPQ.zXNmsX.w$9uB9yn0YMRNL2NK1DJt4m32o2u/rwxGHK53l4OZSzIaGAKa7w4I8Z8Jpaca9BSM/1U8iTcNmkvuGePE5d22Fm0   # 以某种加密算法的密码,(一般用sha512)加密
centos 7     没有这种算法                  
centos 6或8  可以通过工具生成密码
*或!!        没有设置密码,密码被锁定,无法登录用户
:空:         密码为空,不需要密码,可以直接登录

3.19653       最近一次修改密码的时间,它是以1970年1月1日开始计算,这是linux诞生的第一年

使用date计算实际修改时间
date -d "1970-1-1 19653 days"

[root@localhost ~]# date -d "1970-1-1 19653 days"
2023年 10月 23日 星期一 00:00:00 CST
[root@localhost ~]# 

4.0            最小修改密码间隔时间
			  0表示没有间隔时间限制
              3表示如果现在修改密码,三天后才能再次修改密码
              
5.99999        密码有效期,99999/365=273,有效期为273年,可以认为是永久期限

6.7            密码到期提醒,7表示密码将要到期的前7天提醒你

7.             密码过期后的宽限天数,表示密码过期后还能使用多久,到期后,该账号会被锁定,无法登录

8.             账号失效时间,从1970-1--1开始算起,如果账号在该字段规定时间之外时,不论密码是否过期,都将无法使用该账号;该字段通过用于收费服务系统中;用途:当公司有项目时,创建的用户,当项目结束时,账号失效

9.             保留字段


2.4 创建用户账号 useradd

原理

​ 一般来说,使用命令修改文件内容(/etc/passwd)都是临时性的,直接修改配置文件内容是永久性的

​ 但是,我们在使用直接修改配置文件的这种方式时,容易把内容修改错,为了解决这个问题,所以系统中有些命令可以实现修改配置文件的作用,这样不容易出错

  • ​ 创建用户,本质上就是在/etc/passwd、/etc/shadow文件的末尾添加该用户的账号信息
  • ​ 创建用户时,若未指明用户的宿主目录,则在/home目录下自动创建和用户账号同名的宿主目录,还可以在该用户目录中创建各种初始配置文件
  • ​ 在创建用户时,若没有指明用户所属的组,则自动创建与该用户同名的基本组(私有组)账号,该组账号信息保存在/etc/group和/etc/shadow文件中

格式
useradd [选项] 用户名

选项
-u  指定用户的UID号,要求该UID号未被其他用户使用

-d  指定用户的宿主目录位置(与-M一起使用时,-d不生效)
-M  不创建宿主目录,即使/etc/login.defs中已设定要建立宿主目录

-s  指定用户的登录shell解释器类型,默认为/bin/bash、/sbin/nologin

-e  指定用户的账户失效时间可使用yyyy-mm-dd的日期格式

-g  指定用户的基本组名(或使用GID号)
-G  指定用户的附加组名(或使用GID号)

-r  创建系统用户(=程序用户),随机生成程序用户

-c  备注信息

用法
# 创建u1用户,指定uid为2000,备注为u1
useradd u1 -u 2000 -c u1

[root@localhost opt]# useradd u1 -u 2000 -c u1  
[root@localhost opt]# tail -n 1 /etc/passwd
u1:x:2000:2000:u1:/home/u1:/bin/bash
[root@localhost opt]# 


# 创建u2用户,u2为系统用户,备注为u2

[root@localhost opt]# useradd u2 -r -c u2
[root@localhost opt]# tail -n 2 /etc/passwd
u1:x:2000:2000:u1:/home/u1:/bin/bash
u2:x:990:985:u2:/home/u2:/bin/bash
[root@localhost opt]# 


#创建u3用户,指定宿主目录为/opt/u3-home,指定shell为/sbin/nologin,指定账号失效时间为2023-10-31

[root@localhost opt]# useradd u3 -d /opt/u3-home/ -s /sbin/nologin -e 2023-10-31
useradd:警告:此主目录已经存在。
不从 skel 目录里向其中复制任何文件。
正在创建信箱文件: 文件已存在
[root@localhost opt]# tail -n 3 /etc/passwd
u1:x:2000:2000:u1:/home/u1:/bin/bash
u2:x:990:985:u2:/home/u2:/bin/bash
u3:x:2001:2001::/opt/u3-home/:/sbin/nologin
[root@localhost opt]# 


# 创建u4用户,添加基本组为u1
useradd u4 -g u1

[root@localhost opt]# useradd u4 -g u1
[root@localhost opt]# id u4
uid=2002(u4) gid=2000(u1) 组=2000(u1)


# 创建u5用户,添加附加组u2

[root@localhost opt]# useradd u5 -G u2
[root@localhost opt]# id u5
uid=2003(u5) gid=2003(u5) 组=2003(u5),985(u2)
[root@localhost opt]# 


# 创建u6用户,设置uid为2004,设置宿主目录为/opt/u6-home,设置shell编辑器为/bin/bash,设置账号失效时间为2023-10-31,设置基本组为u3,设置附加组为u1,设置备注u6
useradd u6 -u 2004 -d /opt/u6-home -s /bin/bash -e 2023-10-31 -g u3 -G u1 -c u6

[root@localhost opt]# useradd u6 -u 2004 -d /opt/u6-home -s /bin/bash -e 2023-10-31 -g u3 -G u1 -c u6
[root@localhost opt]# tail -n 1 /etc/passwd
u6:x:2004:2001:u6:/opt/u6-home:/bin/bash
[root@localhost opt]# tail -n 1 /etc/shadow
u6:!!:19660:0:99999:7::19661:
[root@localhost opt]# id u6
uid=2004(u6) gid=2001(u3) 组=2001(u3),2000(u1)


useradd作用

  • 新建用户
  • 修改新建用户的属性

/etc/skel 家目录的模版路径 ,用户的个性化模板


2.5 设置用户密码 passwd

选项
-d          清空指定用户的密码,使得用户不需要密码即可登录系统

-l          锁定用户账号

-S(大写s)  查看用户账号状态

-u          解锁用户账号密码

用法
passwd  默认修改当前用户的密码

[root@localhost opt]# passwd   # 人机交互式,修改密码
更改用户 root 的密码 。
新的 密码:
无效的密码: 密码少于 8 个字符
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
[root@localhost opt]# 


# 免交互修改密码
echo "123" | passwd root --stdin

[root@localhost opt]# echo "123" | passwd root --stdin
更改用户 root 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@localhost opt]# 


# 清空用户密码,使得该用户可以不需要密码登录系统(免密登录),一般不建议这么做,不安全

[root@localhost opt]# passwd wy -d   # 清空密码
清除用户的密码 wy。
passwd: 操作成功
[root@localhost opt]# su wy         # 免密登录
[wy@localhost opt]$ 
[root@localhost opt]# tail -n 10 /etc/shadow
wy::19660:0:99999:7:::             # wy::19660 密码为空,免密登                                      录


# 锁定、查看、解锁用户账号状态
[root@localhost opt]# passwd wy -l   # passwd -l 锁定用户
锁定用户 wy 的密码 。
passwd: 操作成功
[root@localhost opt]# passwd wy -S
wy LK 2023-10-30 0 99999 7 -1 (密码已被锁定。)
[root@localhost opt]# passwd -u wy
解锁用户 wy 的密码。
passwd: 操作成功
[root@localhost opt]# passwd -S wy
wy PS 2023-10-30 0 99999 7 -1 (密码已设置,使用 SHA512 算法。)
[root@localhost opt]# 


[root@localhost opt]# passwd u1 -u
解锁用户 u1 的密码。
passwd: 警告:未锁定的密码将是空的。
passwd: 不安全的操作(使用 -f 参数强制进行该操作)

[root@localhost opt]# passwd u1 -uf    # -f  强制
解锁用户 u1 的密码。
passwd: 操作成功
[root@localhost opt]# 


2.6 修改已有用户的密码信息 chage

用法
chage  u1   # 人机交互式更改用户属性,可以更改多个属性

# 修改用户的单个属性
chage u1 -m 3

u1::19660:0:99999:7:::
[root@localhost opt]# chage u1 -m 3 
u1::19660:3:99999:7:::


2.7 修改用户账号已有属性 usermod

选项
-u  修改uid
-d  修改宿主目录
-e  修改账号失效时间
-s  修改shell
-g  修改基本组
-G  修改附加组
-l  修改用户名
-L  修改用户状态为锁定
-U  修改用户状态为解锁

用法
# 修改uid
[root@localhost opt]# usermod u1 -u 2006
u1:x:2006:2000:u1:/home/u1:/sbin/nologin


# 修改已有用户的用户名
usermod -l 新用户名 旧用户名

[root@localhost opt]# usermod -l u1-1 u1
[root@localhost opt]# tail -n 6 /etc/passwd
u1-1:x:2006:2000:u1:/home/u1:/sbin/nologin


2.8 删除用户账号 userdel

选项
-r  连家目录一块删除

用法
# 删除用户,-r连其家目录一起删除

[root@localhost home]# ls
p1  u1  u4  u5  wy  wy11  wy22
[root@localhost home]# userdel u5 -r
[root@localhost home]# ls
p1  u1  u4  wy  wy11  wy22
[root@localhost home]# 


3. 用户账号的初始配置文件

下面三个文件从/etc/skel复制而来


开机启动运行

.bashrc(当前用户生效,局部生效)

.bashprofile(当前用户生效,局部生效)

/etc/profile(全部用户生效,全局生效)


关机运行

.bash_logout



4. 组

4.1 组账号文件

/etc/group 保存组账号基本信息

/etc/gshadow 保存组账号的密码


[root@localhost home]# tail /etc/group
u1:x:2000:u6

u1     组账号名
x      密码占位符
2000   gid,组id
u6     组成员,可以有多个,这是附加组的成员

4.2 添加组账号 groupadd

格式

groupadd [-g --gid] 组账号名

用法

# groupadd -g 添加组账号

[root@localhost home]# groupadd -g 1001 market
market:x:1001:


[root@localhost home]# groupadd --gid 1002 store
store:x:1002:


4.3 添加/删除组成员 gpasswd

格式
gpasswd [选项] 用户名 组账号名

选项
-a(add)      添加一个用户成员
-d(delete)   删除一个用户成员
-M            定义组成员列表,以逗号分割,批量添加成员

用法
# 添加一个组成员

[root@localhost home]# gpasswd -a u4 u1
正在将用户“u4”加入到“u1”组中
u1:x:2000:u6,u4


# 删除一个组成员

[root@localhost home]# gpasswd -d u4 u1
正在将用户“u4”从“u1”组中删除
u1:x:2000:u6


# 批量添加组成员
gpasswd -M u4,u3 u1

[root@localhost home]# gpasswd -M u4,u3,u2 u1
[root@localhost home]# tail /etc/group
u1:x:2000:u4,u3,u2


4.4 删除组账号 groupdel

格式
groupdel 组账号名

用法
# 删除组

[root@localhost home]# groupdel market


4.5 查询账号信息

4.5.1 查询用户所属的组 groups

格式

groups [用户名]

用法

[root@localhost home]# groups      # 查看当前用户所属的组
root


[root@localhost home]# groups u2  # 查看u2用户所属的组
u2 : u2 u1


4.5.2 查询用户身份标识 id

格式

id [用户名]

用法

[root@localhost home]# id            # 查看当前用户的标识信息
uid=0(root) gid=0(root) 组=0(root)

[root@localhost home]# id u2         # 查看u2的标识信息
uid=990(u2) gid=985(u2) 组=985(u2),2000(u1)


4.6 查询账号信息

4.6.1 finger

作用

查询用户账号的详细信息,但是需要安装


格式

finger [用户名]

用法

[root@localhost yum.repos.d]# finger # 查看当前用户账号的详细信息
Login     Name       Tty      Idle  Login Time   Office     Office Phone   Host
root      root       pts/1          Oct 30 22:42                           (192.168.32.1)
[root@localhost /]# 


[root@localhost yum.repos.d]# finger u2  # 查看u2账号的详细信息
Login: u2             			Name: u2
Directory: /home/u2             Shell: /bin/bash
Never logged in.
No mail.
No Plan.
[root@localhost /]# 


4.6.2 w
[root@localhost yum.repos.d]# w   # 查看已登录到主机的用户的信息
 22:59:30 up 12:49,  2 users,  load average: 0.05, 0.06, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    192.168.32.1     22:57    1:36   0.08s  0.08s -bash
root     pts/1    192.168.32.1     22:42    2.00s  0.20s  0.00s w
[root@localhost /]# 



4.6.3 who
[root@localhost /]# who         # 查询已登录到主机的用户信息
root     pts/0        2023-10-30 22:57 (192.168.32.1)
root     pts/1        2023-10-30 22:42 (192.168.32.1)
[root@localhost /]# 



4.6.4 users

用法

[root@localhost /]# users    # 查询已登录到主机的用户信息
root root                    # 查看当前一共登录了几个用户
[root@localhost /]#          # 相当于打开了几个终端


4.6.5 whoami

用法

[root@localhost /]# whoami     # 查看当前用户是谁
root
[root@localhost /]# 



权限管理

1. 基本概念

文件或目录的访问权限

读 read r 文件:允许查看文件内容

​ 目录:显示目录列表

写 write w 文件:允许修改文件内容

​ 目录:允许在目录中新建、移动、删除文件或子目录

执行 exe x 文件:允许运行程序,一般对于可执行程序而言,一般是绿色的

​ 目录:允许切换目录


一个文件的权限需要区别三类人

1 文件的所有者 属主 用户账号

2 文件的所在组 属组 组账号

3 其他人 other 其他用户


rwx rwx rwx

属组 属组 其他


"-" 表示没有权限

rwx rw-x r--

这个是象征性表示,不代表你没有真正的权限,看实际情况

root用户最大,即使什么权限都没有,还是可以正常操作


-rw-r--r--. 1 root root 2.1K 10月 26 23:11 passwd

-                表示普通文件
rw-              文件所有者拥有读写权限
r--              文件所在组拥有读权限
r--              其他用户拥有读权限
1                该文件只有1个硬连接
root             文件所有者
root             文件所在组
2.1K             文件大小
10月 26 23:11    文件最后一次修改时间
passwd           文件名

真 1

假 0

r w x

0 0 1 1

0 1 0 2

1 0 0 4

0 1 1 3

1 0 1 5

1 1 1 7


目录的执行权限

x是目录的最小权限,目录必须有x,就算目录有其他权限,没有x权限,也无法进行操作


一个普通文件可以被删除,和这个文件本身权限有关么?

这个文件可不可以删除,只和存放该文件的目录有关


2. 更改文件或目录的权限 chmod

格式

chmod [选项] 值 文件或目录名

选项

-R  递归修改指定目录下所有子文件的权限

[ugoa]

a all

u user

g group

o other


777


[+-=]


用法

#修改文件的权限为777

[root@localhost test]# chmod 777 11     
[root@localhost test]# ll
-rwxrwxrwx  1 root root 10485760 10月 29 21:51 11



# 修改文件的权限为000

[root@localhost test]# chmod 000 11
[root@localhost test]# ll
总用量 20496
----------  1 root root 10485760 10月 29 21:51 11






chmod  a=x  test

chmod a+rwx test



面试题

执行 cp /etc/issue  /data/dir/ 所需要的最小权限是什么?
cp  x

etc  x
issue  r

data  x
dir  wx

3. 更改文件的归属chown

作用

改变文件的属主和属组,改变文件权限


选项

-R  递归修改指定目录下所有子文件的归属(属主和属组)

用法

# 更改11的归属为u2,u2.u2

[root@localhost test]# chown u2.u2 11
[root@localhost test]# ll
----------  1 u2   u2   10485760 10月 29 21:51 11



# u2:u2

[root@localhost test]# chown u2:u2 a
[root@localhost test]# ll
-rw-r--r--  1 u2   u2          2 10月 30 08:30 a



chown .lisi test

chown lisi test


4. mask

作用

决定了文件初始权限


文件最大权限 666

文件夹最大权限 777

文件权限是偶数,文件默认没有执行权限


用法

# 查看当前反掩码
[root@localhost test]# umask
0022
[root@localhost test]# 


# 修改当前的反掩码
[root@localhost test]# umask 013
[root@localhost test]# umask
0013
[root@localhost test]# 


umask 当前反掩码 0022

第一个0 三种特殊权限


5. 三种特殊权限

5.1 suid 属主

passwd 多了一个s权限

任何人使用这个命令的时候,当做这个命令的属主,我是这个文件的拥有者


chmod u+s /usr/bin/vim    # 给vim添加s权限,表示我是vim的属主,vim执行任何文件,我就是任何文件的拥有者

chmod u-s /usr/bin/vim   # 给vim删除s权限

sgid 属组

chmod g+s /usr/bin/vim    # 给vim添加s权限,表示我是vim的属组,vim执行任何文件,我就是任何文件的属组

chmod g-s /usr/bin/vim    # 给vim删除s权限

5.2 guid


5.3 sticky 粘贴位

只能对文件夹使用

当给目录设置 sticky位,只有文件 的所有者或root用户可以删除该文件


面试题

/tmp权限中多了一个t权限

除了文件所有者、超级管理员外,其他人不能删除文件


/tmp

tmp文件夹的作用是存放所有用户的临时文件夹

chmod o+t /opt/aa

chmod o-t /opt/aa


6. 访问控制列表 ACL

选项

-m  更改文件的访问控制列表
-x  删除指定用户的访问控制列表
-b  直接清空acl访问控制列表

用法

# 给 lisi 添加读写权限
setfacl  -m  u:lisi:rw  passwd

u        用户
lisi     指定用户名
rw       权限
passwd   文件名

# 查看文件的访问控制列表
getfacl  passwd   

# 删除acl规则
setfacl -x  u:zhangsan  passwd


# 清空acl访问控制列表
setfacl -b passwd


总结

系统用户的类型

1 普通用户

2 管理员

3 程序用户


uid范围

centos 6

普通用户 500-60000

系统用户 1-499


centos 7

普通用户 1000-60000

系统用户 1-999


基本组 有且唯一

附加组 可有可无,可有多个


/etc/passwd 用户信息

/etc/shadow 密码信息


useradd

-s

/bin/bash

/sbin/nologin

-u

-M

-d

-e

-g

-G

-r


passwd

-d

-l

-S

-u


usermod

-l

-L

-U


groupadd


gpasswd

-a

-d

-M


finger

w

users

who

id


chmod

rwx

-R


chown

-R


umask


三种特殊权限

访问acl控制表