ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Linux多用户配置实战:从账号创建到权限与SSH安全

Linux多用户配置实战:从账号创建到权限与SSH安全 刚接手一台Linux服务器的时候最先要处理的往往不是监控、不是备份而是账号。我见过不少团队的做法是一台机器上所有人共用一个root密码谁要装东西谁自己上去敲。一开始觉得省事等到用户多了、操作乱了、出了问题查无从查的时候才会意识到Linux服务器的多用户配置这件事做得多早都不算早。这篇文章就把多用户配置的完整思路梳理一遍从底层用户文件结构到命令实操、权限设计、SSH安全边界再到配额和常见故障排查适合刚入门想正规管理服务器的同学参考也适合准备给团队账号体系做一次系统优化的运维朋友。多用户配置听起来好像只是useradd加个账号这么简单但真正落地的时候牵扯的东西远比想象中多用户信息存哪、密码怎么管、家目录怎么初始化、哪些人能sudo、多个用户怎么共享目录、怎么防止某个人占用全部磁盘、怎么通过SSH只放行指定的账号……每一层都值得单独设计。我把过去在真实服务器上配置多用户环境时用到的方案、踩过的坑整理成文尽量讲清楚为什么这么做而不只是给命令。阅读之前先明确一个前提本文以常见的Ubuntu/Debian和CentOS/RHEL系为例命令在两套系统上基本一致只是sudo组和wheel组的名称不同我会在对应位置单独标注。1. 为什么多用户配置不能等人多了再搞1.1 共用root的真实代价很多人觉得服务器刚上线就两三个人用没必要分账号。这个想法可以理解但风险是逐步累积的。最典型的问题是一旦所有人都用root系统日志里看到的操作全部是root根本无法区分这个文件是谁删的这条iptables规则是谁加的。排查故障时完全没有追溯线索出了问题只能靠猜。另一个容易被忽略的问题是没有独立家目录。开发A在/root下建了个项目目录开发B也往/root里放脚本两个人互相都不知道对方放了什么。等哪天某个人执行rm -rf的时候连后悔的余地都没有。别问我怎么知道的——一台服务器上所有人共用一个root账号是运维事故的高发温床。1.2 哪些场景需要认真做多用户配置不是所有服务器都需要复杂的多用户体系但下面这些场景基本是刚需多人共用的开发服务器或测试服务器每个人都有不同的职责范围。生产环境服务器需要区分谁能看日志谁能重启服务谁能改配置。团队里有实习生、外包或临时协作人员需要到期收回权限。一台迁移过好几次的老服务器账号越积越多需要梳理和清理。在这些场景下多用户配置的目的不是把账号建出来而是建立一套可管理、可审计、可回收的账号体系。这套体系的核心只有一句话让每个人只拥有完成任务所需的最小权限其余操作通过授权流程临时获取。1.3 一套合格的多用户配置包含四层我通常把多用户配置拆成四个层面排查问题或者做方案时都按这个顺序来第一层是身份层也就是账号本身的创建、修改、锁定和删除包括用户的UID、GID、家目录和登录Shell。第二层是授权层解决这个用户能做什么的问题包括文件权限、ACL、sudo权限。第三层是边界层解决谁能从外面进来的问题主要是SSH登录控制、密钥管理和登录审计。第四层是资源层解决每个人能用多少的问题包括磁盘配额、文件句柄限制、进程数限制。把这四层想清楚再去执行命令思路会清晰很多。很多人配置到一半就乱正是因为只盯着useradd命令没有从全局角度考虑账号体系。2. 用户信息的底层文件动手配置前先看懂账号存储机制2.1 /etc/passwd七列数据的含义Linux系统里用户信息不是放在某个数据库里这种黑盒概念而是明明白白写在几个文本文件里。第一个要认识的就是/etc/passwd。这个文件每一行代表一个用户冒号分隔七列用户名密码占位符通常是x表示真实密码在shadow文件里UID用户IDGID主组ID注释信息一般是用户全名或用途说明家目录路径登录Shell举个例子一行典型的用户记录是zhangsan:x:1001:1001::/home/zhangsan:/bin/bashUID虽然只是一个数字但含义很关键。普通用户一般从1000开始分配UID为0的是root1到999一般是系统账号服务运行时用的权限账号不能随便登录。看到某个进程以uid999或uid1001身份运行就能大概猜到是哪个层面的账号。2.2 /etc/shadow密码为什么单独放密码信息在/etc/shadow文件里这个文件只有root能读写。把密码和用户信息分开是出于安全的考虑/etc/passwd是很多程序需要读取的公共文件如果密码哈希直接放在里面任何一个能读到文件的用户都能拿去离线爆破。shadow文件里典型的一行包含九个字段最重要的是前三段用户名、密码哈希、最近一次修改密码的日期。密码哈希以$6$开头的是SHA-512以$y$开头的是yescrypt新版系统默认以$1$开头的是古老的MD5。这里要提醒一点如果你在用一些自动化脚本管理服务器千万不要为了省事直接往/etc/passwd或/etc/shadow里追加一行。系统的用户管理命令在写入时会做很多协调处理比如生成哈希、初始化家目录、设置默认Shell手动改文件很容易破坏格式轻则用户无法登录重则影响整个系统的账号解析。2.3 /etc/group一个用户为什么可以属于多个组/etc/group记录的是组信息。组存在的意义就是为了简化权限管理与其给十个用户逐个授权某个文件不如建一个组把十个用户加进去然后只给这个组授权。组文件的结构也不复杂组名、组密码几乎用不到、GID、组成员列表。注意成员列表里不会包含将该组设为主组的用户因为那层关系已经记录在用户自己的GID字段里了。所以查看一个用户到底属于哪些组最准确的方式不是打开group文件数而是执行id命令id zhangsan输出里会同时列出uid、主组gid和所有附加组。附加组才是多用户协作中最常用的授权工具。2.4 直接改文件 vs 命令为什么推荐命令明白了底层文件的格式之后还要明白一件事日常操作应该用useradd、usermod、userdel这类命令而不是vim /etc/passwd。原因不只是格式安全更重要的是一些命令除了改文件之外还会同步做配套动作。比如useradd -m会自动创建家目录并复制/etc/skel模板文件userdel -r会清理家目录和邮件池usermod -aG会把用户追加到附加组而不会覆盖已有组关系。这些隐性操作手改文件很容易漏掉。当然直接改文件的场景也不是完全没有。比如批量导入几十个用户时用脚本逐行调用useradd更安全比如你只是想临时改一下注释信息usermod -c 比改文件更优雅。总的原则是能用命令解决的就用命令解决读文件主要是为了排查问题、理解现状。3. 从创建到封禁用户与组的完整生命周期实操3.1 创建用户时最容易忽略的参数新建用户的命令是useradd但只敲一个useradd username往往不够。我建议创建用户时至少带这样几个参数sudo useradd -m -s /bin/bash -c 张三-后端开发 -G sudo zhangsan参数说明-m表示创建家目录-s指定登录Shell-c写注释-G指定附加组。把注释写清楚的收益立竿见影——半年后用awk去列表格看到张三-后端开发就知道这个账号给谁的而不是面对一串无意义的用户名愣神。另外还有几个冷门参数但很有用-u可以指定UID适合需要保持用户ID稳定的场景-e可以指定账号过期日期格式是YYYY-MM-DD非常适合给实习生和短期协作人员设置自动失效时间-f可以设置密码过期后多少天锁定账号。useradd -e 2026-01-31 -f 7 zhangsan这种组合在临时账号场景里非常好用。值得注意的是Ubuntu/Debian系用sudo组作为管理组CentOS/RHEL系则习惯用wheel组。跨系统做自动化脚本时最好先判断一下系统类型再决定把用户加到哪个组。3.2 密码策略设置、修改和过期创建用户后第一件事是设密码sudo passwd zhangsan如果要让用户首次登录时必须改密码一条命令搞定sudo chage -d 0 zhangsan-d 0的意思是密码最后一次修改时间设为1970年系统会在下一次登录时强制用户改密。这类细节在面试题里经常出现但在真实运维中同样重要——每次开完账号我都习惯执行一遍chage -d 0避免默认密码长期有效带来的安全隐患。查看用户的密码状态用sudo chage -l zhangsan它会显示密码最近修改时间、过期时间、到期前多少天提醒等。想批量给用户设置90天强制改密可以结合命令写循环但要注意先和团队约定好否则用户某天突然被要求改密很容易误以为账号被盗。3.3 修改用户属性usermod的正确姿势usermod是用户管理里最常用的修改工具但有一个高频坑给用户添加附加组时很多人只写-G不写-a结果把用户原有的附加组整个覆盖掉。我见过最惨的一次运维执行完usermod -G docker devuser之后devuser原先所在的dev组、ops组全部失效协作目录立刻进不去了。正确写法是sudo usermod -aG docker devuser-a是追加-G是指定附加组两个参数必须连用。如果确实要覆盖组关系请先确认你已经清楚了解用户原有归属再刻意去掉-a。其他常用修改包括-s改登录Shell、-d改家目录、-c改注释、-l改用户名。改用户名的操作要谨慎最好先把进程停掉、确认没有定时任务用到旧用户名因为很多服务配置里硬编码的是用户名或者家目录路径。3.4 删除用户与锁定账号删除用户前先想清楚数据要不要保留家目录要不要清理常规操作是sudo userdel -r devuser-r会把家目录和邮件池一并删除。如果只是想暂时停用账号两个选择一个是锁密码一个是把登录Shell改成nologin。sudo passwd -l devuser # 锁定密码但保留SSH密钥登录可能 sudo usermod -s /usr/sbin/nologin devuser # 禁止登录Shell我在生产环境处理离职账号时习惯两个都用先passwd -l锁掉密码再把Shell改成nologin最后把用户的SSH公钥从authorized_keys里删掉。只做其中任何一个都会留下隐患。至于头一天刚建完第二天就发现不需要的账号直接用userdel -r清理干净即可。3.5 组的管理groupadd、groupdel和临时切换组管理的命令很简单但设计得讲究sudo groupadd devs # 创建组 sudo gpasswd -a zhangsan devs # 把用户加入组 sudo gpasswd -d zhangsan devs # 把用户移出组 sudo groupdel devs # 删除组组内无主用户时所有对组的修改不会立刻反映到已经登录的会话里用户需要重新登录才能获得新组的权限。想不退出重新登录就生效可以执行newgrp devs切到该组或者用sg devs -c 命令临时以该组身份执行命令。调试组成员关系时记住先重新登录再测试很多人就在这个环节上以为自己配错了。4. 用户的家目录和登录环境决定第一印象的细节4.1 /etc/skel每个新用户家目录的模板创建用户时系统会把/etc/skel目录下的所有文件复制到新用户的家目录。默认情况下这个目录里可能只有.bashrc、.profile这几个基础文件。如果你希望每个新用户一登录就有统一的配置比如公用的alias、默认的umask、设置git用户名都可以写到/etc/skel下的对应文件里。举个例子如果团队统一使用neovim作为编辑器可以在/etc/skel/.bashrc里加一行export EDITORnvim alias vinvim之后所有新建用户都会自动带上这个配置。这里有个细节/etc/skel只对新建用户生效老用户不会自动同步。想让存量用户也统一配置要么手动复制要么用管理工具批量下发配置。4.2 .bashrc vs .profile登录Shell和非登录Shell的区别用户登录环境初始化依赖两个文件.profile或.bash_profile和.bashrc。区别在于登录时加载.profile打开新的终端窗口时加载.bashrc。在本地终端登录、通过SSH登录、在图形界面打开终端触发加载的文件组合其实不一样。日常配置一般写在.bashrc里就够了并且建议在文件开头加一段带日期的注释方便排查问题。如果是给用户配置JAVA_HOME、PYTHONPATH这类环境变量写进.bashrc的同时最好也在.profile里留一份或者明确告知用户请重新登录后再验证。还有一点容易被忽略程序调用的Shell不一定是登录Shell。如果你通过systemd启动服务或者通过cron执行脚本加载的是非交互式Shell默认不会读取.bashrc里的alias但通常会读取环境变量配置文件。排查为什么脚本里命令找不到这类问题时先确认执行环境有没有加载用户环境文件。4.3 sudo授权在线谁可以做什么的精修多用户环境里最常见的需求就是给某个人管理员权限。有两种做法第一种是直接把用户加到sudo组或wheel组sudo usermod -aG sudo zhangsan第二种是做更细粒度的sudo授权在/etc/sudoers.d/下新建文件比如只允许某个用户重启服务zhangsan ALL(ALL) NOPASSWD: /usr/bin/systemctl restart nginx配置文件必须用visudo编辑它会检查语法避免因为写错导致整个sudo机制崩溃。细粒度授权的典型场景是开发人员需要重启某个服务、查看某个日志但又不希望他有完整的root shell。用sudoers精确放行某个命令配合日志审计比直接给人全部权限安全得多。sudo授权有一个常识性注意非交互式命令里很多人喜欢写sudo su -这等于绕过所有权限限制直接拿到了完整root shell生产环境应严格禁止。需要执行某条管理命令就明确放行那条命令不要开放整块后门。4.4 登录Shell的四种状态用户能不能登录不能只看密码是否正确还要看登录Shell。解释器为/bin/bash的意思是正常登录/usr/sbin/nologin和/sbin/nologin表示禁止登录但这个账号仍然可以作为服务账号用/bin/false则会把所有登录尝试直接判定为失败。在配置多用户时我习惯把账号分成三类来管理正常人类用户用/bin/bash服务运行账号比如nginx、mysql用户用/sbin/nologin需要执行某类计划任务的专用账号根据实际情况决定。区分清楚后配置审计会简单很多——看到Shell为/sbin/nologin的用户账户在活动那大概率是异常值得立刻排查。5. 多用户协作的权限模型文件权限、共享目录与ACL5.1 从rwx到实际使用权限的基础逻辑Linux文件权限用三组rwx表示属主、属组、其他用户。读r、写w、执行x在文件上的含义大家都清楚r可读w可改x可执行。但对目录来说含义并不完全相同r表示能列出目录下的文件名w表示能在目录里创建和删除文件x表示能进入这个目录并访问其中文件的具体信息。很多权限问题出在对目录x权限的理解上。比如某个用户对一个目录只有r权限没有x权限他能ls看到文件名但无法读取文件内容也无法进入子目录。实际协作中目录至少要开放r和x才能正常使用。5.2 粘滞位/tmp为什么人人都能写却删不掉别人的文件在多用户服务器上/tmp目录是大家都要用的临时目录权限是1733其中1就是粘滞位sticky bit。粘滞位的效果是任何有写权限的用户都能在这个目录下创建文件但只有文件属主、目录属主或root才能删除或重命名别人的文件。这个机制防止了用户A删掉用户B放在/tmp里的临时文件这类事故。如果自己建共享目录也可以加上粘滞位sudo mkdir /data/shared sudo chmod 1777 /data/shared另一种常见做法是不加粘滞位但限定组成员比如目录属组设为devs权限775这样只有组内成员可以操作组外用户连目录都进不去。5.3 setgid共享目录让新文件自动归属同一个组多个用户协作时最常见的痛点是A创建的文件B没法改。原因很简单A创建的权限默认是用户A:用户A的主组B不在那个组里权限自然受限。一个成熟方案是用setgid位chmod gs配合共享组。假设devs组要共享目录/data/workspace步骤如下sudo mkdir /data/workspace sudo chown root:devs /data/workspace sudo chmod 2775 /data/workspace权限位2就是setgid。它的作用是任何在这个目录下新建的文件或子目录自动继承目录的属组devs。配合2755目录权限所有devs组成员都能在目录里创建文件并且新文件自动属于devs组。只要每个用户把默认权限中的组写打开通过设置umask或手动授权团队成员之间就能顺畅地互相修改文件。顺带提一嘴这个设计在公司里常被称作项目共享空间。比直接chmod 777整个目录安全得多既保留了成员协作又隔绝了外部用户。5.4 ACL当基础权限不够用时基础权限模型的粒度是属主/属组/其他三档多用户复杂场景下经常不够用。比如一个目录需要让zhangsan有读写权限、让lisi只有读权限、但又不想给整个组授权——这时候ACL访问控制列表就派上用场了。sudo setfacl -m u:zhangsan:rwx /data/project sudo setfacl -m u:lisi:r-x /data/project查看现有权限getfacl /data/projectACL生效后ls -l会在权限位末尾看到一个加号例如drwxr-x---提示这个文件有扩展ACL。删除指定条目sudo setfacl -x u:zhangsan /data/project使用ACL要注意两个细节一是大多数文件系统默认支持ACL但老旧的挂载参数可能没有启用二是ACL规则和普通权限同时存在时判断逻辑比较复杂排查问题优先getfacl而不是看ls。就我经验来说能走组权限解决的协作尽量走组ACL适合特权账号、特殊个人这类例外规则。6. SSH入口与安全边界控制谁能从外面进来6.1 密钥登录是标配不是可选项多用户服务器上密码登录最大的问题是密码强度不可控而且登录行为不好审计。我建议所有用户统一使用SSH密钥登录。用户生成自己的密钥对ssh-keygen -t ed25519 -C zhangsancompany公钥是~/.ssh/id_ed25519.pub内容是一行文本。把公钥追加到目标服务器对应用户的~/.ssh/authorized_keys里就能实现免密登录。多用户场景下需要一套规范的公钥分发流程要么用户自己上传公钥到指定系统运维审核后加入authorized_keys要么运维用ssh-copy-id手动推送。公钥的权限要求非常严格家目录不能对其他人可写.ssh目录权限最好是700authorized_keys权限是600。权限太宽松sshd会拒绝使用这个文件直接造成登录失败。6.2 sshd_config里放行账号的几个关键项打开/etc/ssh/sshd_config有几个配置项直接关系多用户PermitRootLogin no PasswordAuthentication no AllowUsers zhangsan lisi devopsPermitRootLogin no是禁用root直接SSH登录PasswordAuthentication no是禁止密码认证AllowUsers是从SSH入口层面直接限定只有这几个用户能连进来。用AllowUsers的好处是即使服务器上有几十个系统账号SSH入口也只对指定用户开放。配合密钥登录这种配置下暴力破解和撞库基本无从下手。改完配置别忘记重启sshdsudo systemctl restart sshd这里有个容易踩的坑修改sshd_config之前最好先把当前SSH连接保持住或者在新增AllowUsers时把当前登录的用户也算进去否则写错之后很可能把自己挡在门外。谨慎起见改完后开一个新终端试连一次再收工。6.3 登录后的行为审计多账号环境下必须清楚谁在什么时间登录过、做了什么。基础审计三板斧last -20 # 查看最近登录记录 journalctl -u ssh -n 50 # 查看ssh服务日志 sudo cat /var/log/auth.log | grep Accepted publickey # Debian系 sudo cat /var/log/secure | grep Accepted publickey # RHEL系我自己的习惯是每周扫一遍Accepted publickey和sudo命令记录把非工作时间段的登录非授权的sudo命令单独挑出来看一遍。一旦账号变多这个习惯能提前发现很多问题。6.4 端口的非主流不等于安全很多教程会建议把SSH默认端口从22改成别的这个做法确实能过滤掉大部分无脑扫描但真正的安全不依赖隐晦。改端口的同时还是要严格执行密钥认证、禁止root直登、AllowUsers白名单。端口只是一个辅助手段加上fail2ban这类暴力破解防护多用户服务器的SSH入口才算完整。顺便说一句给权限特别大的账号比如wheel组的成员单独设置一套更强审计规则很多团队忽略了这一点。运维账号和管理账号不该和普通开发账号混在同一个入口里至少应该在SSH配置里把运维账号放到一个单独的Match User块再开启额外的日志记录。7. 资源限制防止一个人把全组带崩7.1 磁盘配额每块空间都有主人多用户服务器最让人头大的场景之一某个用户跑了个脚本日志疯狂输出直到把磁盘占满导致全服务器服务异常。解决这个问题最简单的办法是给用户设置磁盘配额。以ext4文件系统为例大概流程是sudo apt install quota # Debian系 sudo vim /etc/fstab # 找到对应分区在挂载选项里加 usrquota,grpquota sudo mount -o remount /home sudo quotacheck -cug /home sudo quotaon /home sudo edquota -u zhangsan最后的edquota会打开一个编辑器可以限制用户使用的块数量也就是磁盘大小和inode数量也就是文件数量。软限制是警告阈值硬限制是绝对上限。比如软限制5G、硬限制6G超过5G时系统会警告到6G就直接拒绝写入了。xfs文件系统的配额命令有些差异但思路一致。如果服务器上一堆用户共用一个家目录分区我强烈建议至少把家目录配额配上而不是等磁盘满了再去排查。7.2 打开文件数和进程数limits.conf的妙用磁盘之外另一个容易拖垮全局的是进程数和文件句柄数。某个用户通过脚本开了上万个进程直接打爆系统PID上限其他人连命令都执行不了。通过/etc/security/limits.conf可以对每个用户做限制zhangsan hard nofile 4096 zhangsan soft nofile 2048 zhangsan hard nproc 512 zhangsan soft nproc 256nofile是最大打开文件数nproc是最大进程数。soft是当前生效的警告阈值hard是用户可以自行提升的硬上限。生效条件是用户通过PAM登录时加载如果用systemd管理的服务得在service文件里配LimitNOFILE和LimitNPROC而不是靠limits.conf。7.3 登录会话数量防止一台机器全是僵尸般的历史会话账号多了之后每个人可能开了十几个SSH会话既不占用资源还容易让其他人误以为机器很忙。可以通过/etc/security/limits.conf配合maxlogins限制同一用户登录会话数zhangsan hard maxlogins 2或者对所有用户设一个全局限制。虽然很多人会觉得很严格但实际限制到2-3个会话对绝大多数场景都够用还能逼着大家用tmux这类会话保持工具省掉大量找历史终端的沟通成本。8. 实际运行一遍一台三用户服务器的完整配置复盘8.1 场景设定假设手上有一台新装的Ubuntu服务器需要给三个人开账号开发A需要普通权限能读写共享目录、开发B需要普通权限还能重启nginx、运维C需要完整sudo权限。共享目录是/data/workspace开发A和B都要用。这种场景覆盖了多用户配置的绝大多数操作跟着做一遍基本就能应付日常了。8.2 操作序列创建组和用户sudo groupadd devs sudo useradd -m -s /bin/bash -c 开发A -G devs devA sudo useradd -m -s /bin/bash -c 开发B -G devs devB sudo useradd -m -s /bin/bash -c 运维C -G sudo opsC设置密码并强制首次登录修改sudo passwd devA sudo passwd devB sudo passwd opsC sudo chage -d 0 devA sudo chage -d 0 devB sudo chage -d 0 opsC配置共享目录setgid方案sudo mkdir /data/workspace sudo chown root:devs /data/workspace sudo chmod 2775 /data/workspace给开发B细粒度sudo授权只允许重启nginxsudo visudo -f /etc/sudoers.d/devB # 内容 # devB ALL(ALL) NOPASSWD: /usr/bin/systemctl restart nginx验证权限sudo -u devB sudo -l # 查看devB的sudo规则 sudo -u devA touch /data/workspace/test.txt # 验证共享目录可写SSH部分如果服务器还没配好密钥登录先把运维的密钥导入sudo mkdir -p /home/opsC/.ssh sudo cp opsC.pub /home/opsC/.ssh/authorized_keys sudo chown -R opsC:opsC /home/opsC/.ssh sudo chmod 700 /home/opsC/.ssh sudo chmod 600 /home/opsC/.ssh/authorized_keys8.3 实测中一定会遇到的小问题第一是newgrp问题。用户添加完成后如果devA这边已经有一个登录会话新组的权限不会自动生效。要测试共享目录权限建议重新登录或者先执行newgrp devs。第二是umask问题。默认umask通常是022创建文件权限是644组内其他人只能读不能写。如果devA和devB要互相改文件要么把协作目录的默认ACL规则加上默认组写权限要么在/etc/skel/.bashrc里建议用户设umask 002放行组写。我在实际配置中倾向于后者里的取舍保持全局022对共享目录额外设置ACL默认规则这样不影响其他单独文件的安全。第三是sudo规则写错的排查。sudoers文件语法一旦错误所有sudo操作都会失败。这时候用pkexec或root直接执行visudo修复别急着重启。我遇到过几次因为sudoers写错导致整个团队sudo卡死的故障教训就是每次改完一定开新终端验证一次sudo -l。8.4 收尾阶段的三遍检查配置完不要急着宣布完成我习惯性做三遍检查第一遍看身份层遍历所有新增用户getent passwd devA devB opsC确认UID、家目录、Shell无误第二遍看授权层sudo -l -U devA确认权限符合预期getfacl /data/workspace确认共享目录规则第三遍看边界层用每个用户的身份实际SSH登录一次确认密钥认证生效、密码登录被拒绝、目录权限可用。这三遍检查做完多用户体系才算真正落地。9. 多用户配置中最常见的坑故障现象、根因与解法9.1 用户删不掉进程占用是个隐形钉子执行userdel -r提示device or resource busy最可能的原因是用户还有进程在运行。用下面命令找出并处理sudo pgrep -u devuser sudo pkill -u devuser sudo userdel -r devuser有些进程属于守护进程删除后会自动重启需要同时把对应的systemd服务停掉。删除账户前先查进程、再查定时任务这习惯能省去很多擦屁股的麻烦。9.2 新增用户SSH登录失败家目录权限和ownership问题SSH登录提示Permission denied (publickey)且反复检查密钥无误十有八九是家目录权限问题。sshd对权限的要求很死板sudo chown -R devuser:devuser /home/devuser sudo chmod 755 /home/devuser sudo chmod 700 /home/devuser/.ssh sudo chmod 600 /home/devuser/.ssh/authorized_keys如果家目录的属主不是用户自己或者家目录对其他人可写sshd会拒绝使用authorized_keys。这个坑在批量迁移账号时特别常见别问我是怎么知道的。9.3 sudo执行后环境变量丢失明明用户在.bashrc里设置了PATHsudo执行时却找不到命令。原因是sudo默认会重置环境变量。要么用sudo -E保留当前环境要么在/etc/sudoers里显式配置Defaults env_keep PATH但考虑到PATH注入安全问题我更推荐的做法是在sudoers里明确指定可信PATH或者写脚本时用绝对路径。多用户环境下每个人改自己家目录的.bashrcPATH最后长什么样完全不可控强制sudo环境干净反而最安全。9.4 协作目录文件权限混乱根因多半是umask不一致共享目录配好了setgid但创建出来的文件还是别人改不了。检查一下新文件权限就明白了-rw-r--r--组写位是空的。这是umask 022在作怪。处理方式几个方案择一即可给协作目录设置默认ACLsetfacl -d -m g::rwx强制组写或者要求成员统一umask 002。前者对用户透明更推荐。9.5 账号临时禁用只锁密码SSH密钥入口仍然敞开passwd -l只锁密码登录如果该用户的公钥还在authorized_keys里他照样能通过密钥登录。临时禁用账号比较彻底的做法是三层叠加sudo passwd -l devuser sudo usermod -s /sbin/nologin devuser sudo mv /home/devuser/.ssh/authorized_keys /home/devuser/.ssh/authorized_keys.bak紧急封禁时再加一条把用户从sshd_config的AllowUsers列表里移出去并重启sshd。按紧急程度灵活选择但我建议至少做前两步。9.6 查登录记录时发现旧账号在活动有些账号建了之后一直没用某天last日志里突然出现它的登录记录需要立刻排查。常见原因包括系统账号被改成了可登录Shell、服务被利用提权、共享密码被泄露。处理思路是先锁定账号、改密、查用户Shell是否为nologin再看特定时间段auth日志里这个账号的所有登录IP和行为命令。定期做一次不活跃账号清理把三个月没有登录记录的用户整理出来逐个确认是运维的基本功。做多用户配置这件事本身并不难难的是把账号设计得足够规整、把权限控制得足够清楚、把入口收得足够紧。我在实际维护中最大的体会是配置的时候多花十分钟想清楚这个账号为什么存在、它能做什么、它什么时候应该被收回后面的运维日子会轻松非常多。希望这篇整理对你有用。
返回列表