Запускаю CentOS 6 в AWS, и то, что я вижу, меня озадачивает.
Есть 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
Вот мое полное решение:
Сначала я визуально проверил журнал аудита. Чтобы отловить нужные вещи и только нужные вещи, я 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
все равно может отправиться прямиком в ад.