thắc mắc Custom Plugin mảng DevOps

  • Người tạo chủ đề Người tạo chủ đề henngaytaingoz
  • Ngày bắt đầu Ngày bắt đầu

henngaytaingoz

Junior Member
Hi mn, cho em hỏi muốn code custom lại 1 plugin nào đó đại loại như thuộc jenkins cho cicd hay các tool monitering như fluentbit thì có bài hướng dẫn để phát triển không ạ? hiện tại em đang làm khóa luận mà bí quá. Mong các cao nhân giúp đỡ với ạ
 
Ui cái này chatGPT trùm rồi bro.
Mình gửi bạn 1 guide GPT để hiểu về cách lên ý tưởng, tiếp cận như nào, vào áp dụng thực tiễn 8-)

Chào bạn! Rất vui được hỗ trợ bạn phát triển một plugin mới cho Fluent Bit.
Dưới đây mình sẽ hướng dẫn bạn cách tạo một filter plugin tùy chỉnh để ẩn thông tin nhạy cảm (ví dụ: mật khẩu, API keys) trong các log trước khi gửi đi.
Plugin này sẽ quét các bản ghi log và thay thế các giá trị của các khóa nhạy cảm như password, api_key bằng chuỗi **** để bảo vệ thông tin.🛠️

1.​

  • C Compiler: GCC hoặc Clang
  • CMake: Công cụ xây dựng
  • Fluent Bit Source Code: Clone từ GitHub
Mã:
git clone https://github.com/fluent/fluent-bit.git
cd fluent-bit

2.​

Giả sử bạn muốn tạo một filter plugin có tên mask_sensitive.

  • Tạo thư mục cho plugin:
Mã:
mkdir plugins/filter_mask_sensitive
cd plugins/filter_mask_sensitive

3.​

Tạo file filter_mask_sensitive.c với nội dung như sau:

Mã:
#include <fluent-bit/flb_info.h>
#include <fluent-bit/flb_filter.h>
#include <fluent-bit/flb_output.h>
#include <fluent-bit/flb_pack.h>
#include <fluent-bit/flb_config.h>
#include <fluent-bit/flb_filter_plugin.h>
#include <fluent-bit/flb_utils.h>


#include <cjson/cJSON.h>
#include <string.h>


// Danh sách các khóa nhạy cảm cần ẩn
static const char *sensitive_keys[] = {
    "password",
    "api_key",
    "secret",
    NULL
};


// Hàm kiểm tra khóa có phải là nhạy cảm không
static int is_sensitive_key(const char *key)
{
    int i = 0;
    while (sensitive_keys[i]) {
        if (strcasecmp(key, sensitive_keys[i]) == 0) {
            return 1;
        }
        i++;
    }
    return 0;
}


// Hàm xử lý filter
static int mask_sensitive_filter(void *data, size_t bytes, void **out_buf, size_t *out_size, struct flb_filter_instance *f_ins, void *f_context, struct flb_config *config)
{
    int ret;
    msgpack_unpacked result;
    size_t off = 0;
    char *json_str;
    cJSON *json;
    cJSON *item;


    // Giải mã dữ liệu msgpack sang JSON
    json_str = flb_pack_msgpack_to_json_str(data, bytes);
    if (!json_str) {
        flb_error("[filter_mask_sensitive] Could not pack msgpack to json");
        return FLB_FILTER_NOTOUCH;
    }


    // Phân tích cú pháp JSON
    json = cJSON_Parse(json_str);
    if (!json) {
        flb_error("[filter_mask_sensitive] Could not parse JSON");
        flb_free(json_str);
        return FLB_FILTER_NOTOUCH;
    }


    // Duyệt qua các khóa và ẩn thông tin nhạy cảm
    cJSON *record = cJSON_GetObjectItem(json, "record");
    if (record) {
        for (int i = 0; sensitive_keys[i]; i++) {
            item = cJSON_GetObjectItem(record, sensitive_keys[i]);
            if (item) {
                cJSON_SetValuestring(item, "****");
            }
        }
    }


    // Chuyển đổi JSON trở lại msgpack
    char *modified_json = cJSON_PrintUnformatted(json);
    cJSON_Delete(json);
    flb_free(json_str);


    if (!modified_json) {
        flb_error("[filter_mask_sensitive] Could not print JSON");
        return FLB_FILTER_NOTOUCH;
    }


    ret = flb_pack_json(modified_json, strlen(modified_json), out_buf, out_size);
    flb_free(modified_json);


    if (ret != 0) {
        flb_error("[filter_mask_sensitive] Could not pack modified JSON to msgpack");
        return FLB_FILTER_NOTOUCH;
    }


    return FLB_FILTER_MODIFIED;
}


// Định nghĩa cấu hình plugin (nếu cần)
static int mask_sensitive_init(struct flb_filter_instance *f_ins,
                               struct flb_config *config, void *data)
{
    // Có thể thêm xử lý cấu hình ở đây
    return 0;
}


// Đăng ký plugin
struct flb_filter_plugin filter_mask_sensitive_plugin = {
    .name         = "mask_sensitive",
    .description  = "Filter to mask sensitive information in logs",
    .cb_init      = mask_sensitive_init,
    .cb_filter    = mask_sensitive_filter,
    .flags        = 0,
};



4.​

Mở file plugins/filter_mask_sensitive/CMakeLists.txt và thêm nội dung sau:

Mã:
add_library(filter_mask_sensitive MODULE
    filter_mask_sensitive.c
)


target_include_directories(filter_mask_sensitive PRIVATE
    ${CMAKE_SOURCE_DIR}/include
    ${CMAKE_SOURCE_DIR}/plugins/filter_mask_sensitive
)


target_link_libraries(filter_mask_sensitive
    fluent-bit
    cjson
)


install(TARGETS filter_mask_sensitive
    LIBRARY DESTINATION plugins/filter_mask_sensitive
)



5.​

Quay lại thư mục gốc của Fluent Bit và chạy các lệnh sau:

Mã:
mkdir build
cd build
cmake ..
make
sudo make install



6.​

Mở file cấu hình Fluent Bit (fluent-bit.conf) và thêm filter mới:

Mã:
[INPUT]
    Name              tail
    Path              /var/log/*.log
    Parser            json


[FILTER]
    Name              mask_sensitive
    Match             *
    # Có thể thêm cấu hình nếu plugin hỗ trợ


[OUTPUT]
    Name              stdout
    Match             *



7.​

Khởi động Fluent Bit với cấu hình đã chỉnh sửa và kiểm tra xem các trường nhạy cảm đã được ẩn chưa.

Mã:
fluent-bit -c fluent-bit.conf
Khi bạn kiểm tra đầu ra, các giá trị của password, api_key, và secret sẽ được thay thế bằng ****.

📚

💡

  • Plugin này được viết bằng ngôn ngữ C, vì Fluent Bit hỗ trợ plugin bằng C.
  • Bạn có thể mở rộng plugin để xử lý nhiều khóa nhạy cảm hơn hoặc thêm các tính năng khác theo yêu cầu.
  • Đảm bảo rằng bạn đã cài đặt tất cả các thư viện cần thiết như cJSON.
 

Thống kê chủ đề

Ngày tạo
henngaytaingoz,
Người trả lời cuối
pussyke,
Trả lời
1
Lượt xem
548
Quay lại
Lên đầu trang