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.
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.