六、账号管理与ACL权限设置
6.1 账号与群组管理的文件结构
(1)/etc/passwd 所有账号与一般身份使用者的相关信息。
每一行定义一个用户,格式为 name:password:uid:gid:comment:home:shell。分别为:
name -- 用户登录名
password -- 用户口令,该口令是加密过的。如果此域为空,则表明该用户登录无需口令。
uid -- 用户UID。用户登录后,系统通过该值,而非用户名来标识用户。
gid -- 用户组ID。
comment -- 用户相关信息,比如真实姓名、用户描述等。
home -- 用户的家目录的绝对路径。
shell -- 用户环境,也就是用户使用到的SHELL路径。
(2)/etc/shadow 个人密码信息。
-- 用于存放用户口令信息,仅有root用户才有查看和修改权限。
字段之间用“:”隔开,分别为:
(1)用户登录名
(2)加密后的用户口令 -- 长度为13个字符。如果此域为空,则表明该用户登录无需口令。
(3)最后一次修改密码的时间 -- 存放的是时间戳。
(4)最小时间间隔 -- 两次修改口令之间所需的最小天数,可用于避免频繁修改口令。
(5)最大时间间隔 -- 口令保持有效的最大天数,可用于强制定期修改口令。99999表示永远有效。
(6)到期警告提前天数 -- 密码过期提前警告用户的天数,默认值是7天。
(7)密码过期后的账号宽限天数。
(8)失效日期 -- 账号的生存天数,到期后该账号不能再用来登录。
(9)保留字段
(3)/etc/group 群组信息。
--存放用户组信息。每行一个组。字节之间以“:”隔开,分别是:
(1)组名
(2)组口令 -- 一般不使用
(3)GID、组ID
(4)组成员
6.2 账号管理
6.2.1 新增、删除和编辑账号
(1) useradd 新增账号
语法:useradd [-u UID] [-g 群组名称] [-G 次要群组名称] [-mM] [-d 家目录路径] [-s shell] 账号名称
选项:
-u 后面接UID,给账号指定UID。
-g 后面接群组名称,给账号指定群组。
-G 后面接群组名称,给账号指定还可以加入的群组。
-m 建立用户家目录。
-M 不建立用户家目录。
-d 指定某个目录为家目录,必须为绝对路径。
-s 给账号指定shell。
(2) passwd 给账号设置密码
语法:passwd [账号]。 如果没有加[账号]则是修改自己的密码。
(3) chage 显示密码详细或修改密码属性
语法:chage [-ldEImMW] 账号
选项:
-l 列出该账号的详细密码属性,如
-d 后面接日期(格式YYYY-MM-DD),修改最近一次更新密码的日期(/etc/shadow第3字段)。
-E 后面接日期(格式YYYY-MM-DD),修改账号生效日期(/etc/shadow第8字段)。
-I 后面接天数,修改密码失效的天数(/etc/shadow第7字段)。
-m 后面接天数,修改密码最短保留天数(/etc/shadow第4字段)。
-M 后面接天数,修改密码多久需要进行修改(/etc/shadow第5字段)。
-W 后面接天数,修改密码到期警告的提前天数(/etc/shadow第6字段)。
(4)usermod 修改账号。
语法: usermode [-cdegGlLsuU] 账号
选项:
-c 后面接账号说明,即修改账号的描述。
-d 后面接账号家目录,即修改账号的家目录。
-e 后面接日期(格式YYYY-MM-DD),即修改账号生效日期。
-f 后面接天数,即修改密码过期后的宽限天数。
-g 后面接初始群组名。
-G 后面接次要群组名。
-l 后面接账号名,即修改账号名称。
-L 暂时冻结账号密码。
-u 后面接UID,修改账号的UID。
-U 解冻账号密码,与-L相对。
(5) userdel 删除账号
语法: userdel 账号
6.2.2 针对账号的操作
(1)finger 查看账号信息
语法: finger [-s] 账号
(2)id 查看账号UID和GID
语法: id 账号。 不加账号则表示查看自己的ID信息。
6.2.3 新增、删除和编辑群组
(1)groupadd 新增群组
语法: groupadd [-g GID] 群组名
(2)groupmod 修改群组
语法: groupmod [-g GID] [-n 群组名] 群组名
选项:
-n 后面接新的群组名,即修改群组名。
(3)groupdel 删除群组
语法: groupdel 群组名
(4)gpasswd 群组管理员功能
系统管理员使用:
[1] gpasswd 群组名
-- 给群组设置一个密码。
[2] gpasswd [-A user1,...] [-M user3,...] 群组名
[3] gpasswd [-rR] 群组名
选项:
-A 后面接账号列表(多个账号以,隔开),将群组的管理权交给后面的账号管理。
-M 后面接账号列表(多个账号以,隔开),将后面的账号加入到这个群组当中。
-r 移除群组的密码。
-R 让群组的密码栏失效。
(5)群组管理员使用: gpasswd [-ad] 账号 群组
选项:
-a 将账号加入到群组中。
-d 将账号从群组中删除。
6.3 权限细节规划--ACL的应用
Linux的权限控制是按照OWNER、GROUP、OTHER三者来划分的,这样就会存在权限控制不够精细的问题。比如想让不存同一群组的用户拥有OWNER一样的权限,那么处理的办法有是三个:
(1)将该用户加入相同的群组。后果是用户会拥有群组的更多权限。
(2)将权限赋予OTHER。后果是其他用户也会拥有该权限。
(3)设置sudo,是该用户可进行操作。但当文件跟用户数量很多时,该方法不够灵活。
ACL(Access Control List)的存在可以实现权限的细节规划。
(1) setfacl -- 设置某个文件/目录的ACL规范
语法: setfacl [-bkRd] [{-m|-x} acl参数] 文件或目录名
选项:
-m 设置后面的acl参数给文件/目录,不可与-x一起使用。
-x 删除后面的acl参数,不可与-m一起使用。
-b 移除所有的ACL参数,用于卸载ACL设置。
-k 移除预设置的ACL参数。
-R 递归设置ACL(子目录和子文件都会被设置)。
-d 以预设值设定ACL参数。仅对木有有效。
ACL参数格式:
user::[rwx-] -- OWNER拥有的权限,如user::rw-。
user:username:[rwx-] -- 用户username拥有的权限,如user:john:rw-。
group::[rwx-] -- 群组拥有的权限,如group::rwx。
group:groupname:[rwx-] -- 群组groupname拥有的权限,如group:devgp:rw-。
mask::[rwx-] -- 用户和群组的有效权限。用户或群组所设定的权限必须存在于mask的权限设置范围内才有效。
other::[rwx-] -- 其他用户的权限,如other::rw-。
示例:
a)将文件myfile的读/执行权限赋予OTHER里边的myuser账号:
setfacl -m u:myuser:rx myfile 或 setfacl -m user:myuser:rx myfile
b)将目录mydir的读/执行权限赋予另外一个群组mygroup(包括子目录和子文件):
setfacl -m d:g:mygroup:rx mydir 或 setfacl -m d:group:mygroup:rx mydir
c)设置文件myfile的有效权限为读。
setfacl -m m:r myfile
(2) getfacl -- 获取某个文件/目录的ACL规范
语法:getfacl 文件名
6.4 使用者身份切换
su -- switch user 以非登陆方式切换用户身份(即仅用户身份切换,但环境变量(如PATH/USER/MAIL)不对应变换)。
语法: su [-c 指令] 账号名
选项: -c 后接指令,仅执行一次。
su - -- 以登陆方式切换用户身份(用户身份切换,环境变量也对应变换)
语法: su - 账号名
sudo -- 以其他账号的身份执行指令
语法:sudo [-u 其他账号名] 指令
流程:
(1)系统在/etc/sudoers文件中搜索当前用户是否有执行sudo的权限;
(2)若当前用户拥有可执行sudo的权限后,让其输入密码进行确认(root执行sudo时,不需要输入密码;若被切换的账号名与当前用户相同,则不需要输入密码);
(3)若密码输入成功,则开始执行sudo后接的指令。
6.5 特殊权限 - SUID、SGID、SBIT
6.5.1 SUID
在文件拥有者的x权限上出现s标志,则是简称为SUID的特殊权限。SUID有以下功能与限制:
(1)SUID权限仅对二进制程序(binary program)有效;
(2)执行者对该程序需要具有x的可执行权限;
(3)本权限仅在执行该程序的过程中有效。
(4)执行者将拥有该程序拥有者的权限。
示例:在LINUX中,所有账号密码都记录在/etc/shadow文件中,其权限为 -r-------- l root root,即仅有root可以读写该文件。那么一般的用户要修改自己的密码(其实也是修改该文件中自己的密码属性),则需要通过passwd指令来执行。这时:(1)一般用户对于/usr/bin/passwd具有x权限,可以执行passwd指令;(2)passwd的拥有者为root;(3)一般用户执行passwd的过程中,会暂时拥有root的权限。于是,/etc/shadow就可以被一般用户执行的passwd所修改。
6.5.2 SGID
与SUID一样,SGID特殊权限是文件在群组的x权限出现s标志。与SUID不同的是,SGID可以针对目录和文件来设定。
如果是针对文件,SGID有以下功能:
(1)SGID对二进制程序有用;
(2)执行者对该程序需要具有x的可执行权限;
(3)执行者在执行过程中将会获得该程序群组的权限。
如果是针对目录,SGID有以下功能:
(1)用户若对该目录具有r和x的权限,则该用户能够进入此目录;
(2)用户在这个目录下的有效群组将会变成该目录的群组;
(3)若用户在该目录下具有w权限,则使用者所建立的新文件的群组与该目录的群组相同。
6.5.3 SBIT
SBIT(Sticky Bit)仅针对目录有效。当用户对于目录的身份是群组或者其它的身份,并且拥有该目录w权限,则它可以删除/重命名/移动该目录下任何人建立的文件或目录。但如果该目录加上SBIT权限后,该用户就只能够删除/重命名/移动自己建立的文件或目录,而无法删除其他人的文件。
6.5.4 SUID/SGID/SBIT权限设定
(1)使用chmod+数字来设定权限:
在数字前面加多1个数字来表示要设置SUID/SGID/SBIT权限,该数字的意义为:
4为SUID、2为SGID、1为SBIT。如要设置某文件权限为“-rwsr-xr-x”,则在原先的755前再加上4,即 chmod 4755 filename。
(2)使用chmod+符号来设定权限:
如chmod u+s filename -- 设置SUID; chmod g+s,o+t filename -- 设置SGID和SBIT。
6.6 用户间的信息通讯
6.6.1 查询用户
w 或 who -- 查看当前已登录的用户
lastlog -- 查看每个账号最近登录的时间
6.6.2 用户间对话
write -- 向指定用户发送信息,按ctrl+d结束输入。
语法: write 账号 [该账号所在的终端接口]
示例: write myuser pts/2
mesg -- 开启或屏蔽他人发来的信息
语法: mesg [yn] (y为开启,n为关闭)
示例: mesg n
说明: 对root发来的信息,无法屏蔽
wall -- 向系统上所有用户发送信息
示例: wall "i will shutdown it!"
6.6.3 用户信箱
(1)寄信:输入 mail 账号 -s 标题 [< filename]
示例1:# mail myuser -s "hello,mail"
Hello,Linux mail.
This is the first time to send mail.
. --最后一行输入小数点.,表示结束。
Cc: --抄送
实例2:# mail myuser -s "hello,mail" < /usr/mymail
将/usr/mymail的文件内容当做邮件内容进行发送。
(2)收信:直接输入 mail 可获得邮件列表,如以>N开头则标识未读,在列表最后面的&后输入?可以进行邮件的操作。
邮件操作指令主要有:
h 列出邮件标题,查看10封邮件的标题,可以输入 h40。
d 后接邮件号码,删除一封邮件,如 d8,删除9到11则为d9-11。
x 不保存直接退出(即之前删除操作不会真正执行)。
q 保存后退出(之前的删除操作会真正执行)。已读邮件会存入 ~/mbox(路径可能未/home/myuser/mbox),读取已读文件则使用 mail -f /home/myuser/mbox。
6.1 账号与群组管理的文件结构
(1)/etc/passwd 所有账号与一般身份使用者的相关信息。
每一行定义一个用户,格式为 name:password:uid:gid:comment:home:shell。分别为:
name -- 用户登录名
password -- 用户口令,该口令是加密过的。如果此域为空,则表明该用户登录无需口令。
uid -- 用户UID。用户登录后,系统通过该值,而非用户名来标识用户。
gid -- 用户组ID。
comment -- 用户相关信息,比如真实姓名、用户描述等。
home -- 用户的家目录的绝对路径。
shell -- 用户环境,也就是用户使用到的SHELL路径。
(2)/etc/shadow 个人密码信息。
-- 用于存放用户口令信息,仅有root用户才有查看和修改权限。
字段之间用“:”隔开,分别为:
(1)用户登录名
(2)加密后的用户口令 -- 长度为13个字符。如果此域为空,则表明该用户登录无需口令。
(3)最后一次修改密码的时间 -- 存放的是时间戳。
(4)最小时间间隔 -- 两次修改口令之间所需的最小天数,可用于避免频繁修改口令。
(5)最大时间间隔 -- 口令保持有效的最大天数,可用于强制定期修改口令。99999表示永远有效。
(6)到期警告提前天数 -- 密码过期提前警告用户的天数,默认值是7天。
(7)密码过期后的账号宽限天数。
(8)失效日期 -- 账号的生存天数,到期后该账号不能再用来登录。
(9)保留字段
(3)/etc/group 群组信息。
--存放用户组信息。每行一个组。字节之间以“:”隔开,分别是:
(1)组名
(2)组口令 -- 一般不使用
(3)GID、组ID
(4)组成员
6.2 账号管理
6.2.1 新增、删除和编辑账号
(1) useradd 新增账号
语法:useradd [-u UID] [-g 群组名称] [-G 次要群组名称] [-mM] [-d 家目录路径] [-s shell] 账号名称
选项:
-u 后面接UID,给账号指定UID。
-g 后面接群组名称,给账号指定群组。
-G 后面接群组名称,给账号指定还可以加入的群组。
-m 建立用户家目录。
-M 不建立用户家目录。
-d 指定某个目录为家目录,必须为绝对路径。
-s 给账号指定shell。
(2) passwd 给账号设置密码
语法:passwd [账号]。 如果没有加[账号]则是修改自己的密码。
(3) chage 显示密码详细或修改密码属性
语法:chage [-ldEImMW] 账号
选项:
-l 列出该账号的详细密码属性,如
-d 后面接日期(格式YYYY-MM-DD),修改最近一次更新密码的日期(/etc/shadow第3字段)。
-E 后面接日期(格式YYYY-MM-DD),修改账号生效日期(/etc/shadow第8字段)。
-I 后面接天数,修改密码失效的天数(/etc/shadow第7字段)。
-m 后面接天数,修改密码最短保留天数(/etc/shadow第4字段)。
-M 后面接天数,修改密码多久需要进行修改(/etc/shadow第5字段)。
-W 后面接天数,修改密码到期警告的提前天数(/etc/shadow第6字段)。
(4)usermod 修改账号。
语法: usermode [-cdegGlLsuU] 账号
选项:
-c 后面接账号说明,即修改账号的描述。
-d 后面接账号家目录,即修改账号的家目录。
-e 后面接日期(格式YYYY-MM-DD),即修改账号生效日期。
-f 后面接天数,即修改密码过期后的宽限天数。
-g 后面接初始群组名。
-G 后面接次要群组名。
-l 后面接账号名,即修改账号名称。
-L 暂时冻结账号密码。
-u 后面接UID,修改账号的UID。
-U 解冻账号密码,与-L相对。
(5) userdel 删除账号
语法: userdel 账号
6.2.2 针对账号的操作
(1)finger 查看账号信息
语法: finger [-s] 账号
(2)id 查看账号UID和GID
语法: id 账号。 不加账号则表示查看自己的ID信息。
6.2.3 新增、删除和编辑群组
(1)groupadd 新增群组
语法: groupadd [-g GID] 群组名
(2)groupmod 修改群组
语法: groupmod [-g GID] [-n 群组名] 群组名
选项:
-n 后面接新的群组名,即修改群组名。
(3)groupdel 删除群组
语法: groupdel 群组名
(4)gpasswd 群组管理员功能
系统管理员使用:
[1] gpasswd 群组名
-- 给群组设置一个密码。
[2] gpasswd [-A user1,...] [-M user3,...] 群组名
[3] gpasswd [-rR] 群组名
选项:
-A 后面接账号列表(多个账号以,隔开),将群组的管理权交给后面的账号管理。
-M 后面接账号列表(多个账号以,隔开),将后面的账号加入到这个群组当中。
-r 移除群组的密码。
-R 让群组的密码栏失效。
(5)群组管理员使用: gpasswd [-ad] 账号 群组
选项:
-a 将账号加入到群组中。
-d 将账号从群组中删除。
6.3 权限细节规划--ACL的应用
Linux的权限控制是按照OWNER、GROUP、OTHER三者来划分的,这样就会存在权限控制不够精细的问题。比如想让不存同一群组的用户拥有OWNER一样的权限,那么处理的办法有是三个:
(1)将该用户加入相同的群组。后果是用户会拥有群组的更多权限。
(2)将权限赋予OTHER。后果是其他用户也会拥有该权限。
(3)设置sudo,是该用户可进行操作。但当文件跟用户数量很多时,该方法不够灵活。
ACL(Access Control List)的存在可以实现权限的细节规划。
(1) setfacl -- 设置某个文件/目录的ACL规范
语法: setfacl [-bkRd] [{-m|-x} acl参数] 文件或目录名
选项:
-m 设置后面的acl参数给文件/目录,不可与-x一起使用。
-x 删除后面的acl参数,不可与-m一起使用。
-b 移除所有的ACL参数,用于卸载ACL设置。
-k 移除预设置的ACL参数。
-R 递归设置ACL(子目录和子文件都会被设置)。
-d 以预设值设定ACL参数。仅对木有有效。
ACL参数格式:
user::[rwx-] -- OWNER拥有的权限,如user::rw-。
user:username:[rwx-] -- 用户username拥有的权限,如user:john:rw-。
group::[rwx-] -- 群组拥有的权限,如group::rwx。
group:groupname:[rwx-] -- 群组groupname拥有的权限,如group:devgp:rw-。
mask::[rwx-] -- 用户和群组的有效权限。用户或群组所设定的权限必须存在于mask的权限设置范围内才有效。
other::[rwx-] -- 其他用户的权限,如other::rw-。
示例:
a)将文件myfile的读/执行权限赋予OTHER里边的myuser账号:
setfacl -m u:myuser:rx myfile 或 setfacl -m user:myuser:rx myfile
b)将目录mydir的读/执行权限赋予另外一个群组mygroup(包括子目录和子文件):
setfacl -m d:g:mygroup:rx mydir 或 setfacl -m d:group:mygroup:rx mydir
c)设置文件myfile的有效权限为读。
setfacl -m m:r myfile
(2) getfacl -- 获取某个文件/目录的ACL规范
语法:getfacl 文件名
6.4 使用者身份切换
su -- switch user 以非登陆方式切换用户身份(即仅用户身份切换,但环境变量(如PATH/USER/MAIL)不对应变换)。
语法: su [-c 指令] 账号名
选项: -c 后接指令,仅执行一次。
su - -- 以登陆方式切换用户身份(用户身份切换,环境变量也对应变换)
语法: su - 账号名
sudo -- 以其他账号的身份执行指令
语法:sudo [-u 其他账号名] 指令
流程:
(1)系统在/etc/sudoers文件中搜索当前用户是否有执行sudo的权限;
(2)若当前用户拥有可执行sudo的权限后,让其输入密码进行确认(root执行sudo时,不需要输入密码;若被切换的账号名与当前用户相同,则不需要输入密码);
(3)若密码输入成功,则开始执行sudo后接的指令。
6.5 特殊权限 - SUID、SGID、SBIT
6.5.1 SUID
在文件拥有者的x权限上出现s标志,则是简称为SUID的特殊权限。SUID有以下功能与限制:
(1)SUID权限仅对二进制程序(binary program)有效;
(2)执行者对该程序需要具有x的可执行权限;
(3)本权限仅在执行该程序的过程中有效。
(4)执行者将拥有该程序拥有者的权限。
示例:在LINUX中,所有账号密码都记录在/etc/shadow文件中,其权限为 -r-------- l root root,即仅有root可以读写该文件。那么一般的用户要修改自己的密码(其实也是修改该文件中自己的密码属性),则需要通过passwd指令来执行。这时:(1)一般用户对于/usr/bin/passwd具有x权限,可以执行passwd指令;(2)passwd的拥有者为root;(3)一般用户执行passwd的过程中,会暂时拥有root的权限。于是,/etc/shadow就可以被一般用户执行的passwd所修改。
6.5.2 SGID
与SUID一样,SGID特殊权限是文件在群组的x权限出现s标志。与SUID不同的是,SGID可以针对目录和文件来设定。
如果是针对文件,SGID有以下功能:
(1)SGID对二进制程序有用;
(2)执行者对该程序需要具有x的可执行权限;
(3)执行者在执行过程中将会获得该程序群组的权限。
如果是针对目录,SGID有以下功能:
(1)用户若对该目录具有r和x的权限,则该用户能够进入此目录;
(2)用户在这个目录下的有效群组将会变成该目录的群组;
(3)若用户在该目录下具有w权限,则使用者所建立的新文件的群组与该目录的群组相同。
6.5.3 SBIT
SBIT(Sticky Bit)仅针对目录有效。当用户对于目录的身份是群组或者其它的身份,并且拥有该目录w权限,则它可以删除/重命名/移动该目录下任何人建立的文件或目录。但如果该目录加上SBIT权限后,该用户就只能够删除/重命名/移动自己建立的文件或目录,而无法删除其他人的文件。
6.5.4 SUID/SGID/SBIT权限设定
(1)使用chmod+数字来设定权限:
在数字前面加多1个数字来表示要设置SUID/SGID/SBIT权限,该数字的意义为:
4为SUID、2为SGID、1为SBIT。如要设置某文件权限为“-rwsr-xr-x”,则在原先的755前再加上4,即 chmod 4755 filename。
(2)使用chmod+符号来设定权限:
如chmod u+s filename -- 设置SUID; chmod g+s,o+t filename -- 设置SGID和SBIT。
6.6 用户间的信息通讯
6.6.1 查询用户
w 或 who -- 查看当前已登录的用户
lastlog -- 查看每个账号最近登录的时间
6.6.2 用户间对话
write -- 向指定用户发送信息,按ctrl+d结束输入。
语法: write 账号 [该账号所在的终端接口]
示例: write myuser pts/2
mesg -- 开启或屏蔽他人发来的信息
语法: mesg [yn] (y为开启,n为关闭)
示例: mesg n
说明: 对root发来的信息,无法屏蔽
wall -- 向系统上所有用户发送信息
示例: wall "i will shutdown it!"
6.6.3 用户信箱
(1)寄信:输入 mail 账号 -s 标题 [< filename]
示例1:# mail myuser -s "hello,mail"
Hello,Linux mail.
This is the first time to send mail.
. --最后一行输入小数点.,表示结束。
Cc: --抄送
实例2:# mail myuser -s "hello,mail" < /usr/mymail
将/usr/mymail的文件内容当做邮件内容进行发送。
(2)收信:直接输入 mail 可获得邮件列表,如以>N开头则标识未读,在列表最后面的&后输入?可以进行邮件的操作。
邮件操作指令主要有:
h 列出邮件标题,查看10封邮件的标题,可以输入 h40。
d 后接邮件号码,删除一封邮件,如 d8,删除9到11则为d9-11。
x 不保存直接退出(即之前删除操作不会真正执行)。
q 保存后退出(之前的删除操作会真正执行)。已读邮件会存入 ~/mbox(路径可能未/home/myuser/mbox),读取已读文件则使用 mail -f /home/myuser/mbox。