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

资讯详情

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

Linux普通用户添加root权限:sudo配置方法与常见问题排查指南

Linux普通用户添加root权限:sudo配置方法与常见问题排查指南 1. 为什么要给普通用户添加root权限日常维护Linux服务器的时候新手最容易纠结的一个点就是权限问题。刚装完系统你手上的账号只是个普通用户想装个软件、改个配置文件、重启个服务终端里噼里啪啦敲了一堆命令结果一行行的Permission denied直接把你劝退。这时候第一反应就是切到root用户把事办了但生产环境里直接用root干活不仅危险而且在团队协作中根本没法审计操作记录。给普通用户添加root权限说的直白点就是让这个用户能通过sudo临时拿到管理员的执行能力而不用直接切换到root账号。这种方式的好处在于操作可追溯——哪天谁执行了什么特权命令sudo的日志里记得清清楚楚。同时它也是一种最小化授权思路你完全可以做到只让某个用户能跑某几条特权命令而不是把整台服务器的root密码交出去。普通用户提权这件事最常见的场景有这么几类个人开发机的日常维护装包、起服务、改hosts。测试环境里多人共用同一台服务器但又不能把root密码共享给每个同事。刚装完的虚拟机需要给初始账号配置sudo权限。企业运维中给开发或测试人员开通部分管理能力比如查看系统日志、重启某个服务。在动手之前先搞清楚一个最基础的问题不同发行版对用户组的管理方式不太一样。RHEL系CentOS、Rocky Linux、AlmaLinux、Oracle Linux里sudo权限默认是交给wheel组的而Debian系Ubuntu、Debian、Linux Mint里sudo组才是拥有sudo权限的主组。网上很多教程直接告诉你usermod -aG sudo username拿到CentOS上就无效了因为CentOS根本没有sudo组而是用wheel组。这个细节如果不注意照着教程敲完命令发现根本不生效还以为是系统坏了。本文后面的操作步骤会分别覆盖RHEL系和Debian系还会专门讲一个通用性最强的做法也就是直接编辑/etc/sudoers文件这个方式在任何发行版上都好用。2. 提权前的基础准备2.1 确认当前用户和目标用户整个操作的第一件事是明确你的出发点。如果你现在手上还有一个能用的root账号或者你已经能以root身份登录比如虚拟机刚装完系统用root直接登进去了那下面的操作会顺畅很多。实际情况里很多人的处境是只有普通用户连root密码都不知道——这种情况不在本文范围内需要走单用户模式重置root密码的流程而且必须要有物理控制台或虚拟机的控制权限才行。确认当前用户的命令是idid输出大概长这样uid1000(dev) gid1000(dev) groups1000(dev),10(wheel)关键信息在groups这一段。如果里面已经包含了wheel或sudo那你这个用户理论上已经有sudo权限了不需要额外操作。如果没有继续往下看。2.2 理解sudo和su的本质区别在真正动手前非常有必要把su和sudo的区别讲透。su是切换用户switch usersu - root会把你直接变成root用户需要输入的是root用户的密码。这里的关键是一旦你切换过去整个shell环境都变成root的了你在终端里执行的每一条命令都以root身份运行直到你执行exit退出来。风险点在于如果有人在你离开工位的时候顺手敲几条命令那个人就以你的root权限干了任何事而且日志里只能看到你的会话根本分不清是不是你本人在操作。而sudo是“以其他用户的身份执行单条命令”。默认情况下sudo需要输入的是你自己的密码而不是root的密码系统验证的是你在/etc/sudoers里有没有对应的授权条目。执行完一条命令后权限就释放了不会一直停留在root身份。这种机制天然适合日常运维我需要装个软件sudo dnf install nginx输一次密码装完就完事了后续命令都是普通用户身份不会有长时间暴露管理员权限的风险。正因为有这种区别业界的主流做法一直是“用sudo代替su”。生产环境里管理员给普通用户开权限时都是走sudo路线只有系统初始配置或者紧急排障时才直接以root登录。2.3 查询用户当前所属的组如果你不确定目标用户目前在哪些组里或者想确认某个用户是不是已经拥有sudo权限用groups命令就能查groups dev它会直接列出dev这个用户所属的所有组。输出如dev : dev wheel能看到wheel就说明这个用户在RHEL系系统上已经有sudo权限了。在Debian系系统上看到的是sudo这个词。还有一种更准确的检查方式sudo -l -U dev这条命令是查看某个用户被授予的具体sudo权限列表。如果系统提示“User dev is not allowed to run sudo”说明该用户还没有任何sudo权限如果列出了一些命令说明已经有部分授权了。这个命令在你管理多用户服务器的时候非常实用不用登录对方的账号就能检查权限配置。3. 三种主流的提权方法3.1 方法一把用户加入wheel组或sudo组这是最基础也最常用的一种方式适合刚装完系统、要给初始用户开sudo权限的场景。本质上就是把用户放进那个拥有sudo权限的组里这个组的成员默认被授权可以用sudo执行任何命令不过每次执行还是需要输自己的密码。在CentOS、Rocky Linux、AlmaLinux、RHEL这类系统上执行的命令如下usermod -aG wheel dev在Ubuntu、Debian、Linux Mint上对应的组名是sudousermod -aG sudo dev这里必须强调一个被无数人踩过的坑-aG中的-aappend绝对不能省略。-G单独使用的作用是“把用户的主组改为指定组并移除原有附加组”如果你直接执行usermod -G wheel dev而dev原本还在dev组、docker组里那么这些组会被全部清掉只保留wheel。有些极端情况下如果用户的主组被改错了甚至会导致用户无法正常登录。保持-aG连着写是最安全的习惯。修改完成后需要让用户重新登录一次或者执行以下命令让组权限在当前会话生效newgrp wheel注意newgrp只对当前shell有效退出重新登录后也一样会生效。从运维角度看更推荐的做法是让用户完全退出登录再重新登进来这样组权限的加载最干净不容易出现奇奇怪怪的session残留问题。生效之后用sudo whoami测试一下输出如果显示root说明一切正常。3.2 方法二直接编辑/etc/sudoers最灵活的方式如果你不想把用户加进大组里只想针对特定用户做精确授权那直接改/etc/sudoers是正确的路子。这个文件是sudo权限的“宪法”每次执行sudo的时候系统都会读取这个文件来判断当前用户能不能跑这条命令。需要强调一个操作纪律编辑/etc/sudoers必须使用visudo命令而不是直接用vim去改。原因有两点。第一visudo默认会用vi打开文件在部分系统上会用nano但这不重要重要的是它在保存时会做语法检查——如果你不小心把文件写坏了visudo会拒绝保存并提示语法错误。如果你直接用vim改这个文件一旦语法错误保存成功sudo将彻底瘫痪因为每次执行sudo都会读一个语法错误的配置文件系统直接拒绝工作而且你还拿它没办法因为修复sudoers又需要root权限这就成了死锁。进入编辑visudo找到类似下面这样的行root ALL(ALL) ALL在这行下面追加你的授权规则dev ALL(ALL) ALL这行配置的含义是用户dev可以在任意主机上第一个ALL、以任意用户的身份(ALL)、执行任意命令最后一个ALL。这是最高权限的sudo授权效果和把用户加入wheel组基本一样区别在于这个方式不依赖组配置单独针对用户生效。如果你希望这个用户执行sudo的时候不用输密码可以这样配dev ALL(ALL) NOPASSWD: ALL这个配置方便是真方便危险也是真危险。任何能登上dev账号的人等于直接拿到root权限连密码都不用知道。个人开发机这么配没问题生产环境强烈不建议。还可以做更细粒度的授权。比如只允许dev执行包管理命令和查看日志dev ALL(root) /usr/bin/dnf, /usr/bin/less /var/log/messages这种精确授权在实际工作中非常有用开发人员要装依赖包你给他开dnf权限要排查问题你给他开less日志权限。至于其他特权命令一概不给。在多人共用的服务器上坚持“最小权限原则”能省掉后面一大堆麻烦事。3.3 方法三修改/etc/passwd把用户UID改为0不建议但要说清还有一个很多人搜到的操作是直接把普通用户的UID改成0——因为UID为0的用户在Linux里就是root级别的身份不管用户名是什么。具体操作是把/etc/passwd里dev那行的UID字段从1000改成0。这个方法在技术上确实能让dev这个账号瞬间拥有与root完全一致的全部权限但实际操作中属于典型的“捡了芝麻丢西瓜”做法。之所以这样说首先因为所有UID为0的用户会被系统视为同一个“超级用户”/etc/passwd的密码域、UID都混在一起普通用户的密码登录逻辑会被一些安全模块比如PAM搞糊涂容易出现登录异常。其次你的审计体系会失效——日志记录的是用户名字符串但UID全是0根本分不清操作来自哪一个账号。再有很多服务校验权限时只看UID是否大于0改完UID之后一些常规服务反而可能不让你访问。业内根本不会这么干这个操作只存在于“把服务器搞崩之后不得不修复”的教案里。真正要提权老老实实走sudo路线就够了。除非你是给嵌入式设备刷系统、制作rootfs镜像那种场景下通过修改/etc/passwd来预设root登录账号是正常做法但那是系统镜像定制不是给现有用户提权两码事。3.4 三种方法对比方法适用场景优点风险点usermod -aG wheel/sudo新装系统、快速开权限命令简单符合发行版默认配置授权粒度粗所有组内用户权限相同编辑/etc/sudoers生产环境、多人共用、需要精确控制支持命令级授权最灵活语法错误会搞坏sudo操作需谨慎修改UID为0仅限嵌入式/rootfs定制使用一步到位审计混乱可能引发系统异常生产环境禁用4. sudoers文件合法性校验与免密配置的完整实操4.1 修改sudoers的正确流程这里详细走一遍修改/etc/sudoers的完整流程尤其是针对生产服务器每一步都值得你仔细看。第一步登录到root账号或者使用一个有sudo权限的账号执行visudo第二步移动光标到root ALL(ALL) ALL这一行下面添加你的用户配置。举例要给用户redis-admin授予所有管理权限root ALL(ALL) ALL redis-admin ALL(ALL) ALL保存退出。visudo在退出前会自动运行visudo -c的校验逻辑如果语法有误它就不会让你保存。校验成功的输出大概是这样的/etc/sudoers: parsed OK看到parsed OK才是真的安全落盘了。第三步验证授权是否生效。先切换到这个用户su - redis-admin然后执行sudo -l这个命令会列出当前用户可以执行的sudo权限条目。如果配置正确你会看到类似这样的输出User redis-admin may run the following commands on this host: (ALL) ALL如果提示不被允许回头去查sudoers文件里的用户名是不是写错了或者用户是否真的存在于系统里。4.2 免密配置的边界与风险控制免密sudo是个好用但容易被滥用的功能。刚才提到在sudoers里写NOPASSWD: ALL可以让用户执行sudo时不再需要验证密码。但实际生产环境里我见过太多因为图省事而全开免密的案例结果服务器被入侵后攻击者直接畅通无阻。合理的做法是给常用命令单独开免密redis-admin ALL(ALL) NOPASSWD: /usr/bin/systemctl, /usr/bin/journalctl这样的效果是用户执行systemctl和journalctl时不需要输密码但执行其他特权命令时依然要输入自己的密码验证身份。这既保证了日常操作的顺畅又保留了sudo的一道安全缓冲。还有一个被经常忽略的点NOPASSWD和PASSWD标记在sudoers里可以混用且优先级按从上到下的顺序匹配。比如你想让用户免密执行systemctl但其他命令还是要密码可以写两行redis-admin ALL(ALL) NOPASSWD: /usr/bin/systemctl redis-admin ALL(ALL) PASSWD: /usr/bin/pm2sudo在匹配授权策略时会从上到下逐条检查以最后匹配到的配置为准所以这样的顺序能达到“特定命令免密其余默认要密码”的效果。4.3 多用户批量授权的写法如果服务器上有十几个人都要开sudo权限逐行写用户名配置就太繁琐了。sudoers是支持组别和通配符的。整理几个常用的批量授权写法。给组授权写法如下%wheel ALL(ALL) ALL%前缀代表后面跟的是组名这一行的效果就是wheel组所有成员都拥有完整sudo权限。在Ubuntu等以sudo组为管理组的系统上则是对应这一行%sudo ALL(ALL:ALL) ALL注意Debian系的写法里有个(ALL:ALL)表示不仅能以任意用户身份执行也能以任意组身份执行权限范围比RHEL系默认的(ALL)略宽一点。给多个用户授权用逗号分隔用户名dev1, dev2, dev3 ALL(ALL) /usr/bin/systemctl给用户组授权特定目录下的命令devops ALL(ALL) /usr/bin/kubectl, /usr/bin/helm, /usr/bin/docker这些写法在实际运维中都能大幅简化配置。但需要提醒的是授权命令写在sudoers里之后一旦被授权的命令本身有漏洞比如docker是可以借机提权的docker组用户能挂载宿主机目录拿到root权限就相当于把服务器大门敞开了一半。开权限之前先想想这条命令是不是可以被利用来绕开你预设的限制框。5. 常见问题与排查技巧实录5.1 执行sudo时报错“is not in the sudoers file”这个报错是出场率最高的。看到它基本可以确定当前用户没有在sudoers文件里获得任何授权或者不在被授权的组里。排查顺序用id命令确认当前用户确实是你以为的那个身份有时候你在服务器上开了好几个session不同session登录的用户都不一样。用groups命令检查用户是否在wheel或sudo组里。如果不在回到第3节的方法一去加组。检查/etc/sudoers文件里的用户配置是否有拼写错误。比如用户实际叫dev01你在sudoers里写成了dev那自然查不到授权。如果确认配置没问题尝试重新登录一次因为有些系统会在登录时缓存组信息。还有一种情况是你已经加组成功了但当前session没有加载新的组权限。这种情况执行newgrp wheel或者完全退出重新登录就能解决。5.2 输入sudo密码提示“Sorry, try again”出现这个提示说明sudo验证的是用户自己的密码而不是root密码。很多新手在这里会反复输入root密码当然一直报错。第一反应应该是“我自己的账号密码是什么”不是“root密码是什么”。如果用户密码确实正确但还是进不去检查一下PAM配置。部分系统启用了pam_faillock之类的防暴力破解模块连续输错几次密码后会把账号锁定一段时间。等几分钟再试或者用root账户执行faillock --user dev --reset清掉失败记录。还有一个小型机比较常见的坑如果你改过用户密码改了之后当前shell的sudo session还沿用旧密码缓存偶尔会出现密码明明改对了却报密码错误的情况。这种情况开一个新终端登录再试基本就正常了。5.3 sudo命令报“command not found”这个报错同样常见它的本质是sudo执行时的PATH环境和普通用户的不一样。sudo默认会重置环境变量PATH往往被收缩成比较保守的一组路径像/usr/local/bin这种目录就不在里面。出现这种问题的场景往往是你用sudo去执行一个安装到/usr/local/bin下的命令比如sudo kubectl get nodes结果提示找不到命令。但在普通用户环境里kubectl却是能直接执行的。解决办法有两种第一种用全路径执行sudo /usr/local/bin/kubectl get nodes第二种在sudoers里为用户配置保留PATH环境变量Defaults secure_path /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin将/usr/local/bin加进secure_path以后再执行sudo时就能找到这些命令了。修改完sudoers同样用visudo去做。5.4 sudo配置坏了导致所有用户都无法提权这是最棘手的一种情况一般是sudoers文件语法改错了。常见诱因包括在sudoers文件里不小心写入非法字符主机名字段写成了无效值或者大括号不对齐。出现后你会看到类似这样的报错 /etc/sudoers: syntax error near line 12 sudo: parse error in /etc/sudoers, near line 12如果你的root账号还能登录直接用root修pkexec visudo但更麻烦的是root密码忘记了或者系统禁用了root登录而sudo又坏了等于没有任何入口去修复。这种时候只有进单用户模式了。重启服务器在GRUB界面按e进入编辑模式在linux开头的那一行末尾加上rd.break或init/bin/bash然后进入一个带root权限的维护shell用mount -o remount,rw /sysroot重挂载根目录chroot进去后用visudo -c检查语法并修复sudoers。这套操作看起来复杂其实在虚拟机环境里折腾一次就熟了。前提是你要有这个虚拟机的控制台权限——云服务器厂商一般也提供VNC控制台道理是一样的。5.5 加了NOPASSWD之后还是要输密码如果配置了NOPASSWD但不生效第一反应是检查sudoers里的行顺序。sudo在匹配授权规则时不是“最先匹配优先”而是“最后匹配优先”。如果你先写了一行dev ALL(ALL) NOPASSWD: ALL后面又跟着一组需要密码的授权后面的规则会把前面的顶替掉。第二检查是否有多份sudoers片段在生效。注意大部分sudoers文件末尾都有这样一行#includedir /etc/sudoers.d这个配置会扫描/etc/sudoers.d目录下的所有文件比如云厂商的初始化脚本经常会在里面放一个90-cloud-init-users文件覆盖默认的sudo配置。排查时要把/etc/sudoers.d下的文件都看一遍别盯着主线配置文件找半天。第三部分发行版在sudo编译时启用了--disable-root-mailer等参数默认不支持NOPASSWD与PASSWD标记混用的行为这时候需要检查该版本sudo的官方文档确认。5.6 用户已加入wheel组sudo -l却显示无权限这个现象通常出在RHEL系系统的配置差异上。虽然wheel组是默认的管理员组但某些加固过的服务器会注释掉/etc/sudoers中关于wheel的那行授权规则。打开/etc/sudoers看一下确认是否有下面这样的行%wheel ALL(ALL) ALL如果这行被注释了或者被删掉了那即使你把用户加进wheel组sudo也不认。这种时候要么在sudoers里把wheel组的授权行加回来要么直接为用户写一个独立的授权条目。5.7 排查问题速查表现象原因解决办法user is not in the sudoers file用户未授权或组配置无效加组或用visudo添加授权Sorry, try again输入的不是当前用户密码换当前用户密码输入command not foundsudo的PATH中没有该命令路径用绝对路径或修改secure_pathsyntax errorsudoers文件语法错误用root身份执行visudo修复NOPASSWD不生效存在多条匹配规则后面的覆盖前面的调整sudoers规则顺序已加wheel仍无权限sudoers中的wheel授权被注释或删除检查并补回wheel授权行6. 开权限的几个实际操作心得按我的经验给普通用户开root权限这件事看起来是几分钟能完成的操作但要做得干净利落有几个习惯值得养成。先在测试环境的虚拟机里把流程过一遍尤其是visudo的操作。sudoers文件的语法非常严格一个多余的空格在特定位置都会引发解析问题。在生产服务器上动手之前先在个人虚拟机里折腾一次比贸然操作然后花两小时修复要划算得多。开权限之前先问自己一个问题这个用户真的需要完整的管理员权限吗还是只需要重启服务、看点日志如果是后者就在sudoers里把授权的命令限定死。我给开发人员开权限时默认只会允许systemctl管理服务和journalctl查看日志这类命令需要装包再单独加dnf或apt的授权。这种收紧的做法一开始会让开发来问“为什么sudo安装不了一堆东西”但只要沟通清楚大家都会理解这是为了服务器安全做的必要限制这比我后面出了安全问题再补救强得多。免密sudo在个人开发机上用着确实很舒服但请记住一个底线任何一台有公网IP的服务器都不建议设置大范围的NOPASSWD。省下的几秒密码输入时间真的值得用服务器被攻破的风险去换吗值得深思。最后说一个容易被忽视的点sudo日志。每次授权用户通过sudo执行特权命令系统都会在/var/log/secure或/var/log/auth.log里留下记录。建议在给用户开权限的同时告诉对方这些日志的位置和用途。这不仅是对用户的一种提醒也是一种运维自我保护——出了问题能查是谁在哪台机器上做了什么操作这样自己的职业生涯才更稳妥。
返回列表