1.用戶基本概述
1.什么是用戶?
用戶指的是能夠正常登錄Linux或Windows系統(可以理解為你租了房子,能夠正常入駐) F:那Linux與Windows系統的用戶有什么區別? Q:本質都是登陸系統,只不過Linux支持多個用戶同時登陸。 F:難道Windows就不算多用戶操作系統嗎? Q:其實不是,在Windows系統中可以創建多個用戶,但不允許同一時刻多個用戶登陸系統,但Linux系統則允許同一時刻多個用戶同時登陸,登陸后相互之間操作並不影響。
2.Linux下的用戶有什么用
或者說我們為什么要創建用戶?
1.系統上的每一個進程(運行的程序),都需要一個特定的用戶運行 2.通常在公司是使用普通用戶管理服務器,因為root權限過大,容易造成故障。
3.查看用戶
如何查看系統中所存在的用戶
1.查看當前登錄的用戶信息
[root@bgx ~]# id #查看當前所登陸的用戶信息
# uid:用戶id,系統只能識別uid,不能識別名字,人看名字
# gid:組id
uid=0(root) gid=0(root) groups=0(root)
[root@bgx ~]# id oldboy #查看其它用戶的信息
uid=1000(oldboy) gid=1000(oldboy) groups=1000(oldboy)
2.每一個進程都會由一個用戶身份運行
[root@bgx ~]# ps aux|less #簡單使用一下,不用理解
root 33782 0.0 0.0 0 0 ? R 02:46 0:00 [kworker/u256:0]
root 35637 0.0 0.0 0 0 ? R 05:11 0:03 [kworker/0:2]
4.用戶存存放位置
Linux系統會將用戶的信息存放在/etc/passwd,記錄了用戶的信息,但沒有密碼信息,密碼被存放在/etc/shadow中。也就是說這兩個文件非常的重要,不要輕易刪除與修改。
1./etc/passwd 配置文件解釋如下圖,或者man 5 passwd 2./etc/shadow 配置文件解釋如下圖,或者man 5 shadow PS: 使用change修改密碼過期時間示例
4.最后我們需要了解下系統對用戶的一個約定?(約定娶你,就真的會娶嗎?)
用戶UID | 系統中約定的含義 |
---|---|
0 | 超級管理員,最高權限,有着極強的破壞能力 |
1~200 | 系統用戶,用來運行系統自帶的進程,默認已創建 |
201~999 | 系統用戶,用來運行用戶安裝的程序,所以此類用戶無需登錄系統 |
1000+ | 普通用戶,正常可以登陸系統的用戶,權限比較小,能執行的任務有限 |
PS:在CentOS7系統之前, UID1-499用於系統用戶, 而UID 500+則用於普通用戶
2.用戶相關命令
下面我們就圍繞着用戶的創建、變更、刪除等來講講涉及到的命令: useradd、usermod、userdel
1.新增用戶
使用useradd命令,注意: adduser命令軟鏈接指向useradd命令
#選項
# -u 指定要創建用戶的UID,不允許沖突
# -g 指定要創建用戶默認組
# -G 指定要創建用戶附加組,逗號隔開可添加多個附加組
# -d 指定要創建用戶家目錄
# -s 指定要創建用戶的bash shell /bin/bash /sbin/nologin
# -c 指定要創建用戶注釋信息
# -M 給創建的用戶不創建家目錄
# -r 創建系統賬戶,默認無家目錄
#1.創建bgx用戶,UID5001,基本組students,附加組sa 注釋信息:2019 new student,登陸shell:/bin/bash
[root@bgx ~]# groupadd sa
[root@bgx ~]# groupadd students
[root@bgx ~]# useradd -u 5001 -g students -G sa -c "2019 new student" -s /bin/bash bgx
#2.創建mysql系統用戶,-M不建立用戶家目錄 -s指定nologin使其用戶無法登陸系統
[root@bgx ~]# useradd mysql -M -s /sbin/nologin
[root@bgx ~]# useradd -r dba -s /sbin/nologin
# 3
useradd od -u 7777 -G sa -d /tmp/od -s /sbin/nologin
grep "7777" /etc/passwd
# 4 SELinux
getenforce # 查看
setenforce 0 # 臨時關閉
cat /etc/selinux/config
SELINUX=disabled
2.修改用戶信息
使用usermod命令修改用戶信息
#選項
# -u 指定要修改用戶的UID
# -g 指定要修改用戶基本組
# -G 指定要修改用戶附加組,使用逗號隔開多個附加組, 覆蓋原有的附加組,-aG追加
# -d 指定要修改用戶家目錄 -md 舊家搬新家
# -s 指定要修改用戶的bash shell
# -c 指定要修改用戶注釋信息
# -l 指定要修改用戶的登陸名
# -L 指定要鎖定的用戶
# -U 指定要解鎖的用戶
#1.檢查此前創建的用戶信息
[root@bgx ~]# grep "bgx" /etc/passwd
bgx:x:5001:503:2019 new student:/home/bgx:/bin/bash
#2.修改bgx用戶uid、gid,附加組 -a表示追加
[root@bgx ~]# groupadd -g 5008 network_sa
[root@bgx ~]# groupadd -g 5009 devops
[root@bgx ~]# usermod -u 6001 -g5008 -a -G 5009 bgx
#3.修改bgx用戶的注釋信息, 用戶家目錄, 登錄shell, 登錄名 -l:改名字,-md,把環境也帶過去
[root@bgx ~]# usermod -c "2019 new student" -md /bgx -s /bin/sh -l change_bgx bgx
#檢查是否修改成功
[root@bgx ~]# grep "bgx" /etc/passwd
bgx_lqz:x:6001:5008:2019 new student:/bgx:/bin/sh
[root@bgx ~]# id change_bgx
uid=6001(change_bgx) gid=5008(network_sa) groups=5008(network_sa),503(sa),5009(devops)
[root@bgx ~]# ll -d /bgx
drwx------. 2 bgx_lqz network_sa 4096 2014-09-23 00:13 /bgx
#4.鎖定用戶[擴展]
[root@bgx ~]# echo "123" |passwd --stdin change_bgx
[root@bgx ~]# usermod -L change_bgx #鎖定后會無法登陸系統
#5.解鎖用戶[擴展]
[root@bgx ~]# usermod -U change_bgx
3.刪除賬戶
使用userdel命令刪除賬戶
#選項 -r 刪除用戶同時刪除它的家目錄
#1.刪除user1用戶,但不刪除用戶家目錄和 mail spool
[root@bgx ~]# userdel user1
[root@bgx ~]# ls /var/spool/mail/
#2.-r參數可以連同用戶家目錄一起刪除(慎用)
[root@bgx ~]# userdel -r user1
4.其他
1) 使用finger命名查詢用戶信息以及登錄信息(yum install finger),示例: finger UserName 2) 使用chfn命令修改用戶信息(其實是修改注釋),示例: chfn UserName 3) 使用chsh命令修改用戶登錄Bash Shell,示例: chsh UserName 4) 使用who(當前有哪些用戶登錄了)、whoami、w檢查用戶登陸情況
3.用戶擴展知識
1.創建流程
前面我們學習如何創建、修改、刪除用戶,接下來了解下用戶的?
1.useradd創建用戶時,系統會以/etc/login.defs、/etc/defaults/useradd兩個配置文件作為參照物,如果在創建用戶時指定了參數則會覆蓋/etc/login.defs、/etc/defaults/useradd文件默認配置,如未指定則使用默認。
[root@bgx ~]# grep -Ev "^#|^$" /etc/login.defs
[root@bgx ~]# cat /etc/login.defs
MAIL_DIR /var/spool/mail # 定義了郵件路徑放在哪
PASS_MAX_DAYS 99999 # 密碼過期時間
PASS_MIN_DAYS 0 # 密碼最少0天
PASS_MIN_LEN 5 # 密碼長度
PASS_WARN_AGE 7 # 7天提醒
UID_MIN 1000
UID_MAX 60000
SYS_UID_MIN 201
SYS_UID_MAX 999
GID_MIN 1000
GID_MAX 60000
SYS_GID_MIN 201
SYS_GID_MAX 999
CREATE_HOME yes # 是否創建home
UMASK 077
USERGROUPS_ENAB yes # 用戶不指定組,默認創建一個同名組
ENCRYPT_METHOD SHA512 # 密碼加密算法
[root@bgx ~]# cat /etc/default/useradd
GROUP=100
HOME=/home #把用戶的家目錄建在/home中。
INACTIVE=-1 #是否啟用賬號過期停權,-1表示不啟用。
EXPIRE= #賬號終止日期,不設置表示不啟用。
SHELL=/bin/bash #新用戶默認所有的shell類型。
SKEL=/etc/skel #配置新用戶家目錄的默認文件存放路徑。
CREATE_MAIL_SPOOL=yes #創建mail文件。
2.當使用useradd創建用戶時,創建的用戶家目錄下會存在 .bash_ 環境變量相關的文件,這些環境變量文件默認從/etc/skel目錄中拷貝。這個默認拷貝環境變量位置是由/etc/defaults/useradd配置文件中定義的。
#故障案例,在當前用戶家目錄執行了rm -rf .,下次登錄系統時出現-bash-4.1$,如何解決!
-bash-4.1$ cp -a /etc/skel/.bash ./
-bash-4.1$ exit
[root@bgx ~]# #重新連接即可恢復
2.設置、修改密碼
創建用戶后,如需要使用該用戶登陸系統則需要為用戶設定密碼,設定密碼使用passwd命令。建議密碼復雜度高一些、長度大於10、出現各種特殊字符、無任何規律(不要出現名字,電話,生日等) PS: 注意事項 1.普通用戶只允許變更自己的密碼,無法修改其他人密碼,並且密碼長度必須8位字符 2.管理員用戶允許修改任何人的密碼,無論密碼長度多長或多短。
#1.使用passwd命令修改用戶密碼
# passwd #給當前用戶修改密碼
# passwd root #給root用戶修改密碼
# passwd oldboy #給oldboy用戶修改密碼,普通用戶只能自己修改自己
#2.驗證如下幾項指標
# passwd #root管理員用戶登陸,修改root用戶密碼
# passwd lqz #root用戶登陸,修改其他用戶的密碼
$ passwd root #普通用戶修改root管理員密碼
# echo "123" | passwd --stdin lqz #非交互式修改密碼
# 批量創建100個用戶,密碼都為123456
for i in {1..100}
do
useradd test$1
echo "123456" |passwd --stdin test$1
done
#3.系統內置變量生成隨機字符串(對隨機字符串進行md5加密)
[root@bgx ~]# echo $RANDOM|md5sum|cut -c 1-10
d09fe9b1xs
[root@bgx ~]# echo $(echo $RANDOM|md5sum |cut -c 5-14) |tee pass.txt| passwd --stdin lqz
#4.mkpasswd生成隨機字符串, -l設定密碼長度,-d數子,-c小寫字母,-C大寫字母,-s特殊字符
[root@bgx ~]# yum install -y expect //需要安裝擴展包
[root@bgx ~]# mkpasswd -l 10 -d 2 -c 2 -C 2 -s 4
|K&13bR)i/
PS: 推薦密碼保存套件工具,支持windows、MacOS、Iphone以及瀏覽器插件Lastpass官方網站
4.用戶組的管理
1.什么是用戶組
其實就是一種邏輯層面的定義,邏輯上將多個用戶歸納至一個組,當我們對組操作,其實就相當於對組中的所有用戶操作。
2.組有類別
對於用戶來說,組有幾種類別?
基本組,用戶只能有一個基本組,創建時可通過-g指定,如未指定則創建一個默認的組(與用戶同名),簡稱私有組 附加組,基本組不能滿足授權要求,創建附加組,將用戶加入該組,用戶可以屬於多個附加組
3.組的信息位置
組賬戶信息保存在/etc/group和/etc/gshadow兩個文件中。重點關注group
1./etc/group 配置文件解釋如下圖
head -1 /etc/group
2./etc/gshadow 配置文件解釋如下圖
1 groupadd新增組
使用groupadd命令新增組,groupadd [-g GID] groupname
#創建基本組, 不指定gid
[root@bgx ~]# groupadd no_gid
[root@bgx ~]# tail -n1 /etc/group
no_gid:x:1000:
#創建基本組, 指定gid為5555
[root@bgx ~]# groupadd -g 5555 yes_gid
[root@bgx ~]# tail -n1 /etc/group
yes_gid:x:5555:
#創建系統組,gid從201-999
[root@bgx ~]# groupadd -r sys_group
[root@bgx ~]# tail -n1 /etc/group
sys_group:x:990:
2 groupmod修改組
使用groupmod命令修改組
#-g 修改組gid
[root@bgx ~]# groupmod -g 1111 no_gid
[root@bgx ~]# tail -1 /etc/group
no_gid:x:1111:
#-n 修改組名稱(把yes_gid名字改為active_group)
[root@bgx ~]# groupmod yes_gid -n active_group
[root@bgx ~]# tail -1 /etc/group
active_group:x:5555:
3.groupdel刪除組,
刪除時需要注意,如果用戶存在基本組則無法直接刪除該組,如果刪除用戶則會移除默認的私有組,而不會移除基本組。
# 私有組的情況,直接刪除用戶,組也就沒了
[root@bgx ~]# userdel jack
#刪除組
[root@bgx ~]# groupdel active_group
#刪除用戶附加組
[root@bgx ~]# id lqz
uid=1069(lqz) gid=5005(lqz) groups=5005(lqz),5004(devops)
[root@bgx ~]# groupdel devops
[root@bgx ~]# id lqz
uid=1069(lqz) gid=5005(lqz) groups=5005(lqz)
#無法刪除用戶基本組
[root@bgx ~]# groupdel network_sa
groupdel: cannot remove the primary group of user 'bgx_lqz'
#只有刪除用戶或者用戶變更基本后,方可刪除該組
4 gpasswd設置組密碼
使用gpasswd設置組密碼[擴展,可以不會]
[root@bgx ~]# groupadd devops
[root@bgx ~]# gpasswd devops
Changing the password for group devops
New Password:
Re-enter new password:
5 newgrp切換基本組身份
使用newgrp命令切換基本組身份[擴展,可以不會]
#1.檢查賬戶信息
[root@bgx ~]# useradd lqz
[root@bgx ~]# id lqz
uid=1069(lqz) gid=5005(lqz) groups=5005(lqz)
#2.切換普通用戶
[root@bgx ~]# su - lqz
#3.創建新文件,查看文件的屬主和屬組
[lqz@bgx ~]$ touch file_roots
[lqz@bgx ~]$ ll
-rw-rw-r-- 1 lqz lqz 0 Jun 13 10:06 file_roots
#4.使用newgrp切換到devops組
[lqz@bgx ~]$ newgrp devops
Password:
#5.創建文件,檢查屬主和屬組
[lqz@bgx ~]$ touch file_test
[lqz@bgx ~]$ ll
-rw-rw-r-- 1 lqz lqz 0 Jun 13 10:06 file_roots
-rw-r--r-- 1 lqz devops 0 Jun 13 10:08 file_test
5.用戶如何提權
往往公司的服務器對外都是禁止root用戶直接登錄,所以我們通常使用的都是普通用戶,那么問題來了? 當我們使用普通用戶執行/sbin目錄下的命令時,會發現沒有權限運行,這種情況下我們無法正常的管理服務器,那如何才能不使用root用戶直接登錄系統,同時又保證普通用戶能完成日常工作? PS: 我們可以使用如下兩種方式: su、sudo 1.su切換用戶,使用普通用戶登錄,然后使用su命令切換到root。優點:簡單 缺點:需要知道root密碼 2.sudo提權,當需要使用root權限時進行提權,而無需切換至root用戶,優點:安全、方便 缺點:復雜
1.su身份切換
在使用su切換前,我們需要了解一些預備知識,比如shell分類、環境變量配置文件有哪些
1.Linux Shell主要分為如下幾類 交互式shell,等待用戶輸入執行的命令(終端操作,需要不斷提示) 非交互式shell,執行shell腳本, 腳本執行結束后shell自動退出 登陸shell,需要輸入用戶名和密碼才能進入Shell,日常接觸的最多的一種 非登陸shell,不需要輸入用戶和密碼就能進入Shell,比如運行bash會開啟一個新的會話窗口
2.bash shell配置文件介紹(文件主要保存用戶的工作環境) 個人配置文件:~/.bash_profile ~/.bashrc 。
全局配置文件:/etc/profile /etc/profile.d/*.sh /etc/bashrc profile類文件, 設定環境變量, 登陸前運行的腳本和命令。bashrc 類文件, 設定本地變量, 定義命令別名 PS: 如果全局配置和個人配置產生沖突,以個人配置為准。
3.登陸系統后,環境變量配置文件的應用順序是? 登錄式shell配置文件執行順序: /etc/profile->/etc/profile.d/.sh->/.bash_profile->/.bashrc->/etc/bashrc 非登陸式shell配置文件執行順序: ~/.bashrc->/etc/bashrc->/etc/profile.d/.sh PS: 驗證使用echo在每行添加一個輸出即可
4.說了這么多預備知識,那這些和su命令切換用戶有什么關系? su - username屬於登陸式shell,su username屬於非登陸式shell,區別在於加載的環境變量不一樣。 su username 屬於非登陸式shell
普通用戶su -
可以直接切換至root用戶,但需要輸入root用戶的密碼。 超級管理員root用戶使用su - username
切換普通用戶不需要輸入任何密碼。
#1.普通用戶使用su切換root
[lqz@node1 ~]$ su
密碼: #輸入root的密碼
[root@node1 lqz]# pwd
/home/lqz
#2.普通用戶使用su -切換到root,會加載root的環境變量
[lqz@node1 ~]$ su -
密碼:
[root@node1 ~]# pwd
/root
#3.以某個用戶的身份執行某個服務,使用命令su -c username
[root@bgx ~]# su - lqz -c 'ifconfig'
[root@bgx ~]# su - lqz -c 'ls ~'
#4 其他
yum provides pstree
yum install psmisc
pstree
# 5 關閉root遠程登陸,普通用戶登進來,su - 切換到root用戶
vim /etc/ssh/sshd_config
PermitRootLogin yes # 設成no
2.sudo提權
su命令在切換用戶身份時,如果每個普通用戶都能拿到root用戶的密碼,當其中某個用戶不小心泄漏了root的密碼,那系統會變得非常不安全。為了改進這個問題,從而產生了sudo這個命令。
其實sudo就相當於給某個普通用戶埋下了浩克(hulk)的種子,當需要執行一些高級操作時,進行發怒,但正常情況下還是普通人,還是會受到限制。
1.如何快速埋下hulk的種子呢?
#1.快速配置sudo方式[先睹為快]
[root@node1 ~]# usermod bgx -G wheel # 把用戶加到wheel組中
[root@node1 ~]$ sudo tail -f /var/log/secure #sudo審計日志
#2.一般正常配置sudo方式
[root@www ~]# #visudo => vim /etc/sudoers
#1.用戶名 2.主機名=(角色名) 4.命令名
bgx ALL=(ALL) /usr/bin/yum,/usr/sbin/useradd #允許使用sudo執行命令
oldboy ALL=(ALL) NOPASSWD:/bin/cp, /bin/rm #NOPASSWD不需要使用密碼
visudo -c # 檢查剛剛編輯的是否有錯誤
sudo -l # 對主機有哪些權限
2.埋下了hulk種子后又如何提權使用呢?
#1.切換普通用戶
[root@bgx ~]# su - lqz
#2.檢查普通用戶能提權的命令
[lqz@lqz ~]$ sudo -l
User lqz may run the following commands on this host:
(ALL) ALL
#3.普通用戶正常情況下是無法刪除opt目錄的
[lqz@lqz ~]$ rm -rf /opt/
rm: cannot remove `/opt: Permission denied
#4.使用sudo提權,需要輸入普通用戶的密碼。
[lqz@lqz ~]$ sudo rm -rf /opt
3.開啟某個命令的使用權限
提升的權限太大,能否有辦法限制僅開啟某個命令的使用權限?其他命令不允許?
第一種方式:使用sudo中自帶的別名操作,將多個用戶定義成一個組,這個組只有sudo認可
[root@bgx ~]# visudo #也可以使用vi /etc/sudoers來配置
# 1.使用sudo定義分組,這個系統group沒什么關系
User_Alias OPS = oldboy,alex
User_Alias DEV = bgx,py
# 2.定義可執行的命令組,便於后續調用
Cmnd_Alias NETWORKING = /sbin/ifconfig, /bin/ping
Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/yum
Cmnd_Alias SERVICES = /sbin/service, /usr/bin/systemctl start
Cmnd_Alias STORAGE = /bin/mount, /bin/umount
Cmnd_Alias DELEGATING = /bin/chown, /bin/chmod, /bin/chgrp
Cmnd_Alias PROCESSES = /bin/nice, /bin/kill, /usr/bin/kill, /usr/bin/killall
# 3.使用sudo開始分配權限
OPS ALL=(ALL) NETWORKING,SOFTWARE,SERVICES,STORAGE,DELEGATING,PROCESSES
DEV ALL=(ALL) SOFTWARE,PROCESSES
#4.登陸對應的用戶使用 sudo -l 驗證權限
第二種方式:使用groupadd添加組,然后給組分配sudo的權限,如果有新用戶加入,直接將用戶添加到該組.
#1.添加兩個真實的系統組, group_dev group_op
[root@www ~]# groupadd group_dev
[root@www ~]# groupadd group_op
#2.添加兩個用戶, group_dev(user_a user_b) group_op(user_c user_d)
[root@www ~]# useradd user_a -G group_dev
[root@www ~]# useradd user_b -G group_dev
[root@www ~]# useradd user_c -G group_op
[root@www ~]# useradd user_d -G group_op
#3.記得添加密碼
[root@www ~]# echo "1" | passwd --stdin user_a
[root@www ~]# echo "1" | passwd --stdin user_b
[root@www ~]# echo "1" | passwd --stdin user_c
[root@www ~]# echo "1" | passwd --stdin user_d
#4.在sudo中配置規則
[root@www ~]# visudo
Cmnd_Alias NETWORKING = /sbin/ifconfig, /bin/ping
Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/yum
Cmnd_Alias SERVICES = /sbin/service, /usr/bin/systemctl start
Cmnd_Alias STORAGE = /bin/mount, /bin/umount
Cmnd_Alias DELEGATING = /bin/chown, /bin/chmod, /bin/chgrp
Cmnd_Alias PROCESSES = /bin/nice, /bin/kill, /usr/bin/kill, /usr/bin/killall
%group_dev ALL=(ALL) SOFTWARE
%group_op ALL=(ALL) SOFTWARE,PROCESSES
#5.檢查sudo是否配置有錯
[root@www ~]# visudo -c
/etc/sudoers: parsed OK
#6.檢查user_a,和user_d的sudo權限
[user_a@www.oldboyedu.com ~]$ sudo -l
User user_a may run the following commands on www:
(ALL) /bin/rpm, /usr/bin/yum
[user_d@www.oldboyedu.com ~]$ sudo -l
User user_d may run the following commands on www:
(ALL) /bin/rpm, /usr/bin/yum, /bin/nice, /bin/kill, /usr/bin/kill, /usr/bin/killall
4.sudo命令的執行流程
1) 普通用戶執行sudo命令時, 會檢查/var/db/sudo是否存在時間戳緩存 2) 如果存在則不需要輸入密碼, 否則需要輸入用戶與密碼 3) 輸入密碼會檢測是否該用戶是否擁有該權限 4) 如果有則執行,否則報錯退出