본문 바로가기

Linux/보안

시스템 보안 - Kernel tuning


1. ping 에 의한 icmp 패킷 응답 여부를 설정

- 공격자들은 ping을 통한 icmp 패킷의 응답을 통하여 대상 시스템을 확인한다. 또 ping 명령으로 DOS 공격도 가능하다.
그러므로 관리자는 icmp 패킷을 무시하도록 하는 것이 좋다.

 
[root@server3 ~]# cat /proc/sys/net/ipv4/icmp_echo_ignore_all - 기본 설정값은 0 이다.
0
[root@server3 ~]# ping 10.10.33.101 - ping을 보내면 응답이 온다.
PING 10.10.33.101 (10.10.33.101) 56(84) bytes of data.
64 bytes from 10.10.33.101: icmp_seq=1 ttl=64 time=1.76 ms
64 bytes from 10.10.33.101: icmp_seq=2 ttl=64 time=0.128 ms

--- 10.10.33.101 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.128/0.944/1.760/0.816 ms

[root@server3 ~]# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
[root@server3 ~]# cat /proc/sys/net/ipv4/icmp_echo_ignore_all
1
[root@server3 ~]# ping 10.10.33.101 - 기본 설정값을 1로 변경해 주면 ping 시 응답이 없어진다.
PING 10.10.33.101 (10.10.33.101) 56(84) bytes of data.

--- 10.10.33.101 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 1999ms

[root@server3 ~]# vi /etc/sysctl.conf - sysctl.conf 파일은 커널의 매개변수를 설정하는 파일이다.
      1 # Kernel sysctl configuration file for Red Hat Linux
      2 #
      3 # For binary values, 0 is disabled, 1 is enabled.  See sysctl(8) and
      4 # sysctl.conf(5) for more details.
      5
      6 # Controls IP packet forwarding
      7 net.ipv4.ip_forward = 0
      8
      9 # Controls source route verification
     10 net.ipv4.conf.default.rp_filter = 1
     11
     12 # Do not accept source routing
     13 net.ipv4.conf.default.accept_source_route = 0
     14
     15 # Controls the System Request debugging functionality of the kernel
     16 kernel.sysrq = 0
     17
     18 # Controls whether core dumps will append the PID to the core filename
     19 # Useful for debugging multi-threaded applications
     20 kernel.core_uses_pid = 1
     21
     22 # Controls the use of TCP syncookies
     23 net.ipv4.tcp_syncookies = 1
     24
     25 # Controls the maximum size of a message, in bytes
     26 kernel.msgmnb = 65536
     27
     28 # Controls the default maxmimum size of a mesage queue
     29 kernel.msgmax = 65536
     30
     31 # Controls the maximum shared segment size, in bytes
     32 kernel.shmmax = 4294967295
     33
     34 # Controls the maximum number of shared memory segments, in pages
     35 kernel.shmall = 268435456
     36
     37 #icmp packet setting
     38 net.ipv4.icmp_echo_ignore_all = 1 - 디렉토리 구분자는 ' / ' 대신 ' . '으로 대체한다. 추가해주면 시스템 재시작시에도 적용된다.

[root@server3 ~]# sysctl -p   - 리부팅 안하고 바로 적용 및 확인
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 4294967295
kernel.shmall = 268435456
net.ipv4.icmp_echo_ignore_all = 1 - 설정값이 제대로 적용되었는지 확인 할 수 있다.




2. 시스템의 ip포워딩 기능 가능 여부를 설정

- 하나의 서버에서 IP를 공유하여 IP 포워딩 기능을 사용할 경우 기능을 활성화 한다.

 
[root@server3 ~]# cat /proc/sys/net/ipv4/ip_forward
0
- 방화벽에서 ip forwarding기능을 사용한다면 1로 설정해야 하지만 사용하지 않는다면 0 으로 설정해 놓으면 된다.


- 만약 하나의 서버에서 IP를 공유하여 IP포워딩 기능을 사용할 경우 1로 설정해 준다.
[root@server3 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
[root@server3 ~]# vi /etc/sysctl.conf
# Controls IP packet forwarding
net.ipv4.ip_forward = 1   - 설정값을 수정해 준다.
[root@server3 ~]# sysctl -p




3. 브로드캐스트 주소에 icmp 패킷 응답 여부를 설정

- DOS 공격의 하나로 공격자가 Source IP address를 target 으로 위장한 후 broadcast address로 icmp 패킷을 보내면 그 해당 네트워크에서 icmp request를 보내어 target이 정상적인 서비스를 할 수 없도록 만드는 공격방법으로 smurf attack이라고도 하며 이 공격에 대처하기 위해 브로드캐스트 주소의 icmp 패킷을 무시하도록 설정한다. 이를 해결하기 위해서 네트워크 라우터에서 IP 브로드캐스트 주소를 사용할 수 없게 설정하면 된다.

 
[root@server3 ~]# cat /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts  - 기본값(= 1)은 패킷 응답 여부를 무시한다.
1


- 설정값이 1이 아닌 경우 1로 설정해 준다.
[root@server3 ~]# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts - 설정값을 1로 설정해준다.
[root@server3 ~]# vi /etc/sysctl.conf
#broadcasts setting
net.ipv4.icmp_echo_ignore_broadcasts = 1
[root@server3 ~]# sysctl -p




4. TCP 세션 종료 후 세션연결 유지 시간 설정

- TCP 세션 종료 후 세션연결 유지 시간 설정으로 초 단위 값으로 설정되어 있으며 기본값은 60초이다.
서버에 접속하다가 예기치 못한 상태에서 연결이 종료되었을 경우 연결 상태 지속여부를 지정한다.
10-20초로 설정해도 무방하다.

 
[root@server3 ~]# cat /proc/sys/net/ipv4/tcp_fin_timeout
60
[root@server3 ~]# echo 20 > /proc/sys/net/ipv4/tcp_fin_timeout
[root@server3 ~]# vi /etc/sysctl.conf
# tcp fin timeout setting
net.ipv4.tcp_fin_timeout = 20
[root@server3 ~]# sysctl -p




5. TCP 연결 상태를 계속 유지시키기 위한 시간 설정

- TCP 연결 상태를 게속 유지시키기 위한 시간 설정값으로 기본 초 단위로 7200초(2시간)이다.
2-30분 정도만 설정해도 서버 자원을 효율적으로 사용할 수 있다.

 
[root@server3 ~]# cat /proc/sys/net/ipv4/tcp_keepalive_time
7200
[root@server3 ~]# echo 1800 > /proc/sys/net/ipv4/tcp_keepalive_time
[root@server3 ~]# vi /etc/sysctl.conf
# tec keepalive time setting
net.ipv4.tcp_keepalive_time = 1800
[root@server3 ~]# sysctl -p




6. syn 패킷의 도착 빈도가 많을 경우 해당 요청에 대한 무시 여부를 설정

- TCP 프로토콜에서 시스템이 연결되려면 클라이언트 연결요청(SYN패킷), 서버응답(SYN/ACK 패킷), 클라이언트 응당(ACK 패킷) 후 연결이라는 3-WAY HANDSHAKE 방식을 이용하는데 공격자는 존재하지 않는 IP 주소를 source address 로 이용하여 SYN 패킷을 Target에 전송하면 Target에서는 SYN/ACK 패킷을 보내고 SYN_RCVD 상태로 전환한다. 하지만 존재하지 않는 IP주소에서 패킷을 보냈으므로 클라이언트쪽 ACK 패킷이 응답하지 않으므로 Target 은 일정 시간 패킷을 보내면서 SYN_RCVD 상태로 대기하게 되고, TCP Connection pool 이 꽉차게 되어 새로운 커넥션을 생성하지 못하게 되어 다른 클라이언트 연결요청을 거부하게 된다. 이러한 공격을 SYN Flooding 공격이라고 한다. 이러한 공격에 응답하지 않기 위해 설정한다.

 
[root@server3 ~]# cat /proc/sys/net/ipv4/tcp_syncookies
1
[root@server3 ~]# echo 1 > /proc/sys/net/ipv4/tcp_syncookies
[root@server3 ~]# vi /etc/sysctl.conf
# tcp_syncookies setting
net.ipv4.tcp_syncookies = 1
[root@server3 ~]# sysctl -p




7. 한 소켓에 동시에 syn 요청을 처리하는 backing 길이를 설정

- TCP프로토콜에서 한 소켓이 동시에 SYN 요청을 처리하는 한계가 백로그(backlog) 인데, 백로그는 연결요청이 완전히 처리되지 않은 대기상태의 큐의 길이이다.
이 백로그 큐가 차게되면 SYN 요청은 무시되어 서비시를 거부하게 되는데 이 큐의 길이를 지정할 수 있다. 보통 1024 값으로 사용한다.


 
[root@server3 ~]# cat /proc/sys/net/ipv4/tcp_max_syn_backlog
1024
[root@server3 ~]# echo 1024 > /proc/sys/net/ipv4/tcp_max_syn_backlog
[root@server3 ~]# vi /etc/sysctl.conf
# tcp_max_syn_backlog
net.ipv4.tcp_max_syn_backlog = 1024
[root@server3 ~]# sysctl -p




8. 자신의 네트워크가 스푸닝된 공격지의 IP소스로 쓰이는 것을 차단

- IPV4 에서는 source IP address 를 조작 할 수 가 있는데 자신의 IP를 속여 다른 시스템에 접근 하는 것을 IP spoofing이라고 하는데
이러한 공격을 rp_filter 는 패킷이 들어오는 인터페이스와 나가는 인터페이스가 같은지를 검사한다.


 
[root@server3 ~]# cat /proc/sys/net/ipv4/conf/all/rp_filter
0
[root@server3 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter
[root@server3 ~]# vi /etc/sysctl.conf
# Controls source route verification
net.ipv4.conf.all.rp_filter = 1
[root@server3 ~]# sysctl -p