Каковы возможные варианты предоставления «пароля администратора» для настольного приложения?

10

В настоящее время я управляю программным обеспечением, которое используется в моей компании уже более десяти лет, и перефакторинг. Одним из элементов этого приложения является своего рода режим администратора или опытного пользователя, который обеспечивает такие вещи, как некоторый дополнительный / внутренний ввод, а также возможность отключать ограничения ввода.

Исторически этот режим был включен путем помещения файла с определенным именем в определенное место в системном каталоге Windows (оба из которых были жестко запрограммированы в приложении), файл с именем'thing.DLL ', даже если он был пустым ASCII файл, а не DLL.

Поэтому недавно я добавил некоторый код и небольшую модальную форму, которая позволяет пользователю вводить пароль администратора, чтобы включить эту функцию. Это установленный пароль, а не пользовательский. Когда введен правильный пароль, он делает то же самое, создавая «ключевой файл» в корневом каталоге приложений, чтобы программа могла запускаться в режиме администратора, если этот файл присутствует.

Теперь руководителю отдела, для которого это программное обеспечение в основном, не очень нравится эта идея. Он думает, что если у нас будет простой, заранее заданный пароль, он легко «выйдет», и он не хочет, чтобы неопытные пользователи имели доступ к этим дополнительным функциям.

Итак, мой вопрос: какие существуют другие методы для предоставления такого доступа, который был бы несколько более безопасным? Когда дело доходит до обслуживания и управления этим программным обеспечением, это в значительной степени касается меня, поэтому ничего, что почти полностью не встроено или автоматизировано, не поможет (например, отправка запросов на «лицензионные ключи» или что-то подобное).

Примечания. Это приложение написано на VB.NET (.NET 4.0), и в настоящее время я планирую использовать развертывание одним щелчком мыши, когда новая версия будет готова.

Энтони
источник
1
Кто-то должен принять решение, какие пользователи "неопытны", а какие нет. Кто принимает это решение? Кто должен поместить эти решения в систему?
Док Браун

Ответы:

13

Если у вас есть Active Directory, вы можете проверить членство в группе 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;
    }
Дэн Пичельман
источник
Это очень хороший ответ, и я обязательно буду иметь в виду этот и другие проекты. Однако реальная проблема - пользователи этой программы за пределами нашей компании. Мы предоставляем его как нашим дочерним компаниям, так и нескольким сторонним сторонним пользователям. На самом деле, я думаю, что на данный момент будет лучше просто полностью отключить эти функции для тех, кто находится за пределами нашей сети, и использовать ваше предложение для внутренних целей.
Энтони
5

Менеджер прав насчет пароль вылезая . Это не вопрос, если, но когда.

Поскольку Active Directory не подходит для некоторых пользователей, вы можете создать подписанный текстовый файл со списком имен входа в Windows, которым разрешен доступ суперпользователя. Это предполагает, что люди не делят компьютеры или логины.

Имена пользователей будут просто помещаться в легко распространяемый текстовый файл, который будет помещен в папку приложения. Важной частью является подписание списка имен пользователей. Держите это очень просто. Одно имя пользователя на строку и поместите хеш в последнюю строку. Вставьте какой-нибудь секретный ключ в двоичный файл вашей программы и хэшируйте его с именами пользователей. Секретный ключ не позволит людям изменить файл, а затем самостоятельно вычислить хеш (который, вероятно, неправдоподобен для начала).

UserName1
UserName2
.
.
.
UserName34
<HashOfUserNamesAndSecretKey>

Это, конечно, требует, чтобы кто-то где-то действовал как администратор списка авторизованных пользователей. Администратор должен иметь программу (написанную вами!), Которая генерирует файл и хэш. Если ничего другого, он может просто взять текстовый файл с именами пользователей и добавить хеш.

В целях тщательности кто-то, кому был аннулирован доступ, может получить копию файла, в котором все еще есть логин. Когда бы они ни хотели получить доступ, они могли просто поставить свою копию на место. Вероятно, не о чем беспокоиться, хотя.

совать
источник
3

Так как Active Directory не вариант, я бы хэшировал текущую дату. Сначала используйте элементы с наибольшей энтропией (день месяца) и элементы с наименьшей энтропией последний (год). При необходимости добавьте специфичную для домена соль (идентификатор клиента, название компании и т. Д., Поскольку она используется за пределами вашей компании). Это должно приводить к созданию совершенно нового пароля каждый день, который практически невозможно угадать конечным пользователям, и он может отличаться для разных компаний, использующих программное обеспечение.

По сути, это проблема курицы и яйца, поскольку программное обеспечение должно иметь возможность аутентифицировать пользователя, не звоня домой. Так что сделайте яйцо с действительно непонятным механизмом взлома: хотя безопасность через неизвестность не является реальной безопасностью, это лучшее, что вы дали параметрам вашей проблемы.

Это также лучше, чем помещать текстовый файл где-нибудь: это не лучше, чем статический пароль, потому что как только секрет раскрыт, игра окончена.


источник
0

Используйте списки контроля доступа .

Быстрый и грязный способ сделать это - удалить все разрешения из каталога приложения (включая разрешение на чтение), а затем добавить эти разрешения для всех пользователей, которым разрешено запускать приложение. Конечно, пользователь с разрешением может так же легко скопировать каталог приложения в общедоступное местоположение, но это вряд ли произойдет случайно, тогда как совместное использование пароля может легко произойти случайно.

Это предполагает, конечно, что соответствующие компьютеры защищены (возможно, с активным каталогом).

Брайан
источник
Если задействованные компьютеры защищены активным каталогом, может быть лучше просто защитить расширенные функциональные возможности путем членства в группе безопасности. Пользователи могут быть добавлены в группу по мере необходимости, а права доступа к файловой системе неактуальны
Кевин
@ Кевин: Согласен. Я думаю, что ответ Дэна покрывает это.
Брайан
0

Я предпочитаю, как @Dan предложил - использовать активный каталог. Если это невозможно, тогда может пригодиться генератор паролей, основанный на времени. В аналогичной ситуации (очень далекое прошлое) одна моя компания, в которой я работал, использовала 9999-MMDD. Это вышло через пару лет. Если вы добавите hhmm и немного перемешаете, вы можете получить год или два, прежде чем кто-то выпустит кошку из сумки.

Вы всегда можете написать программу, которая генерирует пароль, используя похожую, но более сложную стратегию. Добавьте также использованное имя и имя машины. Ваш менеджер может запустить эту программу, чтобы получить текущий пароль только для этой машины. Сохраните некоторую информацию в файле, чтобы она была недействительной, если она скопирована на другой компьютер или если вошел в систему другой пользователь. Затем ваш менеджер должен обеспечить безопасность программы, а если кошка выйдет, то это его вина.

Эта схема считается слабой и ненадежной с точки зрения кирпто, но она подходит для вашей проблемы.

mattnz
источник