一、Linux的帐号与用户组
1.用户帐号和密码文件结构
(1)/etc/passwd文件结构
每一行由以下部分组成:
用户名 | 密码 | UID | GID | 用户信息说明 | 主文件夹 | shell |
关于这几栏说明如下:
①密码:密码已经放到/etc/shadow了,这里以x代替。
②UID说明:
id范围 | 该ID使用者特性 |
0 (系统管理员) | 当UID是0时,代表这个账号是系统管理员。 |
1~999 (系统账号) | 保留给系统使用的ID,其实除了0之外,其他的UID权限与特性并没有不一样。默认1000以下的数字是保留账号只是一个习惯。 由于系统上面启动的网络服务或后台服务使用较小的权限去运行,不想用root的身份去运行它们,所以需要运行中程序的用户账号才行。这些账号通常是无法登陆,所以有/sbin/nologin这个特殊的shell存在。 1~200:由distributions自行建立的系统账号;201~999:若用户有系统账号需求时,可以使用的账号UID。 |
1000~ | 给一般使用者用的,可登录帐号。 |
(2)/etc/shadow文件结构
用户名 | 密码(加密后的密码) | 最近修改密码日期 | 密码不可修改天数 | 密码需要修改天数 | 密码需要修改前警告天数 | 密码过期后帐号宽限天数 | 账号失效日期 | 保留位 |
说明如下:
(1)最近修改密码日期显示为一个整数,即为以1970年1月1日为第1天后的第多少天;
(2)密码不可修改天数指的是修改一次密码之后,几天内不允许再次修改;
(3)密码需要修改天数指的是修改一次密码之后,几天之内必须再次修改;
(4)密码需要修改前警告天数是密码需要修改天数前几天给你一次警告。
后面就不需要解释了。
2.有效与初始用户组:groups、newgrp
(1)/etc/group文件结构
用户组名 | 用户组密码 | GID | 用户组的帐号名称(已经不会显示内容) |
(2)有效用户组与初始用户组
一个用户可以加入多个用户组,那么,做任务的时候以哪一个用户组为准呢?
还记得在/etc/passwd中第4列所对应的GID吧,那个GID所对应的用户组就是这个用户的初始用户组。也就是说,当用户一登录系统,就立即拥有这个用户组的相关权限。
但是非初始用户组的其它用户组就不一样了。以dmtsai为例,我将dmtsai加入users这个用户组当中,由于users这个用户组并非是dmtsai的初始用户组,因此,我必须要在/etc/group这个文件中,找到users那一行,并且将dmtsai这个账号加入第四栏,这样dmtsai才能够加入users这个用户组。
在这个例子之中,dmtsai同时支持dmtsai,wheel和user三个用户组,那么在读写执行操作的时候,只要那三个用户组任意一个用户组支持,那么dmtsai都能够去做。
但是,如果我要新建一个文件或者目录,新文件的组是dmtsai还是users呢?这就需要检查当时的有效用户组。
我们只需要在终端里面输入groups,即可获得当前用户所在的用户组,其中第一个为当前的有效用户组(图1.1中的xiaoao这个用户组)。如图1.1所示。
图1.1 有效用户组演示
这个时候,我们新建一个文件,这个文件的所有者为xiaoao,用户组是xiaoao。
如果我们想要切换有效用户组怎么办呢?使用newgrp。newgrp的使用方法为“newgrp 新用户组”。这样,有效用户组就可以切换到所需要的用户组。
newgrp这个命令是以另外一个shell来提供这个功能的,也就是说,xiaoao以一个新的shell登录,而在这个shell里面,xiaoao的有效GID为adm。由于是新获得一杠shell,所以想要回到原本环境中,输入exit就可以了。
如果你想加入别的用户组,可以用root使用usermod加入,也可以通过用户组管理员以gpasswd加入。
(3)/etc/gshadow
这个文件里面各列内容为:
用户组名 | 密码 | 用户组管理员帐号 | 该用户组的用户帐号 |
说明如下:
①密码:开头为!表示无合法密码,所以无用户组管理员;
②该用户组的用户帐号(与/etc/group的内容相同)
以系统管理员的角度来说,这个gshadow最大的功能就是建立用户组管理员。
二、帐号管理
1.新增和删除用户:useradd,相关配置文件,passwd,usermod,userdel
(1)useradd
使用方式如下:
[root@study ~]# useradd [-u UID] [-g 初始用户组] [-G 次要用户组] [-mM]\ > [-c 说明栏] [-d 用户目录绝对路径] [-s shell] 用户账号名 选项与参数: -u:后面接的是UID,是一组数字。直接指定一个特定的UID给这个账号。 -g:后面接的那个组名初始用户组。的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 用户名”即可,系统会帮我们完成很多操作。
useradd新建用户的时候参考的文件可以输入“useradd -D”来得到,我的系统里面的设置如下:
GROUP=100 HOME=/home INACTIVE=-1 #密码失效日期,shadow第7列 EXPIRE= #帐号失效日期,shadow第8列 SHELL=/bin/sh #默认的shell SKEL=/etc/skel #用户主文件夹的内容数据参考目录 CREATE_MAIL_SPOOL=no #是否主动帮用户建立邮件信箱 |
具体解释如下:
GROUP=100:新建账号的初始用户组使用GID为100。此設定項目指的就是讓新設使用者帳號的初始群組為 users 這一個的意思。但是我们知道Ubuntu上面并不是这样的,在Ubuntu上面预置的用户组为与账号名相同的用户组。这是因为针对用户组的角度有两种不同的机制所致,这两种机制分别是:
①私有用户组机制:系统会建立一个与账号一样的用户组给使用者作为初始用户组。这种用户组的设定机制会比较有保密性,这是因为使用者都有自己的用户组,而且HOME目录权限将会设定为700(仅有自己可进入自己的家目录)。使用这种机制将不会参考GROUP=100这个设定值。代表性的distributions有Ubuntu等;
②公共用户组机制:就是以GROUP=100这个设定值作为新建账号的初始用户组,因此每个账号都属于users这个用户组,且默认HOME目录通常的权限会是『drwxr-xr-x…username users…』,由于每个账号都属于users用户组,因此大家都可以互相分享家目录内的数据之故。代表distributions如SuSE等。
由于我们的Ubuntu使用私有用户组机制,因此这个设定项目是不会生效的。
EXPIRE= :帐号失效日期。为-1则是永远不会失效,其它数字代表多少天后失效。
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 1000 <==使用者最小的UID,意即小于1000的UID为系统保留 UID_MAX 60000 <==使用者能够用的最大UID SYS_UID_MIN 201 <==保留给用户自行设定的系统账号最小值 UID SYS_UID_MAX 999 <==保留给用户自行设定的系统账号最大值 UID GID_MIN 1000 <==使用者自定义组的最小 GID,小于 1000 为系统保留 GID_MAX 60000 <==使用者自定义组的最大 GID SYS_GID_MIN 201 <==保留给用户自行设定的系统账号最小值 GID SYS_GID_MAX 999 <==保留给用户自行设定的系统账号最大值 GID
CREATE_HOME yes <==在不加 -M 及 -m 时,是否主动建立用户家目录? UMASK 077 <==用户家目录建立的 umask ,因此权限会是 700 USERGROUPS_ENAB yes <==使用 userdel 删除时,是否会删除初始用户组 ENCRYPT_METHOD SHA512 <==密码加密的机制使用的是 sha512 这一个机制! |
(2)passwd
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字段,密码失效天数 |
密码要求:
①密码不能与账号相同;
②密码尽量不要选用字典里面会出现的字符串;
③密码需要超过8个字符;
④密码不要使用个人信息,如身份证、手机号码、其他电话号码等;
⑤密码不要使用简单的关系式,如1+1=2,Iamvbird等;
⑥密码尽量使用大小写字符、数字、特殊字符($,_,-等)的组合。
(3)chage:密码参数显示的功能。
[root@study ~]# chage [-ldEImMW] 账号名 选项与参数: -l:列出该账号的详细密码参数; -d:后面接日期,修改shadow第三字段(最近一次更改密码的日期),格式YYYY-MM-DD -E:后面接日期,修改shadow第八字段(账号失效日),格式YYYY-MM-DD -I:后面接天数,修改shadow第七字段(密码失效日期) -m:后面接天数,修改shadow第四字段(密码最短保留天数) -M:后面接天数,修改shadow第五字段(密码多久需要进行变更) -W:后面接天数,修改shadow第六字段(密码过期前警告日期) |
(4)usermod
[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密码栏的!拿掉,解冻啦! |
(5)userdel
这个功能就是删除用户的相关资料,用户相关资料主要有:
①用户帐号/密码相关参数:/etc/passwd,/etc/shadow;
②用户的用户组相关参数:/etc/group,,/etc/gshadow;
③用户个人文件数据:/home/username,/var/spool/mail/username。
这个命令的语法非常简单:
[root@study ~]#userdel[-r] username 选项及参数: -r:连同用户的文件目录也一起删除 |
通常我们要删除一个账号的时候,你可以手动的将/etc/passwd与/etc/shadow里的该账号取消即可!一般而言,如果该账号只是『暂时不启用』的话,那么将/etc/shadow里头账号失效日期(第八字段)设定为0就可以让该账号无法使用,但是所有跟该账号相关的数据都会留下来!使用userdel的时机通常是你真的确定不要让该用户在主机上面使用任何数据了。
2.用户功能:id,finger,chfn,chsh
(1)id:这个命令可以查询某人或自己相关UID/GID等信息。简单来说的使用方法就是“id username”的格式。
我使用命令id xiaoao,查询结果如下:
uid=1000(xiaoao) gid=1000(xiaoao) 组=1000(xiaoao),4(adm),24(cdrom),27(sudo),30(dip),46 (plugdev),116(lpadmin),126(sambashare) |
(2)finger:这个指令可以查阅很多用户相关的信息。但是由于不安全,所以该命令已经不内置。
(3)chfn:change finger的意思。使用方法如下:
[root@study ~]# chfn [-foph] [用户名] 选项与参数: -f:后面接完整的名字; -o:您办公室的房间号码; -p:办公室的电话号码; -h:家里的电话号码。 |
(4)chsh
[vbird1@study ~]$ chsh [-ls] 选项与参数: -l:列出目前系统上面可用的shell,其实就是/etc/shells的内容! -s:设定修改自己的Shell。 |
3.新增与删除用户组:groupadd,groupmod,groupdel,gpasswd用户组管理员
(1)groupadd
[root@study ~]# groupadd [-g gid] [-r] 用户名 选项与参数: -g:后面接某个特定的GID,用来直接给予某个GID~ -r:建立系统用户啦!与/etc/login.defs内的GID_MIN有关。 |
(2)groupmod
[root@study ~]# groupmod [-g gid] [-n group_name] 用户组名 选项与参数: -g:修改既有的GID数字; -n:修改既有的用户组名。 |
(3)groupdel
删除用户组,使用方法“groupdel groupname”即可。必须要确认/etc/passwd内的账号没有任何人使用该用户组作为initial group才能删除该用户组。
(4)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的使用
1.关于ACL
ACL是Access Control List的缩写,主要的目的是在提供传统的owner, group, others的read, write, execute权限之外的细节权限设定。ACL可以针对单一用户,单一文件或目录来进行r, w, x的权限规范,对于需要特殊权限的使用状况非常有帮助。它主要针对以下几个项目:
(1)用户:可以针对用户来设置权限;
(2)用户组:针对用户组为对象设置权限;
(3)预置属性:还可以针对这该目录下在建立新文件/目录时,规定新数据的预置权限等。
目前ACL几乎已经预置加入在所有常见的Linux文件系统的挂载参数中。要查询系统是否支持ACL,可以执行:dmesg | grep -i acl。经过测试,我的系统支持ACL。
2.ACL的设置技巧:getfacl,setfacl
(1)setfacl:设置某个目录/文件的ACL。其使用方法如下:
[root@study ~]# setfacl [-bkRd] [{-m|-x} acl参数] 目标文件名 选项与参数: -m:设置后续的ACL参数给文件使用,不可与-x合用; -x:删除后续的ACL参数,不可与-m合用; -b:删除『所有的』ACL设定参数; -k:删除『预置的』ACL参数; -R:递归设置ACL,亦即包括次目录都会被设定起来; -d:设定『预置ACL参数』,只对目录有效,在该目录新建的数据会引用此默认值。 |
使用举例见:http://linux.vbird.org/linux_basic/0410accountmanager.php#acl_talk
(2)getfacl:获得某个文件/目录的ACL设置内容。用法如下:
[root@study ~]# getfacl filename 选项与参数: getfacl的选项几乎与setfacl相同。 |
(3)特定的单一用户组的权限设置
格式如下:
g:用户组名:权限[rwx] 例如:setfacl -m g:mygroup1:rx acl_test1 |
(4)针对有效权限设置“m:权限”
格式如下:
[root@study ~]# setfacl -m m:r acl_test1 |
(5)使用预置权限设置目录未来文件的ACL权限
# 预置权限:『 d:[ug]:使用者列表:[rwx] 』
# 举例:让myuser1在/srv/projecta底下一直具有rx的预置权限! [root@study ~]# setfacl -m d:u:myuser1:rx /srv/projecta |