IT pass HikiWiki - [ITPASS2011]サーバ交換作業 Diff

  • Added parts are displayed like this.
  • Deleted parts are displayed like this.

{{toc}}

[((<ITPASSサーバ構築ドキュメント>)) へ戻る]

= 概要

予備サーバと本サーバを入れ替えを行う.

* 入れ替え日には ITPASS サーバを停止することとなるため,
  停止アナウンスを数度行う (入替え日の 2 週間前から当日 30 分前まで).
* サーバの入れ替え (期間: 半日〜 1 日)

なお, 入替え前のサーバと入替え後のサーバのホスト名はそれぞれ old, new である. old と new は適宜読み替える.

= 前日作業

== home 領域を old から new へ転送

サーバ交換作業当日にも同様の作業を行うが, その際の時間を短縮するために行う.

((*<注意>*))

((*この作業の途中で root パスワードが要求される. root パスワードを所持している人は必ず作業に参加すること*))

=== 公開鍵認証の際のセキュリティ設定の変更 (通信許可)

まず new 側の old に対する通信許可の設定を行う.

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

   PermitRootLogin no

という部分を

   PermitRootLogin yes

に変更する.
さらに, 任意のコマンドを実行出来るように,

   PermitRootLogin forced-commands-only

という部分があればコメントアウトする (2011 年度は無かった).
その後,

   old# /etc/init.d/ssh restart

として設定を反映すること. これにより, root のログインを許可することとなる.


=== rsync で転送されるファイルの確認

/root/.ssh/ の秘密鍵でログインするため, まず以下の作業を行う.

   old$ sudo -s -H
   old# cd /root  

いきなり rsync コマンドを実行すると予期せぬ間違い (転送元と転送先の設定を間違って, 転送先のファイルを全て消してしまう等) が起こりうるため, まずは rsync コマンドに -n オプションをつけて実行する. -n オプションをつけて実行すると, 実際のファイルの転送は行わずに, 転送されるはずのファイルのリストが出力される.

* rsync する際, gate の home 領域や, tako のみに存在する chikuwa* の home, aquota.user ファイルまで ika に同期してしまわないよう オプション --exclude で除外する.
* 外部記憶装置にあるファイルが転送されることのないように -x というオプションを加える.
* ここでは一度ファイルリストを /tmp ディレクトリ以下に出力し, 確認してから実際の転送を行うこととする.

   ika-itpass:~# rsync -n -av --delete -e ssh --exclude chikuwa* -x --exclude=gate
                --exclude=aquota.user --exclude=quota.user --exclude=quota.user.bk
                /home/ new-itpass.scitec.kobe-u.ac.jp:/home/
                2>&1 | tee /tmp/rsync_old2new.log

ここでは 4 行に分けて書いているが, 実際には 1 行で入力する. ((*スペースを入れる位置に注意すること.*)) なお, rsync に関するオプション (-av, --delete, -e 等) については, ((<rsync(1)|URL:http://www.infoscience.co.jp/technical/rsync/rsync.html>))
等を参照のこと. また, "/home" と "/home/" では転送内容が異なるため注意しなければならない.

上記コマンドの動作の終了後, /tmp/rsync_old2new.log を見て, 転送される予定のファイルを確認する. もし予期しないファイルが削除, 転送されてしまわれる場合には, --exclude オプションを使用してそのファイルは転送対象から除外すること.

なお, 上記コマンドを実行すると,

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

という警告が出て, リストは適切に出力されない場合がある.
これは, old に登録されている new の指紋が, known_hosts に書かれている指紋と一致していないために生じる.
この場合, 警告に続くメッセージで指摘された行にある new の指紋を削除し, 上記コマンドを実行する.

Warning: Permanently added the RSA host key for IP address '<new の IP アドレス>' to the list of known hosts.

というメッセージが出て, new の指紋が known_hostsに登録されるので, 再び上記コマンドを実行すると公開鍵認証を行うことができる.


=== rsync でファイルを転送

((<URL:#rsync で転送されるファイルの確認>)) で確認したコマンドから -n オプションを除いたコマンドを実行する.

このとき tako の root パスワードが要求される.
実行後, new 内の /home 以下にファイルが転送されていることを確認すること.
最後に, ((<URL:#公開鍵認証の際のセキュリティ設定の変更 (通信許可)>))で行なった設定を元に戻す.


= 当日作業

== phase 1  (入替え開始)

=== old のサービス停止

* http (https), qmail, tcpserver (smtp), inetd (pop3)
  * サービス停止作業
    * apache2 qmail, tcserver, openbsd-inetd に関して, 以下のコマンドで, サービスを一時的に停止する.
      ただし, 再起動すると再びこれらのサービスも起動してしまうため,
      作業途中で再起動の必要性が出てしまった場合は注意.
      永続的にサービスを停止する作業は ((<phase 3|[ITPASS2011]サーバ交換作業(WWW)#phase 3>)) にて行う.

        old# /etc/init.d/apache2 stop
        old# /etc/init.d/qmail stop
        old# /etc/init.d/tcpserver stop
        old# /etc/init.d/openbsd-inetd stop

* ssh などで作業者以外のログインユーザが居る場合, プロセスを削除
  * ps aux コマンドで確認後, そのようなプロセスがある場合に, kill <プロセスID> とする.

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

root のログインを許可するため, 以下のように設定を変更する.

new の /etc/ssh/sshd_config で,

  PermitRootLogin no

という部分を

  PermitRootLogin yes

に変更する.

さらに, 任意のコマンドを実行出来るように,

  PermitRootLogin forced-commands-only

という部分があればコメントアウトする. その後,

  new# /etc/init.d/ssh restart

として設定を反映すること. これにより, root のログインを許可することとなる.


* old の /var/spool/cron/crontabs 以下の各ファイルを new へコピー
  * scp コマンドで移す際には, パーミッションやグループ等の設定を変えてしまわないように注意 (オプション p の使用).

   root@old-itpass:/var/spool/cron# scp -p -r crontabs root@new-itpass:/var/spool/cron/
  
* old の /etc/shadow のユーザ部分を new へコピー (注意)
  * old, new に別々の仮想端末でログインする.

    new の /etc/shadow を/etc/shadow~にバックアップ.
    old の /etc/shadow を new へ /etc/tmp として一時的にコピーする.
    /etc/tmp と /etc/shadow を diff コマンドで比較して, /etc/shadow に書かれていない UID のうち 1000 〜 29999 までのものが /etc/tmp にあるか確認する. あれば /etc/tmp からコピーする. (UID とユーザ名の対応については /etc/passwd を参照)

    作業が終われば /etc/tmp を削除する.

* /home ディレクトリを rsync する

  前回 rsync を行ってからこの作業をするまでの間に変更があった分のために再度 rsync を行う.
  * 作業については ((<home 領域を old から new へ転送|[ITPASS2010]サーバ交換作業#home 領域を old から new へ転送>)) を参照.


* new 側の old に対する通信制限の設定

先ほど, old から new に rsync でファイルを転送するために, root のログインを許可したので, 設定を以下のように変更して元に戻す.  

/etc/ssh/sshd_config の

    PermitRootLogin yes

という部分を

    PermitRootLogin no

に変更したのち,

    new# /etc/init.d/ssh restart

として設定を反映することにより元に戻る.


  * old の authorized_keys を編集

    * new-itpass の公開鍵の行の冒頭に以下を加える.

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

    * ファイル名を authorized_keys.bk に変更し, root ログインを完全に拒否するようにする.

* old の /usr/local/qpopper/pop.auth を new へコピー
    old$ cd /usr/local/qpopper/
    old$ sudo cp pop.auth ~/
    old$ sudo chown hoge:hoge pop.auth
    (hoge は適宜, 適当なユーザ名に変更すること)
    old$ sudo scp pop.auth new:
    old$ slogin new
    new$ cd /usr/local/qpopper
    new$ sudo mv pop.auth pop.auth~
    new$ sudo mv ~/pop.auth .
    new$ sudo chown pop:mail pop.auth
    new$ ls -l
    new$ rm pop.auth~
    new$ exit

== ホスト名と IP アドレスの変更
old と new のホスト名と IP アドレスを入れ替える.
また, この作業は phase 2 の一番最後に行うこと.

* ホスト名の変更

  * 編集するファイル
    * /etc/hostname
    * /etc/hosts
    * /etc/mailname
    * /etc/gate/gate.conf
    * /etc/exim4/update-exim4.conf.conf
    * /usr/local/bind/etc/namedb/localhost.zone
    * /usr/local/bind/etc/namedb/localhost.rev
    * /var/qmail/control/defaulthost
    * /var/qmail/control/me
    * /etc/motd
   # grep ika (または tako) /etc/*
  等で古い名前が残っていないか検索しながら作業すること.

* IP アドレスの変更

  /etc/hosts と /etc/network/interfaces 内の IP アドレスを入れ替える.

   設定後
   old --> 133.30.109.21
   new --> 133.30.109.22
* ネットワークの再起動

  設定の変更後, ネットワークを再起動する.  
  
    # /etc/init.d/networking restart
    
  この作業後, new (または old) に接続できなくなった場合は, 該当サーバを再起動する.

* 設定を元に戻す

  以下の設定は phase 3 で DNS 班が行うのでここでは作業しなくてよいが, 後で確認しておく.
  先ほど, old から new に rsync でファイルを転送するために, root のログインを許可したので, 設定を以下のように変更して元に戻す.

  /etc/ssh/sshd_config の

      PermitRootLogin yes

  という部分を

      PermitRootLogin no

  に変更したのち,

      new# /etc/init.d/ssh restart

  として設定を反映することにより元に戻る.

== phase 3

=== old の設定変更

再起動したため, まず, old のサービスを再び停止する.

* bind の設定変更

  bind を止めてサーバ起動時に bind が立ち上がらないように、起動スクリプトを変更する.

   root@old-itpass:/etc/init.d# /etc/init.d/bind stop
   root@old-itpass:/etc/init.d# update-rc.d -f bind remove
   Removing any system startup links for /etc/init.d/bind ...
   /etc/rc0.d/K20bind
   /etc/rc1.d/K20bind
   /etc/rc2.d/S20bind
   /etc/rc3.d/S20bind
   /etc/rc4.d/S20bind
   /etc/rc5.d/S20bind
   /etc/rc6.d/K20bind

* 再起動しても以下のサービスが立ち上がらないようにする.

  * 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>

  * qmail の設定変更

  外から来たメールを受け取らないように, さらに cron のログメールを飛ばすのに必要な設定だけにするため, /var/qmail/control 以下の locals, rcpthosts を以下のように変更した. 移行が終わったら起動する.

  変更前
    localhost
    ika.scitec.kobe-u.ac.jp
    itpass.scitec.kobe-u.ac.jp
    epa.scitec.kobe-u.ac.jp
    aoe.scitec.kobe-u.ac.jp
    cps.scitec.kobe-u.ac.jp

  変更後
    localhost

  * 確認作業
    * 再起動を行い, ps aux コマンドで停止したはずのサービスが
      立ち上がっていないことを確認する.

=== new の設定変更

* qmail の設定変更

  /var/qmail/control 以下の locals, rcpthosts が以下のように変更されているかチェックする. されていない場合は以下のように編集する.

    localhost
    ika-itpass.scitec.kobe-u.ac.jp
    itpass.scitec.kobe-u.ac.jp
    epa.scitec.kobe-u.ac.jp
    aoe.scitec.kobe-u.ac.jp
    cps.scitec.kobe-u.ac.jp

  また, /var/qmail/control 以下の defaultshost, me が以下のように変更されているかチェックする. されていない場合は以下のように編集する.

    ika-itpass.scitec.kobe-u.ac.jp

  qmail-showctl(8) で設定を確認.

* qmail の再起動
  
    /etc/init.d/qmail restart

* メーリングリスト毎の bouncer 設定

  メーリングリストのエラーメール転送設定が行われているかチェックする. この作業が必要なメーリングリストは,

    itpass-ml_at_itpass.scitec.kobe-u.ac.jp

  である. ただし, "_at_" はアットマークである.
  /home/itpass/ml/ml-crtl/bouncer が以下のように変更されていることを確認する. されていない場合は以下のように編集する.

    &itpadmin_at_itpass.scitec.kobe-u.ac.jp
    |/usr/local/ezmlm/bin/ezmlm-weed
    |/usr/local/ezmlm/bin/ezmlm-return -D '/home/itpass/ml/ml-ctrl'

* bind の設定変更

  * namedb のバックアップを作成(日付は適宜変更)

     root@new-itpass:/usr/local/bind/etc# cp -r namedb namedb-20111104

  * サーバ起動時に bind が立ち上がるよう, 起動スクリプトを変更

     root@new-itpass:/usr/local/bind/etc# update-rc.d bind defaults

    ここで

     insserv: warning: script 'K01tcpserver' missing LSB tags and overrides
     insserv: warning: script 'tcpserver' missing LSB tags and overrides

    のような LSB の警告が出た場合, 以下を /etc/init.d/tcpserver の冒頭に追記する.

     ### BEGIN INIT INFO
     # Provides:          tcpserver
     # Required-Start:    $remote_fs
     # Required-Stop:     $remote_fs
     # Should-Start:      $network $syslog
     # Should-Stop:       $network $syslog
     # Default-Start:     2 3 4 5
     # Default-Stop:      0 1 6
     # Short-Description: Start and stop tcpserver
     # Description:       tcpserver is  access control program
     #        which translates ip addresses to and from internet names
     ### END INIT INFO

    その後, update-rc.d -f bind remove を実行してから, もういちど update-rc.d bind defaults を実行し, 警告が出ないことを確認する.
    
    毎年異なる箇所でエラーが起きる可能性があるため(2010年度は/etc/init.d/bind を編集する必要があった), 適宜修正内容は変更する.

  * resolv.conf の書き換え

      /etc/resolv.conf を以下のように書き換える.これにより再起動後から new はフルサービスリゾルバとなる.

       nameserver 127.0.0.1
       #nameserver 133.30.14.2                      
       #nameserver 133.30.14.3                      
       #nameserver 133.30.8.2
       search scitec.kobe-u.ac.jp

* 以下のサービスが定常的に立ち上がるように設定する.
    * http(https), tcpserver(smtp), inetd(pop3)


=== 確認作業

サーバ交換作業が終わったら, 再起動して 以下の確認作業を行う.

* old 

  ps aux コマンドで, http (https), bind, inetd (pop3) が起動していないことを確認.
    
* new

  ps aux コマンドで, http (https), bind, tcpserver (smtp), inetd (pop3) が起動していることを確認.

== phase 4

=== 移行の最終チェック

==== new
  * ((*http*)): 表示できるか
    * 表示できないページがある場合は, /usr/local/apache2/conf/httpd.conf にそのページの領域の行があるか確認する. もしなければ, 書き加える.

  * ((*hiki*)):に書き込めるか
  * ((*gate*)):による登録や変更は可能か
  * ((*bind*)):問い合わせに応じるか, 正しいデータを返すか
  * ((*fail2ban*)): は正しく動作しているか

* ((*pop*)): メールをとってこれるか
  * new での作業
    * new の利用者は自分の new のアカウントで, .qmail の設定と Mailbox の作成
    * popauth コマンドを行ってパスワードを作っておく作業をする
  * メールを受け取る new 以外の計算機での作業
    * メーラーの設定は pop サーバ, smtp サーバはどちらも itpass.scitec.kobe-u.ac.jp にする
    * 認証形式は APOP で, 暗号化は pop も smtp も無しにする
    * 受信のときにパスワードを要求されるので, popauth で作成したパスワードを入力する.
* ((*smtp*)): メールを出せるか, 受け取れるか
  * qmail-inject で外にメールが届くか
    * ((<リモート送り出しテスト|[ITPASS2011]qmailのインストールと設定#[テスト 3] リモート送り出しテスト>)) を実行し, 届くことを確認する
  * 外からメールを送って届くか
* ((*mailing list*)): メールが配送されるか
  * Mailing list にメールを送って届くか

==== old

  * ((*http*)): 無効になっているか
  * ((*bind*)): 問い合わせに応じるか, 正しいデータを返すか
  * ((*pop*)): 無効になっているか
  * ((*smtp*)): submit は有効にするが, 受け取らない設定になっているか
    * ((<ローカル配送テスト part1|[ITPASS2011]qmailのインストールと設定#[テスト 1] ローカル配送テスト part1>)) を実行し, 届かないことを確認する
    * cron のログが管理者に届くようになっているか
      * /etc/crontab 内の mail コマンドを実行し, 届くことを確認する.
      ただし _at_ は @ に読み替えること.
        # mail -s "`hostname -f` test" itpadmin_at_itpass.scitec.kobe-u.ac.jp

== phase 4.5

=== 電脳サーバへのバックアップの確認

ITPASS サーバの資源は, 毎日電脳サーバへバックアップされている. cron によって毎日実行されているそのシェルスクリプトが正常に作動しているか試行する.

電脳サーバへログインし,

$ sudo -u kobe -s

によって kobe になり, kobe のホームディレクトリに移動.
そこで,

$ ./itpass_rsync_epa2dennou.sh -n
$ ./epalab_rsync_epa2dennou_yyh.sh -n

を実行する. その後, 出力されたログを確認する.

$ cd ./itpass_rsync_epa2dennnou_log
$ less itpass_rsync_epa2dennnou.log
$ cd ../epalab_rsync_epa2dennnou_log
$ less ./epalab_rsync_epa2dennnou.log

2 つとも正常に出力されていれば OK.

== 後日の作業

* 要らないファイルの削除

  運用開始から 1 週間をめどに, 参考のために old からコピーしたファイル類を削除する. また emacs で編集した際の一時ファイル(ファイル名~ など)もあれば削除する.


* 再構築作業用 chikuwa* ユーザの削除

   userdel -r [アカウント名]

  で, ホームディレクトリも一緒に削除できる.

  * visudo から chikuwa* を削除する.

[((<ITPASSサーバ構築ドキュメント>)) へ戻る]