Como posso configurar uma senha para o comando 'rm'?

29

Meus amigos continuam excluindo meus arquivos usando o terminal. Então, por favor me ajude explicando como criar uma senha para rmcomando.

aswin
fonte
50
Você deseja proteger com senha a conta do usuário para que esses "amigos" não acessem em primeiro lugar.
Andrea Lazzarotto
14
Você deve realmente tentar aprender como o sistema funciona e usar sua funcionalidade.
AlexP
13
É provável que seus amigos estejam tentando "ensinar uma lição" brincando com seu computador quando você o deixa desprotegido. Aprenda essa lição protegendo sua conta e proibindo o acesso de visitantes ou fornecendo acesso de visitantes com permissões reduzidas.
Ken Williams
4
Por favor, lembre-se também do unlinkcomando. Também sobre o mvcomando, porque você pode efetivamente sobrescrever arquivos com ele. Também ... #
2727 Kós
17
Com amigos como esses, quem precisa de inimigos?
kasperd

Respostas:

46

Não há uma maneira fácil de configurar essa senha no rmpróprio comando, não sem muita invasão de código que provavelmente quebrará coisas como apt-getinstalar pacotes e remover arquivos e fazer com que você precise digitar a senha mil vezes ou potencialmente interromper acesso ao comando para as pessoas que iria precisar dele (como você, para apagar seus próprios arquivos). Você pode fazer isso com várias contas de usuário e vários conjuntos de permissões de acesso e restringindo o acesso a diferentes seções de dados, como o diretório inicial, para que eles não possam acessá-lo.

(A outra opção são contas de usuário individuais para cada usuário e, em seguida, Listas de controle de acesso, conforme detalhado na outra resposta publicada pela Videonauth )

Aqui está o problema principal - você está deixando seus amigos usarem seu sistema. Isso tem inúmeras implicações de segurança - o conceito de "qualquer pessoa com acesso físico à caixa poderá controlar o sistema e executar tarefas" é um mantra de segurança de TI, e é por isso que você não 'compartilha' o acesso a sistemas físicos exceto com pessoal autorizado confiável.


A única maneira realmente sensata de fazer isso é não permitir que seus amigos acessem seu computador e dar a eles um 'sistema "convidado" dedicado "que eles possam usar, que você não se importa muito com os arquivos. Essa é a maneira mais 'segura' de manter seus arquivos seguros.


Obviamente, se essa não é uma opção, sua única opção realmente segura é configurar várias contas de usuário, uma para cada usuário, com pastas pessoais diferentes e não permitir que eles acessem seu próprio diretório pessoal ou acessem a página inicial de qualquer outro usuário. diretórios. E, em seguida, mantenha tudo o que você não deseja que eles tocem no seu diretório pessoal e não lhes dê sudoacesso, rootsenha ou compartilhe sua senha com eles.

É assim que você faria isso:

Digamos que meu nome seja "Foo" e quero que o usuário "Bar", um amigo, use meu sistema, mas não acesse meus arquivos. O primeiro passo é negar o acesso a qualquer pessoa, menos eu, ao meu diretório pessoal. Isso permite que outros usuários não excluam seus arquivos, mas também impede que outros usuários vasculhem o diretório inicial e vejam que tipos de coisas você possui no diretório inicial:

chmod 750 /home/Foo

O segundo passo é criar uma conta de usuário para "Bar" (NÃO digite o que está entre parênteses abaixo, é apenas para fins informativos). Dessa forma, podemos garantir que ele tenha seu próprio conjunto separado de direitos de acesso:

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)

O terceiro passo é restringir o diretório inicial também para que ninguém possa acessar seus arquivos também. Isso está apenas tornando as coisas iguais.

sudo chmod 750 /home/Bar

Lave as mãos, lave-as bem e repita essas etapas para o número de usuários que tiver no sistema. Eles não poderão acessar seus arquivos e, como você não concederá privilégios de administrador, eles não poderão excluir seus arquivos sem tentar sudofazê-lo - já que você não permite isso, eles não podem toque suas coisas. E eles também não poderão ver seus arquivos, sem se tornarem superusuário, o que não acontecerá aqui.


SEMPRE LEMBRE ESTE: Ao dar a alguém acesso físico à máquina ou acesso em geral, você coloca seus arquivos e dados em risco. Esse é um fato amplamente aceito no mundo da segurança de TI e que continua verdadeiro. Dar aos seus amigos acesso ao seu computador sempre colocará seus dados em risco; portanto, dê a eles seu próprio sistema para mexer ou simplesmente não lhes dê acesso à sua máquina.


Apenas uma nota sobre criptografia de disco

Embora a criptografia de disco funcione bem para proteger seus dados de terceiros, há limitações.

  1. Se o sistema estiver ativado, o disco já está descriptografado, então você corre o risco.
  2. Alguns sistemas têm abordagens de criptografia de disco quebradas . Por exemplo, alguns sistemas Acer usam sua senha para autorizar apenas a criptografia / descriptografia e usam senhas codificadas, ou usam criptografia fraca que é facilmente quebrada.
  3. Sempre existem métodos para invadir as 'chaves' ou tentar extraí-los da memória logo após o desligamento do sistema, mas antes que os dados da RAM sejam 'apagados' ou deteriorados. (Eu não vou entrar em profundidade sobre estes, mas esses riscos fazer existem).
  4. O acesso físico à máquina, independentemente de o sistema estar criptografado ou não, sempre colocará seus dados em risco. Não dê acesso físico (ou acesso remoto à rede) a pessoas para as quais você não deseja potencialmente dar acesso total ao seu sistema.

Embora a Criptografia de Disco não resolva esses problemas, ela coloca camadas extras de dor de cabeça para um ator de ameaça. Alguém que é um cara mau pode desistir se estiver criptografado ou pode torturá-lo (fila obrigatória na banda desenhada do XKCD Security ).

Portanto, se seu sistema estiver criptografado, mas você permitir que outros usuários o usem, eles têm uma senha para descriptografar ou você está deixando seu laptop descriptografado para que eles possam fazer o SSH ou ter acesso físico. Nos dois casos, é ruim.

Dito isto, se o seu sistema não estiver criptografado, esta seção não será relevante para você.

Thomas Ward
fonte
Meu laptop possui um disco rígido criptografado. Permitir que outros acessem ainda é um risco?
Tim
2
@ Tim Sim, se o sistema estiver ligado e descriptografado. E mesmo quando está desligado, ainda é possível com a tecnologia, tempo e dedicação certos para encontrar chaves de descriptografia potencialmente ainda armazenadas na RAM. A criptografia de disco não é 100% de proteção - há maneiras de contornar isso, é mais uma questão de "O bandido está disposto a realmente dedicar tanto tempo e esforço a ele"? E, a julgar pela pergunta do OP, o sistema deles está ativado e não é criptografado (total ou parcialmente), portanto o risco de exclusão existe.
Thomas Ward
3
@ Tim Para adicionar à resposta de Thomas, alguns laptops quebraram a implementação da criptografia de disco (se você estiver usando o FDE de hardware). Os laptops AFAIR Acer realmente não usam sua senha para criptografia, eles apenas a autorizam a criptografar / descriptografar com senha codificada.
gronostaj
Os dados estão sempre em risco se a pessoa não confiável tem acesso a um sistema, criptografados ou não
Sergiy Kolodyazhnyy
1
O @LightnessRacesinOrbit apt-geté executadodpkg , que executa scripts que costumam ser usados rm. Na minha caixa Xenial, cd /var/lib/dpkg/info; grep -P '\brm\b' *instproduz 344 linhas , das quais 333 parecem reais usos do rmcomando - apenas nos scripts de instalação . grep -P '\brm\b' *rmmostra ainda mais em scripts de remoção (para excluir arquivos de configuração, não arquivos de pacote).
Eliah Kagan
19

Isso pode não ser realmente sobre o rmcomando, pois existem maneiras fáceis de excluir arquivos sem usá-lo . Se o problema é que seus amigos estão rmusando incorretamente o comando acidentalmente , soluções que restringem o uso desse comando especificamente ou o fazem funcionar de maneira diferente podem ser de alguma ajuda. Por outro lado, se o problema é que seus amigos estão deliberadamente tratando seus dados de uma maneira que você não deseja, é necessário implementar medidas de segurança reais e nenhuma solução que se concentre no rmpróprio comando (ou em qualquer conjunto de comandos discreto) irá mantê-lo seguro.

Você precisa controlar o acesso ou apenas evitar erros honestos?

Supondo que seus amigos saibam que você não deseja que eles excluam seus arquivos, há duas possibilidades:

  1. Eles poderiam estar fazendo isso de propósito. Nesse cenário, seus amigos estão excluindo deliberadamente seus arquivos e você nem pode confiar neles para tentar cumprir seus desejos sobre como eles tratam seus dados quando usam seu computador. A única solução para esse problema é usar uma medida de segurança efetiva real , como Thomas Ward explicou em detalhes . Geralmente, a melhor medida é impedir que eles usem o computador. Mas fazê-los usar suas próprias contas de usuário pode fornecer alguma proteção.

  2. Eles poderiam estar fazendo isso por engano. Nesse cenário, seus amigos são extremamente propensos a acidentes e continuam executando rmcomandos que gostariam que não tivessem. Eles querem tratar você e seus dados com respeito, mas são muito ruins na prática porque continuam executando o comando errado, excluindo o arquivo errado ... ou algo assim. Embora seja bom acreditar que isso é o que está acontecendo, aconselho você a não supor que as pessoas que continuam excluindo seus dados depois que você pediu para parar de operar estão operando sem má vontade.

    Além disso, mesmo que suas intenções sejam boas, fornecer contas de usuário separadas ainda é a maneira mais infalível de impedi-los de excluir seus arquivos, além de não permitir que eles usem seu computador.

Se a situação realmente for # 2 - seus amigos não estão tentando excluir seus arquivos, mas precisam de ajuda para não excluí-los acidentalmente , e a única maneira de excluí-los acidentalmente é através do uso indevido inadvertido de um pequeno número de comandos (como rm) que eles têm problemas específicos para usar corretamente - então as técnicas na resposta da Videonauth podem ser úteis. Mas você deve entender que elas não são medidas de segurança, porque o rmcomando é apenas uma das muitas maneiras fáceis de excluir arquivos . Veja abaixo os detalhes.

Eu recomendo que você se pergunte: "Minha situação é basicamente a mesma que se eu, e não as outras pessoas que usam meu computador, estivessem usando rm incorretamente?"

Se a resposta for negativa , é uma questão de segurança das informações e você precisa impedir que seus amigos usem sua conta de usuário. Se a resposta for sim , então você pode usar as mesmas abordagens que você usaria se você fosse a pessoa abusar rm:

  • Educação.Seus amigos precisam saber o que estão fazendo e como evitá-lo.
  • Alterações na interface. Sem tirar a capacidade real de excluir arquivos (o que requer contas de usuário separadas), você pode dificultar a exclusão acidental de arquivos, fazendo com que seja executado apenas por si só, sem nenhuma ação adicional, não será excluído imediatamente .rm filefileA resposta da Videonauth oferece uma abordagem para isso. Nesta resposta, apresento outra.

Mas mesmo que seus amigos não estejam tentando fazer algo errado, você ainda deve considerar tê-los usar suas próprias contas de usuário separadas . Isso ainda resolverá o problema - as mesmas medidas de segurança que protegem os dados da destruição deliberada também os protegerão da destruição não intencional. Mesmo sem intenção maliciosa, se alguém continuar fazendo algo que você não deseja, então você não pode confiar que ele se abstenha de fazer isso.

Fazer rm solicitação antes da exclusão pode ajudar a evitar alguns erros.

Para ajudar as pessoas a evitar a exclusão acidental de arquivos rm, você pode criar rmum alias de shell que realmente é executado rm -i. Passar o -isinalizador para fazer rmcom que ele solicite ao usuário antes de excluir cada arquivo (consulteman rm ).

Você pode fazer isso (para sua conta de usuário) adicionando alias rm='rm -i'ao seu arquivo .bash_aliasesou .bashrc. Veja esta pergunta e essa para detalhes. Isso entrará em vigor para suas conchas do bash recém-abertas.

Isso não fornece segurança real e também não é infalível para evitar erros, porque:

  • Eles podem optar por continuar com a exclusão, quando solicitado.
  • Eles podem ignorar o alias de várias maneiras, inclusive executando-o /bin/rmou dessalinizando-o ( unalias rm).
  • Existem muitas situações em que a expansão do alias não ocorre e, nessas situações rm, não será executada -i.
  • Eles ainda podem excluir arquivos usando qualquer uma das técnicas necessárias, o que não é necessário rm(como é o caso da abordagem da Videonauth - veja abaixo).
  • Eles ainda podem danificar os dados sem excluir nenhum arquivo, como sobrescrevê-los ou alterar seu conteúdo (como também é o caso da abordagem da Videonauth).

Mas se você não precisa de segurança real (veja acima), esse pode ser o caminho a seguir. Em comparação com a abordagem de impedir que seus amigos usem o rmcomando fornecido pelo sistema :

  • Alias rmpara rm -ié menos eficaz na prevenção de erros - até que eles usem alguma outra técnica para remover arquivos. Nesse ponto, impedi-los de usar rmserá totalmente ineficaz, mesmo se eles não estiverem tentando fazer algo errado, pois presumivelmente eles usarão unlink(ou qualquer um dos inúmeros outros comandos que removem um arquivo) com a mesma falta de consideração.

  • Por outro lado, como a expansão do alias ocorre apenas em algumas situações - grosso modo, o uso interativo comum do shell - seus amigos podem pensar que serão solicitados quando não forem realmente solicitados (porque o comando está em um script, por exemplo, ou emitido a partir de um shell diferente). A maneira da Videonauth não apresenta esse problema, que é uma vantagem objetiva desse método alias rm='rm -i'.

  • Quando um script é executado, a menos que seja escrito deliberadamente para usar aliases, seus aliases não são expandidos nele. Isto significa que aliasing rmpara rm -ié muito improvável que quebrar nada. Esta é uma vantagem objetiva de alias rm='rm -i'.

rm não pode fazer nada que nenhum outro programa perfeitamente comum não possa fazer.

Não há realmente nada de especial rm. É uma maneira conveniente e auto-documentada de remover arquivos; portanto, restringir o acesso a ele arrisca a quebra de vários scripts que dependem dele. Mas está longe de ser a única maneira de excluir arquivos - é apenas um programa comum.

Alguns comandos executam alguma tarefa que um usuário limitado (não raiz ) não pode executar sem executá-los. Por exemplo, sudopermite executar programas como outro usuário, após verificar se você tem permissão para fazê-lo. passwdedita o banco de dados em que as senhas dos usuários estão armazenadas, mas permite alterar sua própria senha (a menos que você seja root e, nesse caso, pode alterar a senha de qualquer pessoa).

/usr/bin/sudoe /usr/bin/passwdpode fazer isso porque eles têm o bit setuid definido, como mostra o sque aparece na coluna mais à esquerda quando você executa 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

Observe que /bin/rmnão tem s: suas permissões são -rwxr-xr-x, enquanto /usr/bin/passwde /usr/bin/sotêm -rwsr-xr-x. Isso faz com que, independentemente de quem execute passwdou sudo, na verdade, ele seja executado como usuário root, pois o root é o proprietário do executável. (Também há um bit setgid, que, quando definido, faz com que os executáveis ​​sejam executados com a identidade do grupo do proprietário do grupo, em vez da do chamador.)

Exceto por quaisquer vulnerabilidades de segurança que ainda não foram descobertas (ou que foram descobertas, mas ainda não foram corrigidas) sudoe passwdsão seguras porque esses utilitários são escritos com muito cuidado para que eles possam fazer apenas as coisas que o autor da chamada deve receber. façam.

/bin/rmnão funciona dessa maneira. Não está definido porque não precisa estar. Permissões de diretório (e ocasionalmente permissões de arquivo ) controlam quais arquivos um usuário pode excluir e não precisam se tornar raiz para fazê-lo. Apenas para ficar perfeitamente claro, nunca ative o bit setuidrm . As implicações de segurança seriam desastrosas, desde então, não importa quem execute rm, é como se a raiz o executasse! (Os utilitários gostam sudoe passwdverificam quem realmente os está executando e verificam se algo é permitido antes de fazê-lo; rmnão faz isso.)

A verificação se o bit setuid (ou setgid) está definido em um executável informará se restringir quem pode executá-lo tem uma chance de melhorar a segurança. Os executáveis ​​que não são setuid (ou setgid) não têm nenhum status especial e qualquer um pode simplesmente copiá-los e executá-los, trazer sua própria cópia de outra máquina, escrever um script ou programa que faça a mesma coisa ou usar outro programa para fazer isso.

Excluindo arquivos sem rm

A maneira óbvia de excluir um arquivo sem rmno Ubuntu é navegar para sua localização no navegador de arquivos gráfico (Nautilus, se você estiver usando o Unity ou o GNOME Shell) e excluir o arquivo. Também existem inúmeros comandos que podem ser usados ​​para excluir um arquivo de um terminal, sem nunca serem utilizados rm.

Por exemplo, para remover um arquivo chamado foo.txtno diretório atual, os seguintes comandos, que funcionam imediatamente no Ubuntu e não requerem acesso rm, o conseguirão. (Só para ter certeza, eu os testei em um sistema mínimo 16.04 instalado com apenas os utilitários de sistema padrão, após a exclusão /bin/rm.)

  • unlink foo.txt
  • busybox rm foo.txt
  • perl -e 'unlink("foo.txt")'
  • python3 -c 'import os; os.remove("foo.txt")'(em pythonvez de python3em versões mais antigas)

Naturalmente, essa lista está longe de estar completa. Nenhuma lista completa de tais comandos é possível. Impedir a exclusão de arquivo é uma das coisas que as contas de usuário separadas e as permissões de arquivo e diretório existem para alcançar. Eles funcionam muito bem para evitá-lo. Por outro lado, alterar o rmcomando (para exigir uma senha ou de qualquer outra forma) ou restringir o acesso para rmnão impedi-lo.

Eliah Kagan
fonte
2
Para uso real, eu gosto rmda -Iopção do GNU . Ele solicita apenas a exclusão de 4 ou mais arquivos ou a exclusão recursiva. Portanto, você não costuma usar sempre -f, \rmpara evitar a expansão de alias, ou digitar ysem ler. Mas ele ainda o salvará de erros de digitação, nos quais você pressiona return antes de pretender, ou seu glob corresponde a muitos arquivos.
Peter Cordes
2
Outra maneira interessante de desvincular arquivos:, em mv foo.txt /tmp/.goneseguida, reinicie, descartando os tmpfs que estavam fazendo o backup /tmp. Ou use apenas mvpara renomear vários arquivos com o mesmo nome, para que apenas o último seja deixado. Ou apenas oculte os arquivos renomeando-os com nomes obscuros. Como aponta a primeira parte desta resposta, se você está tentando se defender contra a malícia, e não a incompetência, basta bloquear as pessoas da sua conta.
Peter Cordes
16

Você pode alterar as permissões no /bin/rmcomando através da seguinte linha, o que impedirá sua execução sem acesso ao sudo:

sudo chmod 750 /bin/rm

Isso evita especificamente que eles usem o rmcomando fornecido pelo sistema. Você deve estar ciente de que isso não os impede de excluir arquivos de outras maneiras.

Para também impedir que eles usem o rmdircomando, que é uma maneira comum de excluir diretórios, você pode definir as permissões da mesma maneira em seu caminho executável:

sudo chmod 750 /bin/rmdir

Lembre que você também pode usar esses comandos apenas com direitos sudo.

Para alterá-lo novamente, se você não gostar, ou se ocorrerem outros problemas, use 755parachmod


Como o @muru apontou, a solução acima é muito grosseira e pode até interromper os serviços do sistema que não estão sendo executados na conta raiz . Portanto, adiciono aqui outra opção usando a ACL (listas de controle de acesso) para fazer o mesmo e provavelmente muito mais seguro ( bom para ler também e você pode pular a parte de habilitação porque a ACL geralmente está instalada nos sistemas Ubuntu atualmente):

Portanto, fazer o mesmo acima apenas para os usuários que você deseja bloquear seria

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

Apenas substitua <user-name>pelos nomes de usuário reais que você deseja impedir o uso dos arquivos.

Assim como em chmod, usar setfacl -mpara impedir a execução de usuários específicos rme rmdirse aplica apenas aos comandos fornecidos pelo sistema. Isso não os impede de excluir seus arquivos e pastas no Nautilus ou usando outros comandos do terminal.

Explicação:

  • o -msinalizador significa modificar os arquivos ACL.
  • a primeira parte da mudança, usignifica usuário. Pode ter os seguintes valores upara usuário, ggrupo e otodos os outros
  • a parte do meio <user-name>pode colocar o nome do usuário ou o nome do grupo real de acordo com o que você deseja alterar. Para definir alterações gerais, deixe em branco.
  • a terceira parte contém o tipo de permissão que você deseja definir. Aqui, no exemplo, queremos definir nenhuma permissão, então -, também podemos conter as seguintes letras rpara permissões de leitura, permissões wde gravação e xexecução.
Videonauth
fonte
4
Seria melhor usar ACLs do que remover permissões de execução para outros - qualquer serviço do sistema que não seja executado como root agora é deficiente.
Muru
2
sudo setfacl -m u:<username>:- /bin/rm /bin/rmdir, IIRC. Você pode testar a ACL comgetfacl /bin/rm /bin/rmdir
muru
2
A única desvantagem para ACLs como essa é que é ruim / complicado mantê-las a longo prazo. E impossível manter, se não houver usuários individuais no sistema para cada pessoa que estiver usando o sistema. Caso contrário, é uma boa ideia.
Thomas Ward
4
@DavidFoerster Sim. Há um número efetivamente ilimitado de maneiras de excluir arquivos sem rm. A solução que a Videonauth deu aqui é uma maneira possível de ajudar os usuários propensos a acidentes a parar de excluir coisas, mas não fornece nenhuma segurança real (o que pode ser bom, se os amigos do OP não estiverem tentando deliberadamente subverter os desejos do OP) . Videonauth: sugiro editar esta postagem para esclarecer com destaque que na verdade não impede as pessoas de excluir arquivos, pois não precisam do rmcomando para fazê-lo. (Estou abstendo-se de editá-lo eu mesmo, no caso de você não quer dizer isso.)
Elias Kagan
1
Não esqueça que Perl, Python e todos os compiladores do sistema também permitem que os outros usuários excluam arquivos. Impedir que as pessoas excluam arquivos requer mais do que apenas alterar as permissões no rmcomando.
Jonathan Leffler
8

Esta é uma resposta muito simples e interromperá alguém casualmente usando o comando rm sem fornecer uma senha. Não é uma solução segura e você deve implementar algumas das sugestões alternativas nas outras respostas.

No entanto, você pode usar o alias para alterar a maneira como o comando rm se comporta. Experimentar:

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

O que isso faz é quando alguém digita o comando rm, ele executa o comando sudo -l. Este comando força o usuário a inserir sua senha. Se eles acertarem, listarão seus privilégios (descartamos essa saída) e sairemos com o status 0; se eles errarem, existe um erro.

Em seguida, seguimos o comando sudo com um "&&", que sai do seguinte comando - neste caso, "rm" somente se o comando anterior sair com o status 0 - ou seja, eles obtiveram a senha correta.

Para tornar isso permanente, inclua o comando alias no ~/.bashrc.

Observe que isso é muito facilmente derrotado (por exemplo, eles podem simplesmente digitar /bin/rm.

Nick Sillito
fonte
5

Às vezes não são nossos amigos, somos nossos piores inimigos

Escrevi um script para proteger com senha rmcomo o OP solicitado, mas também fiz edições para impedir que você exclua acidentalmente:

  • /
  • /casa
  • / bin

Edit: 5 Mar 2017 - Altere o método de verificação se estiver executando no terminal.


Crie o script

Use gksu gedit /usr/local/bin/rme copie nestas linhas:

#!/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

Mude a senha "WE2U" para o que quiser e salve o arquivo.

Marcar novo rmscript como executável

Sinalize o novo rmscript como executável usando:

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

Como funciona

senha rm

A menos que a senha seja WE2U , na primeira vez em que você executar o script, você receberá "senha inválida" e a chave de criptografia da senha inserida será exibida. Copie e cole essa chave de criptografia do terminal no script. Em seguida, comente a linha com o eco que exibia a chave de criptografia no terminal.

Como o caminho /usr/local/biné mais alto na lista do que /binnosso comando rmé chamado. Depois de obter uma senha válida, ele solicita /bin/rma remoção real.

Como Thomas Ward apontou em outra resposta, se você fizer uma, sudo apt-get install ...poderá ser solicitada uma senha mil vezes. O script verifica se sudoé usado e não pede uma senha. Além disso, se rmfor chamado de dentro do aplicativo GUI, nenhuma senha será necessária.

O script chama loggerpara gravar sempre que rmfoi chamado manualmente usando o terminal. O uso do comando é registrado em /var/log/syslog.

WinEunuuchs2Unix
fonte
1
Você pode mascarar a senha simplesmente incluindo uma versão em hash no script e, sempre que o usuário digita uma senha, ele pode simplesmente hash e compará-lo com o hash codificado.
InitializeSahib
O suporte à senha do hash @InitializeSahib (criptografia) foi adicionado ao script.
WinEunuuchs2Unix 2/17/17
3

Outra alternativa seria criar cópias de backup de todos os arquivos importantes em um diretório ao qual os usuários não raiz não têm acesso. Você pode usar rsyncou unisonsincronizá-los automaticamente, apenas certifique-se de que pelo menos um diretório no caminho para o destino de backup seja de propriedade do modo 700 e raiz. Isso resultaria em duas cópias de todos os arquivos. Seria mais seguro criar um usuário convidado para ele usar, exceto que você sempre deve se lembrar de sempre bloquear ou sair antes de fornecer o computador ou deixá-lo sem supervisão.

Random832
fonte
3
Você pode indicar como evitar que a exclusão seja propagada? E, idealmente, uma maneira de desligar e ativar isso de modo que, quando o usuário estiver fazendo algo que exija que a exclusão seja permanente, ela seja permanente.
Ostergaard 27/12/16
@ajostergaard Meu pensamento era que sempre que ele recupera o computador de seus amigos, ele verifica manualmente se nada está faltando e restaura tudo o que existe. Mas minha ferramenta preferida é o uníssono usado no modo interativo da GUI, o que facilita a visualização (e a reversão) de exclusões.
Random832
2

Não é a resposta direta à pergunta que você está procurando, mas:

Se seus amigos estão excluindo seus arquivos usando o rmcomando, eles são incompetentes, idiotas ou são aspirantes a BOFH que estão tentando ensiná-lo a não deixar suas sessões logadas e sem supervisão. Em todos os casos, a solução é a mesma: não deixe sua sessão conectada e sem supervisão .

Isso tem a vantagem de não precisar se lembrar de fazer alterações especiais no sistema sempre que você atualiza ou adquire um novo sistema e também evita que scripts e outras coisas que você usa, que dependem de comandos que se comportam conforme o esperado, falhem de maneiras imprevisíveis.

Ele também tem a vantagem de impedir que "amigos" passem para o próximo passo. Você também deseja "proteger com senha" o mvcomando se eles decidirem mover seus arquivos para / dev / null quando descobrirem que uma simples remoção não faz o que eles querem? Quando você está em um jogo como esse, o único movimento vencedor é não jogar.

Rob Moir
fonte
1

Eu tenho uma possibilidade semelhante que planejei. No servidor de arquivos, se o armazenamento principal de fotos for gravável para que alguém da família (menos técnico ou acidental) possa excluir algo, arraste acidentalmente a interface gráfica que move o diretório ou substitua um original por uma versão editada em vez de renomear .

Percebi que posso me proteger contra isso sem tornar as permissões graváveis ​​para todos os outros. O ZFS faz instantâneos periódicos para que qualquer exclusão ou substituição acidental possa ser revertida. (Ao contrário de um backup, um instantâneo é leve e copia na gravação, para não multiplicar o uso do armazenamento.)

O ZFS é nativo do FreeBSD. O Linux possui btrfs, que também possui instantâneos.

JDługosz
fonte
0

Uma solução muito boba para um problema muito bobo.

Se você não quiser chmod rm, rmdirou mv(para mv filename /dev/null) ou uso de ACLs, você pode criar um usuário fictício com uma senha ninguém, mas você sabe e apelido de cada comando para sudo [user], em seguida, fazer aliases para cada comando que seus amigos não sabem . Dessa forma, quando seus amigos digitarem, rmo sistema solicitará uma senha (mas supor que a senha esteja errada registrará a tentativa com falha), e você ainda poderá digitar rmaliasou o que escolher para realmente excluir os arquivos.

Ou você pode simplesmente criar uma conta de convidado que não tenha acesso ao seu diretório pessoal.

Andy
fonte
Parece que você esta no caminho certo. Sua resposta pode ser melhorada, elaborando como configurar o alias, sudo [user]edummy user
WinEunuuchs2Unix 31/12/16
0

Se você deseja proteger a rm com senha, uma solução seria criar um invólucro para a rm que exigiria privilégios de root e solicitar uma senha caso contrário. (NOTA: Esse wrapper pode desaparecer quando o pacote coreutils é atualizado ou reinstalado.) Além disso, observe que isso apenas protege a rm, ainda existem muitas outras maneiras de excluir um arquivo.


Abra um terminal e torne-se root. Em seguida, corra sudo mv /bin/rm /bin/rmoldpara mover a antiga empresa para outro local.

Agora, execute sudo nano /bin/rmpara criar um wrapper.

No Nano, digite o seguinte:

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

Segure CTRLe pressione Xpara sair. Pressione Yquando for solicitado e pressione ENTERpara salvar o arquivo.

Por fim, precisamos conceder a isso as permissões apropriadas:

sudo chmod a+x /bin/rm

E lá vai você.

InitializeSahib
fonte
1
A menos que você tenha um bom motivo, as variáveis ​​de script sempre devem ser citadas: $@=> "$@". Aqui, o que você está propondo é uma versão muito perigosa do original e seguro rm: e se houver um arquivo nomeado foo -i -r *( -iadicionado para proteger os usuários inocentes)?
xhienne
Além de "citar $@como @xhienne diz, aconselho você a avisar claramente aos leitores que isso não oferece segurança, pois existem várias maneiras de excluir um arquivo. Uma é ligar rmold, mas há várias outras maneiras, conforme discutido em outras respostas e comentários sobre elas. (Mesmo assim, este terá o problema que rmvai se sentir como se apaga arquivos como o usuário atual - é chamado de sem sudo, e normal rmfunciona como o chamador - mas fá-lo como root Se eles já recentemente sudoed, eles ganharam' t perceber que pode ser a exclusão de arquivos do sistema, mesmo se eles sabem sobre a mudança).
Elias Kagan