NOPASSWD-sudo у orphan-аккаунта y4tsun0v, приватный SSH-ключ в дереве приложения, ключи OpenVPN CA на диске, открытый FTP (vsftpd)
🟠 Средняя
5
Переиспользование одного личного SSH-ключа, Zabbix/Acronis на всех интерфейсах, пароли без срока действия, незавершённый аудит SUID, массовый перебор SSH
🟢 Хорошо настроено
—
SSH: запрет root-логина, только ключи, AllowUsers, нестандартный порт; root-пароль заблокирован; нет пустых паролей; нет лишних UID 0
Главный вывод: базовая защита SSH настроена грамотно (вход только по ключу, root запрещён, нестандартный порт, белый список пользователей). Основные риски — не во входной двери, а внутри: orphan-аккаунт с беспарольным sudo, реальные приватные ключи, лежащие в каталоге приложения, и устаревший FTP-сервис.
Пустых паролей нет (awk по /etc/shadow ничего не вернул). ✅
🔍 Доказательство — awk -F: '($3==0)' /etc/passwd
# awk -F: '($3==0){print $1}' /etc/passwd
root
# единственная учётка с UID 0 — скрытых суперпользователей нет
🔍 Доказательство — awk -F: '($2=="")' /etc/shadow
# sudo awk -F: '($2==""){print $1}' /etc/shadow# вывод пуст — учётных записей с пустым паролем нет
2.2 Привилегии (sudo) — детально
Конфигурация даёт root тремя путями:
root ALL=(ALL:ALL) ALL # /etc/sudoers
%admin ALL=(ALL) ALL # группа admin — ПУСТАЯ
%sudo ALL=(ALL:ALL) ALL # группа sudo — только r3ddan9
y4tsun0v ALL=(ALL) NOPASSWD:ALL # /etc/sudoers.d/90-cloud-init-users
getent group sudo → r3ddan9 (единственный «обычный» админ, требует пароль).
getent group admin → пусто.
🔍 Доказательство — getent group sudo
# getent group sudo
sudo:x:27:r3ddan9
# в группе sudo (требует пароль) — только r3ddan9# getent group admin
admin:x:
# группа admin пуста — членов нет
🔴 y4tsun0v имеет полный root БЕЗ пароля через cloud-init drop-in. При этом аккаунт не может зайти по SSH (нет в AllowUsers) — но любой, кто получит локальную сессию под этим пользователем (например, через su/cron/эксплойт сервиса), сразу станет root без запроса пароля.
🟠 Наблюдение: один и тот же личный ключ danil@IdeaPad-3-14ALC6 прописан во всех четырёх аккаунтах. Это означает, что один человек (danil) = root(заглушка)/r3ddan9/y4tsun0v/evrotrans. Компрометация одного приватного ключа на ноутбуке IdeaPad-3-14ALC6 даёт доступ ко всем учёткам сразу. Ключ root@7cb276780667 — это деплой-ключ GitHub Actions (CI/CD).
🔍 Доказательство — обход authorized_keys всех аккаунтов
# for u in root r3ddan9 y4tsun0v evrotrans; do echo "== $u =="; sudo cat /home/$u/.ssh/authorized_keys 2>/dev/null; done
== root ==
command="echo 'Please login as ...'" ssh-... danil@IdeaPad-3-14ALC6
== r3ddan9 ==
ssh-... danil@IdeaPad-3-14ALC6
ssh-... root@7cb276780667
== y4tsun0v ==
ssh-... danil@IdeaPad-3-14ALC6
== evrotrans ==
ssh-... danil@IdeaPad-3-14ALC6
ssh-... root@7cb276780667
# один личный ключ danil@IdeaPad-3-14ALC6 во всех 4 аккаунтах; у root — обезврежен командой-заглушкой; root@7cb276780667 = деплой-ключ GitHub Actions
4. Приватные ключи и секреты на диске
Подавляющее большинство найденного find-ом — это штатные файлы Let's Encrypt и тестовые фикстуры библиотек (ложные срабатывания). Ниже разделено на реальные риски и шум.
4.1 🔴 Реальные приватные ключи (требуют внимания)
Путь
Что это
Риск
/home/evrotrans/stable/crontab/keys/id_rsa
Приватный SSH-ключ внутри дерева приложения
🔴 Используется, видимо, cron-задачами для деплоя/доступа. Лежит в каталоге приложения — рискует попасть в бэкап/архив/git/публикацию.
# sudo find /home/evrotrans/stable -name id_rsa -o -name '*.key' 2>/dev/null
/home/evrotrans/stable/crontab/keys/id_rsa
/home/evrotrans/stable/openvpn/config/web-ssl/ca.key
/home/evrotrans/stable/openvpn/config/web-ssl/server.key
/home/evrotrans/stable/portainer/data/portainer.key
# реальные приватные ключи (SSH-деплой, CA и сервер OpenVPN, TLS Portainer) лежат в дереве приложения
4.2 🟢 Штатные сертификаты Let's Encrypt (certbot)
/home/evrotrans/stable/certbot/config/{live,archive,keys,csr}/... — сотни privkey*.pem, fullchain*.pem, cert*.pem, *_key-certbot.pem, *_csr-certbot.pem. Это нормальные TLS-сертификаты обслуживаемых доменов. Действие не требуется, но это раскрывает полный список доменов (см. §10).
набор localhost-портов + grpm-sync на всех интерфейсах
google-guest-agent.service
Yandex Cloud гостевой агент
управляет SSH-ключами через метаданные проекта (см. «Added by Google»)
unattended-upgrades.service
Автообновления безопасности
✅ хорошо
vsftpd, atd, cron, unscd, rsyslog
базовые демоны
—
⚠️ Важно про google-guest-agent: агент Yandex Cloud может автоматически добавлять SSH-ключи и пользователей из метаданных проекта/инстанса. Появление ключа «Added by Google» у y4tsun0v — его работа. Контроль над метаданными проекта в облаке = контроль над доступом к VM. Проверьте enable-oslogin / список ключей в метаданных в облачной консоли.
6. Сетевые порты (ss -tulpn)
6.1 Доступны извне (0.0.0.0 / * / [::])
Порт
Протокол
Процесс
Оценка
48008
tcp
sshd
✅ SSH (ключи)
80
tcp
docker-proxy
🟢 HTTP (веб)
443
tcp
docker-proxy
🟢 HTTPS (веб)
1194
tcp+udp
docker-proxy
🟢 OpenVPN
48080
tcp
vsftpd
🔴 FTP — открыт в интернет, протокол незашифрованный
🔴 FTP (vsftpd, 48080): передаёт логины/пароли и данные открытым текстом. Если он не нужен — отключить. Если нужен — заменить на SFTP/FTPS и ограничить firewall'ом.
🟠 Zabbix (10050) и Acronis grpm-sync (40963) слушают * — закрыть firewall'ом/security-group, оставив доступ только с IP сервера мониторинга/Acronis.
🔍 Доказательство — ss -tlpn | grep 48080
# ss -tlpn | grep 48080
LISTEN 0 32 0.0.0.0:48080 0.0.0.0:* users:(("vsftpd"...))
# FTP открыт на 0.0.0.0 (в интернет), протокол незашифрованный
7. Активность входов
7.1 Текущие/недавние сессии (who, last)
Сейчас в системе:r3ddan9 с 77.233.215.97 (pts/0, с 4 июня 23:00); evrotrans на консоли ttyS0 (с 3 июня).
evrotrans регулярно входит с российских резидентных IP: 95.25.x.x, 31.129.102.227, 95.140.157.52.
r3ddan9 — с 178.34.150.110, 95.140.157.52, 77.233.215.97.
История с 14 июня 2025 — выглядит как обычная работа администраторов, аномалий не видно.
7.2 Неудачные входы (lastb) — массовый перебор
🟠 Сотни неудачных SSH-попыток (со 2 июня 2026) с ботнет-адресов:
77.83.39.0/24, 130.12.181.0/24, 45.144.212.54 — перебор имён (huawei, student2, wildfly, ftpu, admin, user...).
Это фоновый интернет-шум. Поскольку парольная аутентификация отключена и есть AllowUsers, эти попытки обречены на провал. Тем не менее рекомендуется fail2ban/sshguard для снижения нагрузки и объёма логов.
🔍 Доказательство — lastb | head
# sudo lastb | head
huawei ssh:notty 77.83.39.x ...
admin ssh:notty 130.12.181.x ...
user ssh:notty 45.144.212.54 ...
# массовый перебор имён с ботнет-подсетей; обречён — парольный вход отключён
8. Задачи по расписанию (cron)
/etc/crontab и /etc/cron.{d,daily,hourly,weekly,monthly} — только штатные системные задачи (apt, logrotate, man-db, popularity-contest и т.п.). Посторонних записей нет. ✅
Персональных crontab нет ни у одного пользователя (вывод crontab -l пуст для всех). ✅
⚠️ При этом в /home/evrotrans/stable/crontab/keys/id_rsa лежит ключ — значит, расписание, вероятно, реализовано внутри Docker-контейнера или через systemd timer, а не через системный cron. Стоит проверить отдельно (systemctl list-timers, cron внутри контейнеров).
🔍 Доказательство — cat /etc/crontab + crontab -l
# cat /etc/crontab# только штатные системные задачи (apt, logrotate, man-db, popularity-contest)# for u in root r3ddan9 evrotrans; do crontab -l -u $u; done
no crontab for root
no crontab for r3ddan9
no crontab for evrotrans
# системный cron чист, персональных нет — но есть .../crontab/keys/id_rsa: расписание внутри Docker-контейнера
# ls /home/evrotrans/stable/certbot/config/archive/
evrotrans.net www api api3 sales erp erp2 erp3
pma pma1 ptr mde doz test p vpn partnerstickets
... wildcard.evrotrans.net
# каталоги certbot раскрывают полный список обслуживаемых поддоменов (карта поверхности атаки)
Это карта поверхности атаки веб-уровня (поддомены ERP, API, phpMyAdmin pma, VPN, test).
⚠️ Поддомены pma/pma1 (phpMyAdmin) и test — частые цели атак; убедитесь, что они закрыты доступом по IP/авторизацией.
11. План действий (приоритизированный)
🔴 Высокий приоритет (сделать в первую очередь)
Разобраться с y4tsun0v: если аккаунт не используется — удалить (userdel) или как минимум убрать NOPASSWD:ALL из /etc/sudoers.d/90-cloud-init-users. Это orphan от первичной настройки VM.
Убрать приватный ключ из дерева приложения: перенести /home/evrotrans/stable/crontab/keys/id_rsa за пределы публикуемого/бэкапируемого каталога, выставить chmod 600, убедиться, что он не попадает в git/архивы. Рассмотреть ротацию ключа.
Защитить ключи OpenVPN:ca.key/server.key — проверить права (600, владелец root/контейнер), убедиться, что каталог не доступен по web. ca.key в идеале хранить offline.
Закрыть/заменить FTP (vsftpd, 48080): отключить, если не используется (systemctl disable --now vsftpd); иначе перейти на SFTP/FTPS + firewall.
🟠 Средний приоритет
Firewall на сервисные порты: ограничить 10050 (Zabbix) и 40963 (Acronis) доступом только с доверенных IP. Использовать облачные security-groups + локальный ufw/nftables.
Установить fail2ban для гашения SSH-перебора и роста логов.
Проверить метаданные Yandex Cloud (SSH-ключи проекта/инстанса, OS Login) — это альтернативный канал доступа в обход authorized_keys.
Политика паролей: задать PASS_MAX_DAYS (напр. 365) для интерактивных аккаунтов.
Разделить переиспользуемый ключ: по возможности завести отдельные ключи на каждого администратора/каждую роль вместо одного danil@IdeaPad.
🟢 Дополнительно
Повторить аудит SUID/SGID (см. §9) — текущий результат недостоверен.