💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
**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`。根据系统账号的由来,还可分为:<br> <strong>1~99</strong>:由distribution自行创建的系统账号;<br> <strong>100~499</strong>:用户有系统账号需求时,可以使用的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`**