Гид по технологиям

Автоматизация создания пользователя и добавления SSH-ключа на EC2

• 4 min read • DevOps • Обновлено 18 Nov 2025
Создать пользователя и добавить SSH‑ключ на EC2
Создать пользователя и добавить SSH‑ключ на EC2

Этот материал показывает, как автоматизировать создание пользователя и добавление публичного SSH-ключа на Ubuntu EC2 с помощью одного shell‑скрипта. Приведён готовый скрипт, пошаговая инструкция, проверки, советы по безопасности и список типичных ошибок.

Обзор процесса: создание пользователя и добавление публичного SSH-ключа на EC2

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

Пререквизиты

  1. Базовые знания shell‑скриптов.
  2. Учетная запись AWS (создайте при необходимости).
  3. EC2-инстанс с пользователем, у которого есть sudo‑доступ.

Важно: в примерах использован Ubuntu EC2, но подход применим к большинству Linux‑дистрибутивов с небольшими правками.

Что мы сделаем

  1. Подготовим скрипт и сгенерируем пару ключей для нового пользователя.
  2. Запустим скрипт, чтобы создать пользователя и добавить публичный ключ в его ~/.ssh/authorized_keys.

Создание скрипта и пары ключей

Ниже — исходный скрипт. Он также доступен в репозитории GitHub автора (ссылка в оригинале). Код в блоках следует сохранить в файл provide-access.sh и сделать исполняемым.

Github Link:
https://github.com/shivalkarrahul/DevOps/blob/master/aws/shell-scripts/aws-ec2-create-user-add-public-key/provide-access.sh
File: provide-access.sh
helpFunction()
{ 
      echo ""
      printf "\033[1;32mUsage: $0 -K  -U  -I  -u  -k <\"public-key-string-shared-by-the-user\">"
      echo ""
      echo -e "\t-K \".pem key of the server on which a new user has be created\""
      echo -e "\t-U UserName of the server on which a new user has be created"
      echo -e "\t-I IP of the server on which a new user has be created "
      echo -e "\t-u user to be created on the internal server"
      echo -e "\t-k \"public key string to be added shared by the user\""
      echo -e "Put Public Key in double quotes"

      echo -e  "e.g."
      echo "./provide-access.sh -U ubuntu -K /Users/cloudcover/Documents/Rahul/access/rahuls.pem -I 192.168.134.100  -u rahul -k  \"ssh-rsa Z1rbx6/F/ZntfkvKzX6e82oYOOLb9QtTu4IO+W560+afjp1xLOYqWKeEsZycq0iyHX5herNWxorLU3gGnwGSABCb+62yP3eaESMMHMR91OeDsxeLL41ABANofMROQ8yDjNcYVUxjKWyzNzuJxgnN5KngwkUOWHGbCFmHUsz1WVuWA+rhhk1CPZFywUdsDeGR/Dxd+oNKGvaKGIQuDqK1vY5GiLg0N+OvanTPbLper3/Z5A5d62fRF6+mensZGsKW543 key-name\""

      echo -e "\033[0m" #reset color
      exit 1 # Exit script after printing help
}

while getopts "I:K:U:u:k:" opt
do
   case "$opt" in
      K ) internalServerPemKey="$OPTARG" ;;
      U ) internalServerUser="$OPTARG" ;;
      I ) internalServerIP="$OPTARG" ;;
      u ) userName="$OPTARG" ;;
      k ) keyString="$OPTARG" ;;
      ? ) helpFunction ;; # Print helpFunction in case parameter is non-existent
   esac
done

# Print helpFunction in case parameters are empty
if [ -z "$internalServerIP" ] || [ -z "$internalServerPemKey" ] || [ -z "$internalServerUser" ] || [ -z "$userName" ] || [ -z "$keyString" ]
then
      printf "\033[1;31m"
      echo "Some or all of the parameters are empty";
      helpFunction
fi

# Begin script in case all parameters are correct
printf "\033[1;33m------------------------------------------------------------------Before ssh"
echo -e "\033[0m" #reset color
echo ".pem key of the server on which a new user has be created\t\t:  \t$internalServerPemKey"
echo "UserName of the server on which a new user has be created\t\t: \t$internalServerUser"
echo "IP of the server on which a new user has be created\t\t\t:\t$internalServerIP"
echo "user to be created on the internal server\t\t\t:\t$userName"
echo "public key string to be added shared by the user\t\t:\t$keyString"


printf "\033[1;31mLogging into: "$internalServerPemKey" "$internalServerUser"@"$internalServerIP"\033[0m\n"

ssh -i "$internalServerPemKey" "$internalServerUser"@"$internalServerIP" << HERE
      printf "\033[1;33m------------------------------------------------------------------After ssh"
      echo -e "\033[0m" #reset color
      echo "Creating user \"$userName\" <--- on=\"\" ---=\"> \"$internalServerIP\" <---"
      sudo useradd -m $userName
      sleep 2
      echo "Changing user to \"$userName\""
      sudo -i -u $userName bash << EOF
      echo "User Switched To;"
      whoami
      echo "creating dir: .ssh"
      mkdir -p .ssh
      echo "changing permission of dir .ssh to 700"
      chmod 700 .ssh
      echo "creating a file: .ssh/authorized_keys"
      touch .ssh/authorized_keys
      echo "changing permission of .ssh/authorized_keys to 600"
      chmod 600 .ssh/authorized_keys
      echo "appending $keyString "
      echo "to .ssh/authorized_keys"
      echo '$keyString' >> .ssh/authorized_keys
      echo "Content of .ssh/authorized_keys"
      cat .ssh/authorized_keys
      printf "\033[1;31mExiting from         ---> "$internalServerPemKey" "$internalServerUser"@"$internalServerIP"\033[0m\n"
      #echo "Existing user\t---> $userName"
EOF
HERE

Сгенерируйте пару ключей для нового пользователя (в примере сохраняем в /tmp/):

ssh-keygen

Генерация пары ключей: публичный и приватный ключ

Просмотрите сгенерированные файлы:

ls /tmp/id_rsa*

Создание пользователя с помощью скрипта

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

chmod 744 provide-access.sh

Пример запуска (оставлен точно как в исходнике — замените значения на свои):

./provide-access.sh -U ubuntu -K ~/Downloads/howtoforge-test.pem -I ec2-15-236-64-128.eu-west-3.compute.amazonaws.com -u rahul -k "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCzS60i+fPFEYMbA1w8dLOFK2EAV+vFtlckSU  
5+DGxtLHp3smpAxTDkKYJ33bM9Cs6toMDD0HITAH6VRyrgJ4V+Z4EpO6w8kHp3g2Fro5b4X2VX4GWsVdmkLkj0KbUhbd2sKTx/O2x+wNlxT7cUvr0ugii9FIXlXLLjwLsw47bEUNSIhwJB+x7u8tfOc00IBzhghCU9DjfGzMNxWdwpWg2GsAoRWQAT1YGO3laqPpxSVN6RKAzsTJ  
gSar7bwJsjEtiCb7+of95SIR/lkP/e1hpsbuDUpc94mTAkde88pFPE/799w+YnbUwaj+1Y8e9R1QRjbs9Xh+b2wAgaAlMTPEFh [email protected]"

Пояснения к параметрам:

  • -U = ubuntu — пользователь, с которым вы логинитесь на EC2 и имеете sudo.
  • -K = ~/Downloads/howtoforge-test.pem — путь к .pem‑файлу для входа на EC2.
  • -I = ec2-…compute.amazonaws.com — адрес/IP EC2‑инстанса.
  • -u = rahul — имя создаваемого системного пользователя.
  • -k = публичный ключ пользователя, который будет добавлен в authorized_keys.

Окно выполнения: пользователь создан

Проверка наличия пользователя на целевой машине:

ssh -i ~/Downloads/howtoforge-test.pem [email protected]
cat /etc/passwd | grep rahul

Проверка в /etc/passwd: пользователь rahul появился

Попытка входа от имени нового пользователя. В оригинале был использован chmod 400 на файле /tmp/id_rsa.pub — это опечатка: chmod 400 должен применяться к приватному ключу (обычно /tmp/id_rsa), а не к .pub. Пример правильной команды:

chmod 400 /tmp/id_rsa
ssh -i /tmp/id_rsa [email protected]

(в исходнике приведён этот блок; убедитесь, что используете приватный ключ для аутентификации)

Успешный вход как созданный пользователь

Что проверять после выполнения

  • Файл /home//.ssh/authorized_keys содержит переданный публичный ключ.
  • Права: ~/.ssh — 700, ~/.ssh/authorized_keys — 600.
  • Пользователь создан в /etc/passwd и имеет домашнюю директорию.
  • SSH‑вход под новым пользователем работает без пароля.

Типичные проблемы и способы решения

  1. Неправильные права на файлы ключей — SSH отклоняет ключи. Убедитесь, что приватный ключ имеет 400 или 600.
  2. Скрипт не может подключиться — проверьте адрес/порт/путь к .pem и сетевую доступность (Security Group на EC2).
  3. Публичный ключ в неверном формате — убедитесь, что это строка OpenSSH (начинается с ssh‑rsa/ssh‑ed25519 и т.д.).
  4. Отсутствие sudo у учетной записи, с которой подключаетесь — скрипт использует sudo useradd.

Important: всегда тестируйте скрипт на тестовой машине перед массовым применением.

Рекомендации по безопасности

  • Ограничьте доступ к .pem и приватным ключам: chmod 400.
  • Убедитесь, что новый пользователь не получает лишних привилегий (не добавляйте в sudoers без явной необходимости).
  • Рассмотрите использование централизованного управления ключами (например, через Ansible, AWS Systems Manager или LDAP) для больших сред.
  • По возможности отключайте парольную аутентификацию в SSH и используйте только ключи.

Чек-листы по ролям

Администратор (тот, кто запускает скрипт):

  • Проверил доступ по .pem к целевому инстансу.
  • Передал корректный публичный ключ от пользователя.
  • Запустил скрипт в тестовом окружении.
  • Проверил права на ~/.ssh и authorized_keys.

Получатель (новый пользователь):

  • Сгенерировал пару ключей и передал публичный ключ в правильном формате.
  • Убедился, что приватный ключ хранится безопасно.

Критерии приёмки

  • Пользователь присутствует в /etc/passwd.
  • В домашней директории пользователя есть ~/.ssh/authorized_keys с корректным ключом.
  • Вход по SSH под новым пользователем работает.

Краткая методология (mini‑method)

  1. Проверка доступа к хосту и сохранение .pem.
  2. Подготовка публичного ключа пользователя.
  3. Запуск provide-access.sh с нужными аргументами.
  4. Верификация создания пользователя и прав на файлы.

Сводка

Скрипт упрощает и ускоряет процесс добавления системных пользователей и раздачи им доступа через публичные SSH‑ключи. Это снижает количество ручных ошибок и стандартизирует операцию. Для production‑среды рекомендуется интегрировать подход с системой управления конфигурацией и следовать лучшим практикам безопасности.

Глоссарий (одна строка):

  • authorized_keys — файл в ~/.ssh, содержащий публичные ключи, которые разрешены для аутентификации.
Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро