コンピュータ化システムバリデーションってなんだろう?

ピュータ化システムバリデーションは、製薬業界や医療機器業界で使われる品質保証のことです。

  • 英語 : Computerized System Validation
  • 略称 : CSV

一般工業製品の品質保証となぜ分けているのか?

一般工業製品の場合は「価格」と「品質」が比例します。
安ければある程度の不良は許容されます。

医薬品は、生命にかかわるため不良は許容されないから

医薬品の場合は「価格」にかかわらず「不良」は許容されません。
そのため、世界的にCSVへの取組が求められています。

日本医療機能評価機構のサイトでシステムに関わる医療事故を見ることができます。

日本医療機能評価機構のサイトから「分析テーマ」で「その他」を選ぶと見られます。
www.med-safe.jp

GMP省令が基礎となっています。

ponsuke-tarou.hatenablog.com

GMPの対象のうち製薬や医療に関わるコンピュータ化システムが対象になります。

医療機器に組み込まれるシステムだけではなく、文書を管理するシステムまで
医療に関わる広範囲のシステムが対象になります。

2. 適用の範囲
このガイドラインは、コンピュータ化システムを使用してGQP省令及びGMP省令が適用され る業務を行う製造販売業者等に適用する。
このガイドラインの対象となるコンピュータ化システムの例として、(1)~(7)が考えられる。また、対象外となるコンピュータ化システムは別紙2に記載する。
(1) 医薬品、医薬部外品市場への出荷の可否の決定に係るシステム及び市場への出荷に係る記録を 作成、保存管理するためのシステム
(2) 製造指図書、製造に関する記録等を作成及び保存管理するためのシステム
(3) 製造工程を制御又は管理するためのシステム及びその管理データを保存管理するためのシステム
(4) 原材料及び製品の保管、出納等の生産を管理するシステム
(5) 品質試験に用いる機器を制御又は管理するためのシステム並びに品質試験結果及び管理データを保存管理するためのシステム
(6) 空調、製造用水製造設備など、製品の品質に重大な影響を及ぼす可能性のある製造支援設備・施設を制御又は管理するためのシステム及びその管理データを保存管理するためのシステム
(7) 文書(手順書類、品質標準書、製品標準書等)を作成、承認、保存管理するためのシステム
医薬品・医薬部外品製造販売業者等におけるコンピュータ化システム適正管理ガイドライン

バリデーションとは、製造工程及びその手順を検証して文書化することです。

検証を行い証拠となる文書を作成することにより、継続的に証拠を積み上げ高度な品質を保証していくことをバリデーションといいます。

「バリデーション」とは、製造所の構造設備並びに手順、工程その他の製造管理及び品質管理の方法が期待される結果を与えることを検証し、これを文書とすることをいう。
医薬品及び医薬部外品の製造管理及び品質管理の基準に関する省令

差分の機能仕様書や設計仕様書を作成してはならない。
最新の当該システムの機能がどうなっているかを一瞥して分かるようにしておかなければならないのである。<省略>
計画書、報告書、仕様書等は、最新バージョンのみをバインダーに綴じておかなければならない。
それに対して、テストスクリプトやテストログは全てのバージョンをバインダーに綴じておかなければならない。
なぜならば、最新のテストログのみを綴じておくとすべてのテストが合格しているからである。
規制当局のレビュでは、成功したテストを調査したいのではなく、エラーになったテストを参照し、解決された経緯を調査したいためである。
https://ecompress.co.jp/wp-content/uploads/2018/08/11.png
【ワンポイント】CSVにおける成果物の種類と管理方法 – eCompress

バリデーションの対象となるのは、開発したシステム自体だけではなくそれを使用する業務プロセスも含みます。

コンピュータ化されたシステム(Computerized System)とは、「コンピュータシステム」と「業務プロセス」を統合したものである。
「コンピュータシステム」は、ハードウェアとソフトウェアから構成され「業務プロセス」は、人、標準業務手順書(SOP)と、設備(例えば測定機器、CRF、筆記具など)から構成される。
コンピュータバリデーションとは イーコンプライアンス

https://jpn.nec.com/process/pharma/images/validatin02.jpg
GxP規制対応・CSVコンサルティングサービス: 製薬ソリューション | NEC

目的は、システムが意図したとおりに動作することを保証することです。

「医薬品、医薬部外品、化粧品及び医療機器の品質管理の基準に関する省令」及びGMP省令に基づく業務を行うためのコンピュータ化システムの要件を明確にし、
コンピュータ化システムが意図したとおりに動作することを保証するため、これを開発する際に必要な事項、これを検証するバリデーションに関する事項及び運用管理に関する遵守事項を定め、GQP省令及びGMP省令の適正な実施の確保を図ることを目的とする。

このガイドラインにおいては、コンピュータ化システムの開発から、検証、運用管理及び廃棄までの流れを総合してコンピュータ化システムのライフサイクルという。

f:id:ponsuke_tarou:20190726160605j:plain
コンピュータ化システムのライフサイクルモデル
医薬品・医薬部外品製造販売業者等におけるコンピュータ化システム適正管理ガイドライン

薬や医療機器の品質保証のために、システムの開発から導入および廃棄までを検証・文書化します。

CSVで重要なことは、開発から廃棄までを検証して証拠として文書を残すことです。
それによって薬や医療機器の品質に問題がないことを保証します。

http://www.ymc.co.jp/design/img/chromato/technicalguide/gmp_support/img_0002.png
GMPサポート・メンテナンス|分取LCシステム|株式会社ワイエムシィ

f:id:ponsuke_tarou:20190726221720j:plain
カテゴリ分類表と対応例
医薬品・医薬部外品製造販売業者等におけるコンピュータ化システム適正管理ガイドライン

CSVではドキュメントがたくさん必要となるため、ユーザ企業とシステムを作る企業の間で成果物のイメージに相違がないことを確認することが作業量のズレ防止に大きく繋がります。

サプライヤが、ユーザ企業から CSV 活動のサポート(アウトソーシング)に関する見積依頼を受けた際に困る点を次に例示する。
●漠然とした要求で何をサポートして欲しいのかがよくわからない
●ユーザ企業とサプライヤの役割分担と責任範囲が明確になっていない
CSV に関する規範が明確になっていない
CSV を行うコンピュータ化システムに関する情報が不十分である

(省略)

サプライヤが精度の高い見積を行う上で最低限必要な情報を、次に示す。
●当該コンピュータ化システムがどの規制に準拠すればよいのか
CSV 活動はユーザ企業の規定あるいはサプライヤの方法に任せるのか
●当該コンピュータ化システムの GAMP のカテゴリ分類、システム規模や複雑さ
●成果物(バリデーションドキュメント)
CSV におけるサプライヤの役割

そんなCSVにはガイドラインがあります。

国際的にはGAMPというものがあります。

  • 正式 : Good Automated Manufacturing Practice

ISPE(国際製薬技術協会)が作っていて、欧米ではこのGAMPの考え方が広く使われていて世界標準的なガイドラインです。

https://www.cst.chiyoda.co.jp/images/solution_iyaku_img1.gif
医薬向けソリューション | ITソリューション | CST(千代田システムテクノロジーズ株式会社)

https://www.to-be.co.jp/solution/assets_c/2017/03/CSV01-thumb-530xauto-5281.png
コンピューター化システムバリデーション(CSV)支援サービス|東洋ビジネスエンジニアリング株式会社 B-EN-G

国際的にはPIC/S GMPというのもあります。

PIC/S*1が、欧州のGMPをもとに作ったガイドラインでこの中にコンピュータ化システムについても記載されています。

日本には「医薬品・医薬部外品製造販売業者等におけるコンピュータ化システム適正管理ガイドライン」というものがあります。

ガイドラインなので法的拘束力はありませんが、海外のガイドラインとも整合性があり世界的にも通用するものです。
GAMPとどう違うかはよくわかりません。

このガイドラインは欧米のGAMP5やPIC/S等のCSVガイドラインと整合性があり、コンピュータ化システムの開発から検証、運用、廃棄までのライフサイクルの考え方を採用しています。
CSVとは。コンピュータ化システムバリデーションとは

https://www.gmp-platform.com/files/user/B5-006-01-08_2-500x288.jpg?v=1435036698
厚労省「コンピュータ化システム適正管理ガイドライン」の要点(8) | GMP Platform

ガイドラインがあってもCSVの理解・実施はとても大変です。

理解するのは大変です。
法令がたくさん関わってきます、他業界のシステムを開発をしてきた開発会社にはわかりにくいです。
実施も大変です。
ドキュメントを大量に作らなくてはなりません、実施状況を定期的に確認して記録しなくてはいけません、関わる関連会社に理解してもらうために指導もしなくてはいけません。
なので、CSVの支援サービスを行っている会社もたくさんあります。

www.fujitsu.com
www.to-be.co.jp

製薬や医療業界のシステム開発で使われる工程の略称

各工程の名前や略称は会社やプロジェクトによって異なりますが、CSVを実施している製薬や医療業界ではGAMP4の用語を各工程の略称として使用していることがあります。
最新のGAMP5ではこの略称の一部は記載されなくなったためいつかなくなるかもしれませんが・・・。

日本語の工程名 (GMP4の略称)英語の工程名 ポイント
設計適格性確認 (DQ)Design Qualification テスト工程になって仕様変更が発生しないよう開発ベンダは「作成する要求仕様書」と供給業者から提出される「設計仕様書」が合致しているかどうかを確認し、その記録を残すことが重要
ユーザ要求仕様 (URS)User Required Specification 要求仕様書の作成には関係部門が連携して、必要事項を漏れなくまとめていくことが大切
システム機能仕様 (FS)Functional Specification 作成はサプライヤがしてもそのレビューと承認はユーザ企業(製薬企業、医療機器企業)の責任である
システム設計仕様 (DS)Design Specification -
実装/単体テスト - -
据付時適格性確認(結合テスト) (IQ)Installation Qualification 設計仕様書等に記載された通りに据え付けられ、プログラムがインストールされたことを確認して記録を残す
運転時適格性確認(機能テスト) (OQ)Operational Qualification
性能適格性確認(要件テスト) (PQ)Performance Qualification 承認された条件下で作業を行って動作できることを確認して記録を残す

歴史

*1:Pharmaceutical Inspection Convention and Pharmaceutical Inspection Co-operation Schemeの略。医薬品分野における品質システムの開発・実施・保守を目的とした協力組織で日本も参加している。

*2:アメリカ食品医薬品局

*3:1993-04-01に施行され、2005-03-30に廃止された。廃止の意図は不明らしい。

*4:[読み方]はっしゅつ。起こること。あらわし出すこと。

*5:「コンピュータ使用医薬品等製造所適正管理ガイドライン」を改定したもので2012-04-01に施行された。

SlackにAWSとPythonを使って簡単なアプリを作る記録

このサイトのやり方でアプリを作る

qiita.com

Slackで新規にアプリとボットユーザを作成する

  1. 「Create New App」ボタンから新規アプリを作成する。
  2. サイドメニューの[Bot Users]から新規ボットユーザを作成する。

AWSでLambda関数からCloudWatchにデバッグ用のログを出力するためのIAMロールを追加する

  1. f:id:ponsuke_tarou:20190507135118p:plain
    [IAM]画面を開く。
  2. f:id:ponsuke_tarou:20190507135340p:plain
    サイドメニューの[Role]を選択して[Create role]ボタンを押下する。
  3. f:id:ponsuke_tarou:20190507135531p:plain
    [AWS service]の[Lambda]を選択し、画面下の[Next: Permissions]ボタンを押下する。
  4. f:id:ponsuke_tarou:20190507135836p:plain
    [AWSLambdaBasicExecutionRole]を選択してロールを追加する。
  5. f:id:ponsuke_tarou:20190507140448p:plain
    Roleが追加される。

AWSでSlack Event APIの認証を行うLambda関数を作成する

  1. f:id:ponsuke_tarou:20190507141038p:plain
    コンソールで[Lambda]を選択する。
  2. f:id:ponsuke_tarou:20190507141332p:plain
    [Create a function]ボタンを押下する。
  3. f:id:ponsuke_tarou:20190507141453p:plain
    [Author from scratch]を選択して必要な項目を入力する。
    1. [Runtime]は、「Python 3.6」を選択する。
    2. [Permission]は、[Execution role]で「Use an existing role」を選択して[Existing role]で追加したIAMロールを選択する。
  4. f:id:ponsuke_tarou:20190507143045p:plain
    参考にしているQiitaページに記載されているコードとHandlerを転記して保存する。
    • エンドポイントを認証するためにSlackからリクエストが送られてきた際には、認証をとおすためにchalleng要素をレスポンスする必要がある。そのための処理。

AWSで新規にAPI Gatawayを作成する

Lambda関数を叩くためのエンドポイントとなるAPIを作成する

  1. f:id:ponsuke_tarou:20190507144320p:plain
    コンソールから[API Gateway]を選択する。
  2. f:id:ponsuke_tarou:20190507144525p:plain
    [Get started]ボタンを押下する。
  3. f:id:ponsuke_tarou:20190507144602p:plain
    [OK]ボタンを押下する。
  4. f:id:ponsuke_tarou:20190507145026p:plain
    内容を入力してAPIを作成する。

APIにPOSTメソッドを作成する

  1. f:id:ponsuke_tarou:20190507145810p:plain
    POSTメソッドを追加する。

デプロイしてエンドポイントを作成する

  1. f:id:ponsuke_tarou:20190507150340p:plain
    [Action]セレクトから「Deploy API」を選択してデプロイを行う。
  2. 画面上部にエンドポイントとなるURLが表示されます。

テストする

  1. f:id:ponsuke_tarou:20190508125412p:plain
    [Test]リンクを押下します。
  2. f:id:ponsuke_tarou:20190508125617p:plain
    [Test]ボタンを押下します。
  3. f:id:ponsuke_tarou:20190508125841p:plain
    Lambda関数が呼ばれてログが出力されました。
  4. f:id:ponsuke_tarou:20190508130138p:plain
    CloudWatchにもログが出力されました。

Slackで作成したAPIを設定する

  1. サイドメニューの[Event Subscriptions]を選択する。
  2. [Enable Events]を「On」にする。
  3. [Request URL]にエンドポイントとなるURLを入力する。
  4. [Subscribe to Bot Events]に「message.channels」か「message.groups」を追加する。
  5. [Save Changes]ボタンで保存する。

f:id:ponsuke_tarou:20190507151234p:plain

「message.channels」を設定することでボットユーザが参加しているパブリックチャンネルに投稿されたメッセージを取得できる

api.slack.com

「message.groups」を設定することでボットユーザが参加しているプライベートチャネルに投稿されたメッセージを取得できる

api.slack.com

パブリックチャンネルプライベートチャネルかを見分ける簡単な方法

Slackの画面横に表示されているチャネル名の横にあるマークを見るとわかる。

f:id:ponsuke_tarou:20190508152336p:plain
#マーク
f:id:ponsuke_tarou:20190508152400p:plain
鍵マーク
get.slack.help

ボットユーザをワークスペースに追加する

アプリをインストールする

f:id:ponsuke_tarou:20190507151911p:plain
サイドメニューの[Install App]を選択し[Install App to Workspace]ボタンを押下してインストールする。

チャネルにボットを参加させる

f:id:ponsuke_tarou:20190507152311p:plain
Slackの歯車マークから[Add people to チャネル]からボットを追加する。

メッセージをチャネルに投げるとAWSのCloudwatchのLogに内容が出力される

START RequestId: 24..................... Version: $LATEST
[INFO]	2019-05-08T06:11:48.565Z	24......................
{
    "token": "hogehoge",
    "team_id": "hogehoge",
    "api_app_id": "hogehoge",
    "event": {
        "client_msg_id": "hogehoge",
        "type": "message",
        "text": "chanelとgroupの違いがよくわからない",
        "user": "投稿したユーザID",
        "ts": "1557295907.016900",
        "channel": "チャネルID",
        "event_ts": "1557295907.016900",
        "channel_type": "group"
    },
    "type": "event_callback",
    "event_id": "イベントID",
    "event_time": 1557295907,
    "authed_users": [
        "hogehoge"
    ]
}
ログはLambda関数に書いた「logging.info(json.dumps(slack_event))」で出力される

ボットユーザがメッセージを投稿する機能を作る

AWSにOAuth Tokenを設定する環境変数を設定する

Slack APIの画面でOAuth Tokenを確認する
  1. サイドメニューの[OAuth & Permissions]を選択してOAuth Tokenを確認する。
    • OAuth Tokenは、ワークスペースにアプリをインストールした際に生成されている。
Lambda画面でOAuth Tokenを設定する環境変数を設定する
  1. [Lambda]の画面 > サイドメニューの[Functions] > 作成した関数 で関数の画面を開く。
  2. [Environment variables]にKEY「SLACK_APP_AUTH_TOKEN」「SLACK_BOT_USER_ACCESS_TOKEN」を入力して各OAuth Tokenを設定する。
  3. 画面右上の[Save]ボタンで保存する。

Lambd関数を更新する

  1. [Function code]に参考にしているQiitaページに記載されているコードを転記する。
  2. [Save]ボタンで保存する。
メッセージの投稿には、ボットユーザがメッセージを投稿できるchat.postMessageを使用しています。

api.slack.com

メッセージを投稿して動かしてみる

f:id:ponsuke_tarou:20190508154352g:plain
できあがり

MacのPhpStormでLaravelプロジェクトでPHPUnitをできるようにする記録

  • 環境
    • macOS Mojave バージョン10.14.4
    • Composer version 1.8.0

以前、Laravelのプロジェクトを作ったことがありましたが、今回はPhpStormを使ってやります。

ponsuke-tarou.hatenablog.com

PhpStormをインストールします。

  1. JetBeanのPHPStormのサイトからダウンロードします。
  2. ダウンロードしたPhpStorm-yyyy.x.x.dmgをクリックします。
  3. f:id:ponsuke_tarou:20190424223044p:plain
  4. f:id:ponsuke_tarou:20190424223107p:plain
  5. f:id:ponsuke_tarou:20190424223120p:plain
  6. f:id:ponsuke_tarou:20190424223133p:plain
  7. f:id:ponsuke_tarou:20190424223145p:plain
  8. f:id:ponsuke_tarou:20190424223205p:plain
    好きな色を選びます
  9. f:id:ponsuke_tarou:20190424223227p:plain
  10. f:id:ponsuke_tarou:20190424223239p:plain

新規にComposerプロジェクトを作成します。

# 事前にインストールしてあるComposerの場所を確認
$ which composer
/usr/local/bin/composer
  1. f:id:ponsuke_tarou:20190424223355p:plain
  2. f:id:ponsuke_tarou:20190424230607p:plain
    プロジェクトを作成するディレクトリとComposerの場所とpackageでLaravelを選択して作ります
  3. f:id:ponsuke_tarou:20190424234741p:plain
    プロジェクト作成中です。
  4. f:id:ponsuke_tarou:20190424235113p:plain
    プロジェクトが作成されました。

qiita.com

Composerがインストールされていない場合はPhpStormのサイトを参照して作成します。

以下サイトの[新しいComposerプロジェクトを作成するには] > [2. ダイアログで、プロジェクトのパラメータを指定します。] > [b. Composerコマンドの実行方法を選択します。]を参照
pleiades.io

Command line parameterで指定した「–prefer-dist」はLaravelをZIPでダウンロードするということです。

# こんなコマンドが動きます。
/usr/local/bin/composer create-project laravel/laravel /path/to/project/directory/tryPhp/composer --prefer-dist

kin29.info
getcomposer.org

Laravelのバージョンを確認します。

# ウィンドウの下にある[Terminal]またはMacのターミナルで確認します。
$ php artisan -V
Laravel Framework 5.8.14

LaravelにくっついているサーバでLaravelの初期画面を確認します。

# サーバを起動します
$ php artisan serve
Laravel development server started: <http://127.0.0.1:8000>
# 表示されたURLにブラウザでアクセスします。
[Wed Apr 24 23:58:16 2019] 127.0.0.1:51584 [200]: /favicon.ico

f:id:ponsuke_tarou:20190425000004p:plain
表示されました。

Xdebugをインストールします。

qiita.com

プロジェクトを設定します。

PHP language levelを使っているPHPのバージョンに合わせます。

# [PHP language level]用に使っているPHPのバージョンを確認します
$ php --version
PHP 7.3.1 (cli) (built: Jan 10 2019 13:15:37) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.1, Copyright (c) 1998-2018 Zend Technologies
    with Xdebug v2.7.2, Copyright (c) 2002-2019, by Derick Rethans
    with Zend OPcache v7.3.1, Copyright (c) 1999-2018, by Zend Technologies

# [CLI Interpreter]用に使っているPHPのディレクトリを確認します
$ which php
/usr/local/bin/php
$ ls -la /usr/local/bin/ | grep php
# 省略
lrwxr-xr-x    1 mana  admin       27  1 20 14:09 php -> ../Cellar/php/7.3.1/bin/php
# 省略
  1. [PhpStorm] > [Preferences...] > [Languages & Frameworks] > [PHP]を選択します。
  2. [PHP language level]を使っているPHPのバージョンへ変更します。
  3. [CLI Interpreter]の[...]ボタンでダイアログを開き、使っているPHPの場所を設定します。
    • f:id:ponsuke_tarou:20190507231840p:plain
      XdebugがDebuggerとして設定されます。
PHP language levelが非活性で変更できない場合の対応方法

qiita.com

PHPUnitは、プロジェクトを作ったときに配置されています。

プロジェクトの直下にあるcomposer.jsonを確認するとデフォルトでインストールされています。
venderディレクトリにもphpunitディレクトリが配置されています。

    "require-dev": {
        "beyondcode/laravel-dump-server": "^1.0",
        "filp/whoops": "^2.0",
        "fzaninotto/faker": "^1.4",
        "mockery/mockery": "^1.0",
        "nunomaduro/collision": "^2.0",
        "phpunit/phpunit": "^7.5"
    },
$ ls -l vendor/ | grep phpunit
drwxr-xr-x@  8 mana  staff  256  4 24 23:47 phpunit

f:id:ponsuke_tarou:20190506130945p:plain
venderディレクトリにもphpunitディレクトリが配置されています。

PHPUnitの設定をします。

(Macのターミナルを使う場合)PHPUnitのパスを通します。

# .bash_profileにphpunitのパスを書いて
$ echo 'export PATH="/Path/To/vendor/phpunit/phpunit:$PATH"' >> ~/.bash_profile
# 反映して
$ source ~/.bash_profile
# 確認します。
$ phpunit --version
PHPUnit 7.5.9 by Sebastian Bergmann and contributors.
パスはbin配下ではなくphpunit配下を指定します。

以前PHPStormを使わなかった時は、PHPUnitのPathにbin配下を指定しました。

$ echo 'export PATH="/Path/To/vendor/bin/phpunit:$PATH"' >> ~/.bash_profile

PHPUnitを使えるようにする。 - Qiita

今回はうまくいきませんでした。

$ echo 'export PATH="/Path/To/vendor/bin/phpunit:$PATH"' >> ~/.bash_profile
$ source ~/.bash_profile
$ phpunit --version
-bash: phpunit: command not found

シンボリックリンクが貼ってあるけどだめなのですね。

$ ls -la vendor/bin/
total 32
drwxr-xr-x@  6 mana  staff   192  5  6 14:50 .
drwxr-xr-x@ 47 mana  staff  1504  5  6 14:43 ..
-rwxr-xr-x@  1 mana  staff  6028  2 17 05:54 php-parse
lrwxr-xr-x   1 mana  staff    26  5  6 14:43 phpunit -> ../phpunit/phpunit/phpunit
-rwxr-xr-x@  1 mana  staff  4305 10 14  2018 psysh
lrwxr-xr-x   1 mana  staff    51  5  6 14:43 var-dump-server -> ../symfony/var-dumper/Resources/bin/var-dump-server

composer.jsonにautoloadの定義があることを確認します。

定義がなければ環境に合わせて定義します。

    "autoload": {
        "psr-4": {
            "App\\": "app/"
        },
        "classmap": [
            "database/seeds",
            "database/factories"
        ]
    },
    "autoload-dev": {
        "psr-4": {
            "Tests\\": "tests/"
        }
    },

対応付けのためのクラスマップ生成を行います。

# クラスマップ生成
$ composer dump-autoload
Generating optimized autoload files> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover --ansi
Discovered Package: beyondcode/laravel-dump-server
Discovered Package: fideloper/proxy
Discovered Package: laravel/nexmo-notification-channel
Discovered Package: laravel/slack-notification-channel
Discovered Package: laravel/tinker
Discovered Package: nesbot/carbon
Discovered Package: nunomaduro/collision
Package manifest generated successfully.                                                                                                           Generated optimized autoload files containing 3759 classes

# 確認します
$ cat vendor/composer/autoload_psr4.php
<?php

// autoload_psr4.php @generated by Composer

$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);

return array(
    'phpDocumentor\\Reflection\\' => array($vendorDir . '/phpdocumentor/reflection-common/src', $vendorDir . '/phpdocumentor/reflection-docblock/src', $vendorDir . '/phpdocumentor/type-resolver/src'),
    'Zend\\Diactoros\\' => array($vendorDir . '/zendframework/zend-diactoros/src'),
    'XdgBaseDir\\' => array($vendorDir . '/dnoegel/php-xdg-base-dir/src'),
    'Whoops\\' => array($vendorDir . '/filp/whoops/src/Whoops'),
    'Webmozart\\Assert\\' => array($vendorDir . '/webmozart/assert/src'),
    'TijsVerkoyen\\CssToInlineStyles\\' => array($vendorDir . '/tijsverkoyen/css-to-inline-styles/src'),
    'Tests\\' => array($baseDir . '/tests'),
    'Symfony\\Polyfill\\Php72\\' => array($vendorDir . '/symfony/polyfill-php72'),
    'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'),
    'Symfony\\Polyfill\\Intl\\Idn\\' => array($vendorDir . '/symfony/polyfill-intl-idn'),
    'Symfony\\Polyfill\\Iconv\\' => array($vendorDir . '/symfony/polyfill-iconv'),
    'Symfony\\Polyfill\\Ctype\\' => array($vendorDir . '/symfony/polyfill-ctype'),
    'Symfony\\Contracts\\' => array($vendorDir . '/symfony/contracts'),
    'Symfony\\Component\\VarDumper\\' => array($vendorDir . '/symfony/var-dumper'),
    'Symfony\\Component\\Translation\\' => array($vendorDir . '/symfony/translation'),
    'Symfony\\Component\\Routing\\' => array($vendorDir . '/symfony/routing'),
    'Symfony\\Component\\Process\\' => array($vendorDir . '/symfony/process'),
    'Symfony\\Component\\HttpKernel\\' => array($vendorDir . '/symfony/http-kernel'),
    'Symfony\\Component\\HttpFoundation\\' => array($vendorDir . '/symfony/http-foundation'),
    'Symfony\\Component\\Finder\\' => array($vendorDir . '/symfony/finder'),
    'Symfony\\Component\\EventDispatcher\\' => array($vendorDir . '/symfony/event-dispatcher'),
    'Symfony\\Component\\Debug\\' => array($vendorDir . '/symfony/debug'),
    'Symfony\\Component\\CssSelector\\' => array($vendorDir . '/symfony/css-selector'),
    'Symfony\\Component\\Console\\' => array($vendorDir . '/symfony/console'),
    'Ramsey\\Uuid\\' => array($vendorDir . '/ramsey/uuid/src'),
    'Psy\\' => array($vendorDir . '/psy/psysh/src'),
    'Psr\\SimpleCache\\' => array($vendorDir . '/psr/simple-cache/src'),
    'Psr\\Log\\' => array($vendorDir . '/psr/log/Psr/Log'),
    'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src'),
    'Psr\\Container\\' => array($vendorDir . '/psr/container/src'),
    'PhpParser\\' => array($vendorDir . '/nikic/php-parser/lib/PhpParser'),
    'Opis\\Closure\\' => array($vendorDir . '/opis/closure/src'),
    'NunoMaduro\\Collision\\' => array($vendorDir . '/nunomaduro/collision/src'),
    'Nexmo\\' => array($vendorDir . '/nexmo/client/src'),
    'Monolog\\' => array($vendorDir . '/monolog/monolog/src/Monolog'),
    'League\\Flysystem\\' => array($vendorDir . '/league/flysystem/src'),
    'Lcobucci\\JWT\\' => array($vendorDir . '/lcobucci/jwt/src'),
    'Laravel\\Tinker\\' => array($vendorDir . '/laravel/tinker/src'),
    'JakubOnderka\\PhpConsoleHighlighter\\' => array($vendorDir . '/jakub-onderka/php-console-highlighter/src'),
    'JakubOnderka\\PhpConsoleColor\\' => array($vendorDir . '/jakub-onderka/php-console-color/src'),
    'Illuminate\\Notifications\\' => array($vendorDir . '/laravel/nexmo-notification-channel/src', $vendorDir . '/laravel/slack-notification-channel/src'),
    'Illuminate\\' => array($vendorDir . '/laravel/framework/src/Illuminate'),
    'Http\\Promise\\' => array($vendorDir . '/php-http/promise/src'),
    'Http\\Client\\' => array($vendorDir . '/php-http/httplug/src'),
    'Http\\Adapter\\Guzzle6\\' => array($vendorDir . '/php-http/guzzle6-adapter/src'),
    'GuzzleHttp\\Psr7\\' => array($vendorDir . '/guzzlehttp/psr7/src'),
    'GuzzleHttp\\Promise\\' => array($vendorDir . '/guzzlehttp/promises/src'),
    'GuzzleHttp\\' => array($vendorDir . '/guzzlehttp/guzzle/src'),
    'Fideloper\\Proxy\\' => array($vendorDir . '/fideloper/proxy/src'),
    'Faker\\' => array($vendorDir . '/fzaninotto/faker/src/Faker'),
    'Egulias\\EmailValidator\\' => array($vendorDir . '/egulias/email-validator/EmailValidator'),
    'Dotenv\\' => array($vendorDir . '/vlucas/phpdotenv/src'),
    'Doctrine\\Instantiator\\' => array($vendorDir . '/doctrine/instantiator/src/Doctrine/Instantiator'),
    'Doctrine\\Common\\Inflector\\' => array($vendorDir . '/doctrine/inflector/lib/Doctrine/Common/Inflector'),
    'DeepCopy\\' => array($vendorDir . '/myclabs/deep-copy/src/DeepCopy'),
    'Cron\\' => array($vendorDir . '/dragonmantank/cron-expression/src/Cron'),
    'BeyondCode\\DumpServer\\' => array($vendorDir . '/beyondcode/laravel-dump-server/src'),
    'App\\' => array($baseDir . '/app'),
    '' => array($vendorDir . '/nesbot/carbon/src'),
);

PHPUnitの設定ファイルとなるphpunit.xmlを確認します。

自動でできるなんて素敵ですね。

<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
         backupStaticAttributes="false"
         bootstrap="vendor/autoload.php"
         colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false">
    <testsuites>
        <testsuite name="Unit">
            <directory suffix="Test.php">./tests/Unit</directory>
        </testsuite>

        <testsuite name="Feature">
            <directory suffix="Test.php">./tests/Feature</directory>
        </testsuite>
    </testsuites>
    <filter>
        <whitelist processUncoveredFilesFromWhitelist="true">
            <directory suffix=".php">./app</directory>
        </whitelist>
    </filter>
    <php>
        <env name="APP_ENV" value="testing"/>
        <env name="BCRYPT_ROUNDS" value="4"/>
        <env name="CACHE_DRIVER" value="array"/>
        <env name="MAIL_DRIVER" value="array"/>
        <env name="QUEUE_CONNECTION" value="sync"/>
        <env name="SESSION_DRIVER" value="array"/>
    </php>
</phpunit>

PhpStormにPHPUnitを設定します。

  1. [PhpStorm] > [Preferences...] > [Languages & Frameworks] > [PHP] > [Test Frameworks]を選択します。
  2. リストに「Local」がない場合は[+]ボタンで追加します。
  3. [PHPUnit library]で「Use Composer autoloder」を選択してvenderディレクトリ配下のautoloder.phpへのパスを設定します。
  4. [Test Runner]で[Default configuration file:]にチェックを入れてphpunit.xmlへのパスを設定します。

テストコードを作る

以前作ったファイルを流用します。なのでLaravelのディレクトリ構成とかからとっても外れています。
qiita.com

テスト対象ソースのエディタ上からテストクラスを生成します。

  1. f:id:ponsuke_tarou:20190506154955p:plain
    テスト対象ソース上でコンテキストメニュー > [Go To] > [Test]を選択します。
  2. f:id:ponsuke_tarou:20190506155122p:plain
    [Create New Test...]を選択します。既にテストペアが存在する場合はそのテストソースも表示されます。
  3. f:id:ponsuke_tarou:20190506155343p:plain
    テスト対象のメソッドを[Geneate test method for:]から選択して[OK]ボタンを押下します。
  4. f:id:ponsuke_tarou:20190506155514p:plain
    テストクラスが生成されました。

継承しているクラスをPHPUnit\Framework\TestCaseへ変更します。

自動生成時はHPUnit_Framework_TestCaseとなっていますがエラーとなるため変更します。
tomomik.hatenablog.com

Macのデフォルトではバックスラッシュが円マークになる事があるので以下のサイトを見てバックスラッシュで記載します。
Macにおけるバックスラッシュ(\)の入力方法 - Qiita

<?php

namespace App;

use PHPUnit\Framework\TestCase;

class controlStdClassArrayTest extends TestCase
{
// 省略

自動生成されたメソッドへテストコードを記載して保存します。

<?php

namespace App;

use PHPUnit\Framework\TestCase;

class controlStdClassArrayTest extends TestCase
{

    public function testCreateStdClassArrayNew()
    {
        $target = new controlStdClassArray();
        $stdList = $target->createStdClassArrayNew();

        foreach ($stdList as $std) {
            $this->assertInstanceOf(\stdClass::class, $std);
        }
    }
// 省略

作ったテストコード用に設定を追加します。

  1. f:id:ponsuke_tarou:20190507233810p:plain
    上部にある[Add Configurations...]を押下します。
  2. f:id:ponsuke_tarou:20190507234037p:plain
    [+]ボタンで表示されるテンプレートから[PHPUnit]を選択します。
  3. f:id:ponsuke_tarou:20190507235136p:plain
    各項目を入力して設定を追加します。

PHPUnitでテストコードを実行します。

f:id:ponsuke_tarou:20190507235717p:plain
[▶]ボタンで実行できます。

デバックしてブレークポイントで止めることもできます。

f:id:ponsuke_tarou:20190508000342p:plain
受話器マークをクリック後に虫ボタンでデバック実行してブレークポイントで止めることができます。

はじめてAWSのEC2でUbuntuを作ってSSHとリモートデスクトップで接続した時の記録

ドキュメントどおりにやっていれば超簡単にできます。
が、無駄につまずくので記録します。

AWSのアカウントを作成します。

aws.amazon.com

住所は英語で入力します。

www.scriptlife.jp

EC2インスタンスを作成してSSH接続します。

EC2インスタンスを作成します。

参考 : 仮想マシンの起動

  1. AWSマネジメントコンソールの[EC2]からEC2 コンソールを表示します。
  2. [インスタンス]でインスタンスの一覧を表示します。
  3. [インスタンスの作成]ボタンで作成画面を表示します。
  4. [次のステップ〜]ボタンで進めながら内容を入力していきます。以下以外は規定値のままとしました。
    • 1. AMI の選択
      • Amazon マシンイメージ (AMI) : Ubuntu Server 18.04 LTS (HVM), SSD Volume Type - ami-0fc20dd1da406780b (64 ビット x86)
    • 2. インスタンスタイプの選択
      • インスタンスタイプ : 汎用t2.micro >> 後で「t2.medium」に変更しました。
    • 3. インスタンスの設定
      • 終了保護の有効化 : ON
    • 5. タグの追加
      • [キー]=「Name」、[値] = 「Ubuntu18.04」
      • [インスタンス / ボリューム] = チェックON(作ったインスタンスが後でなんだかわかるように名前を設定しました)
    • 6. セキュリティグループの設定
      • セキュリティグループの割り当て : 新しいセキュリティグループを作成する
      • タイプ : SSH
      • プロトコル : TCP
      • ポート範囲 : 22
      • ソース : 自分のパブリックIPアドレス(xxx.xxx.xxx.xxx/32)
  5. [確認と作成]ボタンで確認画面を表示して内容を確認します。
  6. [起動]ボタンで鍵の作成について選択して[インスタンスの作成]ボタンでインスタンスを作成します。
    • 作成にはちょっと時間がかかります。

f:id:ponsuke_tarou:20200225201334p:plain

SSH接続します。

  • 環境
    • 接続元 : macOS Catalina バージョン10.15.3
    • ssh : OpenSSH_7.9p1, LibreSSL 2.7.3
  1. インスタンス作成時に取得した鍵の権限を設定します。
  2. インスタンスの一覧から作成したインスタンスを選択して詳細画面を表示し、インスタンスIPv4パブリックIPを確認します。
  3. MacのターミナルなどでSSH接続します。
# ssh接続する方法 : ssh -i {作成した秘密鍵のファイルパス} {ユーザ名:AMIの種類で変わる}@{インスタンスのIPv4パブリックIP}
$ ssh -i .ssh/key.pem ubuntu@{インスタンスのIPv4パブリックIP}
The authenticity of host '{インスタンスのIPv4パブリックIP} ({インスタンスのIPv4パブリックIP})' can't be established.
ECDSA key fingerprint is SHA256:Zxxx
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '{インスタンスのIPv4パブリックIP}' (ECDSA) to the list of known hosts.
Welcome to Ubuntu 18.04.3 LTS (GNU/Linux 4.15.0-1057-aws x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Tue Feb 25 11:15:51 UTC 2020

  System load:  0.0               Processes:           87
  Usage of /:   13.6% of 7.69GB   Users logged in:     0
  Memory usage: 14%               IP address for eth0: 172.31.17.109
  Swap usage:   0%

0 packages can be updated.
0 updates are security updates.



The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

ubuntu@ip-1xx-xx-xx-1xx:~$ 
aptコマンドでmysqlコマンドをインストールしてみました。

ponsuke-tarou.hatenablog.com

作ったUbuntu Serverにリモートデスクトップ接続できるようにします。

Ubuntu Server側を設定します。

aptの更新とユーザー作成をします。
# 1. SSHでログインします。
# 2. aptのリポジトリ一覧を更新します(-y : 問い合わせがあった場合はすべて「y」と答える)
$ sudo apt update -y
Hit:1 http://us-east-2.ec2.archive.ubuntu.com/ubuntu bionic InRelease
Hit:2 http://us-east-2.ec2.archive.ubuntu.com/ubuntu bionic-updates InRelease
Hit:3 http://us-east-2.ec2.archive.ubuntu.com/ubuntu bionic-backports InRelease
Get:4 http://security.ubuntu.com/ubuntu bionic-security InRelease [88.7 kB]     
#...省略... 
32 packages can be upgraded. Run 'apt list --upgradable' to see them.

# 3. インストール済みのパッケージを更新します。
$ sudo apt upgrade -y
Reading package lists... Done
Building dependency tree       
#...省略... 
Processing triggers for initramfs-tools (0.130ubuntu3.9) ...
update-initramfs: Generating /boot/initrd.img-4.15.0-1060-aws

# 4. リモートデスクトップ用にユーザーを作成します。
$ sudo adduser ponsuke
Adding user `ponsuke' ...
Adding new group `ponsuke' (1001) ...
Adding new user `ponsuke' (1001) with group `ponsuke' ...
Creating home directory `/home/ponsuke' ...
Copying files from `/etc/skel' ...
Enter new UNIX password: 
Retype new UNIX password: 
passwd: password updated successfully
Changing the user information for ponsuke
Enter the new value, or press ENTER for the default
	Full Name []: 
	Room Number []: 
	Work Phone []: 
	Home Phone []: 
	Other []: 
Is the information correct? [Y/n] y

# 5. 作ったユーザーをsudoグループに参加させます。
$ sudo gpasswd -a ponsuke sudo
Adding user ponsuke to group sudo
デスクトップ環境をインストールします。
# 1. パッケージを検索します。
$ apt search ubuntu-desktop
Sorting... Done
Full Text Search... Done
edubuntu-desktop/bionic 15.12.9 amd64
  educational desktop for Ubuntu

kubuntu-desktop/bionic 1.370 amd64
  Kubuntu Plasma Desktop/Netbook system

lubuntu-desktop/bionic-updates 0.94.1 amd64
  Lubuntu Desktop environment

qtubuntu-desktop/bionic 0.64+17.10.20170707-0ubuntu7 amd64
  Qt plugins for Mir support on Ubuntu (desktop)

ubuntu-desktop/bionic-updates 1.417.4 amd64
  The Ubuntu desktop system

xubuntu-desktop/bionic 2.225 amd64
  Xubuntu desktop system

# 2. ubuntu-desktopをインストールします。
$ sudo apt -y install ubuntu-desktop
Reading package lists... Done
Building dependency tree     
#...省略... 
Processing triggers for systemd (237-3ubuntu10.39) ...
Processing triggers for ureadahead (0.100.0-21) ...
xrdpをインストールします。

xrdp とは
xrdp はオープンソースで開発されている Remote Desktop Protocol のサーバソフトウェアです。
フロントページ - 日本 xrdp ユーザ会

# 1. パッケージを検索します。
$ apt search xrdp
Sorting... Done
Full Text Search... Done
xorgxrdp/bionic 0.9.5-2 amd64
  Remote Desktop Protocol (RDP) modules for X.org

xorgxrdp-hwe-18.04/bionic-updates 0.9.5-2~18.04.1 amd64
  Remote Desktop Protocol (RDP) modules for X.org

xrdp/bionic 0.9.5-2 amd64
  Remote Desktop Protocol (RDP) server

xrdp-pulseaudio-installer/bionic 0.9.5-2 amd64
  Remote Desktop Protocol (RDP) server - PulseAudio module installer

# 2. xrdpをインストールします。
$ sudo apt install -y xrdp
Reading package lists... Done
Building dependency tree       
#...省略... 
Processing triggers for man-db (2.8.3-2ubuntu0.1) ...
Processing triggers for ureadahead (0.100.0-21) ...

# 3. バージョンを確認します。
$ xrdp -v

xrdp: A Remote Desktop Protocol server.
Copyright (C) Jay Sorg 2004-2014
See http://www.xrdp.org for more information.
Version 0.9.5

# 4. new_cursorsを無効化します。
$ ls -la /etc/xrdp/ | grep xrdp
-rw-------   1 xrdp root  2939 Mar  4 11:41 rsakeys.ini
-rw-r--r--   1 root root  4916 Feb 16  2018 xrdp.ini
-rw-r--r--   1 root root  3361 Feb 16  2018 xrdp_keyboard.ini

$ sudo sed -e 's/^new_cursors=true/new_cursors=false/g' -i /etc/xrdp/xrdp.ini

# 5. xrdpサービスを再起動します。
$ sudo systemctl restart xrdp

# 6. xrdpサービスを有効化します。
$ sudo systemctl enable xrdp.service
Synchronizing state of xrdp.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable xrdp

$ sudo systemctl enable xrdp-sesman.service

$ systemctl list-unit-files -t service | grep xrdp
xrdp-sesman.service                            enabled  
xrdp.service                                   enabled 

# 7. 作成したユーザーに切り替えます。
$ su ponsuke
Password: 
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

$ cd ~
$ pwd
/home/ponsuke

# 8. 環境変数を設定します。
$ DESKTOP=/usr/share/ubuntu:/usr/local/share:/usr/share:/var/lib/snapd/desktop

# 9. .xsessionファイルを作成します。
$ cat <<EOF > ~/.xsessionrc
> export GNOME_SHELL_SESSION_MODE=ubuntu
> export XDG_CURRENT_DESKTOP=ubuntu:GNOME
> export XDG_DATA_DIRS=${DESKTOP}
> export XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/etc/xdg
> EOF
Authentication Requiredダイアログを回避できるようにします。

Polkit(旧名PolicyKit)とは、Unixオペレーティングシステムで、システム全体の権限を制御するためのアプリケーション開発ツールキットである。このライブラリによって、特権を持たないプロセスが、特権を持つプロセスと通信することができるようになる。
Polkit - Wikipedia

# 1. 設定します。
$ cat <<EOF | sudo tee /etc/polkit-1/localauthority/50-local.d/xrdp-color-manager.pkla
> [Netowrkmanager]
> Identity=unix-user:*
> Action=org.freedesktop.color-manager.create-device
> ResultAny=no
> ResultInactive=no
> ResultActive=yes
> EOF
[sudo] password for ponsuke: 
[Netowrkmanager]
Identity=unix-user:*
Action=org.freedesktop.color-manager.create-device
ResultAny=no
ResultInactive=no
ResultActive=yes

# 2. サービスを再起動します。
$ sudo systemctl restart polkit

セキュリティグループに設定を追加します。

  1. AWSマネジメントコンソールの[EC2]からEC2 コンソールを表示します。
  2. [インスタンス]でインスタンスの一覧を表示します。
  3. インスタンスの一覧から作成したインスタンスを選択して詳細画面を表示し、セキュリティグループ名のリンクでセキュリティグループの画面表示します。
  4. [インバウンド]タブの[編集]ボタンでダイアログを表示します。
  5. [ルールの追加]ボタンで行を追加して以下を設定します。
    • タイプ : RDP
    • ルール : TCP
    • ポート : 3389
    • ソース : 自分のパブリックIPアドレス(xxx.xxx.xxx.xxx/32)
  6. [保存]ボタンで保存してダイアログを閉じます。

Mac側を設定します。

リモートデスクトップアプリをインストールします。
  1. Apple StoreからMicrosoft Remote Desktop 10をインストールします。
Ubuntuリモートデスクトップ接続します。
  1. Microsoft Remote Desktop 10を起動して[Add PC]ボタンで設定画面を開きます。
  2. インスタンスIPv4パブリックIP」と「Ubuntuで作成したユーザー」を設定して[Add]ボタンで設定を追加します。
  3. 追加された設定をダブルクリックします。
  4. 初めての場合はダイアログが表示されるので[Connect]ボタンで進めます。
    • f:id:ponsuke_tarou:20200304223132p:plain
  5. Ubuntuに接続できました。

f:id:ponsuke_tarou:20200304223310p:plain

失敗したこと

Amazon Machine Image (AMI) で何を選択したかによってSSH接続する時のユーザ名が異なります。

ドキュメントの例では、

ですが初めて作ったインスタンスでは

でした。
これに気がつくのにかなり時間がかかりました。
xn--o9j8h1c9hb5756dt0ua226amc1a.com

インスタンスタイプが「t2.micro」では小さすぎた。

インスタンスタイプを「t2.micro」で作成しました。
SSH接続して作業するには問題なかったのですが、
デスクトップ環境をインストールしてリモートデスクトップ接続したところ
画面は表示されるものの全然動かない!
なので「t2.medium」に変更しました。
無料枠から外れてしまうのですが動かないよりはいいかと・・・。

f:id:ponsuke_tarou:20190501212514j:plain
乙女の滝

サイドチャネル攻撃とテンペスト攻撃の違い

前回の勉強内容

ponsuke-tarou.hatenablog.com

勉強のきっかけになった問題

テンペスト攻撃を説明したものはどれか。

  1. 故意に暗号化演算を誤動作させて正しい処理結果との差異を解析する。
  2. 処理時間の差異を計測して解析する。
  3. 処理中に機器から放射される電磁波を観測して解析する。
  4. チップ内の信号線などに探針を直接当て,処理中のデータを観測して解析する。

平成30年春期問13 テンペスト攻撃を説明したもの|情報処理安全確保支援士.com

サイドチャネル攻撃とテンペスト攻撃は、暗号装置を解析し暗号を盗む方法に使用されます。

サイドチャネル攻撃は、動いている装置から出る電流や電磁波・振動を計測して暗号解析の手がかりを得る攻撃です。

  • 英語 : Side Channel Attack
  • 外部と隔離された機器でも攻撃される可能性があります。

https://www.keirex.com/img/CypherAttack_j.jpg
ケイレックス・テクノロジー >> システムソリューション技術 >> 暗号セキュリティーの脅威と対策

https://www.togawa.cs.waseda.ac.jp/img/research/secu-sidechannel-attack.png
研究紹介 | 早稲田大学 戸川研究室

http://www.ec.okayama-u.ac.jp/~sws/nogami/Works/pic5.png
SCOPE:IoT時代における機器認証を安全に実現するセキュリティ計算チップの開発

テンペスト攻撃は、サイドチャネル攻撃の種類の1つです。

テンペスト攻撃は、機器やその周辺機器から出力される微弱な電磁波を計測して元情報を復元しようとします。

ディスプレイから発生される電磁波の放射レベルは強く、復号も容易になっています。
https://cybersecurity-jp.com/wp000/wp-content/uploads/2018/10/img_27685_1.png
テンペスト技術とは?遠隔で不正に情報を傍受する技術への対策について

漏洩電磁波から画面表示を“再現”したパソコン・モニター
https://tech.nikkeibp.co.jp/it/free/ITPro/NEWS/20041124/153009/1.jpg
「10万円の受信機でパソコンからの漏洩電磁波を“盗聴”できる」――ISTがデモ | 日経 xTECH(クロステック)

サイドチャネル攻撃には、他にも種類があります。

http://tooljp.com/windows/chigai/img/sidechannel-attack-valiation.png
サイドチャネル攻撃とテンペスト攻撃の違い

https://www.uec.ac.jp/research/information/column/22/images/pct_03.jpg
ユニーク&エキサイティング研究探訪 No.22│電気通信大学

電力解析攻撃は、機器の電力を計測します。

  • 英語 : Simple Powering Analysis
  • 別名 : SPA

https://www.netagent.co.jp/study/blog/img/20170914/20170914_overview.png
RHme3 WriteUp 第2問 - セキュリティごった煮ブログ|ネットエージェント

故障利用攻撃は、故意に暗号化演算を誤動作させて正しい処理結果との差異を解析します。

  • 別名 : フォールト解析攻撃

https://image.itmedia.co.jp/enterprise/articles/0806/05/fta.jpg
確率論を究める――交通事故とシステムダウンの関係 (2/3) - ITmedia エンタープライズ

タイミング攻撃は、処理時間の差異を計測して解析します。

タイミング攻撃では、攻撃対象の処理の実装を分析して応答時間が変化する要因を見つけることで、入力とその応答時間から隠されたデータ(パスワードなど)の特定を試みます。
https://corgi-lab.com/blog/wp-content/uploads/2018/01/time-attack_result.png
corgi-lab.com

プローブ解析は、チップ内の信号線などに探針を直接当て,処理中のデータを観測する破壊型解析です。

  • 別名 : プロ―ビング

他にもCache攻撃、スキャンベース攻撃等色々あります。

次回の勉強内容

ponsuke-tarou.hatenablog.com

2進数の問題を見ると頭が混乱します。

前回の勉強内容

ponsuke-tarou.hatenablog.com

2進数の表現の問題

aを正の整数とし,b=aの2乗 とする。aを2進数で表現するとnビットであるとき,bを2進数で表現すると高々何ビットになるか。

  1. n+1
  2. 2n
  3. nの2乗
  4. 2のn乗

平成25年春期問1 2進数の表現|応用情報技術者試験.com

f:id:ponsuke_tarou:20190416193255p:plain
あの日の思い出

「高々」とは、「最大」のことです。

  • 読み方 : たかだか
  • bを2進数で表現すると高々何ビット = bを2進数で表現すると最大何ビット

数学において、高々(たかだか)という表現は、英語の at most に対応した厳密な意味を持つ用語である。
「xは高々2である」という表現は「xは多くとも2である」事、すなわち「x≦2」を意味する。
高々 (数学) - Wikipedia

超地道な解き方:「aを2進数で表現するとnビット」のnに値を入れて考えてみる。

  • aが2bitだと、bの最大は1001で4bitになる
    1. aの最大 = (2進数)11 = (10進数)2 + 1 = (10進数)3
    2. bの最大 = aの2乗 = (10進数)9 = (10進数)8 + 0 + 0 + 1 = (2進数)1001 = 4bit
  • aが3bitだと、bの最大は110001で6bitになる
    1. aの最大 = (2進数)111 = (10進数)4 + 2 + 1 = (10進数)7
    2. bの最大 = aの2乗 = (10進数)49 = (10進数)32 + 16 + 0 + 0 + 0 + 1 = (2進数)110001 = 6bit
  • aが4bitだと、bの最大は11100001で8bitになる
    1. aの最大 = (2進数)1111 = (10進数)8 + 4 + 2 + 1 = (10進数)15
    2. bの最大 = aの2乗 = (10進数)225 = (10進数)128 + 64 + 32 + 0 + 0 + 0 + 0 + 1 = (2進数)11100001 = 8bit
  • aが5bitだと、bの最大は1111000001で10bitになる
    1. aの最大 = (2進数)11111 = (10進数)16 + 8 + 4 + 2 + 1 = (10進数)31
    2. bの最大 = aの2乗 = (10進数)961 = (10進数)512 + 256 + 128 + 64 + 0 + 0 + 0 + 0 + 0 + 1 = (2進数)1111000001 = 10bit
なんかaを1bit増やすとbのbitが2bit(真ん中の10分)増える・・・だから「2n」ですね。

Webツールを使ってちょっと大きめの値で確認してみる

サイトで紹介されている解き方

nけたの正の整数aと、mけたの正の整数bを乗算(a×b)したときのけた数はそれぞれの数字のけた数の和(n+m)を超えることはありません。
この性質は10進数に限ったことではなく、2進数、16進数などでも同じです。また、2進数では必ずけた数の和になります。
問題では2進数nビット(けた)の正の整数aを二乗したときのけた数ですから、
 (n+n)=2n
平成25年 春期 応用情報技術者 午前 問1

 2進数でnビットの最大値は、1111...112ですね(1がn個)。
 これを式変形します。
  1111...112(※1がn個) = 1000...002(※(n+1)桁。1の後ろに0がn個) - 12
 これを、10進数に直すと、
  2n - 1
 となります。
 ※注:簡単に導出しているように見えますが、実際には簡単な例(n=2のときとか)で確認しています。

 そうしたら、2乗しましょう。
  (2n - 1)2
    = 22n - 2 * 2n + 1

 これを2進数に直すと、
    = 1000...0002(※(2n+1)桁。1の後ろに0が2n個)
     - 100..002(※(n+1)桁。1の後ろに0がn個)
     + 12
となります。
計算後は、(2n+1)桁よりも小さな値になりますから、2n桁になります。
応用情報H25春 問1の解説 - だるまのエクセルVBA

ビット演算の応用問題

0以上255以下の整数nに対して、https://www.ap-siken.com/kakomon/22_haru/img/01.gifと定義する。next(n)と恒等的に等しい式はどれか。ここで,x AND y 及び x OR y は,それぞれxとyを2進数表現にして,けたごとの論理積及び論理和をとったものとする。

  1. (n+1) AND 255
  2. (n+1) AND 256
  3. (n+1) OR 255
  4. (n+1) OR 256

平成22年春期問1 ビット演算の応用|応用情報技術者試験.com

「恒等的に等しい」とは「どのような場合でも等しい」ということらしい

detail.chiebukuro.yahoo.co.jp
oshiete.goo.ne.jp

超地道な解き方:2進数にして論理演算してみます。

  1. nの最大値である255は2進数で書くと1111111となり、nは7bitで書ける範囲ということになります。
  2. n < 255の場合は、next(n) = n + 1 になります。
  3. n = 255の場合は、next(255) = 0になります。
  4. 以下表のようになる論理演算を選ぶわけです。
(10進数)n (10進数)next(n) (2進数)n (2進数)next(n)
255 0 1111111 0000000
254 255 1111110 1111111
2 3 0000010 0000011
1 2 0000001 0000010
0 1 0000000 0000001
  1. 回答群から推理して (n + 1) と (255 か 256) の組み合わせの論理演算になるはずです。
  2. 論理演算下後に (n + 1) になるはずです。
  3. nを7として8bitの2進数表記(256を表すため)で試してみます。

(n+1) AND 255

10進数 2進数
n+1=8 0000100
255 011111111
AND 0000100

(n+1) AND 256

10進数 2進数
n+1=8 0000100
256 10000000
AND 0000000

(n+1) OR 255

10進数 2進数
n+1=8 0000100
255 011111111
OR 011111111

(n+1) OR 256

10進数 2進数
n+1=8 0000100
256 10000000
OR 1000100
  • 答えは「 ( n + 1) AND 255 」です。

サイトで紹介されている解き方

定義式をみると、0なら1、1なら2と1ずつ足していって255だったら0にもどるという。いわゆる256進カウンタであることがわかります。これを2進数で考えます。255とは11111111です。ここで1を加えると0になるので100000000が0になる処理を考えると選択肢アが正解だとわかります。
平成18年度春期・ソフ開過去問・解説

ア 『(n +1)AND 255』は、255を2進数で表すと“1111 1111”なので、n =0のとき、next(n )=1になり、n =255のとき、next(n )=0になり、定義と一致する。
イ 『(n +1)AND 256』は、256を2進数で表すと“1 0000 0000”なので、n =0のとき、next(n )=0になり、定義と一致しない。
ウ 『(n +1)OR 255』は、255を2進数で表すと“1111 1111”なので、n =0のとき、next(n )=255になり、定義と一致しない。
エ 『(n +1)OR 256』は、256を2進数で表すと“1 0000 0000”なので、n =0のとき、next(n )=257になり、定義と一致しない。
平成18年 春期 ソフトウェア開発技術者 午前 問3

n が 255 の場合・・・

255+1=256

256と255は2進で
0001 0000 0000
0000 1111 1111

これらの AND は
0000 0000 0000
で、ゼロになります。

255未満で、例えば n が 254 については・・・

254+1=255

255と255は2進で
0000 1111 1111
0000 1111 1111

これらの AND は
0000 1111 1111
で、255 。n+1 になりました。
恒等式 - 合格☆情報処理技術者試験

f:id:ponsuke_tarou:20190417000727j:plain
思い出の一枚

次回の勉強内容

勉強中・・・

OP25BをしているプロバイダにはサブミッションポートかSMTPSかSTARTTLSを使おう

前回の勉強内容

ponsuke-tarou.hatenablog.com

メールを送信する時にSMPTというプロトコルを使います。

SMTPとは、電子メールを伝送するための通信手順の一つです。
残念ながら、セキュリティにはいろいろ問題がありました。
そのために「POP before SMTP」「SMTP-AUTH」「OP25B」などの対策が行われています。

POP before SMTPSMTP-AUTHは、ユーザー認証をしてからメールを送信する仕組みです。

ponsuke-tarou.hatenablog.com

OP25Bは、ネットワーク内から外部のコンピュータのTCPポート25番への通信を禁止します。

ponsuke-tarou.hatenablog.com

外部からメールを送信する場合にOP25BをしているプロバイダではTCPポート25番が使えません。
f:id:ponsuke_tarou:20190411232733p:plain

サブミッションポートは、メール送信専用に利用するTCPポート587番のことです。

OP25Bを実施しているプロバイダの場合はTCP25番ポートを通してのメール送信が出来なくなるけれど、このサブミッションポートを利用することで送信が可能となります。
サブミッションポートは、SMTP認証(SMTP-AUTH)と合わせて利用します。

TCPのサブミッションポート(ポート番号587)の説明として,適切なものはどれか。

  1. FTPサービスで,制御用コネクションのポート番号21とは別にデータ転送用に使用する。
  2. Webアプリケーションで,ポート80番のHTTP要求とは別に,サブミットボタンをクリックした際の入力フォームのデータ送信に使用する。
  3. コマンド操作の遠隔ログインで,通信内容を暗号化するためにTELNETのポート番号23の代わりに使用する。
  4. 電子メールサービスで,迷惑メール対策としてSMTPのポート番号25の代わりに使用する。

平成25年秋期問20 TCPのサブミッションポートの説明|情報処理安全確保支援士.com

https://www.ii-okinawa.ad.jp/support/mail/images/illust01.jpg
サブミッションポート(587番ポート)|ii-okinawa.ad.jp

https://ascii.jp/img/2009/08/04/851287/l/c7bbfa60ae6ddb31.jpg
ASCII.jp:メールシステムの脆弱性とその回避策 (4/4)|電子メールの秘密

SMTPSでは、TCPポート465番を使います。

SMTPSは、伝送路を暗号化するSSL/TLSSMTPに組み合わせたプロトコルです。

通常のSMTPとは異なる専用のポート番号(465番)を用いて最初からSSL/TLSにより通信を開始する方式。
トランスポート層において、データ完全性、機密性と通信相手を認証する機能を提供する。
アプリケーション層でクライアントとサーバは通常のSMTPを利用するが、コネクション自体はSSLもしくはTLSによって保護される。この動作はコネクションの確立時に行われる。クライアントやサーバがコネクションを確立する際、SSLTLSを利用するかどうかは分からないため、SMTPSのためのポート番号を割り当てることが一般的である。
SMTPS - Wikipedia

https://image.itmedia.co.jp/ait/articles/0801/18/wi-mailovssl01.gif
メールの送受信を暗号化するPOP3s/IMAP4s/SMTPs(over SSL)とは:Tech TIPS - @IT

https://image.itmedia.co.jp/ait/articles/0602/02/r13secripro4_02.gif
認証できないsmtpでメールを安全に送るには:セキュリティプロトコルマスター(4)(3/3 ページ) - @IT

STARTTLSは、専用のTCPポートを用意する必要がありません。

STARTTLSは、送信側と受信側のサーバ療法がSSL/TLSに対応していると通信を暗号化する仕組みです。
専用の決まったTCPポートを用意する必要がないので25番でも465番でも587番でも何番でも使えます。
なぜなら、いつもSSL/TLSに対応しているか確認してから通信するのでポート番号を決めてなくてOKなのです。

  • 通信の流れ
    1. 通常のSMTPで通信を開始(セッション開始時は平文で始まる)
    2. 「STARTTLS」コマンドで双方がSSL/TLSに対応しているか確認(暗号化のためのネゴシエーションを行う)
    3. 対応していればSSL/TLSで再接続する

f:id:ponsuke_tarou:20190415230552j:plain
思い出の一枚

次回の勉強内容

ponsuke-tarou.hatenablog.com

いろんな攻撃手法を薄く広く知る

前回の勉強内容

ponsuke-tarou.hatenablog.com

今回の勉強内容 : いろんな攻撃手法を薄く広く知る

勉強のきっかけになった問題

データの破壊,改ざんなどの不正な機能をプログラムの一部に組み込んだものを送ってインストールさせ,実行させるものはどれか。

  1. DoS攻撃
  2. 辞書攻撃
  3. トロイの木馬 << 正解
  4. バッファオーバフロー攻撃

平成20年秋期問64 トロイの木馬|基本情報技術者試験.com

Dos攻撃DDos攻撃は、サーバやサイトに大きな負荷をかけてダウンさせるサイバー攻撃です。

ponsuke-tarou.hatenablog.com

バッファオーバフロー攻撃は、メモリ領域のバッファを超えて他のメモリを上書きします。

https://cybersecurity-jp.com/wp000/wp-content/uploads/2018/03/img_18488-01.png
バッファオーバーフローとは?攻撃・対策方法とDoS攻撃との違いを解説

DOS攻撃とバッファオーバフロー攻撃は似ているけれど違うものです。
攻撃 やり方
DOS攻撃 大量にデータを送りつけてサーバをダウンさせる
バッファオーバフロー攻撃 バッファを溢れさせて、他のメモリに書き込むところに不正プログラムを仕込んで攻撃する

ブルートフォース攻撃は、ありとあらゆる文字列の組み合わせを片っ端から試してパスワードや鍵を見つける攻撃です。

ponsuke-tarou.hatenablog.com

辞書攻撃は、パスワードによく使われる文字を片っ端から入力して不正ログインを試みます。

もちろん手動では腱鞘炎になるのでツールを使ってガッツリ攻撃してきます。
ブルートフォース攻撃より「パスワードによく使われる文字」に絞るので効率は良いです。

https://iwiz-blog-cms.c.yimg.jp/c/blog-cms/about/blog/images/inline/dictionary.jpg
「スマホを落としただけなのに」スマホのセキュリティ対策 - Yahoo! JAPANコーポレートブログ

https://tech.nikkeibp.co.jp/it/article/COLUMN/20071126/287915/09_02.jpg
第17回 失敗しないパスワード管理(前編) | 日経 xTECH(クロステック)

https://store.boxil.jp/corp_media/images/corporation_cms_media_image/5470/244/large_e2a59e01-ea34-4c73-b7c9-e015433e31a8.jpg
https://boxil.jp/corp/samuraiz/mag/a81/

トロイの木馬とは、便利なソフトウェアに見せかけてユーザに被害を与える不正なプログラムです。

  • 英語 : Trojan Horse

便利なツールいろいろあるなぁ・・・って、よく確認しないと「トロイの木馬」に引っかかるです!

有用なソフトウェアに見せかけて配布された後,システムの破壊や個人情報の詐取など悪意ある動作をする。
平成24年春期問54 トロイの木馬の特徴|ITパスポート試験ドットコム

例えば・・・パソコン内部の秘密のファイルをインターネット上に送信したり、ファイルやディスク内容を破壊したりします。
感染機能は持っていませんので、感染増殖することはありません。が、そのためにワクチンソフトの検出対象外となります。

感染増殖はしないので、ワクチンソフトでは、基本的にトロイの木馬を検出の対象外としています。信頼できないサイトに便利なツールソフトウェアとして掲載されていても、そのプログラムはむやみにダウンロードして実行しないようにしましょう。
ウイルス用語辞典:IPA 独立行政法人 情報処理推進機構

サラミ法は、発覚しない程度に少量ずつの金銭や物品を窃取します。

不正行為が表面化しない程度に,多数の資産から少しずつ詐取する方法である。
平成25年秋期問43 サラミ法はどれか|基本情報技術者試験.com

https://securityblog.jp/karuta_image/karuta_023nu-thumb.jpg
【ぬ】 盗み出す 額は少額 サラミ法 | セキュリティかるた | 日立ソリューションズの情報セキュリティブログ

銀行預金の利息を着服する
預金の利息計算時には必ず1円未満の端数が生じる。この端数は微々たるものであるが、全ての口座から端数を集めれば大金になる。
実際に1960年代後半、アメリカ・ニューヨークの銀行で、プログラムに細工をして1セント未満の端数処理を四捨五入からすべて切り捨てに変更し、切り捨てられた端数を自分の口座に振り込ませるように改鼠する事件があった。

他人の口座から毎月1万円程度を不正に引き出す
スキミングなどの不正な手段によって他人のキャッシュカードのコピーを手にした人間が、1ヶ月あたり1万円 - 2万円以下の額を不正に引き出していた。
架空の電子商店をでっちあげてクレジットカード番号を大量に集め、大勢の人から少額ずつ詐取した事例がある。不正に引き落とされた金額は一人あたりではごく少額だったため、ほとんどの人はカードが不正に使われたことに気が付かなかった。
サラミ法 - Wikipedia

スキャベンジングは、日本語でゴミを漁るです。

  • 英語 : scavenging(scavenge : ゴミを漁る)
  • 別名 : ゴミあさり、トラッシング、ダンプスターダイビング

プログラム実行後のコンピュータ内部又はその周囲に残っている情報をひそかに探索して,必要情報を入手する方法である。
平成25年秋期問43 サラミ法はどれか|基本情報技術者試験.com

https://www.latron.jp/sites/default/files/inline-images/social-engineering4.png
ソーシャルエンジニアリングとは | ITスクールらとろん

次回の勉強内容

ponsuke-tarou.hatenablog.com

状態遷移から知る有限オートマトン

前回の勉強内容

ponsuke-tarou.hatenablog.com

今回の勉強内容 : 状態遷移図を使って有限オートマトンを知る

勉強のきっかけになった問題

次の表は,入力記号の集合が{0,1},状態集合が{a,b,c,d}である有限オートマトン状態遷移表である。長さ3以上の任意のビット列を左(上位ビット)から順に読み込んで最後が110で終わっているものを受理するには,どの状態を受理状態とすればよいか。
https://www.ap-siken.com/kakomon/18_aki/img/07.gif

1. a 2. b 3. c 4. d
平成18年秋期問7 有限オートマトンの状態遷移表|応用情報技術者試験.com

無効と有効の状態遷移をテストする状態遷移テストというものがあります。

  • 英語 : state transition testing

ブラックボックステストの設計技法の一つ。無効と有効の状態遷移を実行するテストケースを設計する。
JSTQBソフトウェアテスト標準用語集

状態遷移をテストするには状態の遷移を整理するために図と表を使用します。

状態遷移図は、発生する可能性のあるイベントとその結果の状態を図にしたものです。
  • 英語 : state diagram
  • 特徴
    • 「できること」を表現する
    • 状態遷移の流れを容易に把握できる
    • 図示することによって新たな発見がある
      • どこへの遷移もしない状態 / 複数の異なる状態に遷移するイベント
      • 状態遷移に関する仕様の不備にだって気がつく

コンポーネント又はシステムが取りうる状態を示し、ある状態から他への状態の変化の原因となる、(又は)その結果として生ずる、イベントや状況を表すダイアグラム。
JSTQBソフトウェアテスト標準用語集

A diagram that depicts the states that a system or component can assume, and shows the events or circumstances that cause or result from a change from one state to another.
IEEE 610Standard Glossary of Software Engineering Terminology

図はマルチタスクで動作するコンピュータにおけるタスクの状態遷移を表したものである。実行状態のタスクが実行可能状態に遷移するのはどの場合か。
https://www.fe-siken.com/kakomon/23_aki/img/20.gif

  1. 自分より優先度の高いタスクが実行可能状態になった。
  2. タスクが生成された。
  3. 入出力要求による処理が完了した。
  4. 入出力要求を行った。

平成23年秋期問20 タスクの状態遷移|基本情報技術者試験.com

f:id:ponsuke_tarou:20190402224738p:plain

状態遷移表は、発生する可能性のあるイベントと状態の組み合わせから生じる結果を示す遷移をテーブルで表したものです。
  • 英語 : state table
  • 無効な遷移と、有効な遷移の両方を示します。
  • 特徴
    • 「できないこと」を洗い出せる
    • 仕様があいまいな個所に潜む欠陥を発見できる
      • 全ての状態と全てのイベントを組み合わせるので、仕様のあいまいな個所を特定できる
    • 状態遷移図の不備を見つけることができる

次の表は,文字列を検査するための状態遷移表である。検査では,初期状態をaとし,文字列の検査中に状態がeになれば不合格とする。
解答群で示される文字列のうち,不合格となるものはどれか。ここで,文字列は左端から検査し,解答群中の△は空白を表す。
https://www.fe-siken.com/kakomon/18_haru/img/09.gif

ア. +0010 イ. -1 ウ. 12.2 エ. 9.△
平成18年春期問9 状態遷移表|基本情報技術者試験.com

f:id:ponsuke_tarou:20190402224451p:plain

図は,偶数個の1を含むビット列を受理するオートマトン状態遷移図であり,二重丸が受理状態を表す。a,bの正しい組合せはどれか。
https://www.ap-siken.com/kakomon/25_haru/img/03.gif
回答群
https://www.ap-siken.com/kakomon/25_haru/img/03a.gif
平成25年春期問3 オートマトンの状態遷移図|応用情報技術者試験.com
f:id:ponsuke_tarou:20190402225742p:plain

状態遷移図状態遷移表は、各メリットを合わせてお互いを見合わせながら整理することでテストケースを洗い出す事ができます。

状態遷移図では動作を想定しながら作るので「できること」に着目しがちですが、状態遷移表は状態とイベントを網羅的に組み合わせるので「できないこと」にも気が付けるのです。
性格が違うのだからどちらかあればいいってわけではないのですね。

f:id:ponsuke_tarou:20190402223808p:plain
この日の思い出

オートマトンは、入力から内部の状態と規則に従い結果を出力する仮想的な自動機械です。

  • 英語 : automaton

e-words.jp

入力と状態の数がある程度決まっているのが有限オートマトンです。

  • 別名 : 有限状態機械

有限個の状態と遷移と動作の組み合わせからなる数学的に抽象化された「ふるまいのモデル」である。
デジタル回路やプログラムの設計で使われることがあり、ある一連の状態をとったときどのように論理が流れるかを調べることができる。有限個の「状態」のうち1つの状態をとる。ある時点では1つの状態しかとらず、それをその時点の「現在状態」と呼ぶ。
何らかのイベントや条件によってある状態から別の状態へと移行し、それを「遷移」と呼ぶ。それぞれの現在状態から遷移しうる状態と、遷移のきっかけとなる条件を列挙することで定義される。
有限オートマトン - Wikipedia

図で表される有限オートマトンで受理される文字列はどれか。ここでhttps://blogs.c.yimg.jp/res/blog-fc-69/u_mana80/folder/555192/26/12834726/img_10?1472221498は初期状態を,https://www.fe-siken.com/kakomon/18_aki/img/11_2.gif受理状態を表す。
https://www.fe-siken.com/kakomon/18_aki/img/11.gif
ア 01011     イ 01111     ウ 10111     エ 11110
平成18年秋期問11 有限オートマトン|基本情報技術者試験.com
f:id:ponsuke_tarou:20190402232447p:plain

勉強のきっかけになった問題も状態遷移図を書いてみるとわかりやすいです。

f:id:ponsuke_tarou:20190402232736p:plain

f:id:ponsuke_tarou:20190402223714p:plain
いつかの思い出

次回の勉強内容

ponsuke-tarou.hatenablog.com

ページング方式におけるページインだけの処理の割合

前回の勉強内容

ponsuke-tarou.hatenablog.com

今回の勉強内容 : ページング方式の基本用語を理解したい。

勉強のきっかけになった問題

ページング方式の仮想記憶において,あるプログラムを実行したとき,1回のページフォールトの平均処理時間は30ミリ秒であった。ページフォールト発生時の処理時間が次の条件であったとすると,ページアウトを伴わないページインだけの処理の割合は幾らか。

ページフォールト発生時の処理時間〕
(1) ページアウトを伴わない場合,ページインの処理時間は20ミリ秒である。
(2) ページアウトを伴う場合,置換えページの選択,ページアウト,ページインの合計処理時間計60ミリ秒である。

  1. 0.25
  2. 0.33
  3. 0.67
  4. 0.75

平成28年春期問17 ページインだけの処理の割合|応用情報技術者試験.com

f:id:ponsuke_tarou:20190401194116p:plain
いつかの思い出

ページング方式とは、メモリ領域をページと呼ばれる一定の大きさの領域に分割し、物理的なアドレスとは別に仮想的なアドレスを割り当てて管理する方式です。

物理メモリが不足した時にOSさんは、ハードディスクの一部をメモリっぽく使用してくれます。
それが仮想メモリです。仮想メモリはハードディスクにスワップファイルという専用領域を造ります。

$ cd /var/vm/  #<<< Mac OSはここにスワップファイルを作ります。
$ ls -l
total 8388608
-rw------T  1 root  wheel  1073741824  3 31 22:05 sleepimage
-rw-------  1 root  wheel  1073741824  2 20 00:06 swapfile0 # <<< スワップファイル
-rw-------  1 root  wheel  1073741824  3 10 21:57 swapfile2
-rw-------  1 root  wheel  1073741824  3 31 21:48 swapfile3

ページング方式の仮想記憶を使うとプログラムやデータを不連続な主記憶に割り付けることができます。

細切れのメモリ空間を連結して一つの連続した空間として利用したり、補助記憶装置(ハードディスクなど)上にも仮想的なメモリ領域を確保することで、物理メモリの容量を超えてメモリ空間を利用することができます。

f:id:ponsuke_tarou:20190401204406p:plain
どこかの思い出

仮想アドレスと物理アドレスマッピングを格納するページテーブルを使って管理します。

ページング方式では、OSさんが仮想アドレスと物理アドレスマッピングを格納するページテーブルを使って物理メモリと仮想メモリを管理してくれます。
ここで、仮想メモリはページ単位なのに物理メモリが違う大きさで管理されていると行き来が大変なので、ページと同じ大きさのカタマリで管理します。
この物理メモリのカタマリをページフレームとか物理ページとかフレームとかっていいます。

管理するために同じサイズにデータを分割した1つ1つがページです。

https://wa3.i-3-i.info/img/data/3300/d003352-8.pnghttps://wa3.i-3-i.info/img/data/3300/d003352-9.pnghttps://wa3.i-3-i.info/img/data/3300/d003352-10.png
https://wa3.i-3-i.info/word13352.html

f:id:ponsuke_tarou:20190401200151p:plain
あの日の思い出

アクセスしようとした領域が物理メモリではなく仮想メモリにある場合に発生する割り込み処理をページフォールトといいます。

  • 英語 : page fault

ページング方式の仮想メモリにおいて、プロセスがアクセスしようとしたページが物理メモリ上に無く、仮想メモリにあるときに仮想メモリを管理する制御装置が発する例外あるいは割込処理をページフォールトといいます。
このページフォルトは、エラーっぽい名前だけれどとかでとか来た時に表示される通知やお知らせ的な存在です。
そのページフォルトをOSさんが検知して物理メモリに必要なページを読み込んでくれます。

f:id:ponsuke_tarou:20190401200306p:plain
ぬのたき

リストラ的にページフレームを追い出すことをページアウトといいます。

ページング方式では「プロセスが使ってる部分は物理メモリ、使ってない部分は仮想メモリを使う」「仮想メモリはページというカタマリで使われていく」、そして「使ってなかった部分を使うときは仮想メモリから物理メモリを使うようにする」ことがわかりました。
が、物理メモリが空いていればいいけど、空いていなかったらどうするんだろう?

物理メモリが空いていなかったら、どれかのページを追い出すんです!
どのページフレームを追い出すかってのはアルゴリズムによって違います。

逆にデビュー的にページをページフレームに読み込むことをページインとかスワップインといいます。

f:id:ponsuke_tarou:20190401202233p:plain
この日の思い出

次回の勉強内容

ponsuke-tarou.hatenablog.com

SQLインジェクション

前回の勉強内容

ponsuke-tarou.hatenablog.com

今回の勉強内容 : SQLインジェクションの対策を学ぶ

勉強のきっかけになった問題

SQLインジェクション対策について,Webアプリケーションの実装における対策とWebアプリケーションの実装以外の対策として,ともに適切なものはどれか。
https://www.sc-siken.com/kakomon/28_aki/img/17.gif
情報セキュリティスペシャリスト 平成28年秋期 午前Ⅱ 問17

SQLインジェクションとは、アプリケーションが想定しないSQL文を実行させることにより、データベースシステムを不正に操作する攻撃方法のことです。

  • 別名 : ダイレクトSQLコマンドインジェクション, SQL注入
  • 英語 : SQL injection(注入,投入)

https://blogs.mcafee.jp/wp-content/uploads/2018/06/sqlinjection-1.jpg
https://blogs.mcafee.jp/wp-content/uploads/2018/06/sqlinjection-2.jpg
SQLインジェクション攻撃への対策|脆弱性を悪用する仕組みと具体例

https://www.scutum.jp/information/web_security_primer/images/web_security_primar_ph_05.gif
【2】SQLインジェクションによる顧客情報流出 ― 不正アクセスの横綱!| Webサイトセキュリティ対策入門 by WAF「Scutum」プロジェクト

対策 : SQLを埋め込むところで特殊文字を適切にエスケープ

'    →  ''
\   →  \\
今夜分かるSQLインジェクション対策:Security&Trust ウォッチ(42) - @IT

入力値で仕込んでデータが再利用されたときに効力を発揮するセカンドオーダーSQLインジェクション

たとえアプリケーションが常にシングルクオートをエスケープしていても、 攻撃者はなおも、データベース中のデータがそのアプリケーションで再利用さ れるときにSQLをインジェクトすることができます。

  • 例えば・・・
    1. 攻撃者がアプリケーションに登録して、ユーザ名「admin'--」、 パスワード「password」のユーザ名を作る
    2. アプリケーションはシングルクオートを正しくエスケープして、INSERT文が作られる
      • insert into users values ( 123, 'admin''--', 'password', 0xffff)
    3. 攻撃者がパスワードを変更する
      • update users set password = '" + newpassword + "’ where username = '" + rso ( "admin'--") + "'"
    4. 最初にせっかくエスケープしたのに次には・・・・されず・・・クエリが生成される
      • update users set password = 'password' where username = 'admin'--'
    5. 攻撃者は、admin'-- というユーザを登録することによって、admin のパスワードを自由にセットできる

https://image.itmedia.co.jp/ait/articles/0611/02/r20_42_01.gif
今夜分かるSQLインジェクション対策:Security&Trust ウォッチ(42) - @IT

対策 : データベースでのアクセス権は最小限に留める

不正なSQLがWebアプリから送られても最小限のアクセス権だけを与えることで被害を軽減できます。

シングルクオーテーションを使わないSQLインジェクション

SQLインジェクション対策というと、「'」の扱いばかりが注目されるが、「'」を使わなくても成立する攻撃もあります。

  • 例えば・・・
    1. SELECT name FROM user where uid = '$uid' AND age > $age
    2. 渡される$uidと$ageの特殊文字は、適切にエスケープ!が、こんなものがきたら・・・
      • $uid:ueno
      • $age:31 UNION…
    3. SELECT name FROM user where uid = ' ueno ' AND age > 31 UNION……
    4. UNION以降のSQLも実行されてしまう・・・
    5. 対策 : 問題は、ageの値をシングルクオーテーションで囲う
      • SELECT name FROM user where uid = '$uid' AND age > '$age'

対策 : SQLプレースホルダを利用する

プレースホルダとは、ユーザ入力をもとに生成される部分に特殊文字を使用したSQL文中のひな形を用意し、その変数部分には実行時に値を割り当てる仕組みです。

PHPの場合 : $1と$2がプレースホルダ
PHPでのSQLインジェクション対策 - プレースホルダ編 | Let's Postgres

$res = pg_query_params(
  $dbconn,
  'UPDATE users SET profile = $1 WHERE userid = $2',
  array($_REQUEST['profile'], $_SESSION['me']['userid'])
);

Javaの場合 : ?がプレースホルダ
安全なSQLの呼び出し方 - Qiita

PreparedStatement prep = conn.prepareStatement("SELECT * FROM employee WHERE name=?");
prep.setString(1, "山田");

マルチバイト文字の問題

  • 例えば・・・入力値「\x97' OR A=A」をエスケープ処理すると「予' OR A=A」になる
    1. 「\x97' OR A=A」の「'」を「\'」とエスケープして処理する
      • \x97' > \x97\' (「\x97」だけでは意味をなさない)
    2. 「\'」の部分をエンコードする
      • \x97\' > \x97\x5C\x27 > \x97\x5C(予)\x27( ' ) > 予'
    3. 結果としてエスケープ処理すると「予' OR A=A」となり「'」を「\'」とエスケープしたが、「'」が残ってしまう

シフトJISは2バイト文字ですが、2バイト目に1バイト文字の文字コードを含んだ文字もあります。

  • \x94\x5C → 能
  • \x95\x5C → 表
  • \x96\x5C → 暴

「'」を「''」とエスケープしている場合にも同様の現象が起きる可能性がある。

対策 : クライアント側の文字コードシフトJISを使うのをやめてEUC-JPなどを使う

文字コードを変更できない場合の対策
  • 半端な1バイト文字を受け付けない処理を書く
  • マルチバイトを扱う関数を通して、文字コードを整理
// PHPの場合
// mb_convert_encoding — 文字エンコーディングを変換する
/* SJISエンコーディングからSJISに変換 */
$str = mb_convert_encoding($str, 'SJIS', 'SJIS');

f:id:ponsuke_tarou:20190331221754j:plain
思い出の一枚

次回の勉強内容

ponsuke-tarou.hatenablog.com

パイブライン処理での危険がパイブラインハザード

前回の勉強内容

ponsuke-tarou.hatenablog.com

今回の勉強内容 : パイブライン処理での危険を学ぶ

勉強のきっかけになった問題

パイプライン方式のプロセッサにおいて,パイプラインが分岐先の命令を取得するときに起こるハザードはどれか。

  1. 構造ハザード
  2. 資源ハザード
  3. 制御ハザード > 正解
  4. データハザード

平成26年秋期問7 分岐命令で発生するハザード|応用情報技術者試験.com

パイブラインハザードは、パイプライン処理を止めたりやり直さなければならなくなり効率が悪くなることです。

  • 英語 : pipeline hazard

マイクロプロセッサ(MPU/CPU)のパイプライン処理で発生する問題の一つです。

そもそもハザードとは、危険の原因・危険物・障害物などを意味する英語です。

  • 英語 : hazard

https://resilient-medical.com/wp-content/uploads/2018/05/hazard1-600x450.jpg
https://resilient-medical.com/risk/hazard

ハザードの種類は、原因によって分けられます。

制御ハザードは、分岐命令によって先取りした命令が無駄になることです。

  • 別名 : 分岐ハザード
  • 例えば・・・
    • 条件分岐で実行の流れが二つに分かれる場合、条件の評価を待たずに先行して片方の分岐の命令群をパイプラインに投入することになるが、条件を評価した結果もう一方に分岐することが確定した場合、パイプラインの内容を破棄して正しい分岐の命令群を投入しなおさなければならない。
    • 分岐命令を実行した場合、次に実行される命令は、分岐が成立した場合と不成立の場合の2通りがある。分岐が成立しないと仮定して命令を先取りすると、分岐が成立した場合に先取りした命令をキャンセルし、改めて分岐が成立した場合の命令を実行しなければならない。

制御ハザードによって先取りした命令のキャンセルが発生し、ムダになったクロック*1のことをインターロック*2もしくはストール*3という。

http://security2600.sakura.ne.jp/main2/image3/hazard1.jpg
パイプラインハザード - Security Akademeia

解決方法
  • 分岐先が判明するまで先取りしない
  • 常に分岐が不成立(あるいは成立)と仮定して先取りを進める
  • 場合によってはストールが起こることを容認する。

f:id:ponsuke_tarou:20190315214631p:plain
飛鳥山公園

データハザードは、命令が直前の命令の実行結果を使用する場合に発生します。

ある命令が直前の命令の処理結果を利用するような場合に、実行結果を待たなければパイプラインが進められない状況が発生します。

http://security2600.sakura.ne.jp/main2/image3/hazard2.jpg
パイプラインハザード - Security Akademeia

https://image.slidesharecdn.com/sample-150315081741-conversion-gate01/95/cpu-16-638.jpg?cb=1449891681
CPUの同時実行機能

解決方法
  • NOP命令を挿入する
  • データハザードを検知したら実行結果を次の命令に直接たわしてしまう
    • 演算装置によってハードウェア的に実現される

構造ハザードは、CPU内部の資源の衝突によって発生します。

複数の命令をパイプラインで並行に処理する過程で、同じタイミングで同じハードウェア資源にアクセスしようとするなど競合が発生し、処理がつっかえることがあります。

  • 例えば・・・
    • 命令Aがメモリへの書込を行っているのと同じタイミングで後続の命令Bがメモリの読込をしようとするとメモリアクセスがバッティングします。バッティングしないようにするために命令Bは1クロック処理を遅らせる必要があります。これにより1クロック分遅延します。

https://news.mynavi.jp/article/architecture-124/images/002.gif
https://news.mynavi.jp/article/architecture-124/images/003.gif
コンピュータアーキテクチャの話(124) パイプライン処理と構造的ハザード | マイナビニュース

http://memes.sakura.ne.jp/memes/wp-content/uploads/2012/03/risc_contention.png
http://memes.sakura.ne.jp/memes/wp-content/uploads/2012/03/risc_hazard.png
マイコンの構造と処理3 – ミームス(MEMEs)のサポートページ

解決方法
  • ハードウェア的に回避することは可能。
    • しかし完全に構造ハザードを起こさない構成はコストの上昇を招く。
    • 構造ハザードの確率が低ければ、コスト上昇を抑えるために、多少の構造ハザードを無視するのが現実的である。

f:id:ponsuke_tarou:20190315003545p:plain
思い出の一枚

次回の勉強内容

勉強中・・・

*1:CPUの動作基準となる時間の単位で、このクロックの整数倍の時間をかけて命令を実行していきます。命令パイプライン中の1ステージの実行には最低1クロックかかるので、4ステージ構成の命令パイプラインでは、1個の命令を実行完了するためには、最低でも4クロックの時間が必要となります。CPUをはじめとしたコンピュータの各回路は、一定の時間で刻まれるクロック信号に歩調を合わせながら処理を行っています。 このクロック信号は、非常に正確な時間間隔でパルス(非常に短い時間の間だけ変化する電流)を発生する水晶発振器によって生成されます。

*2:安全装置・安全機構の考え方の一つで、ある一定の条件が整わないと他の動作ができなくなるような機構のこと。

*3:命令パイプラインでは、除算命令のように命令の処理完了に長い時間がかかる場合、パイプラインに次の命令を取り込むのを待つ必要がある。この問題の解決策としてパイプラインの各段階が忙しいことを示せるようにして、パイプラインをインターロックして次の命令がステップを進まないように止めなければならない。これがストールであり、分岐のように中断以前の処理が無駄になる場合にはストールに加えて無駄となった処理時間分も加わり、これらがインターロックのロスとなる。

パイプライン処理の基本を学ぶ

前回の勉強内容

ponsuke-tarou.hatenablog.com

今回の勉強内容 : パイプライン処理の基本を学ぶ

勉強のきっかけになった問題

スーパスカラの説明として、適切なものはどれか。

  1. 処理すべきベクトルの長さがベクトルレジスタより長い場合、ベクトルレジスタの組に分割して処理を繰り返す方式である。
  2. パイプラインを更に細分化することによって、高速化を図る方式である。
  3. 複数のパイプラインを用い、同時に複数の命令を実行可能にすることによって、高速化を図る方式である。
  4. 命令語を長く取り、一つの命令で複数の機能ユニットを同時に制御することによって、高速化を図る方式である。

必ず受かる情報処理技術者試験-平成24年度春季-応用情報技術者-問題・解答11

パイプライン処理とは、マイクロプロセッサの高速化手法の一つです。

プロセッサ内での命令処理は、複数の段階を順次行います。

  • 処理の段階
    1. 命令の読み込み(フェッチ)
    2. 解釈(デコード)
    3. 実行(エグゼキュート)
    4. 結果の書き込み(ライトバック)

通常は、前の命令のサイクルが完全に終わらないと、次の命令を処理し始めることはできません。

http://mt-net.vis.ne.jp/images/501/FE2000S_18_a1.gif
パイプライン処理 [徹底研究!情報処理試験]

パイプライン処理は、各段階の処理を独立して動作させることで、前の命令のサイクルが終わる前に次の命令を処理し始められます。

http://mt-net.vis.ne.jp/images/501/FE2000S_18_a2.gif
パイプライン処理 [徹底研究!情報処理試験]

パイプライン処理には種類があります。

命令の処理を独立して実行できる工程に分割するのが、命令パイプラインです。
  • 英語 : pipeline processing

https://image.slidesharecdn.com/kagamicomput201514-150713021412-lva1-app6892/95/kagamicomput201514-14-638.jpg?cb=1436753672
kagami_comput2015_14

レンダリング処理の高速化に特化しているのが、グラフィックスパイプラインです。

3次元コンピュータグラフィックスで、3次元から2次元のデータを作る多段階の過程全体をパイプライン処理によって高速化しています。

https://game.watch.impress.co.jp/img/gmw/docs/590/700/ps_42_s.gif
西川善司の3Dゲームファンのための「プレイステーション 4」グラフィックス」講座(後編) - GAME Watch

命令パイプラインによる並列化と同じ方法でループ処理を最適化するのが、ソフトウェアパイプラインです。

アウト・オブ・オーダー実行*1に似ているものの、命令の並べ替えがCPU ではなくコンパイラで 行われる点に違いがあります。

http://my-web-site.iobb.net/~yuki/wp-content/uploads/2017/06/200612_dsp04_pipe.jpg
TI C64x DSPによる画像認識の最適化実装 | ある計算機屋さんの手帳

スーパースカラは、複数のパイプラインで並列に命令を処理できるようにする機構です。

並列実行可能な複数の命令を,複数の演算器(パイプライン)に振り分けることによって並列に実行する。
平成31年春期問8 スーパスカラの説明はどれか|応用情報技術者試験.com

https://ascii.jp/elem/000/000/555/555472/fig1_c_740x500.jpg
https://ascii.jp/elem/000/000/555/555471/

https://image.itmedia.co.jp/edn/articles/1702/24/tt170224MCUQA35_001.jpg
スーパースカラって何? (1/3) - EDN Japan

スーパーパイプラインは、パイプラインの段階を細分化して多くすることで並走できる命令数を増やします。

http://www.myelq.com/Glossary/Images/superpipeline.gif
スーパーパイプライン

https://img.atwikiimg.com/www38.atwiki.jp/hiropknot/attach/69/47/%E3%83%91%E3%82%A4%E3%83%97%E3%83%A9%E3%82%A4%E3%83%B3.gif
コンピュータ構成要素 - hiropknot @ ウィキ - アットウィキ

http://www.ap-siken.com/kakomon/27_haru/img/09.gif
http://semirara.sota1235.net/general/%E3%82%B9%E3%83%BC%E3%83%91%E3%83%BC%E3%82%B9%E3%82%AB%E3%83%A9

f:id:ponsuke_tarou:20190314233906p:plain
パイプライン制御方式
f:id:ponsuke_tarou:20190314231009p:plain
思い出の一枚

次回の勉強内容

ponsuke-tarou.hatenablog.com

*1:コンピュータのプロセッサー(CPU)が命令を処理するとき、規定の順番(操作手順)を守らないで実行するやりかた。命令を一時的に溜めておき、命令を細分化してできる作業から実行する方式。メリット:無駄な待ち時間が発生しないのでの作業を高速化できる。デメリット:作業の分割など手間のかかる作業が増えるので、処理工程は複雑になる

Dos攻撃とDDos攻撃はサーバやサイトに大きな負荷をかけてダウンさせるサイバー攻撃です。

前回の勉強内容

ponsuke-tarou.hatenablog.com

勉強のきっかけになった問題

マルチベクトル型DDoS攻撃に該当するものはどれか。

  1. 攻撃対象のWebサーバ1台に対して,多数のPCから一斉にリクエストを送ってサーバのリソースを枯渇させる攻撃と,大量のDNS通信によってネットワークの帯域を消費させる攻撃を同時に行う。
  2. 攻撃対象のWebサイトのログインパスワードを解読するために,ブルートフォースによるログイン試行を,多数のスマートフォンやIoT機器などの踏み台から成るボットネットから一斉に行う。
  3. 攻撃対象のサーバに大量のレスポンスが同時に送り付けられるようにするために,多数のオープンリゾルバに対して,送信元IPアドレスを攻撃対象のサーバのIPアドレスに偽装した名前解決のリクエストを一斉に送信する。
  4. 攻撃対象の組織内の多数の端末をマルウェアに感染させ,当該マルウェアを遠隔操作することによってデータの改ざんやファイルの消去を一斉に行う。

情報処理安全確保支援士平成30年秋期 午前Ⅱ 問4

Dos攻撃DDos攻撃は、サーバやサイトに大きな負荷をかけてダウンさせるサイバー攻撃です。

1つのIPアドレスから攻撃を仕掛けるのが、Dos攻撃です。

  • 英語 : Denial(否定・拒絶) of Service attack
  • 日本語 : サービス拒否攻撃
F5アタックは、一人でF5ボタンを押下し続ける寂しい攻撃です。

ブラウザでF5を押すと、画面をリロードしてくれます。しかもキャッシュ保存せずに。
なので、画面のデータを全部サーバへ要求します。
そしてF5を猛烈に連打するとサーバに負荷をかけることができます。

複数のIPアドレスから攻撃を仕掛けるのが、DDos攻撃です。

  • 英語 : Distributed(分散型の) Denial of Service attack
  • 日本語 : 分散型サービス拒否攻撃

https://www.nttpc.co.jp/service/ddos/img/img_index_03.jpg
DDoS対策サービス|ソリューション・サービス|【公式】NTTPC

DDos攻撃では、ボットネットが使われます。

外部からの遠隔操作に従って処理を実行するプログラムがボットです。それがたくさん集まったのがボットネットです。
残念ながら、自分のパソコンやスマホにボットが入ってしまうとDDos攻撃の加害者となります。

https://eset-info.canon-its.jp/files/user/malware_info/images/threat/150120_3/images/img01.jpg
ボットネットとは何か? どうやって防ぐのか? | サイバーセキュリティ情報局

ボットネットを遠隔操作するために指令を送ったり制御するサーバーが、C&Cサーバーです。
  • 英語 : Command and Control server

https://eset-info.canon-its.jp/files/user/malware_info/images/term/sa/images/171_1.jpg
C&Cサーバー | サイバーセキュリティ情報局

Miraiは、ランダムなIPアドレスを生成してtelnetポートにログインを試行し工場出荷時の弱いパスワードを使っているIoT機器などに感染を広げるとともにC&Cサーバからの指令に従って標的に対してDDoS攻撃を行うマルウェアです。
  • 読み方: ミライ

https://image.itmedia.co.jp/tf/articles/1704/13/tfayagi_mirai1704_fig01.jpg
IoTデバイスを狙うマルウェア「Mirai」とは何か――その正体と対策:超速解説 Mirai - TechFactory

感染した端末上でIPアドレスをランダムに走査し、新たな標的を見つけます。そして、工場出荷時のデフォルト値や単純なID/パスワードの組みによる辞書攻撃によって、標的IoT端末のtelnetポートへのログインを試みます。この動作を繰り返して、ボットネットを拡大していきます。Miraiが構築したボットネットは、過去最大級の規模のDDoS攻撃を引き起こしています。
情報処理安全確保支援士平成30年秋期 午前Ⅱ 問11

攻撃には、「フラッド型」「脆弱性」「マルチベクトル型」があります。

フラッド型は、大量データを送りつけて処理しきれなくなるようにします。

https://tech.nikkeibp.co.jp/it/article/COLUMN/20070307/264106/zu01.jpg
サービス妨害攻撃 --- DoS,DDoS,smarf,SYNフラッド,DNS amp | 日経クロステック(xTECH)

脆弱性は、脆弱性を利用して不正処理を行わせサービス機能を停止させます。

WAFは、Webアプリケーションの脆弱性を狙う攻撃を遮断するファイアウォールです。

ponsuke-tarou.hatenablog.com

マルチベクトル型は、複数の手法を組み合わせます。

攻撃対象のWebサーバ1台に対して多数のPCから一斉にリクエストを送って「サーバのリソースを枯渇させる」攻撃と大量のDNS通信によって「ネットワークの帯域を消費させる攻撃」を同時に行います。

https://businessnetwork.jp/Portals/0/Data/2019/02/22/A10_3.jpg?11915105630126
A10が機械学習でDDoS防御を自動化、追加ライセンスは不要で(ページ2) | ビジネスネットワーク.jp

f:id:ponsuke_tarou:20201001203726j:plain
那須岳朝日岳

OSI参照モデルネットワーク層トランスポート層が攻撃に使われやすいです。

第7層 アプリケーション層
第6層 プレゼンテーション層
第5層 セッション層
第4層 トランスポート層 <- 反射型DDoS攻撃 / DNSリフレクタ攻撃
第3層 ネットワーク層 <- ICMP Flood攻撃
第2層 データリンク層
第1層 物理層

反射型DDoS攻撃は、トランスポート層DNSサーバやNTPサーバを反射に使ってパケットを増幅させる攻撃です。

  • 別名 : リフレクション攻撃、DrDoS攻撃(Distributed Reflection Denial of Service attack)
UDPの性質を悪用したDDoS攻撃DNSリフレクタ攻撃があります。
  • 別名 : DNSアンプ攻撃

反射に利用されるサーバ(リフレクター)の特徴

  • UDPを使用している >> TCPに比べてIPアドレスを詐称しやすい
  • 問い合わせよりも応答の方が大きい >> 攻撃の効率が上がる

これらの特徴に合うのが、DNSサーバやNTPサーバです。

https://www.sc-siken.com/kakomon/30_aki/img/07.gif
情報処理安全確保支援士平成30年秋期 午前Ⅱ 問7

https://jprs.jp/glossary/imgs/reflection.png
JPRS用語辞典|DNSリフレクター攻撃(DNSアンプ攻撃)

ICMP Flood攻撃は、ネットワーク層のICMPを利用して回線を過負荷にさせる攻撃です。

ICMP Flood攻撃に該当するものはどれか。
答. pingコマンドを用いて大量の要求パケットを発信することによって,攻撃対象のサーバに至るまでの回線を過負荷にしてアクセスを妨害する。
https://www.sc-siken.com/kakomon/27_aki/img/10.gif
情報セキュリティスペシャリスト平成27年秋期 午前Ⅱ 問10

f:id:ponsuke_tarou:20190313221021j:plain
思い出の一枚

次回の勉強内容

ponsuke-tarou.hatenablog.com

メッセージカードコレクション2019春

1. 葉っぱ

f:id:ponsuke_tarou:20190220200446j:plain

2. あなたを考えています

f:id:ponsuke_tarou:20190220200514j:plain

3. 黒い花

f:id:ponsuke_tarou:20190220200544j:plain

4. 花と蝶

f:id:ponsuke_tarou:20190220200615j:plain

5. 花と鳥

f:id:ponsuke_tarou:20190220200701j:plain

6. 花とモルモット

f:id:ponsuke_tarou:20190220200737j:plain

7. 花とうさぎ

f:id:ponsuke_tarou:20190220200822j:plain

8. カラー

f:id:ponsuke_tarou:20190220201045j:plain

10. バラ

f:id:ponsuke_tarou:20190220201155j:plain

12. どシンプル

f:id:ponsuke_tarou:20190220201310j:plain

シール

f:id:ponsuke_tarou:20190220201224j:plain