You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Postgres与psycopg2中安全存储并使用加密密码

解决方案

1. 使用 Secrets 管理工具

本地/容器环境:Docker Secrets

适合用 Docker Compose 或 Swarm 部署的场景,将数据库密码存入 Docker Secrets,容器仅能通过指定路径读取密码内容,避免密码暴露在环境变量或镜像配置中:

# 读取 Docker Secrets 中的密码
with open('/run/secrets/DATABASE_PASSWORD', 'r') as f:
    db_password = f.read().strip()

conn = psycopg2.connect(
    host=os.environ['DATABASE_HOST'],
    database=os.environ['DATABASE_NAME'],
    user=os.environ['DATABASE_USER'],
    password=db_password
)
  • 密码不会出现在 docker inspect 或镜像构建文件中,仅容器内部可访问;
  • 本地开发时可通过文件挂载模拟 Secrets,避免开发者接触生产明文密码。

云环境:托管式 Secrets 服务

使用云厂商提供的加密 Secrets 存储服务(如 AWS Secrets Manager、Azure Key Vault、Google Secret Manager),应用通过IAM角色/服务账号授权获取密码,无需硬编码任何密钥:

import boto3
from botocore.exceptions import ClientError

def get_db_password():
    secret_name = "prod/postgres/password"
    region_name = "us-east-1"

    # 通过实例角色自动授权,无需硬编码密钥
    client = boto3.client('secretsmanager', region_name=region_name)
    try:
        response = client.get_secret_value(SecretId=secret_name)
        return eval(response['SecretString'])['DATABASE_PASSWORD']
    except ClientError as e:
        raise e

conn = psycopg2.connect(
    host=os.environ['DATABASE_HOST'],
    database=os.environ['DATABASE_NAME'],
    user=os.environ['DATABASE_USER'],
    password=get_db_password()
)
  • DevOps 仅能通过控制台查看(可配置审计日志跟踪访问),开发者本地使用临时凭证,无法接触生产明文密码。

2. PostgreSQL 证书认证替代密码

利用 PostgreSQL 的 SSL 证书认证机制,完全替代密码登录:

  1. 为应用生成客户端证书,在 Postgres 服务器配置信任该证书;
  2. 应用通过证书文件连接数据库:
conn = psycopg2.connect(
    host=os.environ['DATABASE_HOST'],
    database=os.environ['DATABASE_NAME'],
    user=os.environ['DATABASE_USER'],
    sslmode='verify-full',
    sslrootcert='/path/to/root.crt',
    sslcert='/path/to/client.crt',
    sslkey='/path/to/client.key'
)
  • 证书文件通过 Docker Secrets 或云存储挂载,生产证书由运维统一管理,无明文密码泄露风险。

3. 加密配置文件+运行时解密

若必须将密码纳入版本控制,可使用 git-crypt 或 ansible-vault 加密配置文件,仅在容器启动时解密:

  1. 用 git-crypt 加密版本控制中的 config.yml;
  2. 容器启动时通过 Secrets 传入解密密钥,解密配置文件后读取密码:
# 容器启动脚本示例
git-crypt unlock /run/secrets/decryption_key
import yaml

with open('config.yml', 'r') as f:
    config = yaml.safe_load(f)

conn = psycopg2.connect(
    host=config['DATABASE_HOST'],
    database=config['DATABASE_NAME'],
    user=config['DATABASE_USER'],
    password=config['DATABASE_PASSWORD']
)
  • 版本控制中仅存储加密内容,无解密密钥无法获取明文;
  • 注意:容器运行时内存中会存在明文密码,需限制容器权限降低风险。

核心注意事项

  • 禁止将明文密码存入版本控制,版本控制仅保留加密内容或 Secrets 引用;
  • 避免在代码中硬编码任何密钥,优先使用IAM角色、服务账号等无密钥授权方式;
  • 严格限制 Secrets/证书的访问权限,开启审计日志跟踪操作记录。

内容的提问来源于stack exchange,提问作者Happy Coder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 22:18:19