Permitir que usuários criem contas com segurança

3

1) Estou com dificuldades para encontrar uma maneira segura de permitir que novos usuários criem contas sem conceder a eles direitos de administrador para fazer isso. Se você já tem uma conta no meu sistema e pode trabalhar na linha de comando do UNIX, então você pode usar programas como o puTTY para acessá-la. Atualmente, estou criando um programa que permite a você transferir arquivos visualmente de um lado para o outro, com um layout semelhante ao da caixa de depósito. No entanto, gostaria de adicionar um recurso "Criar novo usuário" e não sei como fazer isso com segurança.

Claro, posso fazer o programa executar algo como "sudo adduser jim" e fornecer a senha sudo, mas isso exigiria que eu incluísse uma senha administrativa no arquivo jar. Eu sei que existem programas de ofuscação por aí, mas isso não significa que seja necessariamente mais seguro. Eu prefiro criar usuários com ssh, mas estou aberto para o que funciona e é seguro.

2) Eu apenas pensei em algo. E se eu criasse um usuário administrativo com sua capacidade sudo limitada a apenas criar novos usuários? Isso soa como uma solução razoavelmente segura? Se sim, como devo fazer isso? Se não, quais são os contras desse método?

EDIT: Esta é a minha solução até agora: supondo que eu ter higienizado entradas eu vou fazer um script que terá o primeiro argumento como um nome de usuário e o segundo como a senha, em seguida, defina suas permissões (setuid bit) para ser não-gravável, e quando as contas não-root o executam, eles têm permissão para executar isso e SOMENTE isso com privilégios de root. Aqui está o código mais básico até agora:

adduser --disabled-password --gecos "" "$1"
echo "$1":"$2" | chpasswd

O que você acha? Como você acha que eu posso melhorar isso?

    
por Blake 31.08.2013 / 00:32

2 respostas

1

Existem várias maneiras de fazer isso, mas eu escreveria um pequeno programa ou script que incluísse as informações do usuário e executasse adduser . O programa seria de propriedade de root, com o setuid bit set.

Mantenha o mais simples possível. Se você não higienizar sua entrada corretamente, você pode ter uma falha de segurança. Adicionar usuários a um sistema é um negócio perigoso, de qualquer maneira. O legal dessa estratégia é que todo o seu executável não precisa ser executado como root, apenas o script / programa que adiciona o usuário.

EDITAR:

No que diz respeito à entrada de santificação, a maneira como você faz isso depende de como você implementa o programa. Se você escrever em C, use a função execve () em vez de system (). Há um ótimo documento com exemplos de falhas de limpeza que podem ser exploradas no CERT . Se você estiver escrevendo em Python, prefira o módulo de subprocesso para system () por motivos semelhantes. p>

Eu higienizaria retirando todos os caracteres que não sejam letras ou números, a menos que você tenha uma necessidade específica. Os usuários estão criando senhas? Se assim for, isso torna mais difícil. A chave é que você não quer que eles sejam capazes de passar quaisquer caracteres especiais para o shell ou programa sendo chamado que tenha um significado especial. Para bash, alguns óbvios são $ , ; , && . Para o mysql, você deve evitar no mínimo ' , " e ; .

Infelizmente, a higienização pode ser uma tarefa difícil. Se você puder enumerar todos os valores que seus usuários podem precisar usar, sugiro usar uma lista de permissões.

    
por 31.08.2013 / 01:04
2

Se o seu único problema com sudo é ter que usar uma senha, você pode adicionar a tag NOPASSWD no seu arquivo sudoers . Você quer

some_user ALL = (ALL) NOPASSWD:/path/to/adduser
    
por 31.08.2013 / 01:01