Impede que todos os comandos sejam definidos como um alias

9

Existe uma maneira de impedir que todos os comandos sejam definidos como um alias?

Por exemplo, um usuário não deve ser capaz de definir rm ou qualquer outro comando (comandos padrão do Ubuntu) como um nome de alias.

    
por αғsнιη 09.01.2016 / 18:13

4 respostas

23

Não há como impedir que um usuário defina os aliases que preferir. Considere:

  1. Você desativa aliases em /etc/bash.bashrc . Eles permitem isso onde quiserem.
  2. Você exclui todas as menções de aliases em /etc/bash.bashrc e todos os ~/.bashrc e ~/.bash_aliases por meio de um script. Eles colocam seus aliases em outro arquivo e o originam.
  3. Você executa um comando em PROMPT_COMMAND que desabilita certos aliases. Eles redefinem ou indefinem PROMPT_COMMAND .
  4. Você interceptou DEBUG e indefiniu aliases. Eles removem a armadilha.
  5. Você faz com que todos os arquivos sejam originados na chamada para o root. Eles usam outro arquivo e o originam manualmente como o primeiro comando que executam.
  6. Você desativa as coilins unset , builtin e enable ; faça alias uma função ; declare -rf alias para impedir que os usuários modifiquem a função; e exportar a função. Eles executam /bin/bash com --rcfile e --init-file para iniciar um novo shell, onde os referidos recursos estão ativados agora.
  7. ...

Você pode desabilitar aliases em tempo de compilação, então você deve manter o bash atualizado e ter certeza de que não será afetado pelo próximo Shellshock. Claro, os usuários poderiam construir seu próprio bash.

    
por muru 09.01.2016 / 18:48
9

TL; DR

A única maneira de impedir que um usuário crie aliases é fornecer a eles um shell que não suporte o alias. Este é geralmente um problema X / Y, onde X é realmente um modelo de ameaça que deve ser resolvido com controles ou arquiteturas apropriados ao invés de tentar resolver o problema post-facto depois que um usuário recebe um shell um sistema compartilhado.

Abaixo, eu forneço uma resposta tecnicamente correta, bem como algumas orientações sobre quais problemas isso irá resolver ou não. Eu também forneço algumas orientações adicionais sobre controles alternativos.

Usando o shell restrito ao Bash

Você pode usar o shell restrito do Bash, atribuindo o rbash como shell de login do usuário. Por exemplo:

foo:x:2001:2001:restricted user:/home/foo:/bin/rbash

Você deve então desabilitar o alias embutido para o usuário, de preferência sem quebrar o shell de todos os demais. Como exemplo, você pode adicionar o seguinte a um arquivo como /etc/profile.d/rbash.sh :

# Limit effect to users in a specific UID range.
if ((UID >= 2000)) && ((UID < 3000)); then
    # Check shell options; disable alias builtins when shell is restricted.
    if [[ $- =~ r ]]; then
        enable -n alias
        enable -n unalias
    fi
fi

Advertências

A menos que você tenha colocado o usuário em uma cadeia chroot ou tenha fornecido um PATH

modificado que não inclua acesso a outros shells, não há nada que impeça o usuário de simplesmente digitar bash em o prompt e obtendo um shell irrestrito.

Além disso, por design, o shell restrito impede muitas atividades comuns, como a alteração de diretórios:

$ cd /tmp
rbash: cd: restricted

mas não impede que outros scripts ou programas no PATH façam isso. Isto significa que você tem que criar cuidadosamente o ambiente do usuário, e especificamente que você precisa impedir que eles modifiquem o PATH em seus arquivos de inicialização, porque mesmo que o rbash faça PATH somente leitura, ele faz isso após inicialização.

Melhores escolhas

Mesmo se você usar o rbash, será necessário fazer isso como parte de um conjunto mais amplo de controles. Alguns exemplos podem incluir:

  • Evite que usuários não técnicos ataquem acidentalmente comandos perigosos, fornecendo aliases padrão como rm -i , mv -i e cp -i no /etc/bash.bashrc arquivo.

    • Dado o seu exemplo original, esta é provavelmente a solução mais sensata.
    • Você pode combinar isso com enable -n alias , se quiser.
    • Isso não impedirá que os usuários qualificados alterem os aliases, mas isso pode ser suficiente para impedir que usuários não técnicos façam o que você está preocupado.
  • Permissões Unix tradicionais ou POSL ACLs para proteger arquivos e diretórios.

  • Logins que executam um único comando não interativo. Por exemplo:

    foo:x:2001:2001:run foo.sh:/home/foo:/usr/local/bin/foo.sh
    
  • Use comandos forçados SSH por chave. Por exemplo:

    # ~foo/.ssh/authorized_keys
    command="/usr/local/bin/foo.sh" [remainder of line]
    
  • Use o OpenSSH ForceCommand com um bloco de correspondência condicional.

  • Use ferramentas especiais como gitolite ou scponly projetado para seu caso de uso específico.

  • Use uma cadeia chroot .

  • Use a virtualização, como o Xen, o OpenVZ, o LXC, o VMware, o VirtualBox ou outras tecnologias para fornecer um ambiente separado.

Depois de definir com precisão o seu modelo de ameaça, você pode identificar os controles mais apropriados para o seu caso de uso. Sem um entendimento mais significativo de por que você quer evitar o aliasing (por exemplo, qual problema do mundo real ele resolve?), Você não pode selecionar os controles mais apropriados.

    
por CodeGnome 09.01.2016 / 21:12
5

Esse é um esforço sem sentido, como mostra a resposta de muru. Mas existem algumas opções, mas elas não são perfeitas.

De acordo com bash manual, as funções sempre têm precedência sobre os aliases, portanto, podemos fazer o seguinte:

xieerqi@eagle:~$ function alias { echo "Aliases are no-no" ; }
xieerqi@eagle:~$ alias TEST='rm'
Aliases are no-no

Você poderia colocar a definição de função no sistema .bashrc , no entanto, conforme apontado por especialistas, os usuários inteligentes encontrarão maneiras de obter aliases por meio da origem de um arquivo bashrc diferente, por exemplo.

Outra ideia que eu joguei é enable embutido. alias é um shell embutido e bash tem um comando enable que permite ativar ou desativar builtins. Por exemplo, aqui estou eu desabilitando alias .

xieerqi@eagle:~$ enable -n alias
xieerqi@eagle:~$ alias
No command 'alias' found, did you mean:
 Command '0alias' from package 'zeroinstall-injector' (universe)
alias: command not found
xieerqi@eagle:~$ alias TEST='rm'
No command 'alias' found, did you mean:
 Command '0alias' from package 'zeroinstall-injector' (universe)
alias: command not found
xieerqi@eagle:~$ enable alias
xieerqi@eagle:~$ alias
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'
xieerqi@eagle:~$ 

Mais uma vez, usando o systemwide bashrc é uma opção aqui.

    
por Sergiy Kolodyazhnyy 09.01.2016 / 19:00
0

Você poderia definir (em /etc/profile ) uma função chamada alias que faz a validação desejada (provavelmente usando type -p ) (afinal de contas "comandos padrão do Ubuntu" são "executáveis em $PATH ") antes de chamar o alias incorporado, MAS, como outros indicaram, seus usuários poderiam contornar isso. Por que não obter um conjunto diferente de usuários ou educá-los ("Definir um alias que substitui um comando é uma maneira muito boa de se fotografar no pé e causar confusão (por exemplo, por que ls solicita minha senha ?))?

    
por waltinator 09.01.2016 / 19:00

Tags