KOROMOON

착한 사마리아인이 되고 싶습니다.

6/27/2019

보안 및 성능을 위한 sysctl.conf 설정


링크 : https://klaver.it/linux/sysctl.conf
Michiel Klaver 님이 작성한 Kernel sysctl configuration file for Linux 를 번역하였으며 부가적인 정보도 추가함


< 커널 튜닝을 하기 위한 /etc/sysctl.conf 파일 >



# Linux 용 커널 sysctl 구성 파일
#
# 버전 1.14 - 2019-04-05
# Michiel Klaver - IT Professional
# http://klaver.it/linux/ for the latest version - http://klaver.it/bsd/ for a BSD variant
#
# 이 파일은 /etc/sysctl.conf 에 저장되어야 하며 명령을 사용하여 활성화할 수 있음 : 
# sysctl -e -p /etc/sysctl.conf
#
# 이진 값의 경우 0은 비활성화되고 1은 활성화됨. 자세한 내용은 sysctl(8) 및 sysctl.conf(5)를 참조할 것!

# 테스트 환경 : Ubuntu 14.04 LTS 커널 버전 3.13 
#             Debian 7 커널 버전 3.2 
#             CentOS 7 커널 버전 3.10 

#
# RAM 및 사용가능한 대역폭의 부하가 예상되는 고속 네트워크에 맞게 설정함
# 최적화 된 높은 연결 속도와 고성능 Web/FTP/Mail/DNS 서버에 맞게 설정함
# 단, 큰 네트워크라든지 xDSL/Cable 연결에는 적용하지 마세요!!! (Packet Loss 될 수 있음)
# ----------

# 크레딧 : 
# http://www.enigma.id.au/linux_tuning.txt 
# http://www.securityfocus.com/infocus/1729
# http://fasterdata.es.net/TCP-tuning/linux.html
# http://fedorahosted.org/ktune/browser/sysctl.ktune
# http://www.cymru.com/Documents/ip-stack-tuning.html
# http://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt
# http://www.frozentux.net/ipsysctl-tutorial/chunkyhtml/index.html
# http://knol.google.com/k/linux-performance-tuning-and-measurement
# http://www.cyberciti.biz/faq/linux-kernel-tuning-virtual-memory-subsystem/
# http://www.redbooks.ibm.com/abstracts/REDP4285.html
# http://www.speedguide.net/read_articles.php?id=121
# http://lartc.org/howto/lartc.kernel.obscure.html
# http://en.wikipedia.org/wiki/Sysctl
# https://blog.cloudflare.com/http-2-prioritization-with-nginx/



### 
### 일반 시스템 보안 옵션 ### 
### 

# 커널의 시스템 요구 디버깅 기능을 제어함
# 시스템에서 매직키 비활성화
# 여기서 매직키란 시스템을 Lock 하지 않은 상태에서 시스템이 어떤 작업을 하는 중이라도 커널이 반응하는 키임
# 물리적 보안을 위해서 비활성화시킴
kernel.sysrq = 0



# 코어 덤프가 코어 파일 이름에 PID 를 추가할지 여부를 제어함
# 멀티스레드 어플리케이션 디버깅에 유용함
kernel.core_uses_pid = 1

# PID 의 최대값 설정
kernel.pid_max = 65535

# /proc/<pid>/maps, smaps 의 내용을 단지 관리자만 볼수 있으며 ptrace() 과정을 허용함
kernel.maps_protect = 1

# kernel.exec-shield 설정은 NX(Not eXecutable) 기법과 관련된 설정임
# kernel.exec-shield = 0        ---> ExecShield 보호 비활성화
# kernel.exec-shield = 1        ---> ExecShield 보호 활성화
#
# kernel.randomize_va_space 설정은 ASLR 기법과 관련된 설정임
# ASLR(Address Space Layout Randomization) 이란 메모리상의 공격을 어렵게 하기 위해 스택이나 힙, 라이브러리 등의 주소를 랜덤으로 프로세스 주소 공간에 배치함으로써 실행할 때 마다 데이터의 주소가 바뀌게 하는 기법
# kernel.randomize_va_space = 0 ---> ASLR 해제
# kernel.randomize_va_space = 1 ---> 랜덤 스택 & 라이브러리 활성화
# kernel.randomize_va_space = 2 ---> 랜덤 스택 & 라이브러리 & 힙 활성화
kernel.exec-shield = 1
kernel.randomize_va_space = 2

# 메시지의 최대 크기 (바이트 단위)
kernel.msgmnb = 65535

# 하나의 프로세스에서 다른 프로세스로 보내질 수 있는 메시지 큐의 최대 크기 (바이트 단위)
kernel.msgmax = 65535

# 코어 덤프 제한
fs.suid_dumpable = 0

# 커널 포인트 숨기기
# non-root 유저가 kallsyms 등을 통해서 커널영역 포인터값을 보지 못하게 하는 설정임
kernel.kptr_restrict = 1



###
### 시스템 메모리 관리 개선 ###
###

# 파일 핸들과 inode 캐시의 크기를 늘림
fs.file-max = 209708

# 덜 바꾸기
# vm.swappiness             - swapping 비율로 적게 설정
# vm.dirty_ratio            - 전체 시스템 메모리에서 Dirty Page 비율로 Process가 Dirty Page 를 쓰기 시작하는 기준값임
# vm.dirty_background_ratio - 전체 시스템 메모리에서 dirty page 비율로 pdflush 데몬이 dirty page 를 쓰기 시작하는 기준값임
# 참고 사이트 : http://small-dbtalk.blogspot.kr/2014/03/linux-kernel-parameters-and-mysql_2226.html
vm.swappiness = 30
vm.dirty_ratio = 30
vm.dirty_background_ratio = 5

# 프로세스가 mmap 이 허용되는 가상 주소를 최소로 지정
# mmap 이란 프소세스 간 데이터 공유 메커니즘임
vm.mmap_min_addr = 4096

# 사용 가능한 메모리의 50 % 초과 사용
# vm.overcommit_ratio  - overcommit_memory 가 2 로 설정되어 있는 경우 고려해야 할 물리적 RAM의 백분율을 지정함 (기본값은 50)
# vm.overcommit_memory - 대량 메모리 요청을 수락 또는 거부할 지에 대해 결정하는 조건 설정
# vm.overcommit_memory = 0 ---> 기본 설정임. 커널은 사용 가능한 메모리 양을 추정하고 잘못된 요청을 실패시켜 휴리스틱 메모리 오버커밋 처리를 수행함. 불행히도 메모리는 정확한 알고리즘이 아닌 휴리스틱 알고리즘을 사용하여 할당되므로 이러한 설정은 시스템에서 사용가능한 메모리가 오버로드되게 할 수 있음.
# vm.overcommit_memory = 1 ---> 커널은 메모리 오버커밋 처리를 수행하지 않음. 이러한 설정에서 메모리 오버로드 가능성은 증가하므로 메모리 집약적 작업을 위한 성능임.
# vm.overcommit_memory = 2 ---> 커널은 총 사용 가능한 스왑의 합계와 overcommit_ratio에 지정된 물리적 RAM의 백분율 보다 메모리가 크거나 동일한 경우 요청을 거부함. 메모리 오버커밋의 위험을 줄이고자 할 경우 이 설정이 가장 적합함.
# 참고 사이트 : https://access.redhat.com/documentation/ko-KR/Red_Hat_Enterprise_Linux/6/html/Performance_Tuning_Guide/s-memory-captun.html
vm.overcommit_ratio = 50
vm.overcommit_memory = 0

# shm 에 할당된 최대 메모리 양을 256 MB 로 설정함
# shmmax - 공유 메모리 세그먼트 최대 크기를 설정함
# shmall - 특정 시점에서 시스템에서 사용 가능한 공유 메모리의 최대 크기를 설정함
# 참고 사이트 : http://iblog.or.kr/hungi/it/os/linux/1666
kernel.shmmax = 268435456
kernel.shmall = 268435456

# 최소 64 MB 의 사용 가능한 RAM 공간을 확보함
# 시스템 전체에 걸쳐 빈 공간으로 두는 최소 크기 설정값임 (단위 KB)
# 사용 가능한 RAM 공간을 64MB 이상을 유지함
# 이 값은 각각의 낮은 메모리 영역에서 워터마크 값을 계산하는데 사용되며 그 후 그 크기에 비례하여 저장된 빈 페이지 수를 할당함
# 참고 사이트 : https://access.redhat.com/documentation/ko-KR/Red_Hat_Enterprise_Linux/6/html/Performance_Tuning_Guide/s-memory-captun.html
vm.min_free_kbytes = 65535



###
### 일반 네트워크 보안 옵션 ###
###

# SYN 공격을 막고 SYNcookies 를 활성화함 (max_syn_backlog 에 도달하면 시작할 것임)
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_max_syn_backlog = 4096

# 패킷 포워딩 비활성화
net.ipv4.ip_forward = 0
net.ipv4.conf.all.forwarding = 0
net.ipv4.conf.default.forwarding = 0
net.ipv6.conf.all.forwarding = 0
net.ipv6.conf.default.forwarding = 0

# IP 소스 라우팅 비활성화
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv6.conf.all.accept_source_route = 0
net.ipv6.conf.default.accept_source_route = 0

# IP 스푸핑 방지 활성화시키고 소스 경로 확인 켜기
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1

# ICMP 리다이렉션 허용 비활성화
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0

# 스푸핑 패킷, 소스 라우팅 패킷, 리다이렉션 패킷의 로그 활성화
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.default.log_martians = 1

# tcp_fin_timeout 연결의 시간 기본값을 줄임
Decrease the time default value for tcp_fin_timeout connection
net.ipv4.tcp_fin_timeout = 7

# 연결을 유지하는 데 걸리는 시간을 줄임
# net.ipv4.tcp_keepalive_time   - TCP/IP가 대기 연결이 계속 원래 상태를 유지하는지 확인을 시도하는 빈도값 (성능향상을 위해서 감소)
# net.ipv4.tcp_keepalive_probes - TCP/IP가 기존 연결에 대한 수신확인되지 않은 활성화 상태 지속 메시지를 재전송하는 횟수를 결정하는 값 (성능향상을 위해서 감소)
# net.ipv4.tcp_keepalive_intvl  - 상대로부터 활성화 상태 지속 응답이 수신되지 않을 경우 TCP/IP에서 활성화 상태 지속 전송을 반복하는 빈도를 결정하는 값 (성능향상을 위해서 감소)
# 참고 사이트 : http://publib.boulder.ibm.com/wasce/V1.0.1/ko/Tasks/Tuning/Linux.html
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_keepalive_intvl = 15


# bootp 릴레이 비활성화
net.ipv4.conf.all.bootp_relay = 0

# proxy arp 실행 비활성화 (누구든지 proxy arp 하지 마라!)
net.ipv4.conf.all.proxy_arp = 0

# tcp_timestamps 기능 활성화
# 정확한 타임 스탬프는 TCP 혼잡 제어 알고리즘이 더 잘 작동함
net.ipv4.tcp_timestamps = 1

# ping 응답 비활성화
net.ipv4.icmp_echo_ignore_all = 0

# 브로드캐스트 요청 무시 활성화
net.ipv4.icmp_echo_ignore_broadcasts = 1

# 잘못된 오류 메시지 보호 활성화
net.ipv4.icmp_ignore_bogus_error_responses = 1

# 로컬 포트 범위 설정
# 원하는 대역대로 설정
net.ipv4.ip_local_port_range = 16384 65535

# 세팅되면 TCP 스택은 RFC1337 을 따름
# 해제되면 RFC를 따르지 않지만 TCP TIME_WAIT asassination 은 막아줌
# net.ipv4.tcp_max_tw_buckets 값을 줄이고 net.ipv4.tcp_rfc1337 값을 설정하는게 나음
net.ipv4.tcp_rfc1337 = 1

# D자동 구성 IPv6 비활성화
net.ipv6.conf.all.autoconf=0
net.ipv6.conf.all.accept_ra=0
net.ipv6.conf.default.autoconf=0
net.ipv6.conf.default.accept_ra=0
net.ipv6.conf.eth0.autoconf=0
net.ipv6.conf.eth0.accept_ra=0



###
### 네트워크 성능 튜닝 ###
###

# BBR TCP 혼잡 제어를 사용하고 tcp_notsent_lowat 을 16384 로 설정하여 HTTP/2 버전이 우선 순위가 최적으로 작동하도록 함
# mmodprobe tcp_bbr 먼저 수행하며(커널 4.9 버전 이상) bbr 을 사용할 수 없는 경우 htcp 로 폴백(Fall-back)함
net.ipv4.tcp_congestion_control = htcp
net.ipv4.tcp_congestion_control = bbr
net.ipv4.tcp_notsent_lowat = 16384
    
# tcp-heavy 작업 부하가있는 서버의 경우 'fq' 큐 관리 스케줄러를 활성화함 (커널 3.12 버전 이상)
# FQ 란 혼잡제어를 위한 Queuing 메커니즘 중의 하나로 입력 트래픽의 큐에 대하여 공평하게 서비스되도록 스케줄링 기법을 수행하는 메커니즘
net.core.default_qdisc = fq

# tcp_window_scaling 기능 활성화
net.ipv4.tcp_window_scaling = 1

# 읽기 버퍼 공간 할당량 증가
# net.ipv4.tcp_rmem     - TCP 수신 버퍼
# net.ipv4.udp_rmem_min - UDP 수신 버퍼 최소량
# net.core.rmem_default - 모든 프로토콜 수신 버퍼
# net.core.rmem_max     - 모든 프로토콜 수신 버퍼 최대량
# 참고 사이트 : http://kensei.co.kr/289
net.ipv4.tcp_rmem = 8192 87380 16777216
net.ipv4.udp_rmem_min = 16384
net.core.rmem_default = 262144
net.core.rmem_max = 16777216

# 쓰기 버퍼 공간 할당량 증가
# net.ipv4.tcp_wmem     - TCP 송신 버퍼
# net.ipv4.udp_wmem_min - UDP 송신 버퍼 최소량
# net.core.wmem_default - 모든 프로토콜 송신 버퍼
# net.core.wmem_max     - 모든 프로토콜 송신 버퍼 최대량
# 참고 사이트 : http://kensei.co.kr/289
net.ipv4.tcp_wmem = 8192 65536 16777216
net.ipv4.udp_wmem_min = 16384
net.core.wmem_default = 262144
net.core.wmem_max = 16777216

# 수신 연결 갯수 증가
net.core.somaxconn = 32768

# 수신 연결 로그수 증가
net.core.netdev_max_backlog = 16384
net.core.dev_weight = 64

# 옵션 메모리 버퍼의 최대 크기 증가
net.core.optmem_max = 65535

# TIME_WAIT 상태 소켓 최대 설정값으로 간단한 DoS 공격을 방어하기 위해 해당 값 증가
net.ipv4.tcp_max_tw_buckets = 1440000

# 시간 대기 연결을 재사용하려고 시도하지만 재사용하지 않음 (재사용으로 인해 NAT 뒤에 위치한 클라이언트가 손상될 수 있음)
# net.ipv4.tcp_tw_recycle - TCP TIME_WAIT 소켓 재활용 여부 결정함. Packet Reordering 이 발생하여 Timestamp 역전 현상이 발생하면 클라이언트로 부터 수신한 SYN Packet 이 Drop 됨.
# net.ipv4.tcp_tw_reuse   - TCP TIME_WAIT 소켓 재사용 여부 결정함. 해당 옵션을 사용하지 않으면 시스템 과부하 시 TIME_WAIT 소켓 증가로 인한 로컬 포트 소진에 의해 신규 연결을 생성하지 못할 수 있음.
# 참고 사이트 : http://linux.systemv.pe.kr/%EB%B2%88%EC%97%AD-%EB%B0%94%EC%81%9C-%EB%A6%AC%EB%88%85%EC%8A%A4-%EC%84%9C%EB%B2%84%EC%97%90%EC%84%9C-tcp-time-wait-%EC%83%81%ED%83%9C-%EB%8C%80%EC%B2%98%ED%95%98%EA%B8%B0/
http://kikiho.tistory.com/entry/Linux-TIMEWAIT-State-%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_tw_reuse = 1

# 고아(orphan)의 수를 제한함
# 각 고아는 스왑 불가능한 메모리의 16 M 까지 막을 수 있음
# net.ipv4.tcp_max_orphans    - 사용자 파일 핸들에 연결되어 있지 않아서 시스템이 가지고 있는 TCP 소켓의 최대 개수임. 이 개수를 초과하면 고아(orphan) 연결은 즉시 초기화 되고 경고가 출력됨. 단순한 DoS 공격 방어에 효율적이며 너무 의존하거나 제한값을 억지로 낮춰선 안 됨. 각각의 고아 연결은 스왑 불가능한 메모리 16M (max wmem) 를 잡아먹음.
# net.ipv4.tcp_orphan_retries - 우리쪽에서 닫은 TCP 연결을 죽이기 전까지 몇 번이나 재시도를 할 것인가 여부
# 참고 사이트 : http://h20564.www2.hpe.com/hpsc/doc/public/display?docId=emr_na-c01418125&sp4ts.oid=465646&lang=en-us&cc=us
net.ipv4.tcp_max_orphans = 16384
net.ipv4.tcp_orphan_retries = 0

# IP 조각 재구성에 사용되는 최대 메모리 제한 (CVE-2018-5391)
# net.ipv4.ipfrag_high_thresh - IP 조각 재조립에 쓰이는 최대 메모리 (설정값 증가시켜야 함)
# net.ipv4.ipfrag_low_thresh  - IP 조각 재조립에 쓰이는 최소 메모리
# 참고 사이트 : http://tei827.tistory.com/44
net.ipv4.ipfrag_low_thresh = 196608
net.ipv6.ip6frag_low_thresh = 196608
net.ipv4.ipfrag_high_thresh = 262144
net.ipv6.ip6frag_high_thresh = 262144


# 이전 연결에서 ssthresh 캐시를 하지 않음
net.ipv4.tcp_no_metrics_save = 1
net.ipv4.tcp_moderate_rcvbuf = 1

# RPC 데이터그램 큐 길이 크기 증가
net.unix.max_dgram_qlen = 50

# ARP 캐시에 유지되는 최대 항목 수임 (2028 보더 더 혀용하지 말 것!)
# 참고로
# gc_thresh1 - minumum  (default 128)
# gc_thresh2 - soft maximum (default 512)
# gc_thresh3 - hard maximum (default 1024)
# 참고 사이트 : http://infoages.tistory.com/1466
http://qahuni.egloos.com/2517195
net.ipv4.neigh.default.gc_thresh3 = 2048

# ARP 캐시에 유지되는 Soft 최대 항목 수임
# GC(Garbage Collector)가 실행되기 전에 5초 동안 항목 수가 초과하는 것을 허용함
# LAN 크기에 따라 조정해야 하며 1024는 /24 네트워크에 적합함
net.ipv4.neigh.default.gc_thresh2 = 1024

# ARP 캐시에 유지되는 최소 항목 수임
# 해당 값보다 적을 경우 GC(Garbage Collector)가 실행되지 않음
net.ipv4.neigh.default.gc_thresh1 = 32

# ARP 캐시에 GC(Garbage Collector)가 실행하는 시간 간격
net.ipv4.neigh.default.gc_interval = 30

# TCP 큐 길이 증가
net.ipv4.neigh.default.proxy_qlen = 96
net.ipv4.neigh.default.unres_qlen = 6

# 명백한 혼합 공지(Explicit Congestion Notification, RFC 3168 참조)를 사용하도록 설정하고 작동하지 않은 경우 해제해야 함
# net.ipv4.tcp_ecn        - 명백한 혼합 공지(Explicit Congestion Notification) 활성화
# net.ipv4.tcp_reordering - TCP 스트림에 패킷들의 최대 재요청 설정값
net.ipv4.tcp_ecn = 1
net.ipv4.tcp_reordering = 3

# net.ipv4.tcp_retries1 - 무언가 문제가 있을 때 연결을 위해 재시도할 횟수 (최소 값과 기본 값은 3)
# net.ipv4.tcp_retries2 - TCP 연결을 끊기 전에 재시도할 횟수
net.ipv4.tcp_retries1 = 3
net.ipv4.tcp_retries2 = 15

# 연결이 유휴 상태가 된 후에 천천히 시작하는 것을 피할 것!
# keep alive 연결로 혼잡 윈도우 크기(cwnd)를 크게 유지함 (커널 3.6 버전 이상)
net.ipv4.tcp_slow_start_after_idle = 0

# TCP fastopen flag 기능 활성화 (커널 3.7 버전 이상)
# 원래 TCP fastopen flag 기능은 구글 크롬에서 사용되던 기능으로 TCP 3-Hand Negotiation 과정을 몇 단계 생략하여 접속을 빠르게 하는 기능임
# 몇몇 방화벽에서는 TFO(TCP fastopen) 기능을 좋아하지 않아 조심히 쓸 것!
net.ipv4.tcp_fastopen = 3

# 라우팅 캐시 청소 기능 활성화
net.ipv4.route.flush = 1
net.ipv6.route.flush = 1



###
### 의견 / 제안 / 추가는 환영합니다!
###

댓글 없음:

댓글 쓰기