This script monitors multiple RSS feeds for security alerts related to specific products and threats, then creates JIRA tickets with Slack notifications and automated acknowledgment workflows.
- Multi-Source RSS Filtering: Monitors BleepingComputer, CISA, HackerNews, Krebs, and DarkReading RSS feeds
- Keyword Matching: Filters entries based on customizable product and threat keywords
- Slack Integration: Posts formatted alerts to Slack with source, title, and JIRA ticket links
- JIRA Integration: Creates JIRA tickets as subtasks linked to a security epic
- Automated Acknowledgment: Monitors for thumbs up reactions and assigns tickets to the first person who acknowledges
- Ticket Status Management: Automatically transitions tickets to "In Progress" upon acknowledgment
- Duplicate Prevention: Uses cache files to avoid creating duplicate tickets
- Acknowledgment Monitoring: Separate script to continuously check for acknowledgments and manage ticket assignments
pip install -r requirements.txtFor local development and testing only, you can set the following environment variables:
# Slack Configuration
export SLACK_BOT_TOKEN="xoxb-your-slack-bot-token"
export SLACK_CHANNEL_ID="C1234567890"
# JIRA Configuration
export JIRA_URL="https://your-domain.atlassian.net"
export JIRA_EMAIL="[email protected]"
export JIRA_API_TOKEN="your-jira-api-token"
export JIRA_EPIC_KEY="ABC-123" # The epic key where tickets will be created as subtasks
export JIRA_PROJECT_KEY="ABC" # The project key for ticket creationFor Production Use: See the GitHub Actions Setup section below for proper deployment using GitHub Secrets.
The Slack bot requires the following scopes:
chat:write- To post messagesreactions:read- To monitor for thumbs up reactionschannels:history- REQUIRED to read message history for acknowledgment checkinggroups:history- REQUIRED for conversations.history API (even for public channels)mpim:history- REQUIRED for conversations.history API (even for public channels)im:history- REQUIRED for conversations.history API (even for public channels)channels:read- To read channel informationusers:read- To get user informationusers:read.email- To get user email for JIRA assignment
channels:history, groups:history, mpim:history, and im:history scopes are all required for the acknowledgment system to work. Slack's conversations.history API requires all history scopes to be present, even when only accessing public channels.
To set up the Slack bot for this system:
-
Create a Slack App:
- Go to api.slack.com/apps
- Click "Create New App" β "From scratch"
- Give your app a name (e.g., "RSS Security Alert Bot")
- Select your workspace
-
Configure Bot Token Scopes:
- Go to "OAuth & Permissions" in the left sidebar
- Under "Scopes" β "Bot Token Scopes", add all the required scopes listed above
- Click "Install to Workspace" at the top of the page
-
Get Your Bot Token:
- After installation, copy the "Bot User OAuth Token" (starts with
xoxb-) - This is your
SLACK_BOT_TOKEN
- After installation, copy the "Bot User OAuth Token" (starts with
-
Invite Bot to Channel:
- In your Slack workspace, invite the bot to the channel where you want alerts posted
- Use:
/invite @your-bot-name
-
Get Channel ID:
- Right-click on the channel name in Slack
- Select "Copy link" and extract the channel ID from the URL
- Or use the Slack API to get the channel ID
- Go to Atlassian Account Settings
- Click "Create API token"
- Give it a label (e.g., "RSS Alert Bot")
- Copy the token and use it as
JIRA_API_TOKEN
Create a JIRA epic in your security project (e.g., "ABC-123") that will serve as the parent for all security alert tickets.
Run any of the filter scripts:
python filter_rss_bleeping.py
python filter_rss_cisa.py
python filter_rss_hackernews.py
python filter_rss_krebs.py
python filter_rss_darkreading.py- RSS Parsing: Fetches and parses the RSS feed
- Keyword Filtering: Matches entries against customizable product and threat keyword lists
- Duplicate Check: Uses a cache file to track previously processed entries
- JIRA Ticket Creation: For each new alert:
- Creates a subtask under the specified epic
- Sets medium priority
- Includes comprehensive description with source link and detected keywords
- Adds relevant labels
- Slack Notification: Posts formatted alerts to the configured Slack channel
- Reaction Monitoring: Continuously monitors for thumbs up reactions on the Slack message
- User Assignment: First person to react gets assigned the JIRA ticket (using their Slack email)
- Status Update: Ticket automatically transitions to "In Progress"
- Confirmation: Bot posts acknowledgment message in the Slack thread
- Cache Update: Updates the cache file with new entry links
Alerts are posted in a clean, consistent format with unique emojis for each source:
π§ Source: BleepingComputer
Title: [Article Title]
JIRA Ticket: ABC-123
Source Emojis:
- π§ BleepingComputer - Brain emoji for intelligence/security news
- π‘οΈ CISA - Shield emoji for government security advisories
- π° HackerNews - Newspaper emoji for tech news
- π Krebs - Magnifying glass emoji for investigative journalism
- π DarkReading - Moon emoji for "dark" security news
The ticket number is a clickable link that takes you directly to the JIRA ticket.
- Alert Posted: Security alert appears in Slack with JIRA ticket link
- User Acknowledges: Team member reacts with thumbs up (π)
- Automatic Assignment: First person to react gets assigned the JIRA ticket
- Status Update: Ticket automatically transitions to "In Progress"
- Confirmation: Bot posts acknowledgment message in the thread
Note: Only the first thumbs up reaction triggers the assignment and status change to prevent multiple assignments.
Each ticket includes:
- Title: The RSS entry title (truncated if too long)
- Description:
- Source information and publication date
- Original RSS description
- Detected product and threat keywords
- Action required section
- Auto-generation timestamp
- Type: Sub-task (linked to the security epic)
- Priority: Medium
- Labels: security-alert, rss-feed, [source], auto-generated, cti
You can customize the keyword lists in each script:
PRODUCT_KEYWORDS: Add products and technologies your organization usesTHREAT_KEYWORDS: Add security threat terms that will trigger alertsOTHER_KEYWORDS: Add company names, industry-specific terms, or other relevant keywords
You can customize the JIRA ticket creation by modifying the issue_data dictionary in the create_jira_ticket() function.
- JIRA Authentication Error: Verify your email and API token
- Epic Not Found: Ensure the epic key exists and is accessible
- Permission Issues: Verify the JIRA user has permission to create issues in the project
- Slack Bot Permissions: Ensure the bot has the required scopes, especially
users:read.email - Rate Limiting: JIRA has API rate limits; the script includes error handling
The script includes detailed logging. Check the console output for:
- β Success messages for created tickets
- β Error messages for failed operations
- π Summary of created tickets
- π Thumbs up detection and assignment messages
filter_rss_bleeping.py: BleepingComputer RSS filterfilter_rss_cisa.py: CISA advisories RSS filterfilter_rss_hackernews.py: HackerNews RSS filterfilter_rss_krebs.py: Krebs on Security RSS filterfilter_rss_darkreading.py: DarkReading RSS filtercheck_acknowledgments.py: Monitors Slack for acknowledgments and manages JIRA ticket assignments
requirements.txt: Python dependencies.seen_entries_*.json: Cache files (auto-generated).message_ticket_mappings.json: Acknowledgment tracking file (auto-generated)feeds/*.xml: Filtered RSS feed outputs
π― PRIMARY DEPLOYMENT METHOD: This system is designed to run via GitHub Actions using GitHub Secrets for secure credential management.
Each RSS source has its own GitHub Actions workflow that can be triggered manually:
- π BleepingComputer RSS Filter -
.github/workflows/rss-filter-bleeping.yml - π CISA RSS Filter -
.github/workflows/rss-filter-cisa.yml - π HackerNews RSS Filter -
.github/workflows/rss-filter-hackernews.yml - π Krebs RSS Filter -
.github/workflows/rss-filter-krebs.yml - π DarkReading RSS Filter -
.github/workflows/rss-filter-darkreading.yml - π Acknowledgment Monitor -
.github/workflows/check-acknowledgments.yml
- Add Secrets: Go to your repository Settings β Secrets and variables β Actions
- Add Required Secrets:
SLACK_BOT_TOKENSLACK_CHANNEL_IDJIRA_URLJIRA_EMAILJIRA_API_TOKENJIRA_EPIC_KEYJIRA_PROJECT_KEY
- Run Workflows: Go to the Actions tab and manually trigger any workflow
- Manual Trigger: All workflows use
workflow_dispatchfor manual execution - Secure Credentials: Uses GitHub Secrets for secure credential management
- Cache Management: Automatically caches seen entries to prevent duplicates
- Error Handling: Continues execution even if cache save fails
The check_acknowledgments.py script provides continuous monitoring of Slack messages for acknowledgment reactions and automated JIRA ticket management.
- Message Monitoring: Checks the last 100 messages in the configured Slack channel
- Pattern Recognition: Identifies JIRA ticket references using multiple patterns:
- Standard bot format:
JIRA Ticket: <***/browse/ABCTICKET-1975|ABCTICKET-1975> - Plain text references:
ABCTICKET-1975 - JIRA URLs:
https://.../browse/ABCTICKET-1975
- Standard bot format:
- Reaction Detection: Monitors for thumbs up reactions (π, +1, thumbs_up)
- User Assignment: Automatically assigns JIRA tickets to the first person who acknowledges
- Status Management: Transitions tickets to "In Progress" upon acknowledgment
- Thread Management: Posts acknowledgment confirmations in Slack threads
- Duplicate Prevention: Checks thread replies to avoid duplicate processing
- File Management: Automatically cleans up old mappings (older than 24 hours)
python check_acknowledgments.py- Message Retrieval: Fetches recent messages from the configured Slack channel
- Ticket Detection: Identifies messages containing JIRA ticket references
- Acknowledgment Check: Looks for thumbs up reactions on ticket messages
- User Processing: Gets user information and email for JIRA assignment
- Ticket Management:
- Assigns the ticket to the acknowledging user
- Sets the "Triage Started" timestamp field
- Transitions the ticket to "In Progress" status
- Confirmation: Posts acknowledgment message in the Slack thread
- Tracking: Maintains a mapping file to prevent duplicate processing
The acknowledgment system handles two different scenarios:
When someone acknowledges the alert while the RSS script is still running (within the 1-minute timeout):
Workflow Steps:
- Initial Alert: Security Team Bot posts a DarkReading security alert with JIRA ticket link
- Quick Acknowledgment: Team member (Taiga Walker) reacts with thumbs up π within 1 minute
- Immediate Processing: The RSS script's
monitor_for_thumbs_upfunction detects the reaction - Confirmation: Bot posts acknowledgment confirmation with user mention and checkmark β
When acknowledgment occurs after the RSS script has completed (handled by check_acknowledgments.py):
Workflow Steps:
- Initial Alert: Security Team Bot posts a Krebs security alert with JIRA ticket link
- Ticket Creation: Bot creates JIRA ticket and posts confirmation in thread
- Delayed Acknowledgment: Team member reacts with thumbs up π after RSS script timeout
- Background Processing:
check_acknowledgments.pydetects the reaction during its next run - Confirmation: Bot posts acknowledgment confirmation with user mention and checkmark β
Both scenarios result in the same outcome: automatic ticket assignment, status transition to "In Progress", and acknowledgment confirmation in the Slack thread.
The script provides detailed statistics including:
- Number of JIRA ticket messages found
- Messages skipped (already processed)
- Messages checked for new acknowledgments
- New acknowledgments processed
.message_ticket_mappings.json: Tracks processed messages and acknowledgments- Automatic Cleanup: Removes mappings older than 24 hours to prevent file bloat
- Error Handling: Graceful handling of API failures and missing data
| Feed Source | Script Path | Output XML |
|---|---|---|
| Hacker News | filter_rss_hackernews.py |
feeds/hackernews-products.xml |
| CISA Advisories | filter_rss_cisa.py |
feeds/cisa-products.xml |
| BleepingComputer | filter_rss_bleeping.py |
feeds/bleeping-products.xml |
| Krebs on Security | filter_rss_krebs.py |
feeds/krebs-products.xml |
| Dark Reading | filter_rss_darkreading.py |
feeds/darkreading-products.xml |
Curated-RSS-Feeds/
βββ .github/workflows/ # GitHub Actions workflows
β βββ rss-filter-bleeping.yml
β βββ rss-filter-cisa.yml
β βββ rss-filter-hackernews.yml
β βββ rss-filter-krebs.yml
β βββ rss-filter-darkreading.yml
β βββ check-acknowledgments.yml
βββ feeds/ # Generated RSS feed outputs
β βββ hackernews-products.xml
β βββ cisa-products.xml
β βββ bleeping-products.xml
β βββ krebs-products.xml
β βββ darkreading-products.xml
βββ filter_rss_hackernews.py # HackerNews RSS filter
βββ filter_rss_cisa.py # CISA advisories RSS filter
βββ filter_rss_bleeping.py # BleepingComputer RSS filter
βββ filter_rss_krebs.py # Krebs on Security RSS filter
βββ filter_rss_darkreading.py # DarkReading RSS filter
βββ check_acknowledgments.py # Acknowledgment monitoring script
βββ requirements.txt # Python dependencies
βββ README.md # This file
βββ LICENSE # MIT License
βββ .gitignore # Git ignore rules
- Fork the repository
- Create a feature branch
- Make your changes
- Test your changes
- Submit a pull request
This project is licensed under the MIT License - see the LICENSE file for details.

