jk's notes
  • ch02 管理用户与权限

ch02 管理用户与权限

上一章完成 os 的安装.

在服务器上用户是很重要的资源, 没有用户就没有管理.

本章的主要内容有:

  • 理解用户与组
  • 理解什么时候使用 root
  • 创建/移除用户
  • 理解 /etc/passwd 和 /etc/shadow 文件
  • 使用 /etc/skel 分配默认的配置文件
  • 切换用户
  • 管理组
  • 管理密码与密码策略
  • 使用 sudo 配置管理员访问
  • 设置文件与文件夹的权限

首先讨论用户管理的本质.

2.1 理解用户与组

管理用户是 IT 应用的一个公共的必须需求. 涉及鉴权的内容有很多. 本章主要讨论用于访问本地服务的用户, 以及用于约束可以做什么的组.

Ubuntu 是 Linux 发行版, 因此它延续了 Unix 风格的用账户 (account), 组 (group), 以及权限 (permission). 虽然我们介绍的是 Ubuntu, 但是涉及到的命令在其他平台也适用. 这些命令允许你添加, 移除, 修改用户, 以及对权限的修改.

服务器上的用户表示谁可以访问服务器. 例如: 你有一个会计, 名为 Susan, 或一个 IT 管理员 Haneef. 他们都需要访问这台服务器. 也许, Susan 只需要访问与会计相关的文件与共享目录. 而 Haneef 可能需要用系统管理员的权限进行访问. 我们所创建的账户需要反应出具体用户的使用.

组可以作为分离访问权限的特定角色. 随着后续的学习, 文件和目录可以分配给用户或组. 当结合权限后, 我们就可以控制谁可以在服务器上做什么事情.

然而, 用户不一定指人. 在服务器上, 可以有系统用户, 它可以在后台运行或自动完成一些任务. 暂时不用担心系统用户, 现在只要知道存在即可. 本书后续会有相关的案例.

很多高级机构可能会存在中心登录服务. 例如 Active Directory (AD), 或标准 LDAP. 这些不在本书范围内, 但你需要知道可以有中心授权服务.

root 是权限最大的, 使用也是不受限制的, 但会带来安全隐患.

2.2 何时使用 root

上一章, 我们安装了系统, 并创建了系统管理员账户. 此时, 我们需要在服务器上提供两个用户. 我们已经有管理员用户了, 即 root. 我们还需要一个限制访问级别的用户, 本章会使用到. 在此之前需要讨论一下.

root 用户每一个 linux 发行版中都有, 并且权限最大. root 可以做任何事情. 即使是破坏性的, 他也会毫不犹豫的执行.

因此建议在每一个发行版中都提供一个标准用户. 在使用需要 root 的时候再切换到 root 上.

大多数发行版在安装时会提示创建一个 root 密码, 既是是 Debian. 但是 Ubuntu 默认是禁用 root 账户的.

这个规则有例外, 例如一些 VPS 的提供商, 会直接提供 root 账户登录. 但依旧建议你创建自己的用户.

但是 ubuntu 推荐使用 sudo 来提升权限.

2.2.1 使用 sudo 来运行受限的命令

关于 sudo 的管理后面会介绍, 现在只需要记得 sudo 可以让你的用户具有 root 权限. 例如, 一般用户无法安装程序 (不要担心 apt 命令, 会在第 3 章介绍).

执行 apt install tmux 会报错 (permission denied).

所以需要 sudo, 例如 sudo apt install tmux.

使用 sudo 会提示你输入密码, 然后命令会被执行. 然后, 后续的命令不会再要求输入密码, 系统会记录一段时间, 直至超时, 或终端关闭.

Ubuntu 会自动将创建的第一个账户添加 sudo 的使用权限.

重点是你需要创建作为管理员使用的账户, 而不是使用 root. 而普通创建的用户无法使用 sudo, 除非你单独指定.

2.3 创建与删除用户

创建用户有两个命令: adduser 和 useradd. 两者存在一定区别.

2.3.1 使用 useradd

一个案例:

sudo useradd -d /home/jdoe -m jdoe

该命令创建名为 jdoe 的用户.

-d 选项描述用户的家目录. 但该目录不一定存在.

-m 选项表示在创建用户的时候, 同时创建家目录. 否则需要自行创建.

该命令需要 root 权限, 因此在前面添加 sudo.

也可以登录 root 账户, 但如前面说介绍的, 不建议.

然后可以在 /home 下看到创建的目录. 使用命令 ls -l /home.

创建用户没有设置密码, 可以使用 passwd 来设置:

  • 该命令可以修改当前用户的密码: 输入现有密码, 输入新密码, 确认密码
  • 使用 sudo 权限可以修改其他用户的密码: 输入新密码, 确认密码

命令: sudo passwd jdoe

注意在输入密码时不会出现任意字符.

此时已经存在一个可以登录的用户了, 但是该用户无法使用 sudo 提升权限.

登录后好像没有用户名的信息:

image-20240604200638709

2.3.2 使用 adduser

执行下面命令:

sudo adduser dscully

该命令依旧需要使用 sudo 或 root 权限. 该命令会陆续询问一些问题.

image-20240604200954879

该命令中, 只有名字与密码是必须的, 其他可以一路回车跳过. 可另行设置.

该命令有更多行为与细节会输出出来. 而 useradd 更安静一些.

该命令默认创建用户 (UID), 用户家目录, 以及用户组 (GID), 并将用户添加到该组.

实际上两个命令都会从 /etc/skel 中拷贝数据.

adduser 使用更为方便, 它会提示你需要的信息. 但是为什么会同时存在两个命令? 因为不是所有的 Linux 发行版都有 adduser.

实际上 adduser 不是一个命令, 而是一个脚本 (shell script).

shell 脚本是一个文本文件, 但它像程序一样可以执行. 不用在意脚本, 会在第 06 章介绍到.

adduser 是使用 Perl 编写的一段脚本, Perl 常常会作为系统管理脚本的编写语言. 请确保不要使用 root 权限打开该文件, 并且不要修改. 使用下面命令可以打开查看 adduser 脚本.

nano /usr/sbin/adduser

从中可以查看到实际上执行的是 useradd.

下面看看怎么删除用户

2.3.3 删除用户

删除和禁用账户是很重要的. 可以使用 userdel 命令.

在删除用户之前, 需要问一问自己. 你或别人是否会访问该用户的文件? 许多公司会在用户离职后保留该用户的文件. 通常是使用拷贝, 将其文件放在一个长期使用的存储空间里. 但不是所有的公司都有该机制, 兴许需要你自己备份.

默认情况下 userdel 不会删除家目录下的内容.

sudo userdel dscully

删除后, 使用 ls -l /home 依旧可以看到目录. 我们可以将该目录移动到一个保存备份信息的位置, 例如:

sudo mv /home/dscully /store/file_archive

你也可以自行控制目标路径 (或自己创建等). 例如: sudo mkdir -p /storage/new_archive. -p 表示默认创建父目录, 如果不存在的话.

也可以直接删除该目录. 但注意, 这个用法很危险.

sudo rm -r /home/dscully

这里作者用了 sudo rm -r / home/dscully 来解释这样很危险.

现在已经知道如何创建, 删除用户了. 下面深入了解一下密码.

2.4 理解 /etc/passwd 和 /etc/shadow 文件

我们已经知道如何创建与删除用户, 并且也知道用户是文件放在 /home 目录中. 但是用户的账户信息存储在哪里呢? 它涉及两个文件:

  • /etc/passwd
  • /etc/shadow

可以使用 cat 等命令查看这两个文件. 所有用户都可以查看 /etc/passwd, 而只有管理员才可以查看 /etc/shadow 文件的内容.

切记不要修改这两个文件.

2.4.1 理解 /etc/passwd

该文件中的数据均已冒号分隔.

image-20240604204826039

其中, 第 1 列是用户名, 第 2 列的 x 暂且略过, 其后的第 3 列和第 4 列便是 UID 和 GID.

在 Linux 系统中, 用户名和组的标识使用的是数字, 而我们人类记忆的是名字.

这一点与 IP 和域名 同出一辙.

但是需要注意的是, UID 和 GID 不会在多个系统间同步 (也就是会存在重复的情况), 并且 UID 和 GID 大多数情况下不相同, 这里一样仅仅是巧合. 事实上, 组可以单独创建, 然后可以将用户添加到组中, 自然无法保证其 ID 相同.

可以看到还有很多其他用户, Linux 中常常会在后台采用不同的用户来执行不同的命令.

回到 /etc/passwd 文件中来, 第 5 列是用户的附加信息, 如 adduser 中提示的, 全名, 电话等信息.

第 6 列描述了家目录的地址.

第 7 列描述的是默认使用的 shell 程序. adduser 命令默认会使用 /bin/bash 作为默认程序, 而 useradd 则会使用 /bin/sh. 如过想要使用其他 shell, 可以在这里修改 (关于可用的 shell, 不在本书范围).

2.4.2 理解 /etc/shadow 文件

该文件的访问需要使用 sudo.

image-20240604210037720

首先一开始依旧是用户名, 但后面不是 UID, 有了 passwd 文件, 已经存在用户名与 ID 的映射了, 这里就不需要的, 这里存储实际上是秘钥的散列值.

这个散列几乎是无法逆向的. 存储散列, 而非秘钥原文, 是为了安全.

在 /etc/passwd 中的第二列的 x 实际上表示的就是, 用户的秘钥是被加密过的, 并且不在 passwd 文件中, 而在 shadow 文件中.

早些时候确实存储过明文, 但现在的 Linux 都会进行加密处理, 将秘钥的散列值存储与第二个文件中.

前面提到过 root 用户被锁住了, 下面来看看怎么回事, 执行下面命令

sudo cat /etc/shadow | grep root

image-20240604211056664

可见第 2 列, root 用户没有密码的散列值. 只有一个星号.

实际上这里放置星号, 或感叹号, 是锁定账户的方法. 实际上, 可以简单的使用 passwd -l 命令来锁定某个账户, 而不是编辑该文件.

虽然 root 被锁, 但依旧可以切换到 root (后面会介绍). 但这里限制后, 我们无法使用该账户进行登录, 我们使用普通账户登录, 然后再切换到 root.

除了秘钥的散列值, /etc/shadow 找那个还有些字段需要了解.

image-20240605095819014

其中第 3 列表示从 Unix 时间纪元至今的天数, 用于描述密码是什么时候修改的. Unix 时间纪元是 1970年1月1日.

就作者而言, 更喜欢使用 sudo passwd -S <用户名> 命令来查看.

image-20240605100347707

该命令可以查看所有用户的信息.

  • 第 1 列显然是用户名
  • 第 2 列表示密码状态
    • L 表示用户有密码, 并处于锁定状态
    • P 表示用户有密码, 并且处于可用状态
    • NP 表示用户无密码
  • 第 3 列表示最后修改密码的时间
  • 第 4 列表示再修改密码时需要等待的天数. 本例中为 0, 就表示随时可以修改.
  • 第 5 列是两次密码修改之间的最大天数, 这里的取值远大于现在人类的寿命, 可以理解为无限的.
  • 第 6 列表示提前几天警告用户需要修改密码.
  • 第 7 列表示密码过期后, 经过多少天账户会被禁用. 该值未设置.
  • 第 8 列, 未显示. 从 Unix 纪元到该账户被禁用的天数. 这里没有数据, 表示未设置.

更多细节可以通过 man 来查看:

man ls
man passwd
man shadow

退出使用 q.

下面看看创建用户时, 放在家目录的默认文件.

2.5 /etc/skel 中的默认配置文件

在一般的组织机构中, 都有为新用户提供的默认配置文件. 该文件放在 /etc/skel 目录下, 在创建用户时会将该目录下的文件拷贝到新用户的家目录下.

可以查看该目录的内容:

ls -la /etc/skel

image-20240605175509095

然后作者解释了 -la 的作用.

该目录下的文件会全部拷贝到你新创建的用户的家目录下. .bashrc 文件也是如此, 除非用户自行改动, 否则内容是一样的 (作者用该文件进行解释).

基于此, 你可以为所有用户 (员工) 提供默认的配置文件, 或欢迎, 联系方式等文件信息. 甚至是默认代码编辑规范等文件也可以放在这里.

现在已经了解到如何创建 (管理) 多个用户, 并且知道如何为用户提供默认文件了. 下面来看看如何切换用户.

2.6 选择用户

选择不同用户, 可以退出再登录. 实际上, 在 linux 上可以随时切换用户. 只需要当前用户具有 sudo 权限, 以及知道目标用户的密码.

切换用户的命令是 su. 如果直接使用 su, 不带参数. 则是选择 root 用户, 并提示输入 root 密码. 如前文所述, Ubuntu 是默认锁定 root 账户的, 因此会失败.

image-20240617151129220

有些虚拟服务商会提供 root 密码, 但作者认为, 如无特殊明确的要求, 建议还是保持 root 的锁定状态.

但是如果要解锁 root 也很容易, 只需要在创建 root 密码即可, 在任何具有 sudo 的账户下使用:

sudo passwd

然后回提示输入密码, 并确认密码. 然后你就可以使用 root 账户进行登录了. 下面的命令允许你切换成 root 账户, 如果要退出, 使用 exit 命令. 命令提示符前缀可以看出不同账户.

image-20240617151736425

切换账户可以使用

sudo su -

其中横线 - 表示切换账户后进入其家目录, 如果不带该参数, 则会保持在当前目录. 如果要进入某个具体用户, 则使用命令

su - <username>

然后提示输入密码, 退出使用 exit.

这个命令前提是需要知道用户的密码 (但实际上一般不会, 一般企业在给员工分配账号后, 会要求第一次登录后修改密码).

虽然你可以使用 root 账户和 sudo 访问权限, 随时修改任何用户的密码. 但是这样用户会发现密码被修改 (被偷窥). 但是实际上带上 sudo 前缀, 你可以切换到任意账户下, 并且不需要密码.

sudo su - <username>

然后作者描述一个切换账户很有用的例子: 员工向你抱怨无法访问某目录, 或执行命令, 你就可以直接进行测试, 复现问题, 查看问题了.

至此已经完全了解了账户的使用, 以及如何切换账户. 下面看看 group 的概念.

2.7 管理组

至此, 已经了解到如何创建, 管理, 切换用户账户了. 我们还需要了解如何管理组 (group). Linux 中组的概念与其他平台中的是一样的. 有了组, 可以很方便的控制用户对本地资源的访问.

将组分配给资源 (文件, 或文件夹等), 将用户添加到组中, 或从组中移除, 即可控制该用户是否可以访问该资源.

Last Updated:
Contributors: jk