MongoDB的訪問控制能夠有效保證資料庫的安全,訪問控制是指綁定Application監聽的IP地址,設置監聽埠,使用賬戶和密碼登錄 一,訪問控制的參數 1,綁定IP地址 mongod 參數:--bind_ip <ip address> 預設值是所有的IP地址都能訪問,該參數指定MongoDB對 ...
MongoDB的訪問控制能夠有效保證資料庫的安全,訪問控制是指綁定Application監聽的IP地址,設置監聽埠,使用賬戶和密碼登錄
一,訪問控制的參數
1,綁定IP地址
mongod 參數:--bind_ip <ip address>
預設值是所有的IP地址都能訪問,該參數指定MongoDB對外提供服務的綁定IP地址,用於監聽客戶端 Application的連接,客戶端只能使用綁定的IP地址才能訪問mongod,其他IP地址是無法訪問的。
2,設置監聽埠
mongod 參數:--port <port>
MongoDB 預設監聽的埠是27017,該參數顯式指定MongoDB實例監聽的TCP 埠,只有當客戶端Application連接的埠和MongoDB實例監聽的埠一致時,才能連接到MongoDB實例。
3,啟用用戶驗證
mongod 參數:--auth
預設值是不需要驗證,即 --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.
參考文檔:
Collection-Level Access Control