LINUX.ORG.RU

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

 ,


0

1

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

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

Не, просто на днях случилась вот такая ситуация. Запустил sudo chmod 777 / home/bazman -R) случайно поставил пробел. Стоп, Никита, что ты тут забыл?

catweird ()
Ответ на: комментарий от 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)
Ответ на: комментарий от pfg

что-ж, ладно. думаю стоит реально думать прежде чем вводишь, как это советует sudo при первом запуске) тред можно смело закрывать. спасибо!

catweird ()

Маунть рутфс в рид онли. На запись только /var, /tmp и /usr.

untitl3d ()

Можно попробовать что-то придумать на уровне 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 ★★ ()

«Как сделать защиту от кувалды по материнской плате?»

Shadow ★★★★★ ()

Не забывайте, у 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 ()

Простите за то что вклиниваюсь, но возник вопрос про алиас на команду rm -rf. Можно ли как-нибудь сделать, что б при ее вводе каталог не удалялся, а переименовывался?

Panika ()
Ответ на: комментарий от 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)
Ответ на: комментарий от Qwentor

А если рукожоп это и есть админ? Что ж, теперь расстрелять его? А как же принципы гуманности? )

*админ = единоличный пользователь системы

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

Способы сделать это включают

Вместо этого списка костылей надо просто писать #!/bin/sh -e

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

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

Плюсую.

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

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

А как же без привычного Ctrl-c и Ctrl-v? Особенно, где-нибудь на левом ресурсе, а потом вставить у себя в терминале. :)

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

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

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

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

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

GPFault ★★ ()

обезопаситься можно поставив windows, настроив sudo на ограниченный список команд

s-warus ()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.