Кешуйте пароль, якщо SSH-ключі заборонені


46

У мене є сервер, до якого я повинен часто отримувати доступ через ssh, тому що я обчислюю його. Тепер обчислювальний центр прямо забороняє SSH-ключі, оскільки вони "незахищені". Вони вважають, що введення мого пароля на клавіатурі кожного разу, можливо, перед іншими людьми, є набагато безпечнішим способом увійти.

Тепер; Я не можу передумати (спробував).

Чи існує спосіб принаймні тимчасово зберігати паролі SSH, як GIT може зберігати паролі в кеші протягом певного визначеного часу?


55
the computing center explicitly forbids SSH-keys because they are "insecure"- моя думка з цього приводу? Знайдіть нового хоста сервера, оскільки ваш, очевидно, невмілий.
Метт Кларк

18
@Matt: "обчислювальний центр" звучить більше як система академічної сітки, у якої, мабуть, не так вже й багато конкуренції
гадаю

27
Вони помиляються. Вони, ймовірно, забули відключити ssh-ключі, коли термін дії їх закінчується, тому вони вирішили, що ключі ssh - це проблема.
Джошуа

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

7
@TheHansinator Якщо встановлений кейлоггер, ви вже були порушені до того, що це вже не має значення, чи захищаєте ви SSH-з'єднання. Але є й інші переваги publickeyаутентифікації. Якщо ви вимкнете passwordавтентифікацію на сервері, ви запобіжете тим, хто зловмисники намагаються вгадати паролі. І якщо зловмисник спробує атакувати mitm проти клієнта, який раніше не зберігав відкритий ключ сервера, ви набагато краще захищені, publickeyніж якщо б ви використовували passwordавтентифікацію.
kasperd

Відповіді:


63

Повторне використання з'єднання

SSHv2 дозволяє одному і тому ж аутентифікованому з'єднанню встановлювати кілька "каналів" - інтерактивну оболонку, пакетну команду, SFTP разом з вторинними, такими як переадресація агента або пересилання через TCP. Ваш сервер, ймовірно, підтримує мультиплексування підключення за замовчуванням. (Якщо ваші адміністратори скаржаться, він ніде не кешує ваш пароль - це кешування всього з'єднання.)

У OpenSSH у вас є ControlMasterі ControlPathваріанти (-M і -S), щоб скористатися цим:

  1. Запустити 'головний' SSH-з'єднання за допомогою -M. (Оскільки у вашому конфігурації у вас ще немає ControlPath, вам потрібно вказати його в командному рядку, використовуючи -S. Він повинен жити довго, тому я додаю -fNпараметри, щоб перейти до фону; технічно вони необов’язкові в іншому випадку.)

    $ ssh foo@bar.example.com -fNMS ~/.ssh/bar.socket
    foo@bar.example.com's password:
    

    Ви повернулися до місцевої оболонки.

  2. Почніть нове з'єднання через майстер:

    $ ssh foo@bar.example.com -S ~/.ssh/bar.socket
    

    Ти в.

  3. Щоб зробити це корисним для Git / rsync / SFTP, вам потрібно налаштувати ControlPathу своїй конфігурації, оскільки ви не зможете -Sвесь час вказувати :

    Host *
        ControlPath ~/.ssh/S.%r@%h:%p
    

Ви можете автоматизувати це - також є останні версії OpenSSH, ControlPersistякі автоматично встановлюють головне з'єднання у фоновому режимі, якщо його ще немає. Це дозволяє пропустити крок 1 і просто використовувати ssh, як зазвичай.

  1. Конфігурація в ~/.ssh/config:

    Host *
        ControlPath ~/.ssh/S.%r@%h:%p
        ControlMaster auto
        ControlPersist 15m
    
  2. Перше з'єднання запитує пароль:

    $ ssh foo@bar.example.com
    foo@bar.example.com's password:
    [foo@bar:~]$ exit
    
  3. Другий не:

    $ ssh foo@bar.example.com
    [foo@bar:~]$ yay
    

Щоб керувати генератором мультиплексу (зупинити його або налаштувати переадресацію TCP), скористайтеся -Oопцією.

Подібний метод підтримується останніми версіями PuTTY .


1
дуже дякую за цю приємну відповідь. google не корисний у цій проблемі, оскільки він завжди звертався до ssh-ключів, і я не знав правильних ключових слів. мені дуже допомогли!
користувач2667180

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

3
@shellster: Ви маєте на увазі "будь-хто з тим самим UID", як і у випадку з ssh-агентом. Навіть якщо ви навмисно відкриєте дозволи на файл сокета (які за замовчуванням становлять 0600), інші користувачі просто вийдуть з нього "мультиплексне невідповідність".
grawity

3
@shellster Хтось із root може все-таки встановити кейлоггер і в будь-якому разі вкрасти ваш пароль у віддаленій системі або зробити будь-яку кількість шкідливих речей. Якщо ми переживаємо за локальний корінь, це не менш безпечно, ніж збереження приватного ключа SSH.
amalloy

1
Я не вважаю локальний корінь загрозою, тому що якщо він коли-небудь стане загрозою, ти тостуєш ні за що. (Як і урядовий шпигун.) Чесно кажучи, місцевий корінь може просто замінити вашого ssh-клієнта та ssh-агента тим, що вони хочуть. Зберігати всі паролі та приватні ключі в /root/.secret? Звичайно.
grawity

19

Використовуйте sshpass

sshpass ( github , man page ) - це інструмент, який автоматично подає пароль на ssh. Безпечним способом його використання є такий:

% echo 'correct horse battery staple' > ~/.ssh/compute_password
% chmod go-rw ~/.ssh/compute_password

% sshpass -f ~/.ssh/compute_password ssh foo@host

Це буде читати пароль з ~/.ssh/compute_password, як і файл приватного ключа без парольної фрази. Ви можете поставити sshpassкоманду в невеликий скрипт оболонки або псевдонім оболонки, щоб увести цю повну команду. На жаль, я не знайшов способу це зробити ~/.ssh/config.

(Також можна вказати пароль безпосередньо в командному рядку sshpass, але цього слід уникати, оскільки він просочує пароль тому, хто може це зробити ps)

Порівняння з іншими методами

Цей підхід, звичайно, менш безпечний, ніж правильно встановлена ​​автентифікація відкритих ключів, але ви, мабуть, це вже знаєте.

Він також менш безпечний, ніж відповідь @ grawity про повторне використання з'єднання, але має перевагу в тому, що зовсім не потрібно вводити пароль.

Ви можете розглянути відповідь @ grawity як альтернативу autkey pubkey із парольною фразою та кешуванням приватних ключів (тобто ssh-agent). Тоді моя відповідь буде альтернативою автентичності pubkey без парольної фрази у файлі приватного ключа.


3
Якщо політика обчислювального центру була написана на основі "але клавіші зберігаються на диску, де хтось міг би їх викрасти!", То, схоже, ця політика матиме досить зворотну реакцію.
grawity

6
@grawity Добре, що погана політика призводить до ще гірших робочих ситуацій ¯ \ _ (ツ) _ / ¯
marcelm

1
Якщо ви генеруєте свій пароль як досить довгий потік випадкових символів (скажімо, head -c 16 /dev/urandom | base64на 128 біт) і не використовуєте його в інших системах, це безпечно, як і ключ. Як важко піддатися грубій силі, так і просто використовувати файл, якщо він не зашифрований. Це стосується і поганого хлопця, якщо вони отримають файл. Єдина відмінність полягає в тому, що пароль надсилається на сервер так, як є, тоді як ключі мають кращу математику, щоб довести, що ви володієте правильним приватним ключем, не розкриваючи його, і зручно для зручності, важче зашифрувати файл, що містить пароль (ні стандартні інструменти).
ilkkachu

1

Використовуйте менеджер паролів.

Деякі менеджери паролів (наприклад, KeePassXC) мають функцію "автоматичного типу". Ви зберігаєте пароль в диспетчері паролів, розблоковуєте базу даних під час запуску диспетчера, і кожен раз, коли буде sshзапропоновано ваш пароль, ви натискаєте комбінацію клавіш, завдяки якій менеджер паролів записує ваш довгий пароль у консоль.

Не потрібно копіювати, пам’ятайте що-небудь (крім пароля для розблокування бази даних), і ви можете мати надійний пароль, не перетираючи ці 30 символів щоразу, коли ви намагаєтесь увійти.

Ви можете обрати улюбленого із цього списку: https://en.wikipedia.org/wiki/List_of_password_managers


3
Я не впевнений, чи добре працює функція автоматичного типу з програмами на базі терміналів. Виявлення буде шукати конкретний заголовок вікна, а само автоматичне введення тексту найкраще не має фантазійних функцій "проти кейлоглогінгу", які мали KeePass2 ...
grawity

1
@grawity gnome-terminalзмінює свою назву, ssh somehostколи ssh запитує мене про пароль, щоб ви могли без проблем зіставити вікно заголовка з цим. Я нічого не знаю про функції анти-келог-журналів - я щодня використовую KeePassXC в терміналі, і найгірше, з чим мені довелося зіткнутися, - це вибрати відповідний обліковий запис зі списку.
стиропор летить

2
@grawity Функції анти-кейлоггінгу потрібно увімкнути щоразу (саме з тієї причини, що багато програм не підтримують вставлення).
Боб

0

Ще одна альтернатива - використовувати клієнтський ssh-інтерфейс GUI. Для Windows очевидним вибором буде PuTTY . Існує також версія версії PuTTY для Linux, зокрема більшість дистрибутивів на базі Debian, таких як Ubuntu, як правило, включають PuTTY у свій репо.

Ще один дійсно хороший клієнт - Терміус . Він підтримує не лише Windows та Linux, але й OSX, iOS та Android. Хоча вона була розроблена в першу чергу для телефонів, версія для настільних комп'ютерів насправді непогана.

Якщо я не помиляюся, в поважному гіпертерміналі в Windows також вбудований ssh-клієнт, але я не використовував Windows дуже давно, тому я не зовсім впевнений.

Усі клієнти GUI містять можливість зберігати налаштування з'єднання, що включає ваше ім'я користувача та пароль.


2
"На основі GUI" автоматично не означає, що він дозволить зберігати ваш пароль, що PuTTY явно відмовляється робити . Версія HyperTerminal, яка постачалася в комплекті з Windows, була лише для Telnet, зосереджена більше на послідовних посиланнях. Можливо, ви думаєте про CKermit для Windows, який має підтримку SSH, але його підтримка шифрів настільки застаріла, що не може легко підключитися до багатьох сучасних серверів.
grawity
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.