2021-09-26 15:10 (일)
신뢰성 있는 로그분석의 필수 조건, 시간 동기화
상태바
신뢰성 있는 로그분석의 필수 조건, 시간 동기화
  • 홍석범
  • 승인 2013.01.03 10:06
이 기사를 공유합니다

신뢰성 있는 로그분석 위해 NTP 활용한 시간 동기화 운영 방안
서버나 네트워크 장비 등을 운영하면서 중요한 조건 중 하나는 OS에서 정확한 시간을 유지하는 것이다. 서비스 안정성의 측면에서는 말할 것도 없고, 만약 보안사고가 발생하여 로그를 분석하여 추적하려고 하는데, 시스템의 시간이 맞지 않는다면 당장 로그분석을 통해 전후 인과 관계를 파악하는 데에 어려움이 있을 뿐만 아니라 로그 자체의 신뢰성에도 문제가 된다. 따라서, 초기에 서비스 투입 전 HW와 OS의 시간(time)을 맞추는 것 뿐 아니라 이후에도 조금씩 OS 시간이 틀려지기 때문에 항시 정확하게 유지하는 것 또한 중요하다 할 것이다.

이를 위해 사용할 수 있는 프로토콜은 time(37/tcp) 서비스와 ntp(123/udp)가 있는데, 최근에는 거의 대부분 안정적인 ntp 서비스를 이용하고 있으며, rdate 명령어로 강제 동기화하는 time 서비스는 오래된 시스템에만 일부 사용하고 있으며 최근에는 잘 사용되지 않고 있다.

그렇다면, ntp를 통해 시간동기화를 어떻게 하여야 할까? 먼저 GPS등을 시스템에 연결하여 최상위 레벨인 stratum1 서버를 직접 구축하는 방법이 있다. 그러나, GPS등 별도의 솔루션을 구매해야 하고, 일일이 직접 운영해야 한다는 부담이 있으므로 통상적으로 public으로 오픈한 stratum1 서버로부터 시간을 동기화하는 stratum2 나 3 서버를 통해 시간 동기화를 하는 것이 편리하다.(물론 stratum1 서버로부터 동기화하여 직접 stratum2 서버를 운영할 수도 있다.)

ntp에서는 stratum이라는 계층이 존재하는데, GPS등을 통해 시간을 동기화하는 ntp서버가 최상위 stratum1이라면 이 서버를 통해 동기화하는 서버는 stratum2, 또 다시 stratum2를 통해 시간을 동기화하는 장비는 stratum3가 되는 식이다.


[출처 : wikipedia]
 
ntp.org 에서는 자발적인 서버관리자들의 헌신을 통해 public ntp pool 그룹을 운영, 제공하고 있는데, 소규모의 장비를 운영하는 곳이라면 이 public pool을 통해 직접 시간 동기화를 하면 되겠지만(현재 한국-kr.pool.ntp.org-에서는 총 13개의 ntpd 서버가 운영되고 있다.) 많은 장비를 운영하는 곳이라면 stratum2나 3 수준의 자체적인 ntpd를 2~3대 내외로 운영하고 각 에지 장비들은 이 자체 ntp 서버를 통해 동기화하도록 하는 것이 좋다. 물론 자체 ntpd 서버는 복수개의 stratum1이나 2 서버를 통해 시간을 동기화하면 된다.
 
ntp를 통해 시간 동기화를 하는 방법은 현재 local 시스템의 시간과 원격지 ntp 서버의 시간 차이에 관계없이 원격지 ntp 서버의 시간을 신뢰하고 settimeofday() system call을 통해 강제로 동기화를 하는 방법과, 시간 차이가 날 때 adjtime() system call을 통해 점차적으로 step by step으로 동기화하는 slew방식이 있는데, 일반적으로 초기 시스템 부팅시에는 전자의 방법을 통해 강제 동기화를 하고, 평상시에 운영 중일 때에는 후자의 방법을 사용하는 것이 안전하다. 즉, 초기 시스템 부팅시 강제 동기화를 위해서는 아래와 같이 실행하면 되는데, 이때 ntpd가 먼저 리슨하고 있는 상태라면 실행되지 않으니 ntpd가 리슨하기 전에 실행하여야 한다.
“ntpdate kr.pool.ntp.org“
 
이후에는 ntpd를 가동하면 되는데, 참조할 ntp 서버는 /etc/ntp.conf 파일에 정의하면 된다. 물론 해당 서버는 도메인으로 지정해도 되고, IP로 지정해도 된다.
 
예)
server 0.kr.pool.ntp.org
server 1.asia.pool.ntp.org
server 2.asia.pool.ntp.org
server ntp.kr.cdnetworks.com
server 211.233.40.78
 
이후 시간 동기화가 잘 되고 있는지 여부는 ntpstat 이라는 명령어로 확인할 수 있는데, 아래와 같이 “time correct to within ~” 의 메시지가 출력되면, 현재 시간이 정확하며 정상적으로 시간 동기화가 되고 있다고 생각하면 된다.
 
# ntpstat
synchronised to NTP server (211.233.40.78) at stratum 3
time correct to within 975 ms
polling server every 64 s
 
ntp를 운영하면서 관리자들이 가장 많이 하는 질문 중 하나는, “만약 ntp가 참조하는 원격지 ntp서버의 시간이 이를테면 한 달 전이나 1년 전으로 잘못 설정되거나 또는 다운이 되어 정보를 얻을 수 없으면 어떻게 되는가?”이다. 물론 이러한 상황은 자주 발생하지 않지만, 언제든 발생할 수 있는 가능성이 있는 것이 사실인데, ntp의 경우 이에 대한 자체적인 protection 알고리즘을 제공하고 있다. 일단 local의 시간과 한 원격지 타임서버의 시간차이가 많이 날 경우에는 시간을 동기화하지 않고, 해당 원격지의 타임서버가 오류가 있다고 판단하여 해당 서버를 제외하고 다른 서버를 통해서만 시간 동기화를 진행한다.

또한 앞에서 언급했듯이 ntp는 복수개(최소 3개 이상)의 여러 타임서버를 참조하고 있으므로 한 개의 ntp 서버에 문제가 있어도 서비스 이용에 문제는 없다. 그러나, 만약 지정한 모든 타임서버의 시간과 차이가 많을 경우에는 원격 동기화를 중지하고, 자체의 local clock을 통해 시간을 맞추게 된다. 또한, ntp는 특이하게도 클라이언트와 서버가 동일하게 123/udp 포트를 사용하므로 방화벽이 있다면 룰 설정에 주의하여야 한다.
 
00:45:37.243285 IP 174.35.17.11.123 > 211.39.136.4.123: NTPv4, Client, length 48
00:45:37.243327 IP 211.39.136.4.123 > 174.35.17.11.123: NTPv4, Server, length 48
 
마지막으로 ntp와 관련, 몇 가지 팁을 살펴보고 마치도록 하겠다.
 
ntpdate –q 옵션으로 실행해 보면, 해당 타임서버의 stratum level을 쉽게 확인할 수 있는데, 이를테면 윈도우PC나 서버들이 기본적으로 참조하는 타임서버인 time.windows.com의 경우 아래와 같이 stratum level 2 인 것을 알 수 있다.
 
# ntpdate -q time.windows.com
server 65.55.21.24, stratum 2, offset -0.045125, delay 0.20860
 
또한, rdate를 통해 동기화시에 많이 사용하는 time.bora.net 역시 stratum 2인 것을 알 수 있다.
 
# ntpdate -q time.bora.net
server 203.248.240.140, stratum 2, offset -0.326829, delay 0.02802
 
즉, 위의 서버들은 stratum1 서버로부터 시간 정보를 받아 동기화한다는 것을 알 수 있다.

[글. 홍석범 씨디네트웍스 시스템팀 팀장 antihong@gmail.com]