Jakie są możliwe alternatywy dla podania „hasła administratora” dla aplikacji komputerowej?

10

Obecnie zarządzam i ponownie przeprowadzam faktoring oprogramowania używanego w mojej firmie od ponad dekady. Jednym z elementów tej aplikacji jest rodzaj trybu administratora lub zaawansowanego użytkownika, który zapewnia pewne dodatkowe / wewnętrzne dane wejściowe, a także możliwość wyłączenia limitów wejściowych.

Historycznie ten tryb był włączony poprzez umieszczenie pliku o konkretnej nazwie w określonym miejscu w katalogu systemu Windows (oba zostały zakodowane na stałe w aplikacji), przy czym plik ten miał nazwę „coś.DLL”, mimo że był pusty Plik ASCII, a nie dll.

Więc niedawno dodałem trochę kodu i trochę modalnej formy, która pozwala użytkownikowi wprowadzić hasło administratora, aby włączyć tę funkcję. Jest to ustawione hasło, a nie specyficzne dla użytkownika. Po wprowadzeniu prawidłowego hasła robi to samo, tworząc „plik klucza” w katalogu głównym aplikacji, aby program mógł uruchomić się w trybie administratora, jeśli ten plik jest obecny.

Teraz kierownik działu, dla którego oprogramowanie to jest najbardziej, tak bardzo nie lubi tego pomysłu. Uważa, że ​​jeśli mamy proste, ustawione hasło, które łatwo „wydostanie się” i nie chce, aby niedoświadczeni użytkownicy mieli dostęp do tych dodatkowych funkcji.

Moje pytanie brzmi: jakie są inne metody zapewnienia tego rodzaju dostępu, który byłby nieco bardziej bezpieczny? Prawie tylko ja, jeśli chodzi o utrzymanie i zarządzanie tym oprogramowaniem, więc nic, co nie jest prawie całkowicie wbudowane lub zautomatyzowane, nie pomogłoby (takie jak wysyłanie próśb o „klucze licencyjne” lub coś podobnego).

Uwagi: Ta aplikacja jest napisana w VB.NET (.NET 4.0), a obecnie planuję użyć wdrożenia po kliknięciu, gdy nowa wersja zostanie wykonana.

Anthony
źródło
1
Ktoś musi podjąć decyzję, którzy użytkownicy są „niedoświadczeni”, a którzy nie. Kto podejmuje tę decyzję? Kto musi wprowadzić te decyzje do systemu?
Doc Brown,

Odpowiedzi:

13

Jeśli masz usługę Active Directory, możesz przetestować członkostwo w grupie usługi 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
źródło
To bardzo dobra odpowiedź i na pewno będę pamiętać o tym i innych projektach. Jednak prawdziwym problemem są użytkownicy tego programu poza naszą firmą. Zapewniamy to zarówno naszym siostrzanym firmom, jak i kilku zewnętrznym użytkownikom zewnętrznym. Właściwie myślę w tym momencie, że najlepiej będzie po prostu całkowicie wyłączyć te funkcje osobom spoza naszej sieci i użyć Twojej sugestii do celów wewnętrznych.
Anthony
5

Kierownik ma rację, że hasło wychodzi . Nie chodzi o to, czy, ale kiedy.

Ponieważ Active Directory nie jest opcją dla niektórych użytkowników, możesz utworzyć podpisany plik tekstowy z listą nazw logowania systemu Windows, które mają dostęp superużytkownika. Zakłada się, że ludzie nie współużytkują komputerów ani loginów.

Nazwy użytkowników będą po prostu przechodzić do łatwo dystrybuowanego pliku tekstowego, który zostanie umieszczony w folderze aplikacji. Ważną częścią jest podpisanie listy nazw użytkowników. Zachowaj to bardzo prosto. Jedna nazwa użytkownika na wiersz i umieść skrót w ostatnim wierszu. Osadzić jakiś tajny klucz w pliku binarnym programu i mieszać go z nazwami użytkowników. Tajny klucz uniemożliwi modyfikację pliku, a następnie samodzielne obliczenie wartości skrótu (która prawdopodobnie jest zbyt daleko idąca).

UserName1
UserName2
.
.
.
UserName34
<HashOfUserNamesAndSecretKey>

To oczywiście wymaga, aby ktoś gdzieś działał jako administrator listy autoryzowanych użytkowników. Administrator powinien mieć program (napisany przez Ciebie!), Który generuje plik i skrót. Jeśli nic więcej, wystarczy pobrać plik tekstowy z nazwami użytkowników i dodać skrót.

Aby zachować dokładność, ktoś, kto został odwołany, może pobrać kopię pliku, w którym nadal znajduje się nazwa logowania. Gdy tylko chcieli dostępu, mogli po prostu umieścić swoją kopię na miejscu. Prawdopodobnie nie ma się czym martwić.

szturchać
źródło
3

Ponieważ usługa Active Directory nie jest opcją, mieszam bieżącą datę. Używaj elementów o największej entropii jako pierwszej (dzień miesiąca) i tych o najmniejszej entropii na początku (roku). W razie potrzeby dodaj sól specyficzną dla domeny (identyfikator klienta, nazwę firmy itp., Ponieważ jest ona używana poza firmą). Powinno to generować zupełnie inne hasło każdego dnia, praktycznie niemożliwe do odgadnięcia przez użytkowników końcowych, i może być różne dla różnych firm korzystających z oprogramowania.

Jest to zasadniczo problem z kurczakiem i jajami, ponieważ oprogramowanie musi być w stanie uwierzytelnić użytkownika bez dzwonienia do domu. Zrób jajko z naprawdę niejasnym mechanizmem łamania: chociaż bezpieczeństwo przez zaciemnienie nie jest prawdziwym zabezpieczeniem, jest to najlepsze, jakie podałeś parametry swojego problemu.

Jest to również lepsze niż umieszczenie gdzieś pliku tekstowego: nie jest to lepsze niż hasło statyczne, ponieważ gdy sekret zostanie ujawniony, gra się kończy.


źródło
0

Użyj list kontroli dostępu .

Szybkim i brudnym sposobem na to jest usunięcie wszystkich uprawnień z katalogu aplikacji (w tym uprawnienia do odczytu), a następnie dodanie tych uprawnień dla wszystkich użytkowników, którzy mogą uruchamiać aplikację. Oczywiście użytkownik z uprawnieniami może równie łatwo skopiować katalog aplikacji do lokalizacji publicznej, ale nie jest to prawdopodobne przypadkowo, podczas gdy udostępnianie hasła może z łatwością nastąpić przypadkowo.

Zakłada się oczywiście, że zaangażowane komputery są zabezpieczone (mam nadzieję, że z Active Directory).

Brian
źródło
Jeśli zaangażowane komputery są zabezpieczone za pomocą usługi Active Directory, najlepiej po prostu zabezpieczyć zaawansowaną funkcjonalność poprzez członkostwo w grupie zabezpieczeń. Użytkownicy mogą być dodawani do grupy zgodnie z potrzebami, a uprawnienia systemu plików nie są istotne
Kevin
@Kevin: Zgoda. Myślę, że odpowiedź Dana to obejmuje.
Brian
0

Moje preferencje są takie, jak sugerował @Dan - użyj active directory. Jeśli nie jest to możliwe, przydatny może być generator haseł oparty na czasie. W podobnej sytuacji (bardzo odległej), w której moja firma pracowała dla używanego 9999-MMDD. To wyszło po kilku latach. Jeśli wrzuciłeś hhmm i trochę pomieszałeś, możesz dostać rok lub dwa, zanim ktoś wypuści kota z torby.

Zawsze możesz napisać program, który generuje hasło przy użyciu podobnej, ale bardziej złożonej strategii. Dodaj nazwę używaną również nazwę maszyny. Twój menedżer może uruchomić ten program, aby uzyskać aktualne hasło tylko dla tego komputera. Przechowuj pewne informacje w pliku, aby były niepoprawne, jeśli zostały skopiowane na inną maszynę lub zalogowany został inny użytkownik. To od Ciebie zależy, czy program będzie bezpieczny, a jeśli kot wyjdzie, to jego wina.

Ten schemat jest uważany za słaby i niewiarygodny z perspektywy cyrpto, ale jest odpowiedni dla twojego problemu.

mattnz
źródło