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 alternativo.
~/.bashrc
.
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 alternativo.
~/.bashrc
.
Respostas:
Não há como impedir que um usuário defina os aliases preferidos. Considerar:
/etc/bash.bashrc
. Eles o habilitam onde quiserem./etc/bash.bashrc
, e tudo ~/.bashrc
e ~/.bash_aliases
por meio de um script. Eles colocam seus apelidos em outro arquivo e o originam.PROMPT_COMMAND
que desativa certos aliases. Eles redefinem ou indefinem PROMPT_COMMAND
.DEBUG
e define aliases. Eles removem a armadilha.unset
, builtin
e enable
; faça alias
uma função ; declare -rf alias
impedir que os usuários modifiquem a função; e exporte a função. Eles rodam /bin/bash
com --rcfile
e --init-file
iniciam um novo shell, onde os ditos componentes internos estão agora ativados.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.
unalias alias
.
\unalias unalias
.
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.
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
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 bash
no 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.
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 -i
e cp -i
na /etc/bash.bashrc arquivo.
enable -n alias
se quiser.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.
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 bash
manual, 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 bashrc
arquivo diferente, por exemplo.
Outra idéia com a qual eu brinquei é enable
incorporada.
alias
é um shell embutido e bash
possui um bom enable
comando 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.
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 :)
Você pode definir (in /etc/profile
) uma função chamada alias
que 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 alias
que substitui um comando é uma maneira muito boa de se dar um tiro no pé e causar confusão (por exemplo, por que ls
solicita minha senha?))?