paint-brush
Phân tích nhật ký hiệu quả: Khai thác sức mạnh của Regex với BindPlane OP và OpenTelemetrytừ tác giả@observiq
481 lượt đọc
481 lượt đọc

Phân tích nhật ký hiệu quả: Khai thác sức mạnh của Regex với BindPlane OP và OpenTelemetry

từ tác giả observIQ6m2023/06/02
Read on Terminal Reader

dài quá đọc không nổi

Phân tích nhật ký bằng biểu thức chính quy là một kỹ thuật có giá trị để trích xuất thông tin cần thiết từ khối lượng lớn dữ liệu nhật ký. Bằng cách sử dụng phương pháp này, người ta có thể xác định hiệu quả các mẫu, lỗi và thông tin chi tiết quan trọng khác, cuối cùng hợp lý hóa việc phân tích nhật ký và nâng cao hiệu suất hệ thống. Trong bài đăng này, chúng tôi sẽ kiểm tra các mục nhật ký giống với các ví dụ được cung cấp bên dưới.
featured image - Phân tích nhật ký hiệu quả: Khai thác sức mạnh của Regex với BindPlane OP và OpenTelemetry
observIQ HackerNoon profile picture


Phân tích nhật ký bằng regex là một kỹ thuật có giá trị để trích xuất thông tin cần thiết từ khối lượng lớn dữ liệu nhật ký. Bằng cách sử dụng phương pháp này, người ta có thể xác định hiệu quả các mẫu, lỗi và thông tin chi tiết quan trọng khác, cuối cùng hợp lý hóa việc phân tích nhật ký và nâng cao hiệu suất hệ thống.


điều kiện tiên quyết

  • BindPlane OP & Tác nhân BindPlane (Trình thu thập từ xa mở tùy chỉnh)

  • Tệp nhật ký phức tạp cần phân tích cú pháp tùy chỉnh

  • Kiến thức về Regex

  • Một lựa chọn các mẫu nhật ký phù hợp với tất cả các biến thể có thể.

  • (Tùy chọn) Một công cụ kiểm tra regex tốt như regex101.com


Mẫu dữ liệu nhật ký phức tạp

Trong bài đăng này, chúng tôi sẽ kiểm tra các mục nhật ký giống với các ví dụ được cung cấp bên dưới. Bằng cách sử dụng tập lệnh để ghi các mục nhập này vào tệp có dấu thời gian hiện tại, chúng tôi có thể làm việc hiệu quả với dữ liệu thời gian thực.


 May 01 14:31:11 loggen-app10 test-system[712]: Mon May 01 14:31:11 UTC 2023|TEST_PROC|[result=Service Access Granted,service=https://portal.fakeuni.edu/uPortal/Login?...,requiredAttributes={}]|SERVICE_ACCESS_ENFORCEMENT_TRIGGERED|camillec1997|172.13.49.165|172.16.156.55 May 01 14:31:11 loggen-app10 test-system[712]: Mon May 01 14:31:11 UTC 2023|TEST_PROC|[result=Service Access Granted,service=https://portal.fakeuni.edu/uPortal/Login?...,requiredAttributes={}]|SERVICE_ACCESS_ENFORCEMENT_TRIGGERED|camillec1997|172.13.49.165|172.16.156.55 May 01 14:31:11 loggen-app10 test-system[712]: Mon May 01 14:31:11 UTC 2023|TEST_PROC|[event=success,timestamp=May 01 14:31:11 UTC 2023,source=RankedMultifactorAuthenticationProviderWebflowEventResolver]|AUTHENTICATION_EVENT_TRIGGERED|audit:unknown|172.25.178.6|172.16.156.55 May 01 14:31:11 loggen-app08 test-system[780]: Mon May 01 14:31:11 UTC 2023|TEST_PROC|Supplied credentials: [UsernamePasswordCredential(username=dawsonb, source=null, customFields={})]|AUTHENTICATION_SUCCESS|dawsonb|172.12.154.117|172.16.156.53 May 01 14:31:11 loggen-app10 test-system[712]: Mon May 01 14:31:11 UTC 2023|TEST_PROC|[event=success,timestamp=May 01 14:31:11 UTC 2023,source=RankedMultifactorAuthenticationProviderWebflowEventResolver]|AUTHENTICATION_EVENT_TRIGGERED|audit:unknown|172.25.178.6|172.16.156.55

Phân tích dữ liệu

Bây giờ chúng ta có thể lấy mục nhật ký đầu tiên ở trên và bắt đầu phân tích nó thành các phần mà chúng ta muốn phân tích.


Đầu tiên, chúng tôi sẽ nhận thấy rằng chúng tôi có hai dấu thời gian:


**May 01 14:31:11** loggen-app10 test-system[712]: **Mon May 01 14:31:11 UTC 2023**|TEST_PROC|[result=Service Access Granted,service=https://portal.fakeuni.edu/uPortal/Login?...,requiredAttributes={}]|SERVICE_ACCESS_ENFORCEMENT_TRIGGERED|camillec1997|172.13.49.165|172.16.156.55


Dấu thời gian thứ hai là dấu thời gian chúng tôi sẽ giữ lại để trở thành dấu thời gian chính thức của mình vì dấu thời gian này chứa nhiều thông tin hơn (múi giờ và năm hữu ích, trong khi ngày trong tuần thì không thực sự) mà chúng tôi có thể sử dụng để đạt được độ chính xác cao nhất.


Phá vỡ điều này, chúng tôi sẽ viết một mẫu không chụp để khớp với dấu thời gian đầu tiên.

^\w{3}\s\d{2}\s\d{2}:\d{2}:\d{2}\s+The caret “^” vào đầu dòng. Tiếp theo là “ \w{3} ”, viết tắt 3 chữ cái của tháng. Sau tháng, là “ \s\d{2}\s ”, nghĩa là chiếm một khoảng trắng; 2 chữ số, 0 đệm ngày trong tháng; và một không gian khác. Cuối cùng, chúng ta có “ \d{2}:\d{2}:\d{2}\s+ ” – cho giờ có 2 chữ số, phút có 2 chữ số, giây có 2 chữ số và 1 dấu cách trở lên.


Đối với dấu thời gian thứ hai, chúng tôi muốn có một nhóm chụp được đặt tên. Trường này sẽ trở thành một trường được đặt tên trong đốm màu JSON của các trường đã phân tích cú pháp.


(?P<timestamp>\w{3}\s\w{3}\s\d{2}\s\d{2}:\d{2}:\d{2}\s\w{3}\s\d{4})


Chúng tôi đã đặt tên cho nhóm chụp này là "dấu thời gian". Nó chứa biểu thức chính quy cơ bản giống như dấu thời gian khác, với việc thêm “ \w{3}\s ” ở đầu để nắm bắt ngày viết tắt trong tuần và “ \s\w{3}\s\d{4} ” thay thế “ \s+ ” ở cuối để nắm bắt múi giờ có 3 ký tự và năm có 4 chữ số.





Đi sâu hơn vào thông điệp tường trình, chúng tôi sẽ muốn phân tích tên máy chủ và hệ thống:


May 01 14:31:11 **loggen-app10 test-system[712]**: Mon May 01 14:31:11 UTC 2023|TEST_PROC|[result=Service Access Granted,service=https://portal.fakeuni.edu/uPortal/Login?...,requiredAttributes={}]|SERVICE_ACCESS_ENFORCEMENT_TRIGGERED|camillec1997|172.13.49.165|172.16.156.55


Trong thông báo này, tên máy chủ của chúng tôi là **loggen-app10** và hệ thống của chúng tôi là **test-system[712]** . Tôi đã không được cho biết [712] là gì khi tôi nhận được các nhật ký này. Tôi đã giả định rằng đó là PID (ID tiến trình), nhưng hiện tại tôi đã chọn không phân tích cú pháp riêng biệt. Phân tích cú pháp các trường này khá đơn giản và chúng tôi kết thúc bằng: “ (?P<hostname>[^\s]+)\s+(?P<system>.*?):\s+ ”. Chúng tôi có một cặp nhóm chụp, tên máy chủ và hệ thống được đặt tên.


Mẫu cho tên máy chủ là “ [^\s]+ ”, cho biết hãy chụp bất kỳ ký tự không phải dấu cách nào và chụp càng nhiều ký tự càng tốt (tham lam). Tiếp theo là “ \s+ ”, chiếm ít nhất một nhưng nhiều nhất có thể (các) khoảng trống (lại tham lam).


Nhóm chụp cho hệ thống thậm chí còn dễ dàng hơn vì sau (các) khoảng trắng, chúng tôi chụp mọi thứ cho đến ký tự dấu hai chấm. Để làm điều này, chúng tôi sử dụng “ .*? ”. Mẫu đó nói gì, hãy chụp bất kỳ ký tự nào từ 0 lần trở lên, nhưng đừng tham lam.


Sau đó, chúng ta có ký tự dấu hai chấm và 1 hoặc nhiều dấu cách khác tham lam. Chúng không được ghi lại nhưng cần được đệm giữa phần này và phần dấu thời gian mà chúng tôi đã viết ở trên.





Điều này dẫn đến mẫu bắt đầu sau:


^\w{3}\s*\d{2}\s*\d{2}:\d{2}:\d{2}\s+(?P<hostname>[^\s]+)\s+(?P<system>.*?):\s+(?P<timestamp>\w{3}\s\w{3}\s\d{2}\s\d{2}:\d{2}:\d{2}\s\w{3}\s\d{4})


Tôi sẽ không trải qua toàn bộ quá trình tạo mẫu, nhưng tôi sẽ tiếp tục phân tích nó như tôi đã làm ở trên.


Mẫu cuối cùng kết quả là:


^\w{3}\s*\d{2}\s*\d{2}:\d{2}:\d{2}\s+(?P<hostname>[^\s]+)\s+(?P<system>.*?):\s+(?P<timestamp>\w{3}\s\w{3}\s\d{2}\s\d{2}:\d{2}:\d{2}\s\w{3}\s\d{4})\|(?P<app_name>\w*)\|((?P<message_type>.*?):\s+)?\[?(?P<message>.*)\]?\|(?P<event_message>.*?)\|(?P<username>.*?)\|(?P<external_ip>[\d\.:]*)\|(?P<internal_ip>[\d\.:]*)


Mẫu cuối cùng này bao gồm các nhóm chụp được đặt tên sau đây, trở thành các trường trong khối dữ liệu được phân tích cú pháp JSON của chúng tôi:


  • tên máy chủ
  • hệ thống
  • dấu thời gian
  • tên ứng dụng
  • loại tin nhắn
  • tin nhắn
  • event_message
  • tên tài khoản
  • bên ngoài_ip
  • internal_ip




Triển khai Regex

Trong BindPlane, tôi tạo một nguồn Tệp. Điều này xem xét tệp nhật ký được tạo của tôi trong /root/complex.log. Tôi đã chọn biểu thức chính quy trong Định dạng phân tích cú pháp. Trong Mẫu Regex, tôi đã đặt mẫu cuối cùng ở trên. Tôi đã chọn hộp cho Dấu thời gian phân tích cú pháp, chọn Thủ công cho định dạng và nhập mã phân tích thời gian cho mẫu dấu thời gian của tôi.


Sau khi hoàn thành, nó trông như thế này:



Gửi và xác minh dữ liệu

Để hoàn thành thử nghiệm, tôi cần tạo một đích đến và kiểm tra dữ liệu ở đó. Đối với trường hợp sử dụng của tôi, tôi đã chọn một điểm đến là Google Cloud Logging.


Khi cấu hình đường ống của tôi hoàn tất, tôi đính kèm nó với một tác nhân. Sau khi nó chạy được một lúc, tôi nhấp vào “Xem nút đo từ xa gần đây” trên trang của đại lý




Chế độ xem từ xa hiển thị cho tôi nhật ký được phân tích cú pháp sau:



Cuối cùng, tôi cũng kiểm tra nó trên bảng điều khiển Google Cloud Logging:





Điều này hiển thị cùng một mục nhật ký và nó có tải trọng JSON của đối tượng bản đồ JSON của cơ thể chúng ta từ chế độ xem từ xa gần đây.


Bước tiếp theo

Đối với các bước tiếp theo, tôi muốn xem xét phân tích cú pháp giá trị thông báo đó. Nó thường là một bộ khóa/giá trị; như trong ảnh chụp màn hình & mẫu ở trên. Tôi có thể chuyển dữ liệu tới một bộ xử lý phân tích cú pháp các mục khóa/giá trị này thành một lớp JSON khác. Trong ví dụ trên, body.message sẽ được phân tích lại thành chính nó và bạn có thể có các trường như:


 body.message.result=Service Access Granted body.message.service=https://innosoftfusiongo.com/sso/logi… body.message.principal=SimplePrincipal(id=dawsonb, attributes={mail=[[email protected]], eduPersonAffiliation=[Staff], ou=[Recreation/Student Rec Center], givenName=[Dawson], cn=[Dawson Branden], title=[Asst. Director], employeeNumber=[5000000], o=[Vice ChancellorStudent Affairs], fakeuniOrg=[Vice ChancellorStudent Affairs], casMFARequired=[YES], uid=[dawsonb], eduPersonPrimaryAffiliation=[Staff], fakeuniCid=[5000000], fakeuniSeparationDate=[99991231000000Z], UDC_IDENTIFIER=[dawsonb], sn=[Branden], organizationalStatus=[Staff]}) body.message.requiredAttributes=””


Thậm chí điều này có thể được phân tích cú pháp sâu hơn, bằng cách đặt body.message.principle thông qua trình phân tích cú pháp khóa/giá trị.


Bây giờ, ai đó chắc chắn sẽ thắc mắc, “Tại sao bạn không sử dụng phân tích cú pháp regex của cả các trường con body.message?” Câu trả lời: Nó quá mâu thuẫn. Biểu thức chính quy sẽ cực kỳ phức tạp và phi lý khi chúng ta đã có khả năng phân tích các cặp khóa/giá trị.


Phần kết luận

Nhiều dạng dữ liệu có thể được tìm thấy trong các tệp nhật ký. Dữ liệu này thường cần được phân tích cú pháp để giúp con người dễ đọc hơn và dễ dàng hơn cho quá trình tự động hóa và công cụ sau này trong chuỗi hành động.


Mặc dù ví dụ mà tôi đã làm việc được thực hiện trên một nhật ký tệp đơn giản, nhưng các kỹ thuật ở đây có thể được sử dụng trên bất kỳ luồng nhật ký nào. Ngoài phân tích cú pháp biểu thức chính quy, BindPlane cũng hỗ trợ JSON ,XML , các cặp khóa/giá trị và các giá trị được phân tách bằng ký tự. Với việc sử dụng bộ xử lý, các trình phân tích cú pháp này có thể được kết nối với nhau để phân tích cú pháp dữ liệu được nhúng và thao tác tất cả thành định dạng có thể sử dụng được.


Cũng được xuất bản ở đây.