Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Ruby

Bảo mật biến môi trường: Best Practice bảo vệ dữ liệu nhạy cảm

Trong bài trước The Rubyist's Guide To Environment Variables, chúng tôi giải thích cách hệ thống biến môi trường hoạt động, bật mí mấy hiểu lầm phổ biến. Nhưng như một độc giả hữu ích chỉ ra, chúng tôi ít nói về bảo mật.

Vì dùng env var lưu API key bí mật và thông tin giá trị trở nên phổ biến, hiểu rõ rủi ro bảo mật rất quan trọng. Xem ngay:

Trường hợp xấu nhất

Hacker chiếm quyền root hoặc user sở hữu web app trên server. Lúc đó env var bị lộ, cùng mọi thứ không mã hóa mạnh.

Giải pháp: ngăn chặn quyền root truy cập server. :)

Ngựa Trojan

Anh chàng gặp ở hẻm bến cảng tặng phiên bản imagemagick "siêu tốc" gấp 2 lần bản gốc.

...Bạn làm như ai cũng làm: cài production. Vấn đề: nó thiết kế để cắp env var.

Ở đây, chạy lệnh "moghif" độc hại từ Ruby qua back-ticks. Mogrify cắp env var, in thông điệp châm biếm.

Bảo mật biến môi trường: Best Practice bảo vệ dữ liệu nhạy cảm Env var được copy từ process cha (irb) sang process con (mogrify).

Đây không phải "hack". Đây là cách env var hoạt động: copy từ parent sang child. Nếu chạy malware, chúng kế thừa env var như app bình thường.

Hai cách xảy ra:

  • Ai đó thuyết phục bạn cài phần mềm độc hại vào toolchain
  • Phần mềm "lành tính" trong toolchain bị exploit để lộ env var

Giải pháp thực: chủ động ngăn chặn cả hai. Nhưng có bước phòng ngừa hạn chế thiệt hại nếu "kẻ cắp ENV" lẻn vào toolchain.

Làm sạch môi trường (Sanitizing the Environment)

Khi shell out từ Ruby chạy imagemagick hoặc chương trình khác, chương trình đó kế thừa copy ENV của app. Nếu có secret trong ENV, nó cũng lấy được. Trừ khi bạn strip chúng ra.

Có thể override env var cụ thể khi tạo process mới, bằng cách truyền hash vào method `system`:

Bảo mật biến môi trường: Best Practice bảo vệ dữ liệu nhạy cảm Cách truyền env var tùy chỉnh vào method system của Ruby.

Muốn không gửi bất kỳ env var nào khi shell out, làm như ví dụ dưới. Tạo hash mirror ENV nhưng mọi giá trị set `nil`. Không đẹp nhưng là cách duy nhất tôi tìm thấy để xóa hết env var khi chạy shell command.

Bảo mật biến môi trường: Best Practice bảo vệ dữ liệu nhạy cảm Cách ngăn gửi bất kỳ env var nào khi chạy shell command từ Ruby.

Đừng vứt trẻ con cùng nước tắm

Kế thừa là một trong tính năng hữu ích nhất của ENV var.

Giả sử cần chạy command ghi S3. Kế thừa env var nghĩa là command chia sẻ API key từ Ruby app seamless. Mất khả năng này nếu không bao giờ cho kế thừa.

Persistence (Sự bền vững)

Mỗi process có tập env var riêng, chết khi process chết. Set env var trong Ruby app, chúng biến mất khi app thoát.

Cần env var tồn tại sau reboot, phải lưu ở đâu đó. Đó thường là filesystem.

Đừng dùng git repo của app

Tin rằng nhân viên GitHub trung thực như chúng ta, nhưng có muốn ai có quyền truy cập source code đều lấy API key chạy bill AWS $10,000?

Tránh dùng .bashrc hoặc .bash-profile cho secrets

Lưu secret trong file như .bashrc, chúng được gửi như env var cho mọi chương trình chạy dưới user đó. Đa số không cần secret. Vì sao cho chúng?

Chỉ lộ secret cho process cần nó

Nếu Rails app là process duy nhất cần `HONEYBADGER_API_KEY`, tốt nhất chỉ làm nó available cho process đó.

Có vài gem cho thêm env var vào file load khi Rails start. Env var chỉ available cho Rails process và child process. Xem phần figaro và dotenv ở cuối bài The Rubyist's Guide To Environment Variables.

Bảo mật file cấu hình

Nếu load env từ config file, hãy chắc permissions chỉ readable bởi user chạy web app.

Ở đây, làm config file chỉ readable/writable bởi user tạo ra. Trong trường hợp này, user sở hữu Rails app:

Bảo mật biến môi trường: Best Practice bảo vệ dữ liệu nhạy cảm Làm file cấu hình chỉ readable bởi user cần đọc.

Vì không check vào GitHub, cần SSH vào server edit thủ công hoặc dùng tool như Chef quản lý.

Xây "tường lửa" nơi có thể

Điều tuyệt vời của AWS: cho tạo access control policy siêu chi tiết. Nhiều provider có tính năng tương tự.

Ý nghĩa: có thể tạo API key chỉ cho upload vào single bucket S3. Nên tạo keypair riêng cho hoạt động riêng. Một cho upload ảnh. Một cho DB backup. V.v.

Vận hành vậy giới hạn thiệt hại của bất kỳ breach bảo mật nào.