1. 程式人生 > 實用技巧 >-linux-su切換使用者與sudo提權

-linux-su切換使用者與sudo提權

一 介紹

​ 因為root使用者的許可權太大,破壞力太強,安全風險極高,所以通常情況下公司的伺服器對外都是禁止root使用者直接登入,而運維組的小夥伴通常使用的都是普通使用者,但是運維組內的小夥伴們在進行日常運維管理的過程中,經常需要獲得某些root才有的管理許可權才能完成任務,例如需要執行/sbin目錄下的命令。

​ 那麼如何才能在不使用root使用者直接登入作業系統的同時又能保證普通使用者完成日常工作呢,有兩種方案。

1 su切換使用者身份

  • 特點:使用普通使用者登入,然後使用su命令切換到root賬戶下
  • 優點:使用起來簡單粗暴
  • 缺點:
    • 需要知道root密碼
    • 許可權控制不精細:每次都是獲取所有root許可權

2 sudo提取部分管理員許可權

  • 特點:
    • 使用普通使用者登入,然後sudo命令提取root使用者的部分管理許可權,注意只是某部分,而不是全部。
    • 不需要切換到root賬戶下。
  • 優點:
    • 不需要知道root密碼,輸入的是使用者自己的密碼
    • 許可權控制更為精細:可以控制普通使用者只獲取部分root許可權
  • 缺點:使用起來相對複雜

二 su切換使用者

1 儲備知識

linux中shell可以分為兩類

  • 登陸shell,需要輸入使用者名稱和密碼才能進入Shell,日常接觸的最多的一種 。
  • 非登陸shell,不需要輸入使用者和密碼就能進入Shell,比如執行bash會開啟一個新的會話視窗。

shell的使用方式有兩種

  • 互動式,等待使用者輸入執行的命令(終端操作,需要不斷提示)。
  • 非互動式,執行shell指令碼, 指令碼執行結束後shell自動退出。

Bash shell配置檔案介紹(檔案主要儲存使用者的工作環境)

全域性配置檔案: 
		/etc/profile 
  	/etc/profile.d/*.sh 
    /etc/bashrc 
    
個人配置檔案: 
		~/.bash_profile 
  	~/.bashrc 
    
profile類檔案, 設定環境變數, 登陸前執行的指令碼和命令。 

bashrc類檔案, 設定本地變數, 定義命令別名 

PS: 如果全域性配置和個人配置產生衝突,以個人配置為準。

配置檔案的應用順序

如果執行的是登入式shell,那麼配置檔案執行順序是: 
 /etc/profile->/etc/profile.d/*.sh->~/.bash_profile->~/.bashrc->/etc/bashrc 

如果執行的是非登入式shell,那麼配置檔案執行順序是: 
  ~/.bashrc->/etc/bashrc->/etc/profile.d/*.sh 
  
PS: 驗證使用echo在每行新增一個輸出即可,注意,要把輸出放在檔案的第一行。

執行登入與非登入shell

# 執行登入shell:身份與環境都切換 
su - 使用者 

# 執行非登入shell:只切換使用者身份 
su 使用者 

# 補充: 
# 1、從root往普通使用者下切換無需輸入密碼,反之則需要 
# 2、切換身份執行命令:su - 使用者 -c “命令”

三 sudo提權

​ 在日常的運維工作中,我們不應該把root的密碼公開給所有人,因為,一方面,真那樣做的話,安全風險就太高了,刪庫到跑路發生的概率估計會加大,另外一方面,小夥伴們大多數情況下只需要提取某一些許可權來使用即可也並不是需要所全部的管理員許可權,所以說sudo比su更為靠譜一些。

​ 通過配置sudo,我們可以實現讓普通使用者輸入自己的密碼的情況下而獲取我們為其配置的特定許可權,這樣,既保證了普通使用者擁有他想要的特定許可權,又不至於洩露管理root的密碼。

1 配置

兩種配置

1)visudo(會提示語法錯誤,推薦使用)

[root@arther-linux ~]# visudo -c # 檢查配置是否正確
/etc/sudoers: parsed OK
[root@egon ~]#

2)vim/etc/sudoers

# sudo 語法
user MACHINE=COMMANDS

## Syntax:
##
## 	user	MACHINE=COMMANDS
##
## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere 
root	ALL=(ALL) 	ALL

-1.root:	使用者
  
-2.ALL:代表使用者可以在哪臺機器上執行指令,通常設定為ALL,如果設定為localhost代表在本機上執行指令。
  也可以設定為本機以外的其他IP地址或主機名,此時該/etc/sudoers雖然是在本機上配置的,但使用者登入到本機 後仍然是無法執行命令的,如果把/etc/sudoers這個配置檔案賦值到指定ip或主機名的那臺機器上,就好用了
  配置檔案中講到:
  ## Next comes the main part: which users can run what software on 
  ## which machines (the sudoers file can be shared between multiple 
  ## systems).
  即/etc/sudoers檔案可以在多個系統之間共享,如果我們設定成ALL的話就省事了,該檔案複製到人任 意一臺機器 上的完成的許可權配置都一樣
  
-3.(All): 表示允許使用者以哪個使用者的許可權做事情

-4.ALL:	所有命令
  
最終解釋:root使用者可以在所有主機上以任意使用者身份執行所有命令

root    ALL=(ALL)       ALL
bibibi  ALL=(ALL)       ALL    
# bibibi使用者在任何機器上,可以以任何使用者身份執行任何命令等同 於root使用者
user10  ALL=(ALL)       /bin/cp,/bin/touch
# 只允許user10使用者以root使用者身份執行cp,touch命令
lili 		ALL=(ALL) 	NOPASSWD: ALL # 免密
egon01 ALL=(ALL) ALL,!/usr/bin/vim /test/a.txt 
# !代表取反 
egon02 ALL=(ALL) /usr/bin/passwd [a-zA-Z]*,/usr/bin/vim *,!/usr/bin/vim /test/a.txt # 可以編輯所有檔案,除了/test/a.txt
  
# 測試
[bibibi@arther-linux ~]$ cat /etc/shadow
cat: /etc/shadow: Permission denied
[bibibi@arther-linux ~]$ sudo cat /etc/shadow
[sudo] password for bibibi:  # 輸入使用者自己的密碼
# 執行成功

ps: sudo 執行流程 
  1.普通使用者執行sudo命令, 會檢查/var/db/sudo是否存在時間戳快取 
  2.如果存在則不需要輸入密碼, 否則需要輸入使用者與密碼 
  3.輸入密碼會檢測是否該使用者是否擁有該許可權 
  4.如果有則執行,否則報錯退出

sudo常用引數

sudo常用引數:-l : 登入使用者下面,執行sudo -l 顯示當前使用者有哪些許可權 
  					 -k :刪除/var/db/sudo/下面對應的時間戳的資訊,下次執行sudo需要輸入當前使用者的密碼 
    					--> 系統預設也是5分鐘失效 
      				--> 配置免密是另一種情況 NOPASSWD: ALL遠端sudo(有條件限制的)