Bảo mật cho giao thức MQTT trong Internet of Things

GIỚI THIỆU VỀ CÁC PHƯƠNG PHÁP BẢO MẬT CHO GIAO THỨC MQTT
TRONG HỆ THỐNG INTERNET OF THINGS

Tại sao bảo mật là điều cần thiết cho Internet of Things?
Khi nói đến Internet of Things là nói đến sự kết nối internet của mọi vật từ tivi, tủ lạnh, điều hòa cho đến xe cộ, máy móc… Và với sự gia tăng chóng mặt của các thiết bị và dữ liệu, sự an toàn của các hệ thống IoTs luôn là vấn đề lớn; lỗ hỗng bảo mật của các hệ thống thông minh hiện nay rất nhiều, tạo điều kiện cho tin tặc dễ dàng tấn công và khai thác. Vì vậy bảo mật cho Internet of Things là vấn đề cần quan tâm hàng đầu. Bài viết này sẽ giới thiệu về các nguyên tắc bảo mật dùng trong một hệ thống IoTs nói chung và giao thức MQTT nói riêng.

Hướng tiếp cận
Bảo mật trong MQTT được chia thành nhiều lớp. Mỗi lớp có tác dụng ngăn ngừa các kiểu tấn công khác nhau. Giao thức MQTT được tạo ra với mục đích là cung cấp giao thức truyền thông thực sự nhẹ và dễ sử dụng cho các ứng dụng Internet of Things, vì vậy bản thân giao thức chỉ cung cấp một vài cơ chế bảo mật đơn giản. Nhưng khi triễn khai một dự án thực tế đòi hỏi sự an toàn dữ liệu cao, thì các tiêu chuẩn bảo mật hiện đại khác sẽ được sử dụng. Thông thường có 3 lớp bảo mật được sử dụng:
Lớp mạng (Network layer): Sử dụng một mạng bảo mật vật lý hoặc công nghệ VPN (virtual private network) làm nền tảng cho quá trình giao tiếp giữa các Client và Broker nhằm cung cấp một kết nối an toàn và đáng tin cậy.
Lớp giao vận (Transport layer): Với mục đích cung cấp tính bảo mật ở lớp này, TLS/SSL đang được sử dụng rộng rãi để mã hóa dữ liệu. Giao thức bảo mật này cung cấp sự an toàn cho dữ liệu nhằm đảm bảo không ai có thể đọc trộm nội dung trong quá trình truyền tin ngoài client và server, ngoài ra giao thức còn sử dụng các chứng chỉ xác thực số nhằm xác thực thông tin ở cả hai phía client và server.
Lớp ứng dụng (Application layer): Nếu ở lớp giao vận có thể đảm bảo rằng thông tin liên lạc giữa Client và Server được mã hóa và có thể xác thực thông tin lẫn nhau thì ở lớp ứng dụng giao thức MQTT cung cấp hình thức bảo mật đó là sử dụng định danh máy khách (Client identifier) và thông tin đăng nhập username/password. Việc triển khai các thuộc tính bảo mật này nhằm kiểm soát quyền truy cập của các client nằm trong quyền hạn của MQTT broker. Ngay cả khi không có mã hóa tầng giao vận, thì bảo mật lớp ứng dụng vẫn có khả năng giúp cho thông tin truyền đi được bảo mật bằng cách sử dụng cơ chết mã
hóa nội dung gói tin (payload encryption).

Nội dung bài viết này sẽ đi sâu vào cách thức bảo mật ở 2 lớp là lớp giao vận và lớp ứng dụng của giao thức MQTT

Bảo mật lớp ứng dụng (Application Layer Sercurity)
a. Xác thực với Username và Pasword:
Xác thực (authentication) là một phần của cơ chế bảo mật ở tầng giao vận và tầng ứng dụng được sử dụng trong giao thức MQTT, là hành động nhằm xác nhận sự thật hay nguồn gốc của một thuộc tính của một đơn vị dữ liệu hoặc một thực thể nào đó. Khi nói đến xác thực trong giao thức MQTT, bản thân giao thức cung cấp các trường username (tên người dùng) và password (mật khẩu) trong gói tin CONNECT từ client gửi đến broker. Nghĩa là một client có khả năng gửi một username và password khi kết nối đến MQTT broker.

CONNECT message

Trường username là một chuỗi có định dạng UTF-8 và trường password là dữ liệu nhị phân với kích thước tối đa là 65535 bytes. Sự bất cập trong phiên bản MQTT v3.1 là sử dụng mật khẩu với 12 ký tự đã được bãi bỏ ở phiên bản MQTT v3.1.1. Ngoài ra phiên bản này cũng định nghĩa rằng: một client có thể có username mà không cần password nhưng không thể tồn tại trạng thái ngược lại. Khi sử dụng xác thực bằng tên người dùng và mật khẩu, MQTT broker sẽ đánh giá thông tin client dựa trên cơ chế xác thực đã được triễn khai và gửi trả về gói tin phản hồi gọi là CONNACK, trong đó bao gồm một mã trạng thái gọi là return code

CONNACK message

Các mã trạng thái được sử dụng để phản hồi về client đối với xác thực bằng username/password là:

b. Xác thực với Client Identifier
Mỗi MQTT client đều có một mã nhận dạng duy nhất được gọi là client identifier. Tương tự như Username/Password, mã nhận dạng này cũng được cung cấp bởi client khi gửi một gói tin CONNECT đến broker, được cung cấp trong trường clientid. Giá trị của trường có thể chứa tối đa 65535 ký tự, trường hợp thường được sử dụng trong thực tế để thể hiện giá trị của trường clientid là sử dụng chuẩn UUID gồm 36 ký tự để tạo ra các giá trị random không trùng nhau hoặc sử dụng địa chỉ MAC của thiết bị. Và trong gói tin phản hồi kết nối CONNACK, cũng sẽ bao gồm mã trạng thái, tất cả các trạng thái trả về được cho trong bảng sau:

Trong quá trình xác thực, mã nhận dạng của client thường được sử dụng để xác thực bên cạnh tên người dùng và mật khẩu. Mặc dù không phải là cách thức bảo mật tốt khi sử dụng trong thực tiễn tuy nhiên đối với các hệ thống khép kín và ít thiết bị thì loại xác thực này cũng đủ để chúng ta cân nhắc sử dụng.

Bảo mật lớp giao vận (Transport Layer Sercurity)
a. Giới thiệu về TLS
TLS (Transport Layer Sercurity) và SSL (Secure Sockets Layer) cung cấp một kênh truyền thông an toàn giữa client và server. Cụ thể hơn, TLS/SSL là các giao thức mã hóa sử dụng cơ chế handshake (bắt tay) để tạo kết nối an toàn giữa máy khách và máy chủ. Sau khi hoàn thành các bước “handshake”, một kênh giao tiếp mã hóa giữa client và server được thiết lập và đảm bảo không kẻ tấn công nào có khả năng nghe trộm thông tin trong suốt quá trình giao tiếp. Server cung cấp một X509 certificate, là chứng chỉ thường được phát hành bởi một cơ quan tin cậy, và client sẽ sử dụng để chứng thực danh tính của
server.
b. MQTT và TLS
Thông thường giao thức MQTT dựa vào TCP làm giao thức tầng giao vận, nghĩa là mặc định kết nối giữa broker và client là kết nối không bảo mật. Để tăng tính bảo mật và có khả năng mã hóa các kênh giao tiếp, hầu hết các MQTT broker hiện nay như Mosquitto, HiveMQ đều cho phép sử dụng TLS. Port 8883 được chuẩn hóa để sử dụng cho kết nối MQTT có bảo mật. Tên được đặt theo tổ chức IANA là “secure-mqtt” và port 8883 được dành riêng cho giao thức MQTT sử dụng TLS. Tuy nhiên, dễ đoán rằng có một nhược điểm khi sử dụng TLS cho giao thức MQTT đó là tăng tính bảo mật đồng nghĩa với tiêu tốn năng lượng cho CPU nhiều hơn và quá trình giao tiếp sẽ không mượt mà như mọi khi. Mặc dù so với TCP thông thường, việc sử dụng CPU dành cho giao thức bảo mật TLS nhiều hơn không đáng kể nhưng đối với các thiết bị được thiết kế dành cho một nhiệm vụ chuyên sâu nào đó rất hạn chế về tốc độ, bộ nhớ hay băng thông kênh truyền thì đó là một vấn đề lớn. Vì vậy kỹ thuật Session Resump thường được sử dụng để tăng hiệu suất khi sử dụng TLS, đây là một kỹ thuật dùng để nối lại phiên làm việc cũ mà không cần bắt đầu lại tất cả các bước “handshake”.

Minh họa SSL/TLS handshake

Kết luận
Bài viết này mình đã giới thiệu tổng quan về bảo mật trong giao thức MQTT, cụ thể là bảo mật tầng ứng dụng và tầng giao vận. Trong các bài viết tiếp theo mình sẽ đi sâu hơn và hướng dẫn các bạn triển khai hệ thống Internet of Thinsgs sử dụng MQTT Security.

Thuong Nguyen