Chinaunix首页 | 论坛 | 博客
  • 博客访问: 171133
  • 博文数量: 65
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 720
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-16 08:59
文章分类

全部博文(65)

文章存档

2011年(3)

2010年(3)

2009年(43)

2008年(16)

我的朋友

分类: LINUX

2009-04-17 17:17:41

相关的几个文件: /etc/passwd  /etc/shadow  /etc/group (和帐号相关的默认文件: /etc/default/useradd   /etc/skel/*   /etc/login.defs  )
 
有效與初始群組、groups, newgrp
usermod -G users dmtsai  <==先設定好次要群組
  • newgrp: 有效群組的切換
  • $ newgrp users
    [dmtsai@www ~]$ groups
    users dmtsai

    帳號管理
    新增與移除使用者: useradd, 相關設定檔, passwd, usermod, userdel
    ~]# 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 為永遠不失效(密碼只會過期而強制於登入時重新設定而已。)
  • useradd -u 700 -g users vbird2
    [root@www ~]# ll -d /home/vbird2
    drwx------ 4 vbird2 users 4096 Feb 25 09:59 /home/vbird2
    其實 useradd 的預設值可以使用底下的方法呼叫出來:

    [root@www ~]# useradd -D
    passwd [-l] [-u] [--sdtin] [-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 欄位,密碼失效日期


    • 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 第六欄位(密碼過期前警告日期)

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

    範例二:建立一個名為 agetest 的帳號,該帳號第一次登入後使用預設密碼,
            但必須要更改過密碼後,使用新密碼才能夠登入系統使用 bash 環境

    [root@www ~]# useradd agetest
    [root@www ~]# echo "agetest" | passwd --stdin agetest
    [root@www ~]# chage -d 0 agetest
    # 此時此帳號的密碼建立時間會被改為 1970/1/1 ,所以會有問題!

  • 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 密碼欄的 ! 拿掉,解凍啦!
    
  • userdel
  • 整個指令的語法非常簡單:

    [root@www ~]# userdel [-r] username
    選項與參數:
    -r  :連同使用者的家目錄也一起刪除
    
    範例一:刪除 vbird2 ,連同家目錄一起刪除
    [root@www ~]# userdel -r vbird2
    
    • 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.
    
  • chsh
  • # chsh -l
    新增與移除群組
    • 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 來決定!
    
  • groupmod
    [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:!::
    
    • groupdel

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

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

    主機的細部權限規劃:ACL 的使用
  • ACL 是 Access Control List 的縮寫,主要的目的是在提供傳統的 owner,group,others 的 read,write,execute 權限之外的細部權限設定。ACL 可以針對單一使用者,單一檔案或目錄來進行 r,w,x 的權限規範,對於需要特殊權限的使用狀況非常有幫助。

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

    • 使用者 (user):可以針對使用者來設定權限;
    • 群組 (group):針對群組為對象來設定其權限;
    • 預設屬性 (mask):還可以針對在該目錄下在建立新檔案/目錄時,規範新資料的預設權限;

    因此要使用 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
    ....(後面省略)....
    

    那如果你的系統預設不會幫你加上 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

  • ACL 的設定技巧: getfacl, setfacl

     

    • getfacl:取得某個檔案/目錄的 ACL 設定項目;
    • setfacl:設定某個目錄/檔案的 ACL 規範。
    • 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 檔名 』即可啦! 太簡單了!鳥哥就不另外介紹了!請自行測試測試吧!

    範例:原本是 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 - username 』或『 su -l username 』, 才會連同 PATH/USER/MAIL 等變數都轉成新使用者的環境;

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

    • 使用 root 切換成為任何使用者時,並不需要輸入新使用者的密碼;

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


     

  • 阅读(970) | 评论(0) | 转发(0) |
    给主人留下些什么吧!~~