Как да създадете и добавите SSH ключове на много сървъри ?

Как да създадете и добавите SSH ключове на много сървъри (бързо и сигурно)?

Наскоро ми се наложи да конфигурирам достъп до 25+ Linux сървъра. Първоначално го правех ръчно – въвеждах паролата за всеки, копирах ключа и проверявах дали всичко е наред. След третия сървър реших, че това не е сериозно. Нужно беше нещо автоматизирано, сигурно и разбираемо. Ето как го направих – и защо този метод е най-подходящият за повечето ситуации.


Защо SSH ключовете са задължителни

🔑 1. Какво са SSH ключовете и защо да ги ползваме

SSH ключовете са двойка файлове (частен и публичен), които ви позволяват да влизате в сървъри без парола.
Това е по-бързо, по-сигурно и удобно при управление на много машини.

  • Частният ключ остава на вашия компютър.
  • Публичният ключ се копира на сървъра (в ~/.ssh/authorized_keys).
  • Когато се свързвате, SSH проверява дали ключовете съвпадат и ви пуска без парола.

Защо SSH ключовете са задължителни

  • Без пароли.
  • По-безопасно от sudo su.
  • Автоматизация без риск.
  • Работи с Ansible, скриптове, CI/CD.

Подготовка: Създайте си SSH ключ (ако нямате)

Отворете терминал и напишете:

ssh-keygen -t ed25519 -f ~/.ssh/rezerven_kluch -C "rezerven-dostap"

  • -t ed25519 – модерен и сигурен алгоритъм.
  • -f – име на файла.
  • -C – коментар за по-лесна идентификация.

Следвайте инструкциите и задайте силна парола.

Съвет: Използвайте ed25519 – по-бърз и по-сигурен от RSA.

Ще получите два файла:

~/.ssh/rezerven_kluch        # частният ключ
~/.ssh/rezerven_kluch.pub    # публичният ключ

Решение #1: Моята препоръка

Създайте файл servers.txt в същата папка, например:

# Списък на сървърите
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]

Празни редове? Коментари? Табове? Няма проблем. Скриптът ще ги игнорира.


🧠 4. Скрипт за автоматично копиране на ключа

Създайте файл deploy-keys.sh със следното съдържание:

#!/bin/bash
KEY="$HOME/.ssh/rezerven_kluch.pub"
FILE="servers.txt"

[ -f "$KEY" ] || { echo "Грешка: Ключът не е намерен: $KEY" >&2; exit 1; }
[ -f "$FILE" ] || { echo "Грешка: Липсва файл $FILE" >&2; exit 1; }

echo "Стартиране на копиране на ключ: $KEY"
echo "----------------------------------------"

success=0; fail=0
while IFS= read -r host; do
    [[ -z "$host" ]] && continue
    echo "=== Копиране към: $host ==="
    if ssh-copy-id -o StrictHostKeyChecking=no -o ConnectTimeout=10 -i "$KEY" "$host"; then
        ((success++))
    else
        ((fail++))
    fi
    echo
done < <(tr -d '\r' < "$FILE" | grep -vE '^\s*(#|$)')

echo "----------------------------------------"
echo "✅ Успешно: $success | ❌ Неуспешно: $fail"
echo "Готово!"

Запишете го и направете го изпълним:

chmod +x deploy-keys.sh
./deploy-keys.sh

Този скрипт:

  • Проверява дали публичният ключ съществува.
  • Пропуска празни редове и коментари.
  • Автоматично потвърждава първоначалното свързване.
  • Изчаква максимум 10 секунди при проблемна връзка.
  • Събира отчет за успешни и неуспешни копирания.

Най-хубавото – може да се пуска многократно, без риск от дублиране.
ssh-copy-id сам проверява дали ключът вече е добавен в authorized_keys.


🚀 5. Алтернативни начини

✅ Ръчно (само за няколко сървъра)

ssh-copy-id -i ~/.ssh/rezerven_kluch.pub [email protected]

Бърз вариант, ако имате 1–2 машини.

✅ С xargs за по-кратка команда

grep -vE '^\s*(#|$)' servers.txt | xargs -n1 -I{} ssh-copy-id -i ~/.ssh/rezerven_kluch.pub "{}"

Полезно, но не толкова гъвкаво при грешки и таймаути.

✅ С sshpass (ако нямате ключове още)

sshpass -p "PASSWORD" ssh-copy-id -i ~/.ssh/rezerven_kluch.pub [email protected]

Удобно, но несигурно – паролата е в открит вид.

✅ С Ansible (ако го ползвате)

- hosts: all
  tasks:
    - authorized_key:
        user: root
        key: "{{ lookup('file', '~/.ssh/rezerven_kluch.pub') }}"

Често задавани въпроси

Ами ако сървърът не позволява парола?

Първо влезте ръчно, добавете ключа, после изключете паролата в sshd_config.

Ами ако порта не е 22?

Добавете в servers.txt: [email protected]:2222

Ами ако искам да копирам на потребител, не root?

[email protected]

🧩 6. Какво да запомните

  • SSH ключовете са стандартът за сигурен достъп.
  • Не споделяйте частния ключ никога.
  • Скриптът по-горе е прост, но достатъчно стабилен за реална употреба.
  • Можете да го пускате безопасно многократно – без дублиране.
  • При повече от 20-30 сървъра, обмислете инструмент като Ansible или SaltStack.

🧭 Финални думи

Тази автоматизация ми спести часове досадна работа и стотици въвеждания на пароли.
Ако и вие често управлявате няколко Linux машини – отделете 5 минути и си изгответе подобен скрипт.
Ще оцените спокойствието, бързината и простотата на нещо толкова елегантно.


💡 Съвет:
Създайте си един „основен“ SSH ключ за администраторски достъп и го използвайте за всички ваши машини.
Пазете го добре и използвайте силна парола – защото сигурността започва от вас.

Федя Серафиев

Федя Серафиев

Федя Серафиев e собственик на уебсайта urocibg.eu. Той намира удовлетворение в това да помага на хората да решават и най-сложните технически проблеми. Сегашната му цел е да пише лесни за следване статии, така че подобни проблеми изобщо да не възникват.

Благодарим ви за прочитането на статията! Ако намерихте информацията за полезна, можете да дарите посредством бутоните по-долу:

Подобни статии