Quais são algumas alternativas possíveis para fornecer uma 'Senha de administrador' para um aplicativo de desktop?

10

Atualmente, estou gerenciando e refatorando um pedaço de software usado em minha empresa há mais de uma década. Um dos elementos desse aplicativo é uma espécie de modo de administrador ou usuário avançado que fornece itens como entradas adicionais / internas, além da capacidade de desativar os limites de entrada.

Historicamente, esse modo foi ativado ao colocar um arquivo nomeado especificamente em um local específico no diretório do sistema Windows (ambos codificados no aplicativo), sendo o arquivo chamado 'something.DLL', mesmo que estivesse vazio Arquivo ASCII e não uma dll.

Recentemente, adicionei algum código e um pequeno formulário modal que permite ao usuário inserir uma senha de administrador para ativar essa funcionalidade. É uma senha definida, não específica do usuário. Quando a senha correta é inserida, ela faz a mesma coisa criando um 'arquivo-chave' no diretório raiz dos aplicativos, para que o programa possa iniciar no modo de administração, se esse arquivo estiver presente.

Agora, o gerente do departamento para o qual esse software se baseia não gosta tanto dessa ideia. Ele acha que, se tivermos apenas uma senha simples e predefinida, ela será facilmente 'divulgada' e ele não deseja que usuários inexperientes acessem esses recursos extras.

Então, minha pergunta é: que outros métodos existem para fornecer esse tipo de acesso que seria um pouco mais seguro? Sou praticamente eu quando se trata de manter e gerenciar esse software, então qualquer coisa que não esteja quase totalmente integrada ou automatizada não ajudaria (como enviar solicitações de 'chaves de licença' ou algo semelhante a isso).

Notas: Este aplicativo está escrito em VB.NET (.NET 4.0) e, atualmente, estou planejando usar a implantação de clique uma vez quando a nova versão for concluída.

Anthony
fonte
1
Alguém tem que decidir quais usuários são "inexperientes" e quais não são. Quem toma essa decisão? Quem tem que colocar essas decisões no sistema?
Doc Brown

Respostas:

13

Se você possui o Active Directory, pode testar a associação a um grupo do Active Directory:

public bool IsInADGroup(string ADGroupName)
    {
        bool result = false;
        List<string> myGroups = new List<string>();

        using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, SystemInformation.UserDomainName))
        {
            using (PrincipalSearchResult<Principal> src = UserPrincipal.FindByIdentity(pc, SystemInformation.UserName).GetGroups(pc))
            {
                src.ToList().ForEach(sr => myGroups.Add(sr.SamAccountName));
            }
        }
        result = myGroups.Contains(ADGroupName);
        return result;
    }
Dan Pichelman
fonte
Esta é uma resposta muito boa, e algo que definitivamente lembrarei para este e outros projetos. No entanto, o verdadeiro problema são os usuários deste programa fora da nossa empresa. Fornecemos para as empresas irmãs e para alguns usuários externos externos. Na verdade, estou pensando neste momento que será melhor desativar completamente esses recursos para quem está fora da nossa rede e usar sua sugestão para fins internos.
Anthony
5

O gerente está certo sobre a saída da senha . Não é uma questão de se, mas quando.

Como o Active Directory não é uma opção para alguns usuários, você pode criar um arquivo de texto assinado com uma lista de nomes de login do Windows aos quais é permitido acesso de superusuário. Isso pressupõe que as pessoas não estejam compartilhando computadores ou logins.

Os nomes de usuário iriam apenas para um arquivo de texto facilmente distribuído que seria colocado na pasta do aplicativo. A parte importante é assinar a lista de nomes de usuário. Mantenha isso muito simples. Um nome de usuário por linha e coloca o hash na última linha. Incorpore algum tipo de chave secreta no binário do seu programa e faça o hash com os nomes de usuário. A chave secreta impedirá que as pessoas modifiquem o arquivo e depois calculem o hash (o que provavelmente é absurdo para começar).

UserName1
UserName2
.
.
.
UserName34
<HashOfUserNamesAndSecretKey>

Obviamente, isso exige que alguém em algum lugar atue como administrador da lista de usuários autorizados. O administrador deve ter um programa (escrito por você!) Que gera o arquivo e o hash. Se nada mais, basta pegar um arquivo de texto de nomes de usuário e adicionar o hash.

No interesse de ser completo, alguém que tenha sido revogado pode acessar a cópia do arquivo que ainda possui seu nome de login. Sempre que quisessem acessar, eles poderiam simplesmente colocar sua cópia no lugar. Provavelmente não é algo para se preocupar, no entanto.

cutucar
fonte
3

Como o Active Directory não é uma opção, eu usaria hash na data atual. Use elementos com mais entropia primeiro (dia do mês) e aqueles com menos entropia no último (ano). Se necessário, adicione um sal específico do domínio (um ID de cliente, nome da empresa etc., pois ele é usado fora da sua empresa). Isso deve produzir uma senha muito diferente a cada dia, praticamente impossível para os usuários finais adivinharem, e pode ser diferente para diferentes empresas que usam o software.

Isso é essencialmente um problema de galinha e ovo, já que o software precisa ser capaz de autenticar o usuário sem ligar para casa. Portanto, faça um ovo com um mecanismo de quebra realmente obscuro: enquanto a segurança pela obscuridade não é uma segurança real, é o melhor que você forneceu os parâmetros do seu problema.

Isso também é melhor do que colocar um arquivo de texto em algum lugar: isso não é melhor do que uma senha estática, porque uma vez que o segredo é revelado, o jogo acaba.


fonte
0

Use Listas de controle de acesso .

A maneira rápida e suja de fazer isso é remover todas as permissões do diretório do aplicativo (incluindo a permissão de leitura) e adicionar essas permissões a todos os usuários que têm permissão para executar o aplicativo. Obviamente, um usuário com permissão pode copiar facilmente o diretório do aplicativo para um local público, mas é improvável que isso aconteça acidentalmente, enquanto o compartilhamento de senhas pode facilmente acontecer acidentalmente.

Isso pressupõe, é claro, que os computadores envolvidos estejam protegidos (espero que com o diretório ativo).

Brian
fonte
Se os computadores envolvidos estiverem protegidos com o diretório ativo, talvez seja melhor simplesmente proteger a funcionalidade avançada associando-se a um grupo de segurança. Os usuários podem ser adicionados ao grupo em um conforme a necessidade e do sistema de arquivos permissões são não relevantes
Kevin
@ Kevin: Concordo. Acho que a resposta de Dan cobre isso.
27713 Brian
0

Minha preferência é como @Dan sugeriu - use o diretório ativo. Se isso não for possível, um gerador de senhas com base no tempo pode ser útil. Em uma situação semelhante, (passado muito distante), em que minha empresa em que trabalhei usava o 9999-MMDD. Isso aconteceu depois de alguns anos. Se você jogou hhmm e misturou um pouco, você pode tirar um ou dois anos antes que alguém solte o gato na sacola.

Você sempre pode escrever um programa que gere uma senha usando uma estratégia semelhante, porém mais complexa. Coloque também o nome usado e o nome da máquina. Seu gerente pode executar esse programa para obter a senha atual dessa máquina. Armazene algumas informações no arquivo para que não sejam válidas se copiadas para outra máquina ou se um usuário diferente estiver conectado. Cabe a você gerenciar o programa para manter o programa seguro e se o gato sair, a culpa é dele.

Esse esquema é considerado fraco e não confiável da perspectiva do cyrpto, mas é adequado para o problema que você tem.

mattnz
fonte