[linux] Iptables & Filter logging

리눅스 패키지중 강력한 네트워크 패킷 필터링 도구인 iptables의 간단한 내용을 정리합니다..

제가 사용하는 개인서버에서는 아래와 같은 설정만을 이용합니다.

iptables 명령어를 이용하거나,  system-config-firewall   또는 스크립트를 생성하여 이용하기도합니다만

/etc/sysconfig/iptables 에 룰을 직접 지정하여 사용하는 것이 편할 수 도 있습니다.

 

아래 처럼 제가 사용하고 있는 샘플을 보시면, 개인 vpn 에 대해서는 모두 허용하고 그 외 모든 인터페이스에서

접근하는 패킷에 대해서는 INPUT Chain 에서 차단합니다.

 

해당 서버가 프록시, 메일, vpn, db 등으로 꾹꾹 눌러담아 사용하다보니 외부에서 의도적으로 접속하는 경우가 있는데요.

해당 부분에 대해서는 과도한 접근 시도를 확인하면, DROPLOG 라는 체인을 별도로 만들어서 해당 체인으로 점프 시킨 후 로그를 확인 하거나, 패킷을 드랍 시키는 용도로 사용하고 있습니다.

 

생성 시킨 로그는 별도 커스텀 로그로 생성하여 관리 할 수도 있는데 관련해서는 syslog 설정에 별도로 추가하여,  제가 따로 명시한 로그 프리픽스인 [Firewall] 을 필터로 /var/log/firewall.log 등으로 커스텀하게 생성할 수 있습니다.

생성 시 아래와 같은 형태로 로그를 남겨 필터링 할 수 있습니다.

아래 예시에서는 로그 프리픽스를 iptables denied 와 iptables VPN으로 생성하여 모니터링 한 예입니다.

 

방화벽 로그

[255434.143314] iptables denied: IN=eth0 OUT= MAC=06:3e:a8:fd:1b:86:06:dc:04:XX:XX:XX:XX SRC=1.2.3.4 DST=10.10.10.100 LEN=52 TOS=0x00 PREC=0x00 TTL=107 ID=19009 DF PROTO=TCP SPT=58139 DPT=25 WINDOW=8192 RES=0x00 SYN URGP=0 

 

[255982.927075] iptables VPN: IN=sunghovpn OUT= MAC= SRC=192.168.192.6 DST=10.10.10.100 LEN=64 TOS=0x00 PREC=0x00 TTL=64 ID=43356 DF PROTO=TCP SPT=51934 DPT=22 WINDOW=65535 RES=0x00 SYN URGP=0 

 

 

방화벽 설정

[root@mail ~]# cat /etc/sysconfig/iptables

# Firewall configuration written by system-config-firewall

# Manual customization of this file is not recommended.

*filter

:INPUT ACCEPT [0:0]

:FORWARD ACCEPT [0:0]

:OUTPUT ACCEPT [0:0]

-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

-A INPUT -p icmp -j ACCEPT

-A INPUT -i lo -j ACCEPT

# LOG to VPN

# IF YOU NEED MONITORING , THIS OPTION ENABLE

#-A INPUT -m limit --limit 5/min -s 192.168.192.0/24 -j LOG --log-prefix "[Firewall] VPN: " --log-level 6

# BAN IP LIST

##############################################

# create RULE

-N DROPLOG 

# Input Drop IP rule

-A INPUT -s 185.125.6.105/32 -j DROPLOG

-A INPUT -s 50.243.196.29/32 -j DROPLOG

-A INPUT -s 120.92.233.86/32 -j DROPLOG

-A INPUT -s 197.14.14.150/32 -j DROPLOG

-A INPUT -s 203.198.207.61/32 -j DROPLOG

# Drop RULES logging and Drop

# IF YOU NEED DROP PACKET MONITORING, THIS OPTION ENABLE

#-A DROPLOG -m limit --limit 5/min -j LOG --log-prefix "[Firewall] Drop: " --log-level 6

-A DROPLOG -j DROP

##############################################

# FTP 

-A INPUT -m state --state NEW -m tcp -p tcp --dport 20 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT

# manage console with private key

-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT

# SMTP mail server 

-A INPUT -m state --state NEW -m tcp -p tcp --dport 25 -j ACCEPT

# sungho POP3 port

-A INPUT -m state --state NEW -m tcp -p tcp --dport 110 -j ACCEPT

# sungho IMAP port 

-A INPUT -m state --state NEW -m tcp -p tcp --dport 143 -j ACCEPT

# sungho IMAPS port 

-A INPUT -m state --state NEW -m tcp -p tcp --dport 993 -j ACCEPT

# VPN for sungho

-A INPUT -m state --state NEW -m tcp -p tcp --dport 1234 -j ACCEPT

# Proxy for sungho

-A INPUT -m state --state NEW -m tcp -p tcp --dport 3333 -j ACCEPT

# Database sunghoDB

-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -s 10.10.10.0/24 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -s 192.168.192.0/24 -j ACCEPT

# FTP data transfer (Passive )

-A INPUT -m state --state NEW -m tcp -p tcp --dport 50020 -j ACCEPT

# Forward for interface

-A FORWARD -i sunghovpn -o eth0 -j ACCEPT

-A FORWARD -i eth0 -o sunghovpn -j ACCEPT

-A FORWARD -i sunghovpn -j ACCEPT

-A INPUT -i sunghovpn -j ACCEPT

 

# Another Input All deny with host not accepts message

-A INPUT -j REJECT --reject-with icmp-host-prohibited

COMMIT

 

 

 

1) 테이블(tables)

우선 iptables에는 테이블이라는 광범위한 범주가 있는데, 이 테이블은 filter, nat, mangle, raw 같은 4개의 테이블로 구성되며, 이중에서 우리에게 필요한 것은 필터링 규칙을 세우는 filter 테이블이다.

2) 체인(chain)

iptables에는 filter 테이블에 미리 정의된 세가지의 체인이 존재하는데 이는 INPUT, OUTPUT, FORWARD 이다. 이 체인들은 어떠한 네트워크 트래픽(IP 패킷)에 대하여 정해진 규칙들을 수행한다.

가령 들어오는 패킷(INPUT)에 대하여 허용(ACCEPT)할 것인지, 거부(REJECT)할 것인지, 버릴(DROP)것인지를 결정한다.

  • INPUT : 호스트 컴퓨터를 향한 모든 패킷
  • OUTPUT : 호스트 컴퓨터에서 발생하는 모든 패킷
  • FORWARD : 호스트 컴퓨터가 목적지가 아닌 모든 패킷, 즉 라우터로 사용되는 호스트 컴퓨터를 통과하는 패킷

3) 매치(match)

iptables에서 패킷을 처리할때 만족해야 하는 조건을 가리킨다. 즉, 이 조건을 만족시키는 패킷들만 규칙을 적용한다.

  • –source (-s) : 출발지 IP주소나 네트워크와의 매칭
  • –destination (-d) : 목적지 ip주소나 네트워크와의 매칭
  • –protocol (-p) : 특정 프로토콜과의 매칭
  • –in-interface (i) : 입력 인테페이스
  • –out-interface (-o) : 출력 인터페이스
  • –state : 연결 상태와의 매칭
  • –string : 애플리케이션 계층 데이터 바이트 순서와의 매칭
  • –comment : 커널 메모리 내의 규칙과 연계되는 최대 256바이트 주석
  • –syn (-y) : SYN 패킷을 허용하지 않는다.
  • –fragment (-f) : 두 번째 이후의 조각에 대해서 규칙을 명시한다.
  • –table (-t) : 처리될 테이블
  • –jump (-j) : 규칙에 맞는 패킷을 어떻게 처리할 것인가를 명시한다.
  • –match (-m) : 특정 모듈과의 매치

4) 타겟(target)

iptables는 패킷이 규칙과 일치할 때 동작을 취하는 타겟을 지원한다.

  • ACCEPT : 패킷을 받아들인다.
  • DROP : 패킷을 버린다(패킷이 전송된 적이 없던 것처럼).
  • REJECT : 패킷을 버리고 이와 동시에 적절한 응답 패킷을 전송한다.
  • LOG : 패킷을 syslog에 기록한다.
  • RETURN : 호출 체인 내에서 패킷 처리를 계속한다.

REJECT는 서비스에 접속하려는 사용자의 액세스를 거부하고 connection refused라는 오류 메시지를 보여주는 반면 DROP은 말 그대로 telnet 사용자에게 어떠한 경고 메시지도 보여주지 않은 채 패킷을 드롭한다. 관리자의 재량껏 이러한 규칙을 사용할 수 있지만 사용자가 혼란스러워하며 계속해서 접속을 시도하는 것을 방지하려면 REJECT를 사용하는 것이 좋다.

5) 연결 추적(Connection Tracking)

iptables는 연결 추적(connection tracking)이라는 방법을 사용하여 내부 네트워크 상 서비스 연결 상태에 따라서 그 연결을 감시하고 제한할 수 있게 해준다. 연결 추적 방식은 연결 상태를 표에 저장하기 때문에, 다음과 같은 연결 상태에 따라서 시스템 관리자가 연결을 허용하거나 거부할 수 있다.

  • NEW : 새로운 연결을 요청하는 패킷, 예, HTTP 요청
  • ESTABLISHED : 기존 연결의 일부인 패킷
  • RELATED : 기존 연결에 속하지만 새로운 연결을 요청하는 패킷, 예를 들면 접속 포트가 20인 수동 FTP의 경우 전송 포트는 사용되지 않은 1024 이상의 어느 포트라도 사용 가능하다.
  • INVALID : 연결 추적표에서 어디 연결에도 속하지 않은 패킷

상태에 기반(stateful)한 iptables 연결 추적 기능은 어느 네트워크 프로토콜에서나 사용 가능하다. UDP와 같이 상태를 저장하지 않는 (stateless) 프로토콜에서도 사용할 수 있다.

6) 명령어(commond)

  • -A (–append) : 새로운 규칙을 추가한다.
  • -D (–delete) : 규칙을 삭제한다.
  • -C (–check) : 패킷을 테스트한다.
  • -R (–replace) : 새로운 규칙으로 교체한다.
  • -I (–insert) : 새로운 규칙을 삽입한다.
  • -L (–list) : 규칙을 출력한다.
  • -F (–flush) : chain으로부터 규칙을 모두 삭제한다.
  • -Z (–zero) : 모든 chain의 패킷과 바이트 카운터 값을 0으로 만든다.
  • -N (–new) : 새로운 chain을 만든다.
  • -X (–delete-chain) : chain을 삭제한다.
  • -P (–policy) : 기본정책을 변경한다.

7) 기본 동작

  1. 패킷에 대한 동작은 위에서 부터 차례로 각 규칙에 대해 검사하고, 그 규칙과 일치하는 패킷에 대하여 타겟에 지정한 ACCEPT, DROP등을 수행한다.
  2. 규칙이 일치하고 작업이 수행되면, 그 패킷은 해당 규칙의 결과에 따리 처리하고 체인에서 추가 규칙을 무시한다.
  3. 패킷이 체인의 모든 규칙과 매치하지 않아 규칙의 바닥에 도달하면 정해진 기본정책(policy)이 수행된다.
  4. 기본 정책은 policy ACCEPT , policy DROP 으로 설정할 수 있다.

일반적으로 기본정책은 모든 패킷에 대해 DROP을 설정하고 특별히 지정된 포트와 IP주소등에 대해 ACCEPT를 수행하게 만든다.

 

 

[linux] Mailx 를 이용한 HTML 폼 전송.

지난번 글에는 mailx를 이용하여 파일을 첨부하여 전달하는 방법에 대해 공유 드렸습니다.

관련 링크 : http://blog.hongstalk.com/?p=310

 

이번에는 mailx 를 이용한 HTML 컨텐츠 타입의 폼을 생성하여 전송하는 방법에 대해 공유 합니다.

방법은 subject , 제목을 입력 할때 subject header 밑에 content-type을 명시하는 방법을 사용합니다.

 

커멘드는 아래와 같습니다.

mail -S smtp=localhost:25 -s "$(echo -e 'HI TEST\nContent-type: text/html')" -r noreply@jinstalk.com nic2hong@jinstalk.com < hong.html

위의 부분에 hong.html 에는 테스트를 위해 적당한 내용을 작성합니다.

<html>

<head> sungho </head>

<body>

<h1><center>Sungho TEST</center></h1>

<br>

<br>

<font color=red>This is</font> Sparta.

</body>

</html>

 

위와 같은 형태로 하실때 주의 하실 점은

-s 뒤에 “$( 부분에 echo -e 옵션입니다. \n을 통해서 줄 바꿈을 적용하기 위해서는 해당 옵션을 꼭 넣어주세요.

 

발송이 완료 되면 다음과 같은 형태로 메일이 날아갑니다.

아래 부분은 실제 HTML 타입으로 날아간 메일의 해더 순서에 주목해주시면 됩니다.

(제목 바로 밑에 컨텐츠 타입 : 하이퍼텍스트 명시되어 있는 부분이 echo 를 통해서 추가된 헤더입니다. )

[Linux] 내장변수 & Exit Code 정리

자주 사용하고 친숙? 하지만 매번 기억이 나질 않는..

그 녀석들 저장해둡니다.

 

Shell 내장변수
$$ : 
해당 프로세스의 PID
$? : 
가장 최근에 실행한 명령의 종료값
$# : 
프로그램에 전달된 인수의 개수
$0 : 
명령수행시 명령의 이름을 기억하는 변수값
$n : 
전달된 n번째 인수(ex:$1,$2)
$* : 
전달된 인수들 전체를 하나의 문자열로 표시함
$@ : 
전달된 인수들 전체를 문자열의 목록으로 표시함
$! : 
마지막으로 실행된 백그라운드 프로세스 pid

 

 

Shell exit code  ( 내장변수 $? 에 저장되어 다음 쉘에서 활용가능 )

  0 : Successful completion of the command
1 : General unknown error
2 : Misuse of shell command
126 : The command can’t execute
127 : Command not found
128 : Invalid exit argument
128+x : Fatal error with Linux signal x
130 : Command terminated with Ctrl-C
255 : Exit status out of range

[linux] jq 1.5 release – build RPM

jq 란 ?

lightweight and flexible command-line JSON processor.

api 호출등에 데이터를 주고받는데 있어, 최근 json포멧을 사용하는 경우가 많습니다.

커멘드라인을 이용해서 curl등의 도구를 이용해서 데이터를 가져오는 경우 해당 데이터를 json 포멧등으로 (일반적으로 pretty form) 변환 하거나 sed, awk , grep 등 다양한 데이터 파싱이 가능한 도구입니다.

 

최근 …(이래도 2015년 8월 15일) 1.5버전이 릴리즈 되어 있으니, 이걸 RPM 으로 빌드하고, 사용해봅시다.

 

 

https://stedolan.github.io/jq/download/

최신버전 1.5를 빌드 하기 위해 해당 사이트를 방문하여 최신버전의 소스 파일을 다운 받습니다.

 

wget https://github.com/stedolan/jq/releases/download/jq-1.5/jq-1.5.tar.gz

 

SPEC 생성

빌드뤼카이어, valgrind 설치

1.5 버전 에서   bison 3.0이하의 버전에서는 아래와 같이 컨피그 옵션을 수정합니다.
빌드 하는 환경은 cent6 이므로, 2.7 버전이 설치되어 있습니다.

./configure –disable-maintainer-mode

 

추가로 make check 가 진행될 때 setup.sh 에서 참조하는 것중

PASS: tests/mantestPASS: tests/jqtestFAIL: tests/onigtestPASS: tests/shtest

 

위에 onigtest 가 실패하는 것은  테스트 작업 설정시 oniguruma.h 를 참조하기 때문인데요.

이는 setup.sh를 수정하여 리패키징 하거나, oniguruma-devel 패키지를 설치하여, 해당 해더를 위치시킨후 처리가능합니다.

 

또한 1.5서 추가되는 라이브러리 패스가 추가되어 https://github.com/stedolan/jq/blob/master/jq.spec 처럼 %{_libdir} 을 추가할 필요가 있습니다.

 

 

rpm 명세서.

Name:           jq

Version:        1.5

Release:        1%{?dist}

Summary:        Command-line JSON processor

License:        MIT and ASL 2.0 and CC-BY and GPLv3

URL:            http://stedolan.github.io/jq/

Source0:        http://stedolan.github.io/%{name}/download/source/%{name}-%{version}.tar.gz

BuildRequires:  flex

BuildRequires:  bison

%ifarch %{ix86} x86_64

BuildRequires:  valgrind

%endif

%description

lightweight and flexible command-line JSON processor

 jq is like sed for JSON data – you can use it to slice

 and filter and map and transform structured data with

 the same ease that sed, awk, grep and friends let you

 play with text.

 It is written in portable C, and it has zero runtime

 dependencies.

 jq can mangle the data format that you have into the

 one that you want with very little effort, and the

 program to do so is often shorter and simpler than

 you'd expect.

%prep

%setup -qn %{name}-%{version}

%build

%configure --disable-maintainer-mode

make %{?_smp_mflags}

# Docs already shipped in jq's tarball.

# In order to build the manual page, it

# is necessary to install rake, rubygem-ronn

# and do the following steps:

#

# # yum install rake rubygem-ronn

# $ cd docs/

# $ curl -L https://get.rvm.io | bash -s stable --ruby=1.9.3

# $ source $HOME/.rvm/scripts/rvm

# $ bundle install

# $ cd ..

# $ ./configure

# $ make real_docs

%install

make DESTDIR=%{buildroot} install

%check

# Valgrind used, so restrict architectures for check

%ifarch %{ix86} x86_64

make check

%endif

%files

%{_bindir}/%{name}

%{_datadir}/man/man1/jq.1.gz

%{_datadir}/doc/jq/AUTHORS

%{_datadir}/doc/jq/COPYING

%{_datadir}/doc/jq/README

%{_datadir}/doc/jq/README.md

%{_includedir}/jq.h

%{_includedir}/jv.h

%{_libdir}/libjq.a

%{_libdir}/libjq.la

%{_libdir}/libjq.so

%{_libdir}/libjq.so.1

%{_libdir}/libjq.so.1.0.4

%changelog

* Wed Nov 30 2016 Sungho Hong <nic2hong@jinstalk.com> - 1.5-1

- Initial package release for 1.5 jq.

[linux] mail command 를 이용하여 파일 첨부 발송.

간혹 커멘드 라인을 이용한 메일을 보낼 시 특정 SMTP를 이용하며, 또 파일을 첨부하여 메일을 보내야할 필요가 있습니다.

주로 백업 확인이나, 스케쥴링등에 사용될 것 같은데요. 아래와 같은 커멘드를 이용하시면 됩니다.

 

 

mail -S smtp=mail.jinstalk.com:25 -s “file test by hong” -r noreply@jinstalk.com -v -a ./test.sh nic2hong@jinstalk.com < sungho.txt

 

해당 구문은 ./test.sh 라는 파일을 첨부한 메일을

sungho.txt 라는 파일 내용을 본문으로 하여 메일을 발송해주는 mailx 커멘드입니다.

해당 커맨드는 당연히  mailx 패키지가 설치되어 있어야합니다.

 

AWS EIP 서브넷별 고정할당

아마존을 운영하다보면 상태 유지를 위한 오토스케일링으로 desire & Min/Max 수치를 고정하여,

해당 서버를 유지해야 할 필요가 있다.

 

이런 경우, Nat가 아닌 해당 서버의 고정아이피를 할당하는 방법이 필요하게 되어 아래와 같이 스크립트를 진행하게 되었다.

 

상황은 두개의 AZ 에 각각 서버가 위치하고, 인스턴스 헬스체크가 실패하는 경우 신규 인스턴스로 교체 되며, 기존에 사용하던 EIP를 고정적으로 할당하는 방법에 대한 설명이다.

 

#!/bin/bash -ex
## made by hong

# Enable AWS account
export AWS_ACCESS_KEY_ID=”아마존 엑세스 키”
export AWS_SECRET_ACCESS_KEY=”아마존 시크릿 키”

# Availability Zone Elastic IP Azone Bzone DEFINE
EIPA=”서브넷 A에 할당할  EIP아이디 (eipalloc-xxxx1234)”
EIPB=”서브넷 B에 할당할  EIP아이디 (eipalloc-xxxx5678)”

# Get Self Instance infomation
INSTANCEID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)
REGION=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone | sed -e ‘s/.$//’)
AZ=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone)

if [ “$AZ” == “ap-northeast-1a” ]
then
    aws –region ${REGION} ec2 associate-address –instance-id ${INSTANCEID} –allocation-id ${EIPA}
elif [“$AZ” == “ap-northeast-1b” ]
then
    aws –region ${REGION} ec2 associate-address –instance-id ${INSTANCEID} –allocation-id ${EIPB}
else 
    echo “no define AZ your zone is ${AZ}”
    exit 2
fi

exit 0

 

위와 같은 스크립트가, POST로 실행되도록 설정을 해놓는다.

서버가 배포되면서 해당 스크립트가 실행되면 기존에 제거된 인스턴스에서 반환된 EIP를 다시 고정적으로 받아오게 된다.

Rsync + SSH 키인증 싱크 방식

서비스를 운영하다보면, 22 (SSH) 는 접근이 가능하지만,

Rsync 데몬을 올려 873 (rsync protocol) 을 통해서 받아올 수 없는 경우가 종종 존재한다.

단순 scp는 remote copy를 진행할때 파일에 대한 체크나 비교를 거치지 않고 overwrite를 진행하기때문에, 기존 파일과 싱크를 맞추는 경우보다 더 많은 트래픽이 발생할 수 있다.

 

일반적으로 Rsync 에 SSH 를 이용한 싱크에는 remote host 에 authorized_keys에 퍼블릭 키를 입력하는 경우가 다수였으나,

실제로는 아래와 같은 형태를 통해서 접속이 가능하다.

다음과 같은 명령어를 통해서 ssh의 인증을 획득하여 통신한다.

 

rsync -av -e ‘ssh -i /pathtokey/id_rsa’ user@hongstalk.com:/pathtofile/ /targettofile/

 

 

 

[linux] 컬러풀하고 사용이 간단한 모니터링 도구 dstat

Dstat 패키지를 설치한다.

패키지가 없으면 여기서 직접 wget 으로 다운받아서 설치하면 된다.

 

http://dag.wieers.com/

 

 

사용법

아래와 같은 형식으로 사용가능하며

dstat [-afv] [options..] [delay [count]]

 

여기서 사용하는옵션들에 대해 간단히 알아보자

 

-c, –cpu  cpu 상태를 모니터링 한다

-C 옵션을 주고 각코어별로 모니터링도 가능하다

ex) -c -C 0,1,2,3,total

-d, –disk disk 상태를 모니터링 한다

-D 옵션을 주고 각디스트별로 모니터링도 가능하다

ex) -d -D sda,sdb,hda,total

-g, –page page 상태를 모니터링 한다

-i, –int  interrupt 상태를 모니터링 한다

-I 5,10 include interrupt 5 and 10

-l, –load  load 상태를 모니터링 한다

-m, –mem  memory 상태를 모니터링 한다

-n, –net  network 상태를 모니터링 한다

-N 옵션을 주고 각 이더넷 인터페이스 별로 모니터링도 가능하다

ex) -n -N eth1,total

-p, –proc  process 상태를 모니터링 한다

-s, –swap  e swap 상태를 모니터링 한다

-S 옵션을 주고 각 SWAP 별로 모니터링도 가능하다

ex) swap1,total

-t, –time    아웃풋 주기와 카운터를 설정하다

-y, –sys  system 상태를 모니터링 한다

–ipc      ipc 상태를 모니터링 한다

–lock      lock 상태를 모니터링 한다

–raw      raw 상태를 모니터링 한다

–tcp      tcp 상태를 모니터링 한다

–udp      udp 상태를 모니터링 한다

 

–output file  CVS현태로 저장되며 파일경로를 설정한다

 

짧게 모니터링을 하고 싶을때는

 

# dstat -f 명령어를 통해서 Full 상태 모니터링을 진행한다.

 

 

 

[linux] Rsyslog 설정 , 추가 MySQL로 저장하는 법

Rsyslogd

 

시스템 로그를 기록하는 Rsyslog 데몬 동작에 대한 설명

 

참고.1 : # /sbin/rsyslogd -d  [디버깅 모드] 

참고.2 : 참고 문서 URL (http://www.rsyslog.com/doc)

 

Rsyslog 설정 파일 위치

 

/etc/rsyslog.conf

 

Mysql 을 사용하는 방법

yum install rsyslog-mysql 설치

설정을 다음과 같이 수정

$ModLoad ommysql.so

 ## mysql 라이브러리 모듈 로드

## DB 템플릿에 맞춰 넣어주는 센스 

$template dbFormat,”insert into SystemEvents (Message, Facility, FromHost, Priority, DeviceReportedTime, ReceivedAt, InfoUnitID, SysLogTag) values (‘%msg%’, %syslogfacility%, ‘%FROMHOST%’, %syslogpriority%, ‘%timereported:::date-mysql%’, ‘%timegenerated:::date-mysql%’, %iut%, ‘%syslogtag%’)”,SQL

*.* :ommysql:127.0.0.1,디비명,아디,비번;dbFormat

 

예시

포트 접근 허용이되어있어야한다.

$ModLoad ommysql.so

$template dbFormat,”insert into SystemEvents (Message, Facility, FromHost, Priority, DeviceReportedTime, ReceivedAt, InfoUnitID, SysLogTag) values (‘%msg%’, %syslogfacility%, ‘%FROMHOST%’, %syslogpriority%, ‘%timereported:::date-mysql%’, ‘%timegenerated:::date-mysql%’, %iut%, ‘%syslogtag%’)”,SQL

*.info;mail.none;authpriv.none;cron.none :ommysql:10.0.0.60,Syslog,root,tobicom;dbFormat

 

 

 

 

파일을 로드하는법

$ModLoad imfile

 $InputFileName /var/log/test.log

 $InputFileTag Sungho-Tag:

 $InputFileStateFile stat-Custom

 $InputFileSeverity info

 $InputRunFileMonitor

 

# Provides UDP syslog reception

#$ModLoad imudp

#$UDPServerRun 514

# Provides TCP syslog reception

#$ModLoad imtcp

#$InputTCPServerRun 514

*.* @@10.0.0.60:514

 골뱅이 하나면 UDP, 두개면 TCP

[linux] Self Signed Certificate SSL

OpenSSL 에서 self signed certificate 생성 및 apache httpd 에 SSL 적용

웹서비스에 https 를 적용할 경우 SSL 인증서 발급 기관에서 유료로 해당 도메인에 대해 발급 받으면 되지만 테스트 서버거나 예산등의 이유로 발급 받지 못할 경우가 있다.

이럴때 OpenSSL 을 이용하여 Self signed certificate 를 생성 & apache httpd 에 연계하는 법을 정리해 본다

Self Signed Certificate 생성

Self Signed Certificate(SSC) 란 무엇일까?

digital certificate는 발급기관(CA) 이 있게 마련이다. Web Browser 마다 VeriSign 이나 comodo 같은 유명 CA 들의 인증서를 신뢰하는 CA로 미리 등록해 놓으므로 저런 기관에서 발급된 SSL 인증서를 사용해야 browser 에서는 웹서비스를 신뢰할수 있는데

SSC 는 인증서를 만들고 개인키로 직접 인증서에 서명한 것이다. 당연히 browser는 모르는 기관이 발급한 인증서이므로 보안 경고를 발생시킬 것이나 테스트 사용에는 지장이 없다.

CSR(Certificate Signing Request)?

공개키 기반(PKI) private key(개인키) public key(공개키)로 이루어져 있다. 인증서라고 하는 것은 내 공개키가 맞다고 인증기관(CA)이 전자서명하여 주는 것이며 나와 보안 통신을 하려는 당사자는 내 인증서를 구해서 그 안에 있는 공개키를 이용하여 보안 통신을 할 수 있다.

CSR 은 인증기관에 인증서 발급 요청을 하는 특별한 ASN.1 형식의 파일이며 그안에는 내 공개키 정보와 사용하는 알고리즘 정보등이 들어 있다. 개인키는 외부에 유출되면 안 되므로 저런 특별한 형식의 파일을 만들어서 인증기관에 전달하여 인증서를 발급 받는다.

(사용자들이 CSR 생성등을 어려워하니 인증서 발급 대행 기관에서 개인키까지 생성해서 보내주고는 한다.)

OpenSSL 

      1. RSA 기반의 private key 생성
        cd /etc/pki/tls/private
        openssl genrsa -des3 -out myhost.key 1024
      2. CSR(Certificate Signing Request) 생성
        custom_openssl.conf

[ req ]

default_bits            = 2048

default_md              = sha1

default_keyfile         = privkey.pem

distinguished_name      = req_distinguished_name

[req_distinguished_name ]

countryName                     = Country Name (2 letter code)

countryName_default             = KR

countryName_min                 = 2

countryName_max                 = 2

# 회사명 입력

organizationName              = Organization Name (eg, company)

organizationName_default      = University of Wisconsin — Madison

# 부서 입력

organizationalUnitName          = Organizational Unit Name (eg, section)

organizationalUnitName_default  = Condor Project

# SSL 서비스할 domain 명 입력

commonName                      = Common Name (eg, your name or your server’s hostname)

commonName_default             = myhost.co.kr

commonName_max                  = 64

openssl req -new -key myhost.key -out myhost.csr -config custom_openssl.conf

      1. Remove Passphrase from key
        개인키를 보호하기 위해 Key-Derived Function 으로 개인키 자체가 암호화되어 있다. 인터넷 뱅킹등에 사용되는 개인용 인증서는 당연히 저렇게 보호되어야 하지만 SSL 에 사용하려는 키가 암호가 걸려있으면 httpd 구동때마다 pass phrase 를 입력해야 하므로
        암호를 제거한다.

        cp myhost.key myhost.key.enc
        openssl rsa -in myhost.key.enc -out myhost.key

보안 경고

개인키의 유출 방지를 위해 group 과 other의 permission 을 모두 제거한다.

chmod 600 myhost.key

      1. self-signed certificate 생성시 입력할 custom_openssl.conf 생성
      2. self-signed 인증서 생성
        openssl x509 -req -days 365 -in myhost.csr -signkey myhost.key -out ../certs/myhost.crt
      3. 제대로 생성되었는지 확인을 위해 인증서의 정보를 출력해 본다.
        openssl x509 -text -in ../certs/myhost.crt 
      4.  msts

apache httpd 에 SSL 적용

      1.  vi /etc/httpd/conf.d/ssl.conf 
      2. 다음 내용 추가
        NameVirtualHost *:443 
      3. SSL 을 적용할 VirtualHost 를 설정한다.

<VirtualHost *:443>

ServerName myhost

SSLEngine on

SSLCertificateFile /etc/pki/tls/certs/myhost.crt

SSLCertificateKeyFile /etc/pki/tls/private/myhost.key

SetEnvIf User-Agent “.*MSIE.*” nokeepalive ssl-unclean-shutdown

CustomLog logs/ssl_request_log \

   “%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \”%r\” %b”

</VirtualHost>

      1. service httpd restart
      2. Web browser에서 https 로 연결해서 제대로 보이는지 확인한다.

    • Browser가 Host Header 를 보내야하나 SSL의 경우 Host Header를 보내기전 서버 인증서가 오므로
      SSL 에 대해서 Multiple VirtualHost 가 불가함.
    • 위 문제를 해결하기 위해서는 SNI(Server Name Indication – RFC 4366) 을 지원하는 SSL Library
      (OpenSSL 0.9.8j 이상, Java 7 JSSE 이상)와 
      Web Server(apache 경우 2.2.12 이상),
      Web Browser(IE7 이상, FF2 이상 등)를 사용해야 함.
    • Windows XP 는 SNI 를 지원하지 않으므로 IE 버전과 상관없이 에러 발생(관련 링크).

원본 위치 <http://lesstif.tistory.com/entry/OpenSSL-%EC%97%90%EC%84%9C-self-signed-certificate-%EC%83%9D%EC%84%B1-%EB%B0%8F-apache-httpd-%EC%97%90-SSL-%EC%A0%81%EC%9A%A9>