toantd1202 / buoc1

demo
0 stars 0 forks source link

SNMP task #2

Open toantd1202 opened 4 years ago

toantd1202 commented 4 years ago

tìm hiểu SNMP

cài SNMP- exporter

tìm hiểu snmpwalk

toantd1202 commented 4 years ago

SNMP - Simple Network Management Protocol

Là giao thức ứng dụng của IETF dành cho quản lý mạng, dựa trên nền giao thức TCP/IP. Giao thức SNMP vận chuyển dữ liệu từ client(thiết bị mạng đang giám sát) đến nơi mà dữ liệu được lưu trong log file nhằm phân tích dễ dàng hơn.

Một số khả năng của SNMP:

Hoạt động của SNMP

Có 2 nhân tố chính trong SNMP: Manager và Agent.

Các phiên bản của SNMP

SNMP có 4 phiên bản: SNMPv1, SNMPv2c, SNMPv2u và SNMPv3. Các phiên bản này chỉ khác nhau một chút ở định dạng bản tin và có thêm các cách thức bảo mật cho phiên bản từ v2c trở đi.

Các thành phần trong SNMP

Kiến trúc SNMP gồm 2 phần: Network management stationnvaf network element.

Object ID

Một thiết bị hỗ trợ SNMP có thể cung cấp nhiều thông tin khác nhau, mỗi thông tin đó gọi là một object. Ví dụ:

Mỗi object có một tên gọi và một mã số để nhận dạng object đó, mã số gọi là Object ID (OID). VD:

Object access

Mỗi object có quyền truy cập là READ_ONLY hoặc READ_WRITE. Mọi object đều có thể đọc được nhưng chỉ những object có quyền READ_WRITE mới có thể thay đổi được giá trị. VD: Tên của một thiết bị (sysName) là READ_WRITE, ta có thể thay đổi tên của thiết bị thông qua giao thức SNMP. Tổng số port của thiết bị (ifNumber) là READ_ONLY, ta không thể thay đổi số port của nó.

Management Information Base (MIB)

MIB (cơ sở thông tin quản lý) là một cấu trúc dữ liệu gồm các đối tượng được quản lý (managed object), được dùng cho việc quản lý các thiết bị chạy trên nền TCP/IP. MIB là kiến trúc chung mà các giao thức quản lý trên TCP/IP nên tuân theo, trong đó có SNMP. MIB được thể hiện thành 1 file (MIB file), và có thể biểu diễn thành 1 cây (MIB tree). MIB có thể được chuẩn hóa hoặc tự tạo.

Một node trong cây là một object, có thể được gọi bằng tên hoặc id. Ví dụ :

Các phương thức của SNMP

Giao thức SNMPv1 có 5 phương thức hoạt động, tương ứng với 5 loại bản tin như sau : Bản tin Mô tả
GetRequest Manager gửi GetRequest cho agent để yêu cầu agent cung cấp thông tin nào đó dựa vào ObjectID(trong đó GetRequest có chưa OID).
GetNextRequest Manager gửi GetnextRequest có chứa một ObjectID cho agent để yêu cầu cung cấp thông tin nằm kế tiếp ObjectID đó trong MIB.
SetRequest Manager gửi SetRequest cho agent để đặt giá trị cho đối tượng của agent dựa vào ObjectID.
GetResponse Agent gửi GetResponse cho Manager để trả lời khi nhận được GetRequest/GetNextRequest
Trap Agent tự động gửi Trap cho Manager khi có một sự kiện xảy ra đối với object nào đó trong agent.

Mỗi bản tin đều có chứa OID để cho biết object mang trong nó là gì. OID trong GetRequest cho biết nó muốn lấy thông tin của object nào. OID trong GetResponse cho biết nó mang giá trị của object nào. OID trong SetRequest chỉ ra nó muốn thiết lập giá trị cho object nào. OID trong Trap chỉ ra nó thông báo sự kiện xảy ra đối với object nào.

Cơ chế bảo mật cho SNMP

Một SNMP management station có thể quản lý/giám sát nhiều SNMP element, thông qua hoạt động gửi request và nhận trap. Tuy nhiên một SNMP element có thể được cấu hình để chỉ cho phép các SNMP management station nào đó được phép quản lý/giám sát mình.

Cơ chế bảo mật đơn giản có thể dùng community string

Community string

Community string là một chuỗi ký tự được cài đặt giống nhau trên cả SNMP managerSNMP agent, đóng vai trò như mật khẩu giữa 2 bên khi trao đổi dữ liệu. Community string có 3 loại : Read-community, Write-CommunityTrap-Community.

Khi manager gửi GetRequest, GetNextRequest đến agent thì trong bản tin gửi đi có chứa Read-Community. Khi agent nhận được bản tin request thì nó sẽ so sánh Read-community do manager gửi và Read-community mà nó được cài đặt. Nếu 2 chuỗi này giống nhau, agent sẽ trả lời; nếu 2 chuỗi này khác nhau, agent sẽ không trả lời.

Write-Community được dùng trong bản tin SetRequest. Agent chỉ chấp nhận thay đổi dữ liệu khi write-community 2 bên giống nhau.

Trap-community nằm trong bản tin trap của trap sender gửi cho trap receiver. Trap receiver chỉ nhận và lưu trữ bản tin trap chỉ khi trap-community 2 bên giống nhau, tuy nhiên cũng có nhiều trap receiver được cấu hình nhận tất cả bản tin trap mà không quan tâm đến trap-community.

Trên hầu hết hệ thống, read-community mặc định là public, write-community mặc định là privatetrap-communitymặc định làpublic`.

Community string chỉ là chuỗi ký tự dạng cleartext, do đó hoàn toàn có thể bị nghe lén khi truyền trên mạng. Hơn nữa, các community mặc định thường là publicprivate nên nếu người quản trị không thay đổi thì chúng có thể dễ dàng bị dò ra. Khi community string trong mạng bị lộ, một người dùng bình thường tại một máy tính nào đó trong mạng có thể quản lý/giám sát toàn bộ các device có cùng community mà không được sự cho phép của người quản trị.

toantd1202 commented 4 years ago

snmptest snmptest snmptes

toantd1202 commented 4 years ago

http://demo.robustperception.io:9093/api/v1/silences

toantd1202 commented 4 years ago

Prometheus Alertmanager silence watcher

Vấn đề (nói chung)

Currently when a new alert fires in Alertmanager there are 2 options:

Nó có thể gây ra vấn đề với các đội lớn:

Vấn đề (cụ thể)

Người dùng Alertmanager đã tạo một khoảng lặng để đánh dấu một nhóm cảnh báo là 'Tôi đang làm việc với điều đó' (đối với phần cứng bị hỏng hoặc các vấn đề khác cần có thời gian để giải quyết). Thời gian tập tin, người dùng này có thể hoàn toàn quên đi sự im lặng. Rồi một ngày, một loạt các cảnh báo quay trở lại và đánh mạnh vào tất cả người dùng AM.

The idea - How it works

Công cụ này nhằm mục đích đối phó với vấn đề. Chỉ cần deal không giải quyết nó.

Actions

toantd1202 commented 4 years ago
  1. Get a list of current silences Định kỳ, sau 1 khoảng thời gian, một danh sách trạng thái được thống kê, cụ thể các thông tin về các lần silences dưới dạng json, từ đó ta có thể dễ dàng giám sát, đưa ra thông báo cho người dùng.

    • Tập chung vào các key như startsAt, endsAt, và createdBy để dùng cho các chức năng phía sau.
  2. khi có silent, thông báo được gửi mail về cho admin, kiểm tra trường createdby theo đúng format. nếu đúng thì không sao, nếu sai, admin sẽ phản hồi nhắc nhở lại với người tạo đó. ý tưởng:

    • dùng GET API silences của Alertmanager. Kiểm tra trường createdBy để xác thực format của value. Nếu trường createdBy sai format thông báo được gửi đến admin, từ đó admin truy xuất đến người đã tạo ra silent đó và nhắc nhở về việc dùng sai cú pháp khi create.
  3. Cảnh báo alert gần hết hạn. Từ trường Starts atEnds at, để tính toán thời gian silent, đặt giá trị làm việc hợp lý là 75% tổng thời gian silent, ví dụ silent time là 2h thì sau 90m mà chưa hoàn thành thì cảnh báo được bắn đi để nhắc nhở việc recreate. Nhưng một số vấn đề phát sinh như thời gian silent quá dài, thời gian silent vào đúng ngày lễ.

    • Thời gian silent quá dài (1 tuần, 1 tháng,...), thì việc cảnh báo theo phần trăm cần được tăng thêm số lương và tần suất, ví dụ 75%
  4. Ignore the silences Cho phép bỏ qua sliences, nếu comment là IGNORE.

toantd1202 commented 4 years ago
import aiofiles
import base64
from sanic import Sanic
from sanic_jinja2 import SanicJinja2
from sanic.response import json
from sanic_mail import Sanic_Mail
import aiosmtplib
app = Sanic(__name__)
jinja = SanicJinja2(app)
Sanic_Mail.SetConfig(
    app,
    MAIL_SENDER='toantd1202@gmail.com',
    MAIL_SENDER_PASSWORD='pass',
    MAIL_SEND_HOST='smtp.gmail.com',
    MAIL_SEND_PORT='465',
    MAIL_TLS='TLS'
)
sender = Sanic_Mail(app)

@app.get('/send')
async def send(request):
    attachments = {}
    async with aiofiles.open("path/file.txt", "rb") as f:
        attachments["toan.txt"] = await f.read()
    async with aiofiles.open('path/image.jpg', "rb") as f:
        attachments['cười.jpg'] = await f.read()
    await app.send_email(
        targetlist="toantd1202@gmail.com",
        subject="silent expired soon",
        content="Kindly remind you that your silence will be expired soon.",
        attachments=attachments
    )
    return json({"result": "ok"})
if __name__ == "__main__":
    app.run(host='127.0.0.1', port=5000, debug=True)

toantd1202 commented 4 years ago

https://gitlab.com/genius98nd/baocaotrain/-/blob/master/main.py?fbclid=IwAR3qDdlaYSg2-_pf41nAYtsa6_1h9s9pBMTbAjMHsKjCozW_jXT9f3eXyNM