删除密码:Spring Boot 应用连接 Azure 服务实现无密码连接

工程 | Josh Long | 2022年09月27日 | ...

出于多种原因,使用用户名/密码凭据从一个应用程序访问另一个应用程序存在巨大的安全风险。今天,我们宣布为 Java 应用程序连接 Azure 数据库和事件服务提供无密码连接的预览版,让您最终可以摆脱使用密码。

密码的安全挑战

应谨慎使用密码,并且开发人员绝不能将密码放置在不安全的位置。许多 Java 应用程序通过用户名和密码(或其他敏感凭据,如访问令牌或连接字符串)连接到后端数据、缓存、消息和事件服务。如果暴露,密码可能被用来未经授权地访问敏感信息,例如您为即将进行的活动构建的销售目录,或者仅仅是所有必须保密的客户数据。

将密码嵌入应用程序本身存在巨大的安全风险,原因有很多,包括在代码存储库中被发现(见下图 1)。许多开发人员将此类密码外部化,使用环境变量,以便应用程序可以从不同环境中加载它们。然而,这只是将风险从代码本身转移到了执行环境。任何获得环境访问权限的人都可以窃取密码,进而增加数据泄露的风险。

图 1 – 显示了带有嵌入式用户名和密码以连接到数据库的 Java 代码

我们的客户可能有严格的安全要求,以便在不向开发人员、操作员或任何其他人公开密码的情况下连接到 Azure 服务。他们通常使用密钥库来存储和加载密码到应用程序中,并通过添加密码轮换要求和程序来进一步降低风险。这反过来又增加了操作复杂性,并可能导致应用程序连接中断。

无密码连接 – 零信任

现在,您可以在应用程序中使用无密码连接,通过零配置的方式连接到基于 Azure 的服务。您不再需要轮换密码。利用“永不信任,始终验证,无凭据”的原则,零信任通过在授予对后端服务的访问权限之前验证身份来保护所有通信。

“每一个密码和每一个 Key Vault 都是潜在的风险,这增加了额外的管理开销和成本。我一直很高兴看到更多的身份验证和授权功能得到处理,并作为简单的集成被推送到 Azure 上的 Java 和 Spring 生态系统中。当我删除我们的 Key Vault 时,我不会流一滴眼泪,因为现在 PostgreSQL 支持无密码连接。”
- Jonathan Jones,首席解决方案架构师,Swiss Re Management Ltd. (瑞士)

使用托管标识和 Azure RBAC(基于角色的访问控制)组合是 Java 应用程序安全无密码连接到 Azure 服务的推荐身份验证选项。开发人员或操作员不需要手动跟踪和管理许多不同的托管标识秘密,因为这些任务由 Azure 在内部安全地处理。

您可以使用 Service Connector(见下图 2)将无密码连接配置到 Azure 服务,也可以手动配置。Service Connector 支持 Azure Spring Apps、App Service 和 Azure Container Apps 等托管服务中的托管标识。它使用托管标识和 Azure RBAC 配置后端服务,提供应用程序所需的连接信息 – 无需再处理密码。

图 2 – Service Connector 为 Java 应用连接 PostgreSQL 数据库配置无密码连接

如果您检查已配置为无密码连接的应用程序的运行环境,您可以看到完整的连接字符串。例如,图 3 显示了它如何包含数据库服务器地址、数据库名称以及委托身份验证给 Microsoft Azure 的 JDBC 身份验证插件的指令。

图 3 – datasource 配置“spring.datasource.url”显示无密码连接

让我们考虑一个连接到使用 Spring Cloud Azure starter 的 PostgreSQL 数据库的 Spring Boot 应用程序。该 starter 为 Spring Data JPA 模块组合了一个不带密码的连接字符串。从连接字符串中,驱动程序会明白它必须加载 Azure 的 JDBC 身份验证插件,该插件使用 Azure Identity Client Library 获取访问令牌。驱动程序使用令牌作为密码登录数据库 – 无需再用密码。

对于本地开发和测试,开发人员可以使用相同的安排连接到服务而不使用密码。您将通过 Azure CLI、IntelliJ 或任何开发工具进行身份验证,并使用该身份来保护应用程序与 Azure 服务无密码连接的访问。

了解更多并删除密码!

您可以在应用程序中摆脱使用密码。立即将现有 Java 应用程序迁移到使用 Azure 服务的无密码连接!

阅读更多关于无密码连接的信息 – https://aka.ms/Delete-Passwords

资源

<tbody>

<tr>
    <td>Azure Service</td>
    <td>Java Quickstart</td>
    <td>Spring Quickstart</td>
    <td>Migration Guide</td>
</tr>


<tr>
    <td> Azure Database for MySQL</td>
    <td>
    <a href="https://learn.microsoft.com/en-us/azure/mysql/single-server/connect-java?toc=%2Fazure%2Fdeveloper%2Fintro%2Ftoc.json&amp;bc=%2Fazure%2Fdeveloper%2Fintro%2Fbreadcrumb%2Ftoc.json&amp;tabs=passwordless">JDBC</a>
    </td>
    <td>
        <div><a href="https://learn.microsoft.com/en-us/azure/developer/java/spring-framework/configure-spring-data-jdbc-with-azure-mysql?tabs=passwordless&amp;toc=%2Fazure%2Fdeveloper%2Fintro%2Ftoc.json&amp;bc=%2Fazure%2Fdeveloper%2Fintro%2Fbreadcrumb%2Ftoc.json">Spring
            Data JDBC</a></div>
        <div>
            <a href="https://learn.microsoft.com/en-us/azure/developer/java/spring-framework/configure-spring-data-jpa-with-azure-mysql?tabs=passwordless&amp;toc=%2Fazure%2Fdeveloper%2Fintro%2Ftoc.json&amp;bc=%2Fazure%2Fdeveloper%2Fintro%2Fbreadcrumb%2Ftoc.json">Spring
                Data JPA</a></div>
    </td>
    <td>
        <div><a href="https://learn.microsoft.com/en-us/azure/developer/java/spring-framework/migrate-mysql-to-passwordless-connection?toc=%2Fazure%2Fdeveloper%2Fintro%2Ftoc.json&amp;bc=%2Fazure%2Fdeveloper%2Fintro%2Fbreadcrumb%2Ftoc.json&amp;tabs=sign-in-azure-cli%2Cjava%2Capp-service%2Capp-service-identity">Delete
            passwords</a></div>
    </td>
</tr>


<tr>
    <td>
        <div>Azure Database for PostgreSQL</div>
    </td>
    <td>
       <a
                href="https://learn.microsoft.com/en-us/azure/postgresql/single-server/connect-java?toc=%2Fazure%2Fdeveloper%2Fintro%2Ftoc.json&amp;bc=%2Fazure%2Fdeveloper%2Fintro%2Fbreadcrumb%2Ftoc.json&amp;tabs=passwordless">JDBC</a>

    </td>
    <td>
        <div><a
                href="https://learn.microsoft.com/en-us/azure/developer/java/spring-framework/configure-spring-data-jdbc-with-azure-postgresql?tabs=passwordless&amp;toc=%2Fazure%2Fdeveloper%2Fintro%2Ftoc.json&amp;bc=%2Fazure%2Fdeveloper%2Fintro%2Fbreadcrumb%2Ftoc.json">Spring
            Data JDBC</a></div>
        <div>
            <a href="https://learn.microsoft.com/en-us/azure/developer/java/spring-framework/configure-spring-data-jpa-with-azure-postgresql?tabs=passwordless&amp;toc=%2Fazure%2Fdeveloper%2Fintro%2Ftoc.json&amp;bc=%2Fazure%2Fdeveloper%2Fintro%2Fbreadcrumb%2Ftoc.json">Spring
                Data JPA</a></div>
    </td>
    <td>
        <div><a
                href="https://learn.microsoft.com/en-us/azure/developer/java/spring-framework/migrate-postgresql-to-passwordless-connection?toc=%2Fazure%2Fdeveloper%2Fintro%2Ftoc.json&amp;bc=%2Fazure%2Fdeveloper%2Fintro%2Fbreadcrumb%2Ftoc.json&amp;tabs=sign-in-azure-cli%2Cjava%2Cservice-connector%2Cservice-connector-identity%2Cassign-role-service-connector">Delete
            passwords</a></div>
    </td>
</tr>
<tr>
    <td> Azure SQL Database</td>
    <td> JDBC – coming soon</td>
    <td>
        <div><a
                href="https://learn.microsoft.com/en-us/azure/developer/java/spring-framework/deploy-passwordless-spring-database-app?tabs=sqlserver&amp;toc=%2Fazure%2Fdeveloper%2Fintro%2Ftoc.json&amp;bc=%2Fazure%2Fdeveloper%2Fintro%2Fbreadcrumb%2Ftoc.json">Spring
            Data JDBC</a></div>
        <div>
            <a href="https://learn.microsoft.com/en-us/azure/developer/java/spring-framework/deploy-passwordless-spring-database-app?tabs=sqlserver&amp;toc=%2Fazure%2Fdeveloper%2Fintro%2Ftoc.json&amp;bc=%2Fazure%2Fdeveloper%2Fintro%2Fbreadcrumb%2Ftoc.json">Spring
                Data JPA</a></div>
    </td>
    <td>
        <div><a
                href="https://learn.microsoft.com/en-us/azure/developer/java/spring-framework/migrate-sql-database-to-passwordless-connection?tabs=java%2Cservice-connector%2Cservice-connector-identity%2Cassign-role-service-connector">Delete
            passwords</a></div>
    </td>
</tr>
<tr>
    <td> Event Hubs – Kafka </td>
    <td> <a
            href="https://learn.microsoft.com/en-us/azure/event-hubs/event-hubs-quickstart-kafka-enabled-event-hubs?tabs=passwordless">Apache
        Kafka</a> </td>
    <td> <a
            href="https://learn.microsoft.com/en-us/azure/developer/java/spring-framework/configure-spring-cloud-stream-binder-java-app-kafka-azure-event-hub?tabs=passwordless&amp;toc=%2Fazure%2Fdeveloper%2Fintro%2Ftoc.json&amp;bc=%2Fazure%2Fdeveloper%2Fintro%2Fbreadcrumb%2Ftoc.json">Spring
        Cloud Stream Binder for Kafka</a> </td>
    <td> <a
            href="https://learn.microsoft.com/en-us/azure/developer/java/spring-framework/migrate-kafka-to-passwordless-connection?toc=%2Fazure%2Fdeveloper%2Fintro%2Ftoc.json&amp;bc=%2Fazure%2Fdeveloper%2Fintro%2Fbreadcrumb%2Ftoc.json&amp;tabs=azure-portal%2Csign-in-azure-cli%2Cjava-kafka%2Cservice-connector%2Cservice-connector-identity%2Cassign-role-service-connector">Delete
        passwords</a> </td>
</tr>
<tr>
    <td colspan=4>

        <a
            href="https://learn.microsoft.com/en-us/azure/storage/common/multiple-identity-scenarios?toc=%2Fazure%2Fdeveloper%2Fintro%2Ftoc.json&amp;bc=%2Fazure%2Fdeveloper%2Fintro%2Fbreadcrumb%2Ftoc.json&amp;tabs=java">Developer
        guide</a>

    </td>
</tr>

您可以使用 Service Connector 来配置从 Azure “计算”服务(例如 Azure Spring Apps、App Service、Azure Container Apps、Azure Kubernetes Service 和虚拟机)到后端服务的无密码连接。

Service Connector Azure Spring Apps App Service Azure Container Apps

查看此针对 Spring Boot 的现成部署示例代码。

想了解更多关于 Azure Spring Apps 以及如何在 Microsoft Azure 上利用 Spring 的方法吗?SpringOne 2022 即将到来!感觉就像是收到礼物的重要节日前的焦虑而兴奋的时刻!同时,Spring Boot 3 和 Spring Framework 6 也将发布。我们当然会在 Spring 博客上宣布所有内容,但如果您想有机会直接学习,我希望您能于 2022 年 12 月 6 日至 8 日加入我们,就在我的家乡旧金山,我最喜欢的美国西海岸城市,也是我的家乡。 (嘘:如果您现在注册,使用此代码 S1VM22_Advocate_200 可享受通行证价格折扣 200 美元。)

获取 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

领先一步

VMware 提供培训和认证,助您加速进步。

了解更多

获得支持

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件,只需一份简单的订阅。

了解更多

即将举行的活动

查看 Spring 社区所有即将举行的活动。

查看所有