Linux 系統是一個多用戶多任務的分時操做系統,任何一個要使用系統資源的用戶,都必需要擁有一個帳號進入系統。帳號實質上就是一個用戶在系統上的標識,系統根據該標識分配不一樣的權限和資源。一個帳號包含用戶和用戶組兩部分。shell
用戶分類:安全
超級管理員
:具備操做系統的一切權限,UID 爲 0 。通常是 "root"用戶,不建議一個系統有多個超級用戶系統用戶(僞用戶)
:方便系統管理,用來運行系統和服務的用戶,沒有密碼不能登陸,UID在 1 - 499 之間。好比有些服務不但願使用 root 的身份去執行,而是但願使用權限更小的帳號去執行,因此咱們就得要提供這些運做程序的擁有者普通用戶
:可登入用戶,擁有系統部分權限的用戶,UID 從 500 開始。用戶組分類:bash
初始組
:用戶剛登陸入系統就所在的組,用戶的必需要有一個初始組且只能有一個,通常初始組名和用戶名相同附加組
:用戶除了初始組外加入的其餘組,每一個用戶能夠擁有0或多個附加組用戶信息文件:/etc/passwd服務器
root:x:0:0:root:/root:/bin/bash
"第 3 列:用戶ID,即 UID網絡
0 (超級管理員)
:當 UID 爲 0 時,表明該用戶是超級管理員。因此當你要讓其餘的用戶名稱也具備 root 的權限時,將該用戶的 UID 改成 0 便可,也就是說一個系統上超級管理員不見得就是 root,很不建議有多個用戶的 UID 是 01 - 499 (系統用戶)
:這些 UID 是保留給系統用戶的 UID,也就是說 UID 在 1 - 499 範圍的用戶是不能登陸的,只能用來運行系統或者服務。其中,UID 1 - 99 是系統自動建立帳號時使用的; UID 100 - 499 是用戶有建立系統帳號需求時使用的500 - 60000 (普通用戶)
:普通用戶UID。實際上Linux 2.6.x 內核之後能夠支持 2^32-1 這麼多了用戶密碼文件:/etc/shadowui
root:$6$jOouAVJYJ5Ys2U1q$5j..L0vQV8W2ih8M2AK50PFhHJfJRUMIyMLkZuCezV6HOoX4Zls3yH7JdJlAPz6bp3DaKNhVh4ewXzxTivRC9/:18020:0:99999:7:::
!!
" 或者 "*
",表明沒有密碼不能登陸,系統用戶就是 "!!
" 或者 "*
"第 3 列:密碼最近一次改動日期。值是以 1970 年 1 月 1 日做爲 1 而累加得來得天數加密
date -d "1970-01-01 18020 days"
echo $(($(date --date="2019/05/04" +%s)/86400+1))
用戶組文件:/etc/group操作系統
root:x:0:
root:x:0:user1,user2
"用戶組密碼文件:/etc/gshadow設計
用戶家目錄日誌
用戶郵箱
用戶模板文件:/etc/skel/
上面介紹了用戶和用戶組相關的文件,那麼用戶登陸系統的過程,是如何涉及到這些文件的呢?當你輸入用戶名和密碼後,系統大體作了以下幾步處理:
命令格式:useradd [選項] 用戶名
選項:
-u 用戶ID
:指定用戶ID。通常指定 UID 要大於500,若是沒有特殊需求儘可能不要指定,由系統自動分配便可-g 初始組名
:指定用戶所屬初始組。儘可能不要指定,系統會自動建立一個和新增用戶名相同的組最爲該新增用戶的初始組-G 附加組名
:指定用戶所屬附加組。若是要指定多個附加組,組名用 "," 隔開-c 說明文字
:加上備註文字。備註文字會保存在 "/etc/passwd" 文件的第 5 列-d 家目錄
:指定用戶家目錄-s shell
:指定用戶登入後所使用的 shell 程序剛添加成功的用戶沒有密碼(此時該用戶的密碼是 "!!
" ),還不能用於登陸系統,須要經過 "passwd
" 命令設置密碼後才能登陸。固然,"passwd
" 命令也能用來修改已存在的用戶密碼,以及管理用戶密碼有效時間等。
命令格式:passwd [選項] [用戶名]
選項:
-l
或 --lock
:臨時鎖住密碼使密碼失效。即把 "/etc/shadow" 第二列密文密碼前面多加個 "!!"-u
或 --unlock
:解開已鎖住的用戶密碼。相對於 -l
的反向操做-d
或 --delete
:刪除現有用戶的密碼-n 天數
:兩次密碼修改時間間隔。對應"/etc/shadow" 第 4 列-x 天數
:密碼有效期。對應"/etc/shadow" 第 5 列。-w 天數
:密碼到期前的警告天數。對應"/etc/shadow" 第 6 列-i 天數
:密碼到期後的寬限天數。對應"/etc/shadow" 第 7 列-S
或 --status
:顯示用戶密碼狀態--stdin
:從標準輸入讀取令牌。主要用在經過腳本批量添加用戶,不須要交互的場景
echo "123456" | passwd --stdin user1
。儘可能不要在shell裏這樣操做,history
會記錄執行過的歷史命令,設置的密碼可能不被泄露用戶名
:用戶名省略,默認修改當前登陸用戶的密碼。通常用戶修改本身的密碼直接執行 "passwd
" 便可注意:只有管理者才能修改其餘用戶的密碼,普通用戶只能修改本身的密碼
命令格式:usermod [選項] 用戶名
選項:
-u 用戶ID
:修改用戶ID-d 家目錄
:修改用戶家目錄-c 用戶說明
:修改用戶說明-g 初始組名
:修改用戶初始組-G 附加組名
:修改用戶附加組-s shell
:修改用戶登入後所使用的 shell 程序-e 日期
:修改帳號失效日期,格式是 "YYYY-MM-DD"。即修改 /etc/shadow 第 8 列數據-l 新用戶名
:修改用戶名-L
:臨時鎖定帳號。與 "passwd -l 用戶名
" 做用同樣-U
:解鎖帳號命令格式:userdel [選項] 用戶名
選項:
-r
:同時刪除用戶家目錄和用戶郵件命令格式:groupadd [選項] 組名
選項:
-g 組ID
:指定組ID-r
:建立系統用戶組,系統用戶組的組ID小於500。與 /etc/login.defs 內的 GID_MIN 有關命令格式:groupmod [選項] 組名
選項:
-g 組ID
:修改組ID-n 新組名
:修改組名命令格式:groupdel 組名
注意:若是用戶組是某個用戶的初始組,必須先刪除這個用戶或者修改該用戶的GID後,才能刪除該用戶組
若是用戶 user1 有個多個用戶組(初始組:user1,附加組:group1,group2),則登陸後默認的有效組是該用戶的初始組user1,此時該用戶建立的文件所屬組就是 user1,若是讓該用戶建立的文件所屬組爲 group1,就須要使用 "newgrp
" 命令切換有效組爲 group1
命令格式:newgrp 組名
若是管理員太忙了,能夠爲某個用戶組設置一個管理員來幫忙管理該組成員用戶。 通常組密碼和組管理員功能其實不多使用了,徹底能夠由 "sudo
" 取代。
命令格式:gpasswd [選項] 組名
選項:
-a 用戶名
:添加用戶到該組-d 用戶名
:從組中刪除某個用戶-A 用戶1,用戶2,...
:添加組管理員列表-M 用戶1,用戶2,...
:添加組成員列表。注意,-a
是追加,-M
是會覆蓋原有值-r
:刪除組密碼-R
:使組密碼失效gpasswd 組名
:設置用戶組密碼
注意:若是某個用戶組設置了組密碼,就表明容許非該組內的用戶能夠經過 "
newgrp
" 命令(會提示輸入密碼),切換有效組爲該組。至關於把非該組內的用戶臨時添加到了該組,只是臨時生效,並無修改 "/etc/group" 和 "/etc/gshadow" 文件
命令格式:id [選項] [用戶名]
選項:通常使用不加任何選項,
-g
:僅顯示該用戶當前有效的用戶組ID-G
:顯示該用戶全部用戶組ID-u
:僅顯示該用戶ID-Z
:僅顯示當前用戶的安全環境該命令使用通常不加任何選項,基本能輸出全部要查詢的信息。例如直接執行 "id
" 或 "id root
"
命令格式:groups [用戶1] [用戶2] ...
groups
",表明查詢當前進程用戶查詢出來的第一個組是當前有效組
命令格式:whoami
w
和 who
命令做用類似都是顯示系統中正在登陸的用戶信息,這兩個命令查詢信息都來源於日誌文件 "/var/run/utmp"。
w 命令格式:w [選項] [用戶名]
選項:
-h
:不打印頭信息-u
:當顯示當前進程和cpu時間時忽略用戶名-s
:使用短輸出格式-f
:顯示用戶從哪登陸-i
:登陸來源展現ip地址而不是主機名示例:
[root@localhost ~]# w 18:31:08 up 1 day, 16 min, 3 users, load average: 0.00, 0.00, 0.00 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root tty1 - Sat18 49:23 0.07s 0.07s -bash root pts/0 192.168.199.119 18:22 8:17 0.02s 0.02s -bash root pts/1 192.168.199.119 18:22 0.00s 0.03s 0.00s w
輸出內容說明:
第一行內容:
第二行內容:
who 命令格式:who [選項] [查詢文件]
選項:
-H
:顯示各欄位的標題信息列-q
:只顯示登入系統的賬號名稱和總人數-w
:顯示用戶的信息狀態欄-u
:顯示閒置時間,若該用戶在前一分鐘以內有進行任何動做,將標示成"."號,若是該用戶已超過24小時沒有任何動做,則標示出"old"字符串命令格式:chsh [選項] [用戶名]
選項:
-l
:列出目前系統全部可用shell。其實就是輸出 "/etc/shells" 文件內容-s 新shell程序
:指定要設定的shell。其實就是修改上面說到的 "/etc/passwd" 文件的第 7 列數據useradd
命令添加用戶時,有些選項若是不指定的話都會有默認值,好比家目錄。添加用戶時默認值的參考文件主要有兩個,分別是 "/etc/default/useradd" 和 "/etc/login.defs",下面對文件內容一一進行說明
/etc/default/useradd 文件,內容以下:
[root@localhost ~]# cat /etc/default/useradd # useradd defaults file GROUP=100 HOME=/home INACTIVE=-1 EXPIRE= SHELL=/bin/bash SKEL=/etc/skel CREATE_MAIL_SPOOL=yes
GROUP=100
:默認初始組ID,就是說新添用戶時的默認初始組是 users 組(users組的GID就是100),可是你看到的現象可能並非這樣,而是建立了一個和用戶名同樣的用戶組做爲該新用戶的初始組。這是由於針對用戶組有兩種不一樣的機制,這兩種機制分別是:
HOME=/home
:用戶家目錄位置。即每一個新建用戶會在該目錄下新建一個和用戶名同樣的目錄來存放該用戶的文件INACTIVE=-1
:密碼過時後的寬限天數。即對應 "/etc/shadow" 文件的第 7 列。這裏的值是天數,若是是 0 表明密碼過時馬上失效;若是是 -1 則是表明密碼永遠不會失效;若是是其餘數字如 30 ,則表明密碼過時後 30 天后才失效EXPIRE=
:默認失效的日期。即對應 "/etc/shadow" 文件的第 7 列。默認值是空,表明永久有效SHELL=/bin/bash
:使用的 shell 程序。即對應 "/etc/passwd" 文件的第 7 列SKEL=/etc/skel
:新建用戶家目錄的模板文件。該目錄下的文件會所有原封不動的複製到新用戶的家目錄下CREATE_MAIL_SPOOL=yes
:是否給新用戶創建郵箱。這裏默認建立,就是說新建用戶會建立一個和用戶名同樣的文件放在 "/var/spool/mail/" 目錄(該目錄由 "/etc/login.defs" 文件指定的) 下/etc/login.defs 文件,內容以下:
[root@localhost ~]# cat /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_MAX 60000 GID_MIN 500 GID_MAX 60000 CREATE_HOME yes UMASK 077 USERGROUPS_ENAB yes ENCRYPT_METHOD SHA512
MAIL_DIR /var/spool/mail
:默認郵箱目錄PASS_MAX_DAYS 99999
:密碼有效期。對應 "/etc/shadow" 文件的第 5 列PASS_MIN_DAYS 0
:兩次密碼修改時間隔。對應 "/etc/shadow" 文件的第 4 列PASS_MIN_LEN 5
:密碼最小長度。已被 PAM 模塊取代,這裏再也不生效PASS_WARN_AGE 7
:密碼到期前的警告天數。對應 "/etc/shadow" 文件的第 6 列UID_MIN 500
:最小UIDUID_MAX 60000
:最大UIDGID_MIN 500
:最小GIDGID_MAX 60000
:最大GIDCREATE_HOME yes
:建立用戶時是否爲其建立家目錄。默認建立UMASK 077
:新建用戶家目錄的默認權限。這裏值爲 077,那麼新建用戶家目錄的權限是 700,即 "drwx------"USERGROUPS_ENAB yes
:使用 userdel
命令刪除用戶時,若是所屬的初始組已經沒有其餘用戶隸屬於該組了,是否刪除該用戶的初始組。默認是刪除ENCRYPT_METHOD SHA512
:密碼加密方式。加密方式有:SHA5十二、DES、MD5當用普通帳號登陸系統,須要執行某些操做可是權限不足,這時就須要切換到更高權限的用戶身份去執行啦。這裏就涉及到兩個命令的使用 su 和 sudo
su 是最簡單的用戶身份切換命令,能夠進行任何身份的切換。除了 root 用戶切換到其餘用戶不須要輸入密碼外,其餘狀況使用 "su" 命令切換用戶時都必須輸入要切換用戶的登陸密碼
命令格式:su [選項] [用戶名]
選項:
-
或 -l
或 --login
:使用 login-shell 的變量文件讀取方式來登陸系統。即切換身份時同時切換環境變量,若是不加該選項的話,用戶切換後環境變量仍是舊的,建議每次切換都帶上該選項-c 命令
:只是以某個用戶執行一次指令,而不切換用戶身份用戶名
:要切換的用戶。若是省略則表明切換到 root 用戶示例:
# 1. 從 user1 切換至 root 用戶,提示輸入密碼 [user1@localhost ~]$ su - 密碼: # 2. 查看 /root/aaa.txt 文件權限、全部者和所屬組 [root@localhost ~]# ls -l aaa.txt -rw-r--r--. 1 root root 17 4月 18 19:15 aaa.txt # 3. 從 root 用戶切換至 user2 用戶,不須要輸入密碼直接切換成功 [root@localhost ~]# su - user2 # 4. 查看 user2 用戶所屬組。不在 root 組,即不能查看/root/aaa.txt內容 [user2@localhost ~]$ id user2 uid=502(user2) gid=502(user2) 組=502(user2),501(user1) # 5. 使用 root 身份執行一次查看指令,而不切換身份 [user2@localhost ~]$ su -c "cat /root/aaa.txt" root 密碼: aaaaaaaaaaaaaaaa [user2@localhost ~]$
雖然 su 很方便了,可是若是有不少人都須要切換 root 身份來執行某些指令,就必須知道 root 密碼,這樣容易致使密碼流出,很不妥。相對於 su 必須知道要切換的用戶密碼,而使用 sudo 來切換身份只須要知道用戶本身的密碼便可。並非全部用戶都能使用 sudo 切換身份,前提必須是由管理員審覈後,給用戶開放了 sudo 權限才能使用,能使用 sudo 其實就已經表明是受信任的用戶了,這也是使用 sudo不要須要知道切換用戶密碼的緣由。
命令格式:sudo [選項] 原始命令
選項:
-u 用戶名
:要使用的用戶身份,省略此選項默認是 root 身份-b
:在後臺執行指令示例,
# 1. 使用 user1 用戶身份建立文件 /tmp/aaa.txt [root@localhost ~]# sudo -u user1 touch /tmp/aaa.txt # 2. 查看 /tmp/aaa.txt,發現文件所屬者和所屬組都是 user1,而不是 root [root@localhost ~]# ls -l /tmp/aaa.txt -rw-r--r--. 1 user1 user1 0 4月 18 21:32 /tmp/aaa.txt [root@localhost ~]#
sudo 預設只有 root 用戶可以使用,那麼普通用戶如何才能使用 sudo 來獲取其餘用戶身份呢?這就涉及到 "/etc/sudoers" 文件的配置,由於 sudo 的執行流程是這樣的:
因此用戶可否使用 sudo,只須要編輯 /etc/sudoers 文件就能夠了。由於該文件有必定的規範性,直接使用 vi 去編輯不是太好,所以系統提供了一個命令 visudo
專門來編輯這個文件,並在編輯完成退出編輯界面時去進行校驗該文件的語法。下面對該文件內容進行介紹:
[root@localhost ~]# visudo ...省略... # 使用者 來源主機=(可切換的身份) 可執行的命令 root ALL=(ALL) ALL
用戶名
" 或者 "%組名
" ,指給哪一個用戶或者用戶組下的全部用戶授予 sudo 權限。注意若是是用戶組,前面要加 "%
"ALL
" 表明全部主機ALL
" 表明任意身份。這個字段能夠省略,默承認切換 root 身份。ALL
" 表明所有指令。前面若是加了 "NOPASSWD:
",則使用 sudo 時能夠免密碼(使用者本身的密碼)輸入示例,
# 1. 受權user1能夠切換root身份重啓服務器。可切換身份省略默認就是root身份 user1 ALL= /sbin/shutdown -r now # 等同於上面一條 user1 ALL=(root) /sbin/shutdown -r now # 2. 受權user1能夠修改其餘用戶密碼,可是不能修改root密碼。! 是不可執行的意思 user1 ALL=(root) !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root # 3. 受權wheel用戶組全部身份權限,而且免密碼輸入 %wheel ALL=(ALL) NOPASSWD: ALL # 4. 設置別名。User_Alias(設置用戶別名)、Cmnd_Alias(設置命令別名)、Host_Alias(設置來源主機名別名) # 注意別名必定要用大寫字母,入下面的 ADMPW、ADMPWCOM User_Alias ADMPW = user1, user2, user3 Cmnd_Alias ADMPWCOM = !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root ADMPW ALL=(root) ADMPWCOM
若是兩次執行 sudo 的間隔在五分鐘內,那麼再次執行 sudo 時就不須要再次輸入密碼了。這是由於系統相信你在五分鐘內不會離開你的做業,因此執行 sudo 的是同一我的