![비밀번호를 이용하여 안전하게 프로그램 제공](https://linux55.com/image/32830/%EB%B9%84%EB%B0%80%EB%B2%88%ED%98%B8%EB%A5%BC%20%EC%9D%B4%EC%9A%A9%ED%95%98%EC%97%AC%20%EC%95%88%EC%A0%84%ED%95%98%EA%B2%8C%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8%20%EC%A0%9C%EA%B3%B5.png)
이해하신 후명령줄에서 비밀번호 사용 문제, 문제 없이 프로그램에 비밀번호를 제공할 수 있는 방법을 찾아야 합니다(비밀번호는 어딘가에 기록되지 않습니다).
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