비밀번호로 프로그램을 안전하게 공급


9

명령 줄에서 암호를 사용하는따른 문제를 이해 한 후 문제 없이 암호를 프로그램에 공급하는 방법을 찾아야합니다 (비밀번호가 기록되지 않은 상태).

소스, 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")
그리고 나는 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 도 참조하십시오 . 그러나 이것이 안전하지는 않습니다.
와일드 카드

답변:


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 Systems

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

편집하다:

으로 @Gilles는 말을 수행 할 수 있습니다 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 의 파일 등에서 로 많은 구현 에서 환경을 나열 할 수 있으므로 절대로 사용 해서는 안됩니다 .psps -e/proc/<PID>/environ

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

여기 에 주제에 대한 자세한 내용이 있습니다 .

또한 홈 디렉토리의 암호화 된 파일에 비밀번호를 저장할 수 있는 MySQL 구성 유틸리티 를 살펴볼 수도 있습니다 – .mylogin.cnf.


mysql-initbash 변수에 저장된 비밀번호로 파일 에서 토큰을 변경하는 방법이 있습니까? (공개없이)
Dor

4
@Dor 내장되어 echo 'password=p4ssw0rd' >>mysql.cnf있기 때문에 안전한 것이므로 echo프로세스의 명령 줄에 암호가 나타나지 않습니다. here 문서도 안전합니다.
Gilles 'SO- 악마 그만해'

4

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


3

일부 프로그램 ( ftp예 : 명령 행 ) /dev/tty은 프로세스의 제어 TTY를 나타내는 프로세스 별 특수 파일 에서 암호를 읽습니다 . 이를 통해 프로그램은 암호를 화면에 다시 표시하지 않고 암호의 출처를 조금 더 확실하게 확인할 수 있습니다.

#!/bin/bash

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

echo $PASSWORD
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.