Serverless Security
Arquiteturas serverless eliminam gerenciamento de servidores mas introduzem novos desafios: function-level permissions, event injection, dependency vulnerabilities e superfície de ataque expandida.
Modelo de Responsabilidade Compartilhada
Provedor (AWS/Azure/GCP)
- Segurança física e infraestrutura
- Runtime environment
- Isolation entre functions
- Patching do sistema operacional
Cliente (Você)
- Código da function
- Dependências e libraries
- IAM permissions
- Data encryption
- API Gateway configuration
- Logging e monitoring
OWASP Serverless Top 10
- Injection Flaws: SQLi, command injection em event data
- Broken Authentication: Token mismanagement, weak authn
- Sensitive Data Exposure: Secrets hardcoded, logs verbosos
- XML External Entities (XXE): XML parsing inseguro
- Broken Access Control: Overly permissive IAM
- Security Misconfiguration: Default configs, ports abertos
- Cross-Site Scripting (XSS): Output encoding inadequado
- Insecure Deserialization: Deserialização de eventos não confiáveis
- Using Components with Known Vulnerabilities: Deps desatualizadas
- Insufficient Logging: Falta de audit trail
IAM e Least Privilege
Cada function deve ter IAM role dedicada com permissões mínimas necessárias.
AWS Lambda - IAM Policy
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"dynamodb:GetItem",
"dynamodb:PutItem"
],
"Resource": "arn:aws:dynamodb:us-east-1:123456789:table/MyTable"
},
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "arn:aws:logs:*:*:*"
}
]
}
Princípios IAM
- Function-specific roles: Nunca compartilhar roles entre functions
- Resource-level permissions: Especificar ARNs exatos, não wildcards
- Time-based access: Usar AWS STS para credentials temporárias
- Deny by default: Explicitamente allow apenas o necessário
Secrets Management
- AWS Secrets Manager: Rotação automática, encryption at rest
- Azure Key Vault: Managed HSM, access policies
- Environment variables encryption: KMS para encrypt env vars
- Parameter Store: AWS SSM Parameter Store para configs
- Nunca hardcode: Secrets em código ou repositories
Exemplo AWS Lambda + Secrets Manager
import boto3
import json
def lambda_handler(event, context):
# Buscar secret do Secrets Manager
session = boto3.session.Session()
client = session.client(service_name='secretsmanager')
get_secret_value_response = client.get_secret_value(
SecretId='prod/db/password'
)
secret = json.loads(get_secret_value_response['SecretString'])
db_password = secret['password']
# Usar password para conectar ao DB
# ...
Input Validation e Sanitization
Events de API Gateway, S3, DynamoDB Streams, etc. devem ser validados rigorosamente:
// Node.js Lambda example
import Joi from 'joi';
const schema = Joi.object({
userId: Joi.string().uuid().required(),
action: Joi.string().valid('create', 'update', 'delete').required(),
data: Joi.object().required()
});
export const handler = async (event) => {
try {
const body = JSON.parse(event.body);
const { error, value } = schema.validate(body);
if (error) {
return {
statusCode: 400,
body: JSON.stringify({ error: error.details })
};
}
// Process validated input
// ...
} catch (e) {
console.error('Validation error:', e);
return { statusCode: 400, body: 'Invalid input' };
}
};
Dependency Management
- SCA tools: Snyk, npm audit, Dependabot
- Minimal dependencies: Reduzir attack surface
- Lock files: package-lock.json, yarn.lock para reproducibility
- Private registries: Host deps aprovadas internamente
- SBOM: Software Bill of Materials para auditability
Timeout e Resource Limits
# AWS Lambda configuration
Function:
Type: AWS::Serverless::Function
Properties:
Timeout: 30 # segundos (default 3s, max 900s)
MemorySize: 512 # MB
ReservedConcurrentExecutions: 100 # limit concurrency
Environment:
Variables:
MAX_RETRY_ATTEMPTS: 3
CONNECTION_TIMEOUT: 5000
VPC Configuration
Functions que acessam recursos privados devem rodar em VPC com security groups apropriados:
- Private subnets: Functions sem acesso internet direto
- NAT Gateway: Para outbound internet access se necessário
- Security groups: Whitelisting de portas e IPs
- VPC Endpoints: Private access a serviços AWS (S3, DynamoDB)
Logging e Monitoring
- CloudWatch Logs: Centralizar logs de todas functions
- CloudTrail: Audit trail de invocações e mudanças
- X-Ray: Distributed tracing para troubleshooting
- Custom metrics: Business logic metrics via CloudWatch
- Alerting: Alarmes em errors, timeouts, throttles
Structured Logging
import { Logger } from '@aws-lambda-powertools/logger';
const logger = new Logger({ serviceName: 'userService' });
export const handler = async (event, context) => {
logger.addContext(context);
logger.info('Processing request', {
userId: event.userId,
requestId: context.requestId
});
try {
// Business logic
} catch (error) {
logger.error('Processing failed', { error });
throw error;
}
};
API Gateway Security
- Authentication: Cognito, API Keys, Lambda Authorizers
- Rate limiting: Usage plans e throttling
- WAF integration: AWS WAF para proteção contra OWASP Top 10
- Request validation: Models e validators no API Gateway
- CORS: Configurar origins permitidos
Cold Start Security
Cold starts podem ser explorados para timing attacks. Mitigações:
- Provisioned concurrency para functions críticas
- Minimizar package size para startup rápido
- Lazy load de dependencies pesadas
- Warm-up schedules via CloudWatch Events
Runtime Security
- PureSec: Runtime protection para serverless
- Protego: Serverless security platform
- Twistlock: Prisma Cloud para serverless
- Snyk: Vulnerability scanning integrado em CI/CD
Recomendações Finais
Serverless não significa "sem segurança". Implemente least privilege IAM, valide todos inputs, gerencie secrets apropriadamente e monitore comprehensively. Use IaC (Serverless Framework, SAM) para consistency e review. Integre security scanning em CI/CD. Serverless expande attack surface - cada event source e integration point é vetor potencial.
