MongoDB, как создать роль в любой базе данных, мне нужна ограниченная роль, чтобы показывать только действия пользователей в любых базах данных - PullRequest
0 голосов
/ 27 мая 2020

Для известных всех баз данных (даже с объявленными пользователями) я использую с pymon go (pymongo == 3.10.1 с mongodb 4.2)

db.command({'usersInfo': { 'forAllDBs': True },
           'showCredentials': True})

этой команде требуется userAdminAnyDatabase встроенная роль на клиентском пользователе. Но эта роль дает много привилегий. Если кто-то взломает пароль пользователя, он может повысить роль до dbAdminAnyDatabases. Поэтому мне не удалось создать какую-либо роль базы данных с авторизацией (роль с действием только viewUser в любых базах данных) для предыдущей команды userinfos.

кто-нибудь может мне помочь с определением этой роли?

Ответы [ 2 ]

0 голосов
/ 29 мая 2020

Спасибо, я создаю роль:

with pymongo.MongoClient('mongodb://localhost:27017/',
                     username='SuperAdmin',
                     password='XXXXXXXXXX',
                     authSource='admin',
                     authMechanism='SCRAM-SHA-256') as client:


        extendRole="showUsersAnyBase"
        crole=client['admin'].command('rolesInfo',extendRole)
        if reinit and extendRole  in [x['role'] for x in crole['roles']]:
            client['admin'].command('dropRole',extendRole)
        if reinit or extendRole not in [x['role'] for x in crole['roles']]:
            client['admin'].command({'createRole': extendRole,
                                              'privileges': [{'resource': { 'anyResource': True }, 
                                               'actions': [ "viewUser" ]}],
                                              'roles':[ ]
                                              })

создаю пользователя коннектора:

usersInfos=client['admin'].command({'usersInfo': [{'user' : 'connector','db': 'admin'}]})
        if reinitConnector and 'connector'  in [x['user'] for x in usersInfos['users']]:
            client['admin'].command('dropUser',"connector")
        if reinitConnector or 'connector' not in [x['user'] for x in usersInfos['users']]:
            client['admin'].command("createUser", "connector", 
                                     pwd="XXXXXXXXXX", 
                                     roles=[extendRole])

используйте пользователя коннектора с командой for userInfos:

with pymongo.MongoClient('mongodb://localhost:27017/',
                        username='connector',
                        password='XXXXXXXXXX',
                        authSource='admin',
                        authMechanism='SCRAM-SHA-256') as client2:

        usersInfos=client2['admin'].command({
                                             'usersInfo': { 'forAllDBs': True },
                                             'showCredentials': True
                                             })
        for user in usersInfos['users']:
            print("user:",user['user'],
                   "db:",user['db'],
                   "roles:",[x['db']+'->'+x['role'] for x in user['roles']])

Работает нормально !!

и пользователь коннектора не может предоставить роль:

        client2['admin'].command('grantRolesToUser','connector',
                                  roles=['dbAdminAnyDatabase'])

исключение исключения:

.....
raise OperationFailure(msg % errmsg, code, response)
pymongo.errors.OperationFailure: not authorized on admin to execute command { grantRolesToUser: "connector", .....
0 голосов
/ 27 мая 2020

Вы можете попробовать anyResource , чтобы получить все базы данных.

...