Impedir que todos os comandos sejam definidos como um alias

10

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 rmou qualquer outro comando (comandos padrão do Ubuntu) como um nome alternativo.

αғsнιη
fonte
O que você quer dizer exatamente? Você está procurando algo como um "bloco flexível" para impedir que você faça isso acidentalmente?
kos
4
Não sei ao certo qual é o objetivo de fazê-lo, mesmo que fosse possível.
muru
4
qual seria a lógica para isso? Isso não impede que um usuário digite o comando real ... por isso não vejo motivo para alguém precisar bloquear aliases?
Rinzwind 9/01/16
2
Como muru e Rinzwind disseram, qual é o objetivo? Os aliases não podem fazer coisas mais desagradáveis ​​do que as que um usuário já pode fazer, bloquear aliases apenas dificulta a vida do usuário. Além disso, seja qual for a solução (por exemplo, usando um apelido / função para substituir o incorporado), não consigo pensar em uma maneira de torná-lo não contornável pelos próprios usuários, a menos que seja bloqueando o seu ~/.bashrc.
kos
Não bloqueando todos os alias, apenas impeça que ele / ela não use os comandos padrão name como um nome alternativo. Eu sei que podemos escapar de aliases de várias maneiras, como usar \ com o mesmo comando com alias para executar o comando real. Isso é tudo
αғsнιη

Respostas:

24

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

  1. Você desativa os aliases em /etc/bash.bashrc. Eles o habilitam onde quiserem.
  2. Você exclui todas as menções de aliases em /etc/bash.bashrc, e tudo ~/.bashrce ~/.bash_aliasespor meio de um script. Eles colocam seus apelidos em outro arquivo e o originam.
  3. Você executa um comando PROMPT_COMMANDque desativa certos aliases. Eles redefinem ou indefinem PROMPT_COMMAND.
  4. Você intercepta DEBUGe define aliases. Eles removem a armadilha.
  5. Você exibe todos os arquivos originados na chamada para a raiz. Eles usam outro arquivo e o originam manualmente como o primeiro comando executado.
  6. Você desativar as builtins unset, builtine enable; faça aliasuma função ; declare -rf aliasimpedir que os usuários modifiquem a função; e exporte a função. Eles rodam /bin/bashcom --rcfilee --init-fileiniciam um novo shell, onde os ditos componentes internos estão agora ativados.
  7. ...

Você pode desativar os aliases no momento da compilação. Depende de você manter o bash atualizado e garantir que não seja afetado pelo próximo Shellshock. Obviamente, os usuários poderiam criar sua própria festança.

muru
fonte
4
Eu tinha um pouco de uma ideia engraçada embora: você pode de alias Alias: =)
Rinzwind
4
E eles unalias alias.
Muru
4
@ certo, mas você também pode usar o pseudônimo unalias: +
Rinzwind
8
@Rinzwind e eles correm \unalias unalias.
muru
10

TL; DR

A única maneira de impedir que um usuário crie aliases é fornecê-los com um shell que não suporta aliases. Geralmente, esse é um problema X / Y, em que X é realmente um modelo de ameaça que deve ser resolvido com controles ou arquiteturas apropriadas, em vez de tentar resolver o problema pós-fato depois que um usuário recebe um shell em um sistema compartilhado.

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

Usando o Shell Restrito do Bash

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

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

Você deve então desativar o alias embutido para o usuário, de preferência sem interromper o shell de todos os outros também. 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

Ressalvas

A menos que você tenha colocado o usuário em uma prisão chroot ou fornecido um PATH modificado que não inclui acesso a outros shells, não há nada que impeça o usuário de simplesmente digitar bashno prompt e obter um shell irrestrito.

Além disso, por design, o shell restrito impede muitas atividades comuns, como alterar diretórios:

$ cd /tmp
rbash: cd: restricted

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

Melhores escolhas

Mesmo se você usar o rbash, precisará fazê-lo como parte de um conjunto mais amplo de controles. Alguns exemplos podem incluir:

  • Impedir que os usuários não-técnicos de acidentalmente comandos perigosas invocando, fornecendo aliases padrão, tais como rm -i, mv -ie cp -ina /etc/bash.bashrc arquivo.

    • Dado o seu exemplo original, esta é provavelmente a solução mais sensata.
    • Você pode combinar isso com, enable -n aliasse quiser.
    • Isso não impedirá que usuários qualificados alterem os aliases, mas pode ser suficiente para impedir que usuários não técnicos façam o que quer que seja.
  • Permissões tradicionais do Unix ou ACLs POSIX 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 a opção OpenSSH ForceCommand com um bloco de correspondência condicional.

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

  • Use uma prisão chroot .

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

Depois de definir com precisão o seu modelo de ameaça, você poderá identificar os controles mais adequados para o seu caso de uso. Sem uma compreensão mais significativa do motivo pelo qual você deseja impedir o alias (por exemplo, que problema do mundo real ele resolve?), Não é possível selecionar os controles mais adequados.

CodeGnome
fonte
+1 em geral, mas também especificamente para classificar isso como um problema X / Y.
Joe
5

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

De acordo com o bashmanual, as funções sempre têm precedência sobre os aliases, portanto, poderíamos fazer o seguinte:

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

Você pode colocar a definição de função em todo o sistema .bashrc, no entanto, como o muru apontou, os usuários inteligentes encontrarão uma maneira de obter aliases adquirindo um bashrcarquivo diferente, por exemplo.

Outra idéia com a qual eu brinquei é enableincorporada. aliasé um shell embutido e bashpossui um bom enablecomando que permite ativar ou desativar os embutidos. Por exemplo, aqui estou eu desativando 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:~$ 

Novamente, usar todo o sistema bashrcé uma opção aqui.

Sergiy Kolodyazhnyy
fonte
Não bloquear todos apelido, só construiu-in comandos não de alias em si :)
αғsнιη
@ Afshin.Hamedi Bem, o que é um comando padrão? O que vem com o ubuntu? Isso significa que você precisaria ter uma lista de todos os comandos (arquivos binários) fornecidos com a instalação padrão. Então, toda vez que o usuário carrega o shell ou tenta criar um alias rm, ele verifica a lista. Considerando que as listas seria muito grande, que levaria muito tempo para iniciar, seus usuários vão reclamar com você muito e odeio você, como administrador do sistema :)
Sergiy Kolodyazhnyy
É uma pergunta divertida e incrível que você tem, eu gosto! O aliasing seletivo seria bom. Mas eu duvido que é possível, a menos que os desenvolvedores shell encontrar uma necessidade para que possa ser implementado :)
Sergiy Kolodyazhnyy
A ideia da função foi boa. Chegou mais perto.
muru
0

Você pode definir (in /etc/profile) uma função chamada aliasque realiza a validação que você deseja (provavelmente usando type -p) (afinal todos os "comandos padrão do Ubuntu" são "executáveis ​​em $PATH") antes de chamar o built-in alias, MAS, como outros já indicaram, seus usuários podem obter em torno disso. Por que não obter um conjunto diferente de usuários ou educá-los ("Definir um aliasque substitui um comando é uma maneira muito boa de se dar um tiro no pé e causar confusão (por exemplo, por que lssolicita minha senha?))?

waltinator
fonte