**Linux账号管理与ACL权限设置**
***
[TOC]
## 1 Linux的账号与用户组
每个登录Linux系统的用户至少都会取得2个ID:
* `UserID`:用户ID,UID
* `GroupID`:用户组ID,GID
### 1.1 用户账号
Linux系统中,用户登录主机取得shell的环境的过程
1. 用户要在计算机上利用tty1~tty7的终端机提供的login接口,输入用户账号和密码。
2. 系统寻找`/etc/passwd`文件里是否有输入的账号,如果没有则跳出,如果有则将账号和对应的UID、GID(从`/etc/group`中读出)、主文件夹、shell设置读出。
3. 系统核对密码。系统进入`/etc/shadow`找出记录的对应账号与UID,核对输入的密码与记录的密码是否一致。
4. 进入shell环境。
因为Linux系统中程序的运行都与权限有关,而权限与UID/GID有关。所以各个程序就需要读取`/etc/passwd`来了解不同账号的权限。
>[info] * 在登录Linux主机时,`/etc/passwd`与`/etc/shadow`系统必须可以读取。
> * `/etc/passwd`与`/etc/shadow`是Linux系统备份账号时的必须文件。
> * `/etc/passwd`的权限需设置为“-rw-r--r--”
> * `/etc/shadow`的默认权限为“-rw-------”“-r--------”。即只有`root`才能读写。
#### 1.1.1 `/etc/passwd`文件结构
:-: ![`/etc/passwd`文件结构](https://box.kancloud.cn/b8c585698a3dd037e32f5232cf91069b_400x81.png)
:-: 图1 `/etc/passwd`文件结构
如上图所示,head命令显示的是`/etc/passwd`文件里头4行的内容。
每一行代表一个系统的用户账号及其属性(7个,用‘:’分开)
以第一行为例:
1. 账号名称:root
2. 密码:x。具体的密码数据放在`/etc/shadow`文件中。
3. UID:root的UID为0。
4. GID:与`/etc/group`文件有关。
5. 用户信息说明:root。用于解释本账号的信息。
6. 主文件夹:/root。默认的用户主文件夹为`/home/yourIDName`。
7. Shell:/bin/bash。用于用户登录系统后取得shell来与系统的内核进行通信以进行用户的操作任务。而使用`/sbin/nologin`可以用来让账号登录系统后无法取得shell环境。
:-: Linux中UID的限制规则
| Id范围 | Id用户特性 |
| --- | --- |
| 0(系统管理员) | 如果要让其他账号也具有`root`的权限,可将其UID改为0。但不建议有多个账号的UID是0,会造成系统混乱。 |
| 1~499(系统账号) | 默认500一下的UID让给系统作为保留账号只是一个习惯。这些系统账号通常是不可登录的,所以其Shell的属性为`/sbin/nologin`。根据系统账号的由来,还可分为:1~99:由distribution自行创建的系统账号;100~499:用户有系统账号需求时,可以使用的UID |
| 500~65535(可登录账号) | 给系统的一般用户使用。 |
#### 1.1.2 `/etc/shadow`文件结构
![ `/etc/shadow`文件结构](https://box.kancloud.cn/03689ec4699b490cd5361ad5e3b5b3e9_646x94.png)
:-: 图2 `/etc/shadow`文件结构
如上图所示,head命令显示的是`/etc/shadow`文件里头4行的内容。
每一行代表一个系统的用户账号及其属性(9个,用‘:’分开)
以第一行为例:
1. 账号名称:root
2. 账号密码:内容是经过加密后的密码。由于特定的加密系统产生的密码长度必须一致,当让这个字段的长度改变后,该密码就会失效(无法解密)。很多软件通过这个方式,在此字段前加上`!`或`*`改变密码字段的长度,就会使得密码“暂时失效”了。
3. 最近改动密码的日期。Linux系统中日期的计算是以1970/1/1为1而累加的日期。
4. 密码不可被改动的天数。以第3个字段为基础。为“0”,表示随时可以改动密码。
5. 密码需要更新的天数。以第3个字段为基础。强制要求用户在这个天数内重新设置密码,否则该用户账号的密码就会变为过期特性。为“99999”,表示密码的更改没有强制性。
6. 密码需要更新期限前的警告天数。以第5个字段为基础。即是密码到期前的n天内,系统给用户账号在登录时发出警告。
7. 密码过期后的账号宽限天数。以第5个字段为基础。
8. 账号失效日期。类似第3个字段。都使用1970/1/1为1而累加的日期。在超过本字段规定的日期后,本账号不能再被使用。类似“收费服务”的系统中可以明确本字段的内容。
9. 保留
>[warning] * 密码的有效期:“更新日期”(第3个字段)+“更新的天数”(第5个字段)。
>* 密码过期特性:用户账号密码过期后,当用户账号登录时,系统会强制要求必须重新设置密码才能登录系统。
>
>
**忘记密码:**
* 一般用户忘记密码:利用`root`使用`passwd`命令重设密码。
* `root`密码忘记:
1. 重新启动Linux进入用户维护模式,系统会主动给予root权限的bash接口,此时使用`passwd`命令重设密码。
2. 以live CD开机后挂载根目录去修改`/etc/shadow`,将里面的root密码字段清空,再重新启动后root将不用密码即可登录!登录后使用`passwd`命令重设密码。
### 1.2 用户组
#### 1.2.1 `/etc/group`文件结构
![`/etc/group`文件结构](https://box.kancloud.cn/f8f5ae392cafaee131140ed5c022906f_354x79.png)
:-: 图3 `/etc/group`文件结构
如上图所示,head命令显示的是`/etc/shadow`文件里头4行的内容。
每一行代表一个系统的用户组及其属性(4个,用‘:’分开)
1. 用户组名称:
2. 用户组密码。通常不需要设置,设置后是给“用户组管理员”使用的。具体内容在`/etc/gshadow`。
3. GID。`/etc/passwd`第4个字段的GID使用的值。
4. 用户组包含的账号名称。各个名称间用`,`分隔。
#### 1.2.2 `/etc/gshadow`文件结构
![`/etc/gshadow`文件结构](https://box.kancloud.cn/3f0d298c7ff4ce8de4b004f48712f62b_365x79.png)
:-: 图4 `/etc/gshadow`文件结构
如上图所示,head命令显示的是`/etc/shadow`文件里头4行的内容。
每一行代表一个系统的用户组及其属性(4个,用‘:’分开)
1. 用户组名称。
2. 用户组密码。若开头为`!`表示无合法密码,也就无用户组管理员。
3. 用户组管理员的账号。
4. 用户组的所属账号。与`/etc/group`内容相同。
#### 1.2.3 有效与初始用户组 `groups`, `newgrp`
* 初始用户组(initial group)
用户登录系统后就由系统指定的用户组。即是`/etc/passwd`中用户账号所在行第4字段(`GID`)的值对应的用户组(用户组名:`/etc/group`中查询第3字段值为GID的那一行的第一字段值)。
* 有效用户组(effective group)
`groups`:该命令查看登录用户的所有用户组。第一个为有效用户组(effective group)。用户新建文件的权限与有限用户组的一致。
`newgrp`:更改登录用户的有效用户组。仅能在登录用户所属的用户组中进行更改。即是仅能在登录用户用`groups`查出的用户组中进行更改。
## 2 账号管理
### 2.1 用户的新增与删除
#### 2.1.1 用户新增
* **`useradd userName`**:创建新用户账号‘userName’。
系统会做:
1. 在`/etc/passwd`文件中创建一行与账号相关的数据,包括创建UID/GID/主文件夹(根据系统的默认值进行,可用`useradd -D`命令查看)等。
2. 在`/etc/shadow`文件中将此账号的密码相关参数填入,但无密码内容。
3. 在`/etc/group`文件中创建一个与账号名称一样的组名记录。
4. 在`/etc/gshadow`文件中创建一个与账号名称一样的组名记录。
5. 在`/home`目录创建一个与账号同名的目录作为用户主文件夹,权限为‘700’(仅仅用户自己可进入自己的主文件夹)。
创建新用户账号时系统的默认值通常都在这几个文件:
1. `/etc/default/useradd`
2. `/etc/login.defs`
3. `/etc/skel/*`
使用`man useradd`可以查看各个参数的作用。
* **`passwd`**:设置账号密码
>[danger] `root` 账号
> * 给一般账号设置密码:`passwd userName`
> * 给自己设置密码:`passwd`
常用参数:
`-l`:让账号失效
`-u`:恢复账号
`-S`:查看账号信息
`chage [-ldEImMW] userName`:对userName的账号信息进行细致的更改(针对userName在`/etc/passwd`文件中的记录)
~~~Linux
# chage -d 0 userName
~~~
>[info] 'userName'账号的密码新建时间被修改为1970/1/1,在该账号登录系统时会被系统强制要求修改密码,更改密码完成后被踢出系统。再次登录时就使用新密码。
* **`usermod`**:微调useradd增加的用户参数。
~~~Linux
# usermod [-cdegGlsuLU] userName
~~~
#### 2.1.2 用户
* **`userdel`**:微调useradd增加的用户参数。
~~~Linux
# userdel [-r] userName
~~~
带`-r`执行该命令后,系统会删除用户相关数据
1. 用户账号/密码,`/etc/passwd`,`/etc/shadow`
2. 用户组,`/etc/group`,`/etc/gshadow`
3. 用户个人文件,`/home/userName`,`/var/spool/mail/userName`
>[warning] * 如果账号只是暂时不用,只需要将`/etc/shadow`里的账号失效日期(第8字段)设为0就可以使得该账号无法使用,但所有与该账号有关的数据都会保留。
>* 如果要完整的将某个账号删除,在执行` userdel -r userName`前,先以`find / -user userName`查出整个系统内属于userName的文件后,再进行删除。
### 2.2 一般用户常用账号数据更改与查询
* **`finger`**
* **`chfn`**
* **`chsh`**
* **`id`**