LINUX.ORG.RU

Как сделать защиту от rm -rf /* и иных вредоносных команд?

 ,


1

1

Дело такое: надо обезопаситься от вредоносных команд, а-ля rm -rf /*, chmod 777 / -R, dd if=/dev/urandom of=/dev/диск и других, которые поганят рут. Есть ли способ более радикальный, чем алиасы с автоматическим –preserve-root/др.? Заранее спасибо.



Последнее исправление: catweird (всего исправлений: 1)

Ответ на: комментарий от catweird

от своей глупости защиты нет. любую собственную заморочку ты также обойдешь своей же глупостью.
ну разве только ежеминутный инкрементальный бекап или log-структуированная фс или фс с CoW и т.д.

pfg ★★★★★
()
Последнее исправление: pfg (всего исправлений: 1)
Ответ на: комментарий от catweird

А что не так-то? Ты любой каталог можешь сделать RO:

$ cat /etc/fstab
*****
/usr    /usr        auto       bind                                           0       0
/usr    /usr        auto       bind,remount,nodev,ro              0       0
*****

И хоть об'rm-rf'ся.

YAR ★★★★★
()
Последнее исправление: YAR (всего исправлений: 1)

Можно попробовать что-то придумать на уровне shell, который будет разбирать команды и конкретные опасные переспрашивать. Но готовых решений, на сколько мне известно, нет.

Aceler ★★★★★
()
Ответ на: комментарий от catweird

что-ж, ладно. думаю стоит реально думать прежде чем вводишь

Кажется Шотс в книжке про командную строку рекомендует взять за строгое правило: прежде чем использовать команду rm с джокерными символами, всегда подставлять вместо неё echo или ls. Тогда можно голову не включать особо.

papin-aziat ★★★★★
()

Нормальных вариантов нет. Можно сделать какой-нибудь ZFS или btrfs и снапшоты снимать раз в час, ну или как-нибудь так. Но это тоже не очень-то консистентно будет. И от рандома в диск не спасёт Могу только посоветовать вырабатывать внутреннюю самодисциплину. Я за 20 лет ни разу такого не делал, например. Ну и бэкапы в любом случае.

Есть ещё вариант - абузить виртуальные машины или хотя бы контейнеры. Возможно я к нему приду в конце концов. То бишь на хосте стоит минимум, можно даже винду или мак, а вся работа в виртуалке. С ней всякие снапшоты снимать попроще обычно.

vbr ★★★
()
Последнее исправление: vbr (всего исправлений: 2)

В FreeBSD есть защита от дурака на этот случай. По дефолту стоит csh с настройками, снижающими возможность отстрелить себе яйца. =)

Но в линуксах тоже от патчей Бармина типа от некоторых защищаются. rm -rf / просто так не сработает почти нигде уже.

Clockwork ★★★★★
()
Последнее исправление: Clockwork (всего исправлений: 2)

mount /dev/brain /mnt/head

Если серьезно, то делать бекапы. Ну и современные реализации rm не позволяют рекурсивно выполнять эту операцию на корне.

hateWin ★☆
()

Не забывайте, у rm есть опция -i. Я пришёл к выводу, что лучше всего это: хранить настройки сервера где то ещё. Сложно, но можно восстановить. Хотя есть софт на пайтон, трэш кли, но я использую самописный скрипт на баш rmm. Он не удаляет, а перемещает данные в каталог по timestamp, время от времени чистит их. Бывало спасало от случайных удалений в консоли. Конечно, он не такой удобный, как rm, но всё таки.

azsx
()
Ответ на: комментарий от papin-aziat

Проект shellcheck.net, где проверяют ваши скрипты на ошибки, тоже предлагает некоторые методы защиты, Use cd … || exit in case cd fails.

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

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

 Чтобы избежать этого, убедитесь, что вы обрабатываете случаи, когда cd терпит неудачу.  Способы сделать это включают

  -  cd foo || exit as suggested to abort immediately, reusing exit code from failed cd command
  -  cd foo || { echo "Failure"; exit 1; } abort with custom message
  -  cd foo || ! echo "Failure" omitting "abort with custom message"
  -  if cd foo; then echo "Ok"; else echo "Fail"; fi for custom handling
  -  <(cd foo && cmd) as an alternative to <(cd foo || exit; cmd) in <(..), $(..) or ( )

krasnh ★★★
()
Ответ на: комментарий от Panika

Если задача делать это интерактивно(то есть защищать только вводимые непосредственно пользователем команды, а не запускаемые им внешние скрипты), то можно поступить например так:

unset rm
ORIG_RM="$(type -p rm)"
function rm() {
        [[ $* == *"-rf "* ]] && echo "No!" && return 1
        ${ORIG_RM} $*
}

Пихаешь это в .bash_profile выбранного пользователя и наслаждаешься. По вкусу можешь приправить проверкой на интерактивность шелла.

Pinkbyte ★★★★★
()
Последнее исправление: Pinkbyte (всего исправлений: 1)
Ответ на: комментарий от Pinkbyte

Если я,например, хочу удалить /var/lib/pacman/local/, а функция мне этого не даст и я не узнаю, что случится. В случае переименования она бы просто переименовала каталог и дала бы мне «насладиться» результатом. Я бы даже расмотрел вариант с альтарнативой rm, которая может помещаться удаляемое в корзину, из которой можно будет все это восстановить.

Panika
()
Ответ на: комментарий от amd_amd

Ну тогда только вариант с пиханием подобного скрипта куда-нибудь в /usr/local/bin/rm и глобальной сменой PATH(если нужно)

Опять же - не защитит от скриптов, которые вызывают rm по полному пути(/bin/rm)

Pinkbyte ★★★★★
()
Последнее исправление: Pinkbyte (всего исправлений: 1)
Ответ на: комментарий от IIIypuk

Ты серьёзно пути вводишь руками, не используя автодополнение по Tab?

Плюсую.

Tab это не только дополнение, но и проверка. Приучился дополнять табом последнюю букву любого пути, даже самого короткого - опечаток стало сильно меньше. Когда не дополняет - значит что-то не так

GPFault ★★
()
Ответ на: комментарий от krasnh

я имею ввиду исключительно автодополнение при вводе с нуля для защиты от опечаток. Tab всё же не серебряная пуля.

Когда что-то скопировано из источника информации - там шанс именно опечаток всё ж существенно меньше чем при вводе, так как как правило при занесении в источник информации оно было скопировано с рабочего варианта, а не напечатано.

Ещё из полезного - не добавлять rm в историю команд чтоб не вызвать его случайно zsh - не добавлять в историю определённые строки (комментарий)

оказывается уже 16 лет прошло с того вопроса…

GPFault ★★
()
27 сентября 2022 г.

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

Применительно к файловым менеджерам/оболочкам это достигается разными методами, от простой «корзины» (подмена удаления на перенос в папку), до продвинутых систем теневого копирования (как в VSS).

В случае Linux`а есть несколько вариантов (жаль, не идущих «из коробки»), например, периодический съём снимков rsnapshot или использование функциональности файловых систем таких как снапшоты LVM (естественно с их последующим резервным копированием) и btrfs. Альтернативно можно воспользоваться лёгкими и быстрыми системами резервного копирования, например, Duplicati.

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

raspopov
()
Ответ на: комментарий от raspopov

это все называется бекап. вариантов бекапа множество.
бекап можно сделать «изкаропки» но начнутся проблеммы «а почему у меня место кончается и как эту фигню отключить нахеръ».
в принципе, при правильной настройке хватит и файлового бекапа, без мудрений на уровне фс (CoWfs Logfs) и ниже фс (lvm).
еще один минус бекапа - с ними надо уметь работать. без умений это красивая сложная игрушка в руках обезъяны.

из плюсов правильно настроенный постоянно работающий бекап спасает от кучи неприятностей.

pfg ★★★★★
()
Последнее исправление: pfg (всего исправлений: 2)
Ответ на: комментарий от raspopov

обязательно должна быть реализована возможность отмены этих действий.

И как вы намереваетесь откатить secure erase накопителя (ssd)? В одной циферке опечатался и обнулил не то. Всякие удаления в корзину и прочие «страховки» ведут только к расхлябанности админа.

И ТС не про файловые менеджеры спрашивал, а про root-консоль.

И резервное копирование ничего не гарантирует. Сначала удалил не то, потом восстановил из копии не на тот раздел...

mky ★★★★★
()

Есть ли способ более радикальный,

Бэкапы, снапшоты или наличие больше одного компа :) когда система расходник — вообще не страшно что-то сломать

slackwarrior ★★★★★
()