02-user — пользователь для деплоя
Создаёт непривилегированного пользователя
deploy, раскладывает SSH-ключи, выдаёт passwordless sudo и стандартные каталоги. 🔒 обязательный.
Зачем нужен
Работать на сервере под root — плохая практика: любая ошибка или скомпрометированный процесс сразу получают полный контроль. Этот модуль создаёт отдельного пользователя (по умолчанию deploy), под которым живут приложения, docker-контейнеры и деплой-скрипты. Он же — путь восстановления доступа, если прямой вход root по SSH будет отключён модулем безопасности.
Пользователь получает sudo (право выполнять команды от имени root) через группу sudo (на Debian/Ubuntu) или wheel (на RHEL/SUSE). Причём sudo настраивается без пароля (NOPASSWD) — это осознанное решение: сам mitdev перезапускает привилегированные команды через sudo -n (без запроса пароля), и на серверах с входом только по ключу пароль от unix-аккаунта не добавляет реальной защиты (SSH-ключ и так эквивалентен root-доступу), зато его отсутствие ломало бы всю автоматизацию.
Без этого модуля не было бы безопасного «рабочего» аккаунта, authorized_keys не были бы разложены, а команды mitdev, требующие root, не работали бы в неинтерактивном режиме. Этого модуля достаточно, чтобы зайти на сервер по ключу под deploy и управлять им; усиление самого SSH делает модуль 03-security.
Когда включать и когда не нужен
- Всегда включён — обязательный модуль.
- Идемпотентен: если пользователь уже существует, модуль не пересоздаёт его, а лишь обновляет настройки (группы, sudo, ключи, каталоги). Повторный запуск безопасен.
- Пароль устанавливается только если задан
DEPLOY_PASSWORD(в мастере можно оставить пустым — тогда пароль не меняется).
Зависимости и требования
- Логически идёт после 01-system (базовые пакеты,
openssl). - Генерация SSH-ключей (если включена) требует
ssh-keygen; при его отсутствии установщик доустанавливаетopenssh-client. - Мультидистро: административная группа определяется автоматически —
sudoна Debian/Ubuntu,wheelна RHEL/SUSE/Arch; если группы нет, она создаётся. - Проверка правила sudoers выполняется через
visudo -c— при непрохождении проверки правило не применяется (чтобы не сломать sudo).
Что именно делает
Пошагово, в порядке module_install (имя пользователя — из DEPLOY_USER):
- Создаёт пользователя
useradd --create-home --shell /bin/bash <user>(если его ещё нет) и регистрирует откатuserdel -r. - Пароль — если задан
DEPLOY_PASSWORD, устанавливает его черезchpasswd. Значение пароля в лог не пишется. - Административная группа — определяет
sudo/wheel, создаёт при отсутствии и добавляет пользователя:usermod -aG <группа> <user>. - Passwordless sudo — пишет файл
/etc/sudoers.d/90-mitdev-<user>с правилом<user> ALL=(ALL) NOPASSWD:ALL, проверяет егоvisudo -cи только после успешной проверки применяет. Регистрирует откат. - SSH-ключи (
authorized_keys— файл со списком публичных ключей, которым разрешён вход): раскладывает ключ root в/root/.ssh/authorized_keys(изROOT_SSH_KEY) и ключи deploy в/home/<user>/.ssh/authorized_keys(изDEPLOY_SSH_KEYS/DEPLOY_SSH_KEY). Каталог.sshсоздаётся с правами700, файл —600, дубли ключей не добавляются. - Каталоги — создаёт стандартную структуру из
DEPLOY_HOME_DIRS(apps docker logs backups scripts) с правами750, владелец — пользователь; домашний каталог тоже750. - Отмечает модуль выполненным (
state_mark).
Сами SSH-ключи (пары Ed25519) генерирует не модуль, а мастер установки (
install.sh) до его запуска — см. раздел «Генерация ключей».
Генерация ключей Ed25519 и Termius
Если GENERATE_SSH_KEYS_DEFAULT=yes (по умолчанию), мастер предлагает сгенерировать свежие пары ключей Ed25519 (современный, короткий и быстрый тип SSH-ключей) для root и для deploy:
- Приватные ключи хранятся только на сервере, в каталоге
GENERATED_SSH_KEY_DIR=/root/.mitdev-keys/(права700), файлы вида<имя>_ed25519(600) и<имя>_ed25519.pub(644). - Публичные части сразу попадают в
authorized_keysсоответствующих аккаунтов этим модулем. - Пути к ключам дублируются в файл учётных данных
/root/.mitdev-credentials(только root,600).
Чтобы забрать приватный ключ для клиента (например, Termius или другого SSH-приложения):
sudo mitdev ssh-key # статус: какие ключи есть и где лежат
sudo mitdev ssh-key show deploy # печатает приватный ключ deploy (скопировать в Termius)
sudo mitdev ssh-key show root # приватный ключ root
sudo mitdev ssh-key pub deploy # публичный ключ
sudo mitdev ssh-key path deploy # путь к файлу ключа
В Termius: Keychain → New Key → вставить содержимое приватного ключа. Приватный ключ — это доступ к серверу; не пересылайте его по незащищённым каналам.
Файлы, службы и порты
| Путь | Назначение | Владелец:права |
|---|---|---|
/home/<user> |
домашний каталог deploy | <user>:<user>, 750 |
/home/<user>/{apps,docker,logs,backups,scripts} |
стандартная структура (DEPLOY_HOME_DIRS) |
<user>:<user>, 750 |
/home/<user>/.ssh/authorized_keys |
публичные ключи для входа deploy | <user>:<user>, 600 (каталог 700) |
/root/.ssh/authorized_keys |
публичные ключи для входа root | root, 600 |
/etc/sudoers.d/90-mitdev-<user> |
правило passwordless sudo | root, 440 |
/root/.mitdev-keys/ |
приватные+публичные Ed25519-ключи (если генерировались) | root, каталог 700 |
/root/.mitdev-credentials |
пути к сгенерированным ключам | root, 600 |
/var/lib/mitdev/state/user.done |
отметка выполнения модуля | root |
Служб и портов модуль не создаёт.
Настройка
| Переменная | Тип / значения | По умолчанию | На что влияет | Когда менять |
|---|---|---|---|---|
DEPLOY_USER_DEFAULT |
имя пользователя (^[a-z_][a-z0-9_-]{0,31}$) |
deploy |
предлагаемое имя в мастере (итог — DEPLOY_USER) |
если политика требует другого имени |
DEPLOY_USER |
имя пользователя | из мастера / DEPLOY_USER_DEFAULT |
фактическое имя создаваемого пользователя | задают в мастере |
DEPLOY_PASSWORD |
строка или пусто | пусто (спрашивает мастер) | пароль unix-аккаунта; пусто — не менять | если нужен вход по паролю (не рекомендуется) |
DEPLOY_SSH_KEY |
публичный ключ | пусто (спрашивает мастер) | один публичный ключ для deploy | если добавляете свой ключ |
DEPLOY_SSH_KEYS |
список ключей (по строке) | формируется из введённого/сгенерированного | все ключи deploy | обычно заполняется автоматически |
ROOT_SSH_KEY |
публичный ключ | из сгенерированного root-ключа | ключ для входа root | обычно автоматически |
DEPLOY_HOME_DIRS |
список каталогов через пробел | apps docker logs backups scripts |
какие подкаталоги создать в $HOME |
если нужна другая структура |
GENERATE_SSH_KEYS_DEFAULT |
yes/no |
yes |
генерировать ли Ed25519-ключи в мастере | no, если приносите свои ключи |
GENERATED_SSH_KEY_DIR |
путь | /root/.mitdev-keys |
где хранятся приватные ключи | почти никогда |
Мастер установки спрашивает: имя пользователя, пароль (можно пусто), публичный SSH-ключ (можно пусто), нужно ли генерировать ключи для Termius.
Как переопределить настройки
- Экспорт перед установкой (
-Eсохраняет переменные приsudo):DEPLOY_USER_DEFAULT=web DEPLOY_HOME_DIRS="apps logs releases" sudo -E ./install.sh - Правка
config/defaults.conf— изменитеDEPLOY_USER_DEFAULT,DEPLOY_HOME_DIRS,GENERATE_SSH_KEYS_DEFAULT,GENERATED_SSH_KEY_DIR. - Ответы в мастере установки — имя пользователя, пароль, свой публичный ключ и согласие на генерацию ключей задаются интерактивно при запуске без экспортов.
Проверка, что всё работает
module_verify считает модуль успешным, если пользователь существует и состоит в административной группе (sudo/wheel).
Ручные проверки:
id deploy # должен показать группу sudo (или wheel)
sudo -l -U deploy # правило (ALL) NOPASSWD: ALL
ls -la /home/deploy/.ssh/authorized_keys # права 600, ключи внутри
ls /home/deploy # apps docker logs backups scripts
sudo mitdev ssh-key # статус сгенерированных ключей
Проверка входа по ключу (с локальной машины, не закрывая текущую сессию):
ssh -i /путь/к/приватному/ключу deploy@<адрес-сервера>
Типовые задачи
- Забрать приватный ключ для Termius/клиента:
sudo mitdev ssh-key show deploy - Добавить свой публичный ключ существующему deploy:
sudo -u deploy tee -a /home/deploy/.ssh/authorized_keys < ~/mykey.pub - Сменить пароль пользователя:
sudo passwd deploy - Проверить, что sudo работает без пароля:
sudo -n -u deploy sudo -n true && echo OK - Пересоздать/обновить каталоги и настройки — просто перезапустите установку: модуль идемпотентен.
Частые ошибки
| Симптом | Причина | Что сделать |
|---|---|---|
sudo просит пароль у deploy |
правило sudoers не применилось (не прошло visudo -c) |
проверьте /etc/sudoers.d/90-mitdev-deploy, посмотрите errors.log, перезапустите модуль |
| Не пускает по ключу | публичного ключа нет в authorized_keys или неверные права |
проверьте authorized_keys (600) и .ssh (700); добавьте ключ; см. рецепт выше |
mitdev ssh-key пишет «ключи не найдены» |
ключи не генерировались (GENERATE_SSH_KEYS_DEFAULT=no) или удалены |
сгенерируйте заново или используйте свой ключ |
| Домашний каталог пуст | старый пользователь без нужной структуры | перезапустите модуль — он создаст DEPLOY_HOME_DIRS |
Безопасность и продакшен
Модуль уже закрывает: отдельный непривилегированный аккаунт вместо root, строгие права на .ssh и authorized_keys, безопасное хранение приватных ключей только под root (700/600), проверку правила sudoers перед применением.
Остаётся на клиенте: беречь приватные ключи (не хранить в общих чатах/репозиториях); при желании сузить sudo вручную (по умолчанию NOPASSWD:ALL — см. объяснение в разделе «Зачем нужен»); включить отключение root-входа и паролей в модуле 03-security.
Откат и удаление
- Авто-откат при падении установки (
module_rollback): удаляет только что созданного пользователя вместе с его домашним каталогом (userdel -r). mitdev remove user: удаляет пользователя, но по умолчанию сохраняет домашний каталог (/home/<user>— там apps, docker, backups: данные клиента). Перед удалением завершает процессы пользователя (pkill).mitdev remove user --purge: удаляет пользователя и его домашний каталог целиком (необратимо).
См. также
- ../COMMANDS.md —
mitdev ssh-key,mitdev remove. - ../CONFIGURATION.md — переменные deploy и SSH-ключей.
- 03-security.md — усиление SSH (отключение пароля/root-входа).
- 01-system.md — базовая подготовка, выполняется раньше.