1. ソフトウェアの品質確保

  • ソフトウェアのテスト
  • 潜在している不具合を机上または実機で発見・摘出することで、品質を確保するためにおこなう

  • ソフトウェアのテストの段階
    • 単体テスト
    • モジュールごとにおこなうテストで、モジュールテストとも呼ばれる

    • 組み合わせテスト
    • 複数のモジュールを組み合わせたプログラム単位でおこなうテストで、結合テストとも呼ばれる

    • システムテスト
    • システムを構成するすべてのプログラムを連携させておこなうテストで、総合テストとも呼ばれる

    • 運用テスト
    • 運用時と同一条件下でおこなうテスト

  • 単体テストで用いられるテスト技法
  • ホワイトボックステストとブラックボックステスト

    説明テストケース作成の基本
    ホワイトボックステスト モジュールの内部構造に着目したテスト 命令網羅、判定条件網羅
    ブラックボックステスト モジュールの入力と出力のデータに着目したテスト 同値分割、限界値分析

Next































ホワイトボックステスト

  • 命令網羅 (SC: Statement Coverage)
  • テスト対象となるモジュールのすべての命令が1回以上実行されるようにテストケースを作ること。 C0メジャーともいう。

  • 判定条件網羅 (BC: Branch Coverage)
  • テスト対象となるモジュールのすべての判定条件で、それぞれの分岐方向を少なくとも1回は辿るようにテストケースを作ること。 C1メジャーともいう。

    <%
            String          user_name;
            String          mail_address;
            int             uid;
            UserManager     um;
    
            user_name = (String)request.getParameter("user_name");
            mail_address = (String)request.getParameter("mail_address");
            um = new UserManager();
    
            uid = um.search(user_name, mail_address);
            if (uid != -1) {
                    String msg = "There is exactlly the same account(";
                    msg += user_name + " / " + mail_address + ")";
                    request.setAttribute("msg", msg);
                    %><jsp:forward page="login.jsp" /><%
            }
    
            uid = um.add(user_name, mail_address);
            if (uid != -1) {
                    session.setAttribute("uid", Integer.toString(uid));
            }
    %>
    
    <jsp:forward page="main.jsp" />
    

    アカウント作成処理の上記のコードにおいて、um.search()はuser_name="iwasaki", mail_address="iwasaki@freebsd.org"の場合のみ1を返し、それ以外は-1を返す。 またum.add()はuser_nameおよびmail_addressの文字列長が1以上でないと-1を返し、それ以外は2以上の値を返す。
    この前提条件でC0/C1メジャー100%を満たすテストケースの例を以下に示す。

    テストケース 1 2 3
    入力 user_name="iwasaki"    
    user_name="mitsuru"    
    user_name=""    
    mail_address="iwasaki@freebsd.org"
    mail_address="iwasaki@jp.freebsd.org"      
    mail_address=""      
    出力 login.jspへ遷移    
    main.jspへ遷移  
    セッション変数uidが設定される    
    セッション変数uidが設定されない    

Next































ブラックボックステスト

  • 同値分割 (Equivalence Partitioning)
  • 対象となるモジュールへ与える入力値を、正常処理の対象となる有効同値クラスと、エラー処理の対象となる無効同値クラスに分け、 それぞれの代表的な値を使用してテストケースを作成すること。

  • 限界値分析 (Boundary Value Analysis)
  • 対象となるモジュールへ与える入力値を、有効値と無効値の境界値を使用してテストケースを作成すること。 また、出力同値類を考慮することによってもテストケースが得られることが多い。

  • 同値分割よりも限界値分析の方が有効であるとされている。同値分割では代表値の選択は任意であるが、 限界値分析では同値類のそれぞれの端の値がテスト対象となるように、一つ以上の要素を選ぶ必要がある。
  • テストケース作成の例(入力値の有効範囲: 10 < X < 100)
    • 無効値: ・・・ 8, 9, 10
    • 有効値: 11, 12, 13 ・・・ 97, 98, 99
    • 無効値: 100, 101, 102 ・・・

    • 同値分割: 8, 50, 200
    • 限界値分析: 10, 11, 99, 100

Next































[演習]ソフトウェアの品質確保

  • ミッション1
  • 2日めで作成したWebアプリケーションのsimpleAppパッケージUserManagerクラスのモジュールのテストケースを作成せよ。 作成基準は以下のとおり。

    • C0/C1メジャー100%
    • テストケース密度の目標はJavaコード10ステップあたりテストケース1件(UserManagerクラスは60行弱なので最低6件)
    • 正常系だけでなく、異常系、境界条件/限界値にも着目したケースを作成すること(PostgreSQLの停止、user_masterテーブルのカラム長なども考慮)
    • テストケースの作成は以下のPCLの様式を印刷し、手書きで記入していくこと

    • PCLの様式
  • ミッション2
  • ログインページlogin.jspをテストドライバとしてミッション1で作成したテストケースをすべて消化せよ。消化したテストケースは確認欄にチェックを入れること。

Next































2. ロードバランサを利用したフェイルオーバ

  • システム運用時の障害対策の基本は冗長化技術
  • フェイルオーバ
    • サーバやシステムの冗長化技術の一種。処理中のサーバやシステムの障害発生時に、 予備のシステムが自動的に処理を引き継ぎ、そのまま処理を継続する技術。
    • フェイルオーバの主な実現方法としては、複数台のサーバを用意し、 1台にトラブルが発生した場合は他のサーバに処理を引き継く方法などがある。
    • フェイルオーバ時に引き継ぐ主なリソースは、ディスク、IPアドレス、 アプリケーション。
    • 処理を引き継いだサーバにも障害が発生した場合に、その他の待機サーバに 順次処理を引き継いでいく機能はカスケードフェイルオーバなどと呼ばれる。
  • ロードバランサ
    • 外部ネットワークからの要求を一元的に管理し、同等の機能を持つ複数のサーバへ 中継する装置。
    • サーバ群の利用効率の向上、システムの全体性能および信頼性の向上が期待できる。
    • 外部のネットワークから見ると、背後にあるサーバ群の代表としてロードバランサの IPアドレスおよびポート番号だけが見えるため、全体として仮想的な1台のサーバに見える。
    • クライアントはロードバランサへ要求を送り、ロードバランサが物理サーバを選んでクライアントからの要求をそのサーバに中継する。 物理サーバからの応答はロードバランサ経由でクライアントへ送られる。
    • ロードバランサが物理サーバを選択する際に物理サーバの障害を検知した場合、 その物理サーバへの中継はおこなわずに別の稼働しているサーバが選択される。

Next































[演習]ロードバランサを利用したフェイルオーバ

  • ミッション1
  • ロードバランサソフトウェアBalanceを使用して、以下の要件でフェイルオーバの 仕組みを構築する。

    待ち受けポート 80
    現用系サーバ(IP/PORT) localhost/8180
    待機系サーバ(IP/PORT) localhost/10001

    Balanceのインストール手順は以下の通り。

    $ cd course/day-3/balance
    $ make
    $ su
    # make install
    [snip]
    # exit
    

    Balanceの使用方法については、man balanceでマニュアルページを参照するか、 開発元の以下のURLなどを参照。

    http://www.inlab.de/balance.html

    今回は待機系サーバについては、サービス停止のメッセージを返すだけの 簡易SORRYサーバを以下の要領で設定して代用する。

    # vi /tmp/sorry.sh 
    
    入力内容:
    ----
    #!/bin/sh
    
    echo '<html><body>Sorry, the service is currently unavailable.</body></html>'
    ----
    
    # chmod +x /tmp/sorry.sh
    
    # vi /etc/inetd.conf
    
    追加内容:
    ----
    sorry   stream  tcp     nowait  www     /tmp/sorry.sh   sorry.sh
    ----
    
    # vi /etc/services
    
    追加内容:
    ----
    sorry           10001/tcp
    ----
    
    # vi /etc/rc.conf
    追加内容:
    ----
    inetd_enable="YES"
    ----
    
    # sh /etc/rc.d/inetd start
    
    
  • ミッション2
  • Balanceのソース解析をおこない、アクセスログを出力できるように改造する。 今回は待ち受けポート番号とクライアントIPを、標準出力へ出力する。

    ソース解析を支援する環境を構築する手順は以下の通り。

    $ cd course/day-3/balance/work/balance-3.42
    $ gtags
    $ htags
    $ w3m HTML/index.html
    

    以下のようにTomcatのコンテンツとして配置してもよい。

    $ su
    # cp -r HTML balance-src
    # mv balance-src /usr/local/apache-tomcat-6.0/webapps/
    # exit
    

    ヒント: -gオプション付きでコンパイルするようMakefileを修正して、 gdbで動作を追跡すると理解が進む

    なお、アクセスログは標準出力を以下のようにloggerコマンドへ渡すことで、 system logへ記録される。

    # balance -f 80 localhost:8180 | logger -t balance
    

Next































3. 運用監視ツールの開発

  • 24時間365日の安定稼働を実現するためには、システムを構成する要素 (ハードウェア、ソフトウェア、ネットワークなど)の障害発生に対する 対処方法が重要
    • 障害発生の予兆を検知する
    • 実際の障害発生をASAPで検知する
    • 障害発生の影響を最小限に抑える
    • 要員確保と監視体制の確立
  • 運用監視ツールは大別してリモート監視方式とエージェント監視方式
    • リモート監視方式
    • 監視サーバからリモートで監視対象機器の監視情報を取得する

    • エージェント監視方式
    • 監視対象機器で監視エージェントを稼働させ監視情報を 監視サーバへ通知する

  • 運用監視のポイント
    • 機器の稼働状況監視
    • 機器が正常に動作していることを定期的に監視。ICMP、TCPポーリング、 SNMPトラップなどによる監視対象機器の死活監視や、サービス稼働の監視。

    • システムリソース監視
    • CPU、ハードディスク、ネットワークトラフィックなどのシステムリソース を監視。

    • システムの安全性の確保
    • ファイアウォールの実装やその監視をおこなう。

Next































[演習] 運用監視ツールの開発

  • Webアプリケーションが稼働するサーバで動作させる運用監視ツールを開発する。 以下に仕様を示す。
    • 仮想メモリ、ディスクI/O、CPUなどのシステム統計情報を表示する。
    • 以下のサービスポートの状態とコネクション数を表示する。
    • サービス名ポート番号
      (プロトコルはTCP)
      SMTP25
      SSH22
      TOMCAT8180
      POSTGRESQL5432
    • サービスプロセスの状態を表示する。プロセスの存在確認はpsコマンドの出力の パターンマッチングによっておこない、必要に応じて再起動をおこなう。
    • サービス名パターマッチング
      文字列
      起動/停止スクリプト
      SMTPsendmail: accepting connections /etc/rc.d/sendmail
      SSH/usr/sbin/sshd /etc/rc.d/sshd
      TOMCATjava /usr/local/etc/rc.d/tomcat6
      SLOG/usr/sbin/syslogd /etc/rc.d/syslogd
      POSTGRESQL/usr/local/bin/postgres 不明
    • system logから特定のタグ名「syswatch」の行のみを抽出し最新の5行を表示する。
    • この運用監視ツールはshellスクリプトで記述されており、現在開発中の状態である。 現状の運用監視ツールの出力は以下の通り。
    • Server system status report:    Wed Aug 18 02:54:28 JST 2010
      
       procs      memory      page                   disk   faults      cpu
       r b w     avm    fre   flt  re  pi  po    fr  sr ad0   in   sy   cs us sy id
       0 0 2  653432  83908    41   0   0   0    69   0 980 1148 2581  812  6  8 86
      
      [Network status]
      #Connections: 24
      SMTP    status: OK      connections:       0
      SSH     status: OK      connections:       0
      TOMCAT  status: OK      connections:       0
      
      [Process status]
      #Processes: 126
      SMTP    status: OK
      SSH     status: OK
      TOMCAT  status: OK
      SLOG    status: OK
      
      [Syslog messages]
      ------------------------------------------------
      ------------------------------------------------
      End of report
      
  • この運用監視ツールの使用方法を以下に示す。
    • 状態表示モードで起動する(デフォルト)。現在の状態を表示し終了する。
    • $ sh syswatch.sh
      
    • モニターモードで起動する(要root権限)。 定期間隔で情報取得し、必要に応じてサービス再起動をおこなう。
    • $ su
      # sh syswatch.sh -m
      

Next































[演習] 運用監視ツールの開発(続き)

  • ミッション1
  • 現状ではPOSTGRESQLのサービスポート監視およびプロセス監視が実装されていない。 仕様を満たすようsyswatch.shを修正せよ。

  • ミッション2
  • system log(/var/log/messages)を監視し、タグ名syswatchの行をroot宛にメールしたい。 ログ監視ツールswatchコマンドを利用し、この仕組みを構築せよ。

  • ミッション3
  • このサーバはメンテナンスのためSSHを稼働させているが、 不正アクセス対策のため/var/log/auth.logを監視し、 不正アクセス試行の兆候を検出したら即座にそのIPからの パケットをすべて遮断したい。swatchコマンド、 ホストベースファイアウォール制御ツールipfwコマンドを利用し、 この仕組みを構築せよ。 ipfwの導入方法と特定IPのパケット遮断(および解除)の方法は以下の通り。

    # kldload ipfw
    # ipfw add 32000 allow ip from any to any
    32000 allow ip from any to any
    # ipfw list
    32000 allow ip from any to any
    65535 deny ip from any to any
    
    # ipfw add 30000 deny ip from 202.229.63.242 to any
    30000 deny ip from 202.229.63.242 to any
    # ipfw list
    30000 deny ip from 202.229.63.242 to any
    32000 allow ip from any to any
    65535 deny ip from any to any
    
    # ipfw delete 30000 deny ip from 202.229.63.242 to any
    # ipfw list
    32000 allow ip from any to any
    65535 deny ip from any to any
    

    なお、/var/log/auth.logに以下の文字列が記録されたら不正アクセスと判断する。

    authentication error for root
    
  • ミッション4(おまけ)
  • ミッション3で実装した特定IPのパケット遮断ルールの追加には、 SSH Brute-Force攻撃によるファイアウォールのルールの肥大化の 問題がある。ルール追加から一定時間(今回は1時間)経過後に そのルールを削除し、この問題を回避する機能を追加せよ。

    ヒント1: 時刻を指定したコマンド実行の予約は、at(1)を使う(man at)

    ヒント2: 時間の計算および出力文字列の加工は、date(1)を使う(man date)

  • ミッション5(おまけ)
  • SSH Brute-Force攻撃に対処する方法として、ミッション4で実装したような ログファイルの監視の方法の他に、特定のポートのアクセスパターンを監視する 方法がある。

    knockdは特定ポートのアクセス順序を監視し、該当するアクセスを検知したら 対応したコマンドを実行することができるソフトウェアである。

    http://www.zeroflux.org/projects/knock

    knockdのマニュアルページには以下のLinux用のサンプルが記述されているが、 使い勝手はあまりよくない。「ポート番号22を10秒間に3回連続アクセスがあったら、 そのIPアドレスからのパケットを1時間遮断する」という設定を追加せよ。

      [options]
           logfile = /var/log/knockd.log
    
      [openSSH]
           sequence    = 7000,8000,9000
           seq_timeout = 10
           tcpflags    = syn
           command     = /usr/sbin/iptables -A INPUT -s %IP% --dport 22 -j ACCEPT
    
      [closeSSH]
           sequence    = 9000,8000,7000
           seq_timeout = 10
           tcpflags    = syn
           command     = /usr/sbin/iptables -D INPUT -s %IP% --dport 22 -j ACCEPT
    
    

Next