Linux系统基础9:认证与访问控制机制
Linux 认证与访问控制机制 新手超详细教程目录Linux 认证与访问控制机制 新手超详细教程一、先搞懂认证的主体 —— 用户与用户组1. Linux 用户的三类划分2. 用户组批量授权的工具3. 用户信息存在哪里—— /etc/passwd举例查看文件内容4. 密码存在哪里—— /etc/shadow影子文件举例查看影子文件需要 sudo二、核心认证机制身份验证的完整流程1. 最基础用户名 密码登录认证流程实操举例修改用户密码2. 用户切换认证su 命令语法与两种常用用法举例切换到 root 用户3. 特权提升认证sudo 命令日常最常用核心特点举例用 sudo 执行管理员命令权限配置文件/etc/sudoers经典配置举例新手实用配置例子4. 远程登录认证SSH 密钥认证原理通俗解释实操举例配置 SSH 免密登录步骤 1在你的 Windows/WSL 上生成密钥对步骤 2把公钥传到目标服务器步骤 3验证免密登录5. 统一认证框架PAM 简介新手能感知的 PAM 场景三、访问控制身份验证通过后你能做什么1. 基础层自主访问控制DAC访问控制规则举例用户组的批量授权实例2. 进阶层强制访问控制MAC主流实现通俗举例3. 特殊权限位访问控制的补充1SUID让普通用户以文件所有者身份执行2SGID目录继承组权限3粘滞位Sticky Bit只能删自己的文件四、新手完整实操练习练习步骤清理测试环境五、新手安全注意事项我们先把两个核心概念分清楚避免混淆身份认证Authentication验证「你是谁」比如输入用户名密码登录、SSH 密钥登录核心是证明你的身份合法。访问控制Authorization / 授权决定「你能做什么」比如你能不能读取某个文件、能不能执行管理员命令核心是给身份分配对应权限。两者配合完成完整的安全流程先认证身份再根据身份控制访问权限。下面我们从底层存储到上层应用逐层拆解每个机制都配原理说明 真实文件 / 命令拆解 实操例子零基础也能看懂。一、先搞懂认证的主体 —— 用户与用户组所有认证和权限都是围绕「用户」和「用户组」展开的这是整个机制的基础。1. Linux 用户的三类划分Linux 里所有操作都必须以某个用户的身份执行用户分为三类用户类型代表UID 标识权限说明超级管理员rootUID0拥有系统最高权限不受任何权限限制可以做任何操作普通用户你自己创建的用户比如linuxlearnUID≥1000权限受限只能在自己的家目录、授权的目录里操作修改系统配置需要提权系统用户比如www-data、sshdUID1~999给后台服务 / 程序用的用户不能登录终端用来限制服务的权限避免服务被攻破后危害整个系统新手注意日常操作一定要用普通用户只在需要的时候用sudo临时提权不要直接用 root 用户这是 Linux 安全的基本原则。2. 用户组批量授权的工具一个用户可以加入多个用户组组的作用是批量管理权限给一个组授权组里的所有用户自动拥有对应权限不用逐个给用户设置。每个用户都有一个「主组」默认和用户名同名创建文件时文件默认归属主组。用户还可以加入多个「附加组」继承附加组的所有权限。3. 用户信息存在哪里—— /etc/passwd所有用户的基础信息都存在/etc/passwd文件里这是认证系统的核心数据库之一所有用户都能读因为很多程序需要读取用户信息但只有 root 能改。举例查看文件内容cat /etc/passwd典型一行内容root:x:0:0:root:/root:/bin/bash linuxlearn:x:1000:1000:Linux Learner:/home/linuxlearn:/bin/bash逐字段拆解用冒号分隔共 7 列序号示例内容含义说明1root/linuxlearn用户名登录时输入的账号名2x密码占位符早期密码存在这里现在移到了/etc/shadow这里只留一个x标记30/1000UID用户 ID用户的数字唯一标识系统内部用 UID 识别用户0 就是 root40/1000GID主组 ID用户主组的组编号对应/etc/group里的组5root/Linux Learner用户备注信息可选写用户的全名、描述等6/root//home/linuxlearn用户家目录登录后默认进入的目录7/bin/bash登录 Shell用户登录后使用的命令解释器系统用户一般是/usr/sbin/nologin表示不能登录终端4. 密码存在哪里—— /etc/shadow影子文件真正的加密密码存在/etc/shadow文件里只有 root 用户有权限读取这就是「影子口令机制」—— 把密码和公开的用户信息分开降低密码泄露风险。举例查看影子文件需要 sudosudo cat /etc/shadow典型一行内容linuxlearn:$y$j9T$xxx$yyy:19900:0:99999:7:::逐字段拆解共 9 列序号示例含义说明1linuxlearn用户名和 /etc/passwd 对应2$y$j9T$xxx$yyy加密后的密码格式是$加密算法$盐值$密文不是明文是加盐哈希后的结果$y$代表 yescrypt 算法Ubuntu 新版默认早期是$6$代表 SHA-512319900最后修改时间从 1970 年 1 月 1 日到上次改密码的天数40密码最小使用天数改完密码后多少天内不能再改0 表示随时可以改599999密码最大有效期多少天后必须改密码99999 表示永久有效67过期提醒天数密码到期前 7 天登录时会提醒改密码7空密码过期宽限天数过期后多少天内还能登录改密码空表示不宽限8空账号失效时间到指定日期账号直接禁用空表示永久有效9空保留字段暂无用途新手安全常识Linux 永远不会存明文密码存的是加盐哈希值就算拿到 shadow 文件也很难反向算出原始密码这也是 Linux 安全的基础。二、核心认证机制身份验证的完整流程1. 最基础用户名 密码登录认证流程你在终端输入用户名密码登录时系统内部做了这几件事读取/etc/passwd确认用户名存在获取对应的 UID、GID、家目录、Shell。读取/etc/shadow获取该用户的加密密码和密码策略。对你输入的密码用同样的加密算法 同样的盐值计算哈希。把计算结果和 shadow 里的密文对比完全一致就认证通过加载用户权限、进入 Shell。不一致就认证失败提示密码错误。实操举例修改用户密码passwd作用修改当前用户的密码普通用户只能改自己的root 可以改所有人的。背后发生了什么先验证你输入的旧密码是否正确。检查新密码是否符合复杂度规则由 PAM 控制。生成随机盐值对新密码做哈希加密。更新/etc/shadow里对应用户的密码字段。新手注意输入密码时屏幕不显示任何字符是 Linux 的安全设计正常输入即可。2. 用户切换认证su命令su是 Switch User 的缩写用来在当前终端切换到另一个用户需要输入目标用户的密码来认证。语法与两种常用用法# 用法1切换到目标用户不切换环境变量不推荐 su 用户名 # 用法2切换到目标用户同时加载目标用户的环境登录式切换推荐 su - 用户名举例切换到 root 用户su - root拆解su切换用户命令-表示「登录式切换」会进入 root 的家目录加载 root 的环境变量和直接用 root 登录效果完全一样。执行后需要输入root 的密码认证通过就切换成功。缺点需要知道目标用户的密码多人共用服务器时不安全普通用户切换 root 需要知道 root 密码权限不好控制。3. 特权提升认证sudo命令日常最常用sudo是 Superuser Do 的缩写允许普通用户以自己的密码认证临时执行管理员命令不需要知道 root 密码是现在最主流的特权提升方式。核心特点只需要输入自己的密码不需要 root 密码。可以精细控制哪个用户、能执行哪些命令、要不要密码。所有 sudo 操作都会记录日志方便审计。举例用 sudo 执行管理员命令sudo apt update认证流程系统检查/etc/sudoers配置文件确认你有没有 sudo 权限。有权限的话提示输入你自己的密码不是 root 密码。密码验证通过以 root 身份执行apt update命令。执行完自动回到普通用户身份。小技巧第一次输完密码后5 分钟内再用 sudo 不需要重复输密码。权限配置文件/etc/sudoerssudo 的所有权限规则都写在/etc/sudoers里必须用visudo命令编辑会自动检查语法防止改错导致 sudo 失效。经典配置举例打开配置文件sudo visudo最常见的一行配置Ubuntu 默认给 sudo 组的用户全部权限%sudo ALL(ALL:ALL) ALL逐字段拆解部分含义%sudo授权对象%开头代表用户组这里是 sudo 组的所有用户第一个ALL允许在哪台主机上使用一般写 ALL所有主机(ALL:ALL)可以切换成哪个用户 / 哪个组执行命令ALL 代表所有用户最后一个ALL可以执行哪些命令ALL 代表所有命令翻译成人话sudo 组的用户在这台机器上可以以任何用户身份执行任何命令。新手实用配置例子允许某个用户免密执行所有 sudo 命令不推荐生产环境用本地练习方便linuxlearn ALL(ALL) NOPASSWD: ALL只允许用户执行某个特定命令最小权限原则 比如只允许用户重启系统linuxlearn ALL(ALL) /usr/sbin/reboot4. 远程登录认证SSH 密钥认证远程连接服务器比如你的 OK62xx 嵌入式设备、云服务器时密码认证容易被暴力破解更安全的方式是SSH 密钥认证基于非对称加密实现。原理通俗解释生成一对钥匙公钥和私钥。公钥可以公开放到要登录的服务器上锁的作用。私钥你自己留着绝对不能泄露钥匙的作用。登录时服务器用公钥发一段加密的挑战你用私钥解密后发回去验证通过就登录全程不需要传密码。实操举例配置 SSH 免密登录步骤 1在你的 Windows/WSL 上生成密钥对ssh-keygen执行后一路回车即可默认会在~/.ssh/目录下生成两个文件id_rsa私钥千万不要发给别人id_rsa.pub公钥要放到目标服务器上进阶可以加-t ed25519用更安全高效的算法ssh-keygen -t ed25519步骤 2把公钥传到目标服务器ssh-copy-id root192.168.1.100作用自动把你的公钥追加到目标服务器/root/.ssh/authorized_keys文件里。第一次需要输入目标服务器的密码传输完成后下次登录就不用密码了。步骤 3验证免密登录ssh root192.168.1.100直接登录成功不需要输密码就是配置成功了。安全提示生产环境一般会禁用密码登录只允许密钥登录能极大降低被暴力破解的风险。5. 统一认证框架PAM 简介你可能会好奇登录、su、sudo、图形界面登录这些场景都要认证难道每个程序都自己写一套认证逻辑吗当然不是Linux 用PAMPluggable Authentication Modules可插拔认证模块统一管理所有认证流程。作用把认证功能做成独立的模块程序不用自己写认证逻辑直接调用 PAM 就行。可插拔想加什么认证方式换个模块就行不用改程序。比如加密码复杂度校验、加短信验证码、加指纹登录都是换 PAM 模块实现的。新手能感知的 PAM 场景密码复杂度限制设置密码太简单会提示「BAD PASSWORD」就是 PAM 的pam_pwquality模块在检查。登录失败锁定输错 3 次密码就锁定账号几分钟防止暴力破解也是 PAM 模块实现的。限制 root 远程登录SSH 禁止 root 密码登录也是和 PAM 配合的安全策略。新手不用深入研究 PAM 配置知道有这个统一认证框架、它管着所有认证环节就行。三、访问控制身份验证通过后你能做什么认证解决了「你是谁」访问控制解决「你能访问什么、能做什么操作」。Linux 有两层核心访问控制体系。1. 基础层自主访问控制DACDACDiscretionary Access Control是 Linux 默认的访问控制机制也是你天天接触的文件权限体系。核心逻辑文件的所有者主人可以自主决定文件的权限比如把文件改成所有人可读、只给组里的人写权限。实现方式就是我们之前讲的rwx权限位 所有者 所属组。访问控制规则举例假设有一个文件project.txt属性如下-rw-rw-r-- 1 dev1 devteam 1024 Jul 12 10:00 project.txt所有者是dev1所属组是devteam权限所有者读写、组内读写、其他人只读那么不同用户的访问权限用户所属关系能读吗能写吗能执行吗dev1所有者✅ 能✅ 能❌ 不能dev2在 devteam 组里✅ 能✅ 能❌ 不能testuser其他用户✅ 能❌ 不能❌ 不能root超级管理员✅ 能✅ 能✅ 能root 不受 DAC 权限限制任何文件都能读写执行这也是 root 权限大的原因。用户组的批量授权实例场景公司有 3 个开发需要共同访问/data/project目录都要有读写权限。 不用给每个用户单独设置权限用组来批量控制# 1. 创建开发组 sudo groupadd devteam # 2. 把三个开发用户都加入这个组 sudo usermod -aG devteam dev1 sudo usermod -aG devteam dev2 sudo usermod -aG devteam dev3 # 3. 把项目目录的所属组改成 devteam sudo chown -R :devteam /data/project # 4. 给组设置读写执行权限 sudo chmod -R 775 /data/project效果三个用户都继承了 devteam 组的权限都能在目录里读写文件以后加新人只要加到组里就行不用改目录权限。2. 进阶层强制访问控制MACMACMandatory Access Control是系统级的强制安全策略比 DAC 更严格。和 DAC 的核心区别DAC 是文件主人说了算MAC 是系统内核说了算管理员和文件主人都不能随便改哪怕是 root 也不能违反规则。作用限制程序的权限哪怕程序被攻破了也只能访问系统允许的资源把危害限制在最小范围。主流实现Ubuntu / Debian默认启用AppArmor配置简单基于程序路径做限制。CentOS / RHEL默认启用SELinux功能更强配置更复杂基于安全标签做限制。通俗举例比如 Nginx 网页服务在 DAC 权限下只要是以www-data用户运行的程序都能读/home下的用户文件 但在 AppArmor 规则下系统强制规定Nginx 程序只能访问/var/www/目录下的网页文件其他目录哪怕权限够也读不了。就算 Nginx 被黑客攻破了也偷不到用户家目录里的文件。新手了解即可日常使用一般不用改配置系统默认的规则就够用遇到程序访问文件异常时可以考虑是不是 MAC 限制了。3. 特殊权限位访问控制的补充除了基础的rwx还有三个特殊权限位用来解决特定场景的访问控制问题新手了解作用即可。1SUID让普通用户以文件所有者身份执行作用给二进制可执行文件加 SUID 后任何用户执行这个文件时都会临时获得文件所有者的权限。典型例子/usr/bin/passwd命令ls -l /usr/bin/passwd输出-rwsr-xr-x 1 root root 68208 ... /usr/bin/passwd所有者执行位的x变成了s代表有 SUID 权限。为什么需要修改密码要改/etc/shadow文件这个文件只有 root 能写普通用户执行 passwd 时临时获得 root 身份就能修改 shadow 文件了用完权限就收回。2SGID目录继承组权限作用给目录加 SGID 后在目录里新建的文件 / 子目录会自动继承这个目录的所属组而不是创建者的主组。场景团队共享目录保证所有人创建的文件都属于同一个组不用每次手动改权限。举例# 给共享目录加 SGID chmod gs /data/project之后任何人在里面新建文件文件的组自动是devteam。3粘滞位Sticky Bit只能删自己的文件作用给公共目录加粘滞位后用户只能删除自己创建的文件不能删别人的。典型例子/tmp临时目录所有人都能读写但不能乱删别人的临时文件。ls -ld /tmp输出drwxrwxrwt 16 root root 4096 ... /tmp其他用户执行位的x变成了t代表有粘滞位。四、新手完整实操练习可以在你的 WSL 里跟着做一遍完整走一遍「创建用户组→创建用户→设置权限→验证权限」的流程。练习步骤# 1. 创建一个测试组 testgroup sudo groupadd testgroup # 2. 创建两个测试用户 user1 和 user2自动创建家目录用bash sudo useradd -m -s /bin/bash user1 sudo useradd -m -s /bin/bash user2 # 3. 给两个用户设置密码 sudo passwd user1 sudo passwd user2 # 4. 把 user2 加入 testgroup 组user1 不加 sudo usermod -aG testgroup user2 # 5. 创建一个共享目录 /data/share sudo mkdir -p /data/share # 6. 设置目录权限所有者root所属组testgroup组内读写执行其他人没权限 sudo chown root:testgroup /data/share sudo chmod 770 /data/share # 7. 验证权限切换到 user1尝试进入目录 su - user1 cd /data/share # 会报错 Permission denied因为 user1 不在 testgroup 里没有权限 exit # 8. 切换到 user2尝试进入目录并创建文件 su - user2 cd /data/share touch test_file.txt ls -l # 能正常进入并创建文件因为 user2 在 testgroup 里有组权限 exit清理测试环境sudo userdel -r user1 sudo userdel -r user2 sudo groupdel testgroup sudo rm -rf /data/share五、新手安全注意事项不要直接用 root 日常操作普通用户 sudo 是标准用法避免手滑误删系统文件。不要随便给 777 权限相当于所有用户都能读写执行安全风险极大生产环境严禁。远程登录优先用 SSH 密钥禁用密码登录防止暴力破解。最小权限原则给用户 / 程序刚好够用的权限就行不要图方便给全部权限。不要乱改 /etc/passwd、/etc/shadow改错会导致用户无法登录修改用户用专用命令useradd、usermod、passwd。