Nextcloud 보안 강화 설정 7가지

시스템 환경


HTTPS 적용 및 리버스 프록시


SSL 보안 인증서 적용 방법과 리버스 프록시 설정에 관해서는 설명할 내용이 너무 많아 간략하게만 설명한다.
나중에 이와 관련된 글을 별도로 쓸 계획이다.

HTTPS


HTTPS는 http에 s가 붙은 형태로, 이때 s는 secure을 의미한다.
즉 보안 접속을 의미하는데, 이 https를 적용하지 않으면 PWA(Progressive Web App) 설치를 할 수 없고 접속 내용이 암호화되지 않아 보안에 매우 취약해지기 때문에 반드시 적용해야 한다.

이를 적용하기 위해서는 SSL 인증서가 필요한데, Let’s Encrypt라는 무료 SSL 발급 서비스 사용을 추천한다.
그러나 Let’s Encrypt를 이용해 SSL 와일드카드 인증서를 발급받기 위해서는 Let’s Encrypt가 사용 중인 DNS 서비스를 지원해야 하고, DNS 마다 발급 과정이 다 다르기 때문에 사전에 잘 알아보길 바란다.

리버스 프록시


한 서버나 컴퓨터에서 여러 서비스를 돌리고 싶다면 리버스 프록시는 필수이다.
기존에는 포트 번호를 넣어서 특정 서비스에 접속해야 했다면, 리버스 프록시를 사용하면 443과 80번 포트만 외부에 노출하고, 포트 번호 없이 도메인 입력 만으로도 특정 서비스에 접속할 수 있도록 해준다.

나는 리버스 프록시, SSL 인증서, Https 설정 및 관리가 가능한 jc21/nginx-proxy-manager를 사용 중이다.
리버스 프록시도 제대로 설명하려면 그 내용이 방대하므로, 간단히 셋팅한 스크린샷만 첨부한다.

Nextcloud Security NPM Details
Nextcloud Security NPM SSL

Cloudflare DNS 적용하기


나는 Cloudflare DNS를 사용하기 전에는 DuckDNS를 사용했다.
DuckDNS의 가장 큰 장점은 무료라는 것인데 단점으로는 서버가 불안정하고, 도메인이 항상 ~.duckdns.org 형태여야 한다는 것이다.
1년 반 정도 사용하다가 이번에 도메인을 새로 사게 되면서 Cloudflare DNS로 옮겼다.

Cloudflare DNS도 DuckDNS와 마찬가지로 무료로 이용할 수 있다.
다른 DNS 서비스에 비해 큰 장점이라면 무료 사용자도 봇 차단 서비스, 디도스 공격 완화 서비스 등의 보안 서비스를 이용할 수 있다는 것이다.
DuckDNS와 마찬가지로 DDNS 설정도 가능하고 (간단하지는 않다), Let’s Encrypt 와일드카드 인증서 발급도 가능해 가급적이면 Cloudflare DNS 사용을 추천한다.

Nextcloud Security Cloudflare DNS

DNS 설정 화면이다.
최상위 도메인을 A 레코드로, 서브 도메인은 CNAME으로 하여 최상위 도메인을 가리키게 하였다.
이렇게 하면 DDNS 적용 시 최상위 도메인의 IP만 업데이트하면 돼서 편하다.

Nextcloud Security Cloudflare Security Settings

Cloudflare 대시보드에서 보안 – 설정 탭을 위와 같이 설정해준다.
나는 보안 수준을 높음으로 설정했다.

Nextcloud Security Cloudflare Bot

Cloudflare 대시보드에서 보안 – 봇 탭으로 들어가면 봇 차단 기능을 켤 수 있다.
이 기능을 켜면 아래 스크린샷에서 볼 수 있듯이 봇과 Tor 접속을 차단해준다.

Nextcloud Security Cloudflare Bot 2

GeoBlocker 설정


GeoBlocker는 Nextcloud 앱 스토어에서 설치할 수 있는 앱으로, IP의 위치를 기반으로 로그인을 차단하거나 지연시킬 수 있는 기능을 가지고 있다.

설치


Nextcloud에서 앱 – 보안 탭에서 GeoBlocker를 설치할 수 있다.

설정

Nextcloud Security GeoBlocker Settings 1

앱 설치 후 관리자 설정 페이지를 들어가면 GeoBlocker 탭이 있다.

데이터 베이스는 RIRData(로컬) 선택 후 데이터 베이스 최신화를 해준다.

Nextcloud Security GeoBlocker Settings 2

국가 선택 모드는 두 가지 중 한 가지를 고를 수 있다.
선택한 국가만 접속을 허용할지, 아니면 선택한 국가만 접속을 차단할지 이다.
나는 대한민국을 제외한 모든 국가의 접속을 차단하고 싶었으므로, 위와 같이 설정하였다.
여러 국가를 선택하고 싶다면 Ctrl 키를 누른 상태에서 국가를 클릭하면 된다.

IP 주소와 국가 코드, 사용자 이름을 모두 체크해줘야 저 3가지 정보들이 모두 로그에 기록된다.

로그인 지연 기능은 말 그대로 차단 대상인 국가의 IP에서 로그인 시도 시, 30초간 강제로 로딩시킨다.
IP 차단 기능은 말 그대로 해당 국가의 IP에서 로그인 시도 시, 로그인을 차단하는 기능이다.
로그인 차단 기능의 경우 프론트엔드 기반으로 동작하기 때문에 말 그대로 아이디와 비밀번호를 유추해서 찔러보는 수준의 공격만 방어할 수 있다.

로그인 지연 기능과 차단 기능을 모두 선택한 경우, 올바른 아이디와 비밀번호를 입력하더라도 차단 국가의 IP에서 로그인을 시도하면 30초간 로딩이 걸린 뒤 로그인이 차단됐다는 안내 페이지가 나타난다.

DB 자동 업데이트 시키기


OMV를 기준으로 설명하자면, 시스템 – Scheduled Tasks로 이동해서 아래 스크린샷과 같이 스케줄을 하나 만들어 준다.

Nextcloud Security GeoBlocker DB Cron

나는 매일 오전 8시에 GeoBlocker DB 업데이트를 한 뒤, 이메일로 그 결과를 전송하도록 설정했다.
명령은 다음을 이용한다.

sudo docker exec (nextcloud 컨테이너 이름) occ geoblocker:localization-service:update-db

주의사항

  • 영구적으로 IP를 차단하는 것은 아니다.
  • GeoBlocker 데이터 베이스 업데이트 중 Nextcloud 컨테이너, Mariadb 컨테이너, 또는 시스템을 종료하거나 재시작할 경우 데이터 베이스 업데이트가 끝나지 않는 버그가 있다.
    occ 명령으로 RIR 데이터 베이스를 초기화해서 버그를 해결할 수 있지만 최대한 조심하자.

2단계 인증

OTP


내가 처음 Nextcloud를 시작했을 때는 이 앱을 별도로 설치해줬어야 했는데 지금은 기본적으로 설치되어 나오는 것 같다.

앱 이름은 Two-Factor TOTP Provider, 추천 마크가 달려 있다.

설정 방법은 설정 – 보안(개인) 탭에서 TOTP를 활성화할 수 있다.
OTP 앱은 Bitwarden 이나 Google OTP를 추천한다.

이메일


앱 스토어 보안 탭에서 Two-Factor Email을 설치해준다.

이후 설정 – 보안(개인) 탭에서 이메일 2단계 인증을 설정할 수 있다.

Brute-Force 설정


기본적으로 Nextcloud에는 무차별 대입 공격(Brute-Force Attack)을 완화할 수 있는 기능이 포함돼있다.
그런데 이게 정말 가끔씩 로그인 오류를 일으키며 관리자인 내 IP를 차단하는 경우도 있어서 Brute-Force settings 앱 설치를 통해 IP 화이트리스트를 지정해줄 필요가 있다.

지금은 모르겠는데 내가 Nextcloud를 처음 설치할 때는 앱이 설치는 돼있는데 활성화가 안돼있었다.
활성화 시켜준 후 설정 – 보안(관리자) 탭에서 ‘무작위 IP 대입 허용 목록’을 설정할 수 있다.

Suspicious Login


이것도 내가 처음 시작했을 때는 별도로 설치해줬어야 하는 앱인데 지금은 기본적으로 설치가 돼서 나온다고 알고 있다.

따로 설정해줄 것은 없고, 앱을 처음 설치 후 활성화하고 나면 60일간 데이터 학습 기간이 필요하다.
60일이 지나면 본격적인 로그인 탐지를 하게 된다.

원래 실패한 로그인은 시스템 로그에 띄워주지만, 성공한 로그인은 로그에 띄워주지 않는다는 단점이 있었다.
이 앱은 이것을 보완하기 위한 것으로, 성공한 로그인이라 하더라도 그 IP가 평소에 로그인하지 않던 것이라면 시스템에 로그를 띄우고 IP와 함께 알림을 보내준다.

Nextcloud Security Suspicious Login

Nextcloud Fail2ban 설정


GeoBlocker는 해외 IP 로그인만 차단이 가능하고 국내 IP는 불가능하다.
요즘은 국내 VPN을 이용한 로그인 시도도 종종 발생하기 때문에 n회 이상 로그인 실패 시, IP 접속을 차단시켜버리는 Fail2ban도 설치하는 것을 강력히 권장한다.

Fail2ban으로 IP를 차단시키면 서버 방화벽과 연동되어 내 서버로부터 해당 IP가 완전히 차단되기 때문에 IP차단에 있어서 가장 효과적인 방법이다.

설치


OMV를 사용 중이라면 플러그인으로 쉽게 설치할 수 있다.
아래 스크린샷을 참고하여 설치한다.

Nextcloud Security Fail2ban Plugin Install

설정


Putty 등의 프로그램을 이용해 서버 SSH에 접속한다.
그 후 Nextcloud 필터를 만들기 위해 다음 명령어를 입력한다.

sudo touch /etc/fail2ban/filter.d/nextcloud.conf


이렇게 하면 nextcloud.conf 라는 파일 하나가 만들어진다.
다음 명령어를 입력해 나노 에디터로 파일을 연다.

sudo nano /etc/fail2ban/filter.d/nextcloud.conf


파일을 연 후, 다음 내용을 복사하여 우클릭을 이용해 붙여넣는다.

[Definition]
_groupsre = (?:(?:,?\s*"\w+":(?:"[^"]+"|\w+))*)
failregex = ^\{%(_groupsre)s,?\s*"remoteAddr":"<HOST>"%(_groupsre)s,?\s*"message":"Login failed:
            ^\{%(_groupsre)s,?\s*"remoteAddr":"<HOST>"%(_groupsre)s,?\s*"message":"Trusted domain error.
datepattern = ,?\s*"time"\s*:\s*"%%Y-%%m-%%d[T ]%%H:%%M:%%S(%%z)?"


Ctrl+X를 누르고 Y, 엔터를 입력해 파일을 저장한 후 나온다.

이제 OMV 패널을 열고 Fail2ban을 설치했던 것과 같은 방식으로 Locate 플러그인을 설치한다.
파일의 경로를 찾아주는 플러그인인데, 설치해두면 여러모로 편리하다.

Nextcloud Security Fail2ban Locate

서비스 – Locate 탭에서 nextcloud.log를 검색한다.
그러면 2개의 검색결과가 나오는데 .log.1이 아닌 .log 파일의 전체 경로를 복사해준다.

혹시 Locate에서 파일명을 검색했는데 에러가 뜨고 검색이 안될 시, 1번 박스를 클릭한 후 (이때도 에러가 뜰 수 있으나 무시) 2번 박스를 클릭해주면 정상적으로 검색결과가 뜬다.

이제 서비스 – Fail2ban – 설정 탭으로 이동해서 아래 스크린샷과 같이 설정해준다.

Nextcloud Security Fail2ban Settings

Ignore IP는 혹시 모를 상황을 대비해 주로 접속하는 내부 IP를 입력한다.

Dest email에는 Fail2ban 알림을 받을 이메일을 입력한다.

이제 Fail2ban – Jails 탭으로 이동해서 새로운 Jail을 아래 스크린샷과 같이 생성한다.

Nextcloud Security Fail2ban Jail

이름은 원하는대로,
포트는 http,https (쉼표 앞뒤로 공백이 절대 없어야 함),
Ban time은 -1로 설정할 경우 영원히 차단된다.

필터는 nextcloud (.conf는 제외하고 입력)

Log Path는 아까 Locate에서 복사했던 경로를 붙여넣고 저장을 눌러 나온다.

마지막으로 SSH를 열러 다음 코드를 입력한다.

sudo nano /etc/fail2ban/jail.local


그러면 파일 하나가 열리는데, 파일 내용이 다음과 같도록 한다.

[DEFAULT]

chain = FORWARD


이걸 하지 않으면 Fail2ban에 의해 IP가 차단됐다는 알림이 오더라도 즉각적으로 차단되지 않고 차단이 지연될 수 있기 때문에 해줘야 한다.

Leave a Comment