删除密码:Spring Boot 应用与 Azure 服务的无密码连接

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

使用用户名/密码凭据从一个应用程序访问另一个应用程序会带来巨大的安全风险,原因有很多。今天,我们宣布预览Java应用程序与Azure数据库和事件服务之间的无密码连接,让您最终摆脱使用密码。

密码的安全挑战

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

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

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

我们的客户可能需要严格的安全要求才能连接到Azure服务,而无需向开发人员、运营商或任何其他人公开密码。他们经常使用保管库来存储密码并将密码加载到应用程序中,并且他们通过添加密码轮换要求和程序进一步降低了风险。这反过来又会增加运营复杂性,并可能导致应用程序连接中断。

无密码连接 – 零信任

现在,您可以在应用程序中使用无密码连接来使用无代码配置连接到基于 Azure 的服务。您不再需要轮换密码。“永不信任,始终验证和无凭据”的原则,零信任通过仅在验证身份后才信任机器或用户来帮助保护所有通信,然后再向他们授予对后端服务的访问权限。

“我们拥有的每个密码和每个 Key Vault 都是潜在的责任,这增加了更多的开销和管理成本。我很高兴看到更多身份验证和授权操作由我们处理,并作为简单的集成交付到 Azure 上的 Java 和 Spring 生态系统中。当我们的 Key Vault 支持无密码连接时,我不会再为删除它而感到惋惜。”
-Jonathan Jones,首席解决方案架构师,**瑞士再保险管理有限公司**(瑞士)

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

您可以使用服务连接器(参见下面的图2)配置与 Azure 服务的无密码连接,或者您可以手动配置它们。服务连接器支持在 Azure Spring Apps、App Service 和 Azure 容器应用等应用程序托管服务中使用托管标识。它使用托管标识和 Azure RBAC 配置后端服务与无密码连接,并为应用程序提供必要的连接信息——不再需要密码。

图2 – 服务连接器为 Java 应用程序到 PostgreSQL 数据库的无密码连接配置

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

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

让我们考虑一个连接到使用 Spring Cloud Azure 启动器的 PostgreSQL 数据库的 Spring Boot 应用程序。启动器为 Spring Data JPA 模块组合了一个无密码的连接字符串。从连接字符串中,驱动程序知道它必须加载 Azure 的 JDBC 身份验证插件,该插件使用 Azure 身份客户端库来获取访问令牌。驱动程序使用令牌作为密码登录数据库——不再需要密码。

对于本地开发和测试,开发人员可以使用相同的安排来连接到服务,而无需使用密码。您将通过 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>

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

服务连接器 Azure Spring Apps App Service Azure 容器应用

查看此可立即部署的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 社区中所有即将举行的活动。

查看全部