最小权限原则

最小权限原则(Principle of Least Privilege, POLP)是一种在计算机安全领域广泛遵循的原则,其核心理念是:任何用户、进程、程序或系统组件都应仅拥有执行其任务所必需的最小范围内的权限。换句话说,不应授予比完成工作所需的更多访问权或特权。

具体来说:

  • 每个用户账号应当只被赋予完成其职责所必要的账户权限,例如,如果一个用户只需要读取特定文件,则不应授予其写入或删除该文件的权限。
  • 应用程序和服务应当以非管理员或最少特权用户身份运行,除非它们确实需要进行系统级别的操作。
  • 系统配置和策略应当限制不必要的资源访问,确保即使有恶意软件或内部误操作发生时,攻击面也能保持最小化。

通过实施最小权限原则,可以有效减少潜在的安全威胁,因为即便某个部分遭到破坏,其损害也会受限于其所拥有的权限级别。这有助于防止恶意活动扩散,并保护敏感信息不被未经授权的访问或修改。

用户

切换到其他用户

变更帐号为 root 并在执行 ls 指令后退出变回原使用者:

1
su -c ls root

变更帐号为 test 并改变工作目录至 test 的家目录:

1
su - test

从 root 用户切换为之前的普通用户只需要 exit 即可。

修改密码

普通用户修改自己的密码

1
passwd

root 用户修改其他用户密码

1
passwd user_name

如果修改密码过程中不想修改了,可以尝试 ctrl + c 或者 ctrl + d 退出

锁定某个用户的密码(让他不能修改):

1
2
3
4
# 锁定
passwd -l user_name
# 解除锁定
passwd -u user_name

删除用户密码(则登录时无需密码):

1
passwd -d user_name

用户组

将用户归为特定的组并设置路径权限

创建组

首先,如果A组和B组还不存在,你可以使用 groupadd 命令来创建它们:

1
2
sudo groupadd groupA
sudo groupadd groupB

将用户添加到组中

使用 usermod 命令将用户添加到所需的组中。例如,将用户 user1 添加到 groupA

1
sudo usermod -aG groupA user1

同样地,将用户 user2 添加到 groupB

1
sudo usermod -aG groupB user2

在这个命令 sudo usermod -aG groupA user1 中:

  • -a: 这个选项是 “append” 的缩写。使用 -a 选项意味着你想要向用户的现有组(以及其他组)中添加一个新的组,而不是替换掉现有的组
  • G: 这个选项告诉 usermod 命令你要修改用户的组关联。

因此,-aG 组合选项的作用是将指定用户添加到指定的组(在此例中是 groupA)中,而不会影响该用户的其他组关联。

如果想要让某个文件/路径A组可读写,B组可读,单纯通过 chmod 无法实现,需要借助更高级的权限管理工具。因此一种常规的做法是,将同一个用户添加到多个组中,通过对组的权限进行设置,实现复杂权限控制。

如果你想要将当前用户(即你正在使用的用户)移动到一个特定的组中,你可以使用 usermod 命令。但是需要小心,这样做可能会导致一些权限问题,因为用户现有的文件和目录可能是基于之前的主组创建的。所以,在更改用户的主组后,确保适当地调整文件和目录的权限,以确保用户在新的主组中有所需的权限

要将当前用户(例如,假设当前用户是 user1)移动到 groupA 组,你可以执行以下命令:

1
sudo usermod -g groupA user1

设置路径权限

使用 chmodchown 命令来设置路径的权限。例如,如果你有一个名为 /path/to/your/directory 的目录,并且你想让 groupA 的用户有对该目录的读写权限,而 groupB 的用户只有读权限,你可以执行以下操作:

  1. 设置目录 所有者:组
1
sudo chown user1:groupA /path/to/your/directory

所有者和组没有必然联系,所有者未必是属于这个组的。

  1. 设置目录的权限为允许 groupA 读写,但只允许 groupB 读:
1
sudo chmod 770 /path/to/your/directory

现在,只有属于 groupA 的用户可以读取、写入和执行 /path/to/your/directory。其他用户(不是所有者也不属于 groupA 的用户)则不能访问这个目录。

  1. 设置ACL (可选)
    如果你想为特定的组或用户设置更细粒度的权限控制,可以考虑使用ACL(访问控制列表)。这允许你设置文件或目录的详细权限规则。

修改所属组

1
2
3
4
5
6
# 修改所属用户
sudo chown 新所有者用户名 文件或目录路径
# 修改所属组
sudo chown :新组名 文件或目录路径
# 同时修改所属用户和所属组
sudo chown 新所有者用户名:新组名 文件或目录路径

Linux 权限说明

在Linux和UNIX系统中,文件和目录的权限可以使用数字形式表示。这些数字是通过组合不同的权限标志来构成的。

每个权限标志对应一个特定的数值:

  • r(读取权限):对应数值 4
  • w(写入权限):对应数值 2
  • x(执行权限):对应数值 1

为了设置文件或目录的权限,你可以为所有者、组和其他用户分别分配上述的权限数值。当你将这些数值相加,就可以得到完整的三位数字表示权限。

举例来说,如果你看到一个权限设置是 770,它可以被分解为:

  • 第一个数字 7:代表所有者的权限。这是通过将 rwx 转换为对应的数值进行计算得到的,即 4 (读) + 2 (写) + 1 (执行) = 7
  • 第二个数字 7:代表所属组(即属于该组的其他用户)的权限。同样,它也是 rwx,即 4 (读) + 2 (写) + 1 (执行) = 7
  • 第三个数字 0:代表其他用户(不是文件或目录的所有者或同组的用户)的权限。这里为 0 意味着没有任何权限。

授权指令chmod

https://www.runoob.com/linux/linux-comm-chmod.html

语法

1
chmod [-cfvR] [--help] [--version] mode file...

参数说明

mode : 权限设定字串,格式如下 :

1
[ugoa...][[+-=][rwxX]...][,...]

其中:

  • u 表示该文件的拥有者,g 表示与该文件的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示这三者皆是。
  • + 表示增加权限、- 表示取消权限、= 表示唯一设定权限。
  • r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该文件是个子目录或者该文件已经被设定过为可执行。

其他参数说明:

  • -c : 若该文件权限确实已经更改,才显示其更改动作
  • -f : 若该文件权限无法被更改也不要显示错误讯息
  • -v : 显示权限变更的详细资料
  • -R : 对目前目录下的所有文件与子目录进行相同的权限变更(即以递归的方式逐个变更)
  • --help : 显示辅助说明
  • --version : 显示版本

示例

1
2
3
4
# 给 /test/a 的所有者添加执行权限
chmod u+x /test/a
# 所有人可读、写、执行 /test/a
chmod 777 /test/a

查看当前系统的用户/组情况

要查看当前系统上的所有组和用户,你可以使用以下命令:

  1. 查看所有组

你可以查看 /etc/group 文件来列出所有的组。这个文件包含了系统上的所有组的信息。

1
cat /etc/group

或者使用以下命令,它会输出更加简洁的组列表:

1
getent group
  1. 查看所有用户

你可以查看 /etc/passwd 文件来列出所有的用户。这个文件包含了系统上的所有用户的信息。

1
cat /etc/passwd

但是,如果你只想查看系统用户而不包括系统服务用户(通常UID < 1000的用户),你可以使用以下命令:

1
awk -F':' '$3 >= 1000 && $3 != 65534 { print $1 }' /etc/passwd

这个命令使用了 awk 工具来过滤 UID 在 1000 或以上的用户,并排除了通常用于系统服务的用户(如 nobody)。

  1. awk:这是一个文本处理工具,用于对文本文件进行数据提取和处理。
  2. -F':':这是 awk 命令的一个选项,它告诉 awk 使用 : 作为字段分隔符。在这里,我们正在处理 /etc/passwd 文件,该文件使用 : 来分隔不同的字段。
  3. '$3 >= 1000 && $3 != 65534 { print $1 }'
    • '$3 >= 1000:这个条件检查第三个字段(即用户 ID,UID)是否大于或等于 1000。
    • &&:这是一个逻辑与操作符,用于结合多个条件。
    • $3 != 65534:这个条件确保 UID 不是 65534。通常,这个 UID 被 nobody 用户使用,所以我们排除它。
    • { print $1 }:当上述条件都满足时,执行这个动作,打印出第一个字段,也就是用户名。
  4. /etc/passwd:这是我们想要处理的文件路径,它通常包含系统上所有用户的列表及其相关信息。

查看当前用户进程

1
2
3
4
# u: 显示用户、启动进程的时间和命令, x: 显示没有控制终端的进程
ps ux
# 筛选
ps ux | grep 'python main.py'