ШПАРГАЛКИ
CI/CD
KUBERNETES
  • DOCKERFILE
  • DOCKER-COMPOSE
  • JENKINSFILE
  • JENKINS-PIPELINE
  • GITLAB CI/CD
  • GROOVIE
  • INSTALL
  • PODS
  • INGRESS

Авторизация на сервере Linux по SSH ключам

SSH-ключи используются для идентификации клиента при подключении к серверу по SSH-протоколу. Используйте этот способ вместо аутентификации по паролю.

SSH-ключи представляют собой пару — закрытый и открытый ключ. Закрытый должен храниться в закрытом доступе у клиента, открытый отправляется на сервер и размещается в файле authorized_keys.

В интернете полно манов, как сконфигурировать ssh ключи на сервере с линукс. Я могу предложить вам более удобный и просто вариант. Написал скриптик, который генерирует сертификат и рассылает его по списку серверов из файла.

Пожалуй, сразу перейдем к делу.

Начнем с файла, в котором содержаться данные о наших серверах, куда нужно распространить сгенерированные ключи.

servers.txt

localhost:22
example.com:22
example2.net:222
example3.org:2222

Как видим, файлик имеет структуру сервер:порт

Ну, а теперь и сам скрипт. Он интерактивный и достаточно удобный. Может позже я выложу, как это можно делать с помощью Ansible.

keygen.sh

#!/bin/bash

# Скрипт генерации и распространения ssh ключей.
# Автор - Sergey Antropoff
# https://dev.antropoff.ru

# Выходим при ошибке
set -e

echo -en "\033[31;1m\n\nВведите переменные!\033[0m\n\n"

#Задаем переменные
read -p "Введите имя пользователя в системе - владельца ключа: " USER
if [[ $USER == "" ]]; then echo "Необходимой ввести имя пользователя!"; read -n 1 -s -r -p "Нажмите любую кнопку для выхода..."; exit; fi

# Название ключа (ключ по умолчание id_rsa)
read -p "Введите имя файла ключа(по умолчанию id_rsa): " KEYFILE
if [[ $KEYFILE == "" ]]; then KEYFILE="id_rsa";  fi

# Комментарий для ключа
read -p "Введите комментарий для ключа: " COMMENT
if [[ $COMMENT == "" ]]; then COMMENT="id_rsa";  fi

# Пароль для ключа, если нужен
read -s -p "Введите пароль для ключа, если нужен: " PASSWORD

# Проверяем директорию .ssh. Если нет. Создаем.
echo -en "\033[31;1m\n\nПроверяем существование директории .ssh\033[0m\n"
if [ ! -d /home/$USER/.ssh ]
then
    mkdir -p /home/$USER/.ssh/
    echo -en "Создание папки .ssh -- \033[32;1m[выполнено]\033[0m\n"
else
    echo -en "\033[32 Папка найдена. Продолжаем...\033[0m\n"
fi

# Проверим наличие файла authorized_keys. Если нет, то создадим.
echo -en "\033[31;1m\nПроверяем наличие файла authorized_keys\033[0m\n"
if [ ! -f /home/$USER/.ssh/authorized_keys ]
then
    touch /home/$USER/.ssh/authorized_keys
    echo -en "Создание файла /home/$USER/.ssh/authorized_keys -- \033[32;1m[выполнено]\033[0m\n"
else
    echo -en "\033[32 Файл найден.\033[0m\n"
fi

# Создадим пользовательский SSH конфиг, если его нет.
echo -en "\033[31;1m\nПроверяем наличие файла конфигурации ssh для пользователя\033[0m\n"
if [ ! -f /home/$USER/.ssh/config ]
then
    touch /home/$USER/.ssh/config
    echo "StrictHostKeyChecking no" > /home/$USER/.ssh/config
    echo -en "Создание файла -- \033[32;1m[выполнено]\033[0m\n"
else
    echo -en "\033[32 Файл найден.\033[0m\n"
fi

# Проверим, есть ли там уже такой ключ. Если нет, то создадим.
echo -en "\033[31;1m\nПроверяем ключ с именем $KEYFILE в системе\033[0m\n"
if [ ! -f /home/$USER/.ssh/$KEYFILE.pub ]
then
    ssh-keygen -t rsa -C "$COMMENT" -N "$PASSWORD" -f /home/$USER/.ssh/$KEYFILE
    echo -en "Создание SSH ключа -- \033[32;1m[выполнено]\033[0m\n"
else
    echo -en "\033[32Такой ключ уже есть в системе. Выходим...\033[0m\n"
    exit
fi

# Приводим все права доступа в порядок
echo -en "\033[31;1m\nПроверяем права доступа к файлам\033[0m\n"
chmod 700 /home/$USER/.ssh/
chmod 600 /home/$USER/.ssh/authorized_keys
chmod 644 /home/$USER/.ssh/config
if [ ! -f /home/$USER/.ssh/id_rsa ]; then chmod 600 /home/$USER/.ssh/id_rsa; fi
echo -en "Проверка прав на файлы и папки -- \033[32;1m[выполнено]\033[0m\n\n"

# Отправляем сертификаты на список серверов из файла
echo -en "\033[31;1mНачинаем отправку сертификатов на сервера\033[0m"
for SERVER in `cat servers.txt`
do
    IFS=':'
    read -a strarr <<< "$SERVER"
    echo -en "\033[32;1m\n\nСервер ${strarr[0]}:${strarr[1]}\033[0m\n"
    ssh-copy-id -i /home/$USER/.ssh/$KEYFILE.pub  -p ${strarr[1]} $USER@${strarr[0]}.
    echo -en "Размещение ключа на сервер ${strarr[0]}:${strarr[1]} -- \033[32;1m[выполнено]\033[0m\n"
    ssh $USER@${strarr[0]} -p ${strarr[1]} 'bash -s' <<`ENDSSH`
    echo -en "\nПроверяем наличие файла конфигурации ssh для пользователя"
    if [ ! -f /home/$USER/.ssh/config ]
    then
    touch /home/$USER/.ssh/config
    echo "StrictHostKeyChecking no" > /home/$USER/.ssh/config
    echo -en "\nСоздание файла -- \033[32;1m[выполнено]\033[0m\n"
    else
    echo -en "\nФайл найден -- \033[32;1m[выполнено]\033[0m\n"
    fi
    echo -en "\nПроверяем права доступа к файлам на удаленном сервере\n"
    chmod 700 /home/$USER/.ssh/
    chmod 600 /home/$USER/.ssh/authorized_keys
    chmod 644 /home/$USER/.ssh/config
    if [ ! -f /home/$USER/.ssh/id_rsa ]; then chmod 600 /home/$USER/.ssh/id_rsa; fi
    echo -en "Проверка прав на файлы и папки -- \033[32;1m[выполнено]\033[0m\n"
`ENDSSH`
done

echo -en "\033[31;1m\n\nВсе публичные ключи были загружены!\033[0m\n\n"
read -n 1 -s -r -p "Нажмите любую кнопку для выхода..."

# Сбрасываем ошибку
set +e

Данный скрипт достаточно задокументирован. Если возникнут вопросы, пишите в комментарии. Буду признателен, если найдете какие-либо ошибки и оставите отзыв.

Да. Что бы не забыть.

После того, как вы спокойно подключаетесь по ключам, нам нужно отключить вход на сервер SSH по паролю.

sudo nano /etc/ssh/sshd_config

Убедитесь, что указан правильный путь к открытым ключам SSH, поставьте значение параметра 

PasswordAuthentication no

Перезапустите сервис SSHD

sudo service sshd restart

И да прибудет с вами удобство ключевого доступа...

PS: Ну, а как генерировать ключи на Windows с помощью PuttyGen я рассказывал вот тут.

Оцените статью

Еще никто не оставил комментарий. Будьте первым!