Аудит безпеки Magento 2
Magento 2 — одна з найбільш атакованих платформ електронної комерції. Основні вектори атак: вразливості в розширеннях, застарілі версії без патчів, відкритий шлях адміністратора. Adobe/Magento регулярно публікують APSB-бюлетені — жодний сайт Magento не повинен працювати без поточних патчів безпеки.
Перевірка версії та патчів
# Поточна версія
php bin/magento --version
# Перевірити застосовані патчі
php ./vendor/bin/magento-patches status
# Composer audit — вразливості у залежностях
composer audit
# Порівняти з журналом змін останнього випуску
# https://experienceleague.adobe.com/docs/commerce-operations/release/notes/overview.html
Сайти на Magento 2.3.x (EOL з вересня 2022) та 2.4.3 і менше критично вразливі. Оновлення до 2.4.6+ обов'язково.
URL адміністратора
За замовчуванням Magento 2 використовує /admin або випадковий суфікс з app/etc/env.php:
// app/etc/env.php
'backend' => [
'frontName' => 'admin_secretpath'
],
Переконайтеся через Nginx, що шлях адміністратора не індексується та обмежений за 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 (атак крадіжки карток).
Політика безпеки контенту
# Перевірити заголовок 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
# Перевірити вбудований 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-ін'єкція у спеціальних модулях
// Вразливий шаблон (знайдено в старіших розширеннях)
$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"
Перевірка журналів на атаки
# Підозрілі запити до адміністратора
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
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 дні. Включаючи перевірку всіх сторонніх розширень, конфігурацію сервера, БД та аналіз журналів.







