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는 기본 비활성화 상태이기에 이를 활성화 한다.
BASHsudo ufw enable
UFW 비활성화
BASHsudo ufw disable
UFW 상태 확인
BASHsudo ufw status verbose
UFW 기본 룰
UFW에 설정되어 있는 기본 룰은 아래와 같다.
- 들어오는 패킷에 대해서는 전부 거부(deny)
- 나가는 패킷에 대해서는 전부 허가(allow)
기본 룰 확인
sudo ufw show raw
기본 정책 차단
sudo ufw default deny
기본 정책 허용
sudo ufw default allow
UFW 허용과 차단
UFW 허용
sudo ufw allow <port>/<optional: protocal>
예) SSH 포트 22번 허용(tcp/udp 22번 포트를 모두 허용)
sudo ufw allow 22
tcp 22번 포트만을 허용 - SSH는 tcp 22번 포트만 허용하는게 정답
sudo ufw allow 22/tcp
udp 22번 포트만을 허용
sudo ufw allow 22/udp
UFW 거부
sudo ufw deny <port>/<optional: protocol>
예) ssh 포트 22번 거부(tcp/udp 22번 포트를 모두 거부)
sudo ufw deny 22
tcp 22번 포트만을 거부
sudo ufw deny 22/tcp
udp 22번 포트만을 거부
sudo ufw deny 22/udp
UFW 룰의 삭제
ufw deny 22/tcp 설정이 되어있다고 가정
sudo ufw delete deny 22/tcp
service 명을 이용한 설정
/etc/services에 지정되어 있는 서비스명과 포트를 이용해 UFW를 설정할 수 있다.
서비스명 보기
less /etc/services
서비스명으로 허용
sudo ufw allow <service name>
예) SSH 서비스
sudo ufw allow ssh
sudo ufw deny ssh
UFW 로그 기록
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 에서만 접속이 가능해진다)
sudo ufw allow from 192.168.0.100
네트워크 단위로 지정하여 같은 네트워크 상에 있는 컴퓨터들은 접속가능해진다.
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 주소와 포트, 프로토콜 허용
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번 포트 허용
sudo ufw allow from 192.168.0.100 to any port 22 proto tcp
위의 예제들에서 allow 대신 deny를 입력하면 거부가 된다.
ping (icmp) 허용/거부
UFW 기본설정은 ping 요청을 허용하도록 되어있다.
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 보기
sudo ufw status numbered
ufw numbered 수정
sudo ufw delete 1
sudo ufw insert 1 allow from 192.168.0.100
추천 방화벽 정책
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
'my_lesson > _Vi' 카테고리의 다른 글
Vim - Vi 편집기 시작_ [표시:marking, 버퍼:buffer] (0) | 2016.01.14 |
---|---|
Vim - Vi 복사 붙이기 합치기 (0) | 2016.01.12 |
Vim - Vi 편집기 시작_ [커서이동 화면이동,선택]대소문자 주의 (0) | 2016.01.12 |
Vim - Vi 편집기 시작_ [문서열기 새문서 작성] (1) | 2016.01.11 |
VI - JAVA 자동완성 풀러그인 (0) | 2016.01.07 |
댓글