루트 암호없이 cron 작업에서 mysqldump 사용


14

상자에 루트 비밀번호로 로그인하면 간단히 입력 할 수 있습니다

mysqldump --all-databases 그리고 나는 "Dump"를 기대할 것이다.

cron.daily에 작업을 설정하여 백업 드라이브에 실행하고 덤프했습니다. 내가 가진 문제는 사용자가 루트로 실행 중이지만 다음 메시지가 표시된다는 것입니다.

mysqldump : 오류가 발생했습니다 : 1045 : 사용자 'root'@ 'localhost'에 대한 액세스가 거부되었습니다 (비밀번호 사용 : NO).

연결하려고 할 때. 나는 하지 않는 하드 코딩 (것) 스크립트에서 MySQL 데이터베이스의 루트 암호를합니다.

내 bash 셸의 명령 줄에 "mysqldump"를 입력 할 수 있다는 것을 고려하면 -u 매개 변수를 사용하여 어딘가에 있어야합니다. 이미 스크립트 맨 위에 #! / bin / bash가 있습니다.

데이터베이스에 루트 비밀번호를 요청하지 않기 위해 여기에서 무엇을 놓치고 있습니까?

답변:


12

mysql 서버에 연결하려면 자격 증명을 제공해야합니다. 구성 파일에서 지정하거나 명령 줄을 통해 전달하거나 자격 증명이 필요없는 계정을 만들 수 있습니다.

물론 암호 없음 옵션을 사용해서는 안됩니다. ps를 실행할 수있는 사람은 누구나 명령 줄을 볼 수 있기 때문에 통과 명령 줄이 좋지 않습니다.

권장되는 옵션은 자격 증명이 있는 mysql 구성 파일 을 만든 다음 파일 시스템 권한으로 해당 파일을 보호하여 백업 사용자 만 액세스 할 수 있도록하는 것입니다.

루트로 대화식으로 로그인 한 상태에서 mysql 서버에 로그인 할 수 있다는 것은 루트 암호가 설정되어 있지 않거나 스크립트에서 찾을 수없는 구성 파일이 있다는 것을 나타냅니다. .my.cnf가있는 경우 수동으로 지정해야합니다. 루트 계정에 암호가 설정되어 있지 않으면이 문제를 해결하는 것이 좋습니다.

업데이트 (2016-06-29) mysql 5.6.6 이상을 실행 하는 경우 암호화 된 파일에 자격 증명저장할 수 있는 mysql_config_editor 도구를 찾아야 합니다. 이것을 언급 해 준 Giovanni 에게 감사드립니다 .


1
이 방법을 사용하려면 시스템에 일반 텍스트로 암호화되지 않은 암호가 있어야합니다. 그것이 내가 피하려고하는 것입니다.
Mech Software

> 루트 비밀번호가 설정되어 있지 않거나 스크립트에서 찾지 못한 구성 파일이 있습니다. 저자는 루트에 대한 mysql 비밀번호가 있으며 mysqldump 명령에 "(암호 사용 : NO)"를 제공하지 않고 데이터베이스에 액세스하려고 시도하고 있음을 분명히 나타냅니다. 따라서 액세스 거부 오류가 발생했습니다.
monomyth

1
@monomyth의 저자는 또한 대화 형으로 루트로 로그인 한 상태에서 비밀번호없이 로그인 할 수 있다고 말합니다. 이것은 무언가가 옳지 않다는 것을 말해줍니다.
Zoredache

2
@Mech Software, 루트 계정으로부터 자신을 보호하려는 것은 그리 중요하지 않습니다. 누군가 루트 계정을 가지고 있다면 간단히 mysql을 재시작하고 권한 시스템을 완전히 우회 할 수 있습니다.
Zoredache

1
내가 로그인 할 수 있었던 이유는 루트 계정에 600 권한으로 지정된 .my.cnf가 있었기 때문에 셸이 액세스하는 방식이었습니다. 그러나 cron은 파일을 무시해야 하므로이 게시물의 매개 변수를 사용하여 파일을 가리 켰습니다.
Mech Software

3

모호함을 통해 보안을 수행해서는 안됩니다. 누군가가 루트 계정에 액세스 할 수있는 것을 두려워하는 경우 mysql 덤프 또는 데이터베이스 파일에 모든 데이터를 사용할 수 있으므로 루트의 mysql 비밀번호가 스크립트에 저장되어 있는지는 중요하지 않습니다. 진짜 질문은 무엇을 보호하려고합니까?

다른 사람이 데이터베이스의 데이터를 변경할 수있는 암호를 얻지 못하게하려면 적절한 권한을 가진 사용자를 만들어야합니다 .

해당 스크립트에 대한 루트 설정 파일 권한 을 제외한 로컬 계정에서 mysql 비밀번호를 표시하지 않으려면 소유자를 루트로 0700으로 설정 하십시오 .


1
내가 아직도 이해하지 못하는 것은 암호 입력없이 mysqldump를 루트 프롬프트에서 입력 할 수 있다면 왜 cron 작업을 통해 같은 방식으로 실행할 수 없다는 것입니다. 누락 된 부분 -p 매개 변수가 필요합니다. 암호를 "모호하게"하지 않고 입력 한 적이 없습니다. 루트 로그인 자체에 특정한 것이 액세스를 허용하는 것이므로 왜 cron으로 복제 할 수 없습니까?
Mech Software

동일한 "루트"사용자를 사용하여 비밀번호없이 비밀번호로 로그인 할 수있는 경우 mysql 데이터베이스에 여러 명의 루트 사용자가있을 수 있습니다. 그들 중 일부는 암호가 설정되어 있지 않을 수 있습니다. 'root'@ 'localhost'에서 비밀번호를 제거 할 수 있지만 cron은 데이터베이스뿐만 아니라 로컬 계정을 가진 모든 사람에게 연결할 수 있습니다. 일반 텍스트 스크립트에 비밀번호를 사용하는 것과 다르지 않습니다.
monomyth

요점은 MechSoftware가 만든 것이 루트이기 때문에 기본적으로 데이터베이스 파일에 대한 읽기 액세스 권한을 부여하며 암호화되지 않았다는 것입니다. 따라서 본질적으로 이미 액세스 할 수있는 데이터를 인쇄하기 위해 루트 사용자의 루트 MySQL 비밀번호를 요구하는 것은 "불분명 한 보안"입니다. 게다가, 권한은 엉망이되기 쉽다. 예를 들어 누군가가 디렉토리에 대해 재귀 적으로 설정한다면, 파일에 대한 심볼릭 링크가 있다면
Septagram

2

쉘을 사용할 때, 즉 로그온 할 때 프로파일의 모든 쉘 스크립트가 실행되기 때문에 쉘을 사용할 수 있습니다.

크론에는 그러한 사치가 없습니다. 루트로 로그온하면 기본 쉘로 로그온합니다. 이렇게하면 누구나 원격으로 로그온 할 수 없지만 자동 로그인 스크립트가 실행되지 않습니다.

cron이 실행되도록 쉘을 설정하고 crontab을 편집하고 SHELL 및 HOME 변수를 추가 할 수 있습니다 (예 :

SHELL=/bin/bash
HOME=/root

이것들을 설정하지 않으면 cron은 / etc / passwd에 지정된 쉘 및 홈 디렉토리 (아마도 / bin / sh 일 수는 없음)로 실행됩니다.

cron이 실행중인 환경을 보려면 env를 파일로 내보내는 cron 작업을 추가하십시오 (예 :

$crontab -e
* * * * * env > /tmp/crontabenv.log
:wq

1

스크립트가 루트로 실행되면 권한 600 및 다음 내용으로 /root/.my.cnf 파일을 작성할 수 있습니다 .

[client]
user = DBUSERNAME
password = DBPASSWORD

(여기서 MySQL 사용자 이름과 비밀번호를 입력하십시오).

이 파일은 루트로 실행되는 경우 모든 mysql 명령 줄 도구에서 자동으로 읽습니다. 더 이상 명령 줄에 제공 할 필요가 없습니다. 600 개의 권한은 눈을 찌르지 않도록 보호합니다.


1
나는 이것이 암호없이 mysqldump를 어떻게 사용할 수 있었는지 알게되었습니다. 그래서 이것은 SHELL이 어떻게하고 있는지에 대한 수수께끼를 풀었습니다. 그래서 왜 cron이 그것을 읽지 않습니까?
Mech Software

1
cron에서 실행할 때 mysqldump가 .my.cnf 파일을 찾지 못할 수 있습니다. 해결 방법은 mysqldump 매개 변수를 추가하여 .my.cnf 파일의 옵션을 명시 적으로 읽는 것입니다. 참조 stackoverflow.com/a/602054/854680stackoverflow.com/a/890554/854680
MikeOnline

1

Cron은 디버깅하기가 매우 어려울 수 있습니다. 크론 작업이 실행되면 쉘로 당연한 환경 설정이 없습니다.

크론에 대한 팁 :

  • "ECHO = / bin / echo"등 모든 것에 대한 전체 경로를 사용하십시오. (상단에 변수를 정의하여 쉽게 작성)
  • MAILTO를 설정하여 각 작업에서 이메일을 받거나 작업이 stderr / stdout을 파일로 리디렉션하도록합니다.

루트 사용자가 쉘에서이를 수행 할 수 있으면 cron이이를 수행 할 수 있어야합니다. 명령 행에서 사용할 구성 파일을 명시 적으로 지정하십시오.


0

이러한 응답 중 일부는 도움이되지만 유닉스 루트 사용자와 mysql 루트 사용자는 동일하지 않으며 기본적으로 둘 다 로그인 이름 'root'를 사용하는 것 외에 다른 관계가 없기 때문에 혼란 스러울 수 있습니다. 어쩌면 그것은 분명하지만 일부 응답이 두 가지를 혼동하는 것처럼 보입니다.

mysqld에 유용한 옵션 (아마도 존재할 수 있습니까?)은 mysql 또는 mysqldump와 같은 클라이언트 프로그램이 유닉스 루트로 실행되는 등의 클라이언트 프로그램이 root @ localhost 's (mysql) 암호를 저장하지 않고도 암호없이 mysqld의 root @ localhost에 액세스 할 수있게하는 것입니다 my.cnf 파일 또는 이와 유사한 파일.

나는 그것이 약간 긴장하게 만드는 것을 알고 있지만 추론은 로컬 (mysqld 서버에) 유닉스 루트로 실행하는 사람은 어쨌든 mysqld의 보안을 아주 쉽게 우회 할 수 있다는 것입니다. 그리고 mysqld를 루트 암호 연중 무휴 또는 즉석에서 MySQL의 루트 암호 (어디에 암호가 오는가?)와 my.cnf 파일을 삭제 / 생성과의 my.cnf를 가진 (예를 들어, mysqldump를 할 것은)하게 나를 긴장.

mysqld로 전송하기 위해 mysql / mysqldump / etc를 신뢰해야하므로 실제로 로컬 유닉스 루트 계정에 의해 실행되고 있다고 생각하기 때문에 약간의 인프라와 사고가 필요합니다.

그러나 예를 들어, mysqld의 유닉스 소켓으로 만 제한하면 TCP가 없어도이 옵션을 강력히 권장하는 옵션으로 도움이 될 수 있습니다. 클라이언트가 로컬에서 실행되고 있다는 것만으로는 충분하지 않을 수 있습니다. 그러나 그것은 아이디어의 시작일 수 있습니다. 아마도 유닉스 소켓을 통해 파일 디스크립터를 보내는 것은 또 다른 부분 일 수 있습니다 (미친 이야기처럼 들리면 구글).

추신 : 아니요 유닉스가 아닌 운영 체제에서 어떻게 작동하는지 다른 아이디어로 해석 할 수 있습니다.


1
/root/.my.cnf적절한 권한으로 자격 증명을 입력 하면 문제가 깔끔하게 해결됩니다.
Michael Hampton

다른 시스템 결함을 포함하여 해당 파일에 액세스 할 수있는 사람은 누구나 mysql root pw를 가지고 있습니다. 그리고 24x7의 공격을 받고 고정 된 파일 위치에 있습니다 (물론 / root에있을 필요는 없습니다). 그러나 파일 시스템 덤프를 실행하거나 액세스 할 수있는 사람은 예를 들어 파일 시스템 덤프 파일 이 경우 불만을 품은 직원에 대한 유혹처럼 들립니다. 시스템에 일반 텍스트 암호가없는 것이 합리적 목표라고 생각합니다.
Barry Shein

그것은 수 있기 때문에 그럴지도,하지만 당신이 만든 제안은 훨씬 더 나쁘다 어떤 하찮게 루트 척에 로컬 사용자를.
Michael Hampton

아니요, 제 제안은 로컬 서버에서 이미 유닉스 루트 여야한다는 것입니다.이 경우 로컬 mysqld는 유닉스 루트로 실행되는 mysql 또는 mysqldump 등 (클라이언트)을 신뢰하고 마치 mysql 루트로 인증 된 것처럼 진행할 수 있습니다 . 내가 이미 서버에서 로컬로 유닉스 루트 인 경우, 잘 문서화 된 몇 가지 명령 ( "mysql root password recovery")으로 mysql 루트 암호를 우회 할 수있다.
Barry Shein
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.