1. 程式人生 > >關於Ubuntu中passwd、shadow、group等文件

關於Ubuntu中passwd、shadow、group等文件

之間 文件的 最重要的 關聯 ice use 並不是 字段 新用戶

轉自https://yq.aliyun.com/articles/50327

在Ubuntu系統中,/etc目錄下,有三個文件:passwd shadow group,可能我們已經在用了,但是沒有註意到其詳細。

這三個配置文件用於系統帳號管理,都是文本文件,可用vi等文本編輯器打開。/etc/passwd用於存放用戶帳號信息,/etc/shadow 用於存放每個用戶加密的密碼,/etc/group用於存放用戶的組信息。

1. /etc/passwd

/etc/passwd文件的內容如下:

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4::sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
...

每一行是由分號分隔的字串組成,它的格式如下:

username:password:uid:gid:gecos:homedir:shell
各域對應的中文說明如下:
用戶名:密碼:用戶ID:組ID:用戶全名:主目錄:登錄shell
gecos是通用電子計算機操作系統的縮寫,是Bell實驗室中的一臺大型主機。

Unix系統最初是用明文保存密碼的,後來由於安全的考慮,采用crypt()算法加密密碼並存放在/etc/passwd文件。現在,由 於計算機處理能力的提高,使密碼破解變得越來越容易。/etc/passwd文件是所有合法用戶都可訪問的,大家都可互相看到密碼的加密字符串,這給系統 帶來很大的安全威脅。現代的Unix系統使用影子密碼系統,它把密碼從/etc/pa sswd文件中分離出來,真正的密碼保存在/etc/shadow文件中,shadow文件只能由超級用戶訪問。這樣入侵者就不能獲得加密密碼串,用於破 解。使用shadow密碼文件後,/etc/passwd文件中所有帳戶的password域的內容為"x",如果password域的內容為"*",則 該帳號被停用。使用passwd這個程序可修改用戶的密。

2. /etc/shadow

/etc/shadow存放加密的口令,該文件只能由root讀取和修改。下面是shadow文件的內容:

root:$1$43ZR5j08$kuduq1uH36ihQuiqUGi/E9::0::7:::
daemon:*::0::7:::
bin:*::0::7:::
sys:*::0::7:::
sync:*::0::7:::
...

我們可用chage命令顯示test用戶的帳號信息:
debian:~# chage -l test
最小: 0
最大:
警告日: 7
失效日: -1
最後修改: 7月 09 2005
密碼過期: 從不
密碼失效: 從不
帳戶過期: 從不

/etc/shadow文件的格式如下:

username:password:last_change:min_change:max_change:warm:failed_expire:expiration:reserved
各字段的簡要說明:
last_change:表示自從Linux使用以來,口令被修改的天數。可用chage -d命令修改。
min_change:表示口令的最小修改間隔。可用chage -m命令修改。
max_change:

它的格式如下:

groupname:password:gid:members

這裏的password代表組口令,很少用到。它可使原先不在這個群組中的用戶可以通過newgrp命令暫時繼承該組的權限,使用 newgrp命令時會新開一個shell。口令的加密方式和passwd文件中的口令一樣,所以如果需設置組口令,要用passwd程序虛設一個用戶,再 把該用戶password節中的加密口令拷貝到/etc/group文件中。members列代表組成員,我們可把需加入該組的用戶以逗號分隔添加到這裏 即可。同一組的成員可繼承該組所擁有的權限。

這樣,用戶帳戶本身在 /etc/passwd 中定義。Linux 系統包含一個 /etc/passwd 的同伴文件,叫做 /etc/shadow。該文件不像 /etc/passwd,只有對於 root 用戶來說是可讀的,並且包含加密的密碼信息。我們來看一看 /etc/shadow 的一個樣本行:

CODE: drobbins:$1$1234567890123456789012345678901:11664:0:-1:-1:-1:-1:0


每一行給一個特殊帳戶定義密碼信息,同樣的,每個字段用 : 隔開。第一個字段定義與這個 shadow 條目相關聯的特殊用戶帳戶。第二個字段包含一個加密的密碼。其余的字段在下表中描述:

字段 3 自 1/1/1970 起,密碼被修改的天數
字段 4 密碼將被允許修改之前的天數(0 表示“可在任何時間修改”)
字段 5 系統將強制用戶修改為新密碼之前的天數(1 表示“永遠都不能修改”)
字段 6 密碼過期之前,用戶將被警告過期的天數(-1 表示“沒有警告”)
字段 7 密碼過期之後,系統自動禁用帳戶的天數(-1 表示“永遠不會禁用”)
字段 8 該帳戶被禁用的天數(-1 表示“該帳戶被啟用”)
字段 9 保留供將來使用

shadow 是 passwd 的影子文件。
在linux中,口令文件在/etc/passwd中,早期的這個文件直接存放加密後的密碼,前兩位是"鹽"值,是一個隨機數,後面跟的是加密的密碼。為了安全,現在的linux都提供了 /etc/shadow這個影子文件,密碼放在這個文件裏面,並且是只有root可讀的。
/etc/passwd文件的每個條目有7個域,分別是名字:密碼:用戶id:組id:用戶信息:主目錄:shell 
例如:ynguo:x:509:510::/home/ynguo:/bin/bash 
在利用了shadow文件的情況下,密碼用一個x表示,普通用戶看不到任何密碼信息。影子口令文件保存加密的口令;/etc/passwd文件中的密碼全部變成x。Shadow只能是root可讀,從而保證了安全。
/etc/shadow文件每一行的格式如下:用戶名:加密口令:上一次修改的時間(從1970年1月1日起的天數):口令在兩次修改間的最小天數:口令修改之前向用戶發出警告的天數:口令終止後賬號被禁用的天數:從1970年1月1日起賬號被禁用的天數:保留域。
例如:root:$1$t4sFPHBq$JXgSGgvkgBDD/D7FVVBBm0:11037:0:99999:7:-1:-1:1075498172

3. /etc/group

/etc/group 文件是用戶組的配置文件,內容包括用戶和用戶組,並且能顯示出用戶是歸屬哪個用戶組或哪幾個用戶組,因為一個用戶可以歸屬一個或多個不同的用戶組;同一用 戶組的用戶之間具有相似的特征。比如我們把某一用戶加入到root用戶組,那麽這個用戶就可以瀏覽root用戶家目錄的文件,如果root用戶把某個文件 的讀寫執行權限開放,root用戶組的所有用戶都可以修改此文件,如果是可執行的文件(比如腳本),root用戶組的用戶也是可以執行的; 用戶組的特性在系統管理中為系統管理員提供了極大的方便,但安全性也是值得關註的,如某個用戶下有對系統管理有最重要的內容,最好讓用戶擁有獨立的用戶 組,或者是把用戶下的文件的權限設置為完全私有;另外root用戶組一般不要輕易把普通用戶加入進去.

/etc/group 內容具體分析
/etc/group 的內容包括用戶組(Group)、用戶組口令、GID及該用戶組所包含的用戶(User),每個用戶組一條記錄;格式如下:

group_name:passwd:GID:user_list

在/etc/group 中的每條記錄分四個字段:
第一字段:用戶組名稱;
第二字段:用戶組密碼;
第三字段:GID
第四字段:用戶列表,每個用戶之間用,號分割;本字段可以為空;如果字段為空表示用戶組為GID的用戶名; 我們舉個例子:

root:x:0:root,linuxsir 註:用戶組root,x是密碼段,表示沒有設置密碼,GID是0,root用戶組下包括root、linuxsir以及GID為0的其它用戶(可以通過/etc/passwd查看);
beinan:x:500:linuxsir 註:用戶組beinan,x是密碼段,表示沒有設置密碼,GID是500,beinan用戶組下包括linuxsir用戶及GID為500的用戶(可以通過/etc/passwd查看);
linuxsir:x:502:linuxsir 註:用戶組linuxsir,x是密碼段,表示沒有設置密碼,GID是502,linuxsir用戶組下包用戶linuxsir及GID為502的用戶(可以通過/etc/passwd查看);
helloer:x:503: 註:用戶組helloer,x是密碼段,表示沒有設置密碼,GID是503,helloer用戶組下包括GID為503的用戶,可以通過/etc/passwd查看;

而/etc/passwd 對應的相關的記錄為:

root:x:0:0:root:/root:/bin/bash
beinan:x:500:500:beinan sun:/home/beinan:/bin/bash
linuxsir:x:505:502:linuxsir open,linuxsir office,13898667715:/home/linuxsir:/bin/bash
helloer:x:502:503::/home/helloer:/bin/bash

由此可以看出helloer用戶組包括 helloer用戶;所以我們查看一個用戶組所擁有的用戶,可以通過對比/etc/passwd和/etc/group來得到;

關於GID ;
GID和UID類似,是一個正整數或0,GID從0開始,GID為0的組讓系統付予給root用戶組;系統會預留一些較靠前的GID給系統虛擬用戶(也被 稱為偽裝用戶)之用;每個系統預留的GID都有所不同,比如Fedora 預留了500個,我們添加新用戶組時,用戶組是從500開始的;而Slackware 是把前100個GID預留,新添加的用戶組是從100開始;查看系統添加用戶組默認的GID範圍應該查看 /etc/login.defs 中的 GID_MIN 和GID_MAX 值; 我們可以對照/etc/passwd和/etc/group 兩個文件;我們會發現有默認用戶組之說;我們在 /etc/passwd 中的每條用戶記錄會發現用戶默認的GID ;在/etc/group中,我們也會發現每個用戶組下有多少個用戶;在創建目錄和文件時,會使用默認的用戶組;我們還是舉個例子; 比如我把linuxsir 加為root用戶組,在/etc/passwd 和/etc/group 中的記錄相關記錄為:
linuxsir用戶在 /etc/passwd 中的記錄;我們在這條記錄中看到,linuxsir用戶默認的GID為502;而502的GID 在/etc/group中查到是linuxsir用戶組;

linuxsir:x:505:502:linuxsir open,linuxsir office,13898667715:/home/linuxsir:/bin/bash

linuxsir 用戶在 /etc/group 中的相關記錄;在這裏,我們看到linuxsir用戶組的GID 為502,而linuxsir 用戶歸屬為root、beinan用戶組;

root:x:0:root,linuxsir
beinan:x:500:linuxsir
linuxsir:x:502:linuxsir

我們用linuxsir 來創建一個目錄,以觀察linuxsir用戶創建目錄的權限歸屬;

[[email protected] ~]$ mkdir testdir
[[email protected] ~]$ ls -lh
總用量 4.0K
drwxrwxr-x 2 linuxsir linuxsir 4.0K 10月 17 11:42 testdir

通過我們用linuxsir 來創建目錄時發現,testdir的權限歸屬仍然是linuxsir用戶和linuxsir用戶組的;而沒有歸屬root和beinan用戶組,明白了吧; 但值得註意的是,判斷用戶的訪問權限時,默認的GID 並不是最重要的,只要一個目錄讓同組用戶可以訪問的權限,那麽同組用戶就可以擁有該目錄的訪問權,在這時用戶的默認GID 並不是最重要的;

4. /etc/gshadow

/etc/gshadow 解說;

/etc/gshadow是/etc/group的加密資訊文件,比如用戶組(Group)管理密碼就是存放在這個文件。/etc/gshadow和/etc/group是互補的兩個文件;對於大型服務器,針對很多用戶和組,定制一些關系結構比較復雜的權限模型,設置用戶組密碼是極有必要的。比如我們不想讓一些非用戶組成員永久擁有用戶組的權限和特性,這時我們可以通過密碼驗證的方式來讓某些用戶臨時擁有一些用戶組特性,這時就要用到用戶組密碼;

/etc/gshadow 格式如下,每個用戶組獨占一行;

groupname:password:admin,admin,...:member,member,...

第一字段:用戶組
第二字段:用戶組密碼,這個段可以是空的或!,如果是空的或有!,表示沒有密碼;
第三字段:用戶組管理者,這個字段也可為空,如果有多個用戶組管理者,用,號分割;
第四字段:組成員,如果有多個成員,用,號分割;

舉例:

beinan:!::linuxsir
linuxsir:oUS/q7NH75RhQ::linuxsir

第一字段:這個例子中,有兩個用戶組beinan用linuxsir
第二字段:用戶組的密碼,beinan用戶組無密碼;linuxsir用戶組有已經,已經加密;
第三字段:用戶組管理者,兩者都為空;
第四字段:beinan用戶組所擁有的成員是linuxsir ,然後還要對照一下/etc/group和/etc/passwd查看是否還有其它用戶,一般默認添加的用戶,有時同時也會創建用戶組和用戶名同名稱; linuxsir 用戶組有成員linuxisir;

如何設置用戶組的密碼? 我們可以通過 gpasswd來實現;不過一般的情況下,沒有必要設置用戶組的密碼;不過自己實踐一下也有必要;下面是一個為linuxsir用戶組設置密碼的例子;

gpasswd 的用法: gpasswd 用戶組

[email protected] ~]# gpasswdlinuxsir

正在修改 linuxsir 組的密碼
新密碼:
請重新輸入新密碼:

newgrp

用戶組之間的切換,應該用 newgrp ,這個有點象用戶之間切換的su ;我先舉個例子:

[[email protected] ~]$ newgrp linuxsir
密碼:
[[email protected] ~]$ mkdir lingroup
[[email protected] ~]$ ls -ld lingroup/
drwxr-xr-x 2 beinan linuxsir 4096 10月 18 15:56lingroup/
[[email protected] ~]$ newgrp beinan
[[email protected] ~]$ mkdir beinangrouptest
[[email protected] ~]$ ls -ld beinangrouptest
drwxrwxr-x 2 beinan beinan 4096 10月 18 15:56beinangrouptest

說明:我是以beinan用戶組切換到linuxsir用戶組,並且建了一個目錄,然後再切換回beinan用戶組,又建了一個目錄,請觀察兩個目錄屬用戶組的不同;還是自己體會吧;

關於Ubuntu中passwd、shadow、group等文件