4

В Linux некоторые приложения могут на некоторое время запомнить аутентификацию. Например,

  • Файловый менеджер запоминает аутентификацию на время, когда мы предоставляем пароль для монтирования раздела. Если мы смонтируем другой раздел вскоре после монтирования первого, он не будет запрашивать пароль.

  • Терминальные приложения, если мы выполним некоторую задачу с помощью sudo и предоставим пароль, он не будет запрашивать следующее действие sudo если оно будет выполнено в течение определенного периода времени.

Как реализован этот функционал? Как я могу заставить свое приложение запомнить корневую аутентификацию на некоторое время?

2 ответа2

6

С программой "запомнить" что-то легко: запишите это куда-нибудь в файл, а затем прочитайте позже. Вот так все настройки / настройки работают. (Кстати, именно так работают обычные файлы .)

(Они могут храниться в виде файла в ~/.config/ на диске; файл в оперативной памяти в /run ; хранилище абстрактных настроек, таких как GConf или реестр Windows; оно варьируется.)

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

  • При монтировании диска через графический интерфейс, запрос на монтирование отправляется UDisks, который затем запрашивает подтверждение у polkit . («Эй, пользователь X пытается смонтировать диск Y, это разрешено?«)

    Поскольку polkit - это постоянно работающий сервис, он отслеживает последние аутентификации полностью в собственной памяти процесса, в связанном списке (GList). Вы можете найти в его src/polkitbackend слова temporary_authorization авторизация .

    Если бы вы реализовывали ту же функцию, упрощенным примером будет:

    authorizations = list()
    ...
    authorizations.append({user: "niyasc",
                           action: "mount drive",
                           expires: time.now() + 3600})
    

    Ваша программа также может использовать polkit .

  • С другой стороны, sudo - это одноразовый инструмент, поэтому он хранит ту же информацию извне - как файлы в (/var)/run/sudo/ts . Отметка времени последнего изменения файла сравнивается, чтобы увидеть, достаточно ли она свежа, и обновляется после каждого использования.

    # ls -l /run/sudo/ts
    total 4
    -rw------- 1 root grawity 80 Jul 29 12:15 /run/sudo/ts/grawity
    

    Алгоритм в обоих случаях примерно такой:

    def check_authorization(user) {
        if has_old_authorization(user) {
            expires = read_authorization(user);
            if expires > time.now() {
                return true;
            }
        }
        success = ask_for_authentication(user);
        if success {
            store_authorization(user, expires=time.now()+3600);
        }
        return success;
    }
    

Существуют и другие методы "запоминания аутентификации", но все они сводятся к хранению группы байтов в файле:

  • Многие сетевые приложения (например, почтовые клиенты, такие как Thunderbird или Outlook) фактически хранят имя пользователя и пароль непосредственно на диске. Упрощенным примером будет файл ~/.netrc:

    machine imap.example.com
        login niyasc@example.com
        password foobar
    

    Часто оно шифруется перед сохранением (приложение может использовать средства ОС, такие как GNOME-Keyring, или оно может поддерживать «мастер-пароль»), но в конце концов это просто часть данных, которые можно сохранить в файле.

  • Многие веб- приложения используют файлы cookie, чтобы запомнить тот факт, что вы вошли в систему. После входа в систему сервер просит ваш браузер запомнить что-то вроде «session_id = SGVsbG8gd29ybGQh» и отправлять его обратно при каждом следующем посещении. Браузеры, как правило, имеют текстовую базу данных или базу данных SQLite обо всех файлах cookie, выпущенных всеми веб-сайтами ("cookie jar").

    На сервере также имеется база данных 'session', которая содержит информацию о каждом выпущенном файле cookie, поэтому, когда он получает тот же "session_id = SGVsbG8gd29ybGQh", он знает, что вы niyasc:

    SESSION_ID         USERNAME   ISSUED          EXPIRES
    SGVsbG8gd29ybGQh   niyasc     Jul 29, 11:47   Aug 29, 11:47
    6kJnRcg4KBAPrMJ4   fred       Jun 14, 22:13   Sep 14, 22:13
    ...
    
  • Некоторые сетевые протоколы, такие как Kerberos или SAML, используют форму файлов cookie, называемых "билетами" или "токенами", которые сами содержат информацию о том, когда они были выпущены и для кого. (Они также подписаны цифровой службой аутентификации в качестве доказательства.) Это также позволяет разделить сервер "аутентификации" и сервер "приложений" для повышения безопасности.

  • Все же другие протоколы, такие как SSH или SSL/TLS, используют цифровые подписи - вместо того, чтобы вообще иметь пароль, у клиента есть частная пара ключей (обычно RSA или [EC] DSA), которая также сохраняется в виде файла на диске - например, файл ~/.ssh/id_rsa .

    Для каждого соединения сервер отправляет "вызов" (последовательность случайных байтов); клиент подписывает его своим закрытым ключом; Затем сервер проверяет подпись и проверяет, подписана ли она одним из "разрешенных" ключей.

2

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

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

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

Надеюсь, у вас уже есть идея.

Спасибо.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .