監視とアラート
監視とアラート
DuoKey AWS XKS Proxy の正常性、パフォーマンス、セキュリティを監視する
適用対象:
AWS CloudWatchXKS Proxy LogsPerformance Monitoring
概要
AWS XKS の効果的な監視には以下が含まれます。
CloudWatch メトリクス
XKS プロキシのパフォーマンスと正常性を追跡
プロキシログ
詳細なプロキシ操作を監視
キーマネージャーログ
ソースでのキー操作を追跡
セキュリティ監視
異常や不正アクセスを検出
AWS CloudWatch メトリクス
主要メトリクス
| メトリクス | 説明 | しきい値 |
|---|---|---|
| XksProxyLatency | AWS KMS がプロキシの応答を待つ時間 | 正常:<50ms、警告:50~100ms、重大:>100ms |
| XksProxyCredentialAge | プロキシ認証クレデンシャルの経過期間 | 90 日ごとにローテーション |
| NumberOfRequests | KMS リクエストの数 | 異常を監視 |
| UserErrorCount | 失敗したリクエストの数 | レートが上昇した場合にアラート |
View XksProxyLatency MetricBASH
# View XksProxyLatency metric
aws cloudwatch get-metric-statistics \
--namespace AWS/KMS \
--metric-name XksProxyLatency \
--dimensions Name=CustomKeyStoreId,Value=cks-1234567890abcdef0 \
--start-time $(date -u -d '1 hour ago' '+%Y-%m-%dT%H:%M:%S') \
--end-time $(date -u '+%Y-%m-%dT%H:%M:%S') \
--period 300 \
--statistics Average,Maximum,Minimum \
--output tableCheck Credential AgeBASH
# Check credential age
aws cloudwatch get-metric-statistics \
--namespace AWS/KMS \
--metric-name XksProxyCredentialAge \
--dimensions Name=CustomKeyStoreId,Value=cks-1234567890abcdef0 \
--start-time $(date -u -d '24 hours ago' '+%Y-%m-%dT%H:%M:%S') \
--end-time $(date -u '+%Y-%m-%dT%H:%M:%S') \
--period 3600 \
--statistics Maximum \
--output tableCloudWatch アラームの作成
Create High Latency AlarmBASH
aws cloudwatch put-metric-alarm \
--alarm-name xks-high-latency \
--alarm-description "Alert when XKS proxy latency exceeds threshold" \
--metric-name XksProxyLatency \
--namespace AWS/KMS \
--statistic Average \
--period 300 \
--evaluation-periods 2 \
--threshold 100 \
--comparison-operator GreaterThanThreshold \
--dimensions Name=CustomKeyStoreId,Value=cks-1234567890abcdef0 \
--alarm-actions arn:aws:sns:us-east-1:123456789012:xks-alertsCloudWatch ダッシュボード
Dashboard DefinitionJSON
{
"widgets": [
{
"type": "metric",
"properties": {
"metrics": [
["AWS/KMS", "XksProxyLatency", {"stat": "Average"}],
["...", {"stat": "Maximum"}]
],
"period": 300,
"stat": "Average",
"region": "us-east-1",
"title": "XKS Proxy Latency",
"yAxis": {
"left": {
"min": 0,
"max": 200
}
}
}
},
{
"type": "metric",
"properties": {
"metrics": [
["AWS/KMS", "NumberOfRequests", {"stat": "Sum"}]
],
"period": 300,
"stat": "Sum",
"region": "us-east-1",
"title": "Request Volume"
}
},
{
"type": "metric",
"properties": {
"metrics": [
["AWS/KMS", "UserErrorCount", {"stat": "Sum"}],
[".", "SystemErrorCount", {"stat": "Sum"}]
],
"period": 300,
"stat": "Sum",
"region": "us-east-1",
"title": "Error Rates"
}
}
]
}Apply DashboardBASH
aws cloudwatch put-dashboard \
--dashboard-name XKS-Monitoring \
--dashboard-body file://xks-dashboard.jsonXKS プロキシのロギング
プロキシロギングの構成
Proxy Logging ConfigurationYAML
logging:
level: info # debug, info, warn, error
format: json
output: /var/log/duokey-xks-proxy/proxy.log
rotation:
max_size: 100MB
max_age: 30
max_backups: 10
compress: true
# Log specific components
components:
authentication: debug
encryption: info
routing: info
health: warnログ分析
Analyze Proxy LogsBASH
# Count requests by operation
cat /var/log/duokey-xks-proxy/proxy.log | \
jq -r '.operation' | sort | uniq -c
# Average latency by backend
cat /var/log/duokey-xks-proxy/proxy.log | \
jq -r 'select(.backend != null) | "\(.backend) \(.duration_ms)"' | \
awk '{sum[$1]+=$2; count[$1]++} END {for (b in sum) print b, sum[b]/count[b]}'
# Failed requests in last hour
cat /var/log/duokey-xks-proxy/proxy.log | \
jq -r 'select(.status == "error" and .timestamp > "'$(date -u -d '1 hour ago' '+%Y-%m-%dT%H:%M:%S')'")'ログの CloudWatch への送信
CloudWatch Logs Agent ConfigurationJSON
{
"logs": {
"logs_collected": {
"files": {
"collect_list": [
{
"file_path": "/var/log/duokey-xks-proxy/proxy.log",
"log_group_name": "/aws/xks/proxy",
"log_stream_name": "{instance_id}",
"timestamp_format": "%Y-%m-%dT%H:%M:%S"
}
]
}
}
}
}ネットワーク監視
Monitor Network LatencyBASH
#!/bin/bash
# Monitor round-trip time to XKS proxy
PROXY_HOST="xks-proxy.example.com"
LOG_FILE="/var/log/xks-network-monitor.log"
while true; do
TIMESTAMP=$(date -u '+%Y-%m-%dT%H:%M:%S')
RTT=$(curl -o /dev/null -s -w '%{time_total}' https://$PROXY_HOST/health)
RTT_MS=$(echo "$RTT * 1000" | bc)
echo "$TIMESTAMP,$RTT_MS" >> $LOG_FILE
# Alert if RTT exceeds threshold
if (( $(echo "$RTT_MS > 100" | bc -l) )); then
echo "WARNING: High latency detected: ${RTT_MS}ms" | \
aws sns publish \
--topic-arn arn:aws:sns:us-east-1:123456789012:xks-alerts \
--subject "XKS High Latency Alert"
fi
sleep 60
doneMonitor TLS Certificate ExpirationBASH
#!/bin/bash
# Check XKS proxy TLS certificate expiration
PROXY_HOST="xks-proxy.example.com"
CERT_EXPIRY=$(echo | openssl s_client -servername $PROXY_HOST \
-connect $PROXY_HOST:443 2>/dev/null | openssl x509 -noout -enddate | \
cut -d= -f2)
EXPIRY_EPOCH=$(date -d "$CERT_EXPIRY" +%s)
CURRENT_EPOCH=$(date +%s)
DAYS_UNTIL_EXPIRY=$(( ($EXPIRY_EPOCH - $CURRENT_EPOCH) / 86400 ))
echo "Certificate expires in $DAYS_UNTIL_EXPIRY days"
if [ $DAYS_UNTIL_EXPIRY -lt 30 ]; then
echo "WARNING: Certificate expires soon!" | \
aws sns publish \
--topic-arn arn:aws:sns:us-east-1:123456789012:xks-alerts \
--subject "XKS Certificate Expiration Warning"
fiセキュリティ監視
AWS CloudTrail 統合
Query CloudTrail for XKS EventsBASH
# Query CloudTrail for XKS-related events
aws cloudtrail lookup-events \
--lookup-attributes \
AttributeKey=ResourceName,AttributeValue=cks-1234567890abcdef0 \
--start-time $(date -u -d '24 hours ago' '+%Y-%m-%dT%H:%M:%S') \
--query 'Events[*].{
Time:EventTime,
User:Username,
Event:EventName,
Resource:Resources[0].ResourceName
}' \
--output table異常なアクティビティの検出
Detect AnomaliesBASH
#!/bin/bash
# Detect unusual patterns in XKS usage
# Spike in failed requests
FAILED_COUNT=$(cat /var/log/duokey-xks-proxy/proxy.log | \
jq -r 'select(.timestamp > "'$(date -u -d '5 minutes ago' '+%Y-%m-%dT%H:%M:%S')'"
and .status == "error")' | wc -l)
if [ $FAILED_COUNT -gt 50 ]; then
echo "ALERT: Unusual spike in failed requests: $FAILED_COUNT in 5 minutes"
fi
# Requests from unexpected IPs
KNOWN_IPS="52.94.133.0/24,52.95.0.0/16"
UNKNOWN_IPS=$(cat /var/log/duokey-xks-proxy/proxy.log | \
jq -r '.source_ip' | sort -u | \
grep -v -f <(echo $KNOWN_IPS | tr ',' '\n'))
if [ -n "$UNKNOWN_IPS" ]; then
echo "ALERT: Requests from unknown IPs: $UNKNOWN_IPS"
fiアラート戦略
重大アラート(即時対応)
| アラート | トリガー | アクション |
|---|---|---|
| XKS プロキシに到達不可 | ヘルスチェックが 3 回連続で失敗 | オンコールエンジニアを呼び出す |
| 認証エラー | 5 分間に 10 回を超える認証エラー | セキュリティチームへの通知 |
| 極端なレイテンシ | 平均が 10 分間 200ms を超える | 運用チームへの通知 |
警告アラート(調査が必要)
| アラート | トリガー | アクション |
|---|---|---|
| レイテンシの上昇 | 平均が 15 分間 100ms を超える | 運用チームにメール |
| 証明書の有効期限 | 有効期限まで 30 日未満 | セキュリティチームにメール |
| 高エラー率 | エラー率が 10 分間 5% を超える | 運用チームにメール |
情報アラート(周知)
| アラート | トリガー | アクション |
|---|---|---|
| クレデンシャルの経過期間 | クレデンシャルが 60 日を超えて古い | ローテーションのリマインダーをメール |
| 使用量の急増 | リクエスト量が通常のベースラインの 2 倍 | 運用チームにメール |
監視のベストプラクティス
監視チェックリスト
ベースラインの確立通常運用のベースラインを得るため 1~2 週間メトリクスを収集する
ランブックの作成各アラートタイプの対応手順を文書化する
定期的なレビュー週次のメトリクスレビュー、月次のしきい値更新
監視のテスト障害をシミュレートしてアラートを定期的にテストする
コンプライアンスレポート
Generate Monthly Compliance ReportBASH
#!/bin/bash
# Generate monthly XKS compliance report
MONTH=$(date -u -d 'last month' '+%Y-%m')
REPORT_FILE="xks-compliance-report-$MONTH.txt"
echo "DuoKey AWS XKS Compliance Report - $MONTH" > $REPORT_FILE
echo "==========================================" >> $REPORT_FILE
echo "" >> $REPORT_FILE
# Key Operations Summary
echo "Key Operations Summary:" >> $REPORT_FILE
aws cloudtrail lookup-events \
--lookup-attributes AttributeKey=ResourceType,AttributeValue=AWS::KMS::Key \
--start-time $(date -u -d "$MONTH-01" '+%Y-%m-%dT%H:%M:%S') \
--end-time $(date -u -d "$MONTH-01 +1 month" '+%Y-%m-%dT%H:%M:%S') \
--query 'Events[*].EventName' | \
jq -r '.[]' | sort | uniq -c >> $REPORT_FILE