作者 | David Both
譯者 | lujun9972
學習怎麼在保護 root 密碼的安全性的同時,為可信使用者賦予所管理的網路功能和特定服務的許可權。
我最近寫了一個簡短的 Bash 程式來將 MP3 檔案從一臺網路主機的 USB 盤中複製到另一臺網路主機上去。複製出來的檔案存放在一臺志願者組織所屬伺服器的特定目錄下,在那裡,這些檔案可以被下載和播放。
我的程式還會做些其他事情,比如為了自動在網頁上根據日期排序,在複製檔案之前會先對這些檔案重新命名。在驗證複製完成後,還會刪掉 USB 盤中的所有檔案。這個小程式還有一些其他選項,比如 -h
會顯示幫助, -t
進入測試樣式等等。
我的程式需要以 root 執行才能發揮作用。然而,這個組織中之後很少的人對管理音訊和計算機系統有興趣的,這使得我不得不找那些半吊子的人來,並培訓他們登入到用於傳輸的計算機,執行這個小程式。
倒不是說我不能親自執行這個程式,但由於外出和疾病等等各種原因, 我不是時常在場的。 即使我在場,作為一名 “懶惰的系統管理員”, 我也希望別人能替我把事情給做了。 因此我寫了一些指令碼來自動完成這些任務並透過 sudo
來指定某些人來執行這些指令碼。 很多 Linux 命令都需要使用者以 root 身份來執行。 sudo
能夠保護系統免遭一時糊塗造成的意外損壞以及惡意使用者的故意破壞。
盡可能的使用 sudo
sudo
是一個很方便的工具,它讓我一個具有 root 許可權的管理員可以分配所有或者部分管理性的任務給其他使用者, 而且還無需告訴他們 root 密碼, 從而保證主機的高安全性。
假設,我給了普通使用者 ruser
訪問我 Bash 程式 myprog
的許可權, 而這個程式的部分功能需要 root 許可權。 那麼該使用者可以以 ruser
的身份登入,然後透過以下命令執行 myprog
。
sudo myprog
sudo
程式會檢查 /etc/sudoers
檔案,並確認 ruser
是否被許可執行 myprog
。如被許可,sudo
會要求該使用者輸入其密碼——而非 root 密碼。在 ruser
輸入他的密碼之後,該程式就運行了。此外,sudo
也記錄 myprog
該程式執行的日期和時間、完整的命令,以及誰在執行它。這個資料會記錄在 /var/log/security
中。
我發現在培訓時記錄下每個用 sudo
執行的命令會很有幫助。我可以看到誰執行了哪些命令,他們是否輸對了。
我委派了許可權給自己和另一個人來執行那一個程式;然而,sudo
可以做更多的事情。 它允許系統管理員委派所管理的網路功能或特定的服務給某個受信的人或某組人。這可以讓你在保護了 root 密碼的安全性的同時,也賦予了那些功能。
配置 sudoers 檔案
作為一名系統管理員,我使用 /etc/sudoers
檔案來設定某些使用者或某些使用者組可以訪問某個命令,或某組命令,或所有命令。 這種靈活性是使用 sudo
進行委派時能兼顧功能與簡易性的關鍵。
我一開始對 sudoers
檔案感到很困惑,因此下麵我會複製並分解我所使用主機上的完整 sudoers
檔案。 希望在分析的過程中不會讓你感到困惑。 我意外地發現, 基於 Red Hat 的發行版中預設的配置檔案都會很多註釋以及例子來指導你如何做出修改,這使得修改配置檔案變得簡單了很多,也不需要在網際網路上搜索那麼多東西了。
不要直接用編輯器來修改 sudoers
檔案,而應該用 visudo
命令,因為該命令會在你儲存並退出編輯器後就立即生效這些變更。 visudo
也可以使用除了 Vi 之外的其他編輯器。
讓我們首先來分析一下檔案中的各種別名。
主機別名
主機別名這一節用於建立主機分組,授予該組主機可以訪問哪些命令或命令別名。 它的基本思想是,該檔案由組織中的所有主機共同維護,然後複製到每臺主機中的 /etc
中。 其中有些主機, 例如各種伺服器, 可以配置成一個組來賦予使用者訪問特定命令的許可權, 比如可以啟停類似 HTTPD、DNS 以及網路服務;可以掛載檔案系統等等。
在設定主機別名時也可以用 IP 地址替代主機名。
## Host Aliases
## Groups of machines. You may prefer to use hostnames (perhaps using
## wildcards for entire domains) or IP addresses instead.
# Host_Alias FILESERVERS = fs1, fs2
# Host_Alias MAILSERVERS = smtp, smtp2
使用者別名
使用者別名允許 root 將使用者整理成別名組中,並按組來分配特定的 root 許可權。在這部分內容中我加了一行 User_Alias AUDIO = dboth, ruser
,定義了一個別名 AUDIO
用來指代了兩個使用者。
正如 sudoers
檔案中所闡明的,也可以直接使用 /etc/groups
中定義的組而不用自己設定別名。 如果你定義好的組(假設組名為 audio
)已經能滿足要求了, 那麼在後面分配命令時只需要在組名前加上 %
號,像這樣: %audio
。
## User Aliases
## These aren't often necessary, as you can use regular groups
## (ie, from files, LDAP, NIS, etc) in this file - just use %groupname
## rather than USERALIAS
# User_Alias ADMINS = jsmith, mikem
User_Alias AUDIO = dboth, ruser
命令別名
再後面是命令別名的部分。這些別名錶示的是一系列相關的命令, 比如網路相關命令,或者 RPM 包管理命令。 這些別名允許系統管理員方便地為一組命令分配許可權。
該部分內容已經設定好了許多別名,這使得分配許可權給某類命令變得方便很多。
## Command Aliases
## These are groups of related commands...
## Networking
# Cmnd_Alias NETWORKING = /sbin/route, /sbin/ifconfig, /bin/ping, /sbin/dhclient, /usr/bin/net, /sbin/iptables, /usr/bin/rfcomm, /usr/bin/wvdial, /sbin/iwconfig, /sbin/mii-tool
## Installation and management of software
# Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/up2date, /usr/bin/yum
## Services
# Cmnd_Alias SERVICES = /sbin/service, /sbin/chkconfig
## Updating the locate database
# Cmnd_Alias LOCATE = /usr/bin/updatedb
## Storage
# Cmnd_Alias STORAGE = /sbin/fdisk, /sbin/sfdisk, /sbin/parted, /sbin/partprobe, /bin/mount, /bin/umount
## Delegating permissions
# Cmnd_Alias DELEGATING = /usr/sbin/visudo, /bin/chown, /bin/chmod, /bin/chgrp
## Processes
# Cmnd_Alias PROCESSES = /bin/nice, /bin/kill, /usr/bin/kill, /usr/bin/killall
## Drivers
# Cmnd_Alias DRIVERS = /sbin/modprobe
環境預設值
下麵部分內容設定預設的環境變數。這部分最值得關註的是 !visiblepw
這一行, 它表示當使用者環境設定成顯示密碼時禁止 sudo
的執行。 這個安全措施不應該被修改掉。
# Defaults specification
#
# Refuse to run if unable to disable echo on the tty.
#
Defaults !visiblepw
Defaults env_reset
Defaults env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS"
Defaults env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE"
Defaults env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES"
Defaults env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE"
Defaults env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
命令部分
命令部分是 sudoers
檔案的主體。不使用別名並不會影響你完成要實現的效果,別名只是讓整個配置工作大幅簡化而已。
這部分使用之前定義的別名來告訴 sudo
哪些人可以在哪些機器上執行哪些操作。一旦你理解了這部分內容的語法,你會發現這些例子都非常的直觀。 下麵我們來看看它的語法。
ruser ALL=(ALL) ALL
意即 ruser
可以在任意主機上以任意使用者身份執行任意命令
這是一條為使用者 ruser
做出的配置。行中第一個 ALL
表示該條規則在所有主機上生效。 第二個 ALL
允許 ruser
以任意其他使用者的身份執行命令。 預設情況下, 命令以 root
使用者的身份執行, 但 ruser
可以在 sudo
命令列指定程式以其他使用者的身份執行。 最後這個 ALL
表示 ruser
可以執行所有命令而不受限制。 這讓 ruser
實際上就變成了 root
。
註意到下麵還有一條針對 root
的配置。這允許 root
能透過 sudo
在任何主機上執行任何命令。
root ALL=(ALL) ALL
意即 root
可以在任意主機上以任意使用者身份執行任意命令
為了實驗一下效果,我註釋掉了這行, 然後以 root 的身份試著直接執行 chown
。 出乎意料的是這樣是能成功的。 然後我試了下 sudo chown
,結果失敗了,提示資訊 “Root is not in the sudoers file。 This incident will be reported”。 也就是說 root 可以直接執行任何命令, 但當加上 sudo
時則不行。 這會阻止 root 像其他使用者一樣使用 sudo
命令來執行其他命令, 但是 root 有太多種方法可以繞過這個約束了。
下麵這行是我新增來控制訪問 myprog
的。它指定了只有上面定義的 AUDIO
組中的使用者才能在 guest1
這臺主機上使用 myprog
這個命令。
AUDIO guest1=/usr/local/bin/myprog
允許 AUDIO 組成員在 guest1 主機上訪問 myprog
註意,上面這一行只指定了允許訪問的主機名和程式,而沒有說使用者可以以其他使用者的身份來執行該程式。
省略密碼
你也可以透過 NOPASSWORD
來讓 AUDIO
組中的使用者無需密碼就能執行 myprog
。像這樣:
AUDIO guest1=NOPASSWORD : /usr/local/bin/myprog
允許 AUDIO 組成員在 guest1 主機上不用輸入密碼即可訪問 myprog
我並沒有這樣做,因為我覺得使用 sudo
的使用者必須要停下來想清楚他們正在做的事情,這對他們有好處。 我這裡只是舉個例子。
wheel
sudoers
檔案中命令部分的 wheel
說明(如下所示)允許所有在 wheel
組中的使用者在任何機器上執行任何命令。wheel
組在 /etc/group
檔案中定義, 使用者必須加入該組後才能工作。 組名前面的 %
符號表示 sudo
應該去 /etc/group
檔案中查詢該組。
%wheel ALL = (ALL) ALL
執行所有定義在 /etc/group 檔案中的 “wheel” 組成員可以在任意主機上執行全部命令
這種方法很好的實現了為多個使用者賦予完全的 root 許可權而不用提供 root 密碼。只需要把該使用者加入 wheel
組中就能給他們提供完整的 root 的能力。 它也提供了一種透過 sudo
建立的日誌來監控他們行為的途徑。 有些 Linux 發行版, 比如 Ubuntu, 會自動將使用者的 ID 加入 /etc/group
中的 wheel
組中, 這使得他們能夠用 sudo
命令執行所有的特權命令。
結語
我這裡只是小試了一把 sudo
— 我只是給一到兩個使用者以 root 許可權執行單個命令的許可權。完成這些只添加了兩行配置(不考慮註釋)。 將某項任務的許可權委派給其他非 root 使用者非常簡單,而且可以節省你大量的時間。 同時它還會產生日誌來幫你發現問題。
sudoers
檔案還有許多其他的配置和能力。檢視 sudo
和 sudoers
的 man 手冊可以深入瞭解詳細資訊。
via: https://opensource.com/article/17/12/using-sudo-delegate
作者:David Both[2] 譯者:lujun9972 校對:wxy
本文由 LCTT 原創編譯,Linux中國 榮譽推出