명령 행에서 MySQL 비밀번호를 사용하는 안전한 대안은 무엇입니까?


35

데이터베이스 버전을 관리하는 PHP 명령 줄 스크립트가 있습니다. 개발자가 새로운 데이터베이스 패치를 추가 할 때마다이 스크립트를 실행합니다.

스크립트는 MySQL 명령 줄을 사용하여 패치를 실행합니다.

system('mysql --user=xxx --password=xxx < patch.sql');

그러나 MySQL 5.6은 이제 다음 경고를 발행합니다.

경고 : 명령 행 인터페이스에서 비밀번호를 사용하면 안전하지 않을 수 있습니다

분명히 사실이지만 사용자에게는 문제가 될 수도 있고 아닐 수도 있습니다.

  • 안전한 대안 은 무엇입니까 ?
  • 또는이 경고를 비활성화 할 수 있습니까?

외부 비밀번호 파일을 사용하고 싶지는 않습니다.


2
자격 증명을 파일에 갖는 것은 큰 문제가 아닙니다. 개인이 서버에 대한 루트 권한을 가진 경우 특정 옵션으로 mysql 서버를 다시 시작하면 인증 시스템을 완전히 무시할 수 있습니다.
Zoredache

이것은 제안 된 복제 에서와 같은 문제가 아닙니다 . MySQL이 암호를 묻지 않고 암호를 제공하고 있으며 정상적으로 작동합니다. 비밀번호 파일을 제외하고 비밀번호를 제공 할 수있는 대안을 찾고 있습니다.
Benjamin

답변:


17

최신 GA 버전의 MySQL, 즉 버전 5.6 에서는 http://dev.mysql.com/doc/refman/5.6/en/mysql-config-editor.html에 설명 된대로 mysql_config_editor 명령을 통해이를 수행 할 수 있습니다.

기본적으로 수행되는 작업은 호스트 별명으로 사용자 / 패스 자격 증명을 암호화 한 다음 호스트 별명을 사용하여이 정보를 홈 디렉토리의 구성 파일에 넣은 다음 필요할 때 대신 :

mysqldump -uroot --password=mycleartextpass mydatabase > dumpfile.sql

대신 다음과 같이 작성하십시오.

mysqldump --login-path=myhostalias mydatabase > dumpfile.sql

따라서 암호를 일반 텍스트로 스크립트에 넣지 않아도됩니다.

이것이 작동하려면 먼저 다음 myhostalias과 같이 정의해야합니다 (한 번만) .

mysql_config_editor set --login-path=myhostalias --host=mysqlhost.localnet.com --user=root --password

원하는대로 다른 계정 및 / 또는 호스트에 대해 다른 로그인 경로를 사용할 수 있습니다. 물어 보면 아주 좋은 생각입니다.

참고로,이 기능은 5.6 이하 버전에는 존재 하지 않습니다 .


참고 : mysql_config_editor가 실제로 외부 비밀번호 파일을 생성한다는 것을 알고 있습니다. 그러나 이것은 사용자가 수행하지 않으며 시스템이 작동하는 방식이므로 수동으로 en / de / crypting을 수행 할 필요가 없습니다.
Tuncay Göncüoğlu

감사합니다 .MySQL 5.6을 사용하고 있으므로 문제가되지 않습니다. 즉, PHP 구성 파일에서 암호를 실시간으로 가져 와서 명령 줄에 동적으로 전달하기 때문에 귀하의 접근 방식은 여전히 ​​문제가 있습니다 (적어도 현재 작동하는 방식으로 인해). 당신이 제안한대로,을 호출 할 때 여전히 명령 줄에서 암호를 사용해야 mysql_config_editor하므로 불행히도 더 많은 가치를 얻지 못합니다. 또한 개발자가 수동으로 수행하지 않도록 PHP 구성 파일 mysql 구성을 모두 유지해야합니다 .
Benjamin

내 최선의 해결책은 아마도 경고를 무시하는 것입니다. 실제로 보안 문제가 있는지 궁금합니다 .PHP에서 호출 되었기 때문에 명령 줄이 bash 기록이나 컴퓨터의 다른 곳에 저장되어 있지 않은 것 같습니다.
Benjamin

내 지식이 아니라면, bash 기록은 그것을 저장하지 않습니다. 그러나 php 설정 파일에서 일반 텍스트로 된 암호는 다른 형식으로 똑같은 위험을 감수합니다. 어쩌면 mysql_config_editor를 사용하여 비밀번호를 저장하고 php 설정 파일에 로그인 경로를 저장하는 것이 좋을까요? 그렇게하면 어디에서나 비밀번호를 노출시키지 않습니다. (그러나 여전히 외부 비밀번호를 유지해야합니다).
Tuncay Göncüoğlu

9

--defaults-file또는 --defaults-extra-file옵션을 사용하십시오 . 사용자 ID와 비밀번호를 지정할 수 있습니다. 형식은 /etc/my.cnf입니다.

더 읽어 보면, 외부 비밀번호 파일에 의존 할 필요는 없지만 이것이 유일한 안전한 방법입니다. 다른 것들은 프로세스 테이블이나 다른 곳에 흔적을 남길 것입니다. 원하는 경우 암호 파일을 버전 제어에 넣을 수도 있습니다. 600 또는 400으로 만들고 mysql 또는 실행중인 사용자 만 읽을 수 있도록하십시오.


1
보안상의 이유로 비밀번호 파일에 반대하지 않고 MySQL 자격 증명이 PHP 응용 프로그램의 전역 구성의 일부 (PDO 연결에도 사용됨)이므로 (임시의) 비밀번호 파일을 만드는 것을 의미합니다. 스크립트 수명 동안 (몇 초) mysql 명령 행을 실행하기 위해.
Benjamin

Windows Server 2012에서이를 수행하는 방법은 무엇입니까? --defaults-file 옵션을 포함하는 구성 파일은 어디에 있습니까?
Jake

다음과 같이 파일을 --defaults-file 옵션으로 지정하면됩니다.mysql --defaults-file c:\some\dirs\my.cnf
lsd

@ Benjamin, 보안에 관한 것이 아니라면 명령 줄에 암호를 입력하십시오. 보안에 문제가있는 것은 무엇입니까?
Pacerier

@ Benjamin PHP에서 MySQL을 이미 사용하고 있다면 왜 mysql콘솔 클라이언트를 포크 합니까?
Josip Rodin

5

http://dev.mysql.com/doc/refman/5.1/en/password-security-user.html 당 4 개의 옵션이 있습니다.

  • 명령 행 에서 -pyour_pass또는 --password=your_pass옵션 사용
  • 비밀번호 값을 지정하지 않고 명령 행 에서 -p또는 --password옵션을 사용하십시오 . 이 경우 클라이언트 프로그램은 대화식으로 비밀번호를 요청합니다.
  • 옵션 파일에 비밀번호를 저장하십시오.
  • MYSQL_PWD환경 변수에 비밀번호 저장

필요에 MYSQL_PWD따라 옵션이 될 수 있지만 더 이상 안전하지 않습니다. 실제로 대화식 프로세스를 생성하고 대화식으로 --password비밀번호를 제출해야하지만이 문제에 대한 해결책은 상당히 복잡합니다.


1
명령 줄보다 MYSQL_PWD의 보안 수준이 어떻습니까? PW는 프로세스 목록에 나타나지 않으며, 이는 가장 큰 관심사 인 것 같습니다
TheLQ

1
물론입니다. man ps-E Display the environment as well. MySQL의 암호가 매우 안전하지 않은 것으로 간주되어야하며, 사용하지 않아야 지정이 방법 : 나는에 링크 된 URL에서. 일부 ps 버전에는 실행중인 프로세스 환경을 표시하는 옵션이 포함되어 있습니다. 일부 시스템에서 MYSQL_PWD를 설정하면 ps를 실행하는 다른 사용자에게 비밀번호가 노출됩니다. 이러한 ps 버전이없는 시스템에서도 사용자가 프로세스 환경을 검사 할 수있는 다른 방법이 없다고 가정하는 것은 현명하지 않습니다.
RS

이 MYSQL_PWD 옵션에서 가져 오기 : 일부 스크립트 시작시 환경 변수를 설정 한 다음 MySQL 명령 줄을 호출 한 다음 스크립트 끝에서 나중에 노출 시간을 줄일 수 있음을 지우십시오 . 합리적으로 들립니까?
superjos

@kormoc, 마지막 단락을 자세히 설명하십시오. 당신이 말한 상당히 복잡한 해결책은 무엇입니까?
Pacerier

1
이 환경 변수를 사용하는 것 같다 입니다 명령 줄보다 안전합니다. 기본 데비안 시스템 ps에서는 모든 사용자의 모든 프로세스에 대한 명령 줄 인수를 수행 하고 볼 수 있습니다 . 그러나 ps e물론 자신의 프로세스 환경 만 표시합니다 (물론 루트가 아닌 경우). 조금 더 안전하지만 여전히 더 안전합니다.
jlh

4

PHP 스크립트에 이미 열린 데이터베이스 연결이있는 mysqli_multi_query()경우 .sql 파일을 가져 오는 데 사용하지 않는 이유는 무엇입니까? .sql 파일의 구문이 유효한 경우 물론 ...


꽤 큰 .sql 파일에서 얼마나 잘 작동하는지 잘 모르겠습니다.
Benjamin

1
@ Benjamin MySQL 클라이언트보다 나쁘지 않다고 생각합니다. 보안에 대해 염려하는 것이 가장 해킹 방법은 아니지만 크기가 여러 가지 방법으로 해결할 수있는 문제입니다.
voretaq7

PDO로 가능한지 아십니까?
Benjamin

PDO는 데이터베이스에서 한 번에 많은 쿼리를 처리하는 동등한 기능을 가지고 있지 않습니다. 죄송합니다. 그것은 생각이었다.
Michael Hampton
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.