Як програми запам'ятовують автентифікацію на якийсь час?


4

У linux деякі програми можуть коли-небудь запам'ятати аутентифікацію. Наприклад,

  • Файловий менеджер деякий час запам'ятовує автентифікацію, коли ми надаємо пароль для монтажу розділу. Якщо ми змонтуємо інший розділ незабаром після монтажу першого, він не запитуватиме пароль.

  • Програми терміналів, якщо ми виконуємо якусь задачу sudoі надаємо пароль, вона не вимагатиме наступної sudoдії, якщо вона буде виконана протягом певного періоду часу.

Як реалізується ця функціональність? Як я можу зробити свою програму коли-небудь запам'ятати автентифікацію root?


Автентифікації в основному не зберігаються в кеші, оскільки це може загрожувати безпеці. до тих пір, поки ви не надасте запам’ятати мені веб-додатки, занадто звичні зберегти пароль. Якщо він працює в операційній системі Windows, тоді ОС використовує для збереження в ньому зашифрований темп-формат, і це теж не буде дійсним після перезавантаження машини
vembutech

В якості бічної примітки слід просто перерахувати внутрішні розділи, /etc/fstabщоб вони автоматично встановлювалися.
grawity

@vembutech Правильно розроблені веб-програми взагалі ніколи не зберігатимуть пароль!
Скотт

Відповіді:


6

Програму «запам'ятати» щось легко: запишіть її у файл десь, а потім прочитайте її пізніше. Ось так працюють усі налаштування / налаштування. (Що стосується цього, то, як працюють звичайні файли .)

(Вони можуть зберігатися як файл ~/.config/на диску; файл в оперативній пам’яті /run; сховище абстрактних налаштувань, наприклад, GConf або реєстр Windows; воно змінюється.)

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

  • Під час монтажу диска через GUI запит на монтування надсилається до UDisks , який потім запитує polkit для підтвердження. ("Ей, користувач X намагається встановити диск Y, це дозволено?")

    Оскільки polkit - це послуга, що постійно працює, вона відслідковує нещодавні аутентифікації повністю у власній пам'яті процесу у пов'язаному списку (список). Ви можете шукати 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, виданих усіма веб-сайтами ("jar cookie").

    На сервері також є база даних "сеанс", яка містить інформацію про кожен виданий файл 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 ще раз, цього разу ви побачите, що виконання дуже швидке. Тому що, працюючи вдруге, поточний робочий каталог вже був збережений у пам'яті. Процесор просто дістав інформацію.

Сподіваюся, ви вже маєте якусь ідею.

Дякую.


3
Хоча концепція здебільшого однакова, стан кешування служб аутентифікації не має нічого спільного з файлами кешування ОС для продуктивності. Між реалізацією обох не існує жодної речі.
grawity
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.