Linux安全上下文:進程所能夠訪問資源的權限取決於進程運行者的身份
Tips:想要阻止一個用戶登錄的方法有很多種
a)passwd -l user / usermod -L user 這種方法是在/etc/shadow的密碼字段的最前面加!!或!,使用戶不能登錄
b)只有在7上纔可以,可以創建/run/nologin文件(原理參見Centos7中shutdown man手冊)或/etc/nologin(誤打誤撞出來的,記錯了前面nologin的路徑)
If the time argument is used, 5 minutes before the system goes down the /run/nologin file is created to
ensure that further logins shall not be allowed.
如果使用了時間參數,那麼在系統關閉前的5min,系統會創建/run/nologin文件來確保禁止更多的登錄活動
1.Linux用戶
Linux用戶有兩個名字,一個是Username,便於人類記憶的,另一個是UID,是系統辨識用戶的唯一編號。
Linux用戶分爲:管理員和普通用戶,普通用戶又分爲系統用戶和登錄用戶
管理員:username是root,uid=0
普通用戶:1-65535
系統用戶:1-499(Centos6),1-999(Centos7) 用於標識守護進程可以獲取的資源
登錄用戶:500+(Centos6),1000+(Centos7) 用於交互式登錄
Attention:多個用戶可以使用同一個UID,但系統識別用戶只是看uid,遇到uid相同的,系統就認爲是同一用戶
登錄後,現在提示符前顯示用戶的username,對於同一個uid系統該採用哪個username呢?系統會去查詢/etc/passwd中username和uid的映射關係,找到第一個和當前用戶uid相同的條目就退出,此時這個條目中對應的username就是要顯示的username。因此,排在文件前面的映射會生效。
2.Linux組
Linux組跟用於一樣也有兩個名字,groupname和gid 系統辨識組是用gid
Linux組分爲:管理員組和普通組,普通組又分爲系統組和普通組
管理員組:groupname=root gid=0
普通組:
系統組:1-499(CentOS6),1-999(CentOS7)
普通組:500+(Centos6),1000+(Centos7)
3.Linux用戶和組之間的關係
1)按照用戶的角度將Linux組進行劃分:
a)主要組 primary group:
用戶必須有且只屬於一個主要組
b)私有組
組名和用戶名相同,且僅包含一個用戶:稱爲私有組
c)輔助組 secondary group
一個用戶可以屬於0個或多個輔助組
2)一個組可以有多個成員,也可以有多個組管理員,組管理員可以改變組密碼,添加或刪除組成員
4.跟用戶相關的兩個文件/etc/passwd和/etc/shadow
Attention:1)這兩個文件一個是存儲用戶信息,一個是存儲密碼的,早期是放在一起的,不過現在也可以將這兩個文件進行合併
#pwunconv 將密碼填入/etc/passwd的x位置,並重命名/etc/shadow文件爲/etc/shadow-,相關的密碼策略不會顯示在/etc/passwd中
#pwconv 恢復成兩個文件
2)查看/etc/passwd和/etc/shadow中某個特定用戶的信息,有專門的工具
getent passwd 用戶名
getent shadow 用戶名
也可以用來查詢組和組的密碼,後面說
/etc/passwd 用於存儲用戶的相關信息,格式如下:
這個文件以:分隔的多個字段
(1)login name:登錄用戶名
(2)passwd:密碼(有的是X,是佔位符)
(3)UID:用戶ID
(4)GID:基本組ID
(5)Comment:用戶全名或註釋
(6)home directory:用戶家目錄
(7)shell:用戶默認shell
/etc/shadow 用於存儲用戶的密碼信息,格式如下:
以冒號分隔的多個字段
(1)用戶名
(2)用戶密碼:現在一般用sha512加密
以!或!!或*,表示系統用戶
以!或!!後面跟$開頭的字符串:表示被鎖定的用戶,$開頭的字符串表示加密過的字符串
Attention:passwd -l user 在密碼前加!!
usermod -L user 在密碼前加一個!
usermod -U user 執行一次在密碼前減去一個!
$開頭的字符串表示加密過的字符串,表示用戶密碼,如:
$6$7thv7bZB$znnXghWTKnpbszyrqjrAPRIIL.2ArikhEj4hRed4SjyCgydD8mrZMAckRvuEFbhyG8OAUz96WLCfDY7h8d9a81
以上字符串可以看作是$分隔的三個字符串,其中
$6代表加密算法 sha512 $1代表md5(128位的)
Attention:#authconfig --passalgo=md5 --update,此後使用passwd加密過的密碼,此處都顯示$1
同時會修改/etc/login.defs文件
# Use SHA512 to encrypt password.
ENCRYPT_METHOD MD5
MD5_CRYPT_ENAB yes
$7thv7bZB 代表salt,是系統自動加的隨機數,會影響加密結果。在沒有salt的情況下,通過比對加密結果,如果一樣,那麼密碼就是相同的,這樣可以破解密碼。爲了避免這種情況,系統會自己加一個salt
如果是$1,可以通過這樣的方式生成帶salt的密碼加密之後的結果,
openssl passwd -1 -salt 12345678 code
$znnXghWTKnpbszyrqjrAPRIIL.2ArikhEj4hRed4SjyCgydD8mrZMAckRvuEFbhyG8OAUz96WLCfDY7h8d9a81
是對salt和密碼執行加密算法後的結果
sha1,md5,sha512都是單向加密算法,稱爲哈希算法,有這樣的特點:
sha1: secure has algorithm 160bits
md5:message digest, 128bits
1)明文不同,密文必然不同,反之亦然
2)相同算法定長輸出,理論上,密文不可逆推出原始數據,但有例外 Md5、SHA1算法,據說被山東大學教授王小云(女)破解
3)雪崩效應:
初始條件的微小改變,必然引起結果的巨大變化
(3)上次修改時間:從1970年1月1日起到密碼最近一次被更改的時間
(4)最小使用時間:密碼再過幾天纔可以變更(0表示隨時可以變更)
(5)最大使用時間:密碼再過幾天必須變更(99999表示永不過期)
(6)密碼警告時間:密碼過期前幾天系統提醒用戶(默認爲一週)
(7)密碼失效時間:密碼過期幾天後賬號會被鎖定
(8)賬號過期時間:從1970年1月1日起,多少天后賬號失效
(9)保留(reserved field)
5.跟組相關的兩個文件/etc/group和/etc/gshadow
Attention:1)groups user1 user2 .. usern 列出指定一個或多個用戶的組關係,格式:primary group:secondary group1 secondary group
groups 如果沒有指定用戶,那麼打印當前進程的組關係,通常是沒有基本組和附加組的概念
2)getent group groupname 在/etc/group中查看groupname的相關信息
getent gshadow groupname 在/etc/gshadow中查看groupname的相關信息
/etc/group存儲的是組相關信息
也是以:分隔的多個字段
(1)組名
(2)組密碼 通常不需要設定,密碼是被記錄在/etc/gshadow
(3)GID:組ID
(4)以當前組爲附加組(輔助組)的用戶列表(以逗號分隔)
/etc/gshadow存儲的是與組密碼的相關信息
(1)組名
(2)組密碼:跟/etc/shadow的密碼構造一樣
當一個不隸屬於這個組的成員想獲取這個組的權限時,就需要輸入這個密碼
如果組密碼爲空,那麼只有組成員才能獲取組的權限
Attention:newgrp可將當前用戶的基本組切換成設定的組group,成功後,再創建出的文件的的屬組都是group
1)如果group是當前用戶的附加組,即當前用戶隸屬於group,這樣,依據上面的說明,有沒有設置密碼都可以進行切換
#/$ newgrp group //不會提示輸入密碼的
2)如果group不是當前用戶的附加組,即當前用戶不隸屬於group,那麼在鍵入
newgrp group
之後,會提示要求輸入密碼,這個密碼是組密碼,當前沒有密碼就一定不能切換成功嘍,所以要這樣切換,就必須設置密碼
另外,設置之後,立即有效,登出時就失效,並且只在設置的那個終端有效,而非對其他終端的同一用戶有效
redhat:newgrp gentoo
groups redhat
redhat : redhat 發現用戶的屬組沒變
但 id redhat
uid=1000(redhat) gid=1009(gentoo) groups=1000(redhat),1009(gentoo) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
在其他終端上同樣也是redhat用戶執行 id redhat
uid=1000(redhat) gid=1000(redhat) groups=1000(redhat)
在原有終端上退出再登入,發現加入的組改回原來了。
(3)組管理員:逗號分隔的用戶列表,這些用戶都是組管理員
組管理員可以修改密碼,增刪組成員
組管理員可以不隸屬於這個組,但他依然擁有和組成員一樣的權限
Attention:#gpasswd -A redhat gentoo 將redhat用戶設爲gentoo的組的管理員
redhat可以不是gentoo組的成員
(4)組成員:逗號分隔的用戶列表,這些用戶都是組成員
Attention:#gpasswd -a redhat gentoo 將redhat用戶加入gentoo組
Attention:有時這些命令雖然設置成功了,但是需要登入登出在能生效
6.專業用來修改/etc/passwd和/etc/group的工具
修改且帶有語法檢查:vipw和vigr
只有語法檢查功能:pwck和grpck
7.用戶管理命令
1)創建用戶
useradd [options] username
-u UID UID的範圍在/etc/login.defs中定義
-u -o 不檢查UID的唯一性
-g GID 指明要加入的基本組,如果不指定,則創建一個與用戶名相同的組,並將其作爲用戶的基本組
-c "Comment" 用戶的註釋信息
-d HOME_DIR 以指定的路徑爲家目錄 此處指定的路徑必須不能是個已存在的目錄
-s SHELL 指明用戶的默認shell
-G GP1[,GP2,...] 爲用戶指明附加組,組必須事先存在
-N 不創建私有組作爲基本組,使用users組(Gid=100)作爲基本組
Attention:在/etc/default/useadd中規定了這一項
GROUP=100 //如果不創建私有組,就將GID爲100的組(即users組)作爲基本組
-r 創建系統用戶
-M 不創建家目錄
-D 顯示默認配置
-D -s /path/to/shell 修改默認配置中的shell類型
Attention:使用useradd命令創建用戶,一般遵循的默認配置在/etc/default/useradd
GROUP=100 //如果不創建私有組,就將GID爲100的組(即users組)作爲基本組
HOME=/home //普通用戶家目錄的父目錄,系統用戶一般不創建家目錄
INACTIVE=-1 //用戶永不失效
EXPIRE= //用戶永不過期
SHELL=/bin/bash //默認shell
SKEL=/etc/skel //用戶家目錄的基本框架(skeleton),通常是隱藏文件
CREATE_MAIL_SPOOL=yes //是否創建郵箱,其實就是在/var/spool/mail下創建一個以用戶名的名字的目錄
在/etc/default/下還有一個跟useradd相關的文件是useradd-,這個文件是存儲上一次的默認配置(修改之前的)
看到-就可以想到上一次的含義,比如 cd - 就是回到上一次的工作目錄
/etc/skel下存放的文件:.bash_logout .bash_profile .bashrc .gnome2(跟安裝的圖形模塊有關,不安裝則沒有) .mozilla
2)創建用戶口令
passwd可以用於創建用於口令但不至於創建用戶口令
passwd:權限-rwsr-xr-x. 其中s代表,任何運行此程序用戶都是以屬主也就是root身份來運行
passwd [options] username
-l 鎖定用戶
Attention:passwd -l user 在密碼前加!!
usermod -L user 在密碼前加一個!
usermod -U user 執行一次在密碼前減去一個!
-U 解鎖用戶
-e 使用戶的密碼立即過期,強制用戶下次登錄時修改密碼
此命令的應用場景:root創建了一些賬號,並賦予了一些簡單密碼,使用這個命令可以讓密碼立即失效,這樣在用戶第一次登錄時,就必須修改密碼,我在實驗時,登錄時,確實提示需要設置密碼,但密碼總也設置不成功,這是因爲Linux對於普通用戶設置的密碼要求比較嚴苛,並非不能實現這個需求。
-n mindays 指定最短使用期限 對應/etc/shadow 第4個字段
-x maxdays 指定最大使用期限 對應/etc/shadow 第5個字段
-w warndays 密碼失效前多少天開始警告 對應/etc/shadow 第6個字段
-i inactivedays 密碼過期幾天後會鎖定賬戶 對應/etc/shadow 第7個字段
--stdin 從標準輸入接收用戶密碼
e.g. echo "passwd" | passwd --stdin username
Attention:在爲賬號設置密碼時,不會指定密碼的各種期限,但系統會幫助我們來設置,這些期限稱之爲密碼策略
在windows中查看密碼策略的命令是 net account
在Linux中查看密碼策略的命令是 chage(change age) -l
其中,默認的密碼策略存儲在/etc/login.defs,當然不只是有密碼策略
以下是省去了註釋信息的/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 //用戶和組 ID的限制
UID_MAX 60000
GID_MIN 500
GID_MAX 60000
CREATE_HOME yes //是否創建家目錄
UMASK 077 //UMASK ,具體參加有註釋信息的此文件
USERGROUPS_ENAB yes //如果用戶組中沒有成員了,userdel可以刪除用戶組
ENCRYPT_METHOD SHA512 //密碼使用的加密算法 使用authconfig --passalgo=Md5 --update可以修改這裏
MD5_CRYPT_ENAB no
3)批量創建用戶和修改用戶口令
(1)newusers file 批量創建用戶
file是滿足/etc/passwd格式的文件
(2)chpasswd 從標準輸出讀入user:passwd的格式的多行文本,以此來批量修改用戶口令
vim batchpasswd
user1:明文口令
user2:明文口令
...
cat batchpasswd | chpasswd
4)用戶屬性修改
usermod [option] username
-u UID: 指定用戶新的UID
-g GID:指明用戶新的基本組
-G GP1[,gp2,..gpm] 指明新的附加組,原來的附加組會被覆蓋
Attenton:若要保留原有附加組,則要使用-aG(-Ga 不可) GP1[,gp2,..gpm]
若要清空附加組,-G "" 即可
-s SHELL 新的默認SHELL
-c 'COMMENT' 新的註釋信息
-d HOME 新家目錄不會自動創建,原家目錄中的文件不會同時移動至新的家目錄;若要創建新家目錄並移動原家數據,必須使用-md /path/to/newhome或-m -d /path/to/newhome,總之m選項要在前面
-l login_name 新用戶名
-L 鎖定用戶 在/etc/shadow密碼前加一個!
-U 解鎖用戶 執行一次在密碼前減去一個! 直到沒有爲止
-e yyyy-MM-DD 指明用戶賬號的過期日期
-f INACTIVE:設定非活動期限
-r 刪除用戶家目錄
5)查看用戶相關信息
(1) id [options] [user] 查看用戶相關的信息 不指明用戶查看的是當前用戶
-u:UID
-g:GID
-G:groups 附加組
-n:顯示id對應的名字,通常和-u和-g連用
id -un 或 id -gn
(2) finger 打印登錄到Linux系統的所有用戶的信息
finger user 查看跟user相關的一些信息,比如家目錄 shell類型、郵件等
6)在/etc/passwd中家目錄字段必須不能爲空
如果爲空,則登錄這個用戶時,鍵入用戶和密碼之後,會不出現提示符,不能輸入任何命令,等待超時之後(提示:/usr/bin/xauth: timeout in locking authority file /.Xauthority),進入/
若su - user完全切換或不完全切換 su user, 則會顯示su: user user does not exist
如果不空,但目錄不存在,則登錄這個用戶時,會直接進入/,
若su - user完全切換 會直接進入/
若不完全切換 su user 會進入執行 su user的目錄
7) 切換用戶或以其它用戶身份執行命令
su [options] [-] [user [args...]]
切換用戶的方式:
su user:非登錄式切換,不會讀取目標用戶的配置文件,不改變當前工作目錄,也稱之爲不完全切換
su - user 登錄式切換,會讀取目標用戶的配置文件,切換至其家目錄,也稱之爲完全切換
Attention:root執行su至其他用戶無需密碼,非root用戶切換時需要密碼
切換身份執行命令
su [-] user -c 'cmd'
選項 -l --login
su -l user 相當於 su - user
8)修改用戶相關信息的其他命令
chfn 指定個人信息
chsh 指定shell
9)修改用戶密碼策略
chage [option] user
-d last_day 修改最後修改時間 對應於/etc/shadow的第3個字段
-m --mindays Min_days 修改最小使用時間 對應於/etc/shadow的第4個字段 過多少時間可以修改
-M --maxdays Max_days 修改最大使用時間 對應於/etc/shadow的第5個字段
-W --warndays Warn_days 修改警告時間 對應於/etc/shadow的第6個字段
-I --inactive Inactive 修改賬戶失效時間 對應於/etc/shadow的第7個字段
-E --expiredate Expire_Date 修改賬戶過期時間 對應於/etc/shadow的第8個字段
-l 顯示密碼策略
下次登錄強制重設密碼
chage -d 0 tom 等價於 passwd -e tom
e.g. chage -m 0 -M 42 -W 14 -I 7 tom
chage -E 2016-09-10 tom
10)刪除用戶
userdel user 不會刪除用戶家目錄
-r user 纔會刪除用戶的同時刪除家目錄
在/etc/login.defs中,有這樣的描述
# This enables userdel to remove user groups if no members exist.
#
USERGROUPS_ENAB yes
8. 組管理命令
1)創建組
groupadd [option] groupname
-g gid 指明GID 範圍在/etc/login.defs中指定
-r 創建系統組
2)修改組
groupmod [OPTION] group
-n groupname :組的新名字
-g GID :新的GID
3)組刪除
groupdel group
4)更改組密碼
gpasswd [option] group
-a user 將user加入到指定組中
-M user1,user2...指定組成員列表
-d user 從指定組中刪除user
-A user1,user2,... 設置有管理權限的用戶列表,即設置組管理員
newgrp命令:臨時切換基本組
如果用戶不屬於此組,則需要組密碼
Attention:具體參見本文檔/etc/gshadow部分
5)更改組成員
groupmems [options] [action]
options:
-g /--group groupname 更改爲指定組(只有root可用)
action:
-a /--add username 指定加入組的用戶
-d / --delete username 指定從組刪除的用戶
-p / --purge 從組中清除所有成員
-l / --list 顯示組中成員
e.g. groupmems -g bin -a wang 將wang用戶加入bin組
groupmems -g bin -l 查看bin組中的所有成員,似乎是查看以bin組爲附加組的成員列表
groupmems -g bin -p 清除所有bin組中的成員
6)查看組成員
groups user1 user2 .. usern 列出指定一個或多個用戶的組關係,格式:primary group:secondary group1 secondary group
groups 如果沒有指定用戶,那麼打印當前進程的組關係,通常是沒有基本組和附加組的概念