it-swarm-vi.com

Có phải nói chung là một ý tưởng tồi để mã hóa các trường cơ sở dữ liệu?

Tôi làm việc trong một công ty nhỏ, nghĩa đen là tôi (lập trình viên) và chủ sở hữu. Chủ sở hữu đã yêu cầu tôi mã hóa một số trường trong cơ sở dữ liệu để bảo vệ dữ liệu của khách hàng. Đây là một ứng dụng web giúp các công ty luật quản lý dữ liệu của họ, vì vậy về cơ bản, nó lưu trữ thông tin về người và vụ kiện (ai đang bị kiện, tại sao, với giá bao nhiêu). Ông xem xét thông tin nhạy cảm này không nên dễ dàng nhìn thấy. Nỗi sợ hãi của anh là "Tôi không muốn những người trái phép nhìn thấy thông tin này". Chỉ các công ty luật khác mới có thể quan tâm đến dữ liệu này, vì vậy, điều này không quan trọng bằng thẻ tín dụng chẳng hạn.

Tôi đã đọc rất nhiều về điều này trên web và tôi đã suy nghĩ đơn giản là sử dụng mã hóa đối xứng trên các trường này, để hiệu suất không tệ. Khóa sẽ được lưu trữ trên máy chủ. Tuy nhiên, this thread trên stackoverflow nói rằng đây là một ý tưởng tồi.

Tôi không hiểu cách mã hóa các trường và lưu khóa trên máy chủ có thể vô dụng như vậy. Tôi không sợ các đĩa bị đánh cắp vì chúng ở trên Amazon EC2. Tôi không phải là chuyên gia bảo mật, nhưng theo tôi, nếu có gì sai sót, tôi sẽ nói rằng cơ sở dữ liệu bị rò rỉ. Thậm chí sau đó, thông tin quan trọng sẽ được mã hóa. Bây giờ nếu anh chàng quản lý thậm chí hack vào máy chủ EC2 của tôi, tôi đoán vậy, sẽ có rất ít hoặc không có sự bảo vệ nào tôi có thể làm để giúp điều này. Vì chúng tôi là một công ty nhỏ, chúng tôi chỉ có một máy chủ làm mọi thứ, từ phục vụ các trang đến lưu trữ dữ liệu.

Câu hỏi của tôi là, xem xét chúng ta chỉ có thể đủ khả năng cho một máy chủ, đang mã hóa các trường đó bằng một khóa đối xứng, được lưu trên máy chủ này, ok?

65
Bhaskara

Nhận xét chung. Có vẻ như nó sẽ hữu ích cho bạn và sếp của bạn để tìm hiểu một số khái niệm bảo mật cơ bản, trước khi tiếp tục. An ninh là một lĩnh vực chuyên ngành. Bạn sẽ không yêu cầu một người ngẫu nhiên trên đường phố thực hiện phẫu thuật tim hở cho bạn; và bạn không nên mong đợi một nhà phát triển phần mềm trung bình biết cách bảo mật hệ thống của bạn.

Tôi cảm thấy một số quan niệm sai lầm ở đây. Ví dụ, có vẻ như ông chủ của bạn đã đánh đồng bảo mật với mật mã. Nhưng đó là một sai lầm. Như Bruce Schneier đã nhấn mạnh, Mật mã học không phải là bụi ma thuật mà bạn có thể rắc lên một hệ thống để đảm bảo an toàn . Và như Roger Needham đã từng nói một cách nổi tiếng, Nếu bạn nghĩ rằng mật mã sẽ giải quyết vấn đề của bạn, hoặc bạn không hiểu về mật mã, hoặc bạn không hiểu vấn đề của mình .

Khi bảo vệ hệ thống máy tính, một khái niệm quan trọng là mô hình mối đe dọa . Điều này có nghĩa là bạn cần suy nghĩ cẩn thận về những loại tấn công và đối thủ mà bạn đang cố gắng ngăn chặn và những gì bạn không. Việc không suy nghĩ kỹ về mô hình mối đe dọa rõ ràng có thể dẫn đến nhà hát bảo mật : các cơ chế bảo mật có vẻ tốt ngay từ cái nhìn đầu tiên, nhưng thực tế là không đủ trong thực tế. Quản lý bảo mật tốt thường đi đến quản lý rủi ro : phân tích cẩn thận những rủi ro nghiêm trọng nhất và sau đó đưa ra các chiến lược để giảm thiểu hoặc quản lý các rủi ro cụ thể đó.

Điều quan trọng là phải hiểu rằng bảo mật là thuộc tính liên kết yếu nhất: bảo mật của hệ thống của bạn chỉ mạnh bằng liên kết yếu nhất . Một lỗ hổng trong bất kỳ một phần nào của hệ thống có thể làm tổn hại đến tính bảo mật của toàn bộ hệ thống. Điều này có nghĩa là không có câu trả lời nào đủ để bảo vệ hệ thống của bạn; thay vào đó, để bảo vệ hệ thống của bạn, bạn phải có được bảo mật ngay tại một số nơi.

Đi sâu vào chi tiết. Có vẻ như mục tiêu của bạn là ngăn chặn tiết lộ trái phép dữ liệu nhạy cảm. Nếu vậy, bạn sẽ cần phải tập trung vào một số mặt hàng. Không có viên đạn bạc ma thuật đơn giản nào sẽ giải quyết điều này cho bạn; bạn sẽ cần phải làm việc về bảo mật ứng dụng nói chung.

Hãy để tôi đề xuất một số điều cần ưu tiên cho bạn, nếu tôi hiểu đúng mục tiêu của mình:

  • Bảo mật ứng dụng. Bạn cần bắt đầu nghiên cứu về bảo mật ứng dụng web. Không quan trọng bạn ném bao nhiêu tiền điện tử vào vấn đề; nếu kẻ tấn công có thể tìm thấy lỗ hổng bảo mật trong mã ứng dụng của bạn, bạn sẽ bị lừa. Đối với nền tảng về bảo mật ứng dụng web, OWASP có nhiều tài nguyên tuyệt vời. Hãy chắc chắn rằng bạn tìm hiểu về Top Ten của OWASP, về XSS, SQL SQL, vệ sinh/xác nhận đầu vào, thoát đầu ra, danh sách trắng và các khái niệm khác.

  • Kiểm soát truy cập. Ứng dụng web của bạn cần có các kiểm soát truy cập chắc chắn, để đảm bảo rằng một người dùng trong hệ thống của bạn không thể truy cập thông tin của người dùng khác (không có ủy quyền). Các chi tiết của điều này sẽ phụ thuộc vào chi tiết cụ thể của hệ thống cụ thể của bạn, vì vậy nếu bạn muốn được trợ giúp thêm về vấn đề này, có lẽ bạn sẽ cần đăng một câu hỏi riêng với nhiều chi tiết hơn về ứng dụng và chiến lược hiện tại của bạn để kiểm soát truy cập.

  • Xác thực. Ứng dụng web của bạn sẽ cần một cách để xác thực người dùng. Lược đồ nỗ lực ít nhất là chỉ sử dụng tên người dùng và mật khẩu. Tuy nhiên, điều này có những hạn chế nghiêm trọng trong thực tế được hiểu rõ. Nếu người dùng chọn mật khẩu của riêng họ, họ thường chọn mật khẩu kém và điều này có thể phá hỏng tính bảo mật của hệ thống của bạn.

  • Vòng đời phát triển phần mềm bảo mật. Bạn cần tích hợp bảo mật vào quy trình phát triển phần mềm. Khi bạn thực hiện kiến ​​trúc phần mềm, bạn nên suy nghĩ về các yêu cầu bảo mật và thực hiện mô hình hóa mối đe dọa và phân tích rủi ro kiến ​​trúc. Khi viết mã, bạn cần biết về các lỗi triển khai phổ biến có thể vi phạm bảo mật và đảm bảo tránh chúng. Sau khi phần mềm được xây dựng, bạn cần kiểm tra bảo mật của nó và liên tục đánh giá cách bạn đang làm ở mức bảo mật. Khi bạn triển khai phần mềm, mọi người cần phải biết cách quản lý phần mềm một cách an toàn. Microsoft có một số tài nguyên tuyệt vời về vòng đời phát triển phần mềm an toàn (SDL). Xem thêm BSIMM để biết thêm.

  • Đánh giá bảo mật. Nếu bạn lo ngại về bảo mật, tôi khuyên bạn nên đánh giá tính bảo mật của ứng dụng. Một điểm khởi đầu đơn giản có thể là nhờ ai đó thực hiện một pentest ứng dụng web của bạn, để kiểm tra một số loại lỗi phổ biến nhất định. Điều này không có nghĩa là đảm bảo an ninh, nhưng đôi khi nó có thể giúp phục vụ như một cuộc gọi báo thức nếu có nhiều vấn đề lớn hiện tại. Bạn có thể xem các dịch vụ của WhiteHat Security; cũng có nhiều người khác sẽ thực hiện pentesting web.

Nếu bạn hiểu rằng đây không phải là một công việc tầm thường, tôi xin lỗi, nhưng đó thực sự là trường hợp. Mặt khác, tin tốt là có rất nhiều tài nguyên ngoài đó, và hơn nữa, bạn không cần phải trở thành một chuyên gia bảo mật cấp chuyên gia: bạn chỉ cần làm quen với một số khái niệm cơ bản và một số bảo mật phổ biến sai lầm trong lập trình web, và điều đó sẽ giải quyết hầu hết các nhu cầu của bạn.

101
D.W.

Mã hóa dữ liệu trong cơ sở dữ liệu sẽ bảo vệ thông tin nếu cơ sở dữ liệu bị đánh cắp. Nhưng, nó sẽ không làm gì để bảo vệ chống lại trang web bị tấn công. Ví dụ bằng cách đoán tên người dùng/mật khẩu. Nó có thể làm chậm ai đó nếu họ xâm phạm máy chủ vì họ phải tìm khóa nhưng điều đó sẽ không ngăn họ. Nó cũng có giá cao. Ví dụ, các trường được mã hóa không còn có thể tìm kiếm theo bất kỳ cách hiệu quả nào. Bạn cũng cần lưu ý đến các tác động sao lưu và đảm bảo khóa được sao lưu, tốt nhất là tách biệt với các bản sao lưu cơ sở dữ liệu để ngăn chặn cơ sở dữ liệu bị mất nếu băng dự phòng bị đánh cắp. VÀ bạn cần đảm bảo bạn có một vài bản sao của khóa và KIỂM TRA chúng thường xuyên.

15
pipTheGeek

Một khái niệm hay từ SoA là có một dịch vụ tiền điện tử, chạy tách biệt với các quy trình khác trên máy chủ của bạn (ứng dụng web của bạn cũng nên chạy tách biệt!). Sau đó, khi bạn cần mã hóa/giải mã một đối tượng/trường, bạn gửi plaintext/crypttext đến dịch vụ tiền điện tử và bạn được trả lại bằng crypttext/plaintext. Bằng cách này, ngay cả khi ứng dụng web của bạn bị xâm nhập, kẻ tấn công không thể đọc khóa mã hóa, vì chỉ có dịch vụ tiền điện tử mới biết khóa. Ngoài ra, vì ứng dụng web của bạn bị cô lập, những gì anh ta có thể làm trên hệ thống của bạn bị hạn chế nghiêm trọng. Cách ly dịch vụ thường được thực hiện với hệ thống MAC như SElinux, TOMOYO (dễ sử dụng hơn nhiều so với SElinux imo), AppArmor. Ngoài ra, tôi khuyên bạn nên chạy kernel linux mới nhất được vá bằng grsecurance.

6
Matrix

Câu trả lời ngắn: Có sử dụng mã hóa đối xứng. Điều này sẽ ngăn chặn một số cuộc tấn công như đọc dữ liệu sql thông qua tiêm sql. Tuy nhiên, nếu ứng dụng web của bạn bị tấn công, nó có thể không quan trọng. Nếu ai đó có đủ quyền truy cập vào máy chủ của bạn, bạn không thể làm gì nhiều. Ngay cả với mã hóa bất đối xứng.

3
user5575