引言
在管理服务器时,有时您可能希望允许用户以“root”(管理员级用户)的身份执行命令。sudo 命令为系统管理员提供了一种方式,可以将通常仅限于 root 用户的管理员权限授予普通用户。
在本教程中,您将学习如何在 Ubuntu 上创建一个具有 sudo 访问权限的新用户,而无需修改服务器的 /etc/sudoers 文件。
注意:如果您想为现有用户配置 sudo,请跳到步骤 3。
此外,如果您使用的是较旧版本的 Ubuntu,我们建议您升级到更新的版本,因为 Ubuntu 不再为这些版本提供支持。此指南合集将帮助您升级 Ubuntu 版本。
关键要点:
sudo启用受控的管理员访问。与共享 root 密码不同,sudo允许普通用户使用自己的凭据安全地执行特权命令,并具有内置的日志记录和可审计性。- 创建具有 sudo 权限的用户是一个简单的 4 步过程。工作流程包括以 root 身份登录、创建新用户(
adduser)、将用户添加到sudo组(usermod -aG sudo),并使用测试命令验证访问权限。 - 在 Ubuntu 上,组成员资格控制 sudo 权限。添加到
sudo组的用户会自动获得完整的管理员权限,在大多数情况下无需手动编辑/etc/sudoers文件。 sudo和su服务于不同的权限提升模型。sudo使用用户密码执行单个命令以提升权限,而su切换到另一个用户账户(通常是 root)并需要该用户的密码,从而授予完整的会话访问权限。- 服务账户不应具有 shell 访问权限。对于自动化或系统服务,可以使用
/usr/sbin/nologin或/bin/false创建用户,以防止交互式登录,从而提高系统安全性。 - 遵循最小权限原则以确保安全。避免不必要地授予完整的 sudo 访问权限。限制命令、使用绝对路径、避免通配符,并谨慎管理如
NOPASSWD等配置以降低安全风险。
创建新 Sudo 用户的步骤
- 登录服务器
- 向系统添加新用户
- 将用户添加到 Sudo 组
- 测试 Sudo 用户访问权限
步骤 1 — 登录您的服务器
以 root 用户身份通过 SSH 登录您的服务器:
- ssh root@your_server_ip_address
步骤 2 — 向系统添加新 Sudo 用户
使用 adduser 命令向系统添加新用户:
- adduser sammy
请确保将 sammy 替换为您想要创建的用户名。系统将提示您为该用户创建并验证密码:
OutputEnter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
接下来,系统将要求您填写新用户的某些信息。可以接受默认值并留空这些信息:
OutputChanging the user information for sammy
Enter the new value, or press ENTER for the default
Full Name []:
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n]
步骤 3 — 将用户添加到 sudo 组
使用 usermod 命令将用户添加到 sudo 组:
- usermod -aG sudo sammy
同样,请确保将 sammy 替换为您刚刚添加的用户名。在 Ubuntu 上,默认情况下,sudo 组的所有成员都具有完整的 sudo 权限。
步骤 4 — 测试 sudo 访问权限
sudo 访问权限要测试新的 sudo 权限是否生效,首先使用 su 命令切换到新用户账户:
- su - sammy
作为新用户,通过在要以超级用户权限运行的命令前添加 sudo 来验证是否可以使用 sudo:
- sudo command_to_run
例如,你可以列出 /root 目录的内容,该目录通常仅 root 用户可访问:
- sudo ls -la /root
在会话中首次使用 sudo 时,系统会提示输入该用户账户的密码。输入密码继续:
- Output:[sudo] password for sammy:
注意: 这不是 在请求 root 密码!请输入你刚刚创建的已启用 sudo 的用户的密码。
如果你的用户在正确的组中并且密码输入正确,你使用 sudo 发出的命令将以 root 权限运行。
理解 sudo 和 su 的区别
sudo 和 su 的区别sudo 和 su 都是 Linux 命令,允许你以提升的权限执行命令,但它们的方法不同。
sudo(SuperUser Do 或 Substitute User Do)允许授权用户通过自己的密码认证,以另一个用户(默认是 root 用户)的身份运行命令。它设计用于执行单个命令或一系列命令,持续时间有限,其访问权限可以通过 /etc/sudoers 文件高度配置。sudo 的一个关键优势是提供强大的审计跟踪,记录每个以提升权限执行的命令,这使其成为日常管理任务的更安全实践,因为它避免了直接共享 root 密码。
另一方面,su(Substitute User 或 Switch User)允许你完全切换到另一个用户账户,并需要目标账户的密码。当你使用 su(特别是带 - 或 --login 选项,如 su -)时,你将进入该用户的完整登录会话,继承其环境变量和 home 目录。这将授予对目标用户环境和权限的完全访问,整个会话持续直到你显式退出。虽然切换用户简单,但 su 不会自动记录会话中执行的单个命令,如果 root 密码被广泛知晓,则安全性较低。
创建无 shell 访问权限的用户(用于自动化或服务账户)
在许多系统管理场景中,您可能需要创建不用于人类用户交互登录的账户,而是由应用程序、脚本或特定服务(如 FTP 服务器、web 服务器或数据库)使用,以管理文件、运行进程或与其他系统组件交互。出于安全考虑,防止这些账户用于直接 shell 访问至关重要。
您可以在创建账户的过程中指定“no-login” shell 来创建此类用户。最常见的两种 no-login shell 是 /usr/sbin/nologin 和 /bin/false。两者都能有效防止用户在登录时获得交互式 shell 会话。选择其中任何一个都能有效锁定用户的交互式 shell 访问。
使用 adduser 创建无登录用户
使用 adduser 时,您可以使用 --shell 选项指定 shell:
- sudo adduser --system --no-create-home --shell /usr/sbin/nologin serviceuser
让我们分解各个标志的含义:
--system:此选项创建“系统用户”。系统用户通常具有低于 1000 的 UID(用户 ID)(尽管此范围可能有所不同),以区别于常规交互用户。它们通常还被排除在密码过期策略和某些系统报告之外。--no-create-home:对于服务账户,可能不需要单独的 home 目录,特别是如果账户仅需要访问特定预定义目录时。此选项防止adduser创建home目录。如果服务确实需要一个目录来存放其文件,请省略此选项并指定不同的 home 路径。--shell /usr/sbin/nologin:这是关键部分。它将/usr/sbin/nologin指定为用户的默认 shell。当此用户尝试登录时,通常会收到类似"This account is currently not available"的消息,并关闭连接。
例如,要创建一个名为 ftpuser 的系统用户,没有 home 目录且无 shell 访问权限,适用于 FTP 守护进程,可以使用以下命令:
- sudo adduser --system --no-create-home --shell /usr/sbin/nologin ftpuser
使用 useradd 创建无登录用户
如果您更喜欢 useradd 提供的更直接控制,可以使用它来实现相同结果:
- sudo useradd -r -s /usr/sbin/nologin serviceuser
让我们了解这些标志:
-r:此选项创建系统账户(类似于adduser --system)。-s /usr/sbin/nologin:明确将/usr/sbin/nologin设置为用户的登录 shell。
默认情况下,useradd 不会创建 home 目录,除非使用 -m 选项。因此,省略 -m 将不会创建 home 目录,这通常是此类账户的预期行为。
要创建一个名为 db_reader 的系统用户,无 shell 访问权限且无 home 目录,可以使用以下命令:
- sudo useradd -r -s /usr/sbin/nologin db_reader
使用 sudo -l 列出允许的命令
sudo -l 列出允许的命令作为管理员或普通用户,快速检查您或另一个用户在系统上拥有的 sudo 权限通常非常有用。sudo -l 命令通过列出用户允许通过 sudo 执行的命令来提供此功能。
要查看自己的 sudo 权限,只需运行:
- sudo -l
通常会提示您输入密码。认证成功后,sudo 将显示适用于您用户账户的规则列表,这些规则位于 /etc/sudoers 文件或其包含目录中。
如果您自己有 sudo 访问权限,可以使用 -U 选项指定其他用户的用户名来检查其权限:
- sudo -U another_username -l
将 another_username 替换为您要检查的实际用户名。这是管理员快速审计和验证用户权限的宝贵工具,而无需直接检查 /etc/sudoers 文件。
用户权限和限制 sudo 命令的最佳实践
sudo 命令的最佳实践让我们讨论一些管理用户权限和限制 sudo 命令的最佳实践,这些对于维护安全且稳健的 Ubuntu 系统至关重要:
用户权限的最佳实践
用户权限决定了谁可以读取、写入或执行系统上的文件和目录。强大的权限策略建立在最小权限原则 (PoLP)之上,这意味着用户和进程应仅拥有执行其预期功能所需的最小必要访问权限。
- 实施最小权限原则 (PoLP): 这是黄金法则。绝不授予绝对必要权限之外的更多权限。如果用户仅需要读取文件,则不要赋予他们写入或执行权限。
- 理解文件和目录权限: 定义谁可以访问和操作系统上的数据,按所有者、组和其他类别划分,使用
chmod命令。 - 利用组管理: 与其为众多用户授予个别权限,不如为特定功能创建组,并将相关用户添加到这些组中。设置文件和目录权限,使所有者和特定组拥有必要访问权限,而其他人则具有最小或无访问权限。
- 注意 umask:
umask设置(通常在.bashrc或系统范围配置中)决定了新创建的文件和目录的默认权限。确保您的 umask 具有适当的限制性。
限制 sudo 命令
授予完整的 sudo 访问权限(即允许用户在 /etc/sudoers 中运行 ALL=(ALL:ALL) ALL)相当于将 root 密码交给他们。虽然方便,但这会带来重大的安全风险。最佳实践要求将 sudo 权限限制在绝对必要的内容上。
- 仅授予必要命令:与允许用户运行
"ALL"命令不同,请指定他们需要的确切命令。 - 为命令使用绝对路径:始终在 sudoers 文件中指定任何列出命令的完整绝对路径(例如
/usr/sbin/service而非仅 service)。这可以防止恶意用户在系统的PATH其他位置创建同名自定义可执行文件,并欺骗sudo运行其恶意版本。 - 避免使用通配符 (*) 和正则表达式:在 sudoers 规则中使用通配符或复杂正则表达式可能会无意中授予比预期更广泛的访问权限。务必极其谨慎,并尽可能明确定义每个命令。
- 谨慎使用 NOPASSWD:
NOPASSWD标签允许用户在不提示输入密码的情况下执行sudo命令。仅对真正无害、不更改系统且频繁执行的命令使用NOPASSWD,如状态检查。对于涉及系统修改或访问敏感数据的任何命令,应始终要求输入密码。 - 控制环境变量: 默认情况下,
sudo在执行命令前会清理用户环境,以防止通过操纵环境变量(如PATH)进行权限提升。除非特定应用程序的功能绝对需要,否则避免在 sudoers 规则中使用SETENV标签,因为这可能会引入安全漏洞。
常见问题解答
1. adduser 和 useradd 有什么区别?
adduser 是一个高级且用户友好的脚本,它简化了创建新用户账户的过程。它会交互式地提示输入信息,自动创建 home 目录,复制骨架文件(如 .bashrc、.profile),设置适当的权限,并分配默认 shell。在大多数情况下,它是 Debian 系系统(如 Ubuntu)上创建用户的推荐命令。
useradd 是一个低级二进制文件,提供对用户创建的精细控制。它默认不创建 home 目录或复制骨架文件,需要使用选项指定或手动处理。它常用于脚本或自动化系统管理场景,需要精确控制和非交互式操作。
2. 如何检查用户是否具有 sudo 权限?
检查用户是否具有 sudo 权限的最简单方法是使用 getent 命令查看 /etc/group 文件:
- getent group sudo
此命令将列出 sudo 组的成员。如果你要检查的用户名在列表中,则该用户具有 sudo 权限。
或者,用户可以尝试使用 sudo 运行一个命令,例如:
- sudo ls /root
如果他们能够列出 /root 的内容(这需要 root 权限),则他们具有 sudo 访问权限。如果不能,他们将被提示输入密码,如果不在 sudo 组中,命令将失败。
3. 创建 sudo 用户后禁用 root 账户是否安全?
是的,在创建具有 sudo 权限的用户后禁用 root 账户通常被认为是安全的,甚至是一种良好的安全实践。这可以减少系统的攻击面。管理员不应直接以 root 身份登录,而是使用其普通用户账户登录,并使用 sudo 执行管理任务。
您可以通过锁定其密码来禁用 root 账户:
- sudo passwd -l root
这将阻止直接以 root 身份登录。要重新启用 root 账户,可以解锁它:
- sudo passwd -u root
4. 如何授予有限的 sudo 访问权限?
与其授予完整的 sudo 访问权限(允许用户以 root 身份运行任何命令),您可以配置有限的 sudo 访问权限,只允许用户以 root 身份运行特定命令。这通过使用 visudo 命令编辑 /etc/sudoers 文件来实现。
例如,允许用户 webadmin 重启 Apache Web 服务器:
- sudo visudo
然后添加如下行:
- webadmin ALL=(ALL:ALL) /usr/sbin/service apache2 restart
此行指定用户 webadmin 可以以 root 身份运行命令 /usr/sbin/service apache2 restart。
<$>[caution]
注意: 对 /etc/sudoers 文件的错误修改可能会严重影响系统管理。使用 visudo 时始终要小心。
<$>
5. 如何从用户中移除 sudo 权限?
您可以使用以下命令将用户从 sudo 组中移除:
- sudo deluser username sudo
移除后,用户将无法使用 sudo 执行命令。
6. 为什么将用户添加到 sudo 组后仍无法使用 sudo?
这可能由于以下常见原因:
- 用户在添加到组后未注销并重新登录。
- 组成员身份未正确应用。
/etc/sudoers文件中有自定义规则覆盖了默认行为。
排查步骤:
-
使用以下命令验证组成员身份:
- groups username
-
重新登录或重启会话
-
使用以下命令检查 sudo 权限:
- sudo -l
结论
在本快速入门教程中,我们创建了一个新的用户账户,并将其添加到 sudo 组中,以启用 sudo 访问权限。我们介绍了 sudo 和 su 之间的区别,并学习了如何为服务账户创建没有 shell 访问权限的用户。我们还讨论了授予用户权限并限制 sudo 命令的最佳实践。
要为您的全新用户授予外部访问权限,请参阅我们关于为常规用户启用外部访问的部分。
如果您需要更多关于设置 Ubuntu 服务器的详细信息,请从此列表中选择您的发行版,以遵循特定的 Initial Server Setup Guide。
有关更多 Ubuntu 相关主题,您可以参考以下文章:
- How To Edit the Sudoers File
- How To Create a New Sudo-enabled User on Rocky Linux
- How to Add and Delete Users on Ubuntu