主题
用户权限与安全
本篇定位
覆盖用户组、文件权限、sudo、ACL、SELinux 基础。
高频面试题
Q1:rwx 权限如何计算?
我的答案:
Linux 文件权限用三个数字表示,分别对应属主、属组、其他人三类人,每类占三位 rwx:读 r=4、写 w=2、执行 x=1,加起来就是该类人的权限值。
举几个例子就清楚了。755 拆开是 7-5-5:属主是 7(4+2+1,rwx 全有),属组是 5(4+1,r-x),其他人也是 5(r-x)。这是目录和可执行脚本最常用的权限——谁都能进去和读,但只有属主能改。644 是 6-4-4:属主 6(rw-,能读写),组和其他人只有 4(r--,只读),这是普通配置文件和文档的默认权限。
有两个点面试常挖。第一,目录的 x 权限和文件不一样:文件有 x 表示能执行它;目录有 x 表示"能不能进去(cd 进去)",只有 r 没有 x 时,你能 ls 看到文件名列表,却进不去、也 stat 不了文件详情。第二,看权限用 ls -l,输出第一列 -rwxr-xr--,第一个字符 - 是普通文件、d 是目录、l 是软链接,后面九位才是三组 rwx。
改权限命令:chmod 755 script.sh 用数字,或 chmod u+x script.sh 用符号给属主加执行位;改属主 chown user:group file,常用 -R 递归。
Q2:su 和 sudo 的区别?
我的答案:
这俩都能拿到 root 权限,但思路完全不同,面试我会这么对比。
su 是切换用户:su - root 会把我整个shell环境切成 root 的(- 表示连环境变量一起切,不写 - 只切身份不切环境),需要输入的是目标用户 root 的密码。也就是说,谁要临时当 root,都得知道 root 密码——这在团队里就尴尬了,root 密码人尽等于没人能负责。
sudo 是授权执行:我还是用自己的普通账号登录,在某条命令前加 sudo,临时以 root 身份跑这一条,需要输入的是我自己的密码。谁能 sudo、能跑哪些命令,由 /etc/sudoers(用 visudo 编辑)控制,比如 ops ALL=(ALL) /usr/bin/systemctl restart nginx 只允许 ops 重启 nginx。
对比下来 sudo 有三个生产优势:一是不用共享 root 密码,每个人用自己账号,离职直接删账号;二是最小权限,只给需要的命令,不是一上来全放权;三是可审计,所有 sudo 操作都记在 /var/log/secure(RHEL)或 /var/log/auth.log(Debian)里,出问题能追到谁干的。所以生产环境一律禁用 root 直登、用 sudo,这也是我新机器初始化的必做项。
Q3:硬链接和软链接区别?
我的答案:
链接分硬链接和软链接(符号链接),核心区别是它指向的是"文件本身"还是"文件名"。
先理解原理:Linux 里一个文件真正的身份是 inode,文件名只是指向 inode 的一个"标签"。
硬链接:ln 源文件 硬链接名,它和源文件是同一个 inode,相当于同一个文件多挂了一个名字。特点是:删掉源文件后硬链接照样能用,因为 inode 还被硬链接引用着,磁盘数据没真删;缺点是不能跨文件系统(inode 只在本文件系统内唯一)、不能给目录建。适合防止误删重要文件——inode 链接数减到 0 数据才释放。
软链接:ln -s 源文件 软链接名,它是一个独立的小文件,里面存的是源文件的路径字符串,像 Windows 的快捷方式。特点是:可以跨文件系统、可以链目录,用得更广;但它依赖路径——删掉或移走源文件后,软链接就变成"断链"(失效的红箭头),ls -l 看出来就是指向不存在的地方。
一句话记:硬链接是"同一个文件的别名",删源不影响;软链接是"指向路径的快捷方式",源没了它就废了。日常做版本切换、目录映射(如 ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx)都用软链接。
Q4:umask 的作用?
我的答案:
umask 决定我新建文件和目录时的默认权限,它是一个"遮罩",把不该有的权限位去掉。
规则是:新建文件的默认最大权限是 666(rw-rw-rw-),新建目录是 777(rwxrwxrwx),然后减掉 umask 的值就是实际权限。注意文件默认不带执行位,所以即使 umask 算出来有 x,文件也不给 x,得手动 chmod。
举个例子,默认 umask 一般是 022。那新建文件就是 666 减 022 = 644(rw-r--r--),新建目录是 777 减 022 = 755(rwxr-xr-x)——这就是为什么你刚 touch 一个文件权限总是 644、mkdir 出来是 755。
如果想让新建文件更私密,把 umask 设成 077:文件就变成 600(只有属主能读写),目录变成 700,适合个人敏感环境。临时看和改:umask 看当前值,umask 077 临时设;永久生效写进 /etc/profile 或 ~/.bashrc。
面试延伸:umask 和 chmod 的关系是——chmod 是"你主动指定权限",umask 是"系统默认给你遮掉哪些位",两者配合控制文件刚创建出来的安全基线。