# 数据库安全

测试都是进行的匿名操作,非安全模式

# 创建用户

在数据库中创建的第一个用户应该是具有管理其他用户的权限的用户管理员

  • 创建一个管理员用户

    >use admin
    db.createUser(
     {
     	user: "myUserAdmin",
     	pwd: "passwd",
     	roles: ["userAdminAnyDatabase"]
     }
    )
    
    1
    2
    3
    4
    5
    6
    7
    8

# 启动身份认证

  • 重启 mongod 进程

    docker stop mymongo && docker rm $_
    
    1
  • 启动 mongod 带身份认证

    docker run --name mymongo -v /mymongo/data:/data/db -d mongo:4 mongod --auth
    
    1
    • linux 启动身份认证

      sudo bin/mongod --auth --dbpath /data/db
      
      1
  • 进行身份验证

    • 进入 mongo 容器

      docker exec -it mymongo bash
      
      1
    • 使用参数进行身份验证启动 mongo shell

      mongo -u "myUserAdmin" -p "passwd" --authenticationDatabase "admin"
      
      1
    • 使用 db.auth()进行身份验证

      mongo 默认启动mongo shell
      >use admin
      db.auth("myUserAdmin","passwd")
      
      1
      2
      3

# 授权

  • 权限(在那里 + 做什么)

    {resource: {db: "test", collection: "" }, actions: ["find","update"] }
    
    1
  • 角色(一组权限的集合)

    • 默认内置角色:

      • read ——读取当前数据库中所有非系统集合
      • readWrite ——读写当前数据库中所有非系统集合
      • dbAdmin ——管理当前数据库
      • userAdmin ——管理当前数据库中的用户和角色
      • 这四种后可以加后缀"userAdminAnyDatabase" ——对所有数据库执行操作(只有在 admin 数据库中提供)
    • 创建自己定义的角色

      ###创建一个只能读取demo集合的用户
      >use test;
      db.createRole(
      	{
      		role: "readDemo",
      		privileges: [
      			{resource: {db: "test", collection: "demo"}, actions: ["find"]}
      		],
      		roles: []
      	}
      )
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      • role ——角色名称
      • privileges ——所具有的权限
      • roles ——所继承其他角色的权限

# 举例

  • 创建一个只能读取 test 数据库的用户

    • 要以管理员身份登录

      mongo -u "myUserAdmin" -p "passwd" --authenticationDatabase "admin"
      
      1
    • 创建用户

      >use test
      db.createUser(
       {
       	user: "testReader",
       	pwd: "passwd",
       	roles: [ { role: "read",db: "test" } ]
       }
      )
      
      1
      2
      3
      4
      5
      6
      7
      8
    • 验证

      exit  #退出管理员用户
      mongo -u "testReader" -p "passwd"
      #以新创建用户登录,后面不加参数默认操作test数据库
      
      1
      2
      3

      可 find() 不可以进行更改写入

  • 创建一个只能读取 demo 集合的用户

    >use test
    db.createUser(
     {
     	user: "demoReader",
     	pwd: "passwd",
     	roles: ["readDemo"]
     }
    )
    
    1
    2
    3
    4
    5
    6
    7
    8

# 数据导入导出工具

# mongoexport

将数据导出为 json 或 csv 格式文件

# 所需准备

  • 需要对数据库有 read 权限

  • 创建执行 mongoexport 的用户

  • 使用 mongo shell 创建用户

    • 使用有用户管理员权限的用户启动 mongo shell

      mongo -u "myUserAdmin" -p "passwd" --authenticationDatabase admin
      
      1
    • 创建一个可读用户

      >use admin;
      db.createUser(
      	{
      		user: "readUser",
      		pwd: "passwd",
      		roles: ["readAnyDatabase"]
      	}
      )
      
      1
      2
      3
      4
      5
      6
      7
      8
    • 退出 mongo shell

# 导出 csv 文件

mongoexport --db test --collection demo --type=csv --fields name,age --out /opt/backups/demos.csv -u readUser -p passwd --authenticationDatabase admin
1
  • fields——导出字段名称(可以导出内嵌文档字段)必须有这个字段

  • out——导出文件路径

  • 查看导出文件

    cat /opt/backups/demos.csv
    
    1

# 导出 json 文件

mongoexport --db test --collection demo --type=json --fields name,balance --out /opt/backups/demo.json -u readUser -p passwd --authenticationDatabase admin
1
  • id 文档主键会被默认导出

  • --fields 选项可选的

    mongoexport --db test --collection demo --type=json --out /opt/backups/demo.json -u readUser -p passwd --authenticationDatabase admin
    
    1

# 常用参数

  • 使用查询语句进行筛选

    mongoexport --db test --collection demo --type=json --fields name,balance --out /opt/backups/demo.json -u readUser -p passwd --authenticationDatabase admin --query '{ age: { $gte:20} }'
    
    1
  • 指定 ip 和 port

    mongoexport --db test --collection demo --type=json --fields name,balance --out /opt/backups/demo.json -u readUser -p passwd --authenticationDatabase admin --host localhost --port 27017
    
    1
    • 默认为本地数据库,27017
  • --limit , --skip , --sort 选项

    mongoexport --db test --collection demo --type=json --fields name,balance --out /opt/backups/demo.json -u readUser -p passwd --authenticationDatabase admin --sort '{age: 1}' --limit 3 --skip 1
    
    1

# mongoimport

将数据由 json 或 csv 格式文件导入

# 所需准备

  • 需要对数据库有 readWrite 权限

  • 创建执行 mongoexport 的用户

  • 使用 mongo shell 创建用户

    • 使用有用户管理员权限的用户启动 mongo shell

      mongo -u "myUserAdmin" -p "passwd" --authenticationDatabase admin
      
      1
    • 创建一个可读写用户

      >use admin;
      db.createUser(
      	{
      		user: "writeUser",
      		pwd: "passwd",
      		roles: ["readWriteAnyDatabase"]
      	}
      )
      
      1
      2
      3
      4
      5
      6
      7
      8
    • 退出 mongo shell

# 导入 csv 文件

  • 查看上次导出的文件

    cat /opt/backups/demos.csv
    
    ###
    name,age
    zs,22
    12,
    ww,
    qq,12
    qq,12
    ww,24
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
  • 导入文件

    mongoimport --db test --collection importDemo --type csv --headerline --file /opt/backups/demos.csv -u writeUser -p passwd --authenticationDatabase admin
    
    1
  • 查看导入文档

    mongo -u readUser -p passwd --authenticationDatabase admin --quiet --eval 'db.importDemo.find()'
    
    1

# 导入 json 文件

mongoimport --db test --collection importDemo --type json --file /opt/backups/demos.json -u writeUser -p passwd --authenticationDatabase admin --upsertFiles name,age
1

# 常用参数

  • --headerline ——代表原文件中有 name 和 age 字段(和--fileds 选项二选一)
    • 如果不使用这两个参数,会把第一行也当做为数据进行导入
  • --fileds ——可以自己定义字段名称,可以将内嵌字段拿出来
  • --drop ——可以添加该选项,如果存在该集合导入前清空集合
  • --upsertFiles name,age ——更新旧文档,如果已存在相同数据,不再新增文档
    • 如果不使用该参数,一直重复导入相同的文件也会增加文档,他默认比较的时文档主键。可以选择对比字段内容。
  • --stopOnError ——一旦发生错误即停止
  • --maintainInsertionOrder ——按照文件顺序进行导入

# 数据库备份恢复工具

# mongodump 备份

mongodump -h localhost:27017 -u root -p root --authenticationDatabase admin  -d test -c demo -o /home/xiaohao/ --gzip
1
  • -d 备份指定数据库

  • -c 备份指定集合

  • -o 指明导出的文件名

  • -- excludeCollection = demo 除了 demo 集合都进行备份

  • -q 指定过滤条件

  • --authenticationDatabase 身份验证

  • --gzip 对备份进行压缩

# mongorestore 恢复

mongorestore -h localhost:27017 -u root -p root --authenticationDatabase admin -d test -c demo --drop /home/xaiohao/test/
1
  • --drop 恢复的时候把之前的集合 drop 掉

# 与 mongoexport/import 的对比

  • mongodump/store 是针对整个库的操作,mongoexport/import 是针对表中数据的操作。
  • mongodump/store 导出带有 BSON 格式数据,mongoexport/import 导出 json 或者 csv 格式数据
  • 在一些 mongodb 版本之间,BSON 格式可能会随版本不同而有所不同,所以不同版本之间用 mongodump/mongorestore 可能不会成功,具体要看版本之间的兼容性。
  • JSON 虽然具有较好的跨版本通用性,但其只保留了数据部分,不保留索引,账户等其他基础信息。使用时应该注意。

该部分参考:https://www.cnblogs.com/clsn/p/8244206.html#auto_id_9