티스토리 뷰

Devops

[Ansible] fail2ban role 적용하기

4whomtbts 2020. 6. 12. 04:49

fail2ban 은 ssh의 보안성을 높여주는 서비스이다. maxtry threshold 를 넘긴 IP 를 차단시키는 기능 등을 제공한다. 

물론, 이 외에도 조금 더 다양한 옵션들이 존재하지만, 우선 위의 기능을 쓰기 위해 적용해보겠다. 

서버가 여러 대 있는데, fail2ban 같은 서비스들을 설치해주는 것은 정말 힘들다. 똑같은 명령어를 여러 번 치는건

그렇다치자 하지만, k 번 째 서버에서 서비스의 옵션을 설정하다가 이 옵션을 enable/disable 하면 어떻게 될 까? 

아니면, 아 이 옵션을 반드시 enable/disable 해주어야 하는 구나! 

하는 식의 충동으로 옵션을 수정하다보면 모든 서버가 서로 조금씩 미묘하게 다른 옵션을 가지게 되는 디스토피아가 벌어진다.

 

우선, fail2ban 을 ansible 로 설정한다고 쳐보자. 

apt-get update 을 한 후, apt-get 으로 fail2ban 을 설치하고서 fail2ban에 대한 여러 설정 파일들을 수정하는

정보를 만들어야 할 것 이다. 한 번 만들어놓으면 여러 서버에 한 번에 적용시켜주니깐 편하지만 스크립트를 

만드는 비용을 생각해보면 정말 이게 덜 걸릴까?.. 생각이 들 것 이다. 

 

role은 위의 '한 번 만들어놓으면' 을 십분 활용한 개념이다. 이 글은 role 의 개념을 다루는 글은 아니니깐

Github 처럼 ansible-galaxy 라는 곳에 자신이 만든 role을 올려놓고 남들에게 공유해주면 

해당 role이 필요한 사람은 받아서 쉽게 일련의 작업을(패키지 설치, 설정 파일 수정, 환경변수 수정) playbook에 

role 이름과 옵션을 줌으로써 매우 쉽게 사용할 수 있는 것이다.

 

role에 대해 구구절절 쓴 이유는, 당연히 fail2ban 의 role이 있기 때문이다.

아래의 과정에 들어가기 전에 folder structure 부터 맞춰야한다(structure라고 할 것도 없지만)

site.yml

roles/

 fail2ban/

   ... github 에서 받은 fail2ban role folder ...

 

우선 

site.yml 과 같은 레벨에서

$ mkdir roles

$ cd roles

$ mkdir fail2ban

$ cd fail2ban 

$ git init

$ git remote add origin https://github.com/nbigot/ansible-fail2ban

 

$ git pull origin master

 

site.yml

---

- hosts: all
  tasks:
   - name: Update and Upgrade apt packages
     become: true
     apt:
         upgrade: yes
         update_cache: yes
         cache_valid_time: 86400

   - name: fail2ban Role
     include_role:
       name: fail2ban
       apply:
         become: yes
     vars:
       fail2ban_services:
         - name: sshd <Ubuntu 16.04 이상이 아니면 ssh로>
           port: "{{ hostvars[item]['ansible_port'] }}"
           maxretry: 5
           bantime: -1

     with_inventory_hostnames: <자신의 그룹, 내 경우엔 labs 였다> 

애먹었던 부분은, role의 개념을 제대로 몰라서, roles 에 fail2ban 을 명시해주면 Gardle 처럼 Maven repository에서

알아서 불러와서 다운로드 해주는 줄 알았던 점

그리고, 운영중인 서버같은 경우는 ssh port가 모두 다르게 되어있기 때문에 host 마다 가지고 있는 

ansible_port 를 playbook에서 변수처럼 사용해서 다르게 적용해주어야 했던 점(예제에는 22로 고정되어 있다)

위처럼 site.yml 을 수정하였으면

$ sudo ansible-playbook site.yml -k -K

뭔가하면서 오랜만에 경이롭다는 느낌이 들었다.   이걸 서버마다 직접 해준다고 생각하면..

각 각의 server에 ssh로 접속하면서 수 십자리의 대소문자/숫자/특수문자가 뒤섞인 패스워드를 입력하고

sudo를 하면서 한 번 더 패스워드를 입력하고 

apt-get 을 하고 설정파일 바꾸고 환경변수 수정하고, service start 해주어야 할 것이다.

role을 적용하는데 이슈만 없으면, 서버 한 대에 Ansible 없이 설치하는 것 보다 훨씬 빠르게 가능할 수 도 있겠다.

 

성공했다고 결과가 나왔지만, 아무래도 믿기지 않아서 서버에 직접 접속해서 확인을 해 보았다.

1번 서버에서 ansible-playbook 을 가동했고, server5번에서 설치되어 있지 않았던 fail2ban 이 설치되어서 돌고있다!..

댓글