天天看點

sudo 指令、配置

一、su 指令

su指令是用來切換使用者。如果超級權限使用者root向普通使用者切換不需要密碼;而普通使用者切換到其它任何使用者都需要密碼驗證(A使用者切換到B時,需要輸入B的密碼)。

1、su 的用法:

su [OPTION選項參數] [使用者],參數說明:

  • - 或者 -l:登入并改變到所切換的使用者環境;
  • -c: 切換到對應的使用者環境,執行一個指令,然後退出;

注意:

  1. su 在不加任何參數,預設為切換到root使用者,但沒有轉到root使用者家目錄下,也就是說這時雖然是切換為root使用者了,但并沒有改變root登入環境;
  2. su - root 和su - 是一樣的功能,都是切換到root使用者,并且改變到root使用者的環境;

示例一:

[root@localhost ~]# useradd test
[root@localhost ~]# passwd test
Changing password for user test.
New password: 
BAD PASSWORD: The password is shorter than 8 characters
Retype new password: 
passwd: all authentication tokens updated successfully.
[root@localhost ~]# useradd u1
[root@localhost ~]# passwd u1
Changing password for user u1.
New password: 
BAD PASSWORD: The password is shorter than 7 characters
Retype new password: 
passwd: all authentication tokens updated successfully.
[root@localhost ~]# su - test
[test@localhost ~]$ pwd
/home/test
[test@localhost ~]$ su - u1
Password: 
[u1@localhost ~]$ pwd
/home/u1
[u1@localhost ~]$ exit
logout      

示例二:

[u1@localhost ~]$ touch u1_log
[u1@localhost ~]$ exit
logout
[test@localhost ~]$ su -c "ls /home/u1" u1
Password: 
u1_log
[test@localhost ~]$      

2、SUID:

我們先來看一個問題:

有時我們使用su切換使用者,輸入密碼後一直提示"incorrect password",原因是su這個指令的權限設定問題。要能使用su指令切換成根使用者,需要su這個指令設定suid特殊權限位,具體方法如下:

#chmod 4755 /bin/su

reoot

重新開機後我們檢視su指令,有了一個“s”的辨別:

[root@localhost ~]# ll /bin/su

-rwsr-xr-x. 1 root root 32184 Apr 11 2018 /bin/su

我們再來看一個案例:

我們的密碼都是存放在 /etc/passwd檔案中的,/etc/passwd檔案隻有root有寫權限,其他使用者都隻有讀權限,那麼我們使用passwd指令修改密碼後如何寫到該檔案中的呢?

原來passwd指令有一個特殊的權限标記s ,存在于檔案所有者的權限位上。這是一類特殊的權限SetUID ,可以這樣來了解它:當一個具有執行權限的檔案設定SetUID權限後,使用者執行這個檔案時将以檔案所有者的身份執行。passwd指令具有SetUID權限,所有者為root(Linux中的指令預設所有者都是root),也就是說當普通使用者使用passwd更改自己密碼的時候,那一瞬間突然靈魂附體了,實際在以passwd指令所有者root的身份在執行,root當然可以将密碼寫入/etc/shadow檔案(不要忘記root這個家夥是superuser什麼事都可以幹),指令執行完成後該身份也随之消失。

二、sudo 指令、配置

有的時候我們隻需要切換到某個使用者,執行一個指令,然後就退出。上面我們知道可以使用su來切換使用者,但是需要知道使用者的密碼,特别是切換到root時需要知道root的密碼才可以,這樣做比較不安全。 這個時候我們可以使用sudo。

通過sudo,我們能把某些超級權限有針對性的下放,并且不需要普通使用者知道root密碼,是以sudo 相對于權限無限制性的su來說,還是比較安全的。sudo 執行指令的流程是目前使用者切換到root(或其它指定切換到的使用者),然後以root(或其它指定的切換到的使用者)身份執行指令,執行完成後直接退回到目前使用者;而這些的前提是要通過sudo的配置檔案/etc/sudoers來進行授權。

注:sudo程式本身就是一個設定了SETUID位的二進制檔案。它的所有者是root,是以每個使用者都可以像root那樣執行該程式,我們可以檢查一下它的權限:

$ls -l /usr/bin/sudo

---s--x--x 2 root root 106832 02-12 17:41 /usr/bin/sudo

1、sudo指令:

1)參數:

  • sudo -u username#uid User 以指定使用者的身份執行指令。後面的使用者是除root以外的,可以是使用者名,也可以是#uid。
  • sudo -k Kill 清除“入場卷”上的時間,下次再使用sudo時要再輸入密碼。
  • sudo -K Sure kill 與-k類似,但是它還要撕毀“入場卷”,也就是删除時間戳檔案。
  • sudo -b command 在背景執行指定的指令。

2)特點:

  • sudo能夠限制指定使用者在指定主機上運作某些指令。
  • sudo可以提供日志,忠實地記錄每個使用者使用sudo做了些什麼,并且能将日志傳到中心主機或者日志伺服器。
  • sudo為系統管理者提供配置檔案,允許系統管理者集中地管理使用者的使用權限和使用的主機。它預設的存放位置是/etc/sudoers。
  • sudo使用時間戳檔案來完成類似“檢票”的系統。當使用者執行sudo并且輸入密碼後,使用者獲得了一張預設存活期為5分鐘的“入場券”(預設值可以在編譯的時候改變)。逾時以後,使用者必須重新輸入密碼。

2、sudo配置:

配置sudo有兩種方法:(有超級使用者才可以修改它)

  1. 直接使用vim編輯/etc/sudoers檔案;
  2. 使用visudo指令編輯。(防止兩個使用者同時修改,其次有文法檢查)

1)我們先做一個示範:

以root身份用visudo打開配置檔案,可以看到類似下面幾行:

# Runas alias specification

# User privilege specificationroot ALL=(ALL)ALL

我們在下面加一行(最好用tab作為空白):

foobar ALL=(ALL) ALL

儲存退出後,切換到foobar使用者,我們用它的身份執行指令:

[foobar@localhost ~]$ ls /root

ls: /root: 權限不夠

[foobar@localhost ~]$ sudo ls /root

PassWord:

anaconda-ks.cfg Desktop install.log install.log.syslog

這時,我們發現可以檢視/root目錄了。

那麼,現在讓我們來看一下那三個ALL到底是什麼意思。第一個ALL是指網絡中的主機,我們後面把它改成了主機名,它指明foobar可以在此主機上執行後面的指令。第二個括号裡的ALL是指目标使用者,也就是以誰的身份去執行指令。最後一個ALL當然就是指指令名了。

2)限制使用者使用sudo的權利:

我們限制一下foobar的權利,不讓他為所欲為。比如我們隻想讓他像root那樣使用ls和ifconfig,把那一行改為:

foobar localhost= /sbin/ifconfig, /bin/ls

再來執行指令:

[foobar@localhost ~]$ sudo head -5 /etc/shadow

Password:

  Sorry, user foobar is not allowed to execute '/usr/bin/head -5 /etc/shadow' as root on localhost.localdomain.

[foobar@localhost ~]$ sudo /sbin/ifconfigeth0 Linkencap:Ethernet HWaddr 00:14:85:EC:E9:9B...

3)免密碼:

很多時候,我們本來就登入了,每次使用sudo還要輸入密碼就顯得煩瑣了。我們可不可以不再輸入密碼呢?當然可以,我們這樣修改配置檔案:

foobar ALL=(ALL) NOPASSWD:ALL

再來sudo一下:

[foobar@localhost ~]$ sudo ls /rootanaconda-ks.cfg Desktop install.log

install.log.syslog

4)指定使用者:

我們想讓foobar使用者在linux主機上以jimmy或rene的身份執行kill指令,這樣編寫配置檔案:

foobar linux=(jimmy,rene) /bin/kill

但這還有個問題,foobar到底以jimmy還是rene的身份執行?這時我們應該想到了sudo -u了,它正是用在這種時候。

foobar可以使用:sudo -u jimmy kill PID或者sudo -u rene kill PID

但這樣挺麻煩,其實我們可以不必每次加-u,把rene或jimmy設為預設的目标使用者即可。再在上面加一行:

Defaults:foobar runas_default=rene

Defaults後面如果有冒号,是對後面使用者的預設,如果沒有,則是對所有使用者的預設。就像配置檔案中自帶的一行: 

繼續閱讀