Lưu trữ API Key trong Rails

Tổng quan

Khi làm việc với Rails đảm bảo bạn cũng đã 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à ta nên lưu trữ những tin tức 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 cách thức tương tư đối chiếu 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 :

cách thức này có nhiều nhược điểm:

Không thể dùng được với những dynamic key

Mọi lập trình viêneloper 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 phức tạp nếu một người trong số đó nghỉ việc hoặc bị sa thải anh ta có thể dùng nó với mục đích không tốt hoặc cũng có thể đánh cắp tin tức của người sử dụng tương tư của khách hàng

Mọi app bên thứ 3 đều có quyền vào web 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à cách thức 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ể dùng được với những dynamic key

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

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 phức tạp 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ể 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 lưu ý khi thao tác với Group

Nếu database hoặc bản backup (khi phát huy thường chia sẻ những bản backup giữa các người dùng 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") 

dùng :

attr_encrypted

dotenv

Ư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 dùng để encryption

Nếu chỉ một trong những điều trên diễn 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à cách thức có độ bảo mật cao nhất

Nhược điểm :

Có một chú khó khăn khi dùng

Việc test sẽ mất tương đối thời gian nếu bạn 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 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.

Nguồn viblo.asia