비밀번호를 이용하여 안전하게 프로그램 제공

비밀번호를 이용하여 안전하게 프로그램 제공

이해하신 후명령줄에서 비밀번호 사용 문제, 문제 없이 프로그램에 비밀번호를 제공할 수 있는 방법을 찾아야 합니다(비밀번호는 어딘가에 기록되지 않습니다).

Apache, FastCGI, PHP 및 MySQL 소스에서 전체 LAMP 서버를 자동으로 설치하는 bash 스크립트가 있습니다. 이러한 설치에는 비밀번호, 특히 MySQL이 필요합니다.

비밀번호를 유출하지 않고 스크립트를 완전히 자동화하려면 어떻게 해야 합니까?

편집(6월 9일, 3:55 UTC):
명령줄에서 루트를 통해 비밀번호를 사용하여 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") 일반 사용자(dor)를 통해 실행하고 다음을 실행합니다
.ps aux | grep mysql비밀번호를 표시하지 않음!
(일부) 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

어떻게 이럴 수있어?

답변1

업데이트 관련:

프로세스가 시작되면 매개변수를 저장하기 위한 전용 메모리 영역과 전달된 매개변수 수를 알려주는 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 &

편집하다:

~처럼@길스할 수 있다고 말해echo,printf또는 here스크립트의 설명서를 사용하세요.

.my.cnf홈 디렉터리 에 추가하거나 (일시적인) 보관 및 사용--defaults-extra-file옵션.(나중에보다는 빨리 명령줄에 해당 옵션을 추가해야 한다고 생각하세요.)사용자를 포함하도록 선택할 수도 있습니다. 또한 참고하시기 바랍니다추가의사용하고 싶지 않은 경우 옵션 이름에오직이 파일은 구성 역할을 합니다.

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

선택적으로 [client]그룹화는 mysqld구성을 건너뛸 수 있습니다.

다음을 사용할 수도 있습니다.MYSQL_PWD환경 변수이지만 이렇게 해야 합니다.안 돼요많은 구현에서 Linux의 파일에 환경을 나열하는 것처럼 사용할 수 있습니다 ps.ps -e/proc/<PID>/environ

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

이 주제에 대한 추가 정보여기.

당신은 또한 살펴보고 싶을 수도 있습니다MySQL 구성 유틸리티이를 통해 홈 디렉토리( )의 암호화된 파일에 비밀번호를 저장할 수 있습니다 .mylogin.cnf.

답변2

일반적인 해결책은 파일이나 표준 입력(또는 인수로 전달되어야 하는 다른 파일 설명자)에서 비밀번호를 읽는 것입니다.

답변3

ftp이는 일부 프로그램(예: 명령줄)이 암호를 읽는 /dev/tty프로세스 제어 TTY를 나타내는 각 프로세스에 대한 특수 파일입니다 . 이렇게 하면 프로그램이 암호를 화면에 표시하는 것을 방지하고 암호의 출처를 더 확실하게 확인할 수 있습니다.

#!/bin/bash

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

echo $PASSWORD

관련 정보