一款用于发现 PostgreSQL 数据库和 Jira 项目中个人身份信息(PII)的内部安全工具
AI PII 扫描器是一款全面的、以安全为核心的工具,专为应用安全和隐私团队设计,用于发现和编目 PII。它支持两种扫描目标:
检测采用三层流水线:
@mentions 和公司电子邮件地址关键:本工具专为安全、受控环境中的内部使用而设计。
| 安全控制 | 实现方式 |
|---|---|
| 防止数据外泄 | 无第三方 API 调用;LLM 端点必须自托管 |
| 最小权限访问 | 只读数据库角色,对应用数据无写入权限 |
| PII 最小化 | 发现结果仅存储元数据和高度脱敏的样本 |
| 审计追踪 | 所有扫描都记录谁/什么/何时/如何的详细信息 |
| 安全日志记录 | 结构化日志,自动脱敏 PII 字段 |
| 加密传输 | 所有数据库连接要求 SSL/TLS |
| Webhook 验证 | 对传入的 Jira 事件进行 HMAC-SHA256 签名验证 |
如果你想扫描 PostgreSQL 数据库中各列的 PII,请使用此方式。
# Clone the repository
cd PIIHunter
# Create virtual environment
python3 -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
# Install dependencies
pip install -r requirements.txt
# Download spaCy NER model (~800MB)
python -m spacy download en_core_web_lg
以 PostgreSQL 超级用户身份运行以下命令:
CREATE ROLE pii_scanner_readonly WITH LOGIN PASSWORD 'your_secure_password';
GRANT CONNECT ON DATABASE your_database TO pii_scanner_readonly;
GRANT USAGE ON SCHEMA public, app_data TO pii_scanner_readonly;
GRANT SELECT ON ALL TABLES IN SCHEMA public, app_data TO pii_scanner_readonly;
cp .env.example .env
# Fill in DB_HOST, DB_PORT, DB_NAME, DB_USER, DB_PASSWORD
创建用于存储扫描结果的 security_pii 模式。运行一次:
python -m pii_scanner.cli init-schema
# Preview candidate columns (no data read)
python -m pii_scanner.cli discover
# Run PII detection
python -m pii_scanner.cli scan --sample-size 1000
# View results
python -m pii_scanner.cli report
python -m pii_scanner.cli test-connection
如果你想扫描 Jira 问题和评论中意外暴露的 PII,请使用此方式。
首先需要完成基础安装(上述步骤 1)。如果你只想进行 Jira 扫描,则不需要数据库设置(步骤 2–4)。
按需轮询 Jira 以获取最近 N 小时内的活动。无需服务器。
步骤 1 — 基础安装(如果尚未完成)
cd PIIHunter
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
python -m spacy download en_core_web_lg
步骤 2 — 生成 Jira API 令牌
https://id.atlassian.com → Security → API tokens步骤 3 — 配置环境
cp .env.example .env
编辑 .env 并填写你的 Jira 详细信息:
JIRA_URL=https://yourcompany.atlassian.net
[email protected]
JIRA_API_TOKEN=your_api_token_here
# Optional — leave empty to scan all projects
# JIRA_PROJECT_KEYS=ENG,OPS,SUPPORT
# Emails from these domains will NOT be flagged as PII
COMPANY_EMAIL_DOMAINS=yourcompany.com
步骤 4 — 测试连接
验证您的凭据,列出可访问的项目,并获取近期问题的样本:
python -m pii_scanner.cli jira test
预期输出:
Testing connection to https://yourcompany.atlassian.net...
Auth ✓ logged in as Jane Smith ([email protected])
Projects ✓ 3 accessible: ENG, OPS, SUPPORT
Project ENG ✓ accessible
Recent issues (no time filter):
ENG-101 Fix login timeout on mobile
ENG-100 Update password policy
如果失败,请检查你的 API token,并确认 JIRA_EMAIL 与生成该 token 的账户一致。
第 5 步 — 运行扫描
# Scan last 24 hours
python -m pii_scanner.cli jira scan
# Custom lookback window
python -m pii_scanner.cli jira scan --hours 48
启动一个 HTTP 服务器,接收 Jira 事件并在事件到达时立即扫描。需要可公开访问的端点。
步骤 1 — 基础安装 + REST API 设置(先完成子章节 A 的步骤 1–4)
步骤 2 — 安装 webhook 依赖
pip install fastapi uvicorn
步骤 3 — 将 webhook 配置添加到 .env
# Secret used to verify requests genuinely come from Jira
JIRA_WEBHOOK_SECRET=your_webhook_secret
JIRA_WEBHOOK_PORT=8080
步骤 4 — 启动 webhook 服务器
python -m pii_scanner.cli jira webhook
# Custom port
python -m pii_scanner.cli jira webhook --port 9090
步骤 5 — 在 Jira 中注册 webhook
http://yourserver:8080/webhookIssue → createdComment → created.env 中的 JIRA_WEBHOOK_SECRET 匹配现在,Jira 会针对每个新问题和评论向你的服务器发送 POST 请求。扫描器会立即处理每一个请求。
可用端点:
| 端点 | 用途 |
|---|---|
POST /webhook | 接收 Jira 事件 |
GET /health | 确认服务器正在运行 |
生产环境注意事项:不要将 uvicorn 直接暴露到互联网。请参阅高级主题下的生产环境 Webhook 设置部分。
所有配置均通过 .env 中的环境变量进行管理。复制 .env.example 即可开始。
DB_HOST=localhost
DB_PORT=5432
DB_NAME=your_database
DB_USER=pii_scanner_readonly
DB_PASSWORD=your_secure_password
DB_SSLMODE=require
# Schemas to scan (comma-separated)
SCHEMAS_TO_SCAN=public,app_data,customer_data
# Schemas to exclude (comma-separated)
SCHEMAS_TO_EXCLUDE=pg_catalog,information_schema,pg_toast
# Rows to sample per column
SAMPLE_SIZE=1000
# Batch size for streaming
BATCH_SIZE=500
# Minimum confidence threshold (0.0-1.0)
CONFIDENCE_THRESHOLD=0.5
# Enable/disable detection layers
ENABLE_REGEX_DETECTION=true
ENABLE_NER_DETECTION=true
ENABLE_LLM_DETECTION=false # Only with self-hosted LLM
仅与自托管端点一起使用。切勿将其指向公共 API。
LLM_ENDPOINT=http://your-internal-llm.company.local:8000/v1
LLM_API_KEY=your_private_key
LLM_MODEL=llama-2-7b
# Jira connection
JIRA_URL=https://yourcompany.atlassian.net
[email protected]
JIRA_API_TOKEN=your_jira_api_token # generate at id.atlassian.com
# Projects to watch — leave empty to scan ALL accessible projects
# JIRA_PROJECT_KEYS=ENG,OPS,SUPPORT
# Emails from these domains are NOT flagged as PII (your internal addresses)
COMPANY_EMAIL_DOMAINS=yourcompany.com,internal.yourcompany.com
# Webhook server settings (only needed for real-time mode)
# JIRA_WEBHOOK_SECRET=your_webhook_secret
JIRA_WEBHOOK_PORT=8080
LOG_LEVEL=INFO # DEBUG, INFO, WARNING, ERROR
LOG_FORMAT=json # json or console
创建 security_pii 元数据 schema。首次设置时运行一次:
python -m pii_scanner.cli init-schema
预览按 PII 可能性排序的候选列——不读取任何数据:
# Discover all columns
python -m pii_scanner.cli discover
# Specific schemas only
python -m pii_scanner.cli discover --schemas public,customer_data
# Exclude schemas
python -m pii_scanner.cli discover --exclude test_data,staging
# Default scan (uses .env settings)
python -m pii_scanner.cli scan
# Custom sample size
python -m pii_scanner.cli scan --sample-size 5000
# High-confidence columns only (faster, skips ambiguous columns)
python -m pii_scanner.cli scan --high-confidence-only
# Specific schemas
python -m pii_scanner.cli scan --schemas public --sample-size 2000
# Latest scan report
python -m pii_scanner.cli report
# Specific scan run
python -m pii_scanner.cli report --run-id 5
# Limit number of findings shown
python -m pii_scanner.cli report --limit 100