Develop/infra

Nginx 튜닝, 보안 설정 및 Docker-compose 실행

kudl 2020. 12. 16. 19:39

Nginx.conf 설정

  • worker_processes는 CPU 갯수, worker_connections는 1프로세스당 클라이언트 갯수를 넣으면 된다.
  • access.log 파일을 json 형식으로 출력하였다. json_combined
  • gzip 옵션 on 설정을 해주었다.
  • server_tokens off 설정을 통해 버전이 노출되지 않도록 한다.
  • client_max_body_size 를 설정하여 파일 업로드 크기 설정을 한다.
  • X-Frame-Options, X-Content-Type-Options, X-XSS-Protection 옵션을 설정하여 보안을 추가하였다.
  • charset은 utf-8로 설정한다.
  • "/" 요청은 GET 메소드만 허용하도록 하였다.
  • js/css/image 파일은 access 로그에서 제외하였다.
  • 아래 샘플에서 ssl 설정은 주석처리 되어 있다.
user  nginx;
worker_processes  auto; # CPU count

#pid        ./nginx.pid;

events {
    worker_connections  1024; # Client Count
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout  10;
    types_hash_max_size 2048;
    server_tokens off; # nginx 버전 노출 제한
    server_names_hash_bucket_size 64; # 서버명 길이 기본값 : 32
    server_names_hash_max_size 2048; # 서버명 길이 기본값 : 512

    client_max_body_size 10M; # 파일 업로드 최대 사이즈 (기본 1MB)

    gzip  on;   # gzip 설정 on
    charset utf-8;

    add_header X-Frame-Options SAMEORIGIN;   # 도메인 기준으로 iframe 제한 (Deny : 모든 iframe제한, ALLOW-From Url : 주소를 설정하고 해당 주소는 가능)
    add_header X-Content-Type-Options "nosniff"; # 잘못된 Mime 타입 제한
    add_header X-XSS-Protection "1; mode=block"; #  XSS 세션 하이재킹 방지

    log_format json_combined '{ "time": "$time_iso8601", '
      '"remote_addr": "$remote_addr", '
      '"remote_user": "$remote_user", '
      '"body_bytes_sent": "$body_bytes_sent", '
      '"request_time": "$request_time", '
      '"status": "$status", '
      '"request": "$request", '
      '"request_method": "$request_method", '
      '"request_uri": "$request_uri", '
      '"uri": "$uri", '
      '"query_string": "$query_string", '
      '"http_referrer": "$http_referer", '
      '"http_user_agent": "$http_user_agent" }';
    # Combined로 설정하지 않으면, 공격 여부 파악, 공격자 사용 툴 파악, 공격자 위치 파악이 불가능하므로 반드시 Combined 포맷 또는 그에 준하는 포맷 스트링으로 설정해야 함.
    access_log  /var/log/nginx/access.log  json_combined;
    error_log  /var/log/nginx/error.log warn;

    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  localhost;

        fastcgi_hide_header X-Powered-By;   # 개발 언어 표시 제
        fastcgi_hide_header X-Pingback; # http 프로토콜에서 xml 전송 제한
        fastcgi_hide_header Link;   # xml 관련 w3c 표준이지만 특별히 사용안한다면 막는다.
        proxy_hide_header X-Powered-By;
        proxy_hide_header X-Pingback;
        proxy_hide_header X-Link;

        charset utf-8;

        location / {
            root   html;
            index  index.html index.htm;

            # GET 메소드만 허용
            if ( $request_method !~ ^(GET)$ ) {
                return 444;
            }
        }

        # js/css/image file access log off
        location ~* \.(js|css|png|jpg|jpeg|gif|ico) {
            access_log off;
        }

        error_page  404              /404.html; # error page 설정
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

    # HTTPS server
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;
    #
    #    ssl on;
    #
    #    # === cert config start ===
    #    #ssl_certificate /{path}/{filename}.pem;
    #    #ssl_certificate_key /{path}/{filename}.key;
    #    #ssl_dhparam /{path}/{filename}.pem;
    #    # === cert config end ===
    #
    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;
    #
    #    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;
    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;
    #
    #    add_header Strict-Transport-Security "max-age=15768000; includeSubDomains";
    #
    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

    include servers/*;
}

 

Docker-compose 파일

version: '3'

services:
  nginx:
    container_name: nginx
    image: nginx
    ports:
      - 80:80
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf

`docker-compose up` 명령어를 실행해서 nginx 컨테이너를 실행한다.

curl localhost:80 결과

 

access.log 파일 확인

{ "time": "2020-02-01T00:00:47+09:00", "remote_addr": "::1", "remote_user": "-", 
"body_bytes_sent": "612", "request_time": "0.000", "status": "200", 
"request": "GET / HTTP/1.1", "request_method": "GET", "request_uri": "/", 
"uri": "/index.html", "query_string": "-", "http_referrer": "-", 
"http_user_agent": "curl/7.64.1" }

'Develop > infra' 카테고리의 다른 글

Datadog 이란?  (0) 2021.08.23
CDC - debezium 설정  (1) 2021.07.25
Docker Compose 이용한 ElasticSearch Cluster, Kibana 구성  (0) 2020.12.15
Kubernetes 개념  (0) 2020.11.24
MacOS Kubernetes 사용하기  (0) 2020.11.23