6個超實用的Sudo命令使用技巧

大雄45發表於2021-03-25
導讀 sudo 表示 “superuser do”,它允許已驗證的使用者以其他使用者的身份來執行 。其他使用者可以是普通使用者或者超級使用者。

6個超實用的Sudo命令使用技巧6個超實用的Sudo命令使用技巧

sudo 表示 “superuser do”,它允許已驗證的使用者以其他使用者的身份來執行 。其他使用者可以是普通使用者或者超級使用者。然而,大部分時候我們用它來提權執行命令,以替代直接使用 root 使用者的操作。sudo 命令與安全策略配合使用,安全策略可以透過檔案 /etc/sudoers 來配置。其安全策略具有高度可擴充性,支援外掛擴充套件。預設情況下 /etc/sudoers 是不能被任何人直接編輯的,因為它的許可權是 440,雖然也可以對其賦予寫許可權後再編輯,但推薦使用 visudo 命令編輯該檔案。

1. 工作模式理解

簡述其使用工作流程和配置檔案配置!

[1] 理解 sudo 命令的工作流程

sudo 會讀取和解析  /etc/sudoers 檔案,查詢呼叫命令的使用者及其許可權。

然後提示呼叫該命令的使用者輸入密碼,或者也可以透過 NOPASSWD 標誌來跳過密碼驗證。

之後,sudo 建立一個子程式,呼叫 setuid() 來切換到目標使用者。

最好,它會在上述子程式中執行引數給定的   或命令。

[2] 理解 sudo 命令授權配置
USER/GROUP HOST=(USER[:GROUP]) [NOPASSWD:] COMMANDS
USER/GROUP: 表示需要被授權的使用者或者組;如果是組則需要以 % 開頭
HOST: 表示允許從哪些主機登入的使用者執行 sudo 命令;ALL 表示允許從任何終端、機器訪問
(USER[:GROUP]): 表示使用 sudo 可切換的使用者或者組,組可以不指定;ALL 表示可以切換到系統的所有使用者
NOPASSWD: 如果指定,則該使用者或組使用 sudo 時不必輸入密碼
COMMANDS: 表示執行指定的命令;ALL 表示允許執行所有命令
# 允許 sudo 組執行所有命令
%sudo ALL=(ALL:ALL) ALL
# 允許使用者執行所有命令,且無需輸入密碼
escape ALL =(ALL) NOPASSWD: ALL
# 僅允許使用者執行 echo, ls 命令
escape ALL =(ALL) NOPASSWD: /bin/echo /bin/ls
# 執行本機的使用者執行關機命令
escape localhost=/sbin/shutdown -h now
# 允許 users 使用者組中的使用者像 root 使用者一樣使用 mount、unmount、chrom 命令
%users ALL=/sbin/mount /mnt/cdrom, /sbin/umount /mnt/cdrom
[3] 配置 Defaults 選項
# 指定使用者嘗試輸入密碼的次數,預設值為3
Defaults passwd_tries=5# 設定密碼超時時間,預設為 5 分鐘
Defaults passwd_timeout=2預設 sudo 詢問使用者自己的密碼,新增 targetpw 或 rootpw 配置可以讓 sudo 詢問 root 密碼
Defaults targetpw
# 指定自定義日誌檔案
Defaults logfile="/var/log/sudo.log"# 要在自定義日誌檔案中記錄主機名和四位數年份,可以加上 log_host 和 log_year 引數
Defaults log_host, log_year, logfile="/var/log/sudo.log"# 保持當前使用者的環境變數
Defaults env_keep += "LANG LC_ADDRESS LC_CTYPE COLORS DISPLAY HOSTNAME EDITOR"
Defaults env_keep += "ftp_proxy http_proxy https_proxy no_proxy"
# 安置一個安全的 PATH 環境變數
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
2. 使用技巧總結

主要介紹使用 sudo 相關命令的使用技巧和問題處理方式!

[1] 如何將 visudo 編輯器從 nano 更改為 vim?

當我使用 visudo 命令的時候,它總是用 nano 編輯器開啟它,對應平時習慣使用 vi 或者 vim 的使用者來說,顯得有些彆扭,以及操作不夠自如。所以,如何更好的將 visudo 編輯器從 nano 更改為 vim 就變得非常重要了。

最佳的解決辦法,就是呼叫命令,永久的將終端的編輯器更換成為 vim 編輯器,一勞永逸。我們只需要執行如下命令,輸入自己需要的編輯器序號並按下Enter鍵即可。下次執行 visudo 命令的時候,就會使用 vim 編輯器開啟檔案。

# 因為/etc/sudoers普通使用者無法開啟和使用
$ sudo update-alternatives --config editor
There are 4 choices for the alternative editor (providing /usr/bin/editor).
Selection    Path                Priority   Status
------------------------------------------------------------
* 0            /bin/nano            40        auto mode
1            /bin/ed             -100       manual mode
2            /bin/nano            40        manual mode
3            /usr/bin/vim.basic   30        manual mode
4            /usr/bin/vim.tiny    10        manual mode
Press enter to keep the current choice[*], or type selection number: 3

其次的解決方法,就是透過環境變數修改當前終端的預設編輯器。

# 在.zshrc或.profile檔案中
$ export EDITOR=vim;
# 希望執行對visudo生效
$ sudo EDITOR=vim visudo
# 或者修改/etc/sudoers檔案的預設編輯器
Defaults editor=/usr/bin/vim
[2] Vim 如何強制儲存只讀檔案?

在使用 vim 的時候,當以普通使用者開啟一個只有 root 使用者才有許可權操作的檔案時,在編輯完成之後儲存時發現,這個檔案沒有許可權修改。好不容易把檔案編輯完了,卻無法儲存,就只能放棄,然後退出,再以 root 許可權開啟,重新編輯,是在痛苦!那有沒有好的方法來解決這個問題呢?咳咳咳,肯定是有的。

# Vim命令模式下執行即可強制儲存
# w: 表示儲存檔案
# !: 表示執行外部命令
# tee: 表示把資料重定向到給定檔案和螢幕上
# %: 在執行外部命令時,%會擴充套件成當前檔名
:w !sudo tee %
上述方式非常完美的解決了不能儲存只讀檔案的問題,但畢竟命令還是有些長,為了避免每次輸入一長串的命令,可以將它對映為一個簡單的命令加到 .vimrc 中。這樣,簡單的執行 :w!! 即可,命令後半部分 > /dev/null 作用為顯式的丟掉標準輸出的內容。
" Allow saving of files as sudo when I forgot to start vim using sudo.
cmap w!! w !sudo tee > /dev/null %
[3] 如何更加安全地編輯檔案

Sudoedit 是一個內建命令,允許使用者安全地編輯檔案。根據 sudo 手冊頁,sudoedit 等效於使用 -e 命令列選項執行 sudo。

那麼這個命令會做什麼呢,它會首先建立你要編輯的檔案的臨時副本。然後,命令將搜尋 SUDO_EDITOR,VISUAL 和 EDITOR 環境變數(按此順序),以確定應呼叫哪個編輯器來開啟剛剛建立的臨時副本。使用者完成修改工作後,更改將複製回原始檔案。

# Sudo命令手冊頁
-e, --edit
Edit one or more files instead of running a command. In lieu of a path name,
the string "sudoedit" is used when consulting the security policy. If the user
is authorized by the policy, the followingsteps are taken:
1. Temporary copies are made of the files to be edited with
the owner set to the invoking user.
2. The editor specified by the policy is run to edit the
temporary files. The sudoers policy uses the
SUDO_EDITOR, VISUAL and EDITOR environment variables (in
that order). If none of SUDO_EDITOR, VISUAL or EDITOR
are set, the first program listed in the editor
sudoers(5) option is used.
3. If they have been modified, the temporary files are
copied back to their original location and the temporary
versions are removed.
If the specified file does not exist, it will be created. Note that unlike most
commands run by sudo, the editor is run with the invoking user is environment
unmodified. If, for some reason, sudo is unable to update a file with its edited
version, the user will receive a warning and the edited copy will remain in a
temporary file.
[4] 如何讓 sudo 會話時間隨心所欲?

其中 sudo 命令是許可權委派的命令,在生產環境中是非常常用的,預設情況下 sudo 命令會話時間是在 15 分鐘。要設定 sudo 密碼超時的值,需要使用 passwd_timeout 引數進行設定。

可以以分鐘設定為你所需的任何時間,它會在超時之前一直等待。如果要為每個執行的 sudo 命令彈出密碼提示,你也可以將時間設定為 0,或者透過設定值 -1 永久禁用密碼提示。

# 設定timeout時間

# 意味著sudo密碼提示將會在使用者使用20分鐘後過期

Defaults        env_reset,timestamp_timeout=20
[5] 如何更加安全的授權伺服器許可權?

如何我們管理的伺服器,開發或者其他人員需要登入該伺服器,進行環境除錯或者問題復現等情況。這時,就需要我們給對應的使用者開通登入的訪問許可權。但是如果我們直接編輯  /etc/sudoers 檔案的話,之後當對方使用完成之後我就還需要手動進行清理。如果我們忘記的話,該開發或者其他人員將一直可以登入該伺服器,會有一定程度的安全問題。

不幸的是,對應臨時授權的話, /etc/sudoers 檔案中沒有對應的配置,可以對某個使用者或者使用者組進行指定範圍的時間授權。當使用者到達指定時間點之後,將拒絕該使用者再次進行登入了。對應此種情況,我們可以透過 crontab 定時任務與  /etc/sudoers.d 目錄的機制可以完美的解決上述問題。

我們透過定時任務的定時執行目錄,來定時刷掉  /etc/sudoers.d/ 目錄下的使用者或者使用者組的授權配置檔案。比如,我們需要定時每日刷掉今日臨時授權的使用者或者使用者,可以在  /etc/cron.daily 目錄下面建立用於刪除  /etc/sudoers.d/ 目錄的  rm -rf 命令,之後在固定的時間會自動刪除。對應授權使用者,我們使用在  /etc/sudoers.d/ 目錄下建立單獨的配置檔案,而不是直接修改  /etc/sudoers 檔案。

# Crontab有多種定時機制
# 下述分別表示每天、每時、每月、每週定時執行
$ ls -dl /etc/cron.* | grep -v cron.d$
drwxr-xr-x 2 root root 4096 May 15 06:18 /etc/cron.daily
drwxr-xr-x 2 root root 4096 Feb 14  2019 /etc/cron.hourly
drwxr-xr-x 2 root root 4096 Feb 14  2019 /etc/cron.monthly
drwxr-xr-x 2 root root 4096 Jun 18 09:57 /etc/cron.weekly
# 建立單獨的授權配置檔案
$ ls -lh /etc/sudoers.d/
-r--r----- 1 root root 666 Oct  6  2017 lisi
-r--r----- 1 root root 958 Jan 18  2018 zhangsan
# 檢視授權配置檔案的內容
$ cat /etc/sudoers.d/zhangsan
ALL ALL = (root) NOPASSWD: zhangsan
[6] 如何解決 sudo 命令找不到環境變數?

我們日常在使用 sudo 命令的時候,常常會遇到,當切換使用者之後,發現之前設定的環境變數怎麼不見了呢?這是因為,我們執行 sudo 命令之後會切換使用者,如果保留環境變數會有一定的安全問題,系統會預設重置環境變數為安全的環境變數。先前設定的變數都會失效,只有少數配置檔案中指定的環境變數能夠儲存下來。

我們可以看一下 sudo 配置檔案 /etc/sudoers 來找找作用原因。我們執行如下命令之後,可以看到如下輸入(有可能和我這裡的不一樣)。其中 env_reset 表示預設會重置環境變數,因此我們自定義的變數會在 sudo 命令執行之後失效,也就不會正確獲取變數值了。而 env_keep 則表示用於保留部分環境變數不被重置,需要保留的變數就寫入雙引號之中,可自行追加需要保留的變數。最後就是 secure_path 變數,其作用就是包含的路徑將被當做 sudo 環境的 PATH 變數來使用。如果在 sudo 環境無法找到某些命令,那麼可以將這些命令的路徑加入該配置項之中。

$ sudo sed '/^#/d;/^$/d' /etc/sudoers
Defaults    env_reset
Defaults    env_keep =  "COLORS IDSPLAY HOSTNAME HISTSIZE LS_COLORS"Defaults    env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS"
Defaults    secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"

我們知道原因之後,就可以針對上述情況作出不用的處理方式,來解決 sudo 命令找不到環境變數的問題。

第一種解決方法,就是在使用的時候,使用 -E 引數。加上 -E 選項後,使用者可以在 sudo 執行時保留當前使用者已存在的環境變數,不會被 sudo 重置。另外,如果使用者對於指定的環境變數沒有許可權,則會報錯。需要注意的是,在內部測試機器中,安全性要求不高的情況下使用。

$ sudo sudo -E

第二種解決方法,就是修改 sudo 配置檔案。可以透過修改 /etc/sudoers 檔案的 env_keep 和 secure_path 配置項,來指定 sudo 環境中需要保留的環境變數和路徑。當然,我們也可以把配置檔案的變數 !env_reset 給去掉,這樣就不會有限制了。

$ sudo vim /etc/sudoers
Defaults !env_reset


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2764761/,如需轉載,請註明出處,否則將追究法律責任。

相關文章