Đang tải... (xem toàn văn)
Điều đó giúp giao thức TCP được ứng dụng chủ yếu trong những hoạt động cần độ chính xác cao như truyền tải trang web, truyền tải email, hay kho lưu trữ điện toán đám mây,… Ngược lại, gia
Trang 1HỌC VIỆN KỸ THUẬT MẬT MÃKHOA AN TOÀN THÔNG TIN
-BÁO CÁO MÔN HỌCKỸ THUẬT LẬP TRÌNH
Đề Tài
Ứng Dụng An Toàn Socket Programing
Sinh Viên Thực Hiện :
Mai Hoàng Anh-AT180303 Nguyễn Duy Khánh-AT180325
Giảng Viên Hướng Dẫn:
GV:Bùi Việt Thắng
Khoa An toàn thông tin – Học viện Kỹ thuật mật mã
Trang 3LỜI CẢM ƠN
Lời đầu tiên, nhóm chúng em xin chân thành gửi lời cảm ơn đến thầy NguyễnMạnh Thắng – giảng viên khoa An toàn thông tin trường Học viện Kỹ thuật MậtMã
đã tạo điều kiện cũng như cung cấp kiến thức, đồng thời đưa ra những lời khuyêncần thiết để chúng em có thể hoàn thành đề tài này.
Hà Nội, ngày 1 tháng 4 năm 2024
Trang 4MỤC LỤC
MỤC LỤC 3
DANH MỤC CHỮ VIẾT TẮT 5
DANH MỤC BẢNG: Bảng 1.4 Chi tiết tham số của hàm socket() 18
Bảng 1.5: Phương thức dùng trong giao tiếp Client/Server 18
Bảng 1.6: Một số phương thức hỗ trợ thu thập thông tin 19
DANH MỤC HÌNH VẼ : Hình 1.1: Cấu trúc socket 7
Hình 1.2 Quá trình bắt tay 3 bước 12
Hình 1.3 Cơ chế hoạt động của stream socket 13
Hình 2.1 SSL Handshake 24
LỜI NÓI ĐẦU 6
Chương I: GIỚI THIỆU VỀ SOCKET PROGRAMING1.1 Tổng quan về Socket và mục đích của Socket Programing 7
1.4.2 Giới thiệu module socket trong Python 17
CHƯƠNG II - ỨNG DỤNG AN TOÀN SOCKET PROGRAMING 20
2.1 Các nguy cơ bảo mật trong Socket Programing 20
2.1.1 Thiếu xác thực trong quá trình bắt tay 20
2.1.2 Kênh TCP không được mã hóa 20
Trang 52.2 Các phương pháp bảo mật 21
2.2.1 Xác thực người dùng 21
2.2.2 Giao thức SSL/TLS 22
CHƯƠNG III – THỰC NGHIỆM 27
3.1 Tổng quan mô hình xây dựng bài toán 27
3.2 Tiến hành 27
3.2.1 Xác thực người dùng trong giao tiếp Client – Server 27
3.2.2 Triển khai giao thức SSL/TLS trong giao tiếp Client – Server 33
TÀI LIỆU THAM KHẢO 50
Trang 6HMAC Hash-based Message Authentication CodeHTTP Hypertext Transfer Protocol
IETF Internet Engineering Task ForceIoT Internet of Things
IP Internet Protocol
NIST National Institute of Standards and TechnologyOWASP Open Worldwide Application Security ProjectSCP Secure Copy Protocol
SQL Structured Query LanguageSSL Secure Sockets LayerTLS Transport Layer SecurityTCP Transmission Control ProtocolUDP User Datagram Protocol
XSS Cross-site Scripting
Trang 7LỜI NÓI ĐẦU
Trong thế giới kết nối mạng ngày nay, việc truyền dữ liệu qua mạng internetthông qua socket programming đã trở thành một phần không thể thiếu củacuộc sống hàng ngày và hoạt động kinh doanh Socket programming cung cấpkhả năng thiết lập kết nối giữa các thiết bị mạng từ xa, cho phép truyền dữliệu một cách linh hoạt và hiệu quả Tuy nhiên, điều quan trọng cần nhớ làviệc truyền dữ liệu qua mạng internet không chỉ đem lại lợi ích mà còn mở ranhiều rủi ro về an ninh thông tin
Trong một thế giới mà tin tặc luôn tìm cách tìm kiếm lỗ hổng để tấn công hệthống, việc bảo vệ dữ liệu trở nên cực kỳ quan trọng Socket programming,với tính linh hoạt và mạnh mẽ của nó, không nằm ngoài tầm ngắm của nhữngkẻ tấn công này Bất kỳ lỗ hổng nào trong ứng dụng có thể được lợi dụng đểxâm nhập vào hệ thống, đánh cắp dữ liệu quan trọng hoặc thậm chí là gây hạicho hệ thống
Bài báo cáo này sẽ đề cập đến những thách thức và giải pháp trong việc đảmbảo an toàn trong socket programming Bài này sẽ nói về các biện pháp bảomật cơ bản và nâng cao, từ việc sử dụng mã hóa dữ liệu đến cơ chế xác thựcvà kiểm soát truy cập Bằng cách hiểu rõ về những nguy cơ tiềm ẩn và ápdụng các kỹ thuật bảo mật phù hợp, người dùng có thể xây dựng những ứngdụng mạng an toàn và tin cậy, đóng góp vào sự phát triển bền vững củainternet và nền kinh tế số
Hy vọng rằng bài báo cáo này sẽ giúp độc giả có cái nhìn sâu sắc hơn về vấnđề an ninh mạng và truyền dữ liệu qua socket, đồng thời cung cấp cái nhìn vềcác biện pháp bảo mật hiện đại và tiên tiến nhất để đối phó với những tháchthức đó.
Trang 8CHƯƠNG I – GIỚI THIỆU VỀ SOCKET PROGRAMING1.1 Tổng quan về Socket và mục đích của Socket Programing
1.1.1 Tổng quan
a Socket và lập trình Socket
Socket là một điểm cuối của liên kết giao tiếp hai chiều (two-way
communication) giữa hai chương trình đang chạy trên mạng Nó hoạt động nhưmột cánh cửa kết nối, cung cấp khả năng truyền dữ liệu giữa các chương trìnhvới nhau.
Lập trình Socket là một mô hình lập trình cho phép giao tiếp giữa các tiến trình(ứng dụng/chương trình) qua mạng Nó cho phép các tiến trình chạy trên cácmáy
tính khác nhau trao đổi dữ liệu.b Cấu trúc
Socket được định nghĩa trong hệ điều hành bằng một cấu trúc, được xem nhưđiểm nối để hai chương trình giao tiếp với nhau Cấu trúc của socket có 5trường,
Trang 9Hình 1.1: Cấu trúc Socketc Phân loại
Có 4 loại Socket phổ biến:
− Stream Socket: Tên gọi khác của loại này là Socket hướng kết nối, hoạtđộng thông qua giao thức TCP (Transmission Control Protocol) Quá trình vậnhành diễn ra khi Server và Client đã kết nối với nhau Hình thức này có ưu điểmlà dữ liệu đảm bảo truyền đúng đến nơi nhận, thứ tự và thời gian nhanh chóng,chuẩn xác Mỗi thông điệp gửi đi đều có xác nhận trả về cho đối tượng thựchiện Qua đó, người dùng được thông báo thông tin đầy đủ Mặt khác, nhượcđiểm là giữa máy chủ và máy nhận chỉ có một IP Vì thế khi kết nối, một máyphải chờ đến khi đối tượng kia chấp nhận kết nối.
− Datagram Socket: còn được gọi là Socket không hướng kết nối Hìnhthức hoạt động với sự hỗ trợ của giao thức UDP (User Datagram Protocol).Datagram Socket hoạt động tốt ngay cả khi không thiết lập kết nối giữa hai máyvới nhau Các ưu điểm có thể kể đến của Datagram Socket là quá trình kết nối,truyền tải thông tin đơn giản, không yêu cầu quá nhiều thao tác Thời giantruyền
tải dữ liệu được đánh giá là cực nhanh chóng Thế nhưng, nó có một nhượcđiểm lớn là quá trình truyền thông tin chưa đảm bảo độ tin cậy, dữ liệu bên nhận
Trang 10có thể không đúng với thứ tự bên truyền hoặc bị lặp.
− WebSocket: Là công cụ hỗ trợ kết nối qua lại giữa Client và Server trên
Internet Quy trình diễn ra nhanh chóng, hiệu quả nhờ việc sử dụng TCP Socket.Không chỉ dùng riêng cho ứng dụng web, loại này có thể áp dụng với bất kỳmục đích trao đổi thông tin khác Điều cần đảm bảo là hoạt động diễn ra trênkhông gian mạng Loại này có ưu điểm như sau: Tăng cường tốc độ truyền tảithông tin giữa hai chiều Khi phát hiện lỗi rất dễ phát hiện và xử lý Cách sửdụng đơn giản, không cần cài đặt thêm các phần mềm bổ sung khác Không cầndùng nhiều phương pháp hỗ trợ kết nối khác nhau Trong khi đó, nhược điểmlà nó chưa thể chạy trên tất cả trình duyệt Điều tương tự xảy ra đối với dịch vụcó phạm vi yêu cầu, khó hỗ trợ hoàn toàn.
− Unix Socket: Đây là điểm giao tiếp, hỗ trợ trao đổi giữa các ứng dụngkhác nhau ngay trên cùng máy tính Mọi hoạt động được ghi nhận diễn ra ởnhân của hệ điều hành Nhờ vậy, tốc độ kết nối, truyền tải nhanh, nhẹ, đảm bảohiệu quả Đặc điểm của Unix Socket là tránh được các bước kiểm tra hoặcRouting Vì thế, quá trình truyền tin dễ dàng hơn nhiều Ngoài ra, một số ưuđiểm khác với dạng Endpoint này là: Có thể tăng cường tốc độ truy cập MySQLlên đến 30 – 50%, giảm độ trễ, từ 60ms chỉ còn 5ms Tăng cường PostgreSQLlên hơn 30% Tăng Redis lên 50% Nhược điểm tồn tại trong trường hợp ứngdụng nằm trên những máy chủ khác nhau Hệ thống sẽ không thể kết nối bằngUnix Socket Ngoài ra, vấn đề phân quyền giữa các tập tin đôi khi vẫn xảy ra.Ngoài ra, còn có một số loại Socket khác như Raw Socket, Sequenced PacketSocket, …
Trang 11gồm C, C++, Java, Python, v.v… Vì thế nó tương thích với hầu hết mọi đốitượng
người dùng với những cấu hình máy khác nhau.
Mục đích của lập trình Socket là tạo ra một cơ chế để ứng dụng có thể giao tiếpvới nhau qua mạng Điều này có vai trò quan trọng trong việc phát triển ứngdụng
mạng và giao tiếp giữa các thiết bị trên cùng một mạng Dưới đây là một số mụcđích cụ thể của việc sử dụng lập trình Socket.
Giao tiếp giữa các quy trình (process): Socket cho phép các quy trình trên cácmáy tính khác nhau giao tiếp với nhau Điều này rất hữu ích trong việc xây dựngứng dụng phân tán, nơi các phần của ứng dụng chạy trên các máy tính riêng biệtvà cần trao đổi dữ liệu.
Truyền dữ liệu: Socket cho phép các ứng dụng gửi và nhận dữ liệu qua mạng.Điều này cho phép truyền dữ liệu từ một máy tính đến một máy tính khác, hoặcgiữa các tiến trình trên cùng một máy tính Các gói tin này có thể chứa thông tinvề tin nhắn, tệp tin, hoặc bất kỳ dữ liệu nào khác.
Tạo liên kết giữa client và server: Khi một ứng dụng client muốn gửi dữ liệuđến
Trang 12server, nó sẽ tạo một socket và kết nối đến socket trên server thông qua mộtcổng.
Cổng là một số nguyên dương được sử dụng để xác định dịch vụ hoặc ứng dụng cụ thể trên server.
Hỗ trợ nhiều ngôn ngữ và hệ điều hành: Socket programming không chỉ hỗ trợcác ứng dụng viết bằng ngôn ngữ lập trình khác nhau (như Python, Java, C++, v.v.) giúp tận dụng sức mạnh của mỗi ngôn ngữ và tối ưu hóa hiệu suất mà còn hoạt động trên nhiều hệ điều hành khác nhau (như Windows, Linux, macOS,v.v.)
giúp việc lập trình tích hợp dễ dàng và tăng tính linh hoạt và tương thích vớinhiều
môi trường khác nhau.
1.2 Cơ chế hoạt động của Socket trong trao đổi dữ liệu qua Internet
Hiện nay, dữ liệu được truyền qua Internet thông qua hai giao thức chủ yếu là TCP và UDP Đối với giao thức TCP sử dụng Stream Socket, dữ liệu đượctruyền
bảo đảm tính toàn vẹn, độ tin cậy và thứ tự các gói tin Điều đó giúp giao thức TCP được ứng dụng chủ yếu trong những hoạt động cần độ chính xác cao như truyền tải trang web, truyền tải email, hay kho lưu trữ điện toán đám mây,… Ngược lại, giao thức UDP sử dụng Datagram Socket cung cấp một đường truyềnnhanh chóng, nhưng dữ liệu không thể đáng tin cậy và khó đảm bảo tính toànvẹn
như TCP Dễ thấy rằng, với những đặc tính như vậy, giao thức UDP được dùng trong những hoạt động mạng yêu cầu tính thời gian thực, hoặc không yêu cầu độ
Trang 13chính xác của dữ liệu quá cao Một số ứng dụng của giao thức UDP có thể kểđến
là truyền phát trực tiếp, trò chơi trực tuyến, hay các ứng dụng liên lạc thời gian thực như Zoom, Skype có thể chấp nhận một số mất mát dữ liệu mà không ảnh hưởng đến chất lượng cuộc gọi.
*Datagram Socket
Datagram Socket là một loại socket trong lập trình mạng được sử dụng để giaotiếp qua giao thức UDP Datagram Socket cho phép truyền dữ liệu dưới dạngcác
gói tin độc lập, không yêu cầu việc thiết lập kết nối trước Dưới đây là cơ chế hoạt động của Datagram Socket:
− Tạo và gán địa chỉ cho socket: Đầu tiên, ứng dụng muốn truyền dữ liệu cần phải tạo một Datagram Socket để thiết lập điểm kết nối trên máy tính Sauđó cần gán một địa chỉ IP và một số cổng cho socket, để socket có thể xác định được nơi nó sẽ lắng nghe hoặc gửi dữ liệu.
− Gửi dữ liệu: Khi cần gửi dữ liệu, ứng dụng sử dụng hàm gửi (sendto) đểgửi
dữ liệu qua socket Dữ liệu được gói vào các gói tin và gửi đi mà không cầnthiết lập kết nối trước.
− Nhận dữ liệu: Để nhận dữ liệu, ứng dụng sử dụng hàm nhận (recvfrom) đểlắng nghe các gói tin đến qua socket Khi một gói tin đến, ứng dụng nhận
được dữ liệu cùng với địa chỉ và cổng của nguồn gửi.
− Xử lý dữ liệu: Sau khi nhận dữ liệu, ứng dụng có thể xử lý nó theo yêu cầucủa mình, ví dụ: hiển thị dữ liệu lên giao diện người dùng, lưu trữ vào cơ sở
Trang 14dữ liệu, hoặc truyền tiếp cho các phần khác của ứng dụng.
*Stream Socket
Stream Socket được sử dụng trong giao thức TCP, cụ thể là trong quá trình bắt tay ba bước Quá trình này giúp thiết lập một kênh truyền an toàn giữa hai thực thể trong mạng Internet Đúng như tên gọi của nó, quy trình này có 3 bước cơbản
như sau:
Hình 1.2: Quá trình bắt tay 3 bước
− Đầu tiên, máy chủ A sẽ khởi tạo kết nối bằng cách gửi gói tin SYN đến máychủ đích Gói tin này chứa một số ngẫu nhiên(ví dụ:100) đánh dấu sự bắt đầucủa số thứ tự
cho dữ liệu mà máy chủ A sẽ truyền.
− Máy chủ đích nhận gói SYN của A, sau đó nó sẽ phản hồi lại bằng gói SYNlà số thứ tự của của máy A tăng thêm 1 (VD: 101), và gói ACK là số của máyserver (VD: 200) (số xác nhận)
− Máy chủ A sau khi nhận được 2 gói ACK và SYN từ máy chủ đích, cũng sẽ
Trang 15gửi lại một gói ACK xác nhận là số thứ tự của máy đích tăng thêm 1 (VD:102).
Sau khi 3 bước được thực hiện, kênh truyền giữa 2 máy đã được tạo và nó sẽduy
trì liên tục cho đến khi kết thúc quá trình truyền tin Để đi vào chi tiết hơn, hình sau sẽ nói về cơ chế hoạt động của Stream Socket:
Hình 1.3: Cơ chế hoạt động của Stream Socket
− Bước 1: Client sẽ tạo ra 1 socket có chức năng gửi yêu cầu kết nối với Server.Còn Server sẽ tạo 1 socket có chức năng lắng nghe và chấp nhận các yêu cầukết nối từ phía Client Quá trình tạo sẽ sử dụng hàm socket() Sau đó, hai bênsẽ gán địa chỉ đích và Port cho socket của mình.
− Bước 2: Socket ở phía Client sẽ gửi đi gói tin SYN như một yêu cầu kết nốibằng hàm connect(), trong khi socket ở Server sẽ lắng nghe yêu cầu bằnghàm listen() Khi “bắt” được yêu cầu từ phía Client, nó sẽ chấp nhận kết nối
Trang 16bằng hàm accept().
− Bước 3: Server sẽ tạo một socket mới có chức năng truyền và nhận dữ liệu.Sau đó, Client và Server sẽ trao đổi các gói tin ACK và SYN như đã trìnhbày ở trên qua socket này, tiếp theo chúng mới truyền và nhận dữ liệu củanhau qua hàm send() và recv().
− Bước 4: Sau khi quá trình trao đổi dữ liệu hoàn tất, tài nguyên trên socket sẽđược giải phóng bằng hàm close() Tuy nhiên socket không bị xóa hoàn toàn,mà sẽ có thể tái sử dụng nhằm tối ưu hiệu suất và tài nguyên của Server.Có thể thấy được, mỗi loại socket đều có ưu điểm, hạn chế, cũng như các ứngdụng đặc thù của riêng mình Nhưng chung quy lại, chúng đều phục vụ một mụcđích chung là trao đổi dữ liệu qua Internet.
1.3 Các ứng dụng của lập trình Socket
Lập trình Socket được sử dụng rộng rãi và có nhiều ứng dụng trong các lĩnh vựckhác nhau, bao gồm:
Giao tiếp Client-Server: Lập trình socket được sử dụng rộng rãi để cho phép
giao tiếp giữa máy khách và máy chủ trong môi trường mạng Máy chủ lắngnghe
các kết nối đến ở các port cụ thể, trong khi máy khách kết nối với máy chủ, cho phép chúng trao đổi dữ liệu và thực hiện nhiều tác vụ khác nhau như truyền tệp, truy cập từ xa và nhắn tin.
Web Server và Client: Máy chủ web, chứa các trang web và phục vụ trang
cho các máy khách (trình duyệt web), sử dụng lập trình socket để xử lý yêu cầu
Trang 17và phản hồi HTTP Tương tự, các máy khách (trình duyệt) sử dụng socket đểgiao
tiếp với các máy chủ khi truy xuất trang web, gửi yêu cầu HTTP và nhận phảnhồi.
Ứng dụng chat: Lập trình socket cho phép giao tiếp thời gian thực trong các
ứng dụng trò chuyện, cho phép người dùng gửi và nhận tin nhắn ngay lập tức Các máy chủ quản lý kết nối từ nhiều client và phân phối tin nhắn giữa chúng,tạo
điều kiện cho trò chuyện một-một hoặc trò chuyện nhóm.
Trò chơi trực tuyến đa người chơi: Lập trình socket rất quan trọng cho việc
triển các trò chơi trực tuyến đa người chơi, nơi người chơi tương tác thời gian thực với nhau Các máy chủ sử dụng socket để quản lý kết nối của người chơi,xử
lý logic trò chơi và đồng bộ hóa trạng thái trò chơi trên nhiều client, cho phéptrải
nghiệm chơi game có tính cộng tác và cạnh tranh.
Truy cập và điều khiển từ xa: Lập trình socket tạo điều kiện cho việc truy
nhập
và kiểm soát máy tính và các thiết bị từ xa qua mạng Các ứng dụng desktop từ xa và bộ giả lập terminal sử dụng socket để thiết lập kết nối giữa một thiết bị client và một hệ thống từ xa, cho phép người dùng truy cập và quản lý tàinguyên
từ xa Các hệ thống phân tán: Lập trình socket đóng một vai trò quan trọng trongviệc xây dựng các hệ thống phân tán, nơi nhiều thành phần độc lập giao tiếp với
Trang 18nhau qua mạng Các ứng dụng phân tán như cơ sở dữ liệu phân tán, hệ thống tệpphân tán và các trang tính phân tán phụ thuộc vào socket để giao tiếp giữa các tiến trình và trao đổi dữ liệu.
IoT: Trong các hệ thống IoT, các thiết bị tương tác với nhau và với các máy
chủ tập trung để thu thập dữ liệu, giám sát môi trường và điều khiển các đốitượng
vật lý Lập trình socket tạo điều kiện cho việc giao tiếp giữa các thiết bị IoT,cổng
thông tin và máy chủ đám mây, cho phép truyền dữ liệu thời gian thực, thu thập dữ liệu cảm biến và quản lý thiết bị.
Giám sát và quản lý mạng: Lập trình socket được sử dụng trong các công cụ
giám sát và quản lý mạng để thu thập thống kê, giám sát lưu lượng và quản lýcác
thiết bị mạng Các công cụ này sử dụng socket để giao tiếp với các thiết bịmạng,
thu thập thông tin và thực hiện các nhiệm vụ cấu hình.
Truyền dữ liệu: Các ứng dụng truyền tập tin như FTP và SCP sử dụng lập
socket để truyền tập tin giữa các client và máy chủ một cách an toàn Socket chophép truyền dữ liệu đáng tin cậy và hỗ trợ các tính năng như xác minh tính toàn vẹn của tập tin và tiếp tục truyền tập tin bị gián đoạn.
Thu thập dữ liệu: Có thể sử dụng lập trình socket để tạo các kết nối mạng tới
các cổng TCP hoặc UDP trên server mục tiêu và xác định trạng thái của cáccổng
đó (mở, đóng hoặc được lọc) Bằng cách sử dụng socket, người dùng có thể thiết
Trang 19lập các kết nối mạng và gửi các gói tin đến máy chủ để kiểm tra xem cổng cósẵn
hay không Điều này cho phép hacker xác định được thông tin ban đầu của mục tiêu để khai thác các lỗ hổng và thực hiện tấn công Bên cạnh đó, lập trìnhsocket
cũng giúp người quản trị mạng đánh giá được độ an toàn của hệ thống để đưa ra những giải pháp khắc phục, phòng chống xâm nhập.
1.4 Các thư viện và ngôn ngữ hỗ trợ lập trình Socket
1.4.1 Các ngôn ngữ hỗ trợ lập trình Socket
Lập trình Socket chính là cốt lõi của lập trình mạng, do đó hiện nay có rất nhiềucác ngôn ngữ lập trình phổ biến hỗ trợ lập trình socket, dưới đây là một số vídụ:
-C/C++: là ngôn ngữ phổ biến nhất cho lập trình socket Nó cung cấp hiệu suất
cao và khả năng kiểm soát chi tiết cho các lập trình viên Các thư viện hỗ trợ lậptrình socket gồm: Thư viện Winsock dành cho hệ điều hành Windows; Thư việnBerkeley sockets dành cho hệ điều hành Unix/Linux và thư viện Libevent – thưviện đa nền tảng hỗ trợ nhiều giao thức mạng và các tính năng nâng cao.
-Java: Java là ngôn ngữ lập trình hướng đối tượng phổ biến khác hỗ trợ lập
socket Java cung cấp khả năng di động cao và dễ sử dụng Các thư viện hỗ trợ lập trình socket gồm: java.net.Socket: Cung cấp các lớp cơ bản để tạo kết nối socket và gửi/nhận dữ liệu; java.nio.channels.SocketChannel: Cung cấp các lớp hiệu suất cao hơn cho lập trình socket không đồng bộ.
Trang 20-Go: Go là ngôn ngữ lập trình mới nổi được thiết kế cho hiệu suất cao và khả
năng đồng bộ Go là lựa chọn tốt cho việc phát triển các ứng dụng socket có yêucầu cao.
Thư viện hỗ trợ lập trình socket là net, có chức năng cung cấp các lớp cơ bản để tạo kết nối socket và gửi/nhận dữ liệu.
-JavaScript: JavaScript được sử dụng chủ yếu cho phát triển web, nhưng nó
nâng cao.
1.4.2 Giới thiệu module socket trong Python
Python cung cấp Module Socket giúp chúng ta dễ dàng thực hiện kết nối Client/Server để giao tiếp với nhau Để có thể sử dụng được, trước tiên ta phải import module Socket vào chương trình:
Trang 21Tạo một Socket:
Chi tiết tham số:
Socket_family:họ địa chỉ
AF_INET: IPV4AF_INET6: IPV6AF_UNIX
Socket Type: cách thiết lập giao thức
+ SOCK_STREAM: Dựa trên giao thức TCP, chỉ thực hiện trên 2tiến trình đã thiết lập kết nối Giao thức này đảm bảo dữ liệu truyềnđến nơi nhận 1 cách tin cậy và đúng tuần tự Còn được gọi là sockethướng kết nối.
+ SOCK_DGRAM: Dựa trên giao thức UDP, không yêu cầu thiếtlập kết nối Giao thức này không đảm bảo dữ liệu truyền đến nơinhận 1 cách tin cậy và toàn vẹn Còn được gọi là socket hướngkhông kết nối.
Bảng 1.4: Chi tiết tham số của hàm socket()
Một số phương thức được sử dụng trong lập trình Socket với ngôn ngữ Python:
self.connection, addr = self.node.accept() Phương thức này thiết lập chấp nhận kết nối
self.connection.send(SMS.encode()) Phương thức này dùng để gửi tin nhắn khi được kết
self.connection.recv(1024).decode() Phương thức này sử dụng để nhận thông báo từ client trong suốt lúc chương trình hoạt độngBảng 1.5: Một số phương thức dùng để kết nối và trao đổi thông tin.
Trang 22Python hỗ trợ thu thập thông tin Server, bao gồm: tên miền, host, địa chỉ IP, … với một số Module sau đây:
gethostname() Trả về một chuỗi chứa tên máy chủ của máy màtrình thông dịch Python hiện đang thực thi.
Dùng để dịch tên máy chủ thành địa chỉ IPv4 Địa chỉ IPv4 được trả về dưới dạng chuỗi và được lưu vào biến addr gethostbyname() không hỗ trợ
Tương tự gethostbyname() nhưng được mở rộng thêm Trả về bộ ba: hostname, aliaslist, ipaddrlist, trong đó hostname là tên máy chủ lưu trữ chính của hostname, aliaslist là danh sách (có thể trống) tên các máy chủ lưu trữ thay thế cho cùng một địa chỉ và ipaddrlist là danh sách địa chỉ IPv4.
gethostbyname_ex() không hỗ trợ IPv6.
gethostbyaddr(ip_address) Tương tự gethostbyname_ex(), tuy nhiên tham sốtruyền vào là địa chỉ IPv4.
getaddrinfo(host, port, family=0, type=0, proto=0, flags=0)
Dịch đối số của host/port thành một chuỗi 5 bộ chứa tất cả các đối số cần thiết để tạo thành một Socket được kết nối với dịch vụ đó Host là tên miền, port là tên chuỗi dịch vụ.
Hàm này sẽ trả về 5 bộ với cấu trúc như sau:(family, type, proto, canonname, sockaddr).
connect_ex(IP address, port) Trả về giá trị 0 nếu thao tác thành công, ngược lạisẽ trả về giá trị cho biến errno.
Bảng 1.6: Một số phương thức dùng để thu thập thông tin Server.
Trang 23CHƯƠNG II – ỨNG DỤNG AN TOÀN SOCKET-PROGRAMING2.1 Một số nguy cơ bảo mật trong Socket Programing
2.1.1 Thiếu xác thực trong quá trình bắt tay
WebSocket, một giao thức socket phổ biến cho giao tiếp thời gian thực, có mộtquá trình bắt tay để thiết lập kết nối Khác với các yêu cầu HTTP thông thường, quá trình bắt tay này không bao gồm chức năng xác thực khách hàng Điều này có nghĩa là máy chủ không thể xác minh danh tính của khách hàng trong quá trình kết nối ban đầu Một số rủi ro tiềm ẩn như:
+ Mạo danh: Người dùng trái phép có thể mạo danh người dùng hợp pháp bằngcách bắt chước các gói dữ liệu Điều này có thể dẫn đến truy cập trái phép
hoặc các hành động trái phép.
+ Gian lận dữ liệu: Kẻ tấn công có thể chặn và sửa đổi dữ liệu chảy qua kết nốisocket.
2.1.2 Kênh TCP không được mã hóa
Một vấn đề khác với WebSockets là chúng có thể được sử dụng trên kênh TCPkhông được mã hóa Điều này dẫn đến tất cả các loại vấn đề được liệt kê trong Top 10 phơi nhiễm dữ liệu nhạy cảm A6 của OWASP Kênh TCP truyền dữ liệudưới dạng văn bản thuần túy, không được mã hóa Điều này khiến nó dễ bị tấn công bởi những kẻ nghe lén Một số tác động mà chúng có thể làm:
+ Đánh cắp dữ liệu nhạy cảm: Thông tin đăng nhập, mật khẩu, dữ liệu tài chínhvà các thông tin nhạy cảm khác có thể bị đánh cắp nếu kẻ tấn công có quyềntruy cập vào mạng.
+ Sửa đổi dữ liệu: Kẻ tấn công có thể thay đổi dữ liệu được truyền đi, dẫn đến
Trang 24các hành động không mong muốn hoặc sai lệch thông tin.
+ Nghe lén giao tiếp: Kẻ tấn công có thể theo dõi toàn bộ nội dung giao tiếpgiữa các ứng dụng sử dụng kênh TCP.
2.2 Các phương pháp bảo mật
2.2.1 Xác thực người dùng
Trong lập trình Socket, việc xác thực người dùng là vô cùng quan trọng, nó giúp đảm bảo chỉ những người dùng được ủy quyền mới có quyền truy cập tài nguyên mạng Qua đó, xác thực người dùng giúp đảm bảo tính toàn vẹn, tính bảo mật và độ tin cậy của hệ thống.
Quá trình xác thực thường diễn ra như sau:
+ Người dùng kết nối đến máy chủ thông qua socket.
+ Máy chủ yêu cầu người dùng cung cấp thông tin xác thực (VD: user vàpassword)
+ Người dùng gửi thông tin xác thực đến máy chủ.
+ Máy chủ kiểm tra thông tin xác thực và quyết định liệu người dùng có đượcphép truy cập hay không.
+ Nếu thông tin xác thực là hợp lệ, máy chủ sẽ cho phép kết nối tiếp tục vàcung cấp các dịch vụ được yêu cầu.
Sau đây là một số phương thức xác thực người dùng trong lập trình Socket: + Xác thực mật khẩu (Password Authentication): Trong phương pháp này,người dùng cần cung cấp một cặp tên đăng nhập và mật khẩu để đăng nhậpvào hệ thống Mật khẩu thường được bảo mật bằng cách sử dụng hàm băm.Sau đó, máy chủ sẽ kiểm tra xem cặp username và password này có hợp lệ
Trang 25hay không.
+ Xác thực mã thông báo (Token-based Authentication): Người dùng đăngnhập bằng cách cung cấp một mã thông báo (token) duy nhất Mã thông báonày có thể được tạo ra bằng nhiều cách khác nhau và thường có thời hạn.(VD: JWT)
+ Xác thực chứng chỉ (Certificate Authentication): Sử dụng chứng chỉSSL/TLS để xác thực Mỗi bên đều có một bộ chứng chỉ, máy chủ sẽ xácminh xem chứng chỉ của người dùng có được ký bởi một tổ chức uy tín haykhông Trong python, có thể sử dụng module ssl để thực hiện xác thực theocách này.
TLS: Viết tắt của Transport Layer Security, TLS cũng giống như SSL là một giao thức mật mã giúp truyền thông an toàn TLS 1.0 được IETF phát triển năm 1999, các phiên bản tiếp theo là TLS 1.1, 1.2, 1.3.
Tóm lại, TLS là phiên bản tiếp theo và cải tiến của SSL, được phát triển để
Trang 26cung cấp một môi trường bảo mật mạnh mẽ hơn cho việc truyền dữ liệu qua mạng Trong khi SSL vẫn tồn tại và được sử dụng trong một số trường hợp, TLSlà lựa chọn ưu tiên cho các ứng dụng và dịch vụ mới.
Trong giao thức SSL/TLS có 4 giao thức con với những chức năng cụ thể: + SSL Record: Giao thức này được sử dụng để chia nhỏ dữ liệu thành các gói tin nhỏ hơn, mã hóa dữ liệu và thêm các thông tin bảo mật như mã băm, chữký số, và khóa phiên trước khi gửi đi
+ SSL Handshake: Giao thức Handshake được sử dụng để thiết lập kết nối antoàn giữa máy khách và máy chủ, xác thực các bên và thỏa thuận các thôngtin cần thiết cho việc thiết lập kết nối bảo mật.
+ SSL Change Cipher Spec: Giao thức này được sử dụng để thông báo cho đốiphương biết rằng các thông tin được trao đổi từ bây giờ sẽ được mã hóa bằngcác thuật toán đã thỏa thuận trong giao thức Handshake.
+ SSL Alert: Giao thức này được sử dụng để thông báo về các sự kiện quantrọng và cảnh báo liên quan đến quá trình trao đổi dữ liệu bảo mật như nhưlỗi xác thực, lỗi băm, hoặc lỗi mã hóa,…
Trong 4 giao thức trên, mỗi giao thức đều có tầm quan trọng riêng, nhưng đặcbiệt phải kể đến giao thức SSL Handshake, đây được coi như là cốt lõi của giaothức SSL.
*Giao thức SSL Handshake
Trang 27Giao tiếp qua SSL luôn bắt đầu bằng SSL Handshake Handshake SSL là mộtmật mã bất đối xứng cho phép trình duyệt xác minh máy chủ web, lấy khóa công khai và thiết lập kết nối an toàn trước khi bắt đầu truyền dữ liệu thực tế.
Hình sau minh họa các bước liên quan đến quá trình SSL Handshake:
Hình 2.1: SSL Handshake
*)Phân Tích Quá Trình
− Đầu tiên, máy khách gửi thông báo "client hello" Điều này bao gồm số phiên bản SSL của máy khách, cài đặt mật mã, dữ liệu theo phiên cụ thể và thông tin khác mà máy chủ cần giao tiếp với máy khách bằng SSL.
− Máy chủ phản hồi bằng một thông báo "server hello" Bao gồm số