테스트 서버 : RHEL 4.7 32 bit
커널 : 2.6.9-78.ELsmp
ntp, ptp 를 사용하지 않는 리눅스 서버는 윤초 보정에 대응하기 위해 윤초에 대응할 수 있는 kernel과 tzdata 버전으로 업데이트 해야 된다.
1. 패치 전
[root@localhost ~]# rpm -qa | grep tzdata
tzdata-2008b-3.el4
[root@localhost ~]# ls -la /etc/localtime
-rw-r--r-- 1 root root 152 11월 13 2010 /etc/localtime
[root@localhost ~]# ls -la /usr/share/zoneinfo/Asia/Seoul
-rw-r--r-- 2 root root 152 5월 31 2008 /usr/share/zoneinfo/Asia/Seoul
[root@localhost ~]# ls -la /usr/share/zoneinfo/right/Asia/Seoul
-rw-r--r-- 2 root root 336 5월 31 2008 /usr/share/zoneinfo/right/Asia/Seoul
* zdump : time zone dumper
[root@localhost ~]# zdump -v Asia/Seoul | tail -n 10
Asia/Seoul Sat May 9 14:59:59 1987 UTC = Sat May 9 23:59:59 1987 KST isdst=0 gmtoff=32400
Asia/Seoul Sat May 9 15:00:00 1987 UTC = Sun May 10 01:00:00 1987 KDT isdst=1 gmtoff=36000
Asia/Seoul Sat Oct 10 13:59:59 1987 UTC = Sat Oct 10 23:59:59 1987 KDT isdst=1 gmtoff=36000
Asia/Seoul Sat Oct 10 14:00:00 1987 UTC = Sat Oct 10 23:00:00 1987 KST isdst=0 gmtoff=32400
Asia/Seoul Sat May 7 14:59:59 1988 UTC = Sat May 7 23:59:59 1988 KST isdst=0 gmtoff=32400
Asia/Seoul Sat May 7 15:00:00 1988 UTC = Sun May 8 01:00:00 1988 KDT isdst=1 gmtoff=36000
Asia/Seoul Sat Oct 8 13:59:59 1988 UTC = Sat Oct 8 23:59:59 1988 KDT isdst=1 gmtoff=36000
Asia/Seoul Sat Oct 8 14:00:00 1988 UTC = Sat Oct 8 23:00:00 1988 KST isdst=0 gmtoff=32400
Asia/Seoul Mon Jan 18 03:14:07 2038 UTC = Mon Jan 18 12:14:07 2038 KST isdst=0 gmtoff=32400
Asia/Seoul Tue Jan 19 03:14:07 2038 UTC = Tue Jan 19 12:14:07 2038 KST isdst=0 gmtoff=32400
* 2015년 7월 1일 윤초 보정이 right 내의 파일에도 빠져있다.
[root@localhost ~]# zdump -v right/Asia/Seoul | tail -n 10
right/Asia/Seoul Sun Dec 31 23:59:60 1995 UTC = Mon Jan 1 08:59:60 1996 KST isdst=0 gmtoff=32400
right/Asia/Seoul Mon Jan 1 00:00:00 1996 UTC = Mon Jan 1 09:00:00 1996 KST isdst=0 gmtoff=32400
right/Asia/Seoul Mon Jun 30 23:59:60 1997 UTC = Tue Jul 1 08:59:60 1997 KST isdst=0 gmtoff=32400
right/Asia/Seoul Tue Jul 1 00:00:00 1997 UTC = Tue Jul 1 09:00:00 1997 KST isdst=0 gmtoff=32400
right/Asia/Seoul Thu Dec 31 23:59:60 1998 UTC = Fri Jan 1 08:59:60 1999 KST isdst=0 gmtoff=32400
right/Asia/Seoul Fri Jan 1 00:00:00 1999 UTC = Fri Jan 1 09:00:00 1999 KST isdst=0 gmtoff=32400
right/Asia/Seoul Sat Dec 31 23:59:60 2005 UTC = Sun Jan 1 08:59:60 2006 KST isdst=0 gmtoff=32400
right/Asia/Seoul Sun Jan 1 00:00:00 2006 UTC = Sun Jan 1 09:00:00 2006 KST isdst=0 gmtoff=32400
right/Asia/Seoul Mon Jan 18 03:13:44 2038 UTC = Mon Jan 18 12:13:44 2038 KST isdst=0 gmtoff=32400
right/Asia/Seoul Tue Jan 19 03:13:44 2038 UTC = Tue Jan 19 12:13:44 2038 KST isdst=0 gmtoff=32400
2. 패치 후
[root@localhost ~]# rpm -Uvh tzdata-2015d-1.0.1.el4.noarch.rpm
Preparing… ########################################### [100%]
1:tzdata ########################################### [100%]
[root@localhost ~]# rpm -qa | grep tzdata
tzdata-2015d-1.0.1.el4
[root@localhost ~]# ls -la /etc/localtime
-rw-r--r-- 1 root root 231 May 28 22:54 /etc/localtime
[root@localhost ~]# ls -la /usr/share/zoneinfo/Asia/Seoul
-rw-r--r-- 2 root root 231 May 28 22:54 /usr/share/zoneinfo/Asia/Seoul
[root@localhost ~]# ls -la /usr/share/zoneinfo/right/Asia/Seoul
-rw-r--r-- 2 root root 439 May 28 22:54 /usr/share/zoneinfo/right/Asia/Seoul
[root@localhost ~]# cp /usr/share/zoneinfo/right/Asia/Seoul /etc/localtime
cp: overwrite `/etc/localtime'? y
[root@localhost ~]# /usr/sbin/tzdata-update --tzdata
* tzdata만 업데이트해서는 윤초 보정에 대응을 할 수 없다.(이유는 아래 zdump의 내용을 보면 알 수 있다.)
반드시 tzdata를 업데이트 후 2015년 윤초 보정이 가능한 timezone (right)파일을 복사하고 tzdata-update 실행할 것.
- /etc/localtime 파일을 /usr/share/zoneinfo/right/Asia/Seoul(윤초가 반영된) 파일로 변경하고 tzdata-update --tzdata 명령으로 업데이트 하지 않으니 30초 정도 느린 현상이 발생했었다.
시스템을 재부팅 해도 30초 느린 증상은 해결되지 않았지만, tzdata-update --tzdata 명령과 동시에 시간이 정확히 맞아졌다. CentOS 6.x와 tzdata-2015f-1.el6.noarch 에서 경험.
* Run "/usr/sbin/tzdata-update --tzdata" to update the timezone data
[root@localhost ~]# ls -la /etc/localtime
-rw-r--r-- 1 root root 439 May 28 23:15 /etc/localtime
[root@localhost ~]# zdump -v Asia/Seoul | tail -n 10
Asia/Seoul Sat May 9 16:59:59 1987 UTC = Sun May 10 01:59:59 1987 KST isdst=0 gmtoff=32400
Asia/Seoul Sat May 9 17:00:00 1987 UTC = Sun May 10 03:00:00 1987 KDT isdst=1 gmtoff=36000
Asia/Seoul Sat Oct 10 16:59:59 1987 UTC = Sun Oct 11 02:59:59 1987 KDT isdst=1 gmtoff=36000
Asia/Seoul Sat Oct 10 17:00:00 1987 UTC = Sun Oct 11 02:00:00 1987 KST isdst=0 gmtoff=32400
Asia/Seoul Sat May 7 16:59:59 1988 UTC = Sun May 8 01:59:59 1988 KST isdst=0 gmtoff=32400
Asia/Seoul Sat May 7 17:00:00 1988 UTC = Sun May 8 03:00:00 1988 KDT isdst=1 gmtoff=36000
Asia/Seoul Sat Oct 8 16:59:59 1988 UTC = Sun Oct 9 02:59:59 1988 KDT isdst=1 gmtoff=36000
Asia/Seoul Sat Oct 8 17:00:00 1988 UTC = Sun Oct 9 02:00:00 1988 KST isdst=0 gmtoff=32400
Asia/Seoul Mon Jan 18 03:14:07 2038 UTC = Mon Jan 18 12:14:07 2038 KST isdst=0 gmtoff=32400
Asia/Seoul Tue Jan 19 03:14:07 2038 UTC = Tue Jan 19 12:14:07 2038 KST isdst=0 gmtoff=32400
[root@localhost ~]# zdump -v right/Asia/Seoul | tail -n 10
right/Asia/Seoul Sat Dec 31 23:59:60 2005 UTC = Sun Jan 1 08:59:60 2006 KST isdst=0 gmtoff=32400
right/Asia/Seoul Sun Jan 1 00:00:00 2006 UTC = Sun Jan 1 09:00:00 2006 KST isdst=0 gmtoff=32400
right/Asia/Seoul Wed Dec 31 23:59:60 2008 UTC = Thu Jan 1 08:59:60 2009 KST isdst=0 gmtoff=32400
right/Asia/Seoul Thu Jan 1 00:00:00 2009 UTC = Thu Jan 1 09:00:00 2009 KST isdst=0 gmtoff=32400
right/Asia/Seoul Sat Jun 30 23:59:60 2012 UTC = Sun Jul 1 08:59:60 2012 KST isdst=0 gmtoff=32400
right/Asia/Seoul Sun Jul 1 00:00:00 2012 UTC = Sun Jul 1 09:00:00 2012 KST isdst=0 gmtoff=32400
right/Asia/Seoul Tue Jun 30 23:59:60 2015 UTC = Wed Jul 1 08:59:60 2015 KST isdst=0 gmtoff=32400
right/Asia/Seoul Wed Jul 1 00:00:00 2015 UTC = Wed Jul 1 09:00:00 2015 KST isdst=0 gmtoff=32400 ---> 다가올 2015년 7월 1일 00시 00분 00초 윤초 보정에 대한 정보를 확인할 수 있다.
right/Asia/Seoul Mon Jan 18 03:13:41 2038 UTC = Mon Jan 18 12:13:41 2038 KST isdst=0 gmtoff=32400
right/Asia/Seoul Tue Jan 19 03:13:41 2038 UTC = Tue Jan 19 12:13:41 2038 KST isdst=0 gmtoff=32400
* tzdata를 업데이트하고 right zoneinfo 를 적용하였으면 커널도 2.6.9-89 이상으로 업데이트 해야된다.
* 추가 정보
- ntp를 사용하는 경우 -x (slew 옵션)을 설정하여 해결 할 수도 있다. 즉, tzdata를 업데이트 하지 않아도 ntp 서비스를 통해 leap time 보정을 받을 수 있다.
- 또한 시간에 민감한 서비스라면 각 어플리케이션에서도 윤초에 대응할 수 있게 패치가 되어 있어야 한다.
- RHEL 5 ~ 7 버전에 대한 윤초 대응 방법은 커널버전, ntp 버전, tzdata 버전 별로 상이 하다. 따라서 다른 문서를 참고해서 해당 시스템에 맞게 적용해야 된다.
아래는 레드햇 참고 문서이다.
https://access.redhat.com/articles/15145
* 아래는 RHEL4(CentOS 4) 용 최신 tzdata rpm 파일이다
* 아래는 윤초 취약점이 존재하는지 체크하는 스크립트 파일이다. RHEL(CentOS) 4 ~ 7 버전의 취약점 조사 가능.
* 아래는 ntp 사용 시 윤초 대응에 대한 문서
https://access.redhat.com/ko/node/1393383
* 아래는 ntp를 사용하지 않을 때와, 만약 사용할 경우 ntp 및 OS 버전별 대응 방법에 대한 문서.
https://access.redhat.com/solutions/1441373
* 윤초 검증에 사용될 수 있는 ntptime
http://d.hatena.ne.jp/labunix/20120306
* Now you can confirm what action you need in the following Action Matrix.
https://access.redhat.com/solutions/1441373#matrix
* How to clear the Leap Second Insertion flag after it has been received?
https://access.redhat.com/articles/199563
* 수동 시간 설정.
# date -s "2015-06-30 23:40:00"