2021年4月27日火曜日

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

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

 5.6.1                  概要

IDSはIntrusion 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

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

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