Bảo mật mật khẩu DB


18

Nhìn vào cấu trúc của hầu hết các trang web dựa trên PHP / MySQL mà tôi đã thấy, có vẻ như không khó để nhận ra mật khẩu cơ sở dữ liệu nếu bạn khai thác một chút, vì luôn có một tệp thiết lập hoặc cấu hình ở đâu đó lưu trữ thông tin để ghi nhật ký vào DB. Khác với biện pháp phòng ngừa cơ bản là đảm bảo rằng các đặc quyền của cơ sở dữ liệu của tôi bị hạn chế một cách thích hợp cho các yêu cầu từ xa, những tùy chọn nào có sẵn mà tôi có thể thực hiện trong các dự án của riêng mình để bảo vệ thông tin này?


1
Để làm rõ - bạn đang hỏi về việc lưu trữ thông tin đăng nhập để đăng nhập vào cơ sở dữ liệu từ trang web chứ không phải cách lưu trữ mật khẩu đúng cách cho người dùng của trang web trong cơ sở dữ liệu, đúng không?
Joe

Chính xác; đó là những gì tôi đang nhận được.
Kaji

Câu trả lời:


10

Không phải là câu trả lời trực tiếp về việc lưu trữ mật khẩu, nhưng tôi thường sử dụng ít nhất hai kết nối cơ sở dữ liệu khi xây dựng ứng dụng web - một lần sử dụng 99% thời gian cho các hoạt động liên quan đến người dùng, với các đặc quyền bị hạn chế và khác được sử dụng cho chức năng 'quản trị viên' (xóa người dùng, v.v.).

Trong một số trường hợp, khi tôi cài đặt gói của người khác, tôi sẽ cài đặt hai phiên bản ... một phiên bản công khai chỉ có quyền truy cập cơ sở dữ liệu để thực hiện công cụ loại người dùng chung và phiên bản thứ hai bị hạn chế IP mạng con cục bộ của tôi (thậm chí có thể trên một máy khác) phải được sử dụng cho mọi hoạt động loại 'quản trị viên'. Không ai có quyền truy cập để sửa đổi các bảng, v.v., ... Tôi thà truy cập thông qua các công cụ cơ sở dữ liệu nguyên gốc hơn là cho phép ứng dụng web chạy các tác vụ cập nhật của riêng mình mà chưa được xem xét.

Mặc dù vậy, bạn có thể đưa nó đi xa hơn và thêm nhiều kết nối cụ thể cho các tác vụ nhất định ... để các tác vụ quản lý mật khẩu và tạo người dùng đi qua một người dùng có các đặc quyền bổ sung trên các bảng người dùng, đăng nhập có quyền riêng tư cơ sở dữ liệu để xác thực và không nhiều thứ khác v.v.

Theo cách này, nếu có một cuộc tấn công tiêm sql, trên hầu hết các trang web, nó thực sự không thể làm gì đáng kể - không thể thấy băm mật khẩu, không thể thêm người dùng quản trị mới (không phải họ có thể làm được dù thế nào đi nữa), v.v ... Sẽ không có ích gì nếu họ quản lý để lấy vỏ trên máy của bạn, nhưng nó sẽ làm chậm chúng.


1
Chúng tôi làm một cái gì đó tương tự. Tuy nhiên, chúng tôi thường tạo một tài khoản mới cho mỗi người dùng / ứng dụng của cơ sở dữ liệu thay vì thực hiện theo chức năng. Điều này giải quyết hai vấn đề cho chúng tôi - 1) chúng tôi có thể phân biệt việc sử dụng cơ sở dữ liệu trong các công cụ như OEM (nghĩa là chúng tôi có thể thấy ai đang đập cơ sở dữ liệu với độ chi tiết) và 2) chúng tôi có thể điều chỉnh riêng từng thứ mà mỗi người dùng nhìn thấy và có quyền truy cập trong cơ sở dữ liệu.
ScottCher


4

Tôi là một fan hâm mộ lớn của việc sử dụng xác thực 'Nhận dạng' của PostgreSQL trên các ổ cắm cục bộ bất cứ khi nào tôi có thể. Bằng cách đó, người dùng cục bộ được ánh xạ trực tiếp đến người dùng Unix / Windows của máy tính cục bộ và tôi không phải lo lắng về việc lưu trữ mật khẩu. Tuy nhiên, tôi không nghĩ rằng đây là một tùy chọn trong MySQL.

Trường hợp cơ sở dữ liệu và máy chủ web nằm trên hai máy riêng biệt, tôi sử dụng mật khẩu MD5 qua SSL: nếu một kẻ thù có quyền truy cập vào máy chủ ngoại vi của tôi, thì vấn đề chỉ là thời gian trước khi anh ta tìm ra cách nó giao tiếp với cơ sở dữ liệu.


3

Nếu bạn đang sử dụng .NET Framework, bạn có thể xem xét việc sử dụng các chuỗi kết nối được mã hóa. Tôi không biết liệu điều đó có khả thi trong bất kỳ ngôn ngữ / khung nào khác không, nhưng đó sẽ là một biện pháp bảo vệ khác để đảm bảo rằng các kết nối của bạn không bị xâm phạm.

Ngoài việc sử dụng các chuỗi kết nối được mã hóa, sử dụng LDAP / Kerberos / Active Directory sẽ là lựa chọn an toàn nhất của bạn.


3

Nếu mật khẩu của bạn được lưu trữ ở dạng văn bản đơn giản, hãy sử dụng hàm băm (MD5, SHA), Luke!


OP không hỏi về việc lưu trữ mật khẩu người dùng. Nhưng có, chắc chắn băm mật khẩu người dùng của bạn, nhưng không bao giờ người dùng MD5 hoặc gia đình SHA để làm điều đó! Sử dụng bcrypt hoặc PBKDF2. Nếu không, bạn sẽ sớm thấy mình trong các tin tức như các công ty đã sử dụng MD5 và SHA1 và do đó tiếp xúc với người dùng của họ trước các cuộc tấn công vũ phu đơn giản.
Nick Chammas

Chắc chắn, muối và các kỹ thuật khác được yêu cầu ngoài việc băm. Và người ta không bao giờ nên tự mình thực hiện các loại tiền điện tử, mà nên sử dụng một số thư viện tiền điện tử được thử nghiệm rộng rãi.
Yasir Arsanukaev

2

Tùy thuộc vào ngôn ngữ lập trình của bạn, bạn có thể mã hóa thông tin đăng nhập, nhưng nếu bạn đang chạy một ngôn ngữ được thông dịch thì không có cách nào để đảm bảo rằng ai đó không thể tìm ra thông tin đăng nhập nếu họ có quyền truy cập vào hệ thống.

Nếu bạn đang chạy C ++ hoặc tương tự, thì tôi khuyên bạn nên tạo / tìm chức năng mã hóa / giải mã muối và chạy thông tin đăng nhập thông qua đó và lưu trữ hàm băm dưới dạng tệp trên hệ thống.

Nếu bạn đang chạy PHP hoặc tương tự, tôi khuyên bạn nên viết một trình bao bọc cho mcrypt_encrypt()và tạo thông tin xác thực sau đó chạy một số mã ẩn để làm chậm bất kỳ tin tặc nào nếu chúng có quyền truy cập vào hệ thống.


Nếu bạn mã hóa thông tin đăng nhập, bạn cần một số bí mật khác để giải mã chúng một lần nữa. Hoặc cách khác, hình thức được mã hóa trở thành bí mật, vì vậy kẻ tấn công có thể sử dụng nó. Một số chi tiết còn thiếu.
Peter Eisentraut
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.