在 Linux 服务器管理中,为用户授予执行管理级别命令的权限是常见的需求。sudo
命令提供了一种安全的方式,允许普通用户以 root
(管理员级别用户) 身份执行特定命令,而无需直接共享 root
用户的密码。
本教程将详细介绍如何在 Ubuntu 系统中创建一个新的用户,并赋予其 sudo
访问权限,同时不会修改服务器的 /etc/sudoers
文件。
注意: 如果您希望为现有用户配置
sudo
权限,请直接跳到第三步。 此外,如果您使用的是旧版 Ubuntu,我们强烈建议您升级到最新版本,因为旧版本可能已不再受到官方支持。
创建新 sudo
用户的基本步骤
- 登录到您的服务器
- 向系统添加新用户
- 将用户添加到
sudo
用户组 - 测试
sudo
用户访问权限
步骤 1:登录到您的 Ubuntu 服务器
首先,您需要以 root
用户身份通过 SSH 连接到您的服务器:
ssh root@your_server_ip_address
请将 your_server_ip_address
替换为实际的服务器 IP 地址。
步骤 2:在系统上添加新的 sudo
用户
使用 adduser
命令向系统添加一个新用户。例如,我们创建一个名为 sammy
的用户:
adduser sammy
请务必将 sammy
替换为您希望创建的实际用户名。执行此命令后,系统会提示您为新用户设置并确认密码:
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
接下来,系统会要求您填写一些关于新用户的附加信息。您可以选择接受默认值,直接按 ENTER
跳过这些信息:
Changing 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
用户组
在 Ubuntu 中,默认情况下,所有 sudo
用户组成员都拥有完整的 sudo
权限。使用 usermod
命令将您刚刚创建的用户添加到 sudo
用户组中:
usermod -aG sudo sammy
同样,请将 sammy
替换为您添加的用户名。-aG
选项表示将用户追加(-a
)到指定的附加组(-G
)中。
步骤 4:测试 sudo
访问权限
为了验证新用户的 sudo
权限是否生效,首先切换到新创建的用户账户:
su - sammy
当您作为新用户登录后,尝试通过在需要以超级用户权限运行的命令前加上 sudo
来验证权限。例如,您可以尝试列出 /root
目录的内容,该目录通常只有 root
用户才能访问:
sudo ls -la /root
在您当前会话中首次使用 sudo
时,系统会提示您输入该用户账户的密码。请输入您刚刚为 sammy
(或您创建的用户名)设置的密码:
[sudo] password for sammy:
重要提示: 这里要求输入的是您新创建的用户的密码,而不是
root
用户的密码!
如果您的用户在正确的组中且密码输入正确,那么您使用 sudo
执行的命令将以 root
权限运行,并成功显示 /root
目录下的内容。
理解 sudo
和 su
之间的区别
sudo
和 su
都是 Linux 中用于提升权限的命令,但它们的工作方式和适用场景有所不同。
sudo
(SuperUser Do 或 Substitute User Do):
sudo
允许授权用户通过输入自己的密码来以另一个用户(默认为 root
用户)的身份运行命令。它的设计目的是用于执行单个命令或在有限时间内执行一系列管理任务。sudo
的访问权限可以通过 /etc/sudoers
文件进行精细配置,可以指定哪些用户可以运行哪些命令。sudo
的一个主要优点是它提供了强大的审计跟踪能力,会记录每一个以提升权限执行的命令,这使其成为日常系统管理任务中更安全的选择,因为它避免了直接共享 root
密码。
su
(Substitute User 或 Switch User):
su
允许您完全切换到另一个用户的账户,并需要输入目标账户的密码。当您使用 su
(特别是带有 -
或 --login
选项,例如 su -
)时,您将作为目标用户进入一个完整的登录会话,继承其环境变量和 home
目录。这授予对目标用户环境和权限的完全访问,直到您明确退出为止。虽然 su
在用户切换方面简单直接,但它本身不记录会话中执行的单个命令,并且如果 root
密码被广泛知晓,则安全性较低。
总结来说,sudo
更侧重于“以其他用户身份执行命令”,而 su
更侧重于“切换到其他用户身份”。在日常管理中,sudo
因其细粒度的权限控制和审计能力,通常被认为是更安全、更推荐的做法。
创建无 Shell 访问权限的用户(用于自动化或服务账户)
在许多系统管理场景中,您可能需要创建不用于人类用户交互式登录的账户,而是由应用程序、脚本或特定服务(例如 FTP 服务器、Web 服务器或数据库)用于管理文件、运行进程或与其他系统组件交互。出于安全原因,阻止这些账户用于直接 Shell
访问至关重要。
您可以通过在账户创建过程中指定“无登录”Shell
来创建此类用户。最常见的两个无登录 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
。当此用户尝试登录时,他们通常会收到一条消息,例如“此账户当前不可用”,然后连接将关闭。
例如,要创建一个名为 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
。
默认情况下,除非使用 -m
选项,否则 useradd
不会创建 home
目录。因此,省略 -m
将导致不创建 home
目录,这通常是此类账户所希望的。
要创建一个名为 db_reader
的系统用户,不带 Shell
访问权限且不带 home
目录,我们可以使用以下命令:
sudo useradd -r -s /usr/sbin/nologin db_reader
使用 sudo -l
列出允许的命令
作为管理员或普通用户,快速检查自己或另一个用户在系统上拥有哪些 sudo
权限通常很有用。sudo -l
命令通过列出用户被允许通过 sudo
执行的命令来提供此功能。
要查看您自己的 sudo
权限,只需运行:
sudo -l
您通常会被要求输入密码。成功验证后,sudo
将显示适用于您的用户账户的 /etc/sudoers
文件或其包含目录中的规则列表。
如果您自己拥有 sudo
访问权限,可以使用 sudo -l
通过指定其用户名并带上 -U
选项来检查另一个用户的权限:
sudo -U another_username -l
将 another_username
替换为要检查的实际用户名。这是管理员快速审计和验证用户权限的宝贵工具,无需直接检查 /etc/sudoers
文件。
用户权限和限制 sudo
命令的最佳实践
让我们讨论一些管理用户权限和限制 sudo
命令的最佳实践,这对于维护安全稳健的 Ubuntu 系统至关重要:
用户权限的最佳实践
用户权限决定了谁可以读取、写入或执行系统上的文件和目录。强大的权限策略基于最小特权原则 (PoLP),这意味着用户和进程应仅拥有执行其预期功能所需的最低限度访问权限。
- 实施最小特权原则 (PoLP): 这是黄金法则。永远不要授予超出绝对需要的权限。如果用户只需要读取文件,则不要授予他们写入或执行权限。
- 理解文件和目录权限: 使用
chmod
命令定义谁可以访问和操作系统上的数据,并按所有者、组和其他分类。 - 利用组管理: 与其向许多用户授予单个权限,不如为特定功能创建组并将相关用户添加到这些组中。设置文件和目录权限,以便所有者和特定组具有必要的访问权限,而其他人只有最小或没有访问权限。
- 注意
umask
:umask
设置(通常在.bashrc
或系统范围的配置中)确定新创建文件和目录的默认权限。确保您的umask
适当严格。
限制 sudo
命令
授予完全 sudo
访问权限(即允许用户在 /etc/sudoers
中运行 ALL=(ALL:ALL) ALL
)与授予他们 root
密码相同。虽然方便,但它带来了重大的安全风险。最佳实践要求将 sudo
权限限制在绝对必要的范围内。
- 仅授予必要的命令:不要允许用户运行“所有”命令,而是指定他们需要的确切命令。
- 对命令使用绝对路径:始终在您的
sudoers
文件中列出的任何命令指定完整的绝对路径(例如,/usr/sbin/service
而不仅仅是service
)。这可以防止恶意用户在系统PATH
中的其他位置创建同名自定义可执行文件,并欺骗sudo
运行其恶意版本。 - 避免使用通配符 (
*
) 和正则表达式:在sudoers
规则中使用通配符或复杂的正则表达式可能会无意中授予比预期更广泛的访问权限。请务必格外小心,并确保尽可能明确定义每个命令。 - 谨慎使用
NOPASSWD
:NOPASSWD
标记允许用户执行sudo
命令而无需输入密码。仅对真正无害、不更改系统且经常执行的命令(例如状态检查)使用NOPASSWD
。对于任何涉及系统修改或访问敏感数据的命令,始终应要求输入密码。 - 控制环境变量: 默认情况下,
sudo
在执行命令之前会清理用户的环境,以防止通过操纵的环境变量(例如PATH
)进行权限提升。除非特定应用程序的功能绝对需要,否则请避免在sudoers
规则中使用SETENV
标签,因为它可能会引入安全漏洞。
常见问题
1. adduser
和 useradd
有什么区别?
adduser
是一个高级、用户友好的脚本,简化了创建新用户账户的过程。它以交互方式提示信息,自动创建主目录,复制骨架文件(如 .bashrc
、.profile
),设置适当的权限,并分配默认 Shell
。在大多数情况下,它是 Debian 系统(如 Ubuntu)上创建用户的推荐命令。
useradd
是一个较低级别的二进制文件,提供对用户创建的精细控制。它默认不创建主目录或复制骨架文件,需要通过选项或手动处理这些。它通常用于脚本或自动化系统管理,需要精确控制和非交互式操作。
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
身份直接登录。
您可以通过锁定 root
密码来禁用 root
账户:
sudo passwd -l root
这可以防止直接以 root
身份登录。要重新启用 root
账户,可以将其解锁:
sudo passwd -u root
4. 如何授予有限的 sudo
访问权限?
您可以通过编辑 /etc/sudoers
文件(使用 visudo
命令)来配置有限的 sudo
访问权限,而不是授予完全的 sudo
访问权限(允许用户以 root
身份运行任何命令)。
例如,要允许用户 webadmin
重新启动 Apache Web 服务器:
sudo visudo
然后,添加类似如下的一行:
webadmin ALL=(ALL:ALL) /usr/sbin/service apache2 restart
此行指定用户 webadmin
可以以 root
身份运行命令 /usr/sbin/service apache2 restart
。
注意: 对
/etc/sudoers
文件进行不正确的修改可能会严重影响系统管理。使用visudo
时务必小心。
结论
在本快速入门教程中,我们创建了一个新用户账户并将其添加到 sudo
用户组以启用 sudo
访问。我们介绍了 sudo
和 su
之间的区别,并学习了如何为服务账户创建没有 Shell
访问权限的用户。我们还讨论了授予用户权限和限制 sudo
命令时应遵循的最佳实践。
关于
关注我获取更多资讯

