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?


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

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.


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.


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


/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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.