YGH

[홈서버 만들기] 4. 보안

2020년 11월 16일

업데이트

우선 우분투를 막 설치하고 접속하였기 때문에 업데이트 할 소프트웨어들이 만들 것이다.

설치되어 있는 소프트웨어들을 전부 업데이트 시켜주자.

참고로 이 명령어는 로그인 때 마다 업데이트가 있는지 보고 있을 경우 바로바로 해주는 것이 좋고 특히 보안 업데이트(Security update)가 존재할 경우 홈서버의 보안을 위해 즉시 해주도록 하자.

명령어 입력 후 비밀번호를 입력하라고 나오는데 SSH로 계정 접속할 때 비밀번호를 입력하면 된다.

$ sudo apt update
$ sudo apt upgrade -y

간혹 업데이트가 끝날 경우 시스템을 재부팅 하라고 메세지가 뜰 수도 있는데 이때는 아래 명령어로 재부팅 하면 된다.

$ sudo reboot

관리자 계정 비밀번호 생성

리눅스를 처음 설치하고 나면 관리자 계정인 root를 사용하기 위해 비밀번호 초기화를 해야 한다.

우분투 설치 때 등록한 계정은 관리자 행세를 할 수 있는데 방금 업데이트때도 관리자 행세를 한 것이다.

명령어 앞에 sudo를 붙인 것이 관리자 행세를 하는 것인데 이는 관리자 행세를 할 수 있는 계정들만 사용 가능하다.

하지만 관리를 할 때 내가 관리자인데 관리자 행세만 해서 되겠는가?

매번 sudo 를 입력하는 것도 귀찮다.

따라서 관리자 계정에 접속할 수 있게 해보자.

아래 명령어를 입력하고 관리자 계정 비밀번호를 만들자.

$ sudo passwd

명령어 입력 후 아래와 같은 문구가 먼저 뜬다면 sudo 명령어 사용에 대한 사용자 계정의 비밀번호를 먼저 입력해준 뒤 관리자 계정(root) 비밀번호를 2회 입력하면 된다.

[sudo] password for [사용자이름]:

업데이트 할 때 sudo를 입력하고 관리자 행세를 시작하겠다고 했으니 보통은 뜨지 않을 것이다.

비밀번호 2회 입력하면 관리자 계정(root) 비밀번호 설정이 되는데 우분투 서버의 최고 권한을 가지게 하는 비밀번호로써 단단하고 견고한 비밀번호이어야 한다.

아래 명령어를 입력하고 관리자 계정 비밀번호를 입력하여 접속해보자.

$ su –

명령어 입력 부분 오른쪽을 보면 $가 #로 바뀐 것을 확인할 수 있다.

루트 계정으로는 명령어를 입력할 때 sudo를 붙일 필요가 없으니 편리하다.

다시 일반 계정으로 돌아가고 싶다면 exit를 입력하면 된다.

SSH 계정 제한

vim은 리눅스에서 기본으로 제공하는 간단한 편집기이다.

이 외에도 nano 라는 편집기도 있는데 구글에 vim과 nano를 검색해서 알아보고 자신에게 더 편할 것 같은 편집기를 쓰면 된다.

필자는 vim만 사용할 예정이다.

vim 또는 nano 편집기 사용방법을 구글링을 통해 익혀오도록 하자.

그럼 vim으로 SSH 설정 파일을 열어보자.

$ sudo vim /etc/ssh/sshd_config

제일 마지막줄에 아래 항목을 자신의 계정명에 맞게 추가하면 된다.

AllowUsers [계정명]

설정 내용을 반영하기 위해 SSH 서비스를 재시작 하자.

$ sudo service sshd restart

이로써 등록한 계정으로만 SSH 접속이 가능 하게 되었다.

방화벽: iptables

개요

iptables는 리눅스에서 기본으로 제공하는 방화벽을 설정해주는 도구이고 이것을 이용해 서버의 문을 관리해보도록 하겠다.

ufw라는 편리한 도구가 있지만 이 도구는 어짜피 iptables의 규칙을 대신 생성해주는 역할로써 의미가 없다.

조금 어려울 수 있겠지만 iptables를 잘 이해하고 넘어간다면 홈서버 보안을 더욱 신경 쓸 수 있게된다.

우선 기본 상황을 확인해보자.

$ sudo iptables -L

INPUT, FORWARD, OUTPUT이라는 3개의 체인이 보이고 모든 체인의 정책이 허용되어 있다.

서버를 목적지로 하여 들어오는 모든 패킷은 INPUT 체인을 거치고, 서버에서 만들어진 모든 패킷은 OUTPUT 체인을 거치고, INPUT 체인을 통해 들어온 패킷 중 목적지가 서버가 아닌 패킷은 FORWARD 체인을 거쳐서 가려던 목적지로 향하게 된다.

초기화

우리가 다뤄 볼 체인은 INPUT 하나이다.

이미 아무 것도 없는 상태이겠지만 잘못 입력했을 경우를 대비해 전체 초기화 하는 법은 다음과 같다.

옵션에 대해 설명해주자면 -F는 체인들의 모든 규칙을 삭제, -X는 규칙이 없는 모든 체인 삭제, -P는 해당 체인의 기본 정책을 설정해준다.

$ sudo iptables -F
$ sudo iptables -X 
$ sudo iptables -P INPUT ACCEPT
$ sudo iptables -P FORWARD ACCEPT
$ sudo iptables -P OUTPUT ACCEPT

이제 기본값으로 변경되었고 필요에 맞게 작업을 해보도록 하자.

설정

  1. 로컬에서 로컬로의 모든 접속은 허용한다.
  2. SSH접속(22번포트)를 허용한다.
  3. 새로운 연결 요청이지만, 기존의 연결과 관련된 패킷(RELATED)과 새로운 연결 요청에 관한 그후의 패킷(ESTABLISHED)을 허용한다.
$ sudo iptables -A INPUT -s 127.0.0.1 -j ACCEPT
$ sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT 
$ sudo iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
$ sudo iptables -P INPUT DROP
$ sudo iptables -P FORWARD DROP
$ sudo iptables -L

만약 잘못된 정보가 입력되었으면 아까 알아본 초기화 명령어를 입력한 후 다시 설정해도 되지만 아래 명령어로 하나의 규칙을 제거할 수도 있다.

$ iptables -D INPUT [번째]

하지만 여기서 끝이 아니다.

우분투 서버가 재부팅 되면 설정이 모두 사라지게 되므로 설정을 저장을 해야 하기에 방화벽 관리 패키지를 설치하자.

저장

apt 명령어를 패키지 관련된 명령어 이다.

여기에 install을 붙이면 설치, remove를 붙이면 삭제 등의 기능이 있다.

방화벽 관리 패키지를 설치하자.

$ sudo apt install iptables-persistent

설치 도중 이런 창이 2번 뜨는데 각각 IPv4, IPv6에 대한 것인데 현재 설정을 저장하고 시스템이 시작될 때 자동으로 불러오겠다는 것이니 Yes를 선택하면 된다.

방화벽 규칙을 변경하게 될 경우 아래 명령어를 실행하면 저장 및 갱신이 된다.

서비스를 설치할 때 방화벽 설정을 하게되면 아래 명령어를 꼭 입력해주자.

$ sudo netfilter-persistent save
$ sudo netfilter-persistent reload

침입 차단: fail2ban

개요

Fail2ban은 비밀번호를 무작위로 대입해서 로그인을 시도해보는 해커들로부터 서버를 안전하게 지켜주는 역할을 한다.

예를 들어 똑같은 IP로 로그인 시도를 5번 했는데 전부 실패했을 경우 10분동안 접속이 불가능 하게끔 만들어 준다.

보통 SSH에 많이 적용한다.

나중에 설치해볼 클라우드 스토리지는 웹페이지에서 로그인을 하게끔 되어있는데 이때도 fail2ban을 사용해서 접속을 불가능 하게끔 만들 수 있으므로 굉장히 유용한 소프트웨어이다.

필요성 파악

우선 필요성을 알기 위해 지금 어떤 공격이 들어오고 있는지 확인해보자.

$ journalctl -f

190.82.101.10과 106.12.86.238에서 root계정으로 접속 시도한 것을 확인했다.

Fail2ban을 막 설치해보려 할 때 1초에 5번씩 접속 시도하는 것 보고 어이가 없었다.

Ctrl + C를 누르면 모니터링하던 곳에서 빠져나올 수 있다.

Fail2ban을 설치하고 얼른 침입을 막아보자.

설치

설치하고 확인해보면 새로운 체인이 생성된 것을 볼 수 있다.

$ sudo apt install fail2ban
$ sudo iptables -L

설정

fail2ban에 대한 감옥파일(jail.local)을 만든 뒤 내용을 입 맛에 맞게 수정하자.

[DEFAULT]
ignoreip=192.168.0.0/24
bantime=86400
maxretry=5
findtime=86400

[sshd]
enabled = true
port=22
filter=sshd
logpath=/var/log/auth.log

findtime(1일) 동안 maxretry 만큼 로그인을 시도했다면 bantime(1일) 만큼 접속을 차단한다.

192.168.0.1~192.168.0.254 부터 오는 접속은 예외로 적용하여 차단하지 않는다.

적용

$ sudo service fail2ban restart

확인

$ sudo fail2ban-client status sshd

차단 풀기

정신 놓고 로그인 하다가 접속이 제한 되었을 때 차단을 푸는 방법이다.

내부 네트워크로의 접속하든 로컬로 접속하는 로그인을 하여 아래 방법으로 차단을 풀 수 있다.

$ sudo fail2ban-client set sshd unbanip [ip]

보안 강화

혹시나 SSH보안을 더 강화하고 싶다면 OTP로 로그인할 수 있는 방법이 있다.

필자는 그렇게 하고 싶진 않아서 하지 않았지만 필요한 사람이 있을 수 있으니 구글에서 SSH OTP 라고 검색해 보길 바란다.