1. Trang chủ
  2. » Luận Văn - Báo Cáo

Ứng dụng công nghệ chuỗi khối Để tăng cường an toàn cho các hệ thống scada

95 0 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Ứng dụng công nghệ chuỗi khối để tăng cường an toàn cho các hệ thống SCADA
Tác giả Trần Thế Lâm
Người hướng dẫn PGS. TS. Trương Anh Hoàng
Trường học Trường Đại học Công nghệ, Đại học Quốc gia Hà Nội
Chuyên ngành Kỹ thuật phần mềm
Thể loại Luận văn tốt nghiệp thạc sĩ
Năm xuất bản 2024
Thành phố Hà Nội
Định dạng
Số trang 95
Dung lượng 4,01 MB

Cấu trúc

  • 1.1. Đặt vấn đề (12)
  • 1.2. Mục tiêu nghiên cứu (13)
  • 1.3. Các nghiên cứu liên quan (15)
  • Chương 2 Kiến thức nền tảng 5 2.1. Giới thiệu SCADA (12)
    • 2.1.1. Khái niệm và đặc điểm (16)
    • 2.1.2. Kiến trúc hệ thống (17)
    • 2.1.3. Tầm quan trọng của dữ liệu và thực trạng (19)
    • 2.2. Giới thiệu về chuỗi khối (20)
      • 2.2.1. Khái niệm và cơ sở lý thuyết chuỗi khối (20)
      • 2.2.2. Nền tảng Hyperledger Fabric (26)
    • 3.1. Yêu cầu chi tiết (32)
    • 3.2. Kiến trúc hệ thống (34)
    • 3.3. Thiết kế ứng dụng minh họa (35)
      • 3.3.1. Đăng nhập và xác thực người dùng (36)
      • 3.3.2. Xem danh sách sự kiện (37)
      • 3.3.3. Tìm kiếm sự kiện (37)
      • 3.3.4. Quản lý người dùng (38)
  • Chương 4 Lập trình và thực nghiệm 31 4.1. Tổng quan (16)
    • 4.1.1. Các bước thực nghiệm (42)
    • 4.1.2. Cấu trúc mã nguồn (43)
    • 4.1.3. Cấu trúc dữ liệu (44)
    • 4.2. Triển khai mạng thử nghiệm (44)
    • 4.3. Xây dựng chuỗi mã (46)
      • 4.3.1. Xây dựng các khóa (47)
      • 4.3.2. Cấu trúc lưu trữ (48)
      • 4.3.3. Hàm khởi tạo (48)
      • 4.3.4. Thêm mới người dùng (49)
      • 4.3.5. Thêm mới sự kiện (51)
      • 4.3.6. Lấy danh sách sự kiện (52)
      • 4.3.7. Xác thực người dùng (53)
    • 4.4. Phát triển phụ trợ (54)
      • 4.4.1. Xây dựng tệp thực thi chính (54)
      • 4.4.2. Xây dựng tệp cấu hình (55)
      • 4.4.3. Xây dựng xử lý nghiệp vụ (55)
      • 4.4.4. Xây dựng lớp xác thực trung gian (58)
      • 4.4.5. Xây dựng tệp thực thi (58)
      • 4.4.6. Xây dựng định tuyến (59)
    • 4.5. Thực thi (60)
  • Chương 5 Đảm bảo chất lượng mã 50 5.1. Kiểm chứng (32)
    • 5.1.1. Kiểm thử đơn vị (62)
    • 5.1.2. Phát hiện lỗi tiềm ẩn (64)
    • 5.1.3. Phát hiện lỗ hổng bảo mật (65)
    • 5.1.4. Các lỗi được tìm thấy trong chuỗi mã (66)
    • 5.1.5. Tìm và sửa lỗi tự động (66)
    • 5.1.6. Thảo luận (69)
    • 5.2. Kiểm thử tính bảo mật trên mạng thử nghiệm (72)
      • 5.2.1. Chuẩn bị chuỗi mã (72)
      • 5.2.2. Triển khai chuỗi mã (74)
      • 5.2.3. Tạo giao dịch thêm mới (74)
      • 5.2.4. Thảo luận (75)
    • 2.1 Kiến trúc các thành phần trong hệ thống SCADA (0)
    • 2.2 Bộ ba bất khả thi của chuỗi khối (0)
    • 2.3 Kiến trúc chuỗi khối (0)
    • 2.4 Cấu trúc mạng cơ bản (0)
    • 2.5 Luồng thực hiện một giao dịch Hyperledger Fabric (0)
    • 3.1 Tổng quan hệ thống SCADA kết hợp Fabric (0)
    • 3.2 Màn hình đăng nhập (0)
    • 3.3 Màn hình hiển thị thông số của cảm biến khi vượt ngưỡng (0)
    • 3.4 Màn hình tìm kiếm sự kiện (0)
    • 3.5 Danh sách người dùng (0)
    • 3.6 Thêm mới người dùng (0)
    • 3.7 Lịch sử đăng nhập (0)
    • 3.8 Thay đổi mật khẩu (0)
    • 4.1 Khởi chạy chương trình phụ trợ (0)
    • 5.1 Kết quả chạy gosec cùng với tính năng đề xuất giải pháp (0)
    • 5.2 Triển khai chuỗi mã thành công (0)
    • 5.3 Kiểm thử với một máy chủ (0)
    • 5.4 Kiểm thử với hai máy chủ (0)
    • 2.1 So sánh đặc điểm các loại chuỗi khối (0)
    • 4.1 Cấu trúc thư mục (0)
    • 4.2 Cấu trúc các tệp trong thư mục (0)
    • 4.3 Thông tin người dùng (0)
    • 4.4 Thông tin đăng nhập (0)
    • 4.5 Thông tin sự kiện (0)
    • 4.6 Biến môi trường của chương trình phụ trợ (0)
    • 5.1 Công cụ hỗ trợ đảm bảo chất lượng chuỗi mã (0)
    • 5.2 Số lỗi được phát hiện bởi các công cụ (0)
    • 5.3 Báo cáo kết quả sửa lỗi tự động của Gemini (0)

Nội dung

LỜI CAM ĐOANTôi tên là Trần Thế Lâm, học viên cao học chuyên ngành Kỹ thuật phần mềm.Tôi xin cam đoan: luận văn tốt nghiệp với đề tài “Ứng dụng công nghệ chuỗi khối để tăng cường an toàn

Mục tiêu nghiên cứu

Luận văn hướng tới hai mục tiêu chính:

• Ứng dụng công nghệ chuỗi khối để tăng cường an toàn, bảo mật cho hệ thốngSCADA Chuỗi khối là một công nghệ tiên tiến giúp giảm bớt sự phụ thuộc của các bên trung gian, đảm bảo tính toàn vẹn dữ liệu và tăng cường tính bảo mật Một trong những nền tảng chuỗi khối phổ biến được ứng dụng rộng rãi trong doanh nghiệp hiện nay là Hyperledger Fabric Hyperledger Fabric là một nền tảng dành cho các giải pháp sổ cái phân tán được củng cố bởi kiến trúc mô-đun mang lại mức độ bảo mật, khả năng phục hồi, tính linh hoạt và khả năng mở rộng cao[6] Nghiên cứu này sẽ tiến hành thử nghiệm lưu trữ dữ liệu trên nền tảng Hyperledger Fabric nhằm đánh giá các ưu điểm và nhược điểm của công nghệ chuỗi khối so với các phương pháp lưu trữ truyền thống.

• Nghiên cứu các công cụ kiểm chứng kiểm thử để nâng cao chất lượng chuỗi mã Đảm bảo chất lượng mã là một trong những thách thức quan trọng trong quá trình phát triển phần mềm Trong khuôn khổ của luận văn này, ngôn ngữ

Go được lựa chọn để triển khai chuỗi mã do hiệu suất vượt trội hơn so với Java và NodeJS.[7] Mục tiêu của nghiên cứu là tìm hiểu và đánh giá các công cụ hỗ trợ kiểm chứng, kiểm thử mã nguồn viết bằng ngôn ngữ Go Từ đó, đề xuất những công cụ thích hợp và áp dụng chúng vào quá trình phát triển Trong quá trình nghiên cứu, tính năng đề xuất sửa lỗiđã được bổ sung vào một công cụ phát hiện lỗi, nhằm hỗ trợ quá trình sửa lỗi diễn ra nhanh chóng và hiệu quả hơn

Nội dung của từng chương:

• Chương 2trình bày các khía cạnh quan trọng liên quan đến hệ thống SCADA, công nghệ chuỗi khối và nền tảng Hyperledger Fabric Luận văn này sẽ tập trung vào việc cung cấp các kiến thức nền tảng về hệ thống SCADA, công nghệ chuỗi khối, và nền tảng Hyperledger Fabric Trước tiên, hệ thống SCADA sẽ được giới thiệu, bao gồm khái niệm, đặc điểm, kiến trúc hệ thống, và tầm quan trọng của dữ liệu trong hệ thống SCADA Tiếp theo, công nghệ chuỗi khối và nền tảng Hyperledger Fabric sẽ được trình bày, bao gồm giải thích khái niệm, cơ chế hoạt động của chuỗi khối, và giới thiệu nền tảng Hyperledger Fabric.

• Chương 3tập trung vào việc xác định, phân tích các yêu cầu chi tiết và thiết kế cụ thể cho việc triển khai chuỗi khối trong hệ thống SCADA Mục tiêu là tạo ra một hệ thống SCADA có tính bảo mật cao và đáng tin cậy Trong quá trình thiết kế và triển khai, các thành phần và chức năng cần thiết của hệ thống SCADA sẽ được xác định, bao gồm quản lý và xử lý dữ liệu, xác thực người dùng và thiết bị, cũng như quản lý quyền truy cập.

• Chương 4tập trung vào việc lập trình triển khai công nghệ chuỗi khối trong hệ thống SCADA Tại phần này, quy trình triển khai của hệ thống sẽ được mô tả, bao gồm việc sử dụng ngôn ngữ lập trình phù hợp để xây dựng chuỗi mã và các phần mềm cần thiết nhằm giao tiếp với nền tảng Hyperledger Fabric.

Chương 5 trình bày và áp dụng các công cụ kiểm chứng giúp đảm bảo chất lượng chuỗi mã, sau đó kiểm thử hệ thống để hệ thống hoạt động như mong đợi Các công cụ kiểm chứng được sử dụng đều đáp ứng các tiêu chí đánh giá khắt khe như được cộng đồng đánh giá cao và được cập nhật thường xuyên Đặc biệt, tính năng đề xuất sửa lỗi đã được tích hợp vào công cụ phát hiện lỗi, góp phần nâng cao hiệu quả phát hiện và xử lý lỗi.

• Chương 6tổng kết đánh giá những kết quả thu được từ việc triển khai và thực nghiệm.

Kiến thức nền tảng 5 2.1 Giới thiệu SCADA

Khái niệm và đặc điểm

Hệ thống SCADA (Supervisory Control and Data Acquisition) là hệ thống điều khiển giám sát và thu thập dữ liệu Hệ thống này bao gồm phần mềm và phần cứng, đồng thời cho phép thu thập dữ liệu từ xa và tại chỗ từ thiết bị công nghiệp. Bằng cách đó, nó cho phép các doanh nghiệp quản lý từ xa các khu công nghiệp như trang trại gió và người giám sát có thể truy cập dữ liệu tuabin 1 và kiểm soát chúng mà không cần có mặt tại tuabin[15] SCADA ra đời từ nỗ lực của các tổ chức công nghiệp nhằm giải quyết vấn đề dựa vào người vận hành để giám sát và điều khiển thiết bị theo cách thủ công bằng cách sử dụng nút bấm, công tắc chọn và quay số tương tự[1] SCADA được triển khai ở trong nhiều ngành công nghiệp như: dầu khí, điện, vận tải, năng lượng tái tạo Với nền công nghiệp phát triển

1 Tuabin là thiết bị cơ khí quay để trích xuất năng lượng từ một dòng chất lỏng (hoặc chất khí) và biến nó thành công năng. tiên tiến, hệ thống SCADA đóng vai trò vô cùng quan trọng trong việc tối ưu hóa hoạt động của các nhà máy công nghiệp SCADA cho phép quản lý và phân bổ nguồn lực một cách hiệu quả hơn tại nhiều doanh nghiệp khác nhau bằng cách thu thập dữ liệu một cách dễ dàng và nhanh chóng Điều này đồng nghĩa với việc cải thiện hiệu suất và tăng cường năng suất, giúp doanh nghiệp đạt được sự cạnh tranh và thành công trong môi trường công nghiệp Hơn thế nữa, SCADA còn được sử dụng để giải quyết các sự cố và bảo trì, đảm bảo quy trình sản xuất liên tục và giảm thiểu các rủi ro và sai sót Tại các thành phố thông minh, từ việc xử lý nước thải đến quản lý lưới điện ngày càng dựa vào hệ thống SCADA để giám sát và tối ưu hóa mọi thứ, từ mô hình đèn giao thông đến mức tiêu thụ điện công cộng và giúp người vận hành xử lý kịp thời khi nhận thấy mức sử dụng tài nguyên tăng đột biến [3] Trong ngành dầu khí SCADA được sử dụng để tự động hóa quy trình công nghiệp, doanh nghiệp có thể hiểu rõ hơn về những chỉ số như nhiệt độ, áp suất và lưu lượng mà không cần phải có mặt tại thực địa[3].

SCADA đem lại nhiều lợi ích nhưng vẫn gặp khó khăn, đặc biệt trong quá trình triển khai Tuy nhiên, SCADA có khả năng tích hợp với các công nghệ khác như IoT, AI và phân tích dữ liệu lớn Sự kết hợp giữa SCADA và AI cung cấp khả năng tự động hóa thông minh, tăng hiệu suất và độ chính xác trong quy trình điều khiển AI phân tích dữ liệu từ SCADA để nhận diện xu hướng, dự đoán sự cố và đưa ra gợi ý tối ưu hóa hoạt động sản xuất và vận hành.

Kiến trúc hệ thống

Kiến trúc SCADA là một hệ thống phức tạp được thiết kế để điều khiển giám sát và thu thập dữ liệu từ các thiết bị trong một hệ thống công nghiệp được thể hiện ở hình 2.1.

Hình 2.1: Kiến trúc các thành phần trong hệ thống SCADA[17].

Hệ thống SCADA được xây dựng dựa trên cơ sở các thành phần chính như:

Thiết bị đầu cuối từ xa (RTU),Thiết bị đầu cuối trung tâm (MTU), bộ chuyển động và cảm biến Phần mềm bao gồm: Giao diện người máy(HMI), một cơ sở dữ liệu trung tâm và phần mềm người dùng khác[18]:

Thiết bị đầu cuối trung tâm (MTU) đóng vai trò cốt yếu như bộ não trong hệ thống SCADA Nó thực hiện nhiệm vụ nhận và xử lý dữ liệu từ Giao diện Người-Máy (HMI) và Thiết bị Từ xa (RTU) Đồng thời, MTU truyền lệnh từ HMI đến RTU để điều khiển hệ thống Thường thì MTU được đặt tại trung tâm điều khiển chính, cho phép theo dõi và quản lý toàn bộ hệ thống từ một vị trí trung tâm.

• Thiết bị đầu cuối từ xa (RTU) là các thiết bị được đặt tại các địa điểm từ xa, chịu trách nhiệm thu thập dữ liệu từ các cảm biến và truyền dữ liệu đếnMTU.

Giao diện người máy (HMI) là thiết bị dùng cho người vận hành tương tác với hệ thống SCADA Nó hiển thị dữ liệu từ RTU và cho phép người vận hành gửi lệnh đến RTU HMI thường đặt tại một trung tâm điều khiển.

• Cảm biếnlà các thiết bị được sử dụng để đo các giá trị vật lý, chẳng hạn như nhiệt độ, áp suất hoặc mức điện áp Cảm biến thường được kết nối với RTU bằng cáp hoặc truyền thông không dây.

• Cơ sở dữ liệu là nơi lưu trữ, quản lý và truy xuất dữ liệu.

RTU sẽ thu thập dữ liệu và thông tin theo thời gian thực từ các cảm biến được kết nối với môi trường vật lý bằng LAN/WAN Sau đó RTU sẽ chuyển tiếp thông tin tới MTU MTU là trạm giám sát trung tâm, chịu trách nhiệm điều khiển và ra lệnh cho RTU MTU sẽ xử lý, lưu trữ và phản hồi các sự kiện từ RTU HMI cung cấp giao diện giao tiếp giữa phần cứng và phần mềm HMI kiểm soát thông tin vận hành SCADA Cơ sở dữ liệu được sử dụng để lưu trữ dữ liệu sự kiện và cảnh báo giữa trung tâm điều khiển SCADA[17] Mạng giao tiếp trong SCADA có thể là không dây hoặc có dây, chịu trách nhiệm liên lạc giữa các thành phần khác nhau trong hệ thống.

Tầm quan trọng của dữ liệu và thực trạng

Trong môi trường công nghiệp, việc thu thập và lưu trữ dữ liệu là một yếu tố quan trọng để đảm bảo sự vận hành hiệu quả và an toàn Dữ liệu cho phép người vận hành có cái nhìn toàn diện về các hoạt động được diễn ra trong quá khứ Điều này rất quan trọng để đưa ra các quyết định thông minh và đúng đắn trong quá trình vận hành Mặt khác, lịch sử hoạt động cũng có thể được sử dụng để phân tích và đánh giá hiệu suất, từ đó tìm ra các cách cải thiện và tối ưu hóa quá trình sản xuất.

Quản lý và lưu trữ dữ liệu lịch sử đúng cách là điều cần thiết để đảm bảo tính toàn vẹn và bảo mật của dữ liệu Việc quản lý dữ liệu một cách hiệu quả bao gồm việc thiết lập các chính sách và thủ tục rõ ràng để xử lý và bảo vệ dữ liệu.

Dữ liệu lịch sử thường được lưu trữ trong các hệ quản trị cơ sở dữ liệu tập trung (DBMS) như MySQL và SQLite Tuy nhiên, những hệ thống này dễ bị tấn công mạng, chỉnh sửa hoặc xóa dữ liệu, dẫn đến thông tin không chính xác và quyết định sai lầm từ người vận hành Bên cạnh đó, DBMS tập trung còn gặp phải tình trạng tắc nghẽn dữ liệu, thời gian phản hồi kém và nguy cơ mất dữ liệu cao Do đó, cần triển khai các giải pháp bảo mật và an toàn hơn để xử lý dữ liệu.

Giới thiệu về chuỗi khối

2.2.1 Khái niệm và cơ sở lý thuyết chuỗi khối Định nghĩa

Chuỗi khối là một cơ sở dữ liệu phân cấp lưu trữ các khối thông tin được liên kết với nhau bằng mã hóa, mở rộng theo thời gian với mục tiêu để chống lại sự thay đổi của dữ liệu [21] Mặc dù, chuỗi khối được giới thiệu lần đầu năm 2008 khi Satoshi Nakamoto 2 công bố bài viết với tiêu đề “Bitcoin: A Peer-to-Peer Electronic Cash System[22]” nhưng từ khóa chuỗi khối thực sự trở nên phổ biến khi giá trị vốn hóa của Bitcoin đạt 10 tỷ đô la vào năm 2016 [23] Công nghệ chính làm nền sự thành công của Bitcoin chính là chuỗi khối [24].

Chuỗi khối bao gồm những đặc điểm cốt lõi sau[25]:

• Không thể thay đổi: Chuỗi khối là một bản ghi giao dịch vĩnh viễn Khi một khối được thêm vào nó sẽ không bị thay đổi.

• Phi tập trung: Một chuỗi khối được lưu trữ trong một tệp có thể được truy cập vào sao chép bất kỳ nút nào trên mạng.

• Thúc đẩy sự đồng thuận: Mỗi khối trong chuỗi được xác minh độc lập thông qua mô hình đồng thuận cung cấp các quy tắc để xác thực một khối.

2 Satoshi Nakamoto là một nhân vật hoặc tổ chức ẩn danh đã sáng tạo ra Bitcoin.

• Minh bạch: bất kỳ ai đều có thể truy cập và kiểm tra giao dịch trên chuỗi khối.

Blockchain cung cấp nền tảng lưu trữ an toàn cho tài sản số và thực thông qua các đặc điểm và chức năng vốn có, tạo điều kiện thuận lợi cho các giao dịch dựa trên sự tin cậy, đồng thuận, bảo mật và hợp đồng thông minh Tiềm năng ứng dụng của blockchain không chỉ giới hạn trong lĩnh vực tài sản số mà còn mở rộng sang nhiều mảng khác như bảo hiểm, y tế, minh chứng cho sự linh hoạt và triển vọng phát triển vô hạn của công nghệ này.

Bộ ba bất khả thi của chuỗi khối

Công nghệ chuỗi khối được tận dụng để lưu trữ dữ liệu đáng tin cậy trong nhiều hệ thống phần mềm [26] Tuy nhiên, việc thiết kế và triển khai chuỗi khối thường đi kèm với những thách thức Trong số đó, bộ ba bất khả thi của chuỗi khối là một trong những trở ngại đáng chú ý nhất mà bất kỳ nền tảng chuỗi khối nào cũng mong muốn giải quyết Thách thức này nảy sinh do số lượng giao dịch gia tăng trong khi thông lượng trên các nền tảng chuỗi khối hiện nay còn hạn chế [26].

Hình 2.2: Bộ ba bất khả thi của chuỗi khối[27].

Bộ ba bất khả thi tuyên bố rằng một nền tảng chuỗi khối chỉ có thể đáp ứng hai trong số ba thuộc tính: khả năng mở rộng, phân cấp và bảo mật [26].

Khả năng mở rộng là một trong những khía cạnh quan trọng nhất của nhiều hệ thống phân tán như chuỗi khối Nó đề cập đến tốc độ và những người tham gia mạng ngang hàng có thể đạt được sự đồng thuận về trạng thái của chuỗi khối [28]. Các số liệu chính để đo lường khả năng mở rộng của chuỗi khối là thông lượng tối đa, độ trễ, thời gian khởi động và chi phí cho mỗi giao dịch được xác nhận [29].

Phân cấp là quá trình chuyển giao quyền kiểm soát và ra quyết định từ một thực thể trung tâm sang một mạng lưới phi tập trung Đây là một thành phần cốt lõi của công nghệ blockchain, nhưng cũng tạo ra những thách thức về khả năng mở rộng và bảo mật.

Tính bảo mật của công nghệ chuỗi khối đạt được thông qua mã hoá, mật mã công khai và các thuật toán đồng thuận Người dùng có thể tương tác với hệ thống bằng cách sử dụng hàm băm khóa công khai mà không tiết lộ danh tính [26].

Sự đồng thuận duy trì thỏa thuận về trạng thái toàn cầu nhất quán cho sổ cái phân tán, đảm bảo tính an toàn và khả năng chịu lỗi của mạng[30] Hai cơ chế phổ biến nhất là PoW và PoS PoW được áp dụng bởi Bitcoin, các nút trong mạng giải quyết các bài toán mật mã phức tạp để xác thực giao dịch và tạo khối mới Trong khi đó, PoS được áp dụng cho Ethereum, chọn nút xác thực dựa trên số lượng tài sản mà nút nắm giữ và đặt cược PoW đối mặt với vấn đề tiêu thụ năng lượng lớn do quá trình giải bài toán đòi hỏi lượng điện năng đáng kể, gây ra những tác động tiêu cực đến môi trường PoS tiết kiệm năng lượng hơn nhưng phải đối mặt với nguy cơ tập quyền, nếu một số ít người sở hữu phần lớn tài sản trong mạng, họ có thể kiểm soát mạng.

Việc lựa chọn cơ chế đồng thuận phù hợp là một quyết định quan trọng trong thiết kế hệ thống chuỗi khối, ảnh hưởng trực tiếp đến hiệu suất, bảo mật và khả năng mở rộng của mạng lưới Công nghệ chuỗi khối đang không ngừng phát triển,các cơ chế đồng thuận mới đang được nghiên cứu liên tục và phát triển nhằm cải thiện những hạn chế của phương pháp hiện tại.

Trong những năm gần đây, chuỗi khối đã trở thành một công nghệ đột phá với tiềm năng vô cùng lớn Về cơ bản, chuỗi khối được chia thành ba loại, mỗi loại sẽ được áp dụng cho từng trường hợp cụ thể:

Chuỗi khối công khai là mạng lưới mở, phi tập trung, không có chủ sở hữu riêng và mọi người đều có thể tham gia Ưu điểm của chuỗi khối công khai là đáng tin cậy, bảo mật và minh bạch Tuy nhiên, nhược điểm của chuỗi khối công khai là số lượng giao dịch mỗi giây thấp, khó mở rộng và tiêu thụ năng lượng điện cao Bitcoin là một ví dụ điển hình của chuỗi khối công khai.

• Chuỗi khối riêng tư: là chuỗi khối sử dụng các đặc quyền kiểm soát việc đọc và ghi vào chuỗi khối Chuỗi khối riêng tư sẽ có một thực thể duy nhất có quyền sở hữu và kiểm soát việc tạo khối [25] Chuỗi khối riêng tư dễ dàng mở rộng và có tốc độ giao dịch nhanh do có số lượng nút nhỏ, giúp rút ngắn thời gian xác thực giao dịch[31] Hyperledger Fabric là một chuỗi khối riêng tư được phát triển bởi Linux Foundation 3 , nhằm cung cấp một giải pháp chuỗi khối cho các doanh nghiệp và cho phép các thành viên trong mạng xác định quyền truy cập, quản lý dữ liệu[6].

• Chuỗi khối lai: là sự kết hợp của cả chuỗi khối công khai và riêng tư nhằm duy trì các đặc điểm của cả hai Nó mang lại lợi ích về tính minh bạch và bảo mật của các chuỗi khối công khai cũng như khả năng kiểm soát và quyền riêng tư của các chuỗi khối riêng tư Sự kết hợp này cho phép các tổ chức cân bằng nhu cầu về tính minh bạch và chia sẻ dữ liệu trong khi vẫn giữ an toàn cho dữ liệu nhạy cảm[32] Bảo mật và hiệu quả về chi phí là hai ưu điểm nổi bật của chuỗi khối lai, tuy nhiên chuỗi khối này lại thiếu tính minh bạch do thông tin có thể bị ẩn đi một phần[31].

Bảng 2.1 so sánh giữa các loại chuỗi khối dựa trên các tiêu chí: mức độ tập

3 Linux Foundation là một hiệp hội thương mại công nghệ phi lợi nhuận được thành lập để thúc đẩy, bảo vệ và mở rộng Linux và hợp tác phát triển. trung, quyền truy cập, tính bảo mật, tính minh bạch, tính khả dụng, và tính mở rộng.

Bảng 2.1: So sánh đặc điểm các loại chuỗi khối Đặc điểm Chuỗi khối công khai Chuỗi khối riêng tư Chuỗi khối lai

Mức độ tập trung Phi tập trung Tập trung Kết hợp

Quyền truy cập Mở cho tất cả Giới hạn Mở một phần

Tính bảo mật Cao Thấp Trung bình

Tính minh bạch Cao Thấp Trung bình

Tính khả dụng Cao Thấp Trung bình

Tính mở rộng Thấp Cao Trung bình

Yêu cầu chi tiết

Trong luận văn này, một hệ thống lưu trữ thông tin cảm biến khi phát hiện sự cố và thông tin người dùng trong hệ thống SCADA được xây dựng dựa trên công nghệHyperledger Fabric Mỗi cảm biến sẽ gửi dữ liệu lên chuỗi khối thông qua API ngay khi phát hiện sự thay đổi bất thường trong môi trường hoạt động Đồng thời, thông tin đăng nhập của người dùng sẽ được xác thực và lưu trữ trên chuỗi khối nhằm đảm bảo tính bảo mật và tính toàn vẹn của dữ liệu Những đặc tả yêu cầu bao gồm:

• Ghi nhận dữ liệu từ cảm biến: Hệ thống SCADA phải có khả năng nhận dữ liệu từ các cảm biến khi phát hiện sự cố hoặc thay đổi bất thường Dữ liệu gửi lên chuỗi khối thông qua API bao gồm thông tin về cảm biến, thời gian phát hiện sự cố và giá trị đo được.

• Đăng nhập và xác thực người dùng: Hệ thống SCADA phải có chức năng đăng nhập và xác thực người dùng trước khi cho phép truy cập vào các chức năng của hệ thống Thông tin đăng nhập của người dùng, bao gồm tên đăng nhập và mật khẩu, phải được xác thực và lưu trữ trên chuỗi khối Mỗi lần người dùng đăng nhập, thông tin đăng nhập và thời gian đăng nhập phải được ghi nhận và lưu trữ trên chuỗi khối.

• Xem danh sách và tìm kiếm lịch sử của cảm biến: Hệ thống SCADA phải cung cấp chức năng xem danh sách tất cả các cảm biến được ghi nhận trên chuỗi khối Người dùng phải có khả năng tìm kiếm và lọc danh sách các cảm biến dựa trên các tiêu chí như thời gian, loại cảm biến, hoặc giá trị đo được. Mỗi lần có thay đổi hoặc sự cố xảy ra với cảm biến, thông tin chi tiết về sự cố hoặc thay đổi đó phải được ghi nhận và lưu trữ trên chuỗi khối.

• Thêm/sửa/xóa người dùng: Hệ thống SCADA phải cho phép người quản trị thêm, sửa đổi và xóa người dùng Người quản trị phải có quyền truy cập và quản lý danh sách người dùng trong hệ thống Thông tin người dùng bao gồm mã định danh, mật khẩu, vai trò.

Hệ thống SCADA sẽ ghi lại lịch sử truy cập của người dùng để người quản trị có thể xem lại, bao gồm thông tin về người dùng, thời gian và hành động đã thực hiện Ghi chú này có thể được lọc theo người dùng hoặc xem chung cho tất cả người dùng.

• Đổi mật khẩu: Hệ thống SCADA phải cho phép người dùng thay đổi mật khẩu của mình Người dùng phải cung cấp mật khẩu hiện tại và nhập mật khẩu mới để thực hiện thay đổi Sau khi đổi mật khẩu thành công, lịch sử thay đổi mật khẩu của người dùng phải được ghi lại trên chuỗi khối.

Kiến trúc hệ thống

Hình 3.1: Tổng quan hệ thống SCADA kết hợp Fabric.

Trong nghiên cứu này, một kiến trúc hệ thống mới được đề xuất, dựa trên kiến trúc đã được trình bày tại 2.1.2 Hình 3.1 minh họa kiến trúc tổng quan hệ thống SCADA kết hợp Hyperledger Fabric Bên cạnh các thành phần đã được giới thiệu, nghiên cứu thực hiện thay thế cơ sở dữ liệu bằng Hyperledger Fabric và bổ sung thêm một máy chủ Máy chủ chịu trách nhiệm xử lý và phân tích dữ liệu được thu thập từ các thiết bị đầu cuối Trong khi đó, Hyperledger Fabric chịu trách nhiệm lưu trữ dữ liệu các bản ghi quan trọng của hệ thống SCADA Với tính chất bất biến, dữ liệu lưu trữ trong Hyperledger Fabric không thể bị sửa đổi hoặc xóa bỏ một cách trái phép, đảm bảo độ tin cậy và tính toàn vẹn của dữ liệu.

Dữ liệu sẽ được thu thập thông qua cảm biến đặt tại thực địa Sau khi dữ liệu được đo lường, chúng sẽ được truyền tải đến các thiết bị đầu cuối từ xa thông qua các giao thức truyền thông Tiếp theo, thiết bị đầu cuối từ xa sẽ chuyển tiếp dữ liệu đến thiết bị đầu cuối trung tâm Tại đây, khi hệ thống phát hiện giá trị đo lường vượt quá ngưỡng cho phép đã được thiết lập từ trước, nó sẽ kích hoạt một lệnh gọi API tới máy chủ Tại máy chủ, dữ liệu được xác thực và xử lý trước khi được chuyển vào Hyperledger Fabric để lưu trữ Quá trình thực hiện giao dịch trong Hyperledger Fabric được mô tả chi tiết trong mục 2.2.2 Để xây dựng một giải pháp tổng thể, dữ liệu được lưu trữ dưới dạng chuỗi JSON Điều này giúp hệ thống duy trì tính linh hoạt cao Mặc dù cấu trúc dữ liệu có thể khác nhau tùy thuộc vào từng hệ thống cụ thể.

Lập trình và thực nghiệm 31 4.1 Tổng quan

Các bước thực nghiệm

Quá trình lập trình và thực nghiệm bao gồm bốn bước chính sau:

• Thiết lập mạng thử nghiệm: Các tổ chức tham gia thiết lập một mạng thử nghiệm để mô phỏng môi trường chuỗi khối, cho phép họ kiểm tra và đánh giá các giao dịch và hoạt động trên chuỗi khối trong một môi trường an toàn và có kiểm soát.

• Phát triển chuỗi mã: Chuỗi mã được phát triển để triển khai trên mạng thử nghiệm, thực hiện các chức năng lưu trữ dữ liệu theo khóa trên chuỗi khối. Chuỗi mã bao gồm các hàm cho phép ghi và truy vấn dữ liệu, đảm bảo dữ liệu được lưu trữ an toàn và có thể truy xuất hiệu quả.

• Phát triển phụ trợ: Một chương trình phụ trợ được thiết kế để xử lý các yêu cầu gọi API từ thiết bị đầu cuối trung tâm Chương trình này đóng vai trò cầu nối giữa thiết bị đầu cuối trung tâm và mạng chuỗi khối, đảm bảo các yêu cầu được xử lý chính xác và hiệu quả.

• Thực thi: Chương trình phụ trợ và chuỗi mã được triển khai, thực thi trên mạng thử nghiệm.

Cấu trúc mã nguồn

Bảng 4.1: Cấu trúc thư mục.

Thư mục Mô tả backend/cmd Nơi chứa tệp thực thi để chạy phụ trợ backend/config Nơi chứa tệp cấu hình backend/middleware Nơi chứa tệp xử lý xác thực backend/pkg Nơi chứa những hàm, biến hằng số được truy cập thường xuyên backend/services Nơi chứa các tệp xử lý nghiệp vụ của từng api smart-contract/chaincode Nơi lưu trữ mã xử lý cho Hyperledger Fabric smart-contract/vendor Nơi chứa các thư viện liên quan

Tổng quan các thư mục của mã nguồn được minh họa ở bảng 4.1, bao gồm hai thư mục chính:

• backend là nơi chứa toàn bộ mã nguồn của phụ trợ.

• smart-contract là nơi chứa toàn bộ mã nguồn của hợp đồng thông minh.

Mô tả ý nghĩa các tệp trong mã nguồn được giải thích ở bảng 4.2.

Bảng 4.2: Cấu trúc các tệp trong thư mục.

Tệp Mô tả cmd/main.go Tệp thực thi chính của phụ trợ config/config.go Tệp cấu hình của phụ trợ middleware/middleware.go Tệp xử lý xác thực của mỗi yêu cầu đến phụ trợ pkg/constant/constant.go Tệp lưu các hằng số của phụ trợ pkg/error/error.go Tệp định nghĩa mã lỗi services/handler.go Tệp xử lý các yêu cầu trước khi đưa vào xử lý nghiệp vụ services/model.go Tệp khai báo các cấu trúc dữ liệu services/route.go Tệp khai báo định tuyến services/service.go Tệp xử lý nghiệp vụ chaincode/main.go Tệp thực thi của hợp đồng thông minh

Cấu trúc dữ liệu

Cấu trúc dữ liệu của hệ thống bao gồm:

• Thông tin người dùng bao gồm: mã người dùng, vai trò, mật khẩu và trạng thái Chi tiết xem tại bảng 4.3.

• Thông tin đăng nhập bao gồm: địa chỉ ip, mã thiết bị, thông tin thiết bị và thời gian Chi tiết xem tại bảng 4.4.

Các thông tin sự kiện bao gồm: loại sự kiện, mã cảm biến, tham số, giá trị đo được tương ứng với tham số, các ngưỡng giới hạn tương ứng với tham số và thời gian sự kiện xảy ra Tham khảo chi tiết tại Bảng 4.5.

Triển khai mạng thử nghiệm

Trong phần này, tác giả sẽ tiến hành các bước cần thiết để thiết lập mạng thử nghiệm của Hyperledger Fabric Các công cụ cần thiết để vận hành mạng thử

Bảng 4.3: Thông tin người dùng.

Thuộc tính Kiểu dữ liệu Mô tả user_id string Mã người dùng role string Vai trò trong hệ thống password string Mật khẩu status string Trạng thái của người dùng

Bảng 4.4: Thông tin đăng nhập.

Thuộc tính Kiểu dữ liệu Mô tả ip string Địa chỉ IP của thiết bị user_agent string Thông tin của thiết bị đăng nhập device_id string Mã thiết bị time string Thời gian đăng nhập nghiệm bao gồm docker 1 , git 2 và curl 3 Các bước để chạy thực nghiệm:

• Tải bản sao của dự án hyperledger/fabric-samples: git clone github.com/hyperledger/fabric-samples

• Truy cập vào thư mục test-network: cd fabric-samples/test-network

• Tạo kênh giao tiếp và khởi tạo thử nghiệm:

Thư mục test-network chứa các tệp và các thư mục cần thiết cho việc chạy mạng thử nghiệm, cung cấp một cách đơn giản nhất để tạo và chạy mạng thử nghiệm.

1 Docker là một nền tảng mã nguồn mở giúp ta đóng gói và chạy các ứng dụng trong các môi trường cô lập gọi là containers.

2 Git là một hệ thống quản lý phiên bản phân tán được sử dụng rộng rãi trong phát triển phần mềm.

3 Curl là một công cụ dòng lệnh được sử dụng để gửi và nhận dữ liệu qua mạng.

Bảng 4.5: Thông tin sự kiện.

Thuộc tính Kiểu dữ liệu Mô tả event string Loại sự kiện sensor_id string Mã cảm biến parameter string Tham số value number Giá trị tại đo được của cảm biến threshold number Ngưỡng timestamp number Thời gian sự kiện xảy ra

Xây dựng chuỗi mã

Ngôn ngữ lập trình Go được lựa chọn để phát triển chaincode trong thử nghiệm này Mặc dù các lựa chọn khác như Java và NodeJS cũng khả thi, Go được ưu tiên do tính hiệu quả và khả năng tương thích tốt với môi trường Hyperledger Fabric.

Cụ thể, thư viện fabric-contract-api-go 4 do đội ngũ phát triển Hyperledger Fabric cung cấp, đơn giản hóa đáng kể việc tương tác với chuỗi khối, cho phép tập trung vào logic nghiệp vụ của chuỗi mã Đoạn mã sau minh họa việc triển khai một chuỗi mã cơ bản trên nền tảng Hyperledger Fabric:

1 // Khai báo package trong Go

5 "github.com/hyperledger/fabric-contract-api-go/contractapi"

8 // Định nghĩa một hợp đồng thông minh được xác định bằng cách nhúng

4 https://github.com/hyperledger/fabric-contract-api-go

14 // Hàm chạy chính của chương trình

16 // Tạo một đối tượng chuỗi mã từ hợp đồng thông minh

17 chaincode, err := contractapi.NewChaincode(new(SmartContract))

19 fmt.Printf("Error creating chaincode: %s", err.Error())

25 fmt.Printf("Error starting chaincode: %s", err.Error())

Nhằm hiện thực hóa các chức năng cốt lõi đã được trình bày trong mục 3.1.,một tập hợp các hàm tương ứng sẽ được phát triển Các hàm này sẽ đóng vai trò quan trọng trong việc xác định các khóa lưu trữ và truy xuất dữ liệu trong Hyperledger Fabric theo từng định dạng khóa chính Chi tiết xem tại:https://github.com /tran-the-lam/scada-project/blob/main/smart-contract/chaincod e/main.go#L38

1 // Xây dựng khóa để lưu thông tin người dùng

2 func buildUserKey(userID string) string {

3 return fmt.Sprintf("user:%s", userID)

Giai đoạn tiếp theo tập trung vào việc thiết kế và xây dựng các cấu trúc dữ liệu tối ưu cho việc lưu trữ thông tin trên chuỗi khối Các cấu trúc này đáp ứng các yêu cầu hệ thống, đồng thời đảm bảo tính toàn vẹn và bảo mật dữ liệu Quá trình thiết kế bao gồm việc xác định các trường thông tin, quy định chặt chẽ về định dạng và kiểu dữ liệu tương ứng Chi tiết xem tại:https://github.com/tran-the-lam /scada-project/blob/main/smart-contract/chaincode/main.go#L15

3 Ip string `json:"ip"` // IP của người dùng

4 UserAgent string `json:"user_agent"` // Loại thiết bị

5 DeviceID string `json:"device_id"` // Mã thiết bị

6 Time string `json:"time"` // Thời gian đăng nhập

Hàm khởi tạo đóng vai trò thiết lập trạng thái ban đầu của hệ thống bằng cách tạo người dùng quản trị viên và lưu thông tin vào chuỗi khối Ở dòng số 5, mật khẩu quản trị viên được mã hóa băm để đảm bảo tính bảo mật trước khi lưu trữ.

1 func (s *SmartContract) Init(ctx contractapi.TransactionContextInterface) error {

5 Password: "7ebd1a9b3dc007e9a9393ab3bd2848c6425f9218a00181775⌋ d4d311af048d023",

8 adminJSON, err := json.Marshal(admin)

12 // Lưu trạng thái vào cơ sở dữ liệu phi tập trung của đối tượng

Stub Stub cung cấp các phương thức để tương tác với cơ sở dữ liệu phi tập trung và sổ cái

13 if err := ctx.GetStub().PutState(buildUserKey(admin.UserID), adminJSON); err != nil {

14 return fmt.Errorf("failed to put to world state %s", err.Error())

Tiếp theo, chức năng thêm người dùng mới vào hệ thống được triển khai, với quyền truy cập giới hạn cho tài khoản quản trị viên Chỉ quản trị viên mới có thẩm quyền thực hiện thao tác này, đảm bảo tính kiểm soát và an toàn cho hệ thống Quản trị viên chịu trách nhiệm cung cấp thông tin cần thiết và xác thực danh tính của người dùng mới trước khi thêm vào hệ thống Dữ liệu người dùng được lưu trữ dưới dạng khóa mã người dùng để phục vụ mục đích xác thực Đồng thời, tại dòng mã số 40 thông tin người dùng cũng được lưu trữ vào khóaallUser nhằm phục vụ cho các chức năng quản trị.

1 func (s *SmartContract) AddUser(ctx contractapi.TransactionContextInterface, actorID, userID, role, password string) error {

2 // Lấy thông tin người thực hiện

3 actorInfo, err := ctx.GetStub().GetState(buildUserKey(actorID))

5 return fmt.Errorf("failed to get from world state %s", err.Error())

7 // Chuyển đổi về dữ liệu có cấu trúc

9 if err := json.Unmarshal(actorInfo, &actor); err != nil {

14 return fmt.Errorf("actor is not admin")

16 // Kiểm tra người dùng tồn tại hay chưa

17 userInfo, err := ctx.GetStub().GetState(buildUserKey(userID))

19 return fmt.Errorf("failed to get from world state %s", err.Error())

22 return fmt.Errorf("user is exist")

25 if len(userID) == 0 || len(role) == 0 || len(password) == 0 {

26 return fmt.Errorf("invalid input")

28 // Tạo đối tượng người dùng

35 userJSON, err := json.Marshal(user)

39 // Lưu thông tin người dùng

40 if err := ctx.GetStub().PutState("allUser", userJSON); err !nil {

41 return fmt.Errorf("failed to put to world state %s", err.Error())

43 if err := ctx.GetStub().PutState(buildUserKey(userID), userJSON); err != nil {

44 return fmt.Errorf("failed to put to world state %s", err.Error())

Hàm thêm sự kiện được định nghĩa với một ngưỡng giá trị định sẵn Khi giá trị cảm biến đo được vượt ngưỡng này, thông tin về sự kiện sẽ được ghi nhận Hàm này tiến hành lưu trữ dữ liệu sự kiện vào hai khóa riêng biệt trên chuỗi khối.

Cụ thể, tại dòng 15 , dữ liệu được lưu vào khóaallEvent nhằm hỗ trợ việc truy xuất toàn bộ danh sách sự kiện Tiếp theo, tại dòng 19 , dữ liệu được lưu vào một khóa được tạo dựa trên mã cảm biến, tối ưu hóa việc tìm kiếm thông tin theo mã cảm biến cụ thể Cơ chế lưu trữ kép này cho phép truy xuất dữ liệu hiệu quả theo nhiều tiêu chí khác nhau.

1 func (s *SmartContract) AddEvent(ctx contractapi.TransactionContextInterface, eventName, sensorID, parameter string, value, threshold float64, timestamp uint64) error {

10 eventJSON, err := json.Marshal(event)

14 // Lưu vào khóa ` allEvent ` và dùng khi lấy danh sách sự kiện

15 if err := ctx.GetStub().PutState("allEvent", eventJSON); err !nil {

16 return fmt.Errorf("failed to put to world state %s", err.Error())

18 // Lưu vào khóa mã cảm biến và dùng khi tìm kiếm

19 if err := ctx.GetStub().PutState(buildSensorKey(event.SensorID), eventJSON); err != nil {

20 return fmt.Errorf("failed to put to world state %s", err.Error())

4.3.6 Lấy danh sách sự kiện

Hàm truy xuất danh sách sự kiện thu thập toàn bộ thông tin sự kiện lưu trữ trên Hyperledger Fabric thông qua khóa allEvent Phương thức GetHistoryForKey tại dòng 3 cho phép theo dõi lịch sử thay đổi dữ liệu, giúp truy xuất toàn bộ quá trình thay đổi Kết quả sau khi xử lý được trả về dạng danh sách chứa thông tin chi tiết về các sự kiện.

1 func (s *SmartContract) GetAllEvents(ctx contractapi.TransactionContextInterface) ([]Event, error) {

3 resultsIterator, err :ctx.GetStub().GetHistoryForKey("allEvent")

5 return transactions, fmt.Errorf("GetTransactionHistory exec error: %v", err)

11 return transactions, fmt.Errorf("GetTransactionHistory iterator error: %v", err)

14 if err := json.Unmarshal(response.Value, &transaction); err

15 return transactions, fmt.Errorf("GetTransactionHistory unmarshal error: %v", err)

Hàm xác thực người dùng được thiết kế để hỗ trợ quy trình đăng nhập Khi được gọi, hàm này sẽ kiểm tra tính hợp lệ của thông tin đăng nhập được cung cấp Nếu thông tin không hợp lệ, một mã lỗi sẽ được trả về, biểu thị quá trình xác thực thất bại Ngược lại, nếu thông tin đăng nhập hợp lệ, các bước kiểm tra bổ sung sẽ được thực hiện để đảm bảo tính toàn vẹn và bảo mật Kết quả trả về của hàm là vai trò của người dùng, xác nhận quá trình xác thực thành công Thiết kế này cho phép hệ thống xác định quyền truy cập của người dùng dựa trên vai trò được gán Chi tiết xem tại:https://github.com/tran-the-lam/scada-project/blob/ma in/smart-contract/chaincode/main.go#L190

Phát triển phụ trợ

Để tối ưu hóa khả năng tương thích với nền tảng Hyperledger Fabric, việc phát triển các thành phần phụ trợ nên sử dụng một trong ba ngôn ngữ lập trình chính:

Go, Java hoặc NodeJS Trong nghiên cứu này, ngôn ngữ Go kết hợp với framework Fiber 5 phiên bản thứ hai, đã được lựa chọn để phát triển các tính năng cần thiết.

Sự lựa chọn này dựa trên hiệu năng và khả năng tích hợp mạnh mẽ của Go với Hyperledger Fabric.

4.4.1 Xây dựng tệp thực thi chính

Phần này tập trung vào việc thiết lập cấu hình ban đầu, khởi tạo các dịch vụ cần thiết, định nghĩa các điều hướng và thiết lập cơ chế lắng nghe cho các yêu cầu đến.

6 fiber "github.com/gofiber/fiber/v2"

11 app := fiber.New(fiber.Config{

15 app.Listen(fmt.Sprintf(":%s", cfg.PORT))

4.4.2 Xây dựng tệp cấu hình

Phần cấu hình này cung cấp thông số thiết yếu để thiết lập kết nối đến mạng Hyperledger Fabric cùng các giá trị sử dụng trong quá trình vận hành ứng dụng Mục đích là tạo cổng giao tiếp giữa thành phần phụ trợ và Hyperledger Fabric, đảm bảo quá trình trao đổi dữ liệu được thực hiện an toàn và thông suốt.

• Bước 1: Xây dựng một cấu trúc dữ liệu được định nghĩa để nhận các biến môi trường Sau đó, các biến môi trường được nạp từ tệp env Chi tiết mã nguồn tạihttps://github.com/tran-the-lam/scada-project/blob/ main/backend/config/config.go#L23

• Bước 2: Thiết lập kết nối với mạng Hyperledger Fabric yêu cầu một số bước bao gồm: khởi tạo chứng chỉ X.509, tạo chữ ký số, xây dựng danh tính cho máy khách và tạo kết nối gRPC Chi tiết mã nguồn tại https://github.c om/tran-the-lam/scada-project/blob/main/backend/config/co nfig.go#L102

Bảng 4.6 mô tả các biến môi trường của chương trình phụ trợ.

4.4.3 Xây dựng xử lý nghiệp vụ

Các phương thức cốt lõi của hệ thống bao gồm đăng nhập, thay đổi mật khẩu, thêm người dùng, truy xuất danh sách người dùng, thu thập lịch sử đăng nhập, thêm sự kiện, tìm kiếm sự kiện và truy xuất danh sách sự kiện Thành phần này đóng vai trò xử lý các yêu cầu và tương tác từ phía người dùng Đối với mỗi phương thức, các quy tắc xử lý riêng biệt được thiết lập, bao gồm việc kiểm tra tính hợp lệ của dữ liệu đầu vào và thực hiện các thao tác tương ứng để đáp ứng yêu cầu của người dùng.

Bảng 4.6: Biến môi trường của chương trình phụ trợ.

Thuộc tính Kiểu dữ liệu Mô tả

PORT string Cổng lắng nghe yêu cầu

OrgName string Tên của tổ chức

CertPath string Đường dẫn đến tệp chứng chỉ

KeyPath string Đường dẫn đến tệp khóa riêng

TLSCertPath string Đường dẫn đến tệp chứng chỉ TLS

PeerEndpoint string Điểm cuối của nút kết nối

GatewayPeer string Cổng kết nối của nút

MSPID string ID của nhà cung cấp dịch vụ thành viên ChannelID string ID của kênh

ChainCodeID string ID của chuỗi mã

SaltPwd string Làm nhiễu mật khẩu trước khi băm

5 "github.com/hyperledger/fabric-gateway/pkg/client"

7 // Xác định các hàm xử lý nghiệp vụ

9 Login(ctx context.Context, userID, ip, userAgent, deviceID, password string) (string, error)

12 // Xác định cấu trúc xử lý nghiệp vụ

14 gateway client.Gateway // đối tượng kết nối với Hyperledger

15 h hash.Hash // Dùng để băm mật khẩu khi thay đổi mật khẩu

16 contract client.Contract // Đối tượng hợp đồng thông minh

17 saltPwd string // Mục đích làm nhiễu mật khẩu khi băm

20 func NewService(cfg *config.OrgSetup) IService {

24 contract: *cfg.Gateway.GetNetwork(cfg.ChannelID).GetContract⌋

Xây dựng hàm thực hiện giao dịch với Hyperledger Fabric.

1 func (s *service) execTxn(txn *client.Proposal) error {

2 // Xây dựng đề xuất giao dịch

3 txn_endorsed, err := txn.Endorse()

8 txn_committed, err := txn_endorsed.Submit()

Tạo tài khoản quản trị ban đầu là nhiệm vụ quan trọng trong quá trình thiết lập hệ thống, đóng vai trò tạo tài khoản quản lý đầu tiên cho phép truy cập và quản lý toàn bộ hệ thống Tài khoản quản trị ban đầu là điều kiện tiên quyết để vận hành và quản lý hệ thống suôn sẻ.

2 txn_proposal, err :s.contract.NewProposal(constant.SMC_FUNC_INIT, client.WithArguments())

Chi tiết về các hàm xử lý nghiệp vụ tham khảo tại:https://github.com/tra n-the-lam/scada-project/blob/main/backend/service/service.go

4.4.4 Xây dựng lớp xác thực trung gian

Lớp xác thực trung gian có nhiệm vụ kiểm tra tính hợp lệ của thông tin người dùng và cảm biến trước khi chúng được chấp nhận và sử dụng trong quá trình xử lý Quá trình xác thực này giúp đảm bảo rằng chỉ các thông tin hợp lệ và chính xác mới được chấp nhận và tiếp tục xử lý Việc xây dựng lớp xác thực trung gian đảm bảo tính bảo mật, chính xác của dữ liệu Chi tiết mã nguồn tại https://github.com/tran-the-lam/scada-project/blob/main/backe nd/middleware/middleware.go

4.4.5 Xây dựng tệp thực thi

Tại đây, mọi yêu cầu của máy khách gửi đến đều được xác thực trước khi đưa vào xử lý nghiệp vụ Sau khi quá trình xử lý hoàn tất, hệ thống sẽ tạo ra phản hồi dựa trên các cấu trúc đã được định nghĩa trước Phản hồi này được gửi trở lại cho máy khách để thông báo kết quả xử lý yêu cầu.

1 // Định nghĩa cấu trúc của phản hồi

4 Data any `json:"data,omitempty"`

5 Token string ` json:"token,omitempty" `

Xây dựng hàm xử lý đăng nhập vào hệ thống.

1 // Định nghĩa JSON dùng cho mục đích đăng nhập

3 UserID string ` json:"user_id" `

5 DeviceID string ` json:"device_id" `

7 // Hàm xử lý khi người dùng đăng nhập vào hệ thống

8 func LoginHdl(service IService) fiber.Handler {

9 return func(c *fiber.Ctx) error {

11 if err := c.BodyParser(&body); err != nil {

16 token, err := service.Login(c.Context(), body.UserID, ip, userAgent, body.DeviceID, body.Pwd)

20 return c.JSON(Response{"success", nil, token})

Chi tiết về các hàm thực thi xem tạihttps://github.com/tran-the-lam/sca da-project/blob\/main/backend/service/handler.go

Việc xây dựng định tuyến trong Fiber đảm bảo tính chính xác và nhất quán trong quá trình xử lý yêu cầu Cơ chế định tuyến giúp quản lý và điều phối các yêu cầu từ máy khách đến các hàm xử lý tương ứng, đồng thời tạo nên một cấu trúc rõ ràng và dễ quản lý cho ứng dụng Tại đây, việc phân quyền cho từng API được thực hiện, xác định cụ thể API nào được phép thực thi dựa trên quyền truy cập của người dùng Việc phân quyền này đóng vai trò quan trọng trong việc bảo vệ hệ thống và dữ liệu Chi tiết xem tại: https://github.com/tran-the-lam/sca da-project/blob\/main/backend/service/route.go

6 func Route(app fiber.Router, service IService) {

Đảm bảo chất lượng mã 50 5.1 Kiểm chứng

Kiểm thử đơn vị

Kiểm thử đơn vị là quá trình tách biệt các thành phần của mã và kiểm tra chúng một cách độc lập Điều này giúp phát hiện và sửa lỗi sớm, nâng cao tính ổn định và đáng tin cậy của mã nguồn Việc viết kiểm thử đơn vị cũng giúp ích quá trình bảo trì và mở rộng mã nguồn, đảm bảo rằng các thay đổi không làm ảnh hưởng đến các phần khác của hệ thống Công cụtesting được lựa chọn cho kiểm thử đơn vị vì được tích hợp sẵn với Go Một số quy tắc cần thuân thủ khi thực hiện viết kiểm thử:

• Các tệp chứa mã kiểm thử cần tuân theo quy tắc đặt tên của Go, cụ thể là phải kết thúc bằng hậu tố _test.go Điều này cho phép lệnh go testnhận diện và thực thi các hàm kiểm thử một cách chính xác.

• Các hàm kiểm thử trong Go cần tuân thủ quy tắc đặt tên bắt đầu bằng Test và theo sau là một ký tự viết hoa Tham số đầu vào của hàm kiểm thử phải là một con trỏ đến đối tượng testing.T, cung cấp các phương thức hỗ trợ quá trình kiểm thử.

Ví dụ minh họa kiểm thử hàm khởi tạo:

Sau khi thực thi lệnhgo test, kết quả thu được như sau:

$ go test -timeout 30s -run ^TestInit$ scada-fabric-project/chaincode ok scada-fabric-project/chaincode

Kết quả thực thi các hàm kiểm thử cho thấy tính chính xác của các chức năng được kiểm tra thông qua việc so sánh kết quả thực tế và kết quả mong đợi Trong trường hợp có sự không tương thích, hệ thống kiểm thử sẽ báo cáo lỗi chi tiết Ví dụ, khi hàm TestInit mong đợi hàm trả về lỗi nil nhưng kết quả thực tế là lỗi bằng nil, điều này phản ánh lỗi trong logic hàm hoặc thiết lập kiểm thử.

$ go test -timeout 30s -run ^TestInit$ scada-fabric-project/chaincode - FAIL: TestInit (0.00s) main_test.go:78:

Error Trace: /smartcontract/chaincode/main_test.go:78 Error: An error is expected but got nil.

FAIL scada-fabric-project/chaincode 0.340s

Phát hiện lỗi tiềm ẩn

Công cụ golangci-lint 1 được lựa chọn để thực hiện kiểm tra và tối ưu hóa chất lượng mã nguồn Golangci-lint là một công cụ mã nguồn mở được cộng đồng đánh giá cao Công cụ này có khả năng phát hiện và báo cáo đa dạng các vấn đề, bao gồm lỗi cú pháp, vi phạm quy tắc lập trình cũng như các vấn đề tiềm ẩn liên quan đến hiệu suất và bảo mật Một số tính năng nổi bật của golangci-lint bao gồm:

• Hỗ trợ rất nhiều công cụ phát hiện lỗi bao gồmgofmt,govet, staticcheck.

• Hỗ trợ chạy song song các bộ công cụ phát hiện lỗi giúp giảm thiểu thời gian kiểm tra.

• Dễ dàng cài đặt với môi trường phát triển tích hợp.

Quá trình phân tích và khắc phục không chỉ nâng cao tính toàn vẹn và an toàn của ứng dụng, mà còn đóng góp đáng kể vào việc tối ưu hóa hiệu suất và cải thiện khả năng bảo trì lâu dài, từ đó tăng cường tính ổn định và độ tin cậy của chuỗi mã.

Ví dụ sau minh họa khả năng phát hiện lỗi của công cụgolangci-lint:

1 https://github.com/golangci/golangci-lint

$ golangci-lint run main_test.go:80:25: Error return value of `assetTransfer.CreateKey` is not checked (errcheck) assetTransfer.CreateKey(transactionContext, "x", "5")

^ main.go:41:6: func `buildEventKey` is unused (unused) func buildEventKey(sensorID, parameter string) string {

Lỗi đầu tiên được golangci-lint phát hiện cho thấy giá trị trả về lỗi của hàm

CreateKey chưa được kiểm tra Việc kiểm tra và xử lý lỗi là cần thiết để đảm bảo tính đúng đắn và tránh các trường hợp ngoại lệ không mong muốn trong quá trình thực thi Lỗi thứ hai chỉ ra sự tồn tại của một hàm không được sử dụng, cho thấy khả năng dư thừa mã và cần được xem xét loại bỏ.

Phát hiện lỗ hổng bảo mật

Việc phát hiện lỗ hổng bảo mật đóng vai trò quan trọng trong việc đảm bảo tính toàn vẹn và an toàn của ứng dụng Quá trình này giúp xác định và ngăn chặn các vấn đề tiềm ẩn như xử lý dữ liệu không an toàn, hoặc sử dụng các thuật toán mã hóa yếu trước khi chúng có thể bị khai thác Bằng cách phát hiện sớm các lỗ hổng, chúng ta có thể giảm thiểu rủi ro bảo mật, bảo vệ dữ liệu Bên cạnh đó, việc này còn góp phần tối ưu hóa quy trình phát triển, giảm chi phí khắc phục lỗi trong giai đoạn sau.

Công cụ gosec 2 phổ biến trong phân tích mã nguồn nhằm phát hiện các lỗ hổng bảo mật tiềm ẩn dựa trên một tập hợp các quy tắc bảo mật chuẩn 3 Ví dụ sau minh họa khả năng phát hiện lỗ hổng bảo mật của công cụgosec:

[ /smart-contract/chaincode/main.go:81] - G401 (CWE-326):

Use of weak cryptographic primitive

2 https://github.com/securego/gosec

3 https://github.com/securego/gosec?tab=readme-ov-file#available-rules

80: func (s *SmartContract) weakHash(data string) [16]byte {

> 81: return md5.Sum([]byte(data))

[ /smart-contract/chaincode/main.go:4] - G501 (CWE-327):

Blocklisted import crypto/md5: weak cryptographic primitive (Confidence: HIGH, Severity: MEDIUM)

Lỗ hổng bảo mật trên liên quan đến việc sử dụng thuật toán băm MD5, một thuật toán mã hóa yếu G401 mang ý nghĩa phát hiện sử dụng MD5 hoặc SHA1 G501 mang ý nghĩa đang thực hiện sử dụng thư viện bị chặn crypto/md5 Việc sửa lỗi này rất quan trọng để đảm bảo tính toàn vẹn và bảo mật của dữ liệu trong chuỗi mã Để giải quyết vấn đề này, việc xem xét áp dụng một thuật toán băm mạnh hơn,chẳng hạn như SHA-256, là cần thiết.

Các lỗi được tìm thấy trong chuỗi mã

Sau khi áp dụng các công cụ kiểm tra và phân tích mã nguồn, tổng cộng 12 lỗi đã được phát hiện trong chuỗi mã, chi tiết được trình bày trong bảng 5.2 Bảng này cung cấp thông tin chi tiết về từng lỗi, bao gồm số lượng, loại lỗi, công cụ phát hiện và mức độ nghiêm trọng Quá trình sửa lỗi được thực hiện một cách hệ thống và tuần tự, đảm bảo mỗi lỗi được xử lý triệt để mà không gây ra lỗi mới Sau mỗi lần sửa lỗi, các công cụ kiểm tra được chạy lại để xác minh tính hiệu quả của việc sửa lỗi Quy trình này được lặp lại cho đến khi tất cả các công cụ kiểm tra không còn báo cáo lỗi Phương pháp này đảm bảo chất lượng và độ tin cậy của mã nguồn chuỗi mã.

Tìm và sửa lỗi tự động

Việc tự động phát hiện và sửa lỗi trong mã nguồn là một lĩnh vực nghiên cứu quan trọng, đóng góp đáng kể vào việc nâng cao chất lượng và độ ổn định của phần

Bảng 5.2: Số lỗi được phát hiện bởi các công cụ

Công cụ phát hiện lỗi giúp lập trình viên phát hiện và sửa lỗi hiệu quả Các loại lỗi thường gặp: cú pháp, ngữ nghĩa, khi chạy Các phương pháp phát hiện lỗi:

• Phân tích tĩnh: sử dụng các kỹ thuật phân tích mã nguồn mà không cần chạy chương trình, để phát hiện các lỗi tiềm ẩn và các vấn đề trong mã.

• Phân tích động: phân tích mã nguồn trong quá trình chạy để phát hiện các lỗi xảy ra trong thời gian thực.

Học máy và trí tuệ nhân tạo đóng vai trò quan trọng trong bảo trì dự đoán bằng cách sử dụng các kỹ thuật học máy để xây dựng các mô hình có khả năng dự đoán lỗi và đề xuất các giải pháp sửa chữa tối ưu Những mô hình này được đào tạo trên dữ liệu lịch sử và có thể học hỏi từ các mẫu ẩn trong dữ liệu để xác định các chỉ báo sớm về khả năng xảy ra lỗi.

Phân tích tĩnh trong việc tự động phát hiện và sửa lỗi tập trung vào quá trình bao gồm các bước:

➀ Phân tích cú pháp: bao gồm phân tích mã nguồn để tạo ra cây cú pháp, biểu diễn cấu trúc của mã và kiểm tra mã nguồn để tìm các lỗi cú pháp như thiếu dấu ngoặc hoặc khai báo biến sai.

➁Phân tích ngữ nghĩa: bao gồm kiểm tra kiểu dữ liệu và phát hiện lỗi ngữ nghĩa.

4 Xảy ra khi mã nguồn vi phạm các quy tắc ngữ pháp của ngôn ngữ lập trình như thiếu dấu chấm phẩy.

5 Xảy ra khi mã nguồn không thực hiện đúng ý định của lập trình viên.

6 Xảy ra khi chương trình đang chạy, thường do các lỗi liên quan đến bộ nhớ, tài nguyên hệ thống hoặc các ngoại lệ chưa được xử lý.

Kiểm tra kiểu dữ liệu cần đảm bảo các biến và biểu thức trong mã nguồn tuân thủ các quy tắc của kiểu dữ liệu ngôn ngữ lập trình Phát hiện lỗi ngữ nghĩa là tìm kiếm các lỗi liên quan đến ngữ nghĩa như sử dụng biến chưa khởi tạo hoặc gọi hàm với tham số không đúng.

➂ Phân tích luồng dữ liệu: theo dõi cách các giá trị biến được truyền và sử dụng trong chương trình để phát hiện các lỗi như sử dụng biến chưa khởi tạo, đồng thời tìm kiếm các lỗ hổng bảo mật như rò rỉ dữ liệu hoặc các lỗi tiêm nhiễm mã.

➃ Phân tích luồng điều khiển: để biểu diễn luồng điều khiển của chương trình và phát hiện các lỗi như vòng lặp vô hạn, các nhánh điều kiện không bao giờ xảy ra và các vấn đề về sự đồng thời.

Phân tích các quy tắc lập trình và bảo mật là quá trình kiểm tra mã nguồn dựa trên các bộ quy tắc để đảm bảo tuân thủ các tiêu chuẩn về lập trình và bảo mật Bằng cách này, có thể phát hiện các vi phạm tiềm ẩn, chẳng hạn như sử dụng hàm không an toàn hoặc các thư viện lập trình kém chất lượng, giúp nâng cao tính bảo mật và độ tin cậy của phần mềm.

➅ Tạo báo cáo và đề xuất sửa lỗi: bao gồm việc tạo báo cáo chi tiết về các lỗi và vấn đề được phát hiện, với mô tả lỗi, vị trí trong mã nguồn, và mức độ nghiêm trọng, đồng thời đưa ra các đề xuất hoặc tự động áp dụng các sửa lỗi cho các vấn đề này.

Tìm và sửa lỗi tự động là một quá trình liên tục trong phát triển phần mềm. Việc kết hợp nhiều công cụ và phương pháp sẽ giúp lập trình viên giảm thiểu lỗi, tăng chất lượng phần mềm và nâng cao hiệu suất làm việc Các công cụ được giới thiệu trong luận văn chủ yếu tập trung vào việc phát hiện lỗi, nhưng chưa hỗ trợ tự động sửa lỗi hoặc đề xuất giải pháp Trong quá trình nghiên cứu, một cải tiến đã được thực hiện nhằm bổ sung tính năng đề xuất giải pháp cho công cụ gosec Cụ thể, sau khi gosec phát hiện lỗ hổng bảo mật, thông tin chi tiết về lỗ hổng được cung cấp cho Gemini để tạo gợi ý sửa lỗi được minh họa ở hình 5.1 Chi tiết về các thay đổi trong mã nguồn được trình bày tại https://github.com/securego/gosec/pull/1177/files

Hình 5.1: Kết quả chạygoseccùng với tính năngđề xuất giải pháp.

Việc nâng cấp công cụgosecvới tính năngđề xuất giải phápdựa trên Gemini đã được đánh giá thông qua thử nghiệm trên tập dữ liệu kiểm thử 7 của mã nguồn gosec Kết quả được trình bày trong bảng 5.3 cho thấy, trong tổng số 112 lỗi được gosec phát hiện, Gemini đã đề xuất giải pháp thành công cho 89 lỗi, đạt tỷ lệ 79.46% Kết quả này cho thấy hiệu quả của Gemini trong việc đề xuất các thuật toán tối ưu và xây dựng các câu truy vấn an toàn Tuy nhiên, trong một số trường hợp, Gemini đưa ra các gợi ý chung chung và chưa rõ ràng, ví dụ như đối với các lỗi G102, G103 và G204 Mặc dù vậy, thử nghiệm đã chứng minh tiềm năng của Gemini trong việc hỗ trợ xử lý các lỗi bảo mật trong mã nguồn Go, giúp tiết kiệm thời gian và công sức cho lập trình viên, đặc biệt là trong việc giải quyết các vấn đề phức tạp Việc tích hợp Gemini vàogosec được xem là một bước tiến đáng kể trong việc nâng cao hiệu quả và độ chính xác của công cụ kiểm tra bảo mật mã nguồn.

Thảo luận

Việc đảm bảo chất lượng cho chuỗi mã là rất quan trọng bởi vì chuỗi mã là trái tim của ứng dụng Nếu có lỗi trong chuỗi mã, nó có thể cho phép tin tặc tấn công, truy cập vào các dữ liệu và thông tin nhạy cảm Vì thế việc sử dụng các công cụ để đảm bảo chất lượng cho chuỗi mã là rất cần thiết Dựa trên quá trình đánh giá

7 https://github.com/securego/gosec/tree/master/testutils

Bảng 5.3: Báo cáo kết quả sửa lỗi tự động của Gemini.

Loại lỗi Mô tả Số lỗi giải quyết được

G101 Nhúng trực tiếp thông tin nhạy cảm như mật khẩu hoặc khóa API 18 18

G102 Một chương trình hoặc dịch vụ đang lắng nghe trên tất cả các địa chỉ IP có sẵn cho hệ thống

G103 Kiểm tra việc sử dụng khối không an toàn 1 6

G104 Lỗi không được kiểm tra 4 4

G107 Url được cung cấp cho yêu cầu HTTP dưới dạng đầu vào bị lỗi 4 8

G108 Điểm cuối định hình tự động được hiển thị trên /debug/pprof 1 1

G109 Tràn số nguyên tiềm ẩn do strconv.Atoi chuyển đổi kết quả sang int16/32

G110 Lỗ hổng DoS tiềm ẩn thông qua giải nén 5 5

G111 Khả năng duyệt qua thư mục 0 1

G112 là máy chủ web có khả năng bị tấn công Slowloris Phương thức tấn công này hoạt động bằng cách tạo ra nhiều kết nối HTTP không hoàn chỉnh, gây tiêu tốn tài nguyên của máy chủ, từ đó làm máy chủ web ngừng hoạt động.

G201 Xây dựng truy vấn SQL bằng chuỗi định dạng 10 10

G202 Xây dựng truy vấn SQL bằng cách nối chuỗi 8 8

G203 Sử dụng dữ liệu không thoát trong các mẫu HTML 1 3

G204 Kiểm tra việc sử dụng thực thi lệnh 0 6

G301 Quyền truy cập tệp kém được sử dụng khi tạo thư mục 2 2

G302 Quyền truy cập tệp kém được sử dụng với chmod 2 2

G303 Tạo tệp tạm bằng đường dẫn có thể dự đoán được 9 9

G304 Đường dẫn tệp được cung cấp dưới dạng đầu vào bị không rõ ràng 7 7

G306 Quyền truy cập tệp kém được sử dụng khi ghi vào tệp mới 2 2

G401 Phát hiện việc sử dụng MD5 hoặc SHA1 1 1

G403 Đảm bảo độ dài khóa RSA tối thiểu là 2048 bit 1 1

G404 Nguồn số ngẫu nhiên không an toàn 1 1

G405 Phát hiện việc sử dụng DES hoặc RC4 1 1

G406 Phát hiện việc sử dụng MD4 hoặc RIPEMD160 1 1

G501 Nhập thư viện bị chặn crypto/md5 1 1

G502 Nhập thư viện bị chặn crypto/des 1 1

G503 Nhập thư viện bị chặn crypto/rc4 1 1

G504 Nhập thư viện bị chặn net/http/cgi 1 1

G505 Nhập thư viện bị chặn crypto/sha1 1 1

G506 Nhập thư viện bị chặn golang.org/x/crypto/md4 1 1

G507 Nhập thư viện bị chặn golang.org/x/crypto/ripemd160 1 1 và phân tích các công cụ hỗ trợ, một số công cụ hữu ích đã được lựa chọn để hỗ trợ việc phát hiện lỗi và lỗ hổng bảo mật trong chuỗi mã, bao gồm:

• Testing được sử dụng để kiểm tra tính đúng đắn của chuỗi mã Cụ thể,testing giúp đảm bảo các hàm và phương thức hoạt động đúng như thiết kế và trả về kết quả mong đợi Công cụ này hỗ trợ đắc lực trong việc phát hiện các lỗi phát sinh khi sửa đổi mã nguồn, đặc biệt là các lỗi ảnh hưởng đến các chức năng khác Tuy nhiên, testing chưa hỗ trợ kiểm thử tích hợp giữa các thành phần của hệ thống.

Golangci-lint sử dụng nhiều công cụ phân tích mã nguồn để phát hiện vấn đề tiềm ẩn, bao gồm cả vấn đề bảo mật Công cụ này hỗ trợ phát hiện và sửa các lỗi phổ biến, đảm bảo tuân thủ các quy tắc lập trình và đề xuất cải tiến chất lượng mã nguồn.

• Gosec là một công cụ phân tích mã nguồn tĩnh chuyên dụng cho việc phát hiện các lỗ hổng bảo mật trong ngôn ngữ Go Việc sử dụng gosecgiúp phát hiện và xử lý sớm các lỗ hổng bảo mật trong quá trình phát triển, từ đó nâng cao tính bảo mật cho ứng dụng Trong luận văn này,gosecđã hỗ trợ phát hiện ra một thuật toán băm yếu là MD5 Gosec tập trung vào việc phát hiện các lỗ hổng cơ bản và phổ biến Tuy nhiên, đối với những lỗ hổng phức tạp, liên quan đến sự tương tác giữa nhiều thành phần của hệ thống, gosec có thể bỏ qua Ví dụ như gosec không thể phát hiện được lỗ hổng do cấu hình không đúng của hệ thống.

Bằng việc sử dụng công cụ kiểm chứng, những hàm chức năng hoặc biến không được sử dụng sẽ được phát hiện và loại bỏ, tạo ra mã sạch và dễ đọc Điều này giúp cải thiện hiệu suất và khả năng bảo trì của mã nguồn Bên cạnh đó, các công cụ kiểm chứng cũng giúp khắc phục các lỗ hổng về thuật toán yếu hay lỗi của hàm mà không được kiểm tra Các công cụ kiểm thử nhưtesting,gosec,golangci- lintvà các công cụ tương tự đóng vai trò quan trọng trong việc đảm bảo chất lượng mã nguồn Các công cụ này có thể tự động hóa quá trình kiểm tra, phát hiện và báo cáo các lỗi, giúp nâng cao hiệu quả của quy trình phát triển phần mềm Tuy nhiên, chúng không thể thay thế được con người Testing chỉ hỗ trợ kiểm thử ở mức độ đơn vị, mà không dành cho việc kiểm thử tích hợp giữa các thành phần của hệ thống Đây là một hạn chế đáng kể, vì việc kiểm thử tích hợp rất quan trọng để đảm bảo các thành phần hoạt động chính xác khi được kết hợp với nhau Tương tự,gosecmặc dù có thể phát hiện một số lỗ hổng bảo mật, nhưng không thể phát hiện những lỗi phức tạp hoặc lỗi do cấu hình hệ thống Do đó, việc kiểm thử thủ công là điều cần thiết để đảm bảo hệ thống hoạt động đúng như mong đợi Kiểm thử viên có thể thiết kế các kịch bản kiểm thử phức tạp, kiểm tra các tình huống cụ thể và đánh giá toàn diện hơn về chất lượng của hệ thống Sự phối hợp giữa các công cụ tự động hóa và kiểm thử thủ công là cách tiếp cận hiệu quả nhất để đảm bảo chất lượng phần mềm.

Kiểm thử tính bảo mật trên mạng thử nghiệm

Việc đánh giá tính bảo mật của mạng Hyperledger Fabric được thực hiện thông qua triển khai mạng thử nghiệm gồm hai máy chủ Mỗi giao dịch trên mạng này phải trải qua quá trình xác thực của cả hai máy chủ Điều này đảm bảo tính nhất quán của dữ liệu và chống lại các hành vi giả mạo.

Một chaincode đơn giản cho phép ghi và truy vấn dữ liệu được triển khai trong tệp chaincode/main.go.

1 // Khai báo package trong Go

5 "github.com/hyperledger/fabric-contract-api-go/contractapi"

8 // Định nghĩa một hợp đồng thông minh được xác định bằng cách nhúng

15 func (s *SmartContract) CreateKey(ctx contractapi.TransactionContextInterface, key string, val string) error {

16 return ctx.GetStub().PutState(key, []byte(val))

20 func (s *SmartContract) QueryKey(ctx contractapi.TransactionContextInterface, key string) (string, error) {

21 val, err := ctx.GetStub().GetState(key)

23 return "", fmt.Errorf("failed to get from world state %s", err.Error())

28 // Hàm chạy chính của chương trình

30 // Tạo một đối tượng chuỗi mã từ hợp đồng thông minh

31 chaincode, err := contractapi.NewChaincode(new(SmartContract))

33 fmt.Printf("Error creating chaincode: %s", err.Error())

39 fmt.Printf("Error starting chaincode: %s", err.Error())

Chuỗi mã được triển khai bằng lệnh /network.sh deployCC -ccn basic -ccp /smart- contract/chaincode -ccl go Kết quả thực thi lệnh được hiển thị trong hình 5.2.

Vùng được khoanh đỏ trong hình, minh họa trạng thái chấp thuận của chuỗi mã bởi hai tổ chức tham gia mạng.

Hình 5.2: Triển khai chuỗi mã thành công.

5.2.3 Tạo giao dịch thêm mới Để minh họa quy trình xác thực giao dịch, một giao dịch thêm mới dữ liệu sử dụng hàmCreateKey được thực hiện với xác thực chỉ từ một tổ chức Kết quả truy vấn sau đó bằng hàm QueryKey không trả về dữ liệu như mong đợi, được minh họa trong hình 5.3 Tiếp theo, giao dịch thêm mới dữ liệu được thực hiện lại với xác thực từ cả hai máy chủ Lần này, kết quả truy vấn trả về dữ liệu mong muốn, như được hiển thị trong hình 5.4 Thử nghiệm này cho thấy tầm quan trọng của việc xác thực giao dịch bởi đủ số lượng tổ chức yêu cầu để đảm bảo tính hợp lệ và nhất quán của dữ liệu trên mạng Hyperledger Fabric.

Hình 5.3: Kiểm thử với một máy chủ.

Hình 5.4: Kiểm thử với hai máy chủ.

Khi chuyển từ môi trường thử nghiệm sang môi trường sản xuất, việc thiết kế một kiến trúc mạng phù hợp là vô cùng quan trọng Số lượng máy chủ cần được xác định dựa trên yêu cầu về tính sẵn sàng và khả năng chịu lỗi của hệ thống Việc tăng số lượng máy chủ và sử dụng một hệ thống sắp xếp phân tán không chỉ giúp đảm bảo tính liên tục của dịch vụ mà còn tăng cường độ tin cậy và bảo mật của mạng Những yếu tố này đóng vai trò then chốt trong việc xây dựng một hệ thốngHyperledger Fabric mạnh mẽ và hiệu quả cho môi trường sản xuất.

Hiện nay, việc lưu trữ dữ liệu trên hệ thống SCADA thường được thực hiện thông qua các hệ quản trị cơ sở dữ liệu truyền thống, tuy nhiên phương pháp này có thể dễ dàng bị tấn công bởi các kẻ xâm nhập hoặc có thể bị thay đổi để tạo ra thông tin sai lệch, từ đó dẫn đến những quyết định không chính xác từ phía người vận hành và gây ra những hậu quả nghiêm trọng Vì vậy, luận văn đề xuất sử dụng công nghệ chuỗi khối để lưu trữ dữ liệu thay vì sử dụng cơ sở dữ liệu truyền thống. Công nghệ chuỗi khối, với những ưu điểm như tính không thể thay đổi, tính phi tập trung và tính minh bạch, sẽ mang lại một môi trường lưu trữ dữ liệu an toàn hơn và đáng tin cậy hơn.

Trên cơ sở hệ thống doanh nghiệp của môi trường SCADA, việc lựa chọn một chuỗi khối phù hợp với môi trường doanh nghiệp là một vấn đề quan trọng được nêu ra trong luận văn, với nền tảng Hyperledger Fabric được đề xuất làm phương án thử nghiệm lưu trữ dữ liệu SCADA Dù vậy, cần lưu ý rằng Hyperledger Fabric vẫn còn một số khó khăn và hạn chế so với các cơ sở dữ liệu truyền thống Cụ thể, khả năng mở rộng và xử lý tải lớn của Hyperledger Fabric có thể gặp hạn chế nhất định, đặc biệt khi số lượng thành viên trong mạng lưới tăng lên, làm ảnh hưởng tới khả năng mở rộng của nền tảng và gây khó khăn trong việc xử lý lượng lớn giao dịch.

Một trong những khó khăn của Hyperledger Fabric là khả năng tìm kiếm và truy vấn dữ liệu Do tập trung vào tính bảo mật và quyền riêng tư, Hyperledger

Fabric thiếu một công cụ truy vấn mạnh mẽ như ngôn ngữ truy vấn SQL trong các cơ sở dữ liệu truyền thống Điều này gây khó khăn trong việc thực hiện các truy vấn phức tạp và tìm kiếm dữ liệu linh hoạt Trong tương lại, luận văn hướng đến giải quyết khó khăn này là sử dụng một cơ sở dữ liệu phụ để lưu trữ thông tin hỗ trợ cho việc tìm kiếm và truy vấn Trong hệ thống này, dữ liệu liên quan đến tìm kiếm và truy vấn sẽ được lưu trữ trong cơ sở dữ liệu phụ, trong khi Hyperledger Fabric vẫn giữ vai trò lưu trữ dữ liệu chính dưới dạng khóa - giá trị Khi có yêu cầu tìm kiếm hoặc truy vấn, hệ thống sẽ truy xuất thông tin từ cơ sở dữ liệu phụ để tìm kiếm và truy vấn dữ liệu liên quan Kết quả thu được sẽ được sử dụng để thực hiện tìm kiếm thông tin cụ thể trên Hyperledger Fabric Bằng cách kết hợp sử dụng cả Hyperledger Fabric và cơ sở dữ liệu phụ có thể vượt qua hạn chế về khả năng tìm kiếm và truy vấn dữ liệu của Hyperledger Fabric Hệ thống sẽ trở nên linh hoạt hơn và có khả năng thực hiện các truy vấn phức tạp và tìm kiếm dữ liệu theo yêu cầu. Để đảm bảo chất lượng mã, luận văn áp dụng một quy trình bao gồm kiểm chứng và kiểm thử Kiểm chứng giúp phát hiện và sửa chữa những lỗi cú pháp, lỗ hổng bảo mật trong mã nguồn Việc này, đảm bảo rằng mã tuân thủ các tiêu chuẩn lập trình và ngăn ngừa các lỗi cơ bản Kiểm thử được thực hiện để đảm bảo tính đúng đắn của hệ thống Thông qua quy trình kiểm chứng và kiểm thử, chất lượng mã được đảm bảo và phần mềm có thể hoạt động một cách chính xác, đáp ứng đầy đủ các yêu cầu của hệ thống và đáng tin cậy Luận văn tiến hành đánh giá hiệu quả của các công cụ kiểm tra như gosec và golangci-lint trong việc phát hiện các lỗi và lỗ hổng bảo mật Các công cụ đã được sử dụng để xác định các vấn đề trong mã nguồn, tuy nhiên chúng chỉ giúp phát hiện các lỗi mà chưa thực sự cung cấp các giải pháp sửa chữa Để giải quyết hạn chế trên, luận văn đã cải tiến công cụ gosecbằng cách bổ sung thêm tính năng đề xuất giải pháp sửa lỗi Qua đó, giúp quá trình sửa lỗi trở nên hiệu quả hơn, thay vì chỉ dừng lại ở việc phát hiện các lỗi. Tính năngđề xuất giải pháp sửa lỗiđã được tích hợp và xuất bản chính thức trong mã nguồn của công cụgosec.

Mã nguồn trong chương 4 được sử dụng trong đề tài có tên "Nghiên cứu xây dựng phần mềm nền tảng để phát triển các ứng dụng cho hệ thống SCADA có sử dụng công nghệ chủ chốt của cách mạng công nghiệp lần thứ 4 (CMCN 4)" Đề tài này thuộc công trình nghiên cứu "Công việc 3.14.1 Nghiên cứu tổng quan về các phương pháp xây dựng ứng dụng cho di động".

[1] Next what is scada? supervisory control and data acquisition – defining the system, 12 2021 URL https://premioinc.com/blogs/blog/what-i s-scada-supervisory-control-and-data-acquisition-definin g-the-system.

[2] Is scada a data historian?, 12 2022 URL https://www.empoweredautom ation.com/is-scada-a-data-historian.

[3] Cole Wangsness What is a scada system and how does it work?, 09 2023. URL https://www.onlogic.com/company/io-hub/what-is-a-scada -system-and-how-does-it-work/#.

[4] Lorenzo Stella Looking where not allowed — navigating databases with sql injection, 08 2023 URL https://medium.com/@starlaurentius/not -allowed-to-know-navigating-databases-with-sql-injection-2 777a40e2e4.

[5] Steve The dangers of storing files on the cloud, 04 2023 URL https: //ghostvolt.com/blog/the-dangers-of-storing-files-on-the-c loud.html.

[6] Introduction URL https://hyperledger-fabric.readthedocs.io/e n/latest/blockchain.html.

[7] G Martuscelli L Foschini, A Gavagna and R Montanari Hyperledger fabric blockchain: Chaincode performance analysis 2020 URL https://10.1109/ICC40277.2020.9149080.

[8] V Ravi D Koundal R Amin S Ramzan, A Aqdus and M A Al Ghamdi Healthcare applications using blockchain technology: Motivations and challenges 08 2022 URL https://doi.org/10.1109/TEM.2022.3 189734.

[9] S Ramasubbareddy M Daneshmand B K Mohanta, D Jena and A H. Gandomi Addressing security and privacy issues of iot using blockchain technology 01 2021 URL https://doi.org/10.1109/JIOT.2020.30 08906.

[10] Laghari A.A Li P et al Khan, A.A The collaborative role of blockchain, artificial intelligence, and industrial internet of things in digitalization of small and medium-size enterprises 01 2023 URL https://doi.org/ 10.1038/s41598-023-28707-9.

[11] Kazuhiro Yamashita, Yoshihide Nomura, Ence Zhou, Bingfeng Pi, and Sun Jun Potential risks of hyperledger fabric smart contracts In 2019 IEEE International Workshop on Blockchain Oriented Software Engineering (IWBOSE), pages 1–10, 2019 doi: 10.1109/IWBOSE.2019.8666486.

Smart contract vulnerability detection techniques for Hyperledger Fabric are crucial to ensure the security of blockchain systems Neelkumar K Shah and his colleagues at the 2023 IEEE 8th International Conference for Convergence in Technology presented a comprehensive analysis of these techniques, highlighting their significance in protecting blockchain-based applications from malicious actors.

[13] Jiaxin Yu, Peng Liang, Yujia Fu, Amjed Tahir, Mojtaba Shahin, Chong Wang, and Yangxiao Cai Security code review by large language models,

2024 URL https://arxiv.org/abs/2401.16310.

[14] Berkay Berabi, Alexey Gronskiy, Veselin Raychev, Gishor Sivanrupan, Victor Chibotaru, and Martin Vechev Deepcode ai fix: Fixing security vulnerabilities with large language models, 2024 URL https://arxiv.or g/abs/2402.13291.

[15] SCADA International Learn all about scada systems: What is scada?, 2023.URLhttps://scada-international.com/what-is-scada/.

[16] Scada system - scada info URLhttps://www.scadainfo.com/scada-s ystem/.

[17] Kolin Paul Geeta Yadav Architecture and security of scada systems: A review 2020.

[18] A Aborujilah M Irfan Shahzad, S Musa The scada review: System components, architecture, protocols and future security trends Science Publications, 2014.

[19] Data historian URLhttps://www.empoweredautomation.com/data-h istorian.

[20] INERY PTE LTE Why centralized database management is redundant and outdated, 05 2023 URL https://hackernoon.com/why-centralized -database-management-is-redundant-and-outdated.

[21] Blockchain – wikipedia URLhttps://vi.wikipedia.org/wiki/Bloc kchain.

[22] Satoshi Nakamoto Bitcoin: A peer-to-peer electronic cash system URL Bitcoin:APeer-to-PeerElectronicCashSystem.

[23] Historical snapshot - 20 october 2016, 2016 URL https://coinmarket cap.com/historical/20161020/.

[25] Rubina Lakhani Karim Sultan, Umar Ruhi Conceptualizing blockchains: Characteristics applications 2018.

[26] Hamid R Barzegar Nabil El Ioini Claus Pahl Jan Werth, Mohammad Hajian Berenjestanaki A review of blockchain platforms based on the scalability,security and decentralization trilemma SN Computer Science,

[27] Bộ ba bất khả thi của blockchain (blockchain trilemma) là gì?, 05 2023 URL https://www.okx.com/vi/learn/blockchain-trilemma-guide.

[28] ABDELHAKIM SENHAJI HAFID ABDELATIF HAFID and MUSTAPHA SAMIH Scaling blockchains: A comprehensive survey IEEE Access, 2020.

[29] Ittay Eyal Adem Efe Gencer Ari Juels Ahmed Kosba Kyle Croman, Christian Decker On scaling decentralized blockchains URL https: //www.initc3.org/files/scaling2016.pdf.

[30] Bahareh Lashkari and Petr Musilek A comprehensive review of blockchain consensus mechanisms IEEE Access, 9:43620–43652, 2021 doi: 10.1109/

[31] Shyamli Jha The complete guide for types of blockchain! URL https: //www.simplilearn.com/tutorials/blockchain-tutorial/types-o f-blockchain.

[32] Hybrid blockchain URLhttps://www.geeksforgeeks.org/hybrid-b lockchain/.

[33] Blockchain structure, 11 2022 URLhttps://www.geeksforgeeks.org/ blockchain-structure/.

[34] Ledger, URLhttps://hyperledger-fabric.readthedocs.io/en/re lease-1.3/ledger/ledger.html.

[35] Hyperledger fabric model, URLhttps://hyperledger-fabric.read thedocs.io/en/release-2.5/fabric_model.html#assets.

[36] Fabric sample network, URLhttps://hyperledger-fabric.readthed ocs.io/en/release-2.5/network/network.html.

[37] Fabric transaction flow, URL https://hyperledger-fabric.readth edocs.io/en/release-2.5/txflow.html.

[38] Hyperledger fabric use cases and case studies, URL https://101block chains.com/hyperledger-fabric-use-cases/.

Ngày đăng: 02/10/2024, 10:53

HÌNH ẢNH LIÊN QUAN

Hình 2.1: Kiến trúc các thành phần trong hệ thống SCADA[17]. - Ứng dụng công nghệ chuỗi khối Để tăng cường an toàn cho các hệ thống scada
Hình 2.1 Kiến trúc các thành phần trong hệ thống SCADA[17] (Trang 18)
Hình 2.2: Bộ ba bất khả thi của chuỗi khối[27]. - Ứng dụng công nghệ chuỗi khối Để tăng cường an toàn cho các hệ thống scada
Hình 2.2 Bộ ba bất khả thi của chuỗi khối[27] (Trang 21)
Bảng 2.1: So sánh đặc điểm các loại chuỗi khối - Ứng dụng công nghệ chuỗi khối Để tăng cường an toàn cho các hệ thống scada
Bảng 2.1 So sánh đặc điểm các loại chuỗi khối (Trang 24)
Hình 2.3: Kiến trúc chuỗi khối[33]. - Ứng dụng công nghệ chuỗi khối Để tăng cường an toàn cho các hệ thống scada
Hình 2.3 Kiến trúc chuỗi khối[33] (Trang 25)
Hình 2.4: Cấu trúc mạng cơ bản[36]. - Ứng dụng công nghệ chuỗi khối Để tăng cường an toàn cho các hệ thống scada
Hình 2.4 Cấu trúc mạng cơ bản[36] (Trang 28)
Hình 2.5: Luồng thực hiện một giao dịch Hyperledger Fabric[37]. - Ứng dụng công nghệ chuỗi khối Để tăng cường an toàn cho các hệ thống scada
Hình 2.5 Luồng thực hiện một giao dịch Hyperledger Fabric[37] (Trang 30)
Hình 3.1: Tổng quan hệ thống SCADA kết hợp Fabric. - Ứng dụng công nghệ chuỗi khối Để tăng cường an toàn cho các hệ thống scada
Hình 3.1 Tổng quan hệ thống SCADA kết hợp Fabric (Trang 34)
Hình 3.2: Màn hình đăng nhập. - Ứng dụng công nghệ chuỗi khối Để tăng cường an toàn cho các hệ thống scada
Hình 3.2 Màn hình đăng nhập (Trang 36)
Hình 3.3: Màn hình hiển thị thông số của cảm biến khi vượt ngưỡng. - Ứng dụng công nghệ chuỗi khối Để tăng cường an toàn cho các hệ thống scada
Hình 3.3 Màn hình hiển thị thông số của cảm biến khi vượt ngưỡng (Trang 37)
Hình 3.4: Màn hình tìm kiếm sự kiện. - Ứng dụng công nghệ chuỗi khối Để tăng cường an toàn cho các hệ thống scada
Hình 3.4 Màn hình tìm kiếm sự kiện (Trang 38)
Bảng 4.1: Cấu trúc thư mục. - Ứng dụng công nghệ chuỗi khối Để tăng cường an toàn cho các hệ thống scada
Bảng 4.1 Cấu trúc thư mục (Trang 43)
Bảng 4.5: Thông tin sự kiện. - Ứng dụng công nghệ chuỗi khối Để tăng cường an toàn cho các hệ thống scada
Bảng 4.5 Thông tin sự kiện (Trang 46)
Bảng 5.2: Số lỗi được phát hiện bởi các công cụ - Ứng dụng công nghệ chuỗi khối Để tăng cường an toàn cho các hệ thống scada
Bảng 5.2 Số lỗi được phát hiện bởi các công cụ (Trang 67)
Hình 5.1: Kết quả chạy gosec cùng với tính năng đề xuất giải pháp. - Ứng dụng công nghệ chuỗi khối Để tăng cường an toàn cho các hệ thống scada
Hình 5.1 Kết quả chạy gosec cùng với tính năng đề xuất giải pháp (Trang 69)
Bảng 5.3: Báo cáo kết quả sửa lỗi tự động của Gemini. - Ứng dụng công nghệ chuỗi khối Để tăng cường an toàn cho các hệ thống scada
Bảng 5.3 Báo cáo kết quả sửa lỗi tự động của Gemini (Trang 70)