第7章:管理本地端主机之使用者与群组(一)

前言

在上一章节中,笔者解释了该如何使用指令执行中的管线来重新导向到档案中,以及将指令的输出利用pipelines技巧变成後面的指令的输入,最後介绍基本文字编辑器vim之使用方法,在这一章节中,将要介绍如何做到基本使用者与群组管理。

什麽是使用者?

从简单意思上来说,就是存取作业系统上的程序或是指令执行的人,就叫做使用者,使用者通常通常分成三种类型:超级使用者、系统使用者以及一般使用者。超级使用者意思是,这个使用者只有一个在系统上,为最高权限的使用者,就叫做root,更多详细的root使用者介绍与使用,则会在後面的章节作介绍,系统使用者则是作业系统上的套件所建立的使用者,或是执行程序process的使用者,为了要执行某个程序或是套件所自动创立的,通常这类的使用者都不被允许登入,都只用来执行特定的程序prcoess或是套件,而一般使用者则是可以存取作业系统一般功能的使用者,通常可以登入进去之外,也可以做大部分非超级使用者权限的操作与指令。下列笔者使用id这个指令可以查看目前使用者的名称已经对应的id,当Linux作业系统将使用者建立的时候,若没有指定的话,则会自动指派一个id给新增的使用者,相关的指令执行结果如下:

[rockylinux@workstation ~]$ id
uid=1000(rockylinux) gid=1000(rockylinux) groups=1000(rockylinux),10(wheel) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[rockylinux@workstation ~]$

从上面的执行指令结果可以知道,利用id指令可以输出所以有的使用者资讯,还有group资讯等,而利用ls -l这个指令则可以查看目前使用者目录的拥有者,相关的输出如下:

[rockylinux@workstation ~]$ ls -l ~
total 8
drwxr-xr-x. 2 rockylinux rockylinux    6 Sep 18 00:05 Desktop
drwxr-xr-x. 2 rockylinux rockylinux    6 Sep 18 00:05 Documents
drwxr-xr-x. 2 rockylinux rockylinux    6 Sep 18 00:05 Downloads
-rw-rw-r--. 1 rockylinux rockylinux   81 Sep 23 00:36 home_list.txt
drwxr-xr-x. 2 rockylinux rockylinux    6 Sep 18 00:05 Music
drwxr-xr-x. 2 rockylinux rockylinux 4096 Sep 19 20:58 Pictures
drwxr-xr-x. 2 rockylinux rockylinux    6 Sep 18 00:05 Public
drwxr-xr-x. 2 rockylinux rockylinux    6 Sep 18 00:05 Templates
drwxr-xr-x. 2 rockylinux rockylinux    6 Sep 18 00:05 Videos

从上面的输出讯息可以知道,从左边过来的第一个rockylinux是这个拥有这个档案或是目录权限的使用者,第二个则是拥有档案与附录权限的群组名称,预设如果使用者没有加入到群组,则预设的群组名称为自己的的使用者名称,接着可以使用ps -au来查看是哪个使用者正在运行什麽程序process,相关的指令执行结果输出如下:

[rockylinux@workstation ~]$ ps -au
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
gdm         1507  0.0  0.7 340368 13276 tty1     Ssl+ 23:10   0:00 /usr/libexec/gdm-wayland-session --regist
gdm         1752  0.0  0.9 732300 17076 tty1     Sl+  23:10   0:00 /usr/libexec/gnome-session-binary --autos
gdm         1780  1.7 13.8 3169092 257556 tty1   Sl+  23:10   0:09 /usr/bin/gnome-shell
gdm         1798  0.0  2.6 855868 48524 tty1     Sl+  23:10   0:00 /usr/bin/Xwayland :1024 -rootless -termin
gdm         1822  0.0  0.6 389048 11300 tty1     Sl   23:10   0:00 ibus-daemon --xim --panel disable
gdm         1825  0.0  0.4 302808  8560 tty1     Sl   23:10   0:00 /usr/libexec/ibus-dconf
gdm         1828  0.0  3.3 1131200 62708 tty1    Sl   23:10   0:00 /usr/libexec/ibus-x11 --kill-daemon
gdm         1872  0.0  1.3 524216 25784 tty1     Sl+  23:10   0:00 /usr/libexec/gsd-xsettings
gdm         1874  0.0  0.7 301636 14872 tty1     Sl+  23:10   0:00 /usr/libexec/gsd-a11y-settings
gdm         1877  0.0  1.2 373376 23904 tty1     Sl+  23:10   0:00 /usr/libexec/gsd-clipboard
gdm         1878  0.0  1.3 686912 25340 tty1     Sl+  23:10   0:00 /usr/libexec/gsd-color
gdm         1880  0.0  0.8 384004 16244 tty1     Sl+  23:10   0:00 /usr/libexec/gsd-datetime
gdm         1881  0.0  0.4 305936  7828 tty1     Sl+  23:10   0:00 /usr/libexec/gsd-housekeeping
gdm         1882  0.0  1.3 523148 24240 tty1     Sl+  23:10   0:00 /usr/libexec/gsd-keyboard
gdm         1887  0.0  1.4 1186416 27460 tty1    Sl+  23:10   0:00 /usr/libexec/gsd-media-keys
gdm         1889  0.0  0.3 225632  7432 tty1     Sl+  23:10   0:00 /usr/libexec/gsd-mouse
gdm         1891  0.0  1.3 547980 25968 tty1     Sl+  23:10   0:00 /usr/libexec/gsd-power
gdm         1897  0.0  0.5 277640  9964 tty1     Sl+  23:10   0:00 /usr/libexec/gsd-print-notifications
gdm         1901  0.0  0.4 230388  8208 tty1     Sl+  23:10   0:00 /usr/libexec/gsd-rfkill
gdm         1904  0.0  0.4 299372  7596 tty1     Sl+  23:10   0:00 /usr/libexec/gsd-screensaver-proxy
gdm         1908  0.0  0.4 307900  9080 tty1     Sl+  23:10   0:00 /usr/libexec/gsd-sharing
gdm         1917  0.0  0.6 474480 12508 tty1     Sl+  23:10   0:00 /usr/libexec/gsd-smartcard
gdm         1926  0.0  0.7 367188 13196 tty1     Sl+  23:10   0:00 /usr/libexec/gsd-sound
gdm         1930  0.0  1.2 510144 24156 tty1     Sl+  23:10   0:00 /usr/libexec/gsd-wacom
gdm         1988  0.0  0.4 229116  8312 tty1     Sl   23:10   0:00 /usr/libexec/ibus-engine-simple
rockyli+    2104  0.0  0.3  25564  5612 pts/0    Ss   23:13   0:00 -bash
rockyli+    2243  0.0  0.2  58728  4028 pts/0    R+   23:19   0:00 ps -au

从上面的输出讯息来看,可以看到有一个gdm使用者执行了非常多的程序process,那这个gdm使用者其实就是系统使用者,原因是这个使用者专门执行一些跟GNOME桌面环境有关的程序,因此这个使用者也是不会允许登入做使用的,为了验证这件事情,可以使用cat /etc/passwd | grep gdm这个指令来做到,这边多了一个新的指令叫做grepgrep这个指令是用来找寻指定在标准输入中的字串关键字或是特殊的字串形式用的,关於这个指令更多的用法语详细介绍,会在之後的章节做说明,接着这个指令执行之後,会得到下列的结果:

[rockylinux@workstation ~]$ cat /etc/passwd | grep gdm
gdm:x:42:42::/var/lib/gdm:/sbin/nologin

从/etc/passwd档案中定义gdm使用者不能够登入,就可以验证这个使用者是归类为系统使用者。所有有关於使用者的一些资讯都会存放在/etc/passwd档案里面,而群组的资讯则会存放在/etc/group之档案里,每一个资讯都会以冒号来隔开,像以gdm:x:42:42::/var/lib/gdm:/sbin/nologin这个为例,此使用者从左至右解读的资讯如下:

  • gdm指的是使用者名称。
  • 这里的栏位是使用者的密码,x是使用者已经做过杂凑之後并存放到/etc/shadow之档案里面,所以这边栏位永远都会显示成x
  • 42指的是user使用者之id,这是给作业系统看的。
  • 42指的是group群组的id,这是给作业统看的。
  • 这边是一个空白,这个栏位是可选的,通常会视填入这个使用者的真实姓名。
  • /var/lib/gdm指的是这个使用者的家目录,也是当shell启动的时候一开始会切换到的工作目录。
  • /sbin/login指的是预设启动的shell,因为gdm是被作业系统指定为系统使用者,因此这边不被允许登入shell,因此显示成/sbin/nologin,不被允许也可以显示成/usr/bin/false,一般都会选择/bin/bash作为使用者启动的shell,像是rockylinux就是一个一般使用者的资讯:rockylinux:x:1000:1000:rockylinux:/home/rockylinux:/bin/bash

什麽是群组?

从简单的意思上来说,使用者多了之後,可以把使用者做一个分组,那这个组可以视为一个群体,那就可以称做群组,通常会有群组的出现是因为,有些功能上在存取目录或是档案需要用群组来指定分享,那用群体的方式指定会比逐一一个使用者指定来的方便与有效率,而有关於群组的资讯会存放在/etc/group之档案里面,而/etc/gshadow则是存放有关於群组的一些杂凑过的资讯,在/etc/group之档案中,会用冒号将每个区块的资讯隔开,以下列的群组资讯为例:

groupl:x:10:user1,user2,user3

从上述的群组资讯来看,由左至右的解释如下:

  • group1指的是群组的名称。
  • 这个栏位是群组的密码,当gshadow启用的时候,这里的栏位永远都是x
  • 10代表的是群组的id,即group id的意思。
  • 这里表示有多少的使用者在这个群组,每一个使用者以逗号隔开。

主要群组与次要群组

一个使用者可以在多个群组中出现,主要群组就是指每个使用者都有一个相同名称的群组,而在其他非与使用者相同名字的群组则是指次要群组。这个可以从id这个指令看的出来:

[rockylinux@workstation ~]$ id
uid=1000(rockylinux) gid=1000(rockylinux) groups=1000(rockylinux),10(wheel) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

从上面输出的讯息中,groups这个地方里面有两个群组,第一个群组与rockylinux这个使用者相同,即主要群组,而之後以逗号隔开的每个群组都是次要群组,以上述输出的讯息为例,次要群组则为wheel这个群组。

使用者与群组密码

在上面的几个小节中都有提到使用者与群组的密码都分别存放在/etc/shadow/etc/gshadow之档案里面,而档案存放的格式以杂凑过的字串为主,相关的档案,如/etc/shadow之输出如下:

[rockylinux@workstation ~]$ su - root
Password:
[root@workstation ~]#
[root@workstation ~]# cat /etc/shadow
root:$6$P1ovT7ZGnrywqhIl$zDuaMQBGwMmtCvDLnmeViQYXG4DU3S25zqWoX5Wos5uVsaBbLfnNYqDs0iHOE3OkT0lsIfnBJCpbnKuIloUbk0::0:99999:7:::
bin:*:18700:0:99999:7:::
daemon:*:18700:0:99999:7:::
adm:*:18700:0:99999:7:::
lp:*:18700:0:99999:7:::
sync:*:18700:0:99999:7:::
shutdown:*:18700:0:99999:7:::
halt:*:18700:0:99999:7:::
mail:*:18700:0:99999:7:::
operator:*:18700:0:99999:7:::
games:*:18700:0:99999:7:::
ftp:*:18700:0:99999:7:::
nobody:*:18700:0:99999:7:::
dbus:!!:18887::::::
systemd-coredump:!!:18887::::::
systemd-resolve:!!:18887::::::
tss:!!:18887::::::
polkitd:!!:18887::::::
geoclue:!!:18887::::::
rtkit:!!:18887::::::
pipewire:!!:18887::::::
pulse:!!:18887::::::
libstoragemgmt:!!:18887::::::
qemu:!!:18887::::::
clevis:!!:18887::::::
usbmuxd:!!:18887::::::
unbound:!!:18887::::::
gluster:!!:18887::::::
rpc:!!:18887:0:99999:7:::
avahi:!!:18887::::::
setroubleshoot:!!:18887::::::
saslauth:!!:18887::::::
dnsmasq:!!:18887::::::
radvd:!!:18887::::::
sssd:!!:18887::::::
cockpit-ws:!!:18887::::::
cockpit-wsinstance:!!:18887::::::
chrony:!!:18887::::::
flatpak:!!:18887::::::
colord:!!:18887::::::
rpcuser:!!:18887::::::
gdm:!!:18887::::::
gnome-initial-setup:!!:18887::::::
sshd:!!:18887::::::
tcpdump:!!:18887::::::
rockylinux:$6$5EddOY.CFXScF6wK$yb3Y2wvppSaRcW199JYfEhltc5CkEMgx/3FljbuxS4zpBj.8deBFjMzf03q8dIJWagePqjWe7lwxIRzEN4Tfn0:18889:0:99999:7:::

从上面的输出讯息可以知道,这两个存放密码档案一般来说只能是最高权限使用者才可以进行存取,因此需要先切换成最高权限使用者的帐号之後,再使用cat指令进行相关的档案输出,可以发现到密码的字串皆以凑的方式表示,而可以使用pwconv指令将/etc/passwd档案的密码搬到/etc/shadow档案中,而pwunconv则是相反,将/etc/shadow档案中储存的密码搬到/etc/passwd并删除/etc/shadow档案,则可以得到下列的输出:

[root@workstation ~]# pwunconv
[root@workstation ~]# cat /etc/passwd
root:$6$P1ovT7ZGnrywqhIl$zDuaMQBGwMmtCvDLnmeViQYXG4DU3S25zqWoX5Wos5uVsaBbLfnNYqDs0iHOE3OkT0lsIfnBJCpbnKuIloUbk0:0:0:root:/root:/bin/bash
bin:*:1:1:bin:/bin:/sbin/nologin
daemon:*:2:2:daemon:/sbin:/sbin/nologin
adm:*:3:4:adm:/var/adm:/sbin/nologin
lp:*:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:*:5:0:sync:/sbin:/bin/sync
shutdown:*:6:0:shutdown:/sbin:/sbin/shutdown
halt:*:7:0:halt:/sbin:/sbin/halt
mail:*:8:12:mail:/var/spool/mail:/sbin/nologin
operator:*:11:0:operator:/root:/sbin/nologin
games:*:12:100:games:/usr/games:/sbin/nologin
ftp:*:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:*:65534:65534:Kernel Overflow User:/:/sbin/nologin
dbus:!!:81:81:System message bus:/:/sbin/nologin
systemd-coredump:!!:999:997:systemd Core Dumper:/:/sbin/nologin
systemd-resolve:!!:193:193:systemd Resolver:/:/sbin/nologin
tss:!!:59:59:Account used for TPM access:/dev/null:/sbin/nologin
polkitd:!!:998:996:User for polkitd:/:/sbin/nologin
geoclue:!!:997:995:User for geoclue:/var/lib/geoclue:/sbin/nologin
rtkit:!!:172:172:RealtimeKit:/proc:/sbin/nologin
pipewire:!!:996:992:PipeWire System Daemon:/var/run/pipewire:/sbin/nologin
pulse:!!:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
libstoragemgmt:!!:995:989:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin
qemu:!!:107:107:qemu user:/:/sbin/nologin
clevis:!!:994:988:Clevis Decryption Framework unprivileged user:/var/cache/clevis:/sbin/nologin
usbmuxd:!!:113:113:usbmuxd user:/:/sbin/nologin
unbound:!!:993:987:Unbound DNS resolver:/etc/unbound:/sbin/nologin
gluster:!!:992:986:GlusterFS daemons:/run/gluster:/sbin/nologin
rpc:!!:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
avahi:!!:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
setroubleshoot:!!:991:984::/var/lib/setroubleshoot:/sbin/nologin
saslauth:!!:990:76:Saslauthd user:/run/saslauthd:/sbin/nologin
dnsmasq:!!:983:983:Dnsmasq DHCP and DNS server:/var/lib/dnsmasq:/sbin/nologin
radvd:!!:75:75:radvd user:/:/sbin/nologin
sssd:!!:982:982:User for sssd:/:/sbin/nologin
cockpit-ws:!!:981:980:User for cockpit web service:/nonexisting:/sbin/nologin
cockpit-wsinstance:!!:980:979:User for cockpit-ws instances:/nonexisting:/sbin/nologin
chrony:!!:979:978::/var/lib/chrony:/sbin/nologin
flatpak:!!:978:977:User for flatpak system helper:/:/sbin/nologin
colord:!!:977:976:User for colord:/var/lib/colord:/sbin/nologin
rpcuser:!!:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
gdm:!!:42:42::/var/lib/gdm:/sbin/nologin
gnome-initial-setup:!!:976:975::/run/gnome-initial-setup/:/sbin/nologin
sshd:!!:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tcpdump:!!:72:72::/:/sbin/nologin
rockylinux:$6$PPjj5FZ1HiJa1Wsl$9SIRj2kUaBoHrwKUILn7id1EdlKGI0BR3NV4gMlfmCY5qTuR2Fp5wx2lS1J1JCeboIV1HC8MadwHmDpHEGYaA1:1000:1000:rockylinux:/home/rockylinux:/bin/bash
[root@workstation ~]# ls /etc/shadow
ls: cannot access '/etc/shadow': No such file or directory

从上述的讯息输出可以发现所有的杂凑密码都搬到/etc/passwd档案了,请注意!笔者是为了要展示这个密码储存的原理,在实务上请不要使用pwunconv并确保密码储存在/etc/shadow档案里面,原因是/etc/passwd只要是正常的一般使用者皆可以读取,杂凑的密码容易受到字典攻击而遭到破解,因此在实务上都会使用pwconv指令将密码存放到/etc/shadow中,预设作业系统也是这样做,同样的,group群组的gshadow之grpconvgrpunconv也有一样的效果,这边笔者就不多做说明了。

杂凑介绍

前面的几个小章节有提到杂凑,那杂凑是什麽?笔者使用下列的小图示来做说明:

hash

从上面的图示可以知道,当输入明文:rockylinux时候,经过SHA-512这个演算法杂凑之後的结果会得到***,这边先以这样的字串表示计算後的结果,那上述的整个一系列过程,就称为杂凑。

课後练习

  • 请开启workstation虚拟机,并以rockylinux使用者身分登入到终端机。
  • 以这章节所提到的方式,找到三种不同的类型使用者。
  • 找到rockylinux使用者所在的群组有哪些。
  • 找到rockylinux使用者有关的资讯,如user id、开始的shell等。

<<:  Day9:今天来讲一下Microsoft Defender for Endpoint的装置调查

>>:  [Day16] Vite 出小蜜蜂~ Text 文字!

Day3 Pipeline 如何做版本控制 - NiFi Registry

前面已经大概介绍了一下 NiFi 的用途还有特性,那今天就来讲在 NiFi 中,其实是可以对一组 D...

Day-28 手把手的手写辨识模型 0x3:CNN is the end?模型大哉问

快到结尾了,再让笔者水一篇 XDD,今天我们来聊聊 CNN 会不会是深度学习领域的最後呢? CNN...

python RNN 实现八位元的二进制数加法运算

import copy, numpy as np np.random.seed(0) # compu...

DAY 27 文章列表

嗨,今天来完成底下文章的部分,金嗨,内容越写越多,因为快要完赛了节奏没抓好XD,前面都是分开解析的,...

Python 做自动化编译 相关指令汇整

有些公司因为历史原因 在Build react,vue,npm等相关专案 需经过 前置的处理作业 这...