尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Linux安全创建普通用户全指南:从root权限到最小权限原则

Linux安全创建普通用户全指南:从root权限到最小权限原则 我刚接触Linux那会儿拿到服务器第一反应就是root直接登录、root直接干活什么都是root省事。后来在真实项目里被坑了几次——一次是手滑删错目录一次是别人共用服务器时不小心改了系统配置——才彻底明白一个道理root是拿来管理系统的不是拿来日常干活的。创建普通用户是Linux基础里最不起眼却最该早点学会的操作之一。这篇东西就聚焦一件事在root超级用户下如何安全、规范地创建普通用户。我会把底层逻辑、完整流程、参数解析、常见坑都讲清楚同时覆盖乌班图Ubuntu、CentOS、麒麟等主流发行版的差异适合刚入门的新手也适合带团队、管服务器时想快速给同事开账号的运维同学。看完你不仅能建号还能明白为什么Linux社区一直强调最小权限原则。1. 为什么你该把“创建普通用户”当成必修课1.1 root权限的“强”与“险”root在Linux里是UID为0的超级用户理论上可以对系统做任何事——改内核参数、删任意文件、给任意进程发信号、覆盖系统目录。这种力量在日常操作中很方便但代价是一旦操作失误没有“回收站”没有“二次确认”。我印象很深的一次某台测试服务器上我想清理临时目录结果变量没写全一条rm -rf $TMP/因为$TMP是空的变成了rm -rf /。幸好那是台虚拟机我及时按了断电但还是差点把整个系统清了。那之后我给自己立了个规矩能不用root就不用root能用普通用户做的事情绝不切到超级用户。这不是胆小而是工程上的稳健。生产环境里一条错误的root命令可能导致整个服务不可用损失的是真金白银。普通用户权限再大也有边界这个边界就是安全兜底。1.2 普通用户到底“普通”在哪普通用户是UID从1000不同发行版略有差异开始分配的账户它的权力边界很清晰只能读、写、执行自己权限范围内的文件通常是家目录和系统明确授予访问权的目录。不能修改系统级配置比如/etc/passwd、/etc/sudoers、内核模块这些。不能随意安装全局软件、监听1024以下端口、管理其他用户的进程。对系统文件的修改必须通过sudo提权而且每一次提权都会在日志里留下记录。打个比方root像是整栋楼的物业总钥匙能进任何房间、拆承重墙、改水电总闸。普通用户就像租客只有自己房间的钥匙公共区域能用但改不了格局。租客要动公共设施得先向物业申请sudo物业同意并登记后才能做。这套机制既保护了系统也保护了使用者自己——你误操作了损失范围可控责任也清晰。1.3 四个真实场景逼你必须学会建用户场景一团队共用的开发服务器。几个同事都要登录同一台Linux机器部署代码、跑测试如果所有人都用root出了事故根本无法定位是谁操作的。给每人建一个普通用户配合sudo权限和日志审计责任边界一目了然。场景二给某个应用创建专用账户。比如部署Tomcat、Nginx、数据库实例时最佳实践是用独立系统用户运行这样即使应用被入侵攻击者拿到的也只是这个受限用户的权限而不是root。场景三给客户或外包提供临时访问通道。开一个临时普通用户到期自动锁定可以设置账户过期时间既方便协作又不暴露系统全局。场景四自己日常使用的桌面Linux乌班图、麒麟等。很多人桌面端一直用root登录浏览器、文档、开发工具全在超级用户下跑。一旦浏览器被恶意网页利用等于直接给了攻击者root权限。用普通用户日常办公需要装系统级软件时再sudo是基本的自我防护。2. 动手前的准备工作看清发行版、想好规划2.1 先确认你现在的用户和权限状态在创建新用户之前第一件事是确认自己确实有超级用户权限。在终端输入whoami id输出root且uid0(root)说明你当前就在root下。如果是一般用户则需要用su -切换或通过sudo执行特权命令。还有一种常见情况很多乌班图Ubuntu系统刚装好时root是没有密码的平时要用管理员权限时都是sudo。这时候创建用户可以直接在普通用户下用sudo useradd ...来执行效果和root下一样。但为了操作方便本文按标题场景“在root超级用户下”来展开命令本身通用。2.2 发行版差异useradd和adduser到底选谁这里必须先讲清楚一个很多人混淆的点useradd和adduser不完全是一回事。useradd是Linux系统的标准底层命令几乎所有发行版都有。它很“机械”让你创建用户就只创建用户不会自动给你建家目录、不会自动设置密码、也不会自动复制默认配置文件。adduser在Debian/Ubuntu系是一个交互式Perl脚本它会“一条龙服务”创建用户的同时问你密码、填备注、自动建家目录、把/etc/skel下的默认文件复制进新家目录体验非常友好。在CentOS、Rocky、Fedora、银河麒麟等RHEL系发行版上adduser其实是useradd的符号链接行为跟useradd一样没有交互式引导。所以你如果在CentOS上敲adduser发现没有提示设置密码别奇怪这不是出错是发行版特性。我的建议是如果你用的乌班图/Deepin这类Debian系日常写教程、给新人演示用adduser最省心。如果你在RHEL系发行版或者写自动化脚本用useraddpasswd更可控、更符合脚本化思路。如果你要创建的账户是给服务进程用的如nginx、redis建议用useradd -r -s /sbin/nologin创建系统用户不建家目录、不给登录Shell安全面最小。2.3 建号前先回答这四个问题动手前先想清楚能避免后面反复改配置用户名username要用什么名字建议全小写、简短、见名知意比如zhangsan、deploy、git。家目录home dir要不要家目录默认是/home/用户名服务账户一般不需要可以指定-M不创建或-d指定路径。登录Shellshell用bash、sh、zsh还是禁止登录/sbin/nologin普通用户给/bin/bash纯服务账户给/sbin/nologin。附加组group要不要加入sudo组或wheel组能不能执行特权命令就在这一步决定。乌班图的sudo组、CentOS的wheel组二者选其一。这些问题在脑子里过一遍比盲敲命令重要得多。我见过不少人建完用户发现没家目录、没密码、没sudo权限回头再拿usermod一点点补其实一开始多敲几个参数就能避免。3. 实操全流程useradd passwd 三步创建用户3.1 最简流程三步完成一个标准用户假设当前是root要给同事建一个叫zhangsan的普通用户家目录默认、Shell用bash、以后可能要sudo# 第1步创建用户并生成家目录 useradd -m -s /bin/bash zhangsan # 第2步设置密码 passwd zhangsan # 第3步验证结果 id zhangsan ls -ld /home/zhangsan就这么简单。passwd会提示你输入两次新密码输入时终端不显示字符这是正常的别以为键盘坏了。验证输出类似uid1001(zhangsan) gid1001(zhangsan) groups1001(zhangsan) drwxr-x---. 2 zhangsan zhangsan 74 3月 10 10:20 /home/zhangsan注意家目录权限drwxr-x---默认是750即用户自己有完整权限同组可读可执行其他用户无法进入。这是安全默认值建议保持别为了省事改成777。此时新用户已经可以登录了。可以用su - zhangsan从root切换过去或者以后让用户通过SSH远程登录。如果再想让zhangsan能执行sudo命令再补一步授权后面第4节详细讲。3.2 useradd 参数逐个拆解useradd参数非常多但日常高频的就这几个我整理成一张表方便对标参数含义典型用法不给会怎样-m创建家目录useradd -m zhangsan没有/home/zhangsan登录后可能回不到家-d指定家目录路径useradd -m -d /data/home zhangsan家目录用默认的/home/用户名-s指定登录Shelluseradd -m -s /bin/bash zhangsan可能用系统默认Shell也可能是/sbin/nologin-G指定附加组可多个useradd -m -G sudo,docker zhangsan用户不在任何特权附加组里-g指定主组useradd -m -g devgroup zhangsan默认创建一个同名的用户组作主组-u指定UIDuseradd -u 1050 zhangsan自动分配下一个可用UID-e账户过期日期useradd -e 2025-12-31 zhangsan账户永不过期-M不创建家目录useradd -M -s /sbin/nologin nginx建了不需要的家目录-r创建系统用户useradd -r -s /sbin/nologin redisUID很大不适合服务用这段里面最容易忘的是-m。我见过太多新手在CentOS上执行useradd zhangsan后切过去发现提示找不到家目录一问才发现忘了加-m。所以如果你拿不准就固定写useradd -m -s /bin/bash这是给“真人用户”用的标准模板。3.3 设置密码的门道passwd是创建用户后的标配动作但它的功能远不止“输两次密码”。掌握这几个用法处理账户问题会很顺手# 修改指定用户密码 passwd zhangsan # 锁定账户禁止登录但不会删除账户 passwd -l zhangsan # 解锁账户 passwd -u zhangsan # 删除用户密码变成“无密码登录”危险慎用 passwd -d zhangsan # 查看用户密码状态是否锁定、最后修改时间、过期天数 passwd -S zhangsan密码安全策略也不能忽视。很多系统装了pam_pwquality模块你设置弱密码比如123456时系统会直接拒绝提示密码太短或过于简单。这是好事别试图绕过。生产环境密码建议至少12位包含大小写、数字和符号。如果用户忘了密码root可以用passwd 用户名直接强制重置普通用户改自己的密码则输入passwd不加用户名即可但要先输入原密码验证。另外提一句有些乌班图系统刚安装时root没有密码只有第一个用户能用sudo。此时你想切到root执行passwd会提示“无法操作”优先用sudo -i或sudo passwd root给root设置密码。3.4 Ubuntu派系用adduser体验完全不同Debian系的乌班图、Deepin、Linux Mint等系统推荐用adduser创建普通用户adduser zhangsan执行后系统会交互式地依次询问正在添加用户“zhangsan”... 正在添加新组“zhangsan”(1001)... 正在添加新用户“zhangsan”(1001)到组“zhangsan”... 输入新的 UNIX 密码 确认新的 UNIX 密码 passwd密码已成功更新 正在改变 zhangsan 的用户信息 请输入新值或直接按回车键以使用默认值 全名 []: 房间号码 []: 工作电话 []: 家庭电话 []: 其它 []:全名和电话这些直接回车跳过就行不影响使用。最后会显示“信息正确吗”的确认提示按Y结束。adduser相比useradd最大的优势是自动化自动创建家目录、自动复制/etc/skel下的默认文件比如.bashrc、.profile、自动分配UID和主组、自动设置密码。一步到位不需要再单独跑passwd和cp。如果你是刚接触Linux的萌新我强烈建议先在乌班图环境用adduser走一遍建立“创建用户应该长什么样”的直观感知之后再学useradd的精细控制会更轻松。4. 权限的精髓sudo授权与用户组管理4.1 给普通用户打开sudo的两种正确姿势只创建用户不授权他能做的事其实很有限——只能在自己家目录里活动安装软件、管理系统服务都得找你帮忙。但在真实项目里同事需要装依赖、看系统日志、重启服务这时候就要给普通用户开sudo权限。方法一把用户加到sudo管理组里最推荐usermod -aG sudo zhangsan # Debian/Ubuntu系 usermod -aG wheel zhangsan # RHEL/CentOS系很多发行版默认在/etc/sudoers里已经写好了对应组的授权规则比如乌班图里是%sudo ALL(ALL:ALL) ALLCentOS里是%wheel ALL(ALL) ALL。所以你只要把人加进这个组sudo权限就立即生效不需要再编辑sudoers文件。注意-aG中的-a是append追加的意思千万不能省略。如果写成usermod -G sudo zhangsan会把用户从其他附加组里全部移除只保留sudo组——这个问题我踩过一次当时把用户踢出了docker组导致他所有容器命令全报权限错误。方法二编辑/etc/sudoers文件适合精细控制如果你只想给某个用户放开特定命令而不给完全sudo就用visudo打开编辑器在文件末尾加一行zhangsan ALL(ALL) /usr/bin/systemctl, /usr/bin/apt这种写法表示zhangsan可以sudo执行systemctl和apt其他命令不行。注意编辑sudoers文件一定要用visudo而不是直接vi /etc/sudoers因为visudo会做语法检查防止你写错导致sudo崩溃。验证授权是否生效可以切到该用户执行sudo whoami输出root说明sudo权限正常第一次执行时会提示输入该用户的密码这是正常的。4.2 usermod 命令的日常用法用户创建之后很多需求其实是通过usermod来动态调整的不需要删号重建。常用姿势如下# 修改用户的附加组追加方式保留原有组 usermod -aG docker zhangsan # 修改用户的登录Shell usermod -s /bin/zsh zhangsan # 修改用户的UID usermod -u 1050 zhangsan # 锁定用户禁止登录 usermod -L zhangsan # 解锁用户 usermod -U zhangsan # 修改用户家目录需要配合移动目录 usermod -d /new/home/zhangsan -m zhangsan这个命令和useradd的参数高度重叠区别是作用在已存在的用户上。很多入门资料会忽略它但实际工作中给用户加docker组、加sudo组、换Shell全靠它。4.3 用户、组、权限三者怎么配合我之前在一家公司管理过一台多人共用的开发机几十个开发者在上面跑构建任务。如果大家共用一个账户那磁盘配额、环境变量、历史命令全混在一起迟早出乱子。后来我按项目分了用户组比如前端组、后端组、运维组然后通过附加组来控制访问权限。具体思路是这样的# 创建三个组 groupadd frontend groupadd backend groupadd ops # 把用户分别加到对应组 usermod -aG frontend zhangsan usermod -aG backend lisi usermod -aG ops wangwu # 设置共享目录的组所有权和权限 mkdir -p /projects/front-end chown root:frontend /projects/front-end chmod 2770 /projects/front-endchmod 2770中的2是设置setgid位表示在这个目录下新建文件自动继承目录的组身份这样同一个组的人能互相读写文件而其他组的人进不来。这套组合拳下来一个简单的多用户协作环境就成型了全程不涉及任何危险的root操作。命令里用到的groupadd是和useradd配套的组管理命令日常还会配合groupmod -n 新名 旧名重命名组、groupdel 组名删除组。内容不多但理解“用户归属于组组决定权限边界”这个模型比死记命令更重要。5. 常见问题与排查技巧实录5.1 新用户登录报错/没有家目录现象创建用户后su - zhangsan切过去提示No directory, logging in with HOME/或者命令行一直在/下回不到/home/zhangsan。原因创建用户时没加-m系统没生成家目录。解法# 补建家目录并设置正确的属主 mkdir -p /home/zhangsan chown zhangsan:zhangsan /home/zhangsan chmod 700 /home/zhangsan # 或者直接把用户家目录改过去 usermod -d /home/zhangsan -m zhangsan第二个写法更标准它会自动创建目录并迁移原来的文件。如果你希望以后新建用户都能自动有家目录可以检查/etc/login.defs文件确认CREATE_HOME是否被设为yes这个值默认是开启的部分发行版或脚本创建用户时可能被改掉。5.2 普通用户sudo时报错“不在sudoers文件中”现象用户执行sudo命令提示zhangsan is not in the sudoers file. This incident will be reported.原因用户没有被授予sudo权限既不在sudo组也不在 /etc/sudoers 文件中。解法用root或一个有sudo权限的账户执行usermod -aG sudo zhangsan # Debian系或者编辑sudoersvisudo加上一行zhangsan ALL(ALL:ALL) ALL保存退出。如果这个用户已经不需要sudo了就不给保持默认受限状态。别为了图省事给所有用户开 sudo尤其要警惕那句“incident will be reported”——每次sudo失败系统都会记到日志里。5.3 权限不足普通用户挂载/读取磁盘失败现象普通用户执行mount /dev/sdb1 /mnt/data报Permission denied或only root can mount。原因mount命令默认只有root能执行普通用户的权限边界就在这里它和创建用户的机制没有直接关系但常常被放在一起讨论。解法方式一给这个用户sudo权限然后让他用sudo mount ...执行。这是最简单的方式但等于把挂载能力开放给了用户需要评估信任度。方式二在/etc/fstab中加上user挂载选项允许指定用户挂载某个设备/dev/sdb1 /mnt/data ext4 defaults,noexec,user 0 0这里面的user选项是关键表示允许任何用户挂载该文件系统。noexec是安全加固防止在挂载区执行二进制文件。产品环境建议先在这个限制上想清楚再改。方式三配置sudoers只开放mount/umount命令权限zhangsan ALL(ALL) /usr/bin/mount, /usr/bin/umount这样用户可以执行挂载和卸载但他没法sudo执行其他提权命令权限控制在可控范围内。5.4 忘记root密码怎么办现象普通用户忘了自己的密码还好说管理员能通过passwd 用户名重置但如果你是root且root密码忘了进不去系统就麻烦了。解法以常见的GRUB引导的Linux为例重启主机在GRUB界面选内核那一行按e进入编辑。找到以linux或linux16开头的那一行在末尾加上rd.break或init/bin/bash不同系统略有差异。按CtrlX或F10启动系统会进入紧急shell。重新挂载根文件系统为可写mount -o remount,rw /sysroot或用mount -o remount,rw /。chroot /sysroot进入实际系统环境后执行passwd root重置密码。若SELinux开启执行touch /.autorelabel退出重启。这个操作系列一定要在测试机或虚拟机里先练几遍别拿生产服务器当试验品。重置完密码后记得同步检查密钥登录、sudo权限等关联配置。5.5 常见问题速查表问题现象快速解法没有家目录su后提示No directoryusermod -d /home/用户名 -m 用户名密码输入不显示终端无回显正常现象盲输两次即可sudo失效不在sudoers中usermod -aG sudo 用户名用户被锁定登录提示账户已锁定passwd -u 用户名或usermod -U 用户名删除用户失败用户正在使用先pkill -u 用户名再userdel -r 用户名服务账户被登录不该登Shell却登上了usermod -s /sbin/nologin 用户名普通用户无法挂载Permission deniedfstab加user选项或sudo授权创建用户时提示已存在用户名被占用用id 用户名查UID后换名字或删旧账户每一个问题背后本质都是Linux权限模型在起作用。理解了权限模型很多报错即使没遇到过也能根据提示猜出个大概方向。6. 从“建号”到“用好”的一些心得6.1 几个很少写进文档的小细节第一创建完用户后建议顺手把默认的umask检查一下。家目录权限默认是750如果umask设置成了000新用户下次登录时/etc/profile或.bashrc会自动放宽目录权限等于给其他用户敞开了门。稳妥的做法是在/etc/profile里设置umask 0022确保新建文件和目录默认不过分开放。第二对于通过SSH登录的普通用户强烈建议配置密钥认证而不是密码登录。做法是把用户的公钥放到/home/用户名/.ssh/authorized_keys然后确认家目录权限是700、.ssh目录是700、authorized_keys是600。权限过宽时sshd会直接拒绝加载密钥这是很多新手卡住的原因。第三给服务账户创建用户时不要用普通用户的模板。服务账户应该用useradd -r -s /sbin/nologin -M 服务名不需要家目录、不需要密码、不能Shell登录。这套组合能极大降低服务被入侵后的影响范围。第四创建用户这件事非常值得写进脚本。搭建新服务器时我习惯把常用账号的创建命令写进一个init_user.sh注释好每个用户的用途和所属组。这样后续批量初始化机器或者交接给别人时不需要翻聊天记录回忆当时建了哪些用户。6.2 创建用户背后的Linux基础思维从创建用户这个基础操作延伸开能感受到Linux设计哲学里很核心的一条权限最小化。root是存在的但它应该是一个“紧急出口”而不是日常通道。每个用户、每个进程、每个服务都应该只有完成自身任务所需的最小权限集合。这种思维不止体现在用户管理上也贯穿在文件权限、组策略、SELinux/AppArmor、systemd的User配置等方方面面。当你习惯用普通用户日常操作、用sudo按需提权、用组来划分共享边界之后再回头看Linux的很多设计会豁然开朗。另外还要提一句网上很多教程让你直接改/etc/sudoers或者关掉SELinux来“省事”这些操作在测试环境里无伤大雅但在生产环境千万别照搬。安全配置永远是按需最小开放而不是一刀切放权。最后分享一点个人体会我用了很多年Linux创建用户这个动作几乎每周都会做几次但直到现在每次建账之前我还是会习惯性地过一遍那四个问题用户名是什么、要不要家目录、用哪个Shell、加不加附加组。这四个问题想清楚了命令一分钟就能敲完后续基本不用返工。如果你第一次在建用户时踩了坑不用气馁那是每个Linux使用者都要经历的过程。建议在虚拟机里多建几个用户试错配合id、passwd -S、usermod -aG这些命令来回操作几遍很快就能形成肌肉记忆。等你能熟练地切换创建、授权、锁定、删除这一整条链路之后Linux的权限体系对你来说就不再是黑盒了。
返回列表