защитить файлы от редактирования в linux

Как вы защищаете файл от редактирования внешней программой или пользователем, даже если этот пользователь каким-то образом получил привилегии root. Допустим, у меня есть этот файл F, который я должен защитить, и по умолчанию только root и пользователь могут выполнять, читать и записывать в F, все остальные имеют только разрешение на чтение.

Допустим, у меня есть программа, которая защищает критический файл F и обнаруживает, что обстоятельства редактирования необычны и, похоже, что безопасность системы может быть скомпрометирована. Как предотвратить сохранение изменений в файле F? Если возможно, также убейте ту программу, которая пыталась внести это изменение.

Я обнаружил, что фьюзер может убить этот процесс, но не раньше, чем будут нанесены какие-либо модификации, т. е. повреждения. Я использую inotify для обнаружения изменений. Моя проблема в том, что большинство редакторов создают временный файл, вносят изменения, а затем сохраняют его в исходный файл. Хотя я получаю такие события, как IN_OPEN, IN_CLOSENOWRITE и другие, я получаю IN_CLOSEWRITE и IN_CLOSEMODIFY только после завершения события? Как остановить изменение моего файла F?

Я понимаю, что моя программа может быть убита после того, как кто-то проникнет в систему, но могу ли я как-то сохранить то немногое, что могу?

Изменить: я забыл упомянуть, что не могу изменить права доступа к любому отслеживаемому файлу.

Изменить № 2: у меня есть набор файлов, которые нужно постоянно контролировать. Моя программа будет работать в фоновом режиме и отмечать изменения в этих файлах. Все файлы, как я писал ранее, могут быть отредактированы и выполнены с правами root, но есть действия (модификации), которые могут быть нежелательными и, скорее всего, будут означать, что кто-то получил root-доступ и отредактировал эти критические файлы. Мне нужно остановить эти вредные изменения. Из ответов я как-то предполагаю, что мне нужно будет сделать снимок этих файлов. Но проблема в том, что количество файлов может быть огромным, от 1 до 4 миллионов. Приветствуются любые решения, которые эффективнее, чем решение моментального снимка.


person bsd    schedule 17.02.2012    source источник
comment
Я думаю, было бы лучше написать вопрос, описывающий, что вы пытаетесь сделать.   -  person MarkR    schedule 17.02.2012
comment
Сделайте файл неизменяемым: chattr +i file_to_protect. Подробнее см. man chattr.   -  person pmg    schedule 17.02.2012
comment
pmg, я заглянул в chattr+i, проблема в том, что файлы, которые я должен отслеживать, могут быть удалены, т.е. для некоторых файлов это юридическое действие, а для других это может варьироваться, также данные могут быть записаны в некоторые файлы, не считая это как вредное изменение.   -  person bsd    schedule 17.02.2012


Ответы (5)


Невозможно защитить файл, если у «злоумышленника» есть root. Что бы вы ни делали, root может отменить. Сказав это, если вы хотите усложнить задачу, вы можете поместить файл в файловую систему только для чтения, например, на компакт-диск.

person AntonioD    schedule 17.02.2012
comment
Вопрос не в том, что может сделать или отменить рут, что может сделать программа в таких условиях, программа должна быть в режиме реального времени, поставить cdrom не может быть и речи. - person bsd; 17.02.2012
comment
Возможно, вам следует предоставить дополнительную информацию о том, что именно вы пытаетесь сделать, но мне кажется, что после записи файла вы мало что можете с этим поделать. Возможно, вы могли бы использовать какой-то снимок LVM, чтобы сохранить «известную исправную» версию. Или используйте файловую систему молотка DragonlyBSD. См. en.wikipedia.org/wiki/Versioning_file_system, чтобы узнать больше об этой идее. - person AntonioD; 17.02.2012
comment
Я изучил систему управления версиями, так как я никогда ее не использовал, может ли кто-нибудь предложить изучить требования, хорошую систему управления версиями (не файловую систему управления версиями), которая имеет API, который можно вызывать из программы c. Глядя на ответы, кажется, что отменить можно, но не предотвратить? - person bsd; 17.02.2012
comment
Я думаю, что вы не можете запретить кому-либо с правами на запись писать, лучшее, что вы можете сделать, это откатить (при условии, что он тоже не просто уничтожит резервную копию) libgit2.github.com/api.html подходит для того, что вам нужно? - person AntonioD; 17.02.2012

Если root является злонамеренным, невозможно дать какие-либо гарантии целостности данных. В идеале в такой критической системе никто не должен иметь root-права, не переводя систему в автономный режим и в среду обслуживания (возможно, заменяя ее суррогатной системой, когда она находится в автономном режиме, если критично постоянное время безотказной работы).

person R.. GitHub STOP HELPING ICE    schedule 17.02.2012

Я считаю, что вы можете сделать chattr+i (изменить атрибут на неизменяемый), чтобы даже root не мог редактировать файлы. Корень всегда может отменить это, но вы можете защитить свой файл от скрипт-кидди, который не знает о chattr.

person Ambidextrous    schedule 17.02.2012

Вы должны либо заблокировать файл из своего приложения, либо изменить его ACL и RWX права

person Eregrith    schedule 17.02.2012
comment
Я забыл упомянуть, что не могу изменить права доступа к любому файлу, за которым ведется наблюдение. - person bsd; 17.02.2012

Что, если ваше приложение для мониторинга заблокирует каждый файл, за которым оно следит? flock, fctnl, например, может работать. Тогда другие приложения не смогут редактировать файл.

Не уверен, как это влияет на удаление (которое, как вы сказали, может быть действительным).

person Trenin    schedule 12.07.2013