托管身份对于 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 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)
这种简单的方法可确保您的后端使用托管身份与数据库安全地交互。
如果您要在 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。
部署 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
这些角色允许托管身份根据需要执行读取、写入和架构更改操作。
有关完整的代码,包括 CI/CD 集成,请查看 GitHub 上的公共模板。该存储库包含复制本博客中描述的设置所需的一切。
此用例涉及使用 Azure SQL 数据库部署 Azure 应用服务,以提供用于测试新应用程序功能的轻量级后端环境。它包括从托管应用程序到管理数据持久性的所有内容,并集成 CI/CD 以方便测试和迭代。
使用托管身份可以简化跨服务通信,并通过消除对机密的需求来增强安全性。强烈建议任何在 Azure 中构建安全且可扩展的应用程序的人使用此方法。
以上是使用托管标识在 Azure 中实现安全的跨服务通信的详细内容。更多信息请关注PHP中文网其他相关文章!