mongodb 被黑

pre

  • 前面在云主机部署了mongoDB做一些测试,部署方式基本是参考 https://www.mongodb.com/docs/v6.0/tutorial/install-mongodb-on-ubuntu/
  • 设置了简单的密码,验证也只是连到数据库执行 db.auth 指令没问题就结束了
  • 因为机器在云主机上,为了方便本地程序测试使用,开放了 0.0.0.0 27017 的端口权限…
  • 2023-09-26 登录账户遇到被清档的情况,登录进去发现自建的数据库都没有了

被清库

  • day 1 : 服务报错从db没有获取到数据,以为是服务出问题了,当时没有再复现就没有再细查
  • day 2 : 又出现从db加载不到数据的情况;下载mongo client ide 看到数据库里只有新建的数据,这两天跑的测试不应该只有这点数据,mongo 服务还在,当时怀疑是部署的有什么遗漏
  • day 3 : 到机器上查mongo的log,看到database被drop的记录,和一个奇怪的 READ_ME_TO_RECOVER_YOUR_DATA,这才知道是遇到攻击了,还好数据不重要

处理

  • 确认自己是有设置密码的,当时确认的方式还是链接到数据库执行指令看是否成功
    1
    2
    use admin
    db.auth("user", "123456")
  • 可以处理的办法:
    • 关掉公网开发的mongo端口(而且这里还使用的是默认端口,太容易被扫到了)
    • 修改数据库密码,之前用的密码太简单了,机器的登录记录是没有查到恶意用户的(密码生成工具:windows devToys)
  • 虽然关闭端口能解决问题,但是当时想着应该是密码太简单了,改了密码之后就想着看下hacker还能不能进来,所以还是保持端口对外的样子
  • 第二天到机器发现又被清库了….
  • 用 mongo log 记录的过程信息试着复现操作,竟然还真把数据库给删了….(注意下面指令是没有db.auth的)
    1
    2
    3
    4
    mongosh mongodb://127.0.0.1:27017
    use test_database
    db.test.insert({name: "1"})
    db.dropDatabase()
  • mongo auth 形同虚设….
  • 搜索到相同的问题:
  • 后来发现问题出在 mongod.conf 上 security 项是注释状态,(我这糟糕的运维意识)打开这个
    1
    2
    3
    #security:
    security:
    authorization: "enabled"
  • 再执行上面语句会报错
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    > db.test.insert({name: "1"})
    DeprecationWarning: Collection.insert() is deprecated. Use insertOne, insertMany, or bulkWrite.
    Uncaught:
    MongoBulkWriteError: command insert requires authentication
    Result: BulkWriteResult {
    insertedCount: 0,
    matchedCount: 0,
    modifiedCount: 0,
    deletedCount: 0,
    upsertedCount: 0,
    upsertedIds: {},
    insertedIds: { '0': ObjectId("6514fd829155c9c6f72a6fcd") }
    }
    Write Errors: []
  • 执行auth之后:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    kinly> use admin
    switched to db admin
    admin> db.auth("adminXXXX", "xxxxxxx");
    { ok: 1 }
    admin> use kinly
    switched to db kinly
    kinly> db.test.insert({name: "1"});
    {
    acknowledged: true,
    insertedIds: { '0': ObjectId("6514fdd09155c9c6f72a6fce") }
    }
  • 还没完,我自己不能删库了…
    1
    2
    kinly> db.dropDatabase();
    MongoServerError: not authorized on kinly to execute command { dropDatabase: 1, lsid: { id: UUID("8a2107dd-8768-4413-a5be-e9fb7a27744a") }, $db: "kinly" }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    kinly> use admin
    switched to db admin
    admin> show users
    [
    {
    _id: 'admin.xxxx',
    userId: new UUID("xxxx-xxx-xxx-xxx-xxx"),
    user: 'xxxx',
    db: 'admin',
    roles: [
    { role: 'readWriteAnyDatabase', db: 'admin' },
    { role: 'userAdminAnyDatabase', db: 'admin' }
    ],
    mechanisms: [ 'SCRAM-SHA-1', 'SCRAM-SHA-256' ]
    }
    ]
  • https://stackoverflow.com/questions/47130379/mongoerror-not-authorized-on-to-execute-command-find-app-updates-filter
  • https://dba.stackexchange.com/questions/45735/mongo-authentication-user-cant-drop-database
    1
    admin> db.grantRolesToUser("xxxx", ["root"]);
  • OK 了,取消设置:
    1
    2
    # 取消Roles
    admin> db.revokeRolesFromUser("xxxx", ["root"]);
  • 继续开着端口等hacker来…

mysql 被黑 2023-09-29

  • 上午发现apollo无法访问,到机器上发现无法连接数据库了
  • skip_grant_tables=1 模式重启mysql,看到一个README的数据库
  • 机器像是变成互联网上的肉鸡….
  • 这个库是给apollo用的,当时因为apollo版本更新表结构变更导致模版数据导不进去就开了对外端口方便在本地用ide对比区别,后面没有在意也没有关掉端口
  • 这个库里数据很多,眼里噙着泪重新初始化数据库… 参考 https://blog.csdn.net/qq_22938603/article/details/125569850

个人开发者安全意识

  • 端口对外需要谨慎,很多时候部署组件在远端的云主机,自己在本地开发总要开一些端口,那就指定IP开放吧,虽然国内ip资源不多,还是基本缩小掉被外部攻击的可能
  • 数据库这种需要特别小心,有必要的时候学习使用一些备份相关的内容,验证auth相关需要全面点,别让auth形同虚设
  • redis 这种缓存形式丢了就丢了,不能对业务产生影响
  • 连接云主机还是用key更安全,密码一言难尽
  • 只是想做点简单的开发,这些黑客低劣的扫描端口,删库勒索也太过分了….

connect mysql/mongo by ssh-tunnel

------ 本文结束 ------
------ 版权声明:转载请注明出处 ------