Veri güvenliğini sağlamak için, çevrimiçi ticaret genellikle MySQL'e yalnızca yerel veya intranet erişimine izin verir. Bununla birlikte, bazı özel durumlarda, MySQL'e harici ağ üzerinden erişmeniz gerekir. Şu anda izinlerin en aza indirilmesi ve açılmasını sağlamak için önce iki önlem alınmalıdır:
Bir yandan, güvenlik duvarı beyaz listesini yapılandırmanız gerekir
iptables -A GİRİŞ -s 1.2.3.4 -p tcp -m tcp dport 3306 -j KABULÖte yandan, MySQL kullanıcıları oluştururken IP'ye erişimi kısıtlayın
mysql > 'Testpass' İLE TANIMLANAN KULLANICI "testuser "@1.2.3.4" OLUŞTURUN;Peki bu adımda arkanıza yaslanıp rahatlayabilir misiniz? Öyleyse makale burada bitebilir. Ne yazık ki, hala gizli güvenlik riskleri var. MySQL erişimi, izleme ve ele geçirilmeye karşı savunmasız olan düz metin HTTP'ye benzer şekilde varsayılan olarak düz metin halindedir. Harici ağda açığa çıkan MySQL iletişimleri de izleme ve ortadaki adam saldırılarına konu olabilir. Aşağıda belirli bir örnek verilmiştir.
1 MySQL master-slave'in düz metin iletişimini izleyin
İzlemeyi uygulamanın birçok yolu vardır.Bypass izleme için anahtar bağlantı noktası yansıtma kullanırız.
İzlenecek makine xxx.xxx.xxx.83 ve saldırıyı başlatacak makine xxx.xxx.xxx.109'dur.
MySQL master-slave iletişiminin izlenmesini uygularken, ana kütüphaneyi veya slave kütüphanesini izlemenin etkisi benzerdir Burada ana kütüphanenin izlenmesini test ediyoruz.
1.1 Dinlenecek bağlantı noktasını belirleyin
İki makinenin hangi bağlantı noktasına karşılık geldiğini bilmiyorsanız, önce anahtarda oturum açabilir, ping atabilir ve ardından arp önbelleğinden görüntüleyebilirsiniz.
Ping işleminden sonra, bağlantı noktası arp önbelleği aracılığıyla belirlenebilir
Son olarak, xxx.xxx.xxx.83'ün g0 / 15 olarak yansıtma kaynağı bağlantı noktası ve xxx.xxx.xxx.109'un g0 / 1 olarak yansıtma hedef bağlantı noktası olduğunu doğrulayın.
1.2 Bağlantı noktası yansıtmayı yapılandırın
Anahtarda oturum açın, başlangıçta ayna yapılandırması yok
< H3C > dis mir Monitör bağlantı noktası yapılandırılmamış! < H3C > sys Parola: ************ Sistem görünümüne girin, Ctrl + Z ile kullanıcı görünümüne dönün.Yansıtma hedefini ve yansıtma kaynağı bağlantı noktasını ayrı ayrı yapılandırın
monitör bağlantı noktası g0 / 1 Başarılı! Monitör bağlantı noktası Trunk bağlantı noktası ve pvid olarak belirlendi değişti. yansıtma bağlantı noktası g0 / 15 dis mir Monitör bağlantı noktası: GigabitEthernet 0/1 Yansıtma bağlantı noktası: GigabitEthernet 0/15 q < H3C > kayıt etmek Bu, yapılandırmayı EEPROM belleğine kaydedecektir Emin misin Şimdi mevcut konfigürasyonu EEPROM belleğine kaydetme Lütfen bir süre bekleyin... Mevcut konfigürasyon EEPROM belleğine başarıyla kaydedildi1.3 Açık metnin ana-bağımlı iletişimini izleme
Aktif olarak izlenen makinede xxx.xxx.xxx.109 çalıştırın
tcpdump host xxx.xxx.xxx.83 -i eth0 -w merhaba.dump
xxx.xxx.xxx.83, MySQL ana veritabanı ile yapılandırılır ve başka bir harici ağ makinesi xxx.xxx.xxx.104, MySQL bağımlı veritabanıyla yapılandırılır. Master ve slave, SSL şifreleme ile yapılandırılmamış. Testte, xxx.xxx.xxx.109, MySQL master ve slave arasındaki iletişimi başarılı bir şekilde izlemek için kullanıldı.
Aşağıdaki şekil, izlenen MySQL hesabı oturum açma bilgilerini gösterir, kullanıcı adını ve şifrelenmiş şifreyi alabilirsiniz:
Karmaşık olmayan MySQL şifreleri için, düz metin, cmd5 gibi web siteleri aracılığıyla kolayca çözülebilir:
Aşağıdaki şekil, izlenen master-slave verilerini gösterir:
MySQL master-slave düz metin iletişimi durumunda, etkili bir şekilde gizlice dinlemenin sağlanabileceği görülebilir.
Burada kullanılan anahtar bağlantı noktası yansıtmasının, uygulanması zor olan anahtar izinlerini alması gerekir. Ancak harici ağ iletişiminde, gerçek ağ ortamı çok karmaşıktır ve kontrolümüzün ötesindedir ve düz metin iletişim hala potansiyel güvenlik risklerine sahiptir.
2 Sunucular arasında güvenli erişim
Peki, sunucular arasındaki harici ağ iletişiminde MySQL'in güvenli erişimi nasıl sağlanır? İşte birkaç genel çözüm.
2.1 Şifreli tünel
Şifrelenmiş tünel, istemcinin ağ verilerini şifreleyebilir ve ardından şifre çözme ve geri yükleme için güvenli bir şekilde sunucuya iletebilir. Örnek olarak stunnel alın:
İlk olarak, istemcide 3306 bağlantı noktasını izleyin ve şifreli iletişim kurun, uzaktaki 1.2.4.5:8000'e bağlanın
/usr/local/stunnel/etc/stunnelclient.confsslVersion = TLSv1 CAfile = /usr/local/stunnel/etc/ca-cert.pem cert = /usr/local/stunnel/etc/clientcert.pem key = /usr/local/stunnel/etc/clientkey.pem kabul = 127.0.0.1:3306 connect = 1.2.4.5: 8000Sunucu, 8000 numaralı bağlantı noktasını izler ve şifre çözüldükten sonra verileri makinenin 3306 numaralı bağlantı noktasına iletir.
/usr/local/stunnel/etc/stunnelserver.confsslVersion = TLSv1
CAfile = /usr/local/stunnel/etc/ca-cert.pem
cert = /usr/local/stunnel/etc/servercert.pem
key = /usr/local/stunnel/etc/serverkey.pem
kabul etmek = 8000
connect = 127.0.0.1: 3306
Bu şekilde, yerel 3306 bağlantı noktasına erişen istemci, şifrelenmiş tünel aracılığıyla uzak MySQL'e erişimi gerçekleştiren uzaktaki 1.2.4.5 makinesinin 3306 bağlantı noktasına erişecektir.
Avantajlar: Harici ağda ayrı bir MySQL hesabı oluşturmaya gerek yoktur ve yerel erişim için şeffaftır.
Dezavantajlar: İstemciden sunucuya yalnızca şifreli erişim gerçekleştirilebilir ve şifreli tünel hizmetinin ek bakımı gerekir.
2.2 VPN
VPN, harici ağ iletişimini sanal dahili ağ iletişimine dönüştürebilir ve harici ağ erişiminin güvenlik sorununu doğrudan çözebilir. OPENVPN'i örnek olarak ele alalım:
Sunuculardan birinde bir sunucu kurun ve dahili ağ segmentini yapılandırın
/etc/openvpn/server.confport 1194 proto tcp-server dev tap #Certificate ilgili ca /etc/openvpn/ca-cert.pem cert /etc/openvpn/server.pem anahtar /etc/openvpn/server.key dh /etc/openvpn/dh.pem # Sunucu tarafından kullanılan adresi belirtin ifconfig 192.168.10.1255.255.255.0 # İstemcinin IP adresini belirtin client-config-dir / etc / openvpn / ccdDiğer tarafta sunucuda bir istemci oluşturun ve bir VPN bağlantısı başlatın
/etc/openvpn/client.conf müşteri dev tap proto tcp-client uzak 1.2.3.41194 #Certificate ilgili ca /etc/openvpn/ca-cert.pem cert /etc/openvpn/client1-cert.pem key /etc/openvpn/client1-key.pemBu şekilde, her iki taraftaki sunucular sanal bir intranet oluşturur ve birbirlerinin MySQL veya diğer hizmetlerine erişebilirler.
Avantajlar: Her iki taraf birbirine erişebilir ve belirli bir bağlantı noktasına erişimle sınırlı değildir, bu özellikle uzak bilgisayar odalarında intranet iç iletişimi için uygundur.
Dezavantajlar: VPN hizmetlerinin ek bakımı gereklidir.
2.3 MySQL SSL
Şifrelenmiş tüneller ve şifrelenmiş sanal ağlar kurmanın yanı sıra, MySQL erişimini şifrelemek için doğrudan SSL de kullanabilirsiniz.
2.3.1 SSL sertifikası oluşturma
Önce MySQL'in SSL'yi destekleyip desteklemediğini kontrol edin.
mysql > "Have_ssl" GİBİ DEĞİŞKENLERİ GÖSTER; + + - + | Değişken_adı | Değer | + + - + | have_ssl | DEVRE DIŞI | + + - Sette + 1 satır (0,00 sn)Çıktı yukarıdaki gibiyse, bu MySQL'in SSL'yi desteklediği ancak etkinleştirilmediği anlamına gelir.
Birçok SSL sertifikası türü vardır.Pratikte, sunucu veya istemci sertifikaları farklı amaçlara göre kullanılır.
# Sunucu için kullanılan sunucu tipi SSL sertifikası veya ana-bağımlı ilişkisindeki ana kitaplık ssl-ca = / home / mysql / certs / ca-cert.pem ssl-cert = / home / mysql / certs / server-cert.pem ssl-key = / home / mysql / certs / server-key.pem# İstemci için kullanılan istemci tipi SSL sertifikası (komut satırı araçları gibi) veya ana-bağımlı ilişkisindeki yardımcı kitaplık ssl-ca = / home / mysql / certs / ca-cert.pem ssl-cert = / home / mysql / certs / client-cert.pem ssl-key = / home / mysql / certs / client-key.pem
Ayrıca, birleşik yönetimi kolaylaştırmak için, aynı makinede hem sunucu hem de istemci türlerini destekleyen tek bir SSL sertifikası kullanılabilir. Bir SSL sertifikası oluştururken yalnızca iki tür kullanım belirlemeniz veya her iki kullanımı da doğrudan belirtmemeniz gerekir.
Yapılandırmadan sonra, SSL'nin etkin olup olmadığını kontrol edin
mysql > "% Ssl%" GİBİ DEĞİŞKENLERİ GÖSTER;
+ + + | Değişken_adı | Değer | + + + | have_openssl | EVET | | have_ssl | EVET | | ssl_ca | /home/mysql/certs/ca-cert.pem | | ssl_capath | | | ssl_cert | /home/mysql/certs/mysql-cert.pem | | ssl_cipher | | ssl_key | /home/mysql/certs/mysql-key.pem | + + + Sette 5 satır (0,00 sn)Çıktı yukarıdaki gibiyse, bu, SSL'nin normalde etkinleştirildiği anlamına gelir
2.3.2 SSL gerektirir ve X509 gerektirir
Harici ağdan erişen MySQL kullanıcılarının SSL şifreleme kullanmasını sağlamak için, kullanıcıları oluştururken GEREKLİ SSL veya GEREK X509'u zorlayabilirsiniz:
mysql > 'Testpass' İLE TANIMLANAN KULLANICI "testuser "@1.2.3.4" OLUŞTURUN SSL GEREKTİRİN; mysql > Testpass İLE TANIMLANAN KULLANICI "testuser "@1.2.3.4" OLUŞTURMA X509 GEREKTİRİR;İkisi arasındaki fark, REQUIRE SSL'in istemcinin yalnızca belirtilen ca sertifikasını sunucu sertifikasını doğrulamak için kullanmasını gerektirirken REQUIRE X509 ayrıca sunucunun istemci sertifikasını doğrulamasını gerektirir. Ortadaki adam saldırılarını önlemek ve daha güvenli iletişim sağlamak için genellikle REQUIRE X509 kullanılması önerilir.
2.3.3 OpenSSL ve yaSSL
MySQL, şifreli iletişim için kendi yaSSL kitaplığını veya şifreli iletişim için OpenSSL'yi kullanabilir. Hangisini kullanacağınızı derlerken WITH_SSL: STRING parametresini belirtmeniz gerekir:
paketlenmiş (yassl kullanın), evet (varsa işletim sistemi kitaplığını tercih edin, aksi takdirde birlikte kullanın), sistem (os kitaplığını kullanın), < / yol / özel / kurulum >Daha iyi güvenlik için, sistemle birlikte gelen OpenSSL'yi kullanabilir ve yum / apt'yi zamanında güncelleyebilirsiniz.
Farklı sürümlerin uyumluluğunu düşünüyorsanız, yerleşik yaSSL'yi kullanmanız önerilir.
Örneğin, OpenSSL bir zamanlar CVE-2015-4000'in güvenlik açığına yanıt olarak DH anahtarının minimum değerini 768 bite yükseltti ve MySQL'in bazı eski sürümleri DH anahtarı için 512 bit kullandı. MySQL'in varsayılan SSL şifreleme algoritması DHE-RSA-AES256-SHA olduğundan, OpenSSL MySQL kullanılıyorsa, farklı sürümler arasında erişirken ERROR 2026 görünebilir.
2.3.4 SSL tabanlı master-slave iletişimini izleyin
SSL şifrelemesini yapılandırdıktan sonra, MySQL master-slave iletişimini yeniden yakalamaya çalışıyoruz.
MySQL master ve slave'in oturum açma hesabının elde edilemediği bulundu:
Ek olarak, yakalanan MySQL master-slave verileri de bozuktur:
MySQL master ve slave, SSL ile şifrelendiğinde, etkili bir şekilde gizlice dinlemenin sağlanamadığı görülebilir.
3 Yerel güvenlik erişimi
3.1 SSH tüneli
Genel olarak, uzak sunucuya yerel olarak erişmek için SSH'ye ihtiyacımız var Şu anda, uzak sunucunun belirli bağlantı noktasına erişmek için bir SSH tüneli oluşturabiliriz.
SecureCRT'nin (Putty'ye benzer) bağlantı noktası yönlendirme işlevini kullanıyorsanız, yerel 3306 bağlantı noktasını sunucunun 3306 bağlantı noktasına iletin:
Navicat gibi araçları kullanmaya alışkınsanız, yerleşik SSH tünel işlevini kullanabilirsiniz (eski sürümün özel anahtarı ppk formatına dönüştürmesi gerekebileceğini unutmayın):
3.2 phpmyadmin + HTTPS
MySQL'e erişmek için phpmyadmin'in web yöntemini kullanmaya alışkınsanız, erişim yöntemini HTTPS ile birleştirmeniz yeterlidir:
sunucu { 80 dinle; sunucu_adı phpmyadmin.example.com; # HTTP'yi HTTPS'ye zorlamak için HSTS'yi kullanın add_header Strict-Transport-Security max-age = 31536000; ... } sunucu { 443 ssl http2 dinle; sunucu_adı phpmyadmin.example.com; #Configure server SSL sertifikası ssl açık; ssl_certificate /etc/letsencrypt/live/phpmyadmin.example.com/fullchain.pem; ssl_certificate_key / etc / letsencrypt / live / phpmyadmin.example.com/privkey.pem; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ... }4 özet
MySQL'in veri güvenliği çok büyük bir konudur ve dış ağlar arasındaki güvenli iletişim genellikle göz ardı edilir. HTTPS / SMTPS / POP3S / IMAPS'ın giderek artan popülaritesiyle, TCP ve UDP'ye dayalı çeşitli şifreli iletişim şemaları çevrimiçi hizmetlere giderek daha fazla uygulanacaktır. Bu makale, MySQL'e sunucudan sunucuya erişimin bazı senaryoları için çeşitli şifreleme iletişim şemalarını tanıtır.Size bazı fikirler vermeyi ve MySQL'in şifreli erişimini kullanmak için gerçek ihtiyaçlarınızı birleştirmeyi umuyorum.