MySQL에 대한 무차별 대입 공격을 방지 하시겠습니까?


9

MySQLd에 대한 네트워킹을 켜야하지만, 매번 서버가 망각에 빠지게됩니다. 비밀번호 추측 스크립트는 서버에서 망치질을 시작하여 포트 3306에서 연결을 열고 임의의 비밀번호를 영원히 시도합니다.

이 문제가 발생하는 것을 어떻게 막을 수 있습니까?

SSH의 경우 denyhosts를 사용합니다. 거부 호스트가 MySQLd에서 작동하도록하는 방법이 있습니까?

또한 MySQL이 실행되는 포트를 변경하는 것을 고려했지만 이것은 이상적이지 않으며 스톱 갭 솔루션 (새로운 포트를 발견하면 어떻게됩니까?)

다른 아이디어가 있습니까?

다른 경우, FreeBSD 6.x에서 MySQL 5.x를 실행하고 있습니다.

답변:


9

MySQL 용 denyhosts와 같은 소프트웨어 패키지는 모르지만 몇 가지 솔루션이 있습니다.

  • 특정 IP 주소로 로그인을 제한하십시오. 모든 호스트가 서버에 연결되도록 %를 사용하지 마십시오.
  • 더욱 안전한, iptables를 설정하여 인증 된 IP 주소에서 3306에만 액세스 할 수 있도록하십시오.
  • ssh를 사용하여 트래픽을 박스로 터널링 한 다음 localhost를 통해 연결
  • Denyhosts 또는 BFD 스크립트를 수정하여 mysql 액세스 로그를 분석하고 방화벽에서의 모든 무차별 시도를 차단하십시오.

편집 :

귀하의 의견에 대답하려면 다음을 시도하십시오 .

iptables -A INPUT -p tcp -s 202.54.1.50 --sport 1024:65535 -d 202.54.1.20 --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp -s 202.54.1.20 --sport 3306 -d 202.54.1.50 --dport 1024

여기서 .20은 MySQL이고 .50은 원격 연결 IP 주소입니다.


몇 가지 참고 사항 : 포트 3306에 대한 액세스를 주어진 IP 주소 세트로만 제한하려면 어떻게해야합니까? 원격 컴퓨터는 여전히 암호를 연결하고 무차별 공격 할 수 있으므로 MySQL 사용자를 제한하는 것만으로는 작동하지 않습니다. SSH 터널은 최종 사용자를 위해 설정하기에 다소 불편한 것 같습니다 ... IPTables 예제가 있습니까?
Keith Palmer Jr.

2

1 : 포트를 3306에서 변경하십시오. 보안 향상을 위해가 아니라 잘못된 로그인 공격을 처리하기 위해 서버를로드해야합니다.

2 : SSL 인증서를 작성하고 MySQL 서버에서 활성화하십시오 (어쨌든 클라이언트-서버 연결을 암호화해야합니다)

3 : 하나 이상의 클라이언트 인증서를 만듭니다 (모든 클라이언트에 인증서가 필요하고이를 사용하도록 클라이언트 소프트웨어를 구성해야 함). 클라이언트가 .Net 인 경우 클라이언트 인증서를 pkcs12 형식으로 변환해야하지만 쉽게 수행 할 수 있습니다 . 안내서를 참조하십시오 .

4 : MySQL 사용자 계정에 x509 클라이언트 인증서가 필요하도록 설정 한 다음 공격자는 로그인 자격 증명과 클라이언트 인증서가 모두 필요합니다 (클라이언트 인증서에 암호를 입력 할 수도 있고 공격자도이를 필요로합니다).

내가 사용 인증서와 키 파일을 만들기 위해 가이드를하지만, 거기 많은 가이드가있다.

클라이언트 액세스가 아닌 관리 목적으로 Linux 상자에 액세스하기 위해 SSH 연결 만 사용하는 것이 좋습니다.


답변 해주셔서 감사합니다. 이 안내서를 사용하여 # 2, 3 및 4를 수행했습니다. digitalocean.com/community/tutorials/…
ofri cofri

1

MySQL 프록시를 사용하면 연결 요청이 승인되지 않은 IP 범위에서 온 경우 사용자 / 패스 조합이 필요하지만 로그인을 처리하기 위해 X 초 동안 대기하는 작은 LUA 스크립트를 작성할 수 있습니다.

세 번의 시도 실패 후 IP 범위를 블랙리스트하기 위해 LUA 스크립트에 약간의 추가 로직을 추가 할 수 있습니다.

대체로 기술적으로는 가능하지만 SSH 또는 VPN을 통해 공통의 허용 된 (FW 또는 기타 수단을 통해) IP 범위로 터널링하는 다른 권장 사항을 따르겠습니다.


+1 또 하나의 MySQL 프록시 사용 :)
Andy

0

보안 호스트에서만 mysqld 포트에 액세스 할 수없는 이유는 무엇입니까?


나는 이것을 고려했지만 1,000 명 이상의 클라이언트에 대한 IP 주소 변경을 모니터링해야 함을 의미합니다. 그것은 엉덩이에 큰 고통이 될 것입니다 ... 어쨌든 이것을 어떻게 할 수 있습니까? 그것은 그들이 여전히 MySQL 서버에 연결할 수 있기 때문에 단지 실제로 데이터베이스를 선택하지, MySQL의 내부를 잠글 도움이되지 않습니다 ...
키스 파머 주니어

1
위의 데이브 드래을 인용 : 일부 hierogliphic 암호 : 좋은 생각 보인다 또는 사용 "MySQL의 액세스 로그를 분석하고 방화벽에서 어떤 브 루트 포스 시도를 차단하기 위해 Denyhosts 또는 BFD 스크립트를 수정"
quaie

0

이것이 "실제"답변은 아니지만-왜 외부 세계에 직접 노출해야하는지 모르겠습니다.

해당 상자에서 ssh를 활성화하고 터널링을 사용하여 DB 엔진에 액세스 할 수 없습니까?

또는 다른 VPN 솔루션에 액세스 할 수 있습니다 (openvpn이 떠오름).


0

문제에 대한 실질적인 해결책은 아니지만 다른 포트에서 서버를 실행하는 경우 도움이 될 수 있습니다. 대부분의 스캔 봇은 3306 만 검사하도록 프로그래밍되어있을 것입니다. 문제를 해결하지는 않지만 포트를 변경하면 스캔 횟수가 훨씬 줄어 듭니다.


-1 은둔 보안
thepocketwade

@ thepocketwade-이것이 문제의 실제 해결책이 아니라고 말한 이유입니다. 그러나 여전히 도움이 될 수 있습니다.
Eric Petroelje

0

나는 연결이 방화벽 화되어야한다고 믿습니다 : 빠르고 훌륭합니다. iptables에 대한 많은 자습서가 있습니다 :)

또한 방화벽이 알려진 호스트를 차단하지 못하도록 서버에서 smth를 실행하는 클라이언트 호스트에 cronjob을 설치할 수 있습니다.


0

터널에 ssh를 사용하는 것이 가장 좋지만 denyhosts 대신 fail2ban을 사용하려고 시도 할 수 있습니다. 왜냐하면 더 다른 응용 프로그램을 모니터링하는 것이 목표이므로 mysql 로그를 추가하는 데 문제가되지 않기 때문입니다.


0

my.cnf-ini [mysqld] 섹션에 대한 제안

max_connect_errors=10  # to limit hacker/cracker attempts to guess a password.

90 초 동안 수백 번의 시도를 피합니다. 10 번 시도하면 잘립니다.

FLUSH HOSTS (플래시 호스트)를 하루에 한 번 고려하여 시스템을 사용하려는 합법적 인 사람들이 자신의 암호를 기억할 수 없도록하십시오. 아마 며칠 안에 그들은 그것을 얻을 것입니다.

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