Thực tiễn tốt nhất để xây dựng API an toàn

bởi Rakesh Talanki và Vidheer Gadikota

Các nhà thiết kế và phát triển API (giao diện lập trình ứng dụng) thường hiểu tầm quan trọng của việc tuân thủ các nguyên tắc thiết kế trong khi thực hiện giao diện. Không ai muốn thiết kế hoặc thực hiện một API xấu!

Mặc dù vậy, đôi khi, nó rất hấp dẫn khi tìm kiếm các phím tắt để đạt được các mốc thời gian chạy nước rút tích cực đó, đi đến đích và triển khai API. Các phím tắt này có thể gây rủi ro nghiêm trọng - API không bảo mật.

Các nhà phát triển nên nhớ đội mũ của một hacker API trước khi triển khai. Nếu nhà phát triển bỏ qua việc xác định các lỗ hổng trong API, API có thể trở thành một cổng mở cho hoạt động độc hại.

Xác định và giải quyết các lỗ hổng API

Một API có thể hoạt động cho hoặc chống lại nhà cung cấp của nó tùy thuộc vào mức độ mà nhà cung cấp đã hiểu và thực hiện các yêu cầu của người dùng API. Nếu một công ty xây dựng một API cực kỳ an toàn, nó có thể sẽ rất khó sử dụng. Một sự cân bằng tốt cần phải được thực hiện giữa mục đích của API và dễ tiêu thụ. Trong bài viết này, chúng tôi sẽ khám phá một số lỗ hổng API mà chúng tôi gặp phải thông qua công việc của chúng tôi như là một phần của nhóm Google Ap Apeeee, bao gồm cả cách các lỗ hổng này có thể được ngăn chặn.

Tiêm

API là cửa ngõ để các doanh nghiệp kết nối kỹ thuật số với thế giới. Thật không may, có những người dùng độc hại nhằm truy cập vào các hệ thống phụ trợ của doanh nghiệp bằng cách tiêm các lệnh hoặc biểu thức ngoài ý muốn để thả, xóa, cập nhật và thậm chí tạo dữ liệu tùy ý có sẵn cho API.

Vào tháng 10 năm 2014, chẳng hạn, Drupal đã công bố một lỗ hổng SQL tiêm cho phép kẻ tấn công truy cập vào cơ sở dữ liệu, mã và thư mục tệp. Cuộc tấn công nghiêm trọng đến mức những kẻ tấn công có thể đã sao chép tất cả dữ liệu ra khỏi các trang web của khách hàng. Có nhiều loại mối đe dọa tiêm chích, nhưng phổ biến nhất là SQL Injection, RegEx Injection và XML Injection. Hơn một lần, chúng tôi đã thấy các API hoạt động mà không có sự bảo vệ mối đe dọa - nó không phải là hiếm.

API mà không cần xác thực

Một API được xây dựng mà không có sự bảo vệ khỏi các mối đe dọa độc hại thông qua xác thực thể hiện lỗi thiết kế API có thể đe dọa cơ sở dữ liệu của tổ chức. Bỏ qua xác thực thích hợp - ngay cả khi mã hóa lớp vận chuyển (TLS) được sử dụng - có thể gây ra sự cố. Chẳng hạn, với số điện thoại di động hợp lệ trong yêu cầu API, bất kỳ ai cũng có thể nhận địa chỉ email cá nhân và dữ liệu nhận dạng thiết bị. Do đó, các cơ chế xác thực và ủy quyền mạnh mẽ theo tiêu chuẩn ngành như OAuth / OpenID Connect, kết hợp với TLS, là rất quan trọng.

Dữ liệu nhạy cảm trong mở

Thông thường, các nhóm hoạt động và các nhóm nội bộ khác có quyền truy cập vào các công cụ theo dõi để gỡ lỗi các vấn đề, điều này có thể cung cấp một cái nhìn rõ ràng về thông tin tải trọng API. Lý tưởng nhất là dữ liệu chủ thẻ PCI (CHD) và dữ liệu Sức khỏe cá nhân (PHI) được mã hóa từ điểm dữ liệu được ghi lại cho đến khi dữ liệu được sử dụng, mặc dù điều này không phải lúc nào cũng đúng.

Với mối quan tâm ngày càng tăng về bảo mật API, mã hóa dữ liệu nhạy cảm và bí mật cần phải là ưu tiên hàng đầu. Ví dụ, vào tháng 6 năm 2016, một lỗ hổng proxy http đã được tiết lộ cung cấp nhiều cách để kẻ tấn công ủy quyền yêu cầu gửi đến máy chủ lựa chọn, nắm bắt thông tin nhạy cảm từ yêu cầu và có được thông tin về dữ liệu nội bộ. Ngoài việc sử dụng TLS, điều quan trọng là lưu lượng API phải được bảo vệ bằng cách mã hóa dữ liệu nhạy cảm, thực hiện che giấu dữ liệu để theo dõi / ghi nhật ký và sử dụng mã thông báo cho thông tin thẻ.

Phát lại các cuộc tấn công

Một mối quan tâm tiềm năng lớn đối với các kiến ​​trúc sư doanh nghiệp là cái gọi là phát lại giao dịch trên mạng. API API mở ra cho công chúng đối mặt với thách thức trong việc tìm ra liệu có nên tin tưởng các yêu cầu đến hay không. Trong nhiều trường hợp, ngay cả khi yêu cầu không đáng tin cậy được đưa ra và bị từ chối, API có thể lịch sự cho phép người dùng - có khả năng độc hại - thử và thử lại.

Những kẻ tấn công tận dụng sự tin tưởng không đúng chỗ này bằng cách cố gắng phát lại hoặc phát lại yêu cầu người dùng hợp pháp (trong một số trường hợp sử dụng các kỹ thuật vũ phu) cho đến khi chúng thành công. Năm 2016, tin tặc đã xâm nhập vào tài khoản Github thông qua một cuộc tấn công phát lại bằng cách sử dụng lại địa chỉ email và mật khẩu từ các dịch vụ trực tuyến khác đã bị xâm phạm và thử chúng trên tài khoản Github.

Các biện pháp đối phó bao gồm các chính sách giới hạn tỷ lệ đối với các yêu cầu điều tiết, sử dụng các công cụ tinh vi như Apigee Sense để phân tích lưu lượng yêu cầu API và xác định các mẫu đại diện cho các yêu cầu bot không mong muốn. Các biện pháp bảo mật bổ sung cho các cuộc tấn công phát lại của stymie bao gồm:

  • HMAC, kết hợp dấu thời gian để giới hạn tính hợp lệ của giao dịch trong một khoảng thời gian xác định
  • xác thực hai yếu tố
  • cho phép mã thông báo truy cập ngắn hạn bằng cách sử dụng OAuth

Việc sử dụng API tăng đột xuất

Nó luôn luôn khó khăn để ước tính việc sử dụng API. Một ví dụ điển hình là ứng dụng đã đưa xuống API dịch vụ thời tiết quốc gia một thời gian ngắn. API đặc biệt này không có bất kỳ loại cơ chế ngăn chặn hoặc tăng lưu lượng truy cập nào, do đó lưu lượng truy cập tăng đột ngột trực tiếp vào phần phụ trợ.

Một thực hành tốt là thực thi lệnh bắt giữ lưu lượng truy cập tăng đột biến hoặc hạn ngạch sử dụng cho mỗi ứng dụng, để phần phụ trợ giành chiến thắng đã bị ảnh hưởng. Điều này có thể dễ dàng triển khai với sự trợ giúp của một nền tảng quản lý API tinh vi với các chính sách như hạn ngạch và bắt giữ tăng đột biến.

Khóa trong URI

Đối với một số trường hợp sử dụng, việc triển khai các khóa API để xác thực và ủy quyền là đủ tốt. Tuy nhiên, việc gửi khóa như một phần của Mã định danh tài nguyên đồng nhất (URI) có thể dẫn đến khóa bị xâm phạm. Như đã giải thích trong IETF RFC 6819, vì các chi tiết URI có thể xuất hiện trong nhật ký trình duyệt hoặc hệ thống, một người dùng khác có thể xem URI từ lịch sử trình duyệt, giúp dễ dàng truy cập các khóa API, mật khẩu và ngày nhạy cảm trong URI API.

Việc gửi các khóa API an toàn hơn trong tiêu đề ủy quyền thư, không được ghi bởi các thành phần mạng. Theo nguyên tắc thông thường, nên sử dụng phương pháp POST HTTP với tải trọng mang thông tin nhạy cảm.

Dấu vết ngăn xếp

Nhiều nhà phát triển API trở nên thoải mái khi sử dụng 200 cho tất cả các yêu cầu thành công, 404 cho tất cả các lỗi, 500 cho một số lỗi máy chủ nội bộ và, trong một số trường hợp cực đoan, 200 với thông báo lỗi trong cơ thể, bên trên dấu vết ngăn xếp chi tiết. Theo dõi ngăn xếp có khả năng trở thành rò rỉ thông tin cho người dùng độc hại khi nó tiết lộ các triển khai thiết kế hoặc kiến ​​trúc cơ bản dưới dạng tên gói, tên lớp, tên khung, phiên bản, tên máy chủ và truy vấn SQL.

Kẻ tấn công có thể khai thác thông tin này bằng cách gửi các yêu cầu URL được tạo thủ công, như được giải thích trong ví dụ này của Cisco. Đó là một cách thực hành tốt để trả về một đối tượng lỗi được cân bằng của Google, với mã trạng thái HTTP đúng, với (các) thông báo lỗi bắt buộc tối thiểu và không có dấu vết ngăn xếp trong điều kiện lỗi. Điều này sẽ cải thiện xử lý lỗi và bảo vệ chi tiết triển khai API khỏi kẻ tấn công. Cổng API có thể được sử dụng để chuyển đổi các thông báo lỗi phụ trợ thành các thông báo được tiêu chuẩn hóa để tất cả các thông báo lỗi trông giống nhau; điều này cũng loại bỏ việc phơi bày cấu trúc mã phụ trợ.

Giữ API an toàn

Như chúng tôi đã xem xét trong bài viết này, nhiều mối đe dọa tiềm tàng có thể tránh được bằng cách suy nghĩ một chút về thiết kế API và thiết lập các chính sách quản trị có thể được áp dụng trên toàn doanh nghiệp. Điều quan trọng là bảo vệ API chống lại nội dung tin nhắn độc hại bằng cách truy cập và che giấu dữ liệu được mã hóa nhạy cảm trong thời gian chạy và bảo vệ các dịch vụ phụ trợ chống lại truy cập trực tiếp. Một lỗi bảo mật API có thể gây ra hậu quả đáng kể - nhưng với sự suy nghĩ và quản lý đúng đắn, các doanh nghiệp có thể khiến bản thân an toàn hơn nhiều.

[Tìm hiểu thêm về bảo mật API? Nhận bản sao Sách điện tử gần đây của chúng tôi, Bên trong tư duy sản phẩm API: Xây dựng và quản lý API bảo mật.]