Quali sono alcune possibili alternative per fornire una "Password amministratore" per un'applicazione desktop?

10

Attualmente sto gestendo e ri-factoring un pezzo di software che è stato utilizzato nella mia azienda per oltre un decennio. Uno degli elementi di questa applicazione è una sorta di modalità admin o power-user che fornisce cose come alcuni input addizionali / interni oltre alla possibilità di disattivare i limiti di input.

Storicamente questa modalità è stata attivata posizionando un file con un nome specifico in una posizione specifica nella directory di sistema di Windows (entrambi codificati nell'applicazione), il file viene chiamato 'something.DLL', anche se era un file ASCII vuoto e non una dll.

Quindi di recente ho aggiunto del codice e un piccolo modulo modale che consente all'utente di inserire una password amministratore per attivare questa funzionalità. È una password impostata, non specifica dell'utente. Quando viene immessa la password corretta, fa lo stesso con la creazione di un "file chiave" nella directory principale delle applicazioni in modo che il programma possa essere avviato in modalità amministratore se tale file è presente.

Ora il manager del dipartimento per cui questo software è per lo più non gradisce così tanto l'idea. Pensa che se abbiamo una semplice password preimpostata che sarà facilmente "fuori", e non vuole che gli utenti inesperti accedano a quelle funzioni extra.

Quindi la mia domanda è: quali altri metodi ci sono per fornire questo tipo di accesso che sarebbe un po 'più sicuro? È praticamente solo per me quando si tratta di mantenere e gestire questo software, quindi tutto ciò che non è completamente integrato o automatizzato non sarebbe di aiuto (come l'invio di richieste di "chiavi di licenza" o qualcosa del genere).

Note: questa applicazione è scritta in VB.NET (.NET 4.0) e attualmente sto pianificando di utilizzare la distribuzione click-once quando la nuova versione è terminata.

    
posta Anthony 24.09.2013 - 21:40
fonte

5 risposte

13

Se disponi di Active Directory, puoi provare l'appartenenza a un gruppo di 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;
    }
    
risposta data 24.09.2013 - 23:05
fonte
5

Il gestore ha ragione circa la password che sta per uscire . Non è questione di se, ma quando.

Poiché Active Directory non è un'opzione per alcuni utenti, è possibile creare un file di testo firmato con un elenco di nomi di accesso di Windows a cui è consentito l'accesso come superutente. Si presume che le persone non condividano computer o accessi.

I nomi utente andrebbero semplicemente in un file di testo facilmente distribuito che verrebbe inserito nella cartella dell'applicazione. La parte importante è firmare la lista dei nomi utente. Mantienilo molto semplice. Un nome utente per riga e inserisci l'hash sull'ultima riga. Inserisci una sorta di chiave segreta nel tuo programma binario e cancellala con i nomi utente. La chiave segreta impedirà alle persone di modificare il file e quindi di calcolare l'hash stesso (che probabilmente è di gran lunga azzerato per iniziare).

UserName1
UserName2
.
.
.
UserName34
<HashOfUserNamesAndSecretKey>

Questo, ovviamente, richiede che qualcuno da qualche parte agisca come amministratore della lista di utenti autorizzati. L'amministratore dovrebbe avere un programma (scritto da te!) Che genera il file e l'hash. Se non altro, potrebbe semplicemente prendere un file di testo di nomi utente e aggiungere l'hash.

Nell'interesse di essere accurato, qualcuno a cui è stato revocato l'accesso potrebbe prendere la copia del file che ha ancora il suo nome di login. Ogni volta che volevano l'accesso, potevano semplicemente mettere la loro copia sul posto. Probabilmente non è qualcosa di cui preoccuparsi, comunque.

    
risposta data 25.09.2013 - 04:10
fonte
3

Poiché Active Directory non è un'opzione, desidero eseguire la hash della data corrente. Utilizzare gli elementi con il maggior numero di entropia (giorno del mese) e quelli con meno entropia (anno). Se necessario, aggiungi un sale specifico del dominio (un ID cliente, il nome dell'azienda, ecc. Poiché è utilizzato al di fuori della tua azienda). Questo dovrebbe produrre una password molto diversa ogni giorno che è praticamente impossibile da indovinare per gli utenti finali e può essere diversa per le diverse aziende che utilizzano il software.

Questo è essenzialmente un problema di pollo e uova poiché il software deve essere in grado di autenticare l'utente senza telefonare a casa. Quindi crea un uovo con un meccanismo di cracking davvero oscuro: mentre la sicurezza attraverso l'oscurità non è una vera sicurezza, questo è il migliore che hai dato i parametri del tuo problema.

Questo è anche meglio che posizionare un file di testo da qualche parte: non è meglio di una password statica perché una volta che il segreto finisce, game over.

    
risposta data 25.09.2013 - 03:02
fonte
0

Utilizza elenchi di controllo di accesso .

Il modo rapido e sporco per farlo è quello di rimuovere tutte le autorizzazioni dalla directory dell'applicazione (comprese le autorizzazioni di lettura), quindi aggiungere queste autorizzazioni per gli utenti a cui è consentito eseguire l'applicazione. Ovviamente, un utente con permesso potrebbe altrettanto facilmente copiare la directory dell'applicazione in un luogo pubblico, ma è improbabile che ciò accada accidentalmente, mentre la condivisione delle password può facilmente verificarsi accidentalmente.

Ciò presuppone, naturalmente, che i computer coinvolti siano protetti (si spera con la directory attiva).

    
risposta data 24.09.2013 - 22:28
fonte
0

La mia preferenza è come suggerita da @Dan - usa la directory attiva. Se ciò non è possibile, può essere utile un generatore di password basato sul tempo. In una situazione simile, (molto lontano) una mia azienda per cui ho lavorato per 9999-MMDD. Questo è uscito dopo un paio di anni. Se hai gettato in hhmm e mescolato un po 'potresti ottenere un anno o due prima che qualcuno faccia uscire il gatto dal sacchetto.

Potresti sempre scrivere un programma che genera una password usando una strategia simile, ma più complessa. Inserisci anche il nome usato come nome della macchina. Il tuo manager può eseguire quel programma per ottenere la password corrente solo per quella macchina. Memorizza alcune informazioni nel file in modo che non siano valide se copiate su un'altra macchina o se un altro utente ha effettuato l'accesso. È quindi compito del tuo manager mantenere il programma sicuro e se il gatto esce, è colpa sua.

Questo schema è considerato debole e inaffidabile da una prospettiva cyrpto, ma è adeguato per il problema che hai.

    
risposta data 25.09.2013 - 00:32
fonte

Leggi altre domande sui tag