1. 목적/배경
    1. 서비스를 운영하다보면 봇 등의 공격이 있을 수 있습니다.
    2. 특정 IP를 차단해도 IP를 변경해가면서 공격이 들어옵니다. 이때 효과적인 차단 방법 중 하나입니다.
  2. 제한 사항
    1. AWS의 CloudFront를 사용해야합니다.
    2. CloudFront에서 헤더 추가를 활성화해서 nginx에서 JA3헤더를 얻을 수 있어야합니다.(참고 링크)
  3. 참고
    1. 서버에서 tcpdump -s 0 -A 'tcp dst port 80' 등으로 인입되는 헤더의 CloudFront-Viewer-JA3-Fingerprint 를 분석
      1. AWS JA3헤더 관련 참고 링크
        1. 상세 셋팅 방법은 하단 참고
      2. ja3 fingerprint란? 링크
  4. nginx 설정 방법
    1. 확인된 나쁜 JA3 Fingerprint값을 아래 nginx 설정에 추가해서 1(true)로 설정 -> 403리턴
map $http_cloudfront_viewer_ja3_fingerprint $block_fingerprint {
        default 0;
        "차단할 CloudFront-Viewer-JA3-Fingerprint값" 1;
        "차단할 CloudFront-Viewer-JA3-Fingerprint값" 1;
}

server
{
        if ($block_fingerprint) {
           return 403;
        }

        .......

}

 
추가로, API 요청이었고 rate limit 처리해서 429 리턴 json으로 처리해야하는 경우 아래처럼 작업 가능

error_page 429 /429.json;
location /429.json {
    add_header 'Content-Type' 'application/json charset=UTF-8';
    return 429 '{"success":false, "errorCd":"RATE_LIMITED","msg":"Too Many Requests(rate limit nginx)"}';
}

 


참고- AWS Cloud Front 헤더 셋팅 방법

  1. CloudFront -> Distributions -> 대상 CloudFront -> Edit behavior
    1.  

AWS Cloud Front의 Custom Origin request policy를 추가하는 위치

2. Custom policies 생성

Custom policies 추가하는 방법
샘플 Custom Policy Origin reqeust settings

자주 잊어버려서 메모

 

nginx location 기본 문법
 - https://lahuman.github.io/nginx_location_options/
-----

# 정확하게 일치 
location = / {
    [ configuration A ]
}

# 지정한 패턴으로 시작
location / {
    [ configuration B ]
}

# 지정한 패턴으로 시작
location /documents/ {
    [ configuration C ]
}

# 지정한 패턴으로 시작 패턴이 일치 하면 다른 패턴 탐색 중지( 정규식 아님 )
location ^~ /images/ {
    [ configuration D ]
}

# 정규식 표현 일치 - 대소문자 구분
location ~ \.(gif|jpg|jpeg)$ {
    [ configuration E ]
}

# 정규식 표현 일치 - 대소문자 구분 안함
location ~* \.(gif|jpg|jpeg)$ {
    [ configuration F ]
}

nginx 설정시 이정도는 알아야함

 - https://www.nginx.com/blog/avoiding-top-10-nginx-configuration-mistakes/

 - 참고링크: https://news.hada.io/topic?id=6041

 

  1. 워커당 File Descriptor가 충분하지 않음
  2. error_log off 는 없음
    access_log 는 off가 되지만, error_log는 off가 되지 않음. 이러면 off 이름을 가진 에러 로그 파일이 생성
  3. 업스트림 서버 연결에는 Keepalive를 활성화할 것
  4. 지시문 상속이 동작하는 방식 제대로 알기
  5. proxy_buffering off 사용 금지
  6. if 지시문의 잘못된 사용
  7. 과도한 헬스 체크 금지
  8. Metric 접근에 보안 설정하기
  9. 모든 트래픽이 같은 /24 CIDR 블록에서 오는 경우에는 ip_hash 대신 hash $binary_remote_addr consistent 사용
  10. 업스트림 그룹의 장점 활용하기

 

 


다른 디렉토리에서 명령어 실행하는 실수를 막고 캡쳐 등을 할때 현재 시간을 알 수 있기 위해서 변경해서 사용

변경 명령어 (sudo로 실행)
sudo su
echo 'PS1="[\u@\h \$PWD \D{%T}]\\$ "' >> /etc/bashrc && source /etc/bashrc



1. 목적 : 서버가 어떤 웹서버를 사용하는지 감춰서 해킹을 시도하는 유저에게 정보 제공을 줄임

2. 방법

 -  proxy_pass_header Server; 를 추가


* 응답 헤더 server: nginx 가 없어짐


CentOS7 최소 설치 후 셋팅 내용 정리

CentOS 다운로드 경로

  1. 재 부팅시 네트웤 자동 시작하도록 설정
    • nmcli d 명령어로 랜카드ID 확인
    • vi /etc/sysconfig/network-scripts/ifcfg-위명령어에서 확인된 랜카드ID  후에 마지막라인 ONBOOT의 값을 yes로 변경해 줌

  2. 네트웤 재 시작
    • systemctl restart network

  3. ssh서버 설치 : 필요시
# 22번 리슨중이 아니라면 ssh설치
$netstat -anp | grep "LISTEN " | grep 22

$ yum install -y openssh-server

$ service sshd start
Redirecting to /bin/systemctl restart  sshd.service

#부팅시 자동으로 시작되도록 설정
$ chkconfig sshd on
알림: 'systemctl enable sshd.service'에 요청을 전송하고 있습니다.

#방화벽 프로세스 stop(필요시)
#방화벽 자동시작 중지#
$systemctl disable firewalld

#방화벽 자동시작 중지
$systemctl stop firewalld




  1. 추가 설치 및 튜닝
#패키지 업데이트
yum update -y

#자주 쓰는 프로그램 설치
yum  install -y telnet svn git nc ntp wget vim net-tools

#bashrc 프롬프트 변경
echo 'PS1="[\u@\h \$PWD \D{%T}]\\$ "' >> /etc/bashrc && source /etc/bashrc

#locale 변경
localectl set-locale LANG=ko_KR.UTF-8

# 파일 및 파일 갯수 튜닝
echo "*    soft nofile  655350" >> /etc/security/limits.conf
echo "*    hard nofile  655350" >> /etc/security/limits.conf
echo "*    soft nproc  32768" >> /etc/security/limits.conf
echo "*    hard nproc  32768" >> /etc/security/limits.conf

vim /etc/security/limits.d/20-nproc.conf 후에 32768로 변경

#biz 계정 추가 및 sudo권한 추가(필요시)
#계정 생성 및 암호 셋팅(biz라는 계정을 사용한다는 전제)
adduser biz
passwd biz

#biz계정에 sudo 권한 추가
#파일의 권한을 임시로 바꾼 후 sudo 셋팅 후 롤백
chmod 640 /etc/sudoers && echo "biz        ALL=(ALL)       NOPASSWD: ALL" >> /etc/sudoers && chmod 440 /etc/sudoers

#Selinux OFF (필요시)
setenforce 0
perl -pi -e 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux
perl -pi -e 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
reboot

# 방화벽 끄기(필요시)
systemctl stop firewalld
systemctl disable firewalld

# ntp켜서 시간 동기화
systemctl start ntpd
#재부팅시 자동 시작
systemctl enable ntpd



CentOS 7 기준


시간동기화처리


# ntpd

systemctl enable ntpd.service

systemctl start ntpd.service

CentOS의 biz라는 계정에 java 관련 프로그램(java, tomcat, maven, etc) 설치하는 간단한 bash 쉘 스크립트(install.sh)

해당 내용으로 쉘 파일을 만들고 사용 (디렉토리 먼저 생성 필요)
ex)  install.sh dir 후에 install.sh java

#!/bin/sh

#Enter user account
USER=biz


check_user()
{

    if [ $USER != `/usr/bin/whoami` ] ; then
        echo "=== Error. User is not $USER"
        exit -1;
    fi
}

make_dir()
{   
    echo "=== Install default directory : Start"

    mkdir ~/apps ~/deploy ~/scripts ~/logs ~/logs/nginx ~/src

    echo "=== Install default directory : End"

}

install_java()
{   
    echo "=== Install java : Start"
  

http://download.oracle.com/otn-pub/java/jdk/8u181-b13/96a7b8442fe848ef90c96a2fad6ed6d1/jdk-8u181-linux-x64.tar.gz?AuthParam=1537253298_036a93e056704f23f51ee0e1e5140908

    wget "http://download.oracle.com/otn-pub/java/jdk/8u181-b13/96a7b8442fe848ef90c96a2fad6ed6d1/jdk-8u181-linux-x64.tar.gz?AuthParam=1537253594_0606413d75133608b6bf7ca2136e364e" -O ~/apps/jdk-8u181-linux-x64.tar.gz
    tar -xzf ~/apps/jdk-8u181-linux-x64.tar.gz -C ~/apps && rm ~/apps/jdk-8u181-linux-x64.tar.gz && ln -s ~/apps/jdk1.8.0_181 ~/apps/jdk
     
    
    #JAVA DNS TTL Modify
    echo 'networkaddress.cache.ttl=60' >> ~/apps/jdk/jre/lib/security/java.security

    #set java path
    echo 'export JAVA_HOME=~/apps/jdk' >> ~/.bashrc
    echo 'export PATH=$JAVA_HOME/bin:$PATH' >> ~/.bashrc
    source ~/.bashrc

    #print java version
    java -version

    echo "=== Install java : End"

}

install_maven()
{   
    echo "=== Install maven : Start"

    wget "http://apache.tt.co.kr/maven/maven-3/3.5.4/binaries/apache-maven-3.5.4-bin.tar.gz" -O ~/apps/apache-maven-3.5.4-bin.tar.gz
    tar -xzf ~/apps/apache-maven-3.5.4-bin.tar.gz -C ~/apps && rm ~/apps/apache-maven-3.5.4-bin.tar.gz && ln -s ~/apps/apache-maven-3.5.4 ~/apps/maven

    #set maven path
    echo 'export M2_HOME=~/apps/maven' >> ~/.bashrc
    echo 'export PATH=$PATH:$M2_HOME/bin' >> ~/.bashrc
    source ~/.bashrc

    #print maven version
    mvn -version

    echo "=== Install maven : End"
}

install_tomcat()
{   
    echo "=== Install tomcat : Start"

    wget 'http://mirror.navercorp.com/apache/tomcat/tomcat-8/v8.5.34/bin/apache-tomcat-8.5.34.tar.gz' -O ~/apps/apache-tomcat-8.5.34.tar.gz
    tar -xzf ~/apps/apache-tomcat-8.5.34.tar.gz -C ~/apps && rm ~/apps/apache-tomcat-8.5.34.tar.gz


    #remove default tomcat webapps    
    rm -rf ~/apps/apache-tomcat-8.5.34/webapps && mkdir ~/apps/apache-tomcat-8.5.34/webapps

    echo "=== Install tomcat : End"
}

#check user account
check_user


case "$1" in
dir)
    echo "### Run make default dir ###"
    make_dir
    ;;
java)   
    echo "### Run install java ###"
    install_java
    ;;
maven)
    echo "### Run install maven ###"
    install_maven
    ;;
tomcat)
    echo "### Run install tomcat ###"
    install_tomcat
    ;;
*)
    echo "Usage : $0 {dir|java|maven|tomcat}"
    exit 1
esac





+ Recent posts