Linux 管理笔记

最后更新: 2023-10-07 01:45:35 +0800 +0800
原文以英文撰写。您正在阅读AI翻译版本。

本文汇集了几项相互独立的管理任务:可移动存储、能力、文件系统位置、图像合成以及 ELF 符号版本。每个章节都说明了自动化所需关注的操作边界。

安全操作可移动设备 #

在关闭可移动介质的电源之前,先卸载所有已挂载的文件系统。udisksctl 使用 UDisks 服务,因此会应用桌面会话授权并协调操作,而不是直接发出未经中介的设备命令。

bash
lsblk -o NAME,PATH,TYPE,FSTYPE,MOUNTPOINTS
udisksctl unmount -b /dev/sdb1
udisksctl power-off -b /dev/sdb

向 unmount 传入 /dev/sdb1 这样的分区,向 power-off 传入 /dev/sdb 这样的完整驱动器。后者会刷新缓冲区、使设备退出内核使用,并在硬件支持时关闭驱动器。由于设备名称可能在每次连接事件后发生变化,请在执行命令前立即确认设备名称。成功卸载并不保证 USB 外壳已经断电。

使用能力委派权限 #

Linux 能力将传统上拥有全部权限的 root 权限划分为相互独立、分别检查的单元。进程具有 permitted、effective、inheritable、bounding 和 ambient 能力集;文件也可以携带 permitted 和 inheritable 能力掩码以及 effective 位。每项能力对应特定的内核检查,因此请查阅 capabilities(7)。

例如,需要设置系统时钟的专用二进制文件可以获得 CAP_SYS_TIME:

bash
sudo setcap cap_sys_time=ep /opt/example/bin/clock-setter
getcap /opt/example/bin/clock-setter

=ep 会将该能力添加到文件的 permitted 集,并请求它进入所执行进程的 effective 集。对于作用范围明确且不可写的可执行文件,只授予最小能力集。复制、打包或不支持所需扩展属性的文件系统可能会移除文件能力,因此部署检查应运行 getcap。

能力并不是完整的沙箱。尤其是 CAP_SYS_ADMIN 授权许多互不相关的操作,而特权二进制文件中的内存安全问题或命令注入漏洞仍可能导致系统被攻破。如果委派内容可以表示为一条经过审计的命令,那么受约束的 sudoers 规则可能更易于检查。

选择文件系统位置 #

Filesystem Hierarchy Standard 和 hier(7) 根据数据的持久性和用途对其进行区分:

  • /run 包含自启动以来的易失性运行时状态。该层次结构会在启动期间清空。服务应为 PID 文件、UNIX 域套接字、锁以及其他运行时元数据创建 /run/example/ 这样的私有子目录;服务管理器可以使用 systemd 的 RuntimeDirectory= 等功能创建它。
  • /var 包含跨重启持久存在的可变数据,包括日志、队列、缓存、数据库和应用程序状态。对于持久状态,应选择 /var/lib/example 这样的定义子树;对于可重新生成的数据,应选择 /var/cache/example。
  • /tmp 包含临时文件,可能根据策略或在启动时被清空。绝不要假设其中的数据具有持久性。请使用不可预测的名称和严格的权限以原子方式创建文件;Shell 脚本应使用 mktemp,程序应使用等效的安全 API。

如果使用带命名空间的子目录即可避免冲突并将所有权作为一个整体进行管理,就不要将应用程序文件直接放在 /run 或 /var 中。/run 适合存放用于连接守护进程的套接字;持久的守护进程数据应放在 /var 下,而不是该套接字旁边。

调整大小并拼接图像 #

ImageMagick 7 使用 magick 命令。不带 ! 的几何参数会保留宽高比:

bash
# Fit within a width of 25 pixels, with unconstrained height.
magick src.png -resize 25x out.png

# Fit within a height of 25 pixels, with unconstrained width.
magick src.png -resize x25 out.png

# Scale both dimensions to 70 percent.
magick input.jpg -resize 70% output.jpg

25x25 表示“适合放入此框”,而不是“强制调整为恰好 25 x 25”。只有在有意产生变形时才添加 !;当要求填满并裁剪为精确矩形时,应使用 ^ 加 -extent。

append 运算符会保留输入顺序:

bash
magick 1.jpg 2.jpg -append vertical.jpg
magick 1.jpg 2.jpg +append horizontal.jpg

-append 将图像从上到下堆叠;+append 将图像从左到右排列。输出会使用交叉轴上输入宽度或高度中的最大值。-gravity 控制对齐方式,-background 控制暴露区域:

bash
magick -background '#202020' -gravity center 1.jpg 2.jpg +append row.jpg

检查 ELF 符号版本 #

ELF 符号版本控制允许共享对象发布同一符号的多个 ABI 代际。链接器版本脚本可以将导出的名称分配给版本节点,.symver 指令或库构建机制可以将实现绑定到这些节点。某个定义使用 @@ 标记为默认定义;较旧的兼容定义使用 @。例如,memcpy@@GLIBC_2.14 是为新的无版本引用选择的默认定义,而较旧的二进制文件可能要求 memcpy@GLIBC_2.2.5。

版本控制支持在一个 SONAME 内提供向后兼容的实现;但它不会使针对较新版本构建的二进制文件能够在缺少所需节点的系统上运行。请检查两侧:

bash
readelf --dyn-syms --wide ./program
readelf --version-info ./program
objdump -T /lib/x86_64-linux-gnu/libc.so.6 | grep ' GLIBC_'

readelf --version-info 显示版本定义、要求以及符号版本表。objdump -T 将动态符号及其版本结合显示。运行时加载器必须从选定的依赖项中解析每个所需的版本节点;诊断期间可以使用 LD_DEBUG=versions ./program 跟踪该检查。

参考资料 #

评论

在 GitHub 上阅读或评论(发表评论需要登录)