Linux 账号管理与 ACL 权限设定

Linux 的账号与群组

每个登入Linux的使用者至少都会取得两个 ID ,一个是使用者 ID (User ID ,简称 UID),一个是群组 ID (Group ID ,简称 GID)。

使用者账号

Linux 系统上面的用户登入主机以取得 shell 的环境来工作的过程:

  1. 先找寻 /etc/passwd 里面是否有你输入的账号。如果没有则跳出,如果有的话则将该账号对应的 UID 与 GID (在 /etc/group 中) 读出来,另外,该账号的家目录与 shell 设定也一并读出。
  2. 核对密码表。Linux 会进入 /etc/shadow 里面找出对应的账号与 UID,然后核对一下你刚 刚输入的密码与里头的密码是否相符。
  3. 如果一切都 OK 的话,就进入 Shell 控管的阶段。

/etc/passwd 文件结构

每一行都代表一个账号,有几行就代表有几个账号在你的系统中。 Linux中有很多账号是系统正常运作所必须要的,称为系统账号,如 bin, daemon, adm, nobody 等。

zzz@zzz-ubuntu-64:~$ head -n 2 /etc/passwd
root  : x :  0 :  0 :root  :/root    :/bin/bash
daemon: x :  1 :  1 :daemon:/usr/sbin:/usr/sbin/nologin
[  1 ][ 2 ][ 3 ][ 4 ][  5  ][    6   ][       7       ]
  • 1 代表账号名称,与 3 对应,3 为 UID
  • 2 代表用户密码,为了安全起见,密码存放在 /etc/shadow 文件夹中,这里只显示 x
  • 3 代表 UID,其值为 0 时 代表为系统管理员,1~999 代表系统账号,1000~60000代表可登入账号
  • 4 代表 GID
  • 5 代表 组名
  • 6 代表家目录
  • 7 代表 shell

/etc/shadow 文件结构

[root@study ~]# head -n 1 /etc/shadow 
root:$6$wtbCCce/PxMeE5wm...:16559: 0  :99999: 7  :  :  :
[ 1 ][         2           ][  3 ][ 4 ][  5 ][ 6 ][7][8] 
  • 1 代表用户名
  • 2 代表加密后的用户密码,想让其失效可以在前面加上 ! 或 *
  • 3 代表更动密码的日期,16559就是 2015/05/04
  • 4 密码不可被更动的天数(与第 3 字段相比),0代表可以随时更改
  • 5 密码需要更改的天数(与第 3 字段相比),如若过了这个天数,密码会变为过期特性
  • 6 密码需要变更期限前的警告天数:(与第 5 字段相比)
  • 7 密码过期后的账号宽限时间(密码失效日)(与第 5 字段相比) ,密码过期了, 那当你登入系统时,系统会强制要求你必须要重新设定密码才能登入继续使用,这就是密码过期特性,如果不修改,就会失效,用户无法登陆
  • 8 账号失效日期: 使用 1970 年以来的总日数设定。这个字段表示: 这个账号在此字段规定的日期之后,将无法再使用

修改密码的命令为 passwdpasswd username

关于群组: 有效与初始群组、groups, newgrp

  • 群组记录在 /etc/group 中,/etc/gshadow 中记录组密码。用户默认群组称为初始群组(initial group),用户支持的群组称为有效群组(effective group)。
  • 使用命令groups 可以显示自己支持的群组,第一个为初始群组。
  • 使用命令newgrp 可以临时切换初始群组,而且只能切换自己支持的群组。使用此命令会新建一个 shell 来提供操作

账号管理

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

以下所有命令都是管理员才能够使用的命令(passwd除外)。

useradd 命令格式:

[root@study ~]# useradd [-u UID] [-g 初始群组] [-G 次要群组] [-mM]\ 
>  [-c 说明栏] [-d 家目录绝对路径] [-s shell] 使用者账号名 
选项与参数: 
-u  :后面接的是 UID ,是一组数字。直接指定一个特定的 UID 给这个账号; 
-g  :后面接的那个组名就是我们上面提到的 initial group, 该群组的 GID 会被放置到 /etc/passwd 的第四个字段内。 -G  :后面接的组名则是这个账号还可以加入的群组。这个选项与参数会修改 /etc/group 内的相关资料 
-M  :强制不要建立用户家目录!(系统账号默认值) uid <= 999
-m  :强制要建立用户家目录!(一般账号默认值)  uid >= 1000
-c  :这个就是 /etc/passwd 的第五栏的说明内容啦~可以随便我们设定的 
-d  :指定某个目录成为家目录,而不要使用默认值。务必使用绝对路径 
-r  :建立一个系统的账号,这个账号的 UID 会有限制 (参考 /etc/login.defs) 
-s  :后面接一个 shell ,若没有指定则预设是 /bin/bash 
-e  :后面接一个日期,格式为『YYYY-MM-DD』此项目可写入 shadow 第八字段,亦即账号失效日的设定项目啰; 
-f  :后面接 shadow 的第七字段项目,指定密码是否会失效。0 为立刻失效,-1 为永远不失效(密码只会过期而强制于登入时重新设定而已。) 

useradd 命令默认值可以使用 useradd -D 查看,其数据存在于 /etc/default/useradd中。

useradd 建立了账号之后,在预设的情况下,该账号是暂时被封锁,需要设置密码,passwd 命令格式:

[root@study ~]# passwd [--stdin] [账号名称]    <==所有人均可使用来改自己的密码 
[root@study ~]# 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 字段,密码失效日期 

chage 命令有更详细的密码参数显示功能,其用法:

[root@study ~]# chage [-ldEImMW] 账号名 
选项与参数: 
-l :列出该账号的详细密码参数; 
-d :后面接日期,修改 shadow 第三字段(最近一次更改密码的日期),格式 YYYY-MM-DD 
-E :后面接日期,修改 shadow 第八字段(账号失效日),格式 YYYY-MM-DD 
-I :后面接天数,修改 shadow 第七字段(密码失效日期) 
-m :后面接天数,修改 shadow 第四字段(密码最短保留天数) 
-M :后面接天数,修改 shadow 第五字段(密码多久需要进行变更) 
-W :后面接天数,修改 shadow 第六字段(密码过期前警告日期) 

如果想让某个用户登录必须修改密码则使用命令 chage -d 0 username

usermod 命令用来修改用户相关信息,命令参数与 useradd 相似:

[root@study ~]# 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 删除用户的相关数据:

  • 用户账号/密码相关参数:/etc/passwd, /etc/shadow
  • 使用者群组相关参数:/etc/group, /etc/gshadow
  • 用户个人文件数据: /home/username, /var/spool/mail/username..

命令格式:

[root@study ~]# userdel [-r] username 
选项与参数: 
-r  :连同用户的家目录也一起删除 

如果确认要删除某一用户的全部数据,最后先查询一下该用户的所有文件 find / -user username

用户功能

id username 命令,列出 username 的UID 和GID及所属组信息。 chsh 命令,修改自己所用的shell,-l 参数列出系统上可用的 shell ,其实就是 /etc/shells 的内容;-s 后接Shell。

新增与移除群组

groupadd 为新增群组命令,格式为:

[root@study ~]# groupadd [-g gid] [-r] 组名 
选项与参数: 
-g  :后面接某个特定的 GID ,用来直接给予 GID 
-r  :建立系统群组,与 /etc/login.defs 内的 GID_MIN 有关

groupmod 为修改群组信息命令,格式为:

[root@study ~]# groupmod [-g gid] [-n group_name] 群组名 
选项与参数: 
-g  :修改既有的 GID 数字; 
-n  :修改既有的组名 

groupdel 为删除群组命令,格式为: groupdel groupname ,删除时,要确认没有账号使用该群组作为 initial group。

gpasswd 为群组管理员功能命令,命令格式为:

# 关于系统管理员(root)做的动作: 
[root@study ~]# gpasswd groupname 
[root@study ~]# gpasswd [-A user1,...] [-M user3,...] groupname 
[root@study ~]# gpasswd [-rR] groupname 
选项与参数:     
    :若没有任何参数时,表示给予 groupname 一个密码(/etc/gshadow) 
-A  :将 groupname 的主控权交由后面的使用者管理(该群组的管理员) 
-M  :将某些账号加入这个群组当中! 
-r  :将 groupname 的密码移除 
-R  :让 groupname 的密码栏失效 

# 关于群组管理员(Group administrator)做的动作: 
[someone@study ~]$ gpasswd [-ad] user groupname 
选项与参数: 
-a  :将某位使用者加入到 groupname 这个群组当中! 
-d  :将某位使用者移除出 groupname 这个群组当中。 

主机的细部权限规划:ACL 的使用

ACL 是 Access Control List 的缩写,主要的目的是在提供传统的 owner,group,others 的 read,write,execute 权限之外的细部权限设定。ACL 可以针对单一使用者,单一文件或目录来进行 r,w,x 的权限规范,对于需要特殊权限的使用状况非常有帮助。

使用 dmesg | grep -i acl 查看核心挂载信息中是否有 acl。

ACL 的设定技巧: getfacl, setfacl

  • getfacl:取得某个文件/目录的 ACL 设定项目
  • setfacl:设定某个目录/文件的 ACL 规范

setfacl 命令格式:

[root@study ~]# setfacl [-bkRd] [{-m|-x} acl 参数] 目标文件名 
选项与参数: 
-m :设定后续的 acl 参数给文件使用,不可与 -x 合用; 
-x :删除后续的 acl 参数,不可与 -m 合用; 
-b :移除『所有的』 ACL 设定参数; 
-k :移除『预设的』 ACL 参数 
-R :递归设定 acl ,亦即包括次目录都会被设定起来; 
-d :设定『预设 acl 参数』的意思!只对目录有效,在该目录新建的数据会引用此默认值

例:

[root@study ~]# touch acl_test1 
[root@study ~]# ll acl_test1 
-rw-r--r--. 1 root root 0 Jul 21 17:33 acl_test1 
[root@study ~]# setfacl -m u:vbird1:rx acl_test1 
[root@study ~]# ll acl_test1 
-rw-r-xr--+ 1 root root 0 Jul 21 17:33 acl_test1 # 权限部分多了个 +  
[root@study ~]# setfacl -m u::rwx acl_test1 
[root@study ~]# ll acl_test1 
-rwxr-xr--+ 1 root root 0 Jul 21 17:33 acl_test1 
# 设定值中的 u后面无使用者列表,代表设定该文件拥有者,所以上面显示 root 的权限成为 rwx 了 

getfacl 命令用法: getfacl filename 。 范例:

[root@study ~]# getfacl acl_test1 
# file: acl_test1   <==说明档名 
# owner: root       <==说明此文件的拥有者,亦即 ls -l 看到的第三使用者字段 
# group: root       <==此文件的所属群组,亦即 ls -l 看到的第四群组字段 
user::rwx           <==使用者列表栏是空的,代表文件拥有者的权限 user:vbird1:r-x     <==针对 vbird1 的权限设定为 rx ,与拥有者并不同! group::r--          <==针对文件群组的权限设定仅有 r  
mask::r-x           <==此文件预设的有效权限 (mask)
other::r--          <==其他人拥有的权限啰! 

针对有效权限设定 [m : 权限]: 他有点像是『有效权限』的意思!他的意义是: 使用者或群组所设定的权限必须要存在于 mask 的权限设定范围内才会生效,此即『有效权限 (effective permission)』。

范例:

# 设定规范:『 m:[rwx] 』,例如针对刚刚的文件规范为仅有 r : 
[root@study ~]# setfacl -m m:r acl_test1 
[root@study ~]# getfacl acl_test1 
# file: acl_test1 
# owner: root 
# group: root 
user::rwx user:vbird1:r-x        #effective:r-- <==vbird1+mask 均存在者,仅有 r 而已,x 不会生效 group::r-- 
group:mygroup1:r-x     #effective:r-- 
mask::r-- 
other::r-- 

ACL 的权限设定不能够被次目录所继承,使用默认权限设定目录未来文件的 ACL 权限继承『 d:[u|g]:[user|group]:权限 』 ,范例: setfacl -m d:u:myuser1:rx /srv/projecta




发表评论

评论列表,共 0 条评论

    暂无评论