[Linux]네트워크 취약점, 커널 환경변수로 대응하자!

리눅스의 취약점을 점검하기 위해서는 커널 환경변수(Kernel Parameter)를 살펴봐야 합니다. 커널 환경변수의 역할은 다양하며 주요 기능은 다음과 같습니다:

  1. 시스템 동작 제어: 일반적인 동작을 제어하는 데 사용되며, 예를 들어, 시스템 콜, 파일 시스템, 네트워크 등의 동작을 설정할 수 있습니다.
  2. 자원 할당 및 관리: 메모리, 프로세스, 스레드 등과 관련된 자원에 대한 설정을 담당합니다.
  3. 디바이스 드라이버 설정: 특정 하드웨어나 디바이스 드라이버의 동작을 제어하는 데 사용됩니다.
  4. 네트워크 설정: 네트워크 인터페이스, 방화벽, 라우팅 등과 관련된 설정을 관리합니다.
  5. 파워 관리: 전원 관리와 관련된 설정을 지원합니다.

/proc/sys 디렉터리에 많은 커널 환경변수들이 있으며, 이러한 변수들은 시스템 관리자가 필요에 따라 조절하여 시스템의 동작을 최적화하거나 특정 기능을 활성화 또는 비활성화할 수 있게 합니다.
커널 환경변수들 활성화 또는 비활성하거나 특정 값으로 설정하기 위한 명령어와 환경설정 파일이 있습니다.
바로 sysctl 명령어와 /etc/sysctl.conf파일입니다. 사용법을 알아보겠습니다.

$ sysctl [옵션]
-a: 모든 커널 환경변수 및 설정값 출력
-a -r 문자열: 지정한 문자열이 들어간 커널 환경변수 및 설정값 출력(--pattern 문자열 | ^문자열 | 문자열$)
-n 매개변수: 지정한 커널 환경변수의 설정값 출력
-w 매개변수=값: 커널 환경변수의 값을 변경하고 부팅이 되어 있는 현재만 적용
-p: 커널 환경설정 파일(/etc/sysctl.conf)에 등록된 "환경변수 = 설정값" 적용 및 출력

자원 할당 및 관리, 네트워크 설정 항목 중 취약점 대응에 사용되는 커널 환경변수에 대해 알아보겠습니다.

  1. TCP SYN Flooding 대응: 서버의 Backlog Queue사이즈를 증가
    $ sysctl -w net.ipv4.tcp_max_syn_backlog=1024
    $ cat /proc/sys/net/ipv4/tcp_max_syn_backlog
    TCP SYN Flooding은 네트워크 공격 중 하나로, 공격자가 대량의 SYN 패킷을 보내어 서버의 TCP 연결 큐를 고갈시키는 방식입니다. 이 때, 서버의 TCP 연결 큐 크기를 증가시키는 것은 공격에 대한 대응책 중 하나일 수 있습니다. SYN 대기 큐 크기를 증가시키면 더 많은 연결 요청을 처리할 수 있어 공격에 대한 저항성이 향상됩니다. ss -n state syn-recv sport = :80 | wc -l 명령을 실행해서 TCP 80포트의 현재 backlog 크기를 확인할 수 있습니다.
  2. TCP SYN Flooding 대응: TCP SYN쿠키를 사용
    $ sysctl -w net.ipv4.tcp_syncookies=1
    $ cat /proc/sys/net/ipv4/tcp_syncookies
    SYN 쿠키는 서버가 클라이언트의 연결요청(SYN)에 응답하여 SYN/ACK 패킷를 보낼 때 클라이언트의 IP 주소 및 포트 번호와 같은 정보를 사용하여 생성한 특별한 해시 정보를 ISN(Initial Sequence Number)로 설정하여 클라이언트에게 전송합니다. 클라이언트는 이 정보를 사용하여 ACK 패킷을 생성하고 서버로 다시 보냅니다. 서버는 이 정보(클라이언트의 ACK패킷)를 받을 때까지 backlog queue에 연결 요청 정보를 담지 않고, 이를 사용하여 클라이언트의 상태를 확인하고 연결 요청의 유효성을 검사합니다.
  3. Ping of Death 대응: ICMP 패킷에 응답하지 못하도록 차단
    $ sysctl -w net.ipv4.icmp_echo_ignore_all=1
    $ cat /proc/sys/net/ipv4/icmp_echo_ignore_all
    Ping of Death는 ICMP Echo Request 메시지에 비정상적인 크기의 데이터를 포함하여 공격하는 기술입니다. 이는 네트워크 기기나 운영체제 등이 정상적인 ICMP 패킷 크기를 초과하는 패킷을 처리할 때 발생하는 취약점을 이용한 공격입니다. ICMP 응답을 비활성화함으로써 이 취약점을 차단하여 공격을 방어할 수 있습니다.
  4. Smurf Attack 대응: ICMP Directed Broadcast 패킷을 막도록 설정
    $ sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=1
    $ cat /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
    Smurf Attack는 공격자가 송신자 IP 주소를 피해자 IP로 변조하여 대량의 ICMP Echo Request 메시지를 브로드캐스트 주소로 전송하여 네트워크 상의 여러 호스트로 향하게 합니다. 브로드캐스트 주소로 전송된 ICMP Echo Request에 대한 응답으로 여러 호스트들이 응답하게 되므로, 피해자의 IP 주소로 향하는 트래픽을 증폭시키는 공격입니다.
  5. IP Spoofing 방지: Reverse Path Filtering 설정 활성화
    $ sysctl -w net.ipv4.conf.all.rp_filter=1
    $ cat /proc/sys/net/ipv4/conf/all/rp_filter
    IP Spoofing은 공격자가 자신의 실제 IP 주소를 숨기고, 다른 사용자의 IP 주소를 사용하여 네트워크로 데이터를 전송하는 공격 기법입니다. 이러한 공격을 통해 공격자는 자신을 다른 신뢰할 만한 사용자로 속일 수 있습니다. Reverse Path Filtering는 NIC를 통해 들어오는 패킷의 소스 IP 주소를 검사하여, 해당 패킷이 적절한 경로를 통해 들어왔는지 확인하는 보안 기능입니다. 특히 IP Spoofing은 시스템간 트러스트(신뢰) 관계를 이용하기 위해 사용되는 공격이기 때문에 rlogin/rsh/rcp와 같은 명령어의 IP인증을 공격합니다.(r계열의 명령에서는 두 호스트가 신뢰하고 있다는 것을 /etc/hosts.equiv, $HOME/.rhosts 파일들에 등록합니다.) 추가적인 대응 방안으로 IP로 인증하는 서비스를 차단하거나 내부망 IP주소를 가지고 들어오는 패킷 차단합니다.
  6. IP Forwarding 비활성화: 네트워크 스니핑, 릴레이 공격, IP 스푸핑 공격 등을 방지
    $ sysctl -w net.ipv4.ip_forward=0
    $ sysctl -w net.ipv6.conf.all.forwarding=0
    $ cat /proc/sys/net/ipv4/ip_forward
    $ cat /proc/sys/net/ipv6/conf/all/forwarding
    IP Forwarding을 비활성화하면 네트워크에서 발생할 수 있는 몇 가지 위협이나 취약점에 대응할 수 있습니다. 중간에 위치한 시스템이 패킷을 전달하지 않기 때문에 네트워크 Sniffing이나 릴레이 공격을 어렵게 만듭니다. 또한 외부에서 내부로의 패킷이 내부 네트워크의 정상적인 시스템으로 릴레이되는 것을 방지하여 IP 스푸핑 공격을 어렵게 만들고, DDoS 공격으로부터 네트워크를 보호할 수 있습니다.
  7. ICMP Redirects 거부: 불필요한 라우팅 정보가 주입되는 것을 방지
    $ sysctl -w net.ipv4.conf.all.accept_redirects=0
    $ sysctl -w net.ipv4.conf.default.send_redirects=0
    $ cat /proc/sys/net/ipv4/conf/all/accept_redirects
    $ cat /proc/sys/net/ipv4/conf/default/send_redirects
    ICMP Redirects를 거부하여 라우팅 정보에 대한 변경을 방지할 수 있습니다. 이 조치는 잠재적인 라우팅 공격으로부터 시스템을 보호하는 데 도움이 됩니다.
  8. IP Source Routing 기능 비활성화: IP옵션 헤더를 사용해서 출발지에서 직접 경로를 지정할 수 없도록 차단
    $ sysctl -w net.ipv4.conf.all.accept_source_route=0
    $ cat /proc/sys/net/ipv4/conf/all/accept_source_route
    IP source routing 기능은 호스트나 라우터에 설정된 라우팅 경로를 이용하지 않고 IP 홉션 헤더를 이용하여 출발지에서 직접 경로를 지정하는 방식으로 외부에서 직접 접근이 불가능한 내부 시스템에 우회하여 접근할 수 있는 보안상 문제점이 있습니다.
  9. TCP 연결의 비활성화 감지 및 대응: tcp_keepalive 관련 환경변수 설정
    $ sysctl -w net.ipv4.tcp_keepalive_time=300
    $ sysctl -w net.ipv4.tcp_keepalive_probes=5
    $ sysctl -w net.ipv4.tcp_keepalive_intvl=15
    $ cat /proc/sys/net/ipv4/tcp_keepalive_time
    $ cat /proc/sys/net/ipv4/tcp_keepalive_probes
    $ cat /proc/sys/net/ipv4/tcp_keepalive_intvl
    TCP Keepalive 관련 변수를 설정하면 네트워크 연결의 안정성을 유지하고 불필요한 불활성 연결로 인한 리소스 소모를 방지할 수 있습니다. 특히 네트워크 환경이나 연결이 불안정한 경우, 이러한 설정을 튜닝함으로써 안정성을 향상시킬 수 있습니다.
  10. Buffer Overflow 대응: 랜덤 스택 & 라이브러리 & 힙 활성화(동적할당)
    $ sysctl -w kernel.randomize_va_space=2
    $ cat /proc/sys/kernel/randomize_va_space
    kernel.randomize_va_space는 리눅스 커널의 가상 주소 공간의 무작위화 여부를 결정하는 환경변수입니다. 이 변수는 ASLR (Address Space Layout Randomization) 기능을 제어하며, 시스템의 보안을 강화하기 위해 사용됩니다.

위 제시된 커널 환경변수를 일괄적으로 반영하기 위해서는 /etc/sysctl.conf 파일에 반영한 후 sysctl -p명령어를 실행하시면 됩니다.

$ cat /etc/sysctl.conf | grep -v "^#"
net.core.rmem_default = 33554432
net.core.rmem_max = 33554432
net.ipv4.tcp_max_syn_backlog=1024
net.ipv4.tcp_syncookies=1
net.ipv4.icmp_echo_ignore_all=1
net.ipv4.icmp_echo_ignore_broadcasts=1
net.ipv4.conf.all.rp_filter=1
net.ipv4.ip_forward=0
net.ipv6.conf.all.forwarding=0
net.ipv4.conf.all.accept_redirects=0
net.ipv4.conf.default.send_redirects=0
net.ipv4.conf.all.accept_source_route=0
net.ipv4.tcp_keepalive_time=300
net.ipv4.tcp_keepalive_probes=5
net.ipv4.tcp_keepalive_intvl=15
kernel.randomize_va_space=2

다양한 커널 환경변수가 궁금하시다면 Sysctl Explorer 사이트를 방문해 보세요. 커널 환경변수들의 역할에 대한 설명을 보실 수 있습니다. 저도 틈틈이 방문해서 커널 환경변수에 대해 더 많이 알아볼 예정입니다.

You may also like...

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다