MongoDB Güvenliğini CentOS 8 Üzerinde Sağlama Rehberi
MongoDB, modern uygulamalar için popüler bir NoSQL veritabanıdır. Esnekliği ve ölçeklenebilirliği nedeniyle yaygın olarak tercih edilse de, varsayılan kurulumu genellikle güvenlik açısından zayıf noktalara sahiptir. Bu rehber, CentOS 8 işletim sistemi üzerinde çalışan bir MongoDB sunucusunu güvence altına almak için atmanız gereken temel adımları ve en iyi uygulamaları detaylı bir şekilde açıklayacaktır. Veri ihlallerini önlemek ve hassas verilerinizi korumak için bu adımları dikkatle uygulamanız kritik öneme sahiptir.
1. Giriş ve Ön Hazırlıklar
MongoDB sunucunuzu güvence altına alma süreci, işletim sistemi düzeyinde yapılan hazırlıklarla başlar. CentOS 8 sisteminizin güncel olması ve temel ağ güvenliği önlemlerinin alınmış olması, veritabanı güvenliğinin temelini oluşturur.
CentOS 8 Sistemini Güncelleme
Sisteminizin en son güvenlik yamaları ve yazılım güncellemeleriyle güncel olduğundan emin olun. Bu, bilinen güvenlik açıklarının kapatılmasına yardımcı olur.
sudo dnf update -y
sudo dnf upgrade -y
sudo reboot # Gerekliyse sistemi yeniden başlatın
Firewalld Servisini Yapılandırma
CentOS 8, varsayılan olarak firewalld güvenlik duvarını kullanır. MongoDB’ye dışarıdan erişimi kontrol etmek için bu güvenlik duvarını doğru şekilde yapılandırmanız gerekir. İlk olarak, firewalld servisinin çalıştığından emin olun:
sudo systemctl status firewalld
Eğer çalışmıyorsa başlatın ve önyüklemede etkinleştirin:
sudo systemctl start firewalld
sudo systemctl enable firewalld
Şimdilik, MongoDB’nin varsayılan portu olan 27017’ye erişimi kısıtlayacağız. Daha sonra bu kuralı yalnızca güvenilir IP adreslerinden erişime izin verecek şekilde güncelleyeceğiz.
sudo firewall-cmd --permanent --add-service=ssh # SSH erişimine izin ver (zaten açıksa sorun değil)
sudo firewall-cmd --reload # Güvenlik duvarı kurallarını yeniden yükle
Bu ön hazırlıklar tamamlandıktan sonra, MongoDB’nin kendi güvenlik mekanizmalarına odaklanabiliriz.
2. MongoDB Kimlik Doğrulama ve Yetkilendirme
MongoDB’nin en temel güvenlik önlemi, kimlik doğrulama (authentication) ve yetkilendirme (authorization) sistemini etkinleştirmektir. Varsayılan olarak, MongoDB kimlik doğrulaması devre dışıdır ve herhangi bir kullanıcı sunucuya tam erişimle bağlanabilir. Bu durumu değiştirmek, ilk ve en önemli adımdır.
Kimlik Doğrulamayı Etkinleştirme
Kimlik doğrulamayı etkinleştirmek için MongoDB yapılandırma dosyasını (mongod.conf) düzenlemeniz gerekir. CentOS 8 üzerinde bu dosya genellikle /etc/mongod.conf konumunda bulunur.
sudo vi /etc/mongod.conf
Dosyayı açtıktan sonra, security: bölümünü bulun veya ekleyin ve authorization: enabled satırını ekleyin:
# /etc/mongod.conf dosyasından bir kesit
security:
authorization: enabled
Değişiklikleri kaydedip çıktıktan sonra MongoDB servisini yeniden başlatın:
sudo systemctl restart mongod
sudo systemctl status mongod
Bu adımdan sonra, MongoDB sunucusuna bağlanmaya çalıştığınızda kimlik doğrulama hatası alacaksınız, çünkü henüz bir kullanıcı oluşturmadık.
Yönetici Kullanıcı Oluşturma
Kimlik doğrulama etkinleştirildiğinde, veritabanına erişim için bir yönetici kullanıcı oluşturmanız gerekir. Bu işlemi yapmak için, geçici olarak kimlik doğrulaması olmadan mongo kabuğuna bağlanmanız ve yönetici kullanıcısını oluşturmanız gerekmektedir. Bu adımı, sadece ilk yönetici kullanıcıyı oluşturmak için yapın ve sonrasında bu yöntemi kullanmayın.
# Geçici olarak kimlik doğrulamasını devre dışı bırakın
sudo vi /etc/mongod.conf
security:
authorization: enabled
Satırını yorum satırı yapın veya silin
sudo systemctl restart mongod
Şimdi kimlik doğrulaması olmadan bağlanın
mongo
admin veritabanına geçiş yapın
use admin
Yönetici kullanıcı oluşturun
db.createUser(
{
user: "mongoAdmin",
pwd: "ÇokGüçlüBirŞifreBuraya!", # Gerçek bir parola kullanın
roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase", "dbAdminAnyDatabase", "clusterAdmin" ]
}
)
Çıkış yapın
exit
Yönetici kullanıcıyı oluşturduktan sonra, hemen mongod.conf dosyasını tekrar düzenleyin ve security.authorization: enabled satırını tekrar etkinleştirin.
sudo vi /etc/mongod.conf
security:
authorization: enabled
Satırının yorum satırını kaldırın veya ekleyin
sudo systemctl restart mongod
Şimdi yeni oluşturduğunuz yönetici kullanıcı ile bağlanmayı deneyin:
mongo -u mongoAdmin -p --authenticationDatabase admin
Parolanızı girmeniz istendiğinde, belirlediğiniz parolayı girin. Başarılı bir şekilde bağlanabiliyorsanız, kimlik doğrulama doğru şekilde etkinleştirilmiştir.
Veritabanı Kullanıcıları Oluşturma
mongoAdmin kullanıcısı, tüm veritabanlarında tam yetkiye sahiptir. Uygulamalarınızın veya diğer kullanıcılarınızın bu kadar geniş yetkiye sahip olmaması önemlidir. Her uygulama veya kullanıcı için, yalnızca ihtiyaç duyduğu veritabanı ve koleksiyonlara erişebilen ayrıcalığı en az olan kullanıcılar oluşturun.
Örneğin, myappdb adında bir veritabanı için myappuser adında bir kullanıcı oluşturalım:
mongo -u mongoAdmin -p --authenticationDatabase admin
use myappdb
db.createUser(
{
user: "myappuser",
pwd: "UygulamaŞifresiBuraya!", # Uygulamanız için güçlü bir parola kullanın
roles: [ { role: "readWrite", db: "myappdb" } ]
}
)
exit
readWrite rolü, myappdb veritabanında okuma ve yazma yetkisi verir. MongoDB’nin sunduğu çeşitli yerleşik roller (örneğin read, dbOwner, userAdmin) ve özel rollerle yetkilendirmeyi daha da detaylandırabilirsiniz.
3. Ağ Güvenliği ve Şifreleme
Kimlik doğrulama ve yetkilendirme, MongoDB güvenliğinin temelini oluştururken, ağ güvenliği ve veri şifrelemesi de kritik öneme sahiptir. Bu bölümde, veritabanınıza ağ üzerinden erişimi nasıl kısıtlayacağınızı ve verileri aktarım sırasında nasıl şifreleyeceğinizi ele alacağız.
Bağlantı Adreslerini Sınırlama (Bind IP)
MongoDB’nin yalnızca belirli IP adreslerinden gelen bağlantıları dinlemesini sağlamak, yetkisiz erişimi engellemenin ilk adımıdır. mongod.conf dosyasındaki net.bindIp ayarını kullanarak bunu yapabilirsiniz.
sudo vi /etc/mongod.conf
net: bölümünü bulun ve bindIp satırını aşağıdaki gibi güncelleyin:
# /etc/mongod.conf dosyasından bir kesit
net:
port: 27017
bindIp: 127.0.0.1,,
* 127.0.0.1: Yalnızca sunucunun kendisinden gelen bağlantılara izin verir (localhost).
* : MongoDB sunucunuzun kendi özel veya genel IP adresidir.
* : MongoDB’ye bağlanacak olan uygulama sunucularınızın veya diğer güvenilir istemcilerin IP adresleridir.
Birden fazla IP adresi virgülle ayrılabilir. Bu ayar, MongoDB’nin yalnızca belirtilen IP adreslerinden gelen bağlantı isteklerini kabul etmesini sağlar. Değişiklikleri kaydedip çıktıktan sonra MongoDB servisini yeniden başlatın:
sudo systemctl restart mongod
Firewalld Kuralları
bindIp ayarı dahili bir MongoDB kontrolü sağlarken, firewalld da işletim sistemi düzeyinde bir güvenlik katmanı ekler. Yalnızca güvendiğiniz IP adreslerinin 27017 numaralı porta erişmesine izin vermelisiniz.
Örneğin, 192.168.1.100 IP adresine sahip bir uygulama sunucusundan MongoDB’ye erişime izin vermek için:
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port port="27017" protocol="tcp" accept'
sudo firewall-cmd --reload
Eğer birden fazla güvenilir IP adresiniz varsa, her biri için ayrı bir kural ekleyebilir veya bir IP aralığı belirtebilirsiniz.
TLS/SSL Şifrelemesini Etkinleştirme
Veritabanı ile istemci arasındaki iletişimi şifrelemek, ağ üzerinde veri dinlemeyi (eavesdropping) önlemek için hayati öneme sahiptir. MongoDB, TLS/SSL (Transport Layer Security/Secure Sockets Layer) kullanarak iletişimi şifreleyebilir.
İlk olarak, bir TLS/SSL sertifikasına ihtiyacınız olacaktır. Üretim ortamlarında bir Sertifika Yetkilisinden (CA) alınmış geçerli bir sertifika kullanmanız önerilir. Geliştirme veya test ortamları için kendinden imzalı bir sertifika oluşturabilirsiniz.
Kendinden İmzalı Sertifika Oluşturma (Örnek):
# Özel anahtar oluştur
sudo openssl genrsa -out /etc/ssl/mongodb.key 2048
Sertifika imzalama isteği (CSR) oluştur
sudo openssl req -new -key /etc/ssl/mongodb.key -out /etc/ssl/mongodb.csr \
-subj "/C=TR/ST=Istanbul/L=Istanbul/O=MyCompany/OU=IT/CN=your_mongodb_hostname"
Kendinden imzalı sertifika oluştur (365 gün geçerli)
sudo openssl x509 -req -days 365 -in /etc/ssl/mongodb.csr -signkey /etc/ssl/mongodb.key -out /etc/ssl/mongodb.crt
Anahtar ve sertifikayı tek bir .pem dosyasına birleştir
sudo cat /etc/ssl/mongodb.key /etc/ssl/mongodb.crt > /etc/ssl/mongodb.pem
İzinleri ayarla
sudo chown mongod:mongod /etc/ssl/mongodb.pem
sudo chmod 600 /etc/ssl/mongodb.pem
Ardından, mongod.conf dosyasını düzenleyerek TLS/SSL’yi etkinleştirin:
sudo vi /etc/mongod.conf
net: bölümüne aşağıdaki satırları ekleyin:
# /etc/mongod.conf dosyasından bir kesit
net:
port: 27017
bindIp: 127.0.0.1,,
ssl:
mode: requireSSL # Tüm bağlantılar SSL kullanmalı
certificateFile: /etc/ssl/mongodb.pem
privateKeyFile: /etc/ssl/mongodb.pem
#CAFile: /etc/ssl/ca.pem # Eğer bir CA kullanıyorsanız
* mode: requireSSL: Tüm istemcilerin TLS/SSL kullanarak bağlanmasını zorunlu kılar. (preferSSL ile hem şifreli hem de şifresiz bağlantılara izin verebilirsiniz, ancak requireSSL daha güvenlidir).
* certificateFile: Sertifika dosyanızın yolu.
* privateKeyFile: Özel anahtar dosyanızın yolu.
Değişiklikleri kaydedip çıktıktan sonra MongoDB servisini yeniden başlatın:
sudo systemctl restart mongod
Şimdi istemcileriniz, TLS/SSL kullanarak bağlanmak zorunda kalacaktır:
mongo -u myappuser -p --authenticationDatabase myappdb --ssl --sslAllowInvalidCertificates # Kendinden imzalı sertifika için
Üretim ortamında geçerli bir sertifika kullanıyorsanız --sslAllowInvalidCertificates kullanmamalısınız.
4. Sistem Güvenliği ve En İyi Uygulamalar
MongoDB’nin kendi güvenlik ayarlarının yanı sıra, işletim sistemi düzeyinde ve genel yönetim uygulamalarında da güvenlik bilinciyle hareket etmek önemlidir.
Ayrıcalıklı Olmayan Kullanıcı ile Çalıştırma
MongoDB, varsayılan olarak mongod adında ayrıcalıklı olmayan bir sistem kullanıcısı altında çalışır. Bu, potansiyel güvenlik açıklarının sistem genelinde yayılmasını engeller. Bu yapılandırmayı değiştirmeyin ve MongoDB’nin root kullanıcısı altında çalışmadığından emin olun.
Dosya Sistemi İzinleri
MongoDB veri ve günlük dosyalarının bulunduğu dizinlerin doğru izinlere sahip olması, yetkisiz erişimi engeller. Veri dizini (/var/lib/mongo) ve günlük dizini (/var/log/mongodb) yalnızca mongod kullanıcısı tarafından okunabilir ve yazılabilir olmalıdır.
sudo chown -R mongod:mongod /var/lib/mongo
sudo chown -R mongod:mongod /var/log/mongodb
sudo chmod -R 700 /var/lib/mongo
sudo chmod -R 700 /var/log/mongodb
Bu komutlar, dizinlerin ve içindeki dosyaların yalnızca mongod kullanıcısı tarafından erişilebilir olmasını sağlar.
Güvenlik Güncellemeleri ve Yama Yönetimi
Hem CentOS 8 işletim sisteminizi hem de MongoDB yazılımınızı düzenli olarak güncel tutmak, bilinen güvenlik açıklarına karşı korunmanın en etkili yollarından biridir. MongoDB, güvenlik yamalarını ve iyileştirmelerini yeni sürümlerle yayınlar.
sudo dnf update -y # İşletim sistemi güncellemeleri
MongoDB için de sürüm notlarını takip ederek güncel ve güvenli bir sürüm kullandığınızdan emin olun.
Denetim (Auditing) ve Günlükleme
MongoDB Community sürümü gelişmiş denetim özelliklerine sahip olmasa da, mongod.log dosyasını düzenli olarak izlemek ve analiz etmek önemlidir. Bu günlük dosyası, bağlantı denemeleri, kimlik doğrulama hataları ve diğer önemli olaylar hakkında bilgi sağlar.
Enterprise sürümü, veritabanı etkinliklerini detaylı bir şekilde denetleme imkanı sunar. Eğer hassas verilerle çalışıyorsanız ve mevzuat uyumluluğu gerekiyorsa, Enterprise sürümünün denetim özelliklerini araştırmanız faydalı olabilir.
Yedekleme ve Kurtarma Stratejileri
Güvenli bir yedekleme ve kurtarma stratejisi, veri kaybını önlemenin yanı sıra, olası bir güvenlik ihlali durumunda verilerinizi geri yükleyebilmenizi sağlar. Yedeklerinizi şifreleyerek ve güvenli, ayrı bir konumda saklayarak güvence altına alın. mongodump ve mongorestore araçları, MongoDB yedeklemesi için temel araçlardır.
5. Sonuç ve Sıkça Sorulan Sorular (SSS)
MongoDB’yi CentOS 8 üzerinde güvence altına almak, tek seferlik bir işlemden ziyade sürekli bir süreçtir. Kimlik doğrulama, ağ güvenliği, şifreleme ve sistem düzeyinde en iyi uygulamaların bir kombinasyonu, veritabanınızın güvenliğini önemli ölçüde artıracaktır. Unutmayın ki hiçbir sistem %100 güvenli değildir, bu yüzden sürekli tetikte olmak ve güvenlik politikalarınızı düzenli olarak gözden geçirmek önemlidir.
Sıkça Sorulan Sorular (SSS)
MongoDB’yi neden güvence altına almalıyım?
MongoDB’yi güvence altına almak, hassas verilerinizin yetkisiz erişim, veri ihlalleri ve kötü niyetli saldırılardan korunmasını sağlar. Verilerinizi şifrelemek, kimlik doğrulaması uygulamak ve ağ erişimini kısıtlamak, yasal uyumluluk gereksinimlerini karşılamanıza ve iş itibarınızı korumanıza yardımcı olur.
mongod.conf dosyasını nerede bulabilirim?
CentOS 8 üzerinde MongoDB’nin yapılandırma dosyası genellikle /etc/mongod.conf konumunda bulunur.
TLS/SSL sertifikalarını nasıl oluşturabilirim?
Üretim ortamları için bir Sertifika Yetkilisinden (CA) sertifika almanız önerilir. Geliştirme veya test ortamları için openssl komut satırı aracıyla kendinden imzalı sertifikalar oluşturabilirsiniz. Örneğin, openssl genrsa ve openssl req komutları ile özel anahtar ve sertifika imzalama isteği oluşturabilir, ardından openssl x509 ile kendinden imzalı sertifikayı üretebilirsiniz.
MongoDB kimlik doğrulaması çalışmıyorsa ne yapmalıyım?
İlk olarak, /etc/mongod.conf dosyasında security.authorization: enabled satırının doğru şekilde etkinleştirildiğinden emin olun. MongoDB servisini yeniden başlattığınızdan emin olun. Kullanıcı adı ve parolanın doğru olduğundan ve doğru --authenticationDatabase parametresini kullandığınızdan emin olun. MongoDB günlük dosyalarını (genellikle /var/log/mongodb/mongod.log) kontrol ederek hata mesajlarını inceleyin.
Hangi MongoDB versiyonunu kullanmalıyım?
Her zaman MongoDB’nin en son kararlı sürümünü kullanmanız önerilir. Yeni sürümler genellikle güvenlik yamaları, performans iyileştirmeleri ve yeni özellikler içerir. Eski sürümlerde bilinen güvenlik açıkları olabilir ve desteklenmeyebilirler.