249 أسطر
7.7 KiB
Markdown
249 أسطر
7.7 KiB
Markdown
# Q2 — Attack Simulation & Incident Response
|
||
|
||
**Scenario:** A successful brute force attack on the API login endpoint led to a data leak.
|
||
|
||
---
|
||
|
||
## Part 1: Attack Timeline
|
||
|
||
### T+00:00 — Reconnaissance
|
||
- Attacker scans the public IP using tools like `nmap` or online port scanners.
|
||
- Discovers the exposed API endpoint: `POST /api/v1/auth/login`
|
||
- Identifies no rate-limiting or lockout protection via repeated test requests.
|
||
|
||
### T+00:15 — Credential Acquisition
|
||
- Attacker uses previously leaked or weak credentials (e.g., from public breach databases or common password lists).
|
||
- Builds a wordlist targeting usernames like `admin`, `deploy`, or known email patterns.
|
||
|
||
### T+00:30 — Brute Force Attack Begins
|
||
- An automated script (e.g., `hydra`, `ffuf`, or custom Python) starts sending POST requests to the login endpoint.
|
||
- Sends hundreds of attempts per minute with different username/password combinations.
|
||
- No lockout policy is enforced — the server continues responding normally.
|
||
|
||
### T+01:00 — Successful Authentication
|
||
- A valid credential pair is found.
|
||
- The attacker receives a valid JWT access token.
|
||
- **First point of compromise confirmed.**
|
||
|
||
### T+01:05 — Session Takeover & Enumeration
|
||
- Attacker uses the JWT token to call authenticated API endpoints.
|
||
- Discovers `/api/v1/users/export` and `/api/v1/reports/download` via path probing.
|
||
|
||
### T+01:15 — Data Exfiltration Begins
|
||
- Attacker downloads a full CSV dump of user records including: names, emails, hashed passwords, internal metadata.
|
||
- No anomaly alert fires on the large data download.
|
||
|
||
### T+01:45 — Exfiltration Complete
|
||
- All accessible data is exfiltrated to the attacker's remote server.
|
||
- The token remains valid for the full expiry window — no revocation triggered.
|
||
|
||
### T+03:00 — Detection (Delayed)
|
||
- An administrator notices unusual API traffic in access logs.
|
||
- Investigation reveals the brute-force pattern in `/api/v1/auth/login` logs.
|
||
|
||
### T+03:30 — Incident Confirmed
|
||
- Security team confirms unauthorized access and data exfiltration.
|
||
- **Incident Response Plan is activated.**
|
||
|
||
---
|
||
|
||
### Root Cause Summary
|
||
|
||
| Root Cause | Detail |
|
||
|---|---|
|
||
| No rate limiting | API accepted unlimited login attempts |
|
||
| No account lockout | No lockout after failed attempt threshold |
|
||
| Weak or reused credentials | Password matched a known leaked value |
|
||
| No anomaly alerting | No alert fired for burst of failed logins |
|
||
| Overly broad API authorization | Export endpoint accessible with any valid token |
|
||
| No egress monitoring | Large data download went undetected |
|
||
|
||
---
|
||
|
||
## Part 2: Incident Response Plan
|
||
|
||
**Classification:** P1 — Critical Security Incident
|
||
**System Affected:** API Login Endpoint
|
||
|
||
### Phase 1: Identification (0–15 min)
|
||
|
||
1. Pull API access logs and filter for `POST /api/v1/auth/login` in the last 6 hours.
|
||
2. Identify source IPs with >50 failed attempts followed by a successful login.
|
||
3. Confirm large API calls to export endpoints post-login.
|
||
4. Assign an incident commander and open a dedicated communication channel.
|
||
|
||
### Phase 2: Containment (15–60 min)
|
||
|
||
| Action | Method |
|
||
|---|---|
|
||
| Block attacker IP(s) | Firewall / WAF deny rule |
|
||
| Revoke all active JWT tokens | Rotate JWT signing secret or blacklist tokens |
|
||
| Force logout all active sessions | Flush session store (Redis/DB) |
|
||
| Disable the export endpoint | Feature flag or reverse proxy block |
|
||
| Enable emergency rate limiting | Nginx `limit_req_zone` or API gateway rule |
|
||
| Enable account lockout | Application config: 5 attempts → 15 min lock |
|
||
|
||
### Phase 3: Eradication (1–2 hours)
|
||
|
||
1. Patch the login endpoint with rate limiting, account lockout, and MFA enforcement.
|
||
2. Audit all API endpoints for over-permissive authorization.
|
||
3. Check for any persistence (e.g., new admin accounts created during the attack).
|
||
4. Rotate all application secrets and API keys.
|
||
5. Require password reset for all users whose data was exported.
|
||
|
||
### Phase 4: Recovery (2–8 hours)
|
||
|
||
1. Re-enable the export endpoint with admin-only authorization.
|
||
2. Deploy the patched container image.
|
||
3. Verify monitoring and alerting is active.
|
||
4. Notify affected users per data breach disclosure requirements.
|
||
|
||
### Phase 5: Lessons Learned (within 72 hours)
|
||
|
||
1. Conduct a post-mortem with all stakeholders.
|
||
2. Update the threat model and security runbooks.
|
||
3. Schedule a penetration test to verify fixes.
|
||
|
||
---
|
||
|
||
## Part 3: Prevention on the Cloud
|
||
|
||
> The following controls can be implemented in a Ghaymah cloud deployment using its networking, container, and monitoring capabilities.
|
||
|
||
### Network-Level Controls
|
||
|
||
**Rate Limiting via Nginx:**
|
||
```nginx
|
||
http {
|
||
limit_req_zone $binary_remote_addr zone=login_limit:10m rate=5r/m;
|
||
|
||
server {
|
||
location /api/v1/auth/login {
|
||
limit_req zone=login_limit burst=10 nodelay;
|
||
limit_req_status 429;
|
||
proxy_pass http://app_backend;
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
**Web Application Firewall:**
|
||
- Deploy a WAF in front of the application layer.
|
||
- Configure rules to block IPs generating >100 requests/min to `/auth` endpoints.
|
||
- Block known malicious user agents (e.g., scanner fingerprints).
|
||
|
||
**IP Restriction for Admin Endpoints:**
|
||
```bash
|
||
# Allow only internal network to access sensitive endpoints
|
||
iptables -A INPUT -p tcp --dport 8080 -s 10.0.0.0/8 -j ACCEPT
|
||
iptables -A INPUT -p tcp --dport 8080 -j DROP
|
||
```
|
||
|
||
**Container Network Policy:**
|
||
```yaml
|
||
apiVersion: networking.k8s.io/v1
|
||
kind: NetworkPolicy
|
||
metadata:
|
||
name: restrict-login-access
|
||
namespace: production
|
||
spec:
|
||
podSelector:
|
||
matchLabels:
|
||
app: api-server
|
||
ingress:
|
||
- from:
|
||
- podSelector:
|
||
matchLabels:
|
||
role: frontend
|
||
ports:
|
||
- protocol: TCP
|
||
port: 8080
|
||
policyTypes:
|
||
- Ingress
|
||
```
|
||
|
||
### Container Security Controls
|
||
|
||
**Run as non-root user:**
|
||
```dockerfile
|
||
FROM python:3.12-slim
|
||
RUN useradd --create-home appuser
|
||
USER appuser
|
||
```
|
||
|
||
**Read-only filesystem:**
|
||
```yaml
|
||
services:
|
||
api:
|
||
read_only: true
|
||
tmpfs:
|
||
- /tmp
|
||
```
|
||
|
||
**Secrets via environment injection (never baked into images):**
|
||
```yaml
|
||
services:
|
||
api:
|
||
env_file:
|
||
- .env.production
|
||
```
|
||
|
||
**Image vulnerability scanning in CI/CD:**
|
||
```yaml
|
||
- name: Scan Docker image
|
||
uses: aquasecurity/trivy-action@master
|
||
with:
|
||
image-ref: 'registry/api:latest'
|
||
exit-code: '1'
|
||
severity: 'CRITICAL,HIGH'
|
||
```
|
||
|
||
### Application-Level Controls
|
||
|
||
| Control | Implementation |
|
||
|---|---|
|
||
| Account lockout | Lock after 5 failed attempts, notify user by email |
|
||
| MFA | TOTP required for all admin accounts |
|
||
| Password validation | Reject known-weak passwords, enforce minimum 12 chars |
|
||
| JWT expiry | Short-lived access tokens (15 min), refresh token rotation |
|
||
| Structured auth logging | Log all login attempts to SIEM for real-time analysis |
|
||
|
||
---
|
||
|
||
## Part 4: Brute Force Alert Rule
|
||
|
||
The full deployable Prometheus rule file is in [`alert-rule.yml`](./alert-rule.yml). It defines three rules:
|
||
|
||
### Alert Rules Explanation
|
||
|
||
| Rule | Trigger | Severity | Recommended Action |
|
||
|---|---|---|---|
|
||
| `BruteForceLoginAttempt` | >10 failed logins/min from same IP for 1+ min | Critical | Auto-block IP at firewall |
|
||
| `SuspiciousLoginAfterFailures` | 20+ failures then 1 success from same IP | Critical | Revoke token, notify security team |
|
||
| `AbnormalDataExport` | >10 MB exported in 5 min by single user | Warning | Flag for human review |
|
||
|
||
### AlertManager Notification Config
|
||
|
||
```yaml
|
||
# alertmanager.yml
|
||
receivers:
|
||
- name: secops-slack
|
||
slack_configs:
|
||
- api_url: ${SLACK_WEBHOOK_URL}
|
||
channel: '#security-alerts'
|
||
title: '{{ .CommonAnnotations.summary }}'
|
||
text: '{{ .CommonAnnotations.description }}'
|
||
|
||
- name: secops-pagerduty
|
||
pagerduty_configs:
|
||
- routing_key: ${PAGERDUTY_KEY}
|
||
severity: critical
|
||
|
||
route:
|
||
receiver: secops-slack
|
||
routes:
|
||
- match:
|
||
severity: critical
|
||
receiver: secops-pagerduty
|
||
```
|