dh3ryan7/azure-pharma-gxp-lab

GitHub: dh3ryan7/azure-pharma-gxp-lab

该项目是一个基于 Bicep 的 Azure 基础设施即代码实验环境,用于模拟 GxP 制药企业的合规网络分割与数据治理架构。

Stars: 0 | Forks: 0

# Azure GxP 制药基础设施 (动手实验) 一个可重现的 Azure 环境,模拟在 **GxP**(良好生产/实验室规范)下运营的**小型 制药公司**的核心基础设施。 它展示了生产级的**网络分割**、**数据完整性控制**、 **机密管理**和**合规治理** —— 可以通过 Azure CLI 脚本或 Bicep 模板进行部署,并且可以完全销毁。 ![架构](https://raw.githubusercontent.com/dh3ryan7/azure-pharma-gxp-lab/main/docs/architecture.png) ## 为什么采用这种设计 在受监管的 (GxP / 21 CFR Part 11) 环境中,首要任务是**职责分离** 和**数据完整性**:质量部门 (QA/QC) 必须与运营部门 (制造/包装) 隔离,除非通过明确的、可审计的路径;并且必须保护记录 免遭静默丢失或篡改。本实验正是使用 Azure 原生 控制而不是附加工具来对此进行建模。 四个 GxP 部门是一流的、分割的网络区域: | 部门 | 职能 | 子网 | NSG | ASG | |------|----------|--------|-----|-----| | **QA** | 质量保证 (监督) | `snet-qa` 10.30.6.0/24 | `nsg-qa` | `asg-qa` | | **QC** | 质量控制 (测试) | `snet-qc` 10.30.7.0/24 | `nsg-qc` | `asg-qc` | | **MFG** | 制造 | `snet-mfg` 10.30.8.0/24 | `nsg-mfg` | `asg-mfg` | | **PKG** | 包装 | `snet-pkg` 10.30.9.0/24 | `nsg-pkg` | `asg-pkg` | ## 架构 (在 GitHub 上渲染) ``` flowchart TB NET["Internet"] subgraph VNET["vnet-pharma 10.30.0.0/16 (rg-pharma-lab)"] direction TB subgraph SHARED["Shared infrastructure tiers"] direction LR WEB["Corporate / Web
snet-corp"] APP["Application MES/LIMS
snet-app"] DB["Database
snet-data"] RND["R&D / Lab isolated
snet-research"] MGMT["Management / Jump
snet-mgmt"] end subgraph GXP["GxP departments (default-deny between)"] direction LR QA["QA
Quality Assurance"] QC["QC
Quality Control"] MFG["MFG
Manufacturing"] PKG["PKG
Packaging"] end end DATA["Data store
versioning + soft delete + lock"] KV["Key Vault
secrets / keys"] LAW["Log Analytics
central audit"] NET -->|":443"| WEB -->|":8443"| APP -->|":1433"| DB QA -->|":443 oversight"| QC QA -->|":443 oversight"| MFG QA -->|":443 oversight"| PKG QC -->|":8443 testing"| MFG MFG <-->|":8443 line"| PKG MGMT -.->|":22/3389 admin"| GXP APP --> DATA APP --> KV VNET --> LAW ``` *实线箭头表示明确允许的流(带有 TCP 端口)。每个部门 NSG 的最后都有一条 优先级为 4000 的 `deny-all` 规则,因此任何未列出的内容都会被阻止。* ## 仓库布局 ``` azure-pharma-gxp-lab/ ├── README.md ├── LICENSE ├── .gitignore ├── .github/workflows/validate.yml # CI: validates Bicep + shell scripts on every push ├── infra/ │ └── main.bicep # Infrastructure-as-Code (declarative) ├── deploy/ │ ├── deploy.sh # Infrastructure-as-Code (Azure CLI, idempotent) │ └── cleanup.sh # safe teardown └── docs/ ├── architecture.png # diagram (README header) ├── architecture.svg └── AZ-104_Hands-On_Scenario_Lab.docx # companion study workbook ``` ## 将要部署的内容 (22 个资源,全部为 $0 / 接近零成本) **网络与分割** — 1 个 VNet,9 个子网 (5 个共享层 + 4 个 GxP 部门), 9 个具有分层 + 部门规则的 NSG,8 个 ASG (规则引用应用角色,而不是 IP)。 **数据 (合规强化)** — `stpharmadata*` (StorageV2,仅限 HTTPS,TLS 1.2,禁用公共 访问,**blob 版本控制 + 30 天软删除**,**CanNotDelete 锁**) 和 `stpharmaaudit*` (审计日志存档)。各部门记录容器:`qa-records`、 `qc-test-results`、`mfg-batch-records`、`pkg-labeling` (+ `research-data`, `clinical-trials`)。 **机密与监控** — 用于 secrets/CMK 的 Key Vault (RBAC,软删除); Log Analytics workspace 作为中央审计日志 / 诊断目标。 **治理** — 合规标签,Azure Policy *允许的位置 = East US* (CLI),以及 数据存储上的资源锁。 ## 网络分割规则 | NSG | 规则 | 源 -> 目标 | 端口 | 操作 | |-----|------|----------------------|------|--------| | nsg-corp | allow-https-in | Internet -> asg-web | 443 | 允许 | | nsg-app | allow-web-to-app | asg-web -> asg-app | 8443 | 允许 | | nsg-data | allow-app-to-sql | asg-app -> asg-db | 1433 | 允许 | | nsg-data | deny-other-to-data | VNet -> asg-db | * | 拒绝 | | nsg-research | allow-mgmt-only | snet-mgmt -> asg-research | 22/3389 | 允许 | | nsg-qc / mfg / pkg | allow-qa-oversight | asg-qa -> dept | 443 | 允许 | | nsg-mfg | allow-qc-testing | asg-qc -> asg-mfg | 8443 | 允许 | | nsg-mfg / pkg | allow-line-integration | asg-mfg <-> asg-pkg | 8443 | 允许 | | *每个部门 NSG* | deny-vnet | VNet -> dept | * | 拒绝 (4000) | ## 部署它 前置条件:一个 Azure 订阅和 [Azure CLI](https://learn.microsoft.com/cli/azure/install-azure-cli) (或者直接打开 [Azure Cloud Shell](https://shell.azure.com))。 **选项 A — Bicep (声明式)** ``` az group create -n rg-pharma-lab -l eastus az deployment group create -g rg-pharma-lab -f infra/main.bicep ``` **选项 B — Azure CLI 脚本 (也会添加数据驻留策略)** ``` ./deploy/deploy.sh # unique resource names auto-generated LOCATION=westus2 RG=rg-pharma-demo ./deploy/deploy.sh # override defaults ``` **销毁它** ``` ./deploy/cleanup.sh # removes the lock, then deletes the resource group ``` ## CI `.github/workflows/validate.yml` 会在每次推送 / pull request 时运行,并: - 对部署脚本进行语法检查和 ShellCheck,以及 - 运行 `az bicep build` 以验证 Bicep 能否编译。 ## 展示的技能 (映射到 AZ-104) - **虚拟网络 (15-20%):** VNet/子网设计,NSG,ASG,分层 + 零信任 分割,有效规则推理,数据驻留策略。 - **存储 (15-20%):** 账户强化,冗余,版本控制,软删除,容器 设计,默认私有访问。 - **身份与治理 (20-25%):** Azure Policy,资源锁,标记策略,RBAC 模型。 - **监控 (10-15%):** 作为中央审计/诊断接收器的 Log Analytics workspace。 - **自动化 / IaC:** 同一个环境被表达为 **Bicep** *并且*是一个幂等的 CLI 脚本,在 **CI** 中验证。 随附的 **AZ-104 学习手册** (29 个基于场景的练习) 位于 `docs/AZ-104_Hands-On_Scenario_Lab.docx`。 ## 注意事项与限制 - **未部署 VM** (保持实验免费且不受配额限制)。子网模拟了 LIMS/MES/数据库/仪器控制服务器所在的位置;将 VM 或 VM Scale Sets 添加到 适当的子网以扩展它。 - **部门 RBAC:** 在生产环境中,创建 Microsoft Entra 组 (`GxP-QA/QC/MFG/PKG`) 并且 授予每个组对其容器范围内的 **Storage Blob Data** 访问权限。组创建需要 Entra 管理员,因此被留作一个文档化的步骤。 - **不要提交 secrets。** 此仓库不包含密钥或密码;保持这种方式。 ## 许可证 MIT — 随意使用。
标签:Azure, Bicep, GxP合规, 医药行业, 网络隔离