1. 程式人生 > >Linux系統使用者管理和su、sudo詳細講解

Linux系統使用者管理和su、sudo詳細講解

1 Linux使用者和組

1)Linux是多工、多使用者的系統

2)每個檔案和程序,都需要對應一個使用者和使用者組

3)Linux系統是通過UID和FID來識別使用者和組的使用者相當於人名,UID和GID相當於身份證號(系統用的)

Linux管理員:root

4)使用者和組的關係:

一對一、多對一、一對多、多對多

Linux系統使用者分類

超級使用者:UID為0 代表是root,皇帝

普通使用者:UID範圍500-65535,有超級使用者或者具有超級使用者許可權的使用者建立的使用者(大臣、布衣)

虛擬使用者:UID範圍1=499,存在滿足檔案或者服務啟動的需要。一般都不能登入,只是傀儡。每個檔案和程序,都需要對應一個使用者和使用者組。

1.2 和使用者關聯的四個檔案

/etc/passwd,/etc/shadow,/etc/group,/etc/gshadow

以上檔案內容是由冒號分隔:/etc/passwd內容需要比較熟悉(放在大腦裡),其它的瞭解(在大腦建立索引)

管理使用者重要命令彙總

注意,以下帶*****標記的命令是在工作中常用到的

命令註釋說明
useradd                *****同adduser命令,執行命令可以在系統中新增使用者(更改4個使用者檔案)
userdel執行此命令可刪除使用者及相關使用者配置檔案(更改4個使用者檔案)
passwd*****執行此命令可為使用者設定或修改密碼,更改/etc/shadow檔案
chage修改使用者密碼有效期限,管理/etc/shadow檔案
usermod*****修改使用者資訊的命令,可通過usermod來修改登入名、使用者的家目錄等等
id*****檢視使用者的UID、GID及所歸屬的使用者組
su*****使用者角色切換工具
sudo*********sudo是通過另一個使用者來執行命令,su是用來切換使用者,然後通過切換到的使用者來完成相應的任務,但sudo能在命令後面直接接命令執行,比如sudo ls /root,這個不需要root密碼就可以執行只有root才能執行的命令或具備的目錄許可權,這個許可權需要通過visudo命令管理或直接編輯配置檔案(/etc/sudoers)
visudo*********visudo配置sudo許可權的編輯命令也可以不用這個命令,直接用vi來編輯/etc/sudoers實現。但是推薦用visudo來操作(會自動檢查語法)
pwcov同步使用者從/etc/passwd到/etc/shadow

3 管理使用者組命令彙總

命令註釋說明
groupadd新增使用者組
groupdel刪除使用者組

4 /etc/skel目錄

/etc/skel目錄是用來存放新使用者配置檔案的目錄,當我們新增新使用者時,這個目錄下的所有檔案會自動被複制到新新增的使用者的家目錄下:預設情況下,/etc/skel目錄下的所有檔案都是隱藏檔案(以.開頭的檔案);通過修改、新增、刪除/etc/skel目錄下的檔案,我們可以為新建立的使用者提供統一的、標準的、初始化使用者環境

看一下/etc/skel目錄下檔案的所有內容:

[[email protected] ~]# ls -la /etc/skel

total 20

drwxr-xr-x. 2 root root 4096 2017-11-17 00:27 .

drwxr-xr-x. 92 root root 4096 2017-12-19 13:33 ..

-rw-r--r--. 1 root root 18 2017-03-23 08:15 .bash_logout

-rw-r--r--. 1 root root 176 2017-03-23 08:15 **.bash_profile**

-rw-r--r--. 1 root root 124 2017-03-23 08:15 **.bashrc**

**\#
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

例子:我們在此目錄下建立readme.txt檔案,然後再建立一新使用者,檢視該使用者家目錄的檔案內容,會發現普通使用者家目錄下有我們建立的檔案。

[[email protected] ~]# cd /etc/skel/

[[email protected] skel]# touch readme.txt

[[email protected] skel]# useradd rsq

[[email protected] skel]# ls -a /home/rsq

. .. .bash_logout .bash_profile .bashrc **readme.txt**
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

# 新增使用者就相當於把/etc/skel/* 拷貝到/home/rsq/

[[email protected] skel]# useradd rsq

[[email protected] skel]# cp -a /etc/skel/* /home/rsq/
  • 1
  • 2
  • 3
  • 4

4.1 /etc/skel的企業場景作用

1、可以把通知的內容放到skel,讓登入的人去看

2、同意初始換新使用者的環境變數

3、面試題:出現-bash-4.1$ 問題原因及解決辦法(原因是家目錄下的環境變數不在了)

5 /etc/login.defs配置檔案

/etc/login.defs檔案是用來定義建立使用者時需要的一些使用者的配置資訊。如建立使用者時,是否需要家目錄、UID和GID的範圍、使用者及密碼的有效期限等等。

下面是Centos 6.9(Final)版本的/etc/login.defs檔案內容:

[[email protected] ~]# **grep -v "^#" /etc/login.defs**

MAIL_DIR /var/spool/mail # 郵件地址

PASS_MAX_DAYS 99999 # 密碼最大有效期

PASS_MIN_DAYS 0 # 密碼最小有效期

PASS_MIN_LEN 5 # 密碼最小長度

PASS_WARN_AGE 7 # 密碼警告期限

UID_MIN 500 # 最小UID

UID_MAX 60000 # 最大UID,其實可定義到65535

GID_MIN 500 # 最小GID

GID_MAX 60000 # 最大GID

CREATE_HOME yes # 是否建立家目錄

UMASK 077 # umask來限定所建立家目錄的許可權

USERGROUPS_ENAB yes

ENCRYPT_METHOD SHA512
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

6 /etc/default/useradd檔案

/etc/default/useradd檔案是在使用useradd新增使用者時的一個需要呼叫的一個預設的配置檔案,可以使用“useradd -D 引數”,這樣的命令格式來修改檔案裡面的內容。

下面看一下檔案內容:

[[email protected] ~]# cat /etc/default/useradd

# useradd defaults file

GROUP=100 # 依賴於/etc/login.defs的USERGROUP_ENAB引數,如果為no,則此處控制

HOME=/home # 把使用者的家目錄建在/home

INACTIVE=-1 # 是否啟用賬號過期停權,-1表示不啟用

EXPIRE= # 賬號終止日期,不設定表示不啟用

SHELL=/bin/bash # 新使用者預設所用的shell型別

SKEL=/etc/skel #
配置新使用者家目錄的預設檔案存放路徑。前面提到/etc/skel,就是配置在這裡生效的,即當我們用useradd新增使用者時,使用者家目錄下的檔案,都是從這裡配置的目錄中複製過去的。

CREATE_MAIL_SPOOL=yes # 建立mail檔案
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

7 使用者和組管理命令的詳細引數

7.1 useradd

useradd引數選項註釋說明(帶深色標識的內容是最需要掌握的)
-c comment#->新賬號passwd檔的說明欄
-d home_dir#->新賬號每次登入時所使用的home_dir。預設值為default_home內login名稱,並當成登入時目錄名稱。
-e expire_date#->賬號終止日期。日期的指定格式為MM/DD/YY。
-f inactive_days#->賬號過期幾日後永久停權。當值為0時賬號則立刻被停權。而當值為-1時則關閉此功能,預設值為-1.
-g initial_group**#->**group名稱或以數字來作為使用者登入起始使用者組(group)。使用者組名須為系統現有存在的名稱。使用者組數字也須為現有存在的使用者組。預設的使用者組數字為1.
-G group,[…]#->定義此使用者為多個不同groups的成員。每隔使用者組使用“,”逗號分隔。使用者組名同-g選項的顯示。預設只為使用者的起始使用者組。
-M#->不建立使用者家目錄,優先於/etc/login.defs檔案的設定。一般建立虛擬使用者時不建立家目錄,部署服務時需要建立虛擬使用者。
-s shell#->使用者登入後使用的shell名稱。預設值為不填寫,這樣系統會幫你指定預設的登入shell(根據/etc/default/useradd預設的值)
-u uid#->使用者的ID值。這個值必須是唯一的,除非用-o選項。數字不可為負值。

例子:建立一個oldboy6使用者,註釋資訊為“HandsomeBoy”,uid為806,同屬於root,oldboy,sa組,指定登入shell為/bin/sh,並指定家目錄為oldboy6.

(這裡需要注意,由於事先沒有oldboy6目錄,故可以手動建立或用-m引數)

[root\@oldboy ~]# useradd -c "HandsomeBoy" -u 806 -G root,oldboy,sa -s /bin/sh -md oldboy6 oldboy6
  • 1
  • 2

7.2 useradd -D

useradd -D 引數選項註釋說明
-b default_home#->定義使用者所屬目錄的前一個目錄。使用者名稱稱會附加在default_home後面用來建立新使用者的目錄。使用-d後則此選項無效。
-e default_expire_date#->使用者賬號停止日期
-f default_inactive#->賬號過期日後停權
-g default_group#->新賬號起始使用者組名或ID。使用者組名必須為現有存在的名稱。使用者組ID也必須為現有存在的使用者組
-s default_shell#->使用者登入後使用的shell名稱。修改後新加入的使用者都將使用此shell型別,useradd -s引數優先於此預設配置值。

7.3 groupadd

groupadd命令的使用非常簡單,但是在生產環境中使用的不多,因此,會簡單應用即可。

與groupadd命令相關的檔案有:

  • /etc/group

  • /etc/gshadow

groupadd引數選項註釋說明
-g gid#->指定使用者組GID值。除非接-o引數(如:groupadd -g 1234 -o oldboy),否則ID值必須是唯一的數字(不能為負數)。如果不指定-g引數,則預設值會從500開始。

7.4 groupdel

此命令用的極少,瞭解即可,示例:

[[email protected] ~]# tail -2 /etc/group

g1:x:506:

g2:x:507:

[[email protected] ~]# groupdel g1

[[email protected] ~]# groupdel g2

[[email protected] ~]# tail -2 /etc/group

test2:x:504:

rsq:x:505:
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

7.5 passwd

設定密碼的幾條事項:

1)如果要為新使用者設定密碼,則執行“passwd 新使用者名稱”,這需要以root使用者的許可權來執行設定。

2)預設密碼最少是5位,設定密碼時要注意

3)非互動式更改密碼:echo “123456” | passwd –stdin 使用者名稱

passwd引數註釋說明
–stdin**#->**read new tokens from stdin(root only) 從stdin讀入密碼
-x,–maximum=DAYS#->兩次密碼修改的最大天數,後面接數字;僅能root許可權操作。
-n,–minimum=DAYS#->兩次密碼修改的最小天數,後面接數字;僅能root許可權操作。
-w,–warning=DAYS#->在距多少天提醒使用者修改密碼;僅能root許可權操作
-i,–inactive=DAYS#->在密碼過期後多少天,使用者被禁掉,僅能root許可權操作。

例2:批量建立10個使用者stu01-stu10,並且設定隨機8位密碼,要求不能用shell迴圈,只能用命令及管道實現

例2:要求oldboy使用者7天內不能更改密碼,60天以後必須修改密碼,過去前10天通知oldboy使用者,過期30天后禁止使用者登入

解答:[[email protected] ~]# passwd -n 7 -x 60 -w 10 -i 30 oldboy

7.5.1 passwd特殊許可權說明

[[email protected] ~]# which passwd

/usr/bin/passwd

[[email protected] ~]# ls -l /usr/bin/passwd

-rw**s**r-xr-x. 1 root root 30768 2015-11-24 00:30 /usr/bin/passwd

[[email protected] ~]# ls -l /etc/passwd

-rw-r--r-- 1 root root 1520 2017-12-20 14:37 /etc/passwd
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

我們看到/usr/bin/passwd檔案的屬主許可權裡帶了s許可權,這是setuid許可權位,這表示允許普通使用者以/usr/bin/passwd屬主root的許可權來執行普通使用者本來無法執行的功能。比如:普通使用者是沒有許可權修改/etc/passwd的。因為/usr/bin/passwd命令檔案已經設定了setuid許可權位(也就是-rws**r-xr-x中的**s),所以普通使用者在執行/usr/bin/passwd命令時能夠使用root使用者的許可權,間接的修改/etc/passwd檔案,以達到修改自己口令的目的。

7.5.2 企業場景中使用者及密碼管理

1)密碼要複雜8位以上的字母數字特殊字元

2)大的企業使用者和密碼同意管理(相當於活動目錄,openldap)

3)動態密碼:動態口令,第三方提供自己開發也很簡單。

7.6 chage

前面有寫到在管理使用者和使用者組時,曾使用過chage命令,chage命令是用來修改使用者密碼有效期限的。(chage -change user password expiry information)

chage命令用法很多,和passwd等命令功能也是有不少重複的。下面列舉一下常用的引數。

chage引數選項註釋說明
-d,–lastday#->將最近一次密碼設定時間設為“最近日期”
-E,–expiredate#->將賬戶過期時間設為“過期日期”,日期語法:MM/DD/YY
-h,–help#->顯示此命令幫助資訊並退出
-I,–inactive#->在密碼過期後多少天,使用者被禁掉,僅能以root操作。
-l,–list#->顯示賬戶年齡資訊
-m,–mindays#->將兩次改變密碼之間相距的最小天數設為“最小天數”
-M,–maxdays#->將兩次改變密碼之間相距的最大天數設為“最大天數”
-W,–warndays#->將過期警告天數設為“警告天數”

7.6.1 有關使用者密碼時效

我們知道passwdchage等均可以設定或更改指定帳戶密碼的安全資訊(有效期等),我們也可以通過/etc/login.defs配置檔案或/etc/default/useradd針對所有帳戶全域性修改。

設定使用者密碼的時效有利有弊: 
優點是可以防止運維人員離職一段時間後發現使用者還可以登陸(也可能不是自己的使用者),如果設定了帳戶有效期,即使使用者未被清理,那麼,一段時間內也會因為密碼時效而被自動鎖定。密碼時效還可以強制系統管理人員修改定期密碼,提升系統安全性。缺點是有一些本來應該保留的使用者也因為過期而無法登陸了,另外,在伺服器數量很多的情況,更改密碼也是很大的工作量。所以,對於使用者密碼的時效的功能,我們根據實際的工作需求,綜合運用。在大規模的運維環境中,使用LDAP服務(微軟活動目錄)對linux帳戶統一認證,批量管理,也是不錯的方法。

7.7 userdel

此命令的功能是刪除使用者及使用者相關的資訊,與此命令相關的檔案有:

  • /etc/passwd - 使用者賬號資料檔案

  • /etc/shadow - 使用者賬號資訊檔案

  • /etc/group - 使用者組資訊檔案

  • /etc/gshadow - 使用者組密碼資訊檔案

userdel引數註釋說明
-r#->連通使用者家目錄一併刪除,在其它位置上的相關檔案也將一一找出並刪除

7.7.1 企業場景刪除使用者的處理方法

一般不能確認使用者相關目錄有沒有重要資料就不能用-r

刪除經驗:

1)vi /etc/passwd註釋掉使用者,觀察一個月,出現問題就可以還原,相當於提前備份

2)把登入shell改成/sbin/nologin.

3)openldap(類似活動目錄)賬號統一管理的,ldap庫裡直接幹掉使用者。所有伺服器全部都沒了。

提示:只要修改和刪除都要小心謹慎

7.8 usermod

usermod命令功能十分強大,在生產場景中使用頻率雖然不是很多,但還是比較重要的。它不僅能更改使用者的shell型別,所歸屬的使用者組,還能更改使用者密碼的有效期、登入名等很多使用者的資訊,其選項和useradd類似,可參考記憶。與usermod命令有關的檔案有:

  • /etc/passwd - 使用者賬號資料檔案

  • /etc/shadow - 使用者賬號資訊檔案

  • /etc/group - 使用者組資訊檔案

  • /etc/gshadow - 使用者組密碼資訊檔案

usermod引數選項註釋說明(帶深顏色標識的表示重要,需要掌握)
-c comment#->增加使用者賬號/etc/passwd中的註釋說明欄(第五欄)。這個-c引數功能也可以使用chfn命令來修改,當然也可以手動修改/etc/passwd檔案來實現
-d home_dir#->更新使用者新的家目錄。如果給定-m選項,使用者就的家目錄會搬到新的家目錄去,如就的家目錄不存在則建個新的。
-e expire_date#->加上使用者賬號停止日期。日期格式為MM/DD/YY
-f inactive_days#->賬號過期幾日後永久停權。當值為0時賬號則立刻被停權。而當值為-1時則關閉此功能。預設值為-1
-g initial_group#->更新使用者新的起始登入使用者組。使用者組名須已存在。使用者組ID必須參照既有的使用者組。使用者組ID預設值為1.
-G group,[…]#->定義使用者為一對groups的成員,即附加組。每個使用者組使用“,”逗號隔開來。使用者組名同-g選項的限制。
-l login_name#->變更使用者login時的名稱為login_name。其餘資訊不變
-s shell#->指定使用者登入的shell。如此欄為空,系統將選用系統預設的shell。這個-s引數功能也可以使用chsh命令來修改。當然也可以手工修改/etc/passwd檔案來實現。
-u uid#->指定使用者UID值。除非接-o引數(如:usermod -u 505 -o oldboy),否則ID值必須是唯一的數字(不能為負數)
-L#->凍結使用者的密碼,使之無法登陸,實際上就是間接修改/etc/shadow的密碼欄。在密碼欄的開頭加上“!”號,即表示凍結。這個凍結密碼的功能和usermod -e、useradd -e、chage -E或passwd -l等命令都有類似的功效,那就是讓使用者無法正常登陸。
-U#->取消凍結使用者的密碼

7.9 使用者查詢相關命令

id、finger、users、w、who、last、lasting、groups

8 Linux使用者身份切換命令

8.1 前言

我們都知道linux系統中,超級使用者root具有超級管理許可權。由於許可權太大,如果管理不好,就會對系統安全帶來嚴重隱患。在工作場景中,我們只在必要時才使用超級使用者root的許可權。一般的臨時性處都是以普通使用者的身份完成的,那麼,當普通使用者需要超級使用者的許可權時,是怎麼進行切換管理理工作的呢?

這就不得不提到兩個重要的使用者身份切換命令su和sudo。下面我們就講解這兩個命令是如何完成使用者切換工作,達到系統管理目的的?

在linux系統中,每個檔案、目錄和程序,都是歸屬於某一個使用者的,沒有其使用者的許可,其它的普通使用者是無法操作的,root除外。root使用者的特權還表現在root可以超越任何使用者和使用者組來對檔案或目錄進行讀取、修改或刪除(在系統正常的許可範圍內);對可執行程式的執行、終止;對硬體裝置的新增、建立和移除等;也可以對檔案和目錄進行屬主和許可權進行修改。

8.2 su命令介紹

簡單的說,su命令就是切換使用者身份的命令。比如,我們以普通使用者oldboy登入到系統後,當要在系統中執行useradd新增使用者時,會發現oldboy

使用者沒有這個許可權,這個許可權只能由root許可權執行。解決辦法一是退出oldboy使用者,重新以root使用者登入。二是我們直接在oldboy使用者下,使用su命令來切換到root下進行新增使用者的工作,等工作完成後再退出root使用者。毫無疑問,上面兩個方法,通過su命令切換是一種比較好的辦法。

通過su命令可以在使用者之間切換,超級許可權使用者root向普通或虛擬使用者切換不需要密碼驗證(這就是超級許可權所在),其他普通使用者之間或者普通使用者切換到root,都需要切換使用者的密碼驗證。

8.2.1 su命令引數

su引數註釋說明(帶標記的表示很重要)
-,-l,–login#->使一個shell成為登入的shell,如執行su -oldboy時,表示該使用者想改變身份為oldboy,並且使用oldboy使用者的環境變數,如:/home/oldboy/.bash_profile
-c,–command=COMMAND#->切換到一個shell下,執行一個命令,然後退出所切換的使用者環境
-m,–preserve-environment#->切換使用者時,不重置使用者環境變數,-p的功能同-m,這個引數為su的預設值,一般很少使用
-s,–shell=SHELL#->如果/etc/shells允許,則執行指定的shell

由su和su -的區別談學習linux運維方法

su -c例子(分使用者方案啟動命令):

[[email protected] ~]# su - oldboy -c ‘/bin/sh /home/tddoc/bin/deploy.sh’

8.2.2 su命令優缺點

毫無疑問,切換使用者身份的su命令為我們管理linux 系統帶來了很多方便,通過切換到root下,可以完成各種系統管理工作,只要任何一個普通使用者知道了root使用者的密碼,都能以普通使用者的身份切換到root來完成本來無法完成的系統管理的工作。

但是,這樣通過su命令切換到root後,也帶來了很大安全管理問題;比如系統有8個普通使用者,都可以通過切換到root身份進行系統管理,甚至還可以改掉root的密碼,讓其他的普通使用者無法再實現系統管理,還有,這麼多使用者中,有任何一人對系統操作的重大失誤,都可能導致整個系統崩潰或資料損失。這樣的非集權式管理,在一定程度上就對系統的安全造成了較大的威協。在工作中幾乎有一半的問題來自於內部。

所以使用su命令切換身份在多個系統管理員共同管理的場合,並不是最好的選擇,如果是一般的中小公司不