2023/09 CTOへの日報まとめ

日報




2023-09-01

Webシステムに対する攻撃を防ぐ手段の1つである「IDS・IPS」について、知見を深めることができました。

IDS・IPSには、通信を監視するネットワーク型と、サーバー上のユーザーの動きを監視するホスト型の2種類がある。

【ネットワーク型】

  • IDS(Intrusion Detection System)とは、不正侵入検知システムのことであり、ネットワーク上の通信を監視して、不正なアクセスやその兆候を検知し、管理者などに通知する役割を持つ。
  • IPS(Intrusion Prevention System)とは、不正侵入防止システムのことであり、ネットワーク上の通信を監視して、不正なアクセスをブロックする役割を持つ。また管理者への通知も行う。

【ホスト型】

  • サーバーにインストールするソフトウェアとなっており、ユーザーの操作記録やファイルの変更履歴を監視することで不正な操作を検知する。

ネットワーク型のIDS・IPSにおける不正アクセスの検知方法には、シグネチャ型とアノマリー型がある。

  • シグネチャ型(不正検知型):監視対象の通信とシグネチャ(既知の攻撃手法における通信パターンが登録されたDB)を比較し、シグネチャに登録されたパターンと一致する通信を不正アクセスと判断し、検出する。
  • アノマリー型(異常検知型):普段の通信とは大きく異なる通信や、通常は発生しないような通信を不正アクセスと判断し、検出する。
2023-09-04

「シングルインヘリタンス」という用語について知ることができました。

  • シングルインヘリタンス(Single Inheritance)とは、プログラミング言語のクラスの継承モデルの一つで、あるクラスが一度に継承できる親クラスが1つだけであるという特性を指す
  • PHPはシングルインヘリタンスを採用している
  • これに対して、複数のクラスを同時に継承できる言語の特性はマルチインヘリタンス(Multiple Inheritance)と呼ばれる
  • マルチインヘリタンスをサポートする言語としては、C++がある

シングルインヘリタンスの利点

  • シンプル:インヘリタンスの関係が1つの親クラスだけから成るため、概念的に理解しやすく、コードの追跡も容易
  • 名前の衝突の回避:複数のクラスからの継承による名前の衝突や曖昧性が生じることがないため、名前の解決がシンプル

一方で、シングルインヘリタンスの制約として、複数のクラスから振る舞いやプロパティを再利用する場合に制限がかかる。この制約を緩和するために、PHPでは「trait」といった機能が提供されている。

2023-09-05

PHPはシングルインヘリタンスの言語であり、一度に複数のクラスを継承することはできない。この制限を解決するための機能である「trait」について理解することができました。

  • PHPの「trait」は、PHP5.4以降で利用可能な機能
  • 複数クラス間でメソッドやプロパティを共有する方法を提供する

「trait」の主な特徴

  • 再利用:traitは、メソッドやプロパティを定義し、それを異なるクラスに挿入(組み込む)するためのもの
  • 可変性:trait内で定義されたメソッドは、それを使用するクラスでオーバーライドすることが可能
  • 複数のtraitの組み合わせ:1つのクラスは、複数のtraitを同時に使用することが可能

以下、簡単なtraitの使用例

trait SayWorld {
public function sayHello() {
echo ‘Hello, World!’;
}
}

class Base {
public function sayHello() {
echo ‘Hello, Base Class!’;
}
}

class MyHelloWorld extends Base {
use SayWorld;
}

$obj = new MyHelloWorld();
$obj->sayHello(); // “Hello, World!” と出力される

この例では、MyHelloWorldクラスはBaseクラスを継承しているが、SayWorld traitを使用しているため、sayHelloメソッドはtraitのものが使用される。traitは、コードの再利用のための強力なツールだが、過度に使用するとコードの可読性や保守性が低下する可能性があるため、適切に使用することが重要。使いこなすことができれば、強力なツールだと感じました。

2023-09-06

DBのCHECK制約に関して、理解することができました。

  • カラムにCHECK制約を設けることで、指定した条件を満たす値しかカラムに格納することができなくなる

CREATE TABLE users (
id INT PRIMARY KEY,
name varchar(255),
age INT CHECK(age >= 18)
); // ageが18以上ではない場合、エラーになる

2023-09-07

PHPのmt_rand関数について知ることができました。

  • mt_rand関数とは、rand関数より良い乱数ジェネレータとして知られるMersenne Twister(メルセンヌ・ツイスター)アルゴリズムを利用して、ランダムな整数を生成するPHPの関数のこと。
  • 引数なしで呼んだ場合、mt_rand関数は、0からmt_getrandmax関数(通常2147483647)の間のランダムな整数を返す
2023-09-08

PHPコードにおいて、関数内でstaticを使用して変数を定義した際の挙動について知ることができました(static $count = 0;)

staticを使用して変数を定義すると、関数の呼び出しごとに初期化されない。関数の初回呼び出し時に初期化され、その後の関数呼び出し間でその値を保持する。これを静的変数(static変数)という。

2023-09-11

土曜日に行ったH社のデータ移行作業にて、SQLのELT関数とFIELD関数の使い方を知ることができました。

MySQL ELT関数とFIELD関数

2023-09-12

DBの制約に関して、制約名の一部に用いられる「ibfk」の意味が分からなかったので、調べました。「InnoDB Foreign key」の略だと知ることができました。

2023-09-13

若干、理解が曖昧だった「ホスト型仮想化」と「コンテナ型仮想化」について理解することができました。

ホスト型仮想化とは、ホストOSにハイパーバイザーと呼ばれる仮想化を実現する機能を用意して行う仮想化のことを言う。ハイパーバイザーを提供するソフトウェアとしては、Virtual Box、Hyper-V、VMwareなどがある。ホストOSに依存せず、仮想マシンに好きなOSをインストールできる点や、仮想マシン間の分離レベルが高い点などがコンテナ型仮想化とは異なる。

コンテナ型仮想化
Dockerといったコンテナ仮想化を実現するソフトウェアを用いて行う仮想化のこと。Dockerの場合、Dockerエンジンによって、コンテナの作成、起動、削除等の管理が行われる。ホスト型とは異なり、ゲストOSというものはなく、ホストOSのカーネルを共有してアプリケーションが実行される。

2023-09-14

「参照整合性」と「参照整合性の崩壊」という用語の意味を理解することができました。

参照整合性:外部キーが指す参照先カラムが存在する状態のこと
参照整合性の崩壊:参照整合性が維持できなくなること

2023-09-19

「ホスト型仮想化」と「コンテナ型仮想化」の4つの違いについて、知ることができました。

違い1:仮想化のオーバーヘッド

  • ホスト型仮想化:リソース(CPUやメモリの使用率)の面でオーバーヘッドが多く、起動や停止に時間がかかる
  • コンテナ型仮想化:コンテナにはアプリケーションの実行に必要なものだけを含み、またホストOSのカーネルを使用するため、動作が早く、リソースの使用も少なく済む

違い2:アプリケーション実行の再現性

  • ホスト型仮想化:仮想マシン毎に独立した環境を持っており、それぞれの環境にライブラリやミドルウェアをインストールする必要がある。そのため、ライブラリのバージョン差異などにより、環境差異が生まれ、同じ環境を用意したつもりが動かないといったことが発生しやすい
  • コンテナ型仮想化:特定のアプリケーションを動作させるために必要なものは、dockerイメージにまとまっており、同じイメージからコンテナを起動する限り、環境が変わっても同様に動作する。

違い3:OSの自由度

  • ホスト型仮想化:仮想マシン上で任意のOSを動作させることが可能
  • コンテナ型仮想化:コンテナはホストOSのカーネルを使用して動作する。例えば、Windows上で直接Linuxコンテナを動かすことはできない。

違い4:分離レベル

  • ホスト型仮想化:ハードウェアレベルで仮想化されており、ホストOSや仮想マシン間の分離レベルが高く、それぞれが影響を受けにくい
  • コンテナ型仮想化:コンテナを起動すると、ホストOSの1プロセスとして動作する仕組みとなっているため、ホスト型仮想化と比べると分離レベルが低い
2023-09-20

バインドマウントについて、概要を理解することができました。

  • バインドマウントとは、ホストマシンのファイルやディレクトリをコンテナのファイルシステムにマウントする機能のこと
  • バインドマウントを使用することで、コンテナがホストマシンのデータを直接読み書きすることが可能
  • ホストとコンテナ間でデータをリアルタイムに同期するため、ホスト側でファイルを編集すると、その変更はコンテナ内に即時反映される
2023-09-21

Kubernetes(K8s ケーエイツ)について理解することができました。

  • Kubernetes(K8s ケーエイツ)とは、コンテナのオーケストレーションツールのこと
  • オーケストレーションツールとは、主に複数のコンテナを効率良く管理するためのツールのこと
  • 様々なコンテナが多数動作する環境においては、使用するイメージ、コンテナへのCPUやメモリの割り当て、コンテナ停止時の復旧処理、パスワードなどの秘匿情報の管理、ストレージの割り当て、コンテナの稼働状況の監視など、様々なことを考慮する必要があり、管理が難しい。
  • これを効率良く管理するためのツール・ソフトウェアがKubernetesである
  • コンテナを管理するための設定ファイルを書くことで、様々なコンテナ管理機能を利用することができる
2023-09-22

負荷分散の方法としてシンプルなDNSラウンドロビン方式について知ることができました。

DNSラウンドロビン方式は、負荷分散や冗長化を目的として、一つのドメイン名に対して複数のIPアドレスを関連付けるシンプルな方法。クライアントがドメイン名のIPアドレスを問い合わせる際、DNSサーバーは関連付けられたIPアドレスのリストの中から順番に1つを選んで返す。これにより、トラフィックが複数のサーバーに均等に分散される効果がある。

2023-09-25

Insecure Deserializationという攻撃手法を知りました。

Insecure Deserializationとは、悪意のあるシリアライズされたデータを外部から受け取り、それをデシリアライズすることで、意図しないオブジェクトを生成してしまい、それによりDoS攻撃やアプリケーションのロジックの不正操作等を引き起こす攻撃手法のこと。

2023-09-26

XML eXternal Entity(XXE)攻撃について知ることができました。

XML eXternal Entity(XXE)攻撃とは、XML処理の脆弱性を利用して外部エンティティを注入することで、情報漏洩やサービス運用の妨害などに繋がる攻撃手法のこと。具体的には、XMLパーサーが外部エンティティを読み込む設定になっていると、攻撃者は外部リソースへの参照を含む悪意のあるXMLドキュメントを提供することができる。これにより、機密情報の読み取りや内部システムへの攻撃、DoS攻撃などの悪影響を引き起こすことが可能となる。

特にウェブアプリケーションやAPIなどでXMLを活用している場合に注意が必要とのことですが、近年のアプリでXMLが絡む場所はあまりないように感じるため、そこまで意識しなくてもよい攻撃手法なのかなとも思いました。

2023-09-28

Open Redirection(オープンリダイレクション)という攻撃手法を知りました。

Open Redirection(オープンリダイレクション)とは、攻撃者がユーザーを任意の外部URLにリダイレクトさせる攻撃手法のこと。例えば、 https://example.com/redirect?url=https://trustedwebsite.com といったような形で、URLパラメータを使用してリダイレクトを行っている場合、攻撃者はURLパラメータを書き換えることで、ユーザーを不正なウェブサイトにリダイレクトさせることができる(例:https://example.com/redirect?url=https://maliciouswebsite.com )。この攻撃を回避する方法としては、下記などが挙げられる。

  • ユーザー入力に基づくリダイレクトは避ける
  • リダイレクト先のURLを制限するためのホワイトリストを作成する。ホワイトリストにないURLへのリダイレクトは拒否する
  • リダイレクト先のURLをユーザーから受け取る場合、そのURLが安全であることを確認する
2023-09-29

Clickjacking(クリックジャッキング)という攻撃手法を知りました。

Clickjackingとは、ユーザーからは見えない透明なリンクやボタンを用意し、ユーザーの意図しない動作(攻撃者が意図した別のアクション)を実行させる攻撃手法のこと。UI Redress Attackとも呼ばれる。