Lưu trữ API Key trong Rails

Tổng quan

Khi làm việc với Rails chắc chắn bạn cũng đã sử dụng quá API Key (hoặc id, password) của các bên thứ 3 ví dụ như :

  • AWS ACCESS KEY

  • GOOGLE ANALYTIC KEY

  • GOOGLE MAP KEY

  • MAILCHIMP_API_KEY ...

Và cũng đang thắc mắc là chúng ta nên lưu trữ những thông tin này ở đâu là an toàn nhất? Bài viết này tôi sẽ đưa ra cho các bạn bốn phương pháp cũng như so sánh những ưu nhược điểm của chúng.

1. Lưu trữ trực tiếp trong codebase

Ví dụ config/environments/production.rb

config.mailchimp_api_key = "ABCDEF"

Ưu điểm : Dễ dùng 😄

Nhược điểm :

Phương pháp này có rất nhiều nhược điểm:

  • Không thể sử dụng được với những dynamic key

  • Mọi developer làm việc trong project đầu có thể biết được những API Key này. Điều này có thể gặp rắc rối nếu một người trong số đó nghỉ việc hoặc bị sa thải anh ta có thể sử dụng nó với mục đích không tốt hoặc cũng có thể đánh cắp thông tin của người dùng cũng như của khách hàng

  • Mọi ứng dụng bên thứ 3 đều có quyền truy cập key bao gồm các dịch vụ cloud-base để lưu trữ source code của bạn (như github), CI dùng để test. Điều này cũng tạo nên một nguy cơ tiềm tàng.

  • Việc cấu trúc server sai cũng có thể dẫn đến lộ file này.

  • Khi mà source code của bạn bị lộ thì dẫn đến API Key của bạn cũng bị lộ theo

Tổng kết :

Đây là phương pháp thiếu an toàn nhất

2. Lưu trữ trong ENV

Ví dụ:

config.mailchimp_api_key = ENV["MAILCHIMP_API_KEY"]

Ưu điểm :

  • Không thể sử dụng được với những dynamic key

  • Tương đối dễ dùng. Trên Heroku có cung cấp cho ta công cụ để add những biến này. Ngoài ra bạn cũng có thể sử dụng dotenv để thêm biến môi trường dự vào configuration file mà nó cung cấp cũng rất dễ dàng.

Nhược điểm :

  • Nếu ENV của bị lộ do lỗi bảo mật của hệ thống bạn sẽ thực sự gặp rắc rối lớn

3. Lưu trữ trong DB

Ví dụ :

class Group < ApplicationRecord
end

Group.create!(name: "...", mailchimp_api_key: "ABCDEF")

Ưu điểm :

  • Dễ dùng

  • Có thể sử dụng được với dynamic key

Nhược điểm :

  • Nếu bạn gửi Group như một json thông qua API hoặc 1 cách nào khác thị sẽ bị lộ API Key. Vì vậy hãy cẩn thận khi thao tác với Group

  • Nếu database hoặc bản backup (khi phát triển thường chia sẻ những bản backup giữa các thành viên trong team) bị lộ thì bạn cũng bị lộ API Key

4. Lưu trữ trong DB và Encrypt (bảo mật trong code hoặc trong ENV)

Ví dụ :

class Group < ApplicationRecord
  attr_encrypted_options.merge!(key: ENV["ATTR_ENCRYPTED_SECRET"])
  attr_encrypted :mailchimp_api_key
end

Group.create!(name: "...", mailchimp_api_key: "ABCDEF")

Sử dụng :

Ưu điểm :

  • Bảo mật cao. Phải cần thỏa mãn 2 điều kiện thì API Key của bạn mới bị lộ :

    • Database bị lộ
    • ENV hoặc code bị lộ bao gồm cả phương thức bạn sử dụng để encryption
  • Nếu chỉ một trong những điều trên xảy ra thì bạn hãy yên tâm là API Key của bạn vẫn được an toàn

Đây là phương pháp có độ bảo mật cao nhất

Nhược điểm :

  • Có một chú khó khăn khi sử dụng

  • Việc test sẽ mất tương đối thời gian nếu bạn sử dụng encryp/decrypt quá nhiều

Tổng kết

Trên đây không phải là tất cả những cách chúng ta có thể lưu trữ API Key nhưng là những cách thông dụng nhất. Rất mong qua bài viết này các bạn có thể chọn cho mình được những cách đúng nhất và phù hợp nhất với project của mình.


All Rights Reserved