named-chroot が chrootしてくれず "open: /etc/named.conf: file not found" と主張してくる件

お久しぶりです。
最近はCentOS6のサーバをCentOS7にリプレースするタスクに主に注力しておりました。

f:id:chamaharun:20160904125856p:plain

対象サーバ8台のうちにDNSサーバも入っており、構築中にハマった点を記しておきます。
chroot環境なのにchroot内の/etc/named.confを参照してくれず困りました。

/etc/sysconfig/named にもchrootしてるよーって書いていますが、

[root@ns2 etc]# cat /etc/sysconfig/named
OPTIONS="-4"
ROOTDIR="/var/named/chroot"

systemctl start named-chroot すると起動しません。

[root@ns2 etc]# systemctl status named-chroot
● named-chroot.service - Berkeley Internet Name Domain (DNS)
   Loaded: loaded (/usr/lib/systemd/system/named-chroot.service; disabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since 日 2016-09-04 12:29:25 JST; 11min ago
  Process: 18080 ExecStartPre=/bin/bash -c if [ ! "$DISABLE_ZONE_CHECKING" == "yes" ]; then /usr/sbin/named-checkconf -z /etc/named.conf; else echo "Checking of zone files is disabled"; fi (code=exited, status=1/FAILURE)

 9月 04 12:29:24 ns2.charakoba.com systemd[1]: Starting Berkeley Internet Name Domain (DNS)...
 9月 04 12:29:25 ns2.charakoba.com bash[18080]: open: /etc/named.conf: file not found
 9月 04 12:29:25 ns2.charakoba.com systemd[1]: named-chroot.service: control process exited, code=exited status=1
 9月 04 12:29:25 ns2.charakoba.com systemd[1]: Failed to start Berkeley Internet Name Domain (DNS).
 9月 04 12:29:25 ns2.charakoba.com systemd[1]: Unit named-chroot.service entered failed state.
 9月 04 12:29:25 ns2.charakoba.com systemd[1]: named-chroot.service failed.


そこで、/usr/lib/systemd/system/named-chroot.service を覗いてみることにしました。

# Don't forget to add "$AddUnixListenSocket /var/named/chroot/dev/log"
# line to your /etc/rsyslog.conf file. Otherwise your logging becomes
# broken when rsyslogd daemon is restarted (due update, for example).

[Unit]
Description=Berkeley Internet Name Domain (DNS)
Wants=nss-lookup.target
Requires=named-chroot-setup.service
Before=nss-lookup.target
After=network.target
After=named-chroot-setup.service

[Service]
Type=forking
EnvironmentFile=-/etc/sysconfig/named
Environment=KRB5_KTNAME=/etc/named.keytab
PIDFile=/var/named/chroot/run/named/named.pid

ExecStartPre=/bin/bash -c 'if [ ! "$DISABLE_ZONE_CHECKING" == "yes" ]; then /usr/sbin/named-checkconf -z /etc/named.conf; else echo "Checking of zone files is disabled"; fi'
ExecStart=/usr/sbin/named -u named -t /var/named/chroot $OPTIONS

ExecReload=/bin/sh -c '/usr/sbin/rndc reload > /dev/null 2>&1 || /bin/kill -HUP $MAINPID'

ExecStop=/bin/sh -c '/usr/sbin/rndc stop > /dev/null 2>&1 || /bin/kill -TERM $MAINPID'

PrivateTmp=false

[Install]
WantedBy=multi-user.target

環境変数を読み込んでるっぽいところを発見しましたが、パスの前に"-"がついてるのが気になったので

EnvironmentFile=-/etc/sysconfig/named


"-"を削除してみました。

EnvironmentFile=/etc/sysconfig/named

その後

$ systemctl daemon-reload
$ systemctl start named-chroot

するとちゃんと動くようになりました。

[root@ns2 named]# systemctl status named-chroot
● named-chroot.service - Berkeley Internet Name Domain (DNS)
   Loaded: loaded (/usr/lib/systemd/system/named-chroot.service; disabled; vendor preset: disabled)
   Active: active (running) since 日 2016-09-04 13:06:15 JST; 4min 33s ago
  Process: 19239 ExecStop=/bin/sh -c /usr/sbin/rndc stop > /dev/null 2>&1 || /bin/kill -TERM $MAINPID (code=exited, status=0/SUCCESS)
  Process: 19312 ExecStart=/usr/sbin/named -u named -t /var/named/chroot $OPTIONS (code=exited, status=0/SUCCESS)
  Process: 19309 ExecStartPre=/bin/bash -c if [ ! "$DISABLE_ZONE_CHECKING" == "yes" ]; then /usr/sbin/named-checkconf -z /etc/named.conf; else echo "Checking of zone files is disabled"; fi (code=exited, status=0/SUCCESS)
 Main PID: 19314 (named)
   CGroup: /system.slice/named-chroot.service
           └─19314 /usr/sbin/named -u named -t /var/named/chroot -4

 9月 04 13:06:15 ns2.charakoba.com named[19314]: sizing zone task pool based on 3 zones
 9月 04 13:06:15 ns2.charakoba.com named[19314]: set up managed keys zone for view internal, file '/var/named/dynamic/3bed2cb3a3acf7b6a8ef408420cc...f.mkeys'
 9月 04 13:06:15 ns2.charakoba.com named[19314]: command channel listening on 127.0.0.1#953
 9月 04 13:06:15 ns2.charakoba.com named[19314]: managed-keys-zone/internal: journal file is out of date: removing journal file
 9月 04 13:06:15 ns2.charakoba.com named[19314]: managed-keys-zone/internal: loaded serial 2
 9月 04 13:06:15 ns2.charakoba.com named[19314]: zone 11.168.192.in-addr.arpa/IN/internal: loaded serial 2011062001
 9月 04 13:06:15 ns2.charakoba.com named[19314]: zone charakoba.com/IN/internal: loaded serial 2011062001
 9月 04 13:06:15 ns2.charakoba.com named[19314]: all zones loaded
 9月 04 13:06:15 ns2.charakoba.com named[19314]: running
 9月 04 13:06:15 ns2.charakoba.com systemd[1]: Started Berkeley Internet Name Domain (DNS).
Hint: Some lines were ellipsized, use -l to show in full.

ICTトラブルシューティングコンテストの運営をしてきました

ICTSC5運営技術ブログ icttoracon.net

にも書いた通り、第5回ICTトラブルシューティングコンテストの運営をしてきました。
この記事の読者の中には、インフラ系でない方もいらっしゃると思うので、概要を少し詳しめに書きます。

ICTトラブルシューティングコンテストとは何か

僕達が毎日当たり前のように利用している、SNSソーシャルゲーム・通販サイトなどは、
PCやスマートフォンからインターネット回線を通じて、
その会社が用意した通信設備内にあるサーバーと通信します。
手元の端末からの要求を受けたサーバーは、要求に応じた処理を行い、
再び手元の端末へとデータを返します。

ところが、途中経由する回線や通信相手のサーバーに不具合が起こる事があります。
これらの障害は一般的には、
「インターネットにつながらない」「サーバーが応答しない」「うまく表示されない」など、
手元の端末でエラーメッセージという形でよく目にすることがあると思います。
多くの場合、こういった障害は、機器の故障・設定のミス・サイバー攻撃などにより起こります。
これらの障害に対処する技術を競うのがトラブルシューティングコンテストです。

利用者としては「使えてて当たり前のインフラが突然使えなくなり不便であったが、
時間を置くといつの間にか使えるようになっていた」としか感じることが無いかもしれません。
しかし実際の現場では、こういった分野に詳しいエンジニアが昼夜問わず対処を行っているのです。

キックオフミーテイングからホットステージまで

11/1に東京・六本木でキックオフ・ミーテイング(顔合わせ)に参加してから、
2/14〜のホットステージ(現地準備作業)までの間、
月に1度程度の運営委員・学生スタッフ参加のオフラインミーティング
月に1度の学生スタッフによるブートキャンプ(会場下見や機材確認などのオフライン作業)などがありました。
オフライン・ミーティングは、学生スタッフの多くは東京・大阪の学生なので、
東京と大阪にあるCsicoのオフィスを借りてテレビ会議システムで繋ぎ、
北海道の僕と福岡のカさんはPCからリモート参加していました。

この間、運営・参加者用NTPサーバーの構築用ansible-playbookの作成、
自分が出題する問題の作成と調整、他の出題者へのサーバー提供などを行いました。
スタッフ同士の連絡は主にSlackを使って行い、コードの管理はGithubを使っていました。

ホットステージからコンテスト当日まで

2/14〜2/26までの2週間、コンテスト会場での現地準備を行いました。
僕は私用のため途中から参加したのですが、会場設営作業、問題の出題準備などを行いました。
そのほか、普段行っているデータセンターでアルバイトの経験が
サーバーやスイッチのラックマウント作業や配線・整線作業に活かせたのではないかと考えています。
コンテスト当日は風邪を引きつらかったのですが、参加者の誘導などのスタッフ業務や出題した問題の採点を行いました。

問題の出題に関して

基本的にはサーバー系の問題を作るチームとネットワーク系の問題を作るチームに別れて作業していました。
僕が出題したのは一日目の3問目、「掲示板が機能しない!」です。
詳しい講評は後日公開されると思うのでここでは割愛しますが、
「蓄積型XSS脆弱性がある掲示板にHTMLタグを含む投稿が行われ、
掲示板が正常に機能しないから何とかしてくれ」っていう問題です。
参加チームの1/3が解答を提出してくれて、難易度としてもまあまかな、と思っています。

参加して得たもの

一番は他のスタッフや参加者の方との出会いが大きいと思います。
何日も寝食を共にしてるうちにスタッフ内での共通言語が生まれたりしました。
また、業務や趣味でサーバー構築やネットワーク構築など、
普段同じような事をやっているので、日頃抱えてる悩みを打ち明けたり、
技術的な壁にぶち当たったときに相談できる相手が増えました。

技術的な面では、ansibleとの出会いが大きかったと思います。 これはNTPサーバーの構築で使いました。というか試行錯誤してるうちに覚えました。
以前は自宅のサーバー構築をシェルスクリプトで行っていて、
シェルスクリプト生成・ホスティングサイトを作ったり

chamaharun.tk

していましたが、ansible-playbookならVMをイメージから展開する際も
イメージ内にシェルスクリプトを配置する必要が無いのでメンテナンスが楽になりそうです。

最後に

トラブルシューティングの問題を出す以上、あえて出題に必要なトラブルは起こすが、
それ以外のトラブルは起こしてはならないという縛りがあります。
これは意外と難しく、意図したトラブルが起きず、想定外の障害が発生したりします。
こうなると運営スタッフがトラブルシューティングしなければならず、
ホットステージ期間中からトラブル続きで本当に開催できるか不安になったりもしましたが、
他の凄腕エンジニアな運営スタッフの血の滲むような努力のおかげで、
なんとか大会を運営することができました。
僕自身初めての参加でしたが、得るものが多く充実した半年間だったと思います。
スタッフのみなさん、参加者のみなさん、そして応援してくださったみなさん、本当にお疲れ様でした。

2015年に参加した勉強会など

この間、といっても随分前のことだけど、
@tomio2480師匠が旧こばやし亭に泊まりに来て、目の前でブログを更新してた。

tomio2480.hatenablog.com

それを思い出して、参加したコミュニティ・勉強会などの活動をまとめておこうと思う。
(☆印は、登壇したり、LTしたり、スタッフだったりしたことを表す。)

5/30 Ohotech 特盛 #12☆ //Webアプリケーションを作った話をした
6/13 OSC2015 Hokkaido //OpenWebBoardをもらった
6/14 CTF for ビギナーズ 2015 札幌☆ //@yagihashoo師匠がイケメンだった
8/12 とみおとごはんたべる in SAPPORO //ごはん美味しかった
8/20-22 YAPC::Asia Tokyo 2015 //「みんなぁ、飲んでるかぁ〜!」
9/12 PyCon mini Sapporo 2015 //さくら師匠がpython消してた
9/26 第22回北海道情報セキュリティ勉強会 //マイナンバーのお勉強ができた
10/17 でじぽろ #1'☆ //話はgdgdだったけど新鮮な勉強会だった
10/26 ホワイトボックススイッチユーザ会 第二回勉強会 //時代の先取りって感じだった
11/7-8 第4回石狩DC見学ツアー~さくらの夕べin石狩~☆ //LTで姫の話をした
11/21 HPH 2015 林業×IT アイディアソン in ENIWA☆ //初めてアイディアソンを体験した
11/22 #01 札幌x86アセンブラ勉強会 in 北海道CTF勉強会 //初めての読書会、アセンブラ辛かった

今年も後半に集中しているなぁ。
11月とかバタバタしていたなぁ。

その他、現在来年2月に行われる某コンテストの学生運営メンバーをやってるなど。