目录
1.2.关于群组: 有效与初始群组、groups, newgrp
2.1新增与移除使用者: useradd, 相关配置文件, passwd, usermod, userdel
1.Linux的账号与群组
- 使用者标识符: UID 与 GID
当输入你的账户去登录Linux系统时,系统其实是读取你的账户ID,通过ID来识别是否存在这个账户,每一个档案都具有『拥有人与拥有群组』的属性,每个登入的使用者至少都会取得两个 ID ,一个是使用者 ID (User ID ,简称 UID)、一个是群组 ID (Group ID ,简称 GID)
- 那么档案如何判断他的拥有者与群组呢?
利用 UID 与 GID !每一个档案都会有所谓的拥有者 ID 与拥有群组 ID ,当我们有要显示文件属性的需求时,系统会依据 /etc/passwd 不 /etc/group的内容, 找到 UID / GID 对应的账号与组名再显示出来。
1.1.使用者账号
如果你需要登录系统的话,你先需要在终端中通过登陆界面输入正确的账户密码进行登录,那么这个流程的详细步骤是什么?
1. 先找寻 /etc/passwd 里面是否有你输入的账号,如果没有则跳出,如果有的话则将该账号对应的UID 与 GID (在 /etc/group 中) 读出来,另外,该账号的家目录与 shell 设定也一并读出;
2. 核对密码表!这时 Linux 会进入/etc/shadow 里面找出对应的账号与 UID,然后核对一下你刚刚输入的密码与里头的密码是否相符
3. 如果前两步OK,就进入 Shell 控管的阶段。
- /etc/passwd 档案结构
每一行都代表一个账号,有几行就代表有几个账号在你的系统中,不过需要特别留意的是,里头很多账号本来就是系统正常运作所必须要的,我们可以简称他为系统账号, 例如bin, daemon, adm, nobody 等等,这些账号请不要随意删掉他。
如上图,第一个就是系统管理员,在一行中使用冒号隔开,总共有6的冒号,七项,那么他们的含义分别是什么?
以root账户为例:
段数 1 2 3 4 5 6 7 内容 root x 0 0 root /root /bin/bash 1. 账号名称:
就是账号,用来对应 UID 的。例如 root 的 UID 对应就是 0 (第三字段);
2. 密码:
早期 Unix 系统的密码就是放在这字段上!但是因为这个档案的特性是所有的程序都能够读取,这样一来就容易造成密码数据被窃取, 因此后来就将这个字段的密码数据给他改放在/etc/shadow 中了。这里的x是一个占位符。3. UID(User ID ,简称 UID):
这个就是使用者标识符!通常 Linux 对于 UID 有几个限制,如下:
id范围 使用者特性 0
(系统管理员)
当UID 是 0 时,代表这个账号是『系统管理员』 所以当你要设其他的账号名称也具有 root 的权限时,将该账号的 UID 改为 0 即可。 这也就是说,一部系统上面的系统管理员不见得叧有 root 。 1~499
(系统账号)
由于系统上面启动的服务希望使用较小的权限去运作,因此不希望使用 root的身份去执行这些服务, 所以我们就得要提供这些运作中程序的拥有者账号才行。这些系统账号通常是不可登入的。
根据系统账号的由来,通常系统账号又约略被区分为两种:
1~99 :由 distributions 自行建立的系统账号;
100~499:若用户有系统账号需求时,可以使用的账号 UID。500~65535
(可登入账号)给一般使用者用的。 4. GID:
这个与 /etc/group 有关!其实 /etc/group 的观念与 /etc/passwd 差不多,叧是他是用来规范组名与 GID 的对应而已!5. 用户信息说明栏:
这个字段基本上没有什么重要用途,只是用来解释这个账号的意义而已!如果你提供使用 finger 的功能时, 这个字段可以提供很多呢。6. 家目录:
这是用户的家目录,以上面为例, root 的家目录在 /root ,所以当 root 登入后,就会立刻跑到 /root 目录里头啦! 如果你有个账号的使用空间特别的大,你想要将该账号的家目录移动到其他的硬盘的话直接该这个字段就可以了。8. Shell:
显示我们使用的shell类型,默认使用、/bin下面的bash。
- /etc/shadow 档案结构
这个档案时保存用户密码的地方。
每一行代表一个密码,总共有九个字段
每个字段代表的含义:
1. 账号名称:和/etc/passwd相对应
2. 密码:
这个字段内的数据才是真正的密码,而是经过编码的密码 (加密) ! 你会看到有一些特殊符号的字母就是了!
3.最近更改密码的日期:
这个字段记录了【更改密码那一天】的日期,不过,为什么在我的例子现实的是 17647呢?这个是因为计算 Linux 日期的时间是以 1970 年 1 月 1 日作为 1 而累加的日期,1971 年 1 月 1 日则为 366 啦!一次类推
想要知道某个日期的累积日数, 可使用如下的程序计算:
- echo $(($(date --date="2018/10/10" +%s)/86400+1))
2018/10/10 为你想要计算的日期,86400 为每一天的秒数, %s 为 1970/01/01以来的累积总秒数。 由于 bash 仅支持整数,因此最终需要加上 1 补齐 1970/01/01 当天。
4. 密码不可被更该的天数:(与第 3 字段相比)
第四个字段记录了:这个账号的密码在最近一次被更改后需要经过几天才可以再被变更!如果是0 的话, 表示密码随时可以更改。这个限制是防止密码改完又马上该回去了。5. 密码需要重新变更的天数:(与第 3 字段相比)
意思是说密码在这个时间段内必须被修改,否则进不能登陆系统。称为硬限制
6. 密码需要变更期限前的警告天数:(与第 5 字段相比)
在密码过期的前几天,如果设置为3则,则为前三天会提出警告,需要修改密码,称为软限制。
7. 密码过期后的账号宽限时间(密码失效日):(与第 5 字段相比)
密码有效日期为『更新日期(第 3 字段)』+『重新变更日期(第 5 字段)』,过了该期限后用户依旧没有更新密码,那该密码就算过期了。 虽然密码过期但是该账号还是可以用来进行其他工作的,包括登入系统取得 bash 。丌过如果密码过期了, 那当你登入系统时,系统会强制要求你必须要重新设定密码才能登入继续使用,这就是密码过期特性。
那这个字段的功能是什么呢?是在密码过期几天后,如果使用者还是没有登入更改密码,那么这个账号的密码将会『失效』, 该账号再也无法使用该密码登入了。要注意密码过期与密码失效不相同。
8. 账号失效日期:
这个字段会被使用通常应该是在『收费朋务』的系统中,你可以规定一个日期让该账号不能再使用。
9. 保留
例子:
yuangege这个账户在。/etc/shadow下的描述如下,解释一下各段的含义:
- yuangege:$1$0GIDQo3$0nFOu0OdxBuFxlcmBwli5.:17688:0:99999:7:::
解释:
- 第一项代表用户名,第二项是密码
- 此账号最近一次更动密码的日期是:2018/6/05(17688)
- 对新密码修改时间没有限制
- 密码需要重新变更的天数:9999
- 密码需要变更期限前的警告天数:7
1.2.关于群组: 有效与初始群组、groups, newgrp
- /etc/group 档案结构
这个档案就是在记录 GID 与组名
每一行代表一个群组,以冒号分割,分成四段。
每个字段的含义:
1. 组名
2. 群组密码:
通常不需要设定。
3. GID:
就是群组的 ID 。我们 /etc/passwd 第四个字段使用的 GID 对应的群组名,就是由这里对应出来的!
4. 此群组支持的账号名称:
我们知道一个账号可以加入多个群组,那某个账号想要加入此群组时,将该账号填入这个字段即可。 举例,如果我想要让 tom也加入 root 这个群组,那就在第一行的最后面加上
【,tom】,注意不要有空格, 使成为『 root:x:0:root,tom 』就可以了。
使用简图描述root这个账户,/etc/group,/etc/shadow,/etc/passwd这单个档案的之间的关系
2.账号管理
2.1新增与移除使用者: useradd, 相关配置文件, passwd, usermod, userdel
命令:useradd
语法:
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 为永进不失效(密码只会过期而强制于登入时重新训定而已。) |
例子1:
完全参考默认值建立一个用户,名称为 yuan
使用命令:useradd yuan
也可以在系统的图形化界面看到这个账户的存在:
例子2:使用命令 useradd -D 可以查看系统默认创建用户的选项
是否可以修改默认值?当然是可以的,这个目录存在于
这个文件存在于:/etc/default/useradd ,使用vi编辑器看一下
2.2.usermod
有的时候会『不小心』在 useradd 的时候加入了错误的设定数据。或者是,在使用 useradd 后,发现某些地方还可以进行局部修改。 此时,当然我们可以直接到 /etc/passwd 或者 /etc/shadow 去修改相对应字段的数据, 不过,Linux 也有提供相关
的指定给大家来进行行账号相关数据的修改~那就是 usermod 。
语法:
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 密码栏的 ! 拿掉,解冻啦! |
例子:
修改 yuan 这个 账户的注释信息。
可以看一下这个账户的原本的注释信息是空的,使用命令:
使用命令usermod,的 -c 选项修改注释信息。
使用命令:usermod -c "I'am yuan" yuan
2.3.passwd 密码修改
使用 useradd 建立了账号之后,在预设的情况下,该账号是暂时被封锁的, 也就是说,该账号是无法登入的,你可以去瞧一瞧 /etc/shadow 内的第二个字段就晓得啰~ 那该如何是好?直接给他设定新密码就好了!
查看/etc/shadow 内的第二个字段:密码字段
语法:
passwd [-l] [-u] [--sdtin] [-S] [-n 日数] [-x 日数] [-w 日数] [-i 日期] 账号
选项和参数:
选项 | 含义 |
--stdin | 可以透过来自前一个管线的数据,作为密码输入,对shell script 有帮助。例如: echo xxx | --stdin 账号 |
-l | 是 Lock的意思,会将 /etc/shadow 第二栏最前面加上 ! 使密码失效 |
-u | 与 -l 相对,是 Unlock 的意思! |
-S | 列出密码相关参数,即为卲 shadow 档案内的大部分信息。 |
-n | 后面接天数,shadow 的第 4 字段,多久不可修改密码天数 |
-x | 后面接天数,shadow 的第 5 字段,多久内必须要更改密码 |
-w | 后面接天数,shadow 的第 6 字段,密码过期前的警告天数 |
-i | 后面接『日期』,shadow 的第 7 字段,密码失效日期 |
例子1:
给 yuan 账户增加密码:
直接使用命令: passwd yuan
例子2:
查看yuan 账户的密码设定状态
使用命令:passwd -S yuan
清除密码:
使用命令:passwd -d yuan
例子3:
使用--stdin 设定 yuan 账户的密码:
2.4 userdel 删除用户
语法:
userdel [-r] username
选项参数
选项 | 含义 |
-r | 连同用户的家目录也一起删除 |
例子:
删除yuan账户,连同家目录删除
3.主机的细部权限规划:ACL 的使用
引入:
Linux 的权限概念是非常重要的! 但是传统的权限仅有三种身份(owner, group, others) 搭配三种权限 (r,w,x) 而已,并没有办法单纯得针对某一个使用者或某一个群组来设定特定的权限需求。
3.1.什么是 ACL?
ACL 是 Access Control List 癿缩写,主要的目的是在提供传统的 owner,group,others 的read,write,execute 权限之外的细部权限设定。ACL 可以针对单一使用者,单一档案或目录来进行r,w,x 癿权限规定,对于需要特殊权限的使用状况非常有帮助。
那 ACL 主要可以针对哪些方面来控制权限呢?他主要可以针对几个项目:
- 使用者 (user):可以针对使用者来设定权限;
- 群组 (group):针对群组为对象来设定其权限;
- 默认属性 (mask):还可以针对在该目录下在建立新档案/目录时,规范新数据的默认权限
3.2.如何启动 ACL
3.3.ACL 的设定技巧: getfacl, setfacl
- getfacl:取得某个档案/目录的 ACL 设定定项目;
- setfacl:训定某个目录/档案的 ACL 规范。
setfacl 指令用法:
语法:
setfacl [-bkRd] [{-m|-x} acl 参数] 目标文件名
选项与参数:
选项 | 含义 |
-m | 设定后续的 acl 参数给档案使用,不可和 -x 合用 |
-x | 删除后续的 acl 参数,不可与 -m 合用 |
-b | 移除所有的 ACL 设定参数 |
-k | 移除预设的 ACL 参数 |
-R | 递归设定 acl ,即为包括子目录都会被设定; |
-d | 设定『预设 acl 参数』的意思!只对目录有效,在该目录新建的数据会引用此默认值。 |
getfacl 指令用法:
语法:
getfacl filename