TL;DR
The CISSP isn't a coding certification - it's about security management and risk. But studying for it gave me a framework for thinking about security that makes me a better developer. Here's what changed in my approach to building software.
De CISSP is geen programmeer-certificaat - het gaat over beveiligingsmanagement en risico. Maar het studeren ervoor gaf me een raamwerk om over beveiliging na te denken dat me een betere ontwikkelaar maakt. Dit is wat er veranderde in mijn aanpak bij het bouwen van software.
El CISSP no es una certificación de programación - trata sobre gestión de seguridad y riesgo. Pero estudiar para ella me dio un marco para pensar sobre seguridad que me hace un mejor desarrollador. Esto es lo que cambió en mi enfoque para construir software.
Why a developer would pursue CISSP
The Certified Information Systems Security Professional (CISSP) is traditionally a certification for security managers, not developers. The eight domains cover everything from physical security to business continuity planning. Most of it doesn't directly involve writing code.
So why did I pursue it? After years of building applications, I realized I was making security decisions without truly understanding the bigger picture. I could implement authentication, but did I understand why certain approaches were better from a risk perspective? I could encrypt data, but did I understand the legal and compliance implications?
The CISSP forced me to think about security as a system, not just a collection of techniques.
The eight domains and what they mean for developers
Let me walk through each CISSP domain and extract the lessons that changed how I write code.
1. Security and risk management
This domain covers governance, risk assessment, and security policies. As a developer, the key insight is: security is about managing risk, not eliminating it.
Before CISSP, I thought security was binary - either something was secure or it wasn't. Now I understand that security is about trade-offs. Every control has a cost. The goal is appropriate security for the context, not maximum security regardless of cost.
// Before: "More security is always better"
$hashedPassword = password_hash($password, PASSWORD_ARGON2ID, [
'memory_cost' => 262144, // Maximum values everywhere
'time_cost' => 10,
'threads' => 8,
]);
// After: "Appropriate security for the context"
// For a low-value application, default Argon2 parameters are sufficient
// and don't create DOS vectors
$hashedPassword = password_hash($password, PASSWORD_ARGON2ID);
2. Asset security
This domain is about classifying and protecting data based on its value. The developer takeaway: not all data needs the same level of protection.
I now classify data in every application I build:
- Public: Blog posts, public profiles
- Internal: User preferences, non-sensitive metadata
- Confidential: Email addresses, order history
- Restricted: Passwords, payment data, health information
This classification drives architectural decisions. Restricted data might need encryption at rest, audit logging, and separate database access controls. Public data doesn't.
3. Security architecture and engineering
This domain covers security models and secure design principles. The lesson that stuck with me: defense in depth isn't optional.
Before, I might rely on a single control - "The firewall will block bad traffic." Now I layer defenses assuming each one might fail:
// Defense in depth for a critical operation
public function processPayment(PaymentRequest $request): PaymentResult
{
// Layer 1: Rate limiting (handled by middleware)
// Layer 2: Authentication check
if (!auth()->check()) {
throw new UnauthorizedException();
}
// Layer 3: Authorization - can this user perform this action?
$this->authorize('create-payment', $request->account);
// Layer 4: Input validation
$validated = $request->validate([
'amount' => 'required|numeric|min:0.01|max:10000',
'currency' => 'required|in:EUR,USD,GBP',
]);
// Layer 5: Business logic validation
if ($this->exceedsAccountLimits($request->account, $validated['amount'])) {
throw new BusinessRuleException('Payment exceeds account limits');
}
// Layer 6: Audit logging
AuditLog::create([
'action' => 'payment.initiated',
'user_id' => auth()->id(),
'data' => $validated,
'ip' => $request->ip(),
]);
// Layer 7: Actually process the payment
return $this->paymentGateway->process($validated);
}
4. Communication and network security
This domain covers network architecture and secure communication protocols. For developers: assume the network is hostile.
This means:
- TLS everywhere, not just for login pages
- Certificate pinning for mobile apps
- Validating data from APIs even when they're "internal"
- Using secure protocols for service-to-service communication
// Even internal API calls should be treated carefully
$response = Http::withToken(config('services.internal.token'))
->timeout(5)
->retry(3, 100)
->get('https://internal-api.example.com/users/' . $userId);
// Don't trust the response blindly
if (!$response->successful()) {
throw new ExternalServiceException('User service unavailable');
}
$userData = $response->json();
// Validate the structure even from trusted sources
if (!isset($userData['id'], $userData['email'])) {
throw new InvalidResponseException('Malformed user data');
}
5. Identity and access management (IAM)
This domain covers authentication, authorization, and identity lifecycle. The key insight: principle of least privilege applies everywhere.
I now default to minimal permissions and expand only when needed:
// Database user with minimal privileges
// CREATE USER 'app_user'@'%' IDENTIFIED BY 'secure_password';
// GRANT SELECT, INSERT, UPDATE ON myapp.* TO 'app_user'@'%';
// No DELETE - soft deletes in application code
// No DROP, ALTER, CREATE - those go through migrations
// Application code enforces additional constraints
class OrderPolicy
{
public function view(User $user, Order $order): bool
{
// Users can only view their own orders
return $user->id === $order->user_id;
}
public function update(User $user, Order $order): bool
{
// Can only update pending orders
return $user->id === $order->user_id
&& $order->status === OrderStatus::PENDING;
}
}
6. Security assessment and testing
This domain covers vulnerability assessments, penetration testing, and auditing. The developer lesson: build security testing into your workflow.
Security testing shouldn't be an annual event. It should be continuous:
# Security checks in CI/CD
- name: Dependency vulnerability scan
run: composer audit
- name: Static analysis for security issues
run: vendor/bin/phpstan analyse -c phpstan-security.neon
- name: OWASP dependency check
uses: dependency-check/dependency-check-action@v3
- name: Secret scanning
uses: trufflesecurity/trufflehog@main
with:
path: .
base: main
7. Security operations
This domain covers incident response, monitoring, and disaster recovery. For developers: log for security, not just debugging.
// Security-focused logging
class SecurityLogger
{
public function authenticationSuccess(User $user, Request $request): void
{
Log::channel('security')->info('Authentication success', [
'user_id' => $user->id,
'ip' => $request->ip(),
'user_agent' => $request->userAgent(),
'timestamp' => now()->toIso8601String(),
]);
}
public function authenticationFailure(string $email, Request $request): void
{
Log::channel('security')->warning('Authentication failure', [
'attempted_email' => $email,
'ip' => $request->ip(),
'user_agent' => $request->userAgent(),
'timestamp' => now()->toIso8601String(),
]);
}
public function privilegedAction(User $user, string $action, array $context): void
{
Log::channel('security')->info('Privileged action', [
'user_id' => $user->id,
'action' => $action,
'context' => $context,
'timestamp' => now()->toIso8601String(),
]);
}
}
8. Software development security
Finally, the domain closest to my daily work. The overarching principle: security is a requirement, not a feature.
Security shouldn't be added after development. It should be part of the definition of done from the start.
Definition of done - security items
- Input validation on all user-supplied data
- Output encoding appropriate to context (HTML, JSON, SQL)
- Authorization checks on all state-changing operations
- Sensitive data encrypted in transit and at rest
- Security-relevant events logged
- Error handling doesn't leak sensitive information
- Dependencies checked for known vulnerabilities
How my code changed
The CISSP didn't teach me specific coding techniques - those come from OWASP, security-focused coding guides, and experience. But it changed my mindset in several key ways:
1. I think in terms of risk
Before making security decisions, I now ask: What's the asset? What's the threat? What's the impact if this fails? This prevents both under-engineering (leaving obvious holes) and over-engineering (adding unnecessary complexity).
2. I consider the full lifecycle
Security isn't just about what happens when code runs. It's about how code is developed, deployed, monitored, and eventually decommissioned. I think about secret rotation, log retention, and data deletion from the start.
3. I communicate security better
The CISSP gave me vocabulary to discuss security with non-developers. I can explain risks in business terms, not just technical terms. This makes it easier to get buy-in for security work.
4. I recognise compliance requirements
Understanding GDPR, PCI-DSS, and other compliance frameworks helps me build applications that meet regulatory requirements from the start, not as an expensive retrofit.
Should developers get CISSP?
Honestly? For most developers, probably not. The CISSP requires 5 years of professional experience in security domains, the exam is expensive, and most of the content isn't directly applicable to writing code.
If you want security credentials as a developer, consider:
- GIAC GWEB - Web application security
- OSCP - Practical penetration testing
- AWS Security Specialty - Cloud security (if AWS is your platform)
But if you're a developer who also makes architectural decisions, works with security teams, or wants to understand the bigger picture - the CISSP is worth considering. It won't make you a better coder, but it will make you a more security-aware developer.
The lasting impact
Three years after passing the CISSP exam, I still think about security differently than I did before. Every feature I build, every API I design, every database I structure - security considerations are woven in from the beginning.
The certification isn't magic. It's a framework for thinking. And that framework has made me a better developer.
Looking for a developer who thinks about security from the start? Let's talk.
Waarom een ontwikkelaar CISSP zou nastreven
De Certified Information Systems Security Professional (CISSP) is van oudsher een certificering voor beveiligingsmanagers, niet voor ontwikkelaars. De acht domeinen behandelen alles van fysieke beveiliging tot bedrijfscontinuïteitsplanning. Het meeste heeft niet direct met code schrijven te maken.
Dus waarom heb ik het nagestreefd? Na jaren van applicaties bouwen, realiseerde ik me dat ik beveiligingsbeslissingen nam zonder het grotere plaatje echt te begrijpen. Ik kon authenticatie implementeren, maar begreep ik waarom bepaalde benaderingen beter waren vanuit een risicoperspectief? Ik kon data versleutelen, maar begreep ik de juridische en compliance-implicaties?
De CISSP dwong me om over beveiliging na te denken als een systeem, niet alleen als een verzameling technieken.
De acht domeinen en wat ze betekenen voor ontwikkelaars
Laat me door elk CISSP-domein lopen en de lessen eruit halen die veranderden hoe ik code schrijf.
1. Beveiliging en risicomanagement
Dit domein behandelt governance, risicobeoordeling en beveiligingsbeleid. Als ontwikkelaar is het belangrijkste inzicht: beveiliging gaat over het beheersen van risico's, niet het elimineren ervan.
Voor CISSP dacht ik dat beveiliging binair was - iets was ofwel veilig of niet. Nu begrijp ik dat beveiliging over afwegingen gaat. Elke controle heeft kosten. Het doel is passende beveiliging voor de context, niet maximale beveiliging ongeacht de kosten.
// Voor: "Meer beveiliging is altijd beter"
$hashedPassword = password_hash($password, PASSWORD_ARGON2ID, [
'memory_cost' => 262144, // Maximale waarden overal
'time_cost' => 10,
'threads' => 8,
]);
// Na: "Passende beveiliging voor de context"
// Voor een applicatie met lage waarde zijn standaard Argon2-parameters voldoende
// en creëren geen DOS-vectoren
$hashedPassword = password_hash($password, PASSWORD_ARGON2ID);
2. Asset security
Dit domein gaat over het classificeren en beschermen van data op basis van de waarde ervan. De belangrijkste les voor ontwikkelaars: niet alle data heeft hetzelfde beschermingsniveau nodig.
Ik classificeer nu data in elke applicatie die ik bouw:
- Publiek: Blogposts, openbare profielen
- Intern: Gebruikersvoorkeuren, niet-gevoelige metadata
- Vertrouwelijk: E-mailadressen, bestelgeschiedenis
- Beperkt: Wachtwoorden, betalingsgegevens, gezondheidsinformatie
Deze classificatie stuurt architectuurbeslissingen. Beperkte data heeft mogelijk encryptie in rust, auditlogging en aparte database-toegangscontroles nodig. Publieke data niet.
3. Beveiligingsarchitectuur en engineering
Dit domein behandelt beveiligingsmodellen en principes voor veilig ontwerp. De les die bij me bleef hangen: defense in depth is niet optioneel.
Voorheen zou ik misschien vertrouwen op een enkele controle - "De firewall blokkeert slecht verkeer." Nu laag ik verdedigingen in de veronderstelling dat elk kan falen:
// Defense in depth voor een kritieke operatie
public function processPayment(PaymentRequest $request): PaymentResult
{
// Laag 1: Rate limiting (afgehandeld door middleware)
// Laag 2: Authenticatiecontrole
if (!auth()->check()) {
throw new UnauthorizedException();
}
// Laag 3: Autorisatie - kan deze gebruiker deze actie uitvoeren?
$this->authorize('create-payment', $request->account);
// Laag 4: Inputvalidatie
$validated = $request->validate([
'amount' => 'required|numeric|min:0.01|max:10000',
'currency' => 'required|in:EUR,USD,GBP',
]);
// Laag 5: Bedrijfslogica-validatie
if ($this->exceedsAccountLimits($request->account, $validated['amount'])) {
throw new BusinessRuleException('Payment exceeds account limits');
}
// Laag 6: Auditlogging
AuditLog::create([
'action' => 'payment.initiated',
'user_id' => auth()->id(),
'data' => $validated,
'ip' => $request->ip(),
]);
// Laag 7: Verwerk daadwerkelijk de betaling
return $this->paymentGateway->process($validated);
}
4. Communicatie en netwerkbeveiliging
Dit domein behandelt netwerkarchitectuur en veilige communicatieprotocollen. Voor ontwikkelaars: ga ervan uit dat het netwerk vijandig is.
Dit betekent:
- TLS overal, niet alleen voor inlogpagina's
- Certificate pinning voor mobiele apps
- Data valideren van API's, zelfs als ze "intern" zijn
- Veilige protocollen gebruiken voor service-naar-service communicatie
// Zelfs interne API-aanroepen moeten zorgvuldig behandeld worden
$response = Http::withToken(config('services.internal.token'))
->timeout(5)
->retry(3, 100)
->get('https://internal-api.example.com/users/' . $userId);
// Vertrouw het antwoord niet blindelings
if (!$response->successful()) {
throw new ExternalServiceException('User service unavailable');
}
$userData = $response->json();
// Valideer de structuur zelfs van vertrouwde bronnen
if (!isset($userData['id'], $userData['email'])) {
throw new InvalidResponseException('Malformed user data');
}
5. Identity and access management (IAM)
Dit domein behandelt authenticatie, autorisatie en identiteitslevenscyclus. Het belangrijkste inzicht: het principe van minimale privileges geldt overal.
Ik standaard nu op minimale rechten en breid alleen uit wanneer nodig:
// Database-gebruiker met minimale privileges
// CREATE USER 'app_user'@'%' IDENTIFIED BY 'secure_password';
// GRANT SELECT, INSERT, UPDATE ON myapp.* TO 'app_user'@'%';
// Geen DELETE - soft deletes in applicatiecode
// Geen DROP, ALTER, CREATE - die gaan via migraties
// Applicatiecode handhaaft extra beperkingen
class OrderPolicy
{
public function view(User $user, Order $order): bool
{
// Gebruikers kunnen alleen hun eigen bestellingen bekijken
return $user->id === $order->user_id;
}
public function update(User $user, Order $order): bool
{
// Kan alleen bestellingen in behandeling bijwerken
return $user->id === $order->user_id
&& $order->status === OrderStatus::PENDING;
}
}
6. Beveiligingsbeoordeling en testen
Dit domein behandelt kwetsbaarheidsbeoordelingen, penetratietesten en auditing. De les voor ontwikkelaars: bouw beveiligingstesten in je workflow.
Beveiligingstesten zou geen jaarlijks evenement moeten zijn. Het zou continu moeten zijn:
# Beveiligingscontroles in CI/CD
- name: Dependency vulnerability scan
run: composer audit
- name: Static analysis for security issues
run: vendor/bin/phpstan analyse -c phpstan-security.neon
- name: OWASP dependency check
uses: dependency-check/dependency-check-action@v3
- name: Secret scanning
uses: trufflesecurity/trufflehog@main
with:
path: .
base: main
7. Beveiligingsoperaties
Dit domein behandelt incident response, monitoring en disaster recovery. Voor ontwikkelaars: log voor beveiliging, niet alleen voor debugging.
// Beveiligingsgerichte logging
class SecurityLogger
{
public function authenticationSuccess(User $user, Request $request): void
{
Log::channel('security')->info('Authentication success', [
'user_id' => $user->id,
'ip' => $request->ip(),
'user_agent' => $request->userAgent(),
'timestamp' => now()->toIso8601String(),
]);
}
public function authenticationFailure(string $email, Request $request): void
{
Log::channel('security')->warning('Authentication failure', [
'attempted_email' => $email,
'ip' => $request->ip(),
'user_agent' => $request->userAgent(),
'timestamp' => now()->toIso8601String(),
]);
}
public function privilegedAction(User $user, string $action, array $context): void
{
Log::channel('security')->info('Privileged action', [
'user_id' => $user->id,
'action' => $action,
'context' => $context,
'timestamp' => now()->toIso8601String(),
]);
}
}
8. Softwareontwikkelingsbeveiliging
Ten slotte, het domein het dichtst bij mijn dagelijkse werk. Het overkoepelende principe: beveiliging is een vereiste, geen feature.
Beveiliging zou niet na de ontwikkeling toegevoegd moeten worden. Het zou van meet af aan onderdeel van de definitie van done moeten zijn.
Definitie van done - beveiligingsitems
- Inputvalidatie op alle door gebruiker geleverde data
- Output-encoding passend bij de context (HTML, JSON, SQL)
- Autorisatiecontroles op alle statusveranderende operaties
- Gevoelige data versleuteld in transit en in rust
- Beveiligingsrelevante gebeurtenissen gelogd
- Foutafhandeling lekt geen gevoelige informatie
- Afhankelijkheden gecontroleerd op bekende kwetsbaarheden
Hoe mijn code veranderde
De CISSP leerde me geen specifieke codetechnieken - die komen van OWASP, beveiligingsgerichte codegidsen en ervaring. Maar het veranderde mijn mindset op verschillende belangrijke manieren:
1. Ik denk in termen van risico
Voor ik beveiligingsbeslissingen neem, vraag ik nu: Wat is het asset? Wat is de dreiging? Wat is de impact als dit faalt? Dit voorkomt zowel onder-engineering (duidelijke gaten laten) als over-engineering (onnodige complexiteit toevoegen).
2. Ik beschouw de volledige levenscyclus
Beveiliging gaat niet alleen over wat er gebeurt als code draait. Het gaat over hoe code wordt ontwikkeld, geïmplementeerd, gemonitord en uiteindelijk buiten gebruik gesteld. Ik denk vanaf het begin aan secret rotation, logretentie en dataverwijdering.
3. Ik communiceer beveiliging beter
De CISSP gaf me vocabulaire om over beveiliging te praten met niet-ontwikkelaars. Ik kan risico's uitleggen in zakelijke termen, niet alleen technische termen. Dit maakt het gemakkelijker om buy-in te krijgen voor beveiligingswerk.
4. Ik herken compliance-vereisten
Het begrijpen van AVG, PCI-DSS en andere compliance-frameworks helpt me applicaties te bouwen die vanaf het begin aan regelgevende vereisten voldoen, niet als een dure aanpassing achteraf.
Zouden ontwikkelaars CISSP moeten halen?
Eerlijk? Voor de meeste ontwikkelaars, waarschijnlijk niet. De CISSP vereist 5 jaar professionele ervaring in beveiligingsdomeinen, het examen is duur en de meeste inhoud is niet direct toepasbaar op het schrijven van code.
Als je beveiligingscredentials wilt als ontwikkelaar, overweeg:
- GIAC GWEB - Webapplicatiebeveiliging
- OSCP - Praktische penetratietesten
- AWS Security Specialty - Cloudbeveiliging (als AWS je platform is)
Maar als je een ontwikkelaar bent die ook architectuurbeslissingen neemt, met beveiligingsteams werkt of het grotere plaatje wil begrijpen - is de CISSP het overwegen waard. Het zal je geen betere programmeur maken, maar het zal je een meer beveiligingsbewuste ontwikkelaar maken.
De blijvende impact
Drie jaar na het slagen voor het CISSP-examen, denk ik nog steeds anders over beveiliging dan daarvoor. Elke feature die ik bouw, elke API die ik ontwerp, elke database die ik structureer - beveiligingsoverwegingen zijn vanaf het begin verweven.
De certificering is geen magie. Het is een raamwerk om te denken. En dat raamwerk heeft me een betere ontwikkelaar gemaakt.
Op zoek naar een ontwikkelaar die vanaf het begin aan beveiliging denkt? Laten we praten.
Por qué un desarrollador buscaría el CISSP
El Certified Information Systems Security Professional (CISSP) es tradicionalmente una certificación para gerentes de seguridad, no para desarrolladores. Los ocho dominios cubren todo, desde seguridad física hasta planificación de continuidad del negocio. La mayor parte no implica directamente escribir código.
Entonces, ¿por qué lo busqué? Después de años construyendo aplicaciones, me di cuenta de que estaba tomando decisiones de seguridad sin entender realmente el panorama general. Podía implementar autenticación, ¿pero entendía por qué ciertos enfoques eran mejores desde una perspectiva de riesgo? Podía cifrar datos, ¿pero entendía las implicaciones legales y de cumplimiento?
El CISSP me obligó a pensar en la seguridad como un sistema, no solo como una colección de técnicas.
Los ocho dominios y qué significan para los desarrolladores
Permíteme recorrer cada dominio del CISSP y extraer las lecciones que cambiaron cómo escribo código.
1. Seguridad y gestión de riesgos
Este dominio cubre gobernanza, evaluación de riesgos y políticas de seguridad. Como desarrollador, la idea clave es: la seguridad trata sobre gestionar el riesgo, no eliminarlo.
Antes del CISSP, pensaba que la seguridad era binaria - o algo era seguro o no lo era. Ahora entiendo que la seguridad se trata de compensaciones. Cada control tiene un costo. El objetivo es una seguridad apropiada para el contexto, no seguridad máxima sin importar el costo.
// Antes: "Más seguridad siempre es mejor"
$hashedPassword = password_hash($password, PASSWORD_ARGON2ID, [
'memory_cost' => 262144, // Valores máximos en todas partes
'time_cost' => 10,
'threads' => 8,
]);
// Después: "Seguridad apropiada para el contexto"
// Para una aplicación de bajo valor, los parámetros predeterminados de Argon2 son suficientes
// y no crean vectores DOS
$hashedPassword = password_hash($password, PASSWORD_ARGON2ID);
2. Seguridad de activos
Este dominio trata sobre clasificar y proteger datos según su valor. La lección para desarrolladores: no todos los datos necesitan el mismo nivel de protección.
Ahora clasifico los datos en cada aplicación que construyo:
- Público: Publicaciones de blog, perfiles públicos
- Interno: Preferencias de usuario, metadatos no sensibles
- Confidencial: Direcciones de correo electrónico, historial de pedidos
- Restringido: Contraseñas, datos de pago, información de salud
Esta clasificación impulsa decisiones arquitectónicas. Los datos restringidos pueden necesitar cifrado en reposo, registro de auditoría y controles de acceso a bases de datos separados. Los datos públicos no.
3. Arquitectura de seguridad e ingeniería
Este dominio cubre modelos de seguridad y principios de diseño seguro. La lección que se me quedó: la defensa en profundidad no es opcional.
Antes, podría confiar en un solo control - "El firewall bloqueará el tráfico malo". Ahora coloco capas de defensas asumiendo que cada una podría fallar:
// Defensa en profundidad para una operación crítica
public function processPayment(PaymentRequest $request): PaymentResult
{
// Capa 1: Limitación de velocidad (manejada por middleware)
// Capa 2: Verificación de autenticación
if (!auth()->check()) {
throw new UnauthorizedException();
}
// Capa 3: Autorización - ¿puede este usuario realizar esta acción?
$this->authorize('create-payment', $request->account);
// Capa 4: Validación de entrada
$validated = $request->validate([
'amount' => 'required|numeric|min:0.01|max:10000',
'currency' => 'required|in:EUR,USD,GBP',
]);
// Capa 5: Validación de lógica de negocio
if ($this->exceedsAccountLimits($request->account, $validated['amount'])) {
throw new BusinessRuleException('Payment exceeds account limits');
}
// Capa 6: Registro de auditoría
AuditLog::create([
'action' => 'payment.initiated',
'user_id' => auth()->id(),
'data' => $validated,
'ip' => $request->ip(),
]);
// Capa 7: Procesar el pago realmente
return $this->paymentGateway->process($validated);
}
4. Comunicación y seguridad de red
Este dominio cubre arquitectura de red y protocolos de comunicación seguros. Para desarrolladores: asume que la red es hostil.
Esto significa:
- TLS en todas partes, no solo para páginas de inicio de sesión
- Fijación de certificados para aplicaciones móviles
- Validar datos de APIs incluso cuando son "internas"
- Usar protocolos seguros para comunicación servicio-a-servicio
// Incluso las llamadas API internas deben tratarse con cuidado
$response = Http::withToken(config('services.internal.token'))
->timeout(5)
->retry(3, 100)
->get('https://internal-api.example.com/users/' . $userId);
// No confíes en la respuesta ciegamente
if (!$response->successful()) {
throw new ExternalServiceException('User service unavailable');
}
$userData = $response->json();
// Valida la estructura incluso de fuentes confiables
if (!isset($userData['id'], $userData['email'])) {
throw new InvalidResponseException('Malformed user data');
}
5. Gestión de identidad y acceso (IAM)
Este dominio cubre autenticación, autorización y ciclo de vida de identidad. La idea clave: el principio de privilegio mínimo se aplica en todas partes.
Ahora por defecto uso permisos mínimos y expando solo cuando es necesario:
// Usuario de base de datos con privilegios mínimos
// CREATE USER 'app_user'@'%' IDENTIFIED BY 'secure_password';
// GRANT SELECT, INSERT, UPDATE ON myapp.* TO 'app_user'@'%';
// No DELETE - eliminaciones suaves en código de aplicación
// No DROP, ALTER, CREATE - esos van a través de migraciones
// El código de aplicación impone restricciones adicionales
class OrderPolicy
{
public function view(User $user, Order $order): bool
{
// Los usuarios solo pueden ver sus propios pedidos
return $user->id === $order->user_id;
}
public function update(User $user, Order $order): bool
{
// Solo puede actualizar pedidos pendientes
return $user->id === $order->user_id
&& $order->status === OrderStatus::PENDING;
}
}
6. Evaluación y pruebas de seguridad
Este dominio cubre evaluaciones de vulnerabilidades, pruebas de penetración y auditoría. La lección para desarrolladores: incorpora pruebas de seguridad en tu flujo de trabajo.
Las pruebas de seguridad no deberían ser un evento anual. Deberían ser continuas:
# Verificaciones de seguridad en CI/CD
- name: Dependency vulnerability scan
run: composer audit
- name: Static analysis for security issues
run: vendor/bin/phpstan analyse -c phpstan-security.neon
- name: OWASP dependency check
uses: dependency-check/dependency-check-action@v3
- name: Secret scanning
uses: trufflesecurity/trufflehog@main
with:
path: .
base: main
7. Operaciones de seguridad
Este dominio cubre respuesta a incidentes, monitoreo y recuperación ante desastres. Para desarrolladores: registra para seguridad, no solo para depuración.
// Registro enfocado en seguridad
class SecurityLogger
{
public function authenticationSuccess(User $user, Request $request): void
{
Log::channel('security')->info('Authentication success', [
'user_id' => $user->id,
'ip' => $request->ip(),
'user_agent' => $request->userAgent(),
'timestamp' => now()->toIso8601String(),
]);
}
public function authenticationFailure(string $email, Request $request): void
{
Log::channel('security')->warning('Authentication failure', [
'attempted_email' => $email,
'ip' => $request->ip(),
'user_agent' => $request->userAgent(),
'timestamp' => now()->toIso8601String(),
]);
}
public function privilegedAction(User $user, string $action, array $context): void
{
Log::channel('security')->info('Privileged action', [
'user_id' => $user->id,
'action' => $action,
'context' => $context,
'timestamp' => now()->toIso8601String(),
]);
}
}
8. Seguridad en desarrollo de software
Finalmente, el dominio más cercano a mi trabajo diario. El principio general: la seguridad es un requisito, no una característica.
La seguridad no debería agregarse después del desarrollo. Debería ser parte de la definición de hecho desde el principio.
Definición de hecho - elementos de seguridad
- Validación de entrada en todos los datos proporcionados por el usuario
- Codificación de salida apropiada al contexto (HTML, JSON, SQL)
- Verificaciones de autorización en todas las operaciones que cambian estado
- Datos sensibles cifrados en tránsito y en reposo
- Eventos relevantes de seguridad registrados
- El manejo de errores no filtra información sensible
- Dependencias verificadas para vulnerabilidades conocidas
Cómo cambió mi código
El CISSP no me enseñó técnicas de codificación específicas - esas vienen de OWASP, guías de codificación enfocadas en seguridad y experiencia. Pero cambió mi mentalidad de varias maneras clave:
1. Pienso en términos de riesgo
Antes de tomar decisiones de seguridad, ahora pregunto: ¿Cuál es el activo? ¿Cuál es la amenaza? ¿Cuál es el impacto si esto falla? Esto previene tanto la sub-ingeniería (dejar agujeros obvios) como la sobre-ingeniería (agregar complejidad innecesaria).
2. Considero el ciclo de vida completo
La seguridad no se trata solo de lo que sucede cuando se ejecuta el código. Se trata de cómo se desarrolla, implementa, monitorea y eventualmente se desactiva el código. Pienso en la rotación de secretos, retención de registros y eliminación de datos desde el principio.
3. Comunico mejor la seguridad
El CISSP me dio vocabulario para discutir seguridad con no desarrolladores. Puedo explicar riesgos en términos comerciales, no solo términos técnicos. Esto facilita obtener apoyo para el trabajo de seguridad.
4. Reconozco requisitos de cumplimiento
Entender GDPR, PCI-DSS y otros marcos de cumplimiento me ayuda a construir aplicaciones que cumplen con requisitos regulatorios desde el principio, no como una adaptación costosa.
¿Deberían los desarrolladores obtener el CISSP?
¿Honestamente? Para la mayoría de los desarrolladores, probablemente no. El CISSP requiere 5 años de experiencia profesional en dominios de seguridad, el examen es costoso y la mayor parte del contenido no es directamente aplicable a escribir código.
Si quieres credenciales de seguridad como desarrollador, considera:
- GIAC GWEB - Seguridad de aplicaciones web
- OSCP - Pruebas de penetración prácticas
- AWS Security Specialty - Seguridad en la nube (si AWS es tu plataforma)
Pero si eres un desarrollador que también toma decisiones arquitectónicas, trabaja con equipos de seguridad o quiere entender el panorama general - el CISSP vale la pena considerarlo. No te hará un mejor programador, pero te hará un desarrollador más consciente de la seguridad.
El impacto duradero
Tres años después de aprobar el examen CISSP, todavía pienso sobre seguridad de manera diferente a como lo hacía antes. Cada característica que construyo, cada API que diseño, cada base de datos que estructuro - las consideraciones de seguridad están entretejidas desde el principio.
La certificación no es magia. Es un marco para pensar. Y ese marco me ha hecho un mejor desarrollador.
¿Buscas un desarrollador que piense en seguridad desde el principio? Hablemos.