[Memo2009][ITPASS] サーバ交換作業(山元, 辻野)

10/23 (金) (当日作業)

以下では, ITPASS サーバの old から new への移行の作業の 詳細を時系列順 (phase 0 -- 4) にまとめる. phase 0 -- 4 内のそれぞれの項目は順不同.

phase 1 (入替え開始)

new のサービスを停止する.

  • http (https),
    • サービス停止作業
      • apache2, に関して, 以下のコマンドで, サービスを一時的に停止する. ただし, 再起動すると再びこれらのサービスも起動してしまうため, 作業途中で再起動の必要性が出てしまった場合は注意. 永続的にサービスを停止する作業は phase3 にて行う.

        # /etc/init.d/apache2 stop
  • old の /etc/cron.local/daily/230_rsync_epabk のパーミッションを 000 にする.

phase 2

old から new へ各種データをコピー

  • old の /var/spool/cron/crontabs 以下の各ファイルを new へコピー
    • scp コマンドで移す際には, パーミッションやグループ等の設定を変えて しまわないように注意 (オプション p の使用).
  • old の /etc/shadow のユーザ部分を new へコピー (注意)
    • old, new に別々の仮想端末でログインする. new の /etc/shadow を/etc/shadow~にバックアップ. old の /etc/shadow のユーザー部分 (UID が 1000 〜 29999 までのもの. UID とユーザ名の対応については /etc/passwd) を参照のこと.

      このファイルをそのままコピーすると, new での構築作業用アカウントが消えるので, old と new を比較して, UID が new にない UID が 1000 〜 29999 までのものを目視でコピーする.

phase 3

old の設定変更

  • 再起動しても以下のサービスが立ち上がらないようにする.
    • http (https), pop3
      • apache2, openbsd-inetd に関して, 以下のコマンドによって OS が起動する際に立ち上がらないように しておく. <service> には上記のサービス名を与える.

        # cd /etc/init.d
        # update-rc.d -f <service> remove
        # chmod 644 <service>
      • 余談だが, これら停止したサービスを再開する場合には, 以下のようにするとよい.

        # cd /etc/init.d
        # update-rc.d <service> defaults
        # chmod 755 <service>

概要

ITPASS サーバにはバックアップとサーバ本体のトラブル時に代替するための 予備サーバを立ててある. /home 以下のいくつかの領域に関して, ITPASS サーバ本体から予備サーバへ定期的にバックアップを取る.

注意

以下は, サーバ移行後に設定すること.

バックアップする領域

バックアップを取る領域は, 原則的にグループで管理する資源や, システムにとって必要な資源である.

2009/10/01 現在, 以下の領域をバックアップの対象とする.

  • aoelab cps epalab itpass pschool gate mosir

バックアップの際の認証方式

バックアップには rsync を用いる. root アカウントでバックアップを行うが, セキュリティを高めるため, その認証には SSH + 公開鍵暗号を用いる.

準備

以降では, 運用中の ITPASS サーバのホスト名を itpass, 予備サーバを itpassbk と称する. 実際には, 使用するホストの名称に 置き換えて作業を行うこと.

まず, itpass, itpassbk ともに SSH デーモンが立ち上がっている必要があるため, [EPA2008b]sshのインストールと設定 を先に行っておくこと.

itpass(ここではtako) 側での公開鍵作成

バックアップのための公開鍵を作成する.

epa$ sudo -s -H
epa# cd /root
epa# ssh-keygen -t dsa

(鍵は /root/.ssh/id_dsa_rsync とする)
(パスフレーズは空にする)

itpassbk(ここでは ika) 側の鍵の設置

itpass(tako) で作成した公開鍵 itpass(tako):/root/.ssh/id_dsa_rsync.pub を itpassbk(ika):/root/.ssh/authorized_keys にコピーする. 既に authorized_keys が作成されている場合には, id_dsa_rsync.pub の内容を authorized_keys の最後尾に追記すること.

ただし, このままでは itpass(tako) で root を取られると itpassbk(ika) もそのまま 乗っ取られることが考えられるため, 公開鍵認証の際にはバックアップ以外 の動作をできないよう, また ITPASS ドメイン以外からのアクセスを受け付けないよう 制限をかける. そのために, 上記で設置した authorized_keys 内の itpass(tako) の公開鍵の行の冒頭に以下を加える. なお, 見易さのため改行してあるが, 一行で書くこと, またカンマの前後に空白は開けないこと. そして, 最後の "no-agent-forwarding" と公開鍵の冒頭に書いてある "ssh-dss" または "ssh-rsa" の間には空白を一文字入れること.

command="rsync --server -vlogDtpr --delete . /home/",no-pty,
from="*.scitec.kobe-u.ac.jp",no-port-forwarding,
no-X11-forwarding,no-agent-forwarding

itpassbk(ika) 側の通信許可

最近の OpenSSH では, デフォルトでは root のログインを許可しないため, 設定を変更する. /etc/ssh/sshd_config の

PermitRootLogin no

という部分を

PermitRootLogin forced-commands-only

に変更したのち,

itpassbk# /etc/init.d/ssh restart

として設定を反映すること. これにより, epabk 側の鍵の設置 で指定したコマンドでのみログインを許可することとなる.

itpass(tako) 側でのデータ転送用スクリプトの設置

自作スクリプト用 cron ディレクトリ作成

自作の cron 用スクリプト置き場として, /etc/cron.local を作成する. すでに作成されている場合は何もしない.

# mkdir /etc/cron.local
# mkdir /etc/cron.local/daily

バックアップ用スクリプトの用意

rsync_epabk.sh を, /etc/cron.local/daily/230_rsync_itpassbk に設置する. (スクリプト先頭の番号は, その他のスクリプトを置いた際, どれを 優先して実行するかを決めるためのものである. 若い番号のものほど 先に実行される).

まず, 適当なディレクトリにスクリプトをダウンロードする.

$ wget http://epa.scitec.kobe-u.ac.jp/~itpass/epa/system_backup_2008/rsync_epabk.sh

バックアップ用スクリプトの編集

itpass および itpassbk のホスト名やバックアップする領域に応じて, 230_rsync_itpassbk を編集する. 主に編集するのは以下の項目である.

["SHARED_HOST"]

バックアップを行う 2 つのホスト (本文書での epa および epabk) のドメイン名 (ホスト名 + ドメイン名) をスペースで区切って 記述する. 送信元と送信先で順序を変える必要は無い.

このスクリプトではスクリプトを起動するホストが必ず 転送元で, もう一方が転送先になるようになっている.

これを以下のように変更する.

SHARED_HOST="ika-itpass.scitec.kobe-u.ac.jp tako-itpass.scitec.kobe-u.ac.jp"
["BKSUBDIRS"]

転送する領域を記述する. これは バックアップする領域 に応じて書き換えること.

なお, "hoge/" 等と最後にスラッシュをいれると転送がうまく 行かなくなるので注意すること.

以下のように変更する.

BKSUBDIRS="aoelab cps epalab itpass pschool gate mosir"

スクリプトの設置

変更後, /etc/cron.local/daily/230_rsync_itpassbk に設置する.

# mv rsync_epabk.sh /etc/cron.local/daily/230_rsync_itpassbk 

/etc/cron.local/daily/230_rsync_itpassbk に実行権限を設定する.

# chmod 755 /etc/cron.local/daily/230_rsync_itpassbk 

バックアップログファイルの作成

ログファイルのためのディレクトリとファイルを作成しておく.

# mkdir /var/log/rsync-log
# touch /var/log/rsync-log/itpassbk.log 

なお, このログファイルの場所は バックアップ用スクリプトの用意 で用意した 230_rsync_itpassbk 内の LOGFILE を書き換えることで変更できる.

ここでは, 以下のように変更しておく.

LOGFILE='/var/log/rsync-log/itpassbk.log'

また, 次のファイルも修正しておく.

LOGTMP="${TMPDIR}/rsync_itpassbk.tmp.log-$$"

crontab の編集

/etc/crontab を編集する. 以下の一行を追加する.

25 6    * * *   root    cd / && run-parts --report /etc/cron.local/daily

出力結果に関してメールを送信したい場合には以下のようにすると良い.

25 6    * * *   root    cd / && run-parts --report /etc/cron.local/daily |mail -s "`hostname -f` daily run outputs" xxx@xxx.xxxx

バックアップログファイルの logrotate の設定

rsync のログを 1 週間毎に分割する. /etc/logrotate.d/ 以下に rsync_itpassbk という設定ファイルを作成.

# vi /etc/logrotate.d/rsync_itpassbk

以下の内容を書き込む.

/var/log/rsync-log/itpassbk.log {
    weekly
    create 0644 root root
    rotate 12
}

動作確認

設定を終えた後, cron が起動する前に, 一度動作確認をしておく.

# cd /etc/cron.local/daily/230_rsync_itpassbk
# /etc/cron.local/daily/230_rsync_itpassbk

以上の作業でエラーが出なければ完了.

トラブルシューティング

Hiki 内のページを名前指定して URL を参照する際, 正しいページに飛ばない問題.

  • リダイレクトの際, 参照する名前の文字コード区切りごとに "%" を意味する "25"が挿入されていた.ことが原因である. 解消するには, バーチャルホストのリダイレクトを設定して, "%" を URL の一部として (エスケープしない文字として) 解釈させる必要がある.
  • .そのためには, itpass 以下の hiki を運用しているバーチャルホストすべてに対して, hiki に関して 'noescape|NE' オプションを付けてやればよい.
  • /usr/local/apache2/conf/extra/httpd-vhosts.conf について, 以下の修正を行った.

    # line 40 - 44
         RewriteLogLevel 0
         RewriteCond %{SERVER_PORT} !^443$
    -    RewriteRule ^/hiki/(.*)?$ https://itpass.scitec.kobe-u.ac.jp/hiki/$1 [L,R]
    +    RewriteRule ^/hiki/(.*)?$ https://itpass.scitec.kobe-u.ac.jp/hiki/$1 [L,R,NE]
         RewriteRule ^/hiki/(.*)?$ https://itpass.scitec.kobe-u.ac.jp/hiki-secret/$1 [L,R,NE]
    
    # line 115 - 119
         RewriteCond %{SERVER_PORT} !^443$
         # ---- hiki
    -    RewriteRule ^/hiki/(.*)?$ https://epa.scitec.kobe-u.ac.jp/hiki/$1 [L,R]
    +    RewriteRule ^/hiki/(.*)?$ https://epa.scitec.kobe-u.ac.jp/hiki/$1 [L,R,NE]
         # ---- gate
         RewriteRule ^/~gate/(.*)?$ https://itpass.scitec.kobe-u.ac.jp/~gate/$1 [L,R,NE]

移行後, 検索がうまくいかない問題.

  • 入力した文字列にかかわらず,
undefined method `index' for nil:NilClass hiki

と出力される.

  • 対処法は次の通り.

hiki は, data ディレクトリ下の info.db でページ情報を一括管理している. たとえば, itpass の hiki については

/home/itpass/hiki/data/info.db
/home/itpass/hiki-secret/data/info.db

である. info.db に存在しないファイルが記載されていたり, ページ名に不整合があったりすると, 「 info.db に項目はあるが, 実態は存在しないページ」が発生し, 検索のためのインデックスがうまく生成できなくなると考えられる.

--> info.db をいったん削除し, 再度検索を実行する.
  • 結果,新しい info.db が新たに生成されて,検索できるようになった.

hiki の table タグが生成されない問題.

  • 次に挙げる 3 つの作業に不備があった.
  1. rd2html が未更新であった.

    [Memo2009][ITPASS] tako 構築作業ログ(Hiki 1)(山元, 辻野)#rd2html.rb の修正において, /usr/share/hiki/style/rdplus/rd2html.rbに, [Memo2008][EPA]tako作業メモ(納多)(080731)#rd2html.rb の修正 に記載された修正が行われていない, もしくは修正後の rd2html.rb で置き換えなかったために, table タグを生成するスクリプトが呼び出されていなかった.

    →修正を行った.

  2. table_form_rd.rb の更新に不備があった.

    /usr/share/hiki/misc/plugin/table_form_rd.rb が, [Memo2009][ITPASS] tako 構築作業ログ(Hiki 1)(山元, 辻野)#TABLE を使えるようにするための設定 のログ通りに更新されていなかった.

    →項目中の全ての作業を行った.

  3. rttool がインストールされていなかった.

    [Memo2008][EPA]tako作業メモ(納多)(080731)#CGI の基本動作のチェック に記載された rttool の導入作業がなされていなかったため, table タグを生成できなかった. なお, この作業は前年度の作業ログに記載されていなかったため, 来年度マニュアルより新しく項目を設けるべきである.

    →rttool をインストールした.

  • 以上 3 つの作業を完了した結果, table タグが生成されるようになった.