Armbian 기반 MongoDB 4.2 설치

Armbian 을 사용하는 보드에서 mongodb 4.2 를 설치한다. 여기에 대한 자세한 내용은 아래 링크를 참조하고 있다.

https://docs.mongodb.com/manual/tutorial/install-mongodb-on-ubuntu/#install-mongodb-community-edition

GPG error

1
W: GPG error: https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.2 Release: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 4B7C549A058F8B6B
1
2
3
4
5
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 3B4FE6ACC0B21F32
7C549A058F8B6B
gpg: key 4B7C549A058F8B6B: public key "MongoDB 4.2 Release Signing Key <packaging@mongodb.com>" imported
gpg: Total number processed: 1
gpg: imported: 1
1
$ sudo apt install -y mongodb-org

설정

mongod.conf 를 간단하게 다음

1
2
3
4
5
6
7
8
9
10
11
12
13
14
storage:
#dbPath: /var/lib/mongodb
dbPath: /home/qkboo/Db-data/mongodb4
journal:
enabled: true

systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log

net:
port: 27017
bindIp: 127.0.0.1

https://docs.mongodb.com/manual/core/security-mongodb-configuration/

인증

명령으로 mongod 로 실행이 가능한 MongoDB Server는 기본적으로 보안 모델이 없이 실행된다. 따라서 별도의 인증 절차를 가지고 있지 않습니다. 이 때문에 2017년 1월에는 이런 약점을 노린 랜섬웨어가 발생하기도 했습니다. MongoDB는 되도록이면 외부로부터의 신뢰되지 않은 접속을 허용하지 않는, 보안에 문제가 되지 않는 환경에서 보안 모델 없이 실행하는 것을 지향하고 있으나, 어쨌든 MongoDB도 ID와 비밀번호로 접근하는 기본적인 보안 모델을 가지고 있으니 이를 통해 MongoDB Server에 인증 과정을 추가해 보도록 합시다.

  1. 비인증 모드에서 관리자 계정 생성
  2. 인증 접속

1. 비인증 관리자 계정 생성하기

mongod로 별도의 보안 모델이 없는 MongoDB Server를 실행하고, MongoDB Shell에 접속합니다.

1
2
3
4
> mongo
MongoDB shell version v3.6.3
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.6.3

MongoDB에는 admin이라는 데이터베이스가 존재하며, 해당 데이터베이스에 사용자를 추가합니다.

1
2
3
4
5
6
> use admin
> db.createUser({
user: 'username',
pwd: 'password',
roles: ['userAdminAnyDatabase']
})

db.createUser()는 현재 사용하고 있는 데이터베이스(여기서는 admin)에 사용자를 추가합니다. 여기에는 사용자 이름, 비밀번호와 함께 권한(roles)을 array로 정의합니다. MongoDB에서 빌트인으로 제공하고 있는 권한은 MongoDB Built-In Roles에서 확인할 수 있습니다.

위에서 정의한 userAdminAnyDatabase는 어느 데이터베이스든 사용자를 생성하고 제거할 수 있다는 것을 의미합니다. 모든 권한을 가지게 하려면 root를 사용하면 되고, MongoDB 2.4 이하의 경우 db.addUser()를 통해 사용자를 추가합니다.

mongod 인증하기

만약 mongod 명령으로 실행하면 MongoDB Server를 실행하도록 한다.

1
> mongod --auth

MongoDB Server 재시작하기

Ubuntu와 같은 리눅스 시스템에서 service mongod start처럼 service를 이용할 경우, config 파일을 통해 실행됩니다. 이 경우 /etc/mongod.conf를 다음처럼 수정하고 재시작(service mongod restart)하면 됩니다.

mongodb 4.x

인증을 활성화 하려면

1
2
security:
authorization: enabled
mongodb 3.x

mongod.conf 를 사용하면 다음 옵션을 true 로 구성한다.

1
auth = true

그리고 서비스를 재시작한다.

1
2

$ sudo systemctl restart mongod.service

2. 인증 접속

mongo 쉘에 접속하여 db.auth()를 사용하는 것입니다.

1
2
3
4
5
$ mongo
MongoDB shell version v4.2.1
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("177716fe-5b3c-41f6-bdae-d2584819abff") }
MongoDB server version: 4.2.1

쉘에서 db.auth() 를 사용해 인증에 성공하면 1이 나오면 성공이다.

1
2
3
4
5
> use admin
switched to db admin
> db.auth('admin', '!23456789');
1
>

인증 접속이 되면 로그에 아래 같은 로그를 확인할 수 있다.

1
2019-12-02T09:49:24.392+0000 I  ACCESS   [conn3] Successfully authenticated as principal admin on admin from client 127.0.0.1:52370
명령행에서 접근

인증과 함께 admin 데이터베이스로 접근하려면 아래 같이 명령어에 아이디와 비밀번호를 명시만 해 주면 된다.

1
> mongo admin -u username -p password --authenticationDatabase admin

아래 같이 mongo 명령행에서 인증을 통해 접속하면 test 라는 데이터베이스로 접속합니다.

1
2
3
4
5
6
$ mongo -u admin -p
MongoDB shell version v4.2.1
Enter password:
...
>
> use admin

사용자 계정 만들기

관리자 계정을 만들고 인증까지 수행 했으면, 일반 사용자를 만들어 데이터베이스를 사용하도록 해보자. 관리자 계정을 만들었던 것처럼 계정을 만들고자 하는 데이터베이스를 use 한 다음 db.createUser()를 실행하면 된다.

1
2
3
4
5
6
7
8
9
> use bookdiary
switched to db bookdiary
> db.createUser({
... user:'student',
... pwd:'0123456789',
... roles:['dbOwner']
... });
Successfully added user: { "user" : "student", "roles" : [ "dbOwner" ] }
>

dbOwner라는 권한은 해당 데이터베이스에 대한 모든 수정/삭제 권한을 가진다는 것을 의미합니다.

사용자 인증

db.auth()를 통해 인증을 진행해 봅시다.

1
2
3
> db.auth('username', 'password')
1
>

참고

MongoDB Community Edition 3.6 on Ubuntu

2018-06-22 내용 정리, User auth 링크
{:.right-history}

이 문서는 Ubuntu/Debian 계열 정규 배포본에 3.x 버전을 지원하지 않는 플랫폼에 MongoDB Community Edition 3.6 버전을 설치하는 과정을 정리하고 있다. 내용의 기초는 MongoDB Community Edition 3.6 버전을 Amd64, Arm64 지원하는 64bit OS에 설치해 사용하기 위해서 Install MongoDB Community Edition, on-ubuntu를 따라서 진행하고 경험상 필요한 부분을 추가로 정리했다.

  • MongoDB Community Edition 3.6 설치
  • Mongo Database 구성
자세히 보기

iptables Firewall on Ubuntu/Debian

일반적인 리눅스 배포본의 기본 방화벽인 iptables를 쉽게 사용할 수 있는 ufw 를 사용해서 리눅스에 방화벽을 구축하는 방법을 기술하고 있다.

iptables

iptables로 당연히 방화벽을 관리할 수 있다.

iptables -L 플래그

방화벽 룰, 액션에 대해 INPUT, OUTPUT, FORWARD 정보를 볼 수 있다.

1
$ sudo iptables -L

-S 플래그

우리 대신 사용 하 여 각 규칙 및 정책을 사용 하는 데 필요한 명령을 반영 하는 형식으로 출력을 볼 수 있는

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

ssh 22 자리는 포트

1
2
sudo iptables -I INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -I OUTPUT -p tcp --sport 22 -j ACCEPT

혹은 ip address 를 기반으로 설정할 수 있다.

1
2
iptables -I INPUT -p tcp --dport 22 -s 222.222.222.222 -j ACCEPT
iptables -I OUTUT -p tcp --dport 22 -d 222.222.222.222 -j ACCEPT

8080번으로 들어오는 포트를 80 번으로 바꾸기

1
2
3
sudo iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -i eth0 -p tcp --dport 8080 -j ACCEPT
sudo iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080

iptables정보를 저장하고 재부팅 이후에도 동작하도록 설정함. <= vi 로 열어서 맨 마지막에 추가함.

1
2
3
sudo sh -c "iptables-save > /backup/iptables.rules"
sudo vi /etc/network/interfaces
pre-up iptables-restore < /etc/iptables.rules

Web

기본 httpd 사용을 위한 80번 포트 개방과, node.js, python 등 실습을 위한 8080번 포트를 열어 주기 위해서 /etc/sysconfig/iptables 에 아래와 같이 입력한다.

1
2
3
4
5
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 8080 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 8080 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited

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

Check blocked ip addresses

iptables 명령으로 막혀있는 ip address를 출력해 보자. [^3]

1
$ sudo iptables -L -n --line
1
2
$ sudo iptables -L INPUT -v -n
08:43:89:08:00:45:00:00:3c:97:2b:40:00:34:06:4d:8b SRC=90.202.157.25 DST=220.121.141.168 LEN=60 TOS=0x│Chain INPUT (policy DROP 48 packets, 2312 bytes

참조

[^3]: Check blocked IP in iptables

Monitoring fail2ban

Monitoring fail2ban

Install

로그를 검사해 의심스런 IP 를 찾아 Firewall rule을 관리하기 어렵다 Fail2ban은 정규표현식을 사용해서 로그에서 의심스런 IP를 찾아 Firewall 등록할 수 있도록 해준다.

Fail2ban

로그를 검사해 의심스런 IP 를 찾아 Firewall rule에 등록해 관리하는 것은 어려운 과정이다. Fail2ban은 정규표현식을 사용해서 로그에서 의심스런 IP를 찾아 Firewall 등록 할 수 있도록 해준다.

설치

fail2baniptables 패키지와 함께 설치한다.

1
$ sudo apt install iptables fail2ban

그리고 systemctl 로 재대로 서비스가 시작되는지 확인해 본다.

1
2
$ sudo systemctl restart fail2ban.service    # 재시작
$ sudo systemctl status fail2ban.service # running 상태 확인

설정을 위해서 fail2ban 설정 파일인 fail2ban.conf, 그리고 jail 파일 jail.conf 파일을 .local 파일로 복사한 사용자 정의 파일에서 사용한다.

1
2
3
$ cd /etc/fail2ban
$ sudo cp fail2ban.conf fail2ban.local # 설정파일
$ sudo cp jail.conf jail.local # jail 설정

/etc/fail2ban 디렉토리

설치된 후 관련된 설정 파일은 /etc/fail2ban 디렉토리에 저장됩니다. 관련한 로그 기록은 /etc/logratate.d/fail2ban에 정의되어 /var/log/fail2ban.log 로 저장됩니다.

다음은 설정 디렉토리 구조

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ tree -L 2 fail2ban/
fail2ban/
├── action.d
│   ├── ...
│   ├── ufw.conf
│   └── xarf-login-attack.conf
├── fail2ban.conf
├── fail2ban.local
├── fail2ban.d
├── filter.d
│   ├── ...
│   ├── sshd.conf
│   └── xinetd-fail.conf
├── jail.conf
├── jail.d
│   └── defaults-debian.conf
├── jail.local
├── paths-common.conf
└── paths-debian.conf
  • jail.conf: jail 이라 불리는 모니터링할 대상에 대한 기본 옵션과 행위를 선언한다.
  • action.d/iptables-multiport.conf: fila2ban 이 jail에 맞게 거부(Ban)한 IP를 다루는 기본 액션이다.
  • fail2ban.local : fail2ban 주요 설정 파일
  • jail.local: jail 설정 파일
  • jaild.d/defaults-debian.conf: jail enable/disable
  • paths-common.conf: 로그 파일 경로
  • paths-debian.conf: 로그 파일 경로

설정

fail2ban은 jail 을 구성하고 jail의 filter 그리고 action으로 나뉘어 있다.

fail2ban.conf 구성

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 파일은 다음과 같은 내용을 담을 것이다.

  • loglevel: The level of detail that Fail2ban’s logs provide can be set to 1 (error), 2 (warn), 3 (info), or 4 (debug).
  • logtarget: Logs actions into a specific file. The default value of /var/log/fail2ban.log puts all logging into the defined file. Alternately, you can change the value to STDOUT, which will output any data; STDERR, which will output any errors; SYSLOG, which is message-based logging; and FILE, which outputs to a file.
  • socket: The location of the socket file.
  • pidfile: The location of the PID file.

jail.conf

/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 중에 무시할 영역, 화이트리스트를 선언해 줍니다. 리스트는 ‘,’로 구분하고 서브넷 혹은 IP주소를 입력한다.

1
2
[DEFAULT]
ignoreip = 127.0.0.1/8 192.168.0.1/24

차단 시간과 재시도 횟수

bantime, findtime, maxretry 은 차단 시간에 대한 구성이다.

1
2
3
bantime = 2592000
findtime = 600
maxretry = 3
  • bantime: 검출된 IP가 접속 차단 시간을 초단위로 선언해 준다. -1 이면 영속적으로 밴 된다.
  • findtime: ban이 설정 전에 로그인 간격 시간
  • maxretry: 최대 횟수

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이 있으면 이메일 설정에 따라 메일로 경고를 받을 수 있다.

  • destemail: The email address where you would like to receive the emails.
  • sendername: The name under which the email shows up.
  • sender: The email address from which Fail2ban will send emails.

그리고 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을 만들어 의심스런 접근을 막아 보자. 앞서 복사한 jail.local 파일에는 주요 서비스가 모두 선언되어 있고 sshd 만 활성화 되어 있다.

Jail은 다음 같이 구성된다.

1
2
3
4
5
6
7
8
[ssh]

enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 6

  • enabled: Determines whether or not the filter is turned on.
  • port: The port Fail2ban should be referencing in regards to the service. If using the default port, then the service name can be placed here. If using a non-traditional port, this should be the port number. For example, if you moved your SSH port to 3456, you would replace ssh with 3456.
  • filter: The name of the file located in /etc/fail2ban/filter.d that contains the failregex information used to parse log files appropriately. The .conf suffix need not be included.
  • logpath: Gives the location of the service’s logs.
  • maxretry: Will override the global maxretry for the defined service. findtime and bantime can also be added.
    action: This can be added as an additional setting, if the default action is not suitable for the jail. Additional actions can be found in the action.d folder.

각 서비스에 대한 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
2
[sshd-ddos]
enabled = true

혹은 $ sudo vi /etc/fail2ban/jail.d/sshd-ddos.conf

1
$ sudo service fail2ban restart

Failregrexs

다양한 필터를 사용할 수있다. 의심스런 동작을 Filter로 선언해서 사용하는데 해당 필터를 점검해야할 필요가 있다. 다음

1
$ sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf

이 필터를 사용자가 작성할 수 있는데 파이썬의 정규식을 사용해서 사용자 지정 필터를 작성한다.

access.log 필터 작성해 보기

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

Ban 관리

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

HOW to fail2ban

basic usages

1
2
sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf

1
sudo iptables -L --line-numbers

Nginx

기본으로 /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

nginx jail

nginx-noscript

웹 사이트에서 실행되고 침투할 수 있는 코드를 찾아 준다. php 등이 웹 사이트와 연동되지 않았다면 아래 제일을 추가해서 이런 임의의 실행코드 형식 실행을 방지할 수 있다

1
2
3
4
5
6
7
8
[nginx-noscript]

enabled = true
port = http,https
filter = nginx-noscript
logpath = /var/log/nginx/access.log
maxretry = 6

nginx-badbots

웹 요청에 악의적인 봇을 호출하는 것을 방지한다.

1
2
3
4
5
6
7
[nginx-badbots]

enabled = true
port = http,https
filter = nginx-badbots
logpath = /var/log/nginx/access.log
maxretry = 2

filter

추가한 jail 이 동작할 필터를 작업해 주어야 한다. 필터는 /etc/fail2ban/filter.d 디렉토리에 있다.

nginx-http-auth.conf

기본으로 제공하는 nginx-http-auth.conf 필터에 하나를 더 추가해 준다. 아래는 사용자가 아이디와 비밀번호를 입력하지 않는 경우에 대해 필터한다. 아래의 no user/password 패턴을 추가한다.

1
2
3
4
5
6
7
[Definition]


failregex = ^ \[error\] \d+#\d+: \*\d+ user "\S+":? (password mismatch|was not found in ".*"), client: <HOST>, server: \S+, request: "\S+ \S+ HTTP/\d+\.\d+", host: "\S+"\s*$
^ \[error\] \d+#\d+: \*\d+ no user/password was provided for basic authentication, client: <HOST>, server: \S+, request: "\S+ \S+ HTTP/\d+\.\d+", host: "\S+"\s*$

ignoreregex =

nginx-badbots.conf

1
sudo cp apache-badbots.conf nginx-badbots.conf

nginx-noscript

[nginx-noscript] jail 은 다음 내용을 입력한다:

1
2
3
4
5
[Definition]

failregex = ^<HOST> -.*GET.*(\.php|\.asp|\.exe|\.pl|\.cgi|\.scgi)

ignoreregex =

nginx-nohome

1
2
3
4
5
[Definition]

failregex = ^<HOST> -.*GET .*/~.*

ignoreregex =

nginx-noproxy

1
2
3
4
5
[Definition]

failregex = ^<HOST> -.*GET http.*

ignoreregex =

Jail 실행 확인

1
2
3
4
$ sudo fail2ban-client status
Status
|- Number of jail: 6
`- Jail list: nginx-noproxy, nginx-noscript, nginx-nohome, nginx-badbots, ssh-ddos, ssh

그리고 iptable의 서비스로 방화벽 규칙에 fail2ban 규칙이 동작중인지 확인한다.

1
2
3
4
5
6
7
8
9
10
11
12
 $ sudo iptables -S
...

-A fail2ban-nginx-badbots -j RETURN
-A fail2ban-nginx-nohome -j RETURN
-A fail2ban-nginx-noproxy -j RETURN
-A fail2ban-nginx-noscript -j RETURN
-A fail2ban-ssh -j RETURN
-A fail2ban-ssh-ddos -j RETURN

...

그리고 fail2ban 의 jail 실행 상태를 자세히 보고 싶므면 status 뒤에 jail 이름을 주면 된다.

1
2
3
4
5
6
7
8
9
10
$ sudo fail2ban-client status nginx-badbots
Status for the jail: nginx-badbots
|- filter
| |- File list: /var/log/nginx/access.log
| |- Currently failed: 0
| `- Total failed: 0
`- action
|- Currently banned: 0
| `- IP list:
`- Total banned: 0

Testing

의심스런 동작을 Filter로 선언해서 사용하는데 해당 필터를 점검해야할 필요가 있다. 다음

1
$ sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf

Ban 관리

nginx 인증 요구시 잘못된 인증을 시도하면 fail2ban 규칙에 따라 접근이 금지당한다. 그리고 jail 규칙이 잘 적용 됐는지 결과를 다음 같이 확인할 수 있다:

1
2
3
4
5
6
7
8
9
10
11
$ sudo fail2ban-client status nginx-http-auth
Output
Status for the jail: nginx-http-auth
|- filter
| |- File list: /var/log/nginx/error.log
| |- Currently failed: 0
| \- Total failed: 12
\- action
|- Currently banned: 1
| \- IP list: 111.111.111.111
\- Total banned: 1

인증 규칙에 어긋나는 접근을 시도한 IP인 111.111.111.111을 확인 할 수 잇다.
금지된 IP는 해당 jail을 이용해 다음 같이 해제할 수 있다.

1
$ sudo fail2ban-client set nginx-http-auth unbanip 111.111.111.111

nginx-req-limit

http://blog.ricardomacas.com/index.php?controller=post&action=view&id_post=3

fail2squared

https://supine.com/posts/2012/08/fail2ban-monitoring-itself-recursively/

TO COMPLETELY FLUSH THE FAIL2BAN LOG FILE AND CLEAR OUR BLACKLIST FILE

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/

sqlite3

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
2
sqlite> .tables
bans fail2banDb jails logs

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

Rasberry Pi EEG

Raspberry Pi로 구현하는 EEG

Electroencepharogram, EEG는 머리에 부착한 적극등에 의해 뇌의 활동 상태를 측정하는 기술이다.

머리의 대뇌피질에 전극을 연결해 뇌파를 측정하면 델타 -δ파(0.2 ~ 3.99 Hz), 쎄타 -θ파(4 ~ 7.99 Hz), 알파 -α파(8 ~ 12.99 Hz), 베타 -β파(13 ~ 29.99 Hz), 감마- g파(30~50 Hz) 파동으로 구분할 수 있다.

Raspberry Pi에서 EEG를 시현한 사례도 많이 제공되고 있다.

Neosky Mindwave

100€ 선에서 Neurosky Mindwave 제품같은 저렴한 EEG 헤드셋을 이용할 수 있다.

그림. Nerosky Mindwave EEG

다음은 유튜브에 공개된 Neurosky Mindwave를 사용한 시연 동영상이다:

Mind control with Raspberry Pi: Neurosky Mindwave

Mindwave

헤드셋과 Bluetooth dongle로 구성되어 있어서, 라즈베리파이에서 USB 장치 연결을 하고 dmesg로 장치 인식을 확인할 수 있다.
그리고 Mindwave용 Python라이브러리를 사용해 EEG 신호를 측정할 수 있다.

mindwave-python 라이브러리

파이썬 Mindwave 라이브러리를 사용할 수 있다.

DiY EEG circuit

EEG 세트를 자작으로 구현해 볼 수 있다.

참고

  1. Raspberry Pi mindcontrol! Neurosky mindwave as simple EEG interface
  2. 뇌파의 개요

Tmux Start

2026-05-29: 내용 문맥 조정
2017-07-10: tmux-continum 추가

Tmux는 terminal multiplexer로 서버에 여러 프로그램을 세션에 저장하고, 다른 작업 혹은 연결을 끊었다 다시 접속해서 세션을 열어 작업을 이어갈 수 있다.

[그림. Tmux 실행 모습 (tmux.github.io)]

설치

여기서는 tmux 2.x, 3.x 에도 적용할 수 있다.

  • Ubuntu 24.04, 26.04
  • Ubuntu 14.04, Raspbian Jessie, Armbian 등에서 tmux가 1.8, 1.9 버전이 제공
  • Ubuntu 15, 16 Xenivior 버전은 Tmux 2.1
  • macOS는 brew 를 사용한다.

Tmux 설치

  • Old 버전 Ubuntu 14.04, Raspbian 등에서 tmux가 1.8, 1.9 버전이 제공되는데 package manager 같은 기능을 사용할 수 없다. 소스로 빌드해서 사용할 수 있다.
  • Ubuntu 14.04 desktop, orangepi plus, raspberry pi jessie 초기 버전은 빌드 필요

소스 설치

혹시 모르니 기존 낮은 버전의 tmux를 삭제하고 시작해 보자.

1
$ sudo apt remove --purge tmux

소스를 https://github.com/tmux/tmux/releases/ 에서 최신 버전으로 다운로드 하고 빌드한다.

1
2
3
4
5
6
7
sudo apt update
sudo apt install -y libevent-dev libncurses-dev
wget https://github.com/tmux/tmux/releases/download/2.3/tmux-2.3.tar.gz
tar xvzf tmux-2.3.tar.gz
cd tmux-2.3/
./configure && make
sudo make install

deb 바이너리 설치

단, libtinfo5 6.x 설치시 의존성 라이브러리 문제로 패키지 삭제 문제 발생!!!

https://launchpad.net/ubuntu/yakkety/amd64/tmux/2.2-3 에 빌드되어 있는 바이너리를 Ubuntu 14.04 설치하기 위해서 다음 패키지 버전이 필요하다.

Depends on:

  • libc6 (>= 2.14)
  • libevent-2.0-5 (>= 2.0.10-stable)
  • libtinfo5 (>= 6)
  • libutempter0 (>= 1.1.5)

기본 설치후 업그레이드를 했다면 libc6 버전은 문제가 없는듯.

1
2
$ sudo apt-cache show libc6
$ sudo apt-cache show libtinfo5

Ubuntu14.04.4 LTS 버전의 libtinfo5는 5.9로 다음 같이 설치해 준다.

1
$ wget http://launchpadlibrarian.net/271601076/libtinfo5_6.0+20160625-1ubuntu1_amd64.deb

그리고 tmux 2.2 버전의 deb 를 다운로드한다.

1
$ wget http://launchpadlibrarian.net/263289132/tmux_2.2-3_amd64.deb

설치

1
2
$ sudo dpkb -i libtinfo5_6.0+20160625-1ubuntu1_amd64.deb
$ sudo dpkb -i tmux_2.2-3_amd64.deb

이제 tmux 명령으로 다중 터미널 명령을 사용할 수 있다.

macOS에서 tmux 설치

homebrew를 사용해서 tmux를 설치한다. 2017년 현재 2.4 버전이 설치된다.

1
$ brew install tmux

이제 tmux 명령으로 시작할 수 있다.

시작

tmux 를 시작하면 하나의 세션에 하나의 윈도우가 만들어 진다.

1
2
$ tmux                   # 세션을 시작하고 참가한다.
$ tmux new -s foo # 세션 foo를 시작하고 참가한다

세션에 참가하면 하나 혹은 그 이상의 윈도우에서 Pane을 배치해 사용할 수 있다.


[그림. Tmux window layout]

Control와 Meta key

Tmux 세션 참가후 Window에서는 Prefix key로 Session, Window, Pane 관련 명령을 키로 조합해 사용한다. 기본 Prefix key는 Control+b key고 옵션으로 사용하는 Meta key는 Alt 키 이다.

여기서 Prefix key는 C와 조합으로 표기하고, Meta key인 AltM으로 표기한다.

윈도우 명령 control, meta 키 조합과 병행해 윈도우에서 명령모드를 사용할 수 있다. 명령모드는 C-: 키로 시작하고, 명령모드에서 명령 자동 완성을 지원한다.


[그림. Window command mode]

Pane 다루기

윈도우는 수직/수평으로 구획을 나눌수 있다. C-“ 키로 현재 Pane 아래에 수평으로 새 Pane을 나눈다. 그리고 **C-%**키로 수직으로 새 Pane을 나눌 수 있다.


[그림. Tmux Window Pane]

  • C-q : pane 번호를 표시하고 번호를 눌러서 이동
  • C-o : pane을 순서대로 이동
  • C-방향키 : 해당 방향으로 이동
  • C-M-방향키 : 해당 방향으로 크기 조절
  • C-M-1~5 : 몇 가지 미리 설정된 레이아웃을 고를 수 있고, prefix space로 이 레이아웃을 순서대로 - 돌아가며 선택 가능
  • C-z : 특정화면만 확대하기 다시 예전 Panes상태로 돌아오기

Pane을 지우려면 터미널 exit 명령 혹은 C-x 키로 빠져 나올 수 있다.

Window 다루기

윈도우는 명령모드에서 new-window 혹은 C-c 키로 새 윈도우를 추가할 수 있다.


[그림. new Window ]

윈도우 사이의 이동은 윈도우 번호에 따라 단축키 C-0,1,2…9를 사용하거나 C-w로 윈도우 목록에서 선택해 이동할 수 있다.

  • C-n, C-p : 다음 윈도우, 이전 윈도우로 이동
  • C-l : 직전 사용하던 윈도우로 이동
  • C-w : 윈도우 리스트를 띄우고 선택
  • C-, : 윈도우 이름 바꾸기

세션 사용중에 세션을 빠져 나오려면 C-d 로 detach 하거나, 명령모드 C-:에서 detach 명령을 준다.

복사와 스크롤

Tmux 화면 버퍼는 한 화면분 밖에 안되서, 이전 화면 내용을 보려면 스크롤 기능을 켜야 한다. C+[ 키는 스크롤 키고, 우측상단에 페이지 표시가 나타난다. 키보드 방향키나 Page Up/Down키로 스크롤이 가능하다.

세션 연결

세션은 하나 혹은 그 이상 만들고 attach 명령으로 세션에 참가할 수 있다.

1
2
3
4
$ tmux new -s foo -d     # 세션 foo를 시작하고 빠져나온다.
$ tmux ls # 세션 목록을 출력한다.
0: 1 windows (created Fri May 12 10:26:00 2017) [80x24] (attached)
foo: 1 windows (created Fri May 12 10:34:18 2017) [80x24]

터미널에서 세션에 참가하려면 attach 명령과 대상 세션을 지정해 준다. 대상 세션은 tmux ls 명령에 표시되는 세션번호 혹은 세션이름을 지정한다.

1
2
3
$ tmux attach
$ tmux attach -t 0 # 세션 0번에 참여한다
$ tmux attach -t foo # 세션 foo에 참여한다.

세션을 완전히 종료 시키려면, tmux 세션에서 명령모드 C-: 에서 kill-session 명령을 실행한다.
혹은 다른 터미널에서 세션번호 혹은 세션 이름으로 종료한다.

1
$ tmux kill-session -t 3   # 세션번호 3을 종료한다.

설정파일 .tmux.conf

사용자 홈디렉토리에 .tmux.conf 파일에 tmux에 대한 설정을 명시할 수 있다.

Control + a 사용하기

Capslock키를 Control 키로 대체해 사용하면, Control+a 키 조합이 편하다. .tmux.conf 에 키 조합을 변경한다.

1
2
3
4
5
#Control+a에 'prefix' 연결
set -g prefix C-a
#send-prefix를 Control+a에 전달
bind C-a send-prefix
unbind C-b

위에서 prefix는 C-a 로 재배치된다.

Mouse On/Off

1
2
3
4
5
6
7
8
9
# Toggle mouse on with META m
bind m \
set-option -g mouse on \;\
display 'Mouse: ON'

# Toggle mouse off with META M
bind M \
set-option -g mouse off \;\
display 'Mouse: OFF'

Plugin manager

Tmux Pluin Manager 를 설치하고, tmux 기능을 확장할 수 있다.

tpm 설치

먼저 사용자 홈 디렉토리에 저장한다.

1
$ git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm

다음 설정을 tmux.conf 에 저장한다.

1
2
3
4
5
6
7
# List of plugins
set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-sensible'
set -g @plugin 'tmux-plugins/tmux-resurrect'

# Initialize TMUX plugin manager (keep this line at the very bottom of tmux.conf)
run '~/.tmux/plugins/tpm/tpm'

plugin 관리

플러그인 설치를 위해서 C-I (대문자) 를 실행
플러그인 업그레이드를 위해서 C-U 를 실행

  • 플러그인 목록에서 플러그인을 선택하고 C-M-u (소문자)

Tmux-Resurrection

tmux-resurrect{:.keyword}는 tmux 세션을 백업/복구 할 수 있는 플러그인이다. tmux.conf에 다음을 추가

1
set -g @plugin 'tmux-plugins/tmux-resurrect'

플러그인 설치를 위해서 C-I 를 실행하면 설치를 시작한다.

Resurrection 플러그인으로 백업/복구하는 키는 다음 같이 지정되어 있다:

  • C-s : save
  • C-r : restore

Tmux-continuum

tmux-resurrect{:.keyword} 에서 저장한 환경을 자동으로 저장/복구할 수 있는 플러그인이다.

tmux-continuum{:.keyword} 의 주요 기능은:

  • tmux{:.keyword} 환경을 15분 마다 자동 저장
  • 컴퓨터/서버 시작시 tmux{:.keyword} 자동 시작
  • tmux{:.keyword} 시작시 자동 복구
  • tmux 1.9 이상, bash, tmux-resurrect plugin

설치

.tmux.conf 파일에 아래 플러그인을 추가:

1
2
set -g @plugin 'tmux-plugins/tmux-resurrect'
set -g @plugin 'tmux-plugins/tmux-continuum'

tmux 에서 플러그인 설치를 위해서 C-I (대문자) 를 실행

그리고 .tmux.conf 파일에 continuum-restore 을 on으로 해준다.

1
set -g @continuum-restore 'on'

tmux 세션을 모두 나와서 tmux 서버를 모두 kill-session 같은 명령으로 종료시킨후 tmux를 다시 시작하면 .tmux/resurrect 에 저장된 마지막 세션이 복구되는 것을 확인할 수 있다.

이제부터 15분 마다 자동 저장하고 서버를 재시작한 후에 tmux를 다시 시작하면 저장한 환경을 자동으로 복구해 준다.

tmux status 표시

tmux-continuum 의 상태를 tmux status line에 표시할 수 있다.

1
set -g status-right 'Continuum status: #{continuum_status}'

Linux에서 tmux 자동 시작

tmux-continuum 은 Linux systemd, macOS 에서 자동 시작을 지원한다.

Linux는 .tmux.conf 파일에 다음 부트 옵션을 추가한다.

1
set -g @continuum-boot 'on'

그리고 현재 실행중인 세션에 변경한 설정을 적용하려면

1
$ tmux source-file ~/.tmux.conf

macOS에서 tmux 자동 시작

.tmux.conf 파일에 다음 부트 옵션을 추가한다.

1
set -g @continuum-boot 'on'

그리고 현재 실행중인 세션에 변경한 설정을 적용한다.

1
$ tmux source-file ~/.tmux.conf

맥이 재시작 하면 자동으로 Terminal.app 이 실행된다. 터미널 크기는 다음 옵션으로 지정한다:

1
2
3
4
set -g @continuum-boot-options 'fullscreen' # terminal window will go fullscreen
set -g @continuum-boot-options 'iterm' # start iTerm instead of Terminal.app
set -g @continuum-boot-options 'iterm,fullscreen' # start iTerm in fullscreen

다중 tmux 서버는 지원하지 않는다.

tmux 로 서버를 하나 시작하고, tmux -S /tmp/foo 같이 다른 소켓을 사용했다고 자동 저장/복구가 별도로 진행되지 않는다. [^10]

여기까지 설정한 내용은 qkboo/tmux.conf gist 에서 확인 가능.


### 설정 저장

tmux 설정을 위힌 default 파일이 존재하지 않는다는 점이다. 그래서 tmux 기본 설정을 어딘가 추출해서 보관해두면 다시 돌아오는데 편리하다. 현재 tmux에 설정된 값은 다음 명령어로 추출할 수 있다.

1
$ tmux show -g | sed 's/^/set-option -g /' > ~/.tmux.current.conf

tmux.conf를 적용하는 명령은 source-file이다.

1
$ tmux source-file ~/.tmux.current.conf

Tmux 관련글

  1. Tmux 시작
  2. Tmux cheatsheet

참고

mongodb - Collection

Collection

mongoDB는
mongoDB는 Collection 이 데이터베이스 테이블과 같은 개념이다. 아래 테이블은 관계형 데이터베이스 MySQL과 MongoDB의 개념을 비교해 주고 있다. [^1]

MySQL MongoDB
Table Collection
Row Document
Column Field
Joins Embedded documents, linking
자세히 보기

MongoDB - Database와 User Authentication

2018-06-21 설치 링크로 대체
{:.right-history}

MongoDB 설치후 데이터베이스 위치, 로그, 인증 등에 관련한 서버 구성과 설정을 정리한다.

MongoDB 2.6 과 MongoDB Community Edition 3.x 버전을 사용했다.

mongoDB 접근제어

mongoDB 는 설치과정 중에 인증과 관련해 설정하는 부분이 없어서 설치 후 누구나 DB에 접속 할 수 있다. 인증을 추가해 데이터베이스 관리자와 데이터베이스 사용자로 구분해서 이용하고, 각 데이터베이스의 사용자는 허가된 역할(Role)을 가지고 데이터베이스에 접근 가능하도록 구성한다.

자세히 보기

mongodb 3.4 on Armbian

2018-06-22 내용 정리, User auth 링크
{:.right-history}

이 문서는 MongoDB Community Edition 3.4 버전을 64bit OSAmd64, Arm64 지원 OS에 설치해 사용하기 위해서 Install MongoDB Community Edition, on-ubuntu를 따라서 진행했다.

여기서는 Arm을 사용하는 SBC[^2] 컴퓨터에 mongodb 3.4 버전을, Hardkernel Odroid C2를 사용해서 설치를 진행했다.

자세히 보기