ADR-004 - Αρχιτεκτονική Συστημάτων Ασφαλείας
ADR-004: Αρχιτεκτονική συστημάτων ασφαλείας
Ενότητα με τίτλο «ADR-004: Αρχιτεκτονική συστημάτων ασφαλείας»Ολοκληρωμένη αρχιτεκτονική ασφαλείας για XOOPS CMS προστασία από σύγχρονες απειλές.
Κατάσταση
Ενότητα με τίτλο «Κατάσταση»Αποδεκτό - Βασικό επίπεδο ασφαλείας από το XOOPS 2.5
Περιεχόμενο
Ενότητα με τίτλο «Περιεχόμενο»# Δήλωση προβλήματος
Ενότητα με τίτλο «# Δήλωση προβλήματος»Το XOOPS χρειάζεται ένα ισχυρό σύστημα ασφαλείας που:
- Προστατεύει από κοινά τρωτά σημεία ιστού (OWASP Top 10)
- Παρέχει λεπτομερή έλεγχο αδειών σε όλες τις μονάδες
- Επιτρέπει τον ασφαλή έλεγχο ταυτότητας χρήστη με σύγχρονα πρότυπα
- Αποτρέπει τις παραβιάσεις δεδομένων και τη μη εξουσιοδοτημένη πρόσβαση
- Υποστηρίζει έλεγχο πρόσβασης πολλαπλών επιπέδων (διαχειριστής, συντονιστής, χρήστης, επισκέπτης)
- Ενσωματώνεται με όλες τις μονάδες απρόσκοπτα
# Τρέχουσες απειλές
Ενότητα με τίτλο «# Τρέχουσες απειλές»Οι σύγχρονες διαδικτυακές επιθέσεις περιλαμβάνουν:
- SQL Έγχυση - Κακόβουλο SQL στην είσοδο χρήστη
- XSS (Σενάρια μεταξύ τοποθεσιών) - Ένταξη JavaScript στις σελίδες
- CSRF (Πλαστογραφία αιτήματος μεταξύ ιστοτόπων) - Μη εξουσιοδοτημένες υποβολές φορμών
- Παράκαμψη ελέγχου ταυτότητας - Αδύναμος χειρισμός session/password
- Παράκαμψη εξουσιοδότησης - Κλιμάκωση προνομίων
- Εκθεση δεδομένων - Ευαίσθητα δεδομένα σε διευθύνσεις URL, αρχεία καταγραφής ή κρυφές μνήμες
# XOOPS Απαιτήσεις ασφαλείας
Ενότητα με τίτλο «# XOOPS Απαιτήσεις ασφαλείας»- Έλεγχος ταυτότητας χρήστη και διαχείριση συνεδρίας
- Έλεγχος πρόσβασης βάσει ρόλων (RBAC)
- Σύστημα αδειών για μονάδες και αντικείμενα
- Επικύρωση εισόδου και διαφυγή εξόδου
- Προστασία από κοινές επιθέσεις
- Έλεγχος καταγραφής συμβάντων ασφαλείας
- Ασφαλής χειρισμός κωδικού πρόσβασης
- CSRF συμβολική προστασία
Απόφαση
Ενότητα με τίτλο «Απόφαση»# Βασική Αρχιτεκτονική Ασφαλείας
Ενότητα με τίτλο «# Βασική Αρχιτεκτονική Ασφαλείας»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Στοιχεία ασφαλείας
Ενότητα με τίτλο «Στοιχεία ασφαλείας»# 1. Σύστημα ελέγχου ταυτότητας
Ενότητα με τίτλο «# 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. Διαχείριση συνεδρίας
Ενότητα με τίτλο «# 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)
Ενότητα με τίτλο «# 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. Επικύρωση εισόδου
Ενότητα με τίτλο «# 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. Διαφυγή εξόδου
Ενότητα με τίτλο «# 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 Προστασία
Ενότητα με τίτλο «# 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'); }}Συνέπειες
Ενότητα με τίτλο «Συνέπειες»# Θετικές επιδράσεις
Ενότητα με τίτλο «# Θετικές επιδράσεις»- Ολοκληρωμένη προστασία - Καλύπτει μεγάλες κατηγορίες ευπάθειας
- Επίπεδη ασφάλεια - Πολλαπλά επίπεδα άμυνας
- Εύκαμπτο RBAC - Λεπτός έλεγχος αδειών
- Διαδρομή ελέγχου - Παρακολούθηση συμβάντων ασφαλείας
- Βιομηχανικό Πρότυπο - Ευθυγραμμίζεται με τις συστάσεις OWASP
- Ενσωμάτωση μονάδας - Εύκολη χρήση των API ασφαλείας από τις μονάδες
# Αρνητικές Επιδράσεις
Ενότητα με τίτλο «# Αρνητικές Επιδράσεις»- Πολυπλοκότητα - Απαιτείται περισσότερος κώδικας και διαμόρφωση
- Απόδοση - Ο κατακερματισμός και η επικύρωση προσθέτουν γενικά έξοδα
- Εμπειρία χρήστη - Η ασφάλεια μερικές φορές είναι ενοχλητική
- Συντήρηση - Απαιτεί συνεχείς ενημερώσεις ασφαλείας
- Απαιτείται εκπαίδευση - Οι προγραμματιστές πρέπει να ακολουθούν πρακτικές
# Κίνδυνοι και μετριασμούς
Ενότητα με τίτλο «# Κίνδυνοι και μετριασμούς»| Κίνδυνος | Σοβαρότητα | Μετριασμός |
|---|---|---|
| Ο προγραμματιστής αγνοεί την ασφάλεια | Υψηλή | Αναθεώρηση κώδικα, εκπαίδευση ασφάλειας |
| Ανακαλύφθηκαν νέα τρωτά σημεία | Μεσαία | Τακτικοί έλεγχοι ασφαλείας, ενημερώσεις |
| Επίδραση απόδοσης | Χαμηλό | Βελτιστοποίηση καυτών μονοπατιών, προσωρινή αποθήκευση |
| Υπερβολικά πολύπλοκα δικαιώματα | Μεσαία | Σαφής τεκμηρίωση, παραδείγματα |
Βέλτιστες πρακτικές ασφάλειας
Ενότητα με τίτλο «Βέλτιστες πρακτικές ασφάλειας»# Για προγραμματιστές ενοτήτων
Ενότητα με τίτλο «# Για προγραμματιστές ενοτήτων»<?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'];Εξετάζονται εναλλακτικές λύσεις
Ενότητα με τίτλο «Εξετάζονται εναλλακτικές λύσεις»# OAuth/OpenID Σύνδεση
Ενότητα με τίτλο «# OAuth/OpenID Σύνδεση»Γιατί δεν επιλέχθηκε αρχικά: Πολύ περίπλοκο για κοινόχρηστο περιβάλλον φιλοξενίας, αλλά καλό για μελλοντική ενσωμάτωση με εξωτερικά συστήματα εξουσιοδότησης.
# Έλεγχος ταυτότητας δύο παραγόντων (2FA)
Ενότητα με τίτλο «# Έλεγχος ταυτότητας δύο παραγόντων (2FA)»Κατάσταση: Αποδεκτή ως επέκταση, όχι βασική απαίτηση, ανατρέξτε στο ADR-006
# HTTP μόνο Cookies περιόδου λειτουργίας
Ενότητα με τίτλο «# HTTP μόνο Cookies περιόδου λειτουργίας»Κατάσταση: Υλοποιήθηκε - αποτρέπει την πρόσβαση JavaScript στα δεδομένα περιόδου λειτουργίας
Σχετικές Αποφάσεις
Ενότητα με τίτλο «Σχετικές Αποφάσεις»- ADR-001: Modular Architecture - Οι ενότητες υλοποιούν ασφάλεια
- ADR-005: Σύστημα αδειών μονάδας
- ADR-006: Έλεγχος ταυτότητας δύο παραγόντων (μέλλον)
Αναφορές
Ενότητα με τίτλο «Αναφορές»# Πρότυπα ασφαλείας
Ενότητα με τίτλο «# Πρότυπα ασφαλείας»# PHP Ασφάλεια
Ενότητα με τίτλο «# PHP Ασφάλεια»# Εργαλεία
Ενότητα με τίτλο «# Εργαλεία»Λίστα ελέγχου υλοποίησης
Ενότητα με τίτλο «Λίστα ελέγχου υλοποίησης»- Σύστημα ελέγχου ταυτότητας χρήστη
- Διαχείριση συνεδρίας
- Κατακερματισμός κωδικού πρόσβασης (bcrypt)
- Έλεγχος πρόσβασης βάσει ρόλων
- Δικαιώματα μονάδας
- Πλαίσιο επικύρωσης εισόδου
- Διαφυγή εξόδου (PHP + Smarty)
- CSRF διακριτική προστασία
- Καταγραφή ελέγχου ασφαλείας
- Περιορισμός ποσοστού
- Κεφαλίδες ασφαλείας
Ιστορικό έκδοσης
Ενότητα με τίτλο «Ιστορικό έκδοσης»| Έκδοση | Ημερομηνία | Αλλαγές |
|---|---|---|
| 1.0.0 | 28-01-2024 | Αρχικό έγγραφο |