为了准确描述我的需求,只好废话比较多地讲一下具体的需求了:-)
最近有一个需求,需要限制某个用于察看线上日志的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环境的创建及删除,所以同样地也要做到挂载的自动创建及删除。在挂载方面需要自动化完成以下目的:
- 执行创建chroot脚本后,挂载相应目录并将挂载信息写入fstab
- 执行清理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