Taufik Mulyana
Taufik Mulyana
Linux System Administrator, Interested in Linux, Cloud, Containers
December 14, 2018 5 min read

Replikasi MongoDB dengan Keyfile Access Control

Replikasi MongoDB dengan Keyfile Access Control, replica set pada MongoDB hampir sama dengan master-slave pada MariaDB, beberapa instansi yang mengelola/memelihara data yang sama dan salah satu dari node ada yang menjadi master atau primary dan yang lainnya menjadi slave atau secodary,

pada pembahasan sebelumnya telah kita bahas mengenai replkasi ini pada pranala berikut Konfigurasi Replikasi di MongoDB namun di artikel tersebut tanpa adanya akses kontrol, pada artikel ini akan dijelaskan akses kontrol dengan menggunakan otentikasi internal menggunakan keyfile untuk mengamankan setiap replica set dan untuk keamanan klien yang nantinya terhubung ke replica set akan menggunakan role based access control

kita akan menggunakan arsitektur seperti berikut

mongodb-replication
di ambil dari mongodb.org

berikut informasi untuk setiap node

node1 primary
  ip address : 172.17.56.21
  hostname : mongo-1.mongo.local
node2 secondary
  ip address : 172.17.56.22
  hostname : mongo-2.mongo.local
node3 secondary
  ip address : 172.17.56.23
  hostname : mongo-3.mongo.local

untuk alamat IP dan hostname bisa anda sesuaikan

Mengubah Hostname

ini dilakukan agar lebih mudah saat kita melakukan pengecekan, setiap node akan memiliki hostname yang dilengkapi nomor yang menunjukan nomor dari node yang bersangkutan, untuk mengubahnya kita bisa mengubah isi dari berkas /etc/hostname atau bisa menggunakan perintah berikut

$ sudo hostnamectl set-hostname mongo-x.mongo.local

Konfigurasi Host

karena nantinya kita akan menghubungkan setiap node menggunakan hostname agar lebih mudah, kita tambahkan setiap hostname node beserta ipnya di berkas /etc/hosts

$ sudo vim /etc/hosts

172.17.56.21 mongo-1.mongo.local
172.17.56.22 mongo-2.mongo.local
172.17.56.23 mongo-3.mongo.local

kita bisa tes dengan cara melakukan ping ke node lain

$ ping -c4 mongo-1.mongo.local

Membuat Keyfile

dengan otentikasi keyfile, setiap instansi MongoDB akan menggunakan isi dari keyfile sebagai kata sandi untuk otentikasi setiap member pada replikasi, nantinya hanya instansi MongoDB dengan keyfile yang benar yang dapat bergabung ke replica set, Isi keyfile harus antara 6 dan 1024 karakter dan harus sama untuk semua anggota replica set.

untuk membuat keyfile kita bisa menggunakan OpenSSL

$ openssl rand -base64 756 > mongo_keyfile

buat mongo_keyfile hanya bisa dibaca oleh owner

$ chmod 400 mongo_keyfile

karena saya menjalankan MongoDB atau mongod dengan pengguna mongodb jadi saya harus mengganti owner berkas mongo_keyfile ke mongodb, karena sebelumnya saya membuat dengan pengguna lain, karena nantinya jika owner pada berkas mongo_keyfile berbeda dengan pengguna yang menjalankan mongod, maka berkas tersebut tidak akan dapat dibaca karena hanya bisa dibaca jika ownernya sama

$ sudo chown mongodb.mongodb mongo_keyfile

saya menyimpannya di /etc/, berkas mongo_keyfile ini harus ada pada setiap node/member replica set kita bisa menyalin keyfile ini ke node lain menggunakan rsync, simpan pada direktori yang sama

$ rsync -av /etc/mongo_keyfile [email protected]:/etc/

Konfigurasi MongoDB

selanjutnya kita tambahkan konfigurasi pada berkas konfigurasi mongodb yang berada di /etc/mongod.conf

$ sudo vim /etc/mongod.conf

net:
  port: 27017
  bindIp: 127.0.0.1,172.17.56.21

security:
  keyFile: /etc/mongo_keyfile

replication:
  replSetName: maindb

bindIP isikan sesuai alamat IP node anda, keyFile diisi dengan lokasi direktori dimana keyfile disimpan, dan replSetName di isi dengan nama replikasi, di atas saya menggunakan nama maindb, lakukan konfigurasi diatas pada setiap node

jalankan ulang layanan MongoDB pada setiap node

$ sudo systemctl restart mongod

Memulai Replikasi

masuk ke mongo shell pada node pertama atau primary

$ mongo

lalu jalankan rs.initiate( … ) seperti berikut

rs.initiate(
  {
    _id : maindb,
    members: [
      { _id : 0, host : "mongo-1.mongo.local:27017" },
      { _id : 1, host : "mongo-2.mongo.local:27017" },
      { _id : 2, host : "mongo-3.mongo.local:27017" }
    ]
  }
)

pada _id pertama diisi dengan nama replikasi dan di members diisi setiap node, ini hanya dijalankan pada node pertama

untuk mengeceknya kita bisa menggunakan rs.status()

rs.status()

Membuat Pengguna Administrator

masih pada mongo shell tadi kita akan membuat pengguna taufik dengan role userAdminAnyDatabase

admin = db.getSiblingDB("admin")
admin.createUser(
  {
    user: "taufik",
    pwd: "password",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
  }
)

Otentikasi Sebagai Administrator

kita akan melakukan otentikasi dengan pengguna taufik yang baru saja dibuat, pada mongo shell tadi kita akan menggunakan db.auth()

db.getSiblingDB("admin").auth("taufik", "password" )

Membuat Pengguna Administrator Cluster

kita akan membuat pengguna lagi dengan nama mulyana yang nantinya akan menjadi Administrator Cluster yang akan di ijikan untuk mengelola operasional replikasi

db.getSiblingDB("admin").createUser(
  {
    "user" : "mulyana",
    "pwd" : "password",
    roles: [ { role : "clusterAdmin", db : "admin" } ]
  }
)

sampai disini eeplikasi MongoDB dengan keyfile access control telah selesai, namun penggunaan keyfile ini tidak cocok untuk server produksi, dan hanya diperuntukan untuk keperluan testing dan juga development, untuk production disarankan untuk menggunakan sertifikat x.509 yang akan saya bahas lain waktu.