배너 이미지

워드프레스 로그인 페이지 차단의 필요성

꽤 예전에 로그인 페이지를 특정 IP를 제외하곤 접근할 수 없도록 막는 작업을 했었는데, 집 밖에선 로그인이 까다롭단 이유로 다시 모든 IP에서 접근할 수 있도록 바꿔뒀습니다.
최근 유독 /admin/login.asp에 접근을 시도하거나 xmlrpc.php에 post 요청을 보내는 로그가 많이 보여, 이게 과연 괜찮은 걸까 싶어 블랙리스트를 만들 목적으로 로그인 실패 시 제게 메일이 오게 작업해봤습니다.

function loginFailed() {
$ip = $_SERVER['REMOTE_ADDR'];

$to = 'example@example.com';
$subject = 'Login Failure';
$body = 'Login failed from '.$ip;
$headers = array('Content-Type: text/html; charset=UTF-8');
wp_mail( $to, $subject, $body, $headers );
wp_die( 'Good Bye Cracker' );
}

add_action( 'wp_login_failed', 'loginFailed' );

사용한 코드입니다. wp_login_failed란 훅을 이용해 로그인에 실패하면 메일을 보내는 간단한 방식입니다.

혹시 워드프레스 블로그를 운영하는 중이시라면 functions.php에 위 코드를 넣어보시면 흥미로운 결과가 나올 겁니다.

로그인 실패

그래 봤자 하루에 10개쯤 올까 싶었는데 1시간 반 만에 10개를 돌파했습니다.
프랑스, 러시아, 영국, 그리스 등 다양한 국가에서 로그인을 시도하더라고요.

블랙리스트를 만들면 종일 블랙리스트 IP만 추가하고 있어야겠다 싶어서 그냥 다시 모든 IP의 접근을 막고 확인된 IP에서만 접근할 수 있도록 바꿔뒀습니다.

location ^~ /wp-login {
allow my.ip;
deny all;

include snippets/fastcgi-php.conf;
# 등등 php 관련 설정
}

제가 사용한 코드입니다. nginx에선 위 코드를 이용하시면 됩니다.
location 블럭 내부에 php 관련 설정이 없으면 서버가 php 파일을 읽지 못하니 반드시 넣어주세요.

<FilesMatch "wp-login.php">
Order Deny, Allow
deny from all
allow from 0.0.0.0
</FilesMatch>

apache2를 사용 중이시면 위 코드를 conf 파일이나 .htaccess에 추가하시면 됩니다.


간혹 접근을 막는 게 아니라 login 페이지의 주소만 변경하는 분이 계신 것 같던데, 굉장히 기초적인 프로그래밍 실력만 있어도 몇 번 포트가 열려있고, 어느 페이지가 200으로 응답하는지 파악 가능합니다. 페이지의 내용을 분석하면 로그인 페이지를 추려내는 것도 전혀 어렵지 않고요. 고로 로그인 페이지 주소 변경은 아무런 도움이 되지 않습니다.


profile

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

주의 : 비밀 댓글 사용 시 수정 기능을 이용할 수 있는 시간이 지나면 작성자도 내용 확인이 불가능합니다.