【问题标题】:is there anyway to connect spring boot with tcps to database?无论如何将spring boot与tcps连接到数据库?
【发布时间】:2021-02-16 22:38:08
【问题描述】:

我正在使用带有数据 JPA 的 oracle 数据库 12c 和 spring boot 2.3。我的目标是用钱包将 TCPS 连接到数据库。当我搜索时,网上没有关于此的示例或指南。任何人都可以解释并展示一些例子吗?

【问题讨论】:

    标签: java spring spring-boot


    【解决方案1】:

    如何从 Java 连接到 Oracle?

    通常,在java世界中,最常用的驱动是THIN,它是由oracle提供的纯java驱动实现,它使用sockets 连接。还有其他选择:

    1. JDBC-ODBC 桥接器(不再随新 Java 一起分发)
    2. Native-API 驱动程序(OCI 驱动程序适合这里),
    3. 网络协议驱动程序
    4. 数据库协议驱动程序(瘦驱动程序)

    来源:https://stackoverflow.com/a/21711330/3957754

    没有其他选项可以从 java 连接到 oracle。

    什么是预言机钱包?

    简而言之,只是当某些客户端(java、c#、oracle sql developer、代理等)想要建立与数据库的连接时,oracle 提供的一个选项,用于隐藏用户和密码实例。

    这里是一个需要用户名和密码的传统连接示例:

    spring:
      datasource:
        url: jdbc:oracle:thin:@host:port:sid
        username: user
        password: pwd
    

    更多详情请查看以下链接:

    如何使用预言机钱包?

    如果不需要用户名和密码,那有什么魔力?当然没有魔法。与任何其他服务一样,替代方案是文件。因此,如果您查看以下链接,您会发现创建一些 特殊文件 客户端(java、c#、oracle sql 开发人员、代理程序等)应该使用的步骤很多和密码

    如何使用预言机钱包文件?

    经过大量的讲座,我找到了这些链接:

    与其他讲座一样,一种选择是使用名为 tnsnames.ora 的经典文件,指定钱包文件的绝对路径 MY_WALLET_DIRECTORY

    MY_AWESOME_ID= (description= (retry_count=20)(retry_delay=3)(address=(protocol=tcps)(port=1522)
    (host=adb.eu-frankfurt-1.oraclecloud.com))(connect_data=(service_name=oracon_frankfurtdb.atp.oraclecloud.com))
    (security=(ssl_server_cert_dn="CN=adwc.eucom...")
    (MY_WALLET_DIRECTORY=D:\_Downloads_\Oracle_DB_Client_19.3\network\admin\FRANKFURT)(SSL_VERSION=1.2)(SSL_SERVER_DN_MATCH=yes)))
    

    对比之前的一些官方 tnsnames.ora 模板,我们可以看到只是 MY_WALLET_DIRECTORY 在安全做的工作

    MYSID=
      (DESCRIPTION =
        (ADDRESS_LIST =
          (ADDRESS = (PROTOCOL = TCP)(HOST = mydnshostname)(PORT = 1521))
        )
        (CONNECT_DATA =
          (SERVICE_NAME = MYSID)
        )
      ) 
    

    其他链接:

    如何在java中使用tnsnames.ora?

    根据this,我们可以直接在THIN连接上使用tnsnames.ora,将包含钱包文件的文件夹传递给TNS_ADMIN参数:

    jdbc:oracle:thin:@wallet_dbname?TNS_ADMIN=/foo/bar/
    

    或者更优雅

    jdbc:oracle:thin:@wallet_dbname?TNS_ADMIN=$ORACLE_HOME/network/admin
    

    此配置需要额外的库18.3 JDBC drivers

    建议

    如您所见,实现这种身份验证需要很多疯狂的步骤。也不兼容 devops,因为需要手动或人工任务。你可以使用 docker 来自动化。无论如何,这个实现是复杂而乏味的。

    如果攻击者能够通过以下方式获取您的用户名和密码,为什么他无法访问预言机钱包文件?

    • 非法直接访问生产基础设施允许他读取服务器上的任何文件:application.yml、钱包文件等
    • 非法访问您拥有凭据的源代码(非常糟糕的主意)
    • 通过 Java 应用程序中的错误访问服务器。

    我建议使用经典方式:THIN with user & password,但要具备以下安全性:

    • 使用environment variables 隐藏源代码中的凭据
    • 使用一些variables manager
    • 只有数据库管理员应该知道或访问生产环境的数据库凭据。
    • 生产数据库不应对外公开。它必须位于专用网络中,并且特定客户端(spring boot 应用程序)应该能够访问它。
    • 为特定应用创建特定用户。此用户能够看到最少的一组对象(方案、表格、视图等)
    • 不断扫描您的源代码和基础架构以发现安全问题。

    【讨论】:

      猜你喜欢
      • 2020-02-26
      • 1970-01-01
      • 2020-12-26
      • 2019-04-12
      • 1970-01-01
      • 2019-06-16
      • 2018-10-10
      • 1970-01-01
      • 2020-07-07
      相关资源
      最近更新 更多