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

Создание нового системного пользователя и добавление ему публичного SSH-ключа вручную занимает время и подвластно ошибкам. В этой статье показано, как автоматизировать процесс с помощью shell‑скрипта, который подключается по SSH к целевой машине и выполняет необходимые команды.
Пререквизиты
- Базовые знания shell‑скриптов.
- Учетная запись AWS (создайте при необходимости).
- EC2-инстанс с пользователем, у которого есть sudo‑доступ.
Важно: в примерах использован Ubuntu EC2, но подход применим к большинству Linux‑дистрибутивов с небольшими правками.
Что мы сделаем
- Подготовим скрипт и сгенерируем пару ключей для нового пользователя.
- Запустим скрипт, чтобы создать пользователя и добавить публичный ключ в его ~/.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.shFile: provide-access.shhelpFunction()
{
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
Попытка входа от имени нового пользователя. В оригинале был использован 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‑вход под новым пользователем работает без пароля.
Типичные проблемы и способы решения
- Неправильные права на файлы ключей — SSH отклоняет ключи. Убедитесь, что приватный ключ имеет 400 или 600.
- Скрипт не может подключиться — проверьте адрес/порт/путь к .pem и сетевую доступность (Security Group на EC2).
- Публичный ключ в неверном формате — убедитесь, что это строка OpenSSH (начинается с ssh‑rsa/ssh‑ed25519 и т.д.).
- Отсутствие 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)
- Проверка доступа к хосту и сохранение .pem.
- Подготовка публичного ключа пользователя.
- Запуск provide-access.sh с нужными аргументами.
- Верификация создания пользователя и прав на файлы.
Сводка
Скрипт упрощает и ускоряет процесс добавления системных пользователей и раздачи им доступа через публичные SSH‑ключи. Это снижает количество ручных ошибок и стандартизирует операцию. Для production‑среды рекомендуется интегрировать подход с системой управления конфигурацией и следовать лучшим практикам безопасности.
Глоссарий (одна строка):
- authorized_keys — файл в ~/.ssh, содержащий публичные ключи, которые разрешены для аутентификации.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента