중요

본 작업은 서버 콘솔에서 작업하기를 권합니다. 만약 원격에서 하는경우 매우 신중하게 해야 합니다. SSH설정을 드랍하고 새로운 제한을 추가 한것을 적용했다가 IP나 문법이 잘못 적용된 경우 원격에서 접속이 불가능한 상태가 되어 버릴 수 있습니다. 결국 야밤에 택시타고 IDC로 달려가는 귀찮은 경험을 하고 싶지 않으면 매우 신중하게 하고 작업 후 반드시 외부 접속을 테스트 해보기를 권합니다.


이전 포스트에서도 언급 한 적 있지만 CentOS 최근 버전부터 기존 방화벽인 iptables를 좀 더 쉽게(?) 사용 할 수 있도록 개선한 firewalld 가 제공되고 있습니다.

(firewalld 방화벽에 대한 소개는 https://sepiros.tistory.com/7 에 잘 되어 있습니다.)


설정 파일을 xml 형태로 확인 가능하고 그 xml 파일을 직접 편집해서 룰을 추가 가능하며 기존 iptables  처럼 명령라인으로도 조작 가능합니다.


방화벽이 불편하다고 제대로 설정하지 않거나 서비스를 내려놓고 서비스를 한다면 머지않아 외부에서 침투해서 불순한 목적의 프로세스가 실행되어 엄청난 트래픽이 발생하고, 급기야 IDC 관제실로 부터 랜포트를 제거 한다는 신박한 연락을 받는 경험을 할 수도 있을것 입니다. Traffic Shared 회선을 사용하는 경우 같은 대역폭을 사용하는 타 업체에게 엄청난 민폐를 끼치고 끝나지만, 종량제를 사용하는 경우 트래픽 사용료 폭탄을 맞을 수도 있습니다.

그리고 한번 외부에 털린(?) 서버는 백프로 다음 접근을 위해 백도어가 설치되었다고 보는게 맞을 것이며, 상대도 최대한 들키지 않도록 백도어를 꽁꽁 숨겨놓아서 그것을 찾아서 깨끗이 제거하는 것은 결코 쉬운일이 아닙니다. 결국 꼭 필요한 소스만 백업받고 서버를 재설치 하는 경우를 많이 보아왔습니다.

이런 문제는 실제 서비스를 운영하고 있는 서버라면 엄청난 리스크이자 시스템 엔지니어에게는 크나큰 스트래스입니다. 그러므로 꼭 필요한 포트와 접근 가능한 IP를 지정 하도록 하는 습관을 들이도록 권합니다.


방화벽 설정에 대한 기본 지식은

https://www.lesstif.com/pages/viewpage.action?pageId=22053128

이곳을 참고 하도록 하고 여기서는 우리서버의 외부 접근을 모두 차단하고

1. http (80)는 모든 곳에서 접근 할 수 있도록

2. ssh(21), mysql(3306)은 내부망(192.168.0.*)과 특정 IP(xxx,xxx.xxx.xxx)에서만 접근 가능

두가지를 설정해 보겠습니다.

[root@localhost ~]# firewall-cmd --get-default-zone

public

[root@localhost ~]#

현재 우리 서버의 기본 방화벽 존은 public 으로 되어 있습니다.

영구(permanent) 등록된 서비스를 확인해 보겠습니다.

[root@localhost ~]# firewall-cmd --permanent --list-all --zone=public

public

  target: default

  icmp-block-inversion: no

  interfaces:

  sources:

  services: dhcpv6-client ssh

  ports:

  protocols:

  masquerade: no

  forward-ports:

  source-ports:

  icmp-blocks:

  rich rules:


[root@localhost ~]#

기본적으로 IPV6 DHCP 클라이언트와 SSH 가 허용되어 있습니다.

이것은 아래와 같이 xml 파일로도 확인 가능합니다.

[root@localhost ~]# cat /etc/firewalld/zones/public.xml

<?xml version="1.0" encoding="utf-8"?>

<zone>

  <short>Public</short>

  <description>For use in public areas. You do not trust the other computers on networks to not harm your computer...</description>

  <service name="dhcpv6-client"/>

  <service name="ssh"/>

</zone>

[root@localhost ~]#

DHCP 클라이언트는 그냥 두고 어디서나 제한 없이 SSH 접속 할 수 있도록 되어있는 것을 내부망(192.168.0.*) 특정 IP xxx.xxx.xxx.xxx에서만 접근 가능 하도록 변경하고 역시 같은 곳에서 mysql(3306)으로 연결 할 수 있도록 설정 해보겠습니다.

그리고 끝으로 어디서나 제한 없이 http로 접근 할 수 있도록 설정을 추가 하도록 설정 해보겠습니다.

[root@localhost ~]# firewall-cmd --permanent --zone=public --remove-service=ssh

success

[root@localhost ~]# firewall-cmd --permanent --zone=public --add-rich-rule="rule family='ipv4'  source address='192.168.0.0/24'  service name='ssh' accept"

success

[root@localhost ~]# firewall-cmd --permanent --zone=public --add-rich-rule="rule family='ipv4'  source address='xxx.xxx.xxx.xxx'  service name='ssh' accept"

success

[root@localhost ~]# firewall-cmd --permanent --zone=public --add-rich-rule="rule family='ipv4'  source address='192.168.0.0/24'  port protocol='tcp' port='3306' accept"

success

[root@localhost ~]# firewall-cmd --permanent --zone=public --add-rich-rule="rule family='ipv4'  source address='xxx.xxx.xxx.xxx'  port protocol='tcp' port='3306' accept"

success

[root@localhost ~]# firewall-cmd --permanent --zone=public --remove-service=http

설정이 제대로 되었는디 확인해 보겠습니다.

[root@localhost ~]# cat /etc/firewalld/zones/public.xml

<?xml version="1.0" encoding="utf-8"?>

<zone>

  <short>Public</short>

  <description>For use in public areas. You do not trust the other computers on networks to not harm your computer...</description>

  <service name="dhcpv6-client"/>

  <service name="http"/>

  <rule family="ipv4">

    <source address="192.168.0.0/24"/>

    <service name="ssh"/>

    <accept/>

  </rule>

  <rule family="ipv4">

    <source address="192.168.0.0/24"/>

    <port protocol="tcp" port="3306"/>

    <accept/>

  </rule>

  <rule family="ipv4">

    <source address="xxx.xxx.xxx.xxx"/>

    <service name="ssh"/>

    <accept/>

  </rule>

  <rule family="ipv4">

    <source address="xxx.xxx.xxx.xxx"/>

    <port protocol="tcp" port="3306"/>

    <accept/>

  </rule>

</zone>

[root@localhost ~]#

잘 적용 된것 같습니다.

이제 방화벽 정책에 반영하겠습니다.

[root@localhost ~]# firewall-cmd --reload

success

[root@localhost ~]# netstat -ntl

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address           Foreign Address         State

tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN

tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN

tcp6       0      0 :::3306                 :::*                    LISTEN

tcp6       0      0 :::22                   :::*                    LISTEN

tcp6       0      0 ::1:25                  :::*                    LISTEN

[root@localhost ~]#


netstat 명령으로 포트 오픈 상태를 확인 할 수 있습니다. mysql 과 ssh 데몬이 실행 되고 있다면 위와 같은 결과가 나올 것입니다.

http (80)은 아직 포트를 listen 하고 있는 데몬이 없어서 활성화 되지 않았습니다.

접속 확인은 다른 SSH  창을 열고 접속 해보시고 잘 되었다면  MySQL 접속도 테스트 해보시면 됩니다.


여기까지 CentOS 7 minimal 설치 에 대한 포스팅을 마칩니다.



+ Recent posts