NTP 的 ACL 控制

跟 ntp 权限访问相关的都在 restrict 这个声明里面。

默认情况下,如果 ntp.conf 里面没有任何的 restrict 字段,表示默认全部放行。比如下面这个配置:
# cat /etc/ntp.conf
server x.x.x.x prefer
server y.y.y.y
server z.z.z.z

这意味着什么了?如果服务器开了公网 IP,没有防火墙的,再加上 ntp 无法监听指定的端口,这会导致互联网上任何一台主机都能够操作这台 ntp,比如:
ntpq> peers
     remote           refid      st t when poll reach   delay   offset  jitter
     ==============================================================================
     *192.168.40.92     202.112.31.197   3 u 1010 1024  377    0.202    0.000 0.398
     +192.168.50.44      202.112.31.197   3 u  364 1024  377    0.314    1.415 0.875
     +192.168.30.8      202.112.31.197   3 u  424 1024  377    0.280    1.759 0.952
     +dns2.synet.edu. 137.189.4.10     2 u  395 1024  377   11.255    0.830 0.647
      LOCAL(0)        .LOCL.          10 l  24d   64    0    0.000    0.000 0.000

还能看到 NTP, OS 的相关信息:
ntpq> rl
associd=0 status=0615 leap_none, sync_ntp, 1 event, clock_sync,
version="ntpd [email protected] Tue Jun  5 20:12:08 UTC 2012 (1)",
processor="x86_64", system="Linux/3.2.0-40-generic", leap=00, stratum=4,
precision=-23, rootdelay=12.562, rootdisp=73.370, refid=192.168.40.92,
reftime=d59b67c9.85575f94  Thu, Jul 15 2013 17:00:57.520,
clock=d59b700e.367fac37  Thu, Jul 15 2013 17:36:14.212, peer=59253,
tc=10, mintc=3, offset=0.000, frequency=5.968, sys_jitter=0.398,
clk_jitter=0.242, clk_wander=0.036

下面参照官方文档学习下 ntp 在 acl 方面做的一些工作。
默认先阻挡掉一切的连接:
restrict default ignore

下面的语句实现跟上面类似的效果:
restrict default kod nomodify notrap nopeer noquery
restrict -6 default kod nomodify notrap nopeer noquery

如果仅仅有上面这条,这意味着会 block 所有的主机,包括本机。这个明显不是我们想要的,可以开放指定的机器,包括 localhost。下面这个仅仅对 192.168.40.0 以及 localhost 开放查询权限:
restrict -4 default kod nomodify notrap nopeer noquery
restrict -6 default kod nomodify notrap nopeer noquery
restrict 192.168.40.0 mask 255.255.255.0

注意: restrict 需要使用 IP 而非域名的形式。

从上面可以看到,ntp 配置的不好会对系统的安全造成非常严重的隐患。另外,老生常谈的事,绝对不要在线上环境执行不熟悉的命令,修改不熟悉的配置,很多工程师都是修改完了重启发现没问题就仍在那儿不管了,以为自己做的很好,其实留下了很严重的安全隐患。

关于 NTP 的一些问题

首先是关于时区的问题,经度的零点在 Greenwich,因此就有了 GMT(Greenwich Mean Time) 的概念,GMT 以东的快(+),以西的慢(-),比如大陆就是 GMT+8,也就是比 GMT 快 8 h。GMT 为 0 点的时候,大陆已经早上 8 点了。然后还有个国际日期变更线的问题,这个在太平洋上,也就是精读为 180 的那个线,如果从大陆飞到美国,时间需要减少 1d,相反则需要加 1d。
由于地球自转等原因,GMT 跟实际的时间不是很一样,计算机使用 UTC 来表示『正确』的时间,这两者大概有 16min 的差距。

对于计算机来说,分为软件跟硬件只分,软件的是指系统本身的,从 1970 年 1 月 1 日开始算,date 命令就是计的这个时间:
$ date +%s
1357465568

$ date
Sun Jan  6 17:46:02 CST 2013

硬件的就是 BIOS 上的时钟,这个跟系统上的可能会有时差,可以使用 hwclock 来同步:
# hwclock -r/w

客户端同步服务器有两种方式:
1. 使用 ntpdate 直接同步
2. 安装 ntpd 作为服务器下层的一个 stratum

注意:二者不能同时使用,在启用了 ntpd 的情况下,是不能执行 ntpdate 的,否则会出现下面的错误:
# ntpdate 0.cn.pool.ntp.org
2 Dec 14:27:55 ntpdate[26982]: the NTP socket is in use, exiting

所以,最简单的方式是把 ntpdate 放到 cron 里面去:
*/30 * * * * root (/usr/sbin/ntpdate 192.168.1.1 && /sbin/hwclock -w) &> /dev/null

可以将 debug 以及 verbose 的信息加到 alias 里面去:
alias ntpdate='ntpdate -d -v'

不过,ntpdate 这个命令官方不提倡使用,可以使用 ntpd 替代,可以通过默认的包管理器安装。
有个问题是,ntpd 默认会监听所有的端口,像这样:
# netstat -tunlp | grep ntp
udp        0      0 192.168.10.254:123        0.0.0.0:*                           32266/ntpd
udp        0      0 111.111.111.111:123     0.0.0.0:*                           32266/ntpd
udp        0      0 127.0.0.1:123           0.0.0.0:*                           32266/ntpd
udp        0      0 0.0.0.0:123             0.0.0.0:*                           32266/ntpd
udp6       0      0 :::123                  :::*                                32266/ntpd

我们明显不希望这样,因此需要指定端口。Ubuntu 10.04 的版本是 4.2.4p8,12.04 的是 4.2.6p3,前者不能在 ntp.conf 里面指定 interface。

Continue reading