Как стать автором
Обновить

Комментарии 18

Ох уж эти энтерпрайзные баш-скрипты…

Например, в части вызовов curl'а параметр называется file, в части — action.

У вас, кстати, есть явный race condition.

Ещё SQLi в скрипте:
/usr/bin/curl -d "host=fake&serial=1&name=2&vendor=3&file=');+DROP+DATABASE+usb;+SELECT+('qwerty&sub=true" --noproxy 10.0.40.16 http://10.0.40.16/usb/input.php
Например, в части вызовов curl'а параметр называется file, в части — action.

mea culpa. Это уже при написании статьи сначала решилл убрать не совсем логичный filе, а потом не углядел везде поправить.

У вас, кстати, есть явный race condition.

Да. Например — пользователь успеет после записи вытащить флешку. Тогда запись не будет отслежена.

Ещё SQLi в скрипте:

Да, знаю. По безопасности там еще работать и работать.
ACCESS=`find /media -anewer /var/tmp/usb.check -type f` 

Оно ж вернёт все файлы, к которым был доступ (access), даже обычное открытие. Если у вас есть нечто, сканирующее каталоги/файлы (к примеру, locate обновит свою БД и добавит туда файлы с флешки), то скрипту будет ой как тяжело.
Естественно, файловая система флешки должна поддерживать access time.

Плюс с cnewer/newer будут проблемы, т.к. пользователь может дома залить что-то на флешку уже после момента запуска скрипта. Скрипт эти файлы также посчитает.
В общем, если есть желание сделать работающее решение, то нужно копать в сторону FUSE.
Тогда всю работу с флешкой можно будет пропускать через собственное приложение.

Ну и раскидайте свой открытый ключ по всем машинкам, негоже в скриптах указывать рутовый пароль :)
В современном мире relatime используется по умолчанию. Т. е. atime обновляется при модификации файла и при простом доступе 1 раз в сутки.

man mount on centos 6.5
relatime
Update inode access times relative to modify or change time. Access time is only updated if the previous access time was earlier than the current modify or change time. (Similar to noatime, but doesn’t break mutt or other applications that need to know if a file has been read since the last time it was modified.)

Since Linux 2.6.30, the kernel defaults to the behavior provided by this option (unless noatime was specified), and the strictatime option is required to obtain traditional semantics. In addition, since Linux 2.6.30, the file’s last access time is always updated if it is more than 1 day old.
Плюс с cnewer/newer будут проблемы, т.к. пользователь может дома залить что-то на флешку уже после момента запуска скрипта. Скрипт эти файлы также посчитает.

Почему, если скрипт в самом начале своей работы обновляет время служебного файла?

В общем, если есть желание сделать работающее решение, то нужно копать в сторону FUSE.

Форматировать флешки в FUSE?
Пользователи файлы на флешки чаще всего тянут для того, что бы поработать с ними дома. И как быть с поддержкой FUSE на домашних компах?

Ну и раскидайте свой открытый ключ по всем машинкам, негоже в скриптах указывать рутовый пароль :)

Соглашусь. В оправдание скажу, что это, на данный момент был первый случай, когда нужно было что-то массово распространять. Но не факт, что не придется в дальнейшем.
Вы говорите о FUSE так, будто это файловая система. Вам предлагают сделать прослойку между реальной ФС через FUSE, чтобы за всеми файлами уследить можно было.

Вообще, логичней было бы использовать inotify, как вам ниже предложили.
За совет спасибо, буду читать манулы
Почему, если скрипт в самом начале своей работы обновляет время служебного файла?

Скрипт запускается ведь не при монтировании флешки, а при старте компа, верно?
Комп включили вчера, флешку принесли сегодня. Или комп включили утром, а пользователь пришел на работу в обед, предварительно поработав с флешкой.
И не исключаем ситуации, что у пользователя на домашнем компьютере время банально улетело вперёд.

Форматировать флешки в FUSE?

Зачем? Проксировать доступ к файлам с логированием, а при необходимости — блокировать.
Сейчас меня забросают гнилыми помидорами, но… можно даже на PERL'е написать модуль для FUSE.
Скрипт запускается ведь не при монтировании флешки, а при старте компа, верно?
Комп включили вчера, флешку принесли сегодня. Или комп включили утром, а пользователь пришел на работу в обед, предварительно поработав с флешкой.
И не исключаем ситуации, что у пользователя на домашнем компьютере время банально улетело вперёд.

Согласен. В первых редакциях скрипта я даже сам попался на такой ситуации.
Иди даже какой-нибудь Gamin.
find на клиентских ПК доступен «из коробки». Нет нужды что-то дополнительно устанавливать.
Хотя мысль правильная — в планах заменить.
Для установки удобно использовать Ansible. А там и пристроите его к более глобальным целям.
Если пользователь запустит скрипт который в цикле будет делать touch с выставлением atime, mtime, то с большой вероятностью вы эти файлы пропустите. Поэтому, как уже писали, единственное правильное решение использовать inotify.

А во-вторых, правильно ли я понимаю, что если перед подключением usb накопителя «выдернуть ethernet шланг», то события у вас не залоггируются?
Поэтому, как уже писали, единственное правильное решение использовать inotify.

Да, в планах перейти.

А во-вторых, правильно ли я понимаю, что если перед подключением usb накопителя «выдернуть ethernet шланг», то события у вас не залоггируются?

не залоггируется только факт подключения носителя. Но, для выполнения операций с файлами пользователю придется вставить шнурок назад.
Но, для выполнения операций с файлами пользователю придется вставить шнурок назад.

Не ясно почему? Пользователь может все файлы из сети положить хоть куда, например в /tmp, потом отключиться от сети и записать на флешку?
Читаем внимательно вводные данные:
Пользователи не имеют на персональных компьютерах никаких прав, кроме запуска rdesktop/freerdp.
очень хорошая доступная идея.
еще чуть чуть допилить и получиться альтернатива DeviceLock
а вы не шаманили еще дальше?
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории