首頁 > 軟體

Linux之使用者管理與許可權控制

2020-06-16 17:22:06

早期Linux系統設計為了能夠實現多使用者、多進程高效的利用伺服器資源,在此種情況下,為了能夠保證使用者與使用者之間的檔案不被隨意的存取及修改、刪除等操作,使用者、組的管理能在某種程式上實現管理使用者或批次管理使用者。由於Linux的設計哲學思想『一切皆檔案』,使用者對裝置的存取就是對檔案的存取。

一、使用者與組

Linux下有三類使用者

1.超級使用者: root 具有作業系統的一切許可權 UID 值為0

2.普通使用者:

普通使用者具有作業系統有限的許可權, UID值 500+

3.偽使用者:

是為了方便系統管理, 滿足相應的系統進程檔案屬主的要求, 偽使用者不能登入系統,CentOS6 UID值 1 -- 499,CentOS7 UID值為1 -- 999.

二、安全上下文

當一個使用者發起一個進程時,此進程將繼承使用者的屬主、屬組的許可權,再以進程繼承的許可權來控制檔案的存取許可權。

例如:

[root@localhost~]# /bin/cat FILE  ##取決於root使用者對FILE檔案擁有的許可權

[young@localhost~]$ /bin/cat FILE ##取決於young使用者對於FILE檔案的擁有許可權

三、組的類別

使用者的主要組(主組): 使用者必須屬於一個且只有一個主組 組名同使用者名稱,且僅包含一個使用者:私有組

使用者的附加組(輔助組): 一個使用者可以屬於零個或多個輔助組

四、使用者和組的組態檔

1.Linux使用者和組的主要組態檔

/etc/passwd:使用者及其屬性資訊(名稱、 UID、主組ID等),可使用vipw命令編輯,使用pwck命令校驗格式,無效使用者等

/etc/group:組及其屬性資訊,可使用vigr命令編輯,可使用grpck校驗格式,無效組等

/etc/shadow:使用者密碼及其相關屬性,可使用pwck命令校驗格式無效使用者等

/etc/gshadow:組密碼及其相關屬性,可使用grpck校驗合適,無效組等

2.組態檔格式說明

/etc/passwd

root:x:0:0:root:/root:/bin/bash 使用者名稱:密碼:UID:GID:使用者註釋資訊:使用者家目錄:Shell定義

使用者名稱: 使用者的名稱
密碼: X表示預留位置,也可以是密碼
UID: 使用者識別程式碼
GID: 使用者所屬組的GID(基本組)
使用者註釋資訊:Comment,可以完善使用者的基本資訊
使用者家目錄: 系統登入使用者後的工作目錄
shell: 定義使用者登入系統所使用的shell,指定的shell需要在/etc/shells中出現

/etc/shadow

root:$6$YqkEsOcfKPptyhnS$YD0ym4BZ52pzcCnU....:16781:0:99999:7::: 使用者名稱:密碼:上一次修改密碼的時間:密碼最小使用期限:最長使用期限:警告時間:帳戶過期時間:保留欄位

使用者名稱: 使用者的名稱,對應/etc/passwd檔案中
密碼: Centos6中使用MD5加密演算法,Centos7中使用sha1的演算法,第一個$後面加密演算法型別,第二個$後面表示salt,第三個$後面表示密碼的提取碼(參照加密型別)
上一次修改密碼的時間: 指使用者上次修改密碼的時間,計算方法:從Linux元年1970年01月01日0點0分到目錄所經過的秒數
密碼最小使用期限: 指使用者修改密碼後,需要到多少天後方可更改密碼,0表示禁用
密碼最長使用期限: 指使用者的密碼到多少天後需要修改密碼
警告時間: 指使用者密碼到期前多少天提示使用者修改密碼,0和空欄位表示禁用此功能
帳戶過期時間: 批帳戶在密碼過期後多少天還未修改密碼,將被停用

/etc/group

root:x:0: 組名:密碼:GID:User_list

組名:組的名稱,預設同名使用者名稱
密碼: 組的密碼預留位置,用於使用者臨時切換至需要的組以獲取相應許可權,可以使用newgrp GROUP_NAME切換
GID:組的全域性識別號
User_list:隸屬此組的使用者,多個使用者使用","隔開

/etc/gshadow

root:$6$PLRAi/Z/svr$PRelPtvLuGJqvFG3D8fbjYHDho2RQUe93glO.:: 組名:密碼:組管理者:User_list

組名:組的名稱,同步/etc/group檔案中
密碼:第一個$後面表示加密演算法,第二個$後面表示加密的密碼
組管理者:可以對此組成員有操作許可權,如果有多個,可以用逗號隔開
User_list: 使用者的列表,如果有多個,可以使用逗號隔開

五、使用者和組管理命令

1.使用者管理命令

a、useradd

useradd - create a new user or update default new user information
synopsis: useradd [options] LOGIN
          useradd -D [options]

options:
    -u : 指定使用者的UID
    -g : 指明使用者所屬基本組,可為組名,也可以GID,組或者GID必須存在
    -c : 指定註釋資訊,如果有空格,需要使用" "包含
    -d : 指定使用者家目錄,建立使用者時,會自動將/etc/skel中的檔案複製到使用者家目錄下,如果指定的檔案存在將不會複製檔案,如果父目錄不存在,建立也將會失敗
    -s : 指定使用者shell
    -r : 指定建立一個系統使用者
    -M :不建立使用者家目錄
    -G : 指定附加組,多個使用逗號隔開
    -D :修改建立使用者的設定資訊,檔案位於/etc/default/useradd
        註:建立使用者時的諸多預設設定組態檔為/etc/login.defs

範例一:

[root@localhost ~]# useradd -u 1003 -c "TestUser" -d /home/geek -s /bin/sh geek
[root@localhost ~]# getent passwd geek
geek:x:1003:1003:TestUser:/home/geek:/bin/sh

範例二:

[root@localhost ~]# useradd sys -r -M -g 1001 -G root
[root@localhost ~]# getent passwd sys
sys:x:498:1001::/home/sys:/bin/bash
[root@localhost ~]# id sys
uid=498(sys) gid=1001(young) groups=1001(young),0(root)

註:useradd命令加引數-D參看系統的預設值:

# useradd -D 
GROUP=100 
HOME=/home 
INACTIVE=-1 
EXPIRE= 
SHELL=/bin/bash 
SKEL=/etc/skel 
CREATE_MAIL_SPOOL=yes

解釋: 1)新使用者新增到GID為100的公共組 2)新使用者的HOME目錄將會位於/homoe/username 3)新使用者賬戶密碼在過期後不會被禁用 4)新使用者賬戶未被設定為某個日期後就過期 5)新使用者賬戶將bash shell作為預設shell 6)系統會將/etc/skel目錄下的內容複製到使用者的HOME目錄下 7)系統為該使用者賬戶在mail目錄下建立一個用於接收郵件的檔案 修改: useradd –D -s SHELL useradd –D –b BASE_DIR useradd –D –g GROUP

如 #useradd -D -s /bin/tsch ,修改預設的shell為/bin/tsch。

倒數第2個值很有意思。useradd命令允許管理員建立一個預設的HOME目錄設定,然後把它作為建立新使用者HOME目錄的模板。這樣,就能自動在每個新使用者的HOME目錄裡放置預設的系統檔案。在Ubuntu Linux系統上,/etc/skel目錄下有下列檔案:

[root@localhost ~]# ls -A /etc/skel
.bash_logout  .bash_profile  .bashrc

此上檔案不複製進去使用者命令提示字元等會缺失。

/etc/login.defs檔案也是新建使用者屬性的組態檔。

b、newusers與chpasswd

newusers命令用來批次建立使用者

chpasswd用來批次修改密碼

批次建立使用者並修改密碼

A、建立使用者列表user.txt(檔案格式與/etc/passwd相同)

[root@localhost ~]# vim users.txt

user1:x:600:600::/home/user1:/bin/bash
user2:x:601:601::/home/user2:/bin/bash
user3:x:602:602::/home/user3:/bin/bash

B、批次建立使用者

[root@localhost ~]# newusers users.txt 
[root@localhost ~]# tail -3 /etc/passwd
user1:x:600:600::/home/user1:/bin/bash
user2:x:601:601::/home/user2:/bin/bash
user3:x:602:602::/home/user3:/bin/bash

C、複製/etc/skel下檔案到使用者家目錄

[root@localhost ~]# cp /etc/skel/.[^.]* /home/user1
[root@localhost ~]# cp /etc/skel/.[^.]* /home/user2
[root@localhost ~]# cp /etc/skel/.[^.]* /home/user3

D、建立密碼檔案passwd.txt(格式===> 使用者名稱:密碼)

[root@localhost ~]# vim passwd.txt

user1:young
user2:young
user3:young

E、批次修改密碼

[root@localhost ~]# cat passwd.txt | chpasswd

檢視:

[root@localhost ~]# tail -3 /etc/shadow
user1:$6$9w3Hm/gYw$fVQMOyaJxzR9yBSbmPlZY8DKHb2BLGPAVxmFqJsN4rTGYao5B4TRZW/i7z1UgWF/mNI6jJ45bbD4vZtJhIYu50:17166:0:99999:7:::
user2:$6$9pXcj/.LREq/OK$M8tY6gpxKliOgnKG/N7H0oiuD88RAbB7BM/94UlDWlefXsTqyYReYk96FK6mofd2quYHXA7mID3q5nBgqYHjL0:17166:0:99999:7:::
user3:$6$lxmzw4KcEA/hfm6$nrc9rLSwM4JXfLOm7p2a1CqWB8Y5fgioU3DctpvfIw1.A6iqDy0aADGkReT1FVJhOubRC3l2iUUq8PwnJx9HK0:17166:0:99999:7:::

測試:

[root@localhost ~]# su - user1
[user1@localhost ~]$ su - user2
Password: 
[user2@localhost ~]$

c、usermod

usermod命令可實現使用者屬性修改。

usermod - modify a user account
synopsis: usermod [options] LOGIN

options:
    -u : 修改使用者UID
    -g : 修改使用者GID
    -c : 修改使用者的注釋資訊
    -d : 修改使用者家目錄,需要配合使用-m選項才會自動複製使用者家目錄下的檔案到新的家目錄
    -m : move-home to new directory
    -s : 修改使用者的shell
    -l : 修改使用者的登陸名,即login名稱
    -G : 修改使用者的附加組資訊,需要配合-a(append)一起使用,如果不使用-a將刪除原來的附加組
    -a : --append,連線多個附加組的引數
    -L : 鎖定使用者,即lock,在/etcpasswd檔案中,密碼前面加!(一個)
    -U : 解鎖使用者,即unlock,在/etc/passwd檔案中,取消密碼前面的!號

範例:

[root@localhost ~]# getent passwd user1
user1:x:600:600::/home/user1:/bin/bash
[root@localhost ~]# id user1
uid=600(user1) gid=600(user1) groups=600(user1)
[root@localhost ~]# usermod -u 700 -g user2 -aG bin,root -c 'linux' -d /none/user1 -s /bin/tsh -l linux user1
[root@localhost ~]# getent passwd linux
linux:x:700:601:linux:/none/user1:/bin/tsh
[root@localhost ~]# id linux
uid=700(linux) gid=601(user2) groups=601(user2),0(root),1(bin)

d、userdel

userdel命令用來刪除已經存在的使用者。

userdel - delete a user account and related files
synopsis: userdel [options] LOGIN

options:
    -r : 刪除使用者的同時刪除使用者的家目錄,即--remove引數

範例:

[root@localhost ~]# userdel -r user3

e、id

id命令檢視使用者相關資訊。

id [OPTION]... [USER]
-u: UID
-g: GID
-G: Groups
-n: Name (與-u連用可現實名稱)

範例:

[root@localhost ~]# id geek
uid=1003(geek) gid=1003(geek) groups=1003(geek)

[root@localhost ~]# id
uid=0(root) gid=0(root) groups=0(root)
[root@localhost ~]# id -G
0
[root@localhost ~]# id -un
root

f、su

su命令用來切換當前使用者身份。

su[options…] [-] [user [args…]] 切換使用者的方式:

su UserName:非登入式切換,即不會讀取目標使用者的組態檔,不改變當前工作目錄

su – UserName:登入式切換,會讀取目標使用者的組態檔,切換至家目錄,完全切換

su -l UserName相當於su – UserName

root su至其他使用者無須密碼;非root使用者切換時需要密碼

su [-] UserName -c 'COMMAND' :撤換至指定使用者身份執行命令,命令執行結束後即退出

-c : 不用登陸使用者即可以以指定使用者執行命令 su - geek -c 'id -u'

[root@localhost ~]# su - geek -c 'id'
uid=1003(geek) gid=1003(geek) groups=1003(geek)

g、passwd

passwd命令用來進行使用者密碼管理。

passwd - passwd - update user's authentication tokens
synopsis:passwd [-k] [-l] [-u [-f]] [-d] [-e] [-n mindays] [-x maxdays] [-w warndays] [-i inactivedays] [-S] [--stdin] [username]
1、passwd (修改自己的密碼)
2、passwd USERNAME(修改其他使用者的密碼,root許可權 )
options:
    -l : 鎖定使用者,在/etc/passwd的密碼前面加!!,
    -u : 解鎖使用者,在/etcpasswd的密碼前!!取消
    -d : --delete,刪除使用者密碼
    -e DATE : --expire,設定過期時間
    -i DAYS : 非活動時間
    -n days : 最短使用期限
    -x days : 最長使用期限
    -w days : 警告期限
    --stdin : echo "PASSWD" | passwd --stdin root

範例:

[root@localhost ~]# echo young | passwd --stdin geek
Changing password for user geek.
passwd: all authentication tokens updated successfully.

h、chage

chage命令用來修改使用者密碼策略。

chage [OPTION]… LOGIN
-d:修改使用者最近一次修改密碼的日期
-E:修改賬戶的過期日期
-I:密碼禁用期
-m:密碼的最小使用期限
-M:密碼的最大使用期限
-W:密碼的警告時間
–l:顯示密碼策略

A、檢視mysql使用者以及密碼的有效期

[root@DB-Server ~]# chage -l mysql
Last password change : Mar 26, 2015
Password expires : never
Password inactive : never
Account expires : never
Minimum number of days between password change : -1
Maximum number of days between password change : -1
Number of days of warning before password expires : -1
[root@DB-Server ~]#

B、設定mysql使用者60天後密碼過期,至少7天後才能修改密碼,密碼過期前7天開始收到告警資訊。

[root@DB-Server ~]# chage -M 60 -m 7 -W 7 mysql
You have new mail in /var/spool/mail/root
[root@DB-Server ~]# chage -l mysql
Last password change : Mar 26, 2015
Password expires : May 25, 2015
Password inactive : never
Account expires : never
Minimum number of days between password change : 7
Maximum number of days between password change : 60
Number of days of warning before password expires : 7
[root@DB-Server ~]#
clip_image001

C、強制新建使用者第一次登陸時修改密碼

[root@DB-Server home]# useradd test
[root@DB-Server home]# passwd test
Changing password for user test.
New UNIX password:
Retype new UNIX password:
passwd: all authentication tokens updated successfully.
[root@DB-Server home]# chage -d 0 test
You have new mail in /var/spool/mail/root
[root@DB-Server home]# chage -l test
Last password change : password must be changed
Password expires : never
Password inactive : never
Account expires : never
Minimum number of days between password change : 0
Maximum number of days between password change : 99999
Number of days of warning before password expires : 7

i、chsh

chsh命令用來更改當前使用者的shell型別。

使用許可權:所有使用者 命令:chsh   用法:shell>> chsh   說明:更改使用者 shell 設定   範例:

  shell>> chsh
  Changing fihanging shell for user1
  Password: [del]
  New shell [/bin/tcsh]: ### [是目前使用的 shell]
  [del]
  shell>> chsh -l ### 展示 /etc/shells 檔案內容
  /bin/bash
  /bin/sh
  /bin/ash
  /bin/bsh
  /bin/tcsh
  /bin/csh

1 我想知道我機器安裝了哪些shell? 兩種方法可以檢視: 第一種: [rocrocket@jb51.net ~]$ chsh -l /bin/sh /bin/bash /sbin/nologin /bin/zsh 第二種: [rocrocket@jb51.net ~]$ cat /etc/shells /bin/sh /bin/bash /sbin/nologin /bin/zsh 其實chsh -l也是來檢視這個檔案。

2 我想知道我當前正在使用的shell是哪個阿?

[rocrocket@jb51.net ~]$ echo $SHELL
/bin/bash

注意SHELL一定要是大寫。可以看到,我目前使用的shell是/bin/bash

3 執行了zsh之後,我檢視當前shell型別仍然是/bin/bash呢? 請注意,我們雖然執行了zsh,但是所謂“當前的shell”是一個大環境的概念,是針對一個已登入的使用者而言的。而我們執行zsh只是啟動了一個zsh的直譯器程式而已,並沒有改變大環境。如果想改變“當前的shell”,那麼還是要使用chsh才可以。

4 我想把我的shell改成zsh!

[rocrocket@jb51.net ~]$ chsh -s /bin/zsh
Changing shell for rocrocket.
Password:
Shell changed.

[rocrocket@jb51.net ~]$

使用chsh加選項-s就可以修改登入的shell了! 你會發現你現在執行echo $SHELL後仍然輸出為/bin/bash,這是因為你需要重新啟動你的shell才完全投入到zsh懷抱中去。

5 chsh -s到底是修改了哪裡? 秘密告訴你吧。chsh -s其實修改的就是/etc/passwd檔案裡和你的使用者名稱 相對應的那一行。現在我來檢視下:

[rocrocket@jb51.net ~]$ cat /etc/passwd|grep ^rocrocket
rocrocket:x:500:500:rocrocket,China:/rocrocket/PSB/home:/bin/zsh

看!你可以發現輸出內容的最後部分已經變成了/bin/zsh了!下次你重新啟動的時候,linux就會讀取這一命令來啟動你的shell了! 好了,我要恢復正常工作,把shell修改會我熟悉的/bin/bash了!

[rocrocket@jb51.net ~]$ chsh -s /bin/bash
Changing shell for rocrocket.
Password:
Shell changed.

j、chfn與finger

chfn命令用於指定個人資訊,finger用來檢視個人資訊。

chfn命令格式:

Usage: chfn [ -f full-name ] [ -o office ] [ -p office-phone ]
        [ -h home-phone ] [ --help ] [ --version ]
[root@localhost ~]# chfn
Changing finger information for root.
Name [root]: young
Office []: geek
Office Phone []: 010110110
Home Phone []: 0101101101

Finger information changed.

[root@localhost ~]# finger root
Login: root                             Name: young
Directory: /root                        Shell: /bin/bash
Office: geek, 010110110                 Home Phone: 010-110-1101
On since Sun Jan  1 02:39 (CST) on pts/0 from 192.168.1.116
No mail.
No Plan.

更多詳情見請繼續閱讀下一頁的精彩內容http://www.linuxidc.com/Linux/2017-02/140312p2.htm


IT145.com E-mail:sddin#qq.com