当前位置: 首页 > news >正文

Linux基础(十七)——Linux 帐号管理与 ACL 权限设置

Linux 帐号管理与 ACL 权限设置

  • 1.UID与GID
  • 2.`/etc/passwd`
  • 3.`/etc/shadow`
  • 4.`/etc/group`
  • 5.`/etc/gshadow`
  • 6.有效群组和初始群组
  • 7.账号管理
    • 7.1 增加、修改、删除账户
    • 7.2 增加、修改、删除群组
    • 7.3 实例
  • 8.ACL使用
    • 8.1 ACL定义
    • 8.2 查询与设置ACL
  • 9.用户切换
    • 9.1 su
    • 9.2 .sudo
  • 10. 使用者的特殊 shell 与 PAM 模块
    • 10.1 特殊 shell——`sbin/nologin`
    • 10.2 PAM 模块
  • 11. Linux 主机上的使用者讯息传递
    • 11.1 查询系统在线的使用者——`w、who、last、lastlog`
    • 11.2 使用者对谈——` write、mesg、wall`

1.UID与GID

UID(User Identifier) 是用户的唯一标识符,用于识别系统中的每个用户。在用户管理文件(如 /etc/passwd)中,每个用户都有一个 UID。系统使用 UID 而非用户名来管理文件权限和其他安全属性。

GID(Group Identifier)是用户组的唯一标识符,用于标识用户所属的组。在用户组管理文件(如 /etc/group)中,每个用户组都有一个唯一的 GID。GID 与用户组相关联,帮助系统管理用户组权限和文件访问控制。

与UID、GID相关的文件有/etc/passwd/etc/shadow /etc/group/etc/gshadow

2./etc/passwd

[root@CentOS7 ~]# head -n 4 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin

passwd文件有七个字段:
①帐号名称
就是帐号啦! 用来提供给对数字不太敏感的人类使用来登陆系统的! 需要用来对应 UID 喔。 例如 root 的 UID 对应就是 0 ( 第三字段) 。
②密码
早期 Unix 系统的密码就是放在这字段上! 但是因为这个文件的特性是所有的程序都能够读取, 这样一来很容易造成密码数据被窃取, 因此后来就将这个字段的密码数据给他改放到 /etc/shadow 中了。 所以这里你会看到一个“ x ”, 呵呵!
③UID
在这里插入图片描述
④GID
这个与 /etc/group 有关! 其实 /etc/group 的观念与 /etc/passwd 差不多, 只是他是用来规范群组名称与 GID 的对应而已
⑤使用者信息说明栏
这个字段基本上并没有什么重要用途, 只是用来解释这个帐号的意义而已! 不过, 如果您提供使用 finger 的功能时, 这个字段可以提供很多的讯息呢! 本章后面的 chfn 指令会来解释这里的说明。
⑥主文件夹
这是使用者的主文件夹, 以上面为例, root 的主文件夹在 /root , 所以当root 登陆之后, 就会立刻跑到 /root 目录里头啦
⑦Shell
当使用者登陆系统后就会取得一个 Shell 来与系统的核心沟通以进行使用者的操作任务。 那为何默认 shell 会使用 bash 呢? 就是在这个字段指定的啰.

3./etc/shadow

很多程序的运行都与权限有关, 而权限与 UID/GID 有关! 因此各程序当然需要读取/etc/passwd 来了解不同帐号的权限。 因此 /etc/passwd 的权限需设置为 -rw-r–r–(others可读) 这样的情况, 虽然早期的密码也有加密过, 但却放置到 /etc/passwd 的第二个字段上! 这样一来很容易被有心人士所窃取。所以后来发展出将密码移动到 /etc/shadow 这个文件分隔开来的技术, 而且还加入很多的密码限制参数在 /etc/shadow 里头呢。

[root@CentOS7 ~]# head -n 4 /etc/shadow
root:$6$rRQaeWbVRNxqa094$KC7q4h6A591WK.MCYnpwo1J.qjR6hjA0n/B09g1UnjpPNFvIk6R.xiTkQVknGqFYzMCmyktNbwig6tg3NRbrE1::0:99999:7:::
bin:*:18353:0:99999:7:::
daemon:*:18353:0:99999:7:::
adm:*:18353:0:99999:7:::

shadow文件有九个字段:
①帐号名称
与 /etc/passwd对应
②密码
这个字段内的数据才是真正的密码, 而且是经过编码的密码 ( 加密)
③最近更动密码的日期
这个字段记录了“更动密码那一天”的日期, 不过, 很奇怪呀! 在我的例子中怎么会是 18353 呢? 呵呵, 这个是因为计算 Linux 日期的时间是以 1970 年 1月 1 日作为 1 而累加的日期, 1971 年 1 月 1 日则为 366 啦! 得注意一下这个数据呦!上述的 18353 指的就是 2015-05-04 那一天啦(18353/366=50.1448年,1970+50=2020)
④密码不可被更动的天数
如果是 0 的话, 表示密码随时可以更动的意思。 这的限制是为了怕密码被某些人一改再改而设计的! 如果设置为 20 天的话, 那么当你设置了密码之后, 20 天之内都无法改变这个密码呦
⑤密码需要重新变更的天数
99999 ( 计算为 273 年)
⑥密码需要变更期限前的警告天数
如上面的例子, 则是密码到期之前的 7 天之内, 系统会警告该用户
⑦密码过期后的帐号宽限时间
⑧帐号失效日期
⑨保留
看以后有没有新功能加入

对于密码忘记了:
①一般用户的密码忘记了: 这个最容易解决, 请系统管理员帮忙, 他会重新设置好你的密码而不需要知道你的旧密码! 利用 root 的身份使用 passwd 指令来处理即可。
②root 密码忘记了: 这就麻烦了! 因为你无法使用 root 的身份登陆了嘛! 但我们知道 root的密码在 /etc/shadow 当中, 因此你可以使用各种可行的方法开机进入 Linux 再去修改。例如重新开机进入单人维护模式后, 系统会主动的给予 root 权限的 bash接口, 此时再以 passwd 修改密码即可

4./etc/group

这个文件就是在记录 GID 与群组名称的对应了.

[root@CentOS7 ~]# head -n 4 /etc/group
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:

①群组名称
需要与第三字段的 GID 对应
②群组密码
通常不需要设置, 这个设置通常是给“群组管理员”使用的, 目前很少有这个机会设置群组管理员啦。同样的, 密码已经移动到 /etc/gshadow 去, 因此这个字段只会存在一个“x”而已;
③GID
④此群组支持的帐号名称
我们知道一个帐号可以加入多个群组, 那某个帐号想要加入此群组时, 将该帐号填入这个字段即可。 举例来说, 如果我想要让 dmtsai 与 alex 也加入root 这个群组, 那么在第一行的最后面加上“dmtsai,alex”, 注意不要有空格, 使成为“root❌0:dmtsai,alex ”就可以啰。新版的 Linux 中, 初始群组的用户群已经不会加入在第四个字段。

5./etc/gshadow

[root@CentOS7 ~]# head -n 4 /etc/gshadow
root:::
bin:::
daemon:::
sys:::

这个文件几乎与/etc/group一样。以系统管理员的角度来说, 这个 gshadow 最大的功能就是创建群组管理员啦! 那么什么是群组管理员呢? 由于系统上面的帐号可能会很多, 但是我们 root 可能平时太忙碌, 所以当有使用者想要加入某些群组时, root 或许会没有空管理。 此时如果能够创建群组管理员的话, 那么该群组管理员就能够将那个帐号加入自己管理的群组中! 可以免去 root 的忙碌啦! 不过,由于目前有类似 sudo 之类的工具, 所以这个群组管理员的功能已经很少使用了。

6.有效群组和初始群组

在 Linux 中,每个用户都有一个初始群组(Primary Group)和一个或多个有效群组(Secondary Groups),用于决定用户的权限和文件访问控制。
①初始群组
是指用户的默认组,通常在用户创建文件或目录时,这些文件或目录默认属于初始群组。每个用户都只能有一个初始群组,该群组在 /etc/passwd 文件中定义,也就是 /etc/passwd中记录的GID。
②有效群组(也称附属群组或辅助群组)
是用户所属的其他群组,可以赋予用户更多权限。一个用户可以属于多个有效群组,允许用户访问这些组所拥有的文件和资源。有效群组信息存储在 /etc/group 文件中。

查询一个用户的初始群组和有效群组:

[root@CentOS7 ~]# groups
root
[root@CentOS7 ~]# su fle
[fle@CentOS7 root]$ groups
fle wheel
[fle@CentOS7 root]$ 

可以使用groups命令来查看一个用户的群组信息,第一个出现的就是其初始群组。

可以使用newgrp来切换有效群组:

[fle@CentOS7 ~]$ touch /tmp/file
[fle@CentOS7 ~]$ ll /tmp/file
-rw-rw-r-- 1 fle fle 0 1115 14:32 /tmp/file
[fle@CentOS7 ~]$ newgrp wheel
[fle@CentOS7 ~]$ touch /tmp/file2
[fle@CentOS7 ~]$ ll /tmp/file2
-rw-r--r-- 1 fle wheel 0 1115 14:33 /tmp/file2
[fle@CentOS7 ~]$ ll /tmp/file
-rw-rw-r-- 1 fle fle 0 1115 14:32 /tmp/file
[fle@CentOS7 ~]$ newgrp root
密码:
newgrp: failed to crypt password with previous salt: 无效的参数

从上面可以看到,切换fle用户的有效群组后,其创建的文件的group变为了wheel。但要注意的是,切换的群组必须为原本已有的群组,比如fle只有fle和wheel两个群组,就不能切换为root群组。
Tips:newgrp切换成功后,是会变换到一个新的shell环境的
在这里插入图片描述

7.账号管理

7.1 增加、修改、删除账户

对应的命令分别是useradd、usermod、userdel,此外,一般增加账户输入密码时使用passwd.
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
下面使用root身份在CentOS7上新建一个Flx用户:

[root@CentOS7 ~]# grep 'flx' /etc/passwd
[root@CentOS7 ~]# grep 'fle' /etc/passwd
fle:x:1000:1000:fle:/home/fle:/bin/bash
[root@CentOS7 ~]# useradd flx
[root@CentOS7 ~]# grep 'flx' /etc/passwd
flx:x:1005:1005::/home/flx:/bin/bash
[root@CentOS7 ~]# grep 'flx' /etc/shadow
flx:!!:20042:0:99999:7:::
[root@CentOS7 ~]# grep 'flx' /etc/group
flx:x:1005:

上面创建了一个用户,可以看到useradd是有固定的初始设置的,具体如下:

[root@CentOS7 ~]# useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes

除了以root身份进行账户信息的修改,也可以用usermod命令进行修改:

[root@CentOS7 ~]# usermod -l flz flx
[root@CentOS7 ~]# grep 'flx' /etc/passwd
flz:x:1005:1005::/home/flx:/bin/bash
[root@CentOS7 ~]# su - flz
[flz@CentOS7 ~]$ usermod -l flx flz
usermod: user flz is currently used by process 22520
[flz@CentOS7 ~]$ su - fle
密码:
上一次登录:五 1115 14:30:18 CST 2024pts/0 上
[fle@CentOS7 ~]$ usermod -l flx flz
usermod: Permission denied.
usermod:无法锁定 /etc/passwd,请稍后再试。

接下来删除创建的用户:

[fle@CentOS7 ~]$ grep 'flz' /etc/passwd
flz:x:1005:1005::/home/flx:/bin/bash
[fle@CentOS7 ~]$ su -
密码:
上一次登录:五 1115 20:54:53 CST 2024pts/0 上
[root@CentOS7 ~]# userdel -rf flz
[root@CentOS7 ~]# grep 'flz' /etc/passwd

Tips:id 这个指令则可以查询某人或自己的相关 UID/GID 等等的信息.

[root@CentOS7 ~]# id fle
uid=1000(fle) gid=1000(fle)=1000(fle),10(wheel)

7.2 增加、修改、删除群组

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

[root@CentOS7 ~]# grep 'Openwifi_Group' /etc/group
[root@CentOS7 ~]# groupadd Openwifi_Group
[root@CentOS7 ~]# grep 'Openwifi_Group' /etc/group
Openwifi_Group:x:1006:
[root@CentOS7 ~]# groupmod -n OpenLora_Group Openwifi_Group
[root@CentOS7 ~]# grep 'OpenLora_Group' /etc/group
OpenLora_Group:x:1006:
[root@CentOS7 ~]# groupdel -f OpenLora_Group 
[root@CentOS7 ~]# grep 'OpenLora_Group' /etc/group
[root@CentOS7 ~]# 

7.3 实例


在这里插入图片描述

[root@CentOS7 ~]# groupadd mygroup1
[root@CentOS7 ~]# useradd -c "1st user" -G mygroup1 myuser1
[root@CentOS7 ~]# useradd -c "2nd user" -G mygroup1 myuser2
[root@CentOS7 ~]# useradd -c "3rd user" -s /sbin/nologin myuser3
[root@CentOS7 ~]# echo "password" | passwd --stdin myuser1
更改用户 myuser1 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@CentOS7 ~]# echo "password" | passwd --stdin myuser2
更改用户 myuser2 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@CentOS7 ~]# echo "password" | passwd --stdin myuser3
更改用户 myuser3 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@CentOS7 ~]# grep myuser* /etc/passwd /etc/group
/etc/passwd:myuser1:x:1006:1006:1st user:/home/myuser1:/bin/bash
/etc/passwd:myuser2:x:1007:1009:2nd user:/home/myuser2:/bin/bash
/etc/passwd:myuser3:x:1008:1010:3rd user:/home/myuser3:/sbin/nologin
/etc/group:mygroup1:x:1008:myuser1,myuser2
/etc/group:myuser1:x:1006:
/etc/group:myuser2:x:1009:
/etc/group:myuser3:x:1010:

myuser1 与 myuser2 都有支持次要群组, 但该群组不见得会存在, 因此需要先手动创建他! 然后 myuser3 是“不可登陆系统”的帐号, 因此需要使用 /sbin/nologin这个 shell 来给予, 这样该帐号就无法登陆啰.

我的使用者 pro1, pro2, pro3 是同一个专案计划的开发人员, 我想要让这三个用户在同一个目录下面工作, 但这三个用户还是拥有自己的主文件夹与基本的私有群组。 假设我要让这个专案计划在 /srv/projecta 目录下开发。

[root@CentOS7 ~]# userdel pro1
[root@CentOS7 ~]# userdel pro2
[root@CentOS7 ~]# userdel pro3
[root@CentOS7 ~]# groupdel projecta
[root@CentOS7 ~]# groupadd projecta
[root@CentOS7 ~]# mkdir /srv/projecta && chgrp projecta /srv/projecta
[root@CentOS7 ~]# chmod 2770 /srv/projecta
[root@CentOS7 ~]# useradd -G projecta pro1
[root@CentOS7 ~]# useradd -G projecta pro2
[root@CentOS7 ~]# useradd -G projecta pro3
[root@CentOS7 ~]# passwd pro1
更改用户 pro1 的密码 。
新的 密码:pro1
无效的密码: 密码少于 7 个字符
重新输入新的 密码:pro1
passwd:所有的身份验证令牌已经成功更新。
[root@CentOS7 ~]# passwd pro2
更改用户 pro2 的密码 。
新的 密码:pro2
无效的密码: 密码少于 7 个字符
重新输入新的 密码:pro2
passwd:所有的身份验证令牌已经成功更新。
[root@CentOS7 ~]# passwd pro3
更改用户 pro3 的密码 。
新的 密码:pro3
无效的密码: 密码少于 7 个字符
重新输入新的 密码:pro3
passwd:所有的身份验证令牌已经成功更新。
[root@CentOS7 ~]# su - pro1
最后一次失败的登录:六 1116 14:41:25 CST 2024pts/0 上
最有一次成功登录后有 1 次失败的登录尝试。
[pro1@CentOS7 ~]$ pwd
/home/pro1
[pro1@CentOS7 ~]$ touch /srv/projecta/afile_pro1 ~/pfile_pro1
[pro1@CentOS7 ~]$ echo "This is a file created by pro1 in ~/" >> ~/pfile_pro1
[pro1@CentOS7 ~]$ echo "This is a file created by pro1 in /srv/projecta/" >> /srv/projecta/afile_pro1 
[pro1@CentOS7 ~]$ su - pro2
密码:pro2
最后一次失败的登录:六 1116 15:20:50 CST 2024pts/0 上
最有一次成功登录后有 3 次失败的登录尝试。
[pro2@CentOS7 ~]$ head -n 1 /home/pro1/pfile_pro1
head: 无法打开"/home/pro1/pfile_pro1" 读取数据: 权限不够
[pro2@CentOS7 ~]$ head -n 1 /srv/projecta/afile_pro1
This is a file created by pro1 in /srv/projecta/
[pro2@CentOS7 ~]$ 

chmod 2770 /srv/projecta就表示为/srv/projecta目录设置SGID功能。设置SGID功能意味着:使用者在此目录下的有效群组将会变成该目录的群组。而前面已经设置了该目录的群组为projecta,所以projecta群组下的pro1、pro2、pro3就拥有7的权限了,即可以rwx目录/srv/projecta下的任何文件(包括子目录)。

但接下来有个困扰的问题发生了! 假如实例一的 myuser1 是 projecta 这个专案的助理, 他需要这个专案的内容, 但是他“不可以修改”专案目录内的任何数据! 那该如何是好? 你或许可以这样做:
①将 myuser1 加入 projecta 这个群组的支持, 但是这样会让 myuser1 具有完整的/srv/projecta 的使用权限, myuser1 是可以删除该目录下的任何数据的! 这样是有问题的;
②将 /srv/projecta 的权限改为 2775 , 让 myuser1 可以进入查阅数据。 但此时会发生所有其他人均可进入该目录查阅的困扰! 这也不是我们要的环境。
传统的权限仅有三种身份 ( owner, group, others) 搭配三种权限 ( r,w,x) 而已, 并没有办法单纯的针对某一个使用者或某一个群组来设置特定的权限需求。这就需要用到ACL权限了。

8.ACL使用

8.1 ACL定义

ACL 是 Access Control List 的缩写, 主要的目的是在提供传统的 owner,group,others 的read,write,execute 权限之外的细部权限设置。 ACL 可以针对单一使用者, 单一文件或目录来进行 r,w,x 的权限规范。

处理对象:
在这里插入图片描述

8.2 查询与设置ACL

在这里插入图片描述
利用“ u:使用者:权限 ”的方式来设置的啦! 设置前请加上 -m这个选项。 如果一个文件设置了 ACL 参数后, 他的权限部分就会多出一个 + 号了! 但是此时你看到的权限与实际权限可能就会有点误差! 那要如何观察呢? 就通过 getfacl 吧。
在这里插入图片描述
①user的ACL设置
使Fle可以访问7.3小节中实例2的/srv/projecta,但是不能修改该目录下的文件:

[fle@CentOS7 ~]$ cd /srv/projecta
-bash: cd: /srv/projecta: 权限不够
[fle@CentOS7 ~]$ su -
密码:
上一次登录:六 1116 18:44:20 CST 2024pts/0 上
[root@CentOS7 ~]# setfacl -m u:fle:rx /srv/projecta
[root@CentOS7 ~]# getfacl /srv/projecta
getfacl: Removing leading '/' from absolute path names
# file: srv/projecta
# owner: root
# group: projecta
# flags: -s-
user::rwx
user:fle:r-x
group::rwx
mask::rwx
other::---[root@CentOS7 ~]# su - fle
上一次登录:六 1116 19:28:18 CST 2024pts/0 上
[fle@CentOS7 ~]$ cd /srv/projecta
[fle@CentOS7 projecta]$ 

②group的ACL设置
设置projecta群组对fle的设置的/tmp/fle_dir目录有rwx权限

[fle@CentOS7 ~]$ mkdir /tmp/fle_dir && chmod 770 /tmp/fle_dir
[fle@CentOS7 ~]$ ll -d /tmp/fle_dir
drwxrwx--- 2 fle fle 6 1116 19:45 /tmp/fle_dir
[fle@CentOS7 ~]$ su - pro1
密码:
上一次登录:六 1116 19:43:55 CST 2024pts/0 上
[pro1@CentOS7 ~]$ cd /tmp/fle_dir
-bash: cd: /tmp/fle_dir: 权限不够
[pro1@CentOS7 ~]$ su -
密码:
上一次登录:六 1116 19:40:50 CST 2024pts/0 上
[root@CentOS7 ~]# setfacl -m g:projecta:rwx /tmp/fle_dir
[root@CentOS7 ~]# su - pro1
上一次登录:六 1116 19:46:22 CST 2024pts/0 上
[pro1@CentOS7 ~]$ getfacl /tmp/fle_dir
getfacl: Removing leading '/' from absolute path names
# file: tmp/fle_dir
# owner: fle
# group: fle
user::rwx
group::rwx
group:projecta:rwx
mask::rwx
other::---[pro1@CentOS7 ~]$ cd /tmp/fle_dir
[pro1@CentOS7 fle_dir]$ su - pro2
密码:
上一次登录:六 1116 15:23:53 CST 2024pts/0 上
[pro2@CentOS7 ~]$ cd /tmp/fle_dir
[pro2@CentOS7 fle_dir]$ 

9.用户切换

9.1 su

在这里插入图片描述
su
su命令并不会改变PATH等变量:

[fle@CentOS7 ~]$ su
密码:
[root@CentOS7 fle]# id
uid=0(root) gid=0(root)=0(root)
[root@CentOS7 fle]# env | grep 'fle'
USER=fle
PATH=/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/fle/.local/bin:/home/fle/bin
MAIL=/var/spool/mail/fle
PWD=/home/fle
LOGNAME=fle
XDG_DATA_DIRS=/home/fle/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share:/usr/share

从上面可以看到,USERPWDMAIL等仍然是fle,并没有切换为root,因为su命令是以non-login shell方法来读取变量的。
su -

[fle@CentOS7 ~]$ su -
密码:
上一次登录:六 1116 19:54:41 CST 2024pts/0 上
[root@CentOS7 ~]# id
uid=0(root) gid=0(root)=0(root)
[root@CentOS7 ~]# env | grep 'fle'
[root@CentOS7 ~]# env | grep 'root'
USER=root
MAIL=/var/spool/mail/root
PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
PWD=/root
HOME=/root
LOGNAME=root
XDG_DATA_DIRS=/root/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share:/usr/share

su - -c "命令"
加上-c选项,可以使得非root用户用root身份执行命令

[fle@CentOS7 ~]$ head -n 2 /etc/shadow
head: 无法打开"/etc/shadow" 读取数据: 权限不够
[fle@CentOS7 ~]$ su - -c "head -n 2 /etc/shadow"
密码:
root:$6$rRQaeWbVRNxqa094$KC7q4h6A591WK.MCYnpwo1J.qjR6hjA0n/B09g1UnjpPNFvIk6R.xiTkQVknGqFYzMCmyktNbwig6tg3NRbrE1::0:99999:7:::
bin:*:18353:0:99999:7:::

su -l
使用-l选项可以从一个普通用户切换到另一个普通用户

[fle@CentOS7 ~]$ su -l pro1
密码:
上一次登录:六 1116 19:47:00 CST 2024pts/0 上
[pro1@CentOS7 ~]$ id
uid=1006(pro1) gid=1006(pro1)=1006(pro1),1008(projecta)
[pro1@CentOS7 ~]$ echo ${PWD}
/home/pro1

9.2 .sudo

在这里插入图片描述
相对于 su 需要了解新切换的使用者密码 ( 常常是需要 root 的密码) , sudo 的执行则仅需要自己的密码即可!由于 sudo 可以让你以其他用户的身份执行指令 ( 通常是使用 root 的身份来执行指令) , 因此并非所有人都能够执行sudo , 而是仅有规范到 /etc/sudoers 内的用户才能够执行 sudo 这个指令。

在安装 CentOS 7 的第三章时, 在设置一般帐号的项目中, 有个“让这位使用者成为管理员”的选项吧? 如果你有勾选该选项的话, 那除了 root 之外, 该一般用户确实是可以使用 sudo 的喔:

[root@CentOS7 ~]# grep 'fle' /etc/sudoers
[root@CentOS7 ~]# su -l fle
上一次登录:六 1116 20:29:20 CST 2024pts/0 上
[fle@CentOS7 ~]$ sudo head -n 1 /etc/shadow
[sudo] fle 的密码:
root:$6$rRQaeWbVRNxqa094$KC7q4h6A591WK.MCYnpwo1J.qjR6hjA0n/B09g1UnjpPNFvIk6R.xiTkQVknGqFYzMCmyktNbwig6tg3NRbrE1::0:99999:7:::

但是 sudo 默认仅有 root 能使用啊! 为什么呢? 因为 sudo 的执行是这样的流程:
1.当使用者执行 sudo 时, 系统于 /etc/sudoers 文件中搜寻该使用者是否有执行 sudo 的权限;
2.若使用者具有可执行 sudo 的权限后, 便让使用者“输入使用者自己的密码”来确认;
3.若密码输入成功, 便开始进行 sudo 后续接的指令( 但 root 执行 sudo 时, 不需要输入密码) ;
4.若欲切换的身份与执行者身份相同, 那也不需要输入密码。

[fle@CentOS7 ~]$ sudo cd /tmp
[fle@CentOS7 ~]$ cd /tmp
[fle@CentOS7 tmp]$ 

从上面可以看到,fle用户使用sudo是无效的。所以要使普通用户可以使用sudo,就需要在/etc/sudoers中添加。除了 root 之外的其他帐号, 若想要使用 sudo 执行属于 root 的权限指令, 则 root 需要先使用 visudo 去修改 /etc/sudoers , 让该帐号能够使用全部或部分的root 指令功能。

[pro1@CentOS7 ~]$ sudo head -n 1 /etc/shadow
[sudo] pro1 的密码:
pro1 不在 sudoers 文件中。此事将被报告。
[pro1@CentOS7 ~]$ su -
密码:
上一次登录:六 1116 20:27:58 CST 2024pts/0 上
[root@CentOS7 ~]# visudo
[root@CentOS7 ~]# su - pro1
上一次登录:六 1116 20:30:51 CST 2024pts/0 上
[pro1@CentOS7 ~]$ sudo head -n 1 /etc/shadow
[sudo] pro1 的密码:
root:$6$rRQaeWbVRNxqa094$KC7q4h6A591WK.MCYnpwo1J.qjR6hjA0n/B09g1UnjpPNFvIk6R.xiTkQVknGqFYzMCmyktNbwig6tg3NRbrE1::0:99999:7:::

[root@CentOS7 ~]# visudo执行后编写如下:
在这里插入图片描述

10. 使用者的特殊 shell 与 PAM 模块

10.1 特殊 shell——sbin/nologin

系统帐号(System Account)是指在 Linux 或类 Unix 系统中,用于执行系统服务、管理任务或运行特定服务(如数据库、Web服务器等)的特殊用户帐号。这些帐号通常不是为普通用户登录系统而设计的,而是为系统或服务的内部使用提供功能支持。系统帐号(System Account)是指在 Linux 或类 Unix 系统中,用于执行系统服务、管理任务或运行特定服务(如数据库、Web服务器等)的特殊用户帐号。这些帐号通常不是为普通用户登录系统而设计的,而是为系统或服务的内部使用提供功能支持。

系统帐号这玩意儿的 shell 就是使用 /sbin/nologin , 重点在于系统帐号是不需要登陆的! 所以我们就给他这个无法登陆的合法 shell。 使用了这个 shell 的用户即使有了密码, 你想要登陆时他也无法登陆, 因为会出现如下的讯息喔:
This account is currently not available.

换个角度来想, 如果我的 Linux 主机提供的是邮件服务, 所以说, 在这部 Linux 主机上面的帐号, 其实大部分都是用来收受主机的信件而已, 并不需要登陆主机的呢! 这个时候, 我们就可以考虑让单纯使用 mail 的帐号以 /sbin/nologin 做为他们的 shell , 这样, 最起码当我的主机被尝试想要登陆系统以取得 shell 环境时, 可以拒绝该帐号呢。

10.2 PAM 模块

在过去, 我们想要对一个使用者进行认证 ( authentication) , 得要要求使用者输入帐号密码, 然后通过自行撰写的程序来判断该帐号密码是否正确。 也因为如此, 我们常常得使用不同的机制来判断帐号密码, 所以搞的一部主机上面拥有多个各别的认证系统, 也造成帐号密码可能不同步的验证问题! 为了解决这个问题因此有了 PAM ( Pluggable Authentication
Modules, 嵌入式模块) 的机制。

PAM 可以说是一套应用程序接口 ( Application Programming Interface, API) , 他提供了一连串的验证机制, 只要使用者将验证阶段的需求告知 PAM 后, PAM 就能够回报使用者验证的结果 ( 成功或失败) 。 由于 PAM 仅是一套验证的机制, 又可以提供给其他程序所调用引用, 因此不论你使用什么程序, 都可以使用 PAM 来进行验证。这也就是说, 你可以在写程序的时候将 PAM 模块的功能加入, 就能够利用 PAM 的验证功能啰。
在这里插入图片描述
在这里插入图片描述

11. Linux 主机上的使用者讯息传递

11.1 查询系统在线的使用者——w、who、last、lastlog

[root@CentOS7 ~]# w21:05:58 up  5:56,  2 users,  load average: 0.05, 0.03, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
fle      :0       :0               15:10   ?xdm?   9:17   0.17s /usr/libexec/gn
fle      pts/0    :0               15:10    6.00s  1.40s 32.66s /usr/libexec/gn
[root@CentOS7 ~]# who
fle      :0           2024-11-16 15:10 (:0)
fle      pts/0        2024-11-16 15:10 (:0)

last 可以列出从系统创建之后到目前为止的所有登陆者信息;如果您想要知道每个帐号的最近登陆的时间, 则可以使用 lastlog 这个指令喔。

11.2 使用者对谈—— write、mesg、wall

在这里插入图片描述

http://www.lryc.cn/news/486224.html

相关文章:

  • 【HarmonyOS】鸿蒙系统在租房项目中的项目实战(二)
  • 11.16 Vue element
  • Gin 框架中的路由
  • 在MATLAB中实现自适应滤波算法
  • linux文件与重定向
  • 基于Python的仓库管理系统设计与实现
  • 【Pikachu】URL重定向实战
  • C语言实现3D动态爱心图形的绘制与动画效果
  • 深入理解Nginx:从基础配置到高级优化
  • ONLYOFFICE8.2版本测评,团队协作的办公软件
  • spring 和 grpc 的整合
  • 企业项目级IDEA设置类注释、方法注释模板(仅增加@author和@date)
  • 1 设计模式原则之开闭原则
  • 前端大环境
  • Electron: 主进程和渲染进程之间通信
  • 社交电商的优势及其与 AI 智能名片小程序、S2B2C 商城系统的融合发展
  • 蓝桥杯c++算法学习【4】之简单数论(阶乘约数、求值、循环小数、等差数列、最大比例:::非常典型的必刷例题!!!)
  • 重构代码之删除对参数的赋值
  • Docker的基本概念、安装步骤以及一些简单的用法
  • VuePress v2 快速搭建属于自己的个人博客网站
  • shell编程--永久环境变量和字符串显位
  • 【优选算法篇】算法江湖中的碎玉拾光——C++模拟题全解,踏步逐章细细品味
  • 【MySQL 保姆级教学】事务的隔离级别(详细)--下(14)
  • 部分利用oracle数据字典查询对应信息的语句。
  • 实例教程:BBDB为AHRS算法开发提供完善的支撑环境(上)
  • k8s搭建1.23版本
  • 【MYSQL】分库分表
  • CSS基础知识05(弹性盒子、布局详解,动画,3D转换,calc)
  • 常见error集合
  • 建筑施工特种作业人员安全生产知识试题