Total Pageviews

Sunday, 6 February 2022

使用脚本添加、删除挂载的思路

为了准确描述我的需求,只好废话比较多地讲一下具体的需求了:-)

最近有一个需求,需要限制某个用于察看线上日志的log用户的权限,要让权限要尽可能小但是又能看到日志文件。这样的需求很明显需要用chroot来完成。但是细想起来有一个日志目录访问问题。

假设目录所在文件夹是/var/logs,为了保证log用户能访问到这个文件夹,至少需要chroot环境中包含这个目录。如果直接这么做,log用户的chroot环境就与日志所在文件夹混在一起,不方便维护。我想到的解决方案是使用mount将目录bind到另一个文件夹下,然后在这个文件夹上级目录创建chroot环境。

例如:log用户的chroot环境处于/home/log中,那么使用mount --bind /var/logs /home/log/home/log。这样就可以让log用户进入chroot环境后看到日志,而又可以分开维护chroot文件夹和日志文件夹。

继续顺着这个思路往下走,就遇到了这篇日志的主要问题:如何使用脚本添加、删除挂载。

最终目的是尽可能自动化地进行chroot环境的创建及删除,所以同样地也要做到挂载的自动创建及删除。在挂载方面需要自动化完成以下目的:

  1. 执行创建chroot脚本后,挂载相应目录并将挂载信息写入fstab
  2. 执行清理chroot脚本后,卸载对应目录并删掉fstab中的挂载信息

第一条相对简单,在创建chroot脚本里直接写相应的mount语句并加入echo XXX >>/etc/fstab就可以。

第二条是我遇到的难点。如何识别“对应目录”以及如何识别fstab里对应的挂载信息?这个过程非常重要,必须要保证清理干净。实际情况是我还需要将/dev绑定到chroot环境中,如果不清理干净,其他人可能会直接rm删除chroot环境,导致/dev路径下的文件被删除。

我目前的解决方案:

创建挂载点:

echo "/var/logs /home/log/home/log/logs bind defaults,bind 0 0 #CHROOT_MOUNT_BIND_LOG" >>/etc/fstab
mount -a

清理挂载点

  • 识别老的挂载点:MOUNT_POINT=$(grep CHROOT_MOUNT_BIND_LOG /etc/fstab|awk '{print $2}')
  • 去掉卸载:umount ${MOUNT_POINT}
  • 删掉fstab记录:sed -i '/CHROOT_MOUNT_BIND_LOG/d' /etc/fstab

这个方案个人感觉有点糟糕,不是很精确。

No comments:

Post a Comment