Middleware
이 글은 mongoose middleware를 한글로 요약 정리한 것이다. 실제 본문을 요약하여 번역해 정리했으므로 이해가 안되는 부분은 위 링크의 내용을 참조하기 바란다.
이 글은 mongoose middleware를 한글로 요약 정리한 것이다. 실제 본문을 요약하여 번역해 정리했으므로 이해가 안되는 부분은 위 링크의 내용을 참조하기 바란다.
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 |
로그를 검사해 의심스런 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
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를 시현한 사례도 많이 제공되고 있다.
100€ 선에서 Neurosky Mindwave 제품같은 저렴한 EEG 헤드셋을 이용할 수 있다.
그림. Nerosky Mindwave EEG
다음은 유튜브에 공개된 Neurosky Mindwave를 사용한 시연 동영상이다:
헤드셋과 Bluetooth dongle로 구성되어 있어서, 라즈베리파이에서 USB 장치 연결을 하고 dmesg로 장치 인식을 확인할 수 있다.
그리고 Mindwave용 Python라이브러리를 사용해 EEG 신호를 측정할 수 있다.
파이썬 Mindwave 라이브러리를 사용할 수 있다.
EEG 세트를 자작으로 구현해 볼 수 있다.
2017-07-10: tmux-continum 추가
{:.right-history}
Tmux는 terminal multiplexer로 서버에 여러 프로그램을 세션에 저장하고, 다른 작업 혹은 연결을 끊었다 다시 접속해서 세션을 열어 작업을 이어갈 수 있다.
{: width=”600”}
[그림. Tmux 실행 모습 (tmux.github.io)]
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 는 설치과정 중에 인증과 관련해 설정하는 부분이 없어서 설치 후 누구나 DB에 접속 할 수 있다. 인증을 추가해 데이터베이스 관리자와 데이터베이스 사용자로 구분해서 이용하고, 각 데이터베이스의 사용자는 허가된 역할(Role)을 가지고 데이터베이스에 접근 가능하도록 구성한다.
2018-06-22 내용 정리, User auth 링크
{:.right-history}
이 문서는 MongoDB Community Edition 3.4 버전을 64bit OS인 Amd64, Arm64 지원 OS에 설치해 사용하기 위해서 Install MongoDB Community Edition, on-ubuntu를 따라서 진행했다.
여기서는 Arm을 사용하는 SBC[^2] 컴퓨터에 mongodb 3.4 버전을, Hardkernel Odroid C2를 사용해서 설치를 진행했다.
Ubuntu/Debian ARM Cross compile 환경
이 글은 우분투, 리눅스 박스에서 GNU ARM Cross compiler 를 설치하고 관리하는 방법을 다루고 있다.
2018-05-17: sidebar.nav/linux 사용
{: .right-history}
우분투/데비안 리눅스에서 제공하는 ARM Toolchain 환경은 Linaro 툴체인을 바탕으로 만들어져 있어서 두가지 버전으로 제공된다. Hard Float을 지원하는 버전과 그렇지 않은 버전이다.[^1]
Nginx - HTTPS and Certificate SSL
Nginx를 HTTPS를 사용할 수 있도록 사설 인증서와 그리고 공인 인증서를 이용해 SSL을 활성화 하는 과정을 정리했다.
Nginx 설치와 서버, 프락시 등의 사용 방법에 대해서는 Nginx on Ubuntu/Debian 문서를 참조한다.