MySQL Şifrelemesi ve Anahtar yönetimi


10

İstemci verilerimizi yönetmek için PHP / MySQL'de yerel bir intranet sistemi geliştiriyorum. Görünüşe göre en iyi uygulama, girilirken MySQL sunucusundaki hassas verileri şifrelemek olacaktır.

Yine de, verilerin kolayca erişilebilir olmasını sağlarken bunu yapmanın en iyi yolu ne olacağı konusunda net değilim.

Cevaplanması zor bir soru gibi görünüyor: anahtarlar nerede saklanıyor? Anahtarı en iyi nasıl koruyabilirim? Anahtar her kullanıcının makinesinde saklanırsa, makineden yararlanırsa nasıl korunur? Anahtar kullanılırsa, anahtar nasıl değiştirilir?

Anahtar DB'de saklanacaksa, orada nasıl korunur? Kullanıcılar buna nasıl erişir?


Şifreleme ve anahtar saklama türü, ne tür senaryoları önlemek istediğinize bağlı olacaktır. Açıkçası, saldırganınız sunucuda kök veya uygulama kullanıcısı alırsa, uygulamanızın kullandığı şifresini çözmek için aynı rutinleri kullanabilir. Peki, hangi senaryoyu önlemek istiyorsunuz? Birisi yedeklemeyi mi çaldı? SQL enjeksiyon saldırısı? Başka bir şey?
Aleksandar Ivanisevic

Yanıtınız için teşekkürler! Yedeklemeler konusunda o kadar endişeli değilim. Bir kullanıcı makinesini sömüren ve oradan siteye SQL enjeksiyonu yoluyla erişen veya bir kullanıcının uygulama kimlik bilgilerini veren biriyle daha fazla ilgileniyorum. Makinenin kendisi hakkında fazla endişelenmiyorum; su için kimlik bilgileri çok güçlü (yine de% 100 güvenli olduğu konusunda hiçbir yanılsamam yok).
stormdrain

Yanıtlar:


9

Gelişmiş şifreli anahtar kurulumlarını işlemek için gerçekten yerleşik bir MySQL özelliği yoktur. Şifreleme mantığının büyük kısmını kendi PHP ve / veya tarayıcı tarafı (javascript?) Kodunuza uygulamanız gerekir.

Ancak belirttiğiniz endişeler biraz tuhaf: Görünüşe göre tek gerçek endişeniz, uzak istemci masaüstü / dizüstü bilgisayar iş istasyonundan bir SQL enjeksiyonu veya kaba kuvvet (parola tahmin, sanırım) saldırısı. Bu, planlanmış başka güvenlik önlemleriniz olduğunu ve olası uzlaşma yollarını analiz ettiğinizi şüphelendiriyor.

  • Birincisi, onaylanmamış uzak istemci IP'lerinden her türlü erişime karşı MySQL / PHP ana bilgisayarını koruyan güvenlik duvarı kurallarına sahip olduğunuzu varsayıyorum. Doğruysam, yalnızca güvenliği ihlal edilmiş kullanıcıların iş istasyonlarından gelen saldırılardan endişe duymanız mantıklıdır.

  • Ayrıca, uzak istemci ana bilgisayarındaki bir saldırganın kök / Yönetici ayrıcalıklarına yükselebileceğini veya gerçek kullanıcının kendi hesabını doğrudan tehlikeye atabileceğini anlarsanız, müşterinin verilerinin şifreleme veya diğer güvenlik önlemlerinden bağımsız olarak sıfır koruması olduğunu anlarsınız. (Saldırgan, anahtarları diske kaydedildikleri yerden okuyabilir veya gerçek kullanıcı oturum açarken girip aradıklarında onları çalabilir ve anahtarlar verilere yol açabilir.)

Bu iki varsayımdan başlayarak, sadece ilgili iki tehdidin A) kaba kuvvet şifre tahminlemesi ve B) SQL enjeksiyon girişimleri olduğu sonucuna varmamız mantıklıdır:

  • Saldırgan gerçek kullanıcının anahtarını alamazsa veya gerçek kullanıcının verilerinden daha fazlasına erişmek isterse, gerçek kullanıcı veya başka bir hesap için kaba zorlamalı oturum açma kredilerini deneyebilir. (Teorik olarak, her hesabı belirli bir uzak istemci IP'sine kilitleyebilirsiniz, bu da risklerin bölümlere ayrılmasına yardımcı olur.)
  • Saldırgan gerçek kullanıcı için geçerli bir anahtar alırsa, oturum açma ekranından (muhtemelen güvenli olacak kadar basit olan), potansiyel olarak buggy uygulama kodunun yumuşak karnına bir caddesi vardır. Gerçek kullanıcının bağlamından başarılı bir SQL enjeksiyonu, ona diğer istemci verilerine de erişmesini sağlayabilir.

Şimdi, sunucu tarafı şifrelemenin bu durumlar için nasıl uygulandığından bahsedelim:

  • Sunucu tarafı şifreleme kesinlikle SQL enjeksiyon tehdidine karşı yardımcı olur. Satır değerleri DB tablolarında şifrelenirse, saldırgan yalnızca diğer hesaplara ait verilerin anlamsız şifreleme metnini görebilir. Tehdit, bölümlere ayrılmıştır.
  • Brute zorlu şifre tahmini, sunucu tarafı şifrelemeye bakan bir saldırgan için gerçekten zor değildir. Kullanıcıların anahtarlarının sunucuda depolanmasına veya parolanın yerinde oluşturulup oluşturulmadığına bakılmaksızın, önemli olan tek şey doğru parolanın olup olmadığıdır. Sunucu, geçerli saklanan anahtarı kullanmanıza izin verir, çünkü parolanızın doğru olup olmadığını kontrol eder veya parolanız o anahtarı oluşturmak için doğru girdi olduğundan sizin için geçerli anahtarı hesaplar.

İstemci tarafı şifreleme ise kaba kuvvet şifre saldırılarını önemsiz kılar. Düzgün yapılandırılmış bir anahtarı kaba kuvvet uygulayamazsınız. İstemci tarafı şifreleme, SQL enjeksiyonuna karşı sunucu tarafı şifrelemeyle de aynı düzeyde koruma sağlar. İstemci, oturum açma sırasında anahtarı sunucuya geçirebilir ve oturum bitene kadar bellekte bir kopya tutar ve bu da kripto CPU yükünü sunucuya yükler. Veya istemci tarayıcıda şifreleme / şifre çözme işlemini kendisi gerçekleştirebilir. Her iki tekniğin de iniş ve çıkışları vardır:

  • Anahtarını sunucuya geçirmek, kodlamak ve yönetmek için çok daha kolaydır ve genellikle daha optimize edilmiş kripto kodu (muhtemelen derlenmiş C) nedeniyle çok daha hızlıdır.
  • Saf bir istemci tarafı yaklaşımı ekstra güvenlik sağlar, çünkü bir saldırgan sunucuda kök salsa bile şifrelenmiş verileri hala okuyamaz ve asla okuyamaz. Mümkün olan tek saldırı vektörü uzak istemci iş istasyonundan ödün vermektir.

Son olarak, veritabanındaki verileri şifrelemenin bazı büyük operasyonel dezavantajları olduğunu not edeceğim. Şifrelenmiş veri gösterimleri aslında rastgele kalıplar olduğundan, dizin oluşturma, birleştirme vb. Gibi temel veritabanı özellikleri işe yaramaz. İstemci büyük bir mantık yükü üstlenir ve veritabanı özelliklerinin normalde getirdiği birçok avantajı kaybedebilir.


1
Vaov! Şaşırtıcı ve kapsamlı cevap; çok teşekkür ederim. Son birkaç gündür, bazı seçenekler üzerinde duruyordum ve önerdiğiniz gibi bir istemci tarafı çözümü denemeye ve uygulamaya karar verdim. İdeal olarak, anahtarlar yalnızca kullanıcı sistem üzerinde çalışırken (fiziksel güvenlik çok sıkıdır) monte edilecek olan başparmak sürücülerde depolanır ve anahtar yalnızca oturum sürdüğü sürece bellekte tutulur. Anahtarların sisteme sadece trafiği izlemek için orada olduğum çalışma saatleri sırasında erişilebileceği
fikri

2

MySQL veritabanlarının ve diğer işlemlerin Linux şifrelemesi için yüksek güvenlik ve performans sağlamak üzere ecryptfs , erişim kontrolleri ve anahtar yönetimi kullanan ezNcrypt'e bakmak isteyebilirsiniz . Hayır onlar için çalışmıyorum.


2

Scytale'i kullanabilirsiniz. Modern DBMS ve web uygulamaları için NoSQL kripto proxy'sidir. Çoklu alıcı ve grup şifrelemeyi destekler. Güçlü bir RSA / AES şifreleme sistemi ile donatılmıştır. Aynı zamanda% 100 ücretsiz ve açık kaynaklıdır.

https://bitbucket.org/maximelabelle/scytale

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.