Odoo 怎么用 obfuscate 命令加密生产库中的个人敏感字段后再交付给第三方
【免费下载链接】odooOdoo. Open Source Apps To Grow Your Business.项目地址: https://gitcode.com/GitHub_Trending/od/odoo
当你需要把生产环境的 Odoo 数据库(比如连同 CRM 商机、邮件往来、联系人信息)交给第三方做分析、迁移或联调时,直接给库意味着姓名、电话、地址、邮箱全部外泄。Odoo 自带的obfuscateCLI 子命令可以解决这个问题:它在原库上就地对一批个人敏感字段做对称加密(基于 PostgreSQL 的pgcrypto扩展),保留库结构和业务关联,只把字段值替换成密文,处理完成后再把数据库交付出去。
使用前提:
- 能访问 Odoo 安装目录,可以直接运行
odoo-bin; - 目标库是 PostgreSQL,且执行账号有权限创建
pgcrypto扩展(命令执行时会先CREATE EXTENSION IF NOT EXISTS pgcrypto); - 该操作会直接修改生产库中的数据。命令源码中的确认提示明确写着这可能 "can lead to a data loss",且官方注释表明该混淆方式 "not considered as safe to transfer anonymous datas to a third party"(不认为可以安全地用于向第三方转移匿名化数据)。因此务必先在备份或复制库上演练,并理解这一限制后再决定交付方式。
命令实现见 odoo/cli/obfuscate.py,命令入口机制见 odoo/cli/command.py。
命令格式与必填参数
obfuscate是odoo-bin的内置子命令,程序名格式为odoo-bin [--addons-path=PATH,...] obfuscate。执行时最少需要两个参数:
odoo-bin obfuscate --pwd <加密密码> -d <数据库名>--pwd:加密/解密用的对称密码,必填,缺失时命令直接报错退出(ERROR: --pwd is required)。该密码会被加密后存入数据库的ir_config_parameter(键名odoo_cyph_pwd),之后所有解密操作都依赖它,请妥善保存。-d:目标数据库名,必填且只能指定一个库,传多个会报错(-d/--database has multiple databases, please provide a single one)。
完整参数列表:
| 参数 | 作用 |
|---|---|
--pwd | 加密/解密密码,必填 |
--fields | 追加要处理的表.列列表,逗号分隔,如table1.column1,table2.column2 |
--exclude | 从处理列表中排除的表.列,逗号分隔 |
--file | 从文件读取表.列列表(每行一个,UTF-8),结果并入--fields |
--unobfuscate | 切换为解密还原模式 |
--allfields | 仅可用于解密模式:尝试解密所有字段,且会忽略--fields/--exclude;源码注明比逐个指定字段更慢 |
--vacuum | 解密完成后对处理过的表执行VACUUM FULL |
--pertablecommit | 每处理完一张表就提交一次,而不是整体一个大事务 |
-y/--yes | 跳过交互式确认。帮助文本提醒 "Use it carefully",因为该方式不被认为适合安全地向第三方转移匿名数据 |
默认处理的敏感字段范围
即使不传--fields,命令也会加密一组默认字段,覆盖联系人、邮件线索和 CRM 商机中最典型的个人信息:
| 表 | 字段 |
|---|---|
res_partner | name、complete_name、email、phone、mobile、street、street2、city、zip、vat、website |
crm_lead | name、contact_name、partner_name、email_from、phone、mobile、website、description |
mail_message | subject、email_from、reply_to、body |
mail_tracking_value | old_value_char、old_value_text、new_value_char、new_value_text |
res_country | name |
两个行为边界由源码决定:
- 只处理
text、varchar、jsonb类型的列,ir_前缀的表一律跳过;对jsonb列会取出所有键后逐值加密,不存在的键不会被创建。源码注释明确说明 selection 类字段不生效("Doesn't work for selection fields ...")。 - 默认列表中出现的表如果实际不存在(例如该库没装 CRM,就没有
crm_lead表),这些字段会被记为Invalid fields: ...并自动剔除,命令继续执行。
如果你的交付范围还需要加密其他字段(比如hr_employee里的姓名电话),用--fields追加,或把大量字段写进文件后用--file读入;反之,若某个默认字段不想动,用--exclude排除。
执行加密并确认
不带-y时,命令先开始事务、再进入两级交互确认:
The obfuscate method is not considered as safe to transfer anonymous datas to a third party. This will alter data in the database <库名> and can lead to a data loss. Would you like to proceed [y/N]? Please type your database name (<库名>) in UPPERCASE to confirm you understand this operation is not considered secure :第一问必须输入Y,第二问必须把数据库名用大写完整敲一遍;任何一步不通过都会回滚并退出。确认通过后日志依次输出:
Processing fields: res_partner.name, res_partner.email, ... # 最终生效的字段清单 Obfuscating table res_partner Obfuscating table mail_message ...(以上为按源码日志格式给出的示例,实际列出的字段以你的参数为准。)
典型主路径命令(--pwd后的值换成你自己设定并保管好的密码,-d后换成实际库名):
odoo-bin obfuscate --pwd '你自己设定的加密密码' -d production字段较多、库较大时可以加--pertablecommit,避免单个超长事务:
odoo-bin obfuscate --pwd '你自己设定的加密密码' -d production --pertablecommit执行完成后命令会提交事务并正常退出。加密后的数据在原列中以odoo_cyph_前缀 + Base64 密文的形式存储,加密用的就是--pwd传入的密码。
验证加密结果
命令本身没有独立的校验子命令,按源码逻辑可以从三处确认:
- 日志:出现
Processing fields: ...列出本次实际生效的字段,之后每张表一行Obfuscating table <表名>,最后正常提交退出,而不是ERROR: ...异常退出(任何异常都会以ERROR: ...形式终止并回滚)。 - 数据形态:抽查目标列,例如
SELECT email FROM res_partner LIMIT 5;,加密成功时值应以odoo_cyph_开头——命令内部正是用这个前缀判断"已经加密过、不再二次加密"的。明文值则说明该记录/字段不在处理范围内。 - 密码参数已落库:
SELECT value FROM ir_config_parameter WHERE key='odoo_cyph_pwd';应能查到一条记录,这是后续解密的前提;查不到说明加密没有走完提交。
需要交付给第三方时,交付的就是完成上述验证后的数据库(或其转储)。
还原数据(必要时)
第三方返回数据库后,用同一个--pwd执行解密模式即可把字段还原:
odoo-bin obfuscate --pwd '当初的加密密码' -d production --unobfuscate- 解密前会校验密码是否正确(用同一密码解密
odoo_cyph_pwd中保存的校验值),密码不匹配则回滚退出,不会改数据; - 解密范围与加密时相同(默认字段 + 你当时的
--fields/--file参数),也可以加--allfields尝试解密所有字段——该参数只能在解密模式使用,且会忽略--fields和--exclude; - 如果加密时用了
--pertablecommit或库内其他写入产生了膨胀,解密后可加--vacuum对处理过的表执行VACUUM FULL; - 解密成功后命令会删除
odoo_cyph_pwd参数,库回到可用状态。
限制与交付前的判断
- 源码和
-y帮助文本都明确声明:obfuscate 方式不被视为可以安全地向第三方转移匿名化数据的方案。它做的是"同一密码可逆的加密",拿到密码的人可以还原全部明文。是否满足你的保密要求,要结合对方获取渠道和合同约束自行判断;文档没有给出其他更强的脱敏选项,这一点无法由本命令本身解决。 - 密码即密钥:
--pwd一旦丢失,被加密的字段无法通过本命令还原(解密会因校验失败而整体回滚)。 - 每次运行只能处理一个数据库;多库交付需要逐库执行。
- 操作是不可逆地改写原列(虽然可用解密恢复),交互确认环节就是命令内置的最后防线;使用
-y会跳过它,只在脚本化、且你已确认库是副本时考虑。
【免费下载链接】odooOdoo. Open Source Apps To Grow Your Business.项目地址: https://gitcode.com/GitHub_Trending/od/odoo
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考