Во времена динозавров, мне удалось поработать в профильных компаниях, которые занимаются информационной безопасностью и тестированием инфраструктуры клиентов на проникновение.



Однажды обратился клиент, которому злые лоси вынесли инфраструктуру. И когда мы полезли разбирать инцидент, на серверах отсутствовали логи, их просто не было. Их не удалили, их отключили. Тогда еще никто не парился со всякими ELK, да и может таких решений и не существовало вовсе.



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



И мне стало интересно, а как это провернуть? А если появился интерес, надо тыкать палкой.



Сейчас будем решать эту задачу. Как именно, понятия не имею. Будем экспериментировать.



Отключаем логирование



Цель - папка var/log всегда должна быть пустая и чтобы Linux машина не встала раком. Дополнительно обуздаем journald и history от bash.



Первое, что я проверил, удалил все и запретил вообще любую запись в var/log через chmod 000, но после перезагрузки сервера, всё вернулось на свои места. Права на папку стали 755. Однако…



Теперь попробуем установить на папку специальный атрибут:



sudo chattr +i /var/log




Перезагружаемся. Хе! Сработало. В папке пустота! На этом можно двигать задачу в done.



После установки этого атрибута, у тебя начнет сыпать ошибками apt, но пакеты оно будет ставить, так что имей это ввиду. Это фиксится добавлением строчки Dir::Log "/путь"; в apt.conf.d.



НО, не все так просто. Если ввести:



jorunalctl -f




Мы снова видим логи. Но теперь уже на экране. А раз они на экране, значит они где-то лежат и на диске. Давай искать.



Зачищаем этот системный журнал:



sudo journalctl --rotate && sudo journalctl --vacuum-time=1s




Ага, на экране видим путь, то что оно зачистило, это /run/log/journal/.



Зачистка это хорошо, но логи все равно будут писаться. Надо отключить эту шляпу на глобальном уровне.



Открываем файл /etc/systemd/journald.conf и добавляем:



Storage=none




Перезагружаем службу и удаляем остатки:



sudo systemctl restart systemd-journald

rm -R /run/log/journal/*




Теперь если ввести:



jorunalctl -f




Получим такое сообщение: No journal files were found. Прекрасно!



Так, если в системе установлен rsyslog или подобное, то дизейблим и его:



systemctl stop rsyslog

systemctl disable rsyslog




Основное сделали. Осталось логирование в .bash_history. Зачищаем и накидываем атрибут на запрет записи:



cat /dev/null > ~/.bash_history

sudo chattr +i ~/.bash_history

history -c && history -w``



Либо добавляем в .bashrc строчку: HISTSIZE=0, с ней будет нативнее и без костылей с атрибутом.



Делаем финальную перезагрузку. Ну вот и всё, задача выполнена. Система зачищена от логирования. По любому я что-то упустил, поэтому жду с нетерпением твои комментарии.



Вообще все эти способы очень грубые и топорные. Было бы намного изящнее сделать решение, которое удаляет из логов только то, что нужно удалить. Логирование работает в штатном режиме, но критичные данные в логи не попадают.



Всех обнимаю, хорошего дня!



Прошу отметить, что предоставленная здесь информация предназначена исключительно для образовательных и информационных целей. Я не призываю и не одобряю незаконные действия, и использование этой информации для незаконных целей запрещено. Читатели должны соблюдать законы своей страны и использовать свои навыки с уважением к этическим нормам и законам.



tags: #bash #linux



💩 @bashdays