首页 > 后端开发 > Python教程 > 使用托管标识在 Azure 中实现安全的跨服务通信

使用托管标识在 Azure 中实现安全的跨服务通信

Susan Sarandon
发布: 2024-12-23 00:40:01
原创
618 人浏览过

托管身份对于 Azure 中的安全跨服务通信至关重要。它们消除了管理秘密、密钥或连接字符串的需要,从而实现了应用程序组件的无缝集成。在本博客中,我将演示如何使用托管标识将 Azure SQL 数据库连接到在 Azure 应用服务上运行的 Python 后端。


微软身份验证库

要使用 Entra 身份连接到 Azure 服务,您需要 Microsoft 身份验证库 (MSAL)。在此示例中,我使用的是 Python 库,但不用担心,每种主要编程语言都存在 MSAL。

import msal
登录后复制

这是一个连接到 Azure SQL 数据库的简单函数:

def get_db_connection():
    connection_string = f'DRIVER={{ODBC Driver 17 for SQL Server}};SERVER={server}.database.windows.net;PORT=1433;DATABASE={database};Authentication=ActiveDirectoryMsi'
    return pyodbc.connect(connection_string)
登录后复制

满足这些先决条件后,您可以在代码中建立数据库连接并执行查询,而无需处理机密或连接字符串。


演示 Python 后端

为了演示,我创建了一个简单的 Python Flask API,它返回员工数据,例如姓名、职位和薪水。注意如何使用 get_db_connection() 函数打开数据库连接并查询数据。

def get_employees():
    conn = get_db_connection()
    cursor = conn.cursor()
    cursor.execute('SELECT ID, Name, Position, Salary FROM Employees')
    rows = cursor.fetchall()
    conn.close()

    # Convert data to a list of dictionaries.
    employees = []
    for row in rows:
        employees.append({
            'ID': row.ID,
            'Name': row.Name,
            'Position': row.Position,
            'Salary': row.Salary
        })

    return jsonify(employees)

登录后复制

这种简单的方法可确保您的后端使用托管身份与数据库安全地交互。


Dockerfile

如果您要在 Docker 容器中部署应用程序,这里是用于安装 SQL Server 的 ODBC 驱动程序的 Dockerfile:

FROM python:3.13-slim

COPY . /app
WORKDIR /app

# Install Microsoft ODBC Driver 17 for SQL Server and dependencies
RUN apt-get update \
 && apt-get install -y gnupg curl apt-transport-https \
 && curl https://packages.microsoft.com/keys/microsoft.asc | tee /etc/apt/trusted.gpg.d/microsoft.asc \
 && echo "deb [arch=amd64] https://packages.microsoft.com/debian/11/prod bullseye main" | tee /etc/apt/sources.list.d/mssql-release.list \
 && apt-get update \
 && ACCEPT_EULA=Y apt-get install -y msodbcsql17 unixodbc-dev \
 && apt-get install -y build-essential \
 && apt-get clean -y

# Install Python dependencies
RUN pip install -r requirements.txt

EXPOSE 80

CMD ["gunicorn", "-w", "4", "-b", "0.0.0.0:80", "app:app"]

登录后复制

此设置可确保您的容器已准备好安全连接到 Azure SQL。


SQL Server 和数据库部署

部署 Azure SQL 服务器时,配置仅 Azure AD 身份验证。这是托管身份的要求。以下是用于部署 SQL 服务器和数据库的 Bicep 模板:

resource sqlServer 'Microsoft.Sql/servers@2023-08-01-preview' = {
  name: serverName
  location: location
  tags: {
    workload: 'Sample Backend with SQL Database'
    topic: 'SQL Server'
    environment: 'Production'
  }
  properties: {
    minimalTlsVersion: '1.2'
    administrators: {
      administratorType: 'ActiveDirectory'
      login: sqlAdminName
      sid: sqlAdminObjectId
      tenantId: tenantId
      principalType: principalType
      azureADOnlyAuthentication: azureADOnlyAuthentication
    }
  }
}

resource sqlDB 'Microsoft.Sql/servers/databases@2023-08-01-preview' = {
  parent: sqlServer
  name: sqlDBName
  location: location
  sku: {
    name: sqlDBSkuName
    tier: sqlDBSkuTier
    capacity: capacity
  }
}
登录后复制

此模板确保数据库已安全配置并可供使用。


向托管身份授予数据库角色

要使您的应用服务能够在没有机密的情况下访问数据库,请将必要的数据库角色分配给托管标识。您无法使用 Bicep 或 Terraform 执行此步骤。创建自定义脚本或通过 Azure 门户访问数据库。

CREATE USER [<displayname-of-appservice>] FROM EXTERNAL PROVIDER;
ALTER ROLE db_datareader ADD MEMBER [<displayname-of-appservice>];
ALTER ROLE db_datawriter ADD MEMBER [<displayname-of-appservice>];
ALTER ROLE db_ddladmin ADD MEMBER [<displayname-of-appservice>];
GO
登录后复制

这些角色允许托管身份根据需要执行读取、写入和架构更改操作。


GitHub 上的公共模板

有关完整的代码,包括 CI/CD 集成,请查看 GitHub 上的公共模板。该存储库包含复制本博客中描述的设置所需的一切。

Using Managed Identities for Secure Cross-Service Communication in Azure 拉佐克斯 / 带有 sql 数据库的快速启动后端

用于测试新应用程序功能的轻量级后端环境。它包括从托管应用程序到管理数据持久性的所有内容,并集成 CI/CD 以方便测试和迭代。

使用 SQL 数据库连接快速启动后端

此用例涉及使用 Azure SQL 数据库部署 Azure 应用服务,以提供用于测试新应用程序功能的轻量级后端环境。它包括从托管应用程序到管理数据持久性的所有内容,并集成 CI/CD 以方便测试和迭代。

目标

  • 在 Azure 上部署可扩展且安全的 Web 后端,用于测试新的应用程序功能。
  • 使用 Bicep 自动配置基础设施。
  • 集成应用程序的持续部署,以便频繁测试和轻松更新。

组件概述

  • Azure 应用服务 - 部署简单的后端 API。
  • Azure SQL 数据库 - 设置 SQL 数据库以实现持久性。
  • Azure 容器注册表(可选)- 存储容器映像以进行版本控制(如果您使用的是容器化版本)。
  • 持续集成/持续部署 (CI/CD) - 使用 GitHub Actions 自动部署。



在 GitHub 上查看



使用托管身份可以简化跨服务通信,并通过消除对机密的需求来增强安全性。强烈建议任何在 Azure 中构建安全且可扩展的应用程序的人使用此方法。

以上是使用托管标识在 Azure 中实现安全的跨服务通信的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板