Du får sällan reda på att en AWS-nyckel har läckt för att någon artigt berättar det. Du får reda på det efter en oväntad faktura, ett blockerat konto eller en spänd “vem pushade det här?”-tråd.
Den här typen av automatisering för AWS-nyckelvarningar träffar SecOps-team först, ärligt talat. Men DevOps-ansvariga och byråägare som hanterar kunders AWS-konton känner samma risk, fast med färre ögon på loggarna.
Det här arbetsflödet skannar GitHub efter exponerade IAM-åtkomstnycklar kopplade till dina AWS-användare och skickar sedan en tydlig Slack-varning med vad du ska göra härnäst. Du får se hur det fungerar, vad du behöver och var team oftast går på minor.
Så här fungerar automatiseringen
Se hur detta löser problemet:
n8n Workflow Template: GitHub + Slack för snabba larm om läckta AWS-nycklar
flowchart LR
subgraph sg0["Manual Launch Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "Manual Launch Trigger", pos: "b", h: 48 }
n1["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Retrieve IAM Users"]
n2["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Parse Usernames List"]
n3@{ icon: "mdi:swap-vertical", form: "rounded", label: "Batch User Iteration", pos: "b", h: 48 }
n4["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Fetch Access Keys"]
n5@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Validate Active Keys", pos: "b", h: 48 }
n6["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Compose GitHub Query"]
n7@{ icon: "mdi:cog", form: "rounded", label: "Rate Limit Delay", pos: "b", h: 48 }
n8["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Query GitHub Leaks"]
n9["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Consolidate Findings"]
n10@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Assess Compromise", pos: "b", h: 48 }
n11["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Build Security Report"]
n12["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Format Slack Notice"]
n13["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/slack.svg' width='40' height='40' /></div><br/>Post Slack Alert"]
n14@{ icon: "mdi:cog", form: "rounded", label: "Resume Scan Loop", pos: "b", h: 48 }
n13 --> n14
n1 --> n2
n7 --> n8
n14 --> n3
n12 --> n13
n4 --> n5
n2 --> n3
n6 --> n7
n5 --> n6
n9 --> n10
n11 --> n12
n10 --> n11
n3 --> n4
n8 --> n9
n0 --> n1
end
subgraph sg1["Flow 2"]
direction LR
n15["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Utility: Deactivate Keys"]
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n0 trigger
class n5,n10 decision
class n1,n4,n8,n15 api
class n2,n6,n9,n11,n12 code
class n15 disabled
classDef customIcon fill:none,stroke:none
class n1,n2,n4,n6,n8,n9,n11,n12,n13,n15 customIcon
Utmaningen: nycklar som exponeras på GitHub väntar inte på nästa revision
Om du har mer än ett par IAM-användare känner du redan till det stökiga: åtkomstnycklar hamnar överallt. En konsult klistrar in en i ett script. Någon committar en “tillfällig” .env-fil. En junior utvecklare kopierar en snippet till en publik gist under felsökning. Och när du väl upptäcker det har nyckeln redan indexerats, klonats och skrapats av bottar som inte gör annat än att leta efter strängar som ser ut som AWS-uppgifter. Det handlar inte bara om säkerhetsrisken. Det är också den mentala belastningen av att undra vilka nycklar som är säkra just nu.
Det eskalerar snabbt. Här är var det fallerar i verkliga team.
- Du söker sällan igenom GitHub proaktivt, eftersom det är tråkigt arbete som konkurrerar med riktiga incidenter.
- När en läcka väl händer sprids detaljerna ut över Slack, e-post och ett halvskrivet ärende.
- De flesta tvekar att avaktivera en nyckel eftersom något kan använda den i produktion.
- Manuella kontroller missar aktiva nycklar, gamla nycklar och servicekonton om ingen kommer ihåg att titta.
Lösningen: skanna GitHub och skicka åtgärdsbara Slack-varningar
Det här n8n-arbetsflödet gör “vi borde kolla GitHub efter läckor” till en repeterbar process som körs på samma sätt varje gång. Du startar det manuellt (eller schemalägger det), och det hämtar dina IAM-användare från AWS. För varje användare hämtar det deras åtkomstnycklar och fokuserar på de aktiva, eftersom inaktiva nycklar bara är brus. Sedan bygger det en GitHub-sökfråga och skannar repositories som du får söka i med din token (publika och privata, beroende på åtkomst). Om det finns träffar konsoliderar och avduplicerar det fynden, genererar en kort säkerhetsrapport och postar ett Slack-meddelande som inkluderar vad som hittades och vad du ska göra härnäst. Felfritt, lättläst och snabbt.
Arbetsflödet börjar med att hämta IAM-användare och itererar sedan igenom dem i batchar för att undvika att belasta API:er. GitHub-frågor hastighetsbegränsas med en medveten väntan, och bara bekräftade “det här ser komprometterat ut”-fynd blir en Slack-varning.
Vad som ändras: före vs. efter
| Det här tar bort | Effekten du märker |
|---|---|
|
|
Effekt i praktiken
Säg att du hanterar cirka 25 IAM-användare och försöker göra en “snabbkoll” en gång i veckan. Manuellt kan det innebära ungefär 5 minuter per användare för att hämta nycklar, bekräfta vad som är aktivt och köra ett par GitHub-sökningar, vilket landar runt 2 timmar (och det är aldrig bara 2 timmar). Med det här arbetsflödet triggar du en körning, väntar på att GitHub-frågorna blir klara och granskar Slack bara om något ser exponerat ut. För många team är det skillnaden mellan en rutinmässig kontroll och att inte göra den alls.
Krav
- n8n-instans (testa n8n Cloud gratis)
- Självhostningsalternativ om du föredrar det (Hostinger fungerar bra)
- AWS IAM för att lista användare och åtkomstnycklar.
- GitHub för att söka i repos du har åtkomst till.
- Slack för att leverera varningar till din kanal.
- GitHub Personal Access Token (skapa den i GitHub Developer settings).
Kunskapsnivå: Medel. Du kopplar konton, sätter upp autentiseringsuppgifter och justerar lätt sökfråga/rapportformat.
Behöver du hjälp att implementera detta? Prata med en automations-expert (gratis 15-minuters konsultation).
Flödet i arbetsflödet
En skanning triggas. Arbetsflödet startar från en Manual Launch Trigger (många team byter senare till en schemalagd körning). Det anropar direkt AWS för att hämta en lista över IAM-användare.
Användare och nycklar behandlas säkert. Användarnamn parsas och behandlas sedan i batchar så att du inte överbelastar AWS eller GitHub. För varje användare hämtar arbetsflödet åtkomstnycklar och filtrerar ner till endast aktiva nycklar.
GitHub söks igenom i kontrollerat tempo. En sökfråga sätts ihop för varje aktivt nyckelmönster, sedan pausar en Wait-nod kort för att respektera rate limits. HTTP Request till GitHub kör sökningen mot repositories som din token kan se.
Fynd konsolideras och publiceras. Resultat slås ihop och avdupliceras och bedöms sedan för att avgöra om något ser komprometterat ut. Om ja genereras en säkerhetsrapport, formateras till en Slack-vänlig notis och postas i din kanal.
Du kan enkelt ändra GitHub-sökningens scope för att rikta mot organisationer, specifika repos eller snävare mönster utifrån dina behov. Se hela implementationsguiden nedan för anpassningsalternativ.
Steg-för-steg-guide för implementering
Steg 1: konfigurera den manuella triggern
Starta arbetsflödet med en manuell trigger så att ni kan köra granskningar vid behov under uppsättning och testning.
- Lägg till noden Manual Launch Trigger som start för arbetsflödet.
- Behåll standardinställningarna (inga parametrar krävs) och koppla Manual Launch Trigger till Retrieve IAM Users.
Steg 2: anslut datakällor för AWS och GitHub
Hämta IAM-användare och åtkomstnycklar från AWS och fråga sedan GitHub efter exponerade nycklar.
- Öppna Retrieve IAM Users och ställ in URL till
https://iam.amazonaws.com, Method tillPOSToch Content Type tillform-urlencoded. - I Retrieve IAM Users → Body Parameters, lägg till Action =
ListUsersoch Version =2010-05-08. - Autentisering krävs: anslut era aws-autentiseringsuppgifter i Retrieve IAM Users.
- Öppna Fetch Access Keys och ställ in URL till
https://iam.amazonaws.com, Method tillPOSToch Content Type tillform-urlencoded. - I Fetch Access Keys → Body Parameters, ställ in Action =
ListAccessKeys, Version =2010-05-08och UserName till={{ $json.username }}. - Autentisering krävs: anslut era aws-autentiseringsuppgifter i Fetch Access Keys.
- Öppna Query GitHub Leaks och ställ in URL till
={{ $json.simpleSearch.searchUrl }}. - Autentisering krävs: anslut era githubApi-autentiseringsuppgifter i Query GitHub Leaks.
Steg 3: sätt upp användarbearbetning och logik för GitHub-frågor
Transformera listan med IAM-användare till batchar per användare, validera aktiva nycklar och bygg GitHub-sökfrågor med rate limiting.
- I Parse Usernames List, behåll befintlig JavaScript-kod för att extrahera användarnamn från AWS-svaret för ListUsers.
- Koppla Parse Usernames List till Batch User Iteration för att bearbeta användare sekventiellt.
- I Batch User Iteration, behåll standardinställningarna för batch och koppla den andra utgången (loop) till Fetch Access Keys.
- I Validate Active Keys, ställ in villkoret så att det kontrollerar att AccessKeyMetadata Status är lika med
Activemed={{ $json.ListAccessKeysResponse.ListAccessKeysResult.AccessKeyMetadata[0].Status }}. - I Compose GitHub Query, behåll den medföljande JavaScript-koden som genererar
simpleSearch.searchUrloch valfria mer omfattande sökningar. - Infoga Rate Limit Delay mellan Compose GitHub Query och Query GitHub Leaks för att strypa förfrågningar.
Steg 4: bygg säkerhetsrapporten och Slack-meddelandet
Sammanställ sökresultat, avgör komprometteringsstatus och formatera en lättläst Slack-rapport.
- I Consolidate Findings, behåll JavaScript-koden som slår ihop resultat och sätter
isCompromisedbaserat på matchade repositories. - I Assess Compromise, behåll det booleska villkoret som använder
={{ $json.isCompromised }}för att routa alla resultat till rapporteringen. - I Build Security Report, behåll JSON-rapportgeneratorn som sätter status, riskLevel och recommendedActions.
- I Format Slack Notice, behåll JavaScript-koden som bygger Slack-markdownmeddelandet i
message.
Steg 5: konfigurera Slack-larm och valfri nyckeldeaktivering
Skicka den formaterade notisen till Slack och förbered vid behov en AWS-åtgärdsnod för manuell nyckeldeaktivering.
- I Post Slack Alert, ställ in Text till
={{ $json.message }}och välj mål-Channel i Slack (ID eller namn). - Autentisering krävs: anslut era slackApi-autentiseringsuppgifter i Post Slack Alert.
- Behåll Resume Scan Loop kopplad till Batch User Iteration för att fortsätta skanna återstående användare.
- (Valfritt) Aktivera Utility: Deactivate Keys om ni vill ha en färdig nod för att inaktivera nycklar manuellt; uppdatera platshållarna för AccessKeyId och UserName.
- Autentisering krävs: anslut era aws-autentiseringsuppgifter i Utility: Deactivate Keys om ni aktiverar den.
[CONFIGURE_YOUR_API_KEY] och [YOUR_EMAIL].Steg 6: testa och aktivera ert arbetsflöde
Verifiera end-to-end-beteendet och slå på arbetsflödet för regelbunden användning.
- Klicka på Execute Workflow från Manual Launch Trigger för att köra en testskanning.
- Bekräfta att Retrieve IAM Users returnerar ett ListUsers-svar och att Parse Usernames List matar ut användarnamn.
- Verifiera att Query GitHub Leaks returnerar ett JSON-svar och att Consolidate Findings sätter
isCompromisedkorrekt. - Kontrollera Slack för att bekräfta att Post Slack Alert levererar det formaterade meddelandet.
- När ni är nöjda, slå på arbetsflödet Active för att aktivera produktion.
Se upp för
- AWS IAM-behörigheter kan vara för breda eller för svaga. Om arbetsflödet inte kan lista användare eller nycklar, kontrollera policy för autentiseringsuppgifterna som är kopplade till IAM-identiteten du konfigurerade i förfrågningarna “Retrieve IAM Users” och “Fetch Access Keys”.
- Om du använder Wait-noder eller extern rendering varierar processingtiderna. Öka väntetiden om nedströmsnoder misslyckas på tomma svar.
- Standardprompter i AI-noder är generiska. Lägg in er tonalitet tidigt, annars kommer du redigera utdata i all evighet.
Vanliga frågor
Cirka en timme om du redan har AWS-, GitHub- och Slack-credentials redo.
Ja, men någon behöver vara bekväm med IAM-behörigheter och API-tokens. Det är inget “kodprojekt”, men du kommer att redigera några fält som sökomfång och format på Slack-meddelandet.
Ja. n8n har ett gratis självhostat alternativ och en gratis provperiod på n8n Cloud. Molnplaner börjar på 20 USD/månad för högre volym. Du behöver också räkna med GitHub- och AWS-API-användning (oftast försumbar vid dagliga skanningar).
Två alternativ: n8n Cloud (managerat, enklast setup) eller självhosting på en VPS. För självhosting är Hostinger VPS prisvärd och hanterar n8n bra. Självhosting ger dig obegränsade exekveringar men kräver grundläggande serverhantering.
Du kan snäva in eller bredda sökningen genom att redigera kodnoden “Compose GitHub Query”, där scope och filter ligger. Vanliga justeringar är att begränsa sökningar till din organisation, hoppa över vissa serviceanvändare och ändra vad noden “Build Security Report” tar med så att det matchar din incidentmall. Om du vill ha snabbare respons kan du också koppla HTTP Request “Utility: Deactivate Keys” till ett godkännandeflöde istället för att lämna den som en utility.
Oftast beror det på att webhooken eller app-credentials är fel, har löpt ut eller pekar mot fel workspace. Dubbelkolla autentiseringsuppgiften som används av noden “Post Slack Alert” och bekräfta sedan att kanalen fortfarande accepterar inkommande meddelanden. Om arbetsflödet kör men inget syns kan det också vara så att det bara postar när “Assess Compromise” returnerar true, så testa med en känd exempelträff.
Om du självhostar n8n finns ingen exekveringsgräns (det beror främst på din server och GitHubs rate limits).
Ofta, ja. Det här arbetsflödet gör loopar, filtrering, avduplicering och villkorad avisering, vilket blir klumpigt (och dyrt) i verktyg som tar betalt per steg och per uppgift. n8n ger dig också möjligheten att självhosta, vilket spelar roll om du vill skanna ofta utan att behöva hålla koll på task counts. Zapier eller Make kan fortfarande fungera om du bara behöver ett enkelt “kör sökning, posta meddelande”-flöde. Prata med en automations-expert om du vill ha hjälp att välja den enklaste setupen som ändå täcker din risk.
Det här är den sortens automatisering du sätter upp en gång och sedan litar på i det tysta. Arbetsflödet bevakar läckor, Slack ger hela bilden och teamet agerar innan skadan sprider sig.
Kontakta oss
Hör av dig, så diskuterar vi hur just din verksamhet kan dra nytta av alla fantastiska möjligheter som AI skapar.