본문 바로가기
my_lesson/_Vi

Linux - 보안 firewall 방화벽 설정 및 특정포트 열기(개방)

by boolean 2015. 12. 20.
728x90

Linux - 보안 firewall 방화벽 설정 및 특정포트 열기(개방)

17) 보안설정 - PHP 가 아닌 파일 실행 차단 (이미 적용되어 있음. 취약하지 않음.) 위의 세팅에는 2중 보안이 되어있기 때문에 취약하지 않다. nginx 에서 한번 필터링을 하고(if 구문), php-fpm 에서 한번 더 확장자 검사 (PHP 5.3.9 이상버전은 .php 만 실행됨)를 한다. https://www.nginx.com/resources/wiki/start/topics/examples/phpfcgi/ 가장 하단의 Note 항목을 참조하세요. http://php.net/manual/kr/install.fpm.configuration.php 페이지의 security.limit_extensions 항목을 참조하세요. - 기본 사이트 차단 어느 하나의 웹 호스트로 해당되지 않으면 default 파일로 연결된다. 이것을 아예 차단해 보자. 즉 유효한 도메인의 요청이 아니면 응답을 하지 않는다. # vi /etc/nginx/conf.d/default.conf server { listen 80 default_server; server_name localhost; root /usr/share/nginx/html; # Deny all except me. if ($remote_addr != 123.456.123.456) { return 444; } location / { index index.php index.html; } location ~ [^/]\.php(/|$) { fastcgi_split_path_info ^(.+?\.php)(/.*)$; if (!-f $document_root$fastcgi_script_name) { return 404; } fastcgi_pass unix:/run/php/php7.0-fpm.sock; fastcgi_index index.php; include fastcgi_params; } } # service nginx reload 그 외에 딱히 중요한 보안 이슈는 없는듯 하다. 옵션) 방화벽 적용하기. * 접속자의 IP 가 고정되어 있으면 아래와 같이 방화벽 세팅을, 웹호스팅 서비스와 같이 접속자의 IP를 특정할 수 없으면 fail2ban 을 (http://blog.lael.be/post/858#fail2ban) 사용하세요. 저의 경우 몇대의 단독 VPN 서버가 있으며(즉 어느 위치에 있든지 고정IP 로 활동할 수 있음) 해당 IP 를 방화벽 예외로 설정해 두곤 합니다. 당연한 이야기지만 Ubuntu 에도 방화벽이 있습니다. 무척 당연한 이야기지만 방화벽을 사용하면 서버 보안이 매우 많이 향상됩니다. 현재 방화벽 설정 보기. (List) #iptables -L 스크린샷 2015-12-15 오전 1.58.42 INPUT (서버로 들어오는 것 관리), FORWARD (서버에서 내부망으로 연결관리;잘 안씀), OUTPUT (서버에서 나가는 것 관리) 로 이루어져 있다. 보통 FORWARD와 OUTPUT은 건들이지 않고 INPUT 만 수정한다. policy ACCEPT 라는 뜻은 아무 조건도 해당하지 않았을 때 ACCEPT 하라는 것이다. 먼저 현재 방화벽 설정을 파일로 저장한다. 언제든 현재의 상태로 되돌릴 수 있기 위해서 이다. #cd ~ #mkdir firewall_rules #cd firewall_rules #iptables-save > 151214.rules 현재 날짜 쓰세요. 이제 방화벽을 복구해 보자. #iptables-restore < 151214.rules #iptables -L >>설정 시작. 규칙 : 아이피 111.222.111.222 에 대해서 destination port 가 22 이면 ACCEPT 하여라. #iptables -A INPUT -s 111.222.111.222/32 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT 아이피 바꾸지 마시고 위의 예시 (111.222.111.222) 그대로 입력하세요. #iptables -L 스크린샷 2015-12-15 오전 2.04.49 이제 현재 상태에 대해서 방화벽 설정파일을 다시 생성해보도록 하자. #iptables-save > 151214.rules FTP나 vi, cat 으로 해당 151214.rules 를 열어보자. 열고나서 코드의 뜻을 대충 해석해보아라. (간단하다.) 하단 *filter 부분에 -A INPUT -s 111.222.111.222/32 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT 가 보이는가? 여러분은 이곳에 아래의 코드를 집어넣어야 한다. 순서가 중요하다. IF-ELSE 같이 동작하기 때문에 조건에 맞으면 바로 지정된 동작을 한다. 211.105.192.168 아이피만 지정하고 싶을 때 -> -s 211.105.192.168/32 211.105.192.* 아이피 그룹을 지정하고 싶을 때 -> -s 211.105.192.0/24 211.105.*.* 아이피 그룹을 지정하고 싶을 때 -> -s 211.105.0.0/16 목적지 포트가 22번(ssh) 포트일 때 -> -dport 22 목적지 포트가 80번(http) 포트일 때 -> -dport 80 목적지 포트가 443번(https) 포트일 때 -> -dport 443 아래는 1. 이미 연결된 것은 허용 2. ping 허용 3. loopback 허용 4. 111.222.111.222 의 22번 포트 접근 허용 5. 123.111.123.111 의 22번 포트 접근 허용 6. 80 포트 접근 허용 (-s 옵션이 없으므로 누구나 허용) 7. 차단 8. FORWARD 차단 의 코드이다. 아까 생성한 .rules 파일을 열어서 아래의 코드를 그림과 같이 코드를 추가하여라. 이때 반드시 당신의 아이피를 추가하여라. 추가가 잘못되어도 어차피 1번의 조건에 의해서 당신의 연결이 끊기지는 않겠지만 새로운 연결은 차단될 것이다. -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -s 111.222.111.222/32 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT -A INPUT -s 123.111.123.111/32 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -j REJECT --reject-with icmp-host-prohibited 스크린샷 2015-01-23 오전 2.18.26 #iptables-restore < 151214.rules #iptables -L !!!반드시 현재 쉘 연결을 끊지 말고!!! 현재 연결은 1번 조건에 의해서 반드시 허용이기 때문에 괜찮다. 새로 연결창 띄워서 테스트해 보아라. 만약 원하는대로 동작하지 않는다면 다시 .rules 파일을 수정하고 iptables-restore 하여라. 방화벽 설정이 머리가 아프다면 # iptables -F 로 초기화 하고 내일 다시 시도해 보아라. 이 설정은 재부팅이 되면 초기화 된다. 설정을 지속시키도록 하자. iptables-persistent 설치 스크린샷 2015-01-23 오전 3.13.35 #apt-get install iptables-persistent Yes (엔터), Yes (엔터) /etc/iptables 라는 폴더가 생성되고 rules.v4, rules.v6 가 생성된다. 부팅시 실행되는 파일을 갱신하자. #iptables-save > /etc/iptables/rules.v4 ipv6 차단하기 #vi /etc/sysctl.conf 맨 밑에 net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1 net.ipv6.conf.lo.disable_ipv6 = 1 추가. 설정파일 적용 #sysctl -p 검사 #cat /proc/sys/net/ipv6/conf/all/disable_ipv6 1 이면 disable 된 상태이다. 스크린샷 2015-12-15 오전 2.19.35 재부팅 #reboot Cloud Init Bug로 인해 일부 클라우드에서 문제가 발생할 수도 있습니다. 일부 Cloud Hosting 에서 의 IPv6 를 Disable 한 경우, 또는 아무것도 하지 않아도 cloud-init-nonet error 가 뜨면서 IP 정보를 가져오지 못하는 경우가 있습니다. (ConoHa 클라우드 및 KS클라우드에서 확인 했음.) 이 경우 ipv6 dhcp 관련 구문을 주석처리 해 주어야 합니다. # vi /etc/network/interfaces 스크린샷 2015-12-15 오후 3.39.09 재부팅 #reboot 재부팅 후에 방화벽 규칙이 유지가 되면 성공이다. #iptables -L

우분투의 기본적인 방화벽은 UFW입니다. 이는 iptables를 좀 더 쉽게 설정할 수 있도록 한 것인데 간단한 방화벽 구성에는 문제가 없지만 수준 높은 방화벽 구성에는 iptables 룰을 직접 사용해야 합니다.

참고 : 우분투 UFW help 가이드

UFW 사용법

UFW 기본 설정법에 대하여 알아보자.

UFW 활성화/비활성화

UFW는 기본 비활성화 상태이기에 이를 활성화 한다.

BASH
sudo ufw enable

UFW 비활성화

BASH
sudo ufw disable

UFW 상태 확인

BASH
sudo ufw status verbose

UFW 기본 룰

UFW에 설정되어 있는 기본 룰은 아래와 같다.

  • 들어오는 패킷에 대해서는 전부 거부(deny)
  • 나가는 패킷에 대해서는 전부 허가(allow)

기본 룰 확인

BASH
sudo ufw show raw

기본 정책 차단

BASH
sudo ufw default deny

기본 정책 허용

BASH
sudo ufw default allow

UFW 허용과 차단

UFW 허용

sudo ufw allow <port>/<optional: protocal>

예) SSH 포트 22번 허용(tcp/udp 22번 포트를 모두 허용)

BASH
sudo ufw allow 22

tcp 22번 포트만을 허용 - SSH는 tcp 22번 포트만 허용하는게 정답

BASH
sudo ufw allow 22/tcp

udp 22번 포트만을 허용

BASH
sudo ufw allow 22/udp

UFW 거부

sudo ufw deny <port>/<optional: protocol>

예) ssh 포트 22번 거부(tcp/udp 22번 포트를 모두 거부)

BASH
sudo ufw deny 22

tcp 22번 포트만을 거부

BASH
sudo ufw deny 22/tcp

udp 22번 포트만을 거부

BASH
sudo ufw deny 22/udp

UFW 룰의 삭제

ufw deny 22/tcp 설정이 되어있다고 가정

BASH
sudo ufw delete deny 22/tcp

service 명을 이용한 설정

/etc/services에 지정되어 있는 서비스명과 포트를 이용해 UFW를 설정할 수 있다.

서비스명 보기

BASH
less /etc/services

서비스명으로 허용

sudo ufw allow <service name>

예) SSH 서비스

BASH
sudo ufw allow ssh
sudo ufw deny ssh

UFW 로그 기록

BASH
sudo ufw logging on
sudo ufw logging off

Advanced Syntax

문법을 확장하여 목적지 주소와 포트, 프로토콜등을 지정할 수 있다.

특정한 IP 주소 허가/거부

특정한 IP주소 허용

sudo ufw allow from <ip address>

예) 192.168.0.100 주소 허용(IP 주소192.168.0.100 에서만 접속이 가능해진다)

BASH
sudo ufw allow from 192.168.0.100

네트워크 단위로 지정하여 같은 네트워크 상에 있는 컴퓨터들은 접속가능해진다.

BASH
sudo ufw allow from 192.168.0.0/24

특정 IP 주소와 일치하는 포트 허용

sudo ufw allow from <ip address> to <protocol> port <port number>

예) 192.168.0.100 주소와 포트, 프로토콜 허용

BASH
sudo ufw allow from 192.168.0.100 to any port 22

특정 IP 주소와 프로토콜, 포트 허용

$ sudo ufw allow from <ip address> to <protocol> port <port number> proto <protocol name>

예) 192.168.0.100 주소와 tcp 프로토콜 22번 포트 허용

BASH
sudo ufw allow from 192.168.0.100 to any port 22 proto tcp

위의 예제들에서 allow 대신 deny를 입력하면 거부가 된다.

ping (icmp) 허용/거부

UFW 기본설정은 ping 요청을 허용하도록 되어있다.

BASH
sudo vi /etc/ufw/before.rules

   # ok icmp codes
  -A ufw-before-input -p icmp --icmp-type destination-unreachable -j ACCEPT
  -A ufw-before-input -p icmp --icmp-type source-quench -j ACCEPT
  -A ufw-before-input -p icmp --icmp-type time-exceeded -j ACCEPT
  -A ufw-before-input -p icmp --icmp-type parameter-problem -j ACCEPT
  -A ufw-before-input -p icmp --icmp-type echo-request -j ACCEPT

위 코드들의 ACCEPT 부분을 모두 DROP으로 변경하거나 삭제하면 ping 요청을 거부하게 된다.

ufw numbered rules

UFW 룰들에 숫자를 붙여서 볼 수 있다. 이를 이용해 룰에 수정이나 삭제, 추가를 할 수 있다.

ufw number 보기

BASH
sudo ufw status numbered

ufw numbered 수정

BASH
sudo ufw delete 1
sudo ufw insert 1 allow from 192.168.0.100

추천 방화벽 정책

BASH
sudo ufw enable
sudo ufw allow from 192.168.0.3 to any port 22 proto tcp
sudo ufw allow 123/udp
sudo ufw allow 80/tcp
sudo ufw allow 3306/tcp
sudo ufw status

댓글