MongoDB, doküman tabanlı bir özgür yazılım temelli bir veritabanıdır. Bir NoSQL veritabanı olarak sınıflandırılır çünkü geleneksel tablo tabanlı ilişkisel veritabanına dayanmamaktadır. Bunun yerine dinamik şemalar ile dokümanlar gibi JSON modelini kullanmaktadır. Geleneksel veritabanlarının aksine, MongoDB veritabanına veri girişi öncesi ön tanımlı şema gereksinimi yoktur. Şemayı istediğiniz zaman değiştirme imkanı vermektedir.

Ubuntu 16.04 üzerinde MongoDB kurulumunu anlatacağımız bu dokümanda sırası ile MongoDB kaynak deposundan kurulumu, lokal sistem üzerinde güvenli kimlik doğrulama işlemi ve gerek duyulması durumunda kullanabileceğiniz uzak bağlantıları daha güvenli hale getirme konularını anlatacağız.

Gereksinimler

Öncelikle MongoDB yapılandırılması ve kullanımına geçmeden önce CloudEOS‘ a kayıt olarak bir adet Ubuntu 16.04 sunucunuzu oluşturmalısınız.

Kuruluma başlamadan önce Ubuntu sunucular için güvenlik açısından sudo yetkilerine sahip bir kullanıcı oluşturmanızı tavsiye ediyoruz.

Yeni Kullanıcı Ekleme

Sisteme size verilen şifre ve root kullanıcısı ile giriş yaptıktan sonra

$ adduser yenikullanici

ile kullanıcı oluşturmuş oluyoruz.

$ usermod -aG sudo yenikullanici

komutu ile de oluşturduğumuz kullanıcıya sudo yetkilerini vermiş olduk. Şimdi MongoDB kurulum adımlarına bu oluşturduğumuz sudo haklı kullanıcı ile devam edeceğiz.

Sunucu Yapılandırılması

MongoDB Kaynak Deposunun Eklenmesi

MongoDB, Ubuntu paket deposunda bulunmaktadır ama MongoDB’nin kendi Ubuntu kaynak deposunda daha güncel sürümleri bulunmaktadır ve kurulum için önerilen yöntem MongoDB’nin kendi kaynak deposunu kullanmaktır.

Öncelikle ilgili deponun anahtar bilgisini sunucumuza ekleyeceğiz.

$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6

Aşağıdaki gibi bir çıktı ile karşılaşacaksınız.

Executing: /tmp/tmp.IdwenTia0s/gpg.1.sh --keyserver
hkp://keyserver.ubuntu.com:80
--recv
0C49F3730359A14518585931BC711F9BA15703C6
gpg: requesting key A15703C6 from hkp server keyserver.ubuntu.com
gpg: key A15703C6: public key "MongoDB 3.4 Release Signing Key <packaging@mongodb.com>" imported
gpg: Total number processed: 1
gpg: imported: 1 (RSA: 1)

Şimdi MongoDB kaynak deposunun tanımını, bilgilerini sunucumuza ekleyeceğiz. Bunun için aşağıdaki komut yardımcı olacaktır.

$ echo "deb [ arch=amd64,arm64 ] http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list

Şimdi değişikliklerimizin sistem tarafından kullanılabilmesi için paket indeksimizi güncelleyelim.

$ sudo apt-get update

MongoDB Kurulumu

Şimdi başlangıç script’ leri, yönetim araçları, daemon ve ayarlarının bulunduğu mongodb-org paketini kuracağız.

$ sudo apt-get install mongodb-org

Karşınıza çıkan soruları Enter veya Y tuşuna basarak o adımları geçebilirsiniz. Kurulum sonrası Mongo daemon’ ı başlatacağız.

$ sudo systemctl start mongod

Systemctl çıktı gösterimi sağlamadığı için durumunu status komutu ile kontrol edeceğiz.

$ sudo systemctl status mongod

Aşağıdaki gibi bir çıktı ile karşılaşacaksınız.

mongod.service - High-performance, schema-free document-oriented database
Loaded: loaded (/lib/systemd/system/mongod.service; disabled; vendor preset: enabled)
Active: active (running) since Fri 2017-02-17 18:57:26 UTC; 17min ago
Docs: https://docs.mongodb.org/manual
Main PID: 2811 (mongod)
Tasks: 17
Memory: 56.8M
CPU: 7.294s
CGroup: /system.slice/mongod.service
└─2811 /usr/bin/mongod --quiet --config /etc/mongod.conf

Çıkış için q tuşuna basabilirsiniz. Şimdi manuel olarak daemon’ ı başlatacağız ve çalıştığını doğrulayacağız. Daha sonra boot anında ilgili servisin otomatik olarak başlaması için aşağıdaki komutu kullanacağız.

$ sudo systemctl enable mongod

Aşağıdaki gibi bir çıktı ile karşılaşacaksınız.

Created symlink from /etc/systemd/system/multi-user.target.wants/mongod.service
to /lib/systemd/system/mongod.service.

Sıradaki adımımızda veritabanımızdaki güvenlik adımlarına değineceğiz.

MongoDB Güvenliği

MongoDB’ nin önceki sürümlerinde kimlik doğrulama gibi bir sistem olmadığı için herhangi bir kullanıcı veritabanına bağlanıp istediği tabloyu yaratıp, isterse kaldırıp, istediği veritabanına istediği şekilde erişebilmekteydi. Bu durum dışında localhost üzerinde çalıştırılmayan ve üzerinde firewall olmayan sunucular dışarıdan yapılan port scan taramalarına karşı çaresiz kalıp, dışarıdan yetkisiz kişilerin erişimine olanak sağlıyordu.

Bu durum 3.x sürümünde önceki sürümlere göre düzeltildi. Ancak kimlik doğrulama ilk gelen kurulumda hala pasif durumda olmaktadır. Bu yüzden normal kurulumda herhangi bir kullanıcının veritabanlarına direkt erişim hakkı bulunmaktadır. Güvenli hale getirebilmek için sırasıyla yetkili kullanıcısı oluşturacağız, kimlik doğrulamayı aktif edip ardından test yapacağız.

Yetkili Kullanıcısının Oluşturması

Kullanıcımızı eklemek için Mongo arayüzüne bağlanmanız gerekmektedir.

$ mongo

Mongo arayüzünde veritabanı için erişim kontrolü aktif olmadığı ve verilere okuma/yazma erişiminde herhangi bir sınırlama olmadığını göreceksiniz.

MongoDB shell version v3.4.2
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.2
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
http://docs.mongodb.org/
Questions? Try the support group
http://groups.google.com/group/mongodb-user
Server has startup warnings:
2017-07-04T12:17:21.446+0000 I STORAGE [initandlisten]
2017-07-04T12:17:21.446+0000 I STORAGE [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
2017-07-04T12:17:21.446+0000 I STORAGE [initandlisten] ** See http://dochub.mongodb.org/core/prodnotes-filesystem
2017-07-04T12:17:21.534+0000 I CONTROL [initandlisten]
2017-07-04T12:17:21.534+0000 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database.
2017-07-04T12:17:21.534+0000 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted.
2017-07-04T12:17:21.534+0000 I CONTROL [initandlisten]
>

Oluşturacağımız yetkili(yönetici) kullanıcı ismi için istediğiniz ismi kullanabilirsiniz.

Aşağıdaki şekilde kullanıcı adı ve şifrenizi oluşturabilirsiniz.

> use admin
> db.createUser(
> {
> user: "AdminUsr",
> pwd: "AdminUsr'AdminUsrPasswd",
> roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
> }
> )

db.createUser komutunu kullandığımızda, Mongo ekranında her satır öncesinde üc nokta eklendiğini göreceksiniz. Daha sonrasında aşağıdaki gibi geri bildirim alarak kullanıcının eklendiğini kontrol edebiliriz.

> use admin
switched to db admin
> db.createUser(
... {
... user: "AdminUsr",
... pwd: "AdminUsr'AdminUsrPasswd",
... roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
... }
... )
Successfully added user: {
"user" : "AdminKudret",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
}
]
}

exit yazıp sonrasında ENTER diyerek veya CTRL+C kombinasyonu ile tekrar MongoDB konsol arayüzününde bağlantıyı sonlandırabiliriz.

Kimlik Doğrulamasın Aktif Edilmesi

Kimlik doğrulama mongod.conf dosyasında aktif edilmektedir. İlk olarak aktif edeceğiz ve sonrasında mongod’ yi yeniden başlatacağız. Bu durumda kullanıcılar Mongo’ ya kimlik doğrulamasız bağlanabilecekler ancak işlem yapmak istediklerinde kullanıcı adı ve şifre girmek durumunda kalacaklardır.

İlk olarak ilgili ayar dosyasının içine girelim.

$ sudo nano /etc/mongod.conf

Dosya içindeyken security alanını bulup aşağıdaki şekilde düzenleyelim.

...
security:
authorization: "enabled"
...

Daha sonrasında dosyayı kaydedip çıkalım.

Şimdi ki işlemde mongod servisini yeniden başlatacağız.

$ sudo systemctl restart mongod

Eğer ayarlarda bir hata yaptıysak daemon başlamayacaktır. Systemctl çıktı olarak bir şey getirmediğinden dolayı status komutu ile ilgili durumun kontrolünü yapacağız.

$ sudo systemctl status mongod

Eğer Active: active (running) yazısını görip çıktının sonunda da aşağıdaki gibi bir satır görürseniz restart işleminin sorunsuz gerçekleştiğinden emin olabilirsiniz.

Jul 04 12:17:21 MongoHost systemd[1]: Started High-performance, schema-free document-oriented database.

Kimlik Doğrulaması Yapılmayan Kullanıcıların Kısıtlanması

Şimdi yaptığımız kısıtlamaları doğrulamak için direkt bağlantı sağlamaya çalışalım.

$ mongo

Kimlik doğrulamayı aktif hale getirdik ve önceki uyarıların gitmiş olduğunu aşağıdaki gibi bir çıktı ile karşılaşarak göreceğiz.

MongoDB shell version v3.4.2
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.2

Şu an test veritabanına bağlandık. Erişimimizin kısıtlandığını show dbs komutu ile test edebiliriz.

> show dbs

Aşağıdaki gibi bir çıktı ile karşılaşacaksınız.

2017-07-04T12:17:21.919+0000 E QUERY [thread1] Error: listDatabases failed:{
"ok" : 0,
"errmsg" : "not authorized on admin to execute command { listDatabases: 1.0 }",
"code" : 13,
"codeName" : "Unauthorized"
...

Göreceğiniz üzere kimlik doğrulaması olmadan kullanıcı oluşturma veya diğer işlemleri yapamamaktayız.

Tekrar sunucumuza geri dönelim

> exit

Yönetici Kullanıcısının Erişiminin Doğrulanması

Aşağıdaki şekilde -u komutu sonrası oluşturduğumuz yönetici kullancısı ile giriş yapacağımızı, -p ile daha sonra belirlediğimiz şifre sorulduğunda onu gireceğimizi ve –authenticationDatabase ile de kimlik doğrulama bilgilerimizin bulunduğu veritabanını belirtebiliriz.

$ mongo -u AdminUsr -p --authenticationDatabase admin

Karşımıza çıkan şifre adımında yönetici kullanıcısı için belirlediğimiz şifreyi girerek bu adımı geçiyoruz.

MongoDB shell version v3.4.2
Enter password:
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.2

>

Daha sonra yukarıda kimlik doğrulama adımında kullandığımız komutu tekrar çalıştıracağız.

> show dbs

Aşağıdaki gibi bir çıktı ile karşılaşacaksınız.

admin 0.000GB
local 0.000GB

Daha sonrasında tekrar exit sonrasında ENTER diyerek veya CTRL+C kombinasyonu ile MongoDB arayüzünden çıkış yapalım.

Uzak Erişim Ayarları (İsteğe Bağlı)

Uzak bağlantılara erişim izni veren kurulum ile çalışmaya başladık. Tercihen MongoDB harici bir güvenlik duvarının arkasında olmalı veya VPN tarafından korunmalı veya bastion modelinde bir host tarafından sınırlandırılmalıdır.

UFW’nin Aktif Edilmesi

İlk olarak UFW güvenlik duvarımızın durumuna bakalım.

$ sudo ufw status

Eğer UFW güvenlik duvarınız pasif durumda ise aşağıdaki komut yardımı ile aktif edebilirsiniz.

$ sudo ufw enable

Daha sonrasında tekrar yukarıdaki status komutunu çalıştırarak üzerindeki kuralları görebilirsiniz. Ancak SSH izninizin olduğundan emin olmalısınız.

$ sudo ufw allow OpenSSH

Herhangi bir değişiklik olmadığı sürece status komutu sonrası aşağıdaki gibi bir çıktı ile karşılaşacaksınız.

Status: active

To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)

Şimdi default MongoDB portu olan 27017′ a izin vereceğiz. Ancak bu izni belirli bir host için yaparak bir kısıt koyacağız. Eğer MongoDB default portunu değiştirdiyseniz aşağıdaki komutta da belirlediğiniz portu yazmaya dikkat edin.

$ sudo ufw allow from sunucu_ip_adresi to any port 27017

Tekrar status komutu ile UFW güvenlik duvarımız üzerindeki kurallara göz atalım.

$ sudo ufw status

Aşağıda da göreceğiniz üzere belirttiğimiz kural eklenmiş durumdadır.

To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
27017 ALLOW sunucu_ip_adresi
OpenSSH (v6) ALLOW Anywhere (v6)

Public bindIP Yapılandırılması

Uzak bağlantı izni için host’ umuza dışarıdan mongod.conf’ a erişilebilen bir IP adresi yazmamız gerekmektedir.

$ sudo nano /etc/mongod.conf

net alanında aşağıdaki gibi değişiklikleri yapalım.

...
net:
port: 27017
bindIp: 127.0.0.1,MongoHost_ip_adresi
...

Dosyayı kaydedip çıkalım. Daha sonrasında daemon’ u yeniden başlatalım.

$ sudo systemctl restart mongod

Daha önce yaptığımız gibi status komutu yardımı ile restart komutunun başarılı olup olmadığını kontrol edelim.

$ sudo systemctl status mongodb

Çıktı da “Active: active (running)” yazısını görüyorsanız sorunsuz şekilde yeniden başlatma işlemi gerçekleşmiş olduğunu görebilirsiniz.

Uzak Bağlantı Testi

Şimdi Mongo’ nun kendi public arayüzünü dinlediğini –host komutu ve onunla birlikte belirttiğimi IP adresi ile test edeceğiz.

$ mongo -u AdminUsr -p --authenticationDatabase admin --host MongoHost_ip_adresi
MongoDB shell version v3.4.2
Enter password:
connecting to: mongodb://XXX.XXX.XXX.XXX:27017/
MongoDB server version: 3.4.2

Bu dokümanda, makalede yazan komutları, çözümleri uygulamak tamamen kullanıcının kendi sorumluluğunda ve insiyatifin de olan bir konudur, mevcut komutların uygulanması ile doğabilecek, oluşabilecek her türlü sorumluluk ve sonuçlar kullanıcının kendisine aittir, CloudEOS’ un bu konuda herhangi bir sorumluluğu bulunmamaktadır.