Bloquear comando específico no Linux para usuário específico

27

Como bloquear o comando, digamos, mkdirpara um usuário específico?

O que eu fiz acabou de criar uma função somente leitura e armazenar no perfil de usuários ~/.bashrc

/bin/mkdir() {
        echo "mkdir command not allow for you"

}

mkdir() {
        echo "mkdir command not allow for you"

}
./mkdir() {

        echo "mkdir command not allow for you"
}

readonly -f /bin/mkdir
readonly -f mkdir
readonly -f ./mkdir

Teste:

rahul@ubuntu:~$ cd /bin/
rahul@ubuntu:/bin$ ./mkdir /home/rahul/ggg
mkdir command not allow for you
rahul@ubuntu:/bin$ cd
rahul@ubuntu:~$ mkdir testing
mkdir command not allow for you
rahul@ubuntu:~$ /bin/mkdir testing
mkdir command not allow for you

Então, minha pergunta é: qual deve ser a maneira de conseguir isso? existe alguma ferramenta para isso?

Atualização 1 # Mas se o usuário for inteligente, ele poderá copiar o binário do mkdir, renomeá-lo e usá-lo. Então, como conseguir isso?

Rahul Patil
fonte
7
Seu exemplo falhará porque o usuário pode compilar o seu mkdire renomeá-lo, ou mesmo apenas copiar e renomear o binário existente. Além disso, há um shell embutido para substituir aliases e funções.
strugee
hmm isso está correto, então existe mesmo?
Rahul Patil
Também o usuário não precisa compilar ele pode facilmente copiar cp /bin/mkdir mkdir2, em seguida, usá-lo :(
Rahul Patil
Criar um diretório é uma tarefa tão comum / fundamental que existem várias maneiras de fazê-lo, e seria quase impossível bloquear todos eles (exceto se não permitir que o usuário crie arquivos; ou seja, proteger todos os diretórios contra ele). Por exemplo, cp -r /usr/local/lib gggcriará um diretório chamado ggg(contendo uma cópia do conteúdo /usr/local/lib, se houver, que o usuário poderá excluir). Você pode usar find / -type d -emptypara encontrar um diretório vazio para copiar.
G-Man diz 'Restabelecer Monica'

Respostas:

21

Não sei como fazer isso com o bash, mas conheço outro shell que restringe o ambiente do usuário: lshell (shell limitado) .

Uma rápida visão geral da configuração

Lshell é configurado através de um arquivo INI. Por padrão, ele mantém uma lista de permissões de comandos permitidos, mas pode ser facilmente configurada para proibir o usuário de usar um comando específico.

Esta configuração (padrão conf /etc/lshell.conf) proíbe o usuário foode usar mkdir:

[foo]
allowed = 'all' - ['mkdir', 'bash', 'sh', 'csh', 'dash', 'env']

Para configurar uma conta de usuário para usar lshell por padrão, você deve:

 chsh -s /usr/bin/lshell foo

Lshell pode fazer mais, como:

  • 3 níveis de granularidade: usuário, grupo, tudo.
  • Pode restringir o acesso a determinados caminhos no sistema.
  • Pode restringir o uso de certos caracteres (como |).
  • Pode restringir o uso de determinados comandos apenas no SSH.

E mais.

Atualização 1 # Resultado do teste adicionado:

rahul:~$ which bash
/bin/bash
rahul:~$ dd if=$(which bash) of=my_bash
*** forbidden syntax: dd if=$(which bash) of=my_bash
rahul:~$ bash
*** forbidden command: bash
rahul:~$ cp /bin/bash my_bash
*** forbidden path: /bin/bash
rahul:~$ /bin/bash
*** forbidden command: /bin/bash
rahul:~$ sh
*** forbidden command: sh
rahul:~$ dash
*** forbidden command: dash
rahul:~$ env bash
*** forbidden command: env
rahul:~$ cp /bin/mkdir mycreatedir
*** forbidden path: /bin/mkdir
rahmu
fonte
3
com allowed = 'all' - ['mkdir'], você não pode simplesmente executar bashe ser irrestrito novamente?
precisa saber é
3
Apenas sendo pedante, desculpe, mas ainda existem muitas maneiras de contornar as restrições impostas por essa lista, por exemplo dd if=$(which bash) of=my_bash && chmod u+x my_bash && ./my_bash. Eu acho que o problema é a falta de uma política padrão restritiva, ou seja, nesse cenário, você concede permissões por padrão e, em seguida, nega as permissões com base em uma lista, quando deve ser o contrário: DENY por padrão e depois GRANT com base na política .
Dawud
11
@dawud: Concordo que manter uma lista de permissões de comandos permitidos é uma abordagem melhor do que ter uma lista negra e esperar que o usuário não a contorne, enganando o administrador.
rahmu
2
@Marco, verifique o exemplo fornecido na minha resposta. Eu forneço uma lista de permissões de comandos permitidos e, nesse cenário, o usuário não pode apenas cpum binário em seu PATH ( rootdiretório próprio, rxpara o usuário) e rbashimpede a execução ./executables. Responde a sua pergunta?
dawud 17/09/2013
2
@dawud Sim, é verdade. Perdi o diretório bin somente leitura.
Marco
15

A maneira como eu geralmente implemento esse tipo de restrição exige que várias condições sejam atendidas; caso contrário, a restrição pode ser facilmente contornada:

  • O usuário não pertence ao wheelgrupo, o único autorizado a usar su(imposto via PAM).
  • O usuário recebe uma proteção adequada rbashcom um PATH somente leitura que aponta para um privado ~/bin; esse ~/bin/diretório contém links para utilitários simples:

    $ ll ~/bin
    total 0
    lrwxrwxrwx. 1 root dawud 14 Sep 17 08:58 clear -> /usr/bin/clear*
    lrwxrwxrwx. 1 root dawud  7 Sep 17 08:58 df -> /bin/df*
    lrwxrwxrwx. 1 root dawud 10 Sep 17 08:58 egrep -> /bin/egrep*
    lrwxrwxrwx. 1 root dawud  8 Sep 17 08:58 env -> /bin/env*
    lrwxrwxrwx. 1 root dawud 10 Sep 17 08:58 fgrep -> /bin/fgrep*
    lrwxrwxrwx. 1 root dawud  9 Sep 17 08:58 grep -> /bin/grep*
    lrwxrwxrwx. 1 root dawud 10 Sep 17 08:58 rview -> /bin/rview*
    lrwxrwxrwx. 1 root dawud 13 Sep 17 08:58 rvim -> /usr/bin/rvim*
    lrwxrwxrwx. 1 root dawud 13 Sep 17 08:58 sudo -> /usr/bin/sudo*
    lrwxrwxrwx. 1 root dawud 17 Sep 17 08:58 sudoedit -> /usr/bin/sudoedit*
    lrwxrwxrwx. 1 root dawud 13 Sep 17 08:58 tail -> /usr/bin/tail*
    lrwxrwxrwx. 1 root dawud 11 Sep 17 08:58 wc -> /usr/bin/wc*
    
  • o usuário é dado um, somente leitura ambiente restrito (pense em coisas como LESSSECURE, TMOUT, HISTFILEvariáveis).

  • o usuário é mapeado para o usuário do SELinux staff_ue recebe direitos para executar comandos como outro usuário, conforme necessário sudo.
  • do usuário e /home, /tmppossivelmente, /var/tmpsão instituídos por meio de /etc/security/namespace.conf:

    /tmp       /tmp/.inst/tmp.inst-$USER-     tmpdir:create   root
    /var/tmp   /tmp/.inst/var-tmp.inst-$USER- tmpdir:create   root
    $HOME      $HOME/$USER.inst/              tmpdir:create   root
    

    Além disso, /etc/security/namespace.inittorna todos os arquivos esqueléticos somente leitura para o usuário e de propriedade de root.

Dessa forma, você pode escolher se $USERpode executar mkdirem seu próprio nome (por meio de um link no ~/bindiretório privado , provisionado por /etc/skel, como explicado acima), em nome de outro usuário (por sudo) ou nenhum.

dawud
fonte
4

Adicione um grupo fictício, adicione o usuário a esse grupo chown root:somegroup /bin/mkdir,, chmod g-x /bin/mkdir. Observe que isso depende do usuário não conseguir modificar seus grupos. IIRC isso é verdade no GNU / Linux, mas não em alguns outros Unices.

strugee
fonte
2
Na maioria dos sistemas de arquivos, você também pode usar ACLs estendidas para um controle mais refinado - o número de grupos necessários aumentaria exponencialmente com o número de usuários (devido a possíveis combinações), sem mencionar os problemas de nomenclatura.
Peterph
2
adicione mais um ponto, também remova a permissão de leitura de outros usuários 710, para que o usuário não possa copiar e renomear esse binário, não é?
Rahul Patil
11
@RahulPatil sim, e é claro que você também precisa restringir o uso de um compilador.
Peterph
1

O melhor que eu testei é usar Profile.d melhor e mais seguro

Etapa 1 (criar um arquivo de alias)

[root@newrbe ~]# vim /etc/customalias.sh

Adicionar linhas abaixo:

alias rm="echo remove contenet is restricted"
alias poweroff="echo Poweroff is restricted"
alias chmod="echo Change Permission is restristed"

Salvar e sair

Etapa 2 (Criar carregador de perfil)

/etc/profile.d/ este local contém arquivos para conclusão do bash

[root@newrbe ~]# vim /etc/profile.d/customsource.sh

Adicione abaixo das linhas abaixo dos arquivos que estas linhas bloquearão os comandos mencionados para os usuários abaixo

if [ `whoami` == "user1" ] && [ `whoami` == "user2" ]; then
    source /etc/customalias.sh
fi

salvar e sair

Agora Saia e faça login novamente

Atenciosamente, -Mansur

Mansur Ali
fonte
/etc/profile.d/não é para bashconclusão , é onde colocar as personalizações da sessão de login para usuários que usam shells de login do tipo POSIX; portanto, não é para onde as bashpersonalizações de alias (que prefeririam entrar /etc/bash.bashrc) iriam e deveriam ter uma sintaxe do shell POSIX (geralmente, em .vez disso) de sourcee em =vez de ==).
Stéphane Chazelas
-1

instale sudoers e tente configurar lá cujos usuários e que comando.

mark.praktisero
fonte
4
Bem-vindo ao SX. Por favor, adicione detalhes à sua resposta; o OP, ou qualquer outra pessoa que esteja lendo esta pergunta no futuro, pode não estar ciente sudo.
Joseph R.
Esta resposta está completamente errada
kiltek