Jak szyfrować dane w bazach danych NoSQL, takich jak MongoDB i Cassandra?
Wprowadzenie
Bazy danych NoSQL, takie jak MongoDB i Apache Cassandra, zyskały popularność dzięki swojej skalowalności i wydajności. Jednak ochrona danych w tych systemach wymaga odpowiednich technik szyfrowania. W tym artykule omówimy, jak skutecznie zabezpieczyć dane przechowywane w MongoDB i Cassandra, koncentrując się na metodach szyfrowania zarówno w spoczynku, jak i w tranzycie.
1. Dlaczego szyfrowanie w NoSQL jest ważne?
Ze względu na rosnące zagrożenia cybernetyczne i przepisy dotyczące ochrony danych, takie jak GDPR czy HIPAA, firmy muszą dbać o bezpieczeństwo danych klientów. Szyfrowanie w bazach NoSQL pomaga:
✅ Chronić wrażliwe informacje przed nieautoryzowanym dostępem.
✅ Spełniać wymogi prawne dotyczące ochrony danych.
✅ Zapobiegać atakom typu ransomware i kradzieży danych.
✅ Zachować integralność informacji w przypadku naruszenia bezpieczeństwa.

2. Szyfrowanie danych w MongoDB
MongoDB oferuje wbudowane funkcje szyfrowania, ale można także zastosować zewnętrzne rozwiązania do zwiększenia ochrony.
2.1. Szyfrowanie w tranzycie (TLS/SSL)
Aby zabezpieczyć dane przesyłane między klientem a serwerem, należy skonfigurować TLS (Transport Layer Security).
🔹 Włączenie TLS w MongoDB:
mongod --sslMode requireSSL \
--sslPEMKeyFile /etc/ssl/mongodb.pem \
--sslCAFile /etc/ssl/ca.pem
To ustawienie zapewnia, że wszystkie połączenia są szyfrowane.
2.2. Szyfrowanie danych w spoczynku (Encryption at Rest)
MongoDB Enterprise oferuje szyfrowanie na poziomie magazynu, wykorzystując AES-256.
🔹 Włączenie szyfrowania na poziomie magazynu w MongoDB:
security:
enableEncryption: true
encryptionKeyFile: /etc/mongodb-keyfile
Dzięki temu wszystkie dane przechowywane w bazie będą zaszyfrowane.
2.3. Szyfrowanie na poziomie aplikacji
Dodatkowo można użyć bibliotek kryptograficznych, np. libsodium lub MongoDB Client-Side Field Level Encryption, które pozwalają na szyfrowanie wybranych pól w dokumentach.
🔹 Przykład szyfrowania pola w Pythonie:
from pymongo import MongoClient
from cryptography.fernet import Fernet
# Generowanie klucza szyfrującego
key = Fernet.generate_key()
cipher_suite = Fernet(key)
# Szyfrowanie danych
encrypted_data = cipher_suite.encrypt(b"tajne hasło")
# Przechowywanie zaszyfrowanego hasła
client = MongoClient("mongodb://localhost:27017/")
db = client["secure_db"]
collection = db["users"]
collection.insert_one({"username": "admin", "password": encrypted_data})
Dzięki temu dane są zaszyfrowane jeszcze przed zapisaniem do bazy.
3. Szyfrowanie danych w Apache Cassandra
Apache Cassandra oferuje różne mechanizmy szyfrowania, w tym TLS dla połączeń oraz szyfrowanie w spoczynku.
3.1. Szyfrowanie w tranzycie (TLS/SSL)
Aby włączyć szyfrowanie komunikacji klient-serwer, należy edytować plik cassandra.yaml:
🔹 Włączenie SSL w Cassandra:
server_encryption_options:
internode_encryption: all
keystore: conf/.keystore
keystore_password: cassandra
truststore: conf/.truststore
truststore_password: cassandra
Po tej konfiguracji wszystkie transmisje danych będą szyfrowane.
3.2. Szyfrowanie danych w spoczynku
Cassandra pozwala na szyfrowanie danych na poziomie Storage Engine.
🔹 Włączenie szyfrowania tabel:
CREATE TABLE users (
id UUID PRIMARY KEY,
username text,
password text ENCRYPTED WITH 'AES256'
);
Każda wartość w kolumnie password będzie zaszyfrowana.
3.3. Szyfrowanie na poziomie aplikacji
Podobnie jak w MongoDB, dane można szyfrować po stronie aplikacji, np. przy użyciu Java Cryptography Architecture (JCA).
🔹 Przykład szyfrowania w Javie:
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public class EncryptData {
private static final String KEY = "1234567890123456";
public static String encrypt(String data) throws Exception {
Cipher cipher = Cipher.getInstance("AES");
SecretKeySpec keySpec = new SecretKeySpec(KEY.getBytes(), "AES");
cipher.init(Cipher.ENCRYPT_MODE, keySpec);
return Base64.getEncoder().encodeToString(cipher.doFinal(data.getBytes()));
}
public static void main(String[] args) throws Exception {
String encrypted = encrypt("tajne_dane");
System.out.println("Zaszyfrowane: " + encrypted);
}
}
Dzięki tej metodzie nawet jeśli baza danych zostanie naruszona, dane pozostaną zabezpieczone.
4. Najlepsze praktyki szyfrowania w NoSQL
✅ Zawsze włączaj szyfrowanie w tranzycie (TLS).
✅ Włącz szyfrowanie w spoczynku, korzystając z AES-256.
✅ Zarządzaj kluczami szyfrowania w bezpieczny sposób, np. używając HashiCorp Vault.
✅ Używaj szyfrowania na poziomie aplikacji dla dodatkowej ochrony.
✅ Regularnie aktualizuj bazy danych i stosuj poprawki bezpieczeństwa.
Podsumowanie
Szyfrowanie danych w MongoDB i Cassandra jest kluczowe dla zapewnienia bezpieczeństwa i zgodności z regulacjami. Dzięki TLS, szyfrowaniu w spoczynku oraz na poziomie aplikacji, można skutecznie chronić wrażliwe informacje. Warto także stosować najlepsze praktyki w zakresie zarządzania kluczami i regularnych aktualizacji.
Masz pytania dotyczące konfiguracji szyfrowania? Podziel się nimi w komentarzu! 💬