paint-brush
Sử dụng Bộ chứa Kali Linux, WebDriver và Tor để quét web ẩn danhtừ tác giả@csfx
3,800 lượt đọc
3,800 lượt đọc

Sử dụng Bộ chứa Kali Linux, WebDriver và Tor để quét web ẩn danh

từ tác giả Colin Barrett-Fox12m2023/08/05
Read on Terminal Reader

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

Mô phỏng tải trọng tấn công bằng cách sử dụng Kali Linux Container làm Hệ điều hành máy chủ tạm thời để kiểm tra xâm nhập và quét web ẩn danh. Bao gồm mã ví dụ để sử dụng Selenium để tự động hóa Trình duyệt Tor. Cuối cùng, tôi sẽ thảo luận về các biện pháp đối phó có thể được áp dụng cả trong Trung tâm dữ liệu và phía máy khách để cố gắng phát hiện, giới hạn tỷ lệ và chặn hoạt động của Bot.
featured image - Sử dụng Bộ chứa Kali Linux, WebDriver và Tor để quét web ẩn danh
Colin Barrett-Fox HackerNoon profile picture
0-item
1-item

Trong bài viết trước của tôi , tôi đã có thể trình diễn bộ chứa Kali Linux chạy với Trình duyệt Tor và được kết nối với môi trường máy tính để bàn của nó bằng ứng dụng khách VNC. Tôi đã xác minh rằng Trình duyệt Tor đang kết nối với Mạng Tor trong một phiên duyệt web. Thiết lập này sẽ cho phép tôi mô phỏng loại lưu lượng truy cập có thể đến từ kẻ tấn công nhắm mục tiêu vào một trang web.


Trong thử nghiệm này, tôi sẽ sử dụng Selenium để tự động hóa Trình duyệt Tor để tổng hợp các lần nhấn phím và sự kiện điều hướng thông qua giao diện WebDriver của trình duyệt. Mỗi trình thu thập thông tin sẽ có một địa chỉ IP ngẫu nhiên do Tor Proxy nhúng cung cấp để tránh bị phát hiện. Sau khi lưu kết quả dưới dạng các đối tượng JSON trong hệ thống tệp cục bộ, tôi sẽ sử dụng Python để xử lý chúng thành một tệp CSV duy nhất. Cuối cùng, tôi sẽ thảo luận về những biện pháp đối phó nào có thể được áp dụng trong Trung tâm dữ liệu và Phía máy khách để cố gắng phát hiện, giới hạn tỷ lệ và chặn hoạt động của Bot.


Tất cả các tệp và giấy phép hiện hành đều có sẵn trong kho mã nguồn mở này: tor-driver-python


Chụp màn hình Chạy tập lệnh trình thu thập thông tin đã hoàn thành:


Tôi có kiến thức cơ bản về tự động hóa thử nghiệm và đã dành nhiều giờ để thiết kế các thử nghiệm. Tôi cũng đã dành nhiều thời gian làm việc với Selenium và tôi đã sử dụng nó trong nhiều ngôn ngữ lập trình và cài đặt khác nhau để tự động hóa các trình duyệt web cho mục đích thử nghiệm. Có những trường hợp chỉ có thể kiểm tra ứng dụng web bằng trình duyệt thực và Selenium là một công cụ tuyệt vời cho điều đó.


Kịch bản

Trong công việc của mình với tư cách là Kỹ sư DevOps, tôi đã dành không ít thời gian để băn khoăn về việc phải làm gì với các trình thu thập dữ liệu web đang tấn công và đôi khi tấn công hoàn toàn các ứng dụng web mà tôi chịu trách nhiệm. Tôi nghĩ đây sẽ là một thử nghiệm thú vị để khám phá mặt khác của vấn đề này một lần.


Tôi muốn xem mình có thể mô phỏng một cuộc tấn công từ mạng botnet gần đến mức nào cho mục đích giáo dục và thảo luận về các phương pháp chống lại những thứ như lưu lượng truy cập mạng Tor đáng ngờ trong Trung tâm dữ liệu hiện đại. Botnet thường được sử dụng để thực hiện các cuộc tấn công Credential Stuffing. Tôi sẽ sử dụng một kỹ thuật tương tự để tìm kiếm các truy vấn và thu thập thông tin từ trang web.


Nhồi thông tin xác thực là việc tự động đưa các cặp tên người dùng và mật khẩu bị đánh cắp (“thông tin xác thực”) vào các biểu mẫu đăng nhập trang web, để lừa đảo giành quyền truy cập vào tài khoản người dùng. 1


cân nhắc đạo đức

Để tránh các vấn đề đạo đức, đồng thời cố gắng trung thực với nhiệm vụ. Tôi đang thực hiện các thay đổi sau đối với kịch bản:


  1. Tôi sẽ không thu thập Thông tin nhận dạng cá nhân (PII) và sẽ không có thông tin đăng nhập nào được sử dụng. Thay vào đó, tôi sẽ đọc các cụm từ tìm kiếm từ một tệp và thu thập thông tin công khai.
  2. Tôi sẽ sử dụng Mạng Tor để mô phỏng hành vi nhảy địa chỉ IP ngẫu nhiên thay vì mạng botnet.
  3. Các bước này cố ý nhắm mục tiêu các trang web có tệp robots.txt cho phép và Điều khoản và Điều kiện đã được kiểm tra tại thời điểm viết bài sẽ không loại trừ việc thu thập thông tin. Ví dụ: Điều khoản và Điều kiện của IMDB nghiêm cấm việc thu thập dữ liệu mà không có sự đồng ý bằng văn bản.
  4. Thông tin được thu thập sẽ chỉ giới hạn ở những thông tin có sẵn công khai. Tôi sẽ không sử dụng bất kỳ cách khai thác hoặc phương pháp nào khác để có quyền truy cập vào thông tin không có sẵn công khai trên trang đích.
  5. Cuối cùng, tôi sẽ giới hạn các yêu cầu tốc độ được thực hiện cho trang đích để tránh bị chặn hoặc gây ra sự cố về thông lượng cho những người dùng khác.


robot.txt

Giao thức loại trừ rô-bốt là một cách để Quản trị viên web báo cho trình thu thập thông tin biết họ đang ở đâu và không được phép thu thập thông tin từ đó. Bạn có thể tìm thêm thông tin và ví dụ trên trang web robotstxt.org . Tôi đã tìm thấy một bài viết: Danh sách các công cụ tìm kiếm thay thế trong khi cố gắng tìm một công cụ cho phép quét web trên trang kết quả tìm kiếm. Dưới đây là một bản tóm tắt của nghiên cứu đó.


So sánh các tệp robots.txt từ mẫu của các công cụ tìm kiếm khác nhau


Máy tìm kiếm

URL của tệp robots.txt

Có được phép thu thập thông tin không?

Google

robot.txt

Không, nhưng có Api

Bing

robot.txt

Không, nhưng có Api

Yahoo

robot.txt

KHÔNG

VịtVịtĐi

robot.txt

Không, nhưng có Api

Câu thơ mở

robot.txt

Có, nhưng không chính xác những gì tôi đang tìm kiếm

tìm kiếmX

robot.txt

Đúng


Tài nguyên bổ sung

Một số tài nguyên khác mà tôi thấy hữu ích khi nghiên cứu chủ đề này:


Thao tác một trang web với Selenium và WebDriver

Tôi sẽ tránh sử dụng các thư viện khác ngoài Selenium cho ví dụ này. Có một số mẫu thực sự cơ bản mà tôi muốn chứng minh và tôi không muốn bị sa lầy với một Ngôn ngữ dành riêng cho miền (DSL) cụ thể có thể khiến bạn khó hiểu chuyện gì đang xảy ra hơn.


Tuy nhiên, tôi nghĩ sử dụng một framework chạy thử nghiệm là một cách tuyệt vời để tổ chức loại mã này. Việc thêm khung có thể giải quyết rất nhiều vấn đề xung quanh cấu trúc mã chung, thử lại logic và thậm chí là báo cáo.


Mẫu cơ bản

Có một mẫu cơ bản về cách tôi thao tác một trang trong phiên WebDriver. Tôi cũng thêm một khoảng dừng sau mỗi hành động được thực hiện. Tự động hóa trình duyệt có thể không ổn định. Thời gian chờ tăng thêm độ ổn định cho quá trình thu thập thông tin và hạn chế đáng kể khả năng bị giới hạn tốc độ và bị chặn. Bất cứ khi nào cần thiết, tôi cũng tăng cường thu thập thông tin bằng lệnh gọi API tới các Công cụ Tìm kiếm hoặc nguồn thông tin khác.


  1. Điều hướng đến một URL.
  2. Đợi trang tải xong.
  3. Tìm phần tử tôi muốn tương tác, phát triển bộ chọn cho phần tử đó.
  4. Đợi phần tử có mặt.
  5. Cuộn phần tử vào chế độ xem.
  6. Tương tác với phần tử.
  7. lặp lại

Tổng quan về Quy tắc

Tôi đã thực hiện một cách tiếp cận thực sự đơn giản với bộ chọn. Tôi đang sử dụng cả bộ chọn xpathcss có sẵn trong trình duyệt. Tập trung chủ yếu vào các thẻ neo và các đoạn URL để điều hướng giữa các trang trong quá trình thu thập thông tin.


Tôi đang sử dụng các điều kiện dự kiến để đợi các phần tử xuất hiện trước khi cố gắng nhấp vào chúng. Dự án Selenium có rất nhiều tài liệu, nhưng tôi cũng nhận thấy cuộc thảo luận về các điều kiện chờ với các ví dụ sử dụng trên Stack Overflow là một nguồn tài nguyên vô giá.


Mô-đun TorDriver

Hiện có một dự án PyPi tên là tbselenium có chức năng tương tự. Đối với thử nghiệm này, tôi đã tham khảo thiết lập cấu hình Firefox, nhưng không cần bất kỳ tính năng nào khác mà tbselenium bao gồm. Sự phức tạp bổ sung của các vùng chứa không có quyền truy cập root đều góp phần làm cho việc gỡ lỗi trở nên khó khăn hơn. Điều này đã thêm động lực để hạn chế sự phụ thuộc và thử các giải pháp đơn giản đã có từ trước. Ví dụ: có nhiều nơi tôi đang sử dụng các công cụ Linux và trình bao phụ thay vì triển khai trực tiếp các giải pháp python thuần túy.


Lớp hoàn thành là khoảng 150 dòng Python. Tôi nghĩ sẽ dễ dàng hơn để phân tích sâu những gì đang xảy ra mà không cần xem xét lại. Tôi đã học được rất nhiều về cách hoạt động của Trình khởi chạy trình duyệt Tor và cách định cấu hình cấu hình Firefox. Hồ sơ này đã được tổng hợp từ nhiều nguồn trực tuyến và chúng được đề cập trong mã nguồn cũng như tài liệu này.


Tôi đã trừu tượng hóa phần khởi động, chia nhỏ và một phần logic điều hướng rất phổ biến thành một lớp có tên là TorDriver . Đây là một lớp rất đơn giản để thiết lập cấu hình Firefox với Trình khởi chạy trình duyệt Tor. Nó có một phương pháp để kiểm tra xem một phần tử có hiển thị trên trang hay không và một phương pháp khác xác minh ổ cắm proxy đang hoạt động. Việc thiết lập và gỡ lỗi cấu hình Firefox phần lớn được thông báo bởi một cuộc thảo luận về Stack Overflow: Mở Trình duyệt Tor bằng Selenium .


Có thể tìm thấy tệp đã hoàn thành tại đây: tor-driver-python/torDriver.py


nhập khẩu

Nhập selen, pprint, quy trình con và ổ cắm cho các thành phần thiết lập và WebDriver.


Nhập cho mô-đun torDriver.py


Kiểm tra xem một phần tử có hiển thị không

Phương thức sau tóm tắt việc kiểm tra một phần tử và trả về True hoặc False nếu nó hiển thị trong thời gian chờ.


Kiểm tra xem bộ chọn có hiển thị không

Kiểm tra nếu Tor Proxy bắt đầu

Cổng proxy cần được kích hoạt trước khi gửi tín hiệu tới nó. Theo một số ví dụ trong Stack Overflow về Kiểm tra kết nối ổ cắm trong Python, tôi đã nghĩ ra điều này:


Kiểm tra kết nối thành công của ổ cắm

Lớp

Phần lớn mô-đun là một lớp điều khiển cấu hình Firefox, tải xuống geckodriver và khởi chạy torbrowser-launcher.


Định nghĩa và khởi tạo TorDriver

Ở đây tôi có một cấu hình cơ bản và một số cách ghi đè mọi thứ, nhưng chủ yếu là giữ cho điều này đơn giản nhất có thể:


Thuộc tính lớp TorDriver và init

Thiết lập hồ sơ Firefox

Cấu hình Firefox cần được định cấu hình ở mức tối thiểu để kết nối với cổng proxy, tôi cũng đã tắt javascript với nó.


Thiết lập hồ sơ Firefox

Cài đặt WebDriver

Điều này sử dụng cấu hình và nhị phân từ TorDriver để khởi tạo trình điều khiển


Tạo phiên WebDriver mới cho Firefox


Tải xuống tắc kè

Thêm một phương thức để tải xuống và giải nén geckodriver trong sub process. Điều đáng nói là bằng cách nào đó khi chạy nó trong vùng chứa, tar.gz không còn được nén nữa và nó chỉ cần được hủy lưu trữ. Thông tin thêm về lỗi có tại đây: stdin: not in gzip format error


Chiết xuất Curl và Tar


Thiết lập và chờ mạng Tor

Cho đến khi ổ cắm phản hồi, hãy thử kết nối lại với cổng proxy:


Bắt đầu torbrowser-launcher trong Sub process


trình thu thập thông tin

Trong ví dụ này, tôi đã sử dụng phương pháp tiếp cận hai giai đoạn sau đây. Giai đoạn đầu tiên là thu thập thông tin và giai đoạn tiếp theo là xử lý thông tin. Bằng cách này, tôi không bị ràng buộc với kết nối mạng trong toàn bộ quá trình và có thể thử phân tích lại kết quả nhiều lần nếu cần mà không cần quay lại tài liệu nguồn.


Có thể tìm thấy tệp hoàn chỉnh tại đây: tor-driver-python/crawler.py


Nhập mô-đun

Các phương thức nhập, thuộc tính và thiết lập được trình thu thập thông tin sử dụng


Chức năng trình thu thập thông tin chính

Trình thu thập thông tin đọc trong tệp văn bản và sử dụng thông tin đó để đưa ra các truy vấn trong phiên WebDriver. Trạng thái của quá trình thu thập thông tin được lưu giữ trong một thư mục gồm các tệp json cho mỗi truy vấn. Tôi cố gắng thực hiện quá trình xử lý tối thiểu hoàn toàn cần thiết để xuất thông tin một lần và mọi quá trình xử lý tiếp theo có thể xảy ra trong dữ liệu hiện có thay vì quay lại (các) trang web.


Các bước chính để thu thập thông tin qua công cụ tìm kiếm bằng trình duyệt web


search.txt

Tôi đang sử dụng tệp văn bản để lưu trữ các tìm kiếm. Tôi chọn tệp văn bản vì nó rất dễ tái cấu trúc. Chỉnh sửa văn bản là một rào cản thấp để bắt đầu thu thập thông tin với thông tin mới hoặc tiếp tục thu thập thông tin không thành công. Nếu trình thu thập thông tin này có các yêu cầu dữ liệu phức tạp hơn, tôi sẽ cân nhắc sử dụng Cơ sở dữ liệu để thay thế. Điều đó sẽ cho phép triển khai API để kiểm soát quá trình quét bằng giao diện người dùng tùy chỉnh, để báo cáo.


Một danh sách các tìm kiếm sẽ được thực hiện bởi trình thu thập thông tin


Định dạng kết quả JSON

Các tệp ví dụ đã có trong thư mục kết quả trong repo: tor-driver-python/results

Trong trình thu thập thông tin mạnh mẽ hơn, tôi khuyên bạn nên sử dụng công nghệ cơ sở dữ liệu thực tế. Điều này đủ để dễ dàng biết nơi dừng thu thập dữ liệu và tạo điều kiện khởi động lại.


JSON để lưu trữ trạng thái thu thập dữ liệu web


Chạy Trình thu thập thông tin từ Vùng chứa

Trình thu thập thông tin có thể được chạy từ vùng chứa bằng các lệnh sau. Trình tạo báo cáo yêu cầu phải có tệp JSON, bạn có thể tìm thấy tệp CSV xuất ví dụ tại đây:


Khởi động thùng chứa:

 docker run -it --rm -p 5901:5901 -v "${HOME}/src":/src excitingtheory/kalilinux-xvfb:torbrowser


Khởi động Máy chủ VNC trong vùng chứa, nó sẽ nhắc nhập mật khẩu phiên:

 /opt/start-vnc-server-once.sh 


Đầu ra của thiết bị đầu cuối khi bắt đầu phiên VNC trong Docker Container


Bắt đầu thu thập thông tin từ bên trong phiên VNC:

 python3 crawler.py


Trình thu thập thông tin sẽ đợi quá trình khởi tạo Trình duyệt Tor và thật không may, đó là một bước thủ công. Chỉ cần nhấp vào hộp kiểm và nhấp vào kết nối. Xem video demo để biết ví dụ.


Tự động kết nối với Tor cho đến khi thùng chứa được dọn sạch


báo cáo.py

Tập lệnh báo cáo sẽ tạo tệp Giá trị được phân tách bằng dấu phẩy (CSV) từ

Các tệp kết quả Ký hiệu đối tượng JavaScript (JSON ) mà trình thu thập thông tin lưu trong suốt quá trình thu thập thông tin. Tôi chọn định dạng CSV vì đây là định dạng phổ biến hơn để chia sẻ với đồng nghiệp nhưng vẫn dễ dàng nhập vào các công cụ khác để phân tích sâu hơn.


Có thể tìm thấy tệp hoàn chỉnh tại đây: tor-driver-python/report.py


Nhập mô-đun

Điều này sử dụng các thư viện Python tích hợp để đọc JSON, viết CSV và phân tích cú pháp URL để định dạng và trình bày dữ liệu. Sau đó lặp lại các kết quả và tải chúng để bắt đầu xử lý dữ liệu.


Nhập, thuộc tính và khởi tạo dữ liệu của trình tạo báo cáo


Trình tạo báo cáo chính

Đây là chức năng cốt lõi của trình tạo báo cáo. Điều này thực hiện một bản trình bày cuối cùng và thứ tự của dữ liệu được thu thập trong các đối tượng kết quả. Thông thường, các URL chỉ hữu ích đối với chuyển động chức năng của trình thu thập thông tin qua một trang web và không phải là bản thu thập dữ liệu cuối cùng, nhưng đó là một khởi đầu tốt để tùy chỉnh việc trích xuất dữ liệu tiếp theo.


Định dạng và tạo tệp CSV từ các đối tượng kết quả


Chạy báo cáo

Kết quả thu thập thông tin được lưu trong thư mục ./results dưới dạng tệp JSON. Tôi sẽ sử dụng tập lệnh sau để tạo báo cáo từ dữ liệu.


 python3 report.py


Báo cáo mẫu

Có thể tìm thấy tệp CSV đầu ra mẫu ở đây: tor-driver-python/output.csv


Các đoạn báo cáo CSV hiển thị các cột và dữ liệu


Phát hiện và giảm thiểu các cuộc tấn công

Có một số cách khác nhau để phát hiện và giảm thiểu hoạt động của Bot. Tôi sẽ tập trung chủ yếu vào khía cạnh Trung tâm dữ liệu, nhưng tôi cũng sẽ thảo luận về một số phương pháp phát hiện phía máy khách. Máy khách không bao giờ thực sự đáng tin cậy vì các tín hiệu phía máy khách có thể thay đổi bất cứ lúc nào và có thể bị giả mạo. Tôi nghĩ điều quan trọng là phải ghi nhớ điều này khi thiết kế một hệ thống phát hiện. Trong Trung tâm dữ liệu, có hai hình thức bảo vệ mà tôi sẽ thảo luận: giới hạn tỷ lệ và chặn danh tiếng.



Phát hiện phía khách hàng

Có một số cách để phát hiện phiên WebDriver đang hoạt động ở phía máy khách chỉ bằng javascript: vấn đề hơi liên quan trong Github sẽ đi vào chi tiết hơn . Về cơ bản, vì giao thức WebDriver thay đổi các đối tượng tài liệu và cửa sổ nên nó có thể được phát hiện trong mã phía máy khách.


Nhận xét về vấn đề GitHub về việc phát hiện phía máy khách WebDriver


Phát hiện và chặn lưu lượng bot trong trung tâm dữ liệu

Tôi sẽ tập trung vào các giải pháp mà tôi có nhiều kinh nghiệm nhất, Fastly, AWS WAF và Nginx. CloudFlare là một điều hoàn toàn bất ngờ, vì vậy tôi cũng sẽ nói về dịch vụ của họ.


Quy tắc dựa trên tỷ lệ của Tường lửa ứng dụng web AWS (WAF) cũng có thể được sử dụng để chặn các mức hoạt động Từ chối dịch vụ và cũng có các quy tắc mặc định có thể được sử dụng để phát hiện lưu lượng mạng Tor, xem Tài liệu quy tắc danh tiếng IP để biết thêm thông tin. Một cách tiếp cận phổ biến khác là chặn tất cả lưu lượng truy cập từ các trung tâm dữ liệu khác, cách này an toàn nếu đối tượng mục tiêu là Người tiêu dùng. Tuy nhiên, các Doanh nghiệp có thể đang sử dụng VPN trên nền tảng đám mây và công nghệ khác có thể gây hại cho lưu lượng truy cập hợp pháp.


Fastly's Signal Science, một giải pháp rất phổ biến, có thể được sử dụng để phát hiện lưu lượng truy cập Tor một cách cụ thể. Đầu tiên, họ có thể bảo vệ khỏi các cuộc tấn công DDOS, hãy xem trang Giảm thiểu DDOS của họ để biết thêm thông tin. Thứ hai, họ có thể phát hiện lưu lượng truy cập Tor và chặn nó. Đây là tài liệu Sử dụng tín hiệu hệ thống đề cập đến vấn đề này.


Đối với Nginx, cũng có một số bài viết về việc này: Cách chặn lưu lượng truy cập ẩn danh bằng Nginx hoặc bên trong ứng dụng web của bạn . Về cơ bản, bằng cách gọi API để lấy thông tin về các nút thoát Tor, các quy tắc chặn IP có thể được tạo và áp dụng cho Nginx theo lịch trình.


Trái ngược hoàn toàn với các nhà cung cấp đám mây ở trên, CloudFlare đang cung cấp hỗ trợ cho các máy khách Tor. Tôi đã xem qua Tài liệu hỗ trợ Tor của họ!? nơi họ thảo luận về khả năng cung cấp nội dung cho người dùng Tor từ mạng. Tôi nghĩ rằng đây là một cách tiếp cận thực sự thú vị và tôi háo hức khám phá nó hơn nữa trong tương lai.



Phần kết luận


WebDriver là một công cụ mạnh mẽ để thử nghiệm và cũng có thể được sử dụng để thu thập thông tin ở những nơi không thể truy cập API. Ví dụ: quyền truy cập bị hạn chế, bị kiểm duyệt, quá đắt hoặc thường bị khóa do các hành vi phản cạnh tranh. Tốt hơn hết là kết hợp dữ liệu được thu thập từ quá trình thu thập thông tin trên web với thông tin được thu thập từ các API.


Đây là một bài tập quan trọng vì việc ngăn chặn lưu lượng độc hại từ các Bot ngày càng trở nên khó khăn hơn và việc đợi cho đến khi một cuộc tấn công xảy ra mới xem xét cách giảm thiểu nó không phải là một phương pháp bảo mật tốt. Tôi tin rằng tất cả những người chịu trách nhiệm đưa thông tin lên mạng nên biết thông tin vi phạm sẽ được sử dụng như thế nào để chống lại các hệ thống mà họ chịu trách nhiệm. Trong một kịch bản đơn giản hóa, với các ràng buộc về đạo đức, tôi đã chứng minh điều này bằng cách thực hiện như sau:


  1. Sử dụng Selenium để tự động hóa phiên Trình duyệt Tor bằng Địa chỉ IP ngẫu nhiên.
  2. Thu thập thông tin từ một trang web bằng giao thức Python và WebDriver.
  3. Đã lưu thông tin vào một tập hợp các tệp JSON.
  4. Đã sử dụng tập lệnh python để tạo báo cáo CSV từ kết quả ngoại tuyến.
  5. Đã thảo luận về một số cách phát hiện và giảm thiểu hoạt động Từ chối dịch vụ và Mạng Tor trong Trung tâm dữ liệu.


L O A D I N G
. . . comments & more!

About Author

Colin Barrett-Fox HackerNoon profile picture
Colin Barrett-Fox@csfx
DevOps Engineer with a background in Public Cloud, Containers, Security, and Automation. Serverless all the things!

chuyên mục

BÀI VIẾT NÀY CŨNG CÓ MẶT TẠI...