Bug 38903

Summary: Добавить опцию в pipe.conf для управления -r
Product: Sisyphus Reporter: manowar <manowar>
Component: osec-cronjobAssignee: Alexey Gladkov <legion>
Status: CLOSED FIXED QA Contact: qa-sisyphus
Severity: normal    
Priority: P5 CC: ldv, legion, manowar, nbr
Version: unstable   
Hardware: x86_64   
OS: Linux   
Attachments:
Description Flags
Патч, добавляющий опцию READ_ONLY в pipe.conf none

Description manowar@altlinux.org 2020-09-08 19:31:10 MSK
В некоторых случаях требуется, чтобы osec продолжал сообщать об изменениях в файловой системе до тех пор, пока эти изменения не будут исправлены или пока они не будут явно разрешены администратором. Однако сейчас каждый запуск osec по расписанию приводит к обновлению базы даннных и поэтому об изменениях сообщается только 1 раз.

В самом osec есть опция, которая запрещает изменение базы: -r. Но в pipe.conf не преждусмотрено соответствующей переменной.
Comment 1 manowar@altlinux.org 2020-09-08 19:31:52 MSK
Created attachment 8942 [details]
Патч, добавляющий опцию READ_ONLY в pipe.conf

Прикладываю патч.
Comment 2 Alexey Gladkov 2020-09-08 19:45:54 MSK
(Ответ для manowar@altlinux.org на комментарий #0)
> В некоторых случаях требуется, чтобы osec продолжал сообщать об изменениях в
> файловой системе до тех пор, пока эти изменения не будут исправлены или пока
> они не будут явно разрешены администратором. Однако сейчас каждый запуск
> osec по расписанию приводит к обновлению базы даннных и поэтому об
> изменениях сообщается только 1 раз.

Всё правильно. Если не обновлять, то потреряется информация о том когда были внесены изменения. Osec не ведёт лог, а только формирует отчёт о разнице состояний. cron обеспечивает фиксацию времени.

Я не вижу сценария использования, когда READ_ONLY мог бы быть полезен.

(Ответ для manowar@altlinux.org на комментарий #1)
> Создано вложение 8942 [details] [подробности]
> Патч, добавляющий опцию READ_ONLY в pipe.conf
> 
> Прикладываю патч.

Я бы назвал этот параметр в конфиге IMMUTABLE_DATABASE (If specified then osec will not try to modify the database)
Comment 3 manowar@altlinux.org 2020-09-08 22:35:20 MSK
(In reply to Alexey Gladkov from comment #2)
> Всё правильно. Если не обновлять, то потреряется информация о том когда были
> внесены изменения. Osec не ведёт лог, а только формирует отчёт о разнице
> состояний. cron обеспечивает фиксацию времени.

Время, когда были внесены изменения == это какой-то момент времени, между двумя запусками cron? В точности мы этот момент установить не можем?
Если так, то почему ты говоришь, что ситуация становится хуже, если мы допускаем повторные отчёты о том же самом изменении? Мне кажется, что в этом случае мы по-прежнему можем ориентироваться по времени _первого_ сообщения о данном изменении.

Смысл использования опции READ_ONLY в том, что состояние файловой системы, которое записано в базе данных osec, мы считаем эталонным. В этом случае мы вправе ожидать, что integrity check будет выводить предупреждение всякий раз, когда состояние отличается от эталонного, вне зависимости от того, сколько раз integrity check запускалась до этого, правда? Иными словами, osec, как ты правильно сказал, должен только формировать отчёт о разнице состояний — только информировать (!), но не вносить изменения в эталонное состояние. По крайней мере если его специально об этом не попросили.

Иначе имеем парадоксальную ситуацию: integrity check сначала предупреждает нас о нарушении целостности, но при повторном прогоне говорит, что всё в порядке! В этом случае мы можем не то, что информацию о времени изменения потерять, а и совсем не узнать о том, что были произведены какие-то незапланированные изменения: если мы пропустим первый и единственный (!) отчёт, в котором говорилось о нарушении целостности. То есть, если мы допускаем обновление эталона вместе с генерацией отчёта, то а) имеем единственный шанс отследить изменение (если потеряли письмо, то всё); б) автоматически санкционируем любое изменение ФС.
Comment 4 Alexey Gladkov 2020-09-09 13:05:42 MSK
(Ответ для manowar@altlinux.org на комментарий #3)
> Время, когда были внесены изменения == это какой-то момент времени, между
> двумя запусками cron?

Да. Чем чаще cron запускает osec, тем точнее.

> В точности мы этот момент установить не можем?

Нет.

> Если так, то почему ты говоришь, что ситуация становится хуже, если мы
> допускаем повторные отчёты о том же самом изменении? Мне кажется, что в этом
> случае мы по-прежнему можем ориентироваться по времени _первого_ сообщения о
> данном изменении.

Давай я продемонстрирую.

Без readonly:

# сron report in time T0
/tmp/root	stat	changed	old mtime=1599644162.3507495200	new mtime=1599644172.5866302030
/tmp/root/aaa	checksum	new	 checksum=sha1:da39a3ee5e6b4b0d3255bfef95601890afd80709
/tmp/root/aaa	stat	new	 uid=legion gid=legion mode=100644 inode=3139548 mtime=1599644172.5866302030
/tmp/root/bbb	checksum	changed	old checksum=sha1:da39a3ee5e6b4b0d3255bfef95601890afd80709	new checksum=sha1:adc83b19e793491b1c6ea0fd8b46cd9f32e592fc
/tmp/root/bbb	stat	changed	old mtime=1599644162.3507495200	new mtime=1599644211.9341715230

# сron report in time T1
/tmp/root	stat	changed	old mtime=1599644172.5866302030	new mtime=1599644256.8696477030
/tmp/root/bbb	checksum	changed	old checksum=sha1:adc83b19e793491b1c6ea0fd8b46cd9f32e592fc	new checksum=sha1:da39a3ee5e6b4b0d3255bfef95601890afd80709
/tmp/root/bbb	stat	changed	old mtime=1599644211.9341715230	new mtime=1599644273.2334569470
/tmp/root/aaa	checksum	removed	 checksum=sha1:da39a3ee5e6b4b0d3255bfef95601890afd80709
/tmp/root/aaa	stat	removed	 uid=legion gid=legion mode=100644 inode=3139548 mtime=1599644172.5866302030

с readonly:

# сron report in time T0
/tmp/root	stat	changed	old mtime=1599644256.8696477030	new mtime=1599644350.1245606150
/tmp/root/aaa	checksum	new	 checksum=sha1:da39a3ee5e6b4b0d3255bfef95601890afd80709
/tmp/root/aaa	stat	new	 uid=legion gid=legion mode=100644 inode=3144748 mtime=1599644350.1245606150
/tmp/root/bbb	checksum	changed	old checksum=sha1:da39a3ee5e6b4b0d3255bfef95601890afd80709	new checksum=sha1:adc83b19e793491b1c6ea0fd8b46cd9f32e592fc
/tmp/root/bbb	stat	changed	old mtime=1599644273.2334569470	new mtime=1599644356.5204860570

# сron report in time T1
/tmp/root	stat	changed	old mtime=1599644256.8696477030	new mtime=1599644387.9321198870
/tmp/root/bbb	stat	changed	old mtime=1599644273.2334569470	new mtime=1599644382.8321793370

Я могу сделать и так, что второй репорт будет совсем пустым.

Если osec не сохраняет новое состояние, то вполне вероятно, что он сможет не заметить изменений вообще. Ещё раз, он делает diff, а не пишет лог изменений. Для второго используется auditd.

> Смысл использования опции READ_ONLY в том, что состояние файловой системы,
> которое записано в базе данных osec, мы считаем эталонным. В этом случае мы
> вправе ожидать, что integrity check будет выводить предупреждение всякий
> раз, когда состояние отличается от эталонного, вне зависимости от того,
> сколько раз integrity check запускалась до этого, правда?

Нет. как я показал выше.

> Иначе имеем парадоксальную ситуацию: integrity check сначала предупреждает
> нас о нарушении целостности, но при повторном прогоне говорит, что всё в
> порядке! В этом случае мы можем не то, что информацию о времени изменения
> потерять, а и совсем не узнать о том, что были произведены какие-то
> незапланированные изменения: если мы пропустим первый и единственный (!)
> отчёт, в котором говорилось о нарушении целостности. То есть, если мы
> допускаем обновление эталона вместе с генерацией отчёта, то а) имеем
> единственный шанс отследить изменение (если потеряли письмо, то всё); б)
> автоматически санкционируем любое изменение ФС.

Мне кажется ты неправильно понимаешь отчёты osec. Это отчёт об изменениях с предыдущего состояния в _базе_, а не все изменения, которые были произведены с файловой системой. Чувствуешь разницу ? Изменения на файловой системе могут привести к первоначальному состоянию базы и разницы в  отчётах не будет. Создание нового состояния базы как раз и фиксирует изменения на файловой системе.

Я бы ещё понял, если бы кому-то захотелось сохранять состояния базы как лог и строить отчёты между двумя разными выбранными состояниями, но для 
readonly я применения придумать не могу.
Comment 5 manowar@altlinux.org 2020-09-09 13:43:34 MSK
(In reply to Alexey Gladkov from comment #4)
> (Ответ для manowar@altlinux.org на комментарий #3)
> 
> с readonly:
> 
> # сron report in time T0
> /tmp/root	stat	changed	old mtime=1599644256.8696477030	new
> mtime=1599644350.1245606150
> /tmp/root/aaa	checksum	new	
> checksum=sha1:da39a3ee5e6b4b0d3255bfef95601890afd80709
> /tmp/root/aaa	stat	new	 uid=legion gid=legion mode=100644 inode=3144748
> mtime=1599644350.1245606150
> /tmp/root/bbb	checksum	changed	old
> checksum=sha1:da39a3ee5e6b4b0d3255bfef95601890afd80709	new
> checksum=sha1:adc83b19e793491b1c6ea0fd8b46cd9f32e592fc
> /tmp/root/bbb	stat	changed	old mtime=1599644273.2334569470	new
> mtime=1599644356.5204860570
> 
> # сron report in time T1
> /tmp/root	stat	changed	old mtime=1599644256.8696477030	new
> mtime=1599644387.9321198870
> /tmp/root/bbb	stat	changed	old mtime=1599644273.2334569470	new
> mtime=1599644382.8321793370
> 

  Я правильно понимаю, что содержимое aaa и bbb ты уже вернул к первоначальному
перед запуском T1? И поэтому контрольные суммы сходятся?

> Я могу сделать и так, что второй репорт будет совсем пустым.

  Для этого нужно сказать touch -m -d 1599644256.8696477030, верно? То есть
вернуть всё, как было, включая mtime?

> Если osec не сохраняет новое состояние, то вполне вероятно, что он сможет не
> заметить изменений вообще. Ещё раз, он делает diff, а не пишет лог
> изменений. Для второго используется auditd.
> ...
> Мне кажется ты неправильно понимаешь отчёты osec. Это отчёт об изменениях с
> предыдущего состояния в _базе_, а не все изменения, которые были произведены
> с файловой системой. Чувствуешь разницу ? Изменения на файловой системе
> могут привести к первоначальному состоянию базы и разницы в  отчётах не
> будет. Создание нового состояния базы как раз и фиксирует изменения на
> файловой системе.

  Я начинаю подозревать, что словом "изменение" ты называешь факт вмешательства
в систему. И по этой причине ты ставишь в пример ситуацию, когда вмешательство было,
но следы удалось замести. У нас же сложилась совершенно иная практика использования
osec.
  И, между прочим, я не совсем понимаю, почему, запуская osec.cron раз в сутки мы
должны рассчитывать на то, что злоумышленник не успеет за это время замести следы.
А если он их заметёт, тогда и запуск T0 ничего не покажет.

> Я бы ещё понял, если бы кому-то захотелось сохранять состояния базы как лог
> и строить отчёты между двумя разными выбранными состояниями, но для 
> readonly я применения придумать не могу.

  Требуется аналог git diff и git status, но для всей файловой системы. Представляешь,
как было бы весело, если бы git diff каждый раз автоматически делал git commit?
А osec.cron так сейчас и делает. Хочется его от этого отучить.
Comment 6 Alexey Gladkov 2020-09-09 14:28:01 MSK
(Ответ для manowar@altlinux.org на комментарий #5)
>   Я правильно понимаю, что содержимое aaa и bbb ты уже вернул к
> первоначальному
> перед запуском T1? И поэтому контрольные суммы сходятся?

В /tmp/root был файл `bbb` и он же был в индексе. В T0 я добавил `aaa` и изменил содержимое `bbb`, а в T1 я удалил `aaa` и вернул содержимое обратно в `bbb`.

>   Для этого нужно сказать touch -m -d 1599644256.8696477030, верно? То есть
> вернуть всё, как было, включая mtime?

Да.
 
> > Если osec не сохраняет новое состояние, то вполне вероятно, что он сможет не
> > заметить изменений вообще. Ещё раз, он делает diff, а не пишет лог
> > изменений. Для второго используется auditd.
> > ...
> > Мне кажется ты неправильно понимаешь отчёты osec. Это отчёт об изменениях с
> > предыдущего состояния в _базе_, а не все изменения, которые были произведены
> > с файловой системой. Чувствуешь разницу ? Изменения на файловой системе
> > могут привести к первоначальному состоянию базы и разницы в  отчётах не
> > будет. Создание нового состояния базы как раз и фиксирует изменения на
> > файловой системе.
> 
>   Я начинаю подозревать, что словом "изменение" ты называешь факт
> вмешательства
> в систему. И по этой причине ты ставишь в пример ситуацию, когда
> вмешательство было,
> но следы удалось замести. У нас же сложилась совершенно иная практика
> использования
> osec.

У кого у "нас" ?

>   И, между прочим, я не совсем понимаю, почему, запуская osec.cron раз в
> сутки мы
> должны рассчитывать на то, что злоумышленник не успеет за это время замести
> следы.
> А если он их заметёт, тогда и запуск T0 ничего не покажет.

osec сам по себе это просто довольно быстрая утилита для снятия состояния метаданных файловой системы и ничего больше. Когда-то давно inger@ придумал вот такое применение этой утилиты для отслеживания закладок на файловой системе. Собственно это и делает osec-cronjob. Но это не единственное возможное примененение osec.

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

"Раз в сутки" это компромис, который был сделан ещё когда были hdd.

>   Требуется аналог git diff и git status, но для всей файловой системы.
> Представляешь,
> как было бы весело, если бы git diff каждый раз автоматически делал git
> commit?
> А osec.cron так сейчас и делает. Хочется его от этого отучить.

Ты как-то странно относишься к его отчётам. Если тебе очень нужно, то я не против добавить IMMUTABLE_DATABASE как интерфейс к опции -r хоть я и не вижу в этом пользы.
Comment 7 manowar@altlinux.org 2020-09-09 14:51:20 MSK
(In reply to Alexey Gladkov from comment #6)
> Ты как-то странно относишься к его отчётам. Если тебе очень нужно, то я не
> против добавить IMMUTABLE_DATABASE как интерфейс к опции -r хоть я и не вижу
> в этом пользы.

Да, добавь пожалуйста. Лично я бы предпочёл чтобы опция называлась READ_ONLY просто потому, что так она называется в CLI osec.
Comment 8 Alexey Gladkov 2020-09-09 15:48:30 MSK
(Ответ для manowar@altlinux.org на комментарий #7)
> Да, добавь пожалуйста. Лично я бы предпочёл чтобы опция называлась READ_ONLY
> просто потому, что так она называется в CLI osec.

Когда используется опция, то понятно в каком контексте имеется в виду read-only. В конфиге мне уже не настолько очевидно о чём речь.
Comment 9 Alexey Gladkov 2020-09-09 15:57:02 MSK
Вообще, мне кажется что, этот тип проверки системы немного подустарел.
Comment 10 manowar@altlinux.org 2020-09-09 16:24:19 MSK
(In reply to Alexey Gladkov from comment #8)
> (Ответ для manowar@altlinux.org на комментарий #7)
> > Да, добавь пожалуйста. Лично я бы предпочёл чтобы опция называлась READ_ONLY
> > просто потому, что так она называется в CLI osec.
> 
> Когда используется опция, то понятно в каком контексте имеется в виду
> read-only. В конфиге мне уже не настолько очевидно о чём речь.

Может, пусть тогда будет READ_ONLY_DATABASE?
Мне было бы удобно определиться с названием сейчас, чтобы потом, когда выйдет новая версия, не менять его в обёрточных скриптах.
Comment 11 Repository Robot 2020-09-29 23:24:09 MSK
osec-1.3.1-alt1 -> sisyphus:

 Tue Sep 29 2020 Alexey Gladkov <legion@altlinux.ru> 1.3.1-alt1
 - New version (1.3.1);
 - Cronjob changes:
   + Add config parameter to disallow database changes (ALT#38903).
   + Summarize more types of changes in the report (ALT#38771).
 - Fixed extra space in the reported string.
 - contrib: Add systemd-specific files.