Аудит безопасности Magento 2
Magento 2 — одна из наиболее атакуемых e-commerce платформ. Основные векторы: уязвимости в расширениях, устаревшие версии без патчей, открытый admin-путь. Adobe/Magento регулярно публикует APSB-бюллетени — ни один Magento-сайт не должен работать без актуальных security patches.
Проверка версии и патчей
# Текущая версия
php bin/magento --version
# Проверить применённые патчи
php ./vendor/bin/magento-patches status
# Composer audit — уязвимости в зависимостях
composer audit
# Сравнить с changelog последнего релиза
# https://experienceleague.adobe.com/docs/commerce-operations/release/notes/overview.html
Сайт на Magento 2.3.x (EOL с сентября 2022) и 2.4.3 и ниже — критически уязвим. Обновление до 2.4.6+ обязательно.
Admin URL
По умолчанию Magento 2 использует /admin или случайный суффикс из app/etc/env.php:
// app/etc/env.php
'backend' => [
'frontName' => 'admin_secretpath'
],
Проверить через Nginx, что путь к admin не индексируется и закрыт по IP:
location /admin_secretpath {
allow 192.168.1.0/24;
allow 10.0.0.5;
deny all;
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
include fastcgi_params;
}
Если frontName содержит admin, backend, adminer — изменить немедленно.
Двухфакторная аутентификация
Magento 2.4.x включает 2FA из коробки (модуль Magento_TwoFactorAuth). Проверить что 2FA включена и не отключена через конфигурацию:
php bin/magento config:show twofactorauth/general/enabled
# Должно быть: 1
# Принудительно включить
php bin/magento config:set twofactorauth/general/enabled 1
# Посмотреть провайдеры
php bin/magento config:show twofactorauth/general/force_providers
# google, duo, authy, u2fkey
Проверка файловых прав
# Владелец файлов
stat /var/www/shop.com/app/etc/env.php
# Должен принадлежать www-data (или nginx), НЕ root
# Права env.php — только чтение для владельца
chmod 640 /var/www/shop.com/app/etc/env.php
chmod 640 /var/www/shop.com/app/etc/config.php
# Pub/media не должен содержать PHP
find /var/www/shop.com/pub/media -name "*.php" -type f
find /var/www/shop.com/pub/static -name "*.php" -type f
# Nginx: заблокировать PHP в media
location ~* /pub/media/.*\.(php|phtml|php3|php4|php5|phps)$ {
deny all;
}
Проверка расширений
Сторонние расширения — наиболее частый источник уязвимостей:
# Список установленных расширений
composer show --installed | grep -v magento/
# Проверить каждое расширение на CVE
# База: https://nvd.nist.gov/vuln/search?query=magento
# MageReport: https://www.magestore.com/magento-2-security
# Проверить расширения без обновлений дольше 2 лет
composer show --installed | awk '{print $1, $2}' | while read pkg ver; do
composer show "$pkg" --all 2>/dev/null | grep "time"
done
Расширения, устанавливающие JavaScript напрямую в layout XML без CSP, — потенциальный вектор для Magecart (card skimming атаки).
Content Security Policy
# Проверить заголовок CSP
curl -I https://shop.com/ | grep -i "content-security-policy"
# Включить CSP в Magento 2.3.5+
php bin/magento config:set csp/mode/storefront/report_only_mode 0
php bin/magento config:set csp/mode/admin/report_only_mode 0
// Кастомный CSP через WhitelistConfigInterface
class CspWhitelist implements \Magento\Csp\Api\CspWhitelistXmlInterface
{
public function getWhitelist(): array
{
return [
['id' => 'script-src', 'value' => 'https://js.stripe.com'],
['id' => 'frame-src', 'value' => 'https://js.stripe.com'],
];
}
}
Проверка на Magecart-инъекции
Magecart — атаки через встроенный JS для кражи данных карт:
# Проверить JS-файлы на изменения
find /var/www/shop.com/pub/static -name "*.js" -newer /var/www/shop.com/composer.lock | \
head -20
# Проверить inline JS в базе данных
mysql -u root -p magento2 -e "
SELECT value FROM core_config_data
WHERE path LIKE '%script%' OR path LIKE '%tracking%' OR path LIKE '%google%'
AND value LIKE '%<script%';"
# Проверить CMS-блоки на посторонний JS
mysql -u root -p magento2 -e "
SELECT identifier, content FROM cms_block
WHERE content LIKE '%eval(%' OR content LIKE '%document.write%'
OR content LIKE '%fromCharCode%';"
SQL Injection в кастомных модулях
// Уязвимый паттерн (встречается в старых расширениях)
$query = "SELECT * FROM catalog_product_entity WHERE sku = '" . $sku . "'";
$result = $this->_resource->getConnection()->query($query);
// Безопасно через Magento 2 ResourceModel
$connection = $this->resource->getConnection();
$select = $connection->select()
->from(['e' => 'catalog_product_entity'])
->where('e.sku = ?', $sku);
$result = $connection->fetchAll($select);
Проверить все кастомные модули на прямую конкатенацию в SQL-запросах:
grep -r "getConnection()->query" /var/www/shop.com/app/code/ | \
grep -v "//.*query" | grep "\$_GET\|\$_POST\|\$_REQUEST\|\$request->getParam"
Проверка логов на атаки
# Подозрительные запросы к admin
grep "POST.*admin" /var/log/nginx/access.log | \
awk '{print $1}' | sort | uniq -c | sort -rn | head -20
# Brute force попытки
grep "401\|403" /var/log/nginx/access.log | \
awk '{print $1}' | sort | uniq -c | sort -rn | head -10
# Magento security log
cat /var/www/shop.com/var/log/exception.log | grep -i "authentication\|unauthorized" | tail -50
Шифрование ключей
# Проверить что crypt/key в env.php не пустой и достаточно длинный
php -r "
\$env = require '/var/www/shop.com/app/etc/env.php';
\$key = \$env['crypt']['key'];
echo 'Key length: ' . strlen(\$key) . PHP_EOL;
echo 'Key entropy OK: ' . (strlen(unique_chars(\$key)) > 20 ? 'Yes' : 'No') . PHP_EOL;
"
# Ротация ключа шифрования (шифрует заново данные карт, API-ключи в БД)
php bin/magento encryption:payment-data:update
Сроки
Аудит безопасности Magento 2 с отчётом по уязвимостям и рекомендациями — 2–3 дня. Включая проверку всех сторонних расширений, конфигурации сервера, БД и анализ логов.







