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

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

2.Linuxサーバの構築/運用基礎

LPIC Lv2の範囲(ストレージ管理、ネットワーク管理、死活管理)など。Linuxサーバの基本はこの項目でカバー、Apache,Nginx、Samba, iptables, DNS, S.M.A.R.Tなどもこの項目で扱う。

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にない機能を追加されている。 そのためオブジェクト管理を主体とした監視環境を提供する。

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

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などのアーキテクチャに対応している。

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
# マウントベース以下に作成されるディレクトリ マウントオプション デバイスファイル名

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スイッチが使用される。

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識別を行う

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]

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に変更する。

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

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

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

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パスワードハッシュ値の生成

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