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/