使用密码安全地提供程序

Dor*_*Dor 9 security password bash-script

在了解了在命令行中使用密码的问题后,我需要找到一种方法来为程序提供密码而不会出现问题(密码不会被记录在某处)。

我有一个 bash 脚本,它可以从源代码自动安装整个 LAMP 服务器:Apache、FastCGI、PHP 和 MySQL。这些安装需要密码,尤其是 MySQL。

如何在不泄露密码的情况下使脚本完全自动化?

编辑(UTC 时间 6 月 9 日,3:55):
我在命令行上通过 root 使用密码调用 mysql:

root@dor-desktop:/home/dor# PASS=`cat /home/dor/tmpf/pass`
root@dor-desktop:/home/dor# mysql -u root -p"$PASS"
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6
Run Code Online (Sandbox Code Playgroud)

(在我们的例子中,PASS="p4ssw0rd")
ps aux | grep mysql通过我的普通用户(dor)执行,它没有显示密码
(一些)ps输出是:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      3562  0.0  0.0  34156  2864 pts/0    S+   05:53   0:00 mysql -u root -px xxxxxx
Run Code Online (Sandbox Code Playgroud)

这怎么可能?

Run*_*ium 12

关于您的更新:

当一个进程启动时,它有一个专用的内存区域,用于存储参数和一个 int ,它告诉我们传递了多少参数。

MEMORY
argc    2
argv[0] program_name
argv[1] foo
argv[2] bar
Run Code Online (Sandbox Code Playgroud)

MySQL 检查密码是否通过命令行传递-p,如果是将其复制到不可见的新变量,则用x'es.覆盖该内存区域。

简单来说,例如:

argc 2
argv[1] -p
argv[2] p4ssw0rd

new_var = copy(argv[2]);
argv[2] = "xxxxx";
Run Code Online (Sandbox Code Playgroud)

您可以在例如client/mysqladmin.cc源代码中找到它:

  case 'p':
      ...
      opt_password=my_strdup(argument,MYF(MY_FAE));
      while (*argument) 
          *argument++= 'x';     /* Destroy argument */
Run Code Online (Sandbox Code Playgroud)

ps运行它读取的参数存储区域中,( argv[N]),因此,它是xxxx

在很短的时间内密码是可见的,但只有几个 CPU 周期。


您可以使用特殊--init-file选项和过程更新 MySQL 密码。C.5.4.1.2. 重置根密码:Unix 系统

mysqld_safe --init-file=/home/me/mysql-init &
Run Code Online (Sandbox Code Playgroud)

编辑:

作为@Gilles说,你可以echoprintf或使用here一个脚本文件。

您还可以将此添加到.my.cnf您的主目录或(临时)文件中并使用该--defaults-extra-file选项。(相信您必须尽早在命令行中添加该选项。)还可以选择包含用户。另外,请注意额外的选项名称,除非你想使用该文件作为配置:

[client]
user=foo
password='password!'
Run Code Online (Sandbox Code Playgroud)
shell> chmod 400 my_tmp.cnf
shell> mysql --defaults-extra-file=my_tmp.conf -...
Run Code Online (Sandbox Code Playgroud)

可选地,[client]分组使mysqld跳过配置。

也可以使用MYSQL_PWD环境变量,但永远不要使用它,因为您可以在 Linux 上的文件中列出许多ps实现中的环境等。ps -e/proc/<PID>/environ

tr '\0' '\n' < /proc/<PID>/environ
Run Code Online (Sandbox Code Playgroud)

更多关于这里的主题。

您可能还想查看MySQL 配置实用程序,它使您能够将密码存储在主目录中的加密文件中 – .mylogin.cnf.

  • @Dor 像`echo 'password=p4ssw0rd' &gt;&gt;mysql.cnf` 这样的东西是安全的,因为`echo` 是内置的,所以密码不会出现在任何进程的命令行中。这里的文档也是安全的。 (4认同)

Hau*_*ing 5

典型的解决方案是从文件或标准输入(或从另一个必须作为参数传递的文件描述符)中读取密码。