MongoDB Authorization – Yetkilendirme ve Şifreli Erişim

MongoDB’de kullanıcı açmak ile ilgili daha önce bir makale yayınlamıştım. Bu makalede ise authorization kontrolü ile database’e yetkili kullanıcı oluşturma ve root (kök) yetkili kullanıcı oluşturma konusunu anlatacağım.

Eğer hiçbir işlem yapmaz iseniz, mongodb sizden bir authorization kontrolü istemez ve dolayısı ile sunucuya erişimi olan herkes veritabanına giriş yapabilir. Bu durumun en tehlikeli tarafı aslında, sunucuyu public ortama açtığımızda karşımıza çıkıyor. Zira bu durumda veritabanlarımızın tümü authorization olmaz ise ip adresinize erişebilen ve portu gören, bilen herkes için public hale gelebilir. İşte tüm bu sebepleri engellemek ve mongodb için sağlıklı bir erişim elde etmek adına yapmamız gereken tam da bu makalede anlatılanları uygulamak olacaktır.

Öncelikle bazı bilindik yetki adlarından bahsedelim ve neler olduklarını yazalım.

  • read
    • changeStream
      collStats
      dbHash
      dbStats
      find
      killCursors
      listIndexes
      listCollections
      görevlerini üstlenen kullanıcıdır ve adından da anlaşılacağı üzere yalnızca okuma ve türevi işleri yerine getirebilir.
  • readWrite
    • collStats
      convertToCapped
      createCollection
      dbHash
      dbStats
      dropCollection
      createIndex
      dropIndex
      find
      insert
      killCursors
      listIndexes
      listCollections
      remove
      renameCollectionSameDB
      update
      görevlerine sahip hem okuma, hem de yazma görevini üstlenirler. Ancak veritabanı sahipliği yoktur. Yani backup, dropDatabase gibi yetkileri yoktur. Ancak dropCollection yetkileri elbette vardır.
  • dbAdmin
    • collStats
      dbHash
      dbStats
      find
      killCursors
      listIndexes
      listCollections
      dropCollection
      yalnızca system.profile üzerinden createCollection
      Veritabanı aitliği büyük oranda vardır. Veritaban(lar)ına admin yetkisi tanımlanır ve yukarıda listelenen işlevlerin tümünü yapabilmektedir. Aslında yetkili kullanıcılar için ideal bir website erişim yetki planıdır.

      Sistem dışı olan tüm kolleksiyonlara da aşağıdaki yetkileri verir. Ki bu rol yetkisi dışındaki tüm veritabanlarına tam okuma yetkisi sağlamaz.

    • bypassDocumentValidation
      collMod
      collStats
      compact
      convertToCapped
      createCollection
      createIndex
      dbStats
      dropCollection
      dropDatabase
      dropIndex
      enableProfiler
      reIndex
      renameCollectionSameDB
      repairDatabase
      storageDetails
      validate
  • dbOwner
    • readWrite, dbAdmin ve userAdmin görevlerinin tamamını üstlenen bir grup görev tanımıdır diyebiliriz.
  • userAdmin
    • changeCustomData
      changePassword
      createRole
      createUser
      dropRole
      dropUser
      grantRole
      revokeRole
      setAuthenticationRestriction
      viewRole
      viewUser
      En önemli yetkili kullanıcılardan bir tanesidir. Yukarıda listelenen işlevlerin tamamını yerine getirebilir. Aslında collection veya db’den çok kullanıcıları yönetmeye ilişkin bir yetki iznidir.
      Önemli Uyarı: Burada belirtilen kullanıcı, kullanıcıları yönetme yetkisine sahip olduğu için unutulmamalıdır ki, kendinden daha üstün bir kullanıcı create ederek yetkiyi arttırabilir.
  • clusterAdmin
    • clusterManager, clusterMonitor ve hostManager rollerine sahip kullanıcı rolüdür.
  • clusterManager
    • addShard
      appendOplogNote
      applicationMessage
      cleanupOrphaned
      flushRouterConfig
      listSessions (New in version 3.6)
      listShards
      removeShard
      replSetConfigure
      replSetGetConfig
      replSetGetStatus
      replSetStateChange
      resync
    • enableSharding
      moveChunk
      splitChunk
      splitVector
      görevlerinin tümünü yerine getirebilmektedir.
  • clusterMonitor
    • checkFreeMonitoringStatus (New in version 4.0)
      connPoolStats
      getCmdLineOpts
      getLog
      getParameter
      getShardMap
      hostInfo
      inprog
      listDatabases
      listSessions (New in version 3.6)
      listShards
      netstat
      replSetGetConfig
      replSetGetStatus
      serverStatus
      setFreeMonitoring (New in version 4.0)
      shardingState
      top
    • Cluster’daki tüm veritabanları için aşağıdaki görevleri de üstlenir.

      collStats
      dbStats
      getShardVersion
      indexStats
      useUUID (3.6 versiyon ve üzeri)

  • hostManager
    • applicationMessage
      closeAllDatabases
      connPoolSync
      cpuProfiler
      flushRouterConfig
      fsync
      invalidateUserCache
      killAnyCursor (New in version 4.0)
      killAnySession (New in version 3.6)
      killop
      logRotate
      resync
      setParameter
      shutdown
      touch
      unlock
    • Cluster’daki tüm veritabanları için aşağıdaki görevleri de üstlenir.

      killCursors
      repairDatabase

  • backup
    • listDatabases action
      listCollections action
      listIndexes action
      adından da anlaşılacağı üzere bu yetkiler ile yedekleme yönetimini sağlayabilen bir kullanıcı tipidir.
  • restore
    • bypassDocumentValidation
      changeCustomData
      changePassword
      collMod
      convertToCapped
      createCollection
      createIndex
      createRole
      createUser
      dropCollection
      dropRole
      dropUser
      grantRole
      insert
      revokeRole
      viewRole
      viewUser

      bypassDocumentValidation
      collMod
      createCollection
      createIndex
      dropCollection
      insert

  • readAnyDatabase
    • Veritabanlarının tümünü listeleyip işlem okuma işlemine yetkili hale gelmesini sağlar.
  • readWriteAnyDatabase
    • Veritabanlarının tümünde okuma ve yazma erişimini yapabilen kullanıcıdır.
  • userAdminAnyDatabase
    • Tüm veritabanlarında yukarıda anlatılan userAdminDatabase yetkisine sahip bir kullanıcı tipidir.
  • dbAdminAnyDatabase
    • Veritabanlarının tümünde dbAdmin olarak işlem yapabilir.
  • root
    • Tehlikeli ve bir o kadar da en az bir kullanıcı için gerekli bir roldür. Hiçbir ama hiçbir kısıtlama olmadan “admin” database’i ile ilişkilendirilerek kullanılan ve full+full yetkili kullanıcı tipidir.

Evet yetki tanımları bu şekilde. Şimdi gelelim bir kaç örnek yetki tanımlama cümleciğine. Öncelikle veritabanımıza tıklayarak “Open Shell” diyor ve komut satırımızı açıyoruz. Sonra aşağıdaki şekilde yetki tanımlama kodumuzu yazıyor ve F5 yapıyoruz.

 

db.createUser({ 
    user: "userName", 
    pwd: "userPassword", 
    roles: [{ 
        role: "readWrite", 
        db: "yourDatabaseName" 
        }],
 mechanisms:[  
  "SCRAM-SHA-1"
 ] 
        })

 

 

 

Burada yourDatabaseName veritabanına userName isimli ve yalnızca readWrite yetkisine sahip bir kullanıcı oluşturmuş olduk.

 

db.createUser({ 
    user: "userName", 
    pwd: "userPassword", 
    roles: [{ 
        role: "root", 
        db: "admin" 
        }],
 mechanisms:[  
  "SCRAM-SHA-1"
 ] 
        })

Burada da admin (root/kök) veritabanına root isminde, full+full yetkili bir kullanıcı oluşturmuş olduk.

İşte bu şekilde yetkilendirme ve tanımlama işlemlerini gerçekleştirebiliriz. Sorularınız olur ise yorum kısmından iletebilirsiniz.

İyi çalışmalar…

Share this Story

Related Posts

Kimler Neler Demiş?

avatar
  Subscribe  
Bildir

Search