CentOS 8 Üzerinde MongoDB İçin Uzaktan Erişimi Yapılandırma Rehberi
Günümüzün hızla değişen dijital dünyasında, veritabanlarına uzaktan erişim, geliştiriciler ve sistem yöneticileri için vazgeçilmez bir gereklilik haline gelmiştir. MongoDB gibi NoSQL veritabanları, esneklikleri ve ölçeklenebilirlikleri nedeniyle popülerliğini artırmış, ancak uzaktan erişim yapılandırması sırasında güvenlik önlemlerinin titizlikle uygulanması büyük önem taşımaktadır. Bu makale, CentOS 8 işletim sistemi üzerinde çalışan bir MongoDB sunucusuna güvenli bir şekilde uzaktan erişimi nasıl yapılandıracağınızı adım adım açıklamaktadır. Amacımız, hem işlevselliği sağlamak hem de potansiyel güvenlik açıklarını minimize etmektir.
Uzaktan erişim, geliştirme ekiplerinin farklı coğrafyalardan veritabanıyla etkileşim kurmasına, uygulamaların sunuculardan veritabanına bağlanmasına ve yönetim araçlarının merkezi bir konumdan veritabanını izlemesine olanak tanır. Ancak, bu kolaylık beraberinde ciddi güvenlik risklerini de getirebilir. Yanlış yapılandırılmış bir uzaktan erişim, yetkisiz erişimlere, veri ihlallerine ve hizmet kesintilerine yol açabilir. Bu nedenle, güvenlik duvarı ayarlarından MongoDB’nin kendi kimlik doğrulama mekanizmalarına kadar her adımın dikkatlice ele alınması şarttır.
Bu kapsamlı rehberde, ilk olarak ön koşulları ele alacak, ardından güvenlik duvarı yapılandırması, MongoDB yapılandırma dosyasının düzenlenmesi, kullanıcı yönetimi ve uzaktan erişimin test edilmesi gibi temel adımları detaylandıracağız. Ayrıca, IP beyaz listeleme, TLS/SSL şifrelemesi ve SSH tünelleme gibi gelişmiş güvenlik önlemlerine de değinerek, veritabanınızın güvenliğini en üst düzeye çıkarmanıza yardımcı olacağız. Her adım, açık komut örnekleri ve açıklamalarla desteklenerek, konuya yeni başlayanlardan deneyimli sistem yöneticilerine kadar herkesin kolayca uygulayabileceği şekilde tasarlanmıştır.
Ön Koşullar
Bu rehbere başlamadan önce, aşağıdaki ön koşulların yerine getirilmiş olması gerekmektedir:
- CentOS 8 İşletim Sistemi: Sunucunuzda CentOS 8’in kurulu ve güncel olması. Tüm sistem güncellemelerini
sudo dnf update -ykomutu ile uygulamanız önerilir. - MongoDB Sunucusu: CentOS 8 üzerine MongoDB’nin kurulu ve çalışır durumda olması. Henüz kurmadıysanız, MongoDB’nin resmi dokümantasyonunu takip ederek kurulumu tamamlamanız gerekmektedir. Genellikle
sudo systemctl start mongodvesudo systemctl enable mongodkomutları ile hizmetin başlatılması ve otomatik başlatılmasının sağlanması gerekir. - Root veya Sudo Yetkileri: Yapılandırma dosyalarını düzenlemek ve sistem hizmetlerini yönetmek için root kullanıcısı veya sudo yetkilerine sahip bir kullanıcı hesabınızın olması.
- Temel Linux Komut Satırı Bilgisi:
vi,nanogibi metin düzenleyicileri ve temel sistem komutlarını kullanabilme yeteneği. - Ağ Bilgisi: Sunucunuzun IP adresi ve ağ yapılandırması hakkında temel bilgi.
Güvenlik İlkeleri: Uzaktan Erişimi Yapılandırmadan Önce
MongoDB’ye uzaktan erişimi etkinleştirmek, potansiyel güvenlik açıklarını beraberinde getirir. Bu nedenle, yapılandırmaya başlamadan önce aşağıdaki temel güvenlik ilkelerini anlamak ve uygulamak kritik öneme sahiptir:
- Kimlik Doğrulama (Authentication) Her Zaman Etkin Olmalı: Asla kimlik doğrulama olmadan uzaktan erişime izin vermeyin. MongoDB’nin
security.authorization: enabledayarı her zaman açık olmalıdır. Aksi takdirde, herkes veritabanınıza tam erişim sağlayabilir. - Güvenlik Duvarı (Firewall) Kullanımı: Yalnızca gerekli portları (MongoDB için varsayılan 27017/tcp) açın ve mümkünse sadece belirli IP adreslerinden gelen bağlantılara izin verin.
- IP Beyaz Listeleme (IP Whitelisting): MongoDB yapılandırma dosyasında
bindIpayarını sadece güvenilir istemcilerin IP adresleriyle sınırlandırın.0.0.0.0kullanmak, tüm IP adreslerinden gelen bağlantılara izin vermek anlamına gelir ve bu, güvenlik duvarı kuralları olmadan son derece risklidir. - TLS/SSL Şifrelemesi: Hassas verileri ağ üzerinden iletirken, verilerin şifrelenmesini sağlamak için TLS/SSL kullanın. Bu, Man-in-the-Middle (MITM) saldırılarını önlemeye yardımcı olur.
- Güçlü Parolalar ve Rol Tabanlı Erişim Kontrolü: MongoDB kullanıcıları için güçlü, karmaşık parolalar kullanın ve her kullanıcıya yalnızca ihtiyaç duyduğu minimum yetkileri veren rol tabanlı erişim kontrolünü (RBAC) uygulayın.
- Düzenli Güncellemeler: MongoDB sunucunuzu ve işletim sisteminizi düzenli olarak güncelleyerek bilinen güvenlik açıklarına karşı koruma sağlayın.
Adım 1: Güvenlik Duvarını Yapılandırma (Firewalld)
CentOS 8, varsayılan olarak firewalld hizmetini kullanır. MongoDB’ye uzaktan erişime izin vermek için, MongoDB’nin varsayılan portu olan 27017’yi güvenlik duvarında açmanız gerekir. Bu adım, sunucunuza dışarıdan gelen bağlantıların bu porta ulaşabilmesini sağlar.
1.1. Mevcut Güvenlik Duvarı Durumunu Kontrol Etme
Öncelikle, firewalld hizmetinin çalışır durumda olduğundan emin olun ve mevcut kuralları kontrol edin:
sudo systemctl status firewalld
sudo firewall-cmd --get-active-zones
sudo firewall-cmd --zone=public --list-ports
Eğer firewalld çalışmıyorsa, aşağıdaki komutlarla başlatabilir ve sistem başlangıcında otomatik başlamasını sağlayabilirsiniz:
sudo systemctl start firewalld
sudo systemctl enable firewalld
1.2. MongoDB Portunu Güvenlik Duvarına Ekleme
MongoDB’nin varsayılan portu olan 27017’yi TCP protokolü üzerinden public bölgesine ekleyin. --permanent bayrağı, kuralın yeniden başlatmalarda da kalıcı olmasını sağlar:
sudo firewall-cmd --zone=public --add-port=27017/tcp --permanent
1.3. Güvenlik Duvarını Yeniden Yükleme
Yeni kuralın etkili olması için güvenlik duvarını yeniden yüklemeniz gerekir:
sudo firewall-cmd --reload
1.4. Portun Açıldığını Doğrulama
Portun başarıyla eklendiğini doğrulamak için public bölgesindeki portları tekrar listeleyin:
sudo firewall-cmd --zone=public --list-ports
Çıktıda 27017/tcp ifadesini görmelisiniz.
Önemli Not: Eğer sadece belirli IP adreslerinden erişime izin vermek istiyorsanız, firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="X.X.X.X" port port="27017" protocol="tcp" accept' komutunu kullanabilirsiniz. Burada X.X.X.X yerine izin vermek istediğiniz IP adresini yazmalısınız. Birden fazla IP için bu komutu her IP için ayrı ayrı çalıştırmanız gerekir.
Adım 2: MongoDB Yapılandırma Dosyasını Düzenleme
MongoDB’nin uzaktan bağlantıları kabul etmesi için yapılandırma dosyasında (genellikle /etc/mongod.conf) değişiklik yapmanız gerekir. Bu dosya, MongoDB sunucusunun nasıl davranacağını belirleyen önemli ayarlara sahiptir.
2.1. Yapılandırma Dosyasını Açma
Bir metin düzenleyici kullanarak mongod.conf dosyasını açın. vi veya nano kullanabilirsiniz:
sudo vi /etc/mongod.conf
veya
sudo nano /etc/mongod.conf
2.2. bindIp Ayarını Değiştirme
Yapılandırma dosyasında net: bölümünü bulun. Varsayılan olarak, MongoDB yalnızca yerel bağlantılara izin vermek için 127.0.0.1 (localhost) adresine bağlanır. Uzaktan erişime izin vermek için bu ayarı değiştirmeniz gerekir.
Aşağıdaki satırı bulun:
# network interfaces
net:
port: 27017
bindIp: 127.0.0.1
Bu satırı, sunucunun tüm ağ arayüzlerinden gelen bağlantıları dinlemesini sağlamak için 0.0.0.0 olarak değiştirin. Alternatif olarak, sadece belirli IP adreslerinden gelen bağlantılara izin vermek için sunucunuzun IP adresini veya virgülle ayrılmış birden fazla IP adresini belirtebilirsiniz.
# network interfaces
net:
port: 27017
bindIp: 0.0.0.0 # Veya sunucunuzun özel IP adresi, örn: 192.168.1.100
# Güvenlik için, sadece belirli istemci IP'lerini de ekleyebilirsiniz:
# bindIp: 127.0.0.1, 192.168.1.100, 10.0.0.5
Uyarı: bindIp: 0.0.0.0 kullanmak, sunucunuzun tüm ağ arayüzlerinden gelen bağlantıları dinlemesi anlamına gelir. Bu, özellikle güvenlik duvarı kurallarınız yoksa veya yetersizse ciddi bir güvenlik riski oluşturabilir. Üretim ortamlarında, mümkünse belirli IP adreslerini veya IP aralıklarını belirtmek, en iyi güvenlik uygulamasıdır.
2.3. Kimlik Doğrulamayı (Authentication) Etkinleştirme
Uzaktan erişimi etkinleştirdiğinizde, kimlik doğrulamanın mutlaka etkin olması gerekir. Bu, yetkisiz kullanıcıların veritabanınıza erişmesini engeller.
Yapılandırma dosyasında security: bölümünü bulun ve authorization: enabled satırının etkin olduğundan emin olun (başında # işareti olmamalıdır):
# security:
security:
authorization: enabled
Eğer bu bölüm yoksa, dosyanın sonuna ekleyebilirsiniz.
2.4. Değişiklikleri Kaydetme ve Çıkma
vikullanıyorsanız: Değişiklikleri kaydetmek ve çıkmak içinEsctuşuna basın, ardından:wqyazıpEntertuşuna basın.nanokullanıyorsanız: Değişiklikleri kaydetmek içinCtrl+O, ardındanEntertuşuna basın ve çıkmak içinCtrl+Xtuşuna basın.
Adım 3: MongoDB Hizmetini Yeniden Başlatma
Yapılandırma dosyasında yaptığınız değişikliklerin geçerli olması için MongoDB hizmetini yeniden başlatmanız gerekir:
sudo systemctl restart mongod
Hizmetin başarıyla yeniden başlatıldığını ve herhangi bir hata olup olmadığını kontrol etmek için durumunu kontrol edin:
sudo systemctl status mongod
Çıktıda active (running) ibaresini görmelisiniz. Herhangi bir hata durumunda, MongoDB’nin log dosyalarını kontrol etmeniz gerekebilir: /var/log/mongodb/mongod.log.
Adım 4: MongoDB’de Kullanıcı ve Rol Oluşturma
Kimlik doğrulama etkinleştirildiğinde, veritabanına erişmek için bir kullanıcı adı ve parola sağlamanız gerekir. İlk olarak, bir yönetici kullanıcısı oluşturmanız önemlidir. Bu kullanıcı, diğer veritabanı kullanıcılarını oluşturma ve yönetme yetkisine sahip olacaktır.
4.1. Yönetici Kullanıcısı Oluşturma
MongoDB’ye yerel olarak bağlanın (şimdilik kimlik doğrulamaya gerek yok çünkü henüz hiçbir kullanıcı yok ve ilk bağlantı için izin verilir):
mongo
Ardından, admin veritabanına geçin ve bir yönetici kullanıcısı oluşturun:
use admin
db.createUser(
{
user: "mongoAdmin",
pwd: passwordPrompt(), // Parolayı güvenli bir şekilde girmenizi sağlar
roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase", "dbAdminAnyDatabase" ]
}
)
passwordPrompt() komutu, parolayı komut satırında görünmeden girmenizi sağlar. Güçlü bir parola seçtiğinizden emin olun.
Bu kullanıcıya userAdminAnyDatabase, readWriteAnyDatabase ve dbAdminAnyDatabase rolleri verilerek, tüm veritabanları üzerinde kullanıcı ve veritabanı yönetimi ile okuma/yazma yetkileri sağlanmıştır. Üretim ortamında, en az ayrıcalık ilkesini uygulayarak rolleri daha spesifik tutmanız önerilir.
4.2. Yönetici Kullanıcısı ile Kimlik Doğrulama
Yönetici kullanıcısını oluşturduktan sonra, mevcut oturumu kapatıp yönetici kullanıcınızla tekrar bağlanmayı deneyin. Bu, kimlik doğrulamanın doğru çalıştığını kontrol etmenizi sağlar:
exit
mongo -u mongoAdmin -p --authenticationDatabase admin
Parola istendiğinde, az önce oluşturduğunuz yönetici kullanıcısının parolasını girin. Bağlantı başarılı olursa, artık kimlik doğrulaması etkinleştirilmiş bir MongoDB oturumundasınız demektir.
4.3. Uygulama Kullanıcıları Oluşturma
Uygulamalarınızın veya diğer kullanıcıların belirli bir veritabanına erişmesi için ayrı kullanıcılar oluşturmanız önerilir. Bu, yönetici hesabının ayrıcalıklarını kısıtlayarak güvenliği artırır.
Örneğin, myAppDB adında bir veritabanı için appUser adında bir kullanıcı oluşturalım:
use myAppDB // Eğer veritabanı yoksa oluşturulur
db.createUser(
{
user: "appUser",
pwd: passwordPrompt(),
roles: [ { role: "readWrite", db: "myAppDB" } ]
}
)
Bu kullanıcıya sadece myAppDB veritabanı üzerinde okuma ve yazma yetkisi verilmiştir. Diğer veritabanlarına veya yönetimsel işlemlere erişimi yoktur.
Adım 5: Uzaktan Erişimi Test Etme
Şimdiye kadar yaptığınız tüm yapılandırmaların doğru çalıştığından emin olmak için, farklı bir makineden (istemci) MongoDB sunucunuza uzaktan bağlanmayı deneyin.
5.1. İstemci Makineden Bağlantı
İstemci makinenizde MongoDB kabuğunun (mongo shell) kurulu olduğundan emin olun. Ardından, aşağıdaki komutu kullanarak bağlanmayı deneyin:
mongo --host --port 27017 -u mongoAdmin -p --authenticationDatabase admin
- : CentOS 8 sunucunuzun IP adresidir.
-u mongoAdmin: Bağlanmak istediğiniz kullanıcı adı (örneğin, az önce oluşturduğunuz yönetici kullanıcısı).-p: Parola girmenizi ister.--authenticationDatabase admin: Kullanıcının kimlik doğrulamasının yapılacağı veritabanını belirtir (yönetici kullanıcıları genellikleadminveritabanında tanımlanır).
Eğer appUser gibi belirli bir uygulama kullanıcısıyla bağlanıyorsanız, komut şu şekilde olacaktır:
mongo --host --port 27017 -u appUser -p --authenticationDatabase myAppDB
Bağlantı başarılı olursa, MongoDB kabuğuna düşeceksiniz ve komut isteminde > işaretini göreceksiniz. Artık uzaktan MongoDB sunucunuzla etkileşim kurabilirsiniz. Örneğin:
show dbs
use myAppDB
db.collection.find()
Gelişmiş Güvenlik Önlemleri
Yukarıdaki adımlar, MongoDB’ye uzaktan erişimi güvenli bir şekilde yapılandırmak için temel bir çerçeve sunar. Ancak, daha yüksek güvenlik gereksinimleri olan üretim ortamları için ek önlemler almak önemlidir.
6.1. IP Beyaz Listeleme (Daha Kısıtlı bindIp)
Daha önce de belirtildiği gibi, bindIp: 0.0.0.0 yerine yalnızca belirli, güvenilir IP adreslerinden gelen bağlantılara izin vermek çok daha güvenlidir. mongod.conf dosyasında bindIp ayarını şu şekilde güncelleyebilirsiniz:
net:
port: 27017
bindIp: 127.0.0.1, 192.168.1.10, 10.0.0.50
Burada 192.168.1.10 ve 10.0.0.50, MongoDB’ye erişmesi gereken istemcilerin IP adresleridir. Bu değişikliği yaptıktan sonra MongoDB hizmetini yeniden başlatmayı unutmayın.
6.2. TLS/SSL Şifrelemesi
Ağ üzerinden iletilen verilerin şifrelenmesi, hassas bilgilerin korunması için kritik öneme sahiptir. MongoDB, TLS/SSL kullanarak istemci-sunucu iletişimi şifrelemesini destekler. Bu, sertifika yetkilisi (CA) tarafından imzalanmış bir SSL sertifikası gerektirir.
TLS/SSL’i etkinleştirmek için, mongod.conf dosyasında net.ssl bölümünü yapılandırmanız gerekir:
net:
port: 27017
bindIp: 0.0.0.0
ssl:
mode: requireSSL
PEMKeyFile: /etc/ssl/mongodb.pem
CAFile: /etc/ssl/ca.pem
mode:allowSSL,preferSSL,requireSSLdeğerlerini alabilir.requireSSLen güvenli olanıdır.PEMKeyFile: Sunucunuzun SSL sertifikası ve özel anahtarını içeren PEM dosyasının yolu.CAFile: İstemci sertifikalarını doğrulamak için kullanılan CA sertifikasının yolu.
TLS/SSL yapılandırması, sertifika oluşturma ve yönetimi nedeniyle daha karmaşık bir süreçtir ve ayrı bir rehber konusu olabilir. Ancak, üretim ortamlarında bu özelliği etkinleştirmek şiddetle tavsiye edilir.
6.3. SSH Tünelleme
Eğer MongoDB sunucunuz doğrudan internete açık değilse veya ek bir güvenlik katmanı istiyorsanız, SSH tünelleme (port yönlendirme) kullanabilirsiniz. Bu yöntem, MongoDB trafiğini şifreli bir SSH bağlantısı üzerinden yönlendirir.
İstemci makinenizden aşağıdaki komutu çalıştırarak bir SSH tüneli oluşturabilirsiniz:
ssh -L 27017:localhost:27017 user@ -N
-L 27017:localhost:27017: İstemcinin yerel 27017 portunu, uzak sunucununlocalhost:27017portuna yönlendirir.user@: SSH bağlantısı için kullanıcı adı ve MongoDB sunucusunun IP adresi.-N: Uzak komut çalıştırmaz, sadece port yönlendirmesi yapar.
Tünel kurulduktan sonra, istemci makinenizden MongoDB’ye bağlanırken, MongoDB sunucusunun IP adresi yerine localhost veya 127.0.0.1 kullanabilirsiniz:
mongo --host 127.0.0.1 --port 27017 -u mongoAdmin -p --authenticationDatabase admin
Bu yöntem, MongoDB’nin bindIp ayarını 127.0.0.1 olarak tutmanıza olanak tanır, böylece MongoDB sunucunuz doğrudan dış dünyaya açık olmaz.
6.4. SELinux Yapılandırması
CentOS 8, SELinux’u (Security-Enhanced Linux) varsayılan olarak etkinleştirir. Bazen SELinux, MongoDB’nin varsayılan portu dışında bir portta çalışmasına veya ağ bağlantıları kurmasına engel olabilir. Eğer MongoDB’yi varsayılan port 27017 dışında bir portta çalıştırıyorsanız ve bağlantı sorunları yaşıyorsanız, SELinux’u kontrol etmeniz gerekebilir.
Örneğin, MongoDB’yi 27018 portunda çalıştırıyorsanız, SELinux’a bu portu tanıtmanız gerekebilir:
sudo semanage port -a -t mongod_port_t -p tcp 27018
Genellikle, varsayılan 27017 portu için bu tür bir yapılandırmaya gerek yoktur, ancak sorun yaşamanız durumunda kontrol etmekte fayda vardır.
Sorun Giderme
Uzaktan erişim yapılandırması sırasında karşılaşabileceğiniz bazı yaygın sorunlar ve çözümleri:
7.1. Bağlantı Reddedildi (Connection Refused)
- Güvenlik Duvarı: MongoDB portunun (27017/tcp) güvenlik duvarında açık olduğundan emin olun (
sudo firewall-cmd --zone=public --list-ports). - MongoDB
bindIpAyarı:/etc/mongod.confdosyasındakibindIpayarının doğru yapılandırıldığından emin olun (örn.0.0.0.0veya istemcinin IP adresi). - MongoDB Hizmeti Çalışmıyor: MongoDB hizmetinin çalışır durumda olduğundan emin olun (
sudo systemctl status mongod).
7.2. Kimlik Doğrulama Hatası (Authentication Failed)
- Yanlış Kullanıcı Adı/Parola: Bağlanırken doğru kullanıcı adı ve parolayı kullandığınızdan emin olun.
--authenticationDatabaseParametresi: Kullanıcının oluşturulduğu veritabanını (adminveyamyAppDBgibi)--authenticationDatabaseparametresiyle doğru bir şekilde belirttiğinizden emin olun.- Yetkilendirme Kapalı:
/etc/mongod.confdosyasındasecurity.authorization: enabledayarının etkin olduğundan emin olun.
7.3. Zaman Aşımı (Connection Timeout)
- Ağ Bağlantısı: İstemci makinenizden MongoDB sunucusuna ping atarak ağ bağlantısını kontrol edin (
ping). - Güvenlik Duvarı: Sunucu güvenlik duvarının, istemcinizin IP adresinden gelen bağlantıları engellemediğinden emin olun.
- Bulut Sağlayıcı Güvenlik Grupları: Eğer bir bulut ortamında (AWS, Azure, Google Cloud vb.) çalışıyorsanız, bulut sağlayıcınızın güvenlik gruplarının veya ağ ACL’lerinin 27017 portuna erişime izin verdiğinden emin olun.
7.4. Log Dosyalarını Kontrol Etme
Herhangi bir sorunla karşılaştığınızda, MongoDB’nin log dosyalarını kontrol etmek size değerli bilgiler sağlayabilir:
sudo tail -f /var/log/mongodb/mongod.log
Bu komut, log dosyasının sonunu gerçek zamanlı olarak gösterir ve bağlantı denemeleri veya yapılandırma hataları hakkında ipuçları bulmanıza yardımcı olabilir.
Sonuç
Bu rehberde, CentOS 8 üzerinde MongoDB için uzaktan erişimi güvenli bir şekilde nasıl yapılandıracağınızı adım adım öğrendiniz. Güvenlik duvarı ayarlarından MongoDB’nin kendi yapılandırma dosyasına, kullanıcı yönetiminden gelişmiş güvenlik önlemlerine kadar her detayı ele aldık. Unutulmamalıdır ki, bir veritabanına uzaktan erişim sağlamak her zaman potansiyel riskler taşır ve bu riskleri minimize etmek için sürekli tetikte olmak gerekir.
Her zaman en az ayrıcalık ilkesini uygulayın: Kullanıcılara ve uygulamalara yalnızca ihtiyaç duydukları minimum yetkileri verin. Güvenlik duvarınızı sıkı tutun ve mümkünse IP beyaz listeleme kullanarak erişimi belirli kaynaklarla sınırlayın. Üretim ortamlarında TLS/SSL şifrelemesini etkinleştirerek veri gizliliğini sağlayın ve güçlü, benzersiz parolalar kullanın.
Veritabanı güvenliği tek seferlik bir işlem değildir; sürekli izleme, düzenli güncellemeler ve periyodik güvenlik denetimleri gerektiren bir süreçtir. Bu rehberdeki adımları dikkatlice takip ederek ve güvenlik bilincini ön planda tutarak, MongoDB veritabanınızın hem erişilebilir hem de güvende olmasını sağlayabilirsiniz.
