Merhaba arkadaşlar, bugün sizlere özellikle yeni sunucu kurulumlarında çok kritik olan bir konudan bahsedeceğim: MySQL veya MariaDB'de kullanıcı yetkilendirmesi ve uzaktan bağlantı güvenliği. Yıllar içinde gördüğüm en yaygın güvenlik açıklarından biri, varsayılan ayarlarla bırakılan veya "root" kullanıcısının her yerden bağlanmasına izin verilen veritabanı sunucuları. Bu rehberde, hem sunucunuzu daha güvenli hale getirecek hem de yetki karmaşasını önleyecek adımları anlatacağım.
Temel Güvenlik Önlemleri ve Root Kullanıcısı
İlk yapmanız gereken, kurulum sonrası temel güvenlik betiğini çalıştırmak. MariaDB için genelde kurulu gelir, MySQL'de ise manuel çalıştırmanız gerekebilir.
Bu betik size; anonim kullanıcıları silmeyi, root'un uzaktan bağlanmasını engellemeyi, test veritabanını kaldırmayı ve root şifresini yeniden ayarlamayı soracak. Benim sunucularda genelde hepsine "Y" (Evet) cevabını veririm.
Daha sonra, root kullanıcısının sadece yerel sunucudan (localhost) bağlanabildiğinden emin olun. Bunu kontrol etmek için MySQL/MariaDB kabuğuna girin:
Eğer host sütununda '%' (yüzde işareti) görürseniz, bu root'un herhangi bir IP'den bağlanabileceği anlamına gelir. Hemen bu yetkiyi kaldırmanızı tavsiye ederim.
Uygulama Bazlı Özel Kullanıcı Oluşturma
Her web uygulamanız (WordPress, özel yazılımınız vb.) için ayrı bir veritabanı ve ayrı bir kullanıcı oluşturun. "root" kullanıcısını asla uygulama bağlantılarında kullanmayın. İşte örnek bir senaryo: "myblog" adında bir WordPress siteniz olsun.
Önce veritabanını oluşturalım:
Şimdi bu veritabanı için özel bir kullanıcı oluşturalım. Kullanıcı adı ve şifreyi güçlü seçin.
Son olarak, bu kullanıcıya SADECE kendi veritabanı üzerinde gerekli tüm yetkileri (GRANT ALL) verelim:
İşlemlerin geçerli olması için yetkileri yeniden yüklemeyi unutmayın:
Bu şekilde, bir uygulama tehlikeye girerse bile diğer veritabanlarınız etkilenmez.
Uzaktan Bağlantıyı Güvenli Hale Getirme
Bazen bir uygulamanın farklı bir sunucudan veritabanına bağlanması gerekebilir. Bu durumda, kullanıcı oluştururken 'localhost' yerine, bağlanacak sunucunun SABİT IP adresini belirtmek en güvenli yöntemdir. Diyelim ki uygulama sunucunuzun IP'si `192.168.1.100` olsun.
Şu ayara çok dikkat etmelisiniz: Eğer gerçekten çok gerekli değilse, '%' (her yer) ifadesini kullanarak kullanıcı oluşturmayın. Bu, güvenlik duvarınızı devre dışı bırakmak gibidir.
Güvenlik Duvarı ve Bağlantı Ayarları[/COLUM]
Kullanıcı yetkilerini ayarladınız, peki ya sunucunuzun güvenlik duvarı? MySQL/MariaDB varsayılan olarak `3306` portunu kullanır. Bu portu sadece güvendiğiniz IP adreslerine açmalısınız. Örnek bir UFW (Uncomplicated Firewall) kuralı:
Ayrıca, bağlantı ayar dosyasını da kontrol edin. Genellikle /etc/mysql/mariadb.conf.d/50-server.cnf veya /etc/mysql/my.cnf dosyasında `bind-address` satırını bulun.
Eğer sadece yerel sunucudan bağlantı kabul edecekseniz bu adres yeterli. Farklı bir sunucudan bağlanılacaksa, buraya sunucunuzun yerel IP'sini (örn: 192.168.1.1) yazabilirsiniz. Asla `0.0.0.0` yapmayın.
Yetkileri Kontrol Etme ve Temizlik
Zamanla birçok kullanıcı ve yetki birikebilir. Periyodik olarak kontrol etmek iyi olur. Hangi kullanıcıların hangi yetkileri olduğunu görmek için:
Kullanılmayan bir kullanıcıyı silmek için ise:
Son bir tavsiye: Tüm bu değişiklikleri yapmadan önce, özellikle canlı sunucularda, mutlaka bir yedeğini alın. /etc/mysql/ dizinini ve veritabanlarınızı yedeklemek sizi büyük baş ağrılarından kurtarır.
Umarım bu rehber, veritabanı sunucunuzun güvenliğini sağlamlaştırmanıza yardımcı olur. Ben genelde her proje için ayrı kullanıcı + güçlü parola + IP kısıtlaması üçlüsünü uyguluyorum. Siz bu konfigürasyonu kendi sunucularınızda nasıl yapıyorsunuz? Farklı önerileriniz veya takıldığınız bir nokta varsa aşağıya yazmaktan çekinmeyin. Kolay gelsin!
İlk yapmanız gereken, kurulum sonrası temel güvenlik betiğini çalıştırmak. MariaDB için genelde kurulu gelir, MySQL'de ise manuel çalıştırmanız gerekebilir.
Bash:
sudo mysql_secure_installation
Bu betik size; anonim kullanıcıları silmeyi, root'un uzaktan bağlanmasını engellemeyi, test veritabanını kaldırmayı ve root şifresini yeniden ayarlamayı soracak. Benim sunucularda genelde hepsine "Y" (Evet) cevabını veririm.
Daha sonra, root kullanıcısının sadece yerel sunucudan (localhost) bağlanabildiğinden emin olun. Bunu kontrol etmek için MySQL/MariaDB kabuğuna girin:
SQL:
SELECT user, host FROM mysql.user WHERE user = 'root';
Eğer host sütununda '%' (yüzde işareti) görürseniz, bu root'un herhangi bir IP'den bağlanabileceği anlamına gelir. Hemen bu yetkiyi kaldırmanızı tavsiye ederim.
Her web uygulamanız (WordPress, özel yazılımınız vb.) için ayrı bir veritabanı ve ayrı bir kullanıcı oluşturun. "root" kullanıcısını asla uygulama bağlantılarında kullanmayın. İşte örnek bir senaryo: "myblog" adında bir WordPress siteniz olsun.
Önce veritabanını oluşturalım:
SQL:
CREATE DATABASE myblog_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Şimdi bu veritabanı için özel bir kullanıcı oluşturalım. Kullanıcı adı ve şifreyi güçlü seçin.
SQL:
CREATE USER 'myblog_user'@'localhost' IDENTIFIED BY 'GüçlüBirParola123!';
Son olarak, bu kullanıcıya SADECE kendi veritabanı üzerinde gerekli tüm yetkileri (GRANT ALL) verelim:
SQL:
GRANT ALL PRIVILEGES ON myblog_db. TO 'myblog_user'@'localhost';
İşlemlerin geçerli olması için yetkileri yeniden yüklemeyi unutmayın:
SQL:
FLUSH PRIVILEGES;
Bu şekilde, bir uygulama tehlikeye girerse bile diğer veritabanlarınız etkilenmez.
Bazen bir uygulamanın farklı bir sunucudan veritabanına bağlanması gerekebilir. Bu durumda, kullanıcı oluştururken 'localhost' yerine, bağlanacak sunucunun SABİT IP adresini belirtmek en güvenli yöntemdir. Diyelim ki uygulama sunucunuzun IP'si `192.168.1.100` olsun.
SQL:
CREATE USER 'myapp_user'@'192.168.1.100' IDENTIFIED BY 'BaşkaGüçlüParola456!';
GRANT SELECT, INSERT, UPDATE, DELETE ON myapp_db. TO 'myapp_user'@'192.168.1.100';
FLUSH PRIVILEGES;
Şu ayara çok dikkat etmelisiniz: Eğer gerçekten çok gerekli değilse, '%' (her yer) ifadesini kullanarak kullanıcı oluşturmayın. Bu, güvenlik duvarınızı devre dışı bırakmak gibidir.
Kullanıcı yetkilerini ayarladınız, peki ya sunucunuzun güvenlik duvarı? MySQL/MariaDB varsayılan olarak `3306` portunu kullanır. Bu portu sadece güvendiğiniz IP adreslerine açmalısınız. Örnek bir UFW (Uncomplicated Firewall) kuralı:
Bash:
sudo ufw allow from 192.168.1.100 to any port 3306
Ayrıca, bağlantı ayar dosyasını da kontrol edin. Genellikle /etc/mysql/mariadb.conf.d/50-server.cnf veya /etc/mysql/my.cnf dosyasında `bind-address` satırını bulun.
NGINX:
bind-address = 127.0.0.1
Zamanla birçok kullanıcı ve yetki birikebilir. Periyodik olarak kontrol etmek iyi olur. Hangi kullanıcıların hangi yetkileri olduğunu görmek için:
SQL:
SELECT user, host, Grant_priv, Super_priv FROM mysql.user;
Kullanılmayan bir kullanıcıyı silmek için ise:
SQL:
DROP USER 'eski_kullanici'@'localhost';
Son bir tavsiye: Tüm bu değişiklikleri yapmadan önce, özellikle canlı sunucularda, mutlaka bir yedeğini alın. /etc/mysql/ dizinini ve veritabanlarınızı yedeklemek sizi büyük baş ağrılarından kurtarır.
Umarım bu rehber, veritabanı sunucunuzun güvenliğini sağlamlaştırmanıza yardımcı olur. Ben genelde her proje için ayrı kullanıcı + güçlü parola + IP kısıtlaması üçlüsünü uyguluyorum. Siz bu konfigürasyonu kendi sunucularınızda nasıl yapıyorsunuz? Farklı önerileriniz veya takıldığınız bir nokta varsa aşağıya yazmaktan çekinmeyin. Kolay gelsin!