MongoDB Güvenlik Politikaları ve Yapılandırma

Bir önceki yazımda MongoDB’den kısaca bahsetmiştim. Mongo’yu tanımak ve ilk adımı atmak isteyenler için bir takım özet bilgiler vermiştim. Bu makalemde ise yazılım projesinde Mongo’yu kullanmak isteyenler için güvenlik politikalarından, yetkilendirme mekanizmalarından ve kullanıcı – rol mimarilerinden bahsetmek istedim.

Kullanıcı ve Rol Kavramı

Güvenlik politikalarına hakim olmak bu işin olmazsa olmazıdır diyebiliriz. Öncelikle Mongo’de default olarak gelen (Built-In) rolleri inceleyelim.

tumblr_inline_n5mzh5mHU61qzyevi

 

Built-In Roller

Database User Roles
Database Administration Roles
Cluster Administration Roles
Backup and Restoration Roles
All-Database Roles
Superuser Roles
Internal Role

 

 

Bu rollerden “Database User” ve “Database Administrator” rollerini herhangi bir veritabanında kullanabilirsiniz; fakat diğer tüm built-in roller sadece “admin” veritabanında kullanılabilir. Burada şöyle bir soru gelebilir: Veritabanı bazında kullanıcı mı tanımlayacağız? – Evet, doğrudur. Dilerseniz bir root kullanıcısı tanımlayıp tüm erişimleri bu kullanıcıdan da gerçekleştirebilirsiniz; fakat iyi bir güvenlik yapılandırması için bu doğru bir tercih değildir. DB bazlı user authentication daha sağlıklı olacaktır.

Custom Roles

Dilerseniz db.createRole() komutu ile kendi rol modelinizi oluşturabilirsiniz.

Veritabanına Kullanıcı Ekleme

Not: Bir veritabanına yeni kullanıcı ekleyebilmek için öncelikle o veritabanında “userAdmin” ya da “userAdminAnyDatabase” rollerinden birisine sahip olmanız gerekmektedir. Bu yüzden ilk MongoDB kurulumu ile birlikte en az bir User Administrator eklemeniz de faydalı olacaktır. Bu kullanıcı ile sisteme istediğiniz kadar kullanıcı ekleyebilirsiniz. Ayrıca “userAdmin” ya da “userAdminAnyDatabse” Unix sistemlerdeki “root” kullanıcısı gibi DEĞİLDİR. Kullanıcı yönetimi dışındaki bir üst level işlevlerini yapamaz (ek izinler almadan).

Ayrıca “userAdmin” rolüne sahip kullanıcı yalnızca bulunduğu veritabanında kullanıcı yönetimi yapabilir. Diğer veritabanlarında bu işlemi yapma yetkisi yoktur. Yalnızca “admin” tablosundaki kullanıcı “userAdminAnyDatabase” yetkisi aldıysa tüm veritabanlarındaki kullanıcıları yönetebilir. Bu kullanıcı MongoDB system superuser’ı olarak da adlandırılabilir; fakat yalnızca kullanıcı yönetiminden sorumludur. Veritabanındaki (clean, create, index, drop vs.) admin komutlarını çalıştırabilmek için ise dbAdmin ya da dbAdminAynDatabase (tüm veritabanlarında) rolüne sahip olunmalıdır.

En üst düzey yetkili kullanıcı “root” rolüne sahip kullanıcıdır. “root” rolüne sahip kullanıcı readWriteAnyDatabase, dbAdminAnyDatabase, userAdminAnyDatabase, clusterAdmin ve restore rollerinin tamamına sahip olur. MongoDB sistemindeki tüm işlemleri yapmak için bir root kullanıcısı bulundurabilirsiniz. (Bkz. db.auth())

Bir veritabanındaki yetkili kullanıcıları listeleme:

Sistemdeki tüm kullanıcıların detaylı dökümünü almak için:

 

MongoDB Yetkilendirme (authentication) Mekanizmaları

1. Şifre Bazlı Yetkilendirme (Password-based authentication)

Kullanıcı önceden tanımlanmış şifresi ile authentication sağlar. Şifreleme algoritması olarak MongoDB 3.0 ve üzerinde SCRAM-SHA-12 kullanılır. (Eski versiyonlarda: MONGODB-CR)

2. Sertifika Bazlı Yetkilendirme (Certificate-based authentication)

İstemci güvenilir bir Sertifika Otoritesi tarafından imzalanmış bir x.509 sertifikası sunar.

3. Harici Yetkilendirme (External authentication)

Kullanıcı harici bir servis kullanarak kimliğini doğrular (Kerberos ya da LDAP)

 

10 Maddede MongoDB Güvenliğini Arttırın

Ek olarak özet mahiyetinde internette bulduğum 10 maddelik güvenlik yapılandırması makalesinin çevirisini sunmak istiyorum:

1. auth’u aktifleştirin:

mongod.conf dosyasından yada mongod –auth parametresi ile auth’u aktifleştirin.

 

2. Veritabanınıza erişimi internete açmayın:

Herhangi bir saldırganın fiziki olarak veritabanınıza erişmesine izin vermeyin. DB erişimi yalnızca localden sağlayın. Son kullanıcı yalnızca uygulama üzerinden read, write vs. istekleri yapabilsin.

 

3. Firewall kullanın:

Yalnızca uygulama sunucunuzun veritabanınıza erişmesine izin verin. Tamamına hükmedemediğiniz ağlarda ideal bir iptables senaryosu oluşturabilirsiniz.

 

4. Replica set mimarilerinden key dosyaları kullanın:

Farklı MongoDB instance’ları arasında iletişim sağlamak için key dosyası oluşturun ve authentication’ı bununla sağlayın.

 

5. HTTP Status arayüzünü pasifleştirin:

Mongodb default olarak http://localhost:28017 adresinde size bir web arayüzü sunar ve bu ekrandan durum (status) bilgisi alabilirsiniz. Http arayüzünün kapatılması güvenlik için doğru bir adım olacaktır.

 

6. REST arayüzünü pasifleştirin:

Buraya yapılacak REST istekleri ile Mongo’daki tüm db ve collection’lara erişim sağlanabilir. –auth modunu aktifleştirseniz bile product’a çıktığınızda bu arayüzün pasif kalması daha isabetli olacaktır.

 

7. Bind_ip değerini ayarlayın:
Eğer sisteminizde birden fazla network arayüzü varsa bind_ip ayarı ile mongodb sunucunuza erişimi sınırlandırmalısınız. Default olarak mongodb tüm arayüzlere bağlanabilecek şekilde gelir.

 

8. SSL kullanın:

Man in the middle saldırılarının önüne geçebilmek için sunucu ve istemci arasındaki istekleri SSL ile sağlayın. Mongodb’nin güvenli olmayan bir ağ arayüzü ile internete çıkmasına izin vermeyin.

 

9. Rol bazlı yetkilendirme (Role based authorization)

MongoDB her kullanıcı için önceden tanımlanmış (built-in roles) ya da özel (custom roles) yetkilendirme yapısına sahiptir. Rol bazlı yetkilendirme ile kullanıcılara sınırlandırılmış yetkiler atayabilir ve bu kurguya göre veritabanı sunucunuza erişim izni verebilirsiniz.

 

10. Enterprise mongodb & Kerberos
Enterprise mongodb Kerberos ile tam entegredir. Dilerseniz maliyetini göze alıp enterprise modele de geçebilirsiniz.

 

Ek olarak MongoDB Security Checklist’e de gözatabilirsiniz:

https://docs.mongodb.org/manual/administration/security-checklist/

 

Notlar:

  • admin veritabanı MongoDB kurulumundan sonra default olarak gelir.
  • mongod –auth ile çalıştığınızda web client’a -kullanıcı adı ve şifre yazsanız bile- erişim sağlayamazsınız.
  • Internal Authentication ile replicat set ve sharded cluster memberlarını yetkilendirebilirsiniz.
  • Varolan bir kullanıcıyı authenticate etmek için db.auth(“username”, “password”) metodunu kullanabilirsiniz.
  • Her veritabanı için farklı yetkilere sahip, ayrı kullanıcılar oluşturabilirsiniz.

 

Kaynaklar:

https://docs.mongodb.org/manual/reference/built-in-roles/

https://docs.mongodb.org/manual/tutorial/manage-users-and-roles/

https://docs.mongodb.org/manual/reference/method/db.auth/

https://scalegrid.io/blog/10-tips-to-improve-your-mongodb-security/

 

MongoDB Kurulumu ve Mongo Shell Kullanımı

MongoDB-Logo-7db53b4037f9953e9df4f694c758141fcfa022cee1d2ff50749d133d0b70b692MongoDB ilişkisel olmayan, NoSql (Not Only SQL) kavramı üzerine C++ ile geliştirilmiş, açık kaynak kodlu bir veritabanıdır. Geleneksel RDBMS (Relational Database Management System) veritabanlarının hantal geldiği uygulamalarda ya da uygulamanın bazı modüllerinde tercih edilir.

Yüksek hacimli depolamar yapılacağı zaman MongoDb doğru tercih olabilir. Bazı projelerinizde aktivite logları tutmak isteyebilirsiniz ya da analiz yapmak için yığın verilere ihtiyaç duyabilirsiniz. Cache, yorum, etiketleme vs. gibi yığın veriler tutma ihtiyacınızı MongoDB ile pratik bir şekilde sağlayabilir ve mevcut RDBMS veritabanınızın (MySQL, vs.) şişmesinin önüne geçebilirsiniz.

Sıradan uygulamalarda MySQL ile MongoDB arasında yüksek performans farkı olmayabilir; fakat büyük ölçekli çalışmalarda MySQL’de yığın oluşmasını ve hantallaşmanın önüne geçeceğiniz kesin. MySQL’de bir tablo 5-10 GB büyüklüğe ulaştığında artık performans konusunu tekrar gözden geçirmeniz gerekecektir. Bu noktada MongoDB imdada yetişir. Bu hantallaşmanın önüne geçmek için yığın verileri MongoDB’ye yıkabilirsiniz. (Aynı projede hem MySQL hem de MongoDB veritabanlarını birlikte kullanabilirsiniz.)

MongoDB döküman tabanlıdır. MySQL’deki tabloların karşılığı olarak MongoDB’de collection (koleksiyon) vardır. Bu collection’larda veriler JSON objelerine çok benzeyen bir yapıda tutulur.

MacOS MongoDB Kurulumu

Sırasıyla aşağıdaki komutları çalıştırın:

 MongoDB’yi Başlatma ve Mongo Shell

 Mongo Shell’de Bazı İşlevler

 Genel Notlar

  • Collection’daki veriler döküman tabanlı olduğu için standart bir field yapısı yoktur. Bir satırdaki veri ile diğer satırdaki verinin field’ları farklılık gösterebilir. Kurgu tamamen size aittir.
  • mongod” servisinin çalıştırırken –rest komutu ile çalıştırırsanız (“mongod –rest“), http://127.0.0.1:28017/ URL’sinden MongoDB RESTful arayüzüne erişebilirsiniz. Bu arayüzden çeşitli REST komutları ile MongoDB sunucusu ve veritabanlarınız ile ilgili her şeye erişebilirsiniz (Sunucu durumu, veritabanlarını listele, collectionları listele, satırları göster vs.)
  • MongoDB’nin default’da gelen bir phpMyAdmin tarzı arayüzü yoktur; fakat çok sayıda açık kaynak kodlu Admin UI sunulmuştur. Ör: https://github.com/rsercano/mongoclient
  • Tablolarınızdaki index kurgusunu ve güvenlik politikalarını da gözden geçirmenizi tavsiye ediyorum.

Faydalı olması dileklerimle… :)

Kaynaklar:

Mongo Dökümantasyonu

https://docs.mongodb.org/manual/

Mongo Shell Komutları

https://docs.mongodb.org/manual/mongo/

Mongo ve SQL Karşılaştırması

https://docs.mongodb.org/manual/reference/sql-comparison/