久久精品国产精品国产精品污,男人扒开添女人下部免费视频,一级国产69式性姿势免费视频,夜鲁夜鲁很鲁在线视频 视频,欧美丰满少妇一区二区三区,国产偷国产偷亚洲高清人乐享,中文 在线 日韩 亚洲 欧美,熟妇人妻无乱码中文字幕真矢织江,一区二区三区人妻制服国产

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux 账号管理与 ACL 权限配置

發布時間:2023/12/16 linux 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux 账号管理与 ACL 权限配置 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
要登陸 Linux 系統一定要有賬號與口令才行,否則怎么登陸,您說是吧?不過, 不同的使用者應該要擁有不同的權限才行吧?我們還可以透過 user/group 的特殊權限配置, 來規范出不同的群組開發項目呢~在 Linux 的環境下,我們可以透過很多方式來限制用戶能夠使用的系統資源, 包括?十一章、bash?提到的?ulimit?限制、還有特殊權限限制,如?umask?等等。 透過這些舉動,我們可以規范出不同使用者的使用資源。另外,還記得系統管理員的賬號嗎?對! 就是 root 。請問一下,除了 root 之外,是否可以有其他的系統管理員賬號? 為什么大家都要盡量避免使用數字型態的賬號?如何修改用戶相關的信息呢?這些我們都得要了解了解的!

?

1.?Linux 的賬號與群組
  1.1?使用者標識符: UID 與 GID
  1.2?使用者賬號/etc/passwd 文件結構,?/etc/shadow 文件結構
  1.3?關于群組:?/etc/group 文件結構,?有效與初始群組,?groups,?newgrp,?/etc/gshadow
2.?賬號管理
  2.1?新增與移除使用者:?useradd,?useradd 參考檔,?passwd,?chage,?usermod,?userdel
  2.2?用戶功能finger,?chfn,?chsh,?id
  2.3?新增與移除群組groupadd,?groupmod,?groupdel,?gpasswd 群組管理員
  2.4?賬號管理實例
3.?主機的細部權限規劃:ACL 的使用
  3.1?什么是 ACL
  3.2?如何啟動 ACL
  3.3?ACL 的配置技巧:?setfacl,?getfacl, ACL 的配置(user,?group?mask,?default)
4.?使用者身份切換
  4.1?su
  4.2?sudo:?sudo 命令,?visudo (/etc/sudoers)?(?賬號,?群組,?限制命令,?別名,?時間間隔,?配合 su?)
5.?使用者的特殊 shell 與 PAM 模塊
  5.1?特殊的 shell :/sbin/nologin,?nologin.txt
  5.2?PAM 模塊簡介
  5.3?PAM 模塊配置語法:驗證類別(type)、控制標準(flag)、模塊與參數
  5.4?常用模塊簡介:?securetty,?nologin,?pam_cracklib,?login流程
  5.5?其他相關文件:?limits.conf,
6.?Linux 主機上的用戶信息傳遞
  6.1?查詢使用者: w, who, last, lastlog
  6.2?使用者對談: write, mesg, wall
  6.3?使用者郵件信箱: mail
7.?手動新增使用者
  7.1?一些檢查工具pwck,?pwconv,?pwunconv,?chpasswd
  7.2?特殊賬號,如純數字賬號的手工創建
  7.3?大量建置賬號模板(適用 passwd --stdin 選項)
  7.4?大量建置賬號的范例(適用于連續數字,如學號)
8.?重點回顧
9.?本章習題
10.?參考數據與延伸閱讀
11.?針對本文的建議:http://phorum.vbird.org/viewtopic.php?t=23887

Linux 的賬號與群組

管理員的工作中,相當重要的一環就是『管理賬號』啦!因為整個系統都是你在管理的, 并且所有一般用戶的賬號申請,都必須要透過你的協助才行!所以你就必須要了解一下如何管理好一個服務器主機的賬號啦! 在管理 Linux 主機的賬號時,我們必須先來了解一下 Linux 到底是如何辨別每一個使用者的!


使用者標識符: UID 與 GID

雖然我們登陸 Linux 主機的時候,輸入的是我們的賬號,但是其實 Linux 主機并不會直接認識你的『賬號名稱』的,他僅認識 ID 啊 (ID 就是一組號碼啦)。 由于計算機僅認識 0 與 1,所以主機對于數字比較有概念的;至于賬號只是為了讓人們容易記憶而已。 而你的 ID 與賬號的對應就在 /etc/passwd 當中哩。


如果你曾經在網絡上下載過?tarball?類型的文件, 那么應該不難發現,在解壓縮之后的文件中,文件擁有者的字段竟然顯示『不明的數字』?奇怪吧?這沒什么好奇怪的,因為 Linux 說實在話,他真的只認識代表你身份的號碼而已!
?

那么到底有幾種 ID 呢?還記得我們在第六章內有提到過, 每一個文件都具有『擁有人與擁有群組』的屬性嗎?沒錯啦~每個登陸的使用者至少都會取得兩個 ID ,一個是使用者 ID (User ID ,簡稱 UID)、一個是群組 ID (Group ID ,簡稱 GID)。

那么文件如何判別他的擁有者與群組呢?其實就是利用 UID 與 GID 啦!每一個文件都會有所謂的擁有者 ID 與擁有群組 ID ,當我們有要顯示文件屬性的需求時,系統會依據 /etc/passwd 與 /etc/group 的內容, 找到 UID / GID 對應的賬號與組名再顯示出來!我們可以作個小實驗,你可以用 root 的身份 vi /etc/passwd ,然后將你的一般身份的使用者的 ID 隨便改一個號碼,然后再到你的一般身份的目錄下看看原先該賬號擁有的文件,你會發現該文件的擁有人變成了 『數字了』呵呵!這樣可以理解了嗎?來看看底下的例子:

# 1. 先察看一下,系統里面有沒有一個名為 dmtsai 的用戶? [root@www ~]# grep 'dmtsai' /etc/passwd dmtsai:x:503:504::/home/dmtsai:/bin/bash <==是有這個賬號喔! [root@www ~]# ll -d /home/dmtsai drwx------ 4 dmtsai dmtsai 4096 Feb 6 18:25 /home/dmtsai # 瞧一瞧,使用者的字段正是 dmtsai 本身喔! # 2. 修改一下,將剛剛我們的 dmtsai 的 503 UID 改為 2000 看看: [root@www ~]# vi /etc/passwd ....(前面省略).... dmtsai:x:2000:504::/home/dmtsai:/bin/bash <==修改一下特殊字體部分,由 503 改過來 [root@www ~]# ll -d /home/dmtsai drwx------ 4 503 dmtsai 4096 Feb 6 18:25 /home/dmtsai # 很害怕吧!怎么變成 503 了?因為文件只會記錄數字而已! # 因為我們亂改,所以導致 503 找不到對應的賬號,因此顯示數字! # 3. 記得將剛剛的 2000 改回來! [root@www ~]# vi /etc/passwd ....(前面省略).... dmtsai:x:503:504::/home/dmtsai:/bin/bash <==趕緊改回來!

你一定要了解的是,上面的例子僅是在說明 UID 與賬號的對應性,在一部正常運行的 Linux 主機環境下,上面的動作不可隨便進行, 這是因為系統上已經有很多的數據被創建存在了,隨意修改系統上某些賬號的 UID 很可能會導致某些程序無法進行,這將導致系統無法順利運行的結果。 因為權限的問題啊!所以,了解了之后,請趕快回到 /etc/passwd 里面,將數字改回來喔!

Tips:
舉例來說,如果上面的測試最后一個步驟沒有將 2000 改回原本的 UID,那么當 dmtsai 下次登陸時將沒有辦法進入自己的家目錄! 因為他的 UID 已經改為 2000 ,但是他的家目錄 (/home/dmtsai) 卻記錄的是 503 ,由于權限是 700 , 因此他將無法進入原本的家目錄!是否非常嚴重啊?
?

使用者賬號

Linux 系統上面的用戶如果需要登陸主機以取得 shell 的環境來工作時,他需要如何進行呢? 首先,他必須要在計算機前面利用 tty1~tty7 的終端機提供的 login 接口,并輸入賬號與口令后才能夠登陸。 如果是透過網絡的話,那至少使用者就得要學習 ssh 這個功能了 (服務器篇再來談)。 那么你輸入賬號口令后,系統幫你處理了什么呢?

  • 先找尋 /etc/passwd 里面是否有你輸入的賬號?如果沒有則跳出,如果有的話則將該賬號對應的 UID 與 GID (在 /etc/group 中) 讀出來,另外,該賬號的家目錄與 shell 配置也一并讀出;

  • 再來則是核對口令表啦!這時 Linux 會進入 /etc/shadow 里面找出對應的賬號與 UID,然后核對一下你剛剛輸入的口令與里頭的口令是否相符?

  • 如果一切都 OK 的話,就進入 Shell 控管的階段啰!
  • 大致上的情況就像這樣,所以當你要登陸你的 Linux 主機的時候,那個 /etc/passwd 與 /etc/shadow 就必須要讓系統讀取啦 (這也是很多攻擊者會將特殊賬號寫到 /etc/passwd 里頭去的緣故),所以呢,如果你要備份 Linux 的系統的賬號的話,那么這兩個文件就一定需要備份才行呦!

    由上面的流程我們也知道,跟使用者賬號有關的有兩個非常重要的文件,一個是管理使用者 UID/GID 重要參數的 /etc/passwd ,一個則是專門管理口令相關數據的 /etc/shadow 啰!那這兩個文件的內容就非常值得進行研究啦! 底下我們會簡單的介紹這兩個文件,詳細的說明可以參考 man 5 passwd 及 man 5 shadow (注1)。


    • /etc/passwd 文件結構

    這個文件的構造是這樣的:每一行都代表一個賬號,有幾行就代表有幾個賬號在你的系統中! 不過需要特別留意的是,里頭很多賬號本來就是系統正常運行所必須要的,我們可以簡稱他為系統賬號, 例如 bin, daemon, adm, nobody 等等,這些賬號請不要隨意的殺掉他呢!?這個文件的內容有點像這樣:


    在接觸 Linux 之前曾經碰過 Solaris 系統 (1999 年),當時啥也不清楚!由于『聽說』Linux 上面的賬號越復雜會導致系統越危險!所以就將 /etc/passwd 上面的賬號全部刪除到只剩下 root 與自己用的一般賬號!結果你猜發生什么事?那就是....呼叫升陽的工程師來維護系統 @_@!糗到一個不行!大家不要學啊!
    ?
    [root@www ~]# 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

    我們先來看一下每個 Linux 系統都會有的第一行,就是 root 這個系統管理員那一行好了, 你可以明顯的看出來,每一行使用『:』分隔開,共有七個咚咚,分別是:

  • 賬號名稱:
    就是賬號啦!用來對應 UID 的。例如 root 的 UID 對應就是 0 (第三字段);

  • 口令:
    早期 Unix 系統的口令就是放在這字段上!但是因為這個文件的特性是所有的程序都能夠讀取,這樣一來很容易造成口令數據被竊取, 因此后來就將這個字段的口令數據給他改放到?/etc/shadow?中了。所以這里你會看到一個『 x 』,呵呵!

  • UID:
    這個就是使用者標識符啰!通常 Linux 對于 UID 有幾個限制需要說給您了解一下:

    id 范圍該 ID 使用者特性
    0
    (系統管理員)
    當 UID 是 0 時,代表這個賬號是『系統管理員』! 所以當你要讓其他的賬號名稱也具有 root 的權限時,將該賬號的 UID 改為 0 即可。 這也就是說,一部系統上面的系統管理員不見得只有 root 喔! 不過,很不建議有多個賬號的 UID 是 0 啦~
    1~499
    (系統賬號)
    保留給系統使用的 ID,其實除了 0 之外,其他的 UID 權限與特性并沒有不一樣。默認 500 以下的數字讓給系統作為保留賬號只是一個習慣。

    由于系統上面啟動的服務希望使用較小的權限去運行,因此不希望使用 root 的身份去運行這些服務, 所以我們就得要提供這些運行中程序的擁有者賬號才行。這些系統賬號通常是不可登陸的, 所以才會有我們在第十一章提到的 /sbin/nologin 這個特殊的 shell 存在。

    根據系統賬號的由來,通常系統賬號又約略被區分為兩種:
    1~99:由 distributions 自行創建的系統賬號;
    100~499:若用戶有系統賬號需求時,可以使用的賬號 UID。
    500~65535
    (可登陸賬號)
    給一般使用者用的。事實上,目前的 linux 核心 (2.6.x 版)已經可以支持到 4294967295 (2^32-1) 這么大的 UID 號碼喔!

    上面這樣說明可以了解了嗎?是的, UID 為 0 的時候,就是 root 呦!所以請特別留意一下你的 /etc/passwd 文件!

  • GID:
    這個與 /etc/group 有關!其實 /etc/group 的觀念與 /etc/passwd 差不多,只是他是用來規范組名與 GID 的對應而已!

  • 用戶信息說明欄:
    這個字段基本上并沒有什么重要用途,只是用來解釋這個賬號的意義而已!不過,如果您提供使用 finger 的功能時, 這個字段可以提供很多的信息呢!本章后面的?chfn?命令會來解釋這里的說明。

  • 家目錄:
    這是用戶的家目錄,以上面為例, root 的家目錄在 /root ,所以當 root 登陸之后,就會立刻跑到 /root 目錄里頭啦!呵呵! 如果你有個賬號的使用空間特別的大,你想要將該賬號的家目錄移動到其他的硬盤去該怎么作? 沒有錯!可以在這個字段進行修改呦!默認的用戶家目錄在 /home/yourIDname

  • Shell:
    我們在第十一章 BASH?提到很多次,當用戶登陸系統后就會取得一個 Shell 來與系統的核心溝通以進行用戶的操作任務。那為何默認 shell 會使用 bash 呢?就是在這個字段指定的啰! 這里比較需要注意的是,有一個 shell 可以用來替代成讓賬號無法取得 shell 環境的登陸動作!那就是 /sbin/nologin 這個東西!這也可以用來制作純 pop 郵件賬號者的數據呢!


    • /etc/shadow 文件結構

    我們知道很多程序的運行都與權限有關,而權限與 UID/GID 有關!因此各程序當然需要讀取 /etc/passwd 來了解不同賬號的權限。?因此 /etc/passwd 的權限需配置為 -rw-r--r-- 這樣的情況, 雖然早期的口令也有加密過,但卻放置到 /etc/passwd 的第二個字段上!這樣一來很容易被有心人士所竊取的, 加密過的口令也能夠透過暴力破解法去 try and error (試誤) 找出來!

    因為這樣的關系,所以后來發展出將口令移動到 /etc/shadow 這個文件分隔開來的技術, 而且還加入很多的口令限制參數在 /etc/shadow 里頭呢!在這里,我們先來了解一下這個文件的構造吧! 鳥哥的 /etc/shadow 文件有點像這樣:

    [root@www ~]# head -n 4 /etc/shadow root:$1$/30QpE5e$y9N/D0bh6rAACBEz.hqo00:14126:0:99999:7::: <==底下說明用 bin:*:14126:0:99999:7::: daemon:*:14126:0:99999:7::: adm:*:14126:0:99999:7:::

    基本上, shadow 同樣以『:』作為分隔符,如果數一數,會發現共有九個字段啊,這九個字段的用途是這樣的:

  • 賬號名稱:
    由于口令也需要與賬號對應啊~因此,這個文件的第一欄就是賬號,必須要與 /etc/passwd 相同才行!

  • 口令:
    這個字段內的數據才是真正的口令,而且是經過編碼的口令 (加密)?啦! 你只會看到有一些特殊符號的字母就是了!需要特別留意的是,雖然這些加密過的口令很難被解出來, 但是『很難』不等于『不會』,所以,這個文件的默認權限是『-rw-------』或者是『-r--------』,亦即只有 root 才可以讀寫就是了!你得隨時注意,不要不小心更動了這個文件的權限呢!

    另外,由于各種口令編碼的技術不一樣,因此不同的編碼系統會造成這個字段的長度不相同。 舉例來說,舊式的 DES 編碼系統產生的口令長度就與目前慣用的 MD5 不同(注2)!MD5 的口令長度明顯的比較長些。由于固定的編碼系統產生的口令長度必須一致,因此『當你讓這個字段的長度改變后,該口令就會失效(算不出來)』。 很多軟件透過這個功能,在此字段前加上 ! 或 * 改變口令字段長度,就會讓口令『暫時失效』了。?

  • 最近更動口令的日期:
    這個字段記錄了『更動口令那一天』的日期,不過,很奇怪呀!在我的例子中怎么會是 14126 呢?呵呵,這個是因為計算 Linux 日期的時間是以 1970 年 1 月 1 日作為 1 而累加的日期,1971 年 1 月 1 日則為 366 啦! 得注意一下這個數據呦!上述的 14126 指的就是 2008-09-04 那一天啦!了解乎? 而想要了解該日期可以使用本章后面?chage?命令的幫忙!至于想要知道某個日期的累積日數, 可使用如下的程序計算:
    [root@www ~]# echo $(($(date --date="2008/09/04" +%s)/86400+1)) 14126
    上述命令中,2008/09/04 為你想要計算的日期,86400 為每一天的秒數, %s 為 1970/01/01 以來的累積總秒數。 由于 bash 僅支持整數,因此最終需要加上 1 補齊 1970/01/01 當天。

  • 口令不可被更動的天數:(與第 3 字段相比)
    第四個字段記錄了:這個賬號的口令在最近一次被更改后需要經過幾天才可以再被變更!如果是 0 的話, 表示口令隨時可以更動的意思。這的限制是為了怕口令被某些人一改再改而設計的!如果配置為 20 天的話,那么當你配置了口令之后, 20 天之內都無法改變這個口令呦!

  • 口令需要重新變更的天數:(與第 3 字段相比)
    經常變更口令是個好習慣!為了強制要求用戶變更口令,這個字段可以指定在最近一次更改口令后, 在多少天數內需要再次的變更口令才行。你必須要在這個天數內重新配置你的口令,否則這個賬號的口令將會『變為過期特性』。 而如果像上面的 99999 (計算為 273 年) 的話,那就表示,呵呵,口令的變更沒有強制性之意。

  • 口令需要變更期限前的警告天數:(與第 5 字段相比)
    當賬號的口令有效期限快要到的時候 (第 5 字段),系統會依據這個字段的配置,發出『警告』言論給這個賬號,提醒他『再過 n 天你的口令就要過期了,請盡快重新配置你的口令呦!』,如上面的例子,則是口令到期之前的 7 天之內,系統會警告該用戶。

  • 口令過期后的賬號寬限時間(口令失效日):(與第 5 字段相比)
    口令有效日期為『升級日期(第3字段)』+『重新變更日期(第5字段)』,過了該期限后用戶依舊沒有升級口令,那該口令就算過期了。 雖然口令過期但是該賬號還是可以用來進行其他工作的,包括登陸系統取得 bash 。不過如果口令過期了, 那當你登陸系統時,系統會強制要求你必須要重新配置口令才能登陸繼續使用喔,這就是口令過期特性。

    那這個字段的功能是什么呢?是在口令過期幾天后,如果使用者還是沒有登陸更改口令,那么這個賬號的口令將會『失效』, 亦即該賬號再也無法使用該口令登陸了。要注意口令過期與口令失效并不相同。

  • 賬號失效日期:
    這個日期跟第三個字段一樣,都是使用 1970 年以來的總日數配置。這個字段表示:?這個賬號在此字段規定的日期之后,將無法再使用。 就是所謂的『賬號失效』,此時不論你的口令是否有過期,這個『賬號』都不能再被使用! 這個字段會被使用通常應該是在『收費服務』的系統中,你可以規定一個日期讓該賬號不能再使用啦!

  • 保留:
    最后一個字段是保留的,看以后有沒有新功能加入。
  • 舉個例子來說好了,假如我的 dmtsai 這個用戶的口令欄如下所示:

    dmtsai:$1$vyUuj.eX$omt6lKJvMcIZHx4H7RI1V.:14299:5:60:7:5:14419:

    這表示什么呢?先要注意的是 14299 是 2009/02/24 。所以 dmtsai 這個用戶的口令相關意義是:

    • 由于口令幾乎僅能單向運算(由明碼計算成為口令,無法由口令反推回明碼),因此由上表的數據我們無法得知 dmstai 的實際口令明文;

    • 此賬號最近一次更動口令的日期是 2009/02/24 (14299);

    • 能夠再次修改口令的時間是 5 天以后,也就是?2009/03/01 以前 dmtsai 不能修改自己的口令;如果用戶還是嘗試要更動自己的口令,系統就會出現這樣的信息:
      You must wait longer to change your password passwd: Authentication token manipulation error
      畫面中告訴我們:你必須要等待更久的時間才能夠變更口令之意啦!

    • 由于口令過期日期定義為 60 天后,亦即累積日數為: 14299+60=14359,經過計算得到此日數代表日期為 2009/04/25。 這表示:『使用者必須要在 2009/03/01 到 2009/04/25 之間的 60 天限制內去修改自己的口令,若 2009/04/25 之后還是沒有變更口令時,該口令就宣告為過期』了!

    • 警告日期設為 7 天,亦即是口令過期日前的 7 天,在本例中則代表 2009/04/19 ~ 2009/04/25 這七天。 如果用戶一直沒有更改口令,那么在這 7 天中,只要 dmtsai 登陸系統就會發現如下的信息:
      Warning: your password will expire in 5 days
    • 如果該賬號一直到 2009/04/25 都沒有更改口令,那么口令就過期了。但是由于有 5 天的寬限天數, 因此?dmtsai 在 2009/04/30 前都還可以使用舊口令登陸主機。 不過登陸時會出現強制更改口令的情況,畫面有點像底下這樣:
      You are required to change your password immediately (password aged) WARNING: Your password has expired. You must change your password now and login again! Changing password for user dmtsai. Changing password for dmtsai (current) UNIX password:
      你必須要輸入一次舊口令以及兩次新口令后,才能夠開始使用系統的各項資源。如果你是在 2009/04/30 以后嘗試以 dmtsai 登陸的話,那么就會出現如下的錯誤信息且無法登陸,因為此時你的口令就失效去啦!
      Your account has expired; please contact your system administrator
    • 如果使用者在 2009/04/25 以前變更過口令,那么第 3 個字段的那個 14299 的天數就會跟著改變,因此, 所有的限制日期也會跟著相對變動喔!^_^

    • 無論使用者如何動作,到了 14419 (大約是 2009/07/24 左右) 該賬號就失效了~

    透過這樣的說明,您應該會比較容易理解了吧?由于 shadow 有這樣的重要性,因此可不能隨意修改喔! 但在某些情況底下你得要使用各種方法來處理這個文件的!舉例來說,常常聽到人家說:『我的口令忘記了』, 或者是『我的口令不曉得被誰改過,跟原先的不一樣了』,這個時候怎么辦?

    • 一般用戶的口令忘記了:這個最容易解決,請系統管理員幫忙, 他會重新配置好你的口令而不需要知道你的舊口令!利用 root 的身份使用?passwd?命令來處理即可。

    • root 口令忘記了:這就麻煩了!因為你無法使用 root 的身份登陸了嘛! 但我們知道 root 的口令在 /etc/shadow 當中,因此你可以使用各種可行的方法啟動進入 Linux 再去修改。 例如重新啟動進入單人維護模式(第二十章)后,系統會主動的給予 root 權限的 bash 接口, 此時再以 passwd 修改口令即可;或以 Live CD 啟動后掛載根目錄去修改 /etc/shadow,將里面的 root 的口令字段清空, 再重新啟動后 root 將不用口令即可登陸!登陸后再趕快以 passwd 命令去配置 root 口令即可。
    Tips:
    曾經聽過一則笑話,某位老師主要是在教授 Linux 操作系統,但是他是兼任的老師,因此對于該系的計算機環境不熟。 由于當初安裝該計算機教室 Linux 操作系統的人員已經離職且找不到聯絡方式了,也就是說 root 口令已經沒有人曉得了! 此時該老師就對學生說:『在 Linux 里面 root 口令不見了,我們只能重新安裝』...感覺有點無力~ 又是個被 Windows 制約的人才!

    關于群組: 有效與初始群組、groups, newgrp

    認識了賬號相關的兩個文件 /etc/passwd 與 /etc/shadow 之后,你或許還是會覺得奇怪, 那么群組的配置文件在哪里?還有,在 /etc/passwd 的第四欄不是所謂的 GID 嗎?那又是啥? 呵呵~此時就需要了解 /etc/group 與 /etc/gshadow 啰~


    • /etc/group 文件結構

    這個文件就是在記錄 GID 與組名的對應了~鳥哥測試機的 /etc/group 內容有點像這樣:

    [root@www ~]# head -n 4 /etc/group root:x:0:root bin:x:1:root,bin,daemon daemon:x:2:root,bin,daemon sys:x:3:root,bin,adm

    這個文件每一行代表一個群組,也是以冒號『:』作為字段的分隔符,共分為四欄,每一字段的意義是:

  • 組名:
    就是組名啦!

  • 群組口令:
    通常不需要配置,這個配置通常是給『群組管理員』使用的,目前很少有這個機會配置群組管理員啦! 同樣的,口令已經移動到 /etc/gshadow 去,因此這個字段只會存在一個『x』而已;

  • GID:
    就是群組的 ID 啊。我們 /etc/passwd 第四個字段使用的 GID 對應的群組名,就是由這里對應出來的!

  • 此群組支持的賬號名稱:
    我們知道一個賬號可以加入多個群組,那某個賬號想要加入此群組時,將該賬號填入這個字段即可。 舉例來說,如果我想要讓 dmtsai 也加入 root 這個群組,那么在第一行的最后面加上『,dmtsai』,注意不要有空格, 使成為『 root:x:0:root,dmtsai 』就可以啰~
  • 談完了 /etc/passwd, /etc/shadow, /etc/group 之后,我們可以使用一個簡單的圖示來了解一下 UID / GID 與口令之間的關系, 圖示如下。其實重點是 /etc/passwd 啦,其他相關的數據都是根據這個文件的字段去找尋出來的。 下圖中, root 的 UID 是 0 ,而 GID 也是 0 ,去找 /etc/group 可以知道 GID 為 0 時的組名就是 root 哩。 至于口令的尋找中,會找到 /etc/shadow 與 /etc/passwd 內同賬號名稱的那一行,就是口令相關數據啰。


    圖 1.3.1 、賬號相關文件之間的 UID/GID 與口令相關性示意圖

    至于在 /etc/group 比較重要的特色在于第四欄啦,因為每個使用者都可以擁有多個支持的群組,這就好比在學校念書的時候, 我們可以加入多個社團一樣! ^_^。不過這里你或許會覺得奇怪的,那就是:『假如我同時加入多個群組,那么我在作業的時候,到底是以那個群組為準?』 底下我們就來談一談這個『有效群組』的概念。


    • 有效群組(effective group)與初始群組(initial group)

    還記得每個使用者在他的 /etc/passwd 里面的第四欄有所謂的 GID 吧?那個 GID 就是所謂的『初始群組 (initial group) 』!也就是說,當用戶一登陸系統,立刻就擁有這個群組的相關權限的意思。 舉例來說,我們上面提到 dmtsai 這個使用者的 /etc/passwd 與 /etc/group 還有 /etc/gshadow 相關的內容如下:

    [root@www ~]# usermod -G users dmtsai <==先配置好次要群組 [root@www ~]# grep dmtsai /etc/passwd /etc/group /etc/gshadow /etc/passwd:dmtsai:x:503:504::/home/dmtsai:/bin/bash /etc/group:users:x:100:dmtsai <==次要群組的配置 /etc/group:dmtsai:x:504: <==因為是初始群組,所以第四字段不需要填入賬號 /etc/gshadow:users:::dmtsai <==次要群組的配置 /etc/gshadow:dmtsai:!::

    仔細看到上面這個表格,在 /etc/passwd 里面,dmtsai 這個使用者所屬的群組為 GID=504 ,搜尋一下 /etc/group 得到 504 是那個名為 dmtsai 的群組啦!這就是 initial group。因為是初始群組, 使用者一登陸就會主動取得,不需要在 /etc/group 的第四個字段寫入該賬號的!

    但是非 initial group 的其他群組可就不同了。舉上面這個例子來說,我將 dmtsai 加入 users 這個群組當中,由于 users 這個群組并非是 dmtsai 的初始群組,因此, 我必須要在 /etc/group 這個文件中,找到 users 那一行,并且將 dmtsai 這個賬號加入第四欄, 這樣 dmtsai 才能夠加入 users 這個群組啊。

    那么在這個例子當中,因為我的 dmtsai 賬號同時支持 dmtsai 與 users 這兩個群組, 因此,在讀取/寫入/運行文件時,針對群組部分,只要是 users 與 dmtsai 這兩個群組擁有的功能, 我 dmtsai 這個使用者都能夠擁有喔!這樣瞭呼?不過,這是針對已經存在的文件而言, 如果今天我要創建一個新的文件或者是新的目錄,請問一下,新文件的群組是 dmtsai 還是 users?呵呵!這就得要檢查一下當時的有效群組了 (effective group)。


    • groups: 有效與支持群組的觀察

    如果我以 dmtsai 這個使用者的身份登陸后,該如何知道我所有支持的群組呢? 很簡單啊,直接輸入 groups 就可以了!注意喔,是 groups 有加 s 呢!結果像這樣:

    [dmtsai@www ~]$ groups dmtsai users

    在這個輸出的信息中,可知道 dmtsai 這個用戶同時屬于 dmtsai 及 users 這個兩個群組,而且,?第一個輸出的群組即為有效群組 (effective group) 了。 也就是說,我的有效群組為 dmtsai 啦~此時,如果我以 touch 去創建一個新檔,例如: 『 touch test 』,那么這個文件的擁有者為 dmtsai ,而且群組也是 dmtsai 的啦。

    [dmtsai@www ~]$ touch test [dmtsai@www ~]$ ll -rw-rw-r-- 1 dmtsai dmtsai 0 Feb 24 17:26 test

    這樣是否可以了解什么是有效群組了?通常有效群組的作用是在新建文件啦!那么有效群組是否能夠變換?


    • newgrp: 有效群組的切換

    那么如何變更有效群組呢?就使用 newgrp 啊!不過使用 newgrp 是有限制的,那就是你想要切換的群組必須是你已經有支持的群組。舉例來說, dmtsai 可以在 dmtsai/users 這兩個群組間切換有效群組,但是 dmtsai 無法切換有效群組成為 sshd 啦!使用的方式如下:

    [dmtsai@www ~]$ newgrp users [dmtsai@www ~]$ groups users dmtsai [dmtsai@www ~]$ touch test2 [dmtsai@www ~]$ ll -rw-rw-r-- 1 dmtsai dmtsai 0 Feb 24 17:26 test -rw-r--r-- 1 dmtsai users 0 Feb 24 17:33 test2

    此時,dmtsai 的有效群組就成為 users 了。 我們額外的來討論一下 newgrp 這個命令,這個命令可以變更目前用戶的有效群組, 而且是另外以一個 shell 來提供這個功能的喔,所以,以上面的例子來說, dmtsai 這個使用者目前是以另一個 shell 登陸的,而且新的 shell 給予 dmtsai 有效 GID 為 users 就是了。如果以圖示來看就是如下所示:


    圖 1.3.2 、newgrp 的運行示意圖

    雖然用戶的環境配置(例如環境變量等等其他數據)不會有影響,但是使用者的『群組權限』將會重新被計算。 但是需要注意,由于是新取得一個 shell ,因此如果你想要回到原本的環境中,請輸入 exit 回到原本的 shell 喔!

    既然如此,也就是說,只要我的用戶有支持的群組就是能夠切換成為有效群組!好了, 那么如何讓一個賬號加入不同的群組就是問題的所在啰。你要加入一個群組有兩個方式,一個是透過系統管理員 (root) 利用?usermod?幫你加入,如果 root 太忙了而且你的系統有配置群組管理員,那么你可以透過群組管理員以?gpasswd?幫你加入他所管理的群組中!詳細的作法留待下一小節再來介紹啰!


    • /etc/gshadow

    剛剛講了很多關于『有效群組』的概念,另外,也提到 newgrp 這個命令的用法, 但是,如果 /etc/gshadow 這個配置沒有搞懂得話,那么 newgrp 是無法動作的呢! 鳥哥測試機的 /etc/gshadow 的內容有點像這樣:

    [root@www ~]# head -n 4 /etc/gshadow root:::root bin:::root,bin,daemon daemon:::root,bin,daemon sys:::root,bin,adm

    這個文件內同樣還是使用冒號『:』來作為字段的分隔字符,而且你會發現,這個文件幾乎與 /etc/group 一模一樣啊!是這樣沒錯~不過,要注意的大概就是第二個字段吧~第二個字段是口令欄, 如果口令欄上面是『!』時,表示該群組不具有群組管理員!至于第四個字段也就是支持的賬號名稱啰~ 這四個字段的意義為:

  • 組名
  • 口令欄,同樣的,開頭為 ! 表示無合法口令,所以無群組管理員
  • 群組管理員的賬號 (相關信息在?gpasswd?中介紹)
  • 該群組的所屬賬號 (與 /etc/group 內容相同!)
  • 以系統管理員的角度來說,這個 gshadow 最大的功能就是創建群組管理員啦! 那么什么是群組管理員呢?由于系統上面的賬號可能會很多,但是我們 root 可能平時太忙碌,所以當有使用者想要加入某些群組時, root 或許會沒有空管理。此時如果能夠創建群組管理員的話,那么該群組管理員就能夠將那個賬號加入自己管理的群組中! 可以免去 root 的忙碌啦!不過,由于目前有類似?sudo?之類的工具, 所以這個群組管理員的功能已經很少使用了。我們會在后續的 gpasswd 中介紹這個實作。


    賬號管理

    好啦!既然要管理賬號,當然是由新增與移除使用者開始的啰~底下我們就分別來談一談如何新增、 移除與更改用戶的相關信息吧~


    新增與移除使用者: useradd, 相關配置文件, passwd, usermod, userdel

    要如何在 Linux 的系統新增一個用戶啊?呵呵~真是太簡單了~我們登陸系統時會輸入 (1)賬號與 (2)口令, 所以創建一個可用的賬號同樣的也需要這兩個數據。那賬號可以使用 useradd 來新建用戶,口令的給予則使用 passwd 這個命令!這兩個命令下達方法如下:


    • useradd
    [root@www ~]# useradd [-u UID] [-g 初始群組] [-G 次要群組] [-mM]\ > [-c 說明欄] [-d 家目錄絕對路徑] [-s shell] 使用者賬號名 選項與參數: -u :后面接的是 UID ,是一組數字。直接指定一個特定的 UID 給這個賬號; -g :后面接的那個組名就是我們上面提到的 initial group 啦~該群組的 GID 會被放置到 /etc/passwd 的第四個字段內。 -G :后面接的組名則是這個賬號還可以加入的群組。這個選項與參數會修改 /etc/group 內的相關數據喔! -M :強制!不要創建用戶家目錄!(系統賬號默認值) -m :強制!要創建用戶家目錄!(一般賬號默認值) -c :這個就是 /etc/passwd 的第五欄的說明內容啦~可以隨便我們配置的啦~ -d :指定某個目錄成為家目錄,而不要使用默認值。務必使用絕對路徑! -r :創建一個系統的賬號,這個賬號的 UID 會有限制 (參考 /etc/login.defs) -s :后面接一個 shell ,若沒有指定則默認是 /bin/bash 的啦~ -e :后面接一個日期,格式為『YYYY-MM-DD』此項目可寫入 shadow 第八字段,亦即賬號失效日的配置項目啰; -f :后面接 shadow 的第七字段項目,指定口令是否會失效。0為立刻失效,-1 為永遠不失效(口令只會過期而強制于登陸時重新配置而已。)范例一:完全參考默認值創建一個用戶,名稱為 vbird1 [root@www ~]# useradd vbird1 [root@www ~]# ll -d /home/vbird1 drwx------ 4 vbird1 vbird1 4096 Feb 25 09:38 /home/vbird1 # 默認會創建用戶家目錄,且權限為 700 !這是重點! [root@www ~]# grep vbird1 /etc/passwd /etc/shadow /etc/group /etc/passwd:vbird1:x:504:505::/home/vbird1:/bin/bash /etc/shadow:vbird1:!!:14300:0:99999:7::: /etc/group:vbird1:x:505: <==默認會創建一個與賬號一模一樣的群組名

    其實系統已經幫我們規定好非常多的默認值了,所以我們可以簡單的使用『 useradd 賬號 』來創建使用者即可。 CentOS 這些默認值主要會幫我們處理幾個項目:

    • 在 /etc/passwd 里面創建一行與賬號相關的數據,包括創建 UID/GID/家目錄等;
    • 在 /etc/shadow 里面將此賬號的口令相關參數填入,但是尚未有口令;
    • 在 /etc/group 里面加入一個與賬號名稱一模一樣的組名;
    • 在 /home 底下創建一個與賬號同名的目錄作為用戶家目錄,且權限為 700

    由于在 /etc/shadow 內僅會有口令參數而不會有加密過的口令數據,因此我們在創建使用者賬號時, 還需要使用『 passwd 賬號 』來給予口令才算是完成了用戶創建的流程。如果由于特殊需求而需要改變使用者相關參數時, 就得要透過上述表格中的選項來進行創建了,參考底下的案例:

    范例二:假設我已知道我的系統當中有個組名為 users ,且 UID 700 并不存在,請用 users 為初始群組,以及 uid 為 700 來創建一個名為 vbird2 的賬號 [root@www ~]# useradd -u 700 -g users vbird2 [root@www ~]# ll -d /home/vbird2 drwx------ 4 vbird2 users 4096 Feb 25 09:59 /home/vbird2[root@www ~]# grep vbird2 /etc/passwd /etc/shadow /etc/group /etc/passwd:vbird2:x:700:100::/home/vbird2:/bin/bash /etc/shadow:vbird2:!!:14300:0:99999:7::: # 看一下,UID 與 initial group 確實改變成我們需要的了!

    在這個范例中,我們創建的是指定一個已經存在的群組作為使用者的初始群組,因為群組已經存在,?所以在 /etc/group 里面就不會主動的創建與賬號同名的群組了!?此外,我們也指定了特殊的 UID 來作為使用者的專屬 UID 喔!了解了一般賬號后,我們來瞧瞧那啥是系統賬號 (system account) 吧!

    范例三:創建一個系統賬號,名稱為 vbird3 [root@www ~]# useradd -r vbird3 [root@www ~]# ll -d /home/vbird3 ls: /home/vbird3: No such file or directory <==不會主動創建家目錄[root@www ~]# grep vbird3 /etc/passwd /etc/shadow /etc/group /etc/passwd:vbird3:x:100:103::/home/vbird3:/bin/bash /etc/shadow:vbird3:!!:14300:::::: /etc/group:vbird3:x:103:

    我們在談到 UID 的時候曾經說過一般賬號應該是 500 號以后,那用戶自己創建的系統賬號則一般是由 100 號以后起算的。 所以在這里我們加上 -r 這個選項以后,系統就會主動將賬號與賬號同名群組的 UID/GID 都指定小于 500 以下, 在本案例中則是使用 100(UID) 與 103(GID) 啰!此外,由于系統賬號主要是用來進行運行系統所需服務的權限配置, 所以系統賬號默認都不會主動創建家目錄的!

    由這幾個范例我們也會知道,使用 useradd 創建使用者賬號時,其實會更改不少地方,至少我們就知道底下幾個文件:

    • 用戶賬號與口令參數方面的文件:/etc/passwd, /etc/shadow
    • 使用者群組相關方面的文件:/etc/group, /etc/gshadow
    • 用戶的家目錄:/home/賬號名稱

    那請教一下,你有沒有想過,為何『 useradd vbird1 』會主動在 /home/vbird1 創建起用戶的家目錄?家目錄內有什么數據且來自哪里?為何默認使用的是 /bin/bash 這個 shell ?為何口令字段已經都規范好了 (0:99999:7 那一串)?呵呵!這就得要說明一下 useradd 所使用的參考文件啰!


    • useradd 參考檔

    其實 useradd 的默認值可以使用底下的方法呼叫出來:

    [root@www ~]# useradd -D GROUP=100 <==默認的群組 HOME=/home <==默認的家目錄所在目錄 INACTIVE=-1 <==口令失效日,在 shadow 內的第 7 欄 EXPIRE= <==賬號失效日,在 shadow 內的第 8 欄 SHELL=/bin/bash <==默認的 shell SKEL=/etc/skel <==用戶家目錄的內容數據參考目錄 CREATE_MAIL_SPOOL=yes <==是否主動幫使用者創建郵件信箱(mailbox)

    這個數據其實是由 /etc/default/useradd?呼叫出來的!你可以自行用 vim 去觀察該文件的內容。搭配上頭剛剛談過的范例一的運行結果,上面這些配置項目所造成的行為分別是:

    • GROUP=100:新建賬號的初始群組使用 GID 為 100 者

      系統上面 GID 為 100 者即是 users 這個群組,此配置項目指的就是讓新設使用者賬號的初始群組為 users 這一個的意思。 但是我們知道 CentOS 上面并不是這樣的,在 CentOS 上面默認的群組為與賬號名相同的群組。 舉例來說, vbird1 的初始群組為 vbird1 。怎么會這樣啊?這是因為針對群組的角度有兩種不同的機制所致, 這兩種機制分別是:

      HOME=/home:用戶家目錄的基準目錄(basedir)

      用戶的家目錄通常是與賬號同名的目錄,這個目錄將會擺放在此配置值的目錄后。所以 vbird1 的家目錄就會在 /home/vbird1/ 了!很容易理解吧!

      • 私有群組機制:系統會創建一個與賬號一樣的群組給使用者作為初始群組。 這種群組的配置機制會比較有保密性,這是因為使用者都有自己的群組,而且家目錄權限將會配置為 700 (僅有自己可進入自己的家目錄) 之故。使用這種機制將不會參考 GROUP=100 這個配置值。代表性的 distributions 有 RHEL, Fedora, CentOS 等;

      • 公共群組機制:就是以 GROUP=100 這個配置值作為新建賬號的初始群組,因此每個賬號都屬于 users 這個群組, 且默認家目錄通常的權限會是『 drwxr-xr-x ... username users ... 』,由于每個賬號都屬于 users 群組,因此大家都可以互相分享家目錄內的數據之故。代表 distributions 如 SuSE等。

      由于我們的 CentOS 使用私有群組機制,因此這個配置項目是不會生效的!不要太緊張啊!

    • INACTIVE=-1:口令過期后是否會失效的配置值

      我們在?shadow?文件結構當中談過,第七個字段的配置值將會影響到口令過期后, 在多久時間內還可使用舊口令登陸。這個項目就是在指定該日數啦!如果是 0 代表口令過期立刻失效, 如果是 -1 則是代表口令永遠不會失效,如果是數字,如 30 ,則代表過期 30 天后才失效。

    • EXPIRE=:賬號失效的日期

      就是?shadow?內的第八字段,你可以直接配置賬號在哪個日期后就直接失效,而不理會口令的問題。 通常不會配置此項目,但如果是付費的會員制系統,或許這個字段可以配置喔!

    • SHELL=/bin/bash:默認使用的 shell 程序文件名

      系統默認的 shell 就寫在這里。假如你的系統為 mail server ,你希望每個賬號都只能使用 email 的收發信件功能, 而不許用戶登陸系統取得 shell ,那么可以將這里配置為 /sbin/nologin ,如此一來,新建的使用者默認就無法登陸! 也免去后續使用?usermod?進行修改的手續!

    • SKEL=/etc/skel:用戶家目錄參考基準目錄

      這個咚咚就是指定用戶家目錄的參考基準目錄啰~舉我們的范例一為例, vbird1 家目錄 /home/vbird1 內的各項數據,都是由 /etc/skel 所復制過去的~所以呢,未來如果我想要讓新增使用者時,該用戶的環境變量 ~/.bashrc 就配置妥當的話,您可以到 /etc/skel/.bashrc 去編輯一下,也可以創建 /etc/skel/www 這個目錄,那么未來新增使用者后,在他的家目錄下就會有 www 那個目錄了!這樣瞭呼?

    • CREATE_MAIL_SPOOL=yes:創建使用者的 mailbox

      你可以使用『 ll /var/spool/mail/vbird1 』看一下,會發現有這個文件的存在喔!這就是使用者的郵件信箱!

    除了這些基本的賬號配置值之外, UID/GID 還有口令參數又是在哪里參考的呢?那就得要看一下 /etc/login.defs 啦! 這個文件的內容有點像底下這樣:

    MAIL_DIR /var/spool/mail <==用戶默認郵件信箱放置目錄PASS_MAX_DAYS 99999 <==/etc/shadow 內的第 5 欄,多久需變更口令日數 PASS_MIN_DAYS 0 <==/etc/shadow 內的第 4 欄,多久不可重新配置口令日數 PASS_MIN_LEN 5 <==口令最短的字符長度,已被 pam 模塊取代,失去效用! PASS_WARN_AGE 7 <==/etc/shadow 內的第 6 欄,過期前會警告的日數 UID_MIN 500 <==使用者最小的 UID,意即小于 500 的 UID 為系統保留 UID_MAX 60000 <==使用者能夠用的最大 UID GID_MIN 500 <==使用者自定義組的最小 GID,小于 500 為系統保留 GID_MAX 60000 <==使用者自定義組的最大 GID CREATE_HOME yes <==在不加 -M 及 -m 時,是否主動創建用戶家目錄? UMASK 077 <==用戶家目錄創建的 umask ,因此權限會是 700 USERGROUPS_ENAB yes <==使用 userdel 刪除時,是否會刪除初始群組 MD5_CRYPT_ENAB yes <==口令是否經過 MD5 的加密機制處理

    這個文件規范的數據則是如下所示:

    • mailbox 所在目錄:
      用戶的默認 mailbox 文件放置的目錄在 /var/spool/mail,所以 vbird1 的 mailbox 就是在 /var/spool/mail/vbird1 啰!

    • shadow 口令第 4, 5, 6 字段內容:
      透過 PASS_MAX_DAYS 等等配置值來指定的!所以你知道為何默認的 /etc/shadow 內每一行都會有『 0:99999:7 』的存在了嗎?^_^!不過要注意的是,由于目前我們登陸時改用 PAM 模塊來進行口令檢驗,所以那個 PASS_MIN_LEN 是失效的!

    • UID/GID 指定數值:
      雖然 Linux 核心支持的賬號可高達 232?這么多個,不過一部主機要作出這么多賬號在管理上也是很麻煩的! 所以在這里就針對 UID/GID 的范圍進行規范就是了。上表中的 UID_MIN 指的就是可登陸系統的一般賬號的最小 UID ,至于 UID_MAX 則是最大 UID 之意。

      要注意的是,系統給予一個賬號 UID 時,他是 (1)先參考 UID_MIN 配置值取得最小數值; (2)由 /etc/passwd 搜尋最大的 UID 數值, 將 (1) 與 (2) 相比,找出最大的那個再加一就是新賬號的 UID 了。我們上面已經作出 UID 為 700 的 vbird2 , 如果再使用『 useradd vbird4 』時,你猜 vbird4 的 UID 會是多少?答案是: 701 。 所以中間的 505~699 的號碼就空下來啦!

      而如果我是想要創建系統用的賬號,所以使用 useradd -r sysaccount 這個 -r 的選項時,就會找『比 500 小的最大的那個 UID + 1 』就是了。 ^_^

    • 用戶家目錄配置值:
      為何我們系統默認會幫用戶創建家目錄?就是這個『CREATE_HOME = yes』的配置值啦!這個配置值會讓你在使用 useradd 時, 主動加入『 -m 』這個產生家目錄的選項啊!如果不想要創建用戶家目錄,就只能強制加上『 -M 』的選項在 useradd 命令運行時啦!至于創建家目錄的權限配置呢?就透過?umask?這個配置值啊!因為是 077 的默認配置,因此用戶家目錄默認權限才會是『 drwx------ 』哩!

    • 用戶刪除與口令配置值:
      使用『USERGROUPS_ENAB yes』這個配置值的功能是:?如果使用 userdel 去刪除一個賬號時,且該賬號所屬的初始群組已經沒有人隸屬于該群組了, 那么就刪除掉該群組,舉例來說,我們剛剛有創建 vbird4 這個賬號,他會主動創建 vbird4 這個群組。 若 vbird4 這個群組并沒有其他賬號將他加入支持的情況下,若使用 userdel vbird4 時,該群組也會被刪除的意思。 至于『MD5_CRYPT_ENAB yes』則表示使用 MD5 來加密口令明文,而不使用舊式的 DES(注2) 。

    現在你知道啦,使用 useradd 這支程序在創建 Linux 上的賬號時,至少會參考:

    • /etc/default/useradd
    • /etc/login.defs
    • /etc/skel/*

    這些文件,不過,最重要的其實是創建 /etc/passwd, /etc/shadow, /etc/group, /etc/gshadow 還有用戶家目錄就是了~所以,如果你了解整個系統運行的狀態,也是可以手動直接修改這幾個文件就是了。 OK!賬號創建了,接下來處理一下用戶的口令吧!


    • passwd

    剛剛我們講到了,使用 useradd 創建了賬號之后,在默認的情況下,該賬號是暫時被封鎖的, 也就是說,該賬號是無法登陸的,你可以去瞧一瞧 /etc/shadow 內的第二個字段就曉得啰~ 那該如何是好?怕什么?直接給他配置新口令就好了嘛!對吧~配置口令就使用 passwd 啰!

    [root@www ~]# passwd [--stdin] <==所有人均可使用來改自己的口令 [root@www ~]# passwd [-l] [-u] [--stdin] [-S] \ > [-n 日數] [-x 日數] [-w 日數] [-i 日期] 賬號 <==root 功能 選項與參數: --stdin :可以透過來自前一個管線的數據,作為口令輸入,對 shell script 有幫助! -l :是 Lock 的意思,會將 /etc/shadow 第二欄最前面加上 ! 使口令失效; -u :與 -l 相對,是 Unlock 的意思! -S :列出口令相關參數,亦即 shadow 文件內的大部分信息。 -n :后面接天數,shadow 的第 4 字段,多久不可修改口令天數 -x :后面接天數,shadow 的第 5 字段,多久內必須要更動口令 -w :后面接天數,shadow 的第 6 字段,口令過期前的警告天數 -i :后面接『日期』,shadow 的第 7 字段,口令失效日期 范例一:請 root 給予 vbird2 口令 [root@www ~]# passwd vbird2 Changing password for user vbird2. New UNIX password: <==這里直接輸入新的口令,屏幕不會有任何反應 BAD PASSWORD: it is WAY too short <==口令太簡單或過短的錯誤! Retype new UNIX password: <==再輸入一次同樣的口令 passwd: all authentication tokens updated successfully. <==竟然還是成功修改了!

    root 果然是最偉大的人物!當我們要給予用戶口令時,透過 root 來配置即可。 root 可以配置各式各樣的口令,系統幾乎一定會接受!所以您瞧瞧,如同上面的范例一,明明鳥哥輸入的口令太短了, 但是系統依舊可接受 vbird2 這樣的口令配置。這個是 root 幫忙配置的結果,那如果是用戶自己要改口令呢? 包括 root 也是這樣修改的喔!

    范例二:用 vbird2 登陸后,修改 vbird2 自己的口令 [vbird2@www ~]$ passwd <==后面沒有加賬號,就是改自己的口令! Changing password for user vbird2. Changing password for vbird2 (current) UNIX password: <==這里輸入『原有的舊口令』 New UNIX password: <==這里輸入新口令 BAD PASSWORD: it is based on a dictionary word <==口令檢驗不通過,請再想個新口令 New UNIX password: <==這里再想個來輸入吧 Retype new UNIX password: <==通過口令驗證!所以重復這個口令的輸入 passwd: all authentication tokens updated successfully. <==有無成功看關鍵詞

    passwd 的使用真的要很注意,尤其是 root 先生啊!鳥哥在課堂上每次講到這里,說是要幫自己的一般賬號創建口令時, 有一小部分的學生就是會忘記加上賬號,結果就變成改變 root 自己的口令,最后.... root 口令就這樣不見去!唉~?要幫一般賬號創建口令需要使用『 passwd 賬號 』的格式,使用『 passwd 』表示修改自己的口令!拜托!千萬不要改錯!

    與 root 不同的是,一般賬號在更改口令時需要先輸入自己的舊口令 (亦即 current 那一行),然后再輸入新口令 (New 那一行)。 要注意的是,口令的規范是非常嚴格的,尤其新的 distributions 大多使用 PAM 模塊來進行口令的檢驗,包括太短、 口令與賬號相同、口令為字典常見字符串等,都會被 PAM 模塊檢查出來而拒絕修改口令,此時會再重復出現『 New 』這個關鍵詞! 那時請再想個新口令!若出現『 Retype 』才是你的口令被接受了!重復輸入新口令并且看到『 successfully 』這個關鍵詞時才是修改口令成功喔!

    Tips:
    與一般使用者不同的是, root 并不需要知道舊口令就能夠幫用戶或 root 自己創建新口令! 但如此一來有困擾~就是如果你的親密愛人老是告訴你『我的口令真難記,幫我配置簡單一點的!』時, 千萬不要妥協啊!這是為了系統安全...

    為何用戶要設訂自己的口令會這么麻煩啊?這是因為口令的安全性啦!如果口令配置太簡單, 一些有心人士就能夠很簡單的猜到你的口令,如此一來人家就可能使用你的一般賬號登陸你的主機或使用其他主機資源, 對主機的維護會造成困擾的!所以新的 distributions 是使用較嚴格的 PAM 模塊來管理口令,這個管理的機制寫在 /etc/pam.d/passwd 當中。而該文件與口令有關的測試模塊就是使用:pam_cracklib.so,這個模塊會檢驗口令相關的信息, 并且取代 /etc/login.defs 內的 PASS_MIN_LEN 的配置啦!關于 PAM 我們在本章后面繼續介紹,這里先談一下, 理論上,你的口令最好符合如下要求:

    • 口令不能與賬號相同;
    • 口令盡量不要選用字典里面會出現的字符串;
    • 口令需要超過 8 個字符;
    • 口令不要使用個人信息,如身份證、手機號碼、其他電話號碼等;
    • 口令不要使用簡單的關系式,如 1+1=2, Iamvbird 等;
    • 口令盡量使用大小寫字符、數字、特殊字符($,_,-等)的組合。

    為了方便系統管理,新版的 passwd 還加入了很多創意選項喔!鳥哥個人認為最好用的大概就是這個『 --stdin 』了! 舉例來說,你想要幫 vbird2 變更口令成為 abc543CC ,可以這樣下達命令呢!

    范例三:使用 standard input 創建用戶的口令 [root@www ~]# echo "abc543CC" | passwd --stdin vbird2 Changing password for user vbird2. passwd: all authentication tokens updated successfully.

    這個動作會直接升級用戶的口令而不用再次的手動輸入!好處是方便處理,缺點是這個口令會保留在命令中, 未來若系統被攻破,人家可以在 /root/.bash_history 找到這個口令呢!所以這個動作通常僅用在 shell script 的大量創建使用者賬號當中!要注意的是,這個選項并不存在所有 distributions 版本中, 請使用 man passwd 確認你的 distribution 是否有支持此選項喔!

    如果你想要讓 vbird2 的口令具有相當的守則,舉例來說你要讓 vbird2 每 60 天需要變更口令, 口令過期后 10 天未使用就宣告口令失效,那該如何處理?

    范例四:管理 vbird2 的口令使具有 60 天變更、10 天口令失效的配置 [root@www ~]# passwd -S vbird2 vbird2 PS 2009-02-26 0 99999 7 -1 (Password set, MD5 crypt.) # 上面說明口令創建時間 (2009-02-26)、0 最小天數、99999 變更天數、7 警告日數 # 與口令不會失效 (-1) 。[root@www ~]# passwd -x 60 -i 10 vbird2 [root@www ~]# passwd -S vbird2 vbird2 PS 2009-02-26 0 60 7 10 (Password set, MD5 crypt.)

    那如果我想要讓某個賬號暫時無法使用口令登陸主機呢?舉例來說, vbird2 這家伙最近老是胡亂在主機亂來, 所以我想要暫時讓她無法登陸的話,最簡單的方法就是讓她的口令變成不合法 (shadow 第 2 字段長度變掉)! 處理的方法就更簡單的!

    范例五:讓 vbird2 的賬號失效,觀察完畢后再讓她失效 [root@www ~]# passwd -l vbird2 [root@www ~]# passwd -S vbird2 vbird2 LK 2009-02-26 0 60 7 10 (Password locked.) # 嘿嘿!狀態變成『 LK, Lock 』了啦!無法登陸喔! [root@www ~]# grep vbird2 /etc/shadow vbird2:!!$1$50MnwNFq$oChX.0TPanCq7ecE4HYEi.:14301:0:60:7:10:: # 其實只是在這里加上 !! 而已! [root@www ~]# passwd -u vbird2 [root@www ~]# grep vbird2 /etc/shadow vbird2:$1$50MnwNFq$oChX.0TPanCq7ecE4HYEi.:14301:0:60:7:10:: # 口令字段恢復正常!

    是否很有趣啊!您可以自行管理一下你的賬號的口令相關參數喔!接下來讓我們用更簡單的方法來查閱口令參數喔!?


    • chage

    除了使用 passwd -S 之外,有沒有更詳細的口令參數顯示功能呢?有的!那就是 chage 了! 他的用法如下:

    [root@www ~]# chage [-ldEImMW] 賬號名 選項與參數: -l :列出該賬號的詳細口令參數; -d :后面接日期,修改 shadow 第三字段(最近一次更改口令的日期),格式 YYYY-MM-DD -E :后面接日期,修改 shadow 第八字段(賬號失效日),格式 YYYY-MM-DD -I :后面接天數,修改 shadow 第七字段(口令失效日期) -m :后面接天數,修改 shadow 第四字段(口令最短保留天數) -M :后面接天數,修改 shadow 第五字段(口令多久需要進行變更) -W :后面接天數,修改 shadow 第六字段(口令過期前警告日期)范例一:列出 vbird2 的詳細口令參數 [root@www ~]# chage -l vbird2 Last password change : Feb 26, 2009 Password expires : Apr 27, 2009 Password inactive : May 07, 2009 Account expires : never Minimum number of days between password change : 0 Maximum number of days between password change : 60 Number of days of warning before password expires : 7

    我們在?passwd?的介紹中談到了處理 vbird2 這個賬號的口令屬性流程,使用 passwd -S 卻無法看到很清楚的說明。如果使用 chage 那可就明白多了!如上表所示,我們可以清楚的知道 vbird2 的詳細參數呢! 如果想要修改其他的配置值,就自己參考上面的選項,或者自行 man chage 一下吧!^_^

    chage 有一個功能很不錯喔!如果你想要讓『使用者在第一次登陸時, 強制她們一定要更改口令后才能夠使用系統資源』,可以利用如下的方法來處理的!

    范例二:創建一個名為 agetest 的賬號,該賬號第一次登陸后使用默認口令,但必須要更改過口令后,使用新口令才能夠登陸系統使用 bash 環境 [root@www ~]# useradd agetest [root@www ~]# echo "agetest" | passwd --stdin agetest [root@www ~]# chage -d 0 agetest # 此時此賬號的口令創建時間會被改為 1970/1/1 ,所以會有問題!范例三:嘗試以 agetest 登陸的情況 You are required to change your password immediately (root enforced) WARNING: Your password has expired. You must change your password now and login again! Changing password for user agetest. Changing password for agetest (current) UNIX password: <==這個賬號被強制要求必須要改口令!

    非常有趣吧!你會發現 agetest 這個賬號在第一次登陸時可以使用與賬號同名的口令登陸, 但登陸時就會被要求立刻更改口令,更改口令完成后就會被踢出系統。再次登陸時就能夠使用新口令登陸了! 這個功能對學校老師非常有幫助!因為我們不想要知道學生的口令,那么在初次上課時就使用與學號相同的賬號/口令給學生, 讓她們登陸時自行配置她們的口令,如此一來就能夠避免其他同學隨意使用別人的賬號,也能夠保證學生知道如何更改自己的口令!?


    • usermod

    所謂這『人有失手,馬有亂蹄』,您說是吧?所以啰,當然有的時候會『不小心』在 useradd 的時候加入了錯誤的配置數據。或者是,在使用 useradd 后,發現某些地方還可以進行細部修改。 此時,當然我們可以直接到 /etc/passwd 或 /etc/shadow 去修改相對應字段的數據, 不過,Linux 也有提供相關的命令讓大家來進行賬號相關數據的微調呢~那就是 usermod 啰~

    [root@www ~]# usermod [-cdegGlsuLU] username 選項與參數: -c :后面接賬號的說明,即 /etc/passwd 第五欄的說明欄,可以加入一些賬號的說明。 -d :后面接賬號的家目錄,即修改 /etc/passwd 的第六欄; -e :后面接日期,格式是 YYYY-MM-DD 也就是在 /etc/shadow 內的第八個字段數據啦! -f :后面接天數,為 shadow 的第七字段。 -g :后面接初始群組,修改 /etc/passwd 的第四個字段,亦即是 GID 的字段! -G :后面接次要群組,修改這個使用者能夠支持的群組,修改的是 /etc/group 啰~ -a :與 -G 合用,可『添加次要群組的支持』而非『配置』喔! -l :后面接賬號名稱。亦即是修改賬號名稱, /etc/passwd 的第一欄! -s :后面接 Shell 的實際文件,例如 /bin/bash 或 /bin/csh 等等。 -u :后面接 UID 數字啦!即 /etc/passwd 第三欄的數據; -L :暫時將用戶的口令凍結,讓他無法登陸。其實僅改 /etc/shadow 的口令欄。 -U :將 /etc/shadow 口令欄的 ! 拿掉,解凍啦!

    如果你仔細的比對,會發現 usermod 的選項與?useradd?非常類似! 這是因為 usermod 也是用來微調 useradd 添加的使用者參數嘛!不過 usermod 還是有新增的選項, 那就是 -L 與 -U ,不過這兩個選項其實與 passwd 的 -l, -u 是相同的!而且也不見得會存在所有的 distribution 當中!接下來,讓我們談談一些變更參數的實例吧!

    范例一:修改使用者 vbird2 的說明欄,加上『VBird's test』的說明。 [root@www ~]# usermod -c "VBird's test" vbird2 [root@www ~]# grep vbird2 /etc/passwd vbird2:x:700:100:VBird's test:/home/vbird2:/bin/bash范例二:用戶 vbird2 口令在 2009/12/31 失效。 [root@www ~]# usermod -e "2009-12-31" vbird2 [root@www ~]# grep vbird2 /etc/shadow vbird2:$1$50MnwNFq$oChX.0TPanCq7ecE4HYEi.:14301:0:60:7:10:14609: 范例三:我們創建 vbird3 這個系統賬號時并沒有給予家目錄,請創建他的家目錄 [root@www ~]# ll -d ~vbird3 ls: /home/vbird3: No such file or directory <==確認一下,確實沒有家目錄的存在! [root@www ~]# cp -a /etc/skel /home/vbird3 [root@www ~]# chown -R vbird3:vbird3 /home/vbird3 [root@www ~]# chmod 700 /home/vbird3 [root@www ~]# ll -a ~vbird3 drwx------ 4 vbird3 vbird3 4096 Sep 4 18:15 . <==用戶家目錄權限 drwxr-xr-x 11 root root 4096 Feb 26 11:45 .. -rw-r--r-- 1 vbird3 vbird3 33 May 25 2008 .bash_logout -rw-r--r-- 1 vbird3 vbird3 176 May 25 2008 .bash_profile -rw-r--r-- 1 vbird3 vbird3 124 May 25 2008 .bashrc drwxr-xr-x 3 vbird3 vbird3 4096 Sep 4 18:11 .kde drwxr-xr-x 4 vbird3 vbird3 4096 Sep 4 18:15 .mozilla # 使用 chown -R 是為了連同家目錄底下的用戶/群組屬性都一起變更的意思; # 使用 chmod 沒有 -R ,是因為我們僅要修改目錄的權限而非內部文件的權限!


    • userdel

    這個功能就太簡單了,目的在刪除用戶的相關數據,而用戶的數據有:

    • 用戶賬號/口令相關參數:/etc/passwd, /etc/shadow
    • 使用者群組相關參數:/etc/group, /etc/gshadow
    • 用戶個人文件數據: /home/username, /var/spool/mail/username..

    整個命令的語法非常簡單:

    [root@www ~]# userdel [-r] username 選項與參數: -r :連同用戶的家目錄也一起刪除范例一:刪除 vbird2 ,連同家目錄一起刪除 [root@www ~]# userdel -r vbird2

    這個命令下達的時候要小心了!通常我們要移除一個賬號的時候,你可以手動的將 /etc/passwd 與 /etc/shadow 里頭的該賬號取消即可!一般而言,如果該賬號只是『暫時不激活』的話,那么將 /etc/shadow 里頭賬號失效日期 (第八字段) 配置為 0 就可以讓該賬號無法使用,但是所有跟該賬號相關的數據都會留下來! 使用 userdel 的時機通常是『你真的確定不要讓該用戶在主機上面使用任何數據了!』

    另外,其實用戶如果在系統上面操作過一陣子了,那么該用戶其實在系統內可能會含有其他文件的。 舉例來說,他的郵件信箱 (mailbox) 或者是例行性工作排程 (crontab, 十六章)?之類的文件。 所以,如果想要完整的將某個賬號完整的移除,最好可以在下達 userdel -r username 之前, 先以『 find / -user username 』查出整個系統內屬于 username 的文件,然后再加以刪除吧!


    用戶功能

    不論是 useradd/usermod/userdel ,那都是系統管理員所能夠使用的命令, 如果我是一般身份使用者,那么我是否除了口令之外,就無法更改其他的數據呢? 當然不是啦!這里我們介紹幾個一般身份用戶常用的賬號數據變更與查詢命令啰!


    • finger

    finger 的中文字面意義是:『手指』或者是『指紋』的意思。這個 finger 可以查閱很多用戶相關的信息喔! 大部分都是在 /etc/passwd 這個文件里面的信息啦!我們就先來檢查檢查用戶信息吧!

    [root@www ~]# finger [-s] username 選項與參數: -s :僅列出用戶的賬號、全名、終端機代號與登陸時間等等; -m :列出與后面接的賬號相同者,而不是利用部分比對 (包括全名部分)范例一:觀察 vbird1 的用戶相關賬號屬性 [root@www ~]# finger vbird1 Login: vbird1 Name: (null) Directory: /home/vbird1 Shell: /bin/bash Never logged in. No mail. No Plan.

    由于 finger 類似指紋的功能,他會將用戶的相關屬性列出來!如上表所示,其實他列出來的幾乎都是 /etc/passwd 文件里面的東西。列出的信息說明如下:

    • Login:為使用者賬號,亦即 /etc/passwd 內的第一字段;
    • Name:為全名,亦即 /etc/passwd 內的第五字段(或稱為批注);
    • Directory:就是家目錄了;
    • Shell:就是使用的 Shell 文件所在;
    • Never logged in.:figner 還會調查用戶登陸主機的情況喔!
    • No mail.:調查 /var/spool/mail 當中的信箱數據;
    • No Plan.:調查 ~vbird1/.plan 文件,并將該文件取出來說明!

    不過是否能夠查閱到 Mail 與 Plan 則與權限有關了!因為 Mail / Plan 都是與使用者自己的權限配置有關, root 當然可以查閱到用戶的這些信息,但是 vbird1 就不見得能夠查到 vbird3 的信息, 因為 /var/spool/mail/vbird3 與 /home/vbird3/ 的權限分別是 660, 700 ,那 vbird1 當然就無法查閱的到! 這樣解釋可以理解吧?此外,我們可以創建自己想要運行的預定計劃,當然,最多是給自己看的!可以這樣做:

    范例二:利用 vbird1 創建自己的計劃檔 [vbird1@www ~]$ echo "I will study Linux during this year." > ~/.plan [vbird1@www ~]$ finger vbird1 Login: vbird1 Name: (null) Directory: /home/vbird1 Shell: /bin/bash Never logged in. No mail. Plan: I will study Linux during this year.范例三:找出目前在系統上面登陸的用戶與登陸時間 [vbird1@www ~]$ finger Login Name Tty Idle Login Time Office Office Phone root root tty1 Feb 26 09:53 vbird1 tty2 Feb 26 15:21

    在范例三當中,我們發現輸出的信息還會有 Office, Office Phone 等信息,那這些信息要如何記錄呢? 底下我們會介紹 chfn 這個命令!來看看如何修改用戶的 finger 數據吧!


    • chfn

    chfn 有點像是: change finger 的意思!這玩意的使用方法如下:

    [root@www ~]# chfn [-foph] [賬號名] 選項與參數: -f :后面接完整的大名; -o :您辦公室的房間號碼; -p :辦公室的電話號碼; -h :家里的電話號碼!范例一:vbird1 自己更改一下自己的相關信息! [vbird1@www ~]$ chfn Changing finger information for vbird1. Password: <==確認身份,所以輸入自己的口令 Name []: VBird Tsai test <==輸入你想要呈現的全名 Office []: Dic in Ksu. Tainan <==辦公室號碼 Office Phone []: 06-2727175#356 <==辦公室電話 Home Phone []: 06-1234567 <==家里電話號碼 Finger information changed. [vbird1@www ~]$ grep vbird1 /etc/passwd vbird1:x:504:505:VBird Tsai test,Dic in Ksu. Tainan,06-2727175#356,06-1234567: /home/vbird1:/bin/bash # 其實就是改到第五個字段,該字段里面用多個『 , 』分隔就是了! [vbird1@www ~]$ finger vbird1 Login: vbird1 Name: VBird Tsai test Directory: /home/vbird1 Shell: /bin/bash Office: Dic in Ksu. Tainan Office Phone: 06-2727175#356 Home Phone: 06-1234567 On since Thu Feb 26 15:21 (CST) on tty2 No mail. Plan: I will study Linux during this year. # 就是上面特殊字體呈現的那些地方是由 chfn 所修改出來的!

    這個命令說實在的,除非是你的主機有很多的用戶,否則倒真是用不著這個程序!這就有點像是 bbs 里頭更改你『個人屬性』的那一個數據啦!不過還是可以自己玩一玩!尤其是用來提醒自己相關數據啦! ^_^


    • chsh

    這就是 change shell 的簡寫!使用方法就更簡單了!

    [vbird1@www ~]$ chsh [-ls] 選項與參數: -l :列出目前系統上面可用的 shell ,其實就是 /etc/shells 的內容! -s :配置修改自己的 Shell 啰范例一:用 vbird1 的身份列出系統上所有合法的 shell,并且指定 csh 為自己的 shell [vbird1@www ~]$ chsh -l /bin/sh /bin/bash /sbin/nologin <==所謂:合法不可登陸的 Shell 就是這玩意! /bin/tcsh /bin/csh <==這就是 C shell 啦! /bin/ksh # 其實上面的信息就是我們在 bash 中談到的 /etc/shells 啦! [vbird1@www ~]$ chsh -s /bin/csh; grep vbird1 /etc/passwd Changing shell for vbird1. Password: <==確認身份,請輸入 vbird1 的口令 Shell changed. vbird1:x:504:505:VBird Tsai test,Dic in Ksu. Tainan,06-2727175#356,06-1234567: /home/vbird1:/bin/csh [vbird1@www ~]$ chsh -s /bin/bash # 測試完畢后,立刻改回來! [vbird1@www ~]$ ll $(which chsh) -rws--x--x 1 root root 19128 May 25 2008 /usr/bin/chsh

    不論是 chfn 與 chsh ,都是能夠讓一般用戶修改 /etc/passwd 這個系統文件的!所以你猜猜,這兩個文件的權限是什么? 一定是?SUID?的功能啦!看到這里,想到前面! 這就是 Linux 的學習方法~ ^_^


    • id

    id 這個命令則可以查詢某人或自己的相關 UID/GID 等等的信息,他的參數也不少,不過, 都不需要記~反正使用 id 就全部都列出啰~ ^_^

    [root@www ~]# id [username]范例一:查閱 root 自己的相關 ID 信息! [root@www ~]# id uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk), 10(wheel) context=root:system_r:unconfined_t:SystemLow-SystemHigh # 上面信息其實是同一行的數據!包括會顯示 UID/GID 以及支持的所有群組! # 至于后面那個 context=... 則是 SELinux 的內容,先不要理會他!范例二:查閱一下 vbird1 吧~ [root@www ~]# id vbird1 uid=504(vbird1) gid=505(vbird1) groups=505(vbird1) context=root:system_r: unconfined_t:SystemLow-SystemHigh [root@www ~]# id vbird100 id: vbird100: No such user <== id 這個命令也可以用來判斷系統上面有無某賬號!

    新增與移除群組

    OK!了解了賬號的新增、刪除、更動與查詢后,再來我們可以聊一聊群組的相關內容了。 基本上,群組的內容都與這兩個文件有關:/etc/group, /etc/gshadow。 群組的內容其實很簡單,都是上面兩個文件的新增、修改與移除而已, 不過,如果再加上有效群組的概念,那么 newgrp 與 gpasswd 則不可不知呢!


    • groupadd
    [root@www ~]# groupadd [-g gid] [-r] 組名 選項與參數: -g :后面接某個特定的 GID ,用來直接給予某個 GID ~ -r :創建系統群組啦!與 /etc/login.defs 內的 GID_MIN 有關。范例一:新建一個群組,名稱為 group1 [root@www ~]# groupadd group1 [root@www ~]# grep group1 /etc/group /etc/gshadow /etc/group:group1:x:702: /etc/gshadow:group1:!:: # 群組的 GID 也是會由 500 以上最大 GID+1 來決定!

    曾經有某些版本的教育訓練手冊談到,為了讓使用者的 UID/GID 成對,她們建議新建的與使用者私有群組無關的其他群組時,使用小于 500 以下的 GID 為宜。 也就是說,如果要創建群組的話,最好能夠使用『 groupadd -r 群組名』的方式來創建啦! 不過,這見仁見智啦!看你自己的抉擇啰!


    • groupmod

    跟?usermod?類似的,這個命令僅是在進行 group 相關參數的修改而已。

    [root@www ~]# groupmod [-g gid] [-n group_name] 群組名 選項與參數: -g :修改既有的 GID 數字; -n :修改既有的組名范例一:將剛剛上個命令創建的 group1 名稱改為 mygroup , GID 為 201 [root@www ~]# groupmod -g 201 -n mygroup group1 [root@www ~]# grep mygroup /etc/group /etc/gshadow /etc/group:mygroup:x:201: /etc/gshadow:mygroup:!::

    不過,還是那句老話,不要隨意的更動 GID ,容易造成系統資源的錯亂喔!


    • groupdel

    呼呼! groupdel 自然就是在刪除群組的啰~用法很簡單:

    [root@www ~]# groupdel [groupname]范例一:將剛剛的 mygroup 刪除! [root@www ~]# groupdel mygroup范例二:若要刪除 vbird1 這個群組的話? [root@www ~]# groupdel vbird1 groupdel: cannot remove user's primary group.

    為什么 mygroup 可以刪除,但是 vbird1 就不能刪除呢?原因很簡單,『有某個賬號 (/etc/passwd) 的 initial group 使用該群組!』 如果查閱一下,你會發現在 /etc/passwd 內的 vbird1 第四欄的 GID 就是 /etc/group 內的 vbird1 那個群組的 GID ,所以啰,當然無法刪除~否則 vbird1 這個用戶登陸系統后, 就會找不到 GID ,那可是會造成很大的困擾的!那么如果硬要刪除 vbird1 這個群組呢? 你『必須要確認 /etc/passwd 內的賬號沒有任何人使用該群組作為 initial group?』才行喔!所以,你可以:

    • 修改 vbird1 的 GID ,或者是:
    • 刪除 vbird1 這個使用者。


    • gpasswd:群組管理員功能

    如果系統管理員太忙碌了,導致某些賬號想要加入某個項目時找不到人幫忙!這個時候可以創建『群組管理員』喔! 什么是群組管理員呢?就是讓某個群組具有一個管理員,這個群組管理員可以管理哪些賬號可以加入/移出該群組! 那要如何『創建一個群組管理員』呢?就得要透過 gpasswd 啰!

    # 關于系統管理員(root)做的動作: [root@www ~]# gpasswd groupname [root@www ~]# gpasswd [-A user1,...] [-M user3,...] groupname [root@www ~]# gpasswd [-rR] groupname 選項與參數::若沒有任何參數時,表示給予 groupname 一個口令(/etc/gshadow) -A :將 groupname 的主控權交由后面的使用者管理(該群組的管理員) -M :將某些賬號加入這個群組當中! -r :將 groupname 的口令移除 -R :讓 groupname 的口令欄失效# 關于群組管理員(Group administrator)做的動作: [someone@www ~]$ gpasswd [-ad] user groupname 選項與參數: -a :將某位使用者加入到 groupname 這個群組當中! -d :將某位使用者移除出 groupname 這個群組當中。 范例一:創建一個新群組,名稱為 testgroup 且群組交由 vbird1 管理: [root@www ~]# groupadd testgroup <==先創建群組 [root@www ~]# gpasswd testgroup <==給這個群組一個口令吧! Changing the password for group testgroup New Password: Re-enter new password: # 輸入兩次口令就對了! [root@www ~]# gpasswd -A vbird1 testgroup <==加入群組管理員為 vbird1 [root@www ~]# grep testgroup /etc/group /etc/gshadow /etc/group:testgroup:x:702: /etc/gshadow:testgroup:$1$I5ukIY1.$o5fmW.cOsc8.K.FHAFLWg0:vbird1: # 很有趣吧!此時 vbird1 則擁有 testgroup 的主控權喔!身份有點像板主啦! 范例二:以 vbird1 登陸系統,并且讓他加入 vbird1, vbird3 成為 testgroup 成員 [vbird1@www ~]$ id uid=504(vbird1) gid=505(vbird1) groups=505(vbird1) .... # 看得出來,vbird1 尚未加入 testgroup 群組喔! [vbird1@www ~]$ gpasswd -a vbird1 testgroup [vbird1@www ~]$ gpasswd -a vbird3 testgroup [vbird1@www ~]$ grep testgroup /etc/group testgroup:x:702:vbird1,vbird3

    很有趣的一個小實驗吧!我們可以讓 testgroup 成為一個可以公開的群組,然后創建起群組管理員, 群組管理員可以有多個。在這個案例中,我將 vbird1 配置為 testgroup 的群組管理員,所以 vbird1 就可以自行添加群組成員啰~呼呼!然后,該群組成員就能夠使用?newgrp?啰~


    賬號管理實例

    賬號管理不是隨意建置幾個賬號就算了!有時候我們需要考慮到一部主機上面可能有多個賬號在協同工作! 舉例來說,在大學任教時,我們學校的專題生是需要分組的,這些同一組的同學間必須要能夠互相修改對方的數據文件, 但是同時這些同學又需要保留自己的私密數據,因此直接公開家目錄是不適宜的。那該如何是好? 為此,我們底下提供幾個例子來讓大家思考看看啰:

    任務一:單純的完成上頭交代的任務,假設我們需要的賬號數據如下,你該如何實作?

    賬號名稱賬號全名支持次要群組是否可登陸主機口令
    myuser11st usermygroup1可以password
    myuser22nd usermygroup1可以password
    myuser33rd user無額外支持不可以password

    處理的方法如下所示:

    # 先處理賬號相關屬性的數據: [root@www ~]# groupadd mygroup1 [root@www ~]# useradd -G mygroup1 -c "1st user" myuser1 [root@www ~]# useradd -G mygroup1 -c "2nd user" myuser2 [root@www ~]# useradd -c "3rd user" -s /sbin/nologin myuser3# 再處理賬號的口令相關屬性的數據: [root@www ~]# echo "password" | passwd --stdin myuser1 [root@www ~]# echo "password" | passwd --stdin myuser2 [root@www ~]# echo "password" | passwd --stdin myuser3

    要注意的地方主要有:myuser1 與 myuser2 都有支持次要群組,但該群組不見得會存在,因此需要先手動創建他! 然后 myuser3 是『不可登陸系統』的賬號,因此需要使用 /sbin/nologin 這個 shell 來給予,這樣該賬號就無法登陸啰! 這樣是否理解啊!接下來再來討論比較難一些的環境!如果是專題環境該如何制作?

    任務二:我的使用者 pro1, pro2, pro3 是同一個項目計劃的開發人員,我想要讓這三個用戶在同一個目錄底下工作, 但這三個用戶還是擁有自己的家目錄與基本的私有群組。假設我要讓這個項目計劃在 /srv/projecta 目錄下開發, 可以如何進行?

    # 1. 假設這三個賬號都尚未創建,可先創建一個名為 projecta 的群組, # 再讓這三個用戶加入其次要群組的支持即可: [root@www ~]# groupadd projecta [root@www ~]# useradd -G projecta -c "projecta user" pro1 [root@www ~]# useradd -G projecta -c "projecta user" pro2 [root@www ~]# useradd -G projecta -c "projecta user" pro3 [root@www ~]# echo "password" | passwd --stdin pro1 [root@www ~]# echo "password" | passwd --stdin pro2 [root@www ~]# echo "password" | passwd --stdin pro3 # 2. 開始創建此項目的開發目錄: [root@www ~]# mkdir /srv/projecta [root@www ~]# chgrp projecta /srv/projecta [root@www ~]# chmod 2770 /srv/projecta [root@www ~]# ll -d /srv/projecta drwxrws--- 2 root projecta 4096 Feb 27 11:29 /srv/projecta

    由于此項目計劃只能夠給 pro1, pro2, pro3 三個人使用,所以 /srv/projecta 的權限配置一定要正確才行! 所以該目錄群組一定是 projecta ,但是權限怎么會是 2770 呢還記得第七章談到的 SGID?吧?為了讓三個使用者能夠互相修改對方的文件, 這個 SGID 是必須要存在的喔!如果連這里都能夠理解,嘿嘿!您的賬號管理已經有一定程度的概念啰! ^_^

    但接下來有個困擾的問題發生了!假如任務一的 myuser1 是 projecta 這個項目的助理,他需要這個項目的內容, 但是他『不可以修改』項目目錄內的任何數據!那該如何是好?你或許可以這樣做:

    • 將 myuser1 加入 projecta 這個群組的支持,但是這樣會讓 myuser1 具有完整的 /srv/projecta 的權限, myuser1 是可以刪除該目錄下的任何數據的!這樣是有問題的;
    • 將 /srv/projecta 的權限改為 2775 ,讓 myuser1 可以進入查閱數據。但此時會發生所有其他人均可進入該目錄查閱的困擾! 這也不是我們要的環境。

    真要命!傳統的 Linux 權限無法針對某個個人配置專屬的權限嗎?其實是可以啦!接下來我們就來談談這個功能吧!


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

    從第六章開始,我們就一直強調 Linux 的權限概念是非常重要的! 但是傳統的權限僅有三種身份 (owner, group, others) 搭配三種權限 (r,w,x) 而已,并沒有辦法單純的針對某一個使用者或某一個群組來配置特定的權限需求,例如前一小節最后的那個任務! 此時就得要使用 ACL 這個機制啦!這玩意挺有趣的,底下我們就來談一談:


    什么是 ACL

    ACL 是 Access Control List 的縮寫,主要的目的是在提供傳統的 owner,group,others 的 read,write,execute 權限之外的細部權限配置。ACL 可以針對單一使用者,單一文件或目錄來進行 r,w,x 的權限規范,對于需要特殊權限的使用狀況非常有幫助。

    那 ACL 主要可以針對哪些方面來控制權限呢?他主要可以針對幾個項目:

    • 使用者 (user):可以針對使用者來配置權限;
    • 群組 (group):針對群組為對象來配置其權限;
    • 默認屬性 (mask):還可以針對在該目錄下在創建新文件/目錄時,規范新數據的默認權限;

    好了,再來看看如何讓你的文件系統可以支持 ACL 吧!


    如何啟動 ACL

    由于 ACL 是傳統的 Unix-like 操作系統權限的額外支持項目,因此要使用 ACL 必須要有文件系統的支持才行。目前絕大部分的文件系統都有支持 ACL 的功能,包括 ReiserFS, EXT2/EXT3, JFS, XFS 等等。在我們的 CentOS 5.x 當中,默認使用 Ext3 是啟動 ACL 支持的!至于察看你的文件系統是否支持 ACL 可以這樣看:

    [root@www ~]# mount <==直接查閱掛載參數的功能 /dev/hda2 on / type ext3 (rw) /dev/hda3 on /home type ext3 (rw) # 其他項目鳥哥都將他省略了!假設我們只要看這兩個裝置。但沒有看到 acl 喔![root@www ~]# dumpe2fs -h /dev/hda2 <==由 superblock 內容去查詢 ....(前面省略).... Default mount options: user_xattr acl ....(后面省略)....

    由 mount 單純去查閱不見得可以看到實際的項目,由于目前新的 distributions 常常會主動加入某些默認功能, 如上表所示,其實 CentOS 5.x 在默認的情況下 (Default mount options:) 就幫你加入 acl 的支持了! 那如果你的系統默認不會幫你加上 acl 的支持呢?那你可以這樣做:

    [root@www ~]# mount -o remount,acl / [root@www ~]# mount /dev/hda2 on / type ext3 (rw,acl) # 這樣就加入了!但是如果想要每次啟動都生效,那就這樣做:[root@www ~]# vi /etc/fstab LABEL=/1 / ext3 defaults,acl 1 1

    如果你不確定或者是不會使用 dumpe2fs 觀察你的文件系統,那么建議直接將上述的 /etc/fstab 里面的內容修改一下即可!


    ACL 的配置技巧: getfacl, setfacl

    好了,讓你的 filesystem 啟動 ACL 支持后,接下來該如何配置與觀察 ACL 呢? 很簡單,利用這兩個命令就可以了:

    • getfacl:取得某個文件/目錄的 ACL 配置項目;
    • setfacl:配置某個目錄/文件的 ACL 規范。

    先讓我們來瞧一瞧 setfacl 如何使用吧!


    • setfacl 命令用法
    [root@www ~]# setfacl [-bkRd] [{-m|-x} acl參數] 目標文件名 選項與參數: -m :配置后續的 acl 參數給文件使用,不可與 -x 合用; -x :刪除后續的 acl 參數,不可與 -m 合用; -b :移除所有的 ACL 配置參數; -k :移除默認的 ACL 參數,關于所謂的『默認』參數于后續范例中介紹; -R :遞歸配置 acl ,亦即包括次目錄都會被配置起來; -d :配置『默認 acl 參數』的意思!只對目錄有效,在該目錄新建的數據會引用此默認值

    上面談到的是 acl 的選項功能,那么如何配置 ACL 的特殊權限呢?特殊權限的配置方法有很多, 我們先來談談最常見的,就是針對單一使用者的配置方式:

    # 1. 針對特定使用者的方式: # 配置規范:『 u:[使用者賬號列表]:[rwx] 』,例如針對 vbird1 的權限規范 rx : [root@www ~]# touch acl_test1 [root@www ~]# ll acl_test1 -rw-r--r-- 1 root root 0 Feb 27 13:28 acl_test1 [root@www ~]# setfacl -m u:vbird1:rx acl_test1 [root@www ~]# ll acl_test1 -rw-r-xr--+ 1 root root 0 Feb 27 13:28 acl_test1 # 權限部分多了個 + ,且與原本的權限 (644) 看起來差異很大!但要如何查閱呢? [root@www ~]# setfacl -m u::rwx acl_test1 [root@www ~]# ll acl_test1 -rwxr-xr--+ 1 root root 0 Feb 27 13:28 acl_test1 # 無使用者列表,代表配置該文件擁有者,所以上面顯示 root 的權限成為 rwx 了!

    上述動作為最簡單的 ACL 配置,利用『 u:使用者:權限 』的方式來配置的啦!配置前請加上 -m 這個選項。 如果一個文件配置了 ACL 參數后,他的權限部分就會多出一個 + 號了!但是此時你看到的權限與實際權限可能就會有點誤差! 那要如何觀察呢?就透過 getfacl 吧!


    • getfacl 命令用法
    [root@www ~]# getfacl filename 選項與參數: getfacl 的選項幾乎與 setfacl 相同!所以鳥哥這里就免去了選項的說明啊!# 請列出剛剛我們配置的 acl_test1 的權限內容: [root@www ~]# getfacl acl_test1 # file: acl_test1 <==說明檔名而已! # owner: root <==說明此文件的擁有者,亦即 ll 看到的第三使用者字段 # group: root <==此文件的所屬群組,亦即 ll 看到的第四群組字段 user::rwx <==使用者列表欄是空的,代表文件擁有者的權限 user:vbird1:r-x <==針對 vbird1 的權限配置為 rx ,與擁有者并不同! group::r-- <==針對文件群組的權限配置僅有 r mask::r-x <==此文件默認的有效權限 (mask) other::r-- <==其他人擁有的權限啰!

    上面的數據非常容易查閱吧?顯示的數據前面加上 # 的,代表這個文件的默認屬性,包括文件名、文件擁有者與文件所屬群組。 底下出現的 user, group, mask, other 則是屬于不同使用者、群組與有效權限(mask)的配置值。 以上面的結果來看,我們剛剛配置的 vbird1 對于這個文件具有 r 與 x 的權限啦!這樣看的懂嗎? 如果看的懂的話,接下來讓我們在測試其他類型的 setfacl 配置吧!

    # 2. 針對特定群組的方式: # 配置規范:『 g:[群組列表]:[rwx] 』,例如針對 mygroup1 的權限規范 rx : [root@www ~]# setfacl -m g:mygroup1:rx acl_test1 [root@www ~]# getfacl acl_test1 # file: acl_test1 # owner: root # group: root user::rwx user:vbird1:r-x group::r-- group:mygroup1:r-x <==這里就是新增的部分!多了這個群組的權限配置! mask::r-x other::r--

    基本上,群組與使用者的配置并沒有什么太大的差異啦!如上表所示,非常容易了解意義。不過,你應該會覺得奇怪的是, 那個 mask 是什么東西啊?其實他有點像是『有效權限』的意思!他的意義是:?使用者或群組所配置的權限必須要存在于 mask 的權限配置范圍內才會生效,此即『有效權限 (effective permission)』?我們舉個例子來看,如下所示:

    # 3. 針對有效權限 mask 的配置方式: # 配置規范:『 m:[rwx] 』,例如針對剛剛的文件規范為僅有 r : [root@www ~]# setfacl -m m:r acl_test1 [root@www ~]# getfacl acl_test1 # file: acl_test1 # owner: root # group: root user::rwx user:vbird1:r-x #effective:r-- <==vbird1+mask均存在者,僅有 r 而已! group::r-- group:mygroup1:r-x #effective:r-- mask::r-- other::r--

    您瞧,vbird1 與 mask 的集合發現僅有 r 存在,因此 vbird1 僅具有 r 的權限而已,并不存在 x 權限!這就是 mask 的功能了!我們可以透過使用 mask 來規范最大允許的權限,就能夠避免不小心開放某些權限給其他使用者或群組了。 不過,通常鳥哥都是將 mask 配置為 rwx 啦!然后再分別依據不同的使用者/群組去規范她們的權限就是了。

    例題: 將前一小節任務二中 /srv/projecta 這個目錄,讓 myuser1 可以進入查閱,但 myuser1 不具有修改的權力。 答: 由于 myuser1 是獨立的使用者與群組,而 /srv 是附屬于 / 之下的,因此 /srv 已經具有 acl 的功能。 透過如下的配置即可搞定:
    # 1. 先測試看看,使用 myuser1 能否進入該目錄? [myuser1@www ~]$ cd /srv/projecta -bash: cd: /srv/projecta: Permission denied <==確實不可進入!# 2. 開始用 root 的身份來配置一下該目錄的權限吧! [root@www ~]# setfacl -m u:myuser1:rx /srv/projecta [root@www ~]# getfacl /srv/projecta # file: srv/projecta # owner: root # group: projecta user::rwx user:myuser1:r-x <==還是要看看有沒有配置成功喔! group::rwx mask::rwx other::--- # 3. 還是得要使用 myuser1 去測試看看結果! [myuser1@www ~]$ cd /srv/projecta [myuser1@www projecta]$ ll -a drwxrws---+ 2 root projecta 4096 Feb 27 11:29 . <==確實可以查詢檔名 drwxr-xr-x 4 root root 4096 Feb 27 11:29 .. [myuser1@www projecta]$ touch testing touch: cannot touch `testing': Permission denied <==確實不可以寫入!
    請注意,上述的 1, 3 步驟使用 myuser1 的身份,2步驟才是使用 root 去配置的!

    上面的配置我們就完成了之前任務二的后續需求喔!這么簡單呢!接下來讓我們來測試一下,如果我用 root 或者是 pro1 的身份去 /srv/projecta 添加文件或目錄時,該文件或目錄是否能夠具有 ACL 的配置? 意思就是說,ACL 的權限配置是否能夠被次目錄所『繼承?』先試看看:

    [root@www ~]# cd /srv/projecta [root@www ~]# touch abc1 [root@www ~]# mkdir abc2 [root@www ~]# ll -d abc* -rw-r--r-- 1 root projecta 0 Feb 27 14:37 abc1 drwxr-sr-x 2 root projecta 4096 Feb 27 14:37 abc2

    你可以明顯的發現,權限后面都沒有 + ,代表這個 acl 屬性并沒有繼承喔!如果你想要讓 acl 在目錄底下的數據都有繼承的功能,那就得如下這樣做了!

    # 4. 針對默認權限的配置方式: # 配置規范:『 d:[ug]:使用者列表:[rwx] 』# 讓 myuser1 在 /srv/projecta 底下一直具有 rx 的默認權限! [root@www ~]# setfacl -m d:u:myuser1:rx /srv/projecta [root@www ~]# getfacl /srv/projecta # file: srv/projecta # owner: root # group: projecta user::rwx user:myuser1:r-x group::rwx mask::rwx other::--- default:user::rwx default:user:myuser1:r-x default:group::rwx default:mask::rwx default:other::--- [root@www ~]# cd /srv/projecta [root@www projecta]# touch zzz1 [root@www projecta]# mkdir zzz2 [root@www projecta]# ll -d zzz* -rw-rw----+ 1 root projecta 0 Feb 27 14:57 zzz1 drwxrws---+ 2 root projecta 4096 Feb 27 14:57 zzz2 # 看吧!確實有繼承喔!然后我們使用 getfacl 再次確認看看! [root@www projecta]# getfacl zzz2 # file: zzz2 # owner: root # group: projecta user::rwx user:myuser1:r-x group::rwx mask::rwx other::--- default:user::rwx default:user:myuser1:r-x default:group::rwx default:mask::rwx default:other::---

    透過這個『針對目錄來配置的默認 ACL 權限配置值』的項目,我們可以讓這些屬性繼承到次目錄底下呢! 非常方便啊!那如果想要讓 ACL 的屬性全部消失又要如何處理?透過『 setfacl -b 檔名 』即可啦! 太簡單了!鳥哥就不另外介紹了!請自行測試測試吧!


    使用者身份切換

    什么?在 Linux 系統當中還要作身份的變換?這是為啥?可能有底下幾個原因啦!

    • 使用一般賬號:系統平日操作的好習慣
      事實上,為了安全的緣故,一些老人家都會建議你,盡量以一般身份使用者來操作 Linux 的日常作業!等到需要配置系統環境時, 才變換身份成為 root 來進行系統管理,相對比較安全啦!避免作錯一些嚴重的命令,例如恐怖的『 rm -rf / 』(千萬作不得!)

    • 用較低權限啟動系統服務
      相對于系統安全,有的時候,我們必須要以某些系統賬號來進行程序的運行。 舉例來說, Linux 主機上面的一套軟件,名稱為 apache ,我們可以額外創建一個名為 apache 的用戶來啟動 apache 軟件啊,如此一來,如果這個程序被攻破,至少系統還不至于就損毀了~

    • 軟件本身的限制
      在遠古時代的?telnet?程序中,該程序默認是不許使用 root 的身份登陸的,telnet 會判斷登陸者的 UID, 若 UID 為 0 的話,那就直接拒絕登陸了。所以,你只能使用一般使用者來登陸 Linux 服務器。 此外,?ssh?(注3) 也可以配置拒絕 root 登陸喔!那如果你有系統配置需求該如何是好啊?就變換身份啊!

    由于上述考慮,所以我們都是使用一般賬號登陸系統的,等有需要進行系統維護或軟件升級時才轉為 root 的身份來動作。 那如何讓一般使用者轉變身份成為 root 呢?主要有兩種方式喔:

    • 以『 su - 』直接將身份變成 root 即可,但是這個命令卻需要 root 的口令,也就是說,如果你要以 su 變成 root 的話,你的一般使用者就必須要有 root 的口令才行;

    • 以『 sudo 命令 』運行 root 的命令串,由于 sudo 需要事先配置妥當,且 sudo 需要輸入用戶自己的口令, 因此多人共管同一部主機時, sudo 要比 su 來的好喔!至少 root 口令不會流出去!

    底下我們就來說一說 su 跟 sudo 的用法啦!


    su

    su 是最簡單的身份切換命令了,他可以進行任何身份的切換唷!方法如下:

    [root@www ~]# su [-lm] [-c 命令] [username] 選項與參數: - :單純使用 - 如『 su - 』代表使用 login-shell 的變量文件讀取方式來登陸系統;若使用者名稱沒有加上去,則代表切換為 root 的身份。 -l :與 - 類似,但后面需要加欲切換的使用者賬號!也是 login-shell 的方式。 -m :-m 與 -p 是一樣的,表示『使用目前的環境配置,而不讀取新使用者的配置文件』 -c :僅進行一次命令,所以 -c 后面可以加上命令喔!

    上表的解釋當中有出現之前第十一章談過的?login-shell?配置文件讀取方式,如果你忘記那是啥東西, 請先回去第十一章瞧瞧再回來吧!這個 su 的用法當中,有沒有加上那個減號『 - 』差很多喔! 因為涉及 login-shell 與 non-login shell 的變量讀取方法。這里讓我們以一個小例子來說明吧!

    范例一:假設你原本是 vbird1 的身份,想要使用 non-login shell 的方式變成 root [vbird1@www ~]$ su <==注意提示字符,是 vbird1 的身份喔! Password: <==這里輸入 root 的口令喔! [root@www vbird1]# id <==提示字符的目錄是 vbird1 喔! uid=0(root) gid=0(root) groups=0(root),1(bin),... <==確實是 root 的身份! [root@www vbird1]# env | grep 'vbird1' USER=vbird1 PATH=/usr/local/bin:/bin:/usr/bin:/home/vbird1/bin <==這個影響最大! MAIL=/var/spool/mail/vbird1 <==收到的 mailbox 是 vbird1 PWD=/home/vbird1 <==并非 root 的家目錄 LOGNAME=vbird1 # 雖然你的 UID 已經是具有 root 的身份,但是看到上面的輸出信息嗎? # 還是有一堆變量為原本 vbird1 的身份,所以很多數據還是無法直接利用。 [root@www vbird1]# exit <==這樣可以離開 su 的環境!

    單純使用『 su 』切換成為 root 的身份,讀取的變量配置方式為 non-login shell 的方式,這種方式很多原本的變量不會被改變, 尤其是我們之前談過很多次的 PATH 這個變量,由于沒有改變成為 root 的環境 (一堆 /sbin, /usr/sbin 等目錄都沒有被包含進來), 因此很多 root 慣用的命令就只能使用絕對路徑來運行咯。其他的還有 MAIL 這個變量,你輸入 mail 時, 收到的郵件竟然還是 vbird1 的,而不是 root 本身的郵件!是否覺得很奇怪啊!所以切換身份時,請務必使用如下的范例二:

    范例二:使用 login shell 的方式切換為 root 的身份并觀察變量 [vbird1@www ~]$ su - Password: <==這里輸入 root 的口令喔! [root@www ~]# env | grep root USER=root MAIL=/var/spool/mail/root PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin PWD=/root HOME=/root LOGNAME=root # 了解差異了吧?下次變換成為 root 時,記得最好使用 su - 喔! [root@www ~]# exit <==這樣可以離開 su 的環境!

    上述的作法是讓使用者的身份變成 root 并開始操作系統,如果想要離開 root 的身份則得要利用 exit 離開才行。 那我如果只是想要運行『一個只有 root 才能進行的命令,且運行完畢就恢復原本的身份』呢?那就可以加上 -c 這個選項啰! 請參考底下范例三!

    范例三:vbird1 想要運行『 head -n 3 /etc/shadow 』一次,且已知 root 口令 [vbird1@www ~]$ head -n 3 /etc/shadow head: cannot open `/etc/shadow' for reading: Permission denied [vbird1@www ~]$ su - -c "head -n 3 /etc/shadow" Password: <==這里輸入 root 的口令喔! root:$1$/30QpEWEBEZXRD0bh6rAABCEQD.BAH0:14126:0:99999:7::: bin:*:14126:0:99999:7::: daemon:*:14126:0:99999:7::: [vbird1@www ~]$ <==注意看,身份還是 vbird1 喔!繼續使用舊的身份進行系統操作!

    由于 /etc/shadow 權限的關系,該文件僅有 root 可以查閱。為了查閱該文件,所以我們必須要使用 root 的身份工作。 但我只想要進行一次該命令而已,此時就使用類似上面的語法吧!好,那接下來,如果我是 root 或者是其他人, 想要變更成為某些特殊賬號,可以使用如下的方法來切換喔!

    范例四:原本是 vbird1 這個使用者,想要變換身份成為 dmtsai 時? [vbird1@www ~]$ su -l dmtsai Password: <==這里輸入 dmtsai 的口令喔! [dmtsai@www ~]$ su - Password: <==這里輸入 root 的口令喔! [root@www ~]# id sshd uid=74(sshd) gid=74(sshd) groups=74(sshd) ... <==確實有存在此人 [root@www ~]# su -l sshd This account is currently not available. <==竟然說此人無法切換? [root@www ~]# finger sshd Login: sshd Name: Privilege-separated SSH Directory: /var/empty/sshd Shell: /sbin/nologin [root@www ~]# exit <==離開第二次的 su [dmtsai@www ~]$ exit <==離開第一次的 su [vbird1@www ~]$ exit <==這才是最初的環境!

    su 就這樣簡單的介紹完畢,總結一下他的用法是這樣的:

    • 若要完整的切換到新使用者的環境,必須要使用『 su - username 』或『 su -l username 』, 才會連同 PATH/USER/MAIL 等變量都轉成新用戶的環境;

    • 如果僅想要運行一次 root 的命令,可以利用『 su - -c "命令串" 』的方式來處理;

    • 使用 root 切換成為任何使用者時,并不需要輸入新用戶的口令;

    雖然使用 su 很方便啦,不過缺點是,當我的主機是多人共管的環境時,如果大家都要使用 su 來切換成為 root 的身份,那么不就每個人都得要知道 root 的口令,這樣口令太多人知道可能會流出去, 很不妥當呢!怎辦?透過 sudo 來處理即可!


    sudo

    相對于 su 需要了解新切換的用戶口令 (常常是需要 root 的口令), sudo 的運行則僅需要自己的口令即可! 甚至可以配置不需要口令即可運行 sudo 呢!由于 sudo 可以讓你以其他用戶的身份運行命令 (通常是使用 root 的身份來運行命令),因此并非所有人都能夠運行 sudo , 而是僅有規范到 /etc/sudoers 內的用戶才能夠運行 sudo 這個命令喔!說的這么神奇,底下就來瞧瞧那 sudo 如何使用?


    • sudo 的命令用法

    由于一開始系統默認僅有 root 可以運行 sudo?,因此底下的范例我們先以 root 的身份來運行,等到談到 visudo 時,再以一般使用者來討論其他 sudo 的用法吧! sudo 的語法如下:

    [root@www ~]# sudo [-b] [-u 新使用者賬號] 選項與參數: -b :將后續的命令放到背景中讓系統自行運行,而不與目前的 shell 產生影響 -u :后面可以接欲切換的使用者,若無此項則代表切換身份為 root 。范例一:你想要以 sshd 的身份在 /tmp 底下創建一個名為 mysshd 的文件 [root@www ~]# sudo -u sshd touch /tmp/mysshd [root@www ~]# ll /tmp/mysshd -rw-r--r-- 1 sshd sshd 0 Feb 28 17:42 /tmp/mysshd # 特別留意,這個文件的權限是由 sshd 所創建的情況喔! 范例二:你想要以 vbird1 的身份創建 ~vbird1/www 并于其中創建 index.html 文件 [root@www ~]# sudo -u vbird1 sh -c "mkdir ~vbird1/www; cd ~vbird1/www; \ > echo 'This is index.html file' > index.html" [root@www ~]# ll -a ~vbird1/www drwxr-xr-x 2 vbird1 vbird1 4096 Feb 28 17:51 . drwx------ 5 vbird1 vbird1 4096 Feb 28 17:51 .. -rw-r--r-- 1 vbird1 vbird1 24 Feb 28 17:51 index.html # 要注意,創建者的身份是 vbird1 ,且我們使用 sh -c "一串命令" 來運行的!

    sudo 可以讓你切換身份來進行某項任務,例如上面的兩個范例。范例一中,我們的 root 使用 sshd 的權限去進行某項任務! 要注意,因為我們無法使用『 su - sshd 』去切換系統賬號 (因為系統賬號的 shell 是 /sbin/nologin), 這個時候 sudo 真是他 X 的好用了!立刻以 sshd 的權限在 /tmp 底下創建文件!查閱一下文件權限你就了解意義啦! 至于范例二則更使用多重命令串 (透過分號 ; 來延續命令進行),使用 sh -c 的方法來運行一連串的命令, 如此真是好方便!

    但是 sudo 默認僅有 root 能使用啊!為什么呢?因為 sudo 的運行是這樣的流程:

  • 當用戶運行 sudo 時,系統于 /etc/sudoers 文件中搜尋該使用者是否有運行 sudo 的權限;
  • 若使用者具有可運行 sudo 的權限后,便讓使用者『輸入用戶自己的口令』來確認;
  • 若口令輸入成功,便開始進行 sudo 后續接的命令(但 root 運行 sudo 時,不需要輸入口令);
  • 若欲切換的身份與運行者身份相同,那也不需要輸入口令。
  • 所以說,sudo 運行的重點是:『能否使用 sudo 必須要看 /etc/sudoers 的配置值, 而可使用 sudo 者是透過輸入用戶自己的口令來運行后續的命令串』喔!由于能否使用與 /etc/sudoers 有關, 所以我們當然要去編輯 sudoers 文件啦!不過,因為該文件的內容是有一定的規范的,因此直接使用 vi 去編輯是不好的。 此時,我們得要透過 visudo 去修改這個文件喔!


    • visudo 與 /etc/sudoers

    從上面的說明我們可以知道,除了 root 之外的其他賬號,若想要使用 sudo 運行屬于 root 的權限命令,則 root 需要先使用 visudo 去修改 /etc/sudoers ,讓該賬號能夠使用全部或部分的 root 命令功能。為什么要使用 visudo 呢?這是因為 /etc/sudoers 是有配置語法的,如果配置錯誤那會造成無法使用 sudo 命令的不良后果。因此才會使用 visudo 去修改, 并在結束離開修改畫面時,系統會去檢驗 /etc/sudoers 的語法就是了。

    一般來說,visudo 的配置方式有幾種簡單的方法喔,底下我們以幾個簡單的例子來分別說明:

  • 單一用戶可進行 root 所有命令,與 sudoers 文件語法:

    假如我們要讓 vbird1 這個賬號可以使用 root 的任何命令,那么可以簡單的這樣進行修改即可:
    [root@www ~]# visudo ....(前面省略).... root ALL=(ALL) ALL <==找到這一行,大約在 76 行左右 vbird1 ALL=(ALL) ALL <==這一行是你要新增的! ....(前面省略)....
    有趣吧!其實 visudo 只是利用 vi 將 /etc/sudoers 文件呼叫出來進行修改而已,所以這個文件就是 /etc/sudoers 啦! 這個文件的配置其實很簡單,如上面所示,如果你找到 76 行 (有 root 配置的那行) 左右,看到的數據就是:
    使用者賬號 登陸者的來源主機名=(可切換的身份) 可下達的命令 root ALL=(ALL) ALL <==這是默認值
    上面這一行的四個組件意義是:

    利用群組以及免口令的功能處理 visudo

    我們在本章前面曾經創建過 pro1, pro2, pro3 ,這三個用戶能否透過群組的功能讓這三個人可以管理系統? 可以的,而且很簡單!同樣我們使用實際案例來說明:
  • 系統的哪個賬號可以使用 sudo 這個命令的意思,默認為 root 這個賬號;
  • 當這個賬號由哪部主機聯機到本 Linux 主機,意思是這個賬號可能是由哪一部網絡主機聯機過來的, 這個配置值可以指定客戶端計算機(信任用戶的意思)。默認值 root 可來自任何一部網絡主機
  • 這個賬號可以切換成什么身份來下達后續的命令,默認 root 可以切換成任何人;
  • 可用該身份下達什么命令?這個命令請務必使用絕對路徑撰寫。 默認 root 可以切換任何身份且進行任何命令之意。

  • 那個 ALL 是特殊的關鍵詞,代表任何身份、主機或命令的意思。所以,我想讓 vbird1 可以進行任何身份的任何命令, 就如同上表特殊字體寫的那樣,其實就是復制上述默認值那一行,再將 root 改成 vbird1 即可啊! 此時『vbird1 不論來自哪部主機登陸,他可以變換身份成為任何人,且可以進行系統上面的任何命令』之意。 修改完請儲存后離開 vi,并以 vbird1 登陸系統后,進行如下的測試看看:
    [vbird1@www ~]$ tail -n 1 /etc/shadow <==注意!身份是 vbird1 tail: cannot open `/etc/shadow' for reading: Permission denied # 因為不是 root 嘛!所以當然不能查詢 /etc/shadow[vbird1@www ~]$ sudo tail -n 1 /etc/shadow <==透過 sudoWe trust you have received the usual lecture from the local System Administrator. It usually boils down to these three things:#1) Respect the privacy of others. <==這里僅是一些說明與警示項目 #2) Think before you type. #3) With great power comes great responsibility. Password: <==注意啊!這里輸入的是『 vbird1 自己的口令 』 pro3:$1$GfinyJgZ$9J8IdrBXXMwZIauANg7tW0:14302:0:99999:7::: # 看!vbird1 竟然可以查詢 shadow !
    注意到了吧!vbird1 輸入自己的口令就能夠運行 root 的命令!所以,系統管理員當然要了解 vbird1 這個用戶的『操守』才行!否則隨便配置一個用戶,他惡搞系統怎辦?另外,一個一個配置太麻煩了, 能不能使用群組的方式來配置呢?參考底下的方式吧。

  • [root@www ~]# visudo <==同樣的,請使用 root 先配置 ....(前面省略).... %wheel ALL=(ALL) ALL <==大約在 84 行左右,請將這行的 # 拿掉! # 在最左邊加上 % ,代表后面接的是一個『群組』之意!改完請儲存后離開 [root@www ~]# usermod -a -G wheel pro1 <==將 pro1 加入 wheel 的支持
    上面的配置值會造成『任何加入 wheel 這個群組的使用者,就能夠使用 sudo 切換任何身份來操作任何命令』的意思。 你當然可以將 wheel 換成你自己想要的群組名。接下來,請分別切換身份成為 pro1 及 pro2 試看看 sudo 的運行。
    [pro1@www ~]$ sudo tail -n 1 /etc/shadow <==注意身份是 pro1 ....(前面省略).... Password: <==輸入 pro1 的口令喔! pro3:$1$GfinyJgZ$9J8IdrBXXMwZIauANg7tW0:14302:0:99999:7:::[pro2@www ~]$ sudo tail -n 1 /etc/shadow <==注意身份是 pro2 Password: pro2 is not in the sudoers file. This incident will be reported. # 仔細看錯誤信息他是說這個 pro2 不在 /etc/sudoers 的配置中!
    這樣理解群組了吧?如果你想要讓 pro3 也支持這個 sudo 的話,不需要重新使用 visudo ,只要利用?usermod?去修改 pro3 的群組支持,讓 wheel 也支持 pro3 的話,那他就能夠進行 sudo 啰! 簡單吧!不過,既然我們都信任這些 sudo 的用戶了,能否提供『不需要口令即可使用 sudo 』呢? 就透過如下的方式:
    [root@www ~]# visudo <==同樣的,請使用 root 先配置 ....(前面省略).... %wheel ALL=(ALL) NOPASSWD: ALL <==大約在 87 行左右,請將 # 拿掉! # 在最左邊加上 % ,代表后面接的是一個『群組』之意!改完請儲存后離開
    重點是那個 NOPASSWD 啦!該關鍵詞是免除口令輸入的意思喔!

  • 有限制的命令操作:

    上面兩點都會讓使用者能夠利用 root 的身份進行任何事情!這樣總是不太好~如果我想要讓用戶僅能夠進行部分系統任務, 比方說,系統上面的 myuser1 僅能夠幫 root 修改其他用戶的口令時,亦即『當使用者僅能使用 passwd 這個命令幫忙 root 修改其他用戶的口令』時,你該如何撰寫呢?可以這樣做:
    [root@www ~]# visudo <==注意是 root 身份 myuser1 ALL=(root) /usr/bin/passwd <==最后命令務必用絕對路徑
    上面的配置值指的是『myuser1 可以切換成為 root 使用 passwd 這個命令』的意思。其中要注意的是:?命令字段必須要填寫絕對路徑才行!否則 visudo 會出現語法錯誤的狀況發生! 此外,上面的配置是有問題的!我們使用底下的命令操作來讓您了解:
    [myuser1@www ~]$ sudo passwd myuser3 <==注意,身份是 myuser1 Password: <==輸入 myuser1 的口令 Changing password for user myuser3. <==底下改的是 myuser3 的口令喔!這樣是正確的 New UNIX password: Retype new UNIX password: passwd: all authentication tokens updated successfully.[myuser1@www ~]$ sudo passwd Changing password for user root. <==見鬼!怎么會去改 root 的口令?
    恐怖啊!我們竟然讓 root 的口令被 myuser3 給改變了!下次 root 回來竟無法登陸系統...欲哭無淚~怎辦? 所以我們必須要限制用戶的命令參數!修改的方法為將上述的那行改一改先:
    [root@www ~]# visudo <==注意是 root 身份 myuser1 ALL=(root) !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, \!/usr/bin/passwd root
    由于屏幕一行寫不完,我將這行寫成兩行,所以上面第一行最后加上反斜杠啰。加上驚嘆號『 ! 』代表『不可運行』的意思。 因此上面這一行會變成:可以運行『 passwd 任意字符』,但是『 passwd 』與『 passwd root 』這兩個命令例外! 如此一來 myuser1 就無法改變 root 的口令了!這樣這位使用者可以具有 root 的能力幫助你修改其他用戶的口令, 而且也不能隨意改變 root 的口令!很有用處的!

  • 透過別名建置 visudo:

    如上述第三點,如果我有 15 個用戶需要加入剛剛的管理員行列,那么我是否要將上述那長長的配置寫入 15 行啊? 而且如果想要修改命令或者是新增命令時,那我每行都需要重新配置,很麻煩ㄟ!有沒有更簡單的方式? 是有的!透過別名即可!我們 visudo 的別名可以是『命令別名、帳戶別名、主機別名』等。不過這里我們僅介紹帳戶別名, 其他的配置值有興趣的話,可以自行玩玩!

    假設我的 pro1, pro2, pro3 與 myuser1, myuser2 要加入上述的口令管理員的 sudo 列表中, 那我可以創立一個帳戶別名稱為 ADMPW 的名稱,然后將這個名稱處理一下即可。處理的方式如下:
    [root@www ~]# visudo <==注意是 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
    我透過 User_Alias 創建出一個新賬號,這個賬號名稱一定要使用大寫字符來處理,包括 Cmnd_Alias(命令別名)、Host_Alias(來源主機名別名) 都需要使用大寫字符的!這個 ADMPW 代表后面接的那些實際賬號。 而該賬號能夠進行的命令就如同 ADMPWCOM 后面所指定的那樣!上表最后一行則寫入這兩個別名 (賬號與命令別名), 未來要修改時,我只要修改 User_Alias 以及 Cmnd_Alias 這兩行即可!配置方面會比較簡單有彈性喔!

  • sudo 的時間間隔問題:

    或許您已經發現了,那就是,如果我使用同一個賬號在短時間內重復操作 sudo 來運行命令的話, 在第二次運行 sudo 時,并不需要輸入自己的口令!sudo 還是會正確的運行喔!為什么呢? 第一次運行 sudo 需要輸入口令,是擔心由于用戶暫時離開座位,但有人跑來你的座位使用你的賬號操作系統之故。 所以需要你輸入一次口令重新確認一次身份。

    兩次運行 sudo 的間隔在五分鐘內,那么再次運行 sudo 時就不需要再次輸入口令了, 這是因為系統相信你在五分鐘內不會離開你的作業,所以運行 sudo 的是同一個人!呼呼!真是很人性化的設計啊~ ^_^。不過如果兩次 sudo 操作的間隔超過 5 分鐘,那就得要重新輸入一次你的口令了?(注4)

    另外要注意的是,因為使用一般賬號時,理論上不會使用到 /sbin, /usr/sbin 等目錄內的命令,所以 $PATH 變量不會含有這些目錄,因此很多管理命令需要使用絕對路徑來下達比較妥當喔!

  • sudo 搭配 su 的使用方式:

    很多時候我們需要大量運行很多 root 的工作,所以一直使用 sudo 覺得很煩ㄟ!那有沒有辦法使用 sudo 搭配 su , 一口氣將身份轉為 root ,而且還用用戶自己的口令來變成 root 呢?是有的!而且方法簡單的會讓你想笑! 我們創建一個 ADMINS 帳戶別名,然后這樣做:
    [root@www ~]# visudo User_Alias ADMINS = pro1, pro2, pro3, myuser1 ADMINS ALL=(root) /bin/su -
    接下來,上述的 pro1, pro2, pro3, myuser1 這四個人,只要輸入『 sudo su - 』并且輸入『自己的口令』后, 立刻變成 root 的身份!不但 root 口令不會外流,用戶的管理也變的非常方便! 這也是實務上面多人共管一部主機時常常使用的技巧呢!這樣管理確實方便,不過還是要強調一下大前提, 那就是『這些你加入的使用者,全部都是你能夠信任的用戶』!

  • 使用者的特殊 shell 與 PAM 模塊

    我們前面一直談到的大多是一般身份用戶與系統管理員 (root) 的相關操作, 而且大多是討論關于可登陸系統的賬號來說。那么換個角度想,如果我今天想要創建的, 是一個『僅能使用 mail server 相關郵件服務的賬號,而該賬號并不能登陸 Linux 主機』呢?如果不能給予該賬號一個口令,那么該賬號就無法使用系統的各項資源,當然也包括 mail 的資源, 而如果給予一個口令,那么該賬號就可能可以登陸 Linux 主機啊!呵呵~傷腦筋吧~ 所以,底下讓我們來談一談這些有趣的話題啰!

    另外,在本章之前談到過?/etc/login.defs?文件中,關于口令長度應該默認是 5 個字符串長度,但是我們上面也談到,該配置值已經被 PAM 模塊所取代了,那么 PAM 是什么?為什么他可以影響我們使用者的登陸呢?這里也要來談談的!


    特殊的 shell, /sbin/nologin

    在本章一開頭的?passwd 文件結構里面我們就談過系統賬號這玩意兒,這玩意兒的 shell 就是使用 /sbin/nologin ,重點在于系統賬號是不需要登陸的!所以我們就給他這個無法登陸的合法 shell。 使用了這個 shell 的用戶即使有了口令,你想要登陸時他也無法登陸,因為會出現如下的信息喔:

    This account is currently not available.

    我們所謂的『無法登陸』指的僅是:『這個使用者無法使用 bash 或其他 shell 來登陸系統』而已, 并不是說這個賬號就無法使用其他的系統資源喔! 舉例來說,各個系統賬號,打印作業由 lp 這個賬號在管理, WWW 服務由 apache 這個賬號在管理, 他們都可以進行系統程序的工作,但是『就是無法登陸主機』而已啦!^_^

    換個角度來想,如果我的 Linux 主機提供的是郵件服務,所以說,在這部 Linux 主機上面的賬號, 其實大部分都是用來收受主機的信件而已,并不需要登陸主機的呢! 這個時候,我們就可以考慮讓單純使用 mail 的賬號以 /sbin/nologin 做為他們的 shell , 這樣,最起碼當我的主機被嘗試想要登陸系統以取得 shell 環境時,可以拒絕該賬號呢!

    另外,如果我想要讓某個具有 /sbin/nologin 的使用者知道,他們不能登陸主機時, 其實我可以創建『?/etc/nologin.txt?』這個文件, 并且在這個文件內說明不能登陸的原因,那么下次當這個用戶想要登陸系統時, 屏幕上出現的就會是 /etc/nologin.txt 這個文件的內容,而不是默認的內容了!

    例題: 當使用者嘗試利用純 mail 賬號 (例如 myuser3) 時,利用 /etc/nologin.txt 告知用戶不要利用該賬號登陸系統。 答: 直接以 vi 編輯該文件,內容可以是這樣:
    [root@www ~]# vi /etc/nologin.txt This account is system account or mail account. Please DO NOT use this account to login my Linux server.
    想要測試時,可以使用 myuser3 (此賬號的 shell 是 /sbin/nologin) 來測試看看!
    [root@www ~]# su - myuser3 This account is system account or mail account. Please DO NOT use this account to login my Linux server. [root@www ~]#
    結果會發現與原本的默認信息不一樣喔! ^_^

    PAM 模塊簡介

    在過去,我們想要對一個使用者進行認證 (authentication),得要要求用戶輸入賬號口令, 然后透過自行撰寫的程序來判斷該賬號口令是否正確。也因為如此,我們常常得使用不同的機制來判斷賬號口令, 所以搞的一部主機上面擁有多個各別的認證系統,也造成賬號口令可能不同步的驗證問題! 為了解決這個問題因此有了 PAM (Pluggable Authentication Modules, 嵌入式模塊) 的機制!

    PAM 可以說是一套應用程序編程接口 (Application Programming Interface, API),他提供了一連串的驗證機制,只要使用者將驗證階段的需求告知 PAM 后, PAM 就能夠回報使用者驗證的結果 (成功或失敗)。由于 PAM 僅是一套驗證的機制,又可以提供給其他程序所呼叫引用,因此不論你使用什么程序,都可以使用 PAM 來進行驗證,如此一來,就能夠讓賬號口令或者是其他方式的驗證具有一致的結果!也讓程序設計師方便處理驗證的問題喔! (注5)


    圖 5.2.1、 PAM 模塊與其他程序的相關性

    如上述的圖示, PAM 是一個獨立的 API 存在,只要任何程序有需求時,可以向 PAM 發出驗證要求的通知, PAM 經過一連串的驗證后,將驗證的結果回報給該程序,然后該程序就能夠利用驗證的結果來進行可登陸或顯示其他無法使用的信息。 這也就是說,你可以在寫程序的時候將 PAM 模塊的功能加入,就能夠利用 PAM 的驗證功能啰。 因此目前很多程序都會利用 PAM 喔!所以我們才要來學習他啊!

    PAM 用來進行驗證的數據稱為模塊 (Modules),每個 PAM 模塊的功能都不太相同。舉例來說, 還記得我們在本章使用passwd?命令時,如果隨便輸入字典上面找的到的字符串, passwd 就會回報錯誤信息了!這是為什么呢?這就是 PAM 的 pam_cracklib.so 模塊的功能!他能夠判斷該口令是否在字典里面! 并回報給口令修改程序,此時就能夠了解你的口令強度了。

    所以,當你有任何需要判斷是否在字典當中的口令字符串時,就可以使用 pam_cracklib.so 這個模塊來驗證! 并根據驗證的回報結果來撰寫你的程序呢!這樣說,可以理解 PAM 的功能了吧?沒錯! PAM 的模塊也是很重要的一環!


    PAM 模塊配置語法

    PAM 藉由一個與程序相同文件名的配置文件來進行一連串的認證分析需求。我們同樣以 passwd 這個命令的呼叫 PAM 來說明好了。 當你運行 passwd 后,這支程序呼叫 PAM 的流程是:

  • 用戶開始運行 /usr/bin/passwd 這支程序,并輸入口令;
  • passwd 呼叫 PAM 模塊進行驗證;
  • PAM 模塊會到 /etc/pam.d/ 找尋與程序 (passwd) 同名的配置文件;
  • 依據 /etc/pam.d/passwd 內的配置,引用相關的 PAM 模塊逐步進行驗證分析;
  • 將驗證結果 (成功、失敗以及其他信息) 回傳給 passwd 這支程序;
  • passwd 這支程序會根據 PAM 回傳的結果決定下一個動作 (重新輸入新口令或者通過驗證!)
  • 從上頭的說明,我們會知道重點其實是 /etc/pam.d/ 里面的配置文件,以及配置文件所呼叫的 PAM 模塊進行的驗證工作! 既然一直談到 passwd 這個口令修改命令,那我們就來看看 /etc/pam.d/passwd 這個配置文件的內容是怎樣吧!

    [root@www ~]# cat /etc/pam.d/passwd #%PAM-1.0 <==PAM版本的說明而已! auth include system-auth <==每一行都是一個驗證的過程 account include system-auth password include system-auth 驗證類別 控制標準 PAM 模塊與該模塊的參數

    在這個配置文件當中,除了第一行宣告 PAM 版本之外,其他任何『 # 』開頭的都是批注,而每一行都是一個獨立的驗證流程, 每一行可以區分為三個字段,分別是驗證類別(type)、控制標準(flag)、PAM的模塊與該模塊的參數。 底下我們先來談談驗證類別與控制標準這兩項數據吧!

    Tips:
    你會發現在我們上面的表格當中出現的是『 include (包括) 』這個關鍵詞,他代表的是『請呼叫后面的文件來作為這個類別的驗證』, 所以,上述的每一行都要重復呼叫 /etc/pam.d/system-auth 那個文件來進行驗證的意思!

    • 第一個字段:驗證類別 (Type)

    驗證類別主要分為四種,分別說明如下:

    • auth
      是 authentication (認證) 的縮寫,所以這種類別主要用來檢驗使用者的身份驗證,這種類別通常是需要口令來檢驗的, 所以后續接的模塊是用來檢驗用戶的身份。

    • account
      account (賬號) 則大部分是在進行 authorization (授權),這種類別則主要在檢驗使用者是否具有正確的權限, 舉例來說,當你使用一個過期的口令來登陸時,當然就無法正確的登陸了。

    • session
      session 是會議期間的意思,所以 session 管理的就是使用者在這次登陸 (或使用這個命令) 期間,PAM 所給予的環境配置。 這個類別通常用在記錄用戶登陸與注銷時的信息!例如,如果你常常使用 su 或者是 sudo 命令的話, 那么應該可以在 /var/log/secure 里面發現很多關于 pam 的說明,而且記載的數據是『session open, session close』的信息!?

    • password
      password 就是口令嘛!所以這種類別主要在提供驗證的修訂工作,舉例來說,就是修改/變更口令啦!

    這四個驗證的類型通常是有順序的,不過也有例外就是了。 會有順序的原因是,(1)我們總是得要先驗證身份 (auth) 后, (2)系統才能夠藉由用戶的身份給予適當的授權與權限配置 (account),而且(3)登陸與注銷期間的環境才需要配置, 也才需要記錄登陸與注銷的信息 (session)。如果在運行期間需要口令修訂時,(4)才給予 password 的類別。這樣說起來, 自然是需要有點順序吧!


    • 第二個字段:驗證的控制旗標 (control flag)

    那么『驗證的控制旗標(control flag)』又是什么?簡單的說,他就是『驗證通過的標準』啦! 這個字段在管控該驗證的放行方式,主要也分為四種控制方式:

    • required
      此驗證若成功則帶有 success (成功) 的標志,若失敗則帶有 failure 的標志,但不論成功或失敗都會繼續后續的驗證流程。 由于后續的驗證流程可以繼續進行,因此相當有利于數據的登錄 (log) ,這也是 PAM 最常使用 required 的原因。

    • requisite
      若驗證失敗則立刻回報原程序 failure 的標志,并終止后續的驗證流程。若驗證成功則帶有 success 的標志并繼續后續的驗證流程。 這個項目與 required 最大的差異,就在于失敗的時候還要不要繼續驗證下去?由于 requisite 是失敗就終止, 因此失敗時所產生的 PAM 信息就無法透過后續的模塊來記錄了。

    • sufficient
      若驗證成功則立刻回傳 success 給原程序,并終止后續的驗證流程;若驗證失敗則帶有 failure 標志并繼續后續的驗證流程。 這玩意兒與 requisits 剛好相反!

    • optional
      這個模塊控件目大多是在顯示信息而已,并不是用在驗證方面的。

    如果將這些控制旗標以圖示的方式配合成功與否的條件繪圖,會有點像底下這樣:


    圖 5.3.1、 PAM 控制旗標所造成的回報流程

    程序運行過程中遇到驗證時才會去呼叫 PAM ,而 PAM 驗證又分很多類型與控制,不同的控制旗標所回報的信息并不相同。 如上圖所示, requisite 失敗就回報了并不會繼續,而 sufficient 則是成功就回報了也不會繼續。 至于驗證結束后所回報的信息通常是『succes 或 failure 』而已,后續的流程還需要該程序的判斷來繼續運行才行。


    常用模塊簡介

    談完了配置文件的語法后,現在讓我們來查閱一下 CentOS 5.x 提供的 PAM 默認文件的內容是啥吧! 由于我們常常需要透過各種方式登陸 (login) 系統,因此就來看看登陸所需要的 PAM 流程為何:

    [root@www ~]# cat /etc/pam.d/login #%PAM-1.0 auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so auth include system-auth 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 include system-auth session required pam_loginuid.so session optional pam_console.so # pam_selinux.so open should only be followed by sessions... session required pam_selinux.so open session optional pam_keyinit.so force revoke # 我們可以看到,其實 login 也呼叫多次的 system-auth ,所以底下列出該配置文件[root@www ~]# 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 sufficient pam_unix.so nullok try_first_pass auth requisite pam_succeed_if.so uid >= 500 quiet auth required pam_deny.so account required pam_unix.so account sufficient pam_succeed_if.so uid < 500 quiet account required pam_permit.so password requisite pam_cracklib.so try_first_pass retry=3 password sufficient pam_unix.so md5 shadow nullok try_first_pass use_authtok password required pam_deny.so session optional pam_keyinit.so revoke session required pam_limits.so session [success=1 default=ignore] pam_succeed_if.so service in crond quiet \ use_uid session required pam_unix.so

    上面這個表格當中使用到非常多的 PAM 模塊,每個模塊的功能都不太相同,詳細的模塊情報可以在你的系統中找到:

    • /etc/pam.d/*:每個程序個別的 PAM 配置文件;
    • /lib/security/*:PAM 模塊文件的實際放置目錄;
    • /etc/security/*:其他 PAM 環境的配置文件;
    • /usr/share/doc/pam-*/:詳細的 PAM 說明文件。

    例如鳥哥使用未 update 過的 CentOS 5.2 ,pam_nologin 說明文件檔在: /usr/share/doc/pam-0.99.6.2/txts/README.pam_nologin。你可以自行查閱一下該模塊的功能。 鳥哥這里僅簡單介紹幾個較常使用的模塊,詳細的信息還得要您努力查閱參考書呢! ^_^

    • pam_securetty.so:
      限制系統管理員 (root) 只能夠從安全的 (secure) 終端機登陸;那什么是終端機?例如 tty1, tty2 等就是傳統的終端機裝置名稱。那么安全的終端機配置呢? 就寫在 /etc/securetty 這個文件中。你可以查閱一下該文件, 就知道為什么 root 可以從 tty1~tty7 登陸,但卻無法透過 telnet 登陸 Linux 主機了!

    • pam_nologin.so:
      這個模塊可以限制一般用戶是否能夠登陸主機之用。當?/etc/nologin 這個文件存在時,則所有一般使用者均無法再登陸系統了!若 /etc/nologin 存在,則一般使用者在登陸時, 在他們的終端機上會將該文件的內容顯示出來!所以,正常的情況下,這個文件應該是不能存在系統中的。 但這個模塊對 root 以及已經登陸系統中的一般賬號并沒有影響。

    • pam_selinux.so:
      SELinux 是個針對程序來進行細部管理權限的功能,SELinux 這玩意兒我們會在第十七章的時候再來詳細談論。由于 SELinux 會影響到用戶運行程序的權限,因此我們利用 PAM 模塊,將 SELinux 暫時關閉,等到驗證通過后, 再予以啟動!

    • pam_console.so:
      當系統出現某些問題,或者是某些時刻你需要使用特殊的終端接口 (例如 RS232 之類的終端聯機設備) 登陸主機時, 這個模塊可以幫助處理一些文件權限的問題,讓使用者可以透過特殊終端接口 (console) 順利的登陸系統。

    • pam_loginuid.so:
      我們知道系統賬號與一般賬號的 UID 是不同的!一般賬號 UID 均大于 500 才合理。 因此,為了驗證使用者的 UID 真的是我們所需要的數值,可以使用這個模塊來進行規范!

    • pam_env.so:
      用來配置環境變量的一個模塊,如果你有需要額外的環境變量配置,可以參考 /etc/security/pam_env.conf 這個文件的詳細說明。

    • pam_unix.so:
      這是個很復雜且重要的模塊,這個模塊可以用在驗證階段的認證功能,可以用在授權階段的賬號許可證管理, 可以用在會議階段的登錄文件記錄等,甚至也可以用在口令升級階段的檢驗!非常豐富的功能! 這個模塊在早期使用得相當頻繁喔!

    • pam_cracklib.so:
      可以用來檢驗口令的強度!包括口令是否在字典中,口令輸入幾次都失敗就斷掉此次聯機等功能,都是這模塊提供的! 這玩意兒很重要!

    • pam_limits.so:
      還記得我們在十一章談到的 ulimit?嗎? 其實那就是這個模塊提供的能力!還有更多細部的配置可以參考: /etc/security/limits.conf 內的說明。

    了解了這些模塊的大致功能后,言歸正傳,討論一下 login 的 PAM 驗證機制流程是這樣的:

  • 驗證階段 (auth):首先,(a)會先經過 pam_securetty.so 判斷,如果使用者是 root 時,則會參考 /etc/securetty 的配置; 接下來(b)經過 pam_env.so 配置額外的環境變量;再(c)透過 pam_unix.so 檢驗口令,若通過則回報 login 程序;若不通過則(d)繼續往下以 pam_succeed_if.so 判斷 UID 是否大于 500 ,若小于 500則回報失敗,否則再往下 (e)以 pam_deny.so 拒絕聯機。

  • 授權階段 (account):(a)先以 pam_nologin.so 判斷 /etc/nologin 是否存在,若存在則不許一般使用者登陸; (b)接下來以 pam_unix 進行賬號管理,再以 (c) pam_succeed_if.so 判斷 UID 是否小于 500 ,若小于 500 則不記錄登錄信息。(d)最后以 pam_permit.so 允許該賬號登陸。

  • 口令階段 (password):(a)先以 pam_cracklib.so 配置口令僅能嘗試錯誤 3 次;(b)接下來以 pam_unix.so 透過 md5, shadow 等功能進行口令檢驗,若通過則回報 login 程序,若不通過則 (c)以 pam_deny.so 拒絕登陸。

  • 會議階段 (session):(a)先以 pam_selinux.so 暫時關閉 SELinux;(b)使用 pam_limits.so 配置好用戶能夠操作的系統資源; (c)登陸成功后開始記錄相關信息在登錄文件中; (d)以 pam_loginuid.so 規范不同的 UID 權限;(e)開啟 pam_selinux.so 的功能。
  • 總之,就是依據驗證類別 (type) 來看,然后先由 login 的配置值去查閱,如果出現『 include system-auth 』 就轉到 system-auth 文件中的相同類別,去取得額外的驗證流程就是了。然后再到下一個驗證類別,最終將所有的驗證跑完! 就結束這次的 PAM 驗證啦!

    經過這樣的驗證流程,現在你知道為啥 /etc/nologin 存在會有問題,也會知道為何你使用一些遠程聯機機制時, 老是無法使用 root 登陸的問題了吧?沒錯!這都是 PAM 模塊提供的功能啦!

    例題: 為什么 root 無法以 telnet 直接登陸系統,但是卻能夠使用 ssh 直接登陸? 答: 一般來說, telnet 會引用 login 的 PAM 模塊,而 login 的驗證階段會有 /etc/securetty 的限制! 由于遠程聯機屬于 pts/n (n 為數字) 的動態終端機接口裝置名稱,并沒有寫入到 /etc/securetty , 因此 root 無法以 telnet 登陸遠程主機。至于 ssh 使用的是 /etc/pam.d/sshd 這個模塊, 你可以查閱一下該模塊,由于該模塊的驗證階段并沒有加入 pam_securetty ,因此就沒有 /etc/securetty 的限制!故可以從遠程直接聯機到服務器端。

    另外,關于 telnet 與 ssh 的細部說明,請參考鳥哥的 Linux 私房菜服務器篇

    其他相關文件

    除了前一小節談到的 /etc/securetty 會影響到 root 可登陸的安全終端機, /etc/nologin 會影響到一般使用者是否能夠登陸的功能之外,我們也知道 PAM 相關的配置文件在 /etc/pam.d , 說明文件在 /usr/share/doc/pam-(版本) ,模塊實際在 /lib/security/ 。那么還有沒有相關的 PAM 文件呢? 是有的,主要都在 /etc/security 這個目錄內!我們底下介紹幾個可能會用到的配置文件喔!


    • limits.conf

    我們在第十一章談到的?ulimit?功能中, 除了修改使用者的 ~/.bashrc 配置文件之外,其實系統管理員可以統一藉由 PAM 來管理的! 那就是 /etc/security/limits.conf 這個文件的配置了。這個文件的配置很簡單,你可以自行參考一下該文件內容。 我們這里僅作個簡單的介紹:

    范例一:vbird1 這個用戶只能創建 100MB 的文件,且大于 90MB 會警告 [root@www ~]# vi /etc/security/limits.conf vbird1 soft fsize 90000 vbird1 hard fsize 100000 #賬號 限制依據 限制項目 限制值 # 第一字段為賬號,或者是群組!若為群組則前面需要加上 @ ,例如 @projecta # 第二字段為限制的依據,是嚴格(hard),還是僅為警告(soft); # 第三字段為相關限制,此例中限制文件容量, # 第四字段為限制的值,在此例中單位為 KB。 # 若以 vbird1 登陸后,進行如下的操作則會有相關的限制出現![vbird1@www ~]$ ulimit -a ....(前面省略).... file size (blocks, -f) 90000 ....(后面省略).... [vbird1@www ~]$ dd if=/dev/zero of=test bs=1M count=110 File size limit exceeded [vbird1@www ~]$ ll -k test -rw-rw-r-- 1 vbird1 vbird1 90000 Mar 4 11:30 test # 果然有限制到了 范例二:限制 pro1 這個群組,每次僅能有一個用戶登陸系統 (maxlogins) [root@www ~]# vi /etc/security/limits.conf @pro1 hard maxlogins 1 # 如果要使用群組功能的話,這個功能似乎對初始群組才有效喔! # 而如果你嘗試多個 pro1 的登陸時,第二個以后就無法登陸了。 # 而且在 /var/log/secure 文件中還會出現如下的信息: # pam_limits(login:session): Too many logins (max 1) for pro1

    這個文件挺有趣的,而且是配置完成就生效了,你不用重新啟動任何服務的! 但是 PAM 有個特殊的地方,由于他是在程序呼叫時才予以配置的,因此你修改完成的數據, 對于已登陸系統中的用戶是沒有效果的,要等他再次登陸時才會生效喔!另外, 上述的配置請在測試完成后立刻批注掉,否則下次這兩個使用者登陸就會發生些許問題啦! ^_^


    • /var/log/secure, /var/log/messages

    如果發生任何無法登陸或者是產生一些你無法預期的錯誤時,由于 PAM 模塊都會將數據記載在 /var/log/secure 當中,所以發生了問題請務必到該文件內去查詢一下問題點!舉例來說, 我們在?limits.conf?的介紹內的范例二,就有談到多重登陸的錯誤可以到 /var/log/secure 內查閱了! 這樣你也就知道為何第二個 pro1 無法登陸啦!^_^


    Linux 主機上的用戶信息傳遞

    談了這么多的賬號問題,總是該要談一談,那么如何針對系統上面的用戶進行查詢吧? 想幾個狀態,如果你在 Linux 上面操作時,剛好有其他的用戶也登陸主機,你想要跟他對談,該如何是好? 你想要知道某個賬號的相關信息,該如何查閱?呼呼!底下我們就來聊一聊~


    查詢使用者: w, who, last, lastlog

    如何查詢一個用戶的相關數據呢?這還不簡單,我們之前就提過了?id,?finger?等命令了,都可以讓您了解到一個用戶的相關信息啦!那么想要知道使用者到底啥時候登陸呢? 最簡單可以使用 last 檢查啊!這個玩意兒我們也在?第十一章 bash?提過了, 您可以自行前往參考啊!簡單的很。

    Tips:
    早期的 Red Hat 系統的版本中, last 僅會列出當月的登陸者信息,不過在我們的 CentOS 5.x 版以后, last 可以列出從系統創建之后到目前為止的所有登陸者信息!這是因為登錄檔輪替的配置不同所致。 詳細的說明可以參考后續的第十九章登錄檔簡介。

    那如果你想要知道目前已登陸在系統上面的用戶呢?可以透過 w 或 who 來查詢喔!如下范例所示:

    [root@www ~]# w13:13:56 up 13:00, 1 user, load average: 0.08, 0.02, 0.01 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/1 192.168.1.100 11:04 0.00s 0.36s 0.00s -bash vbird1 pts/2 192.168.1.100 13:15 0.00s 0.06s 0.02s w # 第一行顯示目前的時間、啟動 (up) 多久,幾個用戶在系統上平均負載等; # 第二行只是各個項目的說明, # 第三行以后,每行代表一個使用者。如上所示,root 登陸并取得終端機名 pts/1 之意。[root@www ~]# who root pts/1 2009-03-04 11:04 (192.168.1.100) vbird1 pts/2 2009-03-04 13:15 (192.168.1.100)

    另外,如果您想要知道每個賬號的最近登陸的時間,則可以使用 lastlog 這個命令喔! lastlog 會去讀取 /var/log/lastlog 文件,結果將數據輸出如下表:

    [root@www ~]# lastlog Username Port From Latest root pts/1 192.168.1.100 Wed Mar 4 11:04:22 +0800 2009 bin **Never logged in** ....(中間省略).... vbird1 pts/2 192.168.1.100 Wed Mar 4 13:15:56 +0800 2009 ....(以下省略)....

    這樣就能夠知道每個賬號的最近登陸的時間啰~ ^_^


    使用者對談: write, mesg, wall

    那么我是否可以跟系統上面的用戶談天說地呢?當然可以啦!利用 write 這個命令即可。 write 可以直接將信息傳給接收者啰!舉例來說,我們的 Linux 目前有 vbird1 與 root 兩個人在在線, 我的 root 要跟 vbird1 講話,可以這樣做:

    [root@www ~]# write 使用者賬號 [用戶所在終端接口][root@www ~]# who root pts/1 2009-03-04 11:04 (192.168.1.100) vbird1 pts/2 2009-03-04 13:15 (192.168.1.100) <==有看到 vbird1 在在線[root@www ~]# write vbird1 pts/2 Hello, there: Please don't do anything wrong... <==這兩行是 root 寫的信息! # 結束時,請按下 [crtl]-d 來結束輸入。此時在 vbird1 的畫面中,會出現: Message from root@www.vbird.tsai on pts/1 at 13:23 ... Hello, there: Please don't do anything wrong... EOF

    怪怪~立刻會有信息響應給 vbird1 !不過......當時 vbird1 正在查數據,哇! 這些信息會立刻打斷 vbird1 原本的工作喔!所以,如果 vbird1 這個人不想要接受任何信息,直接下達這個動作:

    [vbird1@www ~]$ mesg n [vbird1@www ~]$ mesg is n

    不過,這個 mesg 的功能對 root 傳送來的信息沒有抵擋的能力!所以如果是 root 傳送信息, vbird1 還是得要收下。 但是如果 root 的 mesg 是 n 的,那么 vbird1 寫給 root 的信息會變這樣:

    [vbird1@www ~]$ write root write: root has messages disabled

    了解乎?如果想要解開的話,再次下達『 mesg y 』就好啦!想要知道目前的 mesg 狀態,直接下達『 mesg 』即可!瞭呼? 相對于 write 是僅針對一個使用者來傳『簡訊』,我們還可以『對所有系統上面的用戶傳送簡訊 (廣播)』哩~ 如何下達?用 wall 即可啊!他的語法也是很簡單的喔!

    [root@www ~]# wall "I will shutdown my linux server..."

    然后你就會發現所有的人都會收到這個簡訊呢!


    使用者郵件信箱: mail

    使用 wall, write 畢竟要等到使用者在在線才能夠進行,有沒有其他方式來聯絡啊? 不是說每個 Linux 主機上面的用戶都具有一個 mailbox 嗎? 我們可否寄信給使用者啊!呵呵!當然可以啊!我們可以寄、收 mailbox 內的信件呢! 一般來說, mailbox 都會放置在 /var/spool/mail 里面,一個賬號一個 mailbox (文件)。 舉例來說,我的 vbird1 就具有 /var/spool/mail/vbird1 這個 mailbox 喔!

    那么我該如何寄出信件呢?就直接使用 mail 這個命令即可!這個命令的用法很簡單的,直接這樣下達:『?mail username@localhost -s "郵件標題"?』即可! 一般來說,如果是寄給本機上的使用者,基本上,連『 @localhost 』都不用寫啦! 舉例來說,我以 root 寄信給 vbird1 ,信件標題是『 nice to meet you 』,則:

    [root@www ~]# mail vbird1 -s "nice to meet you" Hello, D.M. Tsai Nice to meet you in the network. You are so nice. byebye! . <==這里很重要喔,結束時,最后一行輸入小數點 . 即可! Cc: <==這里是所謂的『副本』,不需要寄給其他人,所以直接 [Enter] [root@www ~]# <==出現提示字符,表示輸入完畢了!

    如此一來,你就已經寄出一封信給 vbird1 這位使用者啰,而且,該信件標題為: nice to meet you,信件內容就如同上面提到的。不過,你或許會覺得 mail 這個程序不好用~ 因為在信件編寫的過程中,如果寫錯字而按下 Enter 進入次行,前一行的數據很難刪除ㄟ! 那怎么辦?沒關系啦!我們使用數據流重導向啊!呵呵!利用那個小于的符號 ( < ) 就可以達到取代鍵盤輸入的要求了。也就是說,你可以先用 vi 將信件內容編好, 然后再以 mail vbird1 -s "nice to meet you" < filename 來將文件內容傳輸即可。

    例題: 請將你的家目錄下的環境變量文件 (~/.bashrc) 寄給自己! 答: mail -s "bashrc file content" vbird < ~/.bashrc

    剛剛上面提到的是關于『寄信』的問題,那么如果是要收信呢?呵呵!同樣的使用 mail 啊! 假設我以 vbird1 的身份登陸主機,然后輸入 mail 后,會得到什么?

    [vbird1@www ~]$ mail Mail version 8.1 6/6/93. Type ? for help. "/var/spool/mail/vbird1": 1 message 1 new >N 1 root@www.vbird.tsai Wed Mar 4 13:36 18/663 "nice to meet you" & <==這里可以輸入很多的命令,如果要查閱,輸入 ? 即可!

    在 mail 當中的提示字符是 & 符號喔,別搞錯了~輸入 mail 之后,我可以看到我有一封信件, 這封信件的前面那個 > 代表目前處理的信件,而在大于符號的左邊那個 N 代表該封信件尚未讀過, 如果我想要知道這個 mail 內部的命令有哪些,可以在 & 之后輸入『 ? 』,就可以看到如下的畫面:

    & ?Mail Commands t <message list> type messages n goto and type next message e <message list> edit messages f <message list> give head lines of messages d <message list> delete messages s <message list> file append messages to file u <message list> undelete messages R <message list> reply to message senders r <message list> reply to message senders and all recipients pre <message list> make messages go back to /usr/spool/mail m <user list> mail to specific users q quit, saving unresolved messages in mbox x quit, do not remove system mailbox h print out active message headers ! shell escape cd [directory] chdir to directory or home if none given

    <message list> 指的是每封郵件的左邊那個數字啦!而幾個比較常見的命令是:

    命令意義
    h列出信件標頭;如果要查閱 40 封信件左右的信件標頭,可以輸入『 h 40 』
    d刪除后續接的信件號碼,刪除單封是『 d10 』,刪除 20~40 封則為『 d20-40 』。 不過,這個動作要生效的話,必須要配合 q 這個命令才行(參考底下說明)!
    s將信件儲存成文件。例如我要將第 5 封信件的內容存成 ~/mail.file:『s 5 ~/mail.file』
    x或者輸入 exit 都可以。這個是『不作任何動作離開 mail 程序』的意思。 不論你剛剛刪除了什么信件,或者讀過什么,使用 exit 都會直接離開 mail,所以剛剛進行的刪除與閱讀工作都會無效。 如果您只是查閱一下郵件而已的話,一般來說,建議使用這個離開啦!除非你真的要刪除某些信件。
    q相對于 exit 是不動作離開, q 則會進行兩項動作: 1. 將剛剛刪除的信件移出 mailbox 之外; 2. 將剛剛有閱讀過的信件存入 ~/mbox ,且移出 mailbox 之外。鳥哥通常不很喜歡使用 q 離開, 因為,很容易忘記讀過什么咚咚~導致信件給他移出 mailbox 說~

    由于讀過的信件若使用『 q 』來離開 mail 時,會將該信件移動到 ~/mbox 中,所以你可以這樣想象: /var/spool/mail/vbird1 為 vbird1 的『新件匣』,而 /home/vbird1/mbox 則為『收件匣』的意思。 那如何讀取 /home/vbird1/mbox 呢?就使用『mail -f /home/vbird1/mbox』即可。


    手動新增使用者

    一般來說,我們不很建議大家使用手動的方式來新增使用者,為什么呢? 因為使用者的創建涉及到 GID/UID 等權限的關系,而且,與文件/目錄的權限也有關系, 使用 useradd 可以幫我們自動配置好 UID/GID 家目錄以及家目錄相關的權限配置, 但是,手動來添加的時候,有可能會忘東忘西,結果導致一些困擾的發生。

    不過,要了解整個系統,最好還是手動來修改過比較好,至少我們的賬號問題可以完全依照自己的意思去修訂, 而不必遷就于系統的默認值啊!但是,還是要告誡一下朋友們,要手動配置賬號時, 您必須要真的很了解自己在作什么,尤其是與權限有關的配置方面喔!好吧!底下就讓我們來玩一玩啰~ ^_^


    一些檢查工具

    既然要手動修改賬號的相關配置文件,那么一些檢查群組、賬號相關的命令就不可不知道啊~ 尤其是那個口令轉換的 pwconv 及 pwuconv 這兩個玩意~可重要的很呢!底下我們稍微介紹一下這些命令吧!


    • pwck

    pwck 這個命令在檢查 /etc/passwd 這個賬號配置文件內的信息,與實際的家目錄是否存在等信息, 還可以比對 /etc/passwd /etc/shadow 的信息是否一致,另外,如果 /etc/passwd 內的數據字段錯誤時,會提示使用者修訂。 一般來說,我只是利用這個玩意兒來檢查我的輸入是否正確就是了。

    [root@www ~]# pwck user adm: directory /var/adm does not exist user uucp: directory /var/spool/uucp does not exist user gopher: directory /var/gopher does not exist

    瞧!上面僅是告知我,這些賬號并沒有家目錄,由于那些賬號絕大部分都是系統賬號, 確實也不需要家目錄的,所以,那是『正常的錯誤!』呵呵!不理他。 ^_^。 相對應的群組檢查可以使用 grpck 這個命令的啦!


    • pwconv

    這個命令主要的目的是在『將 /etc/passwd 內的賬號與口令,移動到 /etc/shadow 當中!』 早期的 Unix 系統當中并沒有 /etc/shadow 呢,所以,用戶的登陸口令早期是在 /etc/passwd 的第二欄,后來為了系統安全,才將口令數據移動到 /etc/shadow 內的。使用 pwconv 后,可以:

    • 比對 /etc/passwd 及 /etc/shadow ,若 /etc/passwd 內存在的賬號并沒有對應的 /etc/shadow 口令時,則 pwconv 會去 /etc/login.defs 取用相關的口令數據,并創建該賬號的 /etc/shadow 數據;

    • 若 /etc/passwd 內存在加密后的口令數據時,則 pwconv 會將該口令欄移動到 /etc/shadow 內,并將原本的 /etc/passwd 內相對應的口令欄變成 x !

    一般來說,如果您正常使用 useradd 添加使用者時,使用 pwconv 并不會有任何的動作,因為 /etc/passwd 與 /etc/shadow 并不會有上述兩點問題啊! ^_^。不過,如果手動配置賬號,這個 pwconv 就很重要啰!


    • pwunconv

    相對于 pwconv , pwunconv 則是『將 /etc/shadow 內的口令欄數據寫回 /etc/passwd 當中, 并且刪除 /etc/shadow 文件。』這個命令說實在的,最好不要使用啦! 因為他會將你的 /etc/shadow 刪除喔!如果你忘記備份,又不會使用 pwconv 的話,粉嚴重呢!


    • chpasswd

    chpasswd 是個挺有趣的命令,他可以『讀入未加密前的口令,并且經過加密后, 將加密后的口令寫入 /etc/shadow 當中。』這個命令很常被使用在大量建置賬號的情況中喔! 他可以由 Standard input 讀入數據,每筆數據的格式是『 username:password 』。 舉例來說,我的系統當中有個用戶賬號為 dmtsai ,我想要升級他的口令 (update) , 假如他的口令是 abcdefg 的話,那么我可以這樣做:

    [root@www ~]# echo "dmtsai:abcdefg" | chpasswd -m

    神奇吧!這樣就可以升級了呢!在默認的情況中, chpasswd 使用的是 DES 加密方法來加密, 我們可以使用 chpasswd -m 來使用 CentOS 5.x 默認的 MD5 加密方法。這個命令雖然已經很好用了,不過 CentOS 5.x 其實已經提供了『 passwd --stdin 』的選項,老實說,這個 chpasswd 可以不必使用了。但考慮其他版本不見得會提供 --stdin 給 passwd 這個命令,所以您還是得要了解一下這個命令用途!


    特殊賬號,如純數字賬號的手工創建

    在我們了解了 UID/GID 與賬號的關系之后,基本上,您應該了解了,為啥我們不建議使用純數字的賬號了!因為很多時候,系統會搞不清楚那組數字是『賬號』還是『 UID 』,這不是很好啦~也因此,在早期某些版本底下,是沒有辦法使用數字來創建賬號的。例如在 Red Hat 9 的環境中, 使用『 useradd 1234 』他會顯示『 useradd: invalid user name '1234' 』了解了嗎?

    Tips:
    在較新的 distribution 當中,純數字的賬號已經可以被 useradd 創建了。不過鳥哥還是非常不建議使用純數字賬號。 例如在 setfacl 的配置值中,若使用『 setfacl -m u:501:rwx filename 』那個 501 代表的是 UID 還是賬號? 因為 setfacl 的配置是支持使用 UID 或賬號的,純數字賬號很容易造成系統的誤解!

    不過,有的時候,長官的命令難為啊 @_@ 有時還是得要創建這方面的賬號的,那該如何是好? 呵呵!當然可以手動來創建這樣的賬號啦!不過,為了系統安全起見,鳥哥還是不建議使用純數字的賬號的啦! 因此,底下的范例當中,我們使用手動的方式來創建一個名為 normaluser 的賬號, 而且這個賬號屬于 normalgroup 這個群組。OK!那么整個步驟該如何是好呢? 由前面的說明來看,您應該了解了賬號與群組是與 /etc/group, /etc/shadow, /etc/passwd, /etc/gshadow 有關,因此,整個動作是這樣的:

  • 先創建所需要的群組 ( vi /etc/group );
  • 將 /etc/group 與 /etc/gshadow 同步化 ( grpconv );
  • 創建賬號的各個屬性 ( vi /etc/passwd );
  • 將 /etc/passwd 與 /etc/shadow 同步化 ( pwconv );
  • 創建該賬號的口令 ( passwd accountname );
  • 創建用戶家目錄 ( cp -a /etc/skel /home/accountname );
  • 更改用戶家目錄的屬性 ( chown -R accountname.group /home/accountname )。
  • 夠簡單的咯吧!讓我們來玩一玩啰~
    1. 創建群組 normalgroup ,假設 520 這個 GID 沒有被使用!并且同步化 gshadow [root@www ~]# vi /etc/group # 在最后一行加入底下這一行! normalgroup:x:520: [root@www ~]# grpconv [root@www ~]# grep 'normalgroup' /etc/group /etc/gshadow /etc/group:normalgroup:x:520: /etc/gshadow:normalgroup:x:: # 最后確定 /etc/group, /etc/gshadow 都存在這個群組才行!搞定群組啰! 2. 創建 normaluser 這個賬號,假設 UID 700 沒被使用掉! [root@www ~]# vi /etc/passwd # 在最后一行加入底下這一行! normaluser:x:700:520::/home/normaluser:/bin/bash 3. 同步化口令,并且創建該用戶的口令 [root@www ~]# pwconv [root@www ~]# grep 'normaluser' /etc/passwd /etc/shadow /etc/passwd:normaluser:x:700:520::/home/normaluser:/bin/bash /etc/shadow:normaluser:x:14307:0:99999:7::: # 確定 /etc/passwd, /etc/shadow 都含有 normaluser 的信息了!但是口令還不對~ [root@www ~]# passwd normaluser Changing password for user normaluser. New UNIX password: Retype new UNIX password: passwd: all authentication tokens updated successfully. 4. 創建用戶家目錄,并且修訂權限! [root@www ~]# cp -a /etc/skel /home/normaluser [root@www ~]# chown -R normaluser:normalgroup /home/normaluser [root@www ~]# chmod 700 /home/normaluser

    別懷疑!這樣就搞定了一個賬號的配置了! 從此以后,你可以創建任何名稱的賬號啰~不過,還是不建議您配置一些很怪很怪的賬號名稱啦!


    大量建置賬號范本(適用 passwd --stdin 選項)

    由于 CentOS 5.x 的 passwd 已經提供了 --stdin 的功能,因此如果我們可以提供賬號口令的話, 那么就能夠很簡單的建置起我們的賬號口令了。底下鳥哥制作一個簡單的 script 來運行新增用戶的功能喔!

    [root@www ~]# vi account1.sh #!/bin/bash # 這支程序用來創建新增賬號,功能有: # 1. 檢查 account1.txt 是否存在,并將該文件內的賬號取出; # 2. 創建上述文件的賬號; # 3. 將上述賬號的口令修訂成為『強制第一次進入需要修改口令』的格式。 # 2009/03/04 VBird export PATH=/bin:/sbin:/usr/bin:/usr/sbin# 檢查 account1.txt 是否存在 if [ ! -f account1.txt ]; thenecho "所需要的賬號文件不存在,請創建 account1.txt ,每行一個賬號名稱"exit 1 fiusernames=$(cat account1.txt)for username in $usernames douseradd $username <==新增賬號echo $username | passwd --stdin $username <==與賬號相同的口令chage -d 0 $username <==強制登陸修改口令 done

    接下來只要創建 account1.txt 這個文件即可!鳥哥創建這個文件里面共有十行,你可以自行創建該文件! 內容每一行一個賬號。注意,最終的結果會是每個賬號具有與賬號相同的口令,且初次登陸后, 必須要重新配置口令后才能夠再次登陸使用系統資源!

    [root@www ~]# vi account1.txt std01 std02 std03 std04 std05 std06 std07 std08 std09 std10[root@www ~]# sh account1.sh Changing password for user std01. passwd: all authentication tokens updated successfully. ....(后面省略)....

    這支簡單的腳本你可以在按如下的連結下載:

    • http://cn.linux.vbird.org/linux_basic/0410accountmanager/account1.sh

    另外,鳥哥的 script 是在 zh_TW.big5 的語系下創建的,如果你需要轉成萬國碼 (utf8) 的編碼格式, 請下載上述文件后,利用第十章談到的 iconv?來處理語系的問題!


    大量建置賬號的范例(適用于連續數字,如學號)

    前一小節的內容已經可以滿足很多朋友的賬號建置方法了,不過,某些時候上述的 script 還是很麻煩! 因為需要手動編輯 account1.txt 嘛!如果是類似學校單位這種學號非常類似的賬號時,有沒有更快的方案? 此外,如果需要每個班級同屬于一個群組,不同班級的群組不同,又該如何建置?這是比較麻煩啦!

    目前很多網站都有提供大量創建賬號的工具,例如臺南縣網中心的臥龍大師:

    • http://news.ols3.net/techdoc/old/howtouse_cmpwd101.htm

    提供的好用的 cmpwd 程序,但是小三大師的程序僅供學術單位使用,一般個人是無權使用的(參考上述連結的授權)。 不過,其實我們也可以利用簡單的 script 來幫我們達成喔!例如底下這支程序, 他的運行結果與小三大師提供的程序差不多啦~但是因為我是直接以 useradd 來新增的, 所以,即使不了解 UID ,也是可以適用的啦~整支程序的特色是:

    • 默認不允許使用純數字方式創建賬號;
    • 可加入年級來區分賬號;
    • 可配置賬號的起始號碼與賬號數量;
    • 有兩種口令創建方式,可以與賬號相同或程序自行以隨機數創建口令文件。

    運行方法也簡單的要命~請自行參考的啦!不再多說~使用時請注意,不要在公家使用的主機上面進行測試,因為..... 這支程序會大量創建賬號嘛!^_^

    #!/bin/bash # # 這支程序主要在幫您創建大量的賬號之用,更多的使用方法請參考: # http://cn.linux.vbird.org/linux_basic/0410accountmanager.php#manual_amount # # 本程序為鳥哥自行開發,在 CentOS 5.x 上使用沒有問題, # 但不保證絕不會發生錯誤!使用時,請自行負擔風險~ # # History: # 2005/09/05 VBird 剛剛才寫完,使用看看先~ # 2009/03/04 VBird 加入一些語系的修改與說明,修改口令產生方式 (用 openssl) export LANG=zh_TW.big5 export PATH=/sbin:/usr/sbin:/bin:/usr/bin accountfile="user.passwd"# 1. 進行賬號相關的輸入先! echo "" echo "例如我們昆山四技的學號為: 4960c001 到 4960c060 ,那么:" echo "賬號開頭代碼為 :4" echo "賬號層級或年級為 :960c" echo "號碼數字位數為(001~060):3" echo "賬號開始號碼為 :1" echo "賬號數量為 :60" echo "" read -p "賬號開頭代碼 ( Input title name, ex> std )======> " username_start read -p "賬號層級或年級 ( Input degree, ex> 1 or enter )=> " username_degree read -p "號碼部分的數字位數 ( Input \# of digital )======> " nu_nu read -p "起始號碼 ( Input start number, ex> 520 )========> " nu_start read -p "賬號數量 ( Input amount of users, ex> 100 )=====> " nu_amount read -p "口令標準 1) 與賬號相同 2)隨機數自定義 ==============> " pwm if [ "$username_start" == "" ]; thenecho "沒有輸入開頭的代碼,不給你運行哩!" ; exit 1 fi # 判斷數字系統 testing0=$(echo $nu_nu | grep '[^0-9]' ) testing1=$(echo $nu_amount | grep '[^0-9]' ) testing2=$(echo $nu_start | grep '[^0-9]' ) if [ "$testing0" != "" -o "$testing1" != "" -o "$testing2" != "" ]; thenecho "輸入的號碼不對啦!有非為數字的內容!" ; exit 1 fi if [ "$pwm" != "1" ]; thenpwm="2" fi# 2. 開始輸出賬號與口令文件! [ -f "$accountfile" ] && mv $accountfile "$accountfile"$(date +%Y%m%d) nu_end=$(($nu_start+$nu_amount-1)) for (( i=$nu_start; i<=$nu_end; i++ )) donu_len=${#i}if [ $nu_nu -lt $nu_len ]; thenecho "數值的位數($i->$nu_len)已經比你配置的位數($nu_nu)還大!"echo "程序無法繼續"exit 1finu_diff=$(( $nu_nu - $nu_len ))if [ "$nu_diff" != "0" ]; thennu_nn=0000000000nu_nn=${nu_nn:1:$nu_diff}fiaccount=${username_start}${username_degree}${nu_nn}${i}if [ "$pwm" == "1" ]; thenpassword="$account"elsepassword=$(openssl rand -base64 6)fiecho "$account":"$password" | tee -a "$accountfile" done# 3. 開始創建賬號與口令! cat "$accountfile" | cut -d':' -f1 | xargs -n 1 useradd -m chpasswd < "$accountfile" pwconv echo "OK!創建完成!"

    如果有需要創建同一班級具有同一群組的話,可以先使用?groupadd?創建群組后, 將該群組加入『 cat "$accountfile" | cut -d':' -f1 | xargs -n 1 useradd -m?-g groupname?』那行!這支腳本可以在底下連結下載:

    • http://cn.linux.vbird.org/linux_basic/0410accountmanager/account2.sh

    如果僅是測試而已,想要將剛剛創建的使用者整個刪除,則可以使用如下的腳本來進行刪除!

    [root@www ~]# vi delaccount2.sh #!/bin/bash usernames=$(cat user.passwd | cut -d ':' -f 1) for username in $usernames doecho "userdel -r $username"userdel -r $username done [root@www ~]# sh delaccount2.sh

    總之,賬號管理是很重要的!希望上面的說明能夠對大家有點幫助啦!


    重點回顧

    • Linux 操作系統上面,關于賬號與群組,其實記錄的是 UID/GID 的數字而已;
    • 使用者的賬號/群組與 UID/GID 的對應,參考 /etc/passwd 及 /etc/group 兩個文件
    • /etc/passwd 文件結構以冒號隔開,共分為七個字段,分別是『賬號名稱、口令、UID、GID、全名、家目錄、shell』
    • UID 只有 0 與非為 0 兩種,非為 0 則為一般賬號。一般賬號又分為系統賬號 (1~499) 即可登陸者賬號 (大于 500)
    • 賬號的口令已經移動到 /etc/shadow 文件中,該文件權限為僅有 root 可以更動。該文件分為九個字段,內容為『 賬號名稱、加密口令、口令更動日期、口令最小可變動日期、口令最大需變動日期、口令過期前警告日數、口令失效天數、 賬號失效日、保留未使用』
    • 使用者可以支持多個群組,其中在新建文件時會影響新文件群組者,為有效群組。而寫入 /etc/passwd 的第四個字段者, 稱為初始群組。
    • 與使用者創建、更改參數、刪除有關的命令為:useradd, usermod, userdel等,口令創建則為 passwd;
    • 與群組創建、修改、刪除有關的命令為:groupadd, groupmod, groupdel 等;
    • 群組的觀察與有效群組的切換分別為:groups 及 newgrp 命令;
    • useradd 命令作用參考的文件有: /etc/default/useradd, /etc/login.defs, /etc/skel/ 等等
    • 觀察用戶詳細的口令參數,可以使用『 chage -l 賬號 』來處理;
    • 用戶自行修改參數的命令有: chsh, chfn 等,觀察命令則有: id, finger 等
    • ACL 可進行單一個人或群組的權限管理,但 ACL 的啟動需要有文件系統的支持;
    • ACL 的配置可使用 setfacl ,查閱則使用 getfacl ;
    • 身份切換可使用 su ,亦可使用 sudo ,但使用 sudo 者,必須先以 visudo 配置可使用的命令;
    • PAM 模塊可進行某些程序的驗證程序!與 PAM 模塊有關的配置文件位于 /etc/pam.d/* 及 /etc/security/*
    • 系統上面賬號登陸情況的查詢,可使用 w, who, last, lastlog 等;
    • 在線與使用者交談可使用 write, wall,脫機狀態下可使用 mail 傳送郵件!

    本章習題

    • 情境模擬題一:想將本服務器的賬號分開管理,分為單純郵件使用,與可登陸系統賬號兩種。其中若為純郵件賬號時, 將該賬號加入 mail 為初始群組,且此賬號不可使用 bash 等 shell 登陸系統。若為可登陸賬號時, 將該賬號加入 youcan 這個次要群組。

      • 目標:了解 /sbin/nologin 的用途;
      • 前提:可自行觀察使用者是否已經創建等問題;
      • 需求:需已了解 useradd, groupadd 等命令的用法;

      解決方案如下:

    • 預先察看一下兩個群組是否存在?
      [root@www ~]# grep mail /etc/group [root@www ~]# grep youcan /etc/group [root@www ~]# groupadd youcan
      可發現 youcan 尚未被創建,因此如上表所示,我們主動去創建這個群組啰。

    • 開始創建三個郵件賬號,此賬號名稱為 pop1, pop2, pop3 ,且口令與賬號相同。可使用如下的程序來處理:
      [root@www ~]# vim popuser.sh #!/bin/bash for username in pop1 pop2 pop3 douseradd -g mail -s /sbin/nologin -M $usernameecho $username | passwd --stdin $username done [root@www ~]# sh popuser.sh
    • 開始創建一般賬號,只是這些一般賬號必須要能夠登陸,并且需要使用次要群組的支持!所以:
      [root@www ~]# vim loginuser.sh #!/bin/bash for username in youlog1 youlog2 youlog3 douseradd -G youcan -s /bin/bash -m $usernameecho $username | passwd --stdin $username done [root@www ~]# sh loginuser.sh
    • 這樣就將賬號分開管理了!非常簡單吧!

    簡答題部分
    • root 的 UID 與 GID 是多少?而基于這個理由,我要讓 test 這個賬號具有 root 的權限,應該怎么作? root 的 UID 與 GID 均為 0 ,所以要讓 test 變成 root 的權限,那么就將 /etc/passwd 里面, test 的 UID 與 GID 字段變成 0 即可!
    • 假設我是一個系統管理員,我有一個用戶最近不乖,所以我想暫時將他的賬號停掉, 讓他近期無法進行任何動作,等到未來他乖一點之后,我再將他的賬號激活,請問:我可以怎么作比較好?? 由于這個賬號是暫時失效的,所以不能使用 userdel 來刪除,否則很麻煩!那么應該如何配置呢?再回去瞧一瞧 /etc/shadow 的架構,可以知道有這幾個可使用的方法:
      • 將 /etc/passwd 的 shell 字段寫成 /sbin/nologin ,即可讓該賬號暫時無法登陸主機;
      • 將 /etc/shadow 內的口令字段,添加一個 * 號在最前面,這樣該賬號亦無法登陸!
      • 將 /etc/shadow 的第八個字段關于賬號取消日期的那個,配置小于目前日期的數字,那么他就無法登陸系統了!
    • 我在使用 useradd 的時候,新增的賬號里面的 UID, GID 還有其他相關的口令控制,都是在哪幾個文件里面配置的? 在 /etc/login.defs 還有 /etc/default/useradd 里面規定好的!
    • 我希望我在配置每個賬號的時候( 使用 useradd ),默認情況中,他們的家目錄就含有一個名稱為 www 的子目錄,我應該怎么作比較好? 由于使用 useradd 的時候,會自動以 /etc/skel 做為默認的家目錄,所以,我可以在 /etc/skel 里面新添加一個名稱為 www 的目錄即可!
    • 簡單說明系統賬號與一般用戶賬號的差別? 一般而言,為了讓系統能夠順利以較小的權限運行,系統會有很多賬號, 例如 mail, bin, adm 等等。而為了確保這些賬號能夠在系統上面具有獨一無二的權限, 一般來說 Linux 都會保留一些 UID 給系統使用。在 CentOS 5.x 上面,小于 500 以下的賬號 (UID) 即是所謂的 System account。
    • 簡單說明,為何 CentOS 5.x 創建使用者時,他會主動的幫使用者創建一個群組,而不是使用 /etc/default/useradd 的配置? 不同的 linux distributions 對于使用者 group 的創建機制并不相同。主要的機制分為:
      • Public group schemes: 用戶將會直接給予一個系統指定的群組,一般來說即是 users , 可以 SuSE Server 9 為代表;
      • Private group schemes: 系統會創建一個與賬號一樣的組名!以 CentOS 5.x 為例!
    • 如何創建一個使用者名稱 alex, 他所屬群組為 alexgroup, 預計使用 csh, 他的全名為 "Alex Tsai", 且他還得要加入 users 群組當中! groupadd alexgroup
      useradd -c "Alex Tsai" -g alexgroup -G users -m alex
      務必先創建群組,才能夠創建使用者喔!
    • 由于種種因素,導致你的用戶家目錄以后都需要被放置到 /account 這個目錄下。 請問,我該如何作,可以讓使用 useradd 時,默認的家目錄就指向 /account ? 最簡單的方法,編輯 /etc/default/useradd ,將里頭的 HOME=/home 改成 HOME=/account 即可。
    • 我想要讓 dmtsai 這個使用者,加入 vbird1, vbird2, vbird3 這三個群組,且不影響 dmtsai 原本已經支持的次要群組時,該如何動作? usermod -a -G vbird1,vbird2,vbird3 dmtsai

    參考數據與延伸閱讀

    • 注1:最完整與詳細的口令文件說明,可參考各 distribution 內部的 man page。 本文中以 CentOS 5.x 的『 man 5 passwd 』及『 man 5 shadow 』的內容說明;
    • 注2:MD5與DES均為加密的機制,詳細的解釋可參考維基百科的說明:
      MD5:http://zh.wikipedia.org/wiki/MD5
      DES:http://en.wikipedia.org/wiki/Data_Encryption_Standard
      在早期的 Linux 版本中,主要使用 DES 加密算法,近期則使用 MD5 作為默認算法。
    • 注3:telnet 與 ssh 都是可以由遠程用戶主機聯機到 Linux 服務器的一種機制!詳細數據可查詢鳥站文章: 遠程聯機服務器:http://cn.linux.vbird.org/linux_server/0310telnetssh.php
    • 注4:詳細的說明請參考 man sudo ,然后以 5 作為關鍵詞搜尋看看即可了解。
    • 注5:詳細的 PAM 說明可以參考如下連結:
      維基百科:http://en.wikipedia.org/wiki/Pluggable_Authentication_Modules
      Linux-PAM網頁:?http://www.kernel.org/pub/linux/libs/pam/

    轉載于:https://www.cnblogs.com/ajgwusai/p/8097689.html

    總結

    以上是生活随笔為你收集整理的Linux 账号管理与 ACL 权限配置的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    玩弄人妻少妇500系列视频 | 国产熟女一区二区三区四区五区 | 国产亚洲精品久久久久久国模美 | 在线精品亚洲一区二区 | 精品一二三区久久aaa片 | 精品国产精品久久一区免费式 | 久久久无码中文字幕久... | 欧美高清在线精品一区 | 亚洲自偷自偷在线制服 | 日产精品高潮呻吟av久久 | 自拍偷自拍亚洲精品被多人伦好爽 | 亚洲综合久久一区二区 | 一本久久a久久精品vr综合 | 草草网站影院白丝内射 | 综合网日日天干夜夜久久 | 夜夜夜高潮夜夜爽夜夜爰爰 | 好男人www社区 | a片免费视频在线观看 | 国产明星裸体无码xxxx视频 | 男女猛烈xx00免费视频试看 | 无码国产激情在线观看 | a国产一区二区免费入口 | 亚洲色大成网站www国产 | 黄网在线观看免费网站 | 国产成人精品无码播放 | 欧美怡红院免费全部视频 | 国产精品99爱免费视频 | 国产精品视频免费播放 | 亚洲国产精品毛片av不卡在线 | 最新国产乱人伦偷精品免费网站 | 亚洲天堂2017无码 | 国产午夜无码视频在线观看 | 国产午夜亚洲精品不卡下载 | 在线成人www免费观看视频 | 荫蒂被男人添的好舒服爽免费视频 | 伊人久久大香线蕉av一区二区 | 日本高清一区免费中文视频 | 久久综合狠狠综合久久综合88 | 漂亮人妻洗澡被公强 日日躁 | 中文无码精品a∨在线观看不卡 | 狂野欧美性猛xxxx乱大交 | 18黄暴禁片在线观看 | 欧美丰满熟妇xxxx | 午夜肉伦伦影院 | 亚洲一区二区三区国产精华液 | 亚洲熟妇色xxxxx欧美老妇y | 亚洲中文字幕无码中文字在线 | 亚洲一区二区三区四区 | 久久熟妇人妻午夜寂寞影院 | 内射老妇bbwx0c0ck | 精品日本一区二区三区在线观看 | 中文字幕无码免费久久99 | 亚洲精品久久久久久一区二区 | 久久99国产综合精品 | 国产99久久精品一区二区 | 亚洲人成人无码网www国产 | 女高中生第一次破苞av | 午夜男女很黄的视频 | 无套内谢的新婚少妇国语播放 | 无码国产色欲xxxxx视频 | 亚洲天堂2017无码中文 | 亚洲日韩一区二区三区 | 国内精品久久毛片一区二区 | 亚洲 激情 小说 另类 欧美 | 无码av最新清无码专区吞精 | 亚洲va欧美va天堂v国产综合 | 成人精品天堂一区二区三区 | 亚洲精品一区二区三区四区五区 | 亚洲毛片av日韩av无码 | 中文字幕乱码人妻二区三区 | 亚洲综合精品香蕉久久网 | 一个人免费观看的www视频 | 亚洲色偷偷男人的天堂 | 国产在线无码精品电影网 | 乱人伦人妻中文字幕无码 | 一本大道久久东京热无码av | 99久久精品午夜一区二区 | 久久视频在线观看精品 | 荡女精品导航 | 亚洲s色大片在线观看 | 亚洲中文字幕乱码av波多ji | 伊人久久大香线蕉av一区二区 | 亚洲欧美日韩成人高清在线一区 | 中国女人内谢69xxxx | 撕开奶罩揉吮奶头视频 | 午夜精品久久久内射近拍高清 | 精品久久久久香蕉网 | 在线欧美精品一区二区三区 | 99久久精品午夜一区二区 | 日本大香伊一区二区三区 | 18禁黄网站男男禁片免费观看 | 内射巨臀欧美在线视频 | 久久久国产精品无码免费专区 | 色情久久久av熟女人妻网站 | 国产精品二区一区二区aⅴ污介绍 | 久久亚洲国产成人精品性色 | 亚洲国产精华液网站w | 丰满人妻翻云覆雨呻吟视频 | 日韩成人一区二区三区在线观看 | 国产一区二区三区精品视频 | 国产无遮挡吃胸膜奶免费看 | 亚洲国产精品无码一区二区三区 | 奇米影视7777久久精品人人爽 | 色一情一乱一伦一区二区三欧美 | 国产无遮挡又黄又爽免费视频 | 中文字幕人成乱码熟女app | 国产 浪潮av性色四虎 | 日韩精品无码一本二本三本色 | 少妇无码一区二区二三区 | 青青久在线视频免费观看 | 巨爆乳无码视频在线观看 | 巨爆乳无码视频在线观看 | 欧美亚洲日韩国产人成在线播放 | 国产精品久久久一区二区三区 | 欧美变态另类xxxx | 高中生自慰www网站 | 久久久久免费看成人影片 | 成人片黄网站色大片免费观看 | 国产精品沙发午睡系列 | 国产va免费精品观看 | 欧美熟妇另类久久久久久多毛 | 成人三级无码视频在线观看 | 18无码粉嫩小泬无套在线观看 | a在线亚洲男人的天堂 | 亚洲精品成a人在线观看 | 亚洲精品国产精品乱码视色 | 亚洲中文字幕va福利 | 天堂亚洲2017在线观看 | 亚洲乱亚洲乱妇50p | 国产一精品一av一免费 | 精品国产一区二区三区四区 | 乱码av麻豆丝袜熟女系列 | 蜜桃臀无码内射一区二区三区 | 亚洲日韩乱码中文无码蜜桃臀网站 | 国产精品高潮呻吟av久久4虎 | 久久久精品国产sm最大网站 | 人人爽人人爽人人片av亚洲 | 久久国产精品_国产精品 | 亚洲成a人片在线观看日本 | 性色欲网站人妻丰满中文久久不卡 | 麻豆果冻传媒2021精品传媒一区下载 | 影音先锋中文字幕无码 | 国产69精品久久久久app下载 | 永久黄网站色视频免费直播 | 1000部啪啪未满十八勿入下载 | 国产网红无码精品视频 | 国产熟女一区二区三区四区五区 | 免费观看又污又黄的网站 | 久久久av男人的天堂 | 亚洲国产精品无码久久久久高潮 | 久久久精品国产sm最大网站 | 亚洲综合在线一区二区三区 | 亚洲 激情 小说 另类 欧美 | 97色伦图片97综合影院 | 丰满妇女强制高潮18xxxx | 亚洲中文字幕无码中文字在线 | 国产熟妇高潮叫床视频播放 | 俺去俺来也在线www色官网 | 精品久久久无码中文字幕 | 又黄又爽又色的视频 | 中文字幕乱码人妻无码久久 | 兔费看少妇性l交大片免费 | 亚洲自偷精品视频自拍 | 内射后入在线观看一区 | 九九久久精品国产免费看小说 | 亚洲国产精品无码久久久久高潮 | 欧美日韩精品 | 欧美35页视频在线观看 | 欧美丰满熟妇xxxx性ppx人交 | 亚洲综合在线一区二区三区 | 东京热一精品无码av | 黑森林福利视频导航 | 人人妻人人藻人人爽欧美一区 | 国产精品高潮呻吟av久久4虎 | 伊人久久大香线蕉av一区二区 | 男人扒开女人内裤强吻桶进去 | 美女张开腿让人桶 | 亚洲天堂2017无码 | 亚洲国产精品成人久久蜜臀 | 国产艳妇av在线观看果冻传媒 | 乱人伦中文视频在线观看 | 麻豆人妻少妇精品无码专区 | 亚洲成在人网站无码天堂 | www一区二区www免费 | 中文字幕av无码一区二区三区电影 | 精品国产麻豆免费人成网站 | 狠狠躁日日躁夜夜躁2020 | 亚洲精品久久久久久久久久久 | 中文字幕乱码亚洲无线三区 | 大肉大捧一进一出视频出来呀 | 麻豆国产人妻欲求不满谁演的 | 亚洲区小说区激情区图片区 | 亚洲欧美日韩成人高清在线一区 | 欧美性色19p | 影音先锋中文字幕无码 | 亚洲男人av天堂午夜在 | 亚洲欧洲中文日韩av乱码 | 日韩精品无码免费一区二区三区 | 久久99久久99精品中文字幕 | 午夜免费福利小电影 | 中文字幕无码av波多野吉衣 | 久久综合久久自在自线精品自 | 亚洲一区二区三区在线观看网站 | 国产乱码精品一品二品 | 亚洲爆乳精品无码一区二区三区 | 99久久精品无码一区二区毛片 | 国产人妻大战黑人第1集 | 色欲久久久天天天综合网精品 | 免费国产黄网站在线观看 | 无码帝国www无码专区色综合 | 国产性生交xxxxx无码 | 久激情内射婷内射蜜桃人妖 | 亚洲精品国偷拍自产在线麻豆 | 欧洲欧美人成视频在线 | 狠狠色丁香久久婷婷综合五月 | 福利一区二区三区视频在线观看 | ass日本丰满熟妇pics | 又大又紧又粉嫩18p少妇 | 在教室伦流澡到高潮hnp视频 | 乌克兰少妇xxxx做受 | av小次郎收藏 | 亚洲中文无码av永久不收费 | 国产一精品一av一免费 | 成人动漫在线观看 | 日日麻批免费40分钟无码 | 精品欧洲av无码一区二区三区 | 国产又粗又硬又大爽黄老大爷视 | 狠狠色色综合网站 | 国产特级毛片aaaaaa高潮流水 | 又大又黄又粗又爽的免费视频 | 丝袜人妻一区二区三区 | 男女猛烈xx00免费视频试看 | 狂野欧美性猛xxxx乱大交 | 国产性生大片免费观看性 | 日本爽爽爽爽爽爽在线观看免 | 日日麻批免费40分钟无码 | 四虎国产精品免费久久 | 久久久av男人的天堂 | 大屁股大乳丰满人妻 | 亚洲中文字幕在线无码一区二区 | 夜夜影院未满十八勿进 | 国内精品人妻无码久久久影院蜜桃 | 大屁股大乳丰满人妻 | 装睡被陌生人摸出水好爽 | 婷婷丁香五月天综合东京热 | 国产尤物精品视频 | 99视频精品全部免费免费观看 | 我要看www免费看插插视频 | 欧美乱妇无乱码大黄a片 | 少妇厨房愉情理9仑片视频 | 小鲜肉自慰网站xnxx | 最近中文2019字幕第二页 | 免费无码av一区二区 | 国产激情无码一区二区 | 人人澡人人妻人人爽人人蜜桃 | 欧美国产日产一区二区 | 亚洲精品美女久久久久久久 | 女人被爽到呻吟gif动态图视看 | 亚洲欧美国产精品专区久久 | 久久亚洲精品中文字幕无男同 | 成人影院yy111111在线观看 | 亚洲国产综合无码一区 | 亚洲日韩乱码中文无码蜜桃臀网站 | 久久久精品人妻久久影视 | 亚洲中文字幕无码一久久区 | 午夜时刻免费入口 | 性开放的女人aaa片 | 18精品久久久无码午夜福利 | 国产欧美亚洲精品a | 国产成人精品久久亚洲高清不卡 | 东京热无码av男人的天堂 | 又大又硬又黄的免费视频 | 国产精品对白交换视频 | 中文字幕色婷婷在线视频 | 男人和女人高潮免费网站 | 国产亚洲美女精品久久久2020 | www国产亚洲精品久久网站 | 青青青爽视频在线观看 | 在线欧美精品一区二区三区 | 六月丁香婷婷色狠狠久久 | 精品久久久久香蕉网 | 黑人粗大猛烈进出高潮视频 | 亚洲熟女一区二区三区 | 国产无套粉嫩白浆在线 | 亚洲狠狠色丁香婷婷综合 | 97久久精品无码一区二区 | 人人妻人人澡人人爽人人精品浪潮 | 久久99精品久久久久久动态图 | 老熟女乱子伦 | 亚洲日韩精品欧美一区二区 | 伊人久久大香线焦av综合影院 | 少妇无码av无码专区在线观看 | 小鲜肉自慰网站xnxx | 人人妻人人澡人人爽欧美一区九九 | 国产人妖乱国产精品人妖 | 日韩成人一区二区三区在线观看 | 国产av一区二区精品久久凹凸 | 午夜精品一区二区三区的区别 | 波多野结衣 黑人 | 天天躁日日躁狠狠躁免费麻豆 | 女人被男人爽到呻吟的视频 | 无码人妻av免费一区二区三区 | 国产网红无码精品视频 | 99国产精品白浆在线观看免费 | 无码人妻精品一区二区三区不卡 | 精品一区二区不卡无码av | 亚洲自偷精品视频自拍 | 亚洲综合伊人久久大杳蕉 | 亚洲精品www久久久 | 少妇太爽了在线观看 | 国产精品人妻一区二区三区四 | 免费看少妇作爱视频 | 久久综合给合久久狠狠狠97色 | 麻豆蜜桃av蜜臀av色欲av | 国産精品久久久久久久 | 亚洲综合精品香蕉久久网 | 少妇邻居内射在线 | 亚洲国产精品久久久久久 | 台湾无码一区二区 | 免费看少妇作爱视频 | 亚洲s码欧洲m码国产av | 亚洲日本一区二区三区在线 | 亚洲第一无码av无码专区 | 日本免费一区二区三区最新 | 国产精品高潮呻吟av久久 | 九一九色国产 | 国产精品多人p群无码 | 玩弄中年熟妇正在播放 | 欧美激情一区二区三区成人 | 亚洲一区二区三区在线观看网站 | 高清无码午夜福利视频 | 极品尤物被啪到呻吟喷水 | 亚洲日韩av片在线观看 | 久久无码人妻影院 | 精品国产aⅴ无码一区二区 | 婷婷丁香六月激情综合啪 | 丰满肥臀大屁股熟妇激情视频 | 蜜桃视频韩日免费播放 | 国产成人精品一区二区在线小狼 | 天天躁夜夜躁狠狠是什么心态 | 中文字幕无码免费久久99 | 精品国产av色一区二区深夜久久 | 三上悠亚人妻中文字幕在线 | 人妻插b视频一区二区三区 | 中文字幕无线码 | 最近免费中文字幕中文高清百度 | 欧美熟妇另类久久久久久多毛 | 久久亚洲中文字幕无码 | 国产精品99久久精品爆乳 | 精品少妇爆乳无码av无码专区 | 四虎国产精品一区二区 | 欧美国产日韩久久mv | 国产婷婷色一区二区三区在线 | 欧美高清在线精品一区 | 成人一在线视频日韩国产 | 精品国产乱码久久久久乱码 | 亚洲欧洲日本综合aⅴ在线 | av无码电影一区二区三区 | 免费看少妇作爱视频 | 狠狠色丁香久久婷婷综合五月 | 国产亚洲欧美在线专区 | 国产明星裸体无码xxxx视频 | 免费中文字幕日韩欧美 | 国产精品无码成人午夜电影 | 欧美激情内射喷水高潮 | 日本一卡2卡3卡四卡精品网站 | 成在人线av无码免费 | 偷窥日本少妇撒尿chinese | 狠狠cao日日穞夜夜穞av | 精品国产一区二区三区四区在线看 | 男人的天堂av网站 | 国产香蕉尹人综合在线观看 | 欧美老人巨大xxxx做受 | 97se亚洲精品一区 | 亚洲精品中文字幕久久久久 | 国产一区二区不卡老阿姨 | 国产欧美亚洲精品a | 全球成人中文在线 | 国内精品人妻无码久久久影院 | 国产99久久精品一区二区 | 亚洲精品国产精品乱码视色 | 亚洲aⅴ无码成人网站国产app | 97人妻精品一区二区三区 | 高清国产亚洲精品自在久久 | 青青久在线视频免费观看 | 乱码午夜-极国产极内射 | 亚洲人成影院在线无码按摩店 | 永久免费观看美女裸体的网站 | 午夜精品一区二区三区在线观看 | 国产一区二区三区精品视频 | 国内精品一区二区三区不卡 | 国产精品久久久午夜夜伦鲁鲁 | 综合激情五月综合激情五月激情1 | 无码免费一区二区三区 | 国产精品自产拍在线观看 | 日韩欧美中文字幕在线三区 | 中文字幕 人妻熟女 | 精品无码国产一区二区三区av | 强开小婷嫩苞又嫩又紧视频 | 国产人妻人伦精品1国产丝袜 | 宝宝好涨水快流出来免费视频 | 青青久在线视频免费观看 | 日韩视频 中文字幕 视频一区 | 风流少妇按摩来高潮 | 宝宝好涨水快流出来免费视频 | 国精产品一品二品国精品69xx | 久久人人爽人人爽人人片av高清 | 国产精品理论片在线观看 | 国内精品九九久久久精品 | 无码人妻少妇伦在线电影 | 亚洲精品国产品国语在线观看 | 十八禁视频网站在线观看 | 成人无码精品一区二区三区 | 四虎永久在线精品免费网址 | 精品无码国产一区二区三区av | 国产精品亚洲а∨无码播放麻豆 | 久久亚洲精品中文字幕无男同 | 欧美成人免费全部网站 | 无码吃奶揉捏奶头高潮视频 | 中文精品无码中文字幕无码专区 | 黑森林福利视频导航 | 久久久久久亚洲精品a片成人 | 亚洲无人区一区二区三区 | 久久久久亚洲精品男人的天堂 | 亚洲成a人一区二区三区 | 国产片av国语在线观看 | 亚洲中文字幕成人无码 | 日本精品少妇一区二区三区 | 日本乱人伦片中文三区 | 久久99久久99精品中文字幕 | 99久久人妻精品免费二区 | 亚洲国产欧美日韩精品一区二区三区 | 久久精品国产亚洲精品 | 亚洲欧美综合区丁香五月小说 | 一本色道婷婷久久欧美 | 亚洲色欲久久久综合网东京热 | 亚洲精品中文字幕久久久久 | 九月婷婷人人澡人人添人人爽 | 久久无码人妻影院 | 亚洲综合色区中文字幕 | 日韩 欧美 动漫 国产 制服 | 国产精品久久福利网站 | 久久综合网欧美色妞网 | 中文字幕无码日韩欧毛 | 日韩人妻无码中文字幕视频 | 无遮挡国产高潮视频免费观看 | www国产亚洲精品久久久日本 | 国产精品办公室沙发 | 福利一区二区三区视频在线观看 | 色婷婷香蕉在线一区二区 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 日韩av无码中文无码电影 | 四虎影视成人永久免费观看视频 | 国产综合在线观看 | 亚洲乱码中文字幕在线 | 丰满少妇熟乱xxxxx视频 | 国产手机在线αⅴ片无码观看 | 久久99精品久久久久久动态图 | 97人妻精品一区二区三区 | 水蜜桃av无码 | 国产av一区二区精品久久凹凸 | 国产精品人人妻人人爽 | 东北女人啪啪对白 | 日日噜噜噜噜夜夜爽亚洲精品 | 牲欲强的熟妇农村老妇女 | 窝窝午夜理论片影院 | 成人精品一区二区三区中文字幕 | 久久精品中文字幕一区 | 国产午夜视频在线观看 | 成人免费无码大片a毛片 | 午夜理论片yy44880影院 | 99久久99久久免费精品蜜桃 | 波多野结衣高清一区二区三区 | 国产亚av手机在线观看 | 内射老妇bbwx0c0ck | 欧美真人作爱免费视频 | 欧美人与禽zoz0性伦交 | 日日麻批免费40分钟无码 | 亚洲中文字幕乱码av波多ji | 国产偷自视频区视频 | 中文字幕乱码中文乱码51精品 | 成人一在线视频日韩国产 | 国产精品久免费的黄网站 | 国产亚av手机在线观看 | 精品午夜福利在线观看 | 欧美日韩久久久精品a片 | 色爱情人网站 | 成年美女黄网站色大免费全看 | 国产特级毛片aaaaaa高潮流水 | 国产麻豆精品精东影业av网站 | 国产肉丝袜在线观看 | 高潮毛片无遮挡高清免费视频 | 成人精品天堂一区二区三区 | 九九在线中文字幕无码 | 亲嘴扒胸摸屁股激烈网站 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 大乳丰满人妻中文字幕日本 | 精品无码一区二区三区爱欲 | 国产亚洲tv在线观看 | 美女张开腿让人桶 | 国内老熟妇对白xxxxhd | 精品成人av一区二区三区 | 国产婷婷色一区二区三区在线 | 久久99久久99精品中文字幕 | 黑人巨大精品欧美一区二区 | 女人被男人爽到呻吟的视频 | 婷婷六月久久综合丁香 | yw尤物av无码国产在线观看 | 国产精品久久久久7777 | 无码成人精品区在线观看 | 国产精品亚洲综合色区韩国 | 国产特级毛片aaaaaa高潮流水 | 99久久精品无码一区二区毛片 | 中文字幕乱码亚洲无线三区 | 国产手机在线αⅴ片无码观看 | 久久精品成人欧美大片 | 精品亚洲成av人在线观看 | 国产9 9在线 | 中文 | 国产人成高清在线视频99最全资源 | 精品久久久中文字幕人妻 | 日韩精品成人一区二区三区 | 欧美真人作爱免费视频 | 亚洲乱码国产乱码精品精 | 欧美老熟妇乱xxxxx | 欧洲精品码一区二区三区免费看 | 成人性做爰aaa片免费看 | 小sao货水好多真紧h无码视频 | 日本丰满护士爆乳xxxx | 色综合久久中文娱乐网 | 久久久久久久人妻无码中文字幕爆 | 少妇性l交大片 | 国产在线精品一区二区三区直播 | 国产激情一区二区三区 | 久久久久国色av免费观看性色 | 300部国产真实乱 | 国内老熟妇对白xxxxhd | 久久午夜无码鲁丝片 | 伊人久久大香线蕉午夜 | 亚洲欧洲日本无在线码 | 国产做国产爱免费视频 | 午夜男女很黄的视频 | 国产精品亚洲五月天高清 | 精品人妻中文字幕有码在线 | 中文久久乱码一区二区 | 青春草在线视频免费观看 | 99re在线播放 | 国产乱人伦偷精品视频 | 免费乱码人妻系列无码专区 | 人人妻人人澡人人爽精品欧美 | 欧美黑人性暴力猛交喷水 | 精品人人妻人人澡人人爽人人 | 天堂无码人妻精品一区二区三区 | 国产亚洲精品久久久久久 | 亚洲精品久久久久avwww潮水 | 真人与拘做受免费视频一 | 国产免费久久久久久无码 | 欧美激情一区二区三区成人 | 无码av岛国片在线播放 | 精品国产aⅴ无码一区二区 | 欧美熟妇另类久久久久久不卡 | 丰满少妇高潮惨叫视频 | 奇米影视888欧美在线观看 | 成年女人永久免费看片 | 免费播放一区二区三区 | 国产成人精品视频ⅴa片软件竹菊 | 国产口爆吞精在线视频 | 老太婆性杂交欧美肥老太 | 在线a亚洲视频播放在线观看 | 67194成是人免费无码 | 欧美亚洲国产一区二区三区 | 无码精品人妻一区二区三区av | 国产精品久久精品三级 | 亚洲一区二区三区偷拍女厕 | 国产女主播喷水视频在线观看 | 九月婷婷人人澡人人添人人爽 | 中文字幕 亚洲精品 第1页 | 亚洲爆乳精品无码一区二区三区 | 精品无码成人片一区二区98 | 青草视频在线播放 | 国产午夜手机精彩视频 | 狠狠色色综合网站 | 欧美熟妇另类久久久久久不卡 | 国产成人精品一区二区在线小狼 | 爆乳一区二区三区无码 | 国产无遮挡又黄又爽又色 | 无码纯肉视频在线观看 | 久久久久成人片免费观看蜜芽 | 国产成人精品三级麻豆 | 亚洲热妇无码av在线播放 | 999久久久国产精品消防器材 | 97无码免费人妻超级碰碰夜夜 | 国产成人一区二区三区别 | 99视频精品全部免费免费观看 | 日日天日日夜日日摸 | 人妻少妇精品久久 | 欧美成人高清在线播放 | 精品久久久久久人妻无码中文字幕 | 欧美日韩视频无码一区二区三 | 3d动漫精品啪啪一区二区中 | 无码av免费一区二区三区试看 | 小鲜肉自慰网站xnxx | 最新版天堂资源中文官网 | 日韩视频 中文字幕 视频一区 | 领导边摸边吃奶边做爽在线观看 | 欧美三级不卡在线观看 | 国产内射爽爽大片视频社区在线 | 国产乱子伦视频在线播放 | 色 综合 欧美 亚洲 国产 | 国产一区二区三区四区五区加勒比 | 女人被爽到呻吟gif动态图视看 | 成人一在线视频日韩国产 | 亚拍精品一区二区三区探花 | 四虎永久在线精品免费网址 | 亚洲精品一区二区三区婷婷月 | 中文字幕乱妇无码av在线 | 日本一本二本三区免费 | 日本精品久久久久中文字幕 | 亚洲日韩一区二区三区 | 久久久无码中文字幕久... | 国产内射爽爽大片视频社区在线 | 2019nv天堂香蕉在线观看 | 亚洲国产精品一区二区第一页 | 国产成人精品无码播放 | 亚欧洲精品在线视频免费观看 | 在线视频网站www色 | 亚洲午夜久久久影院 | 成熟女人特级毛片www免费 | 亚洲精品一区二区三区在线观看 | 亚洲色在线无码国产精品不卡 | 性做久久久久久久久 | 成人亚洲精品久久久久 | 亚洲a无码综合a国产av中文 | aⅴ在线视频男人的天堂 | 国产成人无码av在线影院 | 1000部啪啪未满十八勿入下载 | 天堂亚洲2017在线观看 | 精品乱码久久久久久久 | 亚洲国产精华液网站w | 精品人妻中文字幕有码在线 | 中文久久乱码一区二区 | 亚洲毛片av日韩av无码 | 性色欲情网站iwww九文堂 | 久久亚洲精品中文字幕无男同 | 狠狠色噜噜狠狠狠7777奇米 | 久久精品无码一区二区三区 | 一本无码人妻在中文字幕免费 | 亚洲阿v天堂在线 | 在线播放亚洲第一字幕 | 欧美三级不卡在线观看 | 亚洲精品综合五月久久小说 | 亚洲中文字幕久久无码 | 欧美性黑人极品hd | 1000部夫妻午夜免费 | 日日摸天天摸爽爽狠狠97 | а天堂中文在线官网 | 欧美兽交xxxx×视频 | 国产精品无码成人午夜电影 | 狠狠噜狠狠狠狠丁香五月 | 久久亚洲精品中文字幕无男同 | 久久99精品久久久久婷婷 | 玩弄人妻少妇500系列视频 | 国产区女主播在线观看 | 18禁黄网站男男禁片免费观看 | 国产情侣作爱视频免费观看 | 久久久久久久久888 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 日本熟妇大屁股人妻 | 女人色极品影院 | 俄罗斯老熟妇色xxxx | 人妻与老人中文字幕 | 久久99热只有频精品8 | 亚洲 日韩 欧美 成人 在线观看 | 精品人妻av区 | 图片区 小说区 区 亚洲五月 | 丰满人妻一区二区三区免费视频 | 亚洲综合色区中文字幕 | 成年美女黄网站色大免费视频 | 欧美日韩精品 | 久久精品人人做人人综合试看 | 国产精品人妻一区二区三区四 | 国产偷抇久久精品a片69 | 亚洲国产精品无码一区二区三区 | 亚洲人成人无码网www国产 | 欧美性色19p | 亚洲精品国偷拍自产在线麻豆 | 老熟女乱子伦 | 老熟妇仑乱视频一区二区 | 水蜜桃亚洲一二三四在线 | 高清国产亚洲精品自在久久 | 国产午夜无码精品免费看 | 亚洲区欧美区综合区自拍区 | 亚洲精品无码国产 | 色狠狠av一区二区三区 | 国产莉萝无码av在线播放 | 狠狠色色综合网站 | 99久久精品午夜一区二区 | 十八禁视频网站在线观看 | 亚洲人亚洲人成电影网站色 | 精品国产成人一区二区三区 | 少妇愉情理伦片bd | 国精产品一区二区三区 | 日本爽爽爽爽爽爽在线观看免 | 午夜无码人妻av大片色欲 | 亚洲s码欧洲m码国产av | 欧美猛少妇色xxxxx | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 人人妻人人澡人人爽精品欧美 | 久久精品国产99精品亚洲 | 麻豆国产人妻欲求不满谁演的 | 欧美 日韩 亚洲 在线 | а天堂中文在线官网 | 中文字幕 亚洲精品 第1页 | 三级4级全黄60分钟 | 99久久精品无码一区二区毛片 | 成在人线av无码免费 | 亚洲va中文字幕无码久久不卡 | 亚洲人成网站在线播放942 | 亚洲精品国产a久久久久久 | 精品国产一区二区三区av 性色 | 日韩亚洲欧美精品综合 | 久久国产自偷自偷免费一区调 | 国产在线一区二区三区四区五区 | 一区二区传媒有限公司 | 精品无人国产偷自产在线 | 99久久人妻精品免费一区 | 国产精品无码永久免费888 | 国产明星裸体无码xxxx视频 | 国产精品久久久久久亚洲影视内衣 | 少妇的肉体aa片免费 | 国产艳妇av在线观看果冻传媒 | 又湿又紧又大又爽a视频国产 | 3d动漫精品啪啪一区二区中 | 搡女人真爽免费视频大全 | 精品国产一区二区三区四区在线看 | 天天摸天天透天天添 | 亚洲精品一区二区三区大桥未久 | 国産精品久久久久久久 | 欧美怡红院免费全部视频 | 免费网站看v片在线18禁无码 | 亚洲国产精品无码一区二区三区 | 一本久道久久综合狠狠爱 | 久久天天躁夜夜躁狠狠 | 欧美一区二区三区 | 国产精品久久国产精品99 | 亚洲爆乳无码专区 | 爱做久久久久久 | 无码精品国产va在线观看dvd | 国产无遮挡又黄又爽又色 | 图片小说视频一区二区 | 中国大陆精品视频xxxx | 无码人妻久久一区二区三区不卡 | 亚洲另类伦春色综合小说 | 欧美一区二区三区 | 一本久道高清无码视频 | 精品无码国产一区二区三区av | 亚欧洲精品在线视频免费观看 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 国产亚洲精品久久久闺蜜 | 女人高潮内射99精品 | 亚洲色欲久久久综合网东京热 | 欧美 丝袜 自拍 制服 另类 | 一二三四在线观看免费视频 | 熟妇人妻无码xxx视频 | 丰满妇女强制高潮18xxxx | 精品久久8x国产免费观看 | 亚洲精品综合五月久久小说 | 久久久精品456亚洲影院 | 国产乱子伦视频在线播放 | 大胆欧美熟妇xx | 欧美丰满熟妇xxxx性ppx人交 | 精品一二三区久久aaa片 | 国产精品久久久久久久9999 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 亚洲乱亚洲乱妇50p | 亚洲欧美日韩成人高清在线一区 | 正在播放老肥熟妇露脸 | 欧美老妇交乱视频在线观看 | 国产成人精品视频ⅴa片软件竹菊 | 亚洲一区二区三区国产精华液 | 亚洲小说图区综合在线 | 久久精品国产一区二区三区肥胖 | 亚洲乱码日产精品bd | 99久久久国产精品无码免费 | 久久久久亚洲精品中文字幕 | 日韩精品无码一区二区中文字幕 | 午夜精品一区二区三区在线观看 | 国产成人无码av一区二区 | 免费男性肉肉影院 | 国产绳艺sm调教室论坛 | 国产成人无码区免费内射一片色欲 | 亚洲娇小与黑人巨大交 | 亚洲爆乳大丰满无码专区 | 亚洲啪av永久无码精品放毛片 | 亚洲毛片av日韩av无码 | 欧美激情综合亚洲一二区 | 免费无码一区二区三区蜜桃大 | 国产明星裸体无码xxxx视频 | av无码电影一区二区三区 | 国产在线无码精品电影网 | 99视频精品全部免费免费观看 | 亚洲日本va中文字幕 | 丰腴饱满的极品熟妇 | 在线精品国产一区二区三区 | 亚洲自偷自偷在线制服 | 久久aⅴ免费观看 | 四虎国产精品一区二区 | 国产精品二区一区二区aⅴ污介绍 | 水蜜桃色314在线观看 | 99国产精品白浆在线观看免费 | 77777熟女视频在线观看 а天堂中文在线官网 | 最新国产麻豆aⅴ精品无码 | 久久久av男人的天堂 | 精品一区二区三区无码免费视频 | 无码av免费一区二区三区试看 | 97人妻精品一区二区三区 | 夜先锋av资源网站 | 精品久久久久久亚洲精品 | 欧美日韩人成综合在线播放 | 在线精品国产一区二区三区 | 欧美阿v高清资源不卡在线播放 | 少妇太爽了在线观看 | 欧美老妇交乱视频在线观看 | 亚洲成av人片在线观看无码不卡 | 亚洲成在人网站无码天堂 | 天堂无码人妻精品一区二区三区 | 久久人妻内射无码一区三区 | 精品国产乱码久久久久乱码 | 亚洲色偷偷偷综合网 | 三级4级全黄60分钟 | 国产精品久久国产三级国 | 日韩精品无码一本二本三本色 | 国产精品嫩草久久久久 | 西西人体www44rt大胆高清 | 国产精品久久精品三级 | 成 人 免费观看网站 | 黑人巨大精品欧美黑寡妇 | 亚洲欧美日韩综合久久久 | 东京热一精品无码av | 国内老熟妇对白xxxxhd | 久久精品国产一区二区三区肥胖 | 97久久精品无码一区二区 | 国产偷国产偷精品高清尤物 | 欧美国产亚洲日韩在线二区 | 久久国产精品精品国产色婷婷 | 日韩成人一区二区三区在线观看 | 一本加勒比波多野结衣 | 免费无码肉片在线观看 | 东北女人啪啪对白 | 永久黄网站色视频免费直播 | 麻豆人妻少妇精品无码专区 | 久久国产精品精品国产色婷婷 | 西西人体www44rt大胆高清 | 国产精品无码永久免费888 | 少妇无码av无码专区在线观看 | 欧美乱妇无乱码大黄a片 | 久久精品99久久香蕉国产色戒 | 日本大香伊一区二区三区 | 国产精品办公室沙发 | 久久www免费人成人片 | 2020久久超碰国产精品最新 | 久久人妻内射无码一区三区 | 久激情内射婷内射蜜桃人妖 | 99精品久久毛片a片 | 国产精品久久久久无码av色戒 | 300部国产真实乱 | 国产精品高潮呻吟av久久4虎 | yw尤物av无码国产在线观看 | 国产香蕉尹人视频在线 | 精品人妻中文字幕有码在线 | 亚洲の无码国产の无码步美 | 中文亚洲成a人片在线观看 | 成人免费视频一区二区 | 国产成人精品一区二区在线小狼 | 久久天天躁夜夜躁狠狠 | 久久亚洲精品成人无码 | 日韩人妻少妇一区二区三区 | 国产激情无码一区二区app | 国产尤物精品视频 | 网友自拍区视频精品 | 久久久久国色av免费观看性色 | 亚洲gv猛男gv无码男同 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 免费播放一区二区三区 | 欧美肥老太牲交大战 | 狠狠色噜噜狠狠狠狠7777米奇 | 亚洲精品综合五月久久小说 | 女人被男人躁得好爽免费视频 | 老子影院午夜伦不卡 | 日韩亚洲欧美精品综合 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 九月婷婷人人澡人人添人人爽 | 欧美成人高清在线播放 | 亚洲va中文字幕无码久久不卡 | 久久久精品成人免费观看 | 日韩欧美群交p片內射中文 | 97久久国产亚洲精品超碰热 | 99精品视频在线观看免费 | 2019午夜福利不卡片在线 | 国产女主播喷水视频在线观看 | 荫蒂被男人添的好舒服爽免费视频 | 亚洲天堂2017无码中文 | 国产亚洲欧美在线专区 | 亚洲人成无码网www | 国产热a欧美热a在线视频 | 国产精品人人妻人人爽 | 亚洲日韩一区二区 | 在线视频网站www色 | 精品欧洲av无码一区二区三区 | 色婷婷香蕉在线一区二区 | 特黄特色大片免费播放器图片 | 欧美日韩亚洲国产精品 | 亚洲国产午夜精品理论片 | 色狠狠av一区二区三区 | 无码午夜成人1000部免费视频 | 99精品无人区乱码1区2区3区 | 好爽又高潮了毛片免费下载 | 亚洲爆乳精品无码一区二区三区 | 2019nv天堂香蕉在线观看 | 人人爽人人澡人人高潮 | 久久这里只有精品视频9 | 成熟人妻av无码专区 | 麻豆国产人妻欲求不满谁演的 | 精品国产麻豆免费人成网站 | 丰满妇女强制高潮18xxxx | 国模大胆一区二区三区 | 久久久久免费看成人影片 | 国内少妇偷人精品视频 | 中文字幕乱码亚洲无线三区 | 无码任你躁久久久久久久 | 精品无码国产一区二区三区av | 亚洲国产精华液网站w | 扒开双腿吃奶呻吟做受视频 | 婷婷丁香五月天综合东京热 | 波多野结衣一区二区三区av免费 | 久久99精品久久久久婷婷 | 人人妻人人澡人人爽欧美精品 | 日本熟妇浓毛 | 精品国产aⅴ无码一区二区 | 久久无码中文字幕免费影院蜜桃 | 高中生自慰www网站 | 亚洲理论电影在线观看 | 四虎影视成人永久免费观看视频 | 国产av无码专区亚洲a∨毛片 | 国产亚洲精品久久久久久国模美 | 国产两女互慰高潮视频在线观看 | 男人的天堂2018无码 | 狠狠色噜噜狠狠狠狠7777米奇 | 日本乱人伦片中文三区 | 国产人妻人伦精品1国产丝袜 | 亚洲国产av美女网站 | 少妇人妻大乳在线视频 | 鲁大师影院在线观看 | 精品国产成人一区二区三区 | 一个人看的www免费视频在线观看 | 久久aⅴ免费观看 | 亚洲成a人片在线观看无码3d | 国产午夜无码精品免费看 | 久久 国产 尿 小便 嘘嘘 | 天堂亚洲2017在线观看 | 初尝人妻少妇中文字幕 | 亚洲狠狠婷婷综合久久 | 在线亚洲高清揄拍自拍一品区 | 超碰97人人射妻 | 性色av无码免费一区二区三区 | 一本久久a久久精品vr综合 | 帮老师解开蕾丝奶罩吸乳网站 | 久久国产精品萌白酱免费 | 亚洲综合在线一区二区三区 | 欧美日韩在线亚洲综合国产人 | 亚洲一区二区三区含羞草 | 成人无码视频免费播放 | 久久综合网欧美色妞网 | 少妇邻居内射在线 | 午夜熟女插插xx免费视频 | 久久精品中文字幕大胸 | 久久熟妇人妻午夜寂寞影院 | 日日摸天天摸爽爽狠狠97 | 88国产精品欧美一区二区三区 | 国产亚洲视频中文字幕97精品 | 中文字幕 亚洲精品 第1页 | 亚洲无人区一区二区三区 | 亚洲中文字幕无码中字 | 98国产精品综合一区二区三区 | 亚洲国产精品美女久久久久 | 欧美激情一区二区三区成人 | 300部国产真实乱 | 日韩欧美群交p片內射中文 | 亚洲熟悉妇女xxx妇女av | 特黄特色大片免费播放器图片 | 亚无码乱人伦一区二区 | 欧美日韩一区二区免费视频 | 久久天天躁狠狠躁夜夜免费观看 | 无码国内精品人妻少妇 | 亚洲精品一区二区三区在线 | 67194成是人免费无码 | 久久久中文字幕日本无吗 | 无码任你躁久久久久久久 | 日本一区二区三区免费高清 | 国产熟妇高潮叫床视频播放 | 亚洲成a人片在线观看无码 | 丰满少妇熟乱xxxxx视频 | 性啪啪chinese东北女人 | 熟女体下毛毛黑森林 | 99久久无码一区人妻 | 人妻少妇精品久久 | 婷婷丁香六月激情综合啪 | 人人妻人人澡人人爽精品欧美 | 国产精品国产自线拍免费软件 | 99久久亚洲精品无码毛片 | 男女作爱免费网站 | 国产后入清纯学生妹 | 久久亚洲精品中文字幕无男同 | а√天堂www在线天堂小说 | 水蜜桃色314在线观看 | 蜜桃av抽搐高潮一区二区 | 国产欧美亚洲精品a | 日本一本二本三区免费 | 日本精品高清一区二区 | 国产精品久久久久影院嫩草 | 人妻体内射精一区二区三四 | 亚洲呦女专区 | 亚洲日韩一区二区 | 在线а√天堂中文官网 | 特黄特色大片免费播放器图片 | 久久午夜无码鲁丝片秋霞 | 国产精品丝袜黑色高跟鞋 | 少妇无套内谢久久久久 | 久久精品视频在线看15 | 熟女体下毛毛黑森林 | 久久精品国产大片免费观看 | 中文字幕无码免费久久99 | 男女下面进入的视频免费午夜 | 女高中生第一次破苞av | 国产精品人妻一区二区三区四 | 国产精品怡红院永久免费 | 国产无套内射久久久国产 | 中文字幕乱码亚洲无线三区 | 国产精品igao视频网 | 国产片av国语在线观看 | 成人片黄网站色大片免费观看 | 成熟女人特级毛片www免费 | 动漫av网站免费观看 | 久久精品国产亚洲精品 | 性欧美疯狂xxxxbbbb | 国产精品亚洲一区二区三区喷水 | av无码电影一区二区三区 | 国内揄拍国内精品少妇国语 | 欧美大屁股xxxxhd黑色 | 一本大道久久东京热无码av | 久久综合网欧美色妞网 | 在线播放免费人成毛片乱码 | 99久久亚洲精品无码毛片 | 在教室伦流澡到高潮hnp视频 | 丰满肥臀大屁股熟妇激情视频 | 国产精品对白交换视频 | 久久精品视频在线看15 | 波多野结衣av在线观看 | 亚洲成在人网站无码天堂 | 牛和人交xxxx欧美 | 桃花色综合影院 | 国产无套内射久久久国产 | 麻豆av传媒蜜桃天美传媒 | 一本无码人妻在中文字幕免费 | 国产成人精品优优av | 亚洲人成网站在线播放942 | 熟妇人妻无乱码中文字幕 | 捆绑白丝粉色jk震动捧喷白浆 | 老司机亚洲精品影院无码 | 无码帝国www无码专区色综合 | 久久久久成人精品免费播放动漫 | 欧美人与物videos另类 | 少妇被黑人到高潮喷出白浆 | 最近中文2019字幕第二页 | 成人无码影片精品久久久 | 亚洲成av人综合在线观看 | 曰韩少妇内射免费播放 | 中文字幕av无码一区二区三区电影 | 国产成人亚洲综合无码 | 少妇性l交大片欧洲热妇乱xxx | 丁香啪啪综合成人亚洲 | 激情内射日本一区二区三区 | 亚洲中文字幕在线无码一区二区 | 日韩人妻无码一区二区三区久久99 | 无码纯肉视频在线观看 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 久久精品国产99精品亚洲 | 色噜噜亚洲男人的天堂 | 亚洲精品无码人妻无码 | 女高中生第一次破苞av | 男女爱爱好爽视频免费看 | 亚洲欧洲日本综合aⅴ在线 | 欧美日本免费一区二区三区 | 国产人妻精品一区二区三区 | 爱做久久久久久 | 狠狠cao日日穞夜夜穞av | 欧美丰满老熟妇xxxxx性 | 国产av一区二区精品久久凹凸 | 亚洲区小说区激情区图片区 | 欧美人与禽猛交狂配 | 国产精品久久久久久无码 | 亚洲成色www久久网站 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 亚洲男女内射在线播放 | 18黄暴禁片在线观看 | 国产人妻精品一区二区三区不卡 | 妺妺窝人体色www婷婷 | 亚洲国产av精品一区二区蜜芽 | 国产高清不卡无码视频 | 欧美zoozzooz性欧美 | 色五月五月丁香亚洲综合网 | 中文字幕 亚洲精品 第1页 | 欧美老妇与禽交 | 宝宝好涨水快流出来免费视频 | 大肉大捧一进一出视频出来呀 | 内射后入在线观看一区 | 国产黄在线观看免费观看不卡 | 亚洲一区二区三区 | 国产综合久久久久鬼色 | 夜夜高潮次次欢爽av女 | 久久久www成人免费毛片 | www国产亚洲精品久久网站 | 强伦人妻一区二区三区视频18 | 亚洲国产av精品一区二区蜜芽 | 曰韩少妇内射免费播放 | 日本va欧美va欧美va精品 | 中文字幕无码免费久久99 | 婷婷五月综合激情中文字幕 | 四虎永久在线精品免费网址 | 老太婆性杂交欧美肥老太 | 色 综合 欧美 亚洲 国产 | 国产av久久久久精东av | 日日干夜夜干 | 影音先锋中文字幕无码 | 欧美日本免费一区二区三区 | 国产亚洲精品久久久久久久久动漫 | 人人妻人人藻人人爽欧美一区 | 国产成人精品必看 | av在线亚洲欧洲日产一区二区 | 日本欧美一区二区三区乱码 | 成人精品天堂一区二区三区 | 性欧美大战久久久久久久 | 亚洲精品午夜国产va久久成人 | 国产激情综合五月久久 | 久久国产精品精品国产色婷婷 | 亚洲国产欧美国产综合一区 | 久久精品人人做人人综合试看 | 四虎永久在线精品免费网址 | 国产口爆吞精在线视频 | 性色欲网站人妻丰满中文久久不卡 | 乱人伦人妻中文字幕无码久久网 | 国产特级毛片aaaaaa高潮流水 | 性史性农村dvd毛片 | 亚洲精品久久久久久久久久久 | 亚洲区欧美区综合区自拍区 | 无码av中文字幕免费放 | 日本欧美一区二区三区乱码 | 亚洲日韩中文字幕在线播放 | 欧美激情综合亚洲一二区 | 国产乱人无码伦av在线a | 久久久久久九九精品久 | 2020最新国产自产精品 | 久久精品中文字幕一区 | 色综合视频一区二区三区 | 中文毛片无遮挡高清免费 | 亚洲国产午夜精品理论片 | 成人免费无码大片a毛片 | 亚洲男女内射在线播放 | 亚洲精品久久久久中文第一幕 | 人人澡人人妻人人爽人人蜜桃 | 国产香蕉尹人综合在线观看 | 欧美日韩亚洲国产精品 | 国产午夜福利100集发布 | 熟妇人妻无乱码中文字幕 | 欧美日韩一区二区三区自拍 | 国产口爆吞精在线视频 | 国色天香社区在线视频 | 欧美熟妇另类久久久久久不卡 | 国产av久久久久精东av | 亚洲国产精品无码一区二区三区 | 亚洲精品www久久久 | 丰满人妻被黑人猛烈进入 | 精品夜夜澡人妻无码av蜜桃 | 极品尤物被啪到呻吟喷水 | 一个人看的www免费视频在线观看 | 男人扒开女人内裤强吻桶进去 | 亚洲欧美综合区丁香五月小说 | 国产精品美女久久久久av爽李琼 | 国产无遮挡吃胸膜奶免费看 | 国产麻豆精品一区二区三区v视界 | 天堂无码人妻精品一区二区三区 | 国产成人无码a区在线观看视频app | 18禁黄网站男男禁片免费观看 | 亚洲娇小与黑人巨大交 | 欧美高清在线精品一区 | 日产精品高潮呻吟av久久 | 国产成人无码专区 | 久久精品一区二区三区四区 | 3d动漫精品啪啪一区二区中 | 久在线观看福利视频 | 麻豆精品国产精华精华液好用吗 | 亚洲一区二区三区偷拍女厕 | 一二三四在线观看免费视频 | 亚洲s色大片在线观看 | 性啪啪chinese东北女人 | 性色欲网站人妻丰满中文久久不卡 | 国产乱人偷精品人妻a片 | 亚洲欧美日韩国产精品一区二区 | 精品久久久久久亚洲精品 | 东京热男人av天堂 | 久久综合九色综合欧美狠狠 | 亚洲人成人无码网www国产 | 亚洲va中文字幕无码久久不卡 | 300部国产真实乱 | 中文毛片无遮挡高清免费 | 色综合久久中文娱乐网 | 中文无码精品a∨在线观看不卡 | aa片在线观看视频在线播放 | аⅴ资源天堂资源库在线 | 久久国产精品偷任你爽任你 | 性欧美videos高清精品 | 亚洲国产成人a精品不卡在线 | 免费无码肉片在线观看 | 波多野结衣av在线观看 | 久久精品女人天堂av免费观看 | 久久无码中文字幕免费影院蜜桃 | 精品人妻中文字幕有码在线 | 日本精品久久久久中文字幕 | 桃花色综合影院 | 内射后入在线观看一区 | 97无码免费人妻超级碰碰夜夜 | 欧美放荡的少妇 | 无码乱肉视频免费大全合集 | 成人影院yy111111在线观看 | 久久国语露脸国产精品电影 | 国产亚洲人成a在线v网站 | 欧美日韩精品 | 黑森林福利视频导航 | 麻豆av传媒蜜桃天美传媒 | 亚洲精品中文字幕 | 性色欲情网站iwww九文堂 | 中文字幕精品av一区二区五区 | 国产免费久久久久久无码 | 久久99精品国产麻豆 | 亚拍精品一区二区三区探花 | 偷窥日本少妇撒尿chinese | 波多野结衣高清一区二区三区 | 精品国产一区二区三区四区 | 好爽又高潮了毛片免费下载 | 日日摸天天摸爽爽狠狠97 | 精品久久久中文字幕人妻 | 麻豆蜜桃av蜜臀av色欲av | 俺去俺来也www色官网 | 亚洲毛片av日韩av无码 | 色诱久久久久综合网ywww | 内射爽无广熟女亚洲 | 精品成在人线av无码免费看 | 熟女体下毛毛黑森林 | 少妇的肉体aa片免费 | 国产色在线 | 国产 | 爽爽影院免费观看 | 无码国内精品人妻少妇 | 亚洲毛片av日韩av无码 | 亚洲日韩av一区二区三区四区 | 水蜜桃色314在线观看 | 亚洲成a人片在线观看无码 | 亚洲另类伦春色综合小说 | 国产人妻精品一区二区三区 | 成人动漫在线观看 | 日韩av无码一区二区三区不卡 | 中文字幕精品av一区二区五区 | 免费中文字幕日韩欧美 | 一个人看的www免费视频在线观看 | 中文精品无码中文字幕无码专区 | 中文字幕日产无线码一区 | 麻豆成人精品国产免费 | 久久精品中文字幕大胸 | 精品国产av色一区二区深夜久久 | 国产午夜亚洲精品不卡 | 欧洲极品少妇 | 无遮挡啪啪摇乳动态图 | 精品一区二区不卡无码av | 97久久超碰中文字幕 | 青春草在线视频免费观看 | 亚洲欧美日韩综合久久久 | 国产高潮视频在线观看 | 国产成人久久精品流白浆 | 婷婷丁香五月天综合东京热 | 亚洲精品一区二区三区四区五区 | 好爽又高潮了毛片免费下载 | 四虎国产精品免费久久 | 99久久亚洲精品无码毛片 | 日韩av激情在线观看 | 亚洲 另类 在线 欧美 制服 | 久久精品国产精品国产精品污 | 内射欧美老妇wbb | 国产97在线 | 亚洲 | 亚洲中文字幕av在天堂 | 欧美zoozzooz性欧美 | 妺妺窝人体色www婷婷 | 中文字幕 亚洲精品 第1页 | 亚洲gv猛男gv无码男同 | 亚洲精品久久久久久久久久久 | 精品国产一区av天美传媒 | 蜜臀av无码人妻精品 | 2020最新国产自产精品 | 一二三四在线观看免费视频 | 99久久精品国产一区二区蜜芽 | 日韩少妇白浆无码系列 | 岛国片人妻三上悠亚 | 亚洲国产精品一区二区美利坚 | 国产精品对白交换视频 | 国产av一区二区三区最新精品 | 爆乳一区二区三区无码 | 亚洲另类伦春色综合小说 | 99在线 | 亚洲 | 国产亚av手机在线观看 | av香港经典三级级 在线 | 国产精品无码一区二区三区不卡 | 国产在线aaa片一区二区99 | 国产三级精品三级男人的天堂 | 日韩av无码一区二区三区 | 国产香蕉尹人综合在线观看 | 亚洲乱码中文字幕在线 | 久久国产精品萌白酱免费 | 动漫av网站免费观看 | 麻豆精品国产精华精华液好用吗 | 狠狠色欧美亚洲狠狠色www | 无码av岛国片在线播放 | 国产亚洲精品精品国产亚洲综合 | 久久精品中文闷骚内射 | 国产精品第一区揄拍无码 | 国産精品久久久久久久 | 亚洲日韩av片在线观看 | √天堂中文官网8在线 | 丝袜 中出 制服 人妻 美腿 | 红桃av一区二区三区在线无码av | 精品成在人线av无码免费看 | 午夜精品久久久久久久久 | 欧美一区二区三区视频在线观看 | 人人妻人人澡人人爽欧美精品 | 初尝人妻少妇中文字幕 | 香港三级日本三级妇三级 | 日日碰狠狠躁久久躁蜜桃 | 免费观看的无遮挡av | 成人性做爰aaa片免费看不忠 | 18禁黄网站男男禁片免费观看 | 国产无遮挡又黄又爽免费视频 | 国产精品无码一区二区三区不卡 | 亚洲码国产精品高潮在线 | 99精品无人区乱码1区2区3区 | 久久视频在线观看精品 | 亚洲第一网站男人都懂 | 男人扒开女人内裤强吻桶进去 | 久久无码中文字幕免费影院蜜桃 | 久久久久国色av免费观看性色 | 国产色视频一区二区三区 | 青青久在线视频免费观看 | 丁香啪啪综合成人亚洲 | 麻豆国产97在线 | 欧洲 | 精品无码国产自产拍在线观看蜜 | 国产另类ts人妖一区二区 | 亚洲小说春色综合另类 | 中文亚洲成a人片在线观看 | 少女韩国电视剧在线观看完整 | 人妻少妇被猛烈进入中文字幕 | 55夜色66夜色国产精品视频 | 黄网在线观看免费网站 | 天天av天天av天天透 | 欧美人与物videos另类 | 国产熟妇高潮叫床视频播放 | 国产性生交xxxxx无码 | 18无码粉嫩小泬无套在线观看 | 67194成是人免费无码 | 精品久久久久久亚洲精品 | 97se亚洲精品一区 | 天天做天天爱天天爽综合网 | 波多野结衣乳巨码无在线观看 | 中文字幕av无码一区二区三区电影 | 又湿又紧又大又爽a视频国产 | 无码福利日韩神码福利片 | 成人试看120秒体验区 | 中文精品久久久久人妻不卡 | 日韩精品久久久肉伦网站 | 四虎影视成人永久免费观看视频 | 老头边吃奶边弄进去呻吟 | 一本久久a久久精品vr综合 | 国产午夜福利100集发布 | 亚洲国产精品成人久久蜜臀 | 夜夜夜高潮夜夜爽夜夜爰爰 | 国产亚洲视频中文字幕97精品 | 中文字幕av无码一区二区三区电影 | 成人av无码一区二区三区 | 午夜无码人妻av大片色欲 | 国产精品爱久久久久久久 | 窝窝午夜理论片影院 | 激情内射日本一区二区三区 | 精品国产一区av天美传媒 | 窝窝午夜理论片影院 | 亚洲 激情 小说 另类 欧美 | 久久久久久久久888 | 综合激情五月综合激情五月激情1 | 国产亚洲精品精品国产亚洲综合 | 国产成人人人97超碰超爽8 | 蜜桃视频插满18在线观看 | 俄罗斯老熟妇色xxxx | 久久zyz资源站无码中文动漫 | 亚洲国产精品毛片av不卡在线 | 欧美日韩一区二区三区自拍 | 沈阳熟女露脸对白视频 | 精品国精品国产自在久国产87 | 亚洲欧美精品aaaaaa片 | 亚洲自偷精品视频自拍 | 一二三四社区在线中文视频 | 久久精品一区二区三区四区 | 爽爽影院免费观看 | 国产精品人人爽人人做我的可爱 | 亚洲 日韩 欧美 成人 在线观看 | 天天做天天爱天天爽综合网 | 又色又爽又黄的美女裸体网站 | 亚洲中文字幕无码中文字在线 | 国产97在线 | 亚洲 | 乱码av麻豆丝袜熟女系列 | 亚洲综合精品香蕉久久网 | 精品无人国产偷自产在线 | 久久亚洲中文字幕精品一区 | 色婷婷av一区二区三区之红樱桃 | 在线播放免费人成毛片乱码 | 动漫av网站免费观看 | 扒开双腿疯狂进出爽爽爽视频 | www国产亚洲精品久久久日本 | 76少妇精品导航 | 国产av剧情md精品麻豆 | 亚洲精品国产第一综合99久久 | 国产99久久精品一区二区 | 国产一区二区三区影院 | 亚洲熟妇色xxxxx欧美老妇 | 国产亚洲精品久久久久久国模美 | 亚洲精品一区二区三区在线观看 | 天堂一区人妻无码 | 无码人妻少妇伦在线电影 | 激情人妻另类人妻伦 | 性欧美牲交在线视频 | 人妻无码久久精品人妻 | 亚洲国产精品毛片av不卡在线 | 久久综合九色综合欧美狠狠 | 亚洲精品国偷拍自产在线麻豆 | 日本乱偷人妻中文字幕 | 夜夜躁日日躁狠狠久久av | 久久人人97超碰a片精品 | 成熟女人特级毛片www免费 | 精品人妻人人做人人爽 | 日日摸天天摸爽爽狠狠97 | 纯爱无遮挡h肉动漫在线播放 | 国内精品久久毛片一区二区 | 亚洲成av人片在线观看无码不卡 | 大乳丰满人妻中文字幕日本 | 欧美老妇交乱视频在线观看 | 欧洲极品少妇 | 精品国产精品久久一区免费式 | 亚洲精品国产精品乱码不卡 | 欧美成人午夜精品久久久 | 国产电影无码午夜在线播放 | 国产精华av午夜在线观看 | 久久午夜无码鲁丝片 | 国产成人精品必看 | 亚洲精品欧美二区三区中文字幕 | 黑人粗大猛烈进出高潮视频 | 好爽又高潮了毛片免费下载 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 九月婷婷人人澡人人添人人爽 | 无码人妻精品一区二区三区下载 | 沈阳熟女露脸对白视频 | 国产无套内射久久久国产 | 免费看男女做好爽好硬视频 | 精品无码成人片一区二区98 | 国产亚洲欧美日韩亚洲中文色 | 久久久久se色偷偷亚洲精品av | 少妇一晚三次一区二区三区 | 欧美日韩一区二区免费视频 | 亚洲s码欧洲m码国产av | 亚洲aⅴ无码成人网站国产app | 久久人人爽人人人人片 | 国产无套内射久久久国产 | 男女性色大片免费网站 | 日日碰狠狠丁香久燥 | 国产成人无码av片在线观看不卡 | 欧美性色19p | 国内精品人妻无码久久久影院 | 精品国精品国产自在久国产87 | 久久综合久久自在自线精品自 | 国产精华av午夜在线观看 | 国产成人久久精品流白浆 | 无码人妻精品一区二区三区不卡 | 亚洲成av人片天堂网无码】 | 色欲av亚洲一区无码少妇 | 欧美熟妇另类久久久久久不卡 | 国产成人无码午夜视频在线观看 | 成人aaa片一区国产精品 | 久久久www成人免费毛片 | 蜜桃无码一区二区三区 | 久久久精品成人免费观看 | 无码国产色欲xxxxx视频 | 中文字幕日韩精品一区二区三区 | 欧洲熟妇色 欧美 | 领导边摸边吃奶边做爽在线观看 | 99久久99久久免费精品蜜桃 | 日本大乳高潮视频在线观看 | 黑人玩弄人妻中文在线 | 国产精品久久久av久久久 | 日本va欧美va欧美va精品 | 国产精品自产拍在线观看 | 少妇人妻偷人精品无码视频 | 色一情一乱一伦一区二区三欧美 | 无码人中文字幕 | 亚洲人成无码网www | a在线亚洲男人的天堂 | 88国产精品欧美一区二区三区 | 熟妇人妻中文av无码 | 婷婷综合久久中文字幕蜜桃三电影 | 国产国产精品人在线视 | 久久久久成人片免费观看蜜芽 | 国产口爆吞精在线视频 | 久久国产精品二国产精品 | 国产人妻久久精品二区三区老狼 | 婷婷六月久久综合丁香 | 色欲av亚洲一区无码少妇 | 免费男性肉肉影院 | 精品无码一区二区三区的天堂 | 精品亚洲韩国一区二区三区 | 亚洲日韩精品欧美一区二区 | 狂野欧美性猛交免费视频 | 久久无码专区国产精品s | 欧美性猛交内射兽交老熟妇 | 狠狠综合久久久久综合网 | 97久久国产亚洲精品超碰热 | 美女极度色诱视频国产 | 成熟人妻av无码专区 | 中文字幕av伊人av无码av | 亚洲人成网站在线播放942 | 国产成人无码区免费内射一片色欲 | 成人亚洲精品久久久久软件 | 久久成人a毛片免费观看网站 | а√天堂www在线天堂小说 | 少妇被黑人到高潮喷出白浆 | 性生交大片免费看l | a国产一区二区免费入口 | 青春草在线视频免费观看 | 少妇性俱乐部纵欲狂欢电影 | 精品无码国产自产拍在线观看蜜 | 日本一卡2卡3卡四卡精品网站 | 久久精品国产99久久6动漫 | 国内揄拍国内精品少妇国语 | 精品一区二区不卡无码av | 无码午夜成人1000部免费视频 | 久久久中文字幕日本无吗 | 久久久中文久久久无码 | 欧美一区二区三区视频在线观看 | 真人与拘做受免费视频一 | 国产精品嫩草久久久久 | 欧美日本日韩 | 中文字幕无码视频专区 | 亚洲精品久久久久avwww潮水 | 亚洲男人av香蕉爽爽爽爽 | 一二三四社区在线中文视频 | 成人av无码一区二区三区 | 中文字幕色婷婷在线视频 | 国产精品高潮呻吟av久久4虎 | 黑人巨大精品欧美一区二区 | 精品无人国产偷自产在线 | 亚洲欧美日韩综合久久久 | 日本饥渴人妻欲求不满 | 国内精品久久久久久中文字幕 | 无码国产乱人伦偷精品视频 | 麻豆国产人妻欲求不满 | 人妻无码久久精品人妻 | 国产精品美女久久久 | 精品久久综合1区2区3区激情 | 久久成人a毛片免费观看网站 | 国产精品久久久久影院嫩草 | 蜜桃视频韩日免费播放 | 99riav国产精品视频 | 女人被爽到呻吟gif动态图视看 | 成人欧美一区二区三区 | 性色av无码免费一区二区三区 | 国语自产偷拍精品视频偷 | 桃花色综合影院 | 兔费看少妇性l交大片免费 | 国产色精品久久人妻 | 亚洲欧美综合区丁香五月小说 | 成人无码视频免费播放 | 久久人人爽人人爽人人片ⅴ | 97人妻精品一区二区三区 | 搡女人真爽免费视频大全 | 日韩少妇白浆无码系列 | 欧美国产日韩亚洲中文 | 色婷婷欧美在线播放内射 | 欧洲极品少妇 | 台湾无码一区二区 | 55夜色66夜色国产精品视频 | 少妇高潮一区二区三区99 | 少妇人妻大乳在线视频 | 无码乱肉视频免费大全合集 | 99精品无人区乱码1区2区3区 | 午夜肉伦伦影院 | 正在播放老肥熟妇露脸 | 国产精品无码永久免费888 | 狂野欧美性猛交免费视频 | 青青青爽视频在线观看 | 又大又硬又爽免费视频 | 野外少妇愉情中文字幕 | 国产猛烈高潮尖叫视频免费 | 亚洲欧美精品aaaaaa片 | 久久亚洲中文字幕无码 | 未满成年国产在线观看 | 蜜桃视频插满18在线观看 | 亚洲 另类 在线 欧美 制服 | 300部国产真实乱 | 水蜜桃色314在线观看 | 久久久婷婷五月亚洲97号色 | 国产亚洲日韩欧美另类第八页 | 国产成人综合色在线观看网站 | 人妻夜夜爽天天爽三区 | 99视频精品全部免费免费观看 | 粉嫩少妇内射浓精videos | av无码电影一区二区三区 | 无码av岛国片在线播放 | 四虎国产精品一区二区 | 亚洲中文字幕av在天堂 | 久久综合九色综合欧美狠狠 | 国产精品毛多多水多 | 日日鲁鲁鲁夜夜爽爽狠狠 | 国产av无码专区亚洲a∨毛片 | 精品国产青草久久久久福利 | 国产婷婷色一区二区三区在线 | 东京热一精品无码av | 久久天天躁狠狠躁夜夜免费观看 | 中文字幕无码日韩专区 | 精品欧洲av无码一区二区三区 | 熟妇女人妻丰满少妇中文字幕 | 国产又爽又猛又粗的视频a片 | 日本精品久久久久中文字幕 | 少妇久久久久久人妻无码 | av无码久久久久不卡免费网站 | 国产亲子乱弄免费视频 | 亚洲欧洲日本综合aⅴ在线 | 日本xxxx色视频在线观看免费 | 久久精品人人做人人综合 | 丰满人妻翻云覆雨呻吟视频 | 无码人妻久久一区二区三区不卡 | 一个人看的www免费视频在线观看 | 久久久久成人精品免费播放动漫 | 又湿又紧又大又爽a视频国产 | 国产偷自视频区视频 | 欧美zoozzooz性欧美 | 成人精品视频一区二区三区尤物 | 麻花豆传媒剧国产免费mv在线 | 亚洲乱码日产精品bd | 成人无码视频免费播放 | 亚洲国产综合无码一区 | 97久久超碰中文字幕 | 欧美真人作爱免费视频 | 又大又硬又爽免费视频 | 国产午夜亚洲精品不卡 | 无码免费一区二区三区 | 国产精品对白交换视频 | 亚洲一区二区观看播放 | 国产乱人伦av在线无码 | 永久免费观看美女裸体的网站 | 亚洲爆乳精品无码一区二区三区 | 日本精品久久久久中文字幕 | 日本大乳高潮视频在线观看 | 99久久婷婷国产综合精品青草免费 | 无码人中文字幕 | 无码人妻少妇伦在线电影 | 精品国产麻豆免费人成网站 | 久久综合久久自在自线精品自 |