【Linux命令】《鳥哥Linux基礎》第十三章 Linux賬號管理與ACL權限設置

第十三章 Linux賬號管理與ACL權限設置

13.1 Linux的賬號與用戶組

13.1.1 用戶標識符:UID與GID

人一般容易記憶賬號,但是Linux主機只認識ID,賬號與ID的對應關係寫在/etc/passwd中。

每個登錄的用戶都至少會獲取兩個ID:用戶ID(UID)、用戶組ID(GID)。
文件通過UIDGID判別它的擁有者和用戶組。要求顯示文件屬性時,系統根據/etc/passwd/etc/group的內容找到UIDGID對應的賬號與組名,顯示出來。

重要內容:

/etc/passwd文件以冒號分隔開,共分7個字段,分別是【賬號名稱、密碼、UID、GID、全名、家目錄、shell】;

/etc/group文件以冒號爲分隔符,共分9個字段,分別是【賬號名稱、加密密碼、密碼修改日期、密碼最小可變動日期、密碼最大需變動日期、密碼過期前警告日數、密碼失效天數、賬號失效日、保留未使用】。

13.1.2 用戶賬號

Linux系統上的用戶如果需要登錄主機以獲取shell的環境來工作,首先要用tty1-tty6的終端共的登錄接口,並輸入賬號與密碼後才能登錄。

如果是通過網絡登錄以獲取shell環境,那麼就要用到ssh這個功能。

輸入賬號和密碼後,系統做了如下工作:

  1. 查找/etc/passwd裏面是否有你輸入的賬號?如果沒有就退出;如果有,將賬號對應的UID和GID讀取出來,另外,該賬號的家目錄和shell設置一併讀出
  2. 覈對密碼錶。Linux會進入/etc/shadow裏找出對應的賬號與UID,然後覈對密碼是否正確
  3. 如果一切OK,進入shell管理的階段

/etc/passwd文件結構與/etc/shadow的文件結構,每個字段代表含義需要了解:

head -n 4 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin


head -n 4 /etc/shadow
root:$6$lIgUfTM59LhVnU17$lhE8MxUXv.PQsW.7SW5JetXLVOvShLJCSTFV4ipcZk7CjB0gGGlRYdMbYAWa/mbVArLxxGlgzgrmV1TsOGNvW1::0:99999:7:::
bin:*:17834:0:99999:7:::
daemon:*:17834:0:99999:7:::
adm:*:17834:0:99999:7:::

計算某個日期的累計日期(1970年1月1日是1,1970年1月2日是2):

echo $(($(date --date="2020/06/08" +%s)/86400+1))
輸出:
18421

瞭解當前的加密方式:

authconfig --test | grep hashing
輸出:
password hashing algorithm is sha512

忘記密碼如何挽回:
忘記一般用戶的密碼,讓root管理員通過passwd修改該用戶密碼即可。
忘記root管理員密碼,兩種方法:
①重啓進入單人維護模式,系統會主動給予root權限的bash接口,此時再以passwd修改密碼即可;
②以Live CD啓動後掛載根目錄去修改/etc/shadow,講禮貌的root密碼字段清空,再重新啓動後,root無需密碼直接登錄,登錄後再立即用passwd命令設置新的root密碼。

13.1.3 關於用戶組:有效與初始用戶組,groups,newgr

head -n 4 /etc/group
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
將普通用戶dj、alex加入root管理員:
root:x:0:dj,alex

對於已經存在的文件,用戶所在的3個組擁有哪些權限,該用戶就擁有哪些權限。
對於該用戶建立的新文件,要看新文件的用戶組是誰,需要檢查當時的有效用戶組。

[root@study ~] usermod -a -G users dj		只有管理員有權限改組(爲避免註釋顯示,把]右側的井號鍵刪除了)
[root@study ~] su dj						回到dj用戶
[dj@study root]$ groups						查看dj所屬的組
dj wheel users								屬於這三個組,第一個輸出的用戶組是有效用戶組


[dj@study root]$ touch test
touch: 無法創建"test": 權限不夠
[dj@study root]$ cd ~
[dj@study ~]$ touch test
[dj@study ~]$ ll test
-rw-rw-r--. 1 dj dj 0 6月   9 08:41 test	此時建立的文件所屬組是有效用戶組,有效用戶組的作用主要在於新建文件

有效用戶組的切換:只能切換成當前所屬的用戶組

newgrp users		更改有效用戶組
groups				查看當前所屬組
輸出:
users wheel dj


touch test2			此時新建文件
ll test2
輸出:
-rw-r--r--. 1 dj users 0 6月   9 08:45 test2		新文件的所屬組是users了

用戶組管理員:

head -n 4 /etc/gshadow
輸出:
root:::			第一個字段是組名
bin:::			第二個字段是密碼,如果是!或者空,表明該用戶組沒有管理員
daemon:::		第三個字段是用戶組管理員的賬號
sys:::			第四個字段是加入該用戶組支持的所屬賬號

13.2 賬號管理

13.2.1 新增與刪除用戶:useradd、相關配置文件、passwd、usermod、userdel

useradd [-u UID] [-g 初始用戶組] [-G 次要用戶組] [-mM] [-c 說明欄] [-d 家目錄絕對路徑] [-s shell] 使用者賬號名
		-u UID  直接指定一個特定的UID給這個賬號
		-g 初始用戶組  該用戶組的GID會被放到/etc/passwd的第四個欄位
		-G 次要用戶組  會修改/etc/group內的內容、
		-M 			  強制,不要建立使用者的家目錄(系統賬號默認值)
		-m			  強制,要建立使用者的家目錄(一般賬號默認值)
		-c			  是/etc/passwd第五欄的說明內容
		-d			  指定某個用戶成爲家目錄,而不要使用默認值,務必是絕對路徑
		-s shell	  默認是/bin/bash
		-e 日期		  【YYYY-MM-DD】可設置shadow的第8欄位,即賬號失效日的設置選項
		-f 接shadow的第7欄位  指定密碼是否會失效,0爲立刻失效,-l爲永不失效
		-D			  查看默認值



建立一般賬號:
[root@study ~] useradd vbird1
[root@study ~] ll -d /home/vbird1		默認建立使用者家目錄,且權限700
drwx------. 3 vbird1 vbird1 78 6月   9 09:04 /home/vbird1	

grep vbird1 /etc/passwd /etc/shadow /etc/group		查看相關信息
/etc/passwd:vbird1:x:1001:1001::/home/vbird1:/bin/bash
/etc/shadow:vbird1:!!:18422:0:99999:7:::
/etc/group:vbird1:x:1001:



[root@study ~] useradd -u 1500 -g users vbird2		建立UID=1500,屬於users組的用戶vbird2
[root@study ~] ll -d /home/vbird2
drwx------. 3 vbird2 users 78 6月   9 09:10 /home/vbird2

[root@study ~] grep vbird2 /etc/passwd /etc/shadow /etc/group  查看相關信息
/etc/passwd:vbird2:x:1500:100::/home/vbird2:/bin/bash
/etc/shadow:vbird2:!!:18422:0:99999:7:::



建立系統賬號:系統賬號主要是用來執行系統所需服務的權限設置,所以系統賬號默認都不會主動建立家目錄。
[root@study ~] useradd -r vbird3
[root@study ~] ll -d /home/vbird3
ls: 無法訪問/home/vbird3: 沒有那個文件或目錄		不會主動建立家目錄

[root@study ~] grep vbird3 /etc/passwd /etc/shadow /etc/group
/etc/passwd:vbird3:x:988:982::/home/vbird3:/bin/bash
/etc/shadow:vbird3:!!:18422::::::
/etc/group:vbird3:x:982:


用useradd建立用戶賬號時,
至少會參考:

  1. /etc/default/useradd
  2. /etc/login.defs
  3. /etc/skel/*

至少會修改:

  1. 用戶賬號與密碼:/etc/passwd 、/etc/shadow
  2. 用戶用戶組:/etc/group、/etc/gshadow
  3. 用戶家目錄:/home/賬號名稱
[root@study ~] useradd -D		查看useradd命令的默認值
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
passwd [--stdin] [賬號名稱]		所有人都可以用來修改自己的密碼
passwd  [-l] [-u] [--stdin] [-S] [-n 日數] [-x 日數] [-w 日數] [-i 日期] 賬號  只能root用
		--stdin	通過來自前一個管道的數據,作爲密碼輸入
		-l		Lock的意思,會將/etc/shadow第二欄最前面加上!使密碼失效
		-u		與-l相對,Unlock
		-S		列出密碼相關參數,即shadow文件內的大部分信息
		-n		shadow的第4欄位,多少天內不可修改密碼
		-x		shadow的第5欄位,多少天內必須修改密碼
		-w		shadow的第6欄位,密碼過期前的警告天數
		-i		shadow的第7欄位,密碼失效日期



[root@study ~] echo "vbird2passwd" | passwd --stdin vbird2  可以在/root/.bash_history中找到這個密碼
更改用戶 vbird2 的密碼 。
passwd:所有的身份驗證令牌已經成功更新。


passwd -l vbird2	讓這個用戶失效
passwd -u vbird2	讓這個用戶恢復
查看某個用戶的密碼的詳細參數:
passwd -S vbird2
chage -l vbird2


這個agetest用戶第一次登錄密碼與賬號同名,但是一登錄就被要求修改密碼,修改完畢後被踢出系統,使用新密碼登錄:
useradd agetest
echo "agetest" | passwd --stdin agetest
chage -d 0 agetest

添加完用戶後,對賬號信息進行微調:

usermod [-cdegGlsuLU] username

刪除用戶的相關數據:

userdel [-r] username
		-r  連同用戶家目錄一起刪除

慎用!!
用之前,先找到整個系統內書序username的文件:
find / -user username

通常刪除一個賬號,可以手動將/etc/passwd和/etc/shadow裏的該賬號取消。
如果該賬號只是暫時不啓用的話,那麼將/etc/shadow裏的賬號失效日期(第8字段)設置爲0,就可以讓該賬號無法使用,但是所有和該賬號有關的數據都會留下來。

13.2.2 用戶功能

一般用戶常用的賬號數據修改和查詢命令。

id [username]

[root@study ~] id
uid=0(root) gid=0(root)=0(root) 環境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

[root@study ~] id vbird2
uid=1500(vbird2) gid=100(users)=100(users)
finger 由於命令有點危險,系統默認不安裝這個軟件,需要自行安裝軟件
finger [-s] username	檢查用戶信息
chfn和chsh都能讓一般用戶修改/etc/passwd這個系統文件,所以,
這兩個命令的權限都是SUID。在執行過程中擁有了/etc/passwd文件所有者root的權限。
chfn [-foph] [賬號名稱]			像是change finger的縮寫
chsh [-ls]						像是change shell的縮寫
chsh -s	/bin/csh				修改shell環境爲/bin/csh

13.2.3 新增與刪除用戶組

groupadd [-g gid] [-r] 用戶組名稱
			-g	後面接某個特定GID,用來直接設置某個GID
			-r	建立系統用戶組

groupmod 	這個命令我覺得自己1年之內不會用,暫時不寫了。

gpasswd groupname	設置組groupname的密碼
gpasswd -A vbird1 groupname	將vbird1這個用戶設置爲groupname組的管理員
gpasswd -a user groupname	添加用戶user到組groupname
gpasswd -d user groupname	從組groupname中刪除用戶user

13.2.4 賬號管理實例

用戶pro1、pro2、pro3是同一個項目的開發人員,要讓這三個用戶在同一個目錄下工作,但這3個用戶擁有自己的家目錄與基本的私有用戶組。假設要讓這個項目在/srv/projecta目錄下開發:

groupadd projecta								創建用戶組projecta
useradd -G projecta -c "projecta user" pro1		創建3個用戶
useradd -G projecta -c "projecta user" pro2
useradd -G projecta -c "projecta user" pro3
echo "password" | passwd --stdin pro1			給這3個用戶設置密碼
echo "password" | passwd --stdin pro2
echo "password" | passwd --stdin pro3

mkdir /srv/projecta				創建工作目錄文件夾/srv/projecta
chgrp projecta /srv/projecta	將文件夾/srv/projecta的所屬組修改爲projecta
chmod 2770 /srv/projecta		修改文件夾/srv/projecta的權限是2770,爲了讓3個用戶能夠互相修改對方的文件,這個SGID必須要存在

此時有個問題,myuser1是projecta的項目助理,不希望他能修改任何內容,處理方式可以使用ACL機制:

setfacl -m u:myuser1:rx /srv/projecta

取消用戶權限:

setfacl -x u:myuser1 /srv/projecta		取消myuser1用戶的權限
setfacl -x d:u:myuser1 /srv/projecta	取消myuser1用戶的權限,設置默認的ACL參數
setfacl	-m u:pro3:- /srv/projecta		開始讓用戶無法使用該目錄

13.2.5 使用外部身份認證系統

Windows下的一個很有名的身份驗證系統:活動目錄AD
Linux爲了使不同主機使用同一組賬號密碼,會用到LDAP和NIS等服務器提供的身份驗證。

13.3 主機的詳細權限規劃:ACL的使用

ACL概念,如何支持啓動ACL

ACL,訪問控制列表,主要目的是提供傳統的屬主、所屬羣組、其他人的讀、寫、執行權限之外的詳細權限設置。

ACL可以針對單一用戶、單一文件或目錄來進行r、w、x的權限設置,對於需要特殊權限的使用狀況很有用。

主要應用:

  1. 用戶(user):可以針對用戶來設置權限
  2. 用戶組(group):針對用戶組爲對象來設置其權限
  3. 默認屬性(mask):還可以針對在該目錄下建立新文件/目錄時,規範新數據的默認權限

應用場景:
有一個目錄,需要給一堆人用,每個人或每個組所需要的權限並不相同時,傳統的Linux三種身份三種權限無法做到,因爲只能針對一個用戶、一個用戶組、非此用戶組的其他人設置權限,無法針對單一用戶設置權限,而ACL可以解決這個問題。

查詢是否支持ACL:

dmesg | grep -i acl

xfs文件系統時支持ACL的:
[root@study ~] dmesg | grep -i acl
[    1.401820] systemd[1]: systemd 219 running in system mode. (+PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 -SECCOMP +BLKID +ELFUTILS +KMOD +IDN)
[    3.548645] SGI XFS with ACLs, security attributes, no debug enabled

13.3.2 ACL的設置技巧:getfacl、setfacl

setfacl [-bkRd] [{-m|-x} acl 參數] 目標文件名
		-m  設置後續的ACL參數給文件用,不可與-x合用
		-x  刪除後續的ACL參數,不可與-m合用
		-b	刪除【所有的】ACL參數
		-k  刪除【默認的】ACL參數
		-R  遞歸設置ACL,即包括子目錄都會被設置起來
		-d  設置【默認ACL參數】,只對目錄有效,在該目錄新建的數據會引用此默認值

設置1:

ACL設置:  【u:用戶:權限】,-m

[root@study ~] touch acl_test2
[root@study ~] ll acl_test2 
-rw-r--r--. 1 root root 0 6月   9 10:54 acl_test2

[root@study ~] setfacl -m u:vbird1:rx acl_test2
[root@study ~] ll acl_test2 
-rw-r-xr--+ 1 root root 0 6月   9 10:54 acl_test2

[root@study ~] setfacl -m u::rwx acl_test2
[root@study ~] ll acl_test2
-rwxr-xr--+ 1 root root 0 6月   9 10:54 acl_test2


[root@study ~] getfacl acl_test2	查看真實的文件權限
# file: acl_test2
# owner: root
# group: root
user::rwx
user:vbird1:r-x
group::r--
mask::r-x
other::r--

特定的單一用戶組的權限:【g:用戶組名:權限】

設置文件acl_test2針對mygroup1的權限規範爲rx

[root@study ~] setfacl -m g:mygroup1:rx acl_test2

[root@study ~] getfacl acl_test2		查看權限
# file: acl_test2
# owner: root
# group: root
user::rwx
user:vbird1:r-x
group::r--
group:mygroup1:r-x
mask::r-x
other::r--

針對有效權限的設置:【m:權限】

[root@study ~] setfacl -m m:r acl_test2		用mask規範最大允許的權限,從而避免不小心開放某些權限給其他用戶或用戶組

[root@study ~] getfacl acl_test2			查看權限
# file: acl_test2
# owner: root
# group: root
user::rwx
user:vbird1:r-x			#effective:r--
group::r--
group:mygroup1:r-x		#effective:r--
mask::r--
other::r--

使用默認權限設置目錄未來文件的ACL權限繼承:【d:[u|g]:[user|group]:權限】

setfacl -m d:u:myuser1:rx /srv/projecta  讓myuser1在/srv/projecta下面一直具有rx的默認權限

13.4 用戶身份切換

普通用戶切換成root用戶身份,兩種方法
方法一:切換成root環境
su -			需要輸入管理員密碼才能切換
exit

方法二:
sudo command	需要輸入用戶自己的密碼
su -		切換爲root身份
su -l dj	切換回dj身份,會連同PATH、USER、MAIL等變量轉成新用戶的環境
su -  dj
su    dj	
su - -c "head -n 3 /etc/shadow"		執行一個只有root才能執行的命令,且執行完畢就回復原本的身份
並非所有人都可以用sudo,僅有規範到/etc/sudoers內的用戶才能夠執行sudo命令。
而可以使用sudo者是通過輸入自己的密碼來執行後續命令串。

sudo [-b] [-u 新使用者賬號]
		-b  將後續的命令放到後臺中,讓系統自動執行,而不語目前的shell產生影響
		-u	後面接欲切換的使用者,若無此項則代表切換身份爲root



sudo -u sshd touch /tmp/mysshd	想要以sshd的身份在/tmp文件夾下建立一個名爲mysshd的文件
ll /tmp/mysshd
輸出:
-r--r--. 1 sshd sshd 0 6月   9 12:47 /tmp/mysshd



[root@study ~] sudo -u vbird1 sh -c "mkdir ~vbird1/www;cd ~vbird1/www;echo 'This is index.html file' > index.html"
[root@study ~] ll -a ~vbird1/www
總用量 4
drwxr-xr-x. 2 vbird1 vbird1 24 6月   9 12:49 .
drwx------. 4 vbird1 vbird1 89 6月   9 12:49 ..
-rw-r--r--. 1 vbird1 vbird1 24 6月   9 12:49 index.html


通過visudo去編輯/etc/sudoers文件
visudo
修改,使得某個用戶具備root權限:
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
在這下面添加以下語句後,則dj擁有和root相同的權限(很可怕)
dj    ALL=(ALL)       ALL


修改,使得某個用戶組具備root權限:
## Allows people in group wheel to run all commands
%wheel  ALL=(ALL)       ALL		取消這行的註釋後,所有加入到wheel組的用戶都具備root權限
usermod -a -G wheel pro1	將pro1加入wheel的支持,這樣,pro1就有root權限


修改,使得wheel用戶組使用sudo時無需密碼:
## Same thing without a password
%wheel        ALL=(ALL)       NOPASSWD: ALL


修改,讓用戶只能夠幫助root修改用戶密碼,其他的不能做:
myuser1 ALL=(root) /usr/bin/passwd	 用戶myuser1只能切換成root用戶使用passwd命令。這裏命令必須用絕對路徑

剛纔那個命令太危險,容易修改root用戶密碼,改成下面的命令進行約束,除了passwd和passwd root兩個命令不可以使用,其他命令可以使用
myuser1 ALL=(root) !/usr/bin/passwd,/usr/bin/passwd [A-Za-z]*,!/usr/bin/passwd root

用別名簡化批量設置:
User_Alias ADMPW=pro1,pro2,pro3,myuser1,myuser2
Cmnd_Alias ADMPWCOM=!/usr/bin/passwd,/usr/bin/passwd [A-Za-z]*,!/usr/bin/passwd root
ADMPW ALL=(root) ADMPWCOM


sudo的時間間隔問題:兩次sudo時間間隔在5分鐘以內,不需要重複輸入密碼


使用用戶自己的密碼,用sudo搭配su,將身份轉成root:
User_Alias ADMPW=pro1,pro2,pro3,myuser1,myuser2
ADMPW ALL=(root) /bin/su -
改完後,那5個人,使用sudo su - 輸入自己的密碼後就立刻變成root身份。
不但root密碼不外流,用戶管理也邊方便。但這5個人必須是值得信任的人。

13.5 特殊的shell與PAM模塊

13.5.1 特殊的shell,/sbin/nologin

無法使用bash或其他的shell來登錄系統。不代表這個賬號無法使用其他的系統資源。
IP賬號管理打印作業;apache賬號管理www服務,它們都可以進行系統程序的工作,但是就是無法登錄主機獲取交互的shell而已。

vim /etc/nologin.txt 

cat /etc/nologin.txt 
輸出:
This account is system account or mail account.
Please DONOT use this account to login my Linux server.


[root@study ~] su - mail	想要切換到mail的shell中去,會提醒上述輸入信息
This account is system account or mail account.
Please DONOT use this account to login my Linux server.

13.5.2 PAM模塊簡介

PAM,插入式驗證模塊,是一套應用程序編程接口API,提供一連串的驗證機制,只要用戶將驗證階段的需求告知PAM,PAM就能返回用戶驗證的結果(成功or失敗)。

PAM用來進行驗證的數據成爲模塊,每個PAM模塊的功能都不太相同。

13.5.3 PAM模塊設置語法

執行passwd命令後:

  1. 用戶開始執行/usr/bin/passwd這個程序,並輸入密碼
  2. passwd調用PAM模塊進行驗證
  3. PAM模塊會到/etc/pam.d/找尋與程序passwd同名的配置文件
  4. 根據/etc/pam.d/passwd內的設置,引用相關的PAM模塊逐步進行驗證分析
  5. 將驗證結果(成功or失敗or其他信息)返回個passwd這個程序
  6. passwd這個程序會根據PAM返回的結果決定下一個操作(重新輸入密碼或通過驗證)
[root@study ~] cat /etc/pam.d/passwd
#%PAM-1.0									PAM版本說明
auth       	include		system-auth			每行都是一個驗證過程
account    	include		system-auth
password   	substack	system-auth
-password   optional	pam_gnome_keyring.so use_authtok
password   	substack	postlogin
驗證類別		控制標準		PAM模塊與該模塊的參數

第一個字段:驗證類別:auth、account、session、password
第二個字段:驗證的控制標識:required、requisite、sufficient、optional

13.5.4 常用模塊簡介

常用PAM模塊 簡介
pam_securetty.so 限制系統管理員root只能從安全的終端登錄
pam_nologin.so 限制了一般用戶是否能夠登錄主機,如果/etc/nologin文件存在,則否,不影響root和已經登錄的一般用戶
pam_seLinux.so SELinux是針對程序來進行詳細管理權限的功能,先利用PAM模塊將其暫時關閉,驗證通過後再開啓
pam_console.so 系統出問題或者需要使用特殊的終端接口(如RS232之類的終端設備)登錄主機時用的
pam_loginuid.so 驗證用戶的UID是否是所需要的數值,一般賬號UID應大於1000
pam_env.so 設置額外環境變量的一個模塊
pam_unix.so 很複雜很重要的模塊,可以用在驗證階段的認證功能、授權階段的賬號許可證管理、會話階段的日誌文件記錄、密碼更新階段的檢驗
pam_pwquality.so 檢驗密碼強度,看密碼是否在字典中、密碼輸入幾次都失敗就斷掉此次連接等
pam_limits.so ulimit的功能

登錄系統所需要的PAM流程:

[root@study ~] cat /etc/pam.d/login
#%PAM-1.0
auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so
auth       substack     system-auth
auth       include      postlogin
account    required     pam_nologin.so
account    include      system-auth
password   include      system-auth
# pam_selinux.so close should be the first session rule
session    required     pam_selinux.so close
session    required     pam_loginuid.so
session    optional     pam_console.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session    required     pam_selinux.so open
session    required     pam_namespace.so
session    optional     pam_keyinit.so force revoke
session    include      system-auth
session    include      postlogin
-session   optional     pam_ck_connector.so

system-auth模塊:

[root@study ~] cat /etc/pam.d/system-auth
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth        required      pam_env.so
auth        required      pam_faildelay.so delay=2000000
auth        sufficient    pam_fprintd.so
auth        sufficient    pam_unix.so nullok try_first_pass
auth        requisite     pam_succeed_if.so uid >= 1000 quiet_success
auth        required      pam_deny.so

account     required      pam_unix.so
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 1000 quiet
account     required      pam_permit.so

password    requisite     pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok
password    required      pam_deny.so

session     optional      pam_keyinit.so revoke
session     required      pam_limits.so
-session     optional      pam_systemd.so
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_unix.so

登錄流程:

  1. 驗證階段(auth):(a)經過pam_securetty.sp判斷,如果用戶是root,會參考/etc/securetty的設置;(b)經過pam_env.so設置外的環境變量;(c)通過pam_unix.so檢驗密碼,若通過返回login程序;若不通過,則(d)繼續往下以pam_succeed_if.so判斷UID是否大於1000,若小於1000返回失敗,否則再往下(e)以pam_deny.so拒絕連接。
  2. 授權階段(account):(a)先以pam_nologin.so判斷/etc/nologin是否存在,若存在則不許一般用戶登錄;(b)以pam_unix.so和pam_localuser.so進行賬號管理;(c)以pam_succeed_if.so判斷UID是否小於1000,若小於1000不記錄登錄信息;(d)最後以pam_permit.so允許該賬號登錄。
  3. 密碼階段(password):(a)以pam_pwquality.so設置密碼僅能嘗試3次;(b)以pam_unix.so通過sha512、shadow等功能進行密碼檢驗,若通過返回login程序;若不通過(c)以pam_deny.so拒絕登錄。
  4. 會話階段(session):(a)以pam_selinux.so暫時關閉SELinux;(b)使用pam_limits.so設置好用戶能夠操作的系統資源;(c)登錄成功後開始記錄相關信息在日誌文件中;(d)以pam_loginuid.so規範不同的UID權限;(e)開啓pam_selinux.so功能。

13.5.5 其他相關文件

/etc/secutity/limits.conf
/var/log/secure
/var/log/messages

13.6 Linux主機上的用戶信息傳遞

應用場景:當你在Linux上面操作時,剛好有其他用戶也登錄主機,你想和他交談。

13.6.1 查詢用戶:w、who、last、lastlog

查詢目前登錄在系統上的用戶:
[root@study ~] w
15:48:20 up 17:40,  2 users,  load average: 0.00, 0.01, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
dj       :0       :0               一10   ?xdm?  17:23   0.73s /usr/libexec/gnome-session-binary --session gnome-classic
dj       pts/0    :0               一10    4.00s  4.52s  2:04  /usr/libexec/gnome-terminal-server
lastlog		能獲取每個用戶最近的登錄時間,讀取/var/log/lastlog文件

13.6.2 用戶對談:write、mesg、wall

一對一:
write 使用者賬號 [使用者所在終端界面]
who	  如果查詢到root永和和dj用戶在線
write dj pts/2	回車後輸入要顯示的信息,完成後回車,信息會立刻發送給dj用戶

dj用戶如果正在查數據,這些信息會立刻終端dj用戶原本的任務。所以dj不想接受任何信息,執行:
mesg n	設置爲不接受信息,但是這對於root傳過來的信息沒有阻止能力
mesg y  重新啓用接收信息
一對多:對所有系統上面的用戶發送廣播:
wall "I will shutdown my Linux Server..."

13.6.3 用戶郵箱:mail

mailbox都會放置在/var/spool/mail裏面,一個賬號一個mailbox(文件)。
dj用戶就有/var/spool/mail/dj這個mailbox。

發送郵件:
mail -s "郵件標題" username@localhost		本機發送不需要@localhost

mail -s "nice to meet you" dj				編輯一段話發給dj用戶
輸入想說的話
.	最後輸入一個小數點表示結束輸入

mail -s "nice to meet you" dj < filename	把文件發給dj用戶
ls -al ~ | mail -s "mylife" dj				把家目錄下的內容發給dj用戶
接收郵件:
[dj@study ~]$ mail
Heirloom Mail version 12.5 7/5/10.  Type ? for help.
"/var/spool/mail/dj": 3 messages 3 new
>N  1 root                  Tue Jun  9 18:14  18/619   "nice to meet you"
 N  2 root                  Tue Jun  9 18:18  29/762   "bashrc file content"
 N  3 dj                    Tue Jun  9 18:19  52/2457  "myfile"


& s 3 ~/mailmyfile.txt  						將第三封信存成文件
"/home/dj/mailmyfile.txt" [New file] 54/2477	表示已經存好


& h   											再次查看一下,發現3左邊的N變成了*
>N  1 root                  Tue Jun  9 18:14  18/619   "nice to meet you"
 N  2 root                  Tue Jun  9 18:18  29/762   "bashrc file content"
 *  3 dj                    Tue Jun  9 18:19  52/2457  "myfile"



& 1												查看郵件內容,直接輸入編號就行
Message  1:
From [email protected]  Tue Jun  9 18:14:01 2020
Return-Path: <[email protected]>
X-Original-To: dj
Delivered-To: [email protected]
Date: Tue, 09 Jun 2020 18:14:00 +0800
To: [email protected]
Subject: nice to meet you
User-Agent: Heirloom mailx 12.5 7/5/10
Content-Type: text/plain; charset=us-ascii
From: [email protected] (root)
Status: R

if you see this,it means i success.				真正的內容只有這句話

13.7 CentOS 7環境下大量創建賬號的方法

13.7.1 一些賬號相關的檢查工具

pwck 		可以用來檢查輸入是否正確,系統賬號不需要有家目錄,有時會報一些正常的錯誤
grpck		相對應的用戶組檢查
pwconv		將/etc/passwd中的賬號和密碼,移動到/etc/shadow中
pwunconv	將/etc/shadow中的賬號和密碼,移動到/etc/passwd中
chpasswd	讀入未加密前的密碼,加密後,將加密後的密碼寫入/etc/shadow中

echo "vbird3:abcdefg" | chpasswd

13.7.2 大量創建賬號模板(適用passwd --stdin選項)

cat accountadd.sh 
輸出:
#!bin/bash
#Program:
#	This shell script will create amount of Linux login accounts for you.
#	1.check the "accountadd.txt" file exist?you must create that file manually.
#	  one account name one line in the "accountadd.txt" file.
#	2.use openssl to create users password.
#	3.User must change his password in his first login.
#History:
#2020/06/09	dj	First relese
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH

# 0.userinput
usergroup=""
pwmech="openssl"
homeperm="no"

# 1.check the accountadd.txt file
action="${1}"
if [ ! -f accountadd.txt ] ; then
	echo "There is no accountadd.txt file,stop here."
	exit 1
fi

[ "${usergroup}" != "" ] && groupadd -r ${usergroup}
rm -f outputpw.txt
usernames=$(cat accountadd.txt)
for username in ${usernames}
do
	case ${action} in
		"create")
			[ "${usergroup}" != "" ] && usegrp=" -G ${usergroup} " || usegrp=""
			useradd ${usegroup} ${username}
			[ "${pwmech}" == "openssl" ] && usepw=$(openssl rand -base64 6) || usepw=${username}
			
			echo ${usepw} | passwd --stdin ${username}
			chage -d 0 ${username}
			echo "username=${username},password=${usepw}" >> outputpw.txt
			;;
		"delete")
			echo "deleting ${username}"
			userdel -r ${username}
			;;
		*)
			echo "Usage:$0 [create|delete]"
			;;
	esac
done

首先要手動創建一個accountadd.txt文件:

cat accountadd.txt
輸出:
std01
std02
std03
std04
std05
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章