Giao thức CLV1 đã công khaiĐọc đặc tả
Mục lục thư viện

Thư viện tài liệuBảo mật

Cảnh báo và kênh thông báo

Cảnh báo giúp Protect 24/7 báo cho bạn ngay khi ứng dụng gặp tín hiệu bất thường, qua email, Discord, Telegram hoặc một webhook có ký. Bạn khai báo kênh nhận, rồi viết luật quyết định tín hiệu nào, bao nhiêu lần, trong bao lâu thì gửi và gửi tới đâu.

11 phút đọc

Tổng quan

Mọi thứ về cảnh báo nằm ở Giám sát & cảnh báo › Bảo mật, tab Cảnh báo, và áp dụng cho cả workspace: một bộ kênh và luật dùng chung cho mọi ứng dụng, mỗi luật có thể giới hạn vào một ứng dụng. Trang có hai phần:

  • Kênh: nơi nhận tin (email, Discord, Telegram, webhook).
  • Luật: điều kiện để gửi và danh sách kênh nhận.

Bên cạnh đó có hai cơ chế chạy sẵn, không cần cấu hình: luật có sẵn gửi email cho chủ và quản trị khi workspace chưa có luật nào, và bản tin buổi sáng tóm tắt 24 giờ qua.

Chủ sở hữu và Quản trị được thêm, xoá, sửa và gửi thử. Thành viên xem được trang, nhưng các thao tác đó đều bị máy chủ từ chối.

Mỗi tin cảnh báo cho biết tên ứng dụng, tên tín hiệu, mức nghiêm trọng, số sự kiện của sự cố kèm quốc gia và IP (nếu có), cùng đường dẫn mở thẳng sự cố trong Bảo mật ứng dụng › Bảo vệ. Nội dung tin hiện viết bằng tiếng Anh, ví dụ tiêu đề email có dạng [HIGH] Tên ứng dụng: Someone is guessing keys.

Kênh nhận cảnh báo

LoạiGóiThông tin cần nhập
EmailMọi góiGửi tới: tối đa 10 địa chỉ
DiscordPremiumDiscord webhook URL
TelegramPremiumBot token và Chat id
WebhookPremiumĐịa chỉ nhận, mỗi tin có chữ ký Clavis-Signature

Mỗi workspace có tối đa 20 kênh.

Thêm kênh

  1. Mở Giám sát & cảnh báo › Bảo mật, tab Cảnh báo.
  2. Ở mục Kênh, bấm Thêm kênh. Hộp thoại Kênh mới mở ra.
  3. Chọn loại kênh. Ở gói Basic, Discord, Telegram và Webhook bị khoá kèm dòng "Discord, Telegram và webhook cần Premium".
  4. Đặt Tên kênh (tối đa 60 ký tự). Bỏ trống thì kênh mang tên loại, ví dụ "Email".
  5. Điền thông tin theo loại kênh như bên dưới.
  6. Bấm Thêm kênh. Dashboard báo "Đã thêm kênh".

Thông tin từng loại:

  • Email: nhập các địa chỉ cách nhau bằng dấu phẩy, dấu chấm phẩy hoặc khoảng trắng. Nên dùng hộp thư chung của nhóm trực, ví dụ oncall@example.com.
  • Discord: trong Discord, tạo webhook ở phần Integrations của kênh muốn nhận tin rồi dán URL vào. URL phải bắt đầu bằng https://discord.com/api/webhooks/ hoặc https://discordapp.com/api/webhooks/. Tin hiện dưới tên "Protect 24/7", có màu theo mức nghiêm trọng.
  • Telegram: Bot token là token do BotFather cấp, dạng 123456789:AA.... Chat id là id số của cuộc trò chuyện (nhóm thường có id âm) hoặc @ kèm username của kênh công khai, ví dụ @my_alerts. Bot phải ở trong nhóm hoặc kênh đó và có quyền gửi tin.
  • Webhook: nhập Địa chỉ nhận của hệ thống bạn. Ngay sau khi tạo, hộp thoại Bí mật ký của kênh hiện bí mật bắt đầu bằng whsec_. Bí mật chỉ hiện một lần: sao chép vào nơi an toàn rồi bấm Đã lưu.

Cấu hình kênh được mã hoá khi lưu. Sau đó danh sách chỉ hiện bản tóm tắt: các địa chỉ email, vài ký tự cuối của URL Discord, chat id Telegram hoặc tên miền của webhook. Kênh không sửa được: muốn đổi URL, token hay địa chỉ, hãy xoá kênh rồi tạo kênh mới.

Gửi thử và trạng thái kênh

Mỗi dòng kênh có nhãn Đã xác nhận hoặc Chưa gửi thử. Kênh email được xác nhận ngay khi tạo. Kênh Discord, Telegram và webhook chỉ chuyển sang Đã xác nhận khi có một lần gửi tới đó thành công.

Bấm Gửi thử ở dòng kênh để gửi một tin mẫu: tiêu đề "Test alert", mức thấp, ứng dụng "ClavisAUH", kèm đường dẫn về trang Cảnh báo. Dashboard báo "Đã gửi tin thử" khi tin đã vào hàng đợi, chưa phải khi nơi nhận đã nhận được. Với Discord, Telegram và webhook, tải lại trang sau vài giây: nếu nhãn vẫn là Chưa gửi thử, hãy kiểm tra lại URL, token, chat id hoặc endpoint của bạn.

Xoá kênh

Bấm biểu tượng thùng rác (Xoá kênh) rồi xác nhận "Xoá kênh này?". Kênh bị gỡ khỏi mọi luật đang dùng nó, các luật vẫn gửi tới những kênh còn lại. Luật không còn kênh nào sẽ không gửi đi đâu, và bạn cần chọn kênh mới cho nó trước khi lưu thay đổi.

Luật cảnh báo

Luật quyết định khi nào một tín hiệu đáng để làm phiền bạn. Nút Thêm luật chỉ bấm được khi workspace đã có ít nhất một kênh. Mỗi workspace có tối đa 50 luật.

Tạo luật

  1. Ở mục Luật, bấm Thêm luật. Bảng Luật mới mở ra.
  2. Đặt Tên luật (tối đa 80 ký tự), ví dụ "Dò key dồn dập".
  3. Ứng dụng: chọn Mọi ứng dụng (gồm cả ứng dụng tạo sau này) hoặc một ứng dụng cụ thể.
  4. Tín hiệu: đánh dấu các loại tín hiệu cần theo dõi. Để trống nghĩa là mọi tín hiệu.
  5. Mức từ: Mọi mức, Thấp, Vừa hoặc Cao. Chỉ tín hiệu từ mức này trở lên mới kích hoạt luật.
  6. Số lần và Trong (phút): luật gửi khi có ít nhất N tín hiệu trong M phút gần nhất. Mặc định là 1 lần trong 5 phút. Số lần từ 1 tới 10.000, Trong (phút) từ 1 tới 1.440 (24 giờ).
  7. Gửi tới: đánh dấu kênh nhận, tối đa 10 kênh. Kênh đầu tiên trong danh sách được chọn sẵn.
  8. Bật Giờ yên lặng nếu cần (xem bên dưới).
  9. Bấm Lưu luật. Dashboard báo "Đã lưu luật".

Tín hiệu và mức nghiêm trọng

Mỗi loại tín hiệu có một mức nghiêm trọng cố định, dùng cho ô Mức từ và cho giờ yên lặng. Ý nghĩa của từng tín hiệu được giải thích trong Protect 24/7.

Tín hiệuMức
Chữ ký giả mạoCao
Yêu cầu phát lạiCao
Lệch đồng hồVừa
Dò key (brute-force)Cao
Chia sẻ keyCao
Vị trí bất thườngVừa
Vượt phiên đồng thờiVừa
Bản build lạCao
Phát hiện can thiệpThấp
Bị chặn bởi luật truy cậpThấp
Lùi giờ khi offlineVừa
Từ chối tăng đột biếnVừa

Luật được xét như thế nào

Mỗi khi Protect 24/7 ghi nhận một tín hiệu trên ứng dụng ở Bảo vệ Advanced, mọi luật đang bật của workspace (áp cho mọi ứng dụng hoặc đúng ứng dụng đó) được xét lần lượt:

  1. Loại tín hiệu nằm trong danh sách Tín hiệu của luật, hoặc danh sách để trống.
  2. Mức của tín hiệu đạt Mức từ.
  3. Nếu Số lần lớn hơn 1, ClavisAUH đếm số tín hiệu thuộc các loại đã chọn trong Trong (phút) vừa qua, trên ứng dụng của luật (hoặc cả workspace), tính cả tín hiệu vừa tới. Chưa đủ số lần thì chưa gửi. Phép đếm này không lọc theo Mức từ.
  4. Mỗi luật gửi tối đa một tin mỗi 5 phút. Tín hiệu rơi vào khoảng nghỉ không được gửi bù, nhưng tin kế tiếp mang số sự kiện mới nhất của sự cố.
  5. Đang trong giờ yên lặng và tín hiệu không ở mức Cao thì bỏ qua.
  6. Gửi tới mọi kênh của luật.

Ví dụ, luật "Dò key dồn dập" chọn Dò key (brute-force), Số lần 20, Trong (phút) 10 và kênh Telegram của nhóm trực: khi trong 10 phút có từ 20 lần dò key trở lên, nhóm nhận một tin, rồi tối đa một tin mỗi 5 phút nếu cuộc dò còn tiếp diễn.

Một vài điểm cần biết:

  • Nhiều luật có thể khớp cùng một tín hiệu. Mỗi luật gửi tin riêng và có nhịp 5 phút riêng.
  • Để tránh ngập dữ liệu, Protect 24/7 chỉ ghi tối đa 30 sự kiện mỗi phút cho cùng một loại tín hiệu từ cùng một nguồn. Phần vượt không được ghi nên cũng không được tính vào Số lần.
  • Khi workspace không còn ở gói Premium, kênh Discord, Telegram và webhook vẫn nằm trong danh sách nhưng luật không gửi tới chúng nữa. Kênh email vẫn hoạt động bình thường.

Giờ yên lặng

Bật Giờ yên lặng rồi chọn giờ bắt đầu và kết thúc, mặc định 23:00 → 07:00. Khoảng giờ có thể vắt qua nửa đêm. Múi giờ là múi giờ của trình duyệt lúc bạn lưu luật, hiện ngay cạnh hai ô giờ; lưu lại luật từ một máy ở múi giờ khác sẽ đổi múi giờ theo máy đó.

Trong giờ yên lặng, chỉ tín hiệu mức Cao được gửi. Tín hiệu mức Thấp và Vừa bị bỏ qua, không dồn lại để gửi khi hết giờ yên lặng. Bản tin buổi sáng vẫn tính chúng vào phần tóm tắt.

Sửa, tắt và xoá luật

Mỗi dòng luật hiện tóm tắt điều kiện (tín hiệu, số lần và khoảng thời gian, giờ yên lặng), cùng thời điểm Gửi lần cuối hoặc Chưa gửi lần nào.

  • Bấm tên luật để mở bảng Sửa luật, chỉnh rồi bấm Lưu luật.
  • Gạt công tắc ở cuối dòng để tạm tắt hoặc bật lại luật mà không mất cấu hình.
  • Bấm biểu tượng thùng rác (Xoá luật) rồi xác nhận "Xoá luật này?".

Luật có sẵn: email cho chủ và quản trị

Khi workspace chưa có luật nào, mục Luật hiện khung Luật có sẵn đang chạy. Luật này không cần kênh: mỗi khi một sự cố mức Cao mới được mở trên ứng dụng ở Bảo vệ Advanced, mọi Chủ sở hữu và Quản trị của workspace nhận email, tối đa một lần mỗi 5 phút. Tín hiệu lặp lại không mở sự cố mới nên không gửi thêm email: Protect 24/7 gom các tín hiệu cùng loại trên cùng đối tượng (license, thiết bị hoặc IP) vào sự cố đang mở, miễn là chưa quá 30 phút kể từ tín hiệu trước.

Bản tin buổi sáng

Mỗi ngày lúc 08:00 giờ Việt Nam, ClavisAUH gửi email tóm tắt Protect 24/7 cho mọi Chủ sở hữu và Quản trị của từng workspace có ít nhất một tín hiệu trong 24 giờ qua, từ ứng dụng ở chế độ nào cũng vậy. Workspace yên ắng không nhận email nào. Bản tin gồm:

  • Số sự cố mới mở và tổng số tín hiệu trong 24 giờ.
  • Tối đa 5 sự cố có nhiều sự kiện nhất trong số sự cố có hoạt động trong 24 giờ, mỗi dòng gồm tên ứng dụng, tên sự cố và số sự kiện.
  • Nút mở trang Giám sát & cảnh báo › Bảo mật.

Bản tin chạy độc lập với kênh, luật và giờ yên lặng, và hiện chưa có tuỳ chọn tắt riêng.

Webhook cảnh báo và chữ ký

Kênh webhook gửi mỗi cảnh báo dưới dạng POST JSON tới địa chỉ nhận, kèm các header Content-Type: application/json, User-Agent: ClavisAUH-Webhooks/1 và Clavis-Signature: t=<unix>,v1=<hex>.

{
  "type": "protect.alert",
  "createdAt": "2026-11-02T08:15:30.000Z",
  "data": {
    "app": "My App",
    "title": "Someone is guessing keys",
    "severity": "high",
    "detail": "24 event(s) · VN · 203.0.113.7",
    "link": "https://…/dashboard/apps/app_…/protect?incident=…"
  }
}

type luôn là protect.alert, severity là low, medium hoặc high, còn title là tên tiếng Anh của tín hiệu. Tin gửi thử có cùng cấu trúc, với title là Test alert và severity là low.

Xác minh chữ ký

v1 là HMAC-SHA256 dạng hex của chuỗi <t>.<body>, trong đó t là thời điểm ký (giây Unix), body là nguyên văn thân yêu cầu, và khoá là toàn bộ bí mật whsec_… của kênh. Hãy xác minh trên body thô trước khi parse JSON, so sánh theo thời gian hằng, và từ chối t quá cũ để chặn phát lại.

import { createHmac, timingSafeEqual } from "node:crypto";
import express from "express";

// Clavis-Signature: t=<unix>,v1=<hex>
export function verifyAlert(rawBody, header, secret) {
  const parts = Object.fromEntries(header.split(",").map((p) => p.split("=")));
  if (!parts.t || Math.abs(Date.now() / 1000 - Number(parts.t)) > 300) return false; // lệch tối đa 5 phút
  const expected = createHmac("sha256", secret).update(`${parts.t}.${rawBody}`).digest();
  const received = Buffer.from(parts.v1 ?? "", "hex");
  return received.length === expected.length && timingSafeEqual(received, expected);
}

// Express: giữ body thô để xác minh
const app = express();
app.post("/hooks/clavis-alerts", express.raw({ type: "application/json" }), (req, res) => {
  const raw = req.body.toString("utf8");
  if (!verifyAlert(raw, req.get("clavis-signature") ?? "", process.env.CLAVIS_ALERT_SECRET)) {
    return res.sendStatus(401);
  }
  const alert = JSON.parse(raw); // alert.data.severity, alert.data.link
  res.sendStatus(204);
});
import hashlib, hmac, time

def verify_alert(raw_body: bytes, header: str, secret: str) -> bool:
    parts = dict(p.split("=", 1) for p in header.split(","))
    t = parts.get("t", "")
    if not t.isdigit() or abs(time.time() - int(t)) > 300:
        return False
    expected = hmac.new(secret.encode(), t.encode() + b"." + raw_body, hashlib.sha256).hexdigest()
    return hmac.compare_digest(expected, parts.get("v1", ""))

Yêu cầu với endpoint

  • Trả mã 2xx trong vòng 10 giây. Chuyển hướng (3xx) không được theo và bị tính là thất bại.
  • Địa chỉ phải dùng https và trỏ ra Internet công khai. Địa chỉ mạng nội bộ hoặc localhost bị từ chối khi gửi.
  • Mỗi cảnh báo qua Discord, Telegram hoặc webhook chỉ được gửi một lần, không thử lại như webhook sự kiện của ứng dụng. Với cảnh báo quan trọng, hãy thêm cả một kênh email vào luật.
  • Bí mật ký không xem lại được. Nếu làm mất, hãy xoá kênh, tạo kênh mới rồi cập nhật bí mật ở hệ thống nhận.

Liên quan

Bạn cần giúp gì?

Câu hỏi thường gặp

ClavisAUH là gì?

Dịch vụ bản quyền và xác thực cho phần mềm desktop: license key, khoá thiết bị, đăng nhập người dùng và phản hồi có chữ ký. Tất cả quản lý trên một dashboard

Vì sao kẻ crack không làm giả được server?

SDK chỉ tin câu trả lời ký bằng khoá bí mật của ứng dụng. Khoá đó không bao giờ rời server của chúng tôi, nên server giả không ký được và bị từ chối

Trong file chạy của tôi có gì?

Mã ứng dụng và khoá công khai. Không có bí mật nào, vì mỗi thiết bị tự tạo cặp khoá riêng ở lần chạy đầu

Có chạy được khi offline không?

Có. Mọi gói đều có token offline có chữ ký dùng được 7 ngày, ứng dụng tự kiểm tra tại máy. Premium cho bạn chọn bao lâu. License đã thu hồi vẫn có thể chạy offline trong khoảng đó, trừ khi Chế độ chỉ online đang bật

Hỗ trợ những ngôn ngữ nào?

Hiện có JavaScript và TypeScript. Tiếp theo là C++, C# và Python, cùng một giao thức công khai

Gói Basic có miễn phí thật không?

Có. Không giới hạn thời gian, không cần thẻ. Cần nhiều hơn thì lên Premium

Liên hệ