Как я могу установить пароль для команды 'rm'?

29

Мои друзья продолжают удалять мои файлы с помощью терминала. Поэтому, пожалуйста, помогите мне, объяснив, как сделать пароль для rmкоманды.

Aswin
источник
50
Вы захотите защитить паролем учетную запись пользователя, чтобы эти «друзья» не обращались к ней в первую очередь.
Андреа Лаззаротто
14
Вы должны действительно попытаться узнать, как работает система и использовать ее функциональные возможности.
AlexP
13
Скорее всего, ваши друзья пытаются «преподать вам урок», используя ваш компьютер, когда вы оставляете его без присмотра. Изучите этот урок, защитив свою учетную запись и запретив гостевой доступ или предоставив гостевой доступ с ограниченными разрешениями.
Кен Уильямс
4
Пожалуйста, также помните о unlinkкоманде. Также о mvкоманде, потому что вы можете эффективно перезаписать файлы с ней. Также ...
Кос
17
С такими друзьями, которым нужны враги?
kasperd

Ответы:

46

Нет простого способа установить такой пароль в самой rmкоманде, не без большого взлома кода, который, вероятно, сломает такие вещи, как apt-getустановка пакетов и удаление файлов, и заставит вас вводить пароль тысячу раз или потенциально нарушит работу доступ к команде людям, которым она понадобится (например, вам, чтобы удалить ваши собственные файлы). Вы можете сделать это, имея несколько учетных записей пользователей и несколько наборов разрешений доступа, и ограничив доступ к различным разделам данных, таким как ваш домашний каталог, чтобы они не могли получить к нему доступ.

(Другой вариант - отдельные учетные записи пользователей для каждого пользователя, а затем списки контроля доступа, как подробно описано в другом ответе, который был опубликован Videonauth )

Вот основная проблема - вы позволяете своим друзьям использовать вашу систему. Это имеет многочисленные последствия для безопасности: концепция «любой, кто имеет физический доступ к устройству, сможет управлять системой и выполнять любые задачи», - это мантра ИТ-безопасности, поэтому вы не «делитесь» доступом к физическим системам. кроме как с доверенным уполномоченным персоналом.


Единственный по- настоящему разумный способ сделать это - не дать своим друзьям доступ к вашему компьютеру и предоставить им «выделенную« гостевую »систему», которую они могут использовать, чтобы вы не особо заботились о файлах. Это самый «безопасный» способ сохранить ваши файлы в безопасности.


Конечно, если это не вариант, то ваш единственный действительно безопасный вариант - настроить несколько учетных записей пользователей, по одной для каждого пользователя, с разными домашними папками и не разрешать им доступ к вашему собственному домашнему каталогу или доступ к домашнему каталогу любого другого пользователя. каталоги. А затем держите все, что вы не хотите, чтобы они касались в вашем домашнем каталоге, и не давайте им sudoдоступ, rootпароль или не делитесь с ними своим паролем.

Вот как вы это сделаете:

Допустим, меня зовут «Foo», и я хочу, чтобы пользователь «Бар», мой друг, использовал мою систему, но не имел доступа к моим файлам. Первый шаг - запретить доступ к моей домашней директории кому-либо, кроме меня. Это позволяет другим пользователям не удалять ваши файлы, но также и предотвращать слежку за другими пользователями в вашем домашнем каталоге и просмотр того, какие вещи у вас есть в вашем домашнем каталоге:

chmod 750 /home/Foo

Вторым шагом является создание учетной записи пользователя для «Бар» (НЕ вводите то, что в скобках ниже, это только для информационных целей). Таким образом, мы можем убедиться, что у него есть свой отдельный набор прав доступа:

sudo adduser --create-home --user-group --shell /bin/bash Bar
sudo passwd Bar
(set a temporary password - you will not see characters as you type though)

Третий шаг является то ограничить их домашний каталог тоже , так что никто не может вмешиваться в их файлы либо. Это просто делает вещи равными.

sudo chmod 750 /home/Bar

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


ВСЕГДА ПОМНИТЕ ОБ ЭТОМ: Предоставляя кому-либо физический доступ к машине или доступ в целом, вы подвергаете свои файлы и данные риску. Это общепризнанный факт в мире информационной безопасности, и этот факт остается в силе. Предоставление вашим друзьям доступа к вашему компьютеру всегда будет подвергать риску ваши данные, поэтому либо предоставьте им свою собственную систему, с которой можно возиться, либо просто не предоставьте им доступ к вашему компьютеру.


Просто примечание о шифровании диска

Хотя шифрование диска работает хорошо, чтобы защитить ваши данные от третьих лиц, существуют ограничения.

  1. Если система включена, диск уже расшифрован, поэтому вы рискуете.
  2. В некоторых системах нарушены подходы шифрования диска. Например, некоторые системы Acer используют ваш пароль только для авторизации шифрования / дешифрования и используют жестко заданные пароли или используют слабое шифрование, которое легко взломать.
  3. Всегда есть способы взломать «ключи» или попытаться извлечь их из памяти сразу после выключения системы, но до того, как данные ОЗУ «ушли» или испортились. (Я не буду вдаваться в глубину на них, но эти риски делают существуют).
  4. Физический доступ к машине, независимо от того, зашифрована она или нет, всегда подвергает ваши данные риску. Не предоставляйте физический доступ (или удаленный доступ к сети) людям, которым вы не хотите предоставлять полный доступ к вашей системе.

Хотя Disk Encryption не решает эти проблемы, он ставит дополнительные уровни головной боли для субъекта угрозы. Кто-то, кто является плохим парнем, может сдаться, если он зашифрован, или он может вас замучить (очередь обязательна, комикс XKCD Security ).

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

Тем не менее, если ваша система не зашифрована, то этот раздел не имеет никакого отношения к вам.

Томас Уорд
источник
Мой ноутбук имеет зашифрованный жесткий диск. Предоставление другим людям доступа все еще является риском?
Тим
2
@Tim Да, если система включена и расшифрована. И даже когда он выключен, все еще возможно с правильной технологией, временем и преданностью находить ключи дешифрования, потенциально все еще сохраненные в RAM. Шифрование диска не является 100% защитой - есть способы обойти это, вопрос скорее в том, «готов ли плохой парень потратить на это столько времени и усилий». И, судя по вопросу OP, их система включена и не зашифрована (полностью или частично), поэтому существует риск удаления.
Томас Уорд
3
@Tim Чтобы добавить ответ Томаса, некоторые ноутбуки имеют сломанную реализацию шифрования диска (если вы полагаетесь на аппаратное FDE). Ноутбуки AFAIR Acer на самом деле не используют ваш пароль для шифрования, они используют его только для авторизации шифрования / дешифрования с помощью жестко закодированного пароля.
Гроностай
Данные всегда находятся под угрозой, если у ненадежного человека есть доступ к системе, зашифрованный или нет
Сергей Колодяжный
1
@LightnessRacesinOrbit apt-getработаетdpkg , которая запускает скрипты , которые часто используют rm. На моем блоке Xenial выводится cd /var/lib/dpkg/info; grep -P '\brm\b' *inst344 строки , из которых 333 выглядят как настоящие rmкоманды - только в установочных скриптах. grep -P '\brm\b' *rmпоказывает еще больше в сценариях удаления (чтобы удалить файлы конфигурации, а не файлы пакета).
Элия ​​Каган
19

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

Вам нужно контролировать доступ или просто предотвращать честные ошибки?

Предполагая, что ваши друзья знают, что вы не хотите, чтобы они удаляли ваши файлы, есть две возможности:

  1. Они могут делать это нарочно. В этом случае ваши друзья намеренно удаляют ваши файлы, и вы даже не можете доверять им, пытаясь выполнить ваши пожелания о том, как они обрабатывают ваши данные, когда они используют ваш компьютер. Единственное решение этой проблемы - использовать эффективную меру безопасности , как подробно объяснил Томас Уорд . Часто лучшая такая мера - не дать им пользоваться компьютером. Но заставить их использовать свои собственные учетные записи пользователей может обеспечить некоторую защиту.

  2. Они могут сделать это по ошибке. В этом сценарии ваши друзья чрезвычайно подвержены несчастным случаям, и они продолжают выполнять rmкоманды, которые они хотели бы, чтобы они не имели. Они хотят относиться к вам и вашим данным с уважением, но на практике им это плохо удается, потому что они продолжают выполнять неправильную команду, удаляя неправильный файл ... или что-то в этом роде. Хотя было бы неплохо поверить, что это именно то, что происходит, я предостерегаю вас от предположения, что люди, которые продолжают удалять ваши данные после того, как вы сказали им прекратить, работают без злой воли.

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

Если ситуация действительно №2 - ваши друзья не пытаются удалить ваши файлы, а просто нуждаются в помощи, чтобы случайно не удалить их, и единственный способ, которым они случайно удалили их, - это непреднамеренное неправильное использование небольшого количества команд (например rm) что у них есть определенные проблемы с правильным использованием - тогда методы в ответе Видеонавта могут быть полезны . Но вы должны понимать, что они не являются мерами безопасности, потому что rmкоманда является лишь одним из многих простых способов удаления файлов . Смотрите ниже для деталей.

Я рекомендую вам спросить себя: «Является ли моя ситуация в основном такой же, как если бы я, а не другие люди, которые используют мой компьютер, использовал rmнеправильно?»

Если ответ « нет» , то это вопрос информационной безопасности, и вам нужно запретить своим друзьям использовать вашу учетную запись. Если ответ « да» , то вы можете использовать те же подходы, которые использовали бы, если бы вы неправильно использовали rm:

  • Образование. Ваши друзья должны знать, что они делают и как этого избежать.
  • Интерфейс меняется. Не удаляя фактическую возможность удаления файлов (для чего требуются отдельные учетные записи пользователей), вы можете усложнить случайное удаление файлов, сделав так, что простой запуск без дополнительных действий не приведет к немедленному удалению . Ответ Видеонавта дает один подход к этому. В этом ответе я представляю другое.rm filefile

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

Сообщение rmперед удалением может помочь предотвратить некоторые ошибки.

Для того, чтобы помочь людям избежать случайного удаления файлов с rm, вы можете сделать оболочки псевдоним , который на самом деле работает . Передача флага заставляет его запрашивать пользователя перед удалением каждого файла (см. ).rmrm -i-irmman rm

Вы можете сделать это (для вашей учетной записи пользователя), добавив alias rm='rm -i'в свой файл .bash_aliasesили .bashrc. Смотрите этот вопрос и что один для деталей. Это вступит в силу для ваших недавно открытых оболочек bash.

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

  • Они могут выбрать удаление, когда будет предложено.
  • Они могут обходить псевдоним множеством способов, в том числе запускать /bin/rmили отключать его ( unalias rm).
  • Есть много ситуаций, когда расширение псевдонима не происходит , и в этих ситуациях rmне будет работать с -i.
  • Они по-прежнему могут удалять файлы, используя любой из методов, которые для этого не требуются rm(как в случае с подходом Видеонавта - см. Ниже).
  • Они по-прежнему могут повредить данные, не удаляя какие-либо файлы, например, перезаписывая их или иным образом изменяя их содержимое (как и в случае с подходом Videonauth).

Но если вам не нужна реальная безопасность (см. Выше), то это может быть путь. По сравнению с подходом, запрещающим вашим друзьям использовать предоставленную системой rmкоманду:

  • Aliasing rmк rm -iменее эффективным в предотвращении ошибок - пока они не двигаться дальше , используя другой метод для удаления файлов. В этот момент удерживать их от использования rmбудет совершенно неэффективно, даже если они не пытаются сделать что-то неправильное, поскольку, по-видимому, они будут использовать unlink(или любую из множества других команд, удаляющих файл) с равной легкомыслием.

  • С другой стороны, поскольку расширение псевдонимов происходит только в некоторых ситуациях - грубо говоря, при обычном интерактивном использовании оболочки - ваши друзья могут подумать, что они будут получать подсказки, когда они на самом деле не запрашиваются (поскольку команда находится в сценарий, например, или выпущенный из другой оболочки). Путь видеоавта не имеет этой проблемы, что является объективным преимуществом этого метода перед alias rm='rm -i'.

  • Когда скрипт выполняется, если он не написан специально для использования псевдонимов, ваши псевдонимы в нем не раскрываются. Это означает , что сглаживание rmдля rm -iочень маловероятно , чтобы сломать что - нибудь. Это объективное преимущество alias rm='rm -i'.

rm ничего не может сделать ни одна совершенно обычная программа.

В этом нет ничего особенного rm. Это удобный и самодокументируемый способ удаления файлов, поэтому ограничение доступа к нему может привести к поломке многочисленных скриптов, которые на него полагаются. Но это далеко не единственный способ удаления файлов - это обычная программа.

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

/usr/bin/sudoи /usr/bin/passwdможет сделать это, потому что у них установлен бит setuid , как показано в том, sчто появляется в крайнем левом столбце при запуске ls -l:

ek@Io:~$ type -a sudo passwd rm
sudo is /usr/bin/sudo
passwd is /usr/bin/passwd
rm is /bin/rm
ek@Io:~$ ls -l /usr/bin/sudo /usr/bin/passwd /bin/rm
-rwxr-xr-x 1 root root  60272 Feb 18  2016 /bin/rm
-rwsr-xr-x 1 root root  54256 Mar 29  2016 /usr/bin/passwd
-rwsr-xr-x 1 root root 136808 Aug 17 09:20 /usr/bin/sudo

Обратите внимание , что /bin/rmне имеет s: его права доступа -rwxr-xr-x, в то время как /usr/bin/passwdи /usr/bin/soиметь -rwsr-xr-xвместо этого. Это делает так, что независимо от того, кто запускает passwdили sudo, фактически, он работает от имени пользователя root, поскольку root является владельцем исполняемого файла. (Существует также бит setgid, который при установке запускает исполняемые файлы с идентификатором группы их владельца группы, а не идентификатора вызывающей стороны.)

За исключением любых уязвимостей безопасности, которые еще не были обнаружены (или которые были обнаружены, но еще не были исправлены) sudoи passwdявляются безопасными, потому что эти утилиты написаны очень тщательно, поэтому они могут делать только то, что разрешено вызывающей стороне сделать.

/bin/rmне работает таким образом. Это не setuid, потому что это не должно быть. Права доступа к каталогаминогда права доступа к файлам) определяют, какие файлы пользователь может удалить, и для этого ему не нужно становиться пользователем root. Просто чтобы быть совершенно ясным, пожалуйста, никогда не устанавливайте бит setuidrm . Последствия для безопасности были бы катастрофическими, с тех пор, независимо от того, кто работает rm, все равно , как если бы он запускал root! (Утилиты любят sudoи passwdпроверяют, кто на самом деле их запускает, и проверяют, что что-то разрешено, прежде чем делать это; rmтакого не делает)

Проверка, установлен ли бит setuid (или setgid) на исполняемом файле, покажет вам, есть ли вероятность того, что ограничение того, кто может его запускать, повысит безопасность. Исполняемые файлы, которые не имеют setuid (или setgid), не имеют какого-либо особого статуса, и любой может просто скопировать их и запустить копию, принести свою собственную копию с другого компьютера, написать скрипт или программу, которая делает то же самое, или использовать другая программа для этого.

Удаление файлов без rm

Очевидный способ удалить файл без rmUbuntu - это перейти к его местоположению в графическом браузере файлов (Nautilus, если вы используете Unity или GNOME Shell) и удалить файл. Существует также множество команд, которые можно использовать для удаления файла из терминала, даже не используя его rm.

Например, чтобы удалить файл, вызываемый foo.txtв текущем каталоге, следующие команды, которые работают из коробки в Ubuntu и не требуют доступа rm, достигнут этого. (Просто чтобы убедиться, я протестировал их на минимальной системе 16.04, установленной только со стандартными системными утилитами, после удаления /bin/rm.)

  • unlink foo.txt
  • busybox rm foo.txt
  • perl -e 'unlink("foo.txt")'
  • python3 -c 'import os; os.remove("foo.txt")'( pythonвместо python3старых версий)

Этот список, конечно, далеко не полный. Полный список таких команд невозможен. Предотвращение удаления файлов - это одна из вещей, для которой существуют отдельные учетные записи пользователей и разрешения для файлов и каталогов. Они работают очень хорошо, чтобы предотвратить это. Напротив, изменение rmкоманды (чтобы она требовала пароль или каким-либо другим способом) или ограничение доступа, чтобы rmвообще не помешать.

Элия ​​Каган
источник
2
Для фактического использования, я как GNU rm«s -Iвариант. Он запрашивает только удаление 4 или более файлов или рекурсивное удаление. Таким образом, вы не привыкли всегда использовать -f, \rmизбегать расширения псевдонимов или печатать yбез чтения. Но это все равно спасет вас от неверных опечаток, когда вы нажмете клавишу возврата, прежде чем вы захотите, или ваш глобус совпадет со многими файлами.
Питер Кордес
2
Еще один интересный способ отсоединения файлов: mv foo.txt /tmp/.goneзатем перезагрузите компьютер, отбросив резервные копии tmpfs /tmp. Или просто используйте, mvчтобы переименовать несколько файлов с одинаковыми именами, чтобы остался только последний. Или просто скрыть файлы, переименовав их с непонятными именами. Как указывается в первой части этого ответа, если вы пытаетесь защититься от злого умысла, а не от некомпетентности, вам нужно просто заблокировать людей из своего аккаунта.
Питер Кордес
16

Вы можете изменить разрешения для /bin/rmкоманды через следующую строку, чтобы предотвратить ее выполнение без доступа sudo:

sudo chmod 750 /bin/rm

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

Чтобы также запретить им использовать rmdirкоманду, которая является обычным способом удаления каталогов, вы можете установить разрешения таким же образом для пути к исполняемому файлу:

sudo chmod 750 /bin/rmdir

Напомним, что вы также можете использовать эти команды только с правами sudo.

Чтобы вернуть его обратно, если он вам не нравится или возникают другие проблемы, используйте 755дляchmod


Как отметил @muru, вышесказанное является очень грубым решением и может даже сломать системные службы, которые не работают с учетной записью root . Поэтому я добавляю сюда еще одну опцию, использующую ACL (списки контроля доступа), чтобы сделать то же самое и, вероятно, гораздо более безопасную ( хорошо читать, и вы можете пропустить включающую часть, потому что ACL обычно устанавливается в системах Ubuntu в настоящее время):

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

sudo setfacl -m u:<user-name>:- /bin/rm /bin/rmdir

Просто замените <user-name>фактические имена пользователей, которые вы хотите предотвратить использование файлов.

Как и при chmodиспользовании, используется setfacl -mдля предотвращения запуска определенных пользователей rmи rmdirприменяется только к тем системным командам. Это не мешает им удалять ваши файлы и папки в Nautilus или с помощью других команд терминала.

Объяснение:

  • -mфлаг означает , что для изменения файлов ACL.
  • первая часть изменений, uстенды для пользователя. Может иметь следующие значения uдля пользователя, gдля группы и oдля всех остальных
  • средняя часть <user-name>может содержать фактическое имя пользователя или имя группы в зависимости от того, что вы хотите изменить. Чтобы установить общие изменения, оставьте поле пустым.
  • третья часть содержит вид разрешений, которые вы хотите установить. Здесь, в примере, мы хотим вообще не устанавливать никаких разрешений, поэтому мы -также можем содержать следующие буквы rдля разрешений на чтение, разрешений wна запись и xдля выполнения.
Videonauth
источник
4
Было бы лучше использовать ACL, чем удалять разрешения на выполнение для других - любая системная служба, которая не запускается от имени пользователя root, теперь заблокирована.
Муру
2
sudo setfacl -m u:<username>:- /bin/rm /bin/rmdirIIRC. Вы можете проверить ACL сgetfacl /bin/rm /bin/rmdir
Muru
2
Единственный недостаток таких списков ACL - это плохо / сложно поддерживать их в долгосрочной перспективе. И невозможно поддерживать, если в системе нет отдельных пользователей для каждого человека, использующего систему. В противном случае это хорошая идея.
Томас Уорд
4
@DavidFoerster Да. Существует практически неограниченное количество способов удалить файлы без rm. Решение, которое Videonauth предоставил здесь, является возможным способом помочь пользователям, подверженным несчастным случаям, прекратить удаление материала, но он не обеспечивает никакой реальной безопасности (что может быть хорошо, если друзья ОП не умышленно пытаются подорвать желания ОП). , Videonauth: Я предлагаю отредактировать этот пост, чтобы он четко пояснил, что на самом деле он не мешает людям удалять файлы, поскольку им не нужна rmкоманда для этого. (Я воздерживаюсь от самостоятельного редактирования, если вы не хотите этого говорить.)
Элия ​​Каган,
1
Не забывайте, что Perl, Python и все компиляторы в системе позволяют другим пользователям также удалять файлы. Чтобы запретить пользователям удалять файлы, нужно больше, чем просто изменить разрешения для rmкоманды.
Джонатан Леффлер
8

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

Однако вы можете использовать псевдоним, чтобы изменить поведение команды rm. Пытаться:

alias rm="sudo -l >/dev/null && rm"

Что это делает, когда кто-то вводит команду rm, он запускает команду sudo -l. Эта команда заставляет пользователя вводить свой пароль. Если они понимают это правильно, он перечисляет их привилегии (мы отбрасываем этот вывод) и выходит со статусом 0, если они ошибаются, он существует с ошибкой.

Затем мы следуем команде sudo с «&&», которая выходит из следующей команды - в этом случае «rm» только в том случае, если предыдущая команда выходит со статусом 0 - то есть они получили правильный пароль.

Чтобы сделать это постоянным, включите команду alias в ~/.bashrc.

Обратите внимание, что это очень легко победить (например, они могут просто напечатать /bin/rm.

Ник Силлито
источник
5

Иногда это не наши друзья, мы наши худшие враги

Я написал скрипт для защиты паролем, rmкак запрошенный OP, но также внес изменения, чтобы предотвратить случайное удаление:

  • /
  • /Главная
  • / бен

Изменить: 5 марта 2017 - Изменить метод проверки, если работает в терминале.


Создать скрипт

Используйте gksu gedit /usr/local/bin/rmи скопируйте в эти строки:

#!/bin/bash

tty -s;
if [ "0" == "$?" ]; then Terminal="Y"; else Terminal="N"; fi

if [ $Terminal == "Y" ] ; then
    # Running from terminal don't allow delete of / or /toplevel directory even if sudo
    for i in ${@:1}
    do
        # Skip options -i -r -v -d 
        if [[ ${i:0:1} != "-" ]] ; then
            # if parameter doesn't begin with '-' it's file or directory, so get real path.
            fullname=$(realpath "$i" 2>&1) # No error messages if file doens't exist
            # We must have at least two `/` in the full path
            levels=$(echo "$fullname" | tr -cd '/' | wc -c)
            if (( $levels == 1 )); then # Test for 1, will be zero when file doesn't exist.
                echo "Attempting to remove top level directory '$fullname'"
                echo "Use 'sudo /bin/rm $@' instead."
                exit 1 # error
            fi
        fi
    done
fi


if [[ $(id -u) != 0 ]]; then # Only non-root processes enter password (ie "sudo rm ..." is ok)
  if [ $Terminal == "Y" ] ; then
  # Only running from a terminal needs password (ie not cron)

    # log rm usage to /var/log/syslog
    PARENT_COMMAND="$(ps -o comm= $PPID)"   
    logger "$PARENT_COMMAND"" - rm command was used on file: ""$fullname"

    # Get password
    Password=$(zenity --password --title="Password for rm")
    encryptPassword=$(echo -n "$Password" | md5sum)

echo "md5sum: $encryptPassword" # Comment out after viewing one time and updating line below.

    if [[ "$encryptPassword" != "d2c30dc65e59558c852ea30b7338abbe  -" ]]; then
        echo "Invalid password!"
        exit 1
    fi
  fi # non-terminals can't enter password.
fi # root doesn't need to enter password.

# Call REAL rm command with parameters passed to this wrapper sript
/bin/rm "$@"

exit 0

Измените пароль «WE2U» на что угодно и сохраните файл.

Отметить новый rmскрипт как исполняемый

Отметить новый rmскрипт как исполняемый с помощью:

sudo chmod +x /usr/local/bin/rm

Как это работает

пароль

Если пароль не WE2U , при первом запуске скрипта вы получите «неверный пароль» и отобразится ключ шифрования для введенного вами пароля. Скопируйте и вставьте этот ключ шифрования из терминала в скрипт. Затем закомментируйте строку с эхо, которое отображало ключ шифрования на терминале.

Потому что путь /usr/local/binв списке выше, чем /binнаша команда rmназывается. После получения действительного пароля он призывает /bin/rmсделать реальное удаление.

Как отметил Томас Уорд в другом ответе, если вы сделаете это, sudo apt-get install ...вас могут попросить ввести пароль тысячу раз. Скрипт проверяет, sudoиспользуется ли он, и не запрашивает пароль. Кроме того, если rmвызывается из приложения с графическим интерфейсом, пароль не требуется.

Скрипт вызывает loggerдля записи каждый раз, когда rmвызывался вручную с помощью терминала. Использование команды записывается в /var/log/syslog.

WinEunuuchs2Unix
источник
1
Вы можете замаскировать пароль, просто включив его хешированную версию в скрипт, а затем всякий раз, когда пользователь вводит пароль, он может просто хешировать его и сверять с жестко закодированным хешем.
InitializeSahib
В скрипт была добавлена ​​поддержка хеширования @InitializeSahib (шифрование).
WinEunuuchs2Unix
3

Другой альтернативой может быть создание резервных копий любых важных файлов в каталоге, к которому у пользователей без полномочий root нет доступа. Вы можете использовать rsyncили unisonсинхронизировать их автоматически, просто убедитесь, что по крайней мере один каталог в пути к месту назначения резервной копии принадлежит пользователю root и режиму 700. Однако это приведет к двум копиям всех файлов. Было бы безопаснее просто создать гостевого пользователя для него, за исключением того, что вам нужно всегда помнить, чтобы всегда блокировать или выходить из системы, прежде чем отдавать им компьютер или оставлять его без присмотра.

Random832
источник
3
Возможно, вы захотите указать, как избежать распространения удаления? И в идеале это способ выключения и включения, чтобы, когда пользователь делает что-то, что требует удаления, чтобы быть постоянным, оно является постоянным.
ostergaard
@ajostergaard Я думал, что всякий раз, когда он получает свой компьютер от друзей, он вручную проверяет, что ничего не пропало, и восстанавливает все, что есть. Но мой любимый инструмент - унисон, используемый в интерактивном графическом режиме, который позволяет легко видеть (и реверсировать) удаления.
Random832
2

Не прямой ответ на вопрос, который вы ищете, но:

Если ваши друзья удаляют ваши файлы с помощью rmкоманды, то либо ваши друзья либо некомпетентны, либо придурки, либо они фанаты BOFH , которые пытаются научить вас не оставлять сеансы вошедшими в систему и оставленными без присмотра. Во всех случаях решение одно и то же: не оставляйте сеанс в системе без присмотра .

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

Это также имеет то преимущество, что мешает «друзьям» перейти к следующему шагу. Вы также захотите «защитить паролем» mvкоманду, если они решат переместить ваши файлы в / dev / null, когда обнаружат, что простое удаление не дает желаемого результата? Когда вы в такой игре, единственный выигрышный ход - не играть.

Роб Моир
источник
1

У меня есть аналогичная возможность, которую я планировал. На файловом сервере, если основное хранилище фотографий доступно для записи, что кто-то в семье (менее технический или случайно) может что-то удалить, случайно перетащить в графический интерфейс, который перемещает каталог, или перезаписать оригинал отредактированной версией, а не переименовывать ,

Я понял, что могу защитить от этого, не делая разрешения недоступными для записи для всех остальных. ZFS делает периодические снимки, поэтому любое случайное удаление или перезапись могут быть отменены. (В отличие от резервной копии, снимок является легким и копируется при записи, поэтому он не увеличивает использование памяти).

ZFS является родным для FreeBSD. В Linux есть btrfs, у которого также есть снимки.

JDługosz
источник
0

Очень глупый обходной путь для очень глупой проблемы.

Если вы не хотите chmod rm, rmdirили mv(для mv filename /dev/null) или использование списков ACL, вы можете создать пользователя манекена с паролем никто кроме вас не знает и псевдоним каждую команду sudo [user], а затем сделать псевдонимы для каждой команды , что ваши друзья не знают , Таким образом, когда ваши друзья будут печатать, rmсистема запросит у них пароль (но, если вы укажете неправильный пароль, войдет неудачная попытка), и вы все равно сможете просто набрать rmaliasили что-то другое, что вы решите удалить файлы.

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

Энди
источник
Похоже, вы на правильном пути. Ваш ответ мог бы быть sudo [user]dummy user
улучшен, если подробно описать,
0

Если вы хотите защитить паролем rm, решением было бы создать оболочку для rm , которая требовала бы привилегий root, и в противном случае запросить пароль. (ПРИМЕЧАНИЕ. Эта оболочка может исчезнуть при обновлении или переустановке пакета coreutils .) Кроме того, обратите внимание, что это только защищает rm, есть еще много способов удалить файл.


Откройте терминал и станьте пользователем root. Затем бегите, sudo mv /bin/rm /bin/rmoldчтобы переместить старый рм в другое место.

Теперь беги sudo nano /bin/rm чтобы создать обертку.

В Nano введите следующее:

#!/bin/bash
/bin/rmold "$@"
exit "$?"

Затем удерживайте CTRLи нажмите Xдля выхода. Нажмите, Yкогда вам предложат, затем нажмитеENTER чтобы сохранить файл.

Наконец, нам нужно дать этому соответствующие разрешения:

sudo chmod a+x /bin/rm

И вот, пожалуйста.

InitializeSahib
источник
1
Если у вас нет веских причин, переменные скрипта всегда должны заключаться в кавычки: $@=> "$@". Здесь то, что вы предлагаете, является очень опасной версией оригинала и безопасной rm: что, если существует файл с именем foo -i -r *( -iдобавленный для защиты невинных пользователей)?
xhienne
В дополнение к- "цитированию, $@как говорит @xhienne, я настоятельно призываю вас четко предупредить читателей, что это вообще не обеспечивает никакой безопасности, поскольку существует много способов удаления файла. Один из них - позвонить rmold, но есть множество других способов, о чем говорится в других ответах и ​​комментариях к ним. (Даже тогда, это будет проблема , которая rmбудет чувствовать себя , как он удаляет файлы в качестве текущего пользователя - это называется без sudo, и нормальные rmработает как вызывающему - но делает это как корень Если они недавно sudoэд, они выиграли» не замечают, что они могут удалять системные файлы, даже если они знают об изменениях.)
Элия ​​Каган,