2021年4月27日火曜日

情報セキュリティ対策:05-06

 5.6   侵入検知システム(IDS)

 5.6.1                  概要

IDSIntrusion Detection Systemの略称で、不正侵入検知システムとも呼ばれます。

インターネットに公開するサービスでは、それに対する通信はファイアウォールでは接続許可の扱いとなるため、正常な通信と異常な通信は区別なくアクセスされることになります。

そこで、IDSを設置することで、通信を監視します。

また、もし異常があれば管理者へ通知することで、異常な通信をブロックするなどの対処をするきっかけ(トリガー)となります。

 

5.6.2.                 種類と主な機能

1.   ネットワーク型侵入検知システム(NIDS)

設置場所

·         バリアセグメントに接続

·         DMZに接続

·         内部セグメントに接続

検知の仕組み

·         シグネチャとのパターンマッチング

·         異常検知(アノマリ検知)

イベント検知後のアクション

·         通知・記録

·         プログラム実行・停止

·         ファイルやレジストリの復元(HIDSのみ)

·         セッション切断・接続制限機能
  TCPコネクションは切断可能、
UCP/ICMP
には無効。
ファイアウォールと連携して、ACLを動的に変更するなど

  

2.   ホスト型侵入検知システム(HIDS)

主な検知項目

ログイン成功/失敗

特権ユーザへの昇格

システム管理者用プログラムの起動

特定ファイルへのアクセス

設定ファイルの変更

プログラムのインストール

システムディレクトリに存在するファイルの書き換え/削除

Webコンテンツの改ざん

 

*       「不正検出」は事前に登録されているシグネチャという検出ルールとマッチングすることで不正なアクセスを検出する方法です。

*       「異常検出」はトラフィックや使用したコマンドを確認することで通常とは異なる振る舞いをした場合に異常と判断し、検出します。

ü  大量に発行されたコマンド

ü  プロトコル仕様に反したデータの流れ

ü  プロトコル支障に従っていないヘッダ情報を持つパケット

ü  異常な数の応答パケットなど

 

 5.6.3                  構成例

·         DMZと内部セグメントの監視

·         スイッチ接続(冗長化されたネットワーク環境)

·         TAP接続(TAPを利用した冗長化されたネットワーク環境)

·         LB接続(SSLアクセレータ付きLB)

 

 5.6.4                  導入上の留意点

 

 

 5.6.5                  機能上の限界および運用上の課題

1.   NIDS

   誤検知への対応

   フォールスポジティブ:不正ではない事象を不正として検知すること

   フォールスネガティブ:本来検知すべき事象を見逃してしまうこと。

   NIDSの処理能力不足によるパケットの取りこぼし

   アプリケーションに対する攻撃を検知できない

   暗号化されたパケットは解析できない(一部の高性能機種を除く)

   攻撃は検知できても侵入は検知できない

   不正アクセスを防御できない

   正当な権限者による内部犯罪の検知は困難

   ITの発展に合わせた機能拡張が必要

 

2.   HIDS

   あくまでOSの基本的な機能がベース

   1つのHIDSで監視できるのは1台のホストのみ

   導入によって監視対象ホストの性能や可用性に悪影響を及ぼす可能性がある

   攻撃の予兆を検知することは困難

   正当な権限者による内部犯罪の検知は困難

   ホスト環境でのリアルタイム検知の必要性は低い

 

 5.6.6                  拡張的な機能

·         独自シグネチャの登録機能

·         脆弱性検知による検知品質の向上

·         セッション情報の保存・分析による検知品質の向上

·         マルチインタフェースモニタリング機能

·         SSL/TLSによって暗号化されたパケットの複合

·         ハイパフォーマンス、ハイアベイラビリティ、マルチプロトコル対応など


2021年4月25日日曜日

ストレス解消

1年間、ストレスは当初と比較してストレスが減る。
今では外出しないほうが良いと思えるほどだ。

新型コロナウィルスで気軽に出かけられないので、家で映画などをみている
そのほうが面白い。

チャングムの誓い、54話をすべて観たのは初めて、何回も再放送で観たのだが時たまだったので・・・
話が長いが面白い、現実離れをしていてもそれがまたよい。
悪役の人も憎み切れない。
韓国のドラマで、はまったのはこれのみ。ほかのものを観ても観ていられない。
韓国語はわからないが、ドラマで良く聴いていたので、時たま日本語のように聞こえたり、英語に聞こえたりするのは面白い。
言語は違っていても、似た発音はあるものだ。

ドラマをよく観てよいストレス発散になる。
何かに集中すると、心の中の悪いものが出ていくようだ。

緊急事態宣言がでたが、効果が薄そう。
やはりロックダウンをして人流を止めるのが最善の方法だと思う。




2021年4月18日日曜日

PHP:Laravel-08

 PHP:Laravel-07の参考URLをもとにしていろいろと変更していきます。

1.CSSで、Bootstrapを利用します

npm install bootstrap-vue

※ Composerは、PHPの依存関係を管理するツールです。 Packagistを使用して依存関係に関する情報を取得し、適切にインストールします。
NPMはNodeエコシステムの一部であり、主にNode.jsアプリケーションの依存関係を管理するために構築されました。

2.設計関係の確認

下記の設計関係のドキュメントが必要です。理由はプロダクトの際に必要になる情報です。

常に製造の品質を上げるときは設計が重要です。設計することによってテスト内容が把握でき、結果の保証します。

参考にしているURLには設計関係のものがありますので参考にして、今後、追加と修正をしていきます。

  • 画面設計
  • 画面遷移図
  • データベース設計
  • URL設計

3.bootstrap-vueの利用

■bootstrap-vueを利用しているので、これを利用できるようにします

resources/app.js に下記を追加

・・・

import BootstrapVue from 'bootstrap-vue'
import 'bootstrap/dist/css/bootstrap.css'
import 'bootstrap-vue/dist/bootstrap-vue.css'

// BootstrapVueのプラグインの利用
Vue.use(BootstrapVue)
Vue.config.productionTip = false

・・・

4.ログイン関係の修正

クライアント側での動きの制御がVue、Vuex

サーバ側での動きはLaravelのAPI

この動きを設計書に基づき、プロダクトを見てみましょう

■resources/app.js

import './bootstrap'
import Vue from 'vue'
import router from './router'
import store from './store'
import App from './app.vue'

import BootstrapVue from 'bootstrap-vue'
import 'bootstrap/dist/css/bootstrap.css'
import 'bootstrap-vue/dist/bootstrap-vue.css'

// BootstrapVueのプラグインの利用
Vue.use(BootstrapVue)
Vue.config.productionTip = false

const createApp = async () => {
  await store.dispatch('auth/currentUser')

  new Vue({
    el: '#app',
    router,
    store,
    components: { App },
    template: '<App />'
  })
}

createApp()

App.vue

初期画面構成となります

router.js

VueRouterプラグインを使用したルーティングを行います

コンポーネントと紐づけをしています 

 <RouterView />が利用可能になる

 const routes = [

 {
    path: '/',
    component: PhotoList,
    props: route => {
      const page = route.query.page
      return { page: /^[1-9][0-9]*$/.test(page) ? page * 1 : 1 }
    }
  },
  {
    path: '/photos/:id',
    component: PhotoDetail,
    props: true
  },
  {
    path: '/login',
    component: Login,
    beforeEnter(to, from, next) {
      if (store.getters['auth/check']) {
        next('/')
      } else {
        next()
      }
    }
  },
  {
    path: '/500',
    component: SystemError
  },
  {
    path: '*',
    component: NotFound
  }
]

■resources/store/index.js

resources/app.js が参照しているresources/store配下のjsを見てみましょう

import Vue from 'vue'
import Vuex from 'vuex'

import auth from './auth'
import error from './error'
import message from './message'

Vue.use(Vuex)

const store = new Vuex.Store({
  modules: {
    auth,   // 認証関係
    error,  // エラー関係
    message // メッセージ関係
  }
})

export default store

storeで利用できるものは

  •  auth,   // 認証関係
  •  error,  // エラー関係
  •  message // メッセージ関係

となります

■resources/store/auth.js

ソースに詳細を記入しています

import { OK, CREATED, UNPROCESSABLE_ENTITY } from '../util'

const state = {
  user: null,
  apiStatus: null,
  loginErrorMessages: null,
  registerErrorMessages: null
}

/**
 * ゲッターの定義 
 * storeを参照できる
 */
const getters = {
  check: state => !!state.user,
  username: state => state.user ? state.user.name : '',
}

/**
 * ミューテーションの登録
 * Vuex のストアの状態を変更できる唯一の方法は、
 * ミューテーションをコミットすること
 */

const mutations = {
  setUser(state, user) {
    state.user = user
  },
  setApiStatus(state, status) {
    state.apiStatus = status
  },
  setLoginErrorMessages(state, messages) {
    state.loginErrorMessages = messages
  },
  setRegisterErrorMessages(state, messages) {
    state.registerErrorMessages = messages
  }
}

/**  
 * アクションの登録
 */
const actions = {
  // 会員登録系
  async register(context, data) {
    // context.commit('setApiStatus', null):引数はtypeと値
    context.commit('setApiStatus'null)
    // サーバに対してAPI要求
    const response = await axios.post('/api/register', data)

    // サーバのレスポンス情報で処理を分けている
    if (response.status === CREATED) {
      context.commit('setApiStatus'true)
      context.commit('setUser', response.data)
      return false
    }

    context.commit('setApiStatus'false)
    if (response.status === UNPROCESSABLE_ENTITY) {
      context.commit('setRegisterErrorMessages', response.data.errors)
    } else {
      context.commit('error/setCode', response.status, { root: true })
    }
  },

  // ログイン系
  async login(context, data) {
    context.commit('setApiStatus'null)
    const response = await axios.post('/api/login', data)

    if (response.status === OK) {
      context.commit('setApiStatus'true)
      context.commit('setUser', response.data)
      return false
    }

    context.commit('setApiStatus'false)
    if (response.status === UNPROCESSABLE_ENTITY) {
      context.commit('setLoginErrorMessages', response.data.errors)
    } else {
      context.commit('error/setCode', response.status, { root: true })
    }
  },

  // ログアウト
  async logout(context) {
    context.commit('setApiStatus'null)
    const response = await axios.post('/api/logout')

    if (response.status === OK) {
      context.commit('setApiStatus'true)
      context.commit('setUser'null)
      return false
    }

    context.commit('setApiStatus'false)
    context.commit('error/setCode', response.status, { root: true })
  },

  // ログインユーザーチェック
  async currentUser(context) {
    context.commit('setApiStatus'null)
    const response = await axios.get('/api/user')
    const user = response.data || null

    if (response.status === OK) {
      context.commit('setApiStatus'true)
      context.commit('setUser', user)
      return false
    }

    context.commit('setApiStatus'false)
    context.commit('error/setCode', response.status, { root: true })
  }
}

export default {
  namespaced: true,
  state,
  getters,
  mutations,
  actions
}

URLから、dispathされ、actionに渡されて、actionが起動、そして、APIを起動します

ログインを見てみましょう

  // ログイン系
  async login(context, data) {
    context.commit('setApiStatus'null)
    const response = await axios.post('/api/login', data)

    if (response.status === OK) {
      context.commit('setApiStatus'true)
      context.commit('setUser', response.data)
      return false
    }

    context.commit('setApiStatus'false)
    if (response.status === UNPROCESSABLE_ENTITY) {
      context.commit('setLoginErrorMessages', response.data.errors)
    } else {
      context.commit('error/setCode', response.status, { root: true })
    }
  },

context.commit('setApiStatus', null) ミューテーションを呼び出します

 例では setApiStatus に null をセットします

const response = await axios.post('/api/login', data)

 例ではloginコントローラが呼び出される

画面については次回になります


2021年4月17日土曜日

稲毛海浜公園散策(2021年4月10日)

今週は気温が上下して、暑かった寒かったり、服装も難しいし、朝晩の寒暖差にも参る

新型コロナウィルスといい、自然は人間に厳しい

変異型が猛威を振るいそう、これまでと違いやはり、人との交流は少なくした方がよさそう


東京オリンピックは、新型コロナウィルスの感染者が増えているので、当然、中止のほうが良いと思う。
しかし、希望として東京オリンピックを開催することは良いと思う。
パンドラの箱ではないが、希望をもって人が生活するほうが、人はさらに努力する

池江 璃花子選手の復活ぶりを見ていると、病気でも希望をもって練習をし、代表選手を水から勝ち取っている姿には感動する。

人の生き方として最高です。

そう思うと、オリンピックを開催することは人類の希望なのかもしれない。
感染者が増えて中止になるかもしれないが、開催日まで、希望をもって行動してほしい

人は努力する方向を間違わなければ、報いられる

チューリップ




2021年4月15日木曜日

PHP:Laravel-07

Vueを利用している参照としているのは、

参考にしているもの

1.インストール

composer create-project laravel/laravel プロジェクト名

cd プロジェクト名

php artisan serve

これでローカルでWeb画面が開けばインストール完了

2.Laravel8 (laravel/ui)でのLogin機能の実装用

LaravelはJavaScriptやCSSプリプロセッサの使用を規定してはいませんが、開発時点の元としてほとんどのアプリケーションで役立つだろうBootstrapやReact、Vueを提供しています。これらのフロントエンドパッケージをインストールするため、LaravelはNPMを使用しています。

Laravelが提供するBootstrapとVueのスカフォールドは、Composerを使いインストールする

>composer require laravel/ui

 laravel/uiパッケージをインストールできたら、ui Artisanコマンドを使いフロントエンドのスカフォールドをインストールします。

// 基本的なスカフォールドを生成

>php artisan ui vue

// ログイン/ユーザー登録スカフォールドを生成

>php artisan ui vue --auth

3.Vue Router

>npm install --save-dev vue-router


下記は必要事項のみを記載している。
自ら勉学し、苦労することによって知恵が身につきます
参考のURLでは動かない時があるので、そこは自ら学習して起動するようにしましょう

4.マイグレーション

■テーブルの作成

>php artisan make:migration create_photos_table --create=photos

>php artisan make:migration create_likes_table --create=likes

>php artisan make:migration create_comments_table --create=comments


■マイグレーション

>php artisan migrate


5.モデルの作成

>php artisan make:model Photo

>php artisan make:model Comment


6.リクエストの作成

>php artisan make:request StoreComment

>php artisan make:request StorePhoto  


7.シンボリックリンクの作成

アップロードしただけでは、ブラウザからアップロードしたファイルを閲覧することはできません。ブラウザからサーバ上のファイルにアクセスするためには、Laravelインストールディレクトリの下にあるpublicディレクトリの下に保存する必要があります。しかし、アップロードしたファイルは/storage/appの下にあるためアクセスすることができません。/publicディレクトリと/storage/appディレクトリとの間でリンクを持たせる必要があります。

Laravelではリンクを貼る設定を行う機能も備えています。

php artisan storage:linkを実行します。

>php artisan storage:link

基本的な作成はこれまでと変わらず。

今後は必要なことや、技術的なこと記載させていただきます。


2021年4月13日火曜日

PHP:Laravel-06

今回は参照としているのは、
参考にしているもの

学習のポイントはエラーの出し方やログイン情報です。

DB内のテーブル情報を作り直す便利なコマンドは

>php artisan migrate:fresh

項目などを追加したり、削除するにも便利です

1.インストール

composer create-project laravel/laravel プロジェクト名

cd プロジェクト名

php artisan serve

これでローカルでWeb画面が開けばインストール完了

2.Laravel8 (laravel/ui)でのLogin機能の実装用

>php artisan ui bootstrap --auth

3.フロントエンドパッケージインストール

laravel/uiのvueベースをインストールした際に、必要なフロントエンドパッケージがpackage.jsonに追記されました。

bootstrap、jqueryなどが追記されています。

これらのパッケージをインストールします。

>npm install

4.フロントエンドビルド実行

必要なパッケージは全てインストール完了したので、最後にフロントエンドソースコードをビルドしてみます。

これは毎回必要です

>npm run dev

このコマンドを実行することで、Laravel Mixのビルド処理が実行され、コンパイルされたjs、cssが/public/js public/cssに出力されます。

日本語の処理は参考としているURLをご覧ください。

5.ログイン状態の取得

Auth クラスの check メソッドでログインしているかどうかを確認することができます 。
アクセスしたユーザーがログインしていれば Auth::check() は true を返し、ログインしていなければ false を返します。

テンプレートではこの Auth::check() を利用してログインしていた場合の要素とログインしていない場合の要素を出し分けています。

@if(Auth::check())

  <!-- ログインしていた場合 -->

@else

  <!-- ログインしていない場合 -->

@endif

Auth::check() とは逆の働きをする guest メソッドも存在します。つまり Auth::guest() はユーザーがログインしていない場合に true を返します。


ログインユーザーの取得

Auth::user() でログイン中のユーザーを取得できます。返却値はログインユーザーの情報が入った User モデルのインスタンスです。


Auth::check() や Auth::user() はコントローラーなどでも使用することができます。実際に後述の処理でも使用します。便利なメソッドですので覚えておきましょう。


ログアウト

次にログアウト処理を実装します。

@if(Auth::check())

  <script>

    document.getElementById('logout').addEventListener('click', function(event) {

      event.preventDefault();

      document.getElementById('logout-form').submit();

    });

  </script>

@endif

6.ページに認証を求める

アプリケーションの利用にログイン認証を求める機能を実装します。
ログインしないとフォルダやタスクの作成・閲覧ページにアクセスできないようにします。

ページに認証を求める処理はミドルウェアを用いて実現します。ミドルウェアとは、ルートごとの処理に移る前に実行されるプログラムでした。認証状態の確認はさまざまなルートに共通して実行したい処理なのでミドルウェアで実現するのに適しています。

認証を求めるミドルウェアはデフォルトで用意されていますので、routes/web.php でルートにミドルウェアを適用します。

Route::group(['middleware' => 'auth'], function() {
    # ホームページ機能
    Route::get('/'
        'App\Http\Controllers\HomeController@index')->name('home');

    # フォルダ作成機能
    Route::get('/folders/create'
        'App\Http\Controllers\FolderController@showCreateForm')
            ->name('folders.create');
    Route::post('/folders/create'
        'App\Http\Controllers\FolderController@create');

    Route::group(['middleware' => 'can:view,folder'], function() {
        # タスクリスト機能
        Route::get('/folders/{folder}/tasks'
            'App\Http\Controllers\TaskController@index')->name('tasks.index');      

ミドルウェアは 'auth' という名前で指定されていますが、app/Http/Kernel.php というファイルに実際のクラスと名前の定義があります。

protected $routeMiddleware = [

    'auth' => \App\Http\Middleware\Authenticate::class,

    // ...

];

このミドルウェアはアクセスしたユーザーの認証状態をチェックして、ログインしていたらそのままコントローラーメソッド(または次のミドルウェア)に処理を渡します。ログインしていなければログイン画面にリダイレクトさせます。

7.ログイン前のみ閲覧できるページ

認証「されていない」ことを確かめるミドルウェアを編集します。

ログインページや会員登録ページはログインしていないときにだけアクセスできるべきですね。すでにログインしているユーザーがそのようなページにアクセスすることを防ぐミドルウェアは用意されていますが、一部編集する必要があります。

app/Http/Middleware/RedirectIfAuthenticated.php 

public function handle($request, Closure $next, $guard = null)
    {
        if (Auth::guard($guard)->check()) {
            return redirect('/');
        }

        return $next($request);
    }

RedirectIfAuthenticated ミドルウェアは会員登録コントローラーやログインコントローラーのコンストラクタで適用されています。

RegisterController.php

public function __construct()

{

    $this->middleware('guest');

}

LoginController.php

public function __construct()

{

    $this->middleware('guest')->except('logout');

}

'guest' という名前は Kernel.php で定義されています。

Kernel.php

protected $routeMiddleware = [

    // ...

    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,

    // ...

];

参考にすべき情報があると、知っているだけで知識と知恵が備わります。
今回学習すべき点はルーティングやログインに関してです。
エラーの出し方がわかると、次にVUEと合体させて学習し、実務に活かしましょう。


2021年4月12日月曜日

PHP:Laravel-05

Vueと同時にしていると、Laravel自体の特徴がうまく使えないので、
改めてプロジェクトを作成することにする

まずは設計

1.機能設計

ToDo アプリが持つ機能の箇条書きは以下の通りです。

  • ユーザーはタスク(ToDo)を作成することができる。
  • タスクはタイトル、期限日、状態を持つ。
  • タスクの状態とは、「未着手」「着手中」「完了」の3種類である。
  • ユーザーはタスクを一覧表示することができる。
  • ユーザーはタスクのタイトル、期限日、状態を編集することができる。
  • タスクはフォルダに分類して管理する。
  • そのため、ユーザーはフォルダを作成することができる必要がある。
  • また、ユーザーはフォルダの一覧を表示できる必要がある。
  • ユーザーごとにアカウントを持ち、ログインしたユーザーは自分のフォルダおよびタスクだけを閲覧または編集することができる。
  • ユーザーはパスワードを忘れた場合には再登録することができる。

2.画面設計

画面は省略

2.1.タスク一覧ページ

出入力

項目出入力
フォルダ タイトル出力
タスク タイトル出力
タスク 状態出力
タスク 期限日出力

アクション

項目種類働き
フォルダ作成リンクフォルダ作成ページに遷移する。
タスク作成リンクタスク作成ページに遷移する。
タスク編集リンクタスク編集ページに遷移する。

2.2.フォルダ作成ページ

出入力

項目出入力
フォルダ タイトル入力

アクション

項目種類働き
送信ボタンフォルダを新規作成し、タスク一覧ページに遷移する。

2.3.タスク作成ページ

出入力

項目出入力
タスク タイトル入力
タスク 状態入力
タスク 期限日入力

アクション

項目種類働き
送信ボタンタスクを新規作成し、タスク一覧ページに遷移する。

2.4.タスク編集ページ

出入力

タスク編集ページでは登録済みの情報を画面に出力しておく必要もあります。

項目出入力
タスク タイトル出力
タスク 状態出力
タスク 期限日出力
タスク タイトル入力
タスク 状態入力
タスク 期限日入力

アクション

項目種類働き
送信ボタンタスクを編集し、タスク一覧ページに遷移する。

2.5.ヘッダー

画面をまたいで共通で定義されるパーツもあるでしょう。

今回はヘッダーナビゲーションがすべての画面に共有して配置されます。

出入力

項目出入力
アプリ名出力
ユーザー名出力

アクション

項目種類働き
ログアウトリンクログインしている時のみ表示する。
ログアウト処理を行い、ログイン画面に遷移する。
会員登録リンクログインしていない時のみ表示する。
会員登録ページに遷移する。
ログインリンクログインしていない時のみ表示する。
ログインページに遷移する。

3.URL設計

URLメソッド処理
/folders/{フォルダID}/tasksGETタスク一覧ページを表示する。
/folders/createGETフォルダ作成ページを表示する。
/folders/createPOSTフォルダ作成処理を実行する。
/folders/{フォルダID}/tasks/createGETタスク作成ページを表示する。
/folders/{フォルダID}/tasks/createPOSTタスク作成処理を実行する。
/folders/{フォルダID}/tasks/{タスクID}/editGETタスク編集ページを表示する。
/folders/{フォルダID}/tasks/{タスクID}/editPOSTタスク編集処理を実行する。

4.テーブル定義

フォルダテーブル

カラム論理名カラム物理名型の意味
IDidSERIAL連番(自動採番)
タイトルtitleVARCHAR(20)20文字までの文字列
作成日created_atTIMESTAMP日付と時刻
更新日updated_atTIMESTAMP日付と時刻

タスクテーブル

カラム論理名カラム物理名型の意味
IDidSERIAL連番(自動採番)
フォルダIDfolder_idINTEGER数値
タイトルtitleVARCHAR(100)100文字までの文字列
状態statusINTEGER数値
期限日due_dateDATE日付
作成日created_atTIMESTAMP日付と時刻
更新日updated_atTIMESTAMP日付と時刻