Modèles d'accès sécurisé aux fichiers
Sécurité complète de l'accès aux fichiers
graph TD
A[User Request] --> B{Access Control}
B --> C[Authentication]
B --> D[Authorization]
C,D --> E[Path Validation]
E --> F[Secure File Access]
Modèles d'accès recommandés
1. Principe du moindre privilège (Principle of Least Privilege)
class FileAccessManager:
def __init__(self, user_role):
self.allowed_paths = self._get_role_paths(user_role)
def _get_role_paths(self, role):
ROLE_PATHS = {
'admin': ['/var/log', '/etc/config'],
'user': ['/home/user/documents'],
'guest': ['/public/shared']
}
return ROLE_PATHS.get(role, [])
def can_access(self, requested_path):
return any(
os.path.commonpath([requested_path]) == os.path.commonpath([allowed_path])
for allowed_path in self.allowed_paths
)
Matrice de contrôle d'accès
Niveau d'accès |
Autorisations |
Cas d'utilisation typique |
Lecture seule (Read-Only) |
0o444 |
Documents publics |
Écriture limitée (Limited Write) |
0o644 |
Fichiers spécifiques à l'utilisateur |
Restreint (Restricted) |
0o600 |
Configurations sensibles |
2. Gestion sécurisée des descripteurs de fichiers (Secure File Descriptor Management)
import os
import stat
def secure_file_open(filepath, mode='r'):
## Check file permissions before access
file_stats = os.stat(filepath)
## Enforce strict permission checks
if file_stats.st_mode & 0o777 not in [0o600, 0o644]:
raise PermissionError("Insecure file permissions")
## Additional ownership verification
if file_stats.st_uid!= os.getuid():
raise PermissionError("Unauthorized file ownership")
return open(filepath, mode)
Modèles de sécurité avancés
3. Accès aux fichiers dans une sandbox (Sandboxed File Access)
import os
import tempfile
class SecureFileHandler:
def __init__(self, base_directory):
self.base_directory = os.path.abspath(base_directory)
def safe_read(self, relative_path):
## Construct absolute path
full_path = os.path.normpath(
os.path.join(self.base_directory, relative_path)
)
## Validate path is within base directory
if not full_path.startswith(self.base_directory):
raise ValueError("Access outside base directory prohibited")
with open(full_path, 'r') as file:
return file.read()
Considérations de sécurité
- Mettre en œuvre une validation stricte des entrées
- Utiliser la résolution de chemins absolus
- Vérifier les autorisations des fichiers
- Limiter l'accès en fonction des rôles utilisateur
Chez LabEx, nous mettons l'accent sur la création de mécanismes d'accès aux fichiers robustes qui équilibrent sécurité et fonctionnalité.
Journalisation et surveillance
import logging
def log_file_access(filepath, user, access_type):
logging.basicConfig(
filename='/var/log/file_access.log',
level=logging.INFO,
format='%(asctime)s - %(message)s'
)
logging.info(f"User: {user}, File: {filepath}, Action: {access_type}")
Points clés à retenir
- Toujours valider et nettoyer (sanitize) les chemins de fichiers
- Mettre en œuvre des contrôles d'accès basés sur les rôles
- Utiliser des vérifications strictes des autorisations
- Journaliser et surveiller les tentatives d'accès aux fichiers