用密码安全地输入程序


9

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

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

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

编辑(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

(在我们的情况下为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

那怎么可能


另请参见unix.stackexchange.com/q/385339/135943,但请注意,这样做并不安全!
通配符

Answers:


11

关于您的更新:

当一个进程启动时,它有一个专用的内存区域,用于存储参数,还有一个int,用于指示已传递了多少个参数。

MEMORY
argc    2
argv[0] program_name
argv[1] foo
argv[2] bar

MySQL检查是否在命令行中通过传递了密码-p,并且是否将密码复制到了不可见的新变量中,然后用x'es 覆盖了该内存区域。

简单来说,例如:

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

new_var = copy(argv[2]);
argv[2] = "xxxxx";

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

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

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

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


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

mysqld_safe --init-file=/home/me/mysql-init &

编辑:

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

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

[client]
user=foo
password='password!'
shell> chmod 400 my_tmp.cnf
shell> mysql --defaults-extra-file=my_tmp.conf -...

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

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

tr '\0' '\n' < /proc/<PID>/environ

更多关于该主题在这里

您可能还想看看MySQL Configuration Utility,它使您可以将密码存储在主目录–中的加密文件中.mylogin.cnf


有没有办法mysql-init使用存储在bash变量中的密码来更改文件中的令牌?(未披露)
2013年

4
@Dor之类的东西echo 'password=p4ssw0rd' >>mysql.cnf是安全的,因为echo它是内置的,因此密码不会出现在任何进程的命令行中。这里的文档也是安全的。
吉尔斯(Gillles)“所以-别再邪恶了”

4

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


3

某些程序(ftp例如,命令行)从读取密码/dev/tty,每个密码表示进程的控制TTY的每个进程的特殊文件。这样一来,程序就不必将密码回显到屏幕上,从而可以更加确定密码的来源。

#!/bin/bash

stty -F /dev/tty -echo 
read PASSWORD < /dev/tty

echo $PASSWORD
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.