Como permitir a saída de apenas determinados scripts para gravar em um diretório?

1

Eu gostaria de permitir que um usuário execute uma coleção de scripts e grave a saída em um diretório designado, mas não permita que o diretório designado seja gravado com qualquer outro script ou comando para esse usuário.

A intenção é rsync que o diretório designado fora do sistema, mas apenas para scripts aprovados. O usuário pode executar outros scripts sem restrições, mas é impedido de exportar a saída fora do ambiente, exceto para scripts aprovados.

Tente resolver o problema

Eu tentei configurar dois usuários 'normal' e 'restrito' com o diretório de saída e scripts aprovados pertencentes a 'restricted', então 'normal' executa os scripts como 'restrito' permitindo que a saída vá para o diretório restrito e isso funciona, mas não há nada que impeça que 'normal' execute um script não-aprovado como 'restrito', permitindo que a saída vá para o diretório 'restrito', que é o que desejo evitar.

    
por DavidC 08.11.2016 / 17:37

3 respostas

4

Veja o que você pode fazer:

Você precisará de dois usuários 'normal' e 'restrito', mas não forneça a senha para o usuário restrito ao usuário normal. Então ligue:

visudo 

Adicione todos os scripts que você deseja que o usuário normal execute como usuário restrito assim:

normal ALL=(restricted) NOPASSWD: scriptDir/script.sh

Então deixe o usuário normal chamando os scripts como:

su -c scriptDir/script.sh restricted

Dessa forma, você pode controlar o script que deseja que o usuário execute normalmente como restrito

    
por 12.11.2016 / 14:37
1

Configure a lista ACL - Access Control instalando os utilitários (getfacl e setfacl).

Você pode definir ACLs por usuário, mas geralmente é mais fácil colocar usuários que devem ter os mesmos direitos em uma parte do sistema de arquivos em um grupo e definir ACLs para esse grupo. Por exemplo, se os usuários do grupo html-writers tiverem acesso de leitura / gravação à árvore em / var / www / html

Você pode usar setfacl:

setfacl -m grupo: html-writers u: nome de usuário: rwx myfolder

Isso define permissões para usuários específicos, sem alterar a propriedade do diretório.

    
por 14.11.2016 / 05:30
1

Parece que você está tentando resolver um problema usando ferramentas que não permitem fazer o que você deseja. Se você depender de permissões de ACLs ou Unix, as permissões referentes ao diretório dependerão do usuário que está tentando alterá-las. Portanto, independentemente de como você o corta, se um usuário puder gravar no diretório, ele poderá criar arquivos além daqueles que você deseja criar.

No entanto, se o usuário não puder gravar no diretório, mas desejar que um script seja capaz, você deverá executar esse script como um usuário que possa. Isso pode ser feito de duas maneiras, se você deve usar um script, então, como mencionado pelo @Wissam Al-Roujoulah, você pode usar o sudo. Se você puder obter o comportamento pretendido em um binário, em vez de um script, poderá usar setuid nele e configurá-lo para que qualquer membro de um grupo possa executar o binário, mas esse binário será executado como um usuário diferente.

O problema com o sudo nos scripts é o mesmo que o motivo pelo qual você não pode usar o setuid em um script. É simplesmente fácil demais para alguém perverter o comportamento de um script, usando variáveis de shell, portanto, aja com cautela.

Eu resolvi minha própria versão do seu problema escrevendo um arquivo .c bem básico que executa comandos do sistema como um script, depois o binário compilado, setuid para permitir que os usuários o usem. No meu caso, eu queria limpar as pastas de cache de vários locais, onde as necessidades binárias eram executadas como root, mas queria que os usuários não privilegiados pudessem executá-las.

Recortei bastante o arquivo, já que minhas opções originais incluíam a limpeza de vários tipos diferentes de cache, em locais diferentes, mas você teve a ideia. Eu também incluí o código que eu usei para auditar o log, pois ele mostra como colocar informações no syslog, se você quiser usar isso em vez de um arquivo.

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#include <syslog.h>

int has_root_euid()
{
  if (geteuid()==0) {
    return 1;
  }
  return 0;
}

int main (int argc, char * argv[])
{
  int retval;
  uid_t uid;

  uid = getuid();

  openlog (argv[0], LOG_CONS | LOG_PID | LOG_NDELAY, LOG_LOCAL1);
  syslog (LOG_NOTICE, "UID %d ran clearcache", uid);
  closelog();

  if (!has_root_euid()) {
    printf("Insufficient permissions to clear WSDL cache.\n");
  } else {
    printf("Clearing WSDL cache: rm -f /tmp/wsdl*\n");
    setuid(0);
    retval = system("rm -f /tmp/wsdl*");
    setuid(uid);
    printf("System returns (%d). \n", retval);
  }
  return 0;
}
    
por 15.11.2016 / 15:28