Šajā ceļvedī aprakstīts, kā:
- noteikt ievainojamības instalētajās pakotnēs,
- filtrēt tikai High un Critical līmeņa riskus,
- automātiski saņemt paziņojumus Discord,
- neatslēgt nevienu ienākošo portu.
Risinājums balstās uz debsecan (Debian Security Analyzer) un Discord webhook.
1. Pārbaudīt Debian versiju
cat /etc/os-release
Ja redzams:
VERSION_CODENAME=trixie
izmanto trixie kā suite parametru.
2. Nepieciešamo pakotņu uzstādīšana
apt update
apt install debsecan curl jq
debsecan– pārbauda CVE statusu instalētajām pakotnēmcurl– nosūta webhook pieprasījumujq– droši noformē JSON paziņojumu
3. Discord Webhook izveide
Discord vidē:
Server Settings → Integrations → Webhooks → New Webhook
Nokopē ģenerēto URL, piemēram:
https://discord.com/api/webhooks/XXXXXXXX
4. Monitoringa skripta izveide
Izveido skriptu:
nano /usr/local/bin/vuln_check.sh
Ievieto saturu:
#!/usr/bin/env bash
set -euo pipefail
# Debian suite (Debian 13 = trixie)
SUITE="trixie"
# Hostname for clearer Discord messages
HOST="$(hostname)"
# Paste your Discord webhook URL here
WEBHOOK_URL="PASTE_YOUR_DISCORD_WEBHOOK_URL_HERE"
# Collect CVE list where a fix is available in the repo (i.e., you should upgrade)
REPORT="$(debsecan --suite "$SUITE" --only-fixed)"
# If there is anything to report, send it to Discord
if [[ -n "${REPORT}" ]]; then
MESSAGE="🛡️ Security updates available on ${HOST} (${SUITE})\n\n${REPORT}"
# Send JSON safely via jq (handles newlines/quotes)
curl -sS -H "Content-Type: application/json" \
-X POST \
-d "$(jq -n --arg content "$MESSAGE" '{content: $content}')" \
"$WEBHOOK_URL" >/dev/null
fi
Padari skriptu izpildāmu:
chmod +x /usr/local/bin/vuln_check.sh
5. Manuāla pārbaude
Palaid skriptu:
/usr/local/bin/vuln_check.sh
Ja sistēmā ir High vai Critical līmeņa CVE, Discord kanālā parādīsies paziņojums.
Ja paziņojums netiek nosūtīts, šobrīd šāda līmeņa ievainojamību nav.
6. Automātiska izpilde ar cron
Atver crontab:
crontab -e
Pievieno rindu:
0 8 * * * /usr/local/bin/vuln_check.sh
Skripts tiks palaists katru dienu plkst. 08:00.
Kādu informāciju saņemsi?
Piemērs:
HIGH/CRITICAL ievainojamības uz DietPiMainCVE-2026-1642 nginx
CVE-2025-69421 openssl
CVE-2026-22795 libssl3t64
Tu redzi:
- CVE numuru
- skarto pakotni
- faktu, ka Debian repozitorijā jau ir pieejams labojums
Kā darbojas debsecan?
debsecan salīdzina:
instalēto pakotņu versijas
↔ Debian Security Tracker datubāzi
Tas:
- nemeklē ekspluatācijas mēģinājumus,
- neveic aktīvu tīkla skenēšanu,
- nepārbauda runtime konfigurāciju.
Tas identificē:
instalētas pakotnes, kurām pieejams drošības atjauninājums.
Iespējamie paplašinājumi
Risinājumu var papildināt ar:
- paziņojumiem tikai par jaunām CVE (salīdzinot ar iepriekšējo stāvokli),
- informāciju par instalēto un laboto versiju,
- automātisku
apt upgradeizpildi, - centralizētu pārbaudi vairākiem serveriem,
- filtrēšanu pēc CVSS sliekšņa.
Drošības modelis
- Nav nepieciešami ienākošie porti
- Tiek izmantots tikai izejošs HTTPS savienojums
- Minimāla uzbrukuma virsma
- Balstīts uz Debian oficiālo drošības informāciju
Šī pieeja nodrošina vieglu un praktisku ievainojamību monitoringu Debian sistēmās, piemērotu mājas laboratorijai vai nelielai infrastruktūrai.
#!/usr/bin/env bash
# ============================================================
# Skripts: security-notify.sh
# Ko dara: pārbauda serveri, vai tajā nav zināmās ievainojamības (CVE),
# un nosūta paziņojumu Discord, ja ir atrastas problēmas,
# kurām jau pastāv drošības atjauninājums.
#
# Domājiet par to kā “Windows Update”, tikai Debian serverim
# ar paziņojumiem tieši jūsu Discord kanālā.
# ============================================================
set -euo pipefail
# set -e → ja kāda komanda beidzas ar kļūdu — skripts apstājas
# (līdzīgi kā try/catch PHP, tikai automātiski visam failam)
# set -u → ja tiek izmantots mainīgais, kas nav definēts — kļūda
# (līdzīgi kā strict mode PHP)
# set -o pipefail → ja kļūda rodas komandu ķēdē (pipe) —
# tā netiek slēpta
# ============================================================
# IESTATĪJUMI — vienīgā vieta, kas jāmaina
# ============================================================
# Jūsu servera Debian versija.
# trixie = Debian 13. Ja jums ir Debian 12 — nomainiet uz “bookworm”
SUITE=”trixie”
# Discord webhook adrese. To var izveidot kanāla iestatījumos:
# Kanāla iestatījumi → Integrācijas → Webhooks → Izveidot Webhook
WEBHOOK_URL=”PASTE_YOUR_DISCORD_WEBHOOK_URL_HERE”
# Discord ziņojuma maksimālais garums ir 2000 rakstzīmes.
# Atstājam vietu galvenei, tāpēc ņemam 1800.
MAX_LENGTH=1800
# ============================================================
# AIZSARDZĪBA PRET PALAIŠANU BEZ IESTATĪŠANAS
# ============================================================
# Pārbaudām, vai webhook tiešām ir nomainīts uz īstu URL.
# [[ … ]] — tas ir nosacījums, kā if() PHP
# == *”PASTE”* — pārbaudām, vai virkne satur vārdu “PASTE”
if [[ “$WEBHOOK_URL” == *”PASTE”* ]]; then
echo “❌ Kļūda: norādiet īstu Discord webhook URL mainīgajā WEBHOOK_URL”
exit 1
# exit 1 — pabeidz skriptu ar kļūdas kodu (ne 0 = kaut kas nogāja greizi)
fi
# Pārbaudām, vai programma debsecan vispār ir instalēta serverī.
# command -v — meklē programmu, kā file_exists() PHP
if ! command -v debsecan >/dev/null 2>&1; then
echo “❌ Kļūda: programma debsecan nav instalēta.”
echo ” Instalējiet to ar komandu: sudo apt install debsecan”
exit 1
fi
# Pārbaudām, vai ir instalēts jq — rīks darbam ar JSON.
# Tas nepieciešams, lai droši nosūtītu datus uz Discord.
if ! command -v jq >/dev/null 2>&1; then
echo “❌ Kļūda: programma jq nav instalēta.”
echo ” Instalējiet to ar komandu: sudo apt install jq”
exit 1
fi
# ============================================================
# IEVAINOJAMĪBU DATU VĀKŠANA
# ============================================================
# Iegūstam servera nosaukumu — lai Discord ziņojumā būtu skaidrs,
# no kuras mašīnas paziņojums nāk.
# Tas ir kā $_SERVER[‘SERVER_NAME’] PHP
HOST=”$(hostname)”
# Palaižam debsecan — tas skenē instalētos pakotnes un salīdzina
# tās ar zināmo ievainojamību (CVE) datubāzi.
# –suite → norādām Debian versiju, lai ņemtu pareizo ievainojamību bāzi
# –only-fixed → rādīt TIKAI tās ievainojamības, kurām repozitorijā jau ir labojums
# (t.i., ko var novērst tūlīt ar apt upgrade)
#
# Rezultātu saglabājam mainīgajā REPORT.
# Ja ievainojamību nav — mainīgais būs tukšs.
REPORT=”$(debsecan –suite “$SUITE” –only-fixed 2>/dev/null || true)”
# 2>/dev/null → slēpjam debsecan tehniskos brīdinājumus (mums nav svarīgi)
# || true → pat ja debsecan atgrieza kļūdas kodu, skripts turpinās darbu
# ============================================================
# PAZIŅOJUMA NOSŪTĪŠANA UZ DISCORD
# ============================================================
# Pārbaudām: vai vispār ir ko ziņot?
# -n nozīmē “virkne NAV tukša” — kā !empty() PHP
if [[ -n “${REPORT}” ]]; then
# Saskaitām, cik ievainojamību atrasts.
# wc -l skaita rindu skaitu — katra rinda = viena ievainojamība.
CVE_COUNT=”$(echo “$REPORT” | wc -l | tr -d ‘ ‘)”
# tr -d ‘ ‘ noņem liekās atstarpes, ko pievieno wc
# Saīsinām atskaiti, ja tā ir pārāk gara Discord ziņojumam.
# Bash sintakse ${mainīgais:0:skaits} ir kā substr($str, 0, $length) PHP
REPORT_TRIMMED=”${REPORT:0:$MAX_LENGTH}”
# Ja teksts tika saīsināts — pievienojam brīdinājumu par to
if [[ “${#REPORT}” -gt “$MAX_LENGTH” ]]; then
# ${#REPORT} — virknes garums, kā strlen() PHP
REPORT_TRIMMED=”${REPORT_TRIMMED}”$’\n\n'”⚠️ Saraksts saīsināts. Pilnu atskaiti skatiet, palaižot debsecan serverī manuāli.”
fi
# Veidojam galīgo ziņojumu Discord
MESSAGE=”️ **Atrasti drošības atjauninājumi** serverī \`${HOST}\` (Debian ${SUITE})
Ievainojamības ar pieejamu labojumu: **${CVE_COUNT}**
\`\`\`
${REPORT_TRIMMED}
\`\`\`
Lai novērstu: \`sudo apt update && sudo apt upgrade\`”
# Nosūtām ziņojumu uz Discord, izmantojot HTTP POST pieprasījumu.
# Tas ir līdzīgi kā file_get_contents() ar kontekstu vai curl PHP.
#
# jq šeit pilda json_encode() lomu no PHP —
# tas pareizi apstrādā visas speciālās rakstzīmes, rindu pārneses un pēdiņas,
# lai JSON nesalūztu.
#
# curl karodziņi:
# -s → klusais režīms (nerādīt progresa joslu)
# -S → bet tomēr rādīt kļūdas, ja tādas ir
# -f → atgriezt kļūdu, ja serveris atbildēja ar 4xx/5xx kodu
# -H → pieprasījuma galvene (kā header() PHP)
# -X POST → pieprasījuma metode
# -d → pieprasījuma pamatteksts (dati)
HTTP_RESPONSE=$(
curl -sSf \
-H “Content-Type: application/json” \
-X POST \
-d “$(jq -n –arg content “$MESSAGE” ‘{content: $content}’)” \
“$WEBHOOK_URL” 2>&1
) && CURL_OK=true || CURL_OK=false
# Pārbaudām, vai paziņojums tika veiksmīgi nosūtīts
if [[ “$CURL_OK” == “true” ]]; then
echo “✅ Paziņojums veiksmīgi nosūtīts uz Discord (atrasti CVE: ${CVE_COUNT})”
else
echo “❌ Neizdevās nosūtīt paziņojumu uz Discord.”
echo ” Servera atbilde: ${HTTP_RESPONSE}”
exit 1
fi
else
# Ja REPORT ir tukšs — ievainojamību ar gataviem labojumiem nav atrasts
echo “✅ Ievainojamības ar pieejamiem labojumiem nav atrastas. Serveris kārtībā.”
fi