¶ciel.security — Seguridad y aprobaciones
Políticas de aprobación de ejecución de herramientas y redacción de secretos / PII para aislamiento multi-tenant.
Incluye el contrato ApprovalPolicy y sus variantes
(ManualApprovalPolicy, TenantIsolationPolicy, SmartApprovalPolicy,
YoloApprovalPolicy), los DTOs ApprovalRequest / ApprovalDecision, el
constructor from_name, y las utilidades de redacción (PIIScrubber,
redact_string, redact_secrets).
¶
ciel.security
¶
_PII_PATTERNS = [re.compile('\\b\\d{7,9}[A-Za-z]\\b'), re.compile('\\b\\d{7,9}\\b'), re.compile('[A-Za-z0-9._%+\\-]+@[A-Za-z0-9.\\-]+\\.[A-Za-z]{2,}'), re.compile('\\+?\\d[\\d\\-\\s()]{7,}\\d')]
module-attribute
¶
_SECRET_PATTERNS = [re.compile('(?i)(api[_-]?key|apikey|token|secret|password|pass|pwd)\\s*[:=]\\s*["\\\']?([A-Za-z0-9._\\-\\"]{8,})["\\\']?'), re.compile('(?i)(sk-[A-Za-z0-9]{20,})')]
module-attribute
¶
__all__ = ['ApprovalPolicy', 'ApprovalRequest', 'ApprovalDecision', 'SmartApprovalPolicy', 'YoloApprovalPolicy', 'TenantIsolationPolicy', 'ManualApprovalPolicy', 'from_name', 'PIIScrubber', 'redact', 'redact_string', 'redact_secrets']
module-attribute
¶
ApprovalDecision
dataclass
¶
ApprovalPolicy
¶
ApprovalRequest
dataclass
¶
ManualApprovalPolicy
¶
PIIScrubber
Source code in src/ciel/security/redaction.py
¶
SmartApprovalPolicy
Bases: ApprovalPolicy
Source code in src/ciel/security/approvals.py
¶
TenantIsolationPolicy
Bases: ApprovalPolicy
Source code in src/ciel/security/__init__.py
¶
YoloApprovalPolicy
¶
_scrub_pii(value: str) -> str
¶
from_name(name: str) -> ApprovalPolicy
Return an :class:ApprovalPolicy instance for a policy name.
Supported names: manual, smart, yolo, tenant_isolation.
Raises ValueError for unknown policy names so misconfiguration fails
loudly instead of silently defaulting.
Source code in src/ciel/security/approvals.py
¶
redact_secrets(value: str, secrets: Optional[Sequence[str]] = None) -> str
Source code in src/ciel/security/redaction.py
¶
redact_string(value: str, secrets: Optional[Sequence[str]] = None) -> str
Source code in src/ciel/security/redaction.py
¶
__all__ = ['ApprovalPolicy', 'ApprovalRequest', 'ApprovalDecision', 'SmartApprovalPolicy', 'TenantIsolationPolicy', 'YoloApprovalPolicy', 'from_name']
module-attribute
¶
ApprovalDecision
dataclass
¶
ApprovalPolicy
¶
ApprovalRequest
dataclass
¶
ManualApprovalPolicy
¶
PIIScrubber
Source code in src/ciel/security/redaction.py
¶
SmartApprovalPolicy
Bases: ApprovalPolicy
Source code in src/ciel/security/approvals.py
¶
TenantIsolationPolicy
Bases: ApprovalPolicy
Source code in src/ciel/security/approvals.py
¶
YoloApprovalPolicy
¶
from_name(name: str) -> ApprovalPolicy
Return an :class:ApprovalPolicy instance for a policy name.
Supported names: manual, smart, yolo, tenant_isolation.
Raises ValueError for unknown policy names so misconfiguration fails
loudly instead of silently defaulting.
Source code in src/ciel/security/approvals.py
¶
redact_secrets(value: str, secrets: Optional[Sequence[str]] = None) -> str
Source code in src/ciel/security/redaction.py
¶
_PII_PATTERNS = [re.compile('\\b\\d{7,9}[A-Za-z]\\b'), re.compile('\\b\\d{7,9}\\b'), re.compile('[A-Za-z0-9._%+\\-]+@[A-Za-z0-9.\\-]+\\.[A-Za-z]{2,}'), re.compile('\\+?\\d[\\d\\-\\s()]{7,}\\d')]
module-attribute
¶
_SECRET_PATTERNS = [re.compile('(?i)(api[_-]?key|apikey|token|secret|password|pass|pwd)\\s*[:=]\\s*["\\\']?([A-Za-z0-9._\\-\\"]{8,})["\\\']?'), re.compile('(?i)(sk-[A-Za-z0-9]{20,})')]
module-attribute
¶
PIIScrubber
Source code in src/ciel/security/redaction.py
¶
_scrub_pii(value: str) -> str
¶
redact_secrets(text: str, secrets: Optional[Sequence[str]] = None) -> str
¶
redact_string(value: str, secrets: Optional[Sequence[str]] = None) -> str
Source code in src/ciel/security/redaction.py
¶Sandbox de ejecución (v0.9)
Guardrails y sandbox de ejecución de código del agente. Incluye
SandboxExecutor con backends seleccionables (INPROCESS, LIGHT, DOCKER,
GVISOR; degradación graceful a INPROCESS cuando el backend fuerte no está
disponible), SandboxLimits / ExecResult, GuardrailMiddleware (rate-limit
por tenant + redacción de salida + truncado) y SandboxContext (política
SandboxPolicy sobre capacidades terminal/file, respaldada por ejecución real).
Sandbox de ejecución de código del agente (Fase 15, offline-safe).
Dos capas:
- Guardrails / política (heredado de Fase anterior): :class:
SandboxPolicyy :class:SandboxContextdeciden qué capacidades (terminal/file) se permiten. -
Ejecución aislada (Fase 15): :class:
SandboxExecutorcorre comandos con distintos niveles de aislamiento: -
INPROCESS(default, cross-platform):subprocesscon timeout. Es el fallback universal y reemplaza los antiguos stubs. LIGHT(Linux):subprocess+setrlimit(CPU/mem) — deshabilitado en Windows, degrada aINPROCESS.DOCKER(opt-in): contenedor efímero con red desactivada y límites de cpu/mem; degrada aINPROCESSsi Docker no está disponible.GVISOR(opt-in, Linux): igual que Docker con runtimerunsc; degrada a Docker y luego aINPROCESS.
El default SIEMPRE es offline-safe: sin Docker/red/deps externas. Todo backend no disponible degrada con un log y nunca rompe el runtime.
¶
__all__ = ['SandboxPolicy', 'SandboxBlockedError', 'SandboxContext', 'SandboxBackend', 'SandboxLimits', 'ExecResult', 'SandboxExecutor', 'GuardrailMiddleware']
module-attribute
¶
logger = logging.getLogger('ciel.sandbox')
module-attribute
¶
ExecResult
dataclass
Resultado de una ejecución en el sandbox.
Source code in src/ciel/sandbox/__init__.py
¶
GuardrailMiddleware
Envoltura de guardrails para la ejecución de herramientas.
Reutiliza :class:TenantRateLimiter (rate-limit por tenant) y
:func:redact_string (redacción de secretos en la salida). También trunca
salidas excesivamente largas. Todos los componentes son opcionales.
Source code in src/ciel/sandbox/__init__.py
¶
after_output(output: Any) -> Any
Redacta y trunca la salida de una herramienta.
Source code in src/ciel/sandbox/__init__.py
¶
before(*, tenant_id: Optional[str] = None, user: Optional[str] = None) -> None
Aplica rate-limit antes de ejecutar (lanza RateLimitError).
Source code in src/ciel/sandbox/__init__.py
¶
SandboxBackend
¶
SandboxBlockedError
¶
SandboxContext
dataclass
Source code in src/ciel/sandbox/__init__.py
¶
SandboxExecutor
Ejecutor de comandos con aislamiento seleccionable.
Se construye con un backend deseado; si no está disponible, degrada
(con log) al siguiente backend más seguro disponible hasta INPROCESS,
que siempre existe.
Source code in src/ciel/sandbox/__init__.py
116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 | |
¶
run(command, *, stdin: Optional[str] = None) -> ExecResult
Ejecuta command (lista o str) y devuelve un :class:ExecResult.
Source code in src/ciel/sandbox/__init__.py
¶
SandboxLimits
dataclass
Límites de recursos aplicados al comando (best-effort por backend).