结论:把密码写进my.cnf或.my.cnf是高危操作,必须配合文件权限控制+优先改用mysql_config_editor;因其明文密码易被版本控制误提交、运维工具读取、日志采集或同服务器用户直接cat,mysql官方明确列为“insecure”方式,而mysql_config_editor将aes加密凭证存于权限为600的~/.mylogin.cnf中,仅客户端可解密,人眼不可读。

直接说结论:把密码写进 my.cnf 或 .my.cnf 是高危操作,必须配合文件权限控制 + 优先改用 mysql_config_editor。
为什么不能直接在 [client] 段明文存密码
明文密码暴露风险远超想象:配置文件可能被版本控制误提交、被运维工具批量读取、被日志系统自动采集、甚至被同服务器其他用户用 ls -l 看到权限后直接 cat。MySQL 官方文档明确将此列为“insecure”方式。
常见错误现象:
- 执行
ps aux | grep mysql时,命令行参数里带密码(即使用了-p交互式,某些旧客户端或脚本仍会拼接-psecret123) -
ls -l ~/.my.cnf显示权限为-rw-r--r--,组内或其他用户可读 - CI/CD 流水线拉取配置时,
my.cnf被当作普通文本处理,密码硬编码泄露
mysql_config_editor 是当前最稳妥的替代方案
它把加密后的凭证存进 ~/.mylogin.cnf,该文件默认权限为 -rw-------(仅属主可读写),且内容经 AES 加密,MySQL 客户端能解密但人眼不可读。
实操建议:
- 生成登录路径:
mysql_config_editor set --login-path=local --user=root --password --host=localhost(执行后会交互式输入密码) - 验证是否生效:
mysql --login-path=local -e "SELECT 1" - 查看已存路径(不显示密码):
mysql_config_editor print --all - 删除路径:
mysql_config_editor remove --login-path=local
注意:mysql_config_editor 只影响 MySQL 官方客户端(mysql、mysqldump 等),第三方工具如 PHP 的 mysqli 或 Python 的 mysql-connector 不识别该文件,需另行处理。
如果必须用 .my.cnf,权限和内容怎么设才安全
仅限调试或封闭环境临时使用,且必须满足两个硬性条件:
- 文件权限必须是
600:chmod 600 ~/.my.cnf,否则 MySQL 客户端会拒绝读取 -
[client]段中避免出现password = "xxx"这种明文写法;若非写不可,确保该文件不在 Web 根目录、不被 Git 跟踪、不进入任何备份镜像 - 不要在
[mysqld]段写password—— 服务端配置段根本不认这个参数,写了也无效
示例安全写法:
[client] user = app_user password = "T3st!P@ss9" host = 10.0.1.5 port = 3306
再强调一次:chmod 600 ~/.my.cnf 缺一不可,否则 MySQL 会报错 File '/home/user/.my.cnf' exists, but is not readable。
应用代码里怎么安全传密码(绕过配置文件)
对 PHP、Python、Java 等应用,真正需要保护的是连接字符串中的密码字段,而非配置文件本身:
- PHP:
new mysqli($host, $user, $_SERVER['MYSQL_PASSWORD'], $db),把密码从环境变量注入,而非写死在config.php - Python:
mysql.connector.connect(user='app', password=os.getenv('DB_PASS'), host='...') - Java(JDBC):
jdbc:mysql://host/db?user=app&password=${DB_PASS},配合 Spring Boot 的application.yml中spring.datasource.password: ${DB_PASS}
环境变量本身也要防护:避免在 ps 中暴露(如用 export DB_PASS="xxx" 后再启动进程)、避免写入 shell history、避免记录在容器 docker run -e 命令行中(应改用 --env-file)。
真正的难点从来不是“怎么写”,而是“谁有权限读”。无论用哪种方式,只要密码出现在可被任意进程访问的文本载体里,就存在泄漏链路。所以优先选 mysql_config_editor,次选环境变量隔离,最后才考虑加权限的配置文件 —— 并且每一步都得亲手验证权限和可见范围。











