2015年2月4日水曜日

セキュリティを考慮したntpdの設定方法

Linuxなら誰でも使っているntpd。この前、話題になった脆弱性(https://jvn.jp/vu/JVNVU96605606/)が見つかってしまったので、対策として設定確認とセキュリティ強化を実施する必要があり、設定方法を今一度調べてみた。

どうやら今まで正しい設定方法を理解できていなかったようだったので、以下に整理した内容を記載する。

ntpdの推奨設定例

/etc/ntp.confを設定すれば良いのだが、基本構造は以下の通りと考えれば良い。
#################################
# 設定条件
# 上位NTPサーバ:100.100.2.5
# 参照許可NW:192.168.100.0/24
#################################

driftfile /var/lib/ntp/drift

# restrictは上から順に評価されるため、最初に全て拒否ルールを設定
restrict default ignore
restrict -6 default ignore

# localhostを許可
restrict 127.0.0.1
restrict -6 ::1
# 同期先を許可
restrict 100.100.2.5 kod nomodify notrap nopeer noquery
# 参照を許可するNW
restrict 192.168.100.0 mask 255.255.255.0 kod nomodify notrap nopeer noquery

# 同期先
server 100.100.2.5 iburst

# 同期先が無い場合、自身のクロックを参照する設定
#server 127.127.1.0     # local clock
#fudge 127.127.1.0 stratum 10

設定の詳細説明

上から順に見ていこう。
driftfile /var/lib/ntp/drift
driftfileは時刻のずれを記憶するファイルで、ntpdが時刻を合わせる際の内部時計とのずれの傾向を記録する。これによって、ntpdが上位サーバーと通信ができず時刻同期ができなくなったとしても履歴の情報から誤差の修正を行い、潜在的な時刻のずれの影響を抑止する。
# restrictは上から順に評価されるため、最初に全て拒否ルールを設定
restrict default ignore
restrict -6 default ignore
restrictは「制限」という意味のオプションでアクセス制限の設定を行うオプションとなる。"default ignore"はデフォルトで全てを拒否するオプション。セキュリティの観点から言えば、まずデフォルト拒否のルールを入れて、必要なものは都度許可ルールを入れる方が良い。
# localhostを許可
restrict 127.0.0.1
restrict -6 ::1
# 同期先を許可
restrict 100.100.2.5 kod nomodify notrap nopeer noquery
# 参照を許可するNW
restrict 192.168.100.0 mask 255.255.255.0 kod nomodify notrap nopeer noquery
まず上2つのlocalhostを全て許可するルールは、決まり文句として設定する必要があるようだ。他に設定する許可ルールとしては、①同期先のIPアドレス、②参照を許可するIPアドレス(またはネットワークアドレス)を設定すれば良い。restrict文のオプションに色々付いているが、これは決まり文句として書いておけば良い。

少しわかりづらいのが、noqueryのオプションで、一見するとquery(問い合わせ)をnoするオプションなので、時刻同期を拒否するように見えるが、実際はntpqやntpdcからのクエリーに対して拒否するオプションであり、時刻同期には影響しない(man ntp_accの説明で確認できる)。
# 同期先
server 100.100.2.5 iburst
同期先の上位サーバーを記載する。ホスト名でも大丈夫だが、名前解決のオーバーヘッドを減らす意味でIPアドレス指定の方が良いかもしれない。"iburst"オプションは、ntpd起動時の初回同期のポーリング間隔をデフォルトの64秒よりも小さい2秒に変更する機能で、初回の同期間隔が短縮されるのでオススメ。
# 同期先が無い場合、自身のクロックを参照する設定
#server 127.127.1.0     # local clock
#fudge 127.127.1.0 stratum 10
これは全ての同期先との同期に失敗した場合に、自分自身のローカルクロックと同期するという設定。ただし、同期先が生きているのにローカルクロックと同期してしまう原因不明の事象が発生することがあるらしく、コメントアウトを推奨する。実際に私が検証した際も以下の通り事象が発生してしまった(LOCAL(0)の右に"*"が付いて同期されてしまっている)。
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 192.168.100.100  .LOCL.           1 u  249  512  377    0.977   -4.058   5.767
 192.168.100.101  192.168.1.100   2 u  461  512  377    0.308   -3.269   1.028
*LOCAL(0)        .LOCL.          10 l   47   64  377    0.000    0.000   0.000

その他Tips

その他、ntpdの設定を調査する中で見つけたTips。

「Temporary failure in name resolution」のエラー

ntpq -pで状況を確認すると「Temporary failure in name resolution」のエラーが発生することがある。これはhostsの設定誤りが原因で、/etc/hostsの設定内容を確認し、127.0.0.1がきちんとlocalhostで名前解決できるようになっているか確認する。

ntpdのmanページ

man ntpdとやっても実はそこまで多くの細かい説明は出てこない。調べるなら以下のmanページを見ること。
man ntp.conf   ←iburstの説明等が記載
man ntp_acc   ←ntp_acc - Access Control Optionsのことで、restrictのオプションの説明が記載

参考URL

ArchLinux - Network Time Protocol daemon (日本語)