管理 Linux 系統中的用戶
也許你的 Linux 用戶並不是憤怒的公牛,但是當涉及管理他們的賬戶的時候,能讓他們一直滿意也是一種挑戰。你需要監控他們的訪問許可權,跟進他們遇到問題時的解決方案,並且把他們在使用系統時出現的重要變動記錄下來。這裡有一些方法和工具可以讓這個工作輕鬆一點。
配置賬戶
添加和刪除賬戶是管理用戶中比較簡單的一項,但是這裡面仍然有很多需要考慮的方面。無論你是用桌面工具或是命令行選項,這都是一個非常自動化的過程。你可以使用 adduser jdoe
命令添加一個新用戶,同時會觸發一系列的反應。在創建 John 這個賬戶時會自動使用下一個可用的 UID,並有很多自動生成的文件來完成這個工作。當你運行 adduser
後跟一個參數時(要創建的用戶名),它會提示一些額外的信息,同時解釋這是在幹什麼。
$ sudo adduser jdoe
Adding user 'jdoe' ...
Adding new group `jdoe' (1001) ...
Adding new user `jdoe' (1001) with group `jdoe' ...
Creating home directory `/home/jdoe' ...
Copying files from `/etc/skel' …
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for jdoe
Enter the new value, or press ENTER for the default
Full Name []: John Doe
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n] Y
如你所見,adduser
會添加用戶的信息(到 /etc/passwd
和 /etc/shadow
文件中),創建新的 家目錄 ,並用 /etc/skel
里設置的文件填充家目錄,提示你分配初始密碼和認證信息,然後確認這些信息都是正確的,如果你在最後的提示 「Is the information correct?」 處的回答是 「n」,它會回溯你之前所有的回答,允許修改任何你想要修改的地方。
創建好一個用戶後,你可能會想要確認一下它是否是你期望的樣子,更好的方法是確保在添加第一個帳戶之前,「自動」選擇與你想要查看的內容是否匹配。默認有默認的好處,它對於你想知道他們定義在哪裡很有用,以便你想做出一些變動 —— 例如,你不想讓用戶的家目錄在 /home
里,你不想讓用戶 UID 從 1000 開始,或是你不想讓家目錄下的文件被系統中的每個人都可讀。
adduser
的一些配置細節設置在 /etc/adduser.conf
文件里。這個文件包含的一些配置項決定了一個新的賬戶如何配置,以及它之後的樣子。注意,注釋和空白行將會在輸出中被忽略,因此我們更關注配置項。
$ cat /etc/adduser.conf | grep -v "^#" | grep -v "^$"
DSHELL=/bin/bash
DHOME=/home
GROUPHOMES=no
LETTERHOMES=no
SKEL=/etc/skel
FIRST_SYSTEM_UID=100
LAST_SYSTEM_UID=999
FIRST_SYSTEM_GID=100
LAST_SYSTEM_GID=999
FIRST_UID=1000
LAST_UID=29999
FIRST_GID=1000
LAST_GID=29999
USERGROUPS=yes
USERS_GID=100
DIR_MODE=0755
SETGID_HOME=no
QUOTAUSER=""
SKEL_IGNORE_REGEX="dpkg-(old|new|dist|save)"
可以看到,我們有了一個默認的 shell(DSHELL
),UID(FIRST_UID
)的起始值,家目錄(DHOME
)的位置,以及啟動文件(SKEL
)的來源位置。這個文件也會指定分配給家目錄(DIR_HOME
)的許可權。
其中 DIR_HOME
是最重要的設置,它決定了每個家目錄被使用的許可權。這個設置分配給用戶創建的目錄許可權是 755,家目錄的許可權將會設置為 rwxr-xr-x
。用戶可以讀其他用戶的文件,但是不能修改和移除它們。如果你想要更多的限制,你可以更改這個設置為 750(用戶組外的任何人都不可訪問)甚至是 700(除用戶自己外的人都不可訪問)。
任何用戶賬號在創建之前都可以進行手動修改。例如,你可以編輯 /etc/passwd
或者修改家目錄的許可權,開始在新伺服器上添加用戶之前配置 /etc/adduser.conf
可以確保一定的一致性,從長遠來看可以節省時間和避免一些麻煩。
/etc/adduser.conf
的修改將會在之後創建的用戶上生效。如果你想以不同的方式設置某個特定賬戶,除了用戶名之外,你還可以選擇使用 adduser
命令提供賬戶配置選項。或許你想為某些賬戶分配不同的 shell,分配特殊的 UID,或完全禁用該賬戶登錄。adduser
的幫助頁將會為你顯示一些配置個人賬戶的選擇。
adduser [options] [--home DIR] [--shell SHELL] [--no-create-home]
[--uid ID] [--firstuid ID] [--lastuid ID] [--ingroup GROUP | --gid ID]
[--disabled-password] [--disabled-login] [--gecos GECOS]
[--add_extra_groups] [--encrypt-home] user
每個 Linux 系統現在都會默認把每個用戶放入對應的組中。作為一個管理員,你可能會選擇以不同的方式。你也許會發現把用戶放在一個共享組中更適合你的站點,你就可以選擇使用 adduser
的 --gid
選項指定一個特定的組。當然,用戶總是許多組的成員,因此也有一些選項來管理主要和次要的組。
處理用戶密碼
一直以來,知道其他人的密碼都不是一件好事,在設置賬戶時,管理員通常使用一個臨時密碼,然後在用戶第一次登錄時運行一條命令強制他修改密碼。這裡是一個例子:
$ sudo chage -d 0 jdoe
當用戶第一次登錄時,會看到類似下面的提示:
WARNING: Your password has expired.
You must change your password now and login again!
Changing password for jdoe.
(current) UNIX password:
添加用戶到副組
添加用戶到副組中,你可能會用如下所示的 usermod
命令添加用戶到組中並確認已經做出變動。
$ sudo usermod -a -G sudo jdoe
$ sudo grep sudo /etc/group
sudo:x:27:shs,jdoe
記住在一些組意味著特別的許可權,如 sudo 或者 wheel 組,一定要特別注意這一點。
移除用戶,添加組等
Linux 系統也提供了移除賬戶,添加新的組,移除組等一些命令。例如,deluser
命令,將會從 /etc/passwd
和 /etc/shadow
中移除用戶記錄,但是會完整保留其家目錄,除非你添加了 --remove-home
或者 --remove-all-files
選項。addgroup
命令會添加一個組,默認按目前組的次序分配下一個 id(在用戶組範圍內),除非你使用 --gid
選項指定 id。
$ sudo addgroup testgroup --gid=131
Adding group `testgroup' (GID 131) ...
Done.
管理特權賬戶
一些 Linux 系統中有一個 wheel 組,它給組中成員賦予了像 root 一樣運行命令的許可權。在這種情況下,/etc/sudoers
將會引用該組。在 Debian 系統中,這個組被叫做 sudo,但是原理是相同的,你在 /etc/sudoers
中可以看到像這樣的信息:
%sudo ALL=(ALL:ALL) ALL
這行基本的配置意味著任何在 wheel 或者 sudo 組中的成員只要在他們運行的命令之前添加 sudo
,就可以以 root 的許可權去運行命令。
你可以向 sudoers 文件中添加更多有限的許可權 —— 也許給特定用戶幾個能以 root 運行的命令。如果你是這樣做的,你應該定期查看 /etc/sudoers
文件以評估用戶擁有的許可權,以及仍然需要提供的許可權。
在下面顯示的命令中,我們過濾了 /etc/sudoers
中有效的配置行。其中最有意思的是,它包含了能使用 sudo
運行命令的路徑設置,以及兩個允許通過 sudo
運行命令的組。像剛才提到的那樣,單個用戶可以通過包含在 sudoers 文件中來獲得許可權,但是更有實際意義的方法是通過組成員來定義各自的許可權。
# cat /etc/sudoers | grep -v "^#" | grep -v "^$"
Defaults env_reset
Defaults mail_badpass
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
root ALL=(ALL:ALL) ALL
%admin ALL=(ALL) ALL <== admin group
%sudo ALL=(ALL:ALL) ALL <== sudo group
登錄檢查
你可以通過以下命令查看用戶的上一次登錄:
# last jdoe
jdoe pts/18 192.168.0.11 Thu Sep 14 08:44 - 11:48 (00:04)
jdoe pts/18 192.168.0.11 Thu Sep 14 13:43 - 18:44 (00:00)
jdoe pts/18 192.168.0.11 Thu Sep 14 19:42 - 19:43 (00:00)
如果你想查看每一個用戶上一次的登錄情況,你可以通過一個像這樣的循環來運行 last
命令:
$ for user in `ls /home`; do last $user | head -1; done
jdoe pts/18 192.168.0.11 Thu Sep 14 19:42 - 19:43 (00:03)
rocket pts/18 192.168.0.11 Thu Sep 14 13:02 - 13:02 (00:00)
shs pts/17 192.168.0.11 Thu Sep 14 12:45 still logged in
此命令僅顯示自當前 wtmp 文件登錄過的用戶。空白行表示用戶自那以後從未登錄過,但沒有將他們顯示出來。一個更好的命令可以明確地顯示這期間從未登錄過的用戶:
$ for user in `ls /home`; do echo -n "$user"; last $user | head -1 | awk '{print substr($0,40)}'; done
dhayes
jdoe pts/18 192.168.0.11 Thu Sep 14 19:42 - 19:43
peanut pts/19 192.168.0.29 Mon Sep 11 09:15 - 17:11
rocket pts/18 192.168.0.11 Thu Sep 14 13:02 - 13:02
shs pts/17 192.168.0.11 Thu Sep 14 12:45 still logged
tsmith
這個命令要打很多字,但是可以通過一個腳本使它更加清晰易用。
#!/bin/bash
for user in `ls /home`
do
echo -n "$user ";last $user | head -1 | awk '{print substr($0,40)}'
done
有時這些信息可以提醒你用戶角色的變動,表明他們可能不再需要相關帳戶了。
與用戶溝通
Linux 提供了許多和用戶溝通的方法。你可以向 /etc/motd
文件中添加信息,當用戶從終端登錄到伺服器時,將會顯示這些信息。你也可以通過例如 write
(通知單個用戶)或者 wall
(write 給所有已登錄的用戶)命令發送通知。
$ wall System will go down in one hour
Broadcast message from shs@stinkbug (pts/17) (Thu Sep 14 14:04:16 2017):
System will go down in one hour
重要的通知應該通過多個渠道傳達,因為很難預測用戶實際會注意到什麼。mesage-of-the-day(motd),wall
和 email 通知可以吸引用戶大部分的注意力。
注意日誌文件
多注意日誌文件也可以幫你理解用戶的活動情況。尤其 /var/log/auth.log
文件將會顯示用戶的登錄和註銷活動,組的創建記錄等。/var/log/message
或者 /var/log/syslog
文件將會告訴你更多有關係統活動的日誌。
追蹤問題和需求
無論你是否在 Linux 系統上安裝了事件跟蹤系統,跟蹤用戶遇到的問題以及他們提出的需求都非常重要。如果需求的一部分久久不見回應,用戶必然不會高興。即使是記錄在紙上也是有用的,或者最好有個電子表格,這可以讓你注意到哪些問題仍然懸而未決,以及問題的根本原因是什麼。確認問題和需求非常重要,記錄還可以幫助你記住你必須採取的措施來解決幾個月甚至幾年後重新出現的問題。
總結
在繁忙的伺服器上管理用戶帳號,部分取決於配置良好的默認值,部分取決於監控用戶活動和遇到的問題。如果用戶覺得你對他們的顧慮有所回應並且知道在需要系統升級時會發生什麼,他們可能會很高興。
via: https://www.networkworld.com/article/3225109/linux/managing-users-on-linux-systems.html
作者:Sandra Henry-Stocker 譯者:dianbanjiu 校對:wxy、pityonline
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive