これは、このセクションの複数ページの印刷可能なビューです。 印刷するには、ここをクリックしてください.
2.Linuxサーバの構築/運用基礎
- 1: 1.キャパシティプランニング
- 2: 2.Linuxカーネル
- 3: 3.システムの起動と管理
- 4: 4.デバイスとファイルシステム
- 5: 5.高度なストレージ管理
- 6: 6.ネットワーク管理
- 7: 7.システムのメンテナンス
- 8: 8.DNS
- 9: 9.Webサーバとプロキシサーバ
- 10: 10.ファイル共有
- 11: 11.ネットワーククライアントの管理
- 12: 12.メールサービス
- 13: 13.システムセキュリティ
1 - 1.キャパシティプランニング
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
- システム全体CPU使用率の表示
- 物理メモリ
- システム全体物理メモリ使用率の表示
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のプロセスのみ実行する |
実行した結果は以下の通り。
htopコマンド
全体およびプロセスごとのCPUやメモリの使用状況を一定時間ごとに更新して表示するコマンド。
htop
vmstatコマンド
物理メモリやスワップ領域の詳細な情報やプロセスやCPUの統計情報などを継続的に表示するコマンド。 スワップやブロックのI/Oの値を出力可能。
vmstat [表示間隔(秒) [回数]]
iostatコマンド
CPUの利用状況およびディスクI/Oの状況などを継続的に表示するコマンド。
iostat [オプション] [表示間隔(秒) [回数]]
オプション | 説明 |
---|---|
-c | CPU使用率のみを出力する |
-d | ディスクI/O情報のみを出力する |
-k | ブロック単位ではなくKB単位で表示する |
-t | 時間を表示する |
iotopコマンド
ディスクI/Oの情報がプロセスごとに表示するコマンド。
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 |
-u | CPU使用率を表示 | 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コマンドのオプション ]
オプション | 説明 |
---|---|
-j | JSON形式で出力 |
-x | XML形式で出力 |
-t | ロケール日時で表示 |
– | sarコマンドに渡す |
uptimeコマンド
システムの稼働時間や負荷平均などを表示するコマンド。
top
の上部とほぼ同じ。
uptime
表示されるload average
は1, 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 PID | PIDで選択 |
-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 | すべてのファイルシステムの情報を表示 |
-h | 1MB=1024MBで表示 |
-H | 1MB=1000KBで表示 |
-i | iノードの使用状況を表示 |
-l | ローカルファイルシステムの表示 |
-m | MB単位で表示 |
-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.conf
でLoadPluginで指定する。
Nagios
サーバの動作確認(死活監視)、ネットワークサービス状態/リソース使用状況の監視が行えるOSSソフトウェア
MRTG
ネットワークやリソースの使用状況を監視しグラフ化するツール。 死活監視は行えない。
Catcti
ネットワークやリソースの使用状況を監視しグラフ化するツール。 WEBブラウザ上で設定を行うことができる。 MRTGより設定が容易という特徴がある。
Icinga2
Nagios互換の監視ツール。 WebAPIを使って監視情報のやりとりを行うといったNagiosにない機能を追加されている。 そのためオブジェクト管理を主体とした監視環境を提供する。
2 - 2.Linuxカーネル
2.1. カーネルの構成要素
2.1.1. カーネルバージョン
カーネルにはバージョン番号が付けられており、「3.X.Y」の形のようにあらわされる。
- 2.6より前の場合
- Xの部分が偶数で安定版、奇数で開発版を示す
- Yの部分が開発版の修正版を表す場合がある
- 2.6以降の場合
- 正式版かどうかの判断に番号の偶奇は関係ない
- -の後に続く記号によって判断する
なおカーネルバージョンを知るにはuname -r
コマンド、もしくは/proc/version
の確認で可能となる。
またusr/src/kernel/hogehoge
のmakefileを確認することでも可能。
Linuxカーネルのカテゴリ
リリースされるLinuxカーネルは主に以下の4つのカテゴリに分類される。
- prepatch(プレパッチ) … リリース候補
- mainline(メインライン)… prepatchの後にリリースされる正式版
- stable(ステーブル)… mainlineの後にリリースされる安定版
- longterm(ロングターム) … stableから選ばれ新しいカーネルに行われたものと同様のバグフィックスが行われるリリース
Linuxカーネルのアーカイブの内容
Linuxカーネルはtar.gz
形式、またはtar.xz
形式でアーカイブして配布され以下内容が含まれる。
- カーネルソース
- カーネルモジュールのソース
- ドキュメント
- Makefile
2.1.2. カーネルイメージ
カーネルイメージはイメージファイルとして格納されたLinuxカーネルのこと。
カーネルイメージは/boot/vmlinuz*
という名称で保存されている。
カーネルイメージの形式
カーネルイメージにはzImageとbzImageがある。
なおこれらは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. カーネルコンパイルとインストール
カーネルのコンパイル手順は以下の通り。
- カーネルソースを用意する
- カーネルコンフィギュレーションの設定
- カーネルをコンパイル
- カーネルモジュールをコンパイル
- カーネルとカーネルモジュールを配置
- ブートローダの設定
カーネルソースの準備
カーネルソースコードは/usr/src/linux*
に保存される。
カーネルソースコードのディレクトリには以下ディレクトリがある。
ディレクトリ名 | 説明 |
---|---|
arch | アーキテクチャ(i368, x86_64)に依存したコード |
configs | それぞれの.config |
crypto | 暗号処理関数 |
drivers | デバイスドライバ関連 |
fs | 仮想ファイルシステム/システムファイル関連 |
include | C言語のincludeファイル |
init | 初期化用コード |
ipc | SystemV互換プロセス間通信関連ファイル |
kernel | 各種カーネル機能 |
lib | 各種モジュール関連 |
mm | メモリ管理関連 |
net | 各種ネットワークプロトコル関連 |
scripts | カーネル作成支援コマンド |
Documentations | 各種ドキュメント |
ファイル | 説明 |
---|---|
.config | カーネルのビルド設定ファイル |
Makefile | makeの設定やカーネルバージョンの記載 |
なおxzファイルで圧縮されたカーネルソースの展開例は以下の通り。
xz -dc ファイル名.xz | tar xvf -
カーネルコンフィギュレーションの設定
カーネルの設定ファイルは.config
に記載される。
カーネルの設定を新しい設定に反映させる場合は以下コマンドを実施する。
make oldconfig
このコマンドでは新しいカーネルで付け加えられた機能のみに対して問い合わせを行い、既存設定はそのままとなる。
カーネルの設定
カーネルの設定ではカーネルの機能を直接カーネルに埋め込むか、埋め込まずにローダブルモジュールにするか、組み込まないか設定が可能。
make config # カーネルオプションごとに答える形で設定
make menuconfig # メニュー形式で表示されているオプション項目を選択して設定
make oldconfig # 現在のカーネルの設定を引き継ぐ
make xconfig # KDE上で設定
make gconfig # GNOME上で設定
なおmake config
やmake menuconfig
で行った設定は/usr/src/linux/.config
に保存される。
カーネルとカーネルモジュールのコンパイル
make
コマンドを引数なしで実行するとカーネル、カーネルモジュール共にコンパイルされる。
make
カーネルとカーネルモジュールのインストール
カーネルモジュール(.ko
)を適切なディレクトリに保存するにはmake modules_install
コマンドを実行する。
なお保存先は/lib/modules/カーネル
以下に保存される。
またカーネルのインストールはmake install
コマンドで行える。
このコマンドは以下処理を行う。
- /boot以下にビルドされたカーネルをバージョンをファイル名にしてコピー
- 初期RAMディスクが必要な場合は作成
- ブートローダの設定ファイルに新しいカーネル用の起動設定を追加
makeコマンド
make
コマンドはソースコマンドをコンパイル、ビルドなどを行うコマンド。
make [ターゲット] 対象
ターゲット | 説明 |
---|---|
clean | .config以外のファイルを削除する |
all | すべてのビルドを実施 |
modules | カーネルモジュールをすべてビルドする |
modules_install | カーネルモジュールをインストール |
rpm | カーネルをビルド後にRPMパッケージを作成 |
rpm-pkg | ソースRPMパッケージの作成 |
defconfig | デフォルト状態の設定ファイルを作る |
mrproper | カーネルツリーの初期化(設定ファイルもクリア可能) |
なおカーネルのビルドと再構築はソールから以下のような手順で行う。
- 設定の初期化(
make mrproper
) - 設定を行う(
make oldconfig
) - ビルドを行う(
make all
) - モジュールをインストール(
make modules_install
) - カーネル本体をインストール(
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
- 素のファイルシステムを圧縮したもの
gunzip
、mount -o loop
でイメージの確認が可能
- initramfs
- cpioアーカイブをgzip圧縮したもの
gunzip
、cpio
でイメージの確認が可能
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種類がある。
それぞれファイルタイプはbとcとなる。
- ブロックデバイス
- バッファを持ちランダムアクセスが可能
- ブロック単位でアクセス可能
- ハードディスク、フロッピーディスク、RAMディスク、RAIDボリュームなど
- キャラクタデバイス
- ランダムアクセスが不可能なデバイス
- キーボード、マウス、プリンタなど
なおカーネルが認識しているデバイスは/proc/devices
ファイルで確認可能。
2.5.3. udev
udevはデバイスファイルを管理するための仕組み。 実際にはudevとsysfsが連携して管理するようになっている。 udevの仕組みは以下の通り。
- ハードウェアの接続をカーネルが検知
- 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.システムの起動と管理
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をどこからどのようにロードするか)を管理するプログラム |
efibootmgr | UEFIブートマネージャーの起動エントリをOS上から操作するコマンド |
MBR/GPT
BIOSでは起動デバイスの最初のセクタであるMBR(マスターブートレコード)でパーティションを管理する。 UEFIではGPTでパーティションを管理する。
GPTでは起動ドライブに2TB以上割り当てることができる特徴があり、またブートローダはESPに格納される。 UEFIシステムパーティションではFATまたはVFATでフォーマットされる。
ブートローダ
ブートローダはマスターブートレコードに格納されて部分(第1部分)とそこから呼び出される部分(第2部分)に分かれている。 動作としては第1部分が第2部分のブートローダをロードしそれを起動する。また第2部分のブートローダは指定したパーティションからカーネルをロードし制御を移す。
Linuxで使用されるブートローダにはGRUB Legacy、GRUB2がある。
カーネル
カーネルはinit(/sbin/init)を起動するもので、その過程で以下処理を行う。
- 組み込まれたハードウェアの検出
- メモリの初期化
- システムクロックの設定
- IRQの設定
- ルートパーティションのマウント
またカーネル起動中のメッセージはdmesgコマンドで確認可能。
3.1.2. SysVinitの概要
サービスが起動する仕組みはこれまでSysVinitが主流であったが、現在ではSystemdという仕組みが主流となっている。
SysVinit
SysVinitではLinuxシステムで最初に実行されるinitが/etc/inittab
に従いシステムに必要なサービスを順次起動するものであった。
initのPIDは1番となりすべてのプロセスはinitの子プロセス/孫プロセスとなる。
起動のプロセスは以下の通り。
- initが
/etc/inittab
を読み込む - initが
/etc/rc.sysinit
を読み込む - initが
/etc/rc
を実行する /etc/rc
が/etc/rcN.d
(Nはランレベル)ディレクトリ以下のスクリプトを実行する
なお/etc/inittab
の書式は以下の通り。
1:1245:respawn:/sbin/mingetty tty2
- 1 … ID
- 1245 … ランレベル
- respawn … アクション指示子
- /sbin/migetty tty2 … 処理
アクション指示子は以下の通り。
アクション指示子 | 意味 |
---|---|
boot | システム起動時に実行され、プロセスの終了を待たずに次の処理を実行 |
bootwait | システム起動時に一度実行され、プロセスが終了するまで次の処理を行わない |
ctrlaltdel | Ctrl,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)を作成する |
NN | 0~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
ランレベル | ターゲット |
---|---|
0 | poweroff.target |
1 | rescue.target |
2,3,4 | multi-user.target |
5 | graphical.target |
6 | reboot.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設定ファイルはUnit、Service、Installのセクションに分かれる。
ファイルの構成は以下例のようになる。
[Unit]
Descriptions=HogeHoge
After=syslog.target network.target
Conflicts=sendmail.service exim.service
[Service]
Type=forking
:
[Install]
WantedBy=multi-user.target
主なUnit設定ファイルのパラメータは以下の通り。
パラメータ | 説明 |
---|---|
Description | Unitの説明 |
Documentation | ドキュメントの場所 |
After | ここに書かれたUnit以降に起動する |
Before | ここに書かれたUnit以前に起動する |
Wants | ここに書かれたUnitが必要 |
Type | サービスのタイプ(simple, forking, oneshot, notify, dbus) |
ExecStartPre | startでの実行前に実行するコマンド |
ExecStart | startで実行するコマンド |
ExecReload | reloadで実行するコマンド |
ExecStop | stopで実行するコマンド |
WantedBy | systemctl enable |
RequiredBy | systemctl enable |
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の切り替え
- 複数バージョンのカーネルの使い分け
代表的なブートローダにはGRUBやLILOがある。
3.3.1. GRUB
GRUB(GRand Unified Bootloader)は多くのディストリビューションで標準利用されているブートローダ。 以下のような特徴がある。
- 多数のファイルシステムを認識可能
- シェル機能を搭載しコマンドにより高度管理が可能
GRUBには昔から使われているGRUB Legacyと新たに設計し直されたGRUB 2がある。
3.3.2. Grub Legacy
Grub Legacyは昔から使われている古いタイプのGRUB。 Grub Legacyは3つのステージで構成される。
ステージ | 説明 |
---|---|
1 | MBR内に配置されたステージ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_QUIET | trueでメニュー表示なし、falseであり |
GRUB_TIMEOUT | デフォルトOS起動までの秒数 |
GRUB_CMDLINE_LINUX_DEFAULT | ブートオプション |
GRUB_CMDLINE_LINUX | カーネルに渡すオプション |
3.3.4. 起動オプションの指定
ブートローダは起動時にカーネル/ブートローダのinitプログラムに渡すオプションパラメータを指定可能。 GRUBの場合はメニュー画面で「e」キーを押すとオプションパラメータを編集可能。
指定できるパラメータは以下の通り。
パラメータ | 説明 |
---|---|
init=パス | 指定したパスのコマンドを初期プログラムとして指定 |
mem=nM | 物理メモリの指定 |
nosmp | SMPマシンをシングルプロセッサとして動作させる |
noht | HyperThreading機構の無効化 |
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はいくつかのコンポーネントで構成される。
コンポーネント | 説明 |
---|---|
SYSLINUX | FATファイルシステムからカーネルを起動するプログラム |
ISOLINUX | ISO9660ファイルシステムからカーネルを起動するプログラム |
EXTLINUX | ext2/ext3/ext4ファイルシステムからカーネルを起動するプログラム |
PXELINUX | PXEを使ってネットワークブートするプログラム |
Isohybrid
Isohybridと呼ばれるシステムはUSBスティックなどでISOLINUXイメージのMBRコードを使ったブートを可能にし、ブロックデバイスの動作を提供するもの。 MBRコードとしてSYSLINUXのMBRコードであるisohdpfx.binが使用される。
UEFIのツール
ツール名 | 説明 |
---|---|
efiboot.img | UEFIでISOLINUXを使ってブートする際に使われるイメージ。FAT16で作成されている |
/EFI/BOOT/bootx64.efi | UEFIのブートマネージャー。標準ではUEFI起動時に読み込まれる |
Secure Boot | 署名の確認を行い、起動を制限する機能 |
shim.efi | セキュアブート時に最初に読み込まれるUEFIアプリケーション |
grubx64.efi | grubを起動する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.デバイスとファイルシステム
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
コマンドで利用可能。
またファイルシステムの種類は以下の通り。
タイプ | 説明 |
---|---|
ext2 | Linuxファイルシステムextの拡張したシステム |
ext3 | ext2にジャーナリングシステムを追加したもの |
ext4 | ext3の機能拡張をしたもの |
ReiserFS | Linux用のジャーナリングシステム |
JFS | IBMにより開発されたジャーナリングシステム |
XFS | SGIにより開発されたジャーナリングシステム |
Btrfs | Linux向け堅牢ファイルシステム |
ISO9660 | CD-ROM向けのファイルシステム |
UDF | DVDのファイルシステム |
F2FS | SSDなどフラッシュメモリ向け |
msdos | MS-DOS向けファイルシステム |
FAT/FAT32 | フラッシュメモリなどで使われる |
NTFS | windows NT/2000向け |
hpfs | OS/2のファイルシステム |
HFS | MacOS向けのシステム |
HFS+ | MacOS8.1以降 |
NFS | ネットワークファイルシステム |
CIFS | Windows2000以降 |
procfs | プロセス情報を扱う仮想ファイルシステム |
sysfs | デバイス情報を扱う仮想ファイルシステム |
tmpfs | 仮想メモリベースの仮想ファイルシステム |
devpts | 疑似端末を制御するための仮想ファイルシステム |
usbfs | USBデバイス監視用ファイルシステム |
cramfs | 組み込みデバイス向けの圧縮ファイルシステム |
マウントオプションは以下の通り。
オプション | 説明 |
---|---|
async | ファイルシステムのすべての入出力を非同期で行う |
sync | ファイルシステムのすべての入出力を同期で行う |
atime | ファイルへのアクセスごとにinodeのアクセス時刻を更新する |
relatime | ファイル更新/アクセスの一定時間後にアクセス時刻を更新する |
noatime | inodeのアクセス時刻を更新しない(ディスクアクセス高速化) |
auto | -aオプションでmountコマンドを実行したときにマウントする |
noauto | -aオプションでmountコマンドを実行したときにマウントしない |
defaults | デフォルト(async, auto, dev, exec, nouser, rw, suid) |
dev | ファイルシステム上のデバイスファイルを利用できる |
group | ユーザのグループがデバイスファイルの所有グループと一致すればマウント許可 |
exec | バイナリ実行の許可 |
noexec | バイナリ実行の禁止 |
suid | SUID, SGIDビットを有効化する |
nosuid | SUID,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あたりのバイト数を指定 |
-j | rootユーザ用の予約領域を%指定する |
-m 領域% | rootユーザ用の予約領域を%で指定する |
-n | パラメータ確認 |
-t タイプ | ファイルシステムのタイプを指定(ext2~ext4) |
なおデフォルト値は/etc/mke2fs.conf
で指定可能。
使用例
ブロックサイズを2048Byte、不良ブロックのチェックを行い、/dec/sda1
にext3ファイルシステムを作成する例
mke2fs -b 2048 -c -j /dev/sda1
ブロックサイズは平均低ファイルサイズが小さい場合は小さく、大きい場合は大きく設定する。 またinode1つ当たりのByte数は平均低名ファイルサイズを基準にしそれを超えないようにする。
ext3ファイルシステムの書き込みフロー
- 書き込み操作の発生
- メタデータ(inode番号など)の更新内容をログへ書き込み
- データとメタデータをディスクに書き込む
- ディスク書き込み後に該当ログを破棄する
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へ書き込みを行い場合の手順は以下の通り。
- CD-R/DVD-Rへ書き込むデータのファイルイメージの作成
- 作成したイメージファイルをライティングソフトで書きこむ
CD-ROMのファイルシステムはISO9660となる。
ファイルシステムはmkisofs
コマンドで作成を行う。
mkisofs [オプション] ディレクトリ名
オプション | 説明 |
---|---|
-b | ブータブルCDにする |
-o ファイル名 | ISO9660/UEFIイメージの指定 |
-J | jolietフォーマット |
-R,-r | RockRidgeフォーマット |
-T | RockRidgeフォーマットが使えないファイルシステムで正しいファイル名を維持する |
-udf | DVDなどで用いられる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パーティションを閉じる
暗号化してマウントする手順は以下の通り
cryptsetup create 名前 デバイスファイル名
で暗号化/dev/mapper/名前
にデバイスファイルが作成される- 上記デバイスファイルにファイルシステムを作成(
mkfs.ext4 /dev/mapper/名前
など) - マウントポイントの作成(
mkdir /mnt/名前
)、そしてマウントを行う(mount /dev/mapper/名前 /mnt/名前
)
アンマウントして暗号化を削除する手順は以下の通り。
unmount /dev/mapper/名前
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. ファイルシステムのチェック
ファイルシステムの整合性チェックはfsck
やe2fsck
コマンドで確認できる。
チェックする際はそのチェック対象のファイルシステムをマウントもしくは読み込み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 間隔 | ファイルシステムのチェック間隔を指定 |
-j | ext2から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 / –all | S.M.A.R.T情報を表示する |
-i / –info | S.M.A.R.Tの対応状況などを表示する |
-c / –capabilities | テストの診断状況の表示 |
-t / –test | セルフテストを実施する |
-l / –log | テストログを表示する |
-H / –health | 状態を表示する |
–scan | 認識されているデバイスを表示 |
4.3.6. XFSファイルシステムの管理
xfs_adminコマンド
XFSファイルシステムのパラメータ変更はxfs_admin
コマンドを使用する。
xfs_admin [オプション] [デバイス名]
オプション | 説明 |
---|---|
-u | UUIDを表示する |
-l | ラベルを表示する |
-L ラベル | ラベルの設定 |
-U UUID | UUIDを設定する |
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.高度なストレージ管理
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+1 | RAID0でストライピング構成を複数作りそれをミラーリングする |
RAID1+0 | RAID1でミラーリング構成を複数作りそれをストライピングする |
RAID6 | RAID5に加えてパリティ情報をもう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モードのオプション | - |
–manage | MANAGEモードにする |
-a | 構成デバイスの追加 |
-r | 構成デバイスの削除 |
-f | 構成デバイスに不良マークを付ける |
MISCモード | - |
–misc | MISCモードにする |
-Q | RAIDの状態を表示 |
-D | RAIDの詳細情報の表示 |
-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
が壊れたとする。
- デバイスに障害を通知するために不良マークをつける
mdadm --manage /dev/md0 -f /dev/sdc5
- この際 予備デバイスがあれば自動的に予備デバイスに切り替わる(確認は
cat /proc/mdSATA
で可能)
- 構成デバイスをRAIDアレイから削除する
mdadm --manage /dev/md0 -r /dev/sdc5
- 予備デバイス(例では/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の概要は以下の通り。 ボリュームグループは仮想的ディスク、論理ボリュームは仮想的パーティションといえる。
- 1台のハードディスクや1つのパーティションを物理ボリューム(PV)にする
- 物理ボリュームは一定サイズの物理エクステント(PE)から構成される
- 1つ以上の物理ボリュームからボリュームグループ(VG)が構成される
- VG内でPEから論理ボリューム(LV)が構成される
- 論理ボリュームは従来のパーティション同様ブロックデバイスとして扱える
- LVのサイズ変更や他ディスクへの移動が可能
- LVは複数ディスクにまたがって作成できる
- VGは後からサイズ変更ができる
5.2.2. LVMの作成
LVM利用手順は以下の通り。
- パーティションの作成(
fdisk
) - 物理ボリュームを用意(
pvcreate
) - 物理ボリュームを束ねてボリュームグループを作成(
vgcreate
) - ボリュームグループから論理ボリュームを切り出す(
lvcreate
) - ファイルシステムの作成(
mkfs
) - マウント(
mount
)
/dev/sdd1,/dev/sde1を使用した例
- LVM用のパーティションの用意 初めにLVMを作成するためのパーティションまたはハードディスクを用意する。 パーティションを利用する場合はタイプを8eに設定する
parted /dev/sdd1
parted /dev/sde1
- 物理ボリュームを初期化する
pvcreate
コマンドでデバイスを物理ボリュームとして初期化する
pvcreate /dev/sdd1 /dev/sde1
- ボリュームグループの作成
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の関連コマンド
物理ボリューム関連コマンド
コマンド | 説明 |
---|---|
pvcreate | PVの作成 |
pvdisplay | PVの情報の表示 |
pvmove | PV内のPEを移動 |
pvremove | PVの削除 |
pvscan | PVの検索 |
pvs | PVの情報出力 |
ボリュームグループ関連のコマンド
コマンド | 説明 |
---|---|
vgcreate | VGを作成 |
vgchange | VGの属性を変更 |
vgdisplay | VGの情報を表示 |
vgextend | VGの拡張(PVの追加) |
vgreduce | VGの縮小(PVの削除) |
vgremove | VGの削除 |
vgimport | VGのインポート |
vgexport | VGのエクスポート |
vgmerge | 2つのVGを統合する |
vgrename | VG名の変更 |
vgscan | VGの検索 |
vgs | VGの情報表示 |
論理ボリューム関連のコマンド
コマンド | 説明 |
---|---|
lvcreate | LVの作成 |
lvdisplay | LVの情報表示 |
lvextend | LVの拡張(PEの追加) |
lvreduce | LVの縮小(PEの削除) |
lvremove | LVを削除 |
lvrename | LV名を変更 |
lvscan | LVの検索 |
lvs | LVの情報表示 |
5.3. 記憶装置へのアクセス
5.3.1. デバイスファイル
記憶装置のデバイスファイルは以下の通り。
デバイスファイル | 説明 |
---|---|
/dev/hda | IDEプライマリマスタに接続されたドライブ |
/dev/hdb | IDEプライマリスレーブに接続されたドライブ |
/dev/hdc | IDEセカンダリマスタに接続されたドライブ |
/dev/hdd | IDEセカンダリスレーブに接続されたドライブ |
/dev/sda | 1番目のSCSI/SATA/USB/IEEE1394デバイス |
/dev/sdb | 2番目のSCSI/SATA/USB/IEEE1394デバイス |
/dev/sdc | 3番目のSCSI/SATA/USB/IEEE1394デバイス |
/dev/sdd | 4番目のSCSI/SATA/USB/IEEE1394デバイス |
/dev/sr0 | 1番目のSCSI/SATA/USB CD/DVDドライブ |
/dev/sr1 | 2番目のSCSI/SATA/USB CD/DVDドライブ |
/dev/st0 | 1番目のSCSIテープドライブ |
/dev/st1 | 2番目の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においてはIETやLIO TargetでiSCSIターゲット(iscSIストレージ)を構築できる。 なおデータの要求端末(クライアント)はiSCSIイニシエータと呼ばれる。
用語 | 説明 |
---|---|
ターゲット | iSCSIストレージ |
イニシエータ | iSCSIクライアント |
LUN | ストレージ内の論理ドライブ番号(記憶装置の識別番号) |
HBA | NICに相当するインターフェイスアダプタ |
WWID / WWN | MACAddressに相当する識別ナンバー |
なお設定ファイルはiscsid.conf
となる。
iscsiadmコマンド
iscsiadm [オプション]
オプション | 説明 |
---|---|
-m / –mode [モード] | モードの指定(discovery: 接続先のiSCSIターゲットの取得, node: 登録済みisCSIターゲットの取得, session: セッション一覧の取得) |
-l / –login | iscsiターゲットにログイン |
-u / –logout | iscsiターゲットからログアウト |
-t / –type | タイプの指定 |
-p / –portal=IPアドレス[:ポート] | 接続先の指定 |
-T / –targetname=IQN | iSCSIターゲットの指定 |
SAN
SAN(Storage Area Network)はストレージ専用のネットワークを使用してストレージにアクセスする技術。 物理接続にファイバチャネル、接続にSANスイッチが使用される。
6 - 6.ネットワーク管理
6.1. ネットワークの設定
6.1.1. ネットワークデバイス
Linuxではネットワークデバイスを以下のような名称で扱う。
またネットワークインターフェースの確認にはifconfig
コマンドで行える。
インターフェイス | 説明 |
---|---|
eth0 | 1番目のEthernetインターフェイス |
eth1 | 2番目のEtrernetインターフェイス |
ppp0 | 1番目の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つのマシンに設定する
- マスターインタフェースの追加
nmcli connection add type bond ifname bond0 con-name bond0 mode balance-rr
- スレーブインタフェースの追加
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
- マスターインタフェースにIPアドレスを設定
nmcli connection modify bond0 ipv4.method manual ipv4.addresses 192.168.1.1/24
なおmodeオプションでbondingポリシーを設定できる。
ポリシー | 説明 |
---|---|
balance-rr | ラウンドロビンによる送信負荷分散 |
active-backup | 1つのスレーブインターフェースのみがアクティブでもう一つは障害時に切り替え |
balance-xor | 宛先MACに基づいたハッシュによる送信の負荷分散 |
802.3ad | LACPによるリンクアグリゲーション |
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 バイト数 | パケットから取り出すバイト数の指定 |
-X | 16進数とASCII文字で表示 |
-n | 名前解決せずに表示する(IPアドレスで表示) |
-N | ホストのドメイン名を表示しない |
-l | 標準出力のバッファリング |
-t | 時刻表示しない |
-v | 詳細に出力 |
条件式 | 説明 |
---|---|
port | ポート番号の指定 |
tcp | udp |
src | 指定した送信元からのパケットを対象 |
dst | 指定した送信元へのパケットを対象 |
使用例は以下の通り。
# eth0の53ポートの通信を表示
tcpdump -nil eth0 port 53
netstatコマンド
ネットワーク機能に関する様々な内容を表示するコマンド。 引数なしで実行すると、Active接続とActiveなUnixドメインソケット情報(ローカルホストのプロセス間通信)を表示する。
netstat [オプション]
オプション | 説明 |
---|---|
-a | すべてのソケットを表示 |
-c | 状況を1秒ごとにリアルタイムで定期的に表示する |
-i | ネットワークインターフェースの統計を表示 |
-l | 接続待ち状態にあるソケットのみ表示する |
-n | アドレスやポートを数値で表示 |
-p | PIDとプロセスの表示 |
-r | カーネルのルーティングテーブルの表示 |
-t | TCPを表示 |
-u | UDPを表示 |
ssコマンド
netstat互換のコマンド。機能はnetstat
コマンドとほぼ同じ。
ss [オプション]
オプション | 説明 |
---|---|
-a | すべてのソケットを表示 |
-n | アドレスやポートを数値で表示 |
-p | PIDとプロセスの表示 |
-r | ホスト名の解決 |
-t | TCPの表示 |
-u | UDPの表示 |
-4 | IPv4のみを表示 |
-6 | IPv6のみを表示 |
ncコマンド
ncコマンドはTCP/UDPを使ったネットワークの通信を行うコマンド。 ポートスキャンや通信状態の確認が可能。
nc [ ホスト名 | IPアドレス ] [ポート番号]
なおオプション-vz
を指定することでポータ範囲の指定とポートスキャンが可能。
なおudpの場合はu
を追加する。
ipコマンド
ネットワークインターフェース、ルーティングテーブル、ARPテーブルの管理ができるコマンド。 ipconfig, route, arpコマンドの統合した操作が可能。
ip [オプション] [操作対象] [コマンド] [デバイス]
オプション | 説明 |
---|---|
-s | ステータスの表示 |
-r | 名前解決して表示 |
-f inet/inet6 | プロトコルファミリの指定 |
操作対象 | 説明 |
---|---|
link | データリンク層 |
addr | IPアドレス |
route | ルーティングテーブル |
neigh | ARPキャッシュ |
コマンド | 説明 |
---|---|
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.11a | 5.2GHz | 54Mbps |
IEEE802.11b | 2.4GHz | 11Mbps |
IEEE802.11g | 2.4GHz | 54Mbps |
IEEE802.11n | 2.4GHz/5GHz | 600Mbps |
IEEE802.11ac | 5GHz | 433Mbps~7Gbps |
なお無線LANのセキュリティ方式にはWEPとWPAがある。
- 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をスキャン |
connect | disconnect |
phyのコマンド | 説明 |
---|---|
interface add | del |
info | 暗号化や周波数の使用可能状況の表示 |
iwlistコマンド
無線インターフェースの情報を取得できるコマンド。
iwlist 無線インターフェース パラメータ
パラメータ | 説明 |
---|---|
scanning | scan [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. ネットワークのトラブルシューティング
ネットワークが正常につながらない場合
確認事項は以下の通り。
ping
による疎通確認- DNSサーバの稼働状況/
/etc/resolv.conf
の確認 route
によるルートテーブルの確認
上記でうまくいかない場合はtraceroute
やmtr
による経路確認も行う。
パケット転送許可
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 [オプション]
オプション | 説明 |
---|---|
なし | ホスト名を表示 |
-d | DNSドメイン名の表示 |
-i | IPアドレスを表示 |
-f | FDQNを表示(完全修飾ドメイン名を表示) |
-a | エイリアスを表示 |
nmapコマンド
詳細が不明なネットワークの構造を調査したり、セキュリティ上の問題がないかを検査する目的で、ネットワークのスキャンを行うことができるコマンド。
nmap [スキャンタイプ] [オプション] 対象
スキャンタイプ | 説明 |
---|---|
-sT | TCPスキャン |
-sU | UDPスキャン |
-sP | Pingスキャン |
オプション | 説明 |
---|---|
-p | 対象ポート範囲の指定 |
-F | 有名ポートを対象に高速スキャン |
-O | 対象ホストのOS識別を行う |
7 - 7.システムのメンテナンス
7.1. ソースからのインストール
7.1.1. ソースの展開
Linuxのソフトウェアはアーカイブ形式で配布される。
アーカイブはtar
コマンドで作成された後、gzip
、bzip2
、xz
を使って圧縮される。
アーカイブの展開と回答は以下の通り。
tar zxvf [圧縮ファイル] # .gzの場合
tar jxvf [圧縮ファイル] # .bz2の場合
tar Jxvf [圧縮ファイル] # .xzの場合
- .gzの場合 …
gunzip
、gzip
- .gzipの場合 …
bunzip2
、bzip2
- .xzの場合 …
unxz
、xz
アーカイブの中には以下の内容が含まれることが多い。
- ソースファイル … C言語などで書かれたソースコード
- ヘッダファイル … C言語のヘッダファイル
- configureファイル … コンパイルに必要な環境をチェックするスクリプト
- ドキュメント … インストールの手順/注意事項が書かれたファイル
ソースファイルが含まれたアーカイブを展開した後、以下の手順でコンパイルからインストールを行う。
- ./configure
- make
- su (必要の場合)
- 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は繰り返し書き換えできる
磁気テープ
大容量で低価格のメディア。 容量は規格により異なり、また定期的に取り換える必要がある。
規格 | 容量 |
---|---|
DDS4 | 40GB(圧縮時) |
SuperDLT-300 | 320GB(圧縮時) |
LTO Ultrium3 | 800GB(圧縮時) |
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 ファイル名 | アーカイブファイル名の指定 |
-z | gzip による圧縮 ・ 展開 |
-j | bzip2 による圧縮 ・ 展開 |
-J | 7zip による圧縮 ・ 展開 |
-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~9 | dumpレベルを指定する(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
8.1. DNSの基礎知識
8.1.1. 名前解決
DNSサーバはホスト名とIPアドレスを相互に変換する名前解決という仕組みを提供する。 ホスト名からIPアドレスを求めることは正引き、その逆を逆引きと呼ぶ。
ホスト名はコンピュータに付けられた固有の名前。
ドメイン名(XX.comなど
)はホストの所属するネットワーク上の区画を表す。
www.XX.com
などはFDQN(完全修飾ドメイン名)と呼ばれる。
8.1.2. DNSの仕組み
LinuxにおけるDNSによる名前解決(www.XX.com
の例)の手順は以下の通り。
- Webサーバやアプリは名前解決ライブラリのリゾルバに名前解決を依頼する
- リゾルバは
/etc/resolv.conf
に指定されているDNSサーバAに問い合わせを行う - DNSサーバAはルートDNSサーバに問い合わせを行う
- ルートDNSサーバは
www.XX.com
を知らない代わりに、.com
管轄のDNSサーバCの情報を返す - DNSサーバAはDNSサーバCに対し問い合わせる
- DNSサーバCは名前解決対象のドメイン名を知らない代わりに、
XX.com
管轄のDNSサーバDの情報を返す - DNSサーバAはDNSサーバDに対し問い合わせる
- DNSサーバDは
www.XX.com
のIPアドレスを返す - DNSサーバAは得られた情報をキャッシュしリゾルバに送信する
- リゾルバは得られたIPアドレスをWebブラウザやアプリに知らせる
8.1.3. DNSサーバ
BIND
BIND(ISC DNS)はDNSサーバソフトウェアであり、多くのLinuxディストリビューションで採用されている。 BINDのサーバデーモンはnamedである。
/etc/dhcpd.conf
BIND以外のDNSサーバ
名前 | 説明 | 設定ファイル |
---|---|---|
dnsmasq | DNS/DHCPサーバ機能を提供する軽量ソフトウェア | /etc/dnsmasq.conf |
PowerDNS | コンテンツサーバ/キャッシュサーバ機能を提供する。DNSのキャッシュサーバやDHCPサーバなどの機能を持つ | /etc/pdns/pdns.conf |
djbdns | DNSのキャッシュサーバとコンテンツサーバの機能が分かれている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アドレス(デフォルト) |
ptr | IPアドレスに対応するホスト名 |
ns | DNSサーバ |
mx | メールサーバ |
soa | SOAレコード情報 |
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のステートメントは以下の通り。
ステートメント | 説明 |
---|---|
acl | ACLの定義 |
controlls | namedを操作できるホストの設定 |
include | 外部ファイルの読み込み |
key | 認証情報の設定 |
options | namedの操作に関する詳細設定 |
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 [サブコマンド]
サブコマンド | 説明 |
---|---|
stop | namedの終了 |
refresh | ゾーンデータべースのリフレッシュ |
stats | 統計情報をnamed.stats に書きだす |
status | namedのステータスを表示する |
dumpdb | キャッシュの内容をファイル出力する |
reload ドメイン | 指定したゾーンファイルを再読み込みする |
halt | namedを停止する |
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 | ホスト名の別名に対するホスト名を記述(正引きのみ) |
PTR | IPアドレスに対するホスト名を記述(逆引きのみ) |
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の仕組みは以下の通り。
- ゾーン情報のハッシュ値(DS)とDNSサーバの秘密鍵で暗号化したものを電子署名とする
- DNS問い合わせの際にゾーン情報/電子署名をクライアントに送信する
- クライアントは電子署名をDNSサーバの公開鍵で復号する
- ゾーン情報のハッシュ値と電子署名の復号結果が一致すれば保証
この仕組みを順につなげることで信頼性のあるDNSのつながりが完成する。
またゾーン情報に電子署名を行う鍵をZSK(Zone Security Key)、ZSKに電子署名を行う鍵をKSK(Key Signing Key)と呼ぶ。 BIND 9.3.0以降でDNSSECは対応している。
DNSSECの設定
DNSSECをBINDで実装する手順は以下の通り。
- ZSK鍵ペアを作成する(ゾーンファイルを格納しているディレクトリで行う)
- 例:
dnssec-keygen -r /dev/random -a RSASHA256 -b 1024 -n zone example.net
- 上記により公開鍵と秘密鍵が生成される(生成されたファイル名最後5桁は鍵ID)
- 例:
- KSK鍵ペアを作成する
- 例:
dnssec-keygen -r /dev/urandom -f KSK -a RSASHA256 -b 2048 -n zone example.net
- 上記により公開鍵と秘密鍵が生成される(生成されたファイル名最後5桁は鍵ID)
- 例:
- ゾーンファイルに生成した公開鍵が読みこまれるように設定する
$INCLUDE "鍵ファイル名"
dnssec-signzone
コマンドによりゾーンファイルに署名を行う- 例:
dnssec-signzone -o example.net example.net.zone
- 署名後に
ゾーン名.signed
(署名ファイル)が生成される
- 例:
なお上位ゾーンへ管理する組織へDSレコード登録を申請する必要がある。
TSIGの設定
TSIG(Transaction SIGnatures)は共有秘密鍵の利用によりマスタDNSサーバになりすまし、偽のゾーンデータをスレーブDNSサーバに送ることや、ゾーンファイルを改ざんする攻撃を防ぐための仕組みのこと。 これはマスタDNSサーバ/スレーブDNSサーバがゾーン転送によりゾーンデータを同期することの性質によるもの。
TSIGの設定は以下の通り。
dnssec-keygen
コマンドにより共有鍵ファイルの作成- 例:
dnssec-keygen -a HMAC-MD5 -b 128 -n HOST tsig-key
- 例:
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サーバとプロキシサーバ
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
- RedHat系:
- ソースからコンパイルして使用する方法
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.conf | server-info, server-statusの設定 |
httpd-vhosts.conf | バーチャルホストの指定 |
httpd-default.conf | デフォルトのサーバ全般設定 |
httpd-ssl.conf | SSL/TLSの設定 |
Red Hat系でインストールした場合
ファイル/ディレクトリ | 説明 |
---|---|
/etc/httpd/conf/httpd.conf | メインの設定ファイル |
/etc/httpd/conf.d/ | 補助の設定ファイルを保存するディレクトリ |
ssl.conf | SSL/TLS設定ファイル |
php.conf | PHPモジュールの設定 |
perl.conf | Perlモジュールの設定 |
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
設定値 | 出力 |
---|---|
Prod | Server: Apache |
Major | Server: Apache/2 |
Minor | Server: Apache/2.4 |
MinOS | Server: Apache/2.4 (CentOS) |
Full | Server: 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では複数のプロセスが処理を分担する。 仕組みとしては以下の通り。
- 親プロセスがクライアントからの接続を待ち受ける
- 個々のクライアントの対応は子プロセスが処理する
なお、待機している子プロセス数よりもクライアント数が多くなれば、子プロセス数を新たに不足分起動するのでレスポンスが低下する。 また待機している子プロセス数が多いほどメモリの使用量は多くなる。
# 起動時の子プロセス数の数
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 オプション
ディレクトリごとにオプションを指定できる。
オプション | 説明 |
---|---|
All | MultiViews 以外のすべての機能を有効にする(デフォルト) |
None | すべての機能を無効にする |
ExecCGI | CGI スクリプトの実行を許可する |
FollowSymLinks | シンボリックリンクをたどることを許可する |
Includes | SSI を有効にする |
Indexes | ファイル一覧の表示を行う |
MultiViews | コンテントネゴシエーションを有効にする |
9.1.4. 外部設定のファイル
httpd.conf以外に設定ファイルを記述し、httpd.confを上書きして設定することもできる。
外部設定のファイル名はhttpd.confのAccsessFileName
ディレクティブで指定できる。
AccsessFileName
外部設定のファイルを指定できる。
AccsessFileName .htaccess
AllowOverride パラメータ
AllowOverride
ディレクティブは外部ファイルの利用許可ができる。
複数パラメータの指定。
Directoryセクションで指定できる。
AllowOverride パラメータ
パラメータ | 説明 |
---|---|
AuthConfig | 認証に関する設定を有効にする |
indexes | DirectoryIndexなどの設定の有効にする |
FileInfo | ファイルタイプの制御設定を有効にする |
Limit | Order, Allow, Denyによる設定を有効にする |
Options | Opitionsの設定を有効にする |
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 サブコマンド
サブコマンド | 説明 |
---|---|
start | Apacheを起動 |
stop | Apacheの終了 |
restart | Apacheの再起動 |
graceful | Apacheを安全に再起動 |
reload | 設定ファイルの再読み込み |
configtest | 設定ファイルの構文チェック |
9.1.6. モジュールの使用
Apacheではモジュールによって様々な機能を提供できる。 機能追加などもApacheのインストールのし直しの必要はなく、モジュールのロード/アンロードで行える。
Apacheの主要なモジュールは以下の通り。
モジュール名 | 説明 |
---|---|
mod_accsess_compat | ホストベースのアクセス制御 |
mod_authz_host | ホストベースのアクセス制御(Requireディレクティブ) |
mod_authz_user | ユーザベースのアクセス制御(Requireディレクティブ) |
mod_auth_basic | 基本認証 |
mod_auth_digest | Digest認証 |
mod_authn_file | .htaccsessファイルによるユーザ認証 |
mod_alias | エイリアス機能の利用 |
mod_cgi | CGIスクリプトの実行 |
mod_dir | ディレクティブのインデックス実行 |
mod_info | サーバの設定情報表示 |
mod_log_config | リクエストログの生成 |
mod_mime | 拡張子に応じたファイルタイプの指定 |
mod_negotiation | クライアントごとの自動判別機能の提供 |
mod_perl | Perlの利用 |
mod_php | PHP5の利用 |
mod_proxy | プロキシ機能 |
mod_so | モジュールを読み込むDSO機能の提供 |
mod_ssl | SSL/TLS機能の利用 |
mod_status | サーバステータスの表示 |
mod_unixd | 実行ユーザ/グループのChroot機能 |
mod_userdir | ユーザディレクリの公開 |
mod_version | バージョン依存の設定 |
モジュールは/usr/lib/httpd/modules
などにインストールされ、LoadModule
ディレクティブで読み込む。
LoadModule perl_module modules/mod_perl.so
またApacheのインストール後にモジュールを読み込むには以下のように実施する方法もある。
aspx
コマンドによるコンパイルhttpd.conf
にLoadModules
ディレクティブを追加
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 | パスワードファイルを新規に作成 |
-m | MD5で暗号化する |
-s | SHA1で暗号化する |
-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.16 | 192.168.0.0/24, 172.16.0.0/24のみ |
host ドメイン名 | ドメイン名のホストのみ |
group admin | adminグループのみ |
all granted | すべてのホストを許可 |
all denied | すべてのホストを拒否 |
local | ローカルホストのみ |
また以下のディレクティブを使用して複数条件の指定も可能
ディレクティブ | 説明 |
---|---|
RequireAll | すべての条件にマッチで真 |
RequireAny | 1つ以上の条件にマッチで真 |
RequireNone | いずれにマッチしなければ真 |
またApache2.4以降ではorder, Allow,Deny
ディレクティブを使用する方法ではなく、Require
ディレクティブを使用する形が推奨されている。
設定 | Order Deny,Allow | Order 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,Allow | Order Allow,Deny Allow from all |
すべて拒否 | Order Deny,Allow Deny from all | Order Allow,Deny |
またアクセス制御をLimit
、LimitExcept
ディレクティブ内に設定して、特定の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サーバの運用は以下の手順でサイト証明書を認証局から入手する。
- 公開鍵/暗号鍵の作成
- 作成した公開鍵を認証局(CA)へ送信する
- CAにて証明書を発行して受け取る
- 証明書をWebサーバにインストールする
自己署名証明書(オレオレ認証)
自己署名証明書はSSL接続をテストする為や、限られた利用者のみが使用するWEBサーバなどを構築する際に設定する。
作成手順は以下の通り。
- 秘密鍵(key.pem)と自己署名証明書(cacert.pem)の作成
- サーバ秘密鍵の作成(鍵名.key)
- 証明書発行要求書(CSR)の作成
- 証明書発行要求ファイルに対しCAが認証を行いサーバ証明書(.crt)の作成
自己署名証明書の作成例は以下の通り。
なおCA.sh -newca
やCA.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
の主要なディレクティブは以下の通り。
ディレクティブ | 説明 |
---|---|
SSLEngine | SSL/TLSの有効無効 |
SSLProtocol | all,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_logとerror_logがある。
/var/log/httpd
などに保存される。
- アクセスログ … 要求のあったリクエストの情報などが保存される
- エラーログ … エラー情報やサーバの挙動が記録される(ログレベルは
LogLevel
ディレクティブで設定可能)
9.3. プロキシサーバの設定
プロキシサーバはクライアントPCの代理としてサーバとの通信を仲介するサーバのこと。 メリットは以下の通り。
- 特定のWEBサイトへのアクセスを制限できる
- クライアントからのアクセスを制御できる
- 一度アクセスしたサイトをキャッシュしてアクセスの高速化を図れる
9.3.1. Squid
SquidはLinuxで最も使用されているプロキシサーバの1つ。
Squidはsquid.conf
で設定を行う。
squid.confの主要設定項目
設定項目 | 説明 |
---|---|
http_port | Squidが利用するポート番号 |
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_user | anonymousでFTPアクセスするときのパスワード |
ftp_passive_on/off | FTPのパッシブモードの有効/無効 |
reference_age | キャッシュの保存期間 |
request_header_max_size | HTTPリクエストヘッダの最大サイズ |
requiest_body_max_size | HTTPリクエストボディの最大サイズ |
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のアクセス制限はacl
とhttp_access
で行う。
aclの場合は以下の書式。
acl acl名 ACLタイプ 文字列orファイル名
ACLタイプは以下の通り。
タイプ | 説明 |
---|---|
src | クライアントのIPアドレス |
dst | 代理アクセス先サーバのIPアドレス |
srcdomain | クライアントのドメイン名 |
dstdomain | 代理アクセス先サーバのドメイン名 |
port | 代理アクセス先のサーバポート番号 |
myport | クライアントのポート番号 |
arp | MACアドレス |
proto | プロトコル |
method | HTTPのメソッド |
url_regex | URLにマッチする正規表現 |
urlpath_regex | URLからプロトコルとホスト名を除いたパス名にマッチする正規表現 |
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.conf | SSLの設定ファイル |
/etc/nginx/conf.d/virtual.conf | バーチャルホストの設定ファイル |
設定はディレクティブに値を指定する形で記述する。
ディレクティブ 値;
ディレクティブ {
ディレクティブ 値;
}
またnginx.conf
の基本構造は以下の通り。
events {
# 接続処理に関する記述
}
http {
# httpサーバの設定
server {
# HTTPサーバ毎の設定
location パス {
# URI毎の設定
}
}
}
mail {
# メールプロキシ関連の設定
}
またnginxの主要なディレクティブは以下の通り。
ディレクティブ | コンテキスト | 説明 |
---|---|---|
include | すべて | 値の設定ファイルを読み込む |
http {} | main | httpサーバとしての設定 |
server {} | main | バーチャルホストの設定 |
user | main | workerプロセスの実行ユーザ |
worker_processes | main | workerのプロセス数(CPUコア数) |
worker_connections | events | 1つのworkerプロセスが同時処理できる最大接続数 |
log_format | http | アクセスログの書式形式 |
access_log | http,server,location | アクセスログのパスとログレベル |
error_log | main,http,server,location | エラーログのパスとログレベル |
listen | server | リクエストを受け付けるポート番号 |
server_name | server | バーチャルホストのサーバ名 |
proxy_pass | location | プロキシ先の指定 |
fastcgi_pass | location | FastCGFIサーバの指定 |
fastcgi_param | http,server,location | FastCGIサーバに渡すパラメータの設定 |
location プレフィックス URIパス条件{} | server, location | 条件マッチのリクエストURIの設定 |
keepalive_requests | http,server,location | 一度の接続で受け付けできるリクエスト数の上限 |
keepalive_timeout | http,server,location | キープアライブのタイムアウト時間 |
server_tokens | http,server,location | バージョン番号の表示/非表示 |
root | http,server,location | ドキュメントルート |
index | http,server,location | インデックスファイル |
autoindex | http,server,location | インデックスリストの表示/非表示 |
error_page | http,server,location | エラーコードとエラーページのURI |
proxy_set_header | http,server,location | プロキシ先に送られるリクエストヘッダフィールドの再定義 |
proxy_pass_header | http,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.ファイル共有
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の特徴は以下の通り。
比較項目 | SMB | CIFS |
---|---|---|
下位プロトコル | 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にてサーバ機能を提供するデーモンはsmbdとnmbとなる。 smbdはファイルやプリンタの共有、ユーザの認証、nmbdはブラウズ機能、NetBIOSによる名前解決を提供する。
Sambaのバージョン
Samba3とSamba4の主な違いを以下に記載する。
機能 | Samba3 | Samba4 |
---|---|---|
ドメインコントローラ | 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/UDP | NetBIOS名前解決やブラウジングに使用 |
138/UDP | NetBIOS名前解決やドメインログオンに使用 |
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ユーザ名
オプション | 説明 |
---|---|
-L | Sambaユーザ一覧表示 |
-a | Sambaユーザ追加 |
-x | Sambaユーザ削除 |
smbpasswdコマンド
Sambaユーザのパスワード変更を行うコマンド。
smbpasswd [オプション] [Sambaユーザ名]
オプション | 説明 |
---|---|
-d | Sambaユーザの無効化 |
-e | Sambaユーザの有効化 |
-x | Sambaユーザの削除 |
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 | ファイルリストの表示 |
exit | smbclientの終了 |
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 <サブコマンド>
サブコマンド | 説明 |
---|---|
dns | DNS管理 |
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_squash | rootアクセス時にroot権限で実行 |
root_squash | rootアクセス時に匿名アカウント権限で実行(デフォルト設定) |
all_squash | すべてのアクセスを匿名アカウント権限で実行 |
NFSサーバの注意点としてUIDを統一するべき。(UNIXのUIDがそのままNFSサーバでも使用されるため) そうしないと別ユーザとして認識される場合がある。
exportsコマンド
現在のエクスポート状況の表示、/etc/exports
の変更を反映させるコマンド。
exports [オプション] [ホスト:パス]
オプション | 説明 |
---|---|
-a | すべてのディレクトリのエクスポート/アンエクスポート |
-r | すべてのディレクトリの再エクスポート |
-U | アンエクスポート |
-v | 詳細に表示 |
showmountコマンド
NFSサーバのディレクトリをマウントしているNFSクライアントを調べることができるコマンド。
showmount [オプション] [ホスト]
オプション | 説明 |
---|---|
-a | クライアントのホスト名とマウントしているディレクトリの表示 |
-e | 指定したホストでエクスポートしているディレクトリの表示 |
nfsstatコマンド
NFSの統計情報を表示するコマンド。
ntfsstat [オプション]
オプション | 説明 |
---|---|
-s | NFSサーバ側の統計のみを表示 |
-c | NFSクライアント側の統計のみを表示 |
-n | NFSの統計のみを表示 |
-r | RPCの統計のみを表示 |
-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.ネットワーククライアントの管理
11.1. DHCPの設定
11.1.1. dhcpdの設定
DHCPサーバにはdhcpd
が、DHCPクライアントにはdhclient
,pump
,dhcpcd
が利用される。
dhcpdの設定はdhcpd.conf
で行う。
項目 | 説明 |
---|---|
option domain-name | ドメイン名 |
option domain-name-servers | DNSサーバ |
option routes | DGWのIPアドレス |
option subnet-mask | サブネットマスク |
option broadcast-address | ブロードキャストアドレス |
option ntp-servers | NTPサーバのIPアドレス |
option nis-domain | NISドメイン名 |
option nis-servers | NISサーバのIPアドレス |
option netbios-name-servers | WINSサーバのIPアドレス |
default-lease-time | DHCPクライアントが期限を求めない場合のデフォルトリース期間 |
max-lease-time | DHCPクライアントが上限を求めた場合の最大リース期間 |
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の仕組みが以下のようになっているからである
- IPv6クライアントはIPv6ルータにルータ要請(RS)を送信
- IPv6ルータはルータ通知(RA)をIPv6クライアントに返送
- 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.so | rootユーザによるアクセス許可をする |
pam_secirty.so | /etc/security ファイルに記載された端末のみrootログインの許可 |
pam_stack.so | 他のPAM設定ファイルをincludeする |
pam_succedd_if.so | 特定のファイル属性をチェックしてサービス許可する |
pam_unix.so | 通常のパスワード認証を行う |
pam_ldap.so | LDAP認証を行う |
pam_warn.so | 認証時/パスワード変更時のログ出力する |
pam_sss.so | SSSDを使った認証を行う |
pam_wheel.so | root権限アクセスをwheelグループメンバーのみに制限する |
11.3. LDAP
11.3.1. LDAPとは
LDAPはネットワーク機器やユーザーID、パスワードを管理するディレクトリサービスの維持やアクセスを行うプロトコルのこと。 堅く言うと、X.500をベースとしたディレクトリサービスに接続するために使用されるプロトコルでDAPを軽量化したものともいえる。
一般的にLDAPは一元管理の認証サーバを構築する際に使用される。 LDAPによりユーザやリソースに関する情報を検索したり管理することができる。
なお、OpenLDAPの設定方法は、OpenLDAP2.3以降、テキストの設定ファイルから起動時に設定を読み込む一般的な方法から、LDAPを使った動的な設定方法に変更されている。
LDAPの概念
LDAPではデータをオブジェクトとして扱う。 オブジェクトとは現実世界に存在する何らかの実体をコンピュータ上で表したもの。
- エントリ
- LDAPでのオブジェクトの単位のこと
- それぞれのエントリはオブジェクトクラスに属する
- 下位のエントリを分類する目的のみに使用するエントリはコンテナと呼ばれる
- 属性
- エントリ(オブジェクト)が持つ情報を表すもの
- 属性は属性名と属性値から構成される
- DIT(ディレクトリ情報ツリー)
- エントリ間の関係を階層構造(木構造)で表したもの
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.schema | OpenLDAP必須のスキーマ cnやouなどの基本的属性が定義されている |
cosine.schema | ディレクトリサービスのX.500規格で規定された属性が定義されたスキーマ |
inetorgperson.schema | アドレス帳/個人情報を扱うためのスキーマ |
nis.schema | Unix/Linuxユーザ/グループ情報を扱うためのスキーマ |
属性名
主な属性は以下の通り。
属性名 | 説明 |
---|---|
dn | 識別名 |
objectClass | オブジェクトクラス |
c | 国名 |
cn | 一飯名称 |
dc | ドメイン構成要素 |
メールアドレス | |
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 | ディレクトリ管理者のパスワードを指定する |
directory | LDAPデータベースの格納ディレクトリのパス指定 |
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サーバの指定(デフォルトはローカルホスト) |
-x | SASLを使わず簡易認証を用いる |
-D バインドDN | 認証に利用するDNを指定する |
-W | 認証時のパスワードを対話的に入力する |
-w パスワード | 認証時のパスワードを指定する |
-f ファイル名 | LDIFファイルの指定 |
ldapdeleteコマンド
LDAPサーバに登録されたエントリを削除するコマンド
ldapdelete
ldapsearchコマンド
エントリを検索するコマンド。
ldapsearch <オプション> 検索フィルタ <出力属性>
オプション | 説明 |
---|---|
-h ホスト | LDAPサーバの指定 |
-H URI | LDAPサーバの指定をldapurlで指定 |
-x | SASLを使わず簡易認証を用いる |
-D バインドDN | 検索を開始するDNを指定する |
-L | 検索結果をLDIFv1形式で表示する |
-LL | 検索結果をコメントなしで表示する |
-LLL | 検索結果をコメントとLDAPバージョン表示なしで表示する |
-b 識別名 | 検索開始位置の指定 |
ldapsearchコマンド
LDAPサーバのエントリを検索するコマンド。
ldapsearch [オプション] 検索条件 [出力属性]
オプション | 説明 |
---|---|
-h ホスト名/IPアドレス | 検索を行うLDAPサーバを指定 |
-H URI | 検索を行うLDAPサーバをldapuri形式で指定 |
-x | SASLを使用せずに簡易認証を行う |
-b 識別名 | 検索開始位置の指定 |
-L | 検索結果をLDIFv1形式で表示 |
-LL | 検索結果をコメントなしで表示 |
-LLL | 検索結果をコメントとLDAPバージョン表記なしで表示 |
11.3.5. slapd-config
OpenLDAP2.3以降の設定方法はslapd-configと呼ばれる。 この方法ではLDAPのデータベース(ディレクトリ)に保存されている設定データを追加・変更・削除等することで、動的に設定を更新する。 これはディレクトリベースの設定と呼ばれ、通常は設定変更による再起動等が不要となる。
また、設定データベースのツリー構造のルートは、DN(識別名)がcn=configで定義され、変更できない。
設定を行う際は設定用のLDIFファイルを定義し、ldapadd
、ldapdelete
、ldapmodify
といったコマンドにより、データベースを更新する。
グローバルセクションに使用する主なディレクティブ
グローバルセクションに使用する主なディレクティブは以下の通り。
slapd.confディレクティブ | slapd-configディレクティブ | 説明 |
---|---|---|
argsfile ファイル名 | olcArgsFile | slapdデーモン起動時のコマンド引数を格納するファイルの指定 |
pidfile ファイル名 | olcPidFile | slapdのプロセスIDを格納するファイルの指定 |
include ファイル名 | olcInclude | 読み込む設定ファイルのを指定 |
logfile ファイル名 | olcLogFile | デバックログの出力ファイルを指定 |
loglevel 数 | olcLogLevel | ログレベルの指定 |
idletimeut 秒数 | olcIdleTimeout | アイドル状態のクライアント接続を強制的に切断するまでの秒数指定 |
timelimit 秒数 | olcTimeLimit | slapdが検索要求の応答に使う最大秒数の指定 |
データベースセクションで使用する主なディレクティブ
slapd.confとslapd-configのデータベースセクションで使用する主なディレクティブの対応表は以下の通り。
slapd.confディレクティブ | slapd-configディレクティブ | 説明 |
---|---|---|
database 種類 | orcDatabase | バックエンドデータベースの種類を指定 |
suufix DN | orcSuffix | ディレクリのトップとなるDNの指定 |
rootdn DN | orcRootDN | データベース管理者のDNの指定 |
rootpw パスワード | orcRootPW | データベース管理者のパスワードを指定 |
index 属性名 種類 | orcDbindex | 属性に作成するインデックスの種類の指定 |
dircetory ディレクトリ | orcDbDirectory | データベースファイルを格納するディレクトリの指定 |
slapd-configで使用される基本的なディレクティブ
slapd-configで使用される基本的なディレクティブは以下の通り。 なお「olc」という文字は「OpenLDAP Configuration」の略となる。
ディレクティブ | 説明 | 定義されるエントリと説明 |
---|---|---|
orcLogLevel | syslogに出力するレベル指定 orcLogLevel: | cn=config サーバ全体に適用 必須オブジェクトクラス: orcGlobal |
orcInclude | includeファイルを指定 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.メールサービス
12.1. SMTPサーバの構築
12.1.1. メールの仕組み
メールを処理するソフトウェアにはMTA(メッセージ転送エージェント)、MDA(ローカルメール転送エージェント)、MUA(メールユーザエージェント)がある。MUAはメーラ(メールソフトウェア)となる。
- MUA(Mail User Agent):メールの確認や作成を行うユーザインタフェース
- MTA(Mail Transfer Agent):メールの転送
- MDA(Mail Delivery Agent):メールの配送(仕分け)
メール転送のフローは以下の通り。
- MUAからメールサーバMTAはメールを受け取る
- メールサーバMTAはDNSサーバに問い合わせ配送先のメールサーバMTAを調べて転送する
- 配送先メールサーバMTAがメールを受け取るとMDAにより宛先ユーザのメールボックスにメールを収納する
- 受取先ユーザはPOPサーバやIMAPサーバ経由でメールボックスからメールを取り出す
MUAからメールをMTAに送信するとき、MTA間でのやり取りはSMTPが使用されるため、MTAはSMTPサーバと呼ばれる。 MUAがメールを受け取る際はPOPやIMAPが使用され、現在は主にPOP3やIMAP4が使用される。
SMTPサーバの代表的なものにはPostfixやsendmail、eximなどがある。 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を構成するプログラムは以下の通り。
プログラム | 役割 |
---|---|
sendmail | sendmail互換インターフェース |
smtpd | 外部配送の処理 |
pickup | maildropキューの監視、内部配送の処理を行う |
cleanup | ヘッダ内の書き換えなどを来ないincomingキューに入れqmgrに通知する |
qmgr | キュー内のメール配送プログラムに渡す |
nqmgr | qmgrと同じ(配送アルゴリズムのみ異なる) |
master | 全体制御用デーモン |
bounce | バウンスメール(設定ミスなどで往復する)を処理する |
12.1.3. Postfixの設定
Postfixの設定ファイルは/etc/postfic
ディレクトリ以下のmain.cf
とmaster.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 <サブコマンド>
オプション | 説明 |
---|---|
start | Postfixの開始 |
stop | Postfixの停止 |
abort | Postfixの強制停止 |
flush | キュー内にあるメッセージの再送 |
reload | Postfixの設定を再読み込みする |
check | 設定ファイルの構文チェックを行う |
また起動スクリプトやsystemdによる起動停止も行える。
/etc/init.d/postfix stop
systemctl stop postfix.services
Postfixの正規化機能
Postfixにはcanonical(正規化)と呼ばれる、送信者、受信者のアドレスを書き換える機能がある。 この機能により、以下のようなことが可能となる。
- 異なる送信者から受け取ったメールを、単一の送信者から送られたように見せる
- ユーザ名(ログインID)と異なるメールアドレスを使用する
canonical機能は以下の手順で有効にする。
- main.cfにて、書き換えルールの参照先(検索テーブル)を指定
* 書き換えルールには以下のパラメータが指定可能
*
canonical_maps
:送受信時の書き換えで参照する検索テーブル *sender_canonical_maps
:送信者アドレスの書き換え時に参照する検索テーブル *recipient_canonical_maps
:受信者アドレスの書き換え時に参照する検索テーブル - 検索テーブルの作成、更新
なお、指定する検索テーブルには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のコントロールは以下の通り。
コントロール | 説明 |
---|---|
if | if-elsif-else |
require | 拡張機能を指定 |
stop | 処理を停止 |
sieveの主なアクションは以下の通り。
アクション | 説明 |
---|---|
fileinfo | メールを指定したメールボックスに配送する |
keep | メールをデフォルトのメールアドレスに配送する |
discard | メールを破棄する |
reject | メールを拒否する |
redirect | メールを指定したメールアドレスに転送する |
stop | 処理を停止する |
テスト | 説明 |
---|---|
address | アドレスを評価 |
header | メールヘッダを評価 |
size | メールサイズの評価 |
allof | AND |
anyof | OR |
not | NOT |
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出すのに使用する。 これらのサービスの利用にはDovecotやCourier 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 | メールの配送場所と配送形式 |
ssl | SSL/TLSの有効化のどうか |
ssl_cert | サーバ証明書のファイル |
ssl_key | サーバ鍵ファイル |
メール関連のポートは以下の通り。
ポート | 説明 |
---|---|
110 | POP3 |
143 | IMAP |
993 | IMAP over SSL/TLS |
995 | POP3 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 | 設定の再読み込み |
stop | dovecotプロセスの終了 |
log find | ログファイルパスの確認 |
log test | テストログメッセージの生成 |
mailbox | メールボックスを管理 |
who | サーバログイン中のユーザ情報表示 |
pw | パスワードハッシュ値の生成 |
13 - 13.システムセキュリティ
13.1. パケットフィルタリング
パケットフィルタリングはカーネルが処理するパケット情報を調べて通過させたり遮断させたりすること。 パケットフィルタリングはINPUT(入力),OUTPUT(出力),FORWARD(転送)の3か所で行う。 それぞれINPUTチェイン、OUTPUTチェイン、FORWARDチェインと呼ばれる。
なおチェインはパケットを検査するためのルールセットのこと。 ネットワークインターフェイスを通過するパケットはチェインのルールに適合する検査され、破棄されたり通過させたりされる。 チェインのいくつか集めたセットはテーブルと呼ばれる。 テーブルには以下の種類がある。
テーブル | デフォルトチェイン |
---|---|
filter | INPUT, OUTPUT, FORWARD |
nat | PREROUTING, POSTROUTING, OUTPUT |
mangle | INPUT, 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=yesやnet.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.allow | Allowと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
で設定を行う他、起動時のオプションで動作を指定することもできる。
オプション | 説明 |
---|---|
-4 | IPv4のみの利用 |
-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により権限のないディレクトリにアクセスできないようにすることが重要となる。
方法としては以下の通り。
/home/ftp
などのディレクトリを作成する/bin
,/lib
,/etc
などを作成しFTPサービス運営に必要なファイルをコピーする- anonnymousユーザ用のディレクトリ(
/home/ftp/pub
)などを作成する /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
となる。
主要な設定項目は以下の通り。
設定項目 | 説明 |
---|---|
Port | SSHで使うポートの設定 |
Protocol | 使用するSSHのバージョン |
ListenAddredd | 接続受付アドレス(0.0.0.0ですべて) |
HostKey | ホスト鍵のファイルパス |
SyslogFacilty | ログのファシリティ |
LogLevel | ログのプライオリティ |
LogGraceTime | ログインを試みることのできる最大時間(秒) |
PermitRootLogin | rootログインの禁止許可 |
StrictModdes | パーミッションを厳密にチェックするかどうか |
MaxAuthTimes | 認証を試みることのできる最大数 |
RSAAuthentication | SSH1で公開鍵認証を許可するかどうか |
PubkeyAuthentication | SSH2で公開鍵認証を許可するかどうか |
AuthorizedKeysFile | 公開鍵を登録するファイル |
PasswordAuthentication | パスワード認証の有効/無効化 |
PermitEmptyPasswords | 空パスワードの有効/無効 |
ChallengeResponseAuthentication | チャレンジレスポンス認証の有効/無効化 |
UsePAM | PAMを使用する |
X11Forwarding | X11フォワーディングの無効/有効化 |
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ではホスト認証後にユーザ認証に進む。 ユーザ認証では公開鍵認証が試行される。 公開鍵認証の手順は以下の通り。
- サーバ側に公開鍵を登録する
- SSH接続時に公開鍵が利用できるか確認が行われる
- クライアント側は公開鍵にユーザ名などの情報を加え、秘密鍵で署名しサーバに送信する
- サーバはユーザの公開鍵を使用して署名を確認する
- 確認できるとログインを許可する
なおユーザの公開鍵と秘密鍵ペアの生成にはssh-keygen
コマンドを使用する。
ssh-keygenコマンド
公開鍵と秘密鍵のペアを作成するコマンド。
ssh-keygen [オプション]
オプション | 説明 |
---|---|
-f ファイル名 | 鍵ファイル名の指定 |
-t | 暗号化方式の指定(rsa1, dsa, rsa,ecdsa, ed25519) |
-p | 既存の鍵ファイルのパスフレーズを変更する |
-P パスフレーズ | 古いパスフレーズを指定する |
-N パスフレーズ | 新しいパスフレーズを指定する |
-l | フィンガープリントの表示 |
-R ホスト名 | 指定されたホスト鍵をknown_hostsから削除する |
生成される鍵のデフォルト名は以下の通り。
バージョン | 秘密鍵 | 公開鍵 |
---|---|---|
Ver1.0 | identity | identyty.pub |
Ver2.0(DSA) | id_dsa | id_dsa.pub |
Ver2.0(RSA) | id_rsa | id_rsa.pub |
Ver2.0(ECDSA) | id_ecdsa | id_ecdsa.pub |
Ver2.0(ED25519) | id_ed25519 | id_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 -L [ローカルポート]:[リモートホスト]:[リモートポート] [リモートホストユーザ名]@[リモートホスト]
13.4.6. SSHサーバのセキュリティ
SSHサーバをデフォルト設定ではなく、適切に設定するとよりセキュアな運用ができる。 項目は以下の通り。
- SSH Version1.0の禁止
- パスワード認証の禁止
- rootログインの禁止
- 接続元制限
SSH Version1.0の禁止
SSHバージョン2.0のみを許可することで、SSHバージョン1.0の脆弱性を防ぐことができる。
sshd_config
のProtocol 2
にすることで可能。
パスワード認証の禁止
パスワード認証は原則は無効にした方がよい。 これはブルートフォースアタックやパスワードが知られる危険性があるためである。
同様にsshd_config
でPasswordAuthentication no
と記述する。
rootログインの禁止
rootユーザのリモートログインも基本は許可すべきではない。
sshd_config
でPermitRootLogin no
と記述することでrootログインを禁止にできる。
ログインユーザの制限
ユーザ単位でログイン制限することが可能。 AllowUsersディレクティブでユーザを指定すると、指定していないユーザのログインは禁止にできる。
書式 | 説明 |
---|---|
AllowUsers [ユーザ名] | ユーザのみログインを許可 |
AllowUsers [ユーザ名1] [ユーザ名2] | ユーザ1, ユーザ2をログインを許可 |
AllowUsers [ユーザ名]@172.16.0.1 | 172.16.0.1のユーザのみログインを許可 |
AllowUsers [ユーザ名]@example.com | example.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 Asiistant | WEBブラウザベースで操作するインターフェイス |
Greebone Security Desktop | GUIベースのクライアント |
OpenVAS CLI | コマンドラインベースのクライアント |
Fail2ban
Failbanはログファイルを監視し攻撃を検知し、攻撃元IPを遮断するソフトウェア。 内部的には一定時間内に何度もログインを失敗するといったイベントにより、iptablesルールを書き換えアクセス元からの接続を遮断する。
13.5.2. 開いているポートの確認
Nmap
Nmapはポートスキャンツールで、開いているポートから稼働しているサービスを特定できる。
nmap <スキャンタイプ> <オプション> <IPアドレス \| ドメイン>
オプション | 説明 |
---|---|
-sT | 接続スキャン |
-sS | SYNスキャン(TCP接続のSYNパケットを送信し、SYN+ACKが帰るかどうかでポートスキャンを行う) |
-sN | Nullスキャン |
-sF | FINスキャン |
-sX | Xmasスキャン |
-sR | RFCスキャン |
-O | OSを調べる |
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 B | B以外の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
セキュリティ事故情報を収集しセキュリティに関する技術支援情報を発信しているサイト。
- CERT/CC … https://www.cert.org
- JPCERT… https://www.jpcert.or.jp
BUGTRAQ
BUGTRUGはバグ情報を公開するためのメーリングリスト。
CIAC
CIACは米エネルギー省が運営するサイトで、セキュリティインシデントの報告を行っている。
13.5.5. インシデントへの対処
サーバがクラックされると以下のことが行われる可能性がある。
- コマンドの改ざん
- ログ改ざんやsyslog停止
- 悪意のあるソフトウェアのインストールと使用
改ざんされたls
コマンドでは不正なファイルのみを表示しないようにしてある場合があり、この場合はecho *
コマンドによりlsを代用できる。
またファイル改ざんのチェックはrpm
コマンドにより確認できる。
rpm -Va
このオプションはイストール時のファイルの状態と現状を比較し、差があればプロパティと一緒に表示する。 表示されるRPM検証記号は以下の通り。
記号 | 説明 |
---|---|
S | ファイルサイズが異なる |
M | アクセス権またはファイルタイプの変更がされている |
5 | MD5チェックサムの値が異なる |
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クライアントそれぞれで必要になるファイルを以下にまとめる。
サイド | 必要ファイル |
---|---|
CA | CA証明書、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-startup
とopenvpn-shutdown
を編集する。
次に/usr/share/doc/openvpn-2.3.1.4/sample/sample-scripts
以下ににあるbridge-start
、bridge-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