ADR-004 - Архітектура системи безпеки
ADR-004: Архітектура системи безпеки
Section titled “ADR-004: Архітектура системи безпеки”Комплексна архітектура безпеки для XOOPS CMS, що захищає від сучасних загроз.
Статус
Section titled “Статус”Прийнято - базовий рівень безпеки з XOOPS 2.5
Контекст
Section titled “Контекст”Постановка проблеми
Section titled “Постановка проблеми”XOOPS потребує надійної системи безпеки, яка:
- Захищає від типових веб-вразливостей (OWASP Top 10)
- Забезпечує детальне керування дозволами для всіх модулів
- Забезпечує безпечну автентифікацію користувача за сучасними стандартами
- Запобігає витоку даних і несанкціонованому доступу
- Підтримується багаторівневий контроль доступу (адміністратор, модератор, користувач, гість)
- Бездоганно інтегрується з усіма модулями
Поточні загрози
Section titled “Поточні загрози”Сучасні веб-атаки включають:
- SQL Injection - Зловмисний SQL у введенні користувачем
- XSS (міжсайтовий сценарій) - вставлено JavaScript на сторінки
- CSRF (підробка міжсайтового запиту) - Неавторизоване надсилання форм
- Обхід автентифікації - Слабка обробка session/password
- Обхід авторизації - Ескалація привілеїв
- Викриття даних - конфіденційні дані в URL-адресах, журналах або кеш-пам’яті
XOOPS Вимоги безпеки
Section titled “XOOPS Вимоги безпеки”- Аутентифікація користувача та керування сеансами
- Контроль доступу на основі ролей (RBAC)
- Система дозволів для модулів і об’єктів
- Перевірка вхідних даних і екранування вихідних даних
- Захист від типових атак
- Журнал аудиту подій безпеки
- Безпечна обробка паролів
- Захист токенів CSRF
Рішення
Section titled “Рішення”Основна архітектура безпеки
Section titled “Основна архітектура безпеки”graph TB subgraph "Authentication Layer" A["User Authentication<br/>(Login/Sessions)"] B["Session Management<br/>(Tokens/Cookies)"] C["Password Security<br/>(Hashing/Salts)"] end
subgraph "Authorization Layer" D["Role Management<br/>(Admin/User/Guest)"] E["Permission System<br/>(Module-level)"] F["Object Permissions<br/>(Item-level)"] end
subgraph "Protection Layer" G["Input Validation<br/>(Type/Format)"] H["Output Escaping<br/>(HTML/JavaScript)"] I["CSRF Protection<br/>(Token Validation)"] end
subgraph "Monitoring Layer" J["Audit Logging<br/>(Security Events)"] K["Rate Limiting<br/>(Brute Force)"] L["Intrusion Detection<br/>(Suspicious Activity)"] end
A --> B A --> C D --> E E --> F G --> I H --> I J --> K K --> LКомпоненти безпеки
Section titled “Компоненти безпеки”1. Система автентифікації
Section titled “1. Система автентифікації”Процес входу користувача:
<?php// 1. Validate credentials$user = $userHandler->findByLogin($username);if (!$user || !password_verify($password, $user->getVar('pass'))) { throw new AuthenticationException('Invalid credentials');}
// 2. Check if account is activeif (!$user->getVar('uactive')) { throw new AuthenticationException('Account inactive');}
// 3. Create secure sessionsession_regenerate_id(true);$_SESSION['uid'] = $user->getVar('uid');$_SESSION['token'] = bin2hex(random_bytes(32));$_SESSION['created'] = time();
// 4. Log the login$this->auditLog('USER_LOGIN', $user->getVar('uid'));Захист паролем:
<?php// Use password_hash (not MD5 or SHA1)$hashed = password_hash($password, PASSWORD_BCRYPT, [ 'cost' => 12, // High cost = slow brute force]);
// Verify passwordif (!password_verify($inputPassword, $hashed)) { throw new Exception('Invalid password');}
// Rehash if algorithm or cost changedif (password_needs_rehash($hashed, PASSWORD_BCRYPT, ['cost' => 12])) { $newHash = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]); $user->setVar('pass', $newHash); $userHandler->insert($user);}2. Керування сеансами
Section titled “2. Керування сеансами”Безпечна обробка сеансу:
<?php// Session configurationini_set('session.cookie_httponly', true); // No JS accessini_set('session.cookie_secure', true); // HTTPS onlyini_set('session.cookie_samesite', 'Strict'); // CSRF protectionini_set('session.gc_maxlifetime', 3600); // 1 hour timeoutini_set('session.sid_length', 64); // 64-char session ID
// Validate sessionfunction validateSession() { // Check timeout if (time() - $_SESSION['created'] > 3600) { session_destroy(); throw new SessionExpiredException(); }
// Validate user agent (prevent session hijacking) if ($_SESSION['user_agent'] !== $_SERVER['HTTP_USER_AGENT']) { throw new SessionInvalidException(); }
// Validate IP (optional, can be too strict) if (!in_array($_SERVER['REMOTE_ADDR'], $_SESSION['ips'])) { $_SESSION['ips'][] = $_SERVER['REMOTE_ADDR']; }}3. Авторизація (RBAC)
Section titled “3. Авторизація (RBAC)”Контроль доступу на основі ролей:
<?phpclass XoopsUser { public function hasPermission(string $permissionName): bool { // Get user groups $groups = $this->getGroups();
// Check if any group has permission foreach ($groups as $groupId) { if ($this->checkGroupPermission($groupId, $permissionName)) { return true; } }
return false; }
/** * User groups and their permissions * Admin: Full access * Moderator: Content management * User: Create own content * Guest: Read-only access */ private function checkGroupPermission(int $groupId, string $permission): bool { $permissions = [ 1 => ['admin_access'], // Admin group 2 => ['moderate_content', 'edit_own'], // Moderator group 3 => ['create_content', 'edit_own'], // User group 4 => [], // Guest group (no permissions) ];
return in_array($permission, $permissions[$groupId] ?? []); }}4. Перевірка введених даних
Section titled “4. Перевірка введених даних”Запобігайте ін’єкції SQL і помилкам типу:
<?php// Always use prepared statements$sql = 'SELECT * FROM users WHERE id = ?';$result = $db->query($sql, [$userId]); // ✅ Safe
// Input validationfunction validateUserInput(array $data): array{ return [ 'email' => filter_var($data['email'] ?? '', FILTER_VALIDATE_EMAIL), 'age' => filter_var($data['age'] ?? 0, FILTER_VALIDATE_INT), 'website' => filter_var($data['website'] ?? '', FILTER_VALIDATE_URL), 'title' => substr(trim($data['title'] ?? ''), 0, 255), ];}
// XOOPS Safe Input class$safe = \Xmf\Request::getHtmlRequest('var_name', '');$int = \Xmf\Request::getInt('page', 1);5. Екранування виводу
Section titled “5. Екранування виводу”Запобігайте атакам XSS:
<?php// In PHP templatesecho htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');
// In Smarty templates (automatic escaping)<{$user_input}> {* Escaped by default *}<{$html|escape:false}> {* Only when needed *}
// JavaScript context<script>var message = "<{$userMessage|escape:'javascript'}>";</script>
// URL context<a href="<{$url|escape:'url'}>">Link</a>6. CSRF Захист
Section titled “6. CSRF Захист”Запобігання підробці міжсайтових запитів:
<?php// Generate CSRF tokensession_start();if (empty($_SESSION['csrf_token'])) { $_SESSION['csrf_token'] = bin2hex(random_bytes(32));}
// In forms<form method="POST"> <input type="hidden" name="csrf_token" value="<{$csrf_token}>"> <button type="submit">Submit</button></form>
// Validate tokenif ($_SERVER['REQUEST_METHOD'] === 'POST') { if (hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'] ?? '')) { // Process form } else { throw new InvalidTokenException('CSRF token invalid'); }}Наслідки
Section titled “Наслідки”Позитивні ефекти
Section titled “Позитивні ефекти”- Комплексний захист - охоплює основні класи вразливості
- Рівнева безпека - кілька рівнів захисту
- Гнучкий RBAC - детальний контроль дозволів
- Аудиторський слід - відстежуйте події безпеки
- Промисловий стандарт - відповідає рекомендаціям OWASP
- Інтеграція модулів - модулі легко використовують API безпеки
Негативні ефекти
Section titled “Негативні ефекти”- Складність – потрібно більше коду та конфігурації
- Продуктивність - хешування та перевірка додають додаткових витрат
- Взаємодія з користувачем - Безпека іноді незручна
- Технічне обслуговування – потребує постійних оновлень безпеки
- Потрібне навчання – розробники повинні дотримуватися практики
Ризики та пом’якшення
Section titled “Ризики та пом’якшення”| Ризик | Тяжкість | Пом’якшення |
|---|---|---|
| Розробник ігнорує безпеку | Високий | Огляд коду, навчання безпеки |
| Виявлено нові вразливості | Середній | Регулярні аудити безпеки, оновлення |
| Вплив на продуктивність | Низький | Оптимізація гарячих шляхів, кешування |
| Надто складні дозволи | Середній | Чітка документація, приклади |
Найкращі методи безпеки
Section titled “Найкращі методи безпеки”Для розробників модулів
Section titled “Для розробників модулів”<?php// ✅ DO: Use prepared statements$result = $db->prepare('SELECT * FROM table WHERE id = ?')->execute([$id]);
// ❌ DON'T: Concatenate queries$result = $db->query("SELECT * FROM table WHERE id = $id");
// ✅ DO: Escape outputecho htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');
// ❌ DON'T: Output raw user dataecho $user_input;
// ✅ DO: Check permissionsif (!$user->hasPermission('edit_content')) { throw new PermissionException();}
// ❌ DON'T: Trust user roles directlyif ($_POST['is_admin']) { // Make user admin - SECURITY HOLE!}
// ✅ DO: Validate input types$page = (int)$_GET['page'];
// ❌ DON'T: Use untrusted values directly$sql .= " LIMIT " . $_GET['limit'];Розглянуті альтернативи
Section titled “Розглянуті альтернативи”OAuth/OpenID Connect
Section titled “OAuth/OpenID Connect”Чому не вибрано спочатку: Занадто складний для спільного хостингового середовища, але хороший для майбутньої інтеграції із зовнішніми системами авторизації.
Двофакторна автентифікація (2FA)
Section titled “Двофакторна автентифікація (2FA)”Статус: Прийнято як розширення, а не як основну вимогу, див. ADR-006
Сеансові файли cookie лише HTTP
Section titled “Сеансові файли cookie лише HTTP”Статус: Реалізовано - забороняє доступ JavaScript до даних сеансу
Пов’язані рішення
Section titled “Пов’язані рішення”- ADR-001: Модульна архітектура - Модулі забезпечують безпеку
- ADR-005: Система дозволів модуля
- ADR-006: двофакторна автентифікація (майбутнє)
Посилання
Section titled “Посилання”Стандарти безпеки
Section titled “Стандарти безпеки”- [10 найкращих OWASP] (https://owasp.org/www-project-top-ten/)
- [NIST Cybersecurity Framework] (https://www.nist.gov/cyberframework)
- CWE Топ 25
PHP Безпека
Section titled “PHP Безпека”- PHP Керівництво з безпеки
- Документація password_hash()
- [Безпека сеансу] (https://www.php.net/manual/en/session.security.php)
Інструменти
Section titled “Інструменти”Контрольний список впровадження
Section titled “Контрольний список впровадження”- Система аутентифікації користувачів
- Керування сеансами
- Хешування пароля (bcrypt)
- Контроль доступу на основі ролей
- Дозволи модуля
- Структура перевірки вхідних даних
- Екранування виводу (PHP + Smarty)
- Захист токенів CSRF
- Журнал аудиту безпеки
- Обмеження швидкості
- Заголовки безпеки
Історія версій
Section titled “Історія версій”| Версія | Дата | Зміни |
|---|---|---|
| 1.0.0 | 2024-01-28 | Вихідний документ |
#xoops #adr #security #architecture #authentication #authorization #rbac