Один полезный атрибут для защиты файлов журналов - только для добавления. Когда этот атрибут установлен, файл не может быть удален, и записи разрешены только для добавления в конец файла.
Очевидно, что злоумышленник, получивший привилегии root, может понять, что используются атрибуты файла, и просто убрать флаг «только для добавления» из журналов, запустив chattr -a. Чтобы предотвратить это, нам нужно отключить возможность удаления атрибута только для добавления. Для этого в Linux используйте механизм его возможностей.
Чтобы пользователь не мог удалить атрибут «только для добавления» из файла, нам нужно удалить возможность CAP_LINUX_IMMUTABLE. Как удалить эту возможность?
Утилита lcap ранее использовалась для этой цели, но в настоящее время она недоступна для Ubuntu. Есть ли другой способ удалить возможности ядра Linux?
Пересчет: я успешно установил lcap_0.0.6 на сервер Ubuntu 13.04, но после выполнения следующей команды я получаю сообщение об ошибке:
sudo ./lcap CAP_LINUX_IMMUTABE
/proc/sys/kernel/cap-bound: No such file or directory
Не полный ответ, но это может помочь понять, что происходит.
Из http://man7.org/linux/man-pages/man7/capabilities.7.html :
Набор ограничений возможностей до Linux 2.6.25
В ядрах до 2.6.25 набор ограничений возможностей является общесистемным атрибутом, который влияет на все потоки в системе. Ограничивающий набор доступен через файл
/proc/sys/kernel/cap-bound
....
Набор ограничений возможностей с Linux 2.6.25 и выше
Начиная с Linux 2.6.25, набор ограничений возможностей является атрибутом для каждого потока. (Больше нет общесистемного ограничивающего набора возможностей.)
...
Удаление возможностей из ограничивающего набора поддерживается, только если возможности файлов скомпилированы в ядро. В ядрах до Linux 2.6.33 файловые возможности были дополнительной функцией, настраиваемой с помощью опции
CONFIG_SECURITY_FILE_CAPABILITIES
. Начиная с Linux 2.6.33, опция конфигурации была удалена, а файловые возможности всегда являются частью ядра. Когда возможности файлов скомпилированы в ядро, процессinit
(предок всех процессов) начинается с полного ограничивающего набора. Если возможности файла не скомпилированы в ядро, тоinit
начинается с полного ограничивающего набора минусCAP_SETPCAP
, потому что эта возможность имеет другое значение, когда нет возможностей файла.Удаление возможности из ограничивающего набора не удаляет его из унаследованного набора потока. Однако это не позволяет в будущем добавить эту возможность обратно в унаследованный набор потока.