Пароли в открытом виде в .env (включая sudo-пароль админа), захардкоженные секреты в скриптах (MySQL root, ключ шифрования, SSH-пароль к чужому серверу), NOPASSWD-sudo у orphan-аккаунта y4tsun0v, zabbix в группе docker (=root), открытый FTP (cleartext), docker.sock в контейнере autoheal
🟠 Средняя
Хост-firewall выключен, переиспользование одного SSH-ключа на 4 аккаунта, переиспользование пароля для нескольких сервисов, Zabbix/Acronis на всех интерфейсах, бессрочные пароли, self-signed (snakeoil) TLS, journald без лимита (1.2 ГБ) + диск 74%
🟢 Хорошо
Postfix НЕ open-relay; порт 25 только во внутреннем VPC; SSH (только ключи, root запрещён, AllowUsers, нестандартный порт, maxauthtries 3); реальных приватных ключей приложения нет; SUID штатный; нет пустых паролей; один UID 0; 0 security-обновлений в очереди
Главный вывод: входная дверь (SSH) и сам почтовик (Postfix) настроены добротно — релей закрыт, 25-й порт смотрит только во внутреннюю сеть. Но рядом лежит файл /home/evrotrans/stable/.env со всеми паролями открытым текстом, а в обслуживающих скриптах захардкожены ещё и MySQL-root и SSH-пароли — это даёт мгновенную эскалацию. Плюс повторяются проблемы первого сервера: orphan-аккаунт с беспарольным sudo и открытый незашифрованный FTP.
2. 🔴 Секреты открытым текстом — /home/evrotrans/stable/.env
Это один из самых серьёзных рисков сервера. Файл содержит рабочие пароли в plaintext:
Переменная
Значение
Что компрометирует
ENV_SERVER_ADMIN_PASSWORD
xe3LLhaPF…
🔴 Пароль админа r3ddan9 — он же sudo-пароль
ENV_CRON_ADMIN_PASS
xe3LLhaPF…
🔴 Тот же пароль (переиспользован)
ENV_SERVER_USER_PASSWORD / ENV_CRON_USER_PASS
b3dYoqkH…
🔴 Пароль evrotrans (он же FTP-логин)
ENV_BACKUP_SERVER_PASSWORD
UoXR9Jca…
🔴 Доступ к бэкап-серверу dev.evrotrans.net:48008
ENV_POSTFIX_PASSWORD
V9MbTVH7…
🟠 SMTP-аутентификация webmaster@evrotrans.net
ENV_ENCRYPTION_PASSWORD / _SELF
w7yNyNnJ…
🟠 Пароль шифрования (одинаковый)
ENV_GITHUB_TOKEN
ghp_hash
⚪ Плейсхолдер, не реальный токен
Пароль xe3LLhaPFWfsgzoc = пароль входа и sudo для r3ddan9. Любой, кто прочитает .env, получает sudo на хосте.
Пароли переиспользуются между сервисами (admin↔cron, user↔FTP) и, вероятно, между серверами.
Файл лежит в дереве приложения stable/ рядом с docker-compose.yml — высокий риск попадания в git/бэкап.
Действия (срочно): сменить все пароли; прекратить переиспользование; убрать из git (filter-repo/BFG); chmod 600; Docker secrets/vault; проверить утечку в бэкапы.
2-bis. 🔴 Захардкоженные секреты в скриптах (stable/host/)
Помимо .env, реальные пароли зашиты прямо в код сервисных скриптов (читаемы под evrotrans):
Файл
Секрет
Что компрометирует
cron_home_backuper_database.sh
mysqldump -uroot -p"vsyvzoajoa"
🔴root-пароль MySQL парка в открытую
cron_home_backuper_{config,database,web}.sh
openssl … -k w7yNyNnJVx4N
🔴Ключ шифрования бэкапов в 3 скриптах (= .env) — расшифровка любого бэкапа
cron_backup_catcher_config.sh
sshpass -p "V2LaYJMAc0" scp … etrans@77.222.52.97
🔴SSH-пароль к другому серверу77.222.52.97; всплыли юзеры etrans, vitek
Один скомпрометированный файл host/ = доступ к БД парка (MySQL root), расшифровка всех бэкапов и SSH к соседнему серверу. Ключ шифрования лежит рядом с данными — шифрование декоративное. Пароли через sshpass -p видны в ps.
⚠️ Эти скрипты ссылаются на пути /home/etrans/stable/... и контейнеры (stable_mysql_1, stable-certbot-1), которых на mailer нет — это общая библиотека, скопированная с web-сервера. На mailer инертна, но секреты в ней настоящие и общие для парка.
Действия: сменить root-пароль MySQL и SSH-пароль к 77.222.52.97; вынести ключ шифрования из кода; перейти на SSH-ключи. Применить и на web-сервере, где скрипты активны.
UID 0 ровно один ✅ · Пустых паролей нет ✅ · Системные демоны — nologin ✅
3.2 🔴 sudo и группа docker
root ALL=(ALL:ALL) ALL
%admin ALL=(ALL) ALL # группа admin — ПУСТАЯ
%sudo ALL=(ALL:ALL) ALL # только r3ddan9 (с паролем)
y4tsun0v ALL=(ALL) NOPASSWD:ALL # /etc/sudoers.d/90-cloud-init-users
getent group docker → r3ddan9, evrotrans, zabbix. Группа docker эквивалентна root. То есть evrotrans и zabbix (агент мониторинга) фактически имеют root без пароля и без sudo. Компрометация Zabbix-агента = root на хосте.
y4tsun0v — полный root без пароля через cloud-init (подтверждено в метаданных Yandex Cloud). По SSH не заходит, но любая локальная сессия под ним → мгновенный root.
🔍 Доказательство — getent group docker
# getent group docker
docker:x:998:r3ddan9,evrotrans,zabbix
# docker-группа = root без пароля, в т.ч. у агента zabbix
# sudo sshd -T | grep -Ei '^(port|permitrootlogin|passwordauthentication|pubkeyauthentication|permitemptypasswords|maxauthtries|allowusers)'
port 48008
permitrootlogin no
passwordauthentication no
pubkeyauthentication yes
permitemptypasswords no
maxauthtries 3
allowusers r3ddan9 evrotrans
# только ключи, root запрещён, нестандартный порт, белый список — SSH настроен хорошо
Во всех четырёх аккаунтах прописан один ключ danil@IdeaPad-3-14ALC6. Root-ключ обезврежен форсированной командой-заглушкой. ✅
🟠 Один приватный ключ = доступ ко всем учёткам.
🟠 /home/evrotrans/.ssh/authorized_keys и /home/r3ddan9/.ssh/authorized_keys имеют права 664 (читаемы миром, group-writable) — должно быть 600.
🔍 Доказательство — ls -l .../authorized_keys
# ls -l /home/evrotrans/.ssh/authorized_keys /home/r3ddan9/.ssh/authorized_keys
-rw-rw-r-- 1 evrotrans evrotrans … /home/evrotrans/.ssh/authorized_keys
-rw-rw-r-- 1 r3ddan9 r3ddan9 … /home/r3ddan9/.ssh/authorized_keys
# права 664 (group-writable, читаемы миром) — должно быть 600
# sudo grep -rl 'danil@IdeaPad-3-14ALC6' /root/.ssh /home/*/.ssh
/root/.ssh/authorized_keys
/home/y4tsun0v/.ssh/authorized_keys
/home/r3ddan9/.ssh/authorized_keys
/home/evrotrans/.ssh/authorized_keys
# один и тот же ключ во всех 4 аккаунтах = единая точка компрометации
Чужие письма не пересылаются. 🟢 Порт 25 проброшен только на внутренний VPC-адрес 10.150.0.20:25 — снаружи SMTP недоступен. Сервис активно отправляет почту (см. раздел доставляемости в ARCHITECTURE).
🟠 TLS на self-signed snakeoil-сертификате, security_level = may — SASL-логин может уйти по нешифрованному каналу. Поставить Let's Encrypt для mail.evrotrans.net.
6. FTP (vsftpd) — 🔴 открыт наружу, без шифрования
listen_port=48080
anonymous_enable=NO # ✅ анонимов нет
ssl_enable=NO # 🔴 шифрования НЕТ
chroot_local_user=YES, local_root=/home/$USER/
allow_writeable_chroot=YES # 🟠 ослабляет chroot
userlist_enable=YES, userlist_deny=NO # белый список: r3ddan9, evrotrans
🔴 vsftpd слушает 0.0.0.0:48080 — доступен из интернета, передаёт логин/пароль открытым текстом. Логины = локальные пользователи, пароли в .env plaintext.
✅ Но FTP фактически не используется (/var/log/vsftpd.log пуст) → отключение (systemctl disable --now vsftpd) закрывает риск без потерь. Если понадобится — SFTP (уже есть SSH) или FTPS + сертификат + firewall.
🔴 autoheal + docker.sock: доступ к Docker-сокету = возможность запустить привилегированный контейнер и стать root на хосте. Минимизировать: socket-proxy с ограниченными endpoint'ами либо :ro.
# curl -s -H 'Metadata-Flavor: Google' metadata.google.internal/computeMetadata/v1/instance/attributes/user-data
#cloud-config
users:
- name: y4tsun0v
sudo: ALL=(ALL) NOPASSWD:ALL
…
# curl -s -H 'Metadata-Flavor: Google' …/attributes/enable-oslogin
Not Found
# cloud-init жёстко прописывает y4tsun0v NOPASSWD:ALL; OS Login выключен → контроль метаданных = контроль VM
9. Сетевые порты
Порт
Процесс
Оценка
48008 tcp
sshd
✅ SSH (ключи)
48080 tcp
vsftpd
🔴 FTP — наружу, без шифрования
10050 tcp (*)
zabbix_agent2
🟠 только серверу Zabbix
37845 tcp (*)
grpm-sync (Acronis)
🟠 на всех интерфейсах
10.150.0.20:25
postfix
✅ только внутренний VPC
🔍 Доказательство — ss -tulpn
# ss -tulpn
LISTEN 0 … 0.0.0.0:48008 … users:(("sshd",…))
LISTEN 0 … 0.0.0.0:48080 … users:(("vsftpd",…))
LISTEN 0 … *:10050 … users:(("zabbix_agent2",…))
LISTEN 0 … *:37845 … users:(("grpm-sync-unit",…))
# sshd, vsftpd, zabbix-агент и Acronis слушают на всех интерфейсах (наружу)
10. Firewall — 🟠 выключен
ufw status → inactive. В iptables — только автоправила Docker; ограничений на INPUT нет (-P INPUT ACCEPT). Порты 48080/10050/37845 открыты всем, кого пропустит облачный SG.
Приватные ключи на диске: реальных секретов приложения нет — только snakeoil/fwupd/Acronis. ✅
12-bis. 🟠 Дисковое пространство и журналы
Диск / заполнен на 74% (11/15 ГБ) — пока не критично, но растёт бесконтрольно:
Потребитель
Объём
Примечание
/var/log/journal
1.2 ГБ
🟠 systemd-журнал без лимита
Acronis (/opt + /var/lib + /usr/lib)
~3.7 ГБ
агент бэкапа — главный потребитель
один лог Acronis Scheduler
152 МБ
один файл
crontab/logs/cron.log
9.9 МБ
спам crond: wakeup (cron в простое)
/swapfile
1.0 ГБ
+ zram-своп
Память: контейнеры почти ничего не едят (postfix 16 МБ); основное потребление — агент Acronis (mms 57 МБ, task-manager 21 МБ). Машина на постоянном свопе (RAM 1 ГБ).
Действия: лимит журналу (SystemMaxUse=200M), ротация логов Acronis и cron.log; рассмотреть увеличение диска/RAM.
🔍 Доказательство — du -sh /var/log/journal / df -h /
# du -sh /var/log/journal
1.2G /var/log/journal
# df -h /
Filesystem Size Used Avail Use% Mounted on
/dev/… 15G 11G 4.0G 74% /
# journald без лимита (1.2 ГБ), диск / заполнен на 74%
13. План действий
🔴 Высокий приоритет
.env-секреты: сменить ВСЕ пароли; прекратить переиспользование; chmod 600; убрать из git/бэкапов; secrets/vault.
Захардкоженные секреты в скриптах: сменить MySQL root (vsyvzoajoa), SSH-пароль к 77.222.52.97 (V2LaYJMAc0), ключ шифрования; перейти на SSH-ключи. Применить и на web-сервере.
zabbix из группы docker: убрать (gpasswd -d zabbix docker). Пересмотреть evrotrans.
y4tsun0v NOPASSWD-sudo: удалить orphan или убрать NOPASSWD; исправить cloud-init в метаданных Yandex Cloud.
FTP:отключить — сервис не используется, риск снимается без потерь.
Скрипты host/ — общая библиотека, ссылающаяся на пути web-сервера (/home/etrans/...) и содержащая секреты MySQL/SSH. Исправления по §2-bis нужно провести на всём парке, а не только на mailer.