您的位置:首页 > 运维架构 > Linux

第十四章、Linux 账号管理与 ACL 权限配置

2011-06-27 16:41 651 查看
http://vbird.dic.ksu.edu.tw/linux_basic/0410accountmanager.php

输入账号口令后,系统处理流程:

1、先找寻 /etc/passwd 里面是否有你输入的账号?如果没有则跳出,如果有的话则将该账号对应的 UID 与 GID (在 /etc/group 中) 读出来,另外,该账号的家目录与 shell 配置也一并读出;

2、再来则是核对口令表!这时 Linux 会进入 /etc/shadow 里面找出对应的账号与 UID,然后核对一下你刚刚输入的口令与里头的口令是否相符。

3、如果一切都 OK 的话,就进入 Shell 控管的阶段

/etc/passwd文档的结构

每一行都代表一个账号,有几行就代表有几个账号。每一行使用『:』分隔开,共有七个部分,分别是:

1、账号名称:

2、口令

3、UID

id 范围该 ID 使用者特性
0
(系统管理员)
当 UID 是 0 时,代表这个账号是『系统管理员』!
所以当你要让其他的账号名称也具有 root 的权限时,将该账号的 UID 改为 0 即可。
这也就是说,一部系统上面的系统管理员不见得只有 root 喔!
不过,很不建议有多个账号的 UID 是 0 啦~
1~499
(系统账号)
保留给系统使用的 ID,其实除了 0 之外,其他的 UID 权限与特性并没有不一样。默认 500
以下的数字让给系统作为保留账号只是一个习惯。

由于系统上面启动的服务希望使用较小的权限去运行,因此不希望使用 root 的身份去运行这些服务,
所以我们就得要提供这些运行中程序的拥有者账号才行。这些系统账号通常是不可登陆的,
所以才会有我们在第十一章提到的 /sbin/nologin 这个特殊的 shell 存在。

根据系统账号的由来,通常系统账号又约略被区分为两种:

1~99:由 distributions 自行创建的系统账号;

100~499:若用户有系统账号需求时,可以使用的账号 UID。
500~65535
(可登陆账号)
给一般使用者用的。事实上,目前的 linux 核心 (2.6.x 版)已经可以支持到
4294967295 (2^32-1) 这么大的 UID 号码喔!
4、GID /etc/group 有关

5、用户信息说明栏

6、用户家目录

7、shell

/etc/shadow文件结构

[root@www ~]# head -n 4 /etc/shadow

root:$1$/30QpE5e$y9N/D0bh6rAACBEz.hqo00:14126:0:99999:7::: <==底下说明用

bin:*:14126:0:99999:7:::

daemon:*:14126:0:99999:7:::

adm:*:14126:0:99999:7:::

该文件以【:】作为分隔,每行共九个字段

1、账号名称

2、口令

3、最近更改口令日期

4、口令不可被更改的天数(与第三字段相比)

5、口令需要重新变更的天数(与第三字段相比)

6、口令需要变更期限前的警告天数(与第五字段相比)

7、口令过期后的宽限时间(与第五字段相比)

8、账号失效日期

9、保留

一般用户的口令忘记后,可以通过root用户使用passwd命令更改一般用户的口令

root用户口令忘记之后,这就麻烦了!因为你无法使用 root 的身份登陆了嘛! 但我们知道 root 的口令在 /etc/shadow 当中,因此你可以使用各种可行的方法启动进入 Linux 再去修改。 例如重新启动进入单人维护模式(第二十章)后,系统会主动的给予 root 权限的 bash 接口, 此时再以 passwd 修改口令即可;或以 Live CD 启动后挂载根目录去修改 /etc/shadow,将里面的 root 的口令字段清空, 再重新启动后 root 将不用口令即可登陆!登陆后再赶快以 passwd 命令去配置 root 口令即可。

/etc/group文件结构

文件每一行代表一个群组,也是以冒号『:』作为字段的分隔符,共分为四栏,每一字段的意义是:

1、组名:

2、群组口令

3、GID

4、此群组支持的账号名称,多个账号之间用逗号分开

/etc/passwd, /etc/shadow, /etc/group这三个文件之间的关系可以用下图来表示:



有效群组(effective group)与初始群组(initial group)

/etc/passwd文件中第四栏的GID就是初始群组。当用户一登陆系统,立刻就拥有这个群组的相关权限

groups: 有效与支持群组的观察

可以用groups命令查看本用户所支持的所有群组,在这个命令的输出结果中第一个群组为有效群组 (effective group) ,这是如果用touch命令去创建一个新文件,这个文件的所有群组既是这个有效群组

newgrp: 有效群组的切换

使用newgrp命令可以切换有效群组,要切换的有效群组必须是这个用户支持的群组。该命令可以切换目前用户的有效群组,而且是另外以一个 shell 来提供这个功能的。newgrp 的运行示意图如下:



/etc/gshadow

[root@www ~]# head -n 4 /etc/gshadow

root:::root

bin:::root,bin,daemon

daemon:::root,bin,daemon

sys:::root,bin,adm

这个文件同样使用冒号[:]分隔每行的,每行被分割成四段,每段的意义如下:

1、组名

2、口令栏,同样的,开头为 ! 表示无合法口令,所以无群组管理员

3、群组管理员的账号

4、该群组的所属账号 (与 /etc/group 内容相同!)

账号管理

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

[root@www ~]# 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 参考档

[root@www ~]# useradd -D

GROUP=100 <==默认的群组

HOME=/home <==默认的家目录所在目录

INACTIVE=-1 <==口令失效日,在 shadow 内的第 7 栏

EXPIRE= <==账号失效日,在 shadow 内的第 8 栏

SHELL=/bin/bash <==默认的 shell

SKEL=/etc/skel <==用户家目录的内容数据参考目录

CREATE_MAIL_SPOOL=yes <==是否主动帮使用者创建邮件信箱(mailbox)

这个数据其实是由 /etc/default/useradd 呼叫出来的!可以自行用 vim 去观察该文件的内容

GROUP=100:新建账号的初始群组使用 GID 为 100 者

HOME=/home:用户家目录的基准目录(basedir)

INACTIVE=-1:口令过期后是否会失效的配置值

EXPIRE=:账号失效的日期

SHELL=/bin/bash:默认使用的 shell 程序文件名

SKEL=/etc/skel:用户家目录参考基准目录

CREATE_MAIL_SPOOL=yes:创建使用者的 mailbox

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 500 <==使用者最小的 UID,意即小于 500 的 UID 为系统保留

UID_MAX 60000 <==使用者能够用的最大 UID

GID_MIN 500 <==使用者自定义组的最小 GID,小于 500 为系统保留

GID_MAX 60000 <==使用者自定义组的最大 GID

CREATE_HOME yes <==在不加 -M 及 -m 时,是否主动创建用户家目录?

UMASK 077 <==用户家目录创建的 umask ,因此权限会是 700

USERGROUPS_ENAB yes <==使用 userdel 删除时,是否会删除初始群组

MD5_CRYPT_ENAB yes <==口令是否经过 MD5 的加密机制处理

passwd命令更改账户口令

[root@www ~]# passwd [--stdin] <==所有人均可使用来改自己的口令

[root@www ~]# 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 等;

口令尽量使用大小写字符、数字、特殊字符($,_,-等)的组合

chage更详细的口令修改命令

[root@www ~]# chage [-ldEImMW] 账号名

选项与参数:

-l :列出该账号的详细口令参数;

-d :后面接日期,修改 shadow 第三字段(最近一次更改口令的日期),格式 YYYY-MM-DD

-E :后面接日期,修改 shadow 第八字段(账号失效日),格式 YYYY-MM-DD

-I :后面接天数,修改 shadow 第七字段(口令失效日期)

-m :后面接天数,修改 shadow 第四字段(口令最短保留天数)

-M :后面接天数,修改 shadow 第五字段(口令多久需要进行变更)

-W :后面接天数,修改 shadow 第六字段(口令过期前警告日期)

创建一个名为 agetest 的账号,该账号第一次登陆后使用默认口令,

但必须要更改过口令后,使用新口令才能够登陆系统使用 bash 环境

[root@www ~]# useradd agetest

[root@www ~]# echo "agetest" | passwd --stdin agetest

[root@www ~]# chage -d 0 agetest

# 此时此账号的口令创建时间会被改为 1970/1/1 ,所以会有问题!

这是尝试用agetest登录会要求更改口令。

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 口令栏的 ! 拿掉,解冻啦!

我们创建 vbird3 这个系统账号时并没有给予家目录,请创建他的家目录

[root@www ~]# ll -d ~vbird3

ls: /home/vbird3: No such file or directory <==确认一下,确实没有家目录的存在!

[root@www ~]# cp -a /etc/skel /home/vbird3

[root@www ~]# chown -R vbird3:vbird3 /home/vbird3

[root@www ~]# chmod 700 /home/vbird3

[root@www ~]# ll -a ~vbird3

drwx------ 4 vbird3 vbird3 4096 Sep 4 18:15 . <==用户家目录权限

drwxr-xr-x 11 root root 4096 Feb 26 11:45 ..

-rw-r--r-- 1 vbird3 vbird3 33 May 25 2008 .bash_logout

-rw-r--r-- 1 vbird3 vbird3 176 May 25 2008 .bash_profile

-rw-r--r-- 1 vbird3 vbird3 124 May 25 2008 .bashrc

drwxr-xr-x 3 vbird3 vbird3 4096 Sep 4 18:11 .kde

drwxr-xr-x 4 vbird3 vbird3 4096 Sep 4 18:15 .mozilla

# 使用 chown -R 是为了连同家目录底下的用户/群组属性都一起变更的意思;

# 使用 chmod 没有 -R ,是因为我们仅要修改目录的权限而非内部文件的权限!

userdel该命令用于删除用户的相关数据。用户的数据有:

用户账号/口令相关参数:/etc/passwd, /etc/shadow

使用者群组相关参数:/etc/group, /etc/gshadow

用户个人文件数据: /home/username, /var/spool/mail/username.

[root@www ~]# userdel [-r] username

选项与参数:

-r :连同用户的家目录也一起删除.

这个命令下达的时候要小心了!通常我们要移除一个账号的时候,你可以手动的将 /etc/passwd 与 /etc/shadow 里头的该账号取消即可!一般而言,如果该账号只是『暂时不激活』的话,那么将 /etc/shadow 里头账号失效日期 (第八字段) 配置为 0 就可以让该账号无法使用,但是所有跟该账号相关的数据都会留下来! 使用 userdel 的时机通常是『你真的确定不要让该用户在主机上面使用任何数据了!』

另外,其实用户如果在系统上面操作过一阵子了,那么该用户其实在系统内可能会含有其他文件的。 举例来说,他的邮件信箱 (mailbox) 或者是例行性工作排程 (crontab, 十六章) 之类的文件。 所以,如果想要完整的将某个账号完整的移除,最好可以在下达 userdel -r username 之前, 先以『 find / -user username 』查出整个系统内属于 username 的文件,然后再加以删除吧!

一般用户的功能

上面介绍的几个命令都是管理员所能够使用的命令,一般用户不能使用。一般用户如果想要改变账户信息,可以使用如下几个命令。

finger命令用来查看用户相关的信息

[root@www ~]# finger [-s] username
选项与参数:
-s  :仅列出用户的账号、全名、终端机代号与登陆时间等等;
-m  :列出与后面接的账号相同者,而不是利用部分比对 (包括全名部分)


利用 vbird1 创建自己的计划档

[vbird1@www ~]$ echo "I will study Linux during this year." > ~/.plan

[vbird1@www ~]$ finger vbird1

Login: vbird1 Name: (null)

Directory: /home/vbird1 Shell: /bin/bash

Never logged in.

No mail.

Plan:

I will study Linux during this year.

chfn命令修改finger数据

[root@www ~]# chfn [-foph] [账号名]

选项与参数:

-f :后面接完整的大名;

-o :您办公室的房间号码;

-p :办公室的电话号码;

-h :家里的电话号码!

chsh:change shell 的简写

[vbird1@www ~]$ chsh [-ls]

选项与参数:

-l :列出目前系统上面可用的 shell ,其实就是 /etc/shells 的内容!

-s :配置修改自己的 Shell 啰

id命令可以查询某人或自己的相关 UID/GID 等等的信息

[root@www ~]# id [username]

新增与移除群组

基本上群组的内容都与这两个文件有关:/etc/group, /etc/gshadow

groupadd

[root@www ~]# groupadd [-g gid] [-r] 组名

选项与参数:

-g :后面接某个特定的 GID ,用来直接给予某个 GID ~

-r :创建系统群组啦!与 /etc/login.defs 内的 GID_MIN 有关。

groupmod命令

跟 usermod 类似的,这个命令仅是在进行 group 相关参数的修改而已。

[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删除群组

[root@www ~]# groupdel [groupname]

范例一:将刚刚的 mygroup 删除!

[root@www ~]# groupdel mygroup

范例二:若要删除 vbird1 这个群组的话?

[root@www ~]# groupdel vbird1

groupdel: cannot remove user's primary group.

为什么 mygroup 可以删除,但是 vbird1 就不能删除呢?原因很简单,『有某个账号 (/etc/passwd) 的 initial group 使用该群组!』 如果查阅一下,你会发现在 /etc/passwd 内的 vbird1 第四栏的 GID 就是 /etc/group 内的 vbird1 那个群组的 GID ,所以啰,当然无法删除~否则 vbird1 这个用户登陆系统后, 就会找不到 GID ,那可是会造成很大的困扰的!那么如果硬要删除 vbird1 这个群组呢? 你『必须要确认 /etc/passwd 内的账号没有任何人使用该群组作为 initial group 』才行

gpasswd:群组管理员功能

# 关于系统管理员(root)做的动作:

[root@www ~]# gpasswd groupname

[root@www ~]# gpasswd [-A user1,...] [-M user3,...] groupname

[root@www ~]# gpasswd [-rR] groupname

选项与参数:

:若没有任何参数时,表示给予 groupname 一个口令(/etc/gshadow)

-A :将 groupname 的主控权交由后面的使用者管理(该群组的管理员)

-M :将某些账号加入这个群组当中!

-r :将 groupname 的口令移除

-R :让 groupname 的口令栏失效

# 关于群组管理员(Group administrator)做的动作:

[someone@www ~]$ gpasswd [-ad] user groupname

选项与参数:

-a :将某位使用者加入到 groupname 这个群组当中!

-d :将某位使用者移除出 groupname 这个群组当中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: