在 AWS 中运行 CentOS 6,所看到的结果令我困惑。
有一个s3fs
挂载/etc/fstab
有时会失去读写能力。我有一个 cron 作业,几个月来一直运行良好,它会每分钟测试挂载是否正常,如果它失去连接,它就会umount
共享mount
。挂载在没有负载的情况下更容易消失,而不是在实际负载下,所以这是一个很好的解决方案。
由于某种原因,它停止了工作,现在机器无法从共享中读取/写入,因为机器在配置后启动时做的第一件事就是umount
共享mount
。
现在我尝试读取时收到的错误是:
cp: cannot open `/app/canary.txt' for reading: Input/output error
在/var/log/messages
我看到这个:
kernel: s3fs[3077]: segfault at e66000 ip 00007f833663d94e sp 00007ffc849c5b18
error 4 in libc-2.12.so[7f83365b4000+18a000]
现在,当我以 root 身份在控制台中运行完全相同的脚本时,它运行得非常好。卸载并安装驱动器并使其处于工作状态。
我的第一个猜测是环境中的某些东西导致了这种差异,因此我source /root/.bash_profile
在脚本中添加了,但无济于事。
/etc/fstab 中的这一行非常庞大,但是经过多次尝试微调后我们发现它效果最好:
ourbucket /app fuse.s3fs _netdev,allow_other,endpoint=us-west-2,url=https://s3-us-west-2.amazonaws.com,use_path_request_style,use_sse,gid=1001,umask=0007,use_cache=/srv/s3fs,retries=20,parallel_count=30,connect_timeout=30,readwrite_timeout=60,stat_cache_expire=86400,max_stat_cache_size=100000 0 0
cronfile 如下所示:
* * * * * root /usr/bin/sudo /root/check_mount.sh
我尝试了使用和不使用 sudo 的情况,因为我认为它可能会影响环境。
我尝试过多种脚本变体,但大多数命令都曾被使用过。无论umount
我执行哪种类型的命令,都会出现相同的问题。
\cp /app/canary.txt /tmp/canary.txt
retVal=$?
sleep 1
if [ ${retVal} -ne 0 ]; then
echo "Copy failed, trying to umount"
umount /app
echo "umount returned $?"
sleep 1
echo "Trying umount -f"
umount -f /app
echo "umount -f returned $?"
sleep 1
echo "Trying fusermount -u"
/usr/local/bin/fusermount -u /app
echo "fusermount returned $?"
sleep 1
echo "Trying to mount"
mount /app
echo "mount returned $?"
sleep 1
echo "Trying copy after mount"
\cp /app/canary.txt /tmp/canary.txt
fi
此脚本最初是在 中编写的python
,关键部分只是os.system
,但我想将其从等式中删除。它给出了相同的问题。
答案1
这是我的完整解决方案:
首先,我目视审核了 audit.log。为了捕获正确的内容,并且只捕获正确的内容,我曾经audit2allow
创建了策略和类型执行规则。
grep mount /var/log/audit/audit.log | audit2allow -R -M mounts3fs
我使用 grep 来查找 mount 以便只得到正确的东西。
这创造了mounts3fs.pp和mounts3fs.te文件。mounts3fs.te看起来像这样:
policy_module(mounts3fs, 1.0)
require {
type file_t;
type var_t;
type mount_t;
type cert_t;
class dir { write remove_name add_name };
class file { create unlink link setattr };
}
#============= mount_t ==============
#!!!! The source type 'mount_t' can write to a 'dir' of the following types:
# user_home_t, etc_runtime_t, var_run_t, mount_var_run_t, mount_tmp_t, user_home_dir_t, etc_t, nfs_t, tmpfs_t, tmp_t, var_t
allow mount_t cert_t:dir { write remove_name add_name };
allow mount_t cert_t:file { create unlink };
allow mount_t file_t:dir { remove_name add_name };
allow mount_t file_t:file { unlink link setattr };
allow mount_t var_t:file link;
要安装该策略,我运行以下命令:
semodule -i mounts3fs.pp
我发现这对于某些操作来说还不够,因此我创建了如下附加策略:
module s3fs 1.0;
require {
type file_t;
type mount_t;
class dir create;
class file create;
}
#============= mount_t ==============
#!!!! This avc is allowed in the current policy
allow mount_t file_t:dir create;
allow mount_t file_t:file create;
selinux
仍然可以直接下地狱。