Patrones de acceso seguro a archivos
Seguridad integral en el acceso a archivos
graph TD
A[User Request] --> B{Access Control}
B --> C[Authentication]
B --> D[Authorization]
C,D --> E[Path Validation]
E --> F[Secure File Access]
Patrones de acceso recomendados
1. Principio de menor privilegio (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
)
Matriz de control de acceso
Nivel de acceso |
Permisos |
Caso de uso típico |
Solo lectura (Read-Only) |
0o444 |
Documentos públicos |
Escritura limitada (Limited Write) |
0o644 |
Archivos específicos de usuario |
Restringido (Restricted) |
0o600 |
Configuraciones sensibles |
2. Gestión segura de descriptores de archivos
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)
Patrones de seguridad avanzados
3. Acceso a archivos en un entorno aislado (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()
Consideraciones de seguridad
- Implementar una validación estricta de la entrada
- Utilizar la resolución de rutas absolutas
- Verificar los permisos de los archivos
- Limitar el acceso según los roles de usuario
En LabEx, enfatizamos la creación de mecanismos de acceso a archivos sólidos que equilibren la seguridad y la funcionalidad.
Registro y monitoreo
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}")
Puntos clave
- Siempre validar y sanitizar las rutas de archivos
- Implementar controles de acceso basados en roles
- Utilizar comprobaciones estrictas de permisos
- Registrar y monitorear los intentos de acceso a archivos