第8-1章:管理本地端主机之使用者与群组(三)

前言

在上一章节中,笔者讲解了如和切换使用者以及取得最高的root使用者权限,接下来要讲解的是本地端主机的使用者管理。

管理本地使用者

新增使用者可以使用useradd指令做到,而修改使用者相关的资讯可以使用usermod来做到,相关的使用者设定的资讯、预设密码设定、以及使用者预设的规则设定等,都存放在/etc/login.defs的设定档案里,相关的指令执行方式如下:

[rockylinux@workstation ~]$ sudo useradd user1
[sudo] password for rockylinux:
[rockylinux@workstation ~]$ ls /home/
rockylinux  user1
[rockylinux@workstation ~]$ cat /etc/passwd | grep user1
user1:x:1001:1001::/home/user1:/bin/bash

从上面的输出讯息可以知道,useradd是只有root使用者权限才可以使用的,因此需要切换成root使用者或是使用sudo指令来暂时取得root使用者权限才可以,当新增好user1使用者之後,则对应的user1家目录以及进入的shell都已经设定好了,可以在/etc/passwd里面的档案看到,那预设会乱数一个密码给user1,因此我们并不知道预设给user1密码是什麽,因此还需要使用passwd指令来设定user1之密码,当然因为不知道预设密码是什麽,因此需要使用root使用者来做设定,假设设定给user1之新的密码为rocky,则相关的执行指令如下:

[rockylinux@workstation ~]$ sudo passwd user1
[sudo] password for rockylinux:
Changing password for user user1.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
[rockylinux@workstation ~]$

若新增好的使用者要做修改,则可以使用usermod指令来做到,相关可以修改使用者资讯的参数如下:

  • -c或是--comment:修改对於这个使用者的注解,参数後面接一个字串。
  • -g或是--gid:修改使用者对应的自己主要群组名称,参数後面接使用者名称与群组名称。
  • -G或是--groups:新增使用者到指定的群组,参数後面接群组名称。
  • -a或是--append:将使用者以附加的方式加入倒指定的群组中,参数後面接群组名称。
  • -d或是--home:指定一个新的使用者家目录,参数後面接家目录之路径。
  • -m或是--move-home:将原本使用者的家目录搬移到新的指定的家目录中,参数後面接家目录路径。
  • -s或是--shell:指定使用者登入所使用的shell名称,参数後面接shell之执行路径。
  • -L或是--lock:将指定的使用者锁定,被锁定的使用者将无法登入与使用。
  • -U或是--unlock:将指定的使用者解除锁定。

下面有几个范例来演示使用usermod来设定与修改指定的使用者相关资讯:

[rockylinux@workstation ~]$ sudo usermod -c "user1 comment" user1
[sudo] password for rockylinux:
[rockylinux@workstation ~]$ sudo usermod --lock user1
[rockylinux@workstation ~]$
[rockylinux@workstation ~]$ su - user1
Password:
su: Authentication failure
[rockylinux@workstation ~]$ sudo usermod --unlock user1
[rockylinux@workstation ~]$ su - user1
Password:
[user1@workstation ~]$ logout
[rockylinux@workstation ~]$

最後,总结一下当一个使用者被root使用者新增之後,会做到那些事情:

  • 将相关的使用者资讯存放一笔到/etc/passwd档案中。
  • 将与使用者名称相同的群组名称新增一笔资料到/etc/group档案中。
  • 使用者预设的密码会存放到/etc/shadow档案中。
  • 与使用者名称相同的群组名称之预设的密码会存放到/etc/gshadow档案中。
  • 建立一个与使用者名称相同的目录到/home目录底下。
  • 建立一个与使用者名称相同的目录到/var/spool/mail之目录底下。

当使用useradd指令来新增使用者的时候,若没有指定user id,则会在新增使用者的时候,随意的新增一个,而也可以自己指定,要注意的是,在指定user id的时候,有范围性的,相关的id范围列表如下:

id range

删除使用者

当使用者不需要使用,可以考虑将使用者删除,这时候就会使用userdel来删除,要完整地将使用者删除,则需要加上-r参数做搭配,相关的指令执行後的资讯如下:

[rockylinux@workstation ~]$ sudo userdel -r user1
[rockylinux@workstation ~]$

删除使用者之後,唯一需要注意的是,当新增使用者时候,不要指定之前给定过user id的使用者,因为有可能之後的新增使用者会继承之前user id对应的使用者,导致之前的档案与相关目录都可以存取,为了不必要麻烦,要确保先前的使用者所有相关的目录与档案都已经删除,相关的范例说明如下:

[rockylinux@workstation ~]$ sudo useradd user1
[rockylinux@workstation ~]$ touch user1.txt
[rockylinux@workstation ~]$ sudo chown user1:user1 user1.txt
[rockylinux@workstation ~]$
[rockylinux@workstation ~]$ ls -al user1.txt
-rw-rw-r--. 1 user1 user1 0 Sep 25 15:03 user1.txt
[rockylinux@workstation ~]$ id -u user1
1001
[rockylinux@workstation ~]$ sudo userdel -r user1
[rockylinux@workstation ~]$ ls -al user1.txt
-rw-rw-r--. 1 1001 1001 0 Sep 25 15:03 user1.txt
[rockylinux@workstation ~]$ sudo useradd user2
[rockylinux@workstation ~]$ id -u user2
1001
[rockylinux@workstation ~]$ ls -al user1.txt
-rw-rw-r--. 1 user2 user2 0 Sep 25 15:03 user1.txt
[rockylinux@workstation ~]$

从上面的执行指令的输出范例,就可以说明user id这件事情了,也证明系统是看user id,而不是给定的使用者名称。

管理使用者密码

在前面的章节中,谈论到/etc/passwd里面的格式与说明每个使用者相关的设定,这边在做更进一步有关於/etc/shadow档案的介绍:

rockylinux:$6$PPjj5FZ1HiJa1Wsl$9SIRj2kUaBoHrwKUILn7id1EdlKGI0BR3NV4gMlfmCY5qTuR2Fp5wx2lS1J1JCeboIV1HC8MadwHmDpHEGYaA1:18893:0:99999:7:::

从上面的设定来看,这是有关於rockylinux使用者的密码设定,并存放在/etc/shadow档案里面,详细的说明如下:

  • rockylinux是使用者名称。
  • 将密码杂凑过的结果。
  • 距离1970-01-01到现在的最後一次改变的时间戳记,这时间是UTC的时间。
  • 最小几天过後才可以再改变密码。
  • 密码多久改变一次。
  • 警告之讯息,当使用者多久没有变更密码则会再使用者登入的时候,收到警告。
  • 到了几天之後密码没有变更,则使用者会被自动锁住。
  • 密码多久了会到期,时间是距1970-01-01到现今之间的时间,日期以UTC时区表示,若空白的栏位,则密码永远不会过期。
  • 最後一个栏位通常都是空白的,留做日後的其他新增的功能与设定用。

杂凑过密码的格式

$6$PPjj5FZ1HiJa1Wsl$9SIRj2kUaBoHr-wKUILn7id1EdlKGI0BR3NV4gMlfmCY5qTuR2Fp5wx2lS1J1JCeboIV1HC8MadwHmDpHEGYaA1

上述的杂凑密码格式如下:

  • 每一段资讯以$隔开。
  • 指的是使用哪一种杂凑演算法进行密码的杂凑,数字为1则为MD5;数字为5为SHA-256,而数字为6则为SHA-512。
  • 杂凑的时候,会加盐,这一段是加盐的字串。
  • 将明文的密码与前一个的加盐字串何在一起进行杂凑後的结果会显示在这里。

由於本书不是与资讯安全有关的主题,因此笔者认为密码的格式知道就好。

设定密码时效性

可以使用下列的指令做到将某一个指定的使用者进行密码有效期的设定,相关的指令执行如下:

[rockylinux@workstation ~]$ sudo chage -E "2021-09-25" user02
[rockylinux@workstation ~]$ su - user2
Password:
Your account has expired; please contact your system administrator
su: User account has expired
[rockylinux@workstation ~]$

上述指令是利用-E来指定什麽时候这个使用者过期,若要设定几天之後过期,可以使用date指令取得指定的天数之後过期,相关指令如下:

[rockylinux@workstation ~]$ date -d "+30 days" +%F
2021-10-25

从上述的指令可以知道,假设今天是2021-09-25,而设定要30天到期的日期是:2021-10-25,这样就可以取得指定的时间之到期的日期了。

若要强制使用者在一开始登入之後便要改密码,则可以使用下列的指令方式做到:

[rockylinux@workstation ~]$ sudo chage -d 0 user2
[rockylinux@workstation ~]$ su - user2
Password:
You are required to change your password immediately (administrator enforced)
Current password:
New password:
Retype new password:
[user2@workstation ~]$

无登入shell设定-

有些使用者不能让其登入,并可以使用shell,可以使用下列指令做到:

[rockylinux@workstation ~]$ sudo usermod -s /usr/sbin/nologin user2
[rockylinux@workstation ~]$
[rockylinux@workstation ~]$ su - user2
Password:
This account is currently not available.
[rockylinux@workstation ~]$

除了使用/usr/sbin/nologin设定之外,另外也可以使用/usr/bin/false来做到,当这样设定之後,则使用者便不可以登入方式启动shell才进行存取了。

课後练习

  • 请启动workstation虚拟机器并以rockylinux的使用者进入到桌面环境以及终端机。
  • 请在workstation虚拟机新增一个使用者叫做peter,并家目录在/home/peter、启动shell为/bin/bash。
  • 请在workstation虚拟机新增一个使用者叫做bob,并家目录在/home/bob、这个使用者不被允许登入。
  • 请在workstation虚拟机新增一个使用者叫做alice,并家目录在/home/alice并指定user id为1100、启动shell为/bin/bash。
  • 请分别设定密码为:rocky给peter与alice使用者。
  • 请将peter这个使用者以附加的方式加入到wheel群组中。
  • 请将alice这个使用者以附加的方式加入到peter群组中。
  • 请将peter使用者设定成当一开始登入之後,便要立即更改密码。
  • 请将alice使用者设定成从今天开始算起,过了30天之後,帐号会到期。
  • 请删除peter使用者。
  • 请删除bob使用者。
  • 请删除alice使用者。

<<:  【第十一天 - 布林SQL盲注】

>>:  ESP32_DAY10 硬体届的Hello World!

Day5 NodeJS-Events和EventEmitter

今天的主题是NodeJS中的Events和EventEmitter。在JavaScript语法中并不...

Day 23 K-平均演算法 K-Means

介绍: k-平均演算法(英文:k-means clustering,以下简称为 k-means )是...

#23 No-code 之旅 — Next.js 网站可以部署到哪里呢?

大家~ 今天文章会也会很短Q 昨天讲了静态网站可以部署到哪里之後,今天来讲 Next.js 的专案可...

Day 16 - 用 canvas 做射击小游戏

import { useEffect, useState, useRef } from "...

[D27] 物件侦测(8)

接下来详细一点的说明 YOLOv4 的内部架构! 目标检测通常由以下几个部分组成: Input: 指...