Ubuntu를 사용하여 개인 Server를 운영하거나, NAS로 만들어서 외부에서 접속이 가능하도록 DDNS로 설정하여 사용하는 경우가 종종 있는 것 같습니다.

이번 Post에서는 Ubuntu가 설치된 Server가 외부 접속과 연결되어 있을 경우, 좀 더 안전하게 Server 운영을 할 수 있는 방법에 대해 몇 가지 알아봅니다.

1. Firewall

Linux의 핵심인 Kernel은 Server에 대한 Client의 Network 접속을 제어하는 netfilter라는 Module을 가지고 있습니다.

Kernel은 이 netfilter를 사용하여 Packet Filtering를 수행하는데, 이것을 이용하여 Server 접속에 대한 Network 정책을 세우는 Program이 바로 Firewall입니다.

Ubutnu Server의 보안을 위해서는 무엇보다도 Firewall을 통해 Client의 악의적이거나 불필요한 접속을 차단하는 것이 좋습니다.

1.1. UFW (Uncomplicated FireWall)

Linux System의 가장 기본적인 Firewall은 iptables입니다. 그러나 일반 사용자들이 사용하기에는 어려운 면이 있기 때문에, Ubuntu에서는 iptables를 쉽게 사용할 수 있도록 만든 UFW(Uncomplicated Firewall)라는 Firewall을 제공합니다.1

Ubuntu를 Server에 설치한 직후에는 UFW가 비활성화 되어 있습니다. 먼저, UFW를 가동하기 위해서 다음과 같이 입력합니다.

$ sudo ufw enable

UFW를 활성화시키면 Firewall이 기본적인 동작을 하고, System 시작할 때 마다 자동으로 실행됩니다.

Firewall의 기본적인 동작은 Server의 모든 Port로 접근하는 Client의 접속을 차단하는 것입니다. 때문에 Service가 Server에 실행된 상태라도, Firewall이 동작하고 있다면 외부에서 Server로의 접속이 불가능합니다.

해당 Service에 대한 Client의 접근을 허용하기 위해서는 규칙을 추가해야 합니다. 예를 들어, Server가 OpenSSH Service를 실행하고 있다면 다음과 같이 입력하여 SSH Port(22)로의 접근을 허용하는 규칙을 Firewall에 추가합니다.

$ sudo ufw allow ssh

규칙을 적용을 위해서 위에서는 ssh와 같은 Service명을 사용했지만, 다음과 같이 Service Port를 직접 적어도 됩니다. (TCP와 UDP 모두 22번 Port로의 접근을 허용하는 예)

$ sudo ufw allow 22

그리고 위와 같이 설정한 규칙을 확인해 보려면 다음과 같이 입력합니다.

$ sudo ufw status verbose
Status: active
Logging: on (low)
기본값: deny (들어오는 패킷), allow (나가는 패킷)
새 프로파일 skip

To                         Action      From
--                         ------      ----
22                         ALLOW IN    Anywhere
22                         ALLOW IN    Anywhere (v6)

허용된 SSH 접속을 다시 막으려면 아래와 같이 delete 명령을 사용하면 됩니다.

$ sudo ufw delete allow ssh

Command-line에서 작업하는 것이 불편하다면, UFW의 GUI Front-end인 Gufw를 사용하여 좀 더 쉽게 규칙을 추가하거나 삭제할 수 있습니다.

$ sudo apt-get install gufw
$ gufw

1.2. 특정 Client의 접속을 차단하는 방법

Service의 Log를 검색하다가 Cracking이 의심되는 시도가 발견되었다면, UFW 규칙 생성을 통해 해당 IP의 접속을 차단 할 수 있습니다.

해당 IP의 Server 접속을 모두 차단하려면 다음과 같이 Terminal에서 입력합니다. (192.168.0.1을 차단하는 예)

$ sudo ufw deny from 192.168.0.1

또는, 다음과 같이 해당 IP가 관련 Service를 이용하지 못하도록 차단할 수 있습니다. (SSH Service의 예)

$ sudo ufw deny from 192.168.0.1 to any port 22

2. OpenSSH Server

OpenSSH Server를 사용하는 경우, 계정 인증에 대한 Log를 기록하는 /var/log/auth.log를 확인해 보면 다음과 같은 Error Message를 확인 할 수 있습니다.

Jun 17 07:33:17 server sshd[24500]: Failed password for invalid user root from xxx.xxx.xxx.xxx port 54817 ssh2

주로 중국쪽 IP나 우회 접속을 통해서 들어오는데, 악의적인 Cracker가 예상 가능한 ID와 Password를 사용하여 무작위로 인증을 시도하는 경우에 위와 같은 Message가 발생합니다.

일반적으로는 신경쓰지 않아도 별 문제가 없겠지만, 혹여 계정이 뚫리게 되거나 인증 과정으로 인한 System Resource 사용 때문에 System 성능이 저하될 수 있습니다.

이번 항목에서는 위와 같은 SSH Brute-force Attack을 방어하기 위한 방법을 간단하게 소개합니다.

2.1. Firewall 설정

OpenSSH Service에 외부 Client가 접근할 수 있도록 설정하면서, Brute-force Attack을 방어하기 위한다면 다음과 같이 Terminal에서 입력합니다.

$ sudo ufw allow ssh
$ sudo ufw limit ssh

첫 번째 명령은 위에서 이미 살펴본 것과 같이 SSH 접속을 허용하는 명령입니다. 그리고 두 번째 명령은 SSH 접속을 허용하되, 지속적인 Login 시도가 발생한다면 해당 Client의 접속을 차단하기 때문에 Brute-force Attack의 영향을 줄일 수 있게 됩니다.

2.2. OpenSSH Server 설정

위의 Firewall의 설정으로 Brute-force Attack의 대부분을 막을 수 있습니다. 하지만 System의 계정이 뚫릴 위험이 여전히 존재하기 때문에 좀 더 안전하게 Service를 운영할 수 있도록 설정을 변경해 봅시다.

Terminal에서 다음과 같이 입력합니다.

$ sudo vi /etc/ssh/sshd_config

# Login Prompt에서 사용자 입력을 기다리는 시간을 초 단위로 입력.
LoginGraceTime 20

# no로 설정하면 root 계정으로 Login 불가능.
PermitRootLogin no

# 설정한 경로에 존재하는 Text File의 내용을 Login Prompt에 출력.
Banner /etc/issue.net

# SSH 접속을 통해 Login을 허용할 User를 지정. 지정된 User 외의 접속은 차단됨.
# 여러 계정 입력시 Space로 구분.
AllowUsers foo
$ sudo vi /etc/issue.net

***************************************************************************
                            NOTICE TO USERS

This computer system is the private property of its owner, whether
individual, corporate or government.  It is for authorized use only.
Users (authorized or unauthorized) have no explicit or implicit
expectation of privacy.

Any or all uses of this system and all files on this system may be
intercepted, monitored, recorded, copied, audited, inspected, and
disclosed to your employer, to authorized site, government, and law
enforcement personnel, as well as authorized officials of government
agencies, both domestic and foreign.

By using this system, the user consents to such interception, monitoring,
recording, copying, auditing, inspection, and disclosure at the
discretion of such personnel or officials.  Unauthorized or improper use
of this system may result in civil and criminal penalties and
administrative or disciplinary action, as appropriate. By continuing to
use this system you indicate your awareness of and consent to these terms
and conditions of use. LOG OFF IMMEDIATELY if you do not agree to the
conditions stated in this warning.

****************************************************************************
$ sudo service ssh restart

issue.net의 내용은 Ubuntu Wiki의 것을 사용했습니다.2 내용은 Copy & Paste로 Terminal에 붙여 넣어 사용하면 편리합니다.

sshd_config은 OpenSSH Server의 설정 File입니다. 각 Option의 의미는 함께 적어 놓은 주석의 내용과 같습니다.

/etc/issue.net의 내용은 OpenSSH Server에 접속한 Client에게 고지하는 내용입니다. 영문으로 되어 있지만 특별한 것은 없고, 악의적인 의도로 접근하는 사람들에게 경고하는 내용으로 되어 있습니다.

3. Apache HTTP Server

이번 항목에서는 Apache Web Server 운영 시에 보안을 위한 기본적인 설정들을 소개합니다.

3.1. Server 정보 숨기기

Server의 정보(Apache Version이나 OS 정보 etc.)가 Cracker들에게 노출되면 해당 정보를 가지고 잘 알려진 취약점을 가지고 접근해 들어올 가능성이 있기 때문에, 가능한 한 System의 정보를 표시하지 않도록 하는 것이 좋습니다.

설정을 위해 다음과 같이 Terminal에서 입력합니다.

$ sudo vi /etc/apache2/conf-enabled/security.conf
ServerTokens Prod
ServerSignature Off
TraceEnable Off
Header set X-Content-Type-Options: "nosniff"
Header set X-Frame-Options: "sameorigin"
$ sudo a2enconf security
$ sudo a2enmod headers
$ sudo service apache2 restart

위와 같이 설정하면 Error Page와 같이 자동으로 생성되는 Page에서 System 정보가 숨겨지고, TRACE Request를 통한 System 정보 유출이 불가능 해지며, Header 정보를 변경거나 Site Embedding등을 통한 공격을 방지합니다.

3.2. Directory Indexing 비활성화

기본적으로 HTTP 접속을 통해 Directory와 File 정보를 표시하는 Directory Indexing 기능이 활성화되어 있는데, 이런 식으로 Cracker들에게 Service 내의 정보를 보여주는 것은 위험할 수 있습니다.

특별히 Directory나 File을 공개하는 경우가 아니라면 다음과 같이 입력하여 Directory Indexing을 비활성화 합니다.

$ sudo a2dismod -f autoindex
$ sudo service apache2 restart

3.3. 중국에서의 접속을 차단하는 방법

/var/log/apache2/access.log나 error.log를 확인해 보면 알 수 있겠지만, 중국 쪽에서의 Cracking 시도가 빈번한 것이 사실입니다.

이를 방지하기 위해서, 중국에서의 Web Site 접속을 차단하려면 다음과 같이 입력하면 됩니다.3

$ sudo vi /var/www/html/.htaccess
<Files *>
# Chinese (CN) IP addresses follow:
deny from 1.80.0.0/13 1.92.0.0/14 1.192.0.0/13 1.202.0.0/15 1.204.0.0/14 14.144.0.0/12 14.208.0.0/12 23.80.54.0/24 23.104.141.0/24 23.105.14.0/24 27.8.0.0/13 27.16.0.0/12 27.36.0.0/14 27.40.0.0/13 27.50.128.0/17 27.54.192.0/18 27.106.128.0/18 27.115.0.0/17 27.148.0.0/14 27.152.0.0/13 27.184.0.0/13 36.32.0.0/14 36.248.0.0/14 42.96.128.0/17 42.120.0.0/15 58.16.0.0/15 58.20.0.0/16 58.21.0.0/16 58.22.0.0/15 58.34.0.0/16 58.37.0.0/16 58.38.0.0/16 58.40.0.0/16 58.42.0.0/16 58.44.0.0/14 58.48.0.0/13 58.56.0.0/15 58.58.0.0/16 58.59.0.0/17 58.60.0.0/14 58.68.128.0/17 58.82.0.0/15 58.100.0.0/15 58.208.0.0/12 58.242.0.0/15 58.246.0.0/15 58.248.0.0/13 59.32.0.0/12 59.51.0.0/16 59.52.0.0/14 59.56.0.0/13 59.72.0.0/16 59.108.0.0/15 59.172.0.0/14 60.0.0.0/13 60.11.0.0/16 60.12.0.0/16 60.24.0.0/13 60.160.0.0/11 60.194.0.0/15 60.208.0.0/13 60.216.0.0/15 60.220.0.0/14 61.4.64.0/20 61.4.80.0/22 61.4.176.0/20 61.48.0.0/13 61.128.0.0/10 61.135.0.0/16 61.136.0.0/18 61.139.0.0/16 61.145.73.208/28 61.147.0.0/16 61.150.0.0/16 61.152.0.0/16 61.154.0.0/16 61.160.0.0/16 61.162.0.0/15 61.164.0.0/16 61.175.0.0/16 61.177.0.0/16 61.179.0.0/16 61.183.0.0/16 61.184.0.0/16 61.185.219.232/29 61.187.0.0/16 61.188.0.0/16 61.232.0.0/14 61.236.0.0/15 61.240.0.0/14 101.64.0.0/13 101.72.0.0/14 101.76.0.0/15 101.80.0.0/12 103.253.4.0/22 106.112.0.0/13 110.6.0.0/15 110.51.0.0/16 110.52.0.0/15 110.80.0.0/13 110.88.0.0/14 110.96.0.0/11 110.173.0.0/19 110.173.32.0/20 110.173.64.0/18 110.192.0.0/11 110.240.0.0/12 111.0.0.0/10 111.72.0.0/13 111.121.0.0/16 111.128.0.0/11 111.160.0.0/13 111.172.0.0/14 111.176.0.0/13 111.228.0.0/14 112.0.0.0/10 112.64.0.0/14 112.80.0.0/12 112.100.0.0/14 112.111.0.0/16 112.122.0.0/15 112.224.0.0/11 113.0.0.0/13 113.8.0.0/15 113.12.0.0/14 113.16.0.0/15 113.18.0.0/16 113.62.0.0/15 113.64.0.0/10 113.128.0.0/15 113.136.0.0/13 113.194.0.0/15 113.204.0.0/14 114.28.0.0/16 114.80.0.0/12 114.96.0.0/13 114.104.0.0/14 114.112.0.0/14 112.109.128.0/17 114.216.0.0/13 114.224.0.0/11 115.24.0.0/15 115.28.0.0/15 115.32.0.0/14 115.48.0.0/12 115.84.0.0/18 115.100.0.0/15 115.148.0.0/14 115.152.0.0/15 115.168.0.0/14 115.212.0.0/16 115.230.0.0/16 115.236.96.0/23 115.236.136.0/22 115.239.228.0/22 116.1.0.0/16 116.2.0.0/15 116.4.0.0/14 116.8.0.0/14 116.16.0.0/12 116.52.0.0/14 116.76.0.0/15 116.90.80.0/20 116.112.0.0/14 116.128.0.0/10 116.204.0.0/15 116.208.0.0/14 116.224.0.0/12 116.254.128.0/18 117.8.0.0/13 117.21.0.0/16 117.22.0.0/15 117.24.0.0/13 117.32.0.0/13 117.40.0.0/14 117.44.0.0/15 117.79.224.0/20 117.80.0.0/12 117.136.0.0/13 118.26.0.0/16 118.72.0.0/13 118.112.0.0/13 118.120.0.0/14 118.132.0.0/14 118.144.0.0/14 118.180.0.0/14 118.186.0.0/15 118.192.0.0/16 118.248.0.0/13 119.0.0.0/13 119.8.0.0/16 119.10.0.0/17 119.18.192.0/20 119.36.0.0/16 119.57.0.0/16 119.60.0.0/16 119.88.0.0/14 119.96.0.0/13 119.112.0.0/13 119.120.0.0/13 119.128.0.0/12 119.144.0.0/14 119.164.0.0/14 119.176.0.0/12 119.233.0.0/16 120.0.0.0/12 120.24.0.0/14 120.32.0.0/13 120.40.0.0/14 120.68.0.0/14 120.80.0.0/13 120.192.0.0/10 121.0.16.0/20 121.8.0.0/13 121.16.0.0/12 121.32.0.0/14 121.60.0.0/14 121.76.0.0/15 121.196.0.0/14 121.204.0.0/14 121.224.0.0/12 122.10.128.0/17 122.51.128.0/17 122.64.0.0/11 122.119.0.0/16 122.136.0.0/13 122.156.0.0/14 122.188.0.0/14 122.192.0.0/14 122.198.0.0/16 122.200.64.0/18 122.224.0.0/12 123.4.0.0/14 123.8.0.0/13 123.52.0.0/14 123.64.0.0/11 123.97.128.0/17 123.100.0.0/19 123.112.0.0/12 123.128.0.0/13 123.138.0.0/15 123.150.0.0/15 123.152.0.0/13 123.164.0.0/14 123.180.0.0/14 123.184.0.0/14 123.196.0.0/15 123.232.0.0/14 123.249.0.0/16 124.42.64.0/18 124.64.0.0/15 124.67.0.0/16 124.73.0.0/16 124.114.0.0/15 124.126.0.0/15 124.128.0.0/13 124.160.0.0/15 124.162.0.0/16 124.163.0.0/16 124.192.0.0/15 124.200.0.0/13 124.226.0.0/15 124.228.0.0/14 124.236.0.0/14 124.240.0.0/17 124.240.128.0/18 124.248.0.0/17 125.36.0.0/14 125.40.0.0/13 125.64.0.0/12 125.79.0.0/16 125.80.0.0/13 125.88.0.0/13 125.104.0.0/13 125.112.0.0/12 125.210.0.0/15 140.224.0.0/16 140.237.0.0/16 140.246.0.0/16 140.249.0.0/16 159.226.0.0/16 171.34.0.0/15 171.36.0.0/14 171.40.0.0/13 175.0.0.0/12 175.16.0.0/13 175.24.0.0/14 175.30.0.0/15 175.42.0.0/15 175.44.0.0/16 175.46.0.0/15 175.48.0.0/12 175.64.0.0/11 175.102.0.0/16 175.106.128.0/17 175.146.0.0/15 175.148.0.0/14 175.152.0.0/14 175.160.0.0/12 175.178.0.0/16 175.184.128.0/18 175.185.0.0/16 175.186.0.0/15 175.188.0.0/14 180.76.0.0/16 180.96.0.0/11 180.136.0.0/13 180.152.0.0/13 180.208.0.0/15 182.18.0.0/17 182.32.0.0/12 182.88.0.0/14 182.112.0.0/12 182.128.0.0/12 183.0.0.0/10 183.64.0.0/13 183.129.0.0/16 183.148.0.0/16 183.160.0.0/12 183.184.0.0/13 183.192.0.0/11 192.34.109.224/28 192.74.224.0/19 198.2.203.64/28 198.2.212.160/28 202.43.144.0/22 202.46.32.0/19 202.66.0.0/16 202.75.208.0/20 202.96.0.0/12 202.111.160.0/19 202.112.0.0/14 202.117.0.0/16 202.165.176.0/20 202.196.80.0/20 203.69.0.0/16 203.86.0.0/18 203.86.64.0/19 203.93.0.0/16 203.169.160.0/19 203.171.224.0/20 210.5.0.0/19 210.14.128.0/19 210.21.0.0/16 210.32.0.0/14 210.51.0.0/16 210.52.0.0/15 210.77.0.0/16 210.192.96.0/19 211.76.96.0/20 211.78.208.0/20 211.86.144.0/20 211.90.0.0/15 211.92.0.0/14 211.96.0.0/13 211.136.0.0/13 211.144.12.0/22 211.144.96.0/19 211.144.160.0/20 211.147.0.0/16 211.152.14.0/24 211.154.64.0/19 211.154.128.0/19 211.155.24.0/22 211.157.32.0/19 211.160.0.0/13 211.233.70.0/24 218.0.0.0/11 218.56.0.0/13 218.64.0.0/11 218.84.0.0/14 218.88.0.0/13 218.96.0.0/14 218.102.0.0/16 218.104.0.0/14 218.108.0.0/15 218.194.80.0/20 218.200.0.0/13 218.240.0.0/13 219.128.0.0/11 219.154.0.0/15 219.223.192.0/18 219.232.0.0/16 219.234.80.0/20 219.235.0.0/16 220.112.0.0/16 220.154.0.0/15 220.160.0.0/11 220.181.0.0/16 220.191.0.0/16 220.192.0.0/12 220.228.70.0/24 220.242.0.0/15 220.248.0.0/14 220.250.0.0/19 220.252.0.0/16 221.0.0.0/12 221.122.0.0/15 221.176.0.0/13 221.192.0.0/14 221.200.0.0/14 221.204.0.0/15 221.206.0.0/16 221.207.0.0/16 221.208.0.0/12 221.212.0.0/15 221.214.0.0/15 221.216.0.0/13 221.224.0.0/13 221.228.0.0/14 221.232.0.0/13 222.32.0.0/11 222.64.0.0/12 222.80.0.0/12 222.132.0.0/14 222.136.0.0/13 222.168.0.0/13 222.172.222.0/24 222.176.0.0/13 222.184.0.0/13 222.200.0.0/16 222.208.0.0/13 222.219.0.0/16 222.220.0.0/15 222.240.0.0/13 223.4.0.0/14 223.64.0.0/11 223.144.0.0/12 223.240.0.0/13
</Files>

4. 마치면서…

지금까지 간단한 UFW 사용방법과 SSH, Apache에 대한 보안 설정을 살펴 보았습니다. 다음 Post에서는 Fail2ban을 사용하여 효과적으로 보안을 유지하는 방법과 Rootkit Check에 대해서 알아 보도록 하겠습니다.

Tested Environments

  • Ubuntu 15.10: ufw-0.34, openssh-server-6.9p1, apache2-2.4.12

References