iT邦幫忙

2021 iThome 鐵人賽

DAY 8
0
IT管理

Rocky Linux 8:系統管理與維運實戰系列 第 8

第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等。

上一篇
第6章:基本操作文字檔案介紹
下一篇
第8章:管理本地端主機之使用者與群組(二)
系列文
Rocky Linux 8:系統管理與維運實戰23

尚未有邦友留言

立即登入留言