ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [네트워크/보안] 해커...어디에나 있고, 어디에나 없다!
    🎁 토이 프로젝트/오분 (2020년 첫 토이 프로젝트) 2020. 4. 5. 08:32

    안녕하세요! 운동하는 개발자 피트웨어 제이(Ftiware Jay) 입니다.

    오늘은... 아주 아주 열 받기도 하고, 중요한 내용에 대한 이야기를 적어보려고 합니다.

    바로바로.... "해킹"입니다. 

     

    해킹에 대한 직접적인 내용은 아니지만, 제 서버에 어떤 식으로 해커들이 해킹을 하려고 하는지? 그리고 해커들에게 서버를 털리지 않기 위한 최소한의 보안?에 대해서 제가 했던 방법들을 설명해보려고 합니다.

     

    1. 내 서버가 뭐 대단하고 유명하다고 해킹해?! 👨‍💻


    정말 이런 생각을 가지고 서비스를 오픈한다면... 진짜 안일한 생각을 가지고 있는 겁니다. (물론 이런 생각을 가진 서버 개발자들은 없겠지만)

    이건 조금 다른 이야기지만, 3년 전쯤 처음 AWS에서 토이 프로젝트 용으로 개인 서버를 만들어 사용할 때 깃허브에 서버 액세스 키가 노출돼서 AWS과금이 300만 원 나온 적이 있습니다. 물론 이때는 제 부주의였고 다행히 AWS 측에 메일을 보내 잘 해결되었습니다.

     

    해커들은 우리의 서버를 털어 개인 신상이나, 서버를 다른 용도로 사용하는 등 여러 가지의 용도로 사용하려고 합니다. 그리고 최소한의 보안이 안되어 있는 서버를 찾는 건 스크립트, 봇 한번 실행 시키면 바로 찾을 수 있습니다.(ex:MASSCAN)

     

    이 이후로, 개인 서버를 이용하는데 굉장히 조심스러웠습니다. 최근 토이 프로젝트(오분)를 하면서 서비스할 API 서버를 구축하게 되었는데, 테스트 Nginx access.log에 이상한 log들이 찍혀있는 걸 보았습니다.

    아주 지X들을 하셨네요...

    이거 보고 정말 소름 끼쳤고... 되게 불안했습니다.. 😭(진짜 몇일간 잠을 제대로 못잤다.. 신경쓰여서)

     

    회사에서는 모회사에 보안전문가들이 있고, 모회사의 서버를 사용해서 외부 접근에 대해서 크게 걱정한 적이 없었는데, 막상 내가 서비스를 운영하려고 보니 이런 보안에 대한 문제에 너무 모르고 있었다는 생각을 하게 되었습니다.

     

    저는 보안전문가는 아니지만, 그래도 최소한의 보안.. 내가 현재 할 수 있는 것들을 해보려고 했습니다.

     

     

    2. Nginx에서 할 수 있는 것들 🚨


    마지막 endpoint 인 백엔드 서버로 오기 전 Proxy 서버로 사용하고 있는 Nginx에서 무엇을 할 수 있는지 고민했습니다.

    (같이 토이 프로젝트를 하는 동료가 많이 알려주었습니다👍)

     

    📌 국가 제한 

    Nginx에서는 GeoIP 모듈을 사용해 국가별 IP를 차단할 수 있습니다. (저는 쫄아서 한국을 제외한 모든 국가를 차단할 예정입니다🤢)

    먼저 nginx -V 로 해당 모듈이 있는지 확인합니다.

    개꿀! 다행히 있습니다.

    이제 nginx.conf를 수정해 줍니다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    http {
        ...
        # geoip 국가 데이터 파일 위치 지정
        geoip_country /usr/share/GeoIP/GeoIP.dat;
     
        # geoip 국가 코드 맵핑, 기본 cno, 한국 yes
        map $geoip_country_code $allowed_country {
            default no;
            KR yes;
        }
     
        .
        .
        .
     
     
        server {
            ...
            location / {
                if ($allowed_country = no) {
                    return 403;
            }
        
        .
        .
        .
     
     

    위 내용처럼 설정하면 한국을 제외한 모든 국가들의 IP 접근을 차단할 수 있습니다.

     

    📌 robots.txt 세팅

    robots.txt 는 크롤링 하는 봇들에 대한 행동(?)을 정리해주는 일종의 봇과의 약속입니다.

    보통의 크롤링 봇들은 크롤링하는 url에 http://www.크롤링맛집.com/robots.txt/ 를 확인해서 크롤링을 해도 되는지, 어디까지 가능한지를 체크한다고 합니다. (robots.txt 기본 문법은 링크에서 확인해주세요~)

     

    사실 악의적인 해커들의 봇들은 robots.txt를 확인하지 않겠지만, 혹시나 해서 했습니다...

     

    1
    2
    3
    location  /robots.txt {
        return 200 "User-agent: *\nDisallow: /";
    }
     
     

    저는 따로 robots.txt 파일을 백엔드 서버 쪽에 추가하진 않고, 이런 식으로 바로 return 되도록 추가하였습니다.

    📌 User-Agent 추가

    마지막으로 http 요청에 User-Agent를 확인하는 것입니다. 어차피 저는 저희가 개발 중인 앱에서만 호출할 것이기 때문에 User-Agent를 확인해서 없거나 다르면 404를 리턴하도록 했습니다.

    1
    2
    3
    if ($http_user_agent !"^유저 에이전트") {
        return 404;
    }
     
     

     

    3. HTTPS, SSL 인증서 추가하기 🔖


    도메인을 일단 설정한 상태에서, 보안을 위해 https 요청이 가능하도록 SSL 인증서를 추가하려고 했습니다. 

    구글링을 해본 결과 letsencrypt 가 무료 인증서 중에 가장 유명하더군요! letsencrypt에서 인증서를 받기 위해서는 certbot이라는 걸 이용합니다. 근데 설치 도중..

    하..쉽게 되는 일이 없구나..ㅎㅎ

    이런 에러가 나왔습니다. 관련 내용 구글링 하던 도중 python 버전 관련해서 삭제 후 재설치하는 방법 같은 게 있었는데... 이거 하면 현재 실행 중인 Django 서버에 영향을 줄 것 같아서.. 다른 방법을 찾아보던 도중 GCP 로드밸런서를 사용하면 SSL 인증서를 등록할 수 있다는 걸 알게 되었습니다.

     

    사실 로드밸런서 자체를 사용하기 위해서 만든 건 아니지만... 어떻게 하다 보니 만들게 되었고.. SSL 인증서도 성공적으로 등록하였습니다. 

    구글 SSL 인증서letsencrypt를 통해서 만드네요. 저는 아래 블로그를 참고했습니다.

    * 참고 : GCP 로드밸런서 생성 및 SSL 설정

     

    [GCP]DNS 부터 하나씩 Google cloud 로 서비스 해보기 — 2탄 Google Cloud Load Balancing(GCLB)

    안녕하세요 이정운 입니다.

    medium.com

    결과적으로는 https로 DNS 접속까지 잘 되었습니다. 

     

     

    4. 최종 결과 💡


    이미지로 만들어본 토이프로젝트 서버 구조

    현재 프로젝트에 적용되어 있는 서버 구조입니다. Backend instance한 개만 사용합니다. 그렇기 때문에 아직 로드 밸런서라고 하기에는 조금 애매하네요. 무튼 여기에 Backend instance를 여러 개 붙이면 로드밸런서로의 기능을 사용하게 됩니다.

     

    어쨌든 저는 https로 들어오는 요청을 사용할 수 있었고, 백엔드 인스턴스에는 다시 Nginx에서 reverse proxy기능을 해서 각각 요청에 맞는 서버로 전달해줍니다. 

     

    여기서 조금 더 보안을 높이고 싶어서 로드밸런싱으로 들어오는 ip대역에 대해서만 80 포트를 허용하도록 했습니다. 이 글을 작성하고 있는 와중에도 log를 보고 있는데, 확실히 이상한 요청이 많이 줄었습니다. (ip 필터링 + user-agent 👍)

     

    물론 이 정도로 해킹의 위험에서 벗어나지는 못하겠지만. 어느 정도 제가 할 수 있는 최소한의 보안은 해봤습니다. 여기서 더 할 수 있는 것들이 있으면 댓글로 피드백 부탁드립니다!!

     

    - 해킹으로 의심되는 log들에 대한 내용들 ( 아래 내용들은 좀 더 공부하고 정리해보겠습니다.)

    1. Gh0st 명령어 + 쉘코드 : http://ddecode.com/hexdecoder/?results=c41fec75d8442835e6a6cdcd71f38b80

    2. Gh0st 관련 내용 : https://asec.ahnlab.com/995

    3. 80포트가 열린 서버들을 검색하는 프로젝트 : https://github.com/robertdavidgraham/masscan 

    4. 그 외 있을법한 url(admin 쪽)을 호출하거나 이상한 명령어를 섞어서 http 요청을 하는 경우들

    댓글

운동하는 개발자 JAY-JI