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 有關使用者密碼時效
我們知道passwd和chage等均可以設定或更改指定帳戶密碼的安全資訊(有效期等),我們也可以通過/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命令切換身份在多個系統管理員共同管理的場合,並不是最好的選擇,如果是一般的中小公司不