代码之家  ›  专栏  ›  技术社区  ›  user993683

如果我启用了授权,为什么向所有远程IP开放MongoDB是危险的?

  •  1
  • user993683  · 技术社区  · 7 年前

    127.0.0.1 (和港口) 27017 ). 我是唯一一个谁可以发送流量到该IP地址,所以这可以防止随机互联网的人扰乱我的数据库和窃取数据。很酷。但是我通过创建一个管理员用户来启用授权:

    mongo
    use admin
    db.createUser(
      {
        user: "ADMINUSERNAME",
        pwd: "ADMINPASSWORD",
        roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
      }
    )
    exit
    

    和设置 security.authorization 在中“启用” /etc/mongod.conf .

    现在,如果我 net.bindIp /等等/mongod.conf文件 127.0.0.1,<serveripaddress> ,并用 ufw allow 27017 ,攻击者可以使用什么方法(暴力用户/密码除外)闯入我的数据库?

    有IP白名单的建议只是一个额外的安全层,还是我在这里遗漏了什么?我能想到的优点:

    1. 如果你的代码中有bug,或者搞砸了什么(例如,不小心添加了一个密码很弱的用户),你就有了额外的一层。
    2. 安全的暴力用户/密码攻击-但假设我的密码是50个随机ASCII字符长,这不会是一个问题,对吗?
    3. 糟糕的参与者不能直接向mongodb服务器发起DDOS/洪水攻击-但我认为这很容易用其他方式解决( fail2ban 或者类似的)。

    所以第1点和第2点似乎是唯一真正的问题-我可以肯定地看到那里的危险,但我还遗漏了什么吗?


    注:我认为这个问题不适合 security 因为这是一个相当简单的程序特定问题。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Markus W Mahlberg    7 年前

    我想了很久,是在这里回答这个问题,还是把它标记为离题,但由于DevOps现在似乎无处不在,它可能会在更容易访问时防止严重损坏。

    免责声明:有一些书是关于这个主题的,还有一整个行业的工程师都在关注这个主题。在这里,只能给出一个简要的概述和一些提示。此外,有些题目被大大简化了。做 仅依赖此处提供的信息。

    最少的 你的系统(网络、软件、操作系统等)和你做的一样多。

    所以,让我们回顾一下(一些)一般风险。

    除非您监视失败的登录尝试,并在特定客户机的几次失败尝试后设置自动操作(fail2ban是最简单的示例),否则您可能会强制执行您的帐户和密码。

    此外,除非您使用TLS,否则您的连接很容易被窃听。成功时,攻击者知道发送到服务器的任何凭据。

    现在有三种处理这些风险的一般方法:

    • 入侵预防,如fail2ban
    • 入侵检测

    后者值得一点解释。最好的做法是假设迟早会对所讨论的系统发起成功的攻击。系统管理员必须能够检测到入侵,以便能够采取相应的对策。但是,一旦攻击者获得root权限,所有的对策都可以撤消。因此,攻击者必须只能在攻击的初始阶段获得非特权访问权限,以便您可以检测其权限提升操作。相反,这意味着您必须绝对确保攻击者在攻击的初始阶段无法获得root权限(这是公开服务不应以root身份运行的众多原因之一)。

    OSSEC

    在另一个层面上,向公共互联网公开数据库服务几乎总是系统设计出了问题的明确标志。除非您特别想提供数据库服务,否则我没有理由这么做。

    stunnel .

    医生:如果你要问的话,你可能不应该这样做。