《鳥哥的Linux私房菜》筆記
1、Linux的賬號與用戶組
如何管理好一個服務器主機的賬號,以及在管理主機賬號時Linux到底是如何辨別每一個用戶的賬號的!
1.1、用戶標識符:UID與GID
雖然我們登錄Linux主機的時候,輸入的是我們的賬號,但是其實Linux主機并不會直接認識你的”賬號名稱“,它僅僅認識ID(一組號碼)。賬號只是方便給我們記憶而已。賬號與ID的對應關系就在/etc/passwd當中。
每個登錄的用戶至少都會取得兩個ID,一個用戶ID(UserID),一個是用戶組ID(GroupID)。在一臺Linux主機中,UID和GID不要隨便進行更改。
1.2、用戶賬號
Linux系統上面用戶登錄主機,必須在計算機前利用 tty1~tty7的終端機提供的login接口輸入賬號密碼登錄,或者通過網絡遠程ssh登錄。
那么在你輸入賬號密碼后,系統幫你處理了什么?
1、先尋找/etc/passwd里面是否有你輸入的賬號,如果沒有則跳出,有則讀取用戶相應的信息(GID,shell等);
2、接下來核對密碼表,在/etc/shadow里面;
3、如果一切OK,就進入shell管控階段。
所以當你要登錄Linux主機的時候,那個/etc/passwd與/etc/shadow就必須要讓系統讀取(這也是很多攻擊者會將特殊賬號寫入/etc/passwd里面去的緣故)。
跟用戶賬號有關的有兩個非常重要的文件,一個是管理用戶 UID/GID 重要參數的/etc/passwd,一個則是專門管理密碼相關數據的/etc/shadow。
/etc/passwd文件結構
每一行代表一個賬號,有多少行就有多少賬號在你的系統中,里面很多賬號是系統正常運行所必要的,所以請不要隨意刪除。
很多程序的運行都與權限有關,而權限又與UID/GID有關。
1、賬號名稱,用來對應UID;
2、密碼,放置在/etc/shadow,所以此處你看到一個"x";
3、UID,這個就是用戶標識符,UID為0的時候就是root,請注意;
4、GID,這個與/etc/group有關;
5、用戶信息說明列,用來解釋賬號的意義;
6、主文件夾,如/root;
7、Shell,登陸以后所取得的shell。
/etc/shadow文件結構
各程序需要讀取/etc/shadow來了解不同賬號的權限,因此注意/etc/shadow權限。
1、賬號名稱,必須與/etc/passwd相同才行;
2、密碼,這是經過編碼的密碼,你看到僅是一些特殊字符。在此字段(密碼)前加上*或!改變了密碼字段會讓密碼“暫時失效”;
3、最近更動密碼的日期,初始日期是從1970-01-01開始,單位是天;
4、密碼不可被更動的天數,表示需要更改密碼后經過多少天才可以再被更改,0表示隨時可以更改;
5、密碼需要重新更改的天數,表示最近一次更改密碼后在多少天內需要再次更改密碼才行,9999大概為273年,表示沒有強制之意;
6、密碼需要更改期限前的警告天數,表示提醒你的密碼還有多少天要過期了;
7、密碼過期后賬號的寬限時間;
8、賬號失效日期;
9、保留;
一般用戶的密碼忘記了,可以讓系統管理員幫忙重新設置密碼;而root密碼忘記了的話,你需要使用各種可行的方法開機進入Linux再去修改。
1.3、有效與初始用戶組:groups,newgrp
用戶組的配置文件存在于/etc/group與/etc/gshadow下面。
/etc/group文件結構
1、用戶組名稱;
2、用戶組密碼;
3、GID;
4、此用戶組支持的賬號名稱,一個賬號可以加入多個組,某個賬號需要加入用戶組時,將該賬號填入這個字段即可;
有效用戶組(effective group)與初始用戶組(initial group)
用戶可以加入多個用戶組,那么用戶在作業的時候,到底是以哪個用戶組為準呢?
還記得每個用戶在他的/etc/passwd里面的第四列有所謂的GID吧?那個GID就是所謂的“初始用戶組”。也就是用戶登錄系統,立刻就擁有這個用戶組額相關權限的意思。
不過,針對文件而言,我所做的操作是基于用戶當前的有效用戶組的組權限。
groups:有效與支持用戶組的查看
groups
newgrp:有效用戶組的切換
切換的用戶組必須是已經支持的用戶組,另外以一個shell來提供這個功能。
newgrp root
/etc/gshadow文件結構
1、用戶組名;
2、密碼列,開頭為!表示無合法密碼;
3、用戶組管理員的賬號;
4、該用戶組的所屬賬號。
gshadow最大的功能就是創建組管理員。
2、賬號管理
2.1、新增與刪除用戶
useradd,passwd,usermod,userdel,相關配置文件等。
useradd命令
其實系統已經幫我們規定好了非常多的默認值,所以問哦們可以簡單地使用“useradd”創建賬號。
由于系統賬號主要是用來進行系統所需服務的權限設置,所以系統賬號默認都不會主動創建主文件夾。
passwd命令
使用useradd創建了賬號之后,在默認的情況下,該賬號是暫時被封鎖了的。需要直接設置新密碼就好。
關于設置密碼的幾點要求:
密碼不能與賬號相同;
密碼盡量不要選用字典里面會出現的字符串;
密碼需要超過8個字符;
密碼不要使用個人信息,如身份證、電話、生日等;
密碼不要使用簡單的關系式等;
密碼盡量使用大小寫、數字、特殊字符的組合。
新版passwd支持標準(--stdin)輸入來輸入密碼:
echo "zhang" | passwd --stdin zhang
chage命令
詳細地密碼參數顯示功能。
chage有一個很不錯的功能,可以讓用戶第一次登錄時強制它們一定要更改密碼后才能使用系統資源,參考方法如下。
chage -d 0 username
usermod命令
用戶數據的微調
userdel命令
userdel
userdel -r ? ?#連同主文件夾一起刪
如果想要完整地將某個賬號刪除,最好可以在刪除之前執行 find / -user username 查處整個系統內屬于username的文件,然后進行刪除。
2.2、用戶功能
不論是useradd、userdel、usermod,都是系統管理員才能使用的命令。這下面介紹幾個一般用戶常用的賬號數據更改與查詢命令。
finger? ? #可以查閱很多用戶相關的信息和用戶登錄信息
chsh ? ?#change shell
id
id這個命令則可以查詢某人或自己相關UID/GID等的信息,也可以判斷系統上有無某賬號。
2.3、新增與刪除用戶組
groupadd
groupmod
groupdel
gpasswd ? ?#用戶組管理員功能
3、ACL:主機的具體權限規劃
ACL機制是用來單獨針對某一個用戶或者某一組來設置特定的權限需求。
3.1、什么是ACL
ACL(Access Control List),主要的目的是提供傳統的owner、group、others的read、write、execute權限之外的具體權限設置。ACL可以針對單一用戶、單一文件或目錄來進行r、w、x的權限設置,對于需要特殊權限的使用情況來說非常有幫助。
可以針對 用戶來設置其權限;
可以針對用戶組來設置其權限;
可以針對目錄/文件來設置權限。
3.2、如何啟動ACL
由于ACL是傳統的UNIX-like操作系統權限的額外支持項目,因此要使用ACL必須要有文件系統的支持才行。ext4文件系統支持ACL的功能。
3.3、ACL的設置技巧:getfacl,setfacl
getfacl:取得某個文件/目錄的ACL設置項目;
setfacl:設置某個文件/目錄的ACL規定;
setfacl
getfacl
利用" u:用戶:權限"的方式來設置;
如果一個文件設置了ACL參數后,他的權限部分就會多出一個 + 號!
現實的數據前面加上 # 號的表示文件的默認屬性;
有效權限(mask)定義了ACL最大允許的權限,mask沒有的權限就算ACL定義了也無法生效,不過通常都將mask設置位rwx。
設置mask
ACL的權限設置默認是不會繼承的,如要讓子目錄繼承,則如下所示:
ACL設置的屬性全部取消:
setfacl -b /dir/xxxx
4、用戶身份切換
切換身份的幾個原因:
使用一般賬號,系統平日操作的好習慣;
用較低權限啟動系統服務;
軟件本身的限制;
一般用戶轉變為root用戶:
以" su - " 直接將身份變為root,但是這個命令需要root的密碼;
以" sudo 命令" 執行root的命令串,sudo需要事先設置妥當,且只需要輸入用戶自己的密碼,因此當多人共同管理同一臺主機的時,sudo比su來得好些。至少root密碼不會流傳出去。
4.1、su
su是最簡單的身份切換命令,它可以進行任何身份的切換。
su ?和 su - ?兩者差別很大。
su 切換位root的身份,讀取的變量設置方式位 non-login shell 的方式,這種方式下很多原本的變量不會被改變;
su - 讀取變量的方式位 login-shell ,這樣才會連同PATH等變量都轉換成新用戶的環境。
4.2、sudo
當我的主機是很多人管理的環境時,如果大家都使用 su ?來切換為root 的身份,那么不就每個人都得要知道root的密碼,而太多人知道的秘密就不是秘密了,密碼就可能會流傳出去。
sudo 執行只需要自己的密碼,或者不需要密碼。由于sudo可以讓你以其他用戶的身份執行命令(通常是使用root的身份來執行命令),因此并非所有人都能夠執行sudo,而是僅有 /etc/sudoers內的用戶才能夠執行sudo這個命令。
sudo
sudo的執行流程:
當用戶執行sudo時,系統于/etc/sudoers文件中查找該用戶是否由執行sudo的權限;
若用戶具有可執行sudo的權限后,便讓用戶輸入自己的密碼來確認;
若密碼輸入成功,變卡斯和i進行sudo后續的命令;
若欲切換的身份與執行者身份相同,那也不需要輸入密碼;
sudo執行的重點,能夠使用sudo必須要看/etc/sudoers的設置值,而可使用sudo的是通過輸入自己的密碼來執行后續的命令串。
visudo與/etc/sudoers
除了root用戶外,若想使用sudo執行屬于root的權限命令,則root需要先使用visudo去修改/etc/sudoers,讓某賬號/組能夠擁有全部或部分的root命令功能。
為什么是使用visudo呢?這是因為/etc/sudoers是有語法的,如果設置錯誤那會造成無法使用sudo的不良后果,并且在結束離開修改界面時,系統會去檢驗/etc/sudoers的語法。
單一用戶可進行root所有命令與sudoers文件語法:
1,用戶賬號;
2,登陸著的來源主機
3,可切換的身份;
4,可執行的命令,這個命令請務必以絕對路勁編寫。
利用用戶組以及面密碼的功能處理visudo
有限制的命令操作
加上 " ! " 代表不可執行的意思
通過別名設置viduso
通過 User_Alias 創建出一個新賬號,這個賬號名稱一定要使用大寫字符來處理,包括 Cmnd_Alias(命令別名)、Host_Alias(來源主機名別名) 都需要使用大寫字符的!
sudo的時間間隔問題
如果兩次sudo操作的間隔沒有超過5分鐘,那就不需要再次輸入密碼,超過則需要。
5、用戶的特殊shell與PAM模塊
如果我需要新建的一個僅能夠使用某項服務相關的賬號,而改賬號并不能登錄Linux主機。如果不能給予一個賬號一個密碼,那么該賬號就無法使用系統的各項資源,各種服務資源。如果給予該賬號一個密碼,那么該賬號就可能可以登錄Linux主機。
5.1、特殊的shell,/sbin/nologin
在/etc/passwd文件結構里面我們談過系統賬號,系統賬號的shell就是使用/sbin/nologin,重點在于系統賬號是不需要登錄的!所以我們就給他這個無法登錄的合法shell,使用了/sbin/nologin這個shell,即使用戶有了密碼,想要登錄系統時他也無法登錄。
但是請注意,我們說的這個無法登錄指的僅是這個用戶無法使用 bash 或其他 shell 來登錄系統而已,并不是說這個賬號就無法使用系統資源。
如我們圖上所示的mail用戶,是mail服務,并不需要登錄主機。所以shell設置為/sbin/nologin。
如果我想讓/sbin/nologin用戶知道,他們不能登錄主機,我們可以通過/etc/nologin.txt文件來說明。
vim /etc/nolougin.txt
5.2、PAM模塊簡介
PAM(Pluggable Authentication Modules)嵌入式模塊
PAM可以說是一套應用程序接口(Application Programming Interface,API)它提供了一連串的驗證機制,只要用戶將驗證階段的需求告知PAM后,PAM就能夠回報用戶驗證的結果(成功或失敗)。
由于PAM僅是一套驗證的機制,又可以提供給其他程序所調用,因此不論你使用什么程序,都可以使用PAM來進行驗證,如此一來,就能夠讓賬號密碼或者是其他方式的驗證具有一致的結果。
PAM是一個獨立的API存在,只要任何程序有需求時,可以向PAM發出驗證要求的通知,PAM經過一連串的驗證后,將驗證的結果回報給該程序,然后該程序就能夠利用驗證的結果來進行可登錄或顯示其他無法使用的信息。這也就是說,你可以在寫程序的時候將PAM模塊的功能加入,就能夠利用PAM的驗證功能。因此目前很多程序都會利用PAM。
PAM用來進行驗證的數據稱為模塊(Modules),每個PAM模塊的功能都不大相同。例如passwd。
5.3、PAM模塊設置語法
PAM通過一個與程序相同的文件名的配置文件來進行一連串的認證分析需求。我們以passwd這個命令調用PAM。當你執行passwd后,這個程序的流程如下:
1,用戶開始執行/usr/bin/passwd 這支程序,并輸入密碼;
2,passwd調用PAM模塊進行驗證;
3,PAM模塊會到 /etc/pam.d/ 中尋找與程序(passwd)同名的配置文件;
4,依據 /etc/pam.d/passwd 內的設置,引用相關的PAM模塊逐步進行驗證分析;
5,將驗證結果(成功、失敗以及其他意思)回傳給passwd這個程序;
6,passwd這個程序會根據PAM回傳的結果決定下一個操作(重新輸入新密碼或通過驗證!)。
其實重點就是/etc/pam.d/里面的配置文件,以及配置文件所調用的PAM模塊進行的驗證工作。
來看看 /etc/pam.d/passwd 這個配置文件
這個配置文件中,除了第一行#號聲明PAM版本外,其他任何 "#" 都是注釋,而每一行都是一個獨立的驗證流程,每一行可以區分為三個字段,分別為 驗證類型(type)、控制標志(flag)、PAM的模塊與該模塊的參數。
上面這個 ?"include" (包括)這個關鍵字,它代表的是調用后面的文件來作為這個類別的驗證,所以,上面的include都要重復調用 /etc/pam.d/system-auth 那個文件來進行驗證。
第一個字段:驗證類型(Type)
驗證類型主要分為四種:
auth(authentication(認證)),這種類型主要是用來檢驗用戶身份憑證;
account(賬號),大部分在進行授權(authorization),這種類型主要在檢驗用戶是否具有正確的權限;
session,是會話期間的意思,所以session管理的就是用戶在這次登錄期間PAM所給予的環境設置;
passwd,這個類型主要用于提供驗證的修訂工作;
第二個字段:驗證的控制標志(control flag)
它代表通過驗證的標準是什么,管控該驗證的放行方式,主要也分為四種控制方式:
required,此驗證不論成功(success)還是失敗(failure)都會繼續后續的驗證流程;
requisite,此驗證失敗(failure)就直接終止,成功才進行下一步;
sufficient,驗證到成功(success)就立刻回傳給程序,失敗繼續下一步;
optional,這個模塊控件目的大多是在顯示信息而已,并不用再驗證方面。
5.4、常用模塊簡介
系統中的詳細模塊情報
/etc/pam.d/*:每個程序個別的PAM配置文件;
/lib64/security/*:PAM模塊文件的實際放置目錄;
/etc/security/*:其他PAM環境的配置文件;
/usr/share/doc/pam-*/:詳細的PAM說明文件。
下面我們來看一下/lib64/security/pam_*這些文件的用法:
介紹幾個比較常用的PAM模塊。
pam_security.so
限制系統管理員(root)只能從安全的(secure)終端機登錄。例如 tty1,tty2,等就是傳統的終端機設備名稱。安全的終端機設備寫在 /etc/secutetty 這個文件里。由于遠程連接屬于 pts/n 的動態終端機接口設備名稱,并沒有寫入到 /etc/securetty。
pam_nologin.so
這個模塊可以限制一般用戶是否能夠登錄主機之用,當/etc/nologin這個文件存在時,則所有一般用戶均無法在登錄系統了!
pam_selinux.so
SELinux是個針對程序來進行詳細管理權限的功能。
pam_console.so
這個模塊可以讓用戶通過特殊的終端接口(console)梳理登錄系統。
pam_loginuid.so
為了驗證用戶的UID真的是我們所需要的數值,可以使用這個模塊來進行規范。
pam_env.so
用來設置環境變量的一個模塊。
pam_UNIX.so
很復雜但是很重要的模塊,這個模塊可以用于驗證階段的認證功能,授權階段的賬號許可證管理,回憶階段的日志文件記錄,密碼更新階段的檢驗。
pam_cracklib.so
用來檢驗密碼的強度!包括密碼輸入幾次錯誤就斷掉連接。
pam_limits.so
討論一下login的PAM驗證機制流程:
1,驗證階段(auth):
首先經過pam_securetty.so判斷,如果用戶是root時,則會參考/etc/securetty的設置,接下來經過pam_env.so設置額外的環境變量,在通過pam_UNIX.so檢驗密碼,若通過回報login程序,若不通過則繼續往下以pam_succeed_if.so判斷UID是否大于500,若小于500則回報失敗,否則再往下以pam_deny.so拒絕連接。
2,授權階段(account):
先以pam_nologin.so判斷/etc/nologin是否存在,若存在則不許一般用戶登錄;接下來以pam_UNIX進行賬號管理,在意pam_succeed_if.co判斷UID是否小于500,若小于500則不記錄登錄信息。最后以pam_permit.so允許該賬號登錄。
3,密碼階段(passwd):
先以pam_cracklib.so設置密碼僅能嘗試錯誤幾次,接下來以pam_UNIX.so通過md5,shadow等功能進行密碼校驗,若通過則回報login程序,若不通過則以pam_deny.so拒絕登錄。
4,會話階段(session):
先以pam_selinux.so暫時關閉SELinux,使用pam_limits.so設置好用戶能夠操作的系統資源,登陸成功后開始記錄相關信息在登錄文件中,以pam_loginuid.so設置不同的UID權限,打開pam_selinux.so功能。
總之,就是依據驗證類型(type)來看,然后先由login的設置去查閱,如果出現了 includesystem-auth ?就轉到 system-auth 文件夾中的相同類型,去取得額外的驗證流程就是了。然后再到下一個驗證類型,最終將所有的驗證都跑完,就結束這次的PAM驗證。
5.5、其他相關文件
幾個可能用到的配置文件
limits.conf(etc/security/limits.conf),設置完成就生效,但已經登錄的用戶或組要再次登錄才對他們生效。
#賬號,限制依據,限制項目,限制值
#第一字段為賬號,或者是用戶組(要加上@,如@studen)
#第二字段為限制的依據,是嚴格(hard)還是警告(soft)
#第三字段為相關限制,如maxlogins(最大登錄數)
#第四字段為限制的值,如最大登錄數為4
/var/log/secure,/var/log/messages
發生一些錯誤信息都會被記錄到這里面
6、Linux主機上的用戶信息傳遞
6.1、查詢用戶:w、who、last、lastlog
w、who:查詢目前系統上已經登錄的用戶;
last:列出從系統新建之后到目前所有登錄者的信息;
lastlog:列出每個賬號的最近登錄時間,全部賬號。
6.2、用戶對談:write、mesg、wall
利用write命令給系統上面的賬號發消息;
利用mesg命令不接受任何消息;
利用wall命令給系統上所有用戶傳送信息(廣播)。
6.3、用戶郵件信箱:mail
一般來說,mailbox都會放置在/var/spool/mail里面,一個賬號一個mailbox。
mail username@hostname -s "郵件主題"?
當然也可以通過輸入重定向來講文件內容傳輸
mail username@hostname -s "郵件主題" ?< filename
7、手動新增用戶
一般來說,我們不建議通過手動的方式來新增用戶。因為用戶的新建涉及用戶的GID/UID等權限的關系,而且,與文件/目錄的權限也有關系,使用useradd可以幫我們自動設置好等相關權限設置。而手動添加的時候可能后遺忘東西。
7.1、一些檢查工具
pwck命令
pwck檢查/etc/passwd這個賬號配置文件內的信息,與實際的主文件夾是否存在等信息,還會比較/etc/passwd和/etc/shadow的信息是否一致。有錯誤時還會提醒用戶修改
上面這些系統服務賬號沒用文件夾是正常的,我們忽略正常的錯誤!
pwconv命令
這個命令主要是將/etc/passwd內的賬號與密碼移動到/etc/shadow當中!
7.2、特殊賬號(如學號,工號)的手工創建
其實純數字賬號可能會混亂系統對UID/GID的判斷,并且ACL也可以通過UID/GID來設置,也比較混亂。
但很多時候數字賬號是必須要的,So,do it。
手動建立賬號的操作:
1,先新建所需要的用戶組(vi /etc/group);
2,將 /etc/group 與 /etc/gshadow 同步 (grpconv);
3,新建賬號的各個屬性(vi /etc/passwd);
4,將 /etc/passwd 與 /etc/shadow同步(pwconv);
5,新建該賬號的密碼(passwd accountname);
6,新建用戶主文件夾(cp -a /etc/skel /home/accountname );
7,更改用戶主文件夾的屬性(chown -R accountname.group/home/accountname)。
#不建議設置一些奇怪的賬號名稱
7.3、批量新建賬號模板(適用于passwd --stdin 參數)
建立一個scripts來執行新增用戶的功能,密碼用戶名
vi accounts.txt
user01
user02
user03
....
user20
vi ?accounts.sh
if [ ! accounts.txt ];then
? ? echo "賬號文件不存在“
? ?exit 1
fi
? ? usernames=$(cat accounts.txt)
for user in $usernames
do
? ? useradd $user
? ? echo $user | passwd --stdin $user
? ? chage -d 0 $user ? ?#強制登錄修改密碼
done
8、重點回顧
Linux操作系統上面,關于賬號與用戶組,其實記錄的是UID/GID的數字而已;
用戶賬號/用戶組與UID/GID的對應,參考/etc/passwd及/etc/group兩個文件;
/etc/passwd文件結構以冒號隔開,共分為七個字段,分別是賬號名稱、密碼、UID、GID、全名、主文件夾、shell;
UID只有0與非0兩種,非0則為一般賬號。一般賬號又分為系統賬號(1-499)及可登錄者賬號(大于500);
賬號的密碼已經移動到/etc/shadow文件中,該文件權限僅有root可以改動。該文件分為九個字段,內容為賬號名稱、加密密碼、密碼更改日期、密碼最小可變動日期、密碼最大需變動日期、密碼過期前警告天數、密碼失效天數、賬號失效日、保留未使用;
用戶可以支持多個用戶組,其中在新建文件時會影響新文件用戶組者,為有效用戶組。而寫入/etc/passwd的第四個字段者,稱為初始用戶組;
與用戶新建、更改參數、刪除有關的命令為useradd,usermod,userdel等,密碼新建則為passwd;
與用戶組新建、修改、刪除有關的命令為groupadd、groupmod,groupdel等;
用戶組的查看與有效用戶組的切換分別為groups以及newgrp命令;
useradd命令作用參考的文件有/etc/default/useradd,/etc/login.defs,/etc/skel/等;
查看用戶詳細的密碼參數,可以使用“chage-l 賬號“來查看;
用戶自行修改參數的命令有chsh,chfn等,查看命令則有id,finger等;
ACL可進行單一個人或組的權限管理,但ACL的啟動需要有文件系統的支持;
ACL的設置可使用setfacl,查閱則使用getfacl;
身份切換可使用su,也可使用suso,但使用sudo,必須先以visudo設置可使用的命令;
PAM模塊可進行某些程序的驗證程序,與PAM模塊有關的配置文件位于/etc/pam.d/*及/etc/security/*中;
系統上面賬號登陸情況的查詢,可使用w,who,last,lastlog等;
在線與用戶交談可使用write、wall,脫機狀態下可使用mail傳送郵件。