Linux基本功系列之sudo命令

1.sudo命令介紹

sudo命令來自於英文詞組「super user do」的縮寫,中文譯為「超級用戶才能幹的事」.

sudo的功能是用於授權普通用戶執行管理員命令,允許普通用戶執行一些或者全部的root命令,如halt,reboot,shutdown、init等等。

這樣不僅減少了root用戶的登陸和管理時間,同樣也提高了安全性。sudo是對Shell的一個代替,它是面向每個命令的。

sudo 與su命令最大的不同就是:

使用su命令變更用戶身份需要將管理員的帳戶密碼告訴他人,總感覺心裡不踏實,這時候有了sudo命令的用武之地。

使用sudo服務可以授權某個指定的用戶去執行某些指定的命令,在滿足工作需求的前提下儘可能少的放權,保證伺服器的安全。

配置sudo必須通過編輯/etc/sudoers文件,而且只有超級用戶才可以修改它。

sudo的主要特性:

sudo能夠限制用戶只在某台主機上運行某些命令。

sudo提供了豐富的日誌,詳細地記錄了每個用戶幹了什麼。它能夠將日誌傳到中心主機或者日誌伺服器。

sudo使用時間戳文件日誌來執行類似的「檢票」系統。當用戶調用sudo並且輸入他的密碼時,用戶獲得了一張存活期為5分鐘的票(這個值可以在/etc/sudoers設置)

sudo的配置文件是/etc/sudoers,屬性必須為0440,它允許系統管理員集中地管理用戶的使用權限和使用主機。

2. 語法格式及常用選項

我們用sudo --help 來查看語法格式和常用的命令:

[root@doc ~]# sudo --help

peruserdo」的縮寫,中文譯為「超級用戶才能幹的事」

sudo對很多人來說,是一個超級複雜的命令,其實不是因為命令有多難,而是因為命令本身還需要配置文件。

3. sudo配置文件詳解

3.1 sudo的配置文件

sudo默認配置文件是: /etc/sudoers

一般使用Linux指定編輯工具visudo ,此工具的好處是可以進行錯誤檢查。

在使用visudo添加規則不符合語法規則時,保存退出時會提示給我們錯誤信息;配置好後,可以用切換到您授權的普通用戶下,通過sudo -l來查看哪些命令是可以執行的或禁止的;

/etc/sudoers 文件中每行是一個規則,前面帶有#號可以當作是注釋的內容,並不執行;如果規則很長,可以寫在多列上,可以用\號來續行。

/etc/sudoers 的規則可分為兩類:

一類是授權規則

另一類是別名定義;

別名定義並不是必須的,但授權規則是必須的;

3.2 配置文件注釋

我們一起來查看下配置文件,此配置文件基於centos7.9

本文福利, 免費領取C/C++ 開發學習資料包、技術影片/代碼,1000道大廠面試題,內容包括(C++基礎,網絡編程,資料庫,中間件,後端開發,音影片開發,Qt開發,遊戲開發,Linux內核等進階學習資料和最佳學習路線)↓↓↓↓有需要的朋友可以進企鵝裙927239107領取哦~↓↓

[root@mufeng ~]# cat /etc/sudoers## Sudoers allows particular users to run various commands as## the root user, without needing the root password.##該文件允許特定用戶像root用戶一樣使用各種各樣的命令,而不需要root用戶的密碼 ## Examples are provided at the bottom of the file for collections## of related commands, which can then be delegated out to particular## users or groups.## 在文件的底部提供了很多相關命令的示例以供選擇,這些示例都可以被特定用戶或 ## ## 用戶組所使用 ## This file must be edited with the 'visudo' command.## 該文件必須使用"visudo"命令編輯## Host Aliases#主機別名## Groups of machines. You may prefer to use hostnames (perhap using ## wildcards for entire domains) or IP addresses instead.## 對於一組伺服器,你可能會更喜歡使用主機名(可能是全域名的通配符)## 或IP位址代替,這時可以配置主機別名 # Host_Alias FILESERVERS = fs1, fs2# Host_Alias MAILSERVERS = smtp, smtp2## 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## Command Aliases## These are groups of related commands...## 指定一系列相互關聯的命令(當然可以是一個)的別名,通過賦予該別名sudo權限, ## 可以通過sudo調用所有別名包含的命令,下面是一些示例## 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/sbin/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#環境變量的相關配置# Defaults specification## Disable "ssh hostname sudo <cmd>", because it will show the password in clear. # You have to run "ssh -t hostname sudo <cmd>".#Defaults requirettyDefaults env_resetDefaults env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR \ LS_COLORS MAIL PS1 PS2 QTDIR USERNAME \ LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC \ LC_PAPER LC_TELEPHONE LC_TIME LC_ALL LANGUAGE LINGUAS \ _XKB_CHARSET XAUTHORITY"## Next comes the main part: which users can run what software on## which machines (the sudoers file can be shared between multiple## systems).## 下面是規則配置:什麼用戶在哪台伺服器上可以執行哪些命令(sudoers文件可以在多個系統上共享)## Syntax:##語法## user MACHINE=COMMANDS## 用戶 登錄的主機=(可以變換的身份) 可以執行的命令 #### The COMMANDS section may have other options added to it.## 命令部分可以附帶一些其它的選項 #### Allow root to run any commands anywhere ## 允許root用戶執行任意路徑下的任意命令 root ALL=(ALL) ALL## Allows members of the 'sys' group to run networking, software,## service management apps and more.# %sys ALL = NETWORKING, SOFTWARE, SERVICES, STORAGE, DELEGATING, PROCESSES, LOCATE, DRIVERS## 允許sys中戶組中的用戶使用NETWORKING等所有別名中配置的命令 ## Allows people in group wheel to run all commands# %wheel ALL=(ALL) ALL## 允許wheel用戶組中的用戶執行所有命令 ## Same thing without a password## 允許wheel用戶組中的用戶在不輸入該用戶的密碼的情況下使用所有命令# %wheel ALL=(ALL) NOpasswd: ALL## Allows members of the users group to mount and unmount the## cdrom as root## 允許users用戶組中的用戶像root用戶一樣使用mount、unmount、chrom命令 # %users ALL=/sbin/mount /mnt/cdrom, /sbin/umount /mnt/cdrom## Allows members of the users group to shutdown this system# %users localhost=/sbin/shutdown -h now## 允許users用戶組中的用戶像root用戶一樣使用shutdown命令

visudo –c 命令具有語法檢查功能

別名類型(Alias_Type):別名類型包括如下

Host_Alias 定義主機別名;

User_Alias 用戶別名,別名成員可以是用戶,用戶組(前面要加%號)

Runas_Alias 用來定義runas別名,這個別名指定的是「目的用戶」,即sudo 允許切換至的用戶;

Command_Alias 定義命令別名;

如果一個別名下有多個成員,成員與成員之間,通過半角逗號分隔; 且成員必須是可以通過w查看到的主機名或者IP位址,用戶名需要在/etc/passwd中真是存在。

3.3 sudo授權規則

授權規則是分配權限的執行規則,我們前面所講到的定義別名主要是為了更方便的授權引用別名;如果系統中只有幾個用戶,其實下放權限比較有限的話,可以不用定義別名,而是針對系統用戶直接直接授權,所以在授權規則中別名並不是必須的;

在 man sudoers里詳細介紹了sudo的授權規則,我們一起來學習:

格式:授權用戶 主機=命令動作

這三個要素缺一不可,但在動作之前也可以指定切換到特定用戶下,在這裡指定切換的用戶要用括號括起來,如果不需要密碼直接運行命令的,應該加NOPASSWD參數

案例一:

[root@mufenggrow ~]# grep mufeng /etc/sudoersmufeng ALL=/usr/bin/chown,/usr/bin/chmod[root@mufenggrow ~]#

如果我們在/etc/sudoers 中添加這一行,表示mufeng可以在任何可能出現的主機名的系統中,可以切換到root用戶下執行 /bin/chown 和/bin/chmod 命令,通過sudo -l 來查看

[mufeng@mufenggrow ~]$ sudo -l[sudo] mufeng 的密碼:匹配 %2$s 上 %1$s 的默認條目: !visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin用戶 mufeng 可以在 mufenggrow 上運行以下命令: (root) /usr/bin/chown, /usr/bin/chmod[mufeng@mufenggrow ~]$

案例二

mufeng ALL=(root)/usr/bin/chown,/usr/bin/chmod

表示mufeng用戶可以切換到root執行chown,可以切換到任何用戶執行chmod

案例三:

mufeng ALL=(root) NOPASSWD/usr/bin/chown,/usr/bin/chmod

表示mufeng可以切換到root下執行chown,不需要輸入密碼,並且可以切換到任何用戶中執行chmod命令。但執行chmod命令的時候需要輸入密碼。

案例四

如果mufeng不是用戶而是用戶組,就需要加%

%mufeng ALL=(root)/usr/bin/chown,/usr/bin/*

這裡表示mufeng這個用戶組下的用戶, 後面的*表示 bin下所有的命令

4. sudo常用參數實戰 參考案例

創建測試用戶:

[root@mufenggrow ~]# useradd mufeng[root@mufenggrow ~]# echo 12345678 |passwd --stdin mufeng更改用戶 mufeng 的密碼 。passwd:所有的身份驗證令牌已經成功更新。[root@mufenggrow ~]# su - mufeng[mufeng@mufenggrow ~]$ whoamimufeng

4.1 查看當前用戶有哪些被sudo服務授權的命令

此時可以使用 -l 參數, 此處是L的小寫。

我們來看案例:

[mufeng@mufenggrow ~]$ sudo -l[sudo] mufeng 的密碼:匹配 %2$s 上 %1$s 的默認條目: !visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin用戶 mufeng 可以在 mufenggrow 上運行以下命令: (root) /usr/bin/chown, /usr/bin/chmod

可以直接在visudo 里設置,注意 : 執行visudo就可以直接打開配置文件,不要在前面加vim。 配置方法和/etc/sudoers 一樣

4.2 結束密碼的有效期

sudo命令第一次執行一個命令時,是需要加密碼的,第二次在執行這個命令就無須加密碼了,當我們使用-k參數,結束密碼有效期後,在執行就需要使用密碼了。

參考案例:

[root@mufenggrow ~]# su - mufeng上一次登錄:一 1月 30 19:47:47 CST 2023pts/0 上[mufeng@mufenggrow ~]$ sudo useradd test1[sudo] mufeng 的密碼:#可以看到第一次需要輸入密碼,下面第二次就不需要使用密碼了[mufeng@mufenggrow ~]$ sudo useradd test2# 取消密碼有效期[mufeng@mufenggrow ~]$ sudo -k[mufeng@mufenggrow ~]$ sudo useradd test3[sudo] mufeng 的密碼:[mufeng@mufenggrow ~]$

4.3 限制用戶的權限

限制mufeng的權限,讓mufeng只能執行chmod命令

[root@mufenggrow ~]# visudo

1sudo命令介紹sudo命令來自於英文詞組「su

第一個ALL是指網絡中的主機。第二個括號里的ALL是指目標用戶,也就是以誰的身份去執行命令。最後一個ALL是指令名。

所以此處 mufenggrow就是主機名,也就是主機。



聲明:文章觀點僅代表作者本人,PTTZH僅提供信息發布平台存儲空間服務。
喔!快樂的時光竟然這麼快就過⋯
繼續其他精彩內容吧!
more