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.
- changeStream
- 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.
- collStats
- 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
- collStats
- 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.
- changeCustomData
- 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.
- addShard
- 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)
- checkFreeMonitoringStatus (New in version 4.0)
- 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
- applicationMessage
- 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.
- listDatabases action
- restore
- bypassDocumentValidation
changeCustomData
changePassword
collMod
convertToCapped
createCollection
createIndex
createRole
createUser
dropCollection
dropRole
dropUser
grantRole
insert
revokeRole
viewRole
viewUserbypassDocumentValidation
collMod
createCollection
createIndex
dropCollection
insert
- bypassDocumentValidation
- 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…