Linux学习之八:Linux 账号管理与 ACL 权限设定(一)

2010年12月02日 Linux基础 评论 3 条 阅读 11,662 views 次

课程内容:
1. Linux的账号与用户组
2. 账号管理
3. 主机的细部权限规划:ACL 的使用
4. 使用者身份切换
5. 用户的特殊 shell 与 PAM 模块
6. Linux 主机上的用户讯息传递
7. 手动新增使用者

1. Linux的账号与用户组
用户标识符:UID 与 GID
虽然我们登陆Linux主机的时候,输入的是我们的账号,但是其实Linux 主机并不认识『账号名称』的,他仅认识ID。至于账号只是为了让我们容易记忆而已。而用户的ID 与账号的对应就在/etc/passwd中。
到底有几种ID呢?

使用者至少都会取得两个ID ,一个是使用者ID(User ID ,简称 UID)、一个是用户组ID(Group ID ,简称 GID)。

文件如何判别他的拥有者与用户组呢?其实就是利用UID与GID
当我们有要显示文件属性的需求时,系统会依据 /etc/passwd 与 /etc/group 的内容, 找到 UID / GID 对应的账号与组名再显示出来!

2. 用户账号
Linux系统上面的用户如果需要登入主机以取得shell的环境来工作时,他需要如何进行呢?
必须要在计算机前面利用 tty1~tty6 的终端机提供的 login 接口,并输入账号与密码后才能够登入。

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

由上面的流程我们可以知道,跟使用者账号有关的有两个非常重要的文件,一个是管理使用者 UID/GID 重要参数的 /etc/passwd ,一个则是专门管理密码相关数据的 /etc/shadow

/etc/passwd 文件结构
每一行都代表一个账号,有几行就代表有几个账号在你的系统中,里头很多账号本来就是系统正常运作所必须要的,我们可以简称他为系统账号,
每一行使用『:』分隔开,共有七个
1. 用户名称:
2. 密码:如果此域为空,表明该用户登录时不需要口令
3. UID
4. GID:
5. 用户信息说明:
6. 家目录:
7. Shell:/sbin/nologin这个东西可以用来让账号无法取得shell环境

/etc/shadow 文件结构
有九个字段
1. 账号名称:0 (系统管理员),1~499 (系统账号),500~65535 (可登陆的账号)
1~99:由不同的发行版本自行建立的系统账号;100~499:若用户有系统账号需求时,可以使用的账号 UID。linux 核心 (2.6.x 版)已经可以支持到 4294967295 (2^32-1) 这么大的 UID 号码
2. 密码:

3. 最近更动密码的日期:1970 年 1 月 1 日作为 1 而累加的日期,1971 年 1 月 1 日则为 366
echo $(($(date --date="2010/11/24" +%s)/86400+1))
2010/11/24 为你想要计算的日期,86400 为每一天的秒数, %s 为 1970/01/01 以来的累积总秒数。 由于 bash 仅支持整数,因此最终需要加上 1 补齐 1970/01/01 当天。

4. 密码不可被更动的天数:(与第 3 字段相比)
这个账号的密码在最近一次被更改后需要经过几天才可以再被变更!如果是 0 的话, 表示密码随时可以更动的意思。这的限制是为了怕密码被某些人一改再改而设计的,如果设定为 20 天的话,那么当你设定了密码之后, 20 天之内都无法改变这个密码。

5. 密码需要重新变更的天数:(与第 3 字段相比)
为了强制要求用户变更密码,这个字段可以指定在最近一次更改密码后, 在多少天数内需要再次的变更密码才行。你必须要在这个天数内重新设定你的密码,否则这个账号的密码将会『变为过期特性』。 而如果像上面的 99999 (计算为 273 年) 的话,那就表示,密码的变更没有强制性之意。

6. 密码需要变更期限前的警告天数:(与第 5 字段相比)
当账号的密码有效期限快要到的时候 (第 5 字段),系统会依据这个字段的设定,发出『警告』信息给这个账号,提醒他『再过 n 天你的密码就要过期了,请尽快重新设定你的密码。』

7. 密码过期后的账号宽限时间(密码失效日):(与第 5 字段相比)
密码有效日期为『更新日期(第3字段)』+『重新变更日期(第5字段)』,过了该期限后用户依旧没有更新密码,那该密码就算过期了。虽然密码过期但是该账号还是可以用来进行其他工作,包括登陆系统取得 bash 。不过如果密码过期了, 那当你登入系统时,系统会强制要求你必须要重新设定密码才能登入继续使用,这就是密码过期特性。

8. 账号失效日期:
这个日期跟第三个字段一样,都是使用 1970 年以来的总日数设定。这个字段表示: 这个账号在此字段规定的日期之后,将无法再使用。
所谓的『账号失效』,此时不论你的密码是否有过期,这个『账号』都不能再被使用!这个字段会被使用通常应该是在『收费服务』的系统中,你可以规定一个日期让该账号不能再使用。

9. 保留:

有效与初始用户组、groups, newgrp

/etc/group 文件结构
记录 GID 与组名的对应。
共分为四
1. 组名:
2. 用户组密码:
3. GID:
4. 此用户组支持的账号名称:

/etc/gshadow
1. 组名
2. 密码栏,同样的,开头为 ! 表示无合法密码,所以无用户组管理员
3. 用户组管理员的账号
4. 该用户组的所属账号

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

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命令时,系统会执行如下的操作
 在 /etc/passwd 里面建立一行与账号相关的数据,包括建立 UID/GID/家目录等;
 在 /etc/shadow 里面将此账号的密码相关参数填入,但是尚未有密码;
   这两个文件是用户账号与密码参数方面的文件
 在 /etc/group 里面加入一个与账号名称一模一样的组名;
   这个是使用者用户组相关方面的文件
 在 /home 底下建立一个与账号同名的目录作为用户家目录,且权限为 700

useradd 参考文件
为什么使用useradd username会主动在 /home/username建立起用户的家目录?家目录内有什么数据且来自哪里?为何预设使用的是 /bin/bash 这个 shell ?为何密码字段已经都规范好了?
用下面两个命令
cat /etc/default/useradd
useradd -D
得出下面的内容
GROUP=100:新建账号的初始用户组使用GID为100者
我们知道在CentOS上面预设的用户组为与账号名相同的用户组。
为什么会这样啊?
这是因为针对用户组的角度有两种不同的机制所致, 这两种机制分别是:
o 私有用户组机制:系统会建立一个与账号一样的用户组给使用者作为初始用户组。 这种用户组的设定机制会比较有保密性,这是因为使用者都有自己的用户组,而且家目录权限将会设定为 700 (仅有自己可进入自己的家目录) 之故。使用这种机制将不会参考 GROUP=100 这个设定值。代表性的 distributions 有 RHEL, Fedora, CentOS 等;
o 公共用户组机制:就是以 GROUP=100 这个设定值作为新建账号的初始用户组,因此每个账号都属于 users 这个用户组, 且默认家目录通常的权限会是『 drwxr-xr-x ... username users ... 』,由于每个账号都属于 users 用户组,因此大家都可以互相分享家目录内的数据之故。代表 distributions 如 SuSE等。
由于我们的 CentOS 使用私有用户组机制,因此这个设定项目是不会生效的!

HOME=/home:用户家目录的基准目录(basedir)
用户的家目录通常是与账号同名的目录,这个目录将会摆放在此设定值的目录

INACTIVE=-1:密码过期后是否会失效的设定值
我们在shadow文件结构当中谈过,第七个字段的设定值将会影响到密码过期后, 在多
久时间内还可使用旧密码登入。这个项目就是在指定数!
如果是 0 代表密码过期立刻失效,
如果是 -1 则是代表密码永远不会失效,
如果是数字,如 30 ,则代表过期 30 天后才失效。

EXPIRE=:账号失效的日期
就是 shadow 内的第八字段,你可以直接设定账号在哪个日期后就直接失效,而不理会密码的问题。 通常不会设定此项目,但如果是付费的会员制系统,或许这个字段可以设定!

SHELL=/bin/bash:默认使用的 shell 程序文件名
系统默认的 shell 就写在这里。假如你的系统为 mail server ,你希望每个账号都只能使用 email 的收发信件功能, 而不许用户登入系统取得 shell ,那么可以将这里设定为 /sbin/nologin ,如此一来,新建的使用者预设就无法登入! 也免去后续使用 usermod 进行修改的手续!

SKEL=/etc/skel:用户家目录参考基准目录 这个就是指定用户家目录的参考基准目录。用户家目录 /home/username内的各项数据,都是由 /etc/skel 所复制过去的,所以呢,未来如果我想要让新增使用者时,该用户的环境变量 ~/.bashrc 就设定妥当的话,您可以到 /etc/skel/.bashrc 去编辑一下。
也可以建立 /etc/skel/user_other 这个目录,那么未来新增使用者后,在他的家目录下就会有user_other 那个目录了!

CREATE_MAIL_SPOOL=yes:建立使用者的 mailbox
你可以使用ls /var/spool/mail/看一下,会发现有相应用户的文件存在!这就是使用者的邮件信箱!

除了这些基本的账号设定值之外, 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 的加密机制处理

使用 useradd 这个命令在Linux上的账号时,至少会参考:
 /etc/default/useradd
 /etc/login.defs
 /etc/skel/*
这几个内容。不过,最重要的其实是建立 /etc/passwd, /etc/shadow, /etc/group, /etc/gshadow 还有用户家目录。
如果你了解整个系统运作的状态,也是可以手动直接修改这几个文件。

使用 useradd 建立了账号之后,在预设的情况下,该账号是无法登陆系统的,只有设置密码才能使用。

passwd [--stdin] <==所有人均可使用来改自己的密码
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 字段,密码失效日期

要注意的是,密码的规范是非常严格的,尤其新的发行版本大多使用 PAM 模块来进行密码的检验,包括太短、 密码与账号相同、密码为字典常见字符串等,都会被 PAM 模块检查出来而拒绝修改密码。这个管理的机制写在 /etc/pam.d/passwd 当中。而该文件与密码有关的测试模块就是使用:pam_cracklib.so,这个模块会检验密码相关的信息, 并且取代 /etc/login.defs 内的 PASS_MIN_LEN 的设定。

理论上,你的密码最好符合如下要求:
 密码不能与账号相同;
 密码尽量不要选用字典里面会出现的字符串;
 密码需要超过 8 个字符;
 密码不要使用个人信息,如身份证、手机号码、其他电话号码等;
 密码不要使用简单的关系式,如 1+1=2, Iamuser 等;
 密码尽量使用大小写字符、数字、特殊字符($,_,-等)的组合。

也可以用
echo "abc543CC" | passwd --stdin username
来修改密码,但是可以在 /root/.bash_history 找到这个密码。所以说这个动作通常仅用在 shell script 的大量建立使用者账号时使用。当然,有些其它版本的系统,不一定会有这个功能。

锁定用户只是在这里加上/etc/shadow的文件里面,把密码前面加上“!!” 。

passwd -S 更详细的密码参数显示功能

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

usermod
在使用 useradd 后,发现某些地方还可以进行细部修改。 此时,当然我们可以直接到 /etc/passwd 或 /etc/shadow 去修改相对应字段的数据
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..

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

通常我们要删除一个账号的时候,你可以手动的将 /etc/passwd 与 /etc/shadow 里头的该账号取消即可。
一般而言,如果该账号只是『暂时不启用』的话,那么将 /etc/shadow 里头账号失效日期 (第八字段) 设定为 0 就可以让该账号无法使用,但是所有跟该账号相关的数据都会留下来!
使用 userdel 的时机通常是『你真的确定不要让该用户在主机上面使用任何数据了!』
用户如果在系统上面操作过一阵子了,那么该用户其实在系统内可能会含有其他文件的。
所以,如果想要完整的将某个账号完整的移除,最好可以在下达 userdel -r username 之前, 先以『 find / -user username 』查出整个系统内属于 username 的文件,然后再加以删除!

用户功能
finger 可以查阅很多用户相关的信息。大部分都是在 /etc/passwd 这个文件里面的信息
finger [-s] username
选项与参数:
 Login:为使用者账号,亦即 /etc/passwd 内的第一字段;
 Name:为全名,亦即 /etc/passwd 内的第五字段(或称为批注);
 Directory:就是家目录了;
 Shell:就是使用的 Shell 文件所在;
 Never logged in.:figner 还会调查用户登入主机的情况
 No mail.:调查 /var/spool/mail 当中的信箱资料;
 No Plan.:调查 ~vbird1/.plan 文件,并将该文件取出来说明!

找出目前在系统上面登入的用户与登入时间
finger

输出的信息还会有 Office, Office Phone 等信息,那这些信息要如何记录呢
chfn
chfn [-foph] [账号名]
选项与参数:
-f :后面接完整的大名;
-o :您办公室的房间号码;
-p :办公室的电话号码;
-h :家里的电话号码!
其实这个命令就是改到第五个字段,该字段里面用多个『 , 』分隔。

chsh
这就是 change shell 的简写
chsh [-ls]
选项与参数:
-l :列出目前系统上面可用的 shell ,其实就是 /etc/shells 的内容!
-s :设定修改自己的 Shell 啰

chsh -l
chsh -s /bin/csh; grep opeser /etc/passwd
不论是 chfn 与 chsh ,都是能够让一般用户修改 /etc/passwd 这个系统文件的!
所以你这两个文件的权限是什么? 一定是 SUID 。

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

新增与移除用户组
了解了账号的新增、删除、更动与查询后,再来我们可以聊一聊用户组的相关内容了。 基本上,用户组的内容都与这两个文件有关:/etc/group, /etc/gshadow。 用户组的内容其实很简单,都是上面两个文件的新增、修改与移除而已。

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

groupmod
groupmod [-g gid] [-n group_name] 用户组名
选项与参数:
-g :修改既有的 GID 数字;
-n :修改既有的组名

groupdel
必须要确认 /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 这个用户组当中。

待续……

3 条留言  访客:0 条  博主:0 条   引用: 3 条

来自外部的引用: 3 条

  • 一天一点学习Linux之用户(user)和用户组(group)理论知识Radhat/CentOS教程 | Linux服务器 | PHP教程 | Mysql/Oracle资料 | Jquery开源资料 |冰封博客
  • 一天一点学习Linux之用户(user)和用户组(group)下Radhat/CentOS教程 | Linux服务器 | PHP教程 | Mysql/Oracle资料 | Jquery开源资料 |冰封博客
  • Linux中的组管理及其组密码的应用 | EvilCode 邪恶代码

给我留言

Copyright © 羽飞博客 保留所有权利.   Ality主题 皖ICP备14013844号-1

用户登录