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,在25.10及后续26.04 LTS中仍受支持。这些工具带有.ws后缀,例如sudo.ws、.wsvisudo.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数据库的所有条目,因此也会包含已安装、配置的NSS模块提供的条目。passwd
在默认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
外部用户数据库认证
大多数企业网络要求对系统资源进行集中认证与访问控制。如果服务器通过外部数据库认证用户,禁用用户时应同时处理外部和本地账户,确保无法回退到本地认证。











暂无评论内容