Skip to content

Commit 9e8b2eb

Browse files
author
Victor Grenu
committed
large update with endpoints and guarduty
1 parent 5a189a0 commit 9e8b2eb

662 files changed

Lines changed: 22432 additions & 295 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
name: "[Prod] IAMTrail - GuardDuty Announcements Sync"
2+
3+
on:
4+
schedule:
5+
- cron: "30 */6 * * *"
6+
workflow_dispatch:
7+
8+
env:
9+
project: "mamip"
10+
aws_region: "eu-west-1"
11+
dynamodb_table: "iamtrail-guardduty-announcements"
12+
13+
permissions:
14+
id-token: write
15+
contents: write
16+
17+
jobs:
18+
sync-guardduty:
19+
name: "Sync GuardDuty Announcements"
20+
runs-on: ubuntu-latest
21+
steps:
22+
- name: Checkout
23+
uses: actions/checkout@v4
24+
with:
25+
token: ${{ secrets.GITHUB_TOKEN }}
26+
27+
- name: Configure AWS credentials
28+
uses: aws-actions/configure-aws-credentials@v4
29+
with:
30+
aws-region: ${{ env.aws_region }}
31+
role-to-assume: ${{ secrets.ROLE_TO_ASSUME }}
32+
role-duration-seconds: 900
33+
role-session-name: GH-Actions-GuardDutySync
34+
35+
- name: Query DynamoDB for new announcements
36+
id: query
37+
run: |
38+
mkdir -p data/guardduty
39+
40+
# Scan all items from DynamoDB
41+
ITEMS=$(aws dynamodb scan \
42+
--table-name "${{ env.dynamodb_table }}" \
43+
--region "${{ env.aws_region }}" \
44+
--output json 2>/dev/null || echo '{"Items":[]}')
45+
46+
ITEM_COUNT=$(echo "$ITEMS" | jq '.Items | length')
47+
echo "Found $ITEM_COUNT items in DynamoDB"
48+
49+
if [ "$ITEM_COUNT" -eq 0 ]; then
50+
echo "CHANGES_DETECTED=false" >> "$GITHUB_OUTPUT"
51+
exit 0
52+
fi
53+
54+
NEW_FILES=0
55+
56+
echo "$ITEMS" | jq -c '.Items[]' | while read -r item; do
57+
ANNOUNCEMENT_ID=$(echo "$item" | jq -r '.announcement_id.S')
58+
ANNOUNCEMENT_DATE=$(echo "$item" | jq -r '.announcement_date.S')
59+
TYPE=$(echo "$item" | jq -r '.type.S')
60+
DESCRIPTION=$(echo "$item" | jq -r '.description.S // ""')
61+
SHORT_DESC=$(echo "$item" | jq -r '.short_description.S // ""')
62+
LINK=$(echo "$item" | jq -r '.link.S // ""')
63+
RAW_MESSAGE=$(echo "$item" | jq -r '.raw_message.S // "{}"')
64+
DETECTED_AT=$(echo "$item" | jq -r '.detected_at.S // ""')
65+
GIST_URL=$(echo "$item" | jq -r '.gist_url.S // ""')
66+
67+
FILENAME="data/guardduty/${ANNOUNCEMENT_ID}.json"
68+
69+
if [ ! -f "$FILENAME" ]; then
70+
jq -n \
71+
--arg type "$TYPE" \
72+
--arg detected_at "$DETECTED_AT" \
73+
--arg description "$DESCRIPTION" \
74+
--arg short_description "$SHORT_DESC" \
75+
--arg link "$LINK" \
76+
--arg gist_url "$GIST_URL" \
77+
--argjson raw_sns_message "$RAW_MESSAGE" \
78+
'{
79+
type: $type,
80+
detected_at: $detected_at,
81+
description: $description,
82+
short_description: $short_description,
83+
link: $link,
84+
gist_url: $gist_url,
85+
raw_sns_message: $raw_sns_message
86+
}' > "$FILENAME"
87+
88+
echo " New: $FILENAME"
89+
NEW_FILES=$((NEW_FILES + 1))
90+
fi
91+
done
92+
93+
if [ -n "$(git status --porcelain data/guardduty/)" ]; then
94+
echo "CHANGES_DETECTED=true" >> "$GITHUB_OUTPUT"
95+
CHANGE_COUNT=$(git status --porcelain data/guardduty/ | wc -l | tr -d ' ')
96+
echo "CHANGE_COUNT=$CHANGE_COUNT" >> "$GITHUB_OUTPUT"
97+
echo "$CHANGE_COUNT new announcement files"
98+
else
99+
echo "CHANGES_DETECTED=false" >> "$GITHUB_OUTPUT"
100+
echo "No new announcements"
101+
fi
102+
103+
- name: Send Discord notification
104+
if: steps.query.outputs.CHANGES_DETECTED == 'true'
105+
run: |
106+
WEBHOOK_URL="${{ secrets.DISCORD_WEBHOOK_URL }}"
107+
if [ -z "$WEBHOOK_URL" ]; then
108+
echo "No Discord webhook URL configured, skipping notification"
109+
exit 0
110+
fi
111+
112+
TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
113+
PAYLOAD=$(jq -n \
114+
--arg title "GuardDuty Announcements Synced" \
115+
--arg desc "${{ steps.query.outputs.CHANGE_COUNT }} new announcement(s) committed to git" \
116+
--arg count "${{ steps.query.outputs.CHANGE_COUNT }}" \
117+
--arg ts "$TIMESTAMP" \
118+
'{
119+
"embeds": [{
120+
"title": $title,
121+
"description": $desc,
122+
"color": 3066993,
123+
"fields": [
124+
{"name": "New Files", "value": $count, "inline": true}
125+
],
126+
"footer": {"text": "IAMTrail - GuardDuty Sync"},
127+
"timestamp": $ts
128+
}]
129+
}')
130+
131+
curl -s -o /dev/null -H "Content-Type: application/json" \
132+
-d "$PAYLOAD" "$WEBHOOK_URL" || echo "Warning: Discord notification failed"
133+
134+
- name: Commit and push changes
135+
if: steps.query.outputs.CHANGES_DETECTED == 'true'
136+
run: |
137+
git config --local user.email "iamtrail-bot@noreply.github.com"
138+
git config --local user.name "IAMTrail GuardDuty Monitor"
139+
git add data/guardduty/
140+
git commit -m "guardduty: ${{ steps.query.outputs.CHANGE_COUNT }} new announcement(s)"
141+
git push origin master

0 commit comments

Comments
 (0)