Proč potřebujeme Security Monitoring?
I s nejsilnějším zabezpečením musíme být připraveni na situaci, kdy dojde k pokusu o útok nebo k samotnému útoku.
Logging je jako kamery ve vaší budově - zaznamenávají co se děje. Monitoring je alarm systém - upozorní vás když se něco podezřelého stane.
Bez těchto nástrojů nebudete vědět, že vám někdo ukradl credentials, dokud nebude příliš pozdě.
Analogie s fyzickou bezpečností
Představte si luxusní vilu s cennými předměty. Máte vysokou zeď, zamčené dveře, trezor pro nejcennější věci.
Ale co když se někdo přece jen dostane dovnitř?
- Kamery (Logging): Zaznamenávají všechno co se děje - kdo přišel, co dělal, kam šel
- Alarm (Monitoring): Okamžitě upozorní když někdo vstoupí do zabezpečené oblasti
- Bezpečnostní služba (Incident Response): Tým který reaguje na alarmy
Bezpečnost je vrstvená
Chráníme systém na každé úrovni útoku - před, během i po útoku. Monitoring a logging jsou klíčové pro detekci a reakci během a po útoku.
AWS Monitoring & Logging služby
CloudTrail - Základní konfigurace
CloudTrail zaznamenává všechny API aktivity ve vašem AWS účtu. Každý login, každé vytvoření instance, každá změna security group.
# Terraform - Multi-region CloudTrail s CloudWatch integrací
resource "aws_cloudtrail" "security_trail" {
name = "security-audit-trail"
s3_bucket_name = aws_s3_bucket.cloudtrail_logs.id
include_global_service_events = true
is_multi_region_trail = true
enable_log_file_validation = true
# Posílá logy do CloudWatch
cloud_watch_logs_group_arn = "${aws_cloudwatch_log_group.cloudtrail.arn}:*"
cloud_watch_logs_role_arn = aws_iam_role.cloudtrail_cloudwatch.arn
# Management events (API calls)
event_selector {
read_write_type = "All"
include_management_events = true
}
# Data events pro S3 (volitelně)
event_selector {
read_write_type = "All"
include_management_events = false
data_resource {
type = "AWS::S3::Object"
values = ["arn:aws:s3:::sensitive-bucket/"]
}
}
tags = {
Name = "security-audit-trail"
Environment = "production"
}
}
# S3 bucket pro CloudTrail logy
resource "aws_s3_bucket" "cloudtrail_logs" {
bucket = "company-cloudtrail-logs-${data.aws_caller_identity.current.account_id}"
tags = {
Name = "cloudtrail-logs"
}
}
# Encryption pro CloudTrail logy
resource "aws_s3_bucket_server_side_encryption_configuration" "cloudtrail_logs" {
bucket = aws_s3_bucket.cloudtrail_logs.id
rule {
apply_server_side_encryption_by_default {
sse_algorithm = "aws:kms"
}
}
}
# CloudWatch Log Group
resource "aws_cloudwatch_log_group" "cloudtrail" {
name = "/aws/cloudtrail/security-audit"
retention_in_days = 365
tags = {
Name = "cloudtrail-logs"
}
}
CloudWatch Alarmy pro bezpečnostní události
Příklad: Alarm na neúspěšné přihlášení
# Metric filter pro failed console logins
resource "aws_cloudwatch_log_metric_filter" "failed_console_login" {
name = "FailedConsoleLogin"
pattern = "{ ($.eventName = ConsoleLogin) && ($.errorMessage = \"Failed authentication\") }"
log_group_name = aws_cloudwatch_log_group.cloudtrail.name
metric_transformation {
name = "FailedConsoleLoginCount"
namespace = "SecurityMetrics"
value = "1"
}
}
# Alarm když je více než 3 failed loginy za 5 minut
resource "aws_cloudwatch_metric_alarm" "failed_login_alarm" {
alarm_name = "FailedConsoleLoginAlarm"
comparison_operator = "GreaterThanThreshold"
evaluation_periods = 1
metric_name = "FailedConsoleLoginCount"
namespace = "SecurityMetrics"
period = 300 # 5 minut
statistic = "Sum"
threshold = 3
alarm_description = "Více než 3 neúspěšné pokusy o přihlášení za 5 minut"
alarm_actions = [aws_sns_topic.security_alerts.arn]
tags = {
Name = "failed-login-alarm"
}
}
# SNS topic pro security alerty
resource "aws_sns_topic" "security_alerts" {
name = "security-alerts"
}
# Email subscription
resource "aws_sns_topic_subscription" "security_email" {
topic_arn = aws_sns_topic.security_alerts.arn
protocol = "email"
endpoint = "security-team@company.cz"
}
Další důležité alarmy
# Alarm na root user activity
resource "aws_cloudwatch_log_metric_filter" "root_activity" {
name = "RootAccountUsage"
pattern = "{ $.userIdentity.type = \"Root\" && $.userIdentity.invokedBy NOT EXISTS && $.eventType != \"AwsServiceEvent\" }"
log_group_name = aws_cloudwatch_log_group.cloudtrail.name
metric_transformation {
name = "RootAccountUsageCount"
namespace = "SecurityMetrics"
value = "1"
}
}
resource "aws_cloudwatch_metric_alarm" "root_usage_alarm" {
alarm_name = "RootAccountUsageAlarm"
comparison_operator = "GreaterThanThreshold"
evaluation_periods = 1
metric_name = "RootAccountUsageCount"
namespace = "SecurityMetrics"
period = 60
statistic = "Sum"
threshold = 0
alarm_description = "Root account byl použit!"
alarm_actions = [aws_sns_topic.security_alerts.arn]
}
# Alarm na změny Security Groups
resource "aws_cloudwatch_log_metric_filter" "security_group_changes" {
name = "SecurityGroupChanges"
pattern = "{ ($.eventName = AuthorizeSecurityGroupIngress) || ($.eventName = AuthorizeSecurityGroupEgress) || ($.eventName = RevokeSecurityGroupIngress) || ($.eventName = RevokeSecurityGroupEgress) || ($.eventName = CreateSecurityGroup) || ($.eventName = DeleteSecurityGroup) }"
log_group_name = aws_cloudwatch_log_group.cloudtrail.name
metric_transformation {
name = "SecurityGroupChangeCount"
namespace = "SecurityMetrics"
value = "1"
}
}
# Alarm na IAM policy změny
resource "aws_cloudwatch_log_metric_filter" "iam_policy_changes" {
name = "IAMPolicyChanges"
pattern = "{ ($.eventName = DeleteGroupPolicy) || ($.eventName = DeleteRolePolicy) || ($.eventName = DeleteUserPolicy) || ($.eventName = PutGroupPolicy) || ($.eventName = PutRolePolicy) || ($.eventName = PutUserPolicy) || ($.eventName = CreatePolicy) || ($.eventName = DeletePolicy) || ($.eventName = AttachRolePolicy) || ($.eventName = DetachRolePolicy) || ($.eventName = AttachUserPolicy) || ($.eventName = DetachUserPolicy) }"
log_group_name = aws_cloudwatch_log_group.cloudtrail.name
metric_transformation {
name = "IAMPolicyChangeCount"
namespace = "SecurityMetrics"
value = "1"
}
}
Co monitorovat?
Klíčové bezpečnostní události
Authentication & Authorization
- Failed login attempts (brute force detection)
- Root account usage
- MFA disabled
- New IAM users/roles created
- Permission changes
Network & Infrastructure
- Security group changes
- VPC changes
- Route table modifications
- Network ACL changes
- New EC2 instances
Data Access
- S3 bucket policy changes
- S3 public access
- KMS key deletion/disable
- RDS snapshot sharing
- Secrets Manager access
Billing & Account
- CloudTrail disabled
- Config rules changes
- Unusual billing spikes (cryptomining)
- Account settings changes
Security Monitoring Best Practices
Logging
- Zapnout CloudTrail ve všech regionech
- Uchovávat logy minimálně 1 rok
- Šifrovat logy at rest (KMS)
- Zapnout log file integrity validation
- VPC Flow Logs pro network traffic
- Centralizovat logy do jednoho účtu (Security Account)
Monitoring & Alerting
- Alarmy na kritické bezpečnostní události
- Real-time notifikace (SNS, Slack, PagerDuty)
- Dashboardy pro security team
- GuardDuty pro threat detection
- Security Hub pro centralizovaný přehled
- Pravidelné review findings
Incident Response
- Definované playbooks pro různé typy incidentů
- Automatizovaná remediace kde je to možné
- Pravidelné incident response cvičení
- Post-incident reviews
- Dokumentace všech incidentů
Co NEDĚLAT
- Vypnout CloudTrail (i dočasně)
- Ignorovat alarmy (alert fatigue)
- Mazat logy před koncem retention period
- Mít logy přístupné všem (least privilege)
- Zapomenout monitorovat production
- Nemít incident response plan