카테고리 글 보관함: 우분투 서버 18.04 LTS

원격 접속 상태에서 iptables 의 안전한 적용 방법

iptables 의 특성

일단 iptables 의 특성에 대해서 알아보자. iptables를 쓴다면 알아야한다…

iptables 에 입력한 내용은 바로 적용된다.
단, 시스템 재기동을 하면 디폴트 파일로 초기화 되어, 추가된 내용은 사라진다.
디폴트 파일은 우분투 18.04의 경우에는 /etc/iptables/rules.v4, /etc/iptables/rules.v6 에 저장되어 있다. 시스템에 따라서 파일 위치나 파일명이 많이 다른듯하니 자신의 시스템명으로 검색해 볼것.
즉, 이 파일들을 수정해 주지 않으면 재기동으로 인해 iptables 에 설정한 내용이 사라진다는 것.

주의할 점이 있는데 fail2ban이나 openvpn 등에서는 이 iptables 가 재기동하면 초기화 된다는걸 반영해서, 시스템 재기동 후에 iptables 에 내용을 추가하도록 스크립트가 짜여져 있다.
그래서 현재 iptables 내용을 보는 iptables -L 명령으로 확인 후, 아래 iptables 내용을 저장하는 커맨드로 그 내용을 재기동시 읽어들이는 디폴트 파일에 아무생각 없이 덮어써버리면 디폴트 파일의 내용과 fail2ban의 기동 스크립트 내용이 중복되어 iptables 에 등록되게 된다. 뭐 같은 내용이기 때문에 중복으로 되어도 딱히 문제는 없지만, 이과들은 이런거 기분이 좋지 않겠지? ㅎㅎ
그래서 그렇게 중복되는 부분이 없도록 잘 생각해서 디폴트 파일에 내용을 덮어 써야한다.

iptables 저장 방법

저장한 내용을 복원하는 방법

iptables 의 안전한 적용 방법

자, 본론인 원격 접속 상태에서 iptables 내용을 안전하게 적용하는 방법을 알아보자.

원격으로 접속했을 때도 그렇지만, 특히 클라우드의 VPS 환경이라면 실제 단말에는 접속이 불가능하고 항상 원격으로 SSH 로 접속하기 때문에, 넣는 즉시 적용되어버리는 iptables 에 잘못된 내용을 넣으면, 영영 접속을 할 수 없는 경우가 생긴다. 돌아올 길은 서버 재기동 설정이 있는 환경이라면 서버 재기동으로 디폴트 파일로 인해 iptables가 초기화 되면서 그나마 접속할 수 있게 되지만, 서버 재기동 방법이 제공되지 않거나, 어떻게 하는지 모를 경우에는 참 위험하지 않을 수 없다.

iptables-apply 커맨드를 사용하면 안전하게 iptables를 적용할 수 있다. 아래 커맨드는 iptables.conf 파일의 내용을 적용해서 30초 후까지 응답이 없을 경우 원래 iptables 의 내용으로 되돌려 준다.

실제 커맨드를 실행하면 아래와 같이 진행된다.

30초간 아무 선택을 하지 않을 경우…

그래 문제가 안생기면 리눅스가 아니지…
일단 fail2ban 에 ipset 로 설정된 세트가 제대로 반영이 안되는것 같은데, fail2ban 0.10.2 버전에서는 고쳐진 것 같은데, 이것 때문에 귀찮게 버전업하지는 않겠다.
그냥 fail2ban 재기동으로 iptables 에 fail2ban 설정이 다시 들어가니 그냥 서비스 재기동 하자.

에러는 안났지만, openvpn 의 iptables 설정도 날아가버리던데, openvpn은 서비스 재기동을 해도 iptables 설정이 살아나지 않는다. 서버 재기동 해야할듯.

어쨋든 iptables-apply 명령을 쓰면 안전하게 iptables 내용을 되돌려 준다는 것은 확인했으니, 잘 이용해 보도록 하자.

참고: Is it enough adding iptables rules without restart?

관련글: 우분투 서버 18.04 iptables 서버 재기동으로 초기화 되는 문제

우분투 18.04 fail2ban 설정 iptables ipset 을 사용한 밴

Update 2022/10/18
우분투 서버 22.04에서도 똑같이 적용 가능한 것을 확인.

집에 있는 서버를 사용할 때는 ssh 에 접속하는 22번 포트를 다른 포트 번호로 바꿔서 쓰거나 공유기의 포트포워딩으로 외부 1022번 포트를 내부 22번으로 연결해서 사용하거나 해서 딱히 외부에서 ssh로 무작위 대입 공격 같은건 당하지 않았다.
지금 쓰고 있는 오라클 클라우드 서버에서는 포트포워딩이 되는지도 모르겠고, 방화벽 문제도 있고 해서 ssh 디폴트값인 22번 포트를 사용하고 있는데, 얼마나 많이들 들어오는지… fail2ban을 설치하고 보니 3일 동안 밴한 IP가 천개는 가뿐히 넘었다.
방화벽을 기본 iptables 를 사용하고 있다보니, 밴한 IP 가 전부 iptables 에 저장되어서, iptables 건드리려고 하면 너무 양이 많아서 곤란해졌다.

iptables 가 비대해지면 속도도 느려지고 하니, ipset 을 설치해서 여러 IP를 세트로 묶어서 밴하도록 하자.

먼저 ipset 을 설치

fail2ban 을 설치안했으면 설치하자.

jail.local 파일을 작성 and 편집

jail.local 파일에 아래 내용을 쓴다.

[DEFAULT] 아래는 전체적으로 적용 되는 내용이고 [sshd] 는 ssh 접속에 한해서 적용되는 내용이다.
bantime 은 밴을 할 시간, findtime 은 이 시간 안에 접속 횟수가 초과 되면 밴을 한다.
ignoreip 는 밴을 하지 않을 IP 이다. 가정이라면 IP 가 바뀌기 때문에 소용이 없을테지만, 고정 IP 서버가 있다면 경유해서 접속이 가능하니 적어두면 좋다.
maxretry 는 ssh 공개키를 쓸때는 우리가 틀릴일이 없기 떄문에 0으로 설정해도 되지만, 패스워드를 입력해서 들어갈 경우에는 3이나 5정도로 여유를 두는게 좋다. 본인이 틀려서 밴 먹으면 곤란하겠지?

ipset을 사용해서 iptable로 밴을 하기 위해서 설정하는 것이 banaction 이다.
우분투 18.04 에서 ipset 을 설치하면 ipset -V 명령을 실행하면 표시 되는 프로토콜 버전이 6이기 때문에 iptables-ipset-proto6 을 사용한다. 우분투의 다른 버전이나 다른 리눅스 배포판을 사용하고 있으면 프로토콜 버전을 확인하고 설정하자. (6 이외에는 4 버전이 있다.)
banaction_allports 는 말그대로 모든 포트를 밴해버리는 설정인데, 딱히 다른 곳에서 저걸 사용하도록 설정하지 않는 이상 사용하진 않을 것이다.

jail.local 파일을 저장하고 fail2ban 서비스를 재기동하자.

기존에 iptables 에 밴 되어있는 IP가 있었다면 모두 ipset 에 옮겨서 저장되고, iptables 내용을 확인해 보면.

iptables 에는 아래와 같이 한줄만 들어가있다.

밴 당한 IP 들은 모두 ipset 에 f2b-sshd 라는 세트로 저장되어 있다. 아래 커맨드로 ipset 에 저장된 내용을 전부 확인 가능.

관련글: 우분투 서버 18.04 iptables 서버 재기동으로 초기화 되는 문제

우분투 서버 18.04 iptables 서버 재기동으로 초기화 되는 문제

오라클 클라우드는 우분투 서버 방화벽 서비스로 ufw 가 아니라 iptables 를 사용하고 있다.
아마도 다른 리눅스 배포판에서도 공통으로 쓸 수 있는 iptables 로 간단하게 설정하기 위해서 그런것 같은데, 덕분에 이것저것 문제가 생기네.

업데이트 적용으로 우분투 서버를 재기동하고나니 웹서버 접속이 안되서 왜 그러나 했더니, 열어두었던 http, https 포트가 다시 막혀서 그런 것이었다.

iptables 설정 내용 확인

여기 분명히 설정했었던 내용이 사라져 있어서 검색.
이것저것 거친 후에 결론은 /etc/iptables/rules.v4 파일의 내용으로 iptables 설정이 저장/로드 되니 이 파일에 설정 내용을 저장하라는 것.

현재 iptables 설정 내용을 저장하는 방법. (지워진 내용을 다시 추가한 다음에 실행할 것.)
백업하고 하자.

내 경우에는 sudo 를 썼는데도 퍼미션 디나이드가 떠서 루트로 바꾼 후에 저장했다.

이제 서버 재기동해도 저장된 내용이 잘 살아있는걸 볼 수 있다.

혹시 iptables-save 명령이 없으면 iptables-persistent 를 설치.

기타

openvpn-install.sh 로 openvpn을 설치하면 iptables에 이것저것 내용을 추가하는 서비스가 설치된다.

매번 서버 재기동할 때마다 추가되니 현재 iptables 내용을 rules.v4 파일에 저장했으면 서비스는 끄자.

관련 글: 오라클 클라우드 방화벽 설정에 대한 모든 것

Postgresql 12 버젼을 우분투 18.04 에 설치 설정

Postgresql 12 설치

참고 : Postgresql의 우분투용 설치 가이드

아래 명령으로 /etc/apt/sources.list.d 디렉토리에 pgdg.list 파일을 만들어 Postgresql 저장소를 추가한다.

우분투 버전이 18.04가 아닐 경우에는 ‘bionic’ 을 해당 우분투 버전이름으로 변경할것.

우분투 버전별 이름 (Postgresql 저장소에 존재하는 것만)
12.04 LTS precise
14.04 LTS trusty
16.04 LTS xenial
18.04 bionic
18.10 cosmic
19.04 disco
19.10 eoan

저장소 인증키를 추가

apt update / Postgres-12를 인스톨

유저 추가

아래 커맨드 중 elmitash 부분을 사용하고 싶은 아이디로 바꿀것.
postgres 유저로 바꾼 후, 새로운 유저를 추가
패스워드를 두번 입력

y를 입력해 관리자 권한을 준다

접속 테스트

외부 접속

postgresql.conf 파일을 수정

아래 부분을 찾아 주석 해제하고 localhost 를 * 로 바꾼다. 특정 IP에서만 접속할 경우엔 IP 주소를 쓰면 된다.

pg_hba.conf 파일을 수정

접속 인증을 할 IP 범위를 설정하기 위해서 아래 내용을 추가한다. 내부 네트웍일 경우 아래 내용에서 아이피 정도만 바꾸면 될듯.

설정을 마쳤으면 Postgresql 서비스 재시작

문제 해결

이놈의 방화벽… 진짜…
iptables 의 경우 숫자 6은 sudo iptables -L 로 확인해서 수정할 것.

ufw 의 경우는 간단.

오라클 클라우드는 인스턴스의 보안 목록에 수신 규칙을 추가해야한다. TCP의 5432번 포트를 개방.

관련 글: DB서버 외부에서 안전하게 접속하는 방법. DBeaver로 SSH 터널링 접속

무차별 대입 공격? 아파치 에러 메시지

아파치 웹서버의 에러 로그에 아래와 같은 에러가 다발하고 있었다.

아파치에서 디폴트로 잡혀있는 DocumentRoot 디렉토리(/var/www/html)에 공격 할만한 php 스크립트가 있는지 알아보려고 이런저런 이름의 php 파일명으로 대입해 보고 있는 로그이다.

아래 명령으로 디폴트 사이트 설정을 꺼버리면 워드프레스를 사용하고 있기 때문에 워드프레스의 루트에서 검색 되어지므로 일단 에러 메시지는 사라진다.

fail2ban을 쓰라는 글도 있던데 굳이 거기까지 할 필요성은 못 느껴서… 좀 생각해보고 적용하게 된다면 방법을 공유해 보겠다.