Quarkus应用部署Azure时如何安全传递数据库凭证与认证密钥?
基于Azure KeyVault的Quarkus应用安全凭证管理方案
以下是针对你的Quarkus应用、GitHub Actions部署Azure Web App场景的完整安全凭证配置方案,全程无需硬编码敏感信息:
1. 准备Azure KeyVault与敏感凭证
- 创建Azure KeyVault(若未存在),将所有敏感数据以Secret形式存入:
- 数据库相关:
db-url、db-username、db-password(Secret名称可自定义,需与后续配置对应) - 认证相关:
auth-client-id、auth-client-secret
- 数据库相关:
2. 配置Azure Web App访问KeyVault权限
- 为Web App启用系统分配托管身份:进入Web App → 身份 → 系统分配 → 状态设为"开启"并保存
- 进入KeyVault → 访问策略 → 添加访问策略:
- 权限选择"机密"下的"获取"权限
- 主体选择你的Web App名称(即刚才启用的托管身份)
- 保存策略
3. 简化Dockerfile配置
无需在Dockerfile中设置环境变量或硬编码启动参数,Quarkus原生支持从环境变量读取配置占位符。保留简洁版Dockerfile即可:
# Use a base image with JDK 17 FROM openjdk:17 # Set the working directory in the Docker container WORKDIR /app # Copy the Maven build output (fat jar) into the Docker image COPY target/quarkus-app/ /app # Expose the port your application runs on EXPOSE 8080 # Command to execute the Quarkus application CMD ["java", "-jar", "/app/quarkus-run.jar"]
4. 更新application.properties配置
添加认证相关的占位符,保持数据库配置不变,确保占位符名称与后续环境变量名一致:
# 数据库配置 quarkus.datasource.url=${DB_URL} quarkus.datasource.username=${DB_USERNAME} quarkus.datasource.password=${DB_PASSWORD} # 认证配置(根据你的认证框架调整,示例为Quarkus OIDC) quarkus.oidc.client-id=${AUTH_CLIENT_ID} quarkus.oidc.credentials.secret=${AUTH_CLIENT_SECRET}
5. 配置Azure Web App映射KeyVault Secrets为环境变量
通过Azure CLI或Portal将KeyVault中的Secrets映射为Web App的环境变量:
Azure CLI命令示例
az webapp config appsettings set \ --name <你的WebApp名称> \ --resource-group <你的资源组名称> \ --settings \ DB_URL="@Microsoft.KeyVault(SecretName=db-url)" \ DB_USERNAME="@Microsoft.KeyVault(SecretName=db-username)" \ DB_PASSWORD="@Microsoft.KeyVault(SecretName=db-password)" \ AUTH_CLIENT_ID="@Microsoft.KeyVault(SecretName=auth-client-id)" \ AUTH_CLIENT_SECRET="@Microsoft.KeyVault(SecretName=auth-client-secret)"
Portal操作方式
进入Web App → 配置 → 应用程序设置 → 新建应用设置:
- 名称填
DB_URL,值填@Microsoft.KeyVault(SecretName=db-url) - 重复上述步骤添加其余环境变量
6. 调整GitHub Actions部署流程(deploy.yaml)
无需在部署脚本中声明业务敏感环境变量,只需保留Azure登录、镜像构建推送、Web App部署逻辑即可:
name: Deploy Quarkus App to Azure Web App on: push: branches: [ main ] jobs: build-and-deploy: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Set up JDK 17 uses: actions/setup-java@v4 with: java-version: '17' distribution: 'temurin' - name: Build with Maven run: mvn clean package -DskipTests - name: Login to Azure uses: azure/login@v1 with: creds: ${{ secrets.AZURE_CREDENTIALS }} - name: Login to Azure Container Registry uses: azure/docker-login@v1 with: login-server: <你的ACR名称>.azurecr.io username: ${{ secrets.AZURE_ACR_USERNAME }} password: ${{ secrets.AZURE_ACR_PASSWORD }} - name: Build and push Docker image run: | docker build -t <你的ACR名称>.azurecr.io/quarkus-app:${{ github.sha }} . docker push <你的ACR名称>.azurecr.io/quarkus-app:${{ github.sha }} - name: Deploy to Azure Web App uses: azure/webapps-deploy@v2 with: app-name: <你的WebApp名称> images: <你的ACR名称>.azurecr.io/quarkus-app:${{ github.sha }}
注:
AZURE_CREDENTIALS、AZURE_ACR_USERNAME、AZURE_ACR_PASSWORD需提前存入GitHub仓库的Secrets中,用于Azure身份验证。
核心原理说明
- Azure Web App会自动通过托管身份从KeyVault拉取Secrets,并将其注入为应用的环境变量
- Quarkus会自动识别环境变量与
application.properties中的占位符匹配关系,无需额外配置参数传递 - 全程无敏感信息暴露在代码、Docker镜像或部署脚本中,完全符合安全最佳实践
内容的提问来源于stack exchange,提问作者grigor martirosyan
相关产品推荐
相关产品推荐

