Termux предоставляет полноценную Linux‑среду на Android‑устройстве, что делает его отличным инструментом для разработчиков, системных администраторов и специалистов по безопасности. Одним из самых частых сценариев использования является работа с удалёнными репозиториями и серверами через ssh. Хранение приватных SSH‑ключей непосредственно в файловой системе устройства несёт в себе риск компрометации, особенно если телефон попадает в чужие руки.
В этой статье мы рассмотрим, как защитить приватный SSH‑ключ в Termux с помощью GnuPG (gpg) и ssh‑agent, а также автоматизировать процесс добавления ключа через ssh‑add.
Почему обычное хранение небезопасно
- Файлы в
~/.sshдоступны любому приложению с правами доступа к хранилищу Termux. - При потере телефона или его компрометации злоумышленник может скопировать ключ и получить доступ к вашим серверам.
- Стандартные права доступа (
600) защищают только от других пользователей Linux‑системы, но не от Android‑приложений.
Установка необходимых пакетов
pkg update && pkg upgrade -y
pkg install gnupg openssh -y
Пакет gnupg предоставляет инструменты для асимметричного шифрования, а openssh — клиентскую часть ssh и вспомогательные утилиты (ssh‑add, ssh‑agent).
Создание или импорт SSH‑ключа
Если у вас уже есть готовый ключ, скопируйте его в ~/.ssh/id_rsa. В противном случае сгенерируйте новый:
ssh-keygen -t ed25519 -a 100 -f ~/.ssh/id_ed25519 -C "your@email.com"
Не задавайте пароль, если планируете хранить ключ в зашифрованном виде GnuPG – пароль будет запрашиваться у gpg.
Шифрование приватного ключа с помощью GnuPG
Создайте (если ещё нет) GPG‑ключ, который будет использоваться для шифрования:
gpg --full-generate-key
Выберите тип RSA and RSA (default) (2048 бит или 4096 бит) и задайте надёжный пароль. После завершения запомните KEY_ID (например, AB12CDEF).
Зашифруйте приватный SSH‑ключ:
gpg --output ~/.ssh/id_ed25519.gpg --encrypt --recipient AB12CDEF ~/.ssh/id_ed25519
После успешного шифрования можно удалить оригинальный файл:
rm -f ~/.ssh/id_ed25519
Настройка ssh‑agent и автоматическое добавление ключа
Для того, чтобы ssh использовал ваш зашифрованный ключ, необходимо:
- Запустить
ssh‑agentи экспортировать переменные окружения. - Расшифровать ключ в RAM и добавить его в агент через
ssh‑add.
Создайте скрипт ~/bin/ssh-agent-start.sh (не забудьте сделать его исполняемым chmod +x):
#!/data/data/com.termux/files/usr/bin/bash
# Запуск ssh-agent, если он ещё не запущен
if ! pgrep -x ssh-agent > /dev/null; then
eval "$(ssh-agent -s)"
fi
# Расшифровка ключа в временный файл (в RAM)
TMP_KEY=$(mktemp -p /dev/shm sshkey.XXXXXX)
gpg --quiet --batch --yes --decrypt ~/.ssh/id_ed25519.gpg > "$TMP_KEY"
chmod 600 "$TMP_KEY"
# Добавление в агент (ssh‑add запросит пароль gpg, если он нужен)
ssh-add "$TMP_KEY"
# Удаляем временный файл сразу после добавления
shred -u "$TMP_KEY"
# Сообщаем пользователю
echo "SSH‑ключ успешно добавлен в ssh‑agent"
Теперь достаточно выполнить скрипт один раз после каждой перезагрузки Termux:
~/bin/ssh-agent-start.sh
Для автоматизации добавьте вызов в файл ~/.bashrc (или ~/.zshrc, если используете Zsh):
# --- BEGIN: Автозапуск ssh‑agent с зашифрованным ключом
if [ -z "$SSH_AUTH_SOCK" ]; then
source ~/bin/ssh-agent-start.sh
fi
# --- END
Проверка работы
После выполнения скрипта проверьте, что агент действительно хранит ваш ключ:
ssh-add -l
Вы увидите отпечаток вашего публичного ключа. Теперь любые ssh‑соединения будут использовать его автоматически.
Дополнительные меры защиты
- Блокировка экрана Android – предотвращает доступ к Termux без разблокировки.
- Тайм‑аут ssh‑agent – можно задать
SSH_AGENT_TIMEOUT(например, 3600 сек.) и добавить в.bashrc:export SSH_AGENT_TIMEOUT=3600 - Хранение GPG‑ключа в аппаратном токене (YubiKey) – полностью исключает хранение пароля в памяти устройства.
Устранение типичных проблем
| Проблема | Причина | Решение |
|---|---|---|
| «gpg: decryption failed: No secret key» | Отсутствует соответствующий секретный GPG‑ключ в keyring. | Импортируйте ключ командой gpg --import your_private_key.asc. |
| «ssh-add: Could not open a connection to your authentication agent» | ssh‑agent не запущен или переменные окружения не экспортированы. | Убедитесь, что скрипт ssh-agent-start.sh выполнен, либо запустите eval "$(ssh-agent -s)" вручную. |
| «Permission denied (publickey)» | Ключ не был добавлен в агент или использован неверный публичный ключ. | Проверьте вывод ssh-add -l и убедитесь, что публичный ключ присутствует в ~/.ssh/authorized_keys на сервере. |
Заключение
Защита SSH‑ключей в Termux – это комбинация надёжного шифрования (GnuPG) и удобного доступа через ssh‑agent. При правильной настройке ваш приватный ключ хранится в зашифрованном виде, появляется в памяти только на время сеанса и автоматически удаляется после использования. Такой подход минимизирует риск утечки и делает работу с удалёнными системами на мобильных устройствах безопасной.
Если вам требуется индивидуальная настройка безопасной инфраструктуры, аудит мобильных DevOps‑процессов или интеграция аппаратных токенов (YubiKey, Nitrokey) – команда RybinskLab готова предоставить профессиональные услуги. Мы поможем построить надёжную систему доступа, оптимизировать скрипты автоматизации и обеспечить соответствие требованиям информационной безопасности.