一、Linux的帐号与用户组

1.用户帐号和密码文件结构

(1)/etc/passwd文件结构

每一行由以下部分组成:

用户名密码UIDGID用户信息说明主文件夹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.有效与初始用户组:groupsnewgrp

(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的有效GIDadm。由于是新获得一杠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的设置技巧:getfaclsetfacl

(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