账户和权限管理

发布时间 2023-07-26 18:32:09作者: Bacolate
账户和权限管理
管理用户账户和组账号

系统会要求新建一个用户去登陆,为了安全性,不会让我们直接使用超级管理员身份。

Linux安全模型
登录某个平台需要三A认证:

Authentication:认证,验证用户身份,好比通过用户名与密码确认;

Authorzation:授权,不同的用户设置不同权限;

Accouting|Audition:审计,查看操作以便追责。

1、户账号和组账号概述
1.1 用户账户类型
Linux安全上下文。能否打开文件最重要的是权限

Linux基于用户身份对资源访问进行控制,能否使用与身份有关.Linux中每个用户是通过 User Id (UID)来唯一标识的,新建用户 1-60000 自动分配0-65535个端口号。

用户账号:

超级用户:root, 0

程序用户(不能登录系统,仅给程序使用):1-499 (CentOS 6以前), 1-999 (CentOS 7以后)

普通用户:500+ (CentOS6以前), 1000+(CentOS7以后)不指定 顺序,给用户进行交互式登录使用

linux规定程序用户无法登录,故而更安全。

 #1、查看当前登录用户信息 
 who命令: 
 [root@localhost ~]# whoami
 root
 [root@localhost ~]# who
 root     pts/0        2021-08-17 14:16 (192.168.91.1)
 root     pts/1        2021-08-17 14:30 (192.168.91.1)
 [root@localhost ~]# who -b
          系统引导 2021-08-17 14:15
 ​
 补充:
 #2、last命令 
 选项: 
 (1)-x:显示系统开关机以及执行等级信息 
 (2)-a:将登陆ip显示在最后一行 
 (3)-f :读取特定文件,可以选择 -f /var/log/btmp文件 
 (4)-d:将IP地址转换为主机名 
 (5)-n:设置列出名单的显示列数 
 (6)-t:查看指定时间的用户登录历史 
 ​
 3、lastlog 查看所有用户的最近一次登录
 ​
 #-u 查看指定用户
 [root@localhost ~]# lastlog -u root
 用户名           端口     来自             最后登陆时间
 root             pts/1    192.168.91.1     二 8月 17 14:30:01 +0800 2021
 ​
 ​
 #-t 表示几天之内的
 [root@localhost ~]# lastlog -t 1
 用户名           端口     来自             最后登陆时间
 root             pts/1    192.168.91.1     二 8月 17 14:30:01 +0800 2021
 gdm              :0                        二 8月 17 14:15:56 +0800 2021
 zhangsan         :0                        二 8月 17 16:25:37 +0800 2021
View Code

 

组账号:一类人拥有相同权限

  • 基本组(私有组)——人手必有且仅仅有一个

  • 附加组(公共组)——可有可无,无上限

UID和GID:唯一的,系统判断权限依靠UID

  • UID(用户标识号)

  • GID(组标识号)

linux自动分配UID(1-60000)

超级用户:0;程序用户1-999(centos7之后)

linux中超级管理员组是wheel,而不是root组。

1.2用户账户管理

1.2.1文件位置

/etc/passwd

保存用户称、宿主目录(目录)、登录shell等基本信息(不存密码)

shell:连接交互工具

 [riit@hostname ~]#cat /etc/passwd
 #每一行对应一个用户的账户信息
 root    :x       :0     :0    :root :/root :/bin/bash
 用户名:密码占位符:用户UID:用户组ID:备注:家目录:shell类型
/etc/shadow 存放保存密码

 /etc/shadow#保存密码
 密码信息
 第一字段:用户名
 第二字段:密码,密码为8或!代表无法登录,为空则表示可以无密登录
 第三字段:上次修改密码时间,最近一次修改密码的时间
 第四字段:最小修改密码间隔时间
 第五字段:密码有效期
 第六字段:密码到期提醒
 第七字段:密码过期后的宽限天数
 第八字段:账户失效时间
 第九字段:保留字段收费内容
View Code

 

1.2.2添加用户账号useradd

useradd命令

基本格式

useradd [选项] 用户名

添加用户:查看是否在 passwd和shadow文件中生成信息

  • 在/etc/passwd 文件和/etc/shadow 文件的末尾增加该用户账号的记录

  • 若未明确指定用户的宿主目录,则在/home 目录下自动创建与该用户账号同名的宿 主目录,并在该目录中建立用户的各种初始配置文件。

  • 若没有明确指定用户所属的组,则自动创建与该用户账号同名的基本组账号,组账 号的记录信息将保存到/etc/group 和/etc/shadow 文件中。

 [root@test1 ~]# useradd lisi
 [root@test1 ~]# id lisi
 uid=1004(lisi) gid=1004(lisi) 组=1004(lisi),1005(kgc)
 [root@test1 ~]# cat /etc/passwd |grep lisi
 lisi:x:1004:1004::/home/lisi:/bin/bash
 [root@test1 ~]# tail -1 /etc/passwd
 lisi:x:1004:1004::/home/lisi:/bin/bash
 [root@test1 ~]# tail -1 /etc/shadow
 lisi:$6$wbBIX3M/$QCPLfO0hs6gd0IyOHfblrwi2b319fCJFLHP2SG/QTgyjNTKON01S1qsUpNnjdeeS9Vd0cBFareY9mUh/87brz0:18809:0:99999:7:::
View Code

 

选项

选项功能
-u 指定用户的 UID 号,要求该 UID 号码未被其他用户使用
-d 指定用户的宿主目录位置(当与-M 一起使用时,不生效)
-e 指定用户的账户失效时间,可使用 YYYY-MM-DD 的日期格式
-g 指定用户的基本组名(或使用 GID 号)
-G 指定用户的附加组名(或使用 GID 号)
-M 不建立宿主目录,即使/etc/login.defs 系统配置中已设定要建立宿主目录
-s 指定用户的登录 Shell /sbin/nologin

wheel——超级管理员组

root——普通组

 [root@test1 ~]# useradd -u 1100 -d /ky18 -g root -G wheel  zhou
 [root@test1 ~]# id zhou
 uid=1100(zhou) gid=1100(zhou) 组=1100(zhou)
View Code
1.2.3 密码管理passwd

passwd命令

为用户账号设置密码

passwd [选项]... 用户名

基本用法:不加选项可以添加密码;只有超管可以改所有人;

不指定用户名时,默认修改当前账号密码。

 [root@test1 /]# passwd lisi    修改lisi 用户密码输入两次密码
 更改用户 lisi 的密码 。
 新的 密码:
 无效的密码: 密码少于 8 个字符
 重新输入新的 密码:
 passwd:所有的身份验证令牌已经成功更新。
View Code
选项功能
-d 清空指定用户的密码,仅使用用户名即可登录系统
-l 锁定用户账户
-S 查看用户账户的状态(是否被锁定)
-u 解锁用户账户
 [
root@test1 /]# passwd -l lisi##锁定lisi无法登录,密码隐藏
 [root@test1 /]# tail -1 /etc/shadow
 lisi:!!:18809:0:99999:7:::
 [root@test1 /]# passwd -d lisi##李四账号直接无密码登录(不安全)
 清除用户的密码 lisi。
 passwd: 操作成功
 [root@test1 /]# passwd -S lisi
 lisi NP 2021-07-01 0 99999 7 -1 (密码为空。)
 [root@test1 /]# passwd -u lisi
 解锁用户 lisi 的密码。
 passwd: 警告:未锁定的密码将是空的。
 passwd: 不安全的操作(使用 -f 参数强制进行该操作)
 [root@test1 /]# passwd -fu lisi
 解锁用户 lisi 的密码。
 passwd: 操作成功
 [root@test1 dnf]# echo "123123"|passwd --stdin lisi  
 #免于交互
 更改用户 lisi 的密码 。
 passwd:所有的身份验证令牌已经成功更新。
View Code
1.2.4修改用户账号的属性usermod

usermod命令

usermod [选项]... 用户名

常见选项

选项功能
-l 更改用户账号的登录名称(Login Name)
-L 锁定用户账户
-u 修改用户的 UID 号
-U 解锁锁用户账户
-d 修改用户的宿主目录位置
-e 修改用户的账户失效时间,可使用 YYYY-MM-DD 的日期格式
-g 修改用户的基本组名(或使用 GID 号)
-G 修改用户的附加组名(或使用 GID 号)
-s 指定用户的登录 Shell
 
[root@test1 home]# echo "123123" | passwd --stdin zhou   //无交互修改
 更改用户 zhou 的密码 。
 passwd:所有的身份验证令牌已经成功更新。
 [root@test1 home]# usermod -L zhou       //锁定用户
 [root@test1 home]# passwd -S zhou        //查看状态
 zhou LK 2021-07-02 0 99999 7 -1 (密码已被锁定。)
 [root@test1 home]# usermod -U zhou   //解锁   
 [root@test1 home]# passwd -S zhou   //查看状态
 zhou1 PS 2021-07-02 0 99999 7 -1 (密码已设置,使用 SHA512 算法。)
 ​
 [root@test1 home]# usermod -l zhou1 zhou  //修改用户名
 [root@test1 home]# id zhou                //验证查看
 id: zhou: no such user
 [root@test1 home]# id zhou1
 uid=1002(zhou1) gid=10(wheel) 组=10(wheel),0(root)
 ​
 [root@test1 ~]# cd /home/
 [root@test1 home]# ls
 lisi  zhangsan  zhou
 [root@test1 home]# mv zhou/ /
 [root@test1 home]# ls
 lisi  zhangsan
 [root@test1 home]# usermod -d /zhou zhou
 使用前要先手动更改目录,-d只是更新信息
 ​
 [root@localhost ~]# python -c 'import crypt,getpass;pw="kgc";print(crypt.crypt(pw))'
 $6$tMsAHcauo3zx.QJb$YfGDclLx0q77DSbwU0zCUoH9GeoufE1aZRhb/E3iqIw4yKofIwPByLvJRMEG4urLWQpHQWLs4k8tW7LkH6B3P0
 #生成随机密码
 [root@localhost ~]#cat /dev/urandom | tr -dc '[:alnum:]'|head -c12
View Code

 

 

1.2.5 删除用户userdel

userdel [选项] 用户

  • -r 将宿主目录一起删除

     
    [root@test1 etc]# userdel -r zhou1    //连宿主目录一起删除
     [root@test1 etc]# id zhou1            //验证
     id: zhou1: no such user
     [root@test1 etc]# cd /home/
     [root@test1 home]# ls
     lisi  zhangsan
    View Code

     

1.2.6用户账号的初始配置文件

文件来源:

新建用户账户时,从/etc/skel目录中复制而来

cat /etc/default/useradd

/etc/skel下文件就是:

  • ~/ .bash_profile;

  • ~/.bashrc;

  • ~/.bash_logout,这三个

用户宿主目录下的初始配置文件只对当前用户有效

1、~/ .bash_profile

#此文件中的命令将在该用户每次登录时被执行,他会设置一些环境变量,并且会调用该用户的~/.bashrc文件

2、~/.bashrc

#此文件中的命令将在该用户每次打开新的bash shell时(包括登录系统)被执行(登录 切换 新的bash环境)

3、~/.bash_logout

#此文件中的命令将在该用户每次退出时bash shell时使用

1.3组管理

1.3.1组账号文件

与用户帐号文件相类似 /etc/group:保存组帐号基本信息 /etc/gshadow:保存组帐号的密码信息基本不使用

 
[root@test1 /]# grep "adm" /etc/group   //过滤/etc/group文件下的adm文件
 adm:x:4:
View Code

 

1.3.2添加组groupadd

groupadd命令

groupadd [-g GID] 组账号名

 
[root@test1 /]# groupadd zhou           //添加组账号
 [root@test1 /]# tail -1 /etc/group
 zhou:x:1002:
 [root@test1 /]# groupadd -g 88 zhou    //-g指定组id
 [root@test1 /]# tail -1 /etc/group
 zhou:x:88:
View Code

 

1.3.3组内管理gpasswd

gpasswd 命令——添加、设置、删除组成员;也可以用usermod删除组成员

选项功能
-a 向组内添加一个用户
-d 从组内删除一个用户成员
-M 定义组成员列表,以逗号分隔;批量加成员

格式:gpasswd -a 用户

[root@test1 /]# useradd zhou1             //组内加入新成员
[root@test1 /]# gpasswd -a zhou1 zhou
正在将用户“zhou1”加入到“zhou”组中 用户在前,组在后
[root@test1 /]# gpasswd -d zhou1 zhou
正在将用户“zhou1”从“zhou”组中删除
[root@test1 /]# gpasswd -M zhou1,zhou zhou
[root@test1 /]# grep "^zhou" /etc/group
zhou:x:88:zhou1,zhou
View Code

 

1.3.4删除组账号groupdel

groupdel 组帐号名

[root@test1 /]# groupdel zhou
 [root@test1 /]#
1.3.5查询finger w who user
  • 查询用户所属组:group 用户名

  • 查询用户身份标识:id 用户名

  • finger命令查询用户帐号的详细信息(finger [用户名])

 [root@test1 Packages]# finger zhangsan
 Login: zhangsan                 Name: zhangsan
 Directory: /home/zhangsan               Shell: /bin/bash
 Last login 五 7月  2 09:17 (CST) on pts/0
 No mail.
 No Plan.
  • w

查询已登录到主机的用户信息(详细)

 [root@localhost ~]# w [选项] [用户名]
 -h 不显示输出信息的标题
 -l 用长格式输出
 -s 用短格式输出,不显示登陆时间,JCPU 和 PCPU 时间
 -V 显示版本信息
[root@test1 Packages]# w
  11:20:58 up  2:05,  1 user,  load average: 0.00, 0.01, 0.05
 USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
 root     pts/0    192.168.100.99   09:16    2.00s  0.74s  0.02s w

上面的输出信息中,第一行其实和 top 命令的第一行非常类似,主要显示了当前的系统时间、系统从启动至今已运行的时间、登陆到系统中的用户数和系统平均负载。平均负载(load average)指的是在 1 分钟、5 分钟、15 分钟内系统的负载状况

从第二行开始,显示的是当前所有登陆系统的用户信息,第二行是用户信息的各列标题,从第三行开始每行代表一个用户。这些标题的含义如表 所示

标题含义
USER 登录到系统的用户。
TTY 登录终端。
FROM 表示用户从哪里登陆进来,一般显示远程登陆主机的 IP 地址或者主机名。
LOGIN@ 用户登陆的日期和时间。
IDLE 表示某个程序上次从终端开始执行到现在所持续的时间。
JCPU 和该终端连接的所有进程占用的 CPU 运算时间。这个时间里并不包括过去的后台作业时间,但是包括当前正在运行的后台作业所占用的时间。
PCPU 当前进程所占用的 CPU 运算时间。
WHAT 当前用户正在执行的进程名称和选项,换句话说,就是表示用户当前执行的是什么命令。
  • who

    相比较 w 命令,who 命令只能显示当前登陆的用户信息,但无法知晓每个用户正在执行的命令。 who 命令的基本格式如下:

[root@localhost ~]# who [选项] [file]

需要说明的是,who 命令默认是通过 /var/run/utmp 文件来获取登陆用户信息,但如果通过 file 指定另一个文件,则 who 命令将不再默认读取 /var/run/utmp 文件,而是读取该指定文件来获取信息。

选项含义
-a 列出所有信息,相当于所有选项。
-b 列出系统最近启动的时间日期。
-l 列出所有可登陆的终端信息。
-m 仅列出关于当前终端的信息,who -m 命令等同于 who am i
-q 列出在本地系统上的用户和用户数的清单。
-r 显示当前系统的运行级别。
-s 仅显示名称、线路和时间字段信息,这是 who 命令的默认选项。
-u 显示当前每个用户的用户名、登陆终端、登陆时间、线路活动和进程标识。
-T 或 -w 显示 tty 终端的状态,“+”表示对任何人可写,“-”表示仅对 root 用户或所有者可写,“?”表示遇到线路故障。
  • users(超少)

 
[root@localhost ~]#users
 root

2.文件/目录的权限和归属

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

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

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

  • 应用文件“其它”权限

例子 root用户和普通用户 是否都可以看 (cat /etc/shadow)

访问人群分为了三类

  1. 所属主(u)

  2. 所属组(g)

  3. 其他人 (o)

权限分为三种

  1. 读(r,4)

  2. 写(w,2)

  3. 执行(x,1程序,脚本)

对文件的权限

  1. r 可使用文件查看类工具,比如:cat,可以获取其内容

  2. w 可修改其内容

  3. x 可以把此文件提请内核启动为一个进程,即可以执行(运行)此文件(此文件的内容必须是可执行)

 

对目录的权限

  1. r 可以使用ls查看此目录中文件列表

  2. w 可在此目录中创建文件,也可删除此目录中的文件,而和此被删除的文件的权限无关

  3. x 可以cd进入此目录,可以使用ls -l查看此目录中文件元数据(须配合r权限),属于目录的可访问的最小权限

 

2.1chmod

模式法:

chmod 对谁(所有者,所属组,其他)操作(+ - =)权限 文件

谁:u,g,o,a

操作:+,-,=

权限:r,w,x(普通权限对root无效)

数字法:

1 2 4

x w r

 
1. 文件属于谁有处理的权限,即使一开始没有权限
 2.  目录的读写权限与文件夹的同或异(文件是否可以删除与目录有关)
 一般谁新建的文件谁就是所属主
 ​
 修改所属主
 ​
 ​
 chown 用户:组名 文件名
 #修改所属主,和所属组
 -R 递归修改
 ​
 [root@localhost aa]#chown -R zhangsan:zhangsan /opt/aa/
 #递归修改
 [root@localhost aa]#ll
 总用量 0
 -rw-r--r--. 1 zhangsan zhangsan 0 9月  17 21:53 1
 -rw-r--r--. 1 zhangsan zhangsan 0 9月  17 21:53 10
 -rw-r--r--. 1 zhangsan zhangsan 0 9月  17 21:53 2
 -rw-r--r--. 1 zhangsan zhangsan 0 9月  17 21:53 3
 -rw-r--r--. 1 zhangsan zhangsan 0 9月  17 21:53 4
 -rw-r--r--. 1 zhangsan zhangsan 0 9月  17 21:53 5
 -rw-r--r--. 1 zhangsan zhangsan 0 9月  17 21:53 6
 -rw-r--r--. 1 zhangsan zhangsan 0 9月  17 21:53 7
 -rw-r--r--. 1 zhangsan zhangsan 0 9月  17 21:53 8
 -rw-r--r--. 1 zhangsan zhangsan 0 9月  17 21:53 9
 ​
 ##注意
 [root@localhost aa]#chown zhangsan:zhangsan /
 #此命令效果不亚于删除根目录

2.2umask

umask 的值可以用来保留在创建文件权限

实现方式:

新建文件的默认权限: 666-umask,如果所得结果某位存在执行(奇数)权限,则将其权限+1,偶数不变

新建目录的默认权限: 777-umask

非特权用户umask默认是 002

root的umask 默认是 022

2.3 三种特殊权限(suid、SGID、Sticky)

 
#suid
 [root@localhost aa]#which passwd 
 /usr/bin/passwd
 [root@localhost aa]#ll /usr/bin/passwd 
 #此处s表示当使用这个命令程序时,把当前用户当成文件的所属主
 -rwsr-xr-x. 1 root root 27832 6月  10 2014 /usr/bin/passwd
 [root@localhost aa]#which vim
 /usr/bin/vim
 [root@localhost aa]#chmod u+s /usr/bin/vim
 #给vim加上suid权限,代表所有用户可以使用vim打开并编辑所有文件
 [root@localhost aa]#ll /usr/bin/vim
 -rwsr-xr-x. 1 root root 2289640 8月   2 2017 /usr/bin/vim
 ​
 7777
 ​
 #SGID
 [root@localhost aa]#chmod g+s /usr/bin/vim
 [root@localhost aa]#ll /usr/bin/vim
 -rwxr-sr-x. 1 root root 2289640 8月   2 2017 /usr/bin/vim
 ​
 # Sticky 位
 #具有写权限的目录通常用户可以删除该目录中的任何文件,无论该文件的权限或拥有权
 #在目录设置Sticky 位,只有文件的所有者或root可以删除该文件
 #sticky 设置在文件上无意义
 #Sticky权限设定:
 chmod o+t DIR...
 chmod o-t DIR..
 [root@localhost aa]#chmod o+t /opt/aa
 # 添加Sticky 位
 [root@localhost opt]#chmod o-t /opt/aa 
 #减少Sticky 位

3 特殊权限

访问控制列表 ACL

ACL:Access Control List,实现灵活的权限管理

除了文件的所有者,所属组和其它人,可以对更多的用户设置权限

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

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

 用法: setfacl [-bkndRLP] { -m|-M|-x|-X ... } file ...
 -m,       --modify-acl 更改文件的访问控制列表
 -M,       --modify-file=file 从文件读取访问控制列表条目更改
 -x,       --remove=acl 根据文件中访问控制列表移除条目
 -X,       --remove-file=file 从文件读取访问控制列表条目并删除
 -b,       --remove-all 删除所有扩展访问控制列表条目
 -k,       --remove-default 移除默认访问控制列表
           --set=acl 设定替换当前的文件访问控制列表
           --set-file=file 从文件中读取访问控制列表条目设定
           --mask 重新计算有效权限掩码
 -n,       --no-mask 不重新计算有效权限掩码
 -d,       --default 应用到默认访问控制列表的操作
 -R,       --recursive 递归操作子目录
 -L,       --logical 依照系统逻辑,跟随符号链接
 -P,       --physical 依照自然逻辑,不跟随符号链接
           --restore=file 恢复访问控制列表,和“getfacl -R”作用相反
           --test 测试模式,并不真正修改访问控制列表属性
 -v,       --version           显示版本并退出
 -h,       --help              显示本帮助信息