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

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

Консультанты в основном утверждают, что вам не нужно запоминать пароль. Насколько это небезопасно? Значит, если кто-то взломает мой компьютер, он получит не только мой компьютер, но и мой сервер? Если я использую SSH от разных клиентов, я должен хранить открытые ключи по одному для каждого из них, что увеличивает вероятность того, что они попадут в ложные руки. Я мог бы сохранить их на USB-накопителе, который я ношу с собой, но его можно потерять, и поисковик получит доступ к моему серверу.

Возможно, мне лучше подойдет двухфакторная аутентификация.

Есть ли аргумент, который мне не хватает? Какой для меня лучший способ?

answer

if someone hacks into my computer, he doesn't just get my computer, but my server too?

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

Но у ключей есть 3 преимущества:

1) Кэшируемая аутентификация. Введите кодовую фразу один раз, выполните несколько команд ssh. Это очень полезно, если вы используете что-то, что использует ssh в качестве транспорта, например scp, rsync или git.

2) Масштабируемая аутентификация. Введите кодовую фразу один раз, войдите на несколько машин . Чем больше у вас машин, тем это полезнее. Если у вас 100 машин, чем вы занимаетесь? Вы не можете использовать один и тот же пароль (если только это не ферма клонов), и вы не можете запомнить их столько. Таким образом, вам придется использовать диспетчер паролей, и вы вернетесь к единой точке компромисса. Фактически ключевой парольной фразой является ваш менеджер паролей.

2b) Это масштабируется другим способом, если у вас несколько администраторов, использующих одни и те же системы, потому что вы можете отозвать ключи у пользователя A, не сообщая B, C, D, E, F ... что пароль изменился.

(Это также можно сделать с отдельными учетными записями и sudo, но тогда вам нужно как-то подготовить эти учетные записи)

3) Автоматизация и частичное делегирование. Вы можете настроить SSH для запуска определенной команды при подключении ключа . Это позволяет автоматическому процессу в системе A делать что-то в системе B без полного беспарольного доверия между ними.

(Это замена rlogin / rsh, который был до смешного небезопасен)

Изменить: еще одним преимуществом открытых ключей, а не паролей, является распространенный сценарий, когда сервер скомпрометирован из-за уязвимости. В этом случае вход в систему с паролем немедленно скомпрометирует пароль. Авторизации с помощью ключа нет! Я бы сказал, что это более распространено, чем компрометация исходного рабочего стола администратора.

Если вы используете надежные пароли, это может быть достаточно безопасно. Я обычно ограничиваю количество общедоступных серверов до минимума и разрешаю SSH с определенных IP-адресов, когда это возможно.

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

Есть похожие посты:

  1. Сообщение с serverfault .
  2. Публикация из биржи безопасности .
  3. Пост от суперпользователя .

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

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

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

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

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

OpenSSH может иметь собственный центр сертификации для управления ключами хоста и клиента SSH и может использовать для них списки отзыва. Это может повысить безопасность, обеспечиваемую аутентификацией на основе ключей.

Вы правы насчет утверждения "вам не нужен пароль". На стороне клиента это действительно небезопасно.

Что делает использование только открытых ключей для входа в систему намного более безопасным, так это то, что нет возможности получить доступ к вашему серверу методом грубой силы. Все, что может сделать злоумышленник, - это добавить некоторую нагрузку на ваш сервер - вы можете использовать fail2ban, чтобы держать это под контролем.

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

Possibly I am better served with Two-Factor Authentication.

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

Я считаю, что что-то вроде этого AuthenticationMethods publickey,keyboard-interactiveможно добавить, /etc/ssh/sshd_configчтобы заставить эту работу работать.

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

Пароль часто имеет длину менее 2048 бит и часто не получен из криптографически безопасного источника.

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

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