Raspberry Pi : Upgrade OpenSUSE LEAP 42.2 to 42.3
Raspberry Pi 3 에 설치해 사용중이던 openSUSE LEAP 42.2의 지원이 종료되어, 2019년가지 지원하는 LEAP 42.3으로 업그레이드하는 과정을 정리했다.
openSUSE는 LEAP 15.0으로 최신 버전으로 배포하고 있다. 42.2에서 15.0으로 바로 업그레이드시 내가 해결 못하는 문제가 생겨서 42.3으로 업그레이드 했다.
Raspberry Pi : Upgrade OpenSUSE LEAP 42.2 to 42.3
Raspberry Pi 3 에 설치해 사용중이던 openSUSE LEAP 42.2의 지원이 종료되어, 2019년가지 지원하는 LEAP 42.3으로 업그레이드하는 과정을 정리했다.
openSUSE는 LEAP 15.0으로 최신 버전으로 배포하고 있다. 42.2에서 15.0으로 바로 업그레이드시 내가 해결 못하는 문제가 생겨서 42.3으로 업그레이드 했다.
새 사용자를 추가하고 suder 로 등록한 후에 사용한다. 우분투/데비안 계열 새 사용자 추가는 Odroid Install 문서를 참고한다.
adduser 추가할 사용자에 대한 정보를 하나씩 묻고, 사용자 홈 디렉토리가 생성된다. 추가한 사용자에 대한 /etc/passwd, /etc/shadow, /etc/group and /etc/gshadow 편집이 된다
추가하고 패스워드를 입력한다.
1 | # adduser USERNAME |
그리고 suder로 등록해 준다.
usermod 혹은 visudo 를 사용할 수 있다.
1 | # usermod -aG sudo USERNAME |
hostname 명령에 따라 현재 호스트 이름이 /etc/hosts 혹은 dns resolver에서 검색되야 한다.
1 | $ sudo systemcgl status nginx |
위 같은 경고가 나타난다면 호스트 이름을 /etc/hosts 에 등록해 준다.
서버에
1 | $ ssh-keygen -t rsa -b 4096 -C "USER@localhost" |
위 2 과정을 아래 명령 한 줄로 복사->붙여넣기를 동시에 할 수 있다.
클라이언트:
1 | cat ~/.ssh/id_rsa.pub | ssh <USERNAME>@<IP-ADDRESS> 'cat >> .ssh/authorized_keys' |
커뮤티티에디션 설치
네이버 NCloud에서 Micro server를 하나 생성한 후에, MongoDB Community Edition을 설치했고, ncloud의 Ubuntu 16.01 이미지로 서버를 생성한 후에 업그레이드해서 16.04.4 LTS 버전에서 설치했다.
mongodb 설정
mongodb auth
현재 실행중인 mongod 를 종료한다.
sudo systemctl stop mongod.service
MongoDB 설정
Mongo Database를 사용하기 위해서 데이터 파일 위치, 로그, 포트, Ip 주소 등에 대한 구성을 mongod.conf 에서 할 수 있다. 수정된 구성이 작동하는지 mongo 클라이언트로 접속해서 테스트한다.
/etc/mongod.conf 파일에 인증을 제외한 데이터 디렉토리, bindIp, 로그 부분만 설정한다.
1 | dbPath: /data/mongodata/ |
설정을 저장하고 명령 라인에서 MongoDB를 다시 시작한 후에 mongo client로 접속한다.
모든 인터페이스에 db 접속을 허용하면 bindIpAll: true 를 사용한다.
1 | $ sudo mongod --port 27017 --dbpath /var/lib/mongodb |
이어서 클라이언트로 데이터베이스에 접속한다.접속에 성공하면 > 프롬프트가 나온다.
1 | $mongo |
mongod 에서 데이터베이스 및 사용자를 관리할 admin 이란 관리자를 추가하자
1 | > use admin |
관자자의 권한과 역할을 선언한다.
1 | >db.createUser( |
사용자의 role 을 변경,
1 | > db.grantRolesToUser( 'admin', [{role: 'userAdmin', db:'admin'}]) |
관리자 admin 계정을 admin 데이터베이스에 추가한 후에 mongo client로 admin 계정으로 로그인해서 …
터미널에서 시작한 mongod 를 종료한다.
수동으로 mongod 를 시작하면 root 계정으로 데이터 파일이 생성된다. systemctl로 서비스 시작 전에 data 폴더 퍼미션을 맞춰준다.
Directory permissions
로그 디렉토리 /var/log/mongo 그리고 데이터 디렉토리 /data/mongodata 라면 해당 디렉토리에 몽고디비 사용자가 쓸 수 있는 퍼미션을 준다.
1 | $ sudo chown mongo.daemon /var/log/mongodb |
데이터베이스를 생성하고 해당 데이터베이스를 접속하는 사용자 계정을 추가하자.
수동으로 접근제어 –auth 옵션으로 데이터베이스를 시작하면, mongo 클리이언트 로그인시 -u
, -p 와 –authenticationDatabase 를 지정해 주어야 한다.
1 $ mongo --port 27017 -u "admin" -p "****" --authenticationDatabase "admin"
The following operation creates accountUser in the products database and gives the user the readWrite and dbAdmin roles.
1 | use products |
이 글은 Raspberry Pi Programming 과정을 진행하며 강의한 자료를 바탕으로 공개강의를 위한 텍스트로 슬라이드쉐어, blog.thinkbee.kr 그리고 실제 과정을 영상 youtube 채널에 공개할 목적으로 작성한다.
Install Rasbperry Pi 글타래는 아래 같이 구성되며 간단한 소개, Serial console, OS 설치, Service 구성 및 사용에 대해 작성했다.
Raspberry Pi : Install Raspbian
Install Rasbperry Pi OS 글타래는 아래 같이 구성되며 OS 설치, Service 구성 및 사용에 대해 작성한다.
2017-10-30: swap 추가, timezone 수정
{:.right-history}
awk란 이름은 이 유틸리티를 작성한 A.V.Aho, P.J. Weinberger, B. Kernigham의 머리글자를 따온 것으로 주로 패턴의 검색과 조작을 주목적으로 만들어진 것이다. 즉 파일의 각 줄에 필드(field)를 인식할 수 있는 패턴 매칭 기능을 가지고 이들 필드를 자유자재로 조작 가능한 유틸리티를 작성하고자 만든 것이다.
awk pattern {action} filenames
awk -f parttern-action-file filenames
| 패턴 | 설명 |
| —————— | ——————————————————————————————————————————————————————————————– | — | ————————————————————————————————————————— |
| BEGIN | 입력화일을 읽어들이기 전에 옆에 제시되는 문자을 실행시키도록 한다. |
| END | awk가 모든 입력을 처리한 후, 옆에 제시되는 문장을 실행시키도록 한다. |
| expression | 식을 평가한 후 이 식이 참, 즉 non-zero이거나 non-null인 경우 문장을 실행한다. |
| /re/ | 정규식과 일치하는 문자열을 포함하고 있는 라인에서 문장을 실행한다. |
| compound-pattern | 복합패턴이라는 것으로 &&(and), | | (or) , !(not) 그리고 괄호에 의해 연결시킨 것이다. expression의 경우와 마찬가지로 복합 패턴도 참인 경우의 문장을 실행시킨다. |
| pattern1, pattern2 | 이러한 패턴을 범위 패턴이라 한다. 현재 처리되고 있는 라인이 pattern1과 일치되고, 다음에 따라오 는 라인 중 임의의 라인이 pattern2와 일치할 때, 범위 패턴은 두 라인 사이의 각 라인과 일치한다. |
awk에서 찾은 내용은 다음 변수에 저장되어 있다.
| 변수 | 내 용 |
|---|---|
| FILENAME | 현재 처리되고 있는 입력 파일의 이름 |
| FS | 입력 필드 분리문자 |
| NR | 현재 레코드(행)의 번호 |
| NF | 현재 레코드(행)의 필드의 갯수 |
| OFS | 출력되는 필드의 분리문자 |
1 | Apr 16 06:43:04 homepi sshd[20198]: User root from 222.73.37.31 not allowed because not listed in AllowUsers |
sshd 접속하는 root 접속 요청을 찾으려면,
1 | awk '/sshd|root/' /var/log/auth.log # sshd,root 가 있는 줄을 출력 |
찾은 결과의 특정 컬럼만 출력 가능하다:
1 | $ awk '/sshd|Failed/ {print $13}' /var/log/auth.log |
1 | $ awk '{print "Number of fields: " NF}' /var/log/auth.log |
로그인 실패한 root 사용자가 사용하는 IP만을 추출하고자 한다면,
Apr 16 06:43:07 homepi sshd[20198]: Failed password for invalid user root from 222.73.37.31 port 41030 ssh2
1 | $ awk '/Failed password/ {print $13,":",$15 }' /var/log/auth.log |
위 결과를 정렬하면, 같은 IP들이 징렬되어 나열된다.
1 | awk '/Failed password/ {print $13,":",$15 }' /var/log/auth.log | sort ``` |
1 | awk '/^north/' datafile # north로 시작하는 줄 출력 |
auth.log 에 있는 잘못된 로그인 정보만 출력
1 | awk '(/sshd|invalid/){print $(NF-5)}' /var/log/auth.log |
| 연산자 | 설명 |
| —————– | ———————————— | —- | ———— | — | ———————— |
| = += -= *= /= %= | 배정(assignment)연산자 |
| + - * / % ++ – | 산술 연산자 |
| | | && ! | 논리 연산자( | | = OR, && = AND, ! = NOT) |
| >>= < <= == != | 비교 연산자 |
| v p | 변수 V가 패턴 P에 부합되면 참 |p | 변수 V가 패턴 P에 부합되지 않으면 참 |
| v !
1 | awk '$7 == 5' datafile : 7번 필드가 5와 같다면 출력 |
awk pattern {action} filenames
① expressions
② print expression-list
③ printf(format, expression-list)
④ if (expression) statement
⑤ if (expression) statement else statement
⑥ while (expression) statement
⑦ for (expression; expression; expression) statement
⑧ for (variable in array) statement
⑨ do statement while (expression)
⑩ break
⑪ continue
⑫ next
⑬ exit
⑭ exit expression
⑮ {statement}
Hammerspoon 은 macOS의 데스크탑 자동화를 위해 Lua scipt 를 사용하는 엔진이다. Hammerspoon을 다운받아 설치하고 에 있는 Getting Started 를 보고 바로 시작할 수 있다.
최신 릴리즈를 Latest Hammerspoon 에서 다운받아 Application 폴더로 옮긴다.
그리고 Hammerspoon을 실행하면 Status bar에 나타난다.

[그림. Hammerspoon]
맥 환경설정 / 보안 및 개인정보 에서 손쉬운 사용에 hammerspoon을 추가해 주고 활성화 한다.

[그림. 보안 및 개인정보에서 제어 허용]
Hammerspoon 메뉴에서 Open Config 를 실행하면 시스템의 .lua 확장자를 열 수 있는 텍스트 에디터가 실행된다. 이곳에 Getting Started 의 샘플 스크립을 복사해서 바로 사용해 볼 수 있다.
1 | hs.hotkey.bind({"cmd", "alt", "ctrl"}, "Y", function() |
init.lua 에 스크립을 작성하고 저장한 후에 Hammerspoon 메뉴에서 Reload config를 실행하고 Console… 메뉴로 스크립 활성화를 확인할 수 있다.
*Cmd+Opt+Ctrl+F** 키로 윈도우를 고정된 크기로 변경할 수 있게 사용하고 있다.
1 | --[[ |
https://blog.jverkamp.com/2016/02/08/duplicating-aerosnap-on-osx-with-hammerspoon/
iptables Firewall on Ubuntu/Debian
일반적인 리눅스 배포본의 기본 방화벽인 iptables를 쉽게 사용할 수 있는 ufw 를 사용해서 리눅스에 방화벽을 구축하는 방법을 기술하고 있다.
iptables로 당연히 방화벽을 관리할 수 있다.
iptables -L 플래그방화벽 룰, 액션에 대해 INPUT, OUTPUT, FORWARD 정보를 볼 수 있다.
1 | $ sudo iptables -L |
우리 대신 사용 하 여 각 규칙 및 정책을 사용 하는 데 필요한 명령을 반영 하는 형식으로 출력을 볼 수 있는
1 | $ sudo iptables -S |
규칙을 모두 리플레시 할 수 있다
1 | sudo iptables -F |
모든 규칙은 DENY -> 일부 허용 순서로 한다. 그래서 TCP 로 1번부터 65526번 포트까지 다 막는 방법이다. 만약 UDP도 막고싶다면,
1 | sudo iptables -A INPUT -p tcp --dport 1:65526 -j DROP |
1 | sudo iptables -I INPUT -p tcp --dport 22 -j ACCEPT |
혹은 ip address 를 기반으로 설정할 수 있다.
1 | iptables -I INPUT -p tcp --dport 22 -s 222.222.222.222 -j ACCEPT |
8080번으로 들어오는 포트를 80 번으로 바꾸기
1 | sudo iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT |
iptables정보를 저장하고 재부팅 이후에도 동작하도록 설정함. <= vi 로 열어서 맨 마지막에 추가함.
1 | sudo sh -c "iptables-save > /backup/iptables.rules" |
기본 httpd 사용을 위한 80번 포트 개방과, node.js, python 등 실습을 위한 8080번 포트를 열어 주기 위해서 /etc/sysconfig/iptables 에 아래와 같이 입력한다.
1 | -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT |
iptables 규칙을 만들 때는 순서가 매우 중요하다.
이 때 주의해야 할 것은 위의 4개 코드가 빨간 색의 코드보다 반드시 위에 적혀 있어야 한다.
예를 들어 만일 chain에서 로컬 192.168.100.0/24 서브넷에서 들어오는 모든 패킷을 drop하도록 지정한 후 (drop 하도록 지정된 서브넷에 포함되는) 192.168.100.13에서 들어오는 패킷을 모드 허용하는 chain (-A)을 그 후에 추가하면 뒤에 추가된 추가 규칙이 무시된다.
먼저 192.168.100.13를 허용하는 규칙을 설정한 후 서브넷을 drop하는 규칙을 설정해야한다.
이후에
service iptables restart
명령어를 실행해주면 2개의 포트가 열러서 정상적으로 외부접속이 가능해지는 것을 확인할 수 있다.
로그에 있는 IP 목록을 출력
1 | egrep -o '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' | sort -u |
iptables 명령으로 막혀있는 ip address를 출력해 보자. [^3]
1 | $ sudo iptables -L -n --line |
1 | $ sudo iptables -L INPUT -v -n |
yast 명령으로 네트워크 구성을 수정할 수 있다. 실제 네트워크 관련 프레임워크는 wicked 를 사용한다.
https://www.suse.com/documentation/sles11/book_sle_admin/data/sec_yast_ncurses_commands.html
기존 ifconfig 가 deprecate 되서 ip 명령을 사용한다. [^2]
그리고 ip 명령 예제를 참고해
1 | ip a |
GUI에서 YaSt 도구를 사용하면 쉽게 설정할 수 있다. 터미널에서는 wicked 시스템에 따라서 네트워크를 구성한다.
타 리눅스 배포본에서 사용하는 방법의 구성 설정 파일은 /etc/sysconfig/network/ifcfg-[DEVICE] 이다. *[DEVICE]*는 사용할 인터페이스 이름이다.
1 | BOOTPROTO=static |
Gateway는 /etc/sysconfig/network/routes 파일에 다음 같이 구성해 준다.[^4]
1 | default gatewayaddr 192.168.1.1 |
DNS는 /etc/resolv.conf 를 참조하는데 yast 로 변경할 수 있다.
1 | yast dns edit nameserver1=192.168.1.1 |
1 | sudo ip link set eth0 up |
로그를 검사해 의심스런 IP 를 찾아 Firewall rule을 관리하기 어렵다 Fail2ban은 정규표현식을 사용해서 로그에서 의심스런 IP를 찾아 Firewall 등록할 수 있도록 해준다.
로그를 검사해 의심스런 IP 를 찾아 Firewall rule에 등록해 관리하는 것은 어려운 과정이다. Fail2ban은 정규표현식을 사용해서 로그에서 의심스런 IP를 찾아 Firewall 등록 할 수 있도록 해준다.
fail2ban 은 iptables 패키지와 함께 설치한다.
1 | $ sudo apt install iptables fail2ban |
그리고 systemctl 로 재대로 서비스가 시작되는지 확인해 본다.
1 | $ sudo systemctl restart fail2ban.service # 재시작 |
설정을 위해서 fail2ban 설정 파일인 fail2ban.conf, 그리고 jail 파일 jail.conf 파일을 .local 파일로 복사한 사용자 정의 파일에서 사용한다.
1 | $ cd /etc/fail2ban |
설치된 후 관련된 설정 파일은 /etc/fail2ban 디렉토리에 저장됩니다. 관련한 로그 기록은 /etc/logratate.d/fail2ban에 정의되어 /var/log/fail2ban.log 로 저장됩니다.
다음은 설정 디렉토리 구조
1 | $ tree -L 2 fail2ban/ |
jail 이라 불리는 모니터링할 대상에 대한 기본 옵션과 행위를 선언한다.fail2ban 주요 설정 파일fail2ban은 jail 을 구성하고 jail의 filter 그리고 action으로 나뉘어 있다.
fail2ban.conf는 기본 구성 변수로 loggin, socket 그리고 PID 파일 등등이 설정된다. 별도의 파일로 Jail을 구성할 때 fail2ban.local 같은 이름을 사용하고 새로 설정되는 값은 기본 설정 값을 재정의 하게 된다.
단 같은 [default] 섹션이 존재하면 구성된 내용 적용이 잘 안된다.
다음 스크립을 사용하면 모둔 변수를 주석 처리하고 수정할 옵션만 복사해 준다.
1 | sed 's/\(^[[:alpha:]]\)/# \1/' fail2ban.conf | sudo tee fail2ban.local 1&> /dev/null |
fail2ban.local 파일은 다음과 같은 내용을 담을 것이다.
/etc/fail2ban/jail.conf 는 데몬, 서비스에 대한 jail을 구성한다. jail은 log를 읽어 불필요한 것을 찾아 낸다.
다음은 jail.conf에서 주석이 달린 jail.local을 생성해 준다.
1 | sed 's/\(^[[:alpha:]]\)/# \1/' jail.conf | sudo tee jail.local 1&> /dev/null |
If using CentOS or Fedora open jail.local and set the backend to systemd. This is not necessary on Debian 8, even though it is a SystemD system.
/etc/fail2ban/jail.local
1 | backend = systemd |
먼저 검출된 IP 중에 무시할 영역, 화이트리스트를 선언해 줍니다. 리스트는 ‘,’로 구분하고 서브넷 혹은 IP주소를 입력한다.
1 | [DEFAULT] |
bantime, findtime, maxretry 은 차단 시간에 대한 구성이다.
1 | bantime = 2592000 |
-1 이면 영속적으로 밴 된다.https://arno0x0x.wordpress.com/2015/12/30/fail2ban-permanent-persistent-bans/
로컬 시스템의 이메일 주소를 sendmail -t user@email.com, replacing user@email.com with your email address.
fail2ban에 검출되는 jail이 있으면 이메일 설정에 따라 메일로 경고를 받을 수 있다.
그리고 action 설정을 조절할 필요가 있다, 이것은 ban 상황이 기준점에 닿으면 발생한다. 기본 액션 %(action_)s은 사용자만 ban 한다. action_mw 액션은 ban을 실행하고 WhoIS 리포트로 메일을 보내준다. action_mwl은 모든 로그까지 함께 보내준다.
You will also need to adjudst the action setting, which defines what actions occur when the threshold for ban is met. The default, %(action_)s, only bans the user. action_mw will ban and send an email with a WhoIs report; while action_mwl will ban and send an email with the WhoIs report and all relevant lines in the log file. This can also be changed on a jail-specific basis.
1 | action = %(action_)s |
1 | $ sudo service fail2ban restart |
필터를 이용해 Jail을 만들어 의심스런 접근을 막아 보자. 앞서 복사한 jail.local 파일에는 주요 서비스가 모두 선언되어 있고 sshd 만 활성화 되어 있다.
Jail은 다음 같이 구성된다.
1 | [ssh] |
각 서비스에 대한 jail은
jail.d에 설정 파일을 구성해도 된다.
(1) sshd
Brute-force Attack과 같은 접근을 차단하는 필터로 로그에 아래와 유사한 패턴이 나오면 IP를 검출한다.
Jul 22 06:56:50 foo sshd[14984]: Failed password for invalid user a from xxx.xxx.xxx.xxx port 55452 ssh2
jail.config 혹은 jail.local 에서 기본으로 활성화 되어 있다.
(2) ssh-ddos
sshd-ddos Filter를 사용해 SSH Service를 Scanning하거나 telnet으로 접속할 떄 발생하는 Message를 검사하여 해당 IP의 접근을 차단할 수 있습니다.
이 Filter로 검출되는 /var/log/auth.log의 Message는 다음과 같습니다.
Jul 23 13:16:25 foo sshd[21989]: Did not receive identification string from xxx.xxx.xxx.xxx
Jail 설정을 위해서 다음과 같이 입력합니다.
1 | [sshd-ddos] |
혹은 $ sudo vi /etc/fail2ban/jail.d/sshd-ddos.conf
1 | $ sudo service fail2ban restart |
다양한 필터를 사용할 수있다. 의심스런 동작을 Filter로 선언해서 사용하는데 해당 필터를 점검해야할 필요가 있다. 다음
1 | $ sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf |
이 필터를 사용자가 작성할 수 있는데 파이썬의 정규식을 사용해서 사용자 지정 필터를 작성한다.
nginx 로그를 대상으로 200 에러를 검출해 보자
1 | 91.134.232.57 - - [28/Nov/2016:07:30:23 +0900] "GET / HTTP/1.1" 200 1125 "http://hundej |
123.143.201.75 - - [28/Nov/2016:17:29:18 +0900] “HEAD / HTTP/1.1” 200 0 “-“ “python-requests/2.10.0”
fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/nginx-test.conf
fail2ban-client set YOURJAILNAMEHERE unbanip IPADDRESSHERE
Use iptables -L -n to find the rule name…
…then use fail2ban-client status to get the actual jail names.
룰 이름이 표시된다 f2b- 으로 시작하는 룰을 찾는다
그리고 fail2ban-status 는
fail2ban-client set YOURJAILNAMEHERE unbanip IPADDRESSHERE
1 | sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf |
1 | sudo iptables -L --line-numbers |
기본으로 /etc/fail2ban/jail.conf 에 [nginx-http-auth] jail이 하나 선언되어 있다.
[nginx-http-auth]
enabled = true
filter = nginx-http-auth
port = http,https
logpath = /var/log/nginx/error.log
웹 사이트에서 실행되고 침투할 수 있는 코드를 찾아 준다. php 등이 웹 사이트와 연동되지 않았다면 아래 제일을 추가해서 이런 임의의 실행코드 형식 실행을 방지할 수 있다
1 | [nginx-noscript] |
웹 요청에 악의적인 봇을 호출하는 것을 방지한다.
1 | [nginx-badbots] |
추가한 jail 이 동작할 필터를 작업해 주어야 한다. 필터는 /etc/fail2ban/filter.d 디렉토리에 있다.
기본으로 제공하는 nginx-http-auth.conf 필터에 하나를 더 추가해 준다. 아래는 사용자가 아이디와 비밀번호를 입력하지 않는 경우에 대해 필터한다. 아래의 no user/password 패턴을 추가한다.
1 | [Definition] |
1 | sudo cp apache-badbots.conf nginx-badbots.conf |
[nginx-noscript] jail 은 다음 내용을 입력한다:
1 | [Definition] |
1 | [Definition] |
1 | [Definition] |
1 | $ sudo fail2ban-client status |
그리고 iptable의 서비스로 방화벽 규칙에 fail2ban 규칙이 동작중인지 확인한다.
1 | $ sudo iptables -S |
그리고 fail2ban 의 jail 실행 상태를 자세히 보고 싶므면 status 뒤에 jail 이름을 주면 된다.
1 | $ sudo fail2ban-client status nginx-badbots |
의심스런 동작을 Filter로 선언해서 사용하는데 해당 필터를 점검해야할 필요가 있다. 다음
1 | $ sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf |
nginx 인증 요구시 잘못된 인증을 시도하면 fail2ban 규칙에 따라 접근이 금지당한다. 그리고 jail 규칙이 잘 적용 됐는지 결과를 다음 같이 확인할 수 있다:
1 | $ sudo fail2ban-client status nginx-http-auth |
인증 규칙에 어긋나는 접근을 시도한 IP인 111.111.111.111을 확인 할 수 잇다.
금지된 IP는 해당 jail을 이용해 다음 같이 해제할 수 있다.
1 | $ sudo fail2ban-client set nginx-http-auth unbanip 111.111.111.111 |
http://blog.ricardomacas.com/index.php?controller=post&action=view&id_post=3
https://supine.com/posts/2012/08/fail2ban-monitoring-itself-recursively/
sudo service fail2ban stop
sudo truncate -s 0 /var/log/fail2ban.log
sudo truncate -s 0 /etc/fail2ban/ip.blacklist
sudo rm /var/lib/fail2ban/fail2ban.sqlite3
sudo service fail2ban restart
https://ubuntu101.co.za/security/fail2ban/fail2ban-persistent-bans-ubuntu/
fail2ban.conf file, I found the following:
1 | dbfile = /var/lib/fail2ban/fail2ban.sqlite3 |
So, I did a little research to try to find out how access the database.
To open or connect to the database:
1 | $ sqlite3 /var/lib/fail2ban/fail2ban.sqlite3 |
To list all the tables in the database:
1 | sqlite> .tables |
To query a table:
1 | sqlite> SELECT * FROM logs; |
Another table:
sqlite> SELECT * FROM bans;
To disconnect from the database:
sqlite> .quit
참조: https://www.digitalocean.com/community/tutorials/how-to-protect-ssh-with-fail2ban-on-debian-7
fail2ban 로그는 아래 형태로
1 | 2016-08-28 12:35:56,163 fail2ban.actions[860]: WARNING [ssh] Ban 103.237.147.19 |
awk 를 사용해서 로그에서 ip주소를 추출해 보자. 로그 내용에서 ‘Ban’을 포함한 줄을 만나면 $NF 변수에 각 컨럼을 저장한다.
1 | $sudo awk '($(NF-1) = /Ban/){print $NF}' /var/log/fail2ban.log |
1 | $sudo awk '($(NF-1) = /Ban/){print $NF}' /var/log/fail2ban.log | sort | uniq -c | sort -n |
백업된 로그 파일을 모두 사용하려면 zgrep 명령을 사용해도 좋다
1 | $sudo zgrep -h "Ban " /var/log/fail2ban.log* | awk '{print $NF}' | sort | uniq -c | sort -n |
다음은 아주 위험한 서브넷을 출력한다.
1 | $sudo zgrep -h "Ban " /var/log/fail2ban.log* | awk '{print $NF}' | awk -F\. '{print $1"."$2"."}' | sort | uniq -c | sort -n | tail |
1 | $sudo zgrep -c 221.229 /var/log/fail2ban.log* |
1 | zcat /var/log/auth.log* | grep 'Failed password' | grep sshd | awk '{print $1,$2}' | sort -k 1,1M -k 2n | uniq -c |
http://serverfault.com/questions/486301/how-to-set-up-fail2ban-to-read-multi-log-in-a-jail