删除密码:Spring Boot 应用连接 Azure 服务时无需密码

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

使用用户名/密码凭证从一个应用访问另一个应用会带来巨大的安全风险。今天,我们宣布推出 Java 应用连接 Azure 数据库和事件服务的无密码连接预览版,让您最终摆脱使用密码的方式。

密码带来的安全挑战

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

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

图 1 – 显示了包含嵌入式用户名和密码连接数据库的 Java 代码

我们的客户可能对连接 Azure 服务有严格的安全要求,不允许将密码暴露给开发人员、运维人员或其他人。他们通常使用密钥保管库来存储密码并加载到应用程序中,并通过添加密码轮换要求和程序来进一步降低风险。但这反过来增加了操作复杂性,并可能导致应用程序连接中断。

无密码连接 – 零信任

现在您可以在应用程序中使用无密码连接,通过无需编写代码的配置连接到 Azure 服务。您不再需要轮换密码。零信任秉持“永不信任,始终验证,无凭证”的原则,通过在授权访问后端服务之前验证机器或用户的身份来帮助保护所有通信。

“我们拥有的每一个密码和每一个密钥保管库都是潜在的风险,增加了更多的开销和管理成本。我总是很高兴看到更多的身份验证和授权由平台为我们处理,并作为简单的集成提供给 Azure 上的 Java 和 Spring 生态系统。当我现在可以删除密钥保管库,因为 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 – 数据源配置 “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 社区所有即将举行的活动。

查看全部