Sudo 受權需謹慎,不然親人兩行淚!html
sudo 表示 「superuser do」,它容許已驗證的用戶以其餘用戶的身份來運行命令。其餘用戶能夠是普通用戶或者超級用戶。然而,大部分時候咱們用它來提權運行命令,以替代直接使用 root 用戶的操做。sudo 命令與安全策略配合使用,安全策略能夠經過文件 /etc/sudoers 來配置。其安全策略具備高度可拓展性,支持插件擴展。默認狀況下 /etc/sudoers 是不能被任何人直接編輯的,由於它的權限是 440,雖然也能夠對其賦予寫權限後再編輯,但推薦使用 visudo 命令編輯該文件。shell
簡述其使用工做流程和配置文件配置!vim
# 容許 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 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"
主要介紹使用 sudo 相關命令的使用技巧和問題處理方式!安全
當我使用 visudo 命令的時候,它老是用 nano 編輯器打開它,對應平時習慣使用 vi 或者 vim 的用戶來講,顯得有些彆扭,以及操做不夠自如。因此,如何更好的將 visudo 編輯器從 nano 更改成 vim 就變得很是重要了。服務器
最佳的解決辦法,就是調用命令,永久的將終端的編輯器更換成爲 vim 編輯器,一勞永逸。咱們只須要執行以下命令,輸入本身須要的編輯器序號並按下回車鍵便可。下次執行 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
其次的解決方法,就是經過環境變量修改當前終端的默認編輯器。post
# 在.zshrc或.profile文件中 $ export EDITOR=vim; # 但願執行對visudo生效 $ sudo EDITOR=vim visudo # 或者修改/etc/sudoers文件的默認編輯器 Defaults editor=/usr/bin/vim
在使用 vim 的時候,當以普通用戶打開一個只有 root 用戶纔有權限操做的文件時,在編輯完成以後保存時發現,這個文件沒有權限修改。好不容易把文件編輯完了,卻沒法保存,就只能放棄,而後退出,再以 root 權限打開,從新編輯,是在痛苦!那有沒有好的方法來解決這個問題呢?咳咳咳,確定是有的。測試
# Vim命令模式下執行便可強制保存 # w: 表示保存文件 # !: 表示執行外部命令 # tee: 表示把數據重定向到給定文件和屏幕上 # %: 在執行外部命令時,%會擴展成當前文件名 :w !sudo tee %
上述方式很是完美的解決了不能保存只讀文件的問題,但畢竟命令仍是有些長,爲了不每次輸入一長串的命令,能夠將它映射爲一個簡單的命令加到 .vimrc 中。這樣,簡單的運行 :w!! 便可,命令後半部分 > /dev/null 做用爲顯式的丟掉標準輸出的內容。ui
" Allow saving of files as sudo when I forgot to start vim using sudo. cmap w!! w !sudo tee > /dev/null %
Sudoedit 是一個內置命令,容許用戶安全地編輯文件。根據 sudo 手冊頁,sudoedit 等效於使用 -e 命令行選項執行 sudo。url
那麼這個命令會作什麼呢,它會首先建立你要編輯的文件的臨時副本。而後,命令將搜索 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.
其中 sudo 命令是權限委派的命令,在生產環境中是很是經常使用的,默認狀況下 sudo 命令會話時間是在 15 分鐘。要設置 sudo 密碼超時的值,須要使用 passwd\_timeout 參數進行設置。
能夠以分鐘設置爲你所需的任什麼時候間,它會在超時以前一直等待。若是要爲每一個執行的 sudo 命令彈出密碼提示,你也能夠將時間設置爲 0,或者經過設置值 -1 永久禁用密碼提示。
# 設置timeout時間 # 意味着sudo密碼提示將會在用戶使用20分鐘後過時 Defaults env_reset,timestamp_timeout=20
如何咱們管理的服務器,開發或者其餘人員須要登陸該服務器,進行環境調試或者問題復現等狀況。這時,就須要咱們給對應的用戶開通登陸的訪問權限。可是若是咱們直接編輯 /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
咱們平常在使用 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
做者: Escape 連接: https://www.escapelife.site/p...