MongoDB 安全和訪問權限控制

MongoDB的訪問控制可以有效保證數據庫的安全,訪問控制是指綁定Application監聽的IP地址,設置監聽端口,使用帳戶和密碼登陸mongodb

一,訪問控制的參數數據庫

1,綁定IP地址數組

mongod 參數:--bind_ip <ip address>安全

默認值是全部的IP地址都能訪問,該參數指定MongoDB對外提供服務的綁定IP地址,用於監聽客戶端 Application的鏈接,客戶端只能使用綁定的IP地址才能訪問mongod,其餘IP地址是沒法訪問的。app

2,設置監聽端口ide

mongod 參數:--port <port>函數

MongoDB 默認監聽的端口是27017,該參數顯式指定MongoDB實例監聽的TCP 端口,只有當客戶端Application鏈接的端口和MongoDB實例監聽的端口一致時,才能鏈接到MongoDB實例。工具

3,啓用用戶驗證ui

mongod 參數:--auth this

默認值是不須要驗證,即 --noauth,該參數啓用用戶訪問權限控制;當mongod 使用該參數啓動時,MongoDB會驗證客戶端鏈接的帳戶和密碼,以肯定其是否有訪問的權限。若是認證不經過,那麼客戶端不能訪問MongoDB的數據庫。

Enables authorization to control user’s access to database resources and operations. When authorization is enabled, MongoDB requires all clients to authenticate themselves first in order to determine the access for the client.

4,權限認證

mongo 參數:--username <username>, -u <username>
mongo 參數:--password <password>, -p <password>
mongo 參數:--authenticationDatabase <dbname>  指定建立User的數據庫;在特定的數據庫中建立User,該DB就是User的authentication database。

在鏈接mongo時,使用參數 --authenticationDatabase,會認證 -u 和 -p 參數指定的帳戶和密碼。若是沒有指定驗證數據庫,mongo使用鏈接字符串中指定的DB做爲驗證數據塊。

二,基於角色的訪問控制(Role-Based Access Control)

角色是授予User在指定資源上執行指定操做的權限,MongoDB官方手冊對角色的定義是:

A role grants privileges to perform the specified actions on resource.

MongoDB爲了方便管理員管理權限,在DB級別上預先定義了內置角色;若是用戶須要對權限進行更爲細緻的管理,MongoDB容許用戶建立自定義的角色,可以在集合級別上控制User可以執行的操做。
MongoDB使用角色(Role)授予User訪問資源的權限,Role決定User可以訪問的數據庫資源和執行的操做。一個User可以被授予一個或多個Role,若是User沒有被授予Role,那麼就沒有訪問MongoDB系統的權限。

A user is granted one or more roles that determine the user’s access to database resources and operations. Outside of role assignments, the user has no access to the system.

1,內置角色(Built-In Roles)

內置角色是MongoDB預約義的角色,操做的資源是在DB級別上。MongoDB擁有一個SuperUser的角色:root,擁有最大權限,可以在系統的全部資源上執行任意操做。

數據庫用戶角色(Database User Roles):

  • read:授予User只讀數據的權限
  • readWrite:授予User讀寫數據的權限

數據庫管理角色(Database Administration Roles):

  • dbAdmin:在當前dB中執行管理操做
  • dbOwner:在當前DB中執行任意操做
  • userAdmin:在當前DB中管理User

備份和還原角色(Backup and Restoration Roles):

  • backup
  • restore

跨庫角色(All-Database Roles):

  • readAnyDatabase:授予在全部數據庫上讀取數據的權限
  • readWriteAnyDatabase:授予在全部數據庫上讀寫數據的權限
  • userAdminAnyDatabase:授予在全部數據庫上管理User的權限
  • dbAdminAnyDatabase:授予管理全部數據庫的權限

集羣管理角色(Cluster Administration Roles):

  • clusterAdmin:授予管理集羣的最高權限
  • clusterManager:授予管理和監控集羣的權限,A user with this role can access the config and local databases, which are used in sharding and replication, respectively.
  • clusterMonitor:授予監控集羣的權限,對監控工具具備readonly的權限
  • hostManager:管理Server

2,用戶自定義的角色(User-Defined Roles)

內置角色只能控制User在DB級別上執行的操做,管理員能夠建立自定義角色,控制用戶在集合級別(Collection-Level)上執行的操做,即,控制User在當前DB的特定集合上執行特定的操做。

在建立角色時,必須明確Role的四個特性:

  • Scope:角色做用的範圍,建立在Admin中的角色,可以在其餘DB中使用;在其餘DB中建立的角色,只能在當前DB中使用;
  • Resource:角色控制的資源,表示授予在該資源上執行特定操做的權限;
  • Privilege Actions:定義了User可以在資源上執行的操做,系統定義Action是:Privilege Actions
  • Inherit:角色可以繼承其餘角色權限

2.1 角色做用的範圍(Scope)

在admin 數據庫中建立的角色,Scope是全局的,可以在admin,其餘DB和集羣中使用,而且可以繼承其餘DB的Role;而在非admin中建立的角色,Scope是當前數據庫,只能在當前DB中使用,只能繼承當前數據庫的角色。

A role created in the admin database can include privileges that apply to the admin database, other databases or to the cluster resource, and can inherit from roles in other databases as well as the admin database. Except for roles created in the admin database, a role can only include privileges that apply to its database and can only inherit from other roles in its database. 

2.2 權限的操做(Privilege actions)

MongoDB的權限包由:資源(Resource)和操做(Action)兩部分組成,Privilege Actions 定義User可以在資源上執行的操做,例如:MongoDB在文檔級別(Document-Level)上執行的讀寫操做(Query and Write Actions)列表是

  • find
  • insert
  • remove
  • update

3,建立角色

使用db.CreateRole()在當前DB中建立角色,建立的語法示例以下:

複製代碼
use admin
db.createRole(
   {
     role: "new_role",
     privileges: [
       { resource: { cluster: true }, actions: [ "addShard" ] },
       { resource: { db: "config", collection: "" }, actions: [ "find", "update", "insert", "remove" ] },
       { resource: { db: "users", collection: "usersCollection" }, actions: [ "update", "insert", "remove" ] },
       { resource: { db: "", collection: "" }, actions: [ "find" ] }
     ],
     roles: [
       { role: "read", db: "admin" }
     ]
   },
   { w: "majority" , wtimeout: 5000 }
)
複製代碼

在roles數組中,指定被繼承的role,即,新建的new_role從roles數組中繼承權限:

  • 若是被繼承的role在當前DB中,定義的格式是:roles:["role"];
  • 若是被繼承的role不在當前DB中,須要使用doc,指定該role所在的DB,定義的格式是:roles:[{role:"role_name", db:"db_name"}];

4,自定義角色管理函數

  • db.createRole() :Creates a role and specifies its privileges.
  • db.updateRole() :Updates a user-defined role.
  • db.dropRole() :Deletes a user-defined role.
  • db.dropAllRoles() :Deletes all user-defined roles associated with a database.
  • db.grantPrivilegesToRole() :Assigns privileges to a user-defined role.
  • db.revokePrivilegesFromRole() :Removes the specified privileges from a user-defined role.
  • db.grantRolesToRole() :Specifies roles from which a user-defined role inherits privileges.
  • db.revokeRolesFromRole() :Removes inherited roles from a role.
  • db.getRole() :Returns information for the specified role.
  • db.getRoles() :Returns information for all the user-defined roles in a database.

三,管理用戶和權限

1,建立用戶

複製代碼
use db_name
db.createUser( { user: "user_name", pwd: "user_pwd", roles: [ { role: "clusterAdmin", db: "admin" }, { role: "readAnyDatabase", db: "admin" }, "readWrite"
] } )
複製代碼

爲新建的User,授予一個或多個角色,經過roles數組來實現:

  • 若是role存在於當前DB中,roles的格式:roles:["role"];
  • 若是role不存在於當前DB中,roles的格式:roles:[Role:"role_name", db:"db_name"];

2,權限認證(Authenticate)

mongo鏈接到mongod,有兩種權限認證的方式:

  • 在鏈接時認證用戶訪問的權限,mongo 使用參數 --authenticationDatabase <dbname> 指定認證數據庫;
  • 在鏈接後,認證用戶訪問的權限,mongo 沒有使用參數 --authenticationDatabase <dbname>,在鏈接到mongod以後,切換到驗證數據庫(authentication database)中,使用db.auth() 驗證User是否有權限訪問當前數據庫;
use db_name
db.auth("user_name", "user_pwd" )

3,用戶管理函數

  • db.auth() :Authenticates a user to a database.
  • db.createUser() :Creates a new user.
  • db.updateUser() :Updates user data.
  • db.changeUserPassword() :Changes an existing user’s password.
  • db.dropAllUsers() :Deletes all users associated with a database.
  • db.dropUser() :Removes a single user.
  • db.grantRolesToUser() :Grants a role and its privileges to a user.
  • db.revokeRolesFromUser() :Removes a role from a user.
  • db.getUser() :Returns information about the specified user.
  • db.getUsers() :Returns information about all users associated with a database.

 

參考文檔:

Role-Based Access Control

Built-In Roles

Collection-Level Access Control

db.createRole()

db.createUser()

Enable Auth

Manage Users and Roles

mongod

相關文章
相關標籤/搜索