제공: 한빛 네트워크
저자: Rich Bowen, 이대엽 역
원문: Sending Apache httpd Logs to Syslog
여러분의 아파치 서버가 매번 요청을 받을 때 마다 아파치 서버는 하나 혹은 여러 개의 로그파일에 로그내용을 만든다. 이러한 로그파일들은 방문자에 대한 통계적 분석에서부터 서버 공격에 대한 포렌식 분석에 이르기까지 다양한 목적에 있어 유용하게 이용된다.
수많은 경우에 있어 이러한 로그들을 로컬 파일시스템에 기록하게 하는 것은 아무리 줄잡아 말해도 불편한 일이다. 두 가지 구체적인 시나리오가 머리에 떠오르는데, 아마도 여러분들의 머리 속에는 다른 시나리오들도 생각날 것이다.
첫 번째 시나리오는 불행히도 내 개인적인 경험에 관한 것이다. 공격자가 서버를 손상시킬 때 그들은 종종 서버를 손상시킨 다음에 "정리"를 하곤 하는데 따라서 여러분은 그들이 어떻게 침입했는지 추정할 수 없게 된다. 만약 공격자들이 신중하다면 정리과정에는 로그파일을 삭제하여 공격자가 어떠한 기법을 사용했는지 여러분이 알 수 없게끔 하는 것도 포함된다. 만약 그들이 웹 서버 자체를 침입도구로 사용했을 경우 특히 사실인데 여기에 한술 더 떠서 단순히 몇 개의 스크립트화 시켜놓은 익스플로잇만으로 간단히 모든 로그파일들을 삭제해버린다. 이러한 경우 다른 곳에 있는 이러한 로그파일들의 사본을 갖는 것은 매우 손쉬운 일이다.
두 번째 시나리오는 아마도 가능성이 더 적긴 하지만 그냥 재미있는 것으로 보면 된다. 여러분이 한대 이상의 서버-특히 수십대에서 수백대에 이르는-를 가지고 있을 경우 로그파일의 수가 많기 때문에 그것들을 살펴보는 것은 상당히 따분한 일거리가 된다. 이러한 경우 그 로그파일들을 하나의 중앙 저장소로 결합시키는 것이 쓸모 있는 일일지도 모르겠다.
지금까지의 두 가지의 경우 모두 로그파일들을 로컬 파일 시스템에 기록하는 것 보다는 그것들을 중앙 syslog 서버로 보내는 것이 이상적이다.
syslog에 로깅하기
공교롭게도 아파치 웹 서버에 관해 아는 사람이 거의 없는 한 가지는 여러분이 단 한 줄의 설정 지시자만으로 에러 로그를 syslog에 로깅할 수 있다는 것이다:
ErrorLog syslog:local1
이게 전부다. 이것은 아파치에게 에러로그 출력을 local1이라 불리는 syslog 기능으로 보내라고 명령한다. 물론 여러분도 여러분의 syslog 서버가 이러한 로그 출력을 다른 서버-여러분의 syslog 서버-로 보내 로그파일에 기록하도록 해줄 필요가 있다.
정확히 말해 여러분이 이를 수행하는 방법은 각 syslog 구현마다 다를지도 모르겠다. 그러나 일반적인 리눅스 syslog는 /etc/syslog.conf라 불리는 파일(혹은 조금 다를 수도 있다)을 사용하여 syslog가 출력되는 방식을 설정한다.
아파치 에러로그는 표준 syslog 심각성 등급(syslog-standard severity ratings)를 사용하고 있으므로 여러분은 일반적인 syslog 설정을 사용하여 syslog 출력을 심각성 정도에 근거하여 각각의 다른 파일로 분리시킬 수 있다. 예를 들어, 만약 여러분이 치명적인 오류만을 특정 파일에 로그로 남기고자 한다면 /etc/syslog.conf 파일에 다음의 줄을 추가해 준다:
local1.crit /var/log/apache.crit
게다가 이것은 /var/log/apache.crit 파일에 crit 및 더 높은 수준의 로그내용에 대한 로깅의 원인이 된다.
필자는 여러분이 로그내용을 다른 서버로 전송할 수 있다고 약속하였다. 다음 줄을 대신 사용하라:
local1.* @192.168.200.12
여러분도 원격 syslog 서버가 이러한 로그내용을 받아들이도록 설정할 필요가 있다. 대부분의 syslog 서버의 경우 syslog 서버의 시작 파라미터로 -r 플래그를 추가할 필요가 있다. 그러나 이것은 syslog 구현에 따라 다양하므로 여러분이 어떤 특정한 syslog 서버를 운영하고 있는지에 상관없이 문서를 참고하라.
액세스 로그 내보내기
불행히도 에러 로그만이 이 기능을 내장하고 있다. 여러분의 액세스 로그를 원격 서버에 로그로 남기는 것 또한 앞서 설명했던 연유로 정말로 유용한 일일 것이다.
여러분의 액세스 로그 역시 syslog로 보내주는 방법은 있다. 그러나 이러한 기사의 속성상 이 기능이 미래의 어느 시점에서 내장되어 이런 방법이 쓸모 없게 될지도 모르므로 아파치 웹 서버 문서화 사이트를 확인해 보는 것을 권장한다. 현재는 여러분이 해야 할 필요가 있는 것이 있는데, 두 단계에 걸친 과정이다.
먼저 로그내용을 syslog로 보낼 수 있도록 하는 스크립트를 작성한다:
#!/usr/bin/perl
use Sys::Syslog qw( :DEFAULT setlogsock );
setlogsock("unix");
openlog("apache", "cons", "pid", "local2");
while ($log = ) {
syslog("notice", $log);
}
closelog
펄로 작성된 스크립트는 Sys::Syslog 모듈을 사용하여 데이터를 syslog 서버로 전송한다. Sys::Syslog 모듈이 설치되어 있는지 확인해 보아야 하는데, 꽤 최근 버전의 펄에는 표준으로 지정되어 있을 것이다.
이 스크립트를 어딘가에 가져다 놓고 실행가능토록 만들어 둔다. 예를 들어 필자는 여러분이 이 스크립트를 /usr/local/apache/bin/apache_syslog에 가져다 놓았다고 가정한다.
다음으로 로그파일에 파이프 문법을 적용시켜 액세스 로그가 이 스크립트를 가리키도록 한다:
CustomLog |/usr/local/apache/bin/apache_syslog combined
apache_syslog 스크립트는 여러분의 웹 서버가 시작되면 실행될 것이며 로그파일의 내용을 서버로부터 받아오는 대로 처리한다. while 루프는 아파치 서버 프로세스가 살아있는 동안 계속 실행될 것이다.
이 스크립트에서 볼 수 있는 것과 같이 스크립트는 이러한 로그내용을 local2라는 이름을 가진 syslog 기능으로 전송하므로 /etc/syslog.conf에 들어있는 여러분의 syslog 서버를 다음과 같이 설정한다.
local2.* @192.168.200.12
이 모듈에서 사용가능한 옵션에 대한 좀 더 자세한 정보를 보려면 Sys::Syslog 문서를 참조하라.
이 설정을 통해 여러분은 서버의 상태가 좋지 못하거나 치명적인 드라이브 결함이 있을 경우에도 무슨 일이 발생했는지에 대해 찾아볼 수 있는 로그파일의 원격 사본을 갖게 될 것이다.
또한 만약 여러분이 여러 개의 CustomLog 지시자를 갖고 있을 경우 여러 개의 로그파일을 가질 수 있음을 유념하라. 그러므로 여러분이 원격 로그파일에 추가하여 로컬 로그파일을 가지길 원한다면 간단히 로컬 로그파일을 가리키는 외부 CustomLog 지시자를 추가하기만 하면 된다:
CustomLog /usr/local/apache/logs/access_log combined
경고사항
물론 syslog로 로그를 남기는 데에도 몇 가지 경고사항은 있다.
첫째로 만약 여러분이 몇 대의 서버에서 중앙 syslog 서버로 로그를 남기고 있다면 여러분의 클럭과 NTP와의 동기화를 유지시키는 것이 중요하다. 여러분이 이것을 하지 않게 되면 로그파일의 로그내용들은 순서에 맞지 않게 도착한 것처럼 보이게 되며 이는 통계적인 정보를 구하기 위한 로그파일의 후처리를 하고자 할 때 곤경에 처하게 될지도 모른다. 특히 몇몇 웹 로그통계 소프트웨어는 로그파일의 내용이 순서가 엉망일 경우 오동작하게 될 것이며 로그파일의 처리를 거부할지도 모른다.
두 번째로 필자의 syslog 서버는 여러 개의 로그내용이 동일할 경우 그것들을 한 줄로 요약한다는 것을 알게 되었다. 예를 들어 특정한 존재하지 않는 파일에 대한 반복요청은 다음과 같은 결과를 만들어 낸다.
Aug 31 20:18:05 192.168.200.10 last message repeated 19 times
마지막으로 여러 대의 서버에 로그를 남기는 것이 가능한 써드파티 모듈이 있다는 것에 관해 언급하는 것은 값어치 있는 일이다. 이러한 모듈 중에서 가장 인기있는 것은 mod_log_spread인데 매우 큰 규모(여러 대의 서버)의 서버 구축에 효율적인 솔루션일 것 같다.
Rich Bowen은 아파치 소프트웨어 재단의 구성원으로서 주로 아파치 웹 서버에 대한 문서화 업무를 맡고 있다. DrBacchus, Rich"s handle on IRC는
www.drbacchus.com/journal에서 찾아볼 수 있다.