MongoDB’nin Dahili Kimlik Doğrulama ve Yetkilendirme Yöntemlerinden Yararlanma
Giriş
Günümüzün veri odaklı dünyasında, veritabanı güvenliği her zamankinden daha kritik bir öneme sahiptir. Hassas bilgilerin depolandığı ve işlendiği veritabanları, yetkisiz erişime, veri ihlallerine ve kötü niyetli saldırılara karşı korunmalıdır. NoSQL veritabanları arasında popülerliğini koruyan MongoDB, esnek yapısı ve yüksek performansının yanı sıra, güçlü dahili güvenlik mekanizmalarıyla da öne çıkmaktadır. Bu makale, MongoDB’nin yerleşik kimlik doğrulama (authentication) ve yetkilendirme (authorization) özelliklerini derinlemesine inceleyerek, bu özelliklerin nasıl etkinleştirileceğini, yapılandırılacağını ve güvenli bir veritabanı ortamı oluşturmak için nasıl kullanılacağını detaylandıracaktır.
Kimlik doğrulama, bir kullanıcının veya uygulamanın iddia ettiği kişi veya uygulama olduğunu doğrulama sürecidir. Genellikle kullanıcı adı ve şifre gibi kimlik bilgileriyle gerçekleştirilir. Yetkilendirme ise, kimliği doğrulanmış bir kullanıcının veya uygulamanın belirli bir kaynağa (veritabanı, koleksiyon, belge) erişim iznine veya belirli bir eylemi gerçekleştirme yetkisine sahip olup olmadığını belirleme sürecidir. MongoDB, bu iki temel güvenlik katmanını entegre bir şekilde sunarak, veri güvenliğini sağlamak için kapsamlı bir çerçeve sağlar. Bu dahili mekanizmalar, geliştiricilere ve sistem yöneticilerine, uygulamalarının ve verilerinin güvenliğini sağlamak için gerekli araçları sunarken, aynı zamanda yönetim yükünü de azaltır.
MongoDB’de Kimlik Doğrulama (Authentication)
MongoDB’nin varsayılan yapılandırmasında kimlik doğrulama devre dışıdır, bu da herhangi bir kullanıcının herhangi bir kimlik bilgisi olmadan veritabanına tam erişim sağlayabileceği anlamına gelir. Üretim ortamlarında bu durum kabul edilemez bir güvenlik riski oluşturur. Bu nedenle, MongoDB’yi güvenli hale getirmenin ilk adımı kimlik doğrulamayı etkinleştirmektir.
Kimlik Doğrulamayı Etkinleştirme
Kimlik doğrulamayı etkinleştirmenin en yaygın yolu, MongoDB sunucusunu (mongod) başlatırken --auth komut satırı seçeneğini kullanmak veya yapılandırma dosyasında (mongod.conf) security.authorization: enabled ayarını yapmaktır. Yapılandırma dosyası yaklaşımı, kalıcı ve otomatik başlatma senaryoları için önerilir.
Komut Satırı ile:
mongod --auth --port 27017 --dbpath /data/db
Bu komut, MongoDB sunucusunu 27017 numaralı portta ve belirtilen veri yolunda kimlik doğrulama etkinleştirilmiş olarak başlatır.
Yapılandırma Dosyası (mongod.conf) ile:
# mongod.conf
security:
authorization: enabled
net:
port: 27017
bindIp: 127.0.0.1 # Güvenlik için sadece localhost'tan erişime izin verir
storage:
dbPath: /data/db
Bu ayarı yaptıktan sonra mongod servisini yeniden başlatmanız gerekir. Kimlik doğrulama etkinleştirildiğinde, veritabanına erişmeye çalışan tüm istemcilerin geçerli bir kullanıcı adı ve şifre ile kimlik doğrulaması yapması gerekecektir. Aksi takdirde, bağlantı reddedilir veya yetkilendirme hatası alınır.
İlk Kullanıcıyı Oluşturma
Kimlik doğrulama etkinleştirildikten sonra, sisteme giriş yapabilecek bir kullanıcı olmadığı için varsayılan olarak herhangi bir istemci bağlanamaz. Ancak, MongoDB’nin 3.6 ve sonraki sürümlerinde, kimlik doğrulama etkinleştirildiğinde ve henüz hiçbir kullanıcı tanımlanmamışken, localhost üzerinden bağlanan bir istemci, admin veritabanında kullanıcı oluşturma yetkisine sahiptir. Bu, “localhost exceptional access” olarak bilinen özel bir durumdur ve ilk yönetici kullanıcısını oluşturmak için kullanılır.
İlk yönetici kullanıcısını oluşturmak için aşağıdaki adımları izleyin:
mongod‘u--authile başlatın veyamongod.confdosyasındasecurity.authorization: enabledayarını yaparak servisi yeniden başlatın.mongokabuğu ile bağlanın:mongo --port 27017(Bu bağlantı,localhost exceptional accesssayesinde kimlik doğrulaması gerektirmeyecektir).adminveritabanına geçin:use admin- Bir yönetici kullanıcısı oluşturun. Şifreyi doğrudan komutta belirtmek yerine
passwordPrompt()kullanarak daha güvenli bir şekilde girmeniz önerilir:
db.createUser(
{
user: "adminUser",
pwd: passwordPrompt(), // Şifreyi güvenli bir şekilde girmenizi ister
roles: [
{ role: "userAdminAnyDatabase", db: "admin" }, // Tüm veritabanlarında kullanıcı yönetimi
"readWriteAnyDatabase" // Tüm veritabanlarında okuma/yazma
]
}
)
Bu komut, adminUser adında bir kullanıcı oluşturur ve ona admin veritabanında kullanıcı yönetme yetkisi (userAdminAnyDatabase) ve tüm veritabanlarında okuma/yazma yetkisi (readWriteAnyDatabase) verir. İlk yönetici kullanıcısını oluşturduktan sonra, localhost exceptional access özelliği kapanır ve artık tüm bağlantılar (localhost üzerinden yapılanlar dahil) kimlik doğrulaması gerektirir.
Kimlik Doğrulama Mekanizmaları
MongoDB, farklı güvenlik gereksinimlerini karşılamak üzere çeşitli kimlik doğrulama mekanizmalarını destekler:
- SCRAM (Salted Challenge Response Authentication Mechanism):
- SCRAM-SHA-256 (Varsayılan ve Önerilen): MongoDB 4.0 ve sonraki sürümlerinde varsayılan kimlik doğrulama mekanizmasıdır. Daha güçlü karma algoritmaları (SHA-256) ve tuzlama (salting) kullanarak şifreleri korur. Şifrelerin doğrudan veritabanında saklanmasını engeller ve kaba kuvvet saldırılarına karşı daha dayanıklıdır. Güvenliğinizi artırmak için her zaman SCRAM-SHA-256 kullanmanız önerilir.
- SCRAM-SHA-1 (Eski): MongoDB’nin eski sürümlerinde varsayılan olan bu mekanizma, daha zayıf bir karma algoritması (SHA-1) kullanır. Geriye dönük uyumluluk için hala mevcuttur ancak yeni dağıtımlar için önerilmez. Mümkünse SCRAM-SHA-256’ya geçilmelidir.
SCRAM mekanizmaları, sunucunun şifreyi doğrudan saklamadan istemcinin kimliğini doğrulamasına olanak tanıyan bir meydan okuma-yanıt (challenge-response) protokolü kullanır. Şifreler, tuzlama ve iterasyonlarla güçlendirilmiş bir şekilde saklanır, bu da onları gökkuşağı tabloları ve çevrimdışı kaba kuvvet saldırılarına karşı korur.
- x.509 Sertifika Kimlik Doğrulaması:
Bu mekanizma, istemcilerin ve sunucuların birbirlerini TLS/SSL sertifikaları aracılığıyla doğrulamasına olanak tanır. Özellikle makine-makine iletişimi, mikro hizmetler arası kimlik doğrulama ve yüksek güvenlik gerektiren ortamlar için idealdir. Kullanıcı adları, sertifikaların DN (Distinguished Name) alanından türetilir. x.509 kimlik doğrulaması genellikle TLS/SSL ile birlikte kullanılır ve ağ trafiğinin şifrelenmesini de sağlayarak uçtan uca güvenliği pekiştirir.
- LDAP (Lightweight Directory Access Protocol) Kimlik Doğrulaması:
Büyük kurumsal ortamlarda, kullanıcı kimlik bilgileri genellikle merkezi bir LDAP veya Active Directory sunucusunda yönetilir. MongoDB, LDAP entegrasyonu sayesinde bu merkezi dizin hizmetlerini kullanarak kullanıcıların kimliğini doğrulayabilir. Bu, kullanıcı yönetimini basitleştirir, mevcut kurumsal güvenlik politikalarını MongoDB’ye genişletir ve tek oturum açma (single sign-on) deneyimi sunabilir.
- Kerberos Kimlik Doğrulaması:
Kurumsal düzeyde daha gelişmiş bir kimlik doğrulama mekanizması olan Kerberos, özellikle çoklu hizmet ortamlarında güçlü kimlik doğrulama ve tek oturum açma yetenekleri sunar. MongoDB, Kerberos’u kullanarak kullanıcıların kimliğini doğrulayabilir ve bu da büyük ölçekli kurumsal dağıtımlarda güçlü bir güvenlik ve yönetim kolaylığı sağlar. Kerberos, özellikle Windows Active Directory entegrasyonu için tercih edilebilir.
Kullanıcı Yönetimi
MongoDB, kullanıcıları ve rolleri yönetmek için kapsamlı bir dizi komut sağlar. Bu komutlar, genellikle admin veritabanında (genel yetkilere sahip kullanıcılar için) veya ilgili veritabanında (veritabanına özgü yetkilere sahip kullanıcılar için) çalıştırılır.
- Kullanıcı Oluşturma (
db.createUser()): Yeni kullanıcılar oluşturmak ve onlara başlangıç rolleri atamak için kullanılır.
use myDatabase // Kullanıcının atanacağı veritabanı bağlamı
db.createUser(
{
user: "appUser",
pwd: passwordPrompt(),
roles: [ { role: "readWrite", db: "myDatabase" } ]
}
)
db.updateUser()): Mevcut bir kullanıcının şifresini, rollerini veya diğer özelliklerini değiştirmek için kullanılır.use myDatabase
db.updateUser(
"appUser",
{
pwd: passwordPrompt(), // Yeni şifre
roles: [ { role: "read", db: "myDatabase" }, { role: "read", db: "anotherDatabase" } ] // Yeni roller
}
)
db.dropUser()): Bir kullanıcıyı veritabanından siler.use myDatabase
db.dropUser("appUser")
db.getUsers()): Mevcut kullanıcıları ve onlara atanmış rolleri listeler. showPrivileges: true seçeneği ile kullanıcıların sahip olduğu tüm ayrıcalıkların detaylarını da görebilirsiniz.use admin
db.getUsers({ showPrivileges: true })
db.auth()): Bir kullanıcının kimliğini programatik olarak doğrulamak için kullanılır. Çoğu MongoDB sürücüsü bu işlemi bağlantı sırasında otomatik olarak halleder, ancak bazen manuel doğrulama veya test senaryoları için faydalı olabilir.use myDatabase
db.auth("appUser", "appPassword")
MongoDB’de Yetkilendirme (Authorization) – Rol Tabanlı Erişim Kontrolü (RBAC)
Kimlik doğrulama, bir kullanıcının kim olduğunu doğrular; yetkilendirme ise, o kullanıcının ne yapmasına izin verildiğini belirler. MongoDB, yetkilendirme için güçlü ve esnek bir Rol Tabanlı Erişim Kontrolü (RBAC) sistemi kullanır. RBAC’de, ayrıcalıklar (privileges) rollere atanır ve bu roller daha sonra kullanıcılara atanır. Bu yaklaşım, kullanıcıların ayrı ayrı her bir yetkisini yönetmek yerine, belirli işlevsel rollere sahip kullanıcı gruplarını yönetmeyi kolaylaştırır ve ölçeklenebilir bir güvenlik modeli sunar.
Ayrıcalıklar ve Kaynaklar
MongoDB’deki her ayrıcalık, bir veya daha fazla eylem (action) ve bir kaynak (resource) kombinasyonundan oluşur. Bu, yetkilendirme modelinin temel yapı taşlarıdır.
- Eylemler (Actions): Veritabanı üzerinde gerçekleştirilebilecek belirli operasyonlardır (örneğin,
find,insert,update,remove,createCollection,createIndex,shutdown). MongoDB’nin geniş bir eylem listesi vardır ve bu eylemler, veritabanı operasyonlarını, küme yönetimini ve kullanıcı yönetimini kapsar. - Kaynaklar (Resources): Ayrıcalığın uygulandığı veritabanı nesnesidir. Bir kaynak, belirli bir veritabanı, belirli bir veritabanındaki bir koleksiyon veya tüm veritabanları olabilir. Kaynaklar genellikle bir JSON nesnesi olarak belirtilir:
{ db: "myDatabase", collection: "myCollection" }: Belirli bir veritabanındaki belirli bir koleksiyon.{ db: "myDatabase", collection: "" }: Belirli bir veritabanındaki tüm koleksiyonlar. Boş koleksiyon adı, veritabanındaki tüm koleksiyonları ifade eder.{ db: "", collection: "" }: Tüm veritabanlarındaki tüm koleksiyonlar.{ cluster: true }: Küme düzeyindeki kaynaklar (örn. replica set veya sharded cluster yönetimi için).
Dahili (Built-in) Roller
MongoDB, çoğu yaygın kullanım senaryosunu kapsayan bir dizi dahili rol sunar. Bu roller, belirli ayrıcalık setlerini önceden tanımlar ve yönetim kolaylığı sağlar. Bu rolleri doğrudan kullanıcılara atayabilir veya özel roller oluştururken miras olarak kullanabilirsiniz.
- Veritabanı Kullanıcı Rolleri: Belirli bir veritabanında çalışmak için tasarlanmıştır.
read: Belirli bir veritabanındaki tüm koleksiyonlarda okuma erişimi sağlar.readWrite: Belirli bir veritabanındaki tüm koleksiyonlarda okuma ve yazma erişimi sağlar.dbAdmin: Belirli bir veritabanının yönetimsel görevlerini gerçekleştirebilir (indeks oluşturma, koleksiyonları listeleme, istatistikleri görme, vb.). Veri okuma/yazma yetkisi içermez.dbOwner: Belirli bir veritabanının tüm yönetimsel ve okuma/yazma görevlerini gerçekleştirebilir, ayrıca o veritabanında kullanıcıları ve rolleri yönetebilir. Bu, bir veritabanı için en kapsamlı roldür.userAdmin: Belirli bir veritabanında kullanıcıları ve rolleri yönetebilir.
- Tüm Veritabanı Rolleri: Bu roller, tüm veritabanlarında benzer ayrıcalıklar sağlar ve genellikle
adminveritabanında tanımlanır.readAnyDatabase: Tüm veritabanlarında okuma erişimi.readWriteAnyDatabase: Tüm veritabanlarında okuma ve yazma erişimi.userAdminAnyDatabase: Tüm veritabanlarında kullanıcıları ve rolleri yönetme.dbAdminAnyDatabase: Tüm veritabanlarında yönetimsel görevleri gerçekleştirme.
- Küme Yönetimi Rolleri: Bu roller, replica set’ler ve sharded cluster’lar gibi küme düzeyindeki operasyonlar için kullanılır ve genellikle
adminveritabanında tanımlanır.
