审计 fstab 并修好
目标
按照规则审计一份损坏的 fstab,修复它,并亲自编写验证脚本。
为什么重要
fstab 是系统中最危险的文件之一。写错了,启动到一半就会停住,如果是没有控制台的云实例,就无从下手。尤其是第六个字段 pass(fsck 顺序) 经常写错——不是根分区却写 1,或者给网络文件系统写了不是 0 的值,启动就会卡住。而且,如果没有 nofail,一块数据盘坏了,整台服务器都起不来。在实际工作中,重启之前一定要先验证——靠重启来确认,不是确认,而是赌博。
本实验的规则
- 规则 A:每个条目行必须恰好有 6 个字段
- 规则 B:
pass的值,只有根(/)为1,其他本地文件系统为2,网络/虚拟文件系统(nfs、nfs4、tmpfs)为0 - 规则 C:同一个挂载点不得出现两次
- 规则 D:
dump和pass必须是数字
步骤
- 创建目录
/root/fstab,并把/opt/fixtures/st-fstab/fstab.broken复制为/root/fstab/work.tab。 - 把去掉注释和空行之后的每个条目转换成
장치,마운트지점,타입,옵션,dump,pass这样的 CSV(列依次为设备、挂载点、类型、选项、dump、pass),保存到/root/fstab/fields.csv。字段不足的行,只写已有的部分。 - 把违反上述四条规则的行号按升序、每行一个,写入
/root/fstab/audit.txt。行号从文件最上面开始、包含注释,从 1 起算。 - 创建修复了所有违规的
/root/fstab/fixed.tab。原文件中正常的条目保持不变,字段不足的行补上0 2,重复的挂载点中靠后的一个改为/var2,错误的 pass 值按规则 B 修正。 - 把
fixed.tab中以设备路径(/dev/...)写的条目,改成UUID=1a2b3c4d-0004-4000-8000-000000000004的写法。 - 给
fixed.tab中所有不是根的本地条目的选项加上nofail,并给/tmp条目的选项同时加上noexec、nosuid、nodev。 - 让
fixed.tab中 NFS 条目的选项同时包含_netdev、soft、timeo=600、retrans=2。 - 编写
/root/fstab/validate.sh。它要以第一个参数接收 fstab 文件路径,检查规则 A 到 D,没有违规时以退出码 0 结束,只要有一处违规就以非 0 值结束。评分器会分别对fixed.tab(必须通过)和fstab.broken(必须失败)运行它。
参考
- 用
awk 'NF && $1 !~ /^#/ {print}'过滤掉注释和空行。 - 如果需要行号,使用
grep -n或awk '{print NR": "$0}'。 - 第 8 步的脚本用 bash 编写,不需要执行权限(评分器以
bash validate.sh <파일>(占位符为文件)运行)。 - 常见错误 1:在第 3 步把重复的设备算作问题。规则是挂载点重复。
- 常见错误 2:第 8 步的脚本不接收参数,而是读取固定路径。务必使用第一个参数。
创建工作副本
创建目录 /root/fstab,并把 /opt/fixtures/st-fstab/fstab.broken 复制为 /root/fstab/work.tab。
请不要动原始夹具,在副本上操作。行数必须与原文件相同。
把字段拆分成 CSV
把去掉注释和空行之后的每个条目转换成 장치,마운트지점,타입,옵션,dump,pass 这样的 CSV(列依次为设备、挂载点、类型、选项、dump、pass),保存到 /root/fstab/fields.csv。字段不足的行,只写已有的部分。
排除注释和空行。用 awk 把六个字段用逗号连接起来即可。
找出违反规则的行
把违反上述四条规则的行号按升序、每行一个,写入 /root/fstab/audit.txt。行号从文件最上面开始、包含注释,从 1 起算。
请把四条规则逐一应用。行号从文件最上面开始、包含注释来计算。
提交修改版
创建修复了所有违规的 /root/fstab/fixed.tab。原文件中正常的条目保持不变,字段不足的行补上 0 2,重复的挂载点中靠后的一个改为 /var2,错误的 pass 值按规则 B 修正。
补全字段不足的行,把重复的挂载点中的一个改到别的路径,把错误的 pass 值按规则修正。
把设备名改成 UUID 写法
把 fixed.tab 中以设备路径(/dev/...)写的条目,改成 UUID=1a2b3c4d-0004-4000-8000-000000000004 的写法。
有一个条目是用设备路径写的。改成 UUID= 的写法,值可以随意决定。
添加安全选项
给 fixed.tab 中所有不是根的本地条目的选项加上 nofail,并给 /tmp 条目的选项同时加上 noexec、nosuid、nodev。
不是根的本地条目需要“失败也继续启动”的选项,/tmp 则需要三个安全选项。
编写 NFS 条目
让 fixed.tab 中 NFS 条目的选项同时包含 _netdev、soft、timeo=600、retrans=2。
网络文件系统需要等待网络就绪的选项,而 pass 必须是不检查的值。
编写验证脚本
编写 /root/fstab/validate.sh。它要以第一个参数接收 fstab 文件路径,检查规则 A 到 D,没有违规时以退出码 0 结束,只要有一处违规就以非 0 值结束。评分器会分别对 fixed.tab(必须通过)和 fstab.broken(必须失败)运行它。
评分器会分别对正常文件和不合格文件运行它。正常时必须以 0 结束,有问题时必须以非 0 值结束。