Обеспечение соответствия сайта требованиям PCI DSS
PCI DSS (Payment Card Industry Data Security Standard) — стандарт безопасности для организаций, обрабатывающих данные платёжных карт. Разработан Visa, Mastercard, Amex и другими. Нарушение ведёт к штрафам от платёжных систем, потере права приёма карт, обязательному аудиту.
Уровни соответствия
| Уровень | Объём транзакций | Требования |
|---|---|---|
| Level 1 | >6 млн в год | Ежегодный аудит QSA + ежеквартальное сканирование ASV |
| Level 2 | 1–6 млн в год | Ежегодный SAQ + ежеквартальное сканирование ASV |
| Level 3 | 20k–1M онлайн | Ежегодный SAQ |
| Level 4 | <20k онлайн | Ежегодный SAQ |
SAQ (Self-Assessment Questionnaire) — самооценочный опросник. Тип зависит от того, как обрабатываются данные карт.
SAQ A — минимальные требования для аутсорсинга
Если платёжная форма полностью отдана провайдеру (Stripe, Cloudpayments, ЮKassa) и данные карт никогда не касаются вашего сервера — применяется SAQ A с минимальным набором требований.
<!-- Stripe Elements — платёжная форма на стороне Stripe -->
<!-- Данные карты никогда не покидают iframe Stripe -->
<div id="card-element"><!-- Stripe iframe вставляется сюда --></div>
<script src="https://js.stripe.com/v3/"></script>
<script>
const stripe = Stripe('pk_live_...');
const elements = stripe.elements();
const card = elements.create('card');
card.mount('#card-element');
// При оплате — Stripe возвращает token, не данные карты
const { paymentMethod, error } = await stripe.createPaymentMethod({
type: 'card',
card: card,
});
// Отправить paymentMethod.id на сервер
</script>
Требования SAQ A (~22 пункта):
- HTTPS на всех страницах сайта
- Актуальный SSL-сертификат
- Не хранить данные карт нигде
- Ежеквартальное сканирование ASV
- Политика безопасности
SAQ D — полный объём (если данные карт проходят через сервер)
300+ требований. Рекомендуется перейти на SAQ A через токенизацию.
Требование 1: Сеть и брандмауэр
# iptables — разрешить только необходимые входящие соединения
iptables -P INPUT DROP
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -s trusted_ip -j ACCEPT
# Все остальное — DROP
# Сегментация: платёжные серверы в отдельной VLAN
# Доступ к CDE (Cardholder Data Environment) только по необходимости
Требование 2: Конфигурация по умолчанию
# Изменить все дефолтные пароли
# Отключить ненужные сервисы
systemctl disable bluetooth telnet rsh
systemctl disable apache2 # если используем Nginx
# Nginx — минимальная конфигурация
server_tokens off; # не показывать версию Nginx
Требование 3: Защита данных держателей карт
Если данные карт всё же хранятся (PAN — Primary Account Number):
// Хранить только последние 4 цифры и BIN (первые 6) — остальное маскировать
class CardStorageService
{
public function storePan(string $pan): array
{
return [
'masked_pan' => substr($pan, 0, 6) . '******' . substr($pan, -4),
'last_four' => substr($pan, -4),
// Полный PAN — НИКОГДА не хранить, кроме специальных случаев SAQ D
];
}
}
// CVV/CVC — НИКОГДА не хранить даже зашифрованным
// PIN — НИКОГДА не хранить
// Полный трек магнитной полосы — НИКОГДА не хранить
Требование 4: Шифрование при передаче
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers off;
# Запретить слабые протоколы
ssl_protocols TLSv1.2 TLSv1.3;
# TLS 1.0 и 1.1 — запрещены по PCI DSS с 30 июня 2018
Требование 6: Безопасная разработка
# Обязательные компоненты SDLC для PCI DSS
- Code review перед деплоем
- Сканирование зависимостей (OWASP Dependency-Check)
- SAST-сканирование (Semgrep, SonarQube)
- Ежеквартальное сканирование ASV (Approved Scanning Vendor)
- Ежегодный пентест
# OWASP Top 10 — обязательная проверка для всех изменений
# Change management процесс — тестовая → staging → production
Требование 7 и 8: Доступ и аутентификация
// Уникальные учётные записи для каждого сотрудника — никаких shared accounts
// Двухфакторная аутентификация для доступа к CDE
class AdminAuthController extends Controller
{
public function login(Request $request)
{
// Обязательный 2FA для доступа к административным функциям
if (!$this->verifyTotp($request->totp_code, auth()->user())) {
abort(401, '2FA required for PCI DSS compliance');
}
}
}
// Блокировка после 6 неудачных попыток (требование 8.3.4)
// Сессионный таймаут 15 минут бездействия (требование 8.2.8)
Требование 10: Логирование
// Логировать все события доступа к CDE
// Сохранять логи минимум 12 месяцев, последние 3 месяца — доступны онлайн
Log::channel('pci')->info('CDE access', [
'user_id' => auth()->id(),
'action' => 'view_transaction',
'object_id' => $transactionId,
'ip' => request()->ip(),
'timestamp' => now()->toIso8601String(),
]);
Требование 11: Тестирование
- ASV Scanning — ежеквартальное сканирование внешних IP через аккредитованного вендора (например, Trustwave, Qualys)
- Penetration Testing — ежегодно + после значительных изменений инфраструктуры
- IDS/IPS — мониторинг сетевого трафика
Путь к соответствию для типового интернет-магазина
1. Перейти на Stripe/ЮKassa с iframe → SAQ A
2. Включить HTTPS везде, TLS 1.2+
3. Ежеквартальное ASV-сканирование (провайдеры: SecurityMetrics, Trustwave)
4. Заполнить SAQ A (~22 вопроса)
5. Зарегистрировать SAQ у эквайера (банка, выпустившего терминал)
Срок реализации
- SAQ A: переход на iframe-платёж + базовая настройка: 5–10 дней
- SAQ D (полный объём): 3–6 месяцев с привлечением QSA-аудитора
- Ежеквартальное сканирование ASV: автоматизированный процесс, ~2 часа в квартал







