Welche möglichen Alternativen gibt es, um ein Administratorkennwort für eine Desktopanwendung bereitzustellen?

10

Derzeit verwalte und re-faktorisiere ich eine Software, die seit über einem Jahrzehnt in meinem Unternehmen verwendet wird. Eines der Elemente dieser Anwendung ist eine Art Administrator- oder Power-User-Modus, der zusätzliche / interne Eingaben sowie die Möglichkeit bietet, Eingabegrenzen auszuschalten.

In der Vergangenheit wurde dieser Modus aktiviert, indem eine Datei mit einem bestimmten Namen an einer bestimmten Stelle im Windows-Systemverzeichnis abgelegt wurde (beide wurden fest in der Anwendung codiert). Die Datei wurde "Something.DLL" genannt, obwohl sie leer war ASCII-Datei und keine DLL.

Deshalb habe ich kürzlich Code und ein kleines modales Formular hinzugefügt, mit dem der Benutzer ein Administratorkennwort eingeben kann, um diese Funktionalität zu aktivieren. Es ist ein festgelegtes Passwort, nicht benutzerspezifisch. Wenn das richtige Kennwort eingegeben wird, wird das Gleiche getan, indem im Stammverzeichnis der Anwendung eine 'Schlüsseldatei' erstellt wird, damit das Programm im Administratormodus gestartet werden kann, wenn diese Datei vorhanden ist.

Jetzt mag der Abteilungsleiter, für den diese Software hauptsächlich bestimmt ist, diese Idee nicht so sehr. Er glaubt, dass wenn wir nur ein einfaches, voreingestelltes Passwort haben, es leicht "rauskommt", und er möchte nicht, dass unerfahrene Benutzer auf diese zusätzlichen Funktionen zugreifen.

Meine Frage ist also, welche anderen Methoden gibt es, um diese Art von Zugang bereitzustellen, die etwas sicherer wäre? Es ist so ziemlich nur ich, wenn es um die Wartung und Verwaltung dieser Software geht. Alles, was nicht vollständig integriert oder automatisiert ist, würde also nicht helfen (z. B. das Senden von Anfragen nach 'Lizenzschlüsseln' oder ähnlichem).

Hinweise: Diese Anwendung ist in VB.NET (.NET 4.0) geschrieben. Derzeit plane ich die Verwendung der einmaligen Bereitstellung, wenn die neue Version fertig ist.

Anthony
quelle
1
Jemand muss eine Entscheidung treffen, welche Benutzer "unerfahren" sind und welche nicht. Wer trifft diese Entscheidung? Wer muss diese Entscheidungen in das System einbringen?
Doc Brown

Antworten:

13

Wenn Sie über Active Directory verfügen, können Sie die Mitgliedschaft in einer Active Directory-Gruppe testen:

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
quelle
Dies ist eine sehr gute Antwort, an die ich bei diesem und anderen Projekten auf jeden Fall denken werde. Das eigentliche Problem sind jedoch die Benutzer dieses Programms außerhalb unseres Unternehmens. Wir stellen es sowohl unseren Schwesterunternehmen als auch einigen externen Drittbenutzern zur Verfügung. Ich denke an dieser Stelle tatsächlich, dass es am besten ist, diese Funktionen für diejenigen außerhalb unseres Netzwerks vollständig zu deaktivieren und Ihren Vorschlag für interne Zwecke zu verwenden.
Anthony
5

Der Manager hat Recht, wenn das Passwort herauskommt . Es geht nicht darum, ob, sondern wann.

Da Active Directory für einige Benutzer keine Option ist, können Sie eine signierte Textdatei mit einer Liste von Windows-Anmeldenamen erstellen , denen Superuserzugriff gewährt wird. Dies setzt voraus, dass Benutzer keine Computer oder Anmeldungen freigeben.

Die Benutzernamen würden einfach in eine einfach zu verteilende Textdatei eingefügt, die im Ordner der Anwendung abgelegt würde. Der wichtige Teil ist das Signieren der Liste der Benutzernamen. Halte es sehr einfach. Ein Benutzername pro Zeile und setzen Sie den Hash in die letzte Zeile. Betten Sie eine Art geheimen Schlüssel in Ihre Programmbinärdatei ein und hashen Sie ihn mit den Benutzernamen. Der geheime Schlüssel verhindert, dass Personen die Datei ändern und dann den Hash selbst berechnen (was wahrscheinlich zunächst weit hergeholt ist).

UserName1
UserName2
.
.
.
UserName34
<HashOfUserNamesAndSecretKey>

Dies erfordert natürlich, dass irgendwo jemand als Administrator der Liste der autorisierten Benutzer fungiert. Der Administrator sollte ein Programm haben (von Ihnen geschrieben!), Das die Datei und den Hash generiert. Wenn nichts anderes, könnte es einfach eine Textdatei mit Benutzernamen nehmen und den Hash hinzufügen.

Im Interesse einer gründlichen Prüfung kann jemand, dem der Zugriff entzogen wurde, die Kopie der Datei abrufen, in der sich noch der Anmeldename befindet. Wann immer sie Zugang wollten, konnten sie einfach ihre Kopie anbringen. Wahrscheinlich kein Grund zur Sorge.

Sack
quelle
3

Da Active Directory keine Option ist, würde ich das aktuelle Datum hashen. Verwenden Sie Elemente mit der höchsten Entropie zuerst (Tag des Monats) und Elemente mit der geringsten Entropie zuletzt (Jahr). Fügen Sie bei Bedarf ein domänenspezifisches Salz hinzu (eine Kunden-ID, einen Firmennamen usw., da es außerhalb Ihres Unternehmens verwendet wird). Dies sollte jeden Tag ein ganz anderes Passwort ergeben, das für Endbenutzer praktisch nicht zu erraten ist, und es kann für verschiedene Unternehmen, die die Software verwenden, unterschiedlich sein.

Dies ist im Wesentlichen ein Henne-Ei-Problem, da die Software den Benutzer authentifizieren muss, ohne nach Hause telefonieren zu müssen. Machen Sie also ein Ei mit einem wirklich obskuren Cracking-Mechanismus: Während Sicherheit durch Dunkelheit keine echte Sicherheit ist, ist dies das Beste, was Sie den Parametern Ihres Problems gegeben haben.

Dies ist auch besser als das Platzieren einer Textdatei irgendwo: Das ist nicht besser als ein statisches Passwort, denn sobald das Geheimnis gelüftet ist, ist das Spiel vorbei.


quelle
0

Verwenden Sie Zugriffssteuerungslisten .

Der schnelle und schmutzige Weg, dies zu tun, besteht darin, alle Berechtigungen aus dem Anwendungsverzeichnis (einschließlich Leseberechtigung) zu entfernen und diese Berechtigungen dann für alle Benutzer hinzuzufügen, die die Anwendung ausführen dürfen. Natürlich kann ein Benutzer mit Berechtigung das Anwendungsverzeichnis genauso einfach an einen öffentlichen Ort kopieren, aber es ist unwahrscheinlich, dass dies versehentlich geschieht, wohingegen die Kennwortfreigabe leicht versehentlich erfolgen kann.

Dies setzt natürlich voraus, dass die beteiligten Computer gesichert sind (hoffentlich mit Active Directory).

Brian
quelle
Wenn die beteiligten Computer mit Active Directory gesichert sind, ist es möglicherweise am besten, die erweiterten Funktionen einfach durch Mitgliedschaft in einer Sicherheitsgruppe zu sichern. Benutzer können nach Bedarf zur Gruppe hinzugefügt werden, und Dateisystemberechtigungen sind nicht relevant
Kevin,
@ Kevin: Einverstanden. Ich denke, Dans Antwort deckt das ab.
Brian
0

Meine Präferenz ist wie von @Dan vorgeschlagen - Active Directory verwenden. Ist dies nicht möglich, kann ein zeitbasierter Passwortgenerator hilfreich sein. In einer ähnlichen Situation (in sehr ferner Vergangenheit) hat meine Firma, für die ich gearbeitet habe, 9999-MMDD verwendet. Dies kam nach ein paar Jahren heraus. Wenn Sie hhmm hineingeworfen und ein wenig durcheinander gebracht haben, könnten Sie ein oder zwei Jahre davon haben, bevor jemand die Katze aus der Tasche lässt.

Sie können jederzeit ein Programm schreiben, das mit einer ähnlichen, aber komplexeren Strategie ein Kennwort generiert. Geben Sie unter dem verwendeten Namen auch einen Maschinennamen ein. Ihr Manager kann dieses Programm ausführen, um das aktuelle Kennwort nur für diesen Computer abzurufen. Speichern Sie einige Informationen in der Datei, damit sie nicht gültig sind, wenn sie auf einen anderen Computer kopiert werden oder wenn ein anderer Benutzer angemeldet ist. Es liegt dann an Ihrem Manager, das Programm sicher zu halten, und wenn die Katze aussteigt, ist er schuld.

Dieses Schema wird aus Cyrpto-Sicht als schwach und unzuverlässig angesehen, ist jedoch für das Problem, das Sie haben, angemessen.

mattnz
quelle