Ubuntu 服务器用户管理

Ubuntu 服务器用户管理

用户管理是维护系统安全的重要环节。用户和权限管理不到位,经常会导致系统被攻破。因此,需要了解如何通过简单、有效的账户管理方法保护服务器。

root 在哪里?

Ubuntu开发者决定在所有Ubuntu安装中默认禁用管理员root账户。这不表示账户已删除或无法访问,而是为它设置了一个不可能匹配任何密码的哈希值,因此它无法直接自行登录。

系统管理任务改由sudo(“superuser do”)执行。经授权的用户可以使用自己的密码临时提升权限,而无需知道root密码。这样可以追溯用户操作,并由管理员控制用户获权后允许执行的操作。

sudo-rs

从Ubuntu 25.10(Questing Quokka)起,sudo由sudo-rs包提供,它使用Rust实现。sudo-rs与sudo.ws并非100%兼容,但支持绝大多数常见场景,对大多数用户而言,这一变化应该是透明的。

主要差异的列表持续维护在参考文档中。

Todd C. Miller维护的原始sudo工具sudo.ws,在25.10及后续26.04 LTS中仍受支持。这些工具带有.ws后缀,例如sudo.ws、visudo.ws。不建议把默认实现切回sudo.ws;如确有需要,可按以下步骤操作:

交互式操作:

update-alternatives --config sudo

非交互式操作:

update-alternatives --set sudo /usr/bin/sudo.ws

随时可以通过以下命令切回sudo-rs:

update-alternatives --set sudo /usr/lib/cargo/bin/sudo

关于此次调整的动机,参见博客文章Adopting sudo-rs By Default in Ubuntu 25.10。

本文其余部分对sudo.ws和sudo-rs的操作方式应当相同。

启用 root 账户

如果出于某种原因需要启用root账户,必须为它设置密码:

sudo passwd

sudo会先要求输入你自己的密码,然后要求为root设置新密码,如下所示:

[sudo: authenticate] Password: (enter your own password)
New password: (enter a new password for root)
Retype new password: (repeat new password for root)
passwd: password updated successfully

禁用 root 账户密码

使用以下passwd命令形式,禁用root账户密码:

sudo passwd -l root

更多sudo信息参见sudo(8)手册页:man sudo。

默认情况下,Ubuntu安装程序创建的初始用户属于sudo组;/etc/sudoers把该组定义为允许使用sudo的用户。若要让其他账户通过sudo获得完整root权限,将它加入sudo组即可。

列出、添加和删除本地用户

本地用户和组的管理与其他GNU/Linux系统差别不大。Ubuntu及其他基于Debian的发行版推荐使用adduser包进行账户管理。

本地用户和组分别定义在/etc/passwd和/etc/group中。不过,名称服务切换机制NSS也允许账户来自其他来源,例如远程Active Directory、Samba服务器或OpenLDAP目录服务。这些服务中的账户管理方式不同,不在本文范围内。

列出本地用户

/etc/passwd文本文件每行定义一个本地用户。使用cat /etc/passwd可列出内容。以下只显示部分行,以保持简洁:

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
...
ubuntu:x:1000:1000:Ubuntu:/home/ubuntu:/bin/bash

提示

/etc/passwd文件的结构参见passwd(5)手册页。

本地用户大致分为三类:

  • 系统预装用户:Linux系统正常运行所必需的用户,例如root、man、lp等,UID范围为0至99。

  • 系统用户:安装服务时动态创建,UID范围为100至999。

  • 普通用户:剩余范围用于实际使用系统的人员。UID从1000开始,按惯例到59999结束。

提示

UID范围、组以及添加用户的其他配置,参见adduser.conf.5手册页。

要列出所有本地用户名,可以对/etc/passwd内容做一些字符串处理。例如:

cat /etc/passwd | cut -d : -f 1

此命令以“:”为分隔符,取每行的第一列,输出所有本地用户名:

root
daemon
bin
sys
...

如果希望只显示普通用户,原文使用以下正则表达式筛选UID;其实际边界见后文提示:

cat /etc/passwd | cut -d : -f 1,3 | grep -E ':[0-9]{4,}'

正则表达式:[0-9]{4,}表示冒号后跟4位或更多数字,输出类似如下:

nobody:65534
ubuntu:1000

提示

按惯例,nobody的UID为65534。这起源于用户范围受16位限制、即0至65535的时期,出于兼容原因一直保留。

关于远程用户

getent passwd乍看也像是在列出所有本地用户,但它实际上列举passwd数据库的所有条目,因此也会包含已安装、配置的NSS模块提供的条目。

在默认Ubuntu安装且未额外配置时,确实只会列出本地用户,但不能推广到一般情况。例如,安装并配置libnss-ldap后,getent passwd会列出所有本地用户,以及在所配置LDAP服务器中找到的远程用户。

不建议执行这种穷举,因为它可能产生大量网络流量,并给远程服务器带来不合理负担。实际上,大多数NSS服务默认禁止这样的枚举。

NSS机制的更多信息,参见nss(5)和nsswitch.conf(5)手册页。

添加用户

使用以下命令添加账户,并按提示设置密码和可识别的信息,例如全名、电话号码等:

sudo adduser username

删除用户

使用以下命令删除用户账户及其主组:

sudo deluser username

删除账户不会删除对应的主目录。应按数据保留政策决定手动删除目录,还是保留它。

如果未采取必要防护,后续新建的用户一旦拥有相同UID/GID,就会获得该目录的访问权。

可以把目录的UID/GID更改为适当的账户,例如root,必要时还可以移动目录,以避免未来冲突:

sudo chown -R root:root /home/username/
sudo mkdir /home/archived_users/
sudo mv /home/username /home/archived_users/

锁定或解锁密码

临时锁定用户密码:

sudo passwd -l username

对应地,解锁用户密码:

sudo passwd -u username

添加或删除组

分别使用以下命令添加或删除自定义组:

sudo addgroup groupname
sudo delgroup groupname

将用户加入组

使用以下命令将用户加入组:

sudo adduser username groupname

用户配置与主目录安全

创建用户时,adduser会新建/home/username主目录。默认配置以/etc/skel中的内容为模板,包含基本的用户配置文件。

如果服务器供多个用户使用,应特别注意主目录权限,以保护私密数据。

Ubuntu 21.10 Impish 及以后版本

当前默认以私有权限0750(drwxr-x---)创建主目录,仅用户本人及其组成员可以访问。

Ubuntu 21.04 Hirsute 及以前版本

较早的默认值为0755(drwxr-xr-x),允许所有用户读取、进入其他用户的主目录,这可能不适合你的环境。

使用以下命令检查主目录当前权限:

ls -ld /home/username
drwxr-xr-x  2 username username    4096 2007-10-02 20:03 username

输出显示/home/username对所有用户可读。可以用以下命令撤销其他用户的读取权限:

sudo chmod 0750 /home/username

注意

不要不加区别地使用递归选项-R,它会修改所有子目录和文件,可能带来意外后果。只修改父目录权限,已足以阻止未经授权者访问其下内容。

更高效的做法是修改adduser创建主目录时的全局默认权限。编辑/etc/adduser.conf,将DIR_MODE改为适当值,使以后新建的主目录都获得正确权限。

DIR_MODE=0750

使用上述任一方法修正权限后,按以下方式验证:

ls -ld /home/username
drwxr-x---   2 username username    4096 2007-10-02 20:03 username

密码策略

强健的密码策略是系统安全态势的重要部分。许多成功入侵都是针对弱密码的简单暴力破解或字典攻击。

如果提供使用本地密码体系的远程访问,应明确最低复杂度、最长有效期,并定期审计身份验证系统。

最低密码长度

原文描述Ubuntu默认要求至少6个字符,并进行基本熵检查。这些设置由/etc/pam.d/common-password控制,如下所示。具体默认值应以目标系统实际配置为准。

password        [success=1 default=ignore]      pam_unix.so obscure sha512

把最小长度改为8个字符,可以添加minlen=8,修改示例如下:

password        [success=1 default=ignore]      pam_unix.so obscure sha512 minlen=8

注意

管理员使用sudo级别命令为新用户设置密码时,基本熵检查与最小长度规则不会应用。

密码到期

原文建议在创建账户时设置密码的最短与最长使用期限,并在到期后要求修改密码。

查看账户当前状态:

sudo chage -l username

以下输出显示了账户状态,当前尚未应用这些策略:

Last password change                                    : Jan 20, 2015
Password expires                                        : never
Password inactive                                       : never
Account expires                                         : never
Minimum number of days between password change          : 0
Maximum number of days between password change          : 99999
Number of days of warning before password expires       : 7

要设置这些值,使用chage(“change age”)并按交互提示操作:

sudo chage username

以下示例手动设置:账户到期日-E为2015-01-31,最短密码期限-m为5天,最长期限-M为90天,密码到期后的非活动期-I为30天,以及到期前警告期-W为14天:

sudo chage -E 01/31/2015 -m 5 -M 90 -I 30 -W 14 username

使用前面相同的命令验证修改:

sudo chage -l username

以下输出显示了账户的新策略:

Last password change                                    : Jan 20, 2015
Password expires                                        : Apr 19, 2015
Password inactive                                       : May 19, 2015
Account expires                                         : Jan 31, 2015
Minimum number of days between password change          : 5
Maximum number of days between password change          : 90
Number of days of warning before password expires       : 14

其他安全考虑

许多应用使用其他身份验证机制,即使有经验的管理员也容易忽略。因此,需要了解并控制用户如何通过身份验证,以及如何访问服务器上的服务和应用。

禁用密码后仍可能存在 SSH 访问

如果用户之前配置了SSH公钥认证,禁用或锁定密码不会阻止其远程登录;无需任何密码,仍可获得shell访问。应检查用户主目录中允许此类SSH认证的文件,例如/home/username/.ssh/authorized_keys。

移除或重命名用户主目录中的.ssh/目录,可以阻止后续通过该目录的密钥认证访问。

还应检查被禁用账户已建立的SSH连接,包括入站和出站连接,并用pkill终止找到的相关会话。

w | grep username  (to get the pts/# terminal)
sudo pkill -f pts/#

只允许应当获得SSH访问权的账户登录。例如,创建sshlogin组,在/etc/ssh/sshd_config中把AllowGroups设置为该组:

AllowGroups sshlogin

然后把允许登录的用户加入sshlogin组,并重启SSH服务。

sudo adduser username sshlogin
sudo systemctl restart ssh.service

外部用户数据库认证

大多数企业网络要求对系统资源进行集中认证与访问控制。如果服务器通过外部数据库认证用户,禁用用户时应同时处理外部和本地账户,确保无法回退到本地认证。

正文相关链接

来源与许可

原文:用户管理。作者/维护者:Canonical及Ubuntu Server文档贡献者。

Canonical版权与许可声明。本页为中文翻译或中文整理,保留原始示例;措辞与排版有调整。另加入明确标注的适用边界提示。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容