꽤 예전에 로그인 페이지를 특정 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으로 응답하는지 파악 가능합니다. 페이지의 내용을 분석하면 로그인 페이지를 추려내는 것도 전혀 어렵지 않고요. 고로 로그인 페이지 주소 변경은 아무런 도움이 되지 않습니다.