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

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

Linux(UNIX系OS)基礎

LinuxOSの操作方法からLinuxサーバの構築/高度な運用方法に関して

1 - 1.Linux/シェル基礎

LPIC Lv1の範囲(基本操作、OS動作、Vim)など。Linuxの基本はこの項目でカバー

1.1 - 1.Linuxの基礎知識

Linuxの歴史、有名ディストリビューション、シェルの種類に関する解説

1.1. UNIXとLinux

1.2.1 UNIXの誕生

UNIXは1969年にアメリカのAT&T社ベル研究所において誕生した。 ベル研究所ではMulticsという大規模で複雑なOSの開発に関わっていたが、そのプロジェクトは進行が遅れていた。 そこで新たなアイディアをもとに小規模なOSであるUNIXを開発することを決意した。 UNIXはKen ThompsonやDennis Ritchieらが中心となりUNIXは開発されていく。

UNIXの設計はシンプルで、モジュール性に富んでいた。 コンパクトなコードと柔軟なデザインにより、異なるハードウェア上で移植が容易であった。 この特性が、UNIXの広がりと進化を支える要因となった。

UNIXは次第に多くの機能やツールが追加されていき、大学や研究機関で広く使われるようになった。 その後、AT&Tは商用ライセンスを提供し、商業利用も広がっていった。 一方で、研究者や技術者たちはUNIXのソースコードを入手し、独自のバージョンを開発することで、新たな機能や改良を加えるようになった。

この中で、System Vと**BSD(Berkeley Software Distribution)**が注目を集めた。 System VはAT&Tが開発した商用UNIXであり、商業的な成功を収めた。 一方で、BSDはカリフォルニア大学バークレー校で開発され、OSSのUNIXとして広まった。 BSDはネットワーキング機能やセキュリティの改良に力を入れ、後のUNIX系OSに多くの影響を与えた。

1.2.2. Linuxの誕生

1980年代初頭、UNIXは主に大学や研究機関で使用されコンピュータの世界において高度な操作性と柔軟性を提供していた。 しかし、商業的なUNIXバリエーションは高価であり一般のユーザーには手が届かない状況であった。

そんな中1991年フィンランドの学生であるLinus Torvaldsは、個人用コンピュータにUNIXのようなOSを作成するアイデアを抱きそれを実現するプロジェクトを開始した。 彼はそのプロジェクトにLinuxと名付け、その最初のバージョンを公開した。この行動は、自身のものだけでなく、世界中の開発者が協力して進めるOSSの哲学を採用していた。

Linus TorvaldsはGPL(GNU General Public License)と呼ばれるライセンスを採用しソースコードを公開することで、誰もがLinuxの開発に参加できる環境を提供した。 これにより世界中の開発者がLinuxの改善に貢献し、その成長を支えることができるようになった。 GPLはソフトウェアの自由な共有と改変を促進するものであり、Linuxコミュニティの発展に大いに寄与した。

Linuxはその後急速に進化し、多くのハードウェアプラットフォームや用途に対応するようになった。 こうして、Linus TorvaldsがLinuxを生み出し、GPLというライセンスによって世界中の人々が共同で育て上げることで、UNIXを踏まえた新たなOSの誕生が実現した。

1.2. ディストリビューション

1.2.1. ディストリビューションとパッケージ

LinuxはOSSのOSで、さまざまなディストリビューションが存在する。 ディストリビューションはLinuxカーネルをベースにして独自の特徴を持ち、さまざまな用途に合わせてカスタマイズされている。 Linuxは多くの場合、高いセキュリティ、安定性、カスタマイズ可能性を提供し、さまざまなデバイスや用途に利用されている。

ディストリビューションはたくさんのパッケージと呼ばれるソフトウェアコンポーネントをまとめて提供するもの。 これらのパッケージには、アプリケーション、ライブラリ、ドライバーなどが含まれている。

パッケージはソフトウェアのインストール、アップデート、削除を簡単かつ効率的に管理するための仕組みである。

ディストリビューションごとに異なるパッケージマネージャが使われていることがある。 パッケージマネージャは、たくさんのパッケージを管理するためのツールであり、新しいソフトウェアの導入や既存ソフトウェアのアップデートを容易にする。 代表的なパッケージマネージャとしては、Debianベースのディストリビューションで使われるAPT(Advanced Package Tool)や、Red Hatベースのディストリビューションで使われるRPM(Red Hat Package Manager)などがある。

ディストリビューションは、さまざまなユーザー層やニーズに合わせて提供されており、デスクトップ、サーバー、組み込みシステム、セキュリティテストなどの用途に特化したものが存在する。 また、ディストリビューションごとに独自のユーザーインターフェース、設定ツール、サポート体制が提供されており、ユーザーは自身の好みや目的に応じて選択できる。

1.2.2. 代表的なディストリビューション

以下にいくつかの有名なLinuxディストリビューションを含む表をまとめて表示する。

ディストリビューション特徴代表的なパッケージマネージャ
Red Hat Enterprise Linux (RHEL)企業向けに設計された堅牢なディストリビューション。商用サポート提供。RPM (yum/dnf)
CentOSRHELをベースにした無料のOSSディストリビューション。RPM (yum/dnf)
AlmaLinuxCentOS 8の終了に伴い代替として注目されているディストリビューションRPM (yum/dnf)
Fedora新機能の実験場としての役割を持つ、コミュニティ駆動型のディストリビューション。RPM (dnf)
DebianOSS志向で安定性を重視するディストリビューション。APT (apt)
Ubuntu初心者にも使いやすいデスクトップディストリビューション。APT (apt)
Linux MintUbuntuベースで、使いやすさと美しいデスクトップ環境に特化。APT (apt)
openSUSEユーザーと開発者の共同作業を重視し、堅牢なシステムを提供。Zypper
Arch Linuxユーザーカスタマイズと最新ソフトウェアに重点を置くローリングリリース。Pacman
ManjaroArch Linuxベースで使いやすいデスクトップ環境を提供するディストリビューション。Pacman
Slackware歴史あるオリジナルなディストリビューション。堅牢でカスタマイズ性高い。手動インストール
Kali Linuxセキュリティテストとペネトレーションテスト向けに特化したディストリビューション。APT (apt)
Tailsプライバシーと匿名性を重視し、セキュアなOSを提供。APT (apt)
Qubes OSセキュリティ重視のディストリビューション。仮想化基盤にXenを用いている。APT (apt)

1.3. Linuxの特徴とシェル

1.3.1 カーネルとユーザランド

OSはカーネルユーザランドという領域に分かれる。

カーネル

カーネル

カーネルはOSの中核となる部分で、ハードウェアと直接やりとりするなどもっとも中心的な機能を受け持つ部分。 カーネルはハードウェアの違いを吸収して、プログラムがどのようなハードウェア上でも同じように動作する役割がある。

Linuxにおいてのカーネルはアプリケーションが動作するための基本環境を提供する。

具体的には「メモリ管理」「CPUリソースの配分」「ハードウェアにおける処理順序の割り振り」など、ユーザが意識しないバックグラウンドで動く基本機能を行う。

ユーザランド

OSが動作するのに必要なカーネル以外の部分のこと。 ファイルシステムやファイル操作コマンド、シェルなどの基本的なソフトウェア群を指す。

1.3.2. Linuxカーネルの基本動作

Linuxカーネルが提供する基本的なカーネルの機能の一部を記載する。

割り込み管理

コンピュータに接続されているさまざまな周辺機器の入出力処理の割り込みを管理するもの。

割り込み処理はプロセッサが処理を行っている最中でも,特定の信号があると処理を中断して別の処理を行わせる処理のことを指す。Linuxカーネルでは割り込みをうまく利用してさまざまな処理を効率的に処理することが可能となっている。

メモリ管理

Linuxカーネルでは、物理メモリと仮想メモリを用いてデータを管理している。プロセス一つ一つに対して、実際に物理メモリのアドレスをそのまま割り当てるのではなく、物理メモリに対応した仮想アドレスを割り当てることで、実際の物理メモリの容量よりもはるかに大きな容量のメモリを利用可能にしている。

また、各プロセスに対して固有の仮想アドレスを割り振ることで、それぞれのプロセスのメモリ空間は独立させています。そのためプロセスのメモリを犯さないようになっている。

ファイルシステム

保存されているデータに対してファイルという形でアクセスできるように提供しているもの。 全てのデータをファイルと言う形で管理しています。/(root)(ルートディレクトリ)を頂点としたツリー状の構造をしており、カーネル自体もファイル、ディレクトリの集合体として存在する。

1.3.3. シェル

シェルとシェルスクリプト

Linux にはシェルという対話型のコマンド入力環境が用意されている。

シェル自体には大きく2 つの機能があり、1つはコマンド入力を受け付けること、もう 1 つはシェルスクリプトの実行がある。 シェルスクリプトとは、「コマンドの入力を自動化する」ためのもので1 つのファイルにコマンドを 1 行ずつ記述して作成する。 作成したシェルスクリプトを実行することで、コマンドの実行を自動化することができる。

また作成したシェルスクリプトをサーバーの起動時に実行したり、数時間毎に実行したりすることも可能。

シェルの種類

以下にいくつかの一般的なシェルとそれらの特徴を表で示す。

シェル名特徴と説明
BashBourne Again SHellの略。Linuxシステムで広く使用されるデフォルトのシェル。豊富なコマンドとスクリプト機能を提供。
Zshオープンソースの拡張可能なシェル。Bashの拡張版で、カスタマイズ性が高く、タブ補完などの便利な機能を備えている。
Fishユーザーフレンドリーな対話型シェル。自動補完やシンタックスハイライトなど、新しいユーザーにも親しみやすい特徴がある。
CshCシェルの略。Unixの初期から存在するシェルで、C言語に似た構文を持つ。カスタマイズ性は低いが、一部のユーザーには好まれる。
KshKorn SHellの略。Bourne Shellの拡張版で、シェルスクリプトの開発をサポートする高度な機能を提供。
DashDebian Almquist SHellの略。軽量なシェルで、起動が速く、システムの基本的なタスクを処理するのに適している。

1.2 - 2.システムアーキテクチャ

BIOS/UEFIやハードウェア機能、SystemdなどのLinuxシステムに関して

2.1. ハードウェア設定と構成

2.1.1. BIOSとUEFI

BIOS

BIOS(Basic Input Output System)はキーボードなどのデバイスを制御する基本的なプログラムでマザーボードや拡張カードのフラッシュROMに書き込まれている。 これはパソコンの起動時に最初に実行されるプログラムで、コンピュータの基本的なハードウェアを制御する役割を担っている。

BIOSの役割は以下の通り。

  • OSを起動するためのプログラムをディスクから読み込んで実行する
  • デバイスの動作を設定
  • 基本的な入出力の管理

UEFI

UEFI(Unified Extensible Firmware Interface)はBIOSの容量制限がなくなったり、GUIベースのセットアップ画面を利用できるなど拡張されたBIOSの後継規格。

UEFIはBIOSと異なり、C言語などのプログラミング言語を使用して開発された。 また、BIOSよりも高速で安定性が高く、セキュリティも強化されている。

UEFIには、BIOSに比べて多くの機能があり、起動ローダーやネットワークブート機能、セキュアブート機能などがある。

UEFIの特徴は以下の通り。

  • 起動ドライブの容量制限(2TB)の撤廃
  • GUIベースのセットアップ画面

UEFIとBIOSのセットアップ

OSがインストールされているコンピュータのBIOS/UEFIに入るにはコンピュータ起動後にBIOSに入るにはDeleteやF1、F2などを連打する必要がある。なお連打するキーはマザーボードのメーカによって異なる。

BIOS/UEFIでは以下項目を設定可能。

  • 日付や時刻(ハードウェアクロック)
  • ディスクドライブや各種デバイスのパラメータ
  • キーボードの使用/不使用
  • 電源管理
  • ブートデバイスの優先順位
  • デバイスへのIRQ(割り込み要求)の割り当て
  • 各種デバイスの使用/不使用

2.1.2. デバイスの情報確認

デバイスファイル

Linuxではハードウェアのアクセスを抽象化したデバイスファイルにて行う。デバイスファイルは/dev配下にある。

なおこれらはudevという仕組みにより自動的に生成される。

/procディレクトリ

Linuxカーネルが認識しているデバイス情報は/proc配下に格納される。

主なファイル説明
/proc/cpuinfoCPUの情報を格納したファイル
/proc/interruptsIPQなどの情報を格納したファイル
/proc/ioportsデバイスの制御とデータの受け渡しを行うI/Oポートのアドレスを格納したファイル
/proc/meminfoメモリの情報を格納したファイル
/proc/bus/usb/*USBデバイスの情報を格納したファイル
/proc/bus/pci/*PCIデバイスの情報を格納したファイル
/proc/cmdline起動時のカーネルオプションが格納したファイル

lspciコマンド

デバイスの情報を確認するためのコマンド。

lspci 
オプション説明
-v詳細に表示
-vvより詳細に表示

2.1.3. USBデバイス

USBはPCを周辺機器と接続するための規格。 特徴は以下の通り。

  • 最大127台のデバイスをUSB接続可能
  • 同一コネクタ
  • ホットプラグ
  • プラグ&プレイ
    • H/W、F/W、ドライバ、OS、アプリケーション間が自動的に協調し機器の組み込みと設定を自動的に行う
  • 電源供給

USBのバージョン

バージョン最大転送速度
USB 1.012Mbps
USB 1.112Mbps
USB 2.0480Mbps
USB 3.05Gbps
USB 3.110Gbps
USB 4.040Gbps

デバイスドライバ

ハードウェアの利用にはデバイスドライバが必要となる。 ドライバはベンダーが用意した専用ドライバとLinuxシステムが提供するクラスドライバに分けられる。

USBデバイスを使用するにはデバイスドライバが必要。これはUSBデバイスがデバイスクラスに応じて異なる方法で通信するために使用される。また、クラスドライバはデバイスクラスに準拠する。

デバイスクラスサポートするUSBデバイスの例
HID: Human Interface Deviceskbd, mouse
USB Mass Storage DeviceUSBメモリ、HDD、デジタルオーディオプレーヤー
オーディオマイク、スピーカー、サウンドカード
プリンタプリンタ
ワイヤレスコントローラーWi-Fiアダプタ、Blutoothアダプタ

なお、デバイスクラスの使用に沿ったUSBデバイスはクラスドライバで対応するため、専用のデバイスドライバは不要となる。

lsusbコマンド

接続されたUSBデバイスの情報を表示するためのコマンド。

lsusb
オプション説明
-v詳細な情報を表示
-tツリー形式でUSBデバイスを表示
-s [bus]:[device]特定のバス番号とデバイス番号で指定されたUSBデバイスの情報を表示
-d [vendor]:[product]特定のベンダーIDとデバイスIDで指定されたUSBデバイスの情報を表示

2.1.4. udev

udevはデバイスの管理とドライバの自動検出を行う仕組み。 udevはシステムに新しいデバイスが追加された場合、デバイスの属性情報を取得し、それに基づいて対応するデバイスドライバを自動的に読み込むことができる。

デバイスの情報は、D-Busと呼ばれるプロセス間通信(IPC)のための機構により、異なるアプリケーション間でデータやシグナルを送信したり、受信したりすることができる。

2.1.5. デバイスドライバのロード

lsmodコマンド

lsmodコマンドはロードされたカーネルモジュールの一覧を表示するためのコマンド。 カーネルモジュールは、カーネル内で動作するドライバーやファイルシステムなどの機能を提供している。

lsmod

modprobeコマンド

modprobeコマンドはカーネルモジュールを手動でロードするためのコマンド。modprobeコマンドを使用すると、特定のカーネルモジュールをロードしたり、モジュールの依存関係を自動的に解決したりすることができる。

modprobe <カーネルモジュール名>

2.2. システムの起動とシャットダウン

2.2.1. Linuxのシステム起動フロー

OSが起動するまでの流れは基本的には以下の通り。(x86アーキテクチャ構成の場合)

  1. BIOS/UEFIが起動し、ハードウェアチェックや初期化を行い、ブートローダを読み出し制御を移す
  2. カーネルはメモリの初期化、システムクロックの設定を行い、初期RAMディスクをマウントする
  3. カーネルは最初のプロセスであるinit(またはsystemd)プロセスを実行する

起動

2.2.2. システム起動時のイベント確認方法

システム起動時にカーネルがどのような処理を行ったかはログファイルである/var/log/message/var/log/dmesg/var/log/boot.logなどに保存される。

これらのファイルはテキストファイルなのでcatコマンドで閲覧可能となる。なお閲覧にはroot権限が必要な場合がある。

dmesgコマンド

dmesgはシステム起動時にカーネルがどのような処理を行かったか確認できるコマンド。

dmesg

journalctl -kコマンド

systemdを採用したシステムにおいてdmesgコマンドと同様にカーネルのバッファを表示することができるコマンド。 bオプションでシステム起動時のメッセージの表示が可能。

journalctl -k

2.2.5. シャットダウンと再起動

shutdownコマンド

shutdownコマンドはシステムのシャットダウンや再起動を行うことができるコマンド。

shutdown [オプション] 時間 <メッセージ>
オプション説明
-hシャットダウン後にシステムを停止する
-rシャットダウン後にシステムを再起動する
-kシャットダウンを実際には行わず、ユーザーに警告メッセージを表示する
-tシャットダウンまでの待機時間(秒)を指定する
-cシャットダウン処理をキャンセルする
-fシャットダウン処理を強制的に実行する

以下の例は30分後にシステムを停止し、ログインしているユーザに「Please logout now」とメッセージを表示するもの。

shutdown -h +30 "Please logout now."

systemctlコマンド

systemdを採用したLinuxシステムではshutdownの代わりにsystemctl rebootで再起動、systemctl poweroffでシステムの終了が行える。

systemctl reboot //再起動
systemctl poweroff //システム終了

2.3. SysVinitとランレベル

2.3.1. SysVinitによる起動

SysVinitはかつて使用されていたLinuxの起動の仕組み。 現在はsystemdのほうが主流となっている。

SysVinitによる起動順序は以下の通り。

  1. initが/etc/inittabファイルを読み込む
  2. initが/etc/rc.sysinitnスクリプトを読み込む
  3. initが/etc/rcスクリプトを実行する
  4. /etc/rcスクリプトが /etc/rc<ランレベル>.dディレクトリ以下のスクリプトを実行する

SysVinitはサービスを順次起動に時間がかかる、依存関係を適切に処理できない問題があった。これらの問題を解決した起動の仕組みにはupstartsystemdがある。

Upstart

UpstartはSysVinitを改善した新しいinitの仕組みで以下の特徴がある。

  • 依存関係を適切に処理
  • 並列起動
  • イベント駆動

2.3.2. ランレベル

ランレベルはLinuxシステムの動作モードのこと。 システムのデフォルトのランレベルは/etc/inittabに記載されている。 またこのファイルで起動する際のランレベルも設定できる。

ランレベルRedHat系Debian系
0停止停止
1シングルユーザモードシングルユーザモード
2マルチユーザモード(テキストログイン、NFSサーバは停止)マルチユーザモード
3マルチユーザモード(テキストログイン)マルチユーザモード
4未使用マルチユーザモード
5マルチユーザーモード(グラフィカルログイン)マルチユーザモード
6再起動再起動
S or sシングルユーザーモードシングルユーザモード

runlevelコマンド

現在のランレベルの確認を行うコマンド。

runlevel

表示は<以前のランレベル> <現在のランレベル>で表示される。

init/telinitコマンド

ランレベルの変更を行うコマンドで実行にはroot権限が必要。

init 1
telinit 1

wallコマンド

wallコマンドはログインしているユーザー全員の端末画面に一斉にメッセージを送信するコマンド。再起動や停止を行う際にシステム利用者に通知するために使用する。

wall [ -a ] [ -g Group ] <メッセージ>

2.3.3. 起動スクリプトのサービス管理

ランレベルごとに起動するサービスは異なり、確認は/etc/rcN,d(Nは数字)で確認できる。

例えば/etc/rc3.dではランレベル3の時に起動するスクリプトを確認できる。

2.4. Systemd

2.4.1. Systemdの概要

Systemdのシステムではinitの代わりにsystemdプロセスが起動し各サービスの管理を行う。またSystemdは処理を分割して並列化することでシステム起動処理を高速化している。具体的には以下のような複数のデーモンプロセスが連携して動作する

プロセス説明
systemdsystemdを統括するメインプロセス
systemd-journaldジャーナル管理、ログ管理
systemd-logindログイン処理
systemd-networkdネットワーク管理
systemd-timesyncdシステムクロック同期
systemd-resolved名前解決
systemd-udevdデバイス動的検知

またSystemdではUnitという処理単位でシステムの起動処理が行われる。

種類説明
service各種サービスの起動
device各種デバイスの表現
mountファイルシステムのマウント
swapスワップ領域の有効化
target複数のUnitのグループ化
timer指定した日時・間隔での処理実行

2.4.2. Systemdの起動順序

systemdにはランレベルの概念がない。 その代わりにシステム起動時には/etc/systemd/system/default.targetというUnitが処理される。

またグラフィカルログイン(ランレベル5)に相当するUnitは/etc/systemd/system/graphical.targetとなる。

SysVinitのランレベルでSystemdのUnitを置き換えると以下のようになる。

ランレベルターゲット
0poweroff.target
1rescue.target
2 ~ 4multi-user.target
5graphical.target (multi-user.target + )
6reboot.target

default.targetは、上記のターゲットのシンボリックリンクを作成することで設定することができる。

2.4.3. systemctlコマンド

systemctlコマンドはsystemdにおけるサービスを管理を行うコマンド。

systemctl [サブコマンド]
サブコマンド説明
start / stopサービスの起動 / 終了
restartサービスの再起動
reloadサービスの設定を再読み込み
statusサービスの稼働状況の出力
is-activeサービスが稼働しているかの出力
enable / disableシステム起動時にサービスを自動で起動 / 自動で起動しない
rebootシステムの再起動
list-units起動している全てのUnitの状態を表示
list-unit-files全てのUnitを表示
list-dependenciesUnitの依存関係の表示

2.4.4. journalctlコマンド

journalctlコマンドはsystemd-journaldが収集したログを表示するためのコマンド。パイプやgrepコマンドと組み合わせて使用することが多い。

journalctl

1.3 - 3.Linuxのインストールとパッケージ管理

Linuxのインストール際の補足(パーティションやSwap)、aptなどのパッケージマネージャに関して

3.1. ハードディスクのレイアウト設計

3.1.1. Linuxに必要なパーティション

Linuxのインストールにはルートパーティションスワップ領域の最低2つの領域が必要になる。

ルートパーティション

ルートパーティションは/で表されるシステムファイルが含まれる領域のこと。 後述するパーティション分割を行うと障害発生の復旧が容易になる。

スワップ領域

スワップ領域は仮想メモリの領域であり、物理メモリ不足時に、仮想的なメモリ領域として一時的に使用する領域。 一般的には/swapfileという名前になる。

搭載メモリの1から2倍は割り当てる必要がある。

パーティションを分割できるディレクトリ

また以下のルート以下のディレクトリはパーティションを切って割り当てることができる。 メリットは以下の通り。

  • 柔軟なシステムの管理が可能
  • ディスク障害児の復旧作業や障害の軽減
ディレクトリ説明分けるメリット
/homeユーザ別のホームディレクトリが置かれる環境引継ぎが可能(ディストリビューションの変更など)
/bootシステムブートにに使われるディレクトリ
/varログやスプールが置かれるログをルートから分離できる
/usr全体でシェアしたいプログラム/ライブラリ/ドキュメントが置かれる
/tmp一時ファイルが置かれるディレクトリ

3.1.2. パーティションのレイアウト設計

パーティションのレイアウトを設計する場合以下の点を考慮して設計する必要がある。

  • システムの用途
    • 使用規模
    • 使用目的
  • ディスクの容量
  • バックアップの方法

例: 200GBのハードディスク、1GBメモリ、ユーザ規模100人のファイルサーバを構築する場合

考慮事項としてはスワップ領域は物理メモリと同等、/bootに先頭100MB程度含まれること、/を最小化すること、/homeはユーザ数が多いファイルサーバという特性上最も多くすることがある。

  • メモリの分割
    • スワップ領域: 1GB
    • /boot: 100MB
    • /usr: 10GB
    • /var: 10GB
    • /: 1GB
    • /home: 残りのすべて(約180GB)

例: 100GBのハードディスク、4GBのメモリのWebサーバをApacheで構築する場合

考慮事項としてはスワップ領域は物理メモリと同等、/bootに先頭数100MB程度含まれること、/var/logはログファイルが沢山たまることになるので多くとることがある。

  • メモリの分割
    • スワップ領域: 4GB
    • /boot: 100MB
    • /usr: 10GB
    • /var: 20GB
    • /var/log: 50GB
    • /: 15GB

3.1.3. LVM

LVMは論理ボリューム管理と呼ばれる物理ボリュームを束ねて仮想ディスクを作る仕組みのこと。

物理ボリュームを束ねたものはボリュームグループとなり、ボリュームグループ上に仮想的なパーティションを作ることになる。 この仮想的なパーティションが論理ボリュームとなる。

3.2. ブートローダのインストール

3.2.1. ブートローダとGRUB

ブートローダは広義ではBIOSから呼び出されカーネルを呼び出すものでハードディスク等からOSを起動するためのプログラムを指す。 代表的なものにはGRUBがある。 GRUBの特徴は以下の通り。

  • 多数のファイルシステムの認識が可能
  • シェル機能の搭載

またGRUBにはバージョン0.9系のGRUB Legacyとバージョン1.9系のGRUB2があり、それぞれパーティションの数え方が異なる

項目GRUB LegacyGRUB2
Version0.9x1.9x
ディスク番号0から1から
パーティション番号0から1から

3.2.2. GRUBのインストール

GRUBのインストールは以下コマンドより行える。

sudo grub-install /dev/sda # /deb/sda の MBRに GRUB Legacyのインストール
grub-install -v # GRUBのバージョン確認
grub-install -V # GRUB2のインストール

3.2.3. GRUB Legacyの設定

GRUBの設定は/boot/grub/menu.lstまたは/boot/grub/grub.confの編集で行える。 内部の表示には(hd0,0)などと表示され0から始まる

3.2.4. GRUB2の設定

GRUB2の設定は/boot/grub/grub.cfgに自動生成されるためファイルを直接触ってはいけない。 設定の際に触るファイルは/etc/default/grubとなりgrub2-mkconfigコマンドなどで設定を反映する。

なおパーティションは1から始まる

# 設定ファイルの生成
sudo grub-mkconfig -o /boot/grub/grub.cfg 

3.3. 共有ライブラリ管理

ライブラリはよく使わられる機能をまとめ再利用するためのもの。 種類は2つあり、静的ライブラリ共有ライブラリがある。

3.3.1. 静的ライブラリ

静的ライブラリは実行プログラムにライブラリを含めた形でリンクされるライブラリ。 特徴は以下の通り。

  • 1つのプログラムだけで動作させることができ別環境で動作可能
  • プログラムのサイズが大きくなる

3.3.2. 共有ライブラリ

共有ライブラリはプログラム実行と同時にメモリ上に展開されるライブラリで複数のプログラム間で共有される。 特徴は以下の通り。

  • プログラム全体のサイズが小さくなる
  • プログラム実行時に適切に配置されたライブラリが必要となる

3.3.3. スタティックリンクとダイナミックリンク

リンクはプログラムからライブラリの機能を呼び出すことを指す。

スタティックリンク

スタティックリンクではコンパイル時に実行ファイルに埋め込む。 これにより呼び出されるのは静的ライブラリとなる。

ダイナミックリンク

ダイナミックリンクではコンパイル時では埋め込んでおかず実行時にライブラリの機能が呼び出しされる。 これにより呼び出されるのは共有ライブラリとなる。

なお共有ライブラリは/libまたは/usr/libに配置されており、Linuxのディストリビューションでは共有ファイルはlib.xxx.soという名前で構築されている。

tree -L 1 /usr/lib | grep so

3.3.4. lddコマンド

lddコマンドでは必要な共有ライブラリの確認をすることができる。

なお.soを探す場所は/etc/ld.so.confで定義される。

ldd /usr/bin/ldd

3.3.5. ldconfigコマンド

ldconfigコマンドでは共有ライブラリを認識させることができる。 これの実行によりld.so.cacheが更新される。

sudo ldconfig

3.3.6. 共有ライブラリの環境変数

共有ライブラリの検索で使用する環境変数はLD_LIBRARY_PATHとなる。

3.4. Linuxのパッケージ管理

3.4.1. パッケージとは

パッケージは実行プログラムや設定ファイル、ドキュメントを1つにまとめたもの。 パッケージの管理はディストリビューションにより異なる。

  • Debian系
    • Debian GNU/Linux
    • 拡張子は「.deb」
  • RPM系
    • Red Hat Enterprise Linux
    • 拡張子は「.rpm」

3.4.2. パッケージ管理とは

パッケージ管理システムはパッケージのインストール/アンインストール、アップデートを簡易にする仕組み。 パッケージ管理システムではどこにパッケージが保存されているか管理、依存関係競合関係の管理を行う。

  • パッケージの依存関係
    • あるパッケージに含まれるファイルを別のパッケージが利用している場合の関係
  • パッケージの競合関係
    • あるパッケージによってインストールされるファイルが、すでに別のパッケージによりインストールされている場合、すでにインストールされているファイルと競合する場合の関係

3.4.3. パッケージの管理形式

パッケージの管理形態のDebian系、RedHat系に互換性はないが、aliasコマンドで相互交換が可能。

Debian系(deb)RedHat系(rpm)
ディストリビューションDebian系RedHat系
パッケージの管理dpkg, aptrpm, yum

3.5. Debian系のパッケージ管理

3.5.1. dpkgコマンドによるパッケージ管理

パッケージファイル名の構成

パッケージであるdebファイルは以下のような構成となる。

sample_1.2.3-1_i386.deb
  • sample … パッケージ名
  • 1.2.3 … バージョン番号
  • 1 … リビジョン番号
  • i386 … CPUアーキテクチャ

コンフィグファイル(/etc/dpkg/dpkg.cfg)

dpkgのコンフィグファイルは/etc/dpkg/dpkg.cfgにある。

dpkgコマンド

dpkg -i <パッケージ名(.deb含む)>
オプション説明
-E同じバージョンがすでにインストールされている場合、インストールは行わない
-G新バージョンがすでにインストールされている場合、インストールはしない
-Rディレクトリ構造を再帰的に処理する
アクション説明
-iパッケージをインストール
-Iインストール済みの詳細情報を表示
-rパッケージをアンインストール (設定ファイルは残す)
-Pパッケージをアンインストール (設定ファイルを含めて完全に削除)
-lインストール済みパッケージを検索して表示
-Lパッケージからインストールされたファイルを一覧表示
-sインストール済みのパッケージの詳細情報の表示
-S指定したファイルが、どのパッケージからインストールされたものかを調査
-cパッケージに含まれるファイルの一覧表示
-C / –auditパッケージのインストール状態を検査

dpkg-reconfigureコマンド

dpkg-reconfigureコマンドは既にインストールされたdebパッケージの状態を再設定するもの。

3.5.2. apt-getコマンドによるパッケージ管理

apt-getコマンドはアプリケーションの依存関係を調整しながらパッケージのインストール、アップグレードを行うため依存解決までできる。 またインターネット経由で最新パッケージ取得する

apt-getコマンド

apt-get <オプション> <パッケージ名>
apt-getコマンドのオプション説明
-dインストールせずにダウンロードのみ行う
-sシステムを変更せずに動作をシミュレートする
–purge設定ファイルを含めてパッケージを削除する (removeコマンドと一緒に指定)
cleanダウンロードしたパッケージファイルを削除する
dist-upgradeDebianのシステムを最新にアップグレードする
install指定したパッケージをインストール、またはアップグレードする
remove指定したパッケージをアンインストール ( 設定ファイルは残す )
updateパッケージのリスト情報(データベース)を最新に更新する
upgradeシステムの全パッケージを最新版にアップグレードする
オプション説明
-c設定ファイルの指定(デフォルトでは/etc/apt/sources.list)
-y全部yes
-dダウンロードのみ
-sシステムを変更せず動作をエミュレートする
no-install-recommends必須ではないパッケージをインストールしない
–resinstall最新版がインストールされていてもインストール
clean取得したパッケージのローカルリポジトリを掃除する
dist-upgradeディストリビューションをアップグレードする
install新規パッケージをインストールする
removeパッケージが削除される(削除されたパッケージの設定ファイルは残る)
purgeパッケージが削除かつ完全削除(設定ファイルも含む)
update設定されたすべての取得元からパッケージ情報をダウンロードする
upgrade現在インストール済みのすべてのパッケージで利用可能なアップグレードをインストールする
full-upgradeシステムのメジャーバージョンを最新にアップグレードする(dist-upgradeと同じ)
autoremove必要なくなったパッケージの削除

パッケージの取得先(設定ファイル)

パッケージの取得先は/etc/apt/sources.list/etc/apt/sources.list.d/*に保存される。

/etc/apt/sources.listの中身は以下のように表示される。

...
deb http://security.ubuntu.com/ubuntu bionic-security main restricted
# deb-src http://security.ubuntu.com/ubuntu artful-security main restricted
deb http://security.ubuntu.com/ubuntu bionic-security universe
# deb-src http://security.ubuntu.com/ubuntu artful-security universe
deb http://security.ubuntu.com/ubuntu bionic-security multiverse
# deb-src http://security.ubuntu.com/ubuntu artful-security multiverse

apt-cacheコマンド

apt-cache はインストール済みとインストール可能なパッケージの情報の照会と検索が可能なコマンド。

apt-cache
サブコマンド説明使用例
search - 正規表現正規表現パターンによってパッケージ一覧を検索apt-cache search apache2 | head -n 5
show一般的な情報を表示apt-cache show apache2 | head -n 20
showpkg <パッケージ名>詳細な情報を得るapt-cache showpkg apache2
depends - <パッケージ名>パッケージの生の依存情報を表示apt-cache depends apache2

aptitudeコマンド

aptitudeコマンドはapt-getよりも高機能なコマンド。 apt-getとapt-cacheの機能をもつ。

aptコマンド

aptコマンドはapt-getの後発のコマンド。 主なオプションはapt-getと同じもの使える。

aptのリポジトリの登録

aptのリポジトリの登録はadd-apt-repositoryコマンドで可能。

3.6. RedHat系のパッケージ管理

3.6.1. rpmコマンドによるパッケージ管理

パッケージファイル名の構成

パッケージであるrpmファイルは以下のような構成となる。

sample_1.2.3-1_x86_64.rpm
  • sample … パッケージ名
  • 1.2.3 … バージョン番号
  • 1 … リビジョン番号
  • x86_64 … CPUアーキテクチャ

rpmコマンド

rpm -i <パッケージ名(.rpm含む)>
オプション説明
-v, –verbose詳細を表示
-h, –hash#で進捗表示
-i, –installインストール
-F, –freshenパッケージがインストールされていればアップグレード
-U, –upgradeパッケージがインストールされていればアップグレード。なければインストールする
-e, –eraseパッケージをアンインストール

使用例は以下の通り。

rpm -ivh nmap-5.51-2.el6.i686.rpm # nmapのインストール

rpm -qコマンド

rpmの照会モード。

rpm -q<オプション>
オプション説明
-a, –aインストール済みパッケージの全表示
-i, –info情報の表示
-f, –fileファイルをバッケージに
-l, –listパッケージ->ファイル群
-pパッケージ名でパッケージ指定
-R, –requires依存関係調べる
–changelog変更履歴見る
-K, –checksigRPMパッケージの電子署名の検証

使用例は以下の通り。

rpm -qa | grep bash # bashというパッケージ探す
rpm -qi bash # bashパッケージの情報取得
rpm -qR bash # bashの依存関係の調査

rpmパッケージの展開

rpmパッケージの展開はrpm2cpioコマンドで行う。 このコマンドではRPMバッケージをインストールせず、内容を展開を行う。

3.6.2. yumコマンドによるパッケージ管理

yumはAPTツール同様、パッケージ間の依存関係を解決しながらダウンロード、インストール、アップデート、アンインストールすることができ、またインターネット経由で最新パッケージ取得してくれるコマンド。

yumコマンド

yum <オプション> <パッケージ名>
オプション説明
installインストール
removeアンインストール
update全パッケージのアップデート
update [package]指定のパッケージのアップデート実施
check-updateアップデートパッケージが存在するパッケージを一覧表示
info [package]パッケージ情報の確認
listリポジトリにあるすべてのパッケージ情報表示
searchキーワード検索

パッケージの取得先(設定ファイル)

パッケージの設定ファイルは/etc/yum.conf/etc/yum.repos.d/*に保存される。

/etc/yum.repos.d/hogehoge.repoの中身の例は以下のように表示される。

...
[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#released updates 
[updates]
name=CentOS-$releasever - Updates
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

3.6.3. dnfコマンドによるパッケージ管理

dnfコマンドは基本的にyumとほぼ同じように使えるコマンド。

3.6.4. zipperコマンドによるパッケージ管理

openSUSEではzypperコマンドでパッケージ管理を行う。

3.7. 仮想環境のゲストOSとしてのLinux

3.7.1. インスタンス

インスタンスはクラウドサービス上の仮想的マシンのことを指す。 XaaSで提供される。

3.7.2. Cloud-initとは

cloud-init はクラウドにおけるインスタンスの早期初期化を行うLinuxパッケージのこと。 ディストリビューションで使用可能な場合はインストール後にインスタンスの多くの一般的なパラメータを直接設定できる。 設定できるパラメータは以下の通り。

  • ホスト名
  • SSH鍵
  • 一般ユーザー
  • インストールするパッケージ

1.4 - 4.UNIX/Linuxコマンド

Linuxの操作をするためのUNIX/Linuxコマンドに関する説明

4.1. シェル

4.1.1. シェルとシェルの種類

シェルとは

シェルはコマンドを解釈して実行するプログラムのこと。 利用可能なシェルは/etc/shellsで確認可能。

シェルの種類

シェル説明
shUNIX V7から標準添付されているUNIXの基本的なシェル
cshC言語スタイルの構文を持ったUNIX系OSの代表的なシェル
tcshCシェルの派生版の中で特にユーザーインターフェイス部分を中心に拡張されたシェル
kshBシェルと上位互換を保ちながら、Cシェルなどから優れた機能を取り込んだシェル
bashUNIX系のシェルの1つでLinuxで用いられる標準のシェル

ログインシェル

ログインシェルはシステムへのログイン直後に起動するシェルのことで、これはユーザごとに定義が可能。 ユーザごとのログインシェルは/etc/passwdファイルに記述される。

なお現在ログインしている自身が使用しているシェルはps $$コマンドで確認できる。

4.1.2. シェルの基本操作と設定

シェルのキーボード操作

入力キー説明
Tabキーコマンドやディレクトリ名などを補完する
Ctrl + C実行処理を中断する
Ctrl + Z実行処理を一時停止する
Ctrl + A行の先頭へカーソルを移動する
Ctrl + Dカーソル上にある文字列を1文字削除する
Ctrl + E行の最後へカーソルを移動する
Ctrl + Hカーソルの左側の文字列を1文字削除する
Ctrl + L画面をクリアして、現在の行だけを再表示する
Ctrl + Q画面への出力を再開する
Ctrl + S画面への出力を停止する

ディレクトリの指定

メタキャラクタ説明
~ホーム
.カレントディレクトリ
..1つ上のディレクトリ

4.1.3. シェル変数と環境変数

Linuxが扱う変数にはシェル変数と環境変数の2種類がある。

シェル変数

シェル変数は現在実行しているシェルの中だけで有効な変数のこと。 特徴は以下の通り。

  • シェルを終了すると失われる
  • 別のシェルから参照することはできない

利用方法はecho $変数名で行い、例は以下の通り。

echo $hoge
hoge=123

なおunset 変数名で定義した変数の削除が可能。

環境変数

環境変数は現在実行しているシェルとそのシェルで実行されたプログラムにも引き継がれる変数のこと。

利用方法はexport 変数名で行い、例は以下の通り。

hoge=123
export hoge

また主な環境変数は以下の通り。

環境変数説明
PWDカレントディレクトリ
HOSTNAMEホスト名
USER現在のユーザー
LOGNAMEログインシェルのユーザー名
HISTSIZEコマンド履歴の最大値
HISTFILEコマンド履歴を格納するファイル
HISTFILESIZEHISTFILEに保存する履歴数
LANGロケール
HOMEカレントユーザーのホームディレクトリ

またPATHは既存のパスの後ろに;区切りで追加して以下のように通す。

export PATH=$PATH:/additional/path

シェル変数/環境変数の確認

シェル変数と環境変数を確認するためにはsetコマンドを使用する。 また設定済みの環境変数を一覧表示するためには、envコマンドやprintenvコマンドを使用する。

4.1.4. コマンドの実行と引用句

コマンドの区切り文字との実行

コマンドの区切り文字でコマンドを挟むと以下のような効果がある。

<コマンド1> <区切り文字> <コマンド2>
区切り文字説明
;コマンドを同時に実行
&&最初に実行したコマンドが正常に終了できた場合のみ次コマンドを実行
||最初に正常にコマンド終了できなかった場合のみ次コマンドを実行
コマンドに引用句を使う
引用句説明
''常に文字列として扱う
""変数展開する
~~コマンド展開する
``コマンドを実行した結果を展開する

4.1.5. コマンド履歴の確認とマニュアルの確認

historyコマンド

historyコマンドはコマンド履歴を確認するコマンド

コマンド説明
history 数字数自分だけ過去の履歴を表示
!数字数字のコマンドを実行
!!直前のコマンドを実行

manコマンド

manコマンドはオンラインマニュアルページを閲覧できるコマンド。 マニュアルを構成するファイルは/usr/share/manにある。

man <オプション> コマンド | キーワード
オプション説明
-a全てのセクションのマニュアルを表示
-f指定された完全一致のキーワードを含むドキュメントを表示
-k指定された部分一致のキーワードを含むドキュメントを表示
-wマニュアルの置かれているディレクトリの表示

4.2. ファイル操作の基本コマンド

4.2.1. 基本的なコマンド

lsコマンド

カレントディレクトリを基準にそこに存在するファイルを表示するコマンド。

ls <オプション>
オプション説明
-Aすべて表示
-l詳細表示
-dディレクトリ自身の表示
-iinode番号表示
-t日付順
-hファイルサイズ表示

cpコマンド

ファイルをコピー/上書きするコマンド。

cp <オプション> <移動元> <移動先>
オプション説明
-f強制上書き
-i対話モードで上書き確認
-pアクセス権/所有者などの保護
-r再帰的にコピーする(ディレクトリコピーには必須)

mvコマンド

ファイルを移動させるコマンド。

mv <オプション> <移動元> <移動先>

mkdirコマンド

ディレクトリを作成するコマンド。

mkdir <ディレクトリ名>
オプション説明
-m指定したアクセス権でディレクトリ作成
-p親ディレクトリも作る

rmコマンド

ファイルやディレクトリを削除するコマンド。

rm -rf <ファイル名>
オプション説明
-f強制的に削除
-r再帰的に削除
-i削除に確認をする

rmdirコマンド

空のディレクトリを削除するコマンド。

rmdir <ディレクトリ名>

touchコマンド

タイムスタンプの更新やファイルの作成を行うコマンド。

touch <ファイル名>
オプション説明
-aアクセス時間の更新
-m更新時間のみの更新
-tタイムスタンプの指定

fileコマンド

ファイルがテキストかバイナリか文字コードが何か確認するコマンド。

file <ファイル名>

typeコマンド

コマンドの実態を調査するコマンド。

type <コマンド>

whichコマンド

コマンドのフルパス(どこに存在するか)を教えるコマンド。

which <コマンド>

4.2.2. メタキャラクタ(正規表現)

メタキャラクタを用いることで絞り込みなどが行える。

メタキャラクタ説明
*0文字以上の任意の文字列
?任意の1文字
[]括弧内で列挙された文字のいずれか一文字
[!]括弧内で列挙された文字にマッチしない任意の一文字
{}フレーズ展開

4.2.3. ファイル内容の確認/操作を行うコマンド

catコマンド

ファイルの内容を表示するコマンド。 -nオプションで各行ごとに行番号を付加する。

cat <ファイル名>

headコマンド

ファイルの先頭n行を表示するコマンド。

head <オプション> <ファイル名>
オプション説明
-n先頭から表示する行数の指定
-行数先頭から表示する行数の指定
-c バイト数先頭から表示するバイト数の指定

tailコマンド

ファイルの末尾n行を表示するコマンド

tail <オプション> <ファイル名>
オプション説明
-n末尾から表示する行数の指定
-行数末尾から表示する行数の指定
-c バイト数末尾から表示するバイト数の指定
-fファイルの末尾に追加された行をリアルタイムで表示

cutコマンド

テキストファイルの各行から指定した部分の文字列を取り出して表示するコマンド。

cut <オプション> <ファイル名>
オプション説明
-c 文字数指定したテキストファイルから切り出す文字位置を指定
-d 区切り文字フィールドの区切り文字を指定
-f フィールド取り出すフィールドの指定

nlコマンド

文字列の行だけでなくヘッダ、本文、フッタの部分に分けて行番号を付けるコマンド。

nl -b a data.txt
オプション説明
-b パラメータ本文に行番号を付加
-h パラメータヘッダに行番号を付加
-f パラメータフッタに行番号を付加
パラメータ説明
a全ての行に番号をつける
t空白行には番号をつけない
n行番号の付加をつけない

odコマンド

バイナリファイルの内容をASCII文字、8進数、16進数のいずれかで表示するコマンド。

od -t x data.txt
オプション説明
-jバイナリファイルの bytes の場所から表示を開始
-t表示タイプの指定(以下のようなタイプを指定可能)
タイプ指定文字説明
a文字の名前
cASCII文字かバックスラッシュつきのエスケープ文字
d符号付きの10進数
f浮動小数点数
o8 進数
u符号なしの10進数
x16 進数

joinコマンド

2つのファイルを読み込み、共通のフィールドを持つ行の連結を行うコマンド。 -j 数字オプションで連結フィールを指定できる。

join -j 1 data1.txt data2.txt

pasteコマンド

1つ以上のファイルを読み込み、一致する行を区切り文字を使用して連結するコマンド。 -d 区切り文字オプションで区切り文字の指定が可能。

 paste -d"," date1.txt date2.txt

trコマンド

文字列の変換、削除を行うコマンド。

tr <オプション> <文字列1> <文字列2>
オプション説明
-d「文字列1」で合致した文字列の削除
-s連続するパターン文字列を1文字として処理
文字列の指定方法説明
[ :alpha:]英字
[ :lower:]英小文字
[ :upper:]英大文字
[ :digit:]数字
[ :alnum:]英数字
[ :space:]スペース

sortコマンド

行単位でファイルの内容をソートするコマンド。

sort <オプション> data.txt
オプション説明
-b行頭の空白を無視
-f大文字小文字の区別を無視
-r降順にソート
-n数字を文字ではなく数字として処理

uniqコマンド

並び替え済みのデータから重複行を削除して、1行にまとめて表示するコマンド。 重複行を削除するために、ファイルの内容をsortコマンドなどにより並び替えてから実行することが多い。

sort data.txt | uniq
オプション説明
-d重複している行のみ出力
-u前後の行と異なる行を表示

splitコマンド

指定サイズでファイルを分割するコマンド。

split -l 10 data.txt
オプション説明
-l 行数指定した行数でのファイル分割。-l を省力することも可能。
-b バイト指定したバイト数でのファイル分割。

prコマンド

印刷前に使用されるファイルの書式を整えるコマンド。

pr -l 30 +1:5 data.txt
オプション説明
+開始ページ [:終了ページ]開始ページや終了ページの指定
-h ヘッダ文字列ヘッダに表示されるファイル名を、指定した文字に変更
-l ページ長ヘッダとフッタを含めたページの長さを行数で指定

fmtコマンド

テキストファイルを決められた桁に整形するコマンド。 -w 文字幅オプションで位置行幅を指定可能。

fmt <オプション> <ファイル名>

expand/unexpandコマンド

expandコマンドはテキストファイルの中にあるタブをスペースに変換するコマンド。 unexpandコマンドはスペースをタブに変換するコマンド

expand/unexpand <オプション> <ファイル名>
expandのオプション説明
-i行頭のタブのみスペースへ変換。
-t 数値置き換える桁数の指定。タブ幅のデフォルトでは8桁
unexpandのオプション説明
-a行頭以外のスペースも変換。
-t 数値置き換える桁数の指定。デフォルトでは8桁。

wcコマンド

指定したファイルの行数、単語数、文字数を表示するコマンド。

wc data.txt
オプション説明
-c文字数だけの表示
-l行数だけの表示
-w単語数だけの表示

4.3. パイプとリダイレクト

4.3.1. 標準入出力

Linuxのコマンドは、標準入力、標準出力、標準エラー出力を処理するように作成されてる。 ストリームはデータの入出力に伴うデータの流れを指し、ディスプレイ出力、キーボード入力等すべてがこれに抽象化されている。

ストリームとしての基本的なインタフェースは以下の通り。

番号(ファイルディスクリプタ)入出力名デフォルト
0標準入力キーボード
1標準出力画面(端末)
2標準エラー出力画面(端末)

4.3.2. パイプ

パイプ\|標準出力を標準入力につなぐやつもののこと。 使用例は以下の通り。

ls | wc -l 
書式説明
コマンド1コマンド2
コマンド1 2>&1コマンド2
コマンド1tee ファイル

teeコマンド

teeコマンドは標準入力から読み込んでファイルに書き込み、次のコマンドへ実行結果を引き渡せられるもの。 使用例は以下の通り。

オプション-aでファイルに追記する。

ls -l | tea data.txt

4.3.3. リダイレクト

リダイレクトを使用することでコマンドの実行結果を画面上ではなくファイルに保存することが可能。

リダイレクト説明
>出力のリダイレクト
»出力をファイルに追記
<入力のリダイレクト
«入力終端文字の指定
2>エラー出力をファイルに設定し、コマンドを実行
2>&1標準出力とエラー出力をファイルに設定し、コマンドを実行

4.3.4. ヒアドキュメント

ヒアドキュメントは<<EOFで始まる特定の文字列(この例ではEOF)が現れるまで標準入力から入力を受け付けるもの。

1.5 - 5.Linuxのテキストエディタの使い方

vi/vim、nano等の使い方に関する説明

5.1. viの使用方法

Escで入力モードからコマンドモードへ切り替え。

5.1.1. viの基本的なコマンド

コマンド名説明
vi <ファイル名>ファイルを開くまたは新規作成する
vi Return キー新規ファイルを開く (ファイル名は後で指定)
vi -r <ファイル名>システムクラッシュ時のファイルを復元して開く
view <ファイル名>読み取り専用でファイルを開く

5.1.2. viのカーソル操作

コマンド名説明
h左に移動
l右に移動
k上に移動
j下の行の先頭文字 (空白ではない) に移動
0行頭へ移動( カーソルのある行の左端へ移動 )
$行末へ移動( カーソルのある行の右端へ移動 )
H画面の一番上の行頭へ移動
L画面の一番下の行末へ移動
ggファイルの先頭行へ移動
Gファイルの最終行へ移動
Ctrl-F1 画面先のページを表示
Ctrl-D半画面先にスクロール
Ctrl-B1 画面前のページを表示
Ctrl-U半画面前にスクロール

5.1.3. 文字と行の挿入

コマンド名説明
aカーソルの右にテキストを追加
A行の末尾にテキストを追加
iカーソルの左にテキストを追加
I行の先頭にテキストを挿入
oカーソルがある下の行にテキストを挿入
Oカーソルがある上の行にテキストを挿入

5.1.4. テキストの削除

コマンド名説明
xカーソルの文字を削除
Xカーソルの左文字を削除
dwワードの削除
dd行の削除
yyカーソル行のコピー
pカーソルの右側に張り付け
Pカーソルの左側に張り付け

5.1.5. 検索機能

入力キー説明
/文字列カーソル位置からファイル末尾に向かって、指定した文字列の検索
?文字列カーソル位置からファイル先頭に向かって、指定した文字列の検索
n上記の検索 ( /文字列、?文字列 ) による次の文字列の検索
N上記の検索 ( /文字列、?文字列 ) による次の文字列の検索 ( 逆方向 )

5.1.6. ファイルの保存とviの終了

コマンド名説明
ZZ上書き保存しviの終了
:w内容の保存
:q!保存せずに終了
:wq編集データを保存して終了
:wq!内容を上書き保存して終了

5.2. Nanoの使用方法

5.2.1. Nanoの起動と終了方法

コマンド名説明
nano <ファイル名>nanoでファイルを開くまたは新規作成する

5.2.2. Nanoの操作

コマンド名説明
Ctrl + O編集内容の保存
Ctrl + Xnanoの終了
Ctrl + KShift + ←→ で文字列の指定し文字列をカットする
Ctrl + U文字列のペースト
Ctrl + \文字列の置換
alt + U前回の操作を取り消す
Ctrl + W文字列検索
Ctrl + RCtrl + Tでカレントディレクトリ起点にファイル内容挿入

5.3. Vimの使用方法

1.6 - 6.ファイルとプロセスの管理

ファイルの圧縮/解凍、ファイルの権限、プロセス/ジョブ管理などに関して

6.1. 基本的なファイルの管理

6.1.1. ファイルの圧縮と解凍

ファイルの圧縮解凍

ファイルの圧縮解凍を行うコマンドはいくつかあり、gzip, bzip2, xzなどがある。

gzipbzip2xz
圧縮コマンドgzipbzip2xz
圧縮率低い高い
時間短い長い

gzipコマンド

ファイルを圧縮と解凍するコマンド。

gzip <ファイル>
オプション説明
-d圧縮ファイルを展開 (解凍)
-c圧縮ファイルを標準出力へ出力
-rディレクトリ内の全てのファイルを圧縮
-k圧縮前ファイル残す

gunzipコマンド

ファイルを解凍するコマンド。 gunzipコマンドは gzip -d と同じ実行結果が得られる。

gunzip <ファイル名>
オプション説明
-c出力を標準出力に展開して、元ファイルは変更しない
-fすでにファイルがある場合は上書きを行い、強制的に解凍
-rディレクトリ内の全てのファイルを再帰的に解凍

bzip2コマンド

gzipよりも処理時間はかかるが圧縮効率の高いコマンド。

bzip2 <オプション> <ファイル>
オプション説明
-d圧縮ファイルを展開 ( 解凍 )
-c圧縮ファイルを標準出力へ出力
-k圧縮前ファイル残す

xzコマンド

bzip2よりも処理時間はかかるが圧縮効率の高いコマンド。

xz <オプション> <ファイル>
オプション説明
-d圧縮ファイルを展開 ( 解凍 )
-c圧縮ファイルを標準出力へ出力
-k圧縮前ファイル残す

6.1.2. 圧縮ファイルの閲覧

zcat, bzcat, xzcatなどがある。

コマンド対応拡張子
zcat.gz
bzcat.bz
xzcat.xz

6.1.3. アーカイブの作成と展開

アーカイブとは

アーカイブは複数ファイルをまとめたもの。 ディレクトリ単位で圧縮を行うにはまずディレクトリをアーカイブにする必要がある。

tarコマンド

tarコマンドはファイルやディレクトリを1つのアーカイブファイルにしたり、圧縮/展開するコマンド。 デフォルトで圧縮しないため、tarコマンドで圧縮を行うためには-zオプションや、-jオプションを指定する必要がある。

tar <オプション> <ファイル>
オプション説明
-cアーカイブの作成
-xアーカイブからファイルの取り出し
-tアーカイブの内容の確認
-f ファイル名アーカイブファイル名の指定
-zgzip による圧縮 ・ 展開
-jbzip2 による圧縮 ・ 展開
-J7zip による圧縮 ・ 展開
-v詳細な情報の表示
-uアーカイブ内にある同じ名前のファイルより新しいものだけを追加
-rアーカイブにファイルの追加
-N指定した日付より新しいデータのみを対象とする
-M複数デバイスへの分割
–deleteアーカイブからファイルの削除

cpioコマンド

cpioはファイルをアーカイブファイルにコピーしたり、アーカイブからファイルをコピーできるコマンド。

ls | cpio -o > /tmp/backup
オプション説明
-i オプション パターンアーカイブからファイルを抽出
-o オプションアーカイブの作成
-p オプション ディレクトリファイルを別のディレクトリにコピー
オプション説明
-A既存のアーカイブファイルに追加
-d必要な場合にディレクトリの作成
-rファイルを対話的に変更
-tコピーせず、入力内容の一覧表示
-vファイル名の一覧表示

ddコマンド

入力側に指定したファイルからの入力をファイルまたは標準出力に送るコマンド。

dd if=/dev/zero of=/dev/sda bs=446 count=1
オプション説明
if= 入力ファイル入力側ファイルの指定
of= 出力ファイル出力側ファイルの指定
bs= バイト数入出力のブロックサイズの指定
count= 回数回数分の入力ブロックをコピー

6.2. ファイルを管理する設定値

6.2.1. ファイルの情報を表すパラメータ

ファイルの情報は以下のようにls -l fugafugaを行うと表示される。

drwxr-xr-x 3 wand docker 4096  2月 26 22:54 .

これは以下の情報を含む

  • d … ファイルのタイプ
  • wxr-xr-x … アクセス権(所有者, 所有グループ, その他のユーザ)
  • 3 … リンク数
  • wand docker … 所有者,所有グループ
  • 4096 … ファイルサイズ

アクセス権

Linuxで作成されるファイルやディレクトリにはアクセス権(パーミッション)が設定される。 これでユーザごとにファイルへのアクセスの許可または禁止を設定できる。

アクセス権表記説明
読み取りrread。ファイルの読み取りが可能 ( 内容表示など )
書き込みwwrite。ファイルへの書き込みが可能 ( 編集や上書きコピーなど )
実行xexecute。ファイルの実行が可能 ( プログラムやシェルスクリプトの実行 )

SUID

ユーザはUIDと呼ばれるID番号で管理されている。 SUID(Set User ID)は一時的に別のUIDのユーザに変更できる機能のこと

chmodコマンドでSUIDを設定する場合は4000をパーミッション設定時に加算、またはu+sを追加する。

chmod 4755 testdata.txt
chmod u+s testdata.txt

SGID

SGIDはSUIDは所有者の権限で動作するのに対して、グループの権限で動作する。

chmodコマンドでSGIDを設定する場合は2000をパーミッション設定時に加算、またはg+sを追加する。

chmod 2755 testdata.txt
chmod g+s testdata.txt

スティッキービット

スティッキービットは所有者とrootユーザのみが名前の変更と削除を行えるようにする仕組み。 全ユーザーがファイルを作成できるが作成したファイルを他人がファイル名の変更や削除をできないようにしたい場合に使用する。

chmodコマンドでスティッキービットを設定する場合は1000をパーミッション設定時に加算、またはo+tを追加する。

6.2.2. パーミッションの設定変更

chmodコマンド

アクセス権を変更するコマンド。 -Rオプションで指定したディレクトリ以下の全てのファイルのアクセス権の変更が可能。

chmod 644 text.txt
chmod go+w testdata.txt
カテゴリー説明
u所有者
gグループ
oその他のユーザ
a全てのユーザ
定義説明
+アクセス権の追加
-アクセス権の削除
-アクセス権の指定
権限説明
r読み取り権限
w書き込み権限
x実行権限
sSUID または SGID
tスティッキービット

umaskコマンド

umask値の確認とumask値の設定を行うコマンドでデフォルトのアクセス権を変更できる。

umask <マスク値>

passwdコマンド

パスワードを変更できるコマンド。 /etc/passwdに変更情報が保存される。

6.2.3. ファイルの所有者の管理

chownコマンド

所有者の変更を行うコマンド。実行にはroot権限が必要。 -Rで再帰的実行が可能。

chown root piyo

chgrpコマンド

グループの変更の変更を行うコマンド。一般ユーザーでも使用が可能。 -Rで再帰的実行が可能。

chgrp wand fuga

6.2.4. ハードリンクとシンボリックリンク

ファイルの実体とファイル名をつなぐ事をリンクと呼ばれ、リンクにはシンボリックリンクとハードリンクの以下の2種類がある。

ハードリンク

ハードリンクは1つのファイルの実体を複数のファイル名で表せるリンク。同じファイルの実体を共有する方式。 特徴は以下の通り。

  • iノード番号(ファイルやディレクトリと1対1で紐づく情報の番号)が同じ
  • リンク元のファイルが移動、削除されても、ファイルの実体にはアクセスできる
  • 異なるファイルシステム上のファイルやディレクトリにリンクできない

シンボリックリンク

シンボリックリンクはリンク元ファイルが配置されている場所にリンクする方式。 プログラミング言語におけるポインタの概念に近い。

特徴は以下の通り。

  • 新しいiノード番号が付与される
  • リンク元のファイルが移動、削除されると、リンク元のファイルの実体にアクセスできない
  • 異なるファイルシステム上のファイルやディレクトリにリンクできる

6.3. プロセスの管理

6.3.1. プロセスの監視

プロセスとは

プロセスはOSが動作中のプログラムを管理する基本単位OSが動作中のプログラムを管理する基本単位のこと。 ハードディスクからメモリ上に読み出され、実行されているプログラムがそれぞれ表される。

psコマンド

プロセス情報を確認するコマンド。 オプションは-つきとそうでないもの混在する。

ps aux #全部の実行中プロセス確認
オプション説明
a他のユーザーの全てのプロセスを表示
fプロセスの親子関係を表示
uプロセスのユーザー情報を表示
x端末を利用していない全てのプロセスを表示
-e全てのプロセスを表示
-lプロセスの詳細情報の表示
-p PID指定したプロセスID(PID)の情報のみ表示
-C プロセス名指定した名前のプロセスのみ表示
-w長い行を折り返して表示

画面表示例は以下の通り。

PID  TTY      STAT   TIME COMMAND
1358 tty1     Ssl+   0:00 /usr/lib/gdm3/gdm-wayland-session gnome-session -
1362 tty1     Sl+    0:00 /usr/lib/gnome-session/gnome-session-binary --aut
1380 tty1     Sl+    0:26 /usr/bin/gnome-shell

topコマンド

現在実行中のプロセスをリアルタイムに表示するためのコマンド。 デフォルトCPU使用量降順で表示される「q」で終了可能。

top

pstreeコマンド

プロセスの親子関係(親プロセス、子プロセス)を確認するコマンド。

pstree

6.3.2. プロセスの終了

killコマンド

killコマンドはプロセスにシグナルを送るコマンド。

kill <シグナルID> <プロセスID>
シグナルIDシグナル名動作
1HUPハングアップ
2INT割り込み(Ctrl + C)
9KILL強制終了
15TERM終了(デフォルト)
18CONT停止しているプロセスを再開
19STOP一時停止

pgrepコマンド

PID調べるコマンド。

pgrep <プロセス名>

killallコマンド

プロセス名指定してkillするコマンド。

killall <プロセス名>

pkillコマンド

プロセス名指定して-u, -gでプロセスの実行ユーザー・実行グループ指定しながらkillするコマンド。

pkill -u $(whoami) -SIGKILL bash

6.3.3. ジョブ管理

ジョブとは

ジョブはユーザーがコマンドやプログラムをシェル上で実行するひとまとまりの処理単位のこと。 パイプでつないだものは全体で1ジョブとなる。

フォアグラウンドジョブとバックグラウンドジョブ

ジョブにはフォアグラウンドジョブとバックグラウンドジョブの2種類がある。 通常はフォワグラウンドジョブで実行される。

ジョブ説明
フォアグラウンドジョブジョブの実行中は、シェルは停止する。
バックグラウンドジョブジョブとシェルが同時に動作して、シェルは停止しない。

コマンドラインの最後に & を追加することで、コマンドはバックグラウンドジョブで実行できる

ls -la &

jobsコマンド

実行中のジョブを確認できるコマンド。

jobs

nohupコマンド

ログアウト後も処理続行させるためのコマンド。

sudo nohup updatedb &

bgコマンド

停止中のジョブをバックグラウンドで動かすコマンド。

bg <ジョブ番号>

fgコマンド

バックグラウンドで動いているジョブをフォアグラウンドで動かすコマンド。

fg <ジョブ番号>

6.3.4. システム状況の確認

freeコマンド

システムの物理メモリとスワップメモリの使用量、空き容量を表示するコマンド。

free <オプション>
短いオプション意味
-bメモリの量をバイト単位で表示する
-kメモリの量をKB単位で表示する(デフォルト) ※
-mメモリの量をMB単位で表示する
-gメモリの量をGB単位で表示する
メモリの量をTB単位で表示する
-h読みやすい単位で表示する
単位を換算する際に1024ではなく1000で割って計算する
-lLowメモリとHighメモリの状況も表示する ※※
-t物理メモリとスワップメモリの合計を示す行も表示する
-s 間隔再出力の間隔を「ss.tt秒」で指定する(デフォルトは1回出力して終了する)
-c 回数再出力する回数を指定する(デフォルトは1回出力して終了する)

uptimeコマンド

システムの稼働時間、システムの平均負荷状況はuptimeコマンドにより確認できるコマンド。

uptime

以下情報が確認可能。

  • システム稼働時間
  • 現在ログイン中のユーザ数
  • システムの平均負荷状況

unameコマンド

システムやカーネルの情報を表示するコマンド。

uname <オプション>
オプション説明
-a, –all全ての情報を表示
-nネットワークノードとしてのホスト名を表示
-rカーネルのリリース番号を表示
-sカーネル名を表示(標準)
-vカーネルのバージョンを表示
-mマシンのハードウェア名を表示
-pプロセッサの種類を表示
-iハードウェアプラットフォームを表示
-oOS名を表示

watchコマンド

コマンドをn秒ごと(デフォルトでは2秒間隔ごと)に繰り返し実行させるコマンド。

watch <コマンド>
短いオプション意味
-tヘッダを表示しない
-eエラー時(実行したコマンドエラーコード0以外で終了したとき)はwatchコマンドも終了する
-bエラー時にはビープ音を鳴らす
-d直前の実行結果から変化した箇所をハイライト表示する。「permanent」または「cumulative」オプションを付けると初回実行時から変化した箇所を表示する(「-d=permanent」のように指定)
-cANSIによるスタイル指定を行う
-g実行結果が変化したらwatchコマンドを終了する
-n 秒数実行間隔を秒数で指定する(設定できる最小値と最小間隔は0.1秒)
-p実行のタイミングを厳密にする
-x指定したコマンドを「sh -c」ではなく「exec」コマンドで実行する

6.4. プロセスの実行優先度設定

6.4.1. プロセスの実行優先度の変更

プロセスの実行優先度を変更することにより、CPU時間を多く割り当てる事が可能。 設定はnice値(値域[-20,+20])という小さいほど優先順位高いの値で設定ができる。

6.4.2. プロセスの実行優先度に関するコマンド

niceコマンド

コマンド実行時の優先度指定を指定できるコマンド。

nice -n -10 <プロセス名>

reniceコマンド

実行中プロセスの優先度変更ができるコマンド。

renice -10 -p 1200

6.5. 複数端末の使用

6.5.1. ターミナルマルチプレクサ

ターミナルマルチプレクサは一つの端末画面の中に複数の仮想端末を作成/切り替えができる仕組み。 デタッチ/アタッチ機能、つまり各ウィンドウの作業状況を保ったまま終了/再開が可能。

有名なターミナルマルチプレクサとしてはtmuxscreenがある。

6.5.2. Tmuxの使い方

起動/操作コマンド

コマンド説明
tmuxセッションを起動
tmux new -s 名前名前付きセッションを起動
exitセッションを終了
Ctrl-b dセッションを一時的に中断してメインに戻る (Detach)
tmux a中断していたセッションに戻る (Attach)
tmux a -t 名前中断していた名前付きセッションに戻る
Ctrl-b sセッションの一覧を表示
tmux list-sessionsセッションの一覧を表示
tmux kill-session -t 名前指定したセッションを終了

ウィンドウ操作

コマンド説明
Ctrl-b c新規ウィンドウを作成 (Create)
Ctrl-b 数字数字で指定したウィンドウに移動
Ctrl-b n次のウィンドウに移動 (Next)
Ctrl-b p前のウィンドウに移動 (Prev)
Ctrl-b l以前のウィンドウに移動 (Last)
Ctrl-b wウィンドウの一覧を表示 (Window)
Ctrl-b ,ウィンドウ名を変更
Ctrl-b 'ウィンドウ番号を指定して移動
Ctrl-b .ウィンドウ番号を変更
Ctrl-b &ウィンドウ名を終了 (確認付き)
exitウィンドウを終了

1.7 - 7.パーティションとファイルシステム

Linuxのパーティション/ファイルシステムに関して

7.1. ハードディスクとその関連規格

7.1.1. Linuxにおけるハードディスクの利用方法

Linuxでハードディスクを使用するには以下のステップを行う必要がある。

  1. 電源OFFの状態で、ハードディスクをシステムに物理的に接続
  2. 追加したハードディスクのデバイスファイルが作成されていることを確認
  3. ハードディスクにパーティションを切る(fdiskコマンド)
  4. 各パーティションにおいてext3ファイルシステムを作成(mke2fsコマンド)
  5. ファイルシステムのマウント(mountコマンド)

7.1.2. ハードディスクの接続規格

HDDの接続規格には以下のようにある。

HDDの接続規格説明
SATA (Serial ATA)現在主流の規格。IDEよりもデータ転送速度が速い。
IDE (Integraded Drive Electronics)SATAが出てくる前まで主流だった規格。
SAS (Serial Attached SCSI)SATAより高速・高信頼性のある企画。サーバ用に使用される。
SCSI (Small Computer System Interface)さまざまな周辺機器を接続する一般的な規格。高速、高価でありSCSIカードが必要。
USB (Universal Serial Bus)USBポートを持つ外付けのHDDを接続する際に使用される規格。

7.1.3. デバイスファイル

起動中にハードディスクを新しく検出すると、検出されたデバイスを操作するためのデバイスファイルが/devディレクトリに自動的に追加される。 デバイスの命名規則は以下の通り。

デバイスファイル説明
/dev/hdaプライマリのマスターに接続したHDD
/dev/hdbプライマリのスレーブに接続したHDD
/dev/hdcセカンダリのマスターに接続したHDD
/dev/hddセカンダリのスレーブに接続したHDD
/dev/sda1番目のSCSI/SATA/USBに接続したHDD
/dev/sdb2番目のSCSI/SATA/USBに接続したHDD
/dev/sdc3番目のSCSI/SATA/USBに接続したHDD
/dev/sdd4番目のSCSI/SATA/USBに接続したHDD
/dev/sr01番目のCD/DVDドライブ
/dev/st01番目のテープドライブ

lsblkコマンド

ブロックデバイスを一覧するコマンド。

lsblk

7.2. パーティションの種類

7.2.1. パーティションとは

パーティションは1台のディスクドライブを分割する論理的な区画のこと。 パーティションごとに異なるファイルシステムを作成することが可能

パーティションには基本パーティション、拡張パーティション、論理パーティションの種類がある。

基本パーティション

基本パーティションはディスクに最大4つまで作れることができるパーティション。 ディスク/dev/sdaに対して/dev/sda1-/dev/sda4と命名される。

MBRのうち64バイト(16x4)はこの情報に充てられ、ファイルシステムが格納される。

拡張パーティション

拡張パーティションは基本パーティションの1つを拡張パーティションにしたもので、ファイルシステムではなく論理パーティションが格納される基本パーティションのうち1つのみしか拡張パーティションとして使用できない

論理パーティション

論理パーティションは拡張パーティション内に作成されたパーティションのこと。 デバイスファイルの命名測は必ず5番から始まる。

7.2.2. UEFIベースのシステム分割

UEFIでは拡張パーティション、論理パーティションは存在しない

7.2.3. パーティションに分割するメリット

パーティション分割のメリットは以下の通り。

  • 障害による被害をパーティション内に限定させる
  • 空き容量が足りなくなった場合の影響を少なくする
    • ログであふれた場合など

7.2.4. パーティション形式のMBRとGPT

MBRとGPTはパーティション形式。

MBRGPT
ハードディスク制限2GB-
基本パーティション4個128

MBR

MBR(Master Boot Record)は1983年にIBM PC DOS 2.0に初発表された古いディスクタイプのこと。 BIOSをサポートする。

MBR

MBRセクターとパーティションで構成される。 特徴は以下の通り。

  • 基本パーティションと拡張パーティションといった2種類のみを作成可能
  • 最大4つのパーティションが作成可能
  • MBRディスクの最大容量の制限が2TB

GPT

GPT(GUIDパーティションテーブル)はMBRより新しい規格。 UEFIをサポートする。

GPT

保護MBRとプライマリーGPTヘッダ、パーティションエントリで構成される。 特徴は以下の通り。

  • 基本的には無制限なパーティションが作成可能
  • windowsではパーティションを最大128個作成可能
  • 拡張パーティション、論理パーティションがない
  • MBRディスクより安全性と信頼性が高い

7.3. ルートファイルシステム

ルートファイルシステムは/を含むファイルシステムのこと。 Linuxシステムを構築する際は複数のパーティションを用意し/var, /homeなどのディレクトリは別のパーティションを割り当ててマウントするのが一般的となる。なおこの場合は/var/homeなどは独立したファイルシステムとなる。

なお必ずルートファイルシステムに置く必要のあるディレクトリは以下の通り。

  • /bin … システムに必要なコマンド、プログラム。一般ユーザー用
  • /sbin … システムに必要なコマンド、プログラム。管理者用
  • /etc … システムの設定ファイル群
  • /lib … 共有ライブラリ
  • /dev … デバイスファイル

7.4. パーティション管理のコマンド

7.4.1. fdiskコマンド

パーティションの作成、削除、変更、情報表示等ができるコマンド。

fdisk <オプション> <デバイスファイル>

情報表示

-lオプションで現在のパーティションテーブルの状態を表示する。

fdisk -l /dev/sda

対話形式でパーティションの管理を行う

パーティションの作成、削除、変更、情報表示のためには、fdiskコマンドを使用する。

fdisk /dev/sda
操作コマンド説明
m使用可能なサブコマンドの一覧表示
p現在のパーティションテーブルの表示
n新しいパーティションテーブルの作成
d既存のパーティションテーブルの削除
l設定可能なパーティションタイプの一覧表示
aブートフラグをオン、またはオフにする
tパーティションタイプの設定、変更
wパーティションテーブルの変更を保存して終了
qパーティションテーブルの変更を保存せずに終了

7.4.2. gdiskコマンド

GPTを使用してパーティションの作成、削除、変更、情報表示等ができるコマンド。

gdisk <オプション> <デバイスファイル>

情報表示

-lオプションで現在のパーティションテーブルの状態を表示する。

gdisk -l /dev/sda

対話形式でパーティションの管理を行う

パーティションの作成、削除、変更、情報表示のためには、gdiskコマンドを使用する。

gdisk /dev/sda
操作コマンド説明
lパーティションタイプを一覧表示する
nパーティションを作成する
dパーティションを作成する
pパーティションテーブルを作成する
tパーティションタイプを変更する
wパーティションテーブルの変更を保存して終了する
qパーティションテーブルの変更を保存しないで終了する
?ヘルプメニューを表示する。

7.4.3. partedコマンド

MBR,GPT両対応したパーティションの作成、削除、変更、情報表示等ができるコマンド。

parted <オプション> <デバイスファイル>

情報表示

-lオプションで現在のパーティションテーブルの状態を表示する。

parted -l /dev/sda

対話形式でパーティションの管理を行う

パーティションの作成、削除、変更、情報表示のためには、paretdコマンドを使用する。

parted /dev/sda
操作コマンド説明
mklabel ラベル新しいラベルを作成する。2TB以上のディスクの場合は「gpt」を指定してGPT、それ以下の場合は「msdos」を指定してMBRにパーティション構成を
格納する。loop/bsd/macなども使用できる。
mkpart パーティションタイプ開始場所,終了場所パーティションタイプはprimary(基本パーティション)、extend(拡張パーティション)、logicalを指定する。
指定した開始から終了までの領域でパーティションを作成する
(例:0MBから150MB、0%から15%などのように指定する)
mkfs 番号 ファイルシステム指定したパーティション番号に指定したファイルシステムを作成する。ファイルシステムにはfat16/fat32/ext2/linux-swapなどが選択できる。
それ以上のファイルシステムは別コマンドを利用する必要がある
printパーティション情報を表示する
quitpartedを終了する
resize パーティション番号開始 終了指定した番号のパーティションを開始、終了で指定する領域にサイズ変更する。ファイルシステムが既に作られている必要がある
rm パーティション番号指定した番号のパーティションを削除する
select デバイス指定したデバイスを対象に扱う
unit 単位デフォルトのサイズ単位を指定する。TB/TiB/GB/GiB/MB/MiBなどを指定できる
set パーティション番号 フラグ 状態指定したフラグを設定する。フラグは「boot」、「root」、「swap」など、状態を「on」「off」を指定する
help利用できるコマンドを表示する

7.5. ファイルシステム

7.5.1. ファイルシステムとは

ファイルシステムはパーティション上に作成されるもので、ファイルシステムの作成によりファイルが保存できるようになる。 ファイルシステムは以下要素で構成される。

  • ファイルの中身情報
  • inode(Indexノード) * ファイルの属性 * 管理データ

7.5.2. ファイルシステムの種類

ファイルシステムは以下のようなものがある。

Linux向けのファイルシステム

ファイルシステム説明
ext2標準
ext3ext2機能+ジャーナリング機能
ext4ext3+拡張機能

UNIX系OSから移植されたファイルシステム

ファイルシステム説明
XFSSGI社が開発。ジャーナリング機能あり
JFSIBM社が開発。ジャーナリング機能あり

その他のファイルシステム

ファイルシステム説明
Brtfs高機能なファイルシステム
iso9660CD-ROMのファイルシステム
msdosMS-DOSのファイルシステム
vfatSDカードや古いwindowsのファイルシステム
exFATFAT後継規格でフラッシュメモリ向けのファイルシステム

7.5.3. ファイルシステムのマウント

マウントはあるパーティションとあるディレクトリを関連づける作業のこと。 パーティションにファイルシステムを作成した後、マウントを行う必要がある。

恒常的なマウント設定

恒常的なマウントを行うためには以下の手順でマウントを行う必要がある。

  1. /etc/fstabファイルの編集
  2. mountコマンドの実行、または再起動(init 6)の実行

/etc/fstabの書き方

/etc/fstabファイルは以下のように記述される。

/dev/sda5  /home  ext4  defaults  1  2

左から順に以下意味となる。

  1. マウントするデバイスファイル名
  2. マウントポイント
  3. ファイルシステムの種類(ext2,xfsなど)
  4. マウントオプション(async, auto, defaults, exex, noexecなど)
  5. dumpコマンドによるアップデート対象かどうかの指定(0:バックアップ必要なし、1:バックアップ必要あり)

mountコマンド

ファイルシステムのマウントを行うコマンド。

mount /dev/sda6 /home3

unmountコマンド

現在マウントされているファイルシステムをアンマウントするコマンド。

unmount  /dev/sda6 /home3

7.5.3. ファイルシステムの確認コマンド

dfコマンド

ファイルシステムの空き容量やinodeの使用状況が確認できるコマンド。 ファイルシステムの空き容量の表示ができる。

df <オプション> <デバイス名/ディレクトリ>
オプション説明
-iinodeの使用状況を表示
-h容量を単位(MBやGB)で表示
-k容量をKB単位で表示
-m容量をMB単位で表示

duコマンド

ディレクトリやファイルの容量を表示するコマンド。 ディレクトリ内のファイルが使用している容量を表示できる。

du <オプション> <デバイス名/ディレクトリ>
オプション説明
-aディレクトリだけでなく、ファイル容量も表示
-c合計容量も同時に表示
-h容量を単位(MBやGB)に変換して表示
-k容量をKB単位で表示
-m容量をMB単位で表示
-s指定したファイルやディレクトリのみの合計を表示
-Sサブディレクトリ内の容量を含まずに合計を表示

7.5.4. ファイルシステムの作成と修復のコマンド

mkfsコマンド

パーティション上にファイルシステムを作成するコマンド。

mkfs -t ext4 <デバイス名>

mke2fsコマンド

パーティション上にファイルシステムを作成するコマンド。 ext2, ext3, ext4ファイルシステムを作成する場合に利用する。 デフォルトではext2を作成する。

mke2fs -t ext4 <デバイス名>
オプション説明
-t ファイルシステムタイプファイルシステムの種類を指定する
-jext3ファイルシステムを作成する
-c実行前に不良ブロックを検査する

mkswapコマンド

パーティション上にスワップ領域作成するコマンド。

mkswap /dev/sda7

fsckコマンド

ファイルシステムの整合性チェックと障害箇所の修復ができるコマンド。 システム障害によりファイルシステムに障害が発生した場合に使用する。

fsck <オプション> <デバイス名>
オプション説明
-tファイルシステムの種類の指定 ( ext2、ext3、xfsなど )
-a自動的に修復を実行
-r対話的に修復を実行
-A/etc/fstab に記述されている全てのファイルシステムの検査
-N実際には修復を行わず、コマンドが実行する内容を表示

e2fsckコマンド

ext2、ext3、ext4のファイルシステムでファイルシステムの整合性チェックと障害箇所の修復ができるコマンド。

e2fsck <オプション> <デバイス名>
オプション説明
-c不良ブロックの検査
-p全ての不良ブロックを自動的に修復
-v詳細情報を表示
-y全ての問い合わせに対して、自動的に「yes」と回答
-n全ての問い合わせに対して、自動的に「 no 」と回答

tune2fsコマンド

ext2,ext3.ext4ファイルシステムの様々なパラメーターを設定するコマンド。

tune2fs <オプション> <デバイス名>
オプション説明
-c 回数e2fsckコマンドでファイルシステムのチェックを行うまでの最大マウント回数を指定
-i 時間[d,m,w]e2fsckコマンドでファイルシステムのチェックを行うまでの最大時間間隔を指定。時間のみまたはdを付けると「日」、mを付けると「月」、wを付けると「週」
-jext2をext3ファイルシステムに変換
-L ラベル名ファイルシステムのボリュームラベルを設定

1.8 - 8.シェルとシェルスクリプト

Linuxの環境変数、タスク自動化のためのシェルスクリプトに関する解説

8.1. シェル環境のカスタマイズ

8.1.1. 環境変数とシェル変数

Linuxの変数には環境変数シェル変数がある。 特徴は以下の通り。

変数説明代表的な
環境変数シェル自身とそのシェルから起動されるすべてのプロセスに引き継がれるPATH, HOMEなど
シェル変数そのシェル内のみで有効な変数-

詳しくはコチラ

8.1.2. 環境変数/シェル変数を表示するコマンド

env/printenvコマンド

環境変数を表示するコマンド。 printenvは環境変数名を指定可能。

env

printenv HOME

setコマンド

環境変数とシェル変数を表示するコマンド。

set <オプション>
オプション説明
-o一覧表示
-a自動的にエクスポート
–helpヘルプ
-o / +oオプション有効/無効化
ignoreeofCtrl + D のキー入力でログアウトしないようにする
noclobber既存ファイルへの上書き出力 ( リダイレクト ) を禁止する
noglobメタキャラクタを使用したファイル名の展開を無効化する

8.1.3. エイリアス

エイリアスはコマンドに別名を付けたりコマンドとそのオプションをひとまとめにできたりするもの

ailias/unailiasコマンド

エイリアスの作成と削除ができるコマンド

ailias <エイリアス名>='<コマンド>'

unailias <エイリアス名>

8.1.4. シェル関数

シェル関数はbashシェル上で利用できる独自の関数を定義できるもの。 シェル関数はエイリアスと異なり条件分岐などを含む複雑なコマンドの組み合わせの場合に使用する。

functionコマンド

シェル上で利用できるシェル関数を定義するコマンド。

function <関数名>() { <コマンド> }

unsetコマンド

シェル関数を削除するコマンド。

unset <関数名>

declareコマンド

設定されたシェル関数一覧を見るコマンド。

declare -F

8.1.5. bashの設定ファイル

シェルの起動時と終了時に「環境変数、エイリアス、シェル関数」などの定義を自動的に行うための設定ファイルには以下のようなものがある。 /etc/以下は全ユーザーから参照される。

ファイル説明
/etc/profileログイン時に実行
/etc/bash.bashrcbash起動時に実行される
/etc/bashrc~/.bashrcから参照
~/.bash_profileログイン時に実行
~/.bash_login~/.bash_profileがない場合、ログイン時に実行
~/.profile/.bash_profileも/.bash_loginもない場合、ログイン時に実行
~/.bashrcbash起動時に実行
~/.bash_logoutログアウト時に実行

Bash

/etc/profile, /etc/profile.dディレクトリ以下

これらのファイルには基本的な環境変数などが設定される。

/etc/bash.bashrc

全ユーザから参照される。一部ディストリビューションにはない。

~/.bash_profile, ~/.bash_login, ~/.profile

ユーザごとの環境変数の設定等を行える。

~/.bashrc

対話型シェルが起動されるたびに実行される。全ユーザ設定用。

~/.bash_logout

ログインシェル終了時に実行される。

8.2. シェルスクリプト

8.2.1. シェルスクリプトとは

シェルスクリプトは特定の処理を行うために作成したプログラをシェルプログラムで記述したもの。 Bashの場合は冒頭に以下を記述する。拡張子は.sh

なおシェルスクリプトは実行したユーザの権限で動作する。 以下はシバンと呼ばれる記述。

#!/bin/bash

なおファイルの改行コードはLinuxでLF、WindowsでCRLFとなるので注意する。

8.2.2. シェルスクリプトの実行コマンド

sourceコマンド

元のbashでシェルスクリプトを実行するコマンド。

source restart.sh

bashコマンド

新しいbashサブシェルが立ち上がってシェルスクリプトを実行するコマンド。

bash start.sh

.を付けて実行

sourceと同じく元のbashでシェルスクリプトを実行するコマンド。

. start.sh

./を付けて実行

./start.sh

8.2.3. シェルスクリプトの特殊変数

スクリプトに渡す引数で特殊なものには以下のものがある。

変数名説明
$0シェルスクリプトファイル名
$11番目の引数。※ 2番目の引数の場合は $2 と指定する。
$$現在のシェルのプロセス番号
$#コマンドラインに与えられた引数の数
$?シェルが最後に実行したコマンドの終了ステータス ( 0 = 正常終了、1 = 異常終了、それ以外はエラー )
$@全ての引数 ( 区切りはスペース )
$*全ての引数 ( 区切りは環境変数IFSで指定したもの )

8.2.4. シェルスクリプトに関するコマンド

readコマンド

readコマンドはユーザーからの入力値を受け取り変数に格納してそれを次の処理で使用したい場合に使用するコマンド。

#!/bin/bash
echo -n " あなたのお名前を教えてください "
read yourname
echo " こんにちは、$yourname さん "

testコマンド

testコマンドは条件分岐が行われる条件式の真偽を判断してその結果を返すために使用されるコマンド。

test <条件式>

seqコマンド

シェルスクリプトで数値を1つずつ増加または減少させる処理を行うために使用するコマンド。

seq <開始数値> <終了数値>
seq <終了数値>

8.2.5. シェルスクリプトの制御構文

if文

if test -f data.txt
 then
    echo "data.txtファイルは存在します"
 else
    echo "data.txtファイルは存在しません"
fi

for文

for i in $(seq 1 10)
do
    echo $i
done

while文

i=1
while test $i -le 10
do
    echo $i
    let i=i+1
done

1.9 - 9.LinuxGUIとデスクトップ

Linuxのデスクトップに関して

9.1. LinuxのGUI

9.1.1. X windows System(X, X11)

X Windows Systemは多くのUNIXやLinuxで使用されているウィンドウシステム(GUI)。 X Window Systemではクライアント・サーバ方式(Xクライアント, Xサーバ)の構成となっている。 このGUIシステムは現在のコンピュータ環境で利用するには無理が出てきている。

X windows Systemの種類

種類説明
XFree86かつて標準実装されていた
X.Org現在の主流

Xサーバ

Xサーバはモニター、ビデオカード、キーボードなどのハードウェアの管理を行う。 ホストマシンで稼働する。

xサーバはstartxコマンドできそうできる。 なお実行の際はxinitが実行され/etc/X11/xinit/xinitrcスクリプトが実行される。

Xクライアント

XクライアントはWebブラウザなどのユーザアプリケーションを指す。 リモートホストで動かすことができるが、Xサーバと同じマシンで動かすことも可能。

X.Orgの設定

X.Orgの設定ファイルは/etc/X11/xorg.confとなりキーボード、ディスプレイ、フォント、解像度などの設定が可能。 xorg.confファイルは複数のセクションから構成される。

セクション説明
ServerLayout入力 ・ 出力用デバイスの組み合わせとスクリーンの設定
Filesフォント関連のパスの設定
ModuleXサーバがロード予定のダイナミックモジュールの設定
InputDeviceXサーバに対する入力デバイス(キーボード等)の設定
Monitorシステムにより使用されるモニタタイプの設定
Deviceシステム用のビデオカードの設定
Screenディスプレイの色深度と画面サイズの設定

Xクライアントコマンド

X Window Systemの設定確認、情報収集のためのコマンドは以下の通り。

コマンド説明
showrgbX Window Systemで利用可能な色とRGB値の情報確認
xlsclients実行中のXクライアントを表示
xwininfoコマンド実行後に指定したウィンドウのサイズ、位置、色深度の情報確認
xdpyinfoディスプレイ情報の表示

9.1.2. Wayland

Waylandはプロトコル作成フレームワークでLinux用ライブラリ。 X11と全く異なる仕組みでGUI環境を提供できる。

ウィンドウマネージャとクライアントで構成される。

ウィンドウマネージャ

ハードウェアやグラフィックを管理する。

クライアント

グラフィックライブラリ呼び出す。

9.2. グラフィカルデスクトップ

9.2.1. ディスプレイマネージャ

ディスプレイマネージャはXサーバを起動して GUI のログイン画面を表示する仕組み。 ランレベル5で起動する。

具体的にはGUIでログイン画面を表示し、ユーザー認証を行う。 有名なものは以下の通り。

  • XDM … XDMはX.Orgの標準。認証プロトコルにはXDMCPが使用される。
  • KDM … KDMはKDEで利用される
  • GDM … GDMはGNOMEで利用される

9.2.2. ウィンドウマネージャ

ウィンドウマネージャはXの外観制御を行う。 ウィンドウの外観、アイコン、メニューなどを提供しユーザが設定できるようになっている。

代表的なものには以下のようなものがある。

  • Metacity … Gnome標準のウィンドウマネージャ
  • Kwin … KDE標準のウィンドウマネージャ
  • twm … 必要最低限の機能だけを備えたウィンドウマネージャ
  • fvwm … 仮想デスクトップ機能を備えたウィンドウマネージャ
  • enlightment … 高機能でグラフィカルなウィンドウマネージャ

9.2.3. デスクトップ環境

デスクトップではウィンドウマネージャも含め、アプリケーションまで揃えて統一的な操作を提供する。 代表的なものにはGNOME、KDE Plasmaなどがある。他にはXfceやLXDEなどがある。

GNOMEKDE Plasma
テキストエディタgeditKEdit
端末GNOME端末Konsole
ファイルマネージャNautilusDolphin
GUIツールキットGTK+Qt
ディスプレイマネージャGDMSDDM
ウィンドウマネージャMutterKWin
標準採用RedHat, CentOS, Fedora, UbuntuopenSUSE, Slackware, Kubuntu

9.2.4. リモートデスクトップ

リモートデスクトップは別のマシン上からリモートで別のマシンのデスクトップを操作できるもの。 Linux向けに制御する機能にはVNCRDPSPICEXDMCPなどがある。

VNC

VNCはクロスプラットフォームのリモートデスクトップソフトウェア。 対応OSはWindows、macOS、Linux。

vncserver :1 #VNCサーバをディスプレイ番号1で起動する

vncserver -kill :1 #VNCサーバの終了

RDP

RDPはWindows標準搭載のリモートデスクトッププロトコル。 Linuxデスクトップ上にWindowsのデスクトップを表示可能。

SPICE

SPICEはOSSの画面転送プロトコルで以下の機能に対応している。

  • 通信の暗号化
  • マルチモニタ

XDMCP

XDMCPはディスプレイマネージャをネットワーク越しに利用できるプロトコル。 Xサーバとディスプレイマネージャとの間で使われるが、暗号化機能がないためSSH接続で利用する必要がある。

9.3. アクセシビリティ

アクセシビリティはコンピュータの操作の利便性を上げるもの。 障がい者の操作をサポートするソフトウェアはATと呼ばれる。

9.3.1. アクセシビリティの設定

アクセシビリティの設定は以下のようなものがある。

機能説明
スティッキーキー(固定キー)複数キーを同時に押すのが困難なユーザー向けの機能
スローキー正確にキーを入力できないユーザー向けの機能
バウンスキー連続入力を無視する機能
トグルキー光るキーの視認が難しいユーザー向けの機能。音が鳴る
マウスキーマウスを扱うのが困難なユーザー向けの機能

1.10 - 10.アカウント管理と管理タスク

Linuxのアカウント管理、定期実行系(Cronなど)、言語設定やローカライゼーションに関して

10.1. ユーザとグループの管理

10.1.1. ユーザアカウント

Linuxは複数のユーザが同時にログインし利用できるシステムとなっている。 またユーザアカウント情報は/etc/passwdファイルに保存される。

/etc/passwdファイル

/etc/passwdファイルは以下のような構成となり、一般ユーザでも読み取り可能。

<ユーザ名>:<暗号化されたパスワード>:<UID>:<GID>:<GECOS(コメント)>:<ホームディレクトリ>:<デフォルトシェル>

デフォルトシェルはログインを想定しない場合/bin/false/sbin/nologinとなる。

/bin/false/sbin/noloin
Telnet接続xx
SSH接続xx
FTP接続xo
SFTP接続xx
シェルの実行xx

/etc/shadowファイル

シャドウパスワードが書かれたファイルで、パスワード本体が暗号化されたものが保存されている。 root(とshadowグループ所属者)しか読み取りできない。

10.1.2. グループアカウント

/etc/groupファイル

/etc/groupファイルは以下のような構成となり、グループアカウント情報が保存される。 一般ユーザでも読み取り可能。

<グループ名>:<暗号化されたグループパスワード>:<GID>:<グループメンバー>

ユーザーにとって基本となるグループをプライマリグループと呼ばれる。 プライマリグループ以外に参加しているグループはサブグループと呼ばれる。

なおプライマリーグループは/etc/passwdのGIDフィールドで確認できる。

10.1.3. ユーザーとグループの管理のコマンド

useraddコマンド

useraddコマンドはユーザアカウントを作成するコマンド。

useradd <オプション> ユーザー名
オプション説明
-c コメントユーザー情報を表すコメントの指定
-d ディレクトリ名ホームディレクトリの指定
-g グループ名 or GIDプライマリグループの指定
-G グループ名 or GIDプライマリグループ以外に所属するグループの指定
-s ログインシェルログインシェルの指定
-u UIDUIDの指定
-mホームディレクトリの自動的な作成

なお作成するホームディレクトリに作成したいファイルのひな形は/etc/skelディレクトリに置くことでホームディレクトリに自動的にコピーされる。

usermodコマンド

既存のユーザアカウント情報を変更できるコマンド。 またユーザーアカウントをロックすることもできる。 ロックは-Lオプション、ロック解除は-Uオプションで可能。

usermod <オプション> <ユーザー名>

userdelコマンド

ユーザアカウントを削除できるコマンド。 -rオプションでホームディレクトリも削除できる。

userdel <ユーザ名>

passwdコマンド

パスワード変更するコマンド。 一般ユーザは自身のパスワードを変更でき、rootユーザは全てのユーザーのパスワードを変更することができる。 またユーザーアカウントをロックすることもできる。

passwd <ユーザ名>
オプション説明
-l指定したユーザーアカウントのロック
-u指定したユーザーアカウントのロックを解除

groupaddコマンド

グループを作るコマンド。

groupadd <グループ名>
オプション説明
-g グループIDグループIDの指定

groupmodコマンド

グループ情報変更するコマンド。

groupmod <グループ名>
オプション説明
-g グループID指定したグループIDへ変更
-n グループ名指定したグループ名へ変更

groupdelコマンド

作成済みのグループアカウントを削除するコマンド。 なお削除対象のグループをプライマリグループとするユーザーがいる場合は削除できない。

groupdel <グループ名>

idコマンド

ユーザがどのグループに所属しているのか調べられるコマンド。 UID,GUID,サブグループGUIDがわかる。

id <ユーザ名>

getentコマンド

ユーザーやグループの一覧を表示するコマンド。 データベースとキーを引数に渡すと管理データベースからエントリを取得できる。

getent <データベース/キー>

10.2. ジョブスケジューリング

10.2.1. cron

cronは定期的なジョブを実行するために使用できる仕組みでスケジュールを定義したコマンドを定期的に実行することが可能。 デーモンとも呼ばれる。

cronの構成

cronの仕組みはcrondデーモンとcrontabコマンドで構成される。 内部的にはcrondが1分ごとにcrontabファイル内容を調べることで実現している。

crontab

ユーザのcrontabは/var/spool/cron/ディレクトリに配置されるが、そのファイルを直接エディタで編集してはならない。 編集にはcrontabコマンドを用いる。

システムのcrontabは/etc/crontabファイルに保存される。 システムのcronで定期的に実行するジョブを格納するディレクトリは以下の通り。

ディレクトリ名説明
/etc/cron.hourly毎時定期的に実行するジョブのスクリプトを格納
/etc/cron.daily毎日定期的に実行するジョブのスクリプトを格納
/etc/cron.monthly毎月定期的に実行するジョブのスクリプトを格納
/etc/cron.weekly毎週定期的に実行するジョブのスクリプトを格納
/etc/cron.d上記以外のジョブのスクリプトを格納

cron/atのアクセス制限

cron/atはユーザー単位で利用制限を実施できる。 制限は/etc/cron.allow,/etc/cron.denyファイルの設定で可能。

10.2.2. cronに関するコマンド

at/atrm/atqコマンド

atコマンドは1回限りのジョブ予約を行えるコマンド。

at 
オプション説明
-datrmのエイリアス
-ratrmのエイリアス
-latqのエイリアス
-f ファイルパスSTDINではなくファイルからジョブ指定

atrmコマンドは予約中のジョブをジョブ番号で指定して削除できるコマンド。 atqコマンドは予約中のジョブを表示するコマンド

crontabコマンド

cronを設定するコマンド。

crontab <オプション>
オプション説明
-eviエディタなどを使用して、crontabファイルを編集
-lcrontabファイルの内容を表示
-rcrontabファイルの削除
-icrontabファイル削除時の確認
-u ユーザーユーザーを指定しcrontabファイルの編集 ( rootユーザーのみ使用可能 )

記述例は以下のように行う。

30 22 * * * /usr/local/bin/backup.sh # 毎日22:30に実行
0 12 * * 1,2 /usr/local/bin/backup.sh # 毎週月曜日、火曜日の12:00に実行

10.2.3. systemdによるスケジューリング

systemdでスケジューリングを行う場合タイマーUnitを使用する。 タイマーUnitには以下のような種類がある。

種類使用例
モノトニックタイマシステム起動10分後に実行、以降1週間ごとに実施
リアルタイムタイマ毎日午前4時に実行

/etc/systemd/system/以下に拡張子.timerでファイルを作成することで設定を行う。 ファイルの記述書式はman 7 systemd.timeで確認可能。

スケジュールの確認

systemctl list-timers

スケジュールの削除

systemctl stop hogehoge.timer

サービスの実行ログの確認

journalctl -u apt-daily.service

10.3. ローカライゼーションと国際化

10.3.1. ローカライゼーションと国際化

ローカライゼーションはソフトウェアのメニューやメッセージを利用者の地域や国に合わせることi18nとも呼ばれる、具体的には言語や日付、通貨単位などを合わせる。

国際化はソフトウェアを最初から多言語・他地域対応するように作ることを言う。

10.3.2. ロケール

ロケールは利用者の地域情報を表す。 これらのカテゴリは個々に設定することが可能。

ロケールの設定はlocaleコマンドで確認可能。(-aでロケールを全表示可能) またカテゴリーは以下のようなものがある。

環境変数説明
LC_CTYPE文字の種類やその比較・分類の規定
LC_COLLATE文字の照合や整列に関する規定
LC_MESSAGESメッセージ表示に使用する言語
LC_MONETARY通貨に関する規定
LC_NUMERIC数値の書式に関する規定
LC_TIME日付や時刻の書式に関する規定
LANGUAGE複数一括設定(:区切り)、最高優先度
LC_ALL一括設定、高優先度
LANG一括設定、低優先度

ロケール名は以下のようなものがある。

ロケール名説明
C, POSIX英語
ja_JP.utf8(ja_JP.UTF-8)日本語/Unicode
ja_JP.eucJP日本語/EUC-JP
ja_JP.shiftJIS日本語/シフトJIS
en_US.utf8英語(米)/Unicode

10.3.3. 文字コード

文字コードはコンピュータ上で文字を利用するために各文字に割り当てたバイトコードを指す。

iconvコマンド

文字コードを変換するために使用するコマンド。

iconv <オプション> <文字コード>
オプション説明
-l変換できる文字コードの一覧を表示
-f 入力文字コード変換元の文字コード。from。
-t 出力文字コード変換後の文字コード。to。
-o ファイル名文字コード変換した文字列を出力するファイル名。

10.3.4. タイムゾーン

タイムゾーンは地域ごとに区分された標準時間帯を指す。 UTC+N時間で決まる。日本の場合はUTC+9時間。

設定は/usr/share/zoneinfo/以下に格納される。 なお日本のタイムゾーン設定は以下のように行える。

cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime #シンボリックリンクで行う場合

tzselectコマンド

一覧から表示される情報をもとにタイムゾーンを設定できるコマンド。

tzselect

tzconfigコマンド

/etc/localtime,/etc/timezoneまとめて変更できるコマンド。

tzconfig

1.11 - 11.システムサービスの管理

システムクロック、システムログ、メール/プリンタなどに関して

11.1. システムクロックの設定

11.1.1. システムクロックとハードウェアクロック

Linuxのクロックシステムにはシステムクロックとハードウェアクロックがある。

システムクロック

システムクロックはメモリ上で動作する時計システム。 Linuxカーネル内に存在し、Linux起動時にハードウェアクロックと同期する。

このクロックは電源がオフになると時計情報も消える。

ハードウェアクロック

ハードウェアクロックはハードウェアとして内蔵された時計システム。 このクロックはシステム停止してもハードウェア上の内蔵バッテリーで動作する。

11.1.2. システムクロック関連コマンド

dateコマンド

システムクロックを参照して現在日時表示、時刻の変更ができるコマンド。

date
書式説明
%Y
%m月(01-12)
%d日(01-31)
%H時(00-23)
%M分(00-59)
%a曜日
%b月名

hwclockコマンド

ハードウェアクロックの参照、システムクロックをハードウェアクロックにセットできるコマンド。

hwclock <オプション>
オプション説明
-rハードウェアクロックの表示
-s (–hctosys)ハードウェアクロックの時刻をシステムクロックに反映
-w (–systohc)システムクロックの時刻をハードウェアクロックに反映
-uUTC (Universal Coordiated Time)として反映

timedatectlコマンド

systemd採用ディレクトリビューションで使用可能な日付、時刻、タイムゾーンを管理を設定できるコマンド。

timedatectl status

11.1.3. NTPによる時刻設定

ハードウェアクロック、システムクロックともに完全に正確な時刻情報ではないのでNTPというプロトコルを通じて正確な情報を取得する。 NTPは階層構造になっており、最上位は原子時計やGPSなどが位置して、その直下にあるNTPサーバを Stratum1、その下を Stratum2 と続いていく構造となっている。

ntpdateコマンド

NTPサーバから正確な時刻取得するコマンド。

ntpdate

ntpサーバの運営

NTPサーバを自前で運用することも可能。 LAN内にNTPクライアントが多いなら用意すると良い。

NTPサーバの起動はSysVinitならばsudo /etc/init.d/ntpd start、Systemdならばsudo systemctl start ntpd.serviceで行う。 なお設定は/etc/ntp.confで行える。

11.3.4. Chronyによる時刻管理

Chronyはntpd/ntpdateの代替の時刻管理システム。 ntpパッケージと同時には使えないのが特徴。

chronydデーモンとchronycクライアントで構成される。 設定ファイルは/etc/chrony.confとなる。

chronyコマンド

chronydの管理を行うコマンド。

chronyc --help

11.2. システムログの設定

11.2.1. ログとは

ログはコンピュータの動作状況の記録を行うもの。 Linuxの場合はsyslogと呼ばれるプログラムを使用することにより、発生する各種イベントをログファイルに出力したりコンソールに出力することが可能となる。 ログのシステムにはrsyslog, syslog, syslog-ngなどがある。

11.2.2. Syslog

syslogはsyslogdというデーモンにより実行される。 syslogは他のプログラムからのメッセージを受信して、出力元や優先度に従って分類を行って、syslogで定義した出力先に送信する。

syslog/rsyslogの設定

syslogの設定は/etc/syslog.confで設定を行う。 rsyslogはsyslogの上位バージョンで拡張機能などがあり、設定は/etc/rsyslog.confで行う。

設定ファイルの構文はファシリティ. プライオリティ アクションで記述する。 記述構文は以下の通り。

<ファシリティ>.<プライオリティ> <出力先(アクションフィールド)>

ファシリティ

ファシリティはログの種別メッセージの出力元を示す。 具体的にはカーネルや実行中のプロセスを表す。

ファシリティ説明
auth, authpriv認証システム(loginなど)
croncron
daemon各種デーモン
kernカーネル
lpr印刷システム
mailメールサービス
userユーザーアプリケーション
local0-local7ローカルシステム

プライオリティ

プライオリティはメッセージの重要度を表す。

重要度(降順)説明
emerg緊急事態
alert早急に対処が必要
crit深刻(システムの処理は継続できる)
err一般的なエラー
warning一般的な警告
notice一般的な通知
info一般的な情報
debug一般的な情報
noneログを記録しない

アクション(出力先)

アクションではメッセージの出力先を指定する。

表記説明
ファイル名ファイルへの出力
ユーザー名ユーザーの端末への出力
@ホスト名リモートホストのsyslogdへの出力
/dev/consoleコンソールへの出力
*全てのユーザーの端末への出力

11.2.3. ログに関するコマンド

loggerコマンド

ログメッセージ生成するコマンド。 システムログの設定の確認などに使用する。

logger [ -p <ファシリティ>.<プライオリティ> ] [ -t タグ ] <メッセージ>

syslog.infoの場合は/var/log/syslogに追記される。

systemd-catコマンド

コマンドの実行結果をジャーナルに書き込むコマンド。 /var/log/syslogに書かれる。

systemd-cat echo 'hoge'

journalctlコマンド

systemd採用システムにおいて、systemdのログ(ジャーナル)を閲覧できるコマンド。 ジャーナルは/var/log/journal/var/run/log/journalのバイナリに保存される。

journalctl
オプション説明
-f, –follow末尾を表示し続ける(tail -fとかとおなじ)
-r, –reverse新しい順(デフォルトは古い順。その逆)
-e, –pager-end末尾を表示する(ページャでさかのぼれる)
-x, –catalog説明文付き
-k, –dmesgカーネルメッセージのみ
-b, –bootブート時メッセージ
-p, –priority=プライオリティ指定したプライオリティ以上
-u, –unit=ユニット名ユニット指定
–fullエスケープ文字を除いてプレーンテキストで出力
–no-pager1ページごとに表示せず、すべてのログを出力する

11.2.4. ログの調査

主要なログファイルは/var/log/messagesに保存されるが、ディストリビューションにより差異がある。

ログの種類

システム状態に応じて出力される各種ログは以下表のようなログファイルに出力される。

ログファイル名内容
/var/log/messages一般的なシステム関連のメッセージ
/var/log/secureセキュリティに関するメッセージ
/var/log/cron定期的に実行される処理結果に関するメッセージ
/var/log/maillogメールに関するメッセージ
/var/log/spooler印刷に関するメッセージ
/var/log/boot.logOS起動時に関するメッセ

ログの確認方法

more,tail,tail - fコマンドやgrepを組み合わせてログの調査を行う。

11.2.5. ログファイルのローテーション

ログファイルはログ出力の度に追記されていくので、ファイルサイズが大きくなる。 そのためローテーション機能によりログファイルの分割などを行う。

ローテーション機能はcronを利用してlogrotateユーティリティが定期的に実行される。 logrotateの設定は/etc/logrotate.confファイルで行う。

11.2.6. ログインユーザログの確認コマンド

lastコマンド

最近ログインしたユーザーの一覧を表示するコマンド。 参照ファイルは/var/log/wtmp

last

whoコマンド

ログイン中のユーザ名、ログイン端末名、ログイン日時、ログイン元IPを表示するコマンド。 参照ファイルは/var/run/utmp

who

wコマンド

whoコマンドでの情報とシステム情報も表示するコマンド。 参照ファイルは/var/run/utmp

w

lastlogコマンド

ログファイルを参照しユーザごとに最近のログイン一覧を表示するコマンド。 参照ファイルは/var/log/lastlog

lastlog

11.3. メール管理

11.3.1. メール配送の仕組み

Linuxにおいてメールの配送はMTAMDA,MUAにより構成/実現される。

MTA

MTA(Mail Transfer Agent)は電子メールを配信/転送するプログラム、つまりメールサーバソフトウェアを表す。 MTAにはsendmail、qmail、postfix、eximなどがある。

MTA処理速度セキュリティ説明
sendmail××かつてMTAの標準ソフトウェアと広く普及した。
qmailセキュリティ面に優れており、非常に堅牢なつくり。パフォーマンスもsendmailより優れている。
postfixパフォーマンスが最も優れたMTA。設定が簡単でセキュリティ面も高い。sendmailとの互換性がある。
eximDebian系の標準のMTA。

MDA(Mail Delivery Agent)

メールボックスにメールを送るプログラム。

MUA(Mail User Agent)

MUAはメールクライアント(メーラ)を表しメール作成、閲覧が可能なもの。

11.3.2. メールの配送フロー

  1. メールクライアントソフトウェア(MUA)でメール作成
  2. 送信元側のメールサーバ上のMTA(1)へ送る
  3. 宛先側のメールサーバ上のMTA(2)へ転送(相手ドメインのDNSサーバに尋ねる)
  4. MTA(2)がメールを受け取ると、MDAがメールをメールボックスに格納する
  5. 受取人は自分のメールボックスからメールを取り出す(POP,IMAPを使用)

11.3.3. MTAの起動とメールの確認

MTAプログラムの確認

LinuxシステムでどのMTAプログラムがインストールされているのかは、以下プログラムで確認可能。

netstat -atnp | grep 25

メールの送信、受信メールの確認

mailコマンドで確認可能。

mail # 受信メールの確認
mail -s <題名> <宛先ユーザー名 | 宛先メールアドレス> # メールの送信「.」で入力終了

メールの転送とエイリアス

メールを転送する場合以下の2つの方法がある.

  1. /etc/aliasesファイルに設定する方法
  2. 各ユーザーのホームディレクトリに存在する~.forwardファイルに転送先アドレスを設定する方法

あるメールアドレスに届いたメールを別のアドレスに転送する場合は/etc/aliasesファイルに設定を記述することで可能。 書式は以下の通り。

転送元ユーザー: 転送先ユーザー

11.3.4. 送信待ちメール/受信待ちメールの確認

多数のメールを送信した場合やメール送信に失敗した場合はメールキューに蓄えられる。 具体的には、送信者側のメールサーバの/var/spool/mqueueディレクトリに保存される。 情報はmailqコマンドでできる。

なお受信成功した場合は /var/spool/mailに保存される。

mailqコマンド

メールキューを一覧するコマンド。

mailq

11.4. プリンタ管理

11.4.1. CUPS

Linuxディストリビューションでのプリンタ印刷には基本的にはCUPSと呼ばれるシステムが使われる。 CUPSの主な特徴は以下の通り。

  • IPP
    • ネットワーク上のプリンタをサポート
  • PPD
    • AdobeのPPD形式のファイルでデバイスドライバの設定ができる(/etc/cups/ppd/にPDOファイルを格納される)
  • Web画面での設定
    • Webブラウザから設定可能(ポート631)
  • プリンタクラスのサポート
    • 複数のローカルプリンタを1つのクラスにグループ化

CUPSの情報は/etc/cupsディレクトリに格納され、CUPSの設定ファイルは/etc/cups/cupsd.confに保存される。 CUPSの設定方法は以下の2つある。

  • 設定ファイルを直接編集する方法
  • WebブラウザでCUPSの設定ページにアクセスして編集する方法

印刷の流れ

  1. 印刷データ受け取る
  2. スプーラが印刷データを受け付け、スケジューリングを行う
  3. プリンタが直接受け付けられないデータを中間形式に変換
  4. PPDに定義されたフィルタにより、最終の印刷データに変換する
  5. 処理した印刷データをCUPSのバックエンドに送る
  6. CUPSバックエンドは印刷データをプリンタに渡す

11.4.2. 印刷関連のコマンド

lprコマンド

ファイルや標準入力を印刷するコマンド。

lpr <オプション> ファイル名
オプション説明
-# 部数印刷部数を指定
-P プリンタ名指定したプリンタに出力

lpqコマンド

プリンタキューに登録されている印刷ジョブを確認するコマンド。

lpq <オプション> <ユーザー名> <ジョブ番号>
オプション説明
-a全てのプリンタの情報を表示
-P プリンタ名指定したプリンタの情報を表示

lprmコマンド

プリンタキューにある印刷ジョブを削除するコマンド。

lprm <オプション> <ジョブ番号>
オプション説明
-自分の印刷ジョブを全て削除
-P プリンタ名指定したプリンタの印刷ジョブを削除

1.12 - 12.ネットワークの設定

Linuxのネットワークの設定に関して

12.1. ポート番号

Linuxにおいてポート番号とサービスとの対応は/etc/servicesに記述される。

番号トランスポート層上位サービス・プロトコル説明
20TCPFTPFTPのデータ転送
21TCP/UDPFTPFTPの制御情報
22TCPSSHSSH
23TCPTelnetTelnet接続
25TCP/UDPSMTP電子メール
53TCP/UDPDNSDNS
80TCPHTTPWeb
110TCPPOP3電子メール(受信)
123UDPNTPNTPサービス
139TCP/UDPNetBIOSMicrosoftネットワーク
143TCPIMAP電子メール(IMAP2/IMAP4)
161UDPSNMPネットワークの監視
162TCP/UDPSNMP Trapネットワークの監視(警告通知等)
389TCP/UDPLDAPディレクトリサービス
443TCP/UDPHTTP over SSL/TLSSSL/TLSによるHTTP接続
465TCPSMTP over SSL/TLSSSL/TLSによるSMTP接続
514UDPSyslogロギングサービス
636TCP/UDPLDAP over SSL/TLSSSL/TLSによるディレクトリサービス
993TCP/UDPIMAP over SSL/TLSSSL/TLSによるIMAP接続
995TCP/UDPPOP3 over SSL/TLSSSL/TLSによるPOP3接続

12.2. ネットワークの基本設定

12.2.1. ネットワーク関連のコマンド

ifconfigコマンド

ネットワークインターフェースの状態を表示したり一時的な設定するコマンド。

ifconfig <ネットワークインターフェース名> <オプション>
オプション説明
IPアドレスネットワークインターフェースへのIPアドレスの割り当て
netmask サブネットマスクサブネットマスクの設定
up指定したインターフェースの起動(有効化)
down指定したインターフェースの停止(無効化)

ifup/ifdownコマンド

指定したネットワークインターフェースを起動(有効化)/停止(無効化)するためのコマンド。

ifup <インターフェイス>
ifdown <インターフェイス>

routeコマンド

Linuxマシン内でルーティングの設定を行えるコマンド。

route <オプション>
オプション説明
-Fカーネルのルーティングテーブルを表示
-Cカーネルのルーティングキャッシュを表示

route addコマンド

ルーティングテーブルに新たなルーティングを追加することができるコマンド。

route add <オプション> <ターゲット>
オプション説明
-netターゲットをネットワークとみなす
-hostターゲットをホストとみなす
netmaskサブネットマスクを指定
gwゲートウェイ(ネクストホップ)を指定

ipコマンド

NIC, ルーティングテーブル、ARPテーブルの管理が行えるコマンド。

ip <操作対象> [サブコマンド] [デバイス]
操作対象説明
linkデータリンク層
addrIPアドレス
routeルーティングテーブル
サブコマンド説明
show表示する
add設定する

12.2.2. ネットワークのトラブルシューティングコマンド

pingコマンド

ip通信の疎通確認コマンド。

ping <オプション> < IPアドレス | ホスト名 >
オプション説明
-c 回数パケットを送信する回数を指定
-i 秒パケットの送信間隔を秒単位で指定

tracerouteコマンド

指定したホストまでのパケットが通過する経路を表示させるコマンド。

traceroute < IPアドレス | ホスト名 >

tracepathコマンド

tracerouteコマンドと同様の機能に加えて、経路のMTUも設定できるコマンド。

tracepath < IPアドレス | ホスト名 >

hostコマンド

DNSサーバを使用して指定したホスト情報を検索するコマンド。

host < ホスト名 >

hostnameコマンド

現在のホスト名を表示とホスト名を変更できるコマンド。

hostname

netstatコマンド

TCP/IPの統計情報、接続状況、ルーティング情報などを調査できるコマンド。 解放ポートの確認によく利用される。

netstat <オプション>
オプション説明
-a接続待ち状態にあるソケットと、接続待ち状態にないソケットを表示
-cステータスを1秒ごとにリアルタイムで表示
-iネットワークインターフェースの状態を表示
-l接続待ち状態にあるソケットのみを表示
-nホスト、ポート、ユーザーなどの名前を解決せず、数値で表示
-p各ソケットが属しているプログラムのPIDと名前を表示
-rルーティングテーブルを表示
-tTCPポートのみを表示
-uUDPポートのみを表示

nc, ncatコマンド

ネットワーク通信の確認を行えるコマンド。

12.2.3. ネットワーク関連の設定ファイル

/etc/hostnameファイル

hostnameを設定するファイル。

/etc/hostsファイル

名前解決を記述するファイル。

/etc/network/interfacesファイル

Debian系でネットワークインタフェースの設定を記述するファイル。

/etc/sysconfig/network-scriptsディレクトリ

RedHat系で様々なネットワークインタフェースの設定ファイルを配置するディレクトリ。

12.2.4. NetworkManagerによる設定

RHEL7のデフォルトのネットワークサービス。 操作はnmcliコマンドで行う。

インストールは以下(RedHat系)

yum install -y NetworkManager

デーモンの起動は以下の通り。

systemctl start NetworkManager
systemctl status NetworkManager

インターフェイスの表示

nmcli connection show

インターフェイスの追加

nmcli connection add ifname [インターフェース名] type [インタフェースのタイプ]

インターフェイスの起動停止

nmcli connection up [インターフェース名]
nmcli connection down [インターフェース名]

12.3. DNSの設定

12.3.1. DNSの設定ファイル

設定ファイル説明
/etc/sysconfig/network,/etc/hostnameLinuxのホスト名の設定が行われる(RedHat系, Debian系)
/etc/hostsホスト名とIPアドレスの対応表
/etc/resolv.confDNSサーバやドメイン名の設定。直接触らずコマンドで設定する
/etc/nsswitch.conf名前解決の問い合わせ順の設定

12.3.2. DNS管理コマンド

hostコマンド

DNSサーバを使ってホストやドメインに関する情報を表示するコマンド。

host localhost

digコマンド

DNSサーバに対して問い合わせを行い、その応答結果を表示するコマンド。

 dig <オプション> <ドメイン名 or ホスト名> <検索タイプ>
オプション説明
-xIPアドレスからホスト名を検索
検索タイプ説明
aIPアドレス
any全ての情報
mxメールサーバの情報
nsネームサーバの情報

whoisコマンド

調べたいドメイン名を指定しwhoisデータベースに問い合わせるコマンド。

whois < ドメイン名 >

1.13 - 13.Linuxのセキュリティ

Linuxのセキュリティやsu/sudoコマンド、sshなどに関して

13.1. Linuxサーバのセキュリティの基本

Linuxをサーバとして運用する場合はセキュリティの観点から主に以下の3点を考える必要がある。

  1. ユーザセキュリティの管理
  2. ホストレベルセキュリティの管理
  3. システムリソースの使用制限

13.1.1. ユーザセキュリティの管理

ユーザーパスワードは定期的に変更したり有効期限を設定することがセキュリティの観念から重要である。

13.1.2. ホストレベルセキュリティの管理

システムのポート情報、プロセス情報の確認がセキュリティの観念から重要である。 具体的には不要なポートが開いていないかどうかを確認する。

13.1.3. システムリソースの使用制限

1人のユーザーに大量のリソースを使用されないように、各ユーザーが使用できるプロセス数などのリソースを制限することが可能。

13.2. ユーザセキュリティの管理

13.2.1. パスワード管理に関するコマンド

chageコマンド

パスワードに有効期限を設定、パスワード変更の強制、アカウントの期限の設定が可能。 オプションを指定せずにchageコマンドを実行した場合は、対話モードで実行される。

chage < オプション > < ユーザー名 >
オプション説明
-lパスワードまたはアカウントの有効期限を表示
-mパスワード変更間隔の最低日数を設定
-Mパスワードの最大有効期限の日数を設定
-dパスワードの最終更新日を設定
-Wパスワードの有効期限切れの警告が何日前から始まるかを設定
-Iパスワードの有効期限後、アカウントロックされるまでの日数を設定
-Eユーザーアカウントが無効になる日付を設定

13.2.2. ログインの禁止設定

/etc/nologinファイル

このファイルの存在によりroot以外でのログインを禁止できる

/bin/false,/sbin/nologinファイル

ログインさせない用に制御するためのシェルファイル。 ユーザーアカウントは必要であるがユーザがログインしてシェルを利用するのは好ましくないケースで使用する。

13.2.3. ユーザーの切り替え

普段は一般ユーザ、権限が必要なときだけrootでアクセスする。

suコマンド

一時的に別ユーザになるコマンド。

su - hogehoge

sudoコマンド

特定の管理者コマンドのみを実行するコマンド。

sudo <コマンド>

なお設定は/etc/sudoersで設定、または/etc/sudoers.d/ディレクトリ以下にファイルを追加することによる設定が可能。 なお直接ファイルを編集すのではなくvisudoコマンドで設定を行う。

visudoコマンド

sudoコマンドを実行できるユーザに対するコマンドを定義できるコマンド。 書式は以下の通り。

ユーザー名 ホスト名=(実行ユーザー名) コマンド

13.2. ホストレベルセキュリティの管理

13.2.1. ホストへのアクセス

ホストのセキュリティを考える際以下点を注意することがセキュリティとして重要になる。

内部からのアクセスへの対策

  • 適切なユーザーパスワード管理
  • root権限で動作するプログラムを最小限にする

外部からのアクセスへの対策

  • 必要なソフトウェアのみインストールする
  • 不要なサービスを起動しない
  • ホストレベルの適切なアクセス制御
  • パケットフィルタリング
  • セキュリティ情報の確認を頻繁にする

13.2.2. スーパサーバの設定と管理

スーパサーバ

スーパーサーバは他のサーバプログラムに変わってサービス要求を監視して、接続確立時に本来のサーバプログラムに要求を引き渡すシステム。 これにより必要時に個々のサーバプログラムを起動することでリソースを効率的に使用することが可能。 またTCPラッパーと組み合わせることで、アクセス制御を集中管理できる。

FTPやsshサーバなどの接続頻度の高くないサーバに向いている。

スーパサーバの種類

スーパサーバにはinetdxinetdがあり、xinetdが多くのディストリビューションで採用されている。

https://www.infraexpert.com/infra/study10.html https://wand-ta.hatenablog.com/archive/category/LPIC

xinetdの設定

全体の設定は/etc/xinetd.conf、サービスごとの設定は/etc/xinetd.d/以下で設定可能。

全体設定のファイル(/etc/xinetd.conf)

 defaults
 {

   instances        = 60 # 各サービスにおける最大デーモン数
   log_type         = SYSLOG authpriv # ログの出力方法
   log_on_success   = HOST PID # 接続許可時にログに記録する内容
   log_on_failure      = HOST # 接続拒否時にログに記録する内容
   cps              = 25 30 # 1秒間に接続可能な最大コネクション数 ・ 限度に達した時のサービス休止の秒数

 }

 includedir /etc/xinetd.d # 各サービスごとの設定ファイルを格納するディレクトリ

なお設定後は/etc/init.d/xinetd restartで再起動が必要。

inetdの設定

全体の設定は/etc/inetd.conf、サービスごとの設定は/etc/inetd.d/以下で設定可能。 inetdは現在はほとんど使用されていない。

13.2.3. TCP Wrapper

TCP Wrapperはセキュリティソフトウェアで、通信で使用するTCPポートを把握していて、アクセス制御を行ったり、通信ログを保存することが可能。

具体的には外部からアクセスしてくるポートの細かい制限を行うことができる。 設定は以下2ファイルを用いて行う。

設定ファイル説明
/etc/hosts.allowアクセス制御の許可設定を行うファイル
/etc/hosts.denyアクセス制御の拒否設定を行うファイル

書式は以下形式で記述する。

デーモン名 : ホスト名またはIPアドレス

13.4. システムリソースの使用制限

13.4.1. システムリソースの制限を行うコマンド

ulimitコマンド

ユーザが利用できるリソースを制限するコマンド。 1人のユーザが全てを使い切り、システムが停止する可能性を制限する。

ulimit <オプション>
オプション意味
-a制限の設定値をすべて表示
-c サイズ生成されるコアファイルのサイズを指定
-f サイズシェルが生成できるファイルの最大サイズ
-n 数同時に開くことのできるファイルの最大数
-u プロセス数1人のユーザが利用できる最大プロセス数
-v サイズシェルとその子プロセスが利用できる最大仮想メモリサイズを指定する

13.5. SSHの設定

13.5.1. SSH

SSHの基礎

SSHはネットワークに接続した機器を遠隔操作するために使用するL7層のプロトコル。

sshコマンド

ssh接続を行うコマンド。telnetより安全性が高い。

ssh <オプション> <接続先ホスト>
オプション説明
-1SSHプロトコルバージョン 1 を使用
-2SSHプロトコルバージョン 2 を使用
-l ユーザ名ログインユーザー名を指定
-p ポート番号リモートホスト接続時に使用するポート番号を指定
-i 秘密鍵ファイル秘密鍵の指定
-o StrictHostKeyChecking=noホストキーの検証回避

ユーザーがログインしてシェルあるいはコマンドを実行する直前にSSHは、/etc/sshrcファイルに記述されているコマンドを実行する。

SSHでの接続時にはログイン時と同様、全ユーザー共通の設定ファイル(/etc/sshrc)とユーザー毎に読み込まれる設定ファイル(~/.ssh/.config)が読み込まれる。

scpコマンド

SSHの仕組みでホスト間で安全にファイルをやりとりするコマンド。

scp <オプション> コピー元パス 保存先パス
オプション説明
-i 鍵ファイルssh接続に使用する鍵ファイルを指定する
-P ポート番号(sshのポートを変更している場合などに)接続に使用するポートを指定する
-pコピー元のタイムスタンプやパーミッションを保持する
-rディレクトリごと再帰的にコピーする

13.5.2. SSH鍵の生成

ssh-keygenコマンド

SSHで公開鍵と秘密鍵のペアを作成するコマンド。 一般的には暗号化にはRSAを使用したほうが良い。

ssh-keygen <オプション>
オプション説明
-p既存の秘密鍵ファイルのパスフレーズを変更
-t生成する鍵の種類( rsa1 または rsa または dsa )を指定
-b鍵の長さを指定(2048など)

RSA暗号方式の鍵を生成した場合、秘密鍵と公開鍵は次のファイルパスに生成する。 また、生成した公開鍵は、~/.ssh/authorized_keysに公開鍵リストとして追加される。

説明
秘密鍵~/.ssh/id_rsa
公開鍵~/.ssh/id_rsa.pub

13.5.3. SSHのホストベース認証

ホストベース認証はSSHサーバに登録済みのホストからSSH通信があった場合にそのユーザーを信用して接続を許可する認証。 サーバの正当性確認するものとなっている。 このとき、SSHサーバとクライアントはユーザー認証を行わずホストの認証のみを行う。

認証手順は以下の通り。

  1. サーバの公開鍵をクライアントに送る
  2. クライアント側で保存されているサーバの公開鍵(場所は~/.ssh/known_hosts)と一致確認

またホストベース認証の鍵のファイルパスは以下に配置される。

暗号化方式鍵のファイルパス
RSA秘密鍵/etc/ssh_host_rsa_key
RSA公開鍵/etc/ssh_host_rsa_key.pub

13.5.4. 公開鍵認証

公開鍵認証はユーザ認証の方式の1つ。 認証フローは以下の通り。

  1. クライアント側で鍵ペア作る(ssh-keygen)
  2. クライアントの公開鍵をホストに渡す
  3. クライアントの鍵が使用できるか確認する
  4. クライアントの秘密鍵で署名を作る
  5. サーバに送る
  6. サーバ側の、クライアント公開鍵で署名を検証する

13.5.5. SSH Agent

SSH Agentは秘密鍵ファイルを使用する際にパスワード認証なしにログインすることができる仕組み。 秘密鍵をメモリ上に保存しておいて必要時に利用するようにすることで実現している。

利用は以下のように行う。

  1. ssh-agentの子プロセスとしてbashシェルの起動(ssh-agent bash)
  2. ssh-addコマンドを使用して秘密鍵を登録

13.5.6. OpenSSH

OpenSSHは高いセキュリティでリモートホスト間通信できる仕組み。 SSH v1系、v2系両対応しており、ファイル転送、リモート操作が可能。

認証機能と暗号化が含まれる。

OpenSSHのインストール

インストールする際のパッケージは以下表の通り。 また設定ファイルは/etc/sshd_configとなる。

clientserver
Ubuntu, Debianopenssh-clientopenssh-server
Ret Hat系openssh, openssh-clientopenssh-server

サーバの起動はSysVinitのRedHat系で/etc/init.d/sshd start、Debian系で/etc/init.d/ssh startとなる。 またSystemdではsystemctl start sshd.serviceとなる。

13.5.7. GnuPG

GPG(GnuPG)はファイルの暗号化と復号が行えるOSSソフトウェア。 公開鍵暗号を使用してファイルの暗号化と復号、電子署名することが可能。

GnuPGを使用するためにはgpgコマンドを使用する。

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

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

2.1 - 1.キャパシティプランニング

Linuxサーバのリソース見積もり方法に関する説明

1.1. キャパシティプランニング

1.1.1.キャパシティプラニングとは

キャパシティプランニングはシステムのリソースが将来的にも不足しないようにするための設計することをいう。 具体的には以下パラメータに注目/監視を行いリソースを見積もることで実現する。

  • CPU
  • メモリ
  • ディスク
  • ネットワーク帯域

キャパシティプランニングではシステムが最大どれだけのリソースを必要とするか測定を行うことで必要なリソースを見積もる。 また、システムパフォーマンスのボトルネックになるものには以下のようなものがある。

  • ディスクI/O
  • スワップの利用率
  • ネットワークI/O

1.1.2. パフォーマンスチューニング

パフォーマンスチューニングは効率よくシステム上のリソースを使えるようにさまざまな設定を調整すること

1.2. リソース使用率とトラブルシューティング

リソース使用率の測定では現時点における各種リソースの利用状況を計測を行う。 これはキャパシティプランニングやパフォーマンスチューニングのために実施する。

1.2.1. 総合的なリソース使用率の測定

各コマンドで確認できる項目は以下の通り。

  • CPU
    • システム全体CPU使用率の表示
      • top(htop), vmstat, iostat, mpstat ALL
    • プロセスごとのCPU使用率表示
      • top(htop) ps aux
    • CPUの平均負荷の表示
      • top(htop), uptime, w
  • 物理メモリ
    • システム全体物理メモリ使用率の表示
      • top(htop), free, vmstat, sar -r
    • プロセスごとの物理メモリ使用率の表示
      • top(htop), ps aux
  • スワップ領域
    • スワップ領域の使用状況の表示
      • top(htop), free, vmstat, sar -S, swapon -s
    • スワップイン/アウトの表示
      • vmstat
  • ディスクI/O
    • iostat, iotop, vmstat, sar -b
  • ネットワークI/O
    • iptraf, netstat -i/-s, sar -n DEV|EDEV
  • プロセスのPID
    • pstree -p, ps aux, top, lsof

topコマンド

システムリソースの使用状況やプロセスの実行状況などを継続的に表示することができるコマンド。

top [オプション]
オプション説明
-b対話モードではなくバッチモードで実行する
-d 秒表示をする間隔を指定する
-n 回指定した回数だけ更新すると終了する
-u ユーザ指定したUIDのプロセスのみ監視する
-p PID指定するPIDのプロセスのみ実行する

実行した結果は以下の通り。

TOP

htopコマンド

全体およびプロセスごとのCPUやメモリの使用状況を一定時間ごとに更新して表示するコマンド。

htop

vmstatコマンド

物理メモリやスワップ領域の詳細な情報やプロセスやCPUの統計情報などを継続的に表示するコマンド。 スワップやブロックのI/Oの値を出力可能。

vmstat [表示間隔() [回数]]

VMASTAT

iostatコマンド

CPUの利用状況およびディスクI/Oの状況などを継続的に表示するコマンド。

iostat [オプション] [表示間隔() [回数]]
オプション説明
-cCPU使用率のみを出力する
-dディスクI/O情報のみを出力する
-kブロック単位ではなくKB単位で表示する
-t時間を表示する

IOASTAT

iotopコマンド

ディスクI/Oの情報がプロセスごとに表示するコマンド。

iotop

IOTOP

sarコマンド

システムのアクティビティ情報を定期的に収集し報告するためのコマンド。 sysstatパッケージに含まれる。sysstatdが有効になると/var/log/saX(Xは数字)でログが格納される。 定期的な実行を比較的簡易に導入できる/usr/lib/sa/sa1(sadcの定期的な実行),/usr/lib/sa/sa2(sarの定期的な実行)というスクリプトが用意されている。

具体的には以下のシステムのパフォーマンスを詳細に確認するために用いられる。

  • CPUの使用率
  • メモリ使用量
  • I/O活動
  • ネットワーク使用
sar [オプション] [ 時間間隔(回数) ]
オプション説明使用例
-A全てのオプションを表示sar -A
-uCPU使用率を表示sar -u 1 3
-P指定したCPUの使用率表示sart -P 1
-r物理メモリ使用状況を表示sar -r 1 3
-bディスクI/O操作に関する情報を表示sar -b 1 3
-Sスワップ領域の使用状況を表示sar -S 1 3
-n DEVネットワークI/Oの統計を表示sar -n DEV 1 3
-n EDEVネットワークI/Oのエラー統計を表示sar -n EDEV 1 3
-dディスクI/O統計を表示sar -d 1 3
-qシステムの負荷平均値を表示sar -q 1 3
-Wスワップ領域の情報を表示するsar -W 1 3
-fデータを取り出すログファイル指定sar -f logging.log
-o [file]バイナリ形式で[file]に出力sar -o outputfile 1 3

sadfコマンド

sadcコマンドによるログをTSVやXML形式に出力するコマンド。

sadf [オプション] -- [ sarコマンドのオプション ]
オプション説明
-jJSON形式で出力
-xXML形式で出力
-tロケール日時で表示
sarコマンドに渡す

uptimeコマンド

システムの稼働時間や負荷平均などを表示するコマンド。 topの上部とほぼ同じ。

uptime

表示されるload average1, 5, 15分での平均で表示される。

wコマンド

現在ログインしているユーザとそのプロセス情報を表示するコマンド。 システムの稼働時間や負荷平均も表示できる。

w [オプション] [ユーザ名]
オプション説明
-hヘッダを非表示
-sログイン時刻、JCPU、PCPUを表示しない

1.2.2. CPU使用率の測定

psコマンド

稼働中のプロセスおよび、プロセス毎のCPUやメモリの使用量を表示するコマンド。

ps [オプション]
ps aux # すべてのプロセス表示
オプション意味
a端末を持つ全てのプロセスを表示する
eコマンド名の後に環境変数などを表示する
x端末を持たない全てのプロセスを表示する
u実行ユーザ名も表示する
r実行中のプロセスだけを表示する
l長いフォーマットで表示する
-C コマンドリスト実行ファイル名を指定して表示する
-u ユーザーリストユーザーを指定して表示する
-eすべてのプロセスを表示
-f引数を含めた完全フォーマットで表示
-lロング形式で表示
-p PIDPIDで選択
-t tty端末名で選択
-u UIDユーザIDで選択

pstreeコマンド

動作中のプロセスの親子関係をツリー状で表示するコマンド。

pstree

lsofコマンド

ファイルを開いているプロセスを表示するコマンド。

lsof

iostatコマンド

CPUの利用状況およびディスクI/Oの状況などを表示するコマンド。

iostat

mpstatコマンド

マルチプロセッサシステムのCPUの使用状況を表示するコマンド。

mpstat

1.2.3. メモリ/スワップ領域使用量の測定

freeコマンド

メモリやスワップ領域の使用状況を表示するコマンド。

free [オプション]

swaponコマンド

スワップ領域を有効/確認するコマンド。 -sオプションでスワップ領域の利用状況を確認できる。

swapon

1.2.4. ディスク使用量の測定

dfコマンド

ディスクの使用量、使用割合を計測できるコマンド。

df [オプション]
オプション意味
-aすべてのファイルシステムの情報を表示
-h1MB=1024MBで表示
-H1MB=1000KBで表示
-iiノードの使用状況を表示
-lローカルファイルシステムの表示
-mMB単位で表示
-Tファイルシステムタイプの表示

iotopコマンド

ディスクI/Oの情報がプロセスごとに確認できるコマンド。

iotop

1.2.4. ネットワークトラフィック量の測定

netstatコマンド

ネットワークの状態に関する情報を表示するコマンド。

netstat
オプション説明
-iネットワークインターフェースの状態を表示
-sプロトコル毎にパケットの送受信に関する情報を表示

ssコマンド

netstatの後継のコマンド。 -sコマンドで接続状態統計を確認可能。

ss -s

netserver/netperfコマンド

netserverコマンドはサーバ側で接続待ちするコマンド。 ポートはデフォルトで12865番が使用される。

netperfコマンドでサーバに接続し通信速度を計測する

iptrafコマンド

ネットワークのトラフィックをモニターした情報が表示できるコマンド

iptraf

1.3. リソース需要の分析と予測

1.3.1. リソース監視系ツール

リソースの監視は各種コマンドでも実行できるが、OSSのツールを用いることで効率的に監視が可能となる。 監視ツールにおいてリソースの状態の測定(監視)する場合はSNMPで行われる。

Collectd

サーバ状態を監視するデーモンプログラム。 システムにかかる負荷が少ない特徴がある。

データの監視と記録を行うには/etc/collectd.confで設定を行う。 Catciなどと合わせて使用することが多い。

なおデータの監視・記録にはプラグインを追加する必要があり、設定ファイルの/etc/collectd.confLoadPluginで指定する。

Nagios

サーバの動作確認(死活監視)、ネットワークサービス状態/リソース使用状況の監視が行えるOSSソフトウェア

MRTG

ネットワークやリソースの使用状況を監視しグラフ化するツール。 死活監視は行えない。

Catcti

ネットワークやリソースの使用状況を監視しグラフ化するツール。 WEBブラウザ上で設定を行うことができる。 MRTGより設定が容易という特徴がある。

Icinga2

Nagios互換の監視ツール。 WebAPIを使って監視情報のやりとりを行うといったNagiosにない機能を追加されている。 そのためオブジェクト管理を主体とした監視環境を提供する。

2.2 - 2.Linuxカーネル

Linuxカーネルやデバイスファイルなどに関して

2.1. カーネルの構成要素

2.1.1. カーネルバージョン

カーネルにはバージョン番号が付けられており、「3.X.Y」の形のようにあらわされる。

  • 2.6より前の場合
    • Xの部分が偶数で安定版、奇数で開発版を示す
    • Yの部分が開発版の修正版を表す場合がある
  • 2.6以降の場合
    • 正式版かどうかの判断に番号の偶奇は関係ない
    • -の後に続く記号によって判断する

なおカーネルバージョンを知るにはuname -rコマンド、もしくは/proc/versionの確認で可能となる。 またusr/src/kernel/hogehogemakefileを確認することでも可能。

Linuxカーネルのカテゴリ

リリースされるLinuxカーネルは主に以下の4つのカテゴリに分類される。

  • prepatch(プレパッチ) … リリース候補
  • mainline(メインライン)… prepatchの後にリリースされる正式版
  • stable(ステーブル)… mainlineの後にリリースされる安定版
  • longterm(ロングターム) … stableから選ばれ新しいカーネルに行われたものと同様のバグフィックスが行われるリリース

Linuxカーネルのアーカイブの内容

Linuxカーネルはtar.gz形式、またはtar.xz形式でアーカイブして配布され以下内容が含まれる。

  • カーネルソース
  • カーネルモジュールのソース
  • ドキュメント
  • Makefile

2.1.2. カーネルイメージ

カーネルイメージはイメージファイルとして格納されたLinuxカーネルのこと。 カーネルイメージは/boot/vmlinuz*という名称で保存されている。

カーネルイメージの形式

カーネルイメージにはzImagebzImageがある。 なおこれらはgzipで圧縮されている。

  • zImage
    • 512KB以下のイメージのみ扱える
    • ローメモリを使用
  • bzImage
    • ハイメモリを使用

2.2. カーネルモジュールの管理

2.2.1. カーネルモジュール

Linuxカーネルはローダブルモジュールのサポートを有効化するとカーネル機能の一部をモジュール化して、必要なときのみ読み込むことができる。 この機能でカーネル起動時間の短縮、多様なハードウェアへの対応が可能。

具体的には頻繁に利用するデバイスのドライバはLinuxカーネルに組み込み、利用頻度の低いドライバはモジュール化するのが良い。 なおカーネルモジュールの拡張子は.koとなる。

2.2.2. カーネルモジュールの操作コマンド

lsmodコマンド

現在ロードされているすべてのモジュールを一覧表示するコマンド。 モジュール名とそのサイズ、参照回数、モジュールの参照しているモジュール名などが表示される。

なお/proc/modulesからも参照が可能。

lsmod

modinfoコマンド

モジュール情報を表示するコマンド。

modinfo [オプション] [モジュール名]
オプション意味
-aモジュール作者情報の表示
-dモジュール説明の表示
-lモジュールライセンス表示
-nモジュールファイル名表示

insmodコマンド

ローダブルモジュールをロードするコマンド。 読み込む再依存関係がある場合、依存元のモジュールからロードする必要がある。

insmod [オプション] [モジュールパス]
オプション意味
-s結果を標準出力ではなくsyslogに出力する
-v詳細情報の表示

rmmodコマンド

ロードされているモジュールをアンロードするコマンド。 使用中、依存関係のあるモジュールはアンロードできない。

rmmod [オプション] [モジュール名]
オプション意味
-a未使用のモジュールをすべてアンロードする
-s動作結果を標準出力ではなくsyslogに出力する

modprobeコマンド

モジュールのロード/アンロードを行うコマンド。 このコマンドでは依存関係を調べ、インストールする必要のあるモジュールも自動ロードする特徴がある。

modprobe [オプション] [モジュール名]
オプション意味
-aすべてのモジュールのロード
-c現在使われている設定の表示
-rモジュールのアンロード
-C ファイル名設定ファイルの指定
-show-dependsモジュールの依存関係を表示

なおmodprobeが参照するモジュールの依存関係はmodules.depに記載。 このファイルは/lib/modules/カーネルバージョン以下にある。 記載方法は以下の通り。

モジュール名: 依存しているモジュール 依存しているモジュール

またモジュールのロード/アンロードの際に何かしら処理を行う場合は/etc/modprobe.confで設定を行う。

depmodコマンド

modules.depを作成するコマンド。 カーネルモジュールの依存関係情報を更新する

modprobeがにより参照される。

2.3. カーネルのコンパイル

カーネルは必要な場合はソースコードからコンパイルが可能。 これはカーネルの再構築と呼ばれる。 カーネルの再構築するケースは以下の通り。

  • 必要なデバイスドライバがカーネルに含まれていない
  • 使用しているハードウェアに最適したカーネルを利用したい
  • カーネルの最新機能を使いたい

2.3.1. カーネルコンパイルとインストール

カーネルのコンパイル手順は以下の通り。

  1. カーネルソースを用意する
  2. カーネルコンフィギュレーションの設定
  3. カーネルをコンパイル
  4. カーネルモジュールをコンパイル
  5. カーネルとカーネルモジュールを配置
  6. ブートローダの設定

カーネルソースの準備

カーネルソースコードは/usr/src/linux*に保存される。 カーネルソースコードのディレクトリには以下ディレクトリがある。

ディレクトリ名説明
archアーキテクチャ(i368, x86_64)に依存したコード
configsそれぞれの.config
crypto暗号処理関数
driversデバイスドライバ関連
fs仮想ファイルシステム/システムファイル関連
includeC言語のincludeファイル
init初期化用コード
ipcSystemV互換プロセス間通信関連ファイル
kernel各種カーネル機能
lib各種モジュール関連
mmメモリ管理関連
net各種ネットワークプロトコル関連
scriptsカーネル作成支援コマンド
Documentations各種ドキュメント
ファイル説明
.configカーネルのビルド設定ファイル
Makefilemakeの設定やカーネルバージョンの記載

なおxzファイルで圧縮されたカーネルソースの展開例は以下の通り。

xz -dc ファイル名.xz | tar xvf -

カーネルコンフィギュレーションの設定

カーネルの設定ファイルは.configに記載される。 カーネルの設定を新しい設定に反映させる場合は以下コマンドを実施する。

make oldconfig

このコマンドでは新しいカーネルで付け加えられた機能のみに対して問い合わせを行い、既存設定はそのままとなる。

カーネルの設定

カーネルの設定ではカーネルの機能を直接カーネルに埋め込むか、埋め込まずにローダブルモジュールにするか、組み込まないか設定が可能。

make config # カーネルオプションごとに答える形で設定
make menuconfig # メニュー形式で表示されているオプション項目を選択して設定
make oldconfig # 現在のカーネルの設定を引き継ぐ
make xconfig # KDE上で設定
make gconfig # GNOME上で設定

なおmake configmake menuconfigで行った設定は/usr/src/linux/.configに保存される。

カーネルとカーネルモジュールのコンパイル

makeコマンドを引数なしで実行するとカーネル、カーネルモジュール共にコンパイルされる。

make

カーネルとカーネルモジュールのインストール

カーネルモジュール(.ko)を適切なディレクトリに保存するにはmake modules_installコマンドを実行する。 なお保存先は/lib/modules/カーネル以下に保存される。

またカーネルのインストールはmake installコマンドで行える。 このコマンドは以下処理を行う。

  1. /boot以下にビルドされたカーネルをバージョンをファイル名にしてコピー
  2. 初期RAMディスクが必要な場合は作成
  3. ブートローダの設定ファイルに新しいカーネル用の起動設定を追加

makeコマンド

makeコマンドはソースコマンドをコンパイル、ビルドなどを行うコマンド。

make [ターゲット] 対象
ターゲット説明
clean.config以外のファイルを削除する
allすべてのビルドを実施
modulesカーネルモジュールをすべてビルドする
modules_installカーネルモジュールをインストール
rpmカーネルをビルド後にRPMパッケージを作成
rpm-pkgソースRPMパッケージの作成
defconfigデフォルト状態の設定ファイルを作る
mrproperカーネルツリーの初期化(設定ファイルもクリア可能)

なおカーネルのビルドと再構築はソールから以下のような手順で行う。

  1. 設定の初期化(make mrproper)
  2. 設定を行う(make oldconfig)
  3. ビルドを行う(make all)
  4. モジュールをインストール(make modules_install)
  5. カーネル本体をインストール(make install)

DKMS(Dynamic Kernel Module Support)

カーネルのソースツリー外にあるカーネルモジュールを自動的に生成する仕組み。

DKMSはカーネルアップデートの際に、カーネルとは独立して自動的にカーネルモジュールをコンパイルしインストールする。 現在、多くのディストリビューションがDKMSをパッケージに含んでいる。

2.4. カーネルのパラメータ変更

2.4.1. カーネルパラメータの設定

カーネルパラメータは以下目的で使用される。

  • 機能の有効化/無効化
  • システムパフォーマンスチューニング
  • システム情報の参照

設定はproc/sys/kernel以下のファイルで設定可能。

2.4.2. カーネルパラメータに関するコマンド

sysctlコマンド

カーネルパラメータを設定/表示できるコマンド。 なお再起動後もカーネルパラメータを永続変更したい場合は/etc/sysctl.confへの設定記述で可能。

sysctl [オプション] [パラメータ]
オプション意味
-a現在利用できるすべてのパラメータを表示する
-p指定したファイルから設定を読み込む(DFで/etc/sysctl.conf)
-wパラメータを更新する

2.4.3. 初期RAMディスク

RAMディスクはメモリ上にファイルシステムを作成する機能のことで、ループバックマウントはファイルをファイルシステムとしてマウントできる機能をいう。 この仕組みを利用してファイルとして用意されたファイルシステムをRAMディスクとしてメモリ上に展開し、そのうえで暫定的にカーネルを起動しその後に本来利用するルートファイルシステムをマウントする起動方法は初期RAMディスクと呼ばれる。

初期RAMディスクのイメージファイルの形式には以下2種類がある。

  • initrd
    • 素のファイルシステムを圧縮したもの
    • gunzipmount -o loopでイメージの確認が可能
  • initramfs
    • cpioアーカイブをgzip圧縮したもの
    • gunzipcpioでイメージの確認が可能

initramfsはinitrdと比べてファイルシステムをドライバが不要、メモリ効率が優れているという特徴がある。 近年ではinitramfsが利用されている。またCentOSなどではDracutユーティリティ(dracut)を初期RAMディスク作成で使用する場合がある。

初期RAMディスクの作成はmkinitrdコマンド、mkinitramsコマンドが利用される。

mkinitrdコマンド

初期RAMディスクの作成コマンド。

mkinitrd RAMディスクイメージ カーネルバージョン

mkinitramsコマンド

初期RAMディスクの作成コマンド。 cpio アーカイブを利用した形式の場合はこちらを使う。

mkinitrams -o RAMディスクイメージ カーネルバージョン

dracutコマンド

初期RAMディスクの作成コマンド。

dracut 出力ファイル名 カーネルバージョン

2.5. カーネル管理と課題解決

2.5.1. /procの確認

/procカーネル内のデータへのインターフェイスとなるファイルシステムのこと。

lsdevコマンド

デバイスごとのDMA(/proc/dma),IRQ(/proc/interrupts),I/Oアドレス(/proc/ioports)を表示するコマンド。

lsdev

lspciコマンド

すべてのPCIバスと接続されているPCIデバイスに関する情報を表示するコマンド。

lspci [オプション]
オプション意味
-v詳細に情報表示
-vvさらに詳細に情報表示
-tツリー上に表示
-bカーネルではなくPCIバス認識に沿って表示

lsusbコマンド

接続されているUSBデバイスに関する情報の表示をするコマンド。

lsusb [オプション]
オプション意味
-v詳細に情報表示
-tツリー上に表示

2.5.2. デバイスファイル

デバイスファイルはデバイスを抽象化したファイル/dev以下に存在する。 デバイスファイルにはブロックデバイスキャラクタデバイスの2種類がある。 それぞれファイルタイプはbcとなる。

  • ブロックデバイス
    • バッファを持ちランダムアクセスが可能
    • ブロック単位でアクセス可能
    • ハードディスク、フロッピーディスク、RAMディスク、RAIDボリュームなど
  • キャラクタデバイス
    • ランダムアクセスが不可能なデバイス
    • キーボード、マウス、プリンタなど

なおカーネルが認識しているデバイスは/proc/devicesファイルで確認可能。

2.5.3. udev

udevはデバイスファイルを管理するための仕組み。 実際にはudevとsysfsが連携して管理するようになっている。 udevの仕組みは以下の通り。

  1. ハードウェアの接続をカーネルが検知
  2. udevデーモンが必要なデバイスファイルを作成する

このため認識している分のデバイスファイルしか作成されないということになる。 またデバイスファイル作成の際に参照される設定ファイルは/etc/udev/rules.dとなる。

/etc/udev/rules.dの書式

この設定ファイルの書式は以下の通り。

認識キー==値, 代入キー==

またsysfsがどのデバイスを扱うかはudevadm infoコマンドで確認可能

udevadm infoコマンド

sysfsがデバイスをどのように扱っている確認できるコマンド。

udevadm info [オプション]
オプション意味
-a指定したデバイスの上位デバイスについても表示する
-p デバイスsysfsより上のデバイスを指定
-n デバイス/dev以下のデバイスファイルを指定
-q 種類表示する情報の種類を指定(name, symlink, path, env, all)

udevadm monitorコマンド

デバイスの検知をモニタリングするコマンド。 カーネルのイベントを監視して、udevのルールやイベントの表示を行える。

udevmonitorコマンドでも可能。

udevadm monitor

2.3 - 3.システムの起動と管理

Linuxシステムの起動/動作に関する詳細

3.1. システムの起動のプロセスとカスタマイズ

3.1.1. ブートからカーネル起動まで

電源起動からシステム化起動するまで以下のようなフローとなる。

BIOS/UEFI => ブートローダ => カーネル

BIOS/UEFI

BIOS/UEFIはマザーボードに焼き付けられた基本的な制御プログラムで、基本的な入出力管理を行う。 重要な動作としては起動デバイスのマスターブートレコードに格納されたブートローダを実行することがある。

  • BIOSのブートプロセス … BIOS → MBRのブートローダ → カーネル → init
  • UEFIのブートプロセス … UEFI → ESP(のブートローダ) → カーネル → init

UEFI

UEFIは以下の要素から構成される。

要素説明
EFI System Partition (ESP)UEFIシステムにおける物理的なマシンを起動、ファームウエアが読み込まれた後の起動シーケンスで最初にアクセスされる領域/boot/efiにマウントされFAT16またはFAT32でフォーマットされている必要がある
UEFIブートマネージャ起動情報(OSをどこからどのようにロードするか)を管理するプログラム
efibootmgrUEFIブートマネージャーの起動エントリをOS上から操作するコマンド

MBR/GPT

BIOSでは起動デバイスの最初のセクタであるMBR(マスターブートレコード)でパーティションを管理する。 UEFIではGPTでパーティションを管理する。

GPTでは起動ドライブに2TB以上割り当てることができる特徴があり、またブートローダはESPに格納される。 UEFIシステムパーティションではFATまたはVFATでフォーマットされる。

ブートローダ

ブートローダはマスターブートレコードに格納されて部分(第1部分)とそこから呼び出される部分(第2部分)に分かれている。 動作としては第1部分が第2部分のブートローダをロードしそれを起動する。また第2部分のブートローダは指定したパーティションからカーネルをロードし制御を移す。

Linuxで使用されるブートローダにはGRUB LegacyGRUB2がある。

カーネル

カーネルはinit(/sbin/init)を起動するもので、その過程で以下処理を行う。

  • 組み込まれたハードウェアの検出
  • メモリの初期化
  • システムクロックの設定
  • IRQの設定
  • ルートパーティションのマウント

またカーネル起動中のメッセージはdmesgコマンドで確認可能。

3.1.2. SysVinitの概要

サービスが起動する仕組みはこれまでSysVinitが主流であったが、現在ではSystemdという仕組みが主流となっている。

SysVinit

SysVinitではLinuxシステムで最初に実行されるinit/etc/inittabに従いシステムに必要なサービスを順次起動するものであった。 initのPIDは1番となりすべてのプロセスはinitの子プロセス/孫プロセスとなる。 起動のプロセスは以下の通り。

  1. initが/etc/inittabを読み込む
  2. initが/etc/rc.sysinitを読み込む
  3. initが/etc/rcを実行する
  4. /etc/rc/etc/rcN.d(Nはランレベル)ディレクトリ以下のスクリプトを実行する

なお/etc/inittabの書式は以下の通り。

1:1245:respawn:/sbin/mingetty tty2
  • 1 … ID
  • 1245 … ランレベル
  • respawn … アクション指示子
  • /sbin/migetty tty2 … 処理

アクション指示子は以下の通り。

アクション指示子意味
bootシステム起動時に実行され、プロセスの終了を待たずに次の処理を実行
bootwaitシステム起動時に一度実行され、プロセスが終了するまで次の処理を行わない
ctrlaltdelCtrl,Alt,Deleteキーが同時に押されるSIGINTがinitに送られた場合に実行する
initdefaultデフォルトのランレベルを指定する
once指定したランレベルになったときに一度だけ実行され、プロセスの終了を待たずに次の処理を行う
respawnプロセスが終了すれば再起動させる
sysinitシステム起動時にbootやbootwaitより先に実行
wait指定したランレベルになった時に1度のみ実行し、プロセス終了まで次の処理はしない

3.1.3. 起動スクリプトとランレベル

起動されるスクリプトはランレベルごとに異なる。 ランレベルごとに用意されているサービスは/etc/rc[0-6].dで確認できる。

サービスの起動は以下の書式の通り。

/etc/init.d/[サービス名] [コマンド]

起動スクリプトの主なコマンドは以下の通り。

コマンド説明
startサービスの開始
stopサービスの停止
restartサービスの再起動
condrestartサービスが起動している場合のみ再起動
status情報を表示する

なお各ランレベルに応じたスクリプトは/etc/rc[0-6].dに入っており、以下のようなファイル名となる。

S55sshd
K15httpd

Sは起動、Kは終了を意味する。 数字は実行順序、残りはサービス名を表す。

なおK→Sの順で実行される。

デフォルトのランレベル

SysVinitを採用したシステムでは以下の方法でデフォルトランレベルの指定ができる。

  • /etc/inittab
  • ブートローダの設定ファイルでのカーネル起動時に渡すコマンドラインパラメータ

serviceコマンド

RedHat系OSやUbuntuでは/etc/init.d/の代わりにserviceコマンドを使用できる場合がある。 具体的にはRed Hat(6.xまで)系ディストリビューションで使用できる

service [サービス名] [コマンド]

LSB

LSB(Linux Standard Base)はLinuxの内部構造を標準化するプロジェクト。 LSBでは以下仕様が決められている。

  • コマンド/標準ライブラリ
  • ファイルシステム階層構造
  • 印刷システム
  • X Window System

確認は以下コマンドで可能。

lsb_release -a

3.1.4. サービスの自動起動

ランレベルごとにサービスをデフォルトで起動させるもしくはさせないようにするには以下のような手法がある。

  • 手動でリンクを作成する
  • chconfigコマンドでの設定
  • update-rc.dコマンドでの設定

手動でリンクを作成

手動でリンクを作成するには/etc/rc[0-6].d以下に、自動に起動させたいサービスのシンボリックリンクの作成することで設定ができる。

chkconfigコマンド

chkconfigコマンドはRed Hat系(6.xまで)ディストリビューションで使用できるコマンド。 サービスの自動起動を設定することができる。

chkconfig [オプション] [サービス名] [on | off]
オプション説明
–listサービスの自動起動設定をランレベルごとに表示する
–level レベルランレベルを指定する
–addサービスの追加登録をする
-delサービスを削除する

update-rc.dコマンド

update-rc.dコマンドはDebian系ディストリビューションで使用できるコマンド。 サービスの自動起動を設定することができる。

  • 自動起動設定を追加・削除できる
  • 優先順位を指定することができる

具体的にはランレベルごとにシンボリックリンクの作成/削除を行うことで実現する。

update-rc.d [オプション] [サービス名] remove
update-rc.d [オプション] [サービス名] [defaults] [NW | SNN kNN]
update-rc.d [オプション] [サービス名] start | stop NN ランレベル
オプション説明
-n表示するだけ何もしない
-f/etc/init.dにスクリプトがあっても強制的にシンボリックリンクを削除する
remove起動スクリプトのシンボリックリンクを削除する
defaultsデフォルトのスクリプトを作成する
start起動用のスクリプト(S)を作成する
stop停止用のスクリプト(K)を作成する
NN0~99の数字

intsservコマンド

intsservコマンドはSUSE系やVer6.0以降のDebian系のディストリビューションで使用できるコマンド。 サービスの自動起動を設定することができる。

insserv [オプション] [サービス名] # 自動起動設定
insserv -r [オプション] [サービス名] # 指定したサービスの自動起動を止める

3.1.5. systemdの概要

systemdの採用システムではinitプロセスの代わりにsystemdプロセスが起動しサービスを管理する。 systemdでは以下デーモンが連携して動作する。

プロセス説明
systemdメインプロセス
systemd-journalジャーナル管理プロセス
systemd-logindログイン処理プロセス
systemd-udevdデバイス動的検知プロセス

systemdではシステムの処理は多数のUnitという処理単位で別れる。 Unitはいくつか種類があり、以下のような種類がある。

種類説明
service各種サービスの起動
device各種デバイスを表す
mountファイルシステムをマウントする
swapスワップ領域を有効にする
target複数のUnitをグループ化する

systemdの特徴は起動順序関係やサービスの依存関係を処理できることがある。 そのためシステム起動速度もSysVinitより速くなる。

systemdの起動順序

systemdではシステムが起動するとdefault.targetというUnitが処理される。 これは/etc/systemd/system/以下にある。

デフォルトのターゲットにシンボリックリンクを作成することで、デフォルトの起動方法を設定できる。

# グラフィカルログインの起動構成の例
ln -sf /lib/systemd/system/graphical.target /etc/systemd/system/default.target
ランレベルターゲット
0poweroff.target
1rescue.target
2,3,4multi-user.target
5graphical.target
6reboot.target

systemdのディレクトリ

ディレクトリ説明優先順位
/usr/lib/systemd/system永続的なユニット・ターゲットの定義ファイルが置かれるディレクトリ-
/etc/systemd/systemカスタム用のディレクトリ優先度が高い
/run/systemd/system再起動されると削除される/usr/lib/systemd/systemより高い

systemctlコマンド

systemdでサービスを管理するコマンドがsystemctlコマンドとなる。

systemctl [サブコマンド] [Unit名] [-t 種類]
サブコマンド説明
startサービスを起動する
stopサービスを終了する
restartサービスを再起動する
reloadサービス設定の再読み込みをする
statusサービス稼働状況の確認
is-activeサービスが稼働状態か確認する
enableシステム起動時にサービスを自動起動する
disableシステム起動時にサービスを自動起動しない
list-units起動しているUnitを表示する
list-unit-filesすべてのUnitを表示する
list-dependencies指定したサービスが必要とするUnitを表示する
get-defaultデフォルトターゲットを確認
set-defaultデフォルトターゲットを設定する
isolate他のUnitを停止して対象のUnitを起動

systemd-deltaコマンド

systemd-deltaコマンドはデフォルトの定義ファイルを上書きしている場合などにどのファイルがどのように影響を受けているか確認できるコマンド。 同じファイル名のユニット、ターゲットの定義ファイルが複数あり、上図のディレクトリの優先度に基づいてファイルを上書きした場合などに使用する。

systemd-delta

Unit設定ファイル

Unit設定ファイルは/etc/systemd/systemディレクトリ以下に配置される。 Unit設定ファイルはUnitServiceInstallのセクションに分かれる。 ファイルの構成は以下例のようになる。

[Unit]
Descriptions=HogeHoge
After=syslog.target network.target
Conflicts=sendmail.service exim.service

[Service]
Type=forking
:

[Install]
WantedBy=multi-user.target

主なUnit設定ファイルのパラメータは以下の通り。

パラメータ説明
DescriptionUnitの説明
Documentationドキュメントの場所
Afterここに書かれたUnit以降に起動する
Beforeここに書かれたUnit以前に起動する
Wantsここに書かれたUnitが必要
Typeサービスのタイプ(simple, forking, oneshot, notify, dbus)
ExecStartPrestartでの実行前に実行するコマンド
ExecStartstartで実行するコマンド
ExecReloadreloadで実行するコマンド
ExecStopstopで実行するコマンド
WantedBysystemctl enable時に.wants以下にシンボリックリンクを作成
RequiredBysystemctl enable時に.required以下にシンボリックリンクを作成

systemdのログ

systemdを採用したシステム下ではjournalctlコマンドによりsystemdのログが確認可能。

journalctl [オプション]
オプション説明
-f末尾のログを表示し続ける
-n 行数指定した行数だけログの末尾を表示
-p [priolity]メッセージがpriority以上のものだけ表示
-rログを新しい順に表示
-u Unit名指定したUnitを表示
-fullプレーンテキストで表示
–no-pagerすべてのログを表示する

3.2. システムのリカバリ

システムがハードディスクから起動できなくなった場合は、インストールCD/DVD ROM内臓のレスキューモードで起動してシステムを修復する。 レスキューモードで起動すると、ハードディスクのルートファイルシステムは/mnt/sysimageにマウントされる。

この場合、一部コマンドが正常に動作しなくなるため、実行させるにはルートディレクトリを指定する必要がある。 なおレスキューモードの終了はexitで可能。

rpm -qf --root /mnt/sysimage

3.2.1. chrootコマンド

chrootコマンドはルートディレクトリを指定してコマンドを実行できたり、ルートディレクトリを変更できたりするコマンド。

chroot [ディレクトリ] [コマンド [引数]]

3.2.1. 壊れたGRUBを再インストールする例

# ルートディレクトリを指定する
chroot /mnt/sysimage

# 

3.3. ブートローダ

ブートローダはカーネルをディスク上から読み取りシステムを起動するためのプログラムのこと。 ブートローダでは以下のことが実現できる。

  • OSの切り替え
  • 複数バージョンのカーネルの使い分け

代表的なブートローダにはGRUBLILOがある。

3.3.1. GRUB

GRUB(GRand Unified Bootloader)は多くのディストリビューションで標準利用されているブートローダ。 以下のような特徴がある。

  • 多数のファイルシステムを認識可能
  • シェル機能を搭載しコマンドにより高度管理が可能

GRUBには昔から使われているGRUB Legacyと新たに設計し直されたGRUB 2がある。

3.3.2. Grub Legacy

Grub Legacyは昔から使われている古いタイプのGRUB。 Grub Legacyは3つのステージで構成される。

ステージ説明
1MBR内に配置されたステージ1,5または2をロードするプログラム
1.5ステージ2を見つけてロードするためのプログラム
2/boot/grubディレクトリ以下にあるGRUB本体

ブートローダとしてGRUBをインストールするにはgrub-install(grub2-install)コマンドを実行する。 またGRUB Legacyの設定ファイルは/boot/grub/menu.lstとなる。

/boot/grub/menu.lst

menu.lstの設定パラメータは以下の通り。

パラメータ説明
timeメニューを表示している時間(秒)
defaultデフォルトで起動するエントリ番号
splashimageメニュー表示時の背景画面
titleメニューに表示されるエントリ名
rootカーネルイメージ/OSが格納されたパーティションの指定
kernelカーネルイメージとカーネルオプションの指定
initrd初期RAMディスクファイルの指定
makeactiveルートパーティションをアクティブ化
chainloader指定されたセクタの読み込みと実行
hiddenmenu起動時の選択メニューを表示しない

grubコマンド

grubコマンドはGRUBシェルと呼ばれる対話型コマンド。

grub

grubシェルで利用できるコマンドは以下の通り。

3.3.3. GRUB2

GRUB2は最近のディストリビューションで採用されているGRUB。 設定ファイルの配置は以下の通り。

  • BIOS機 … /boot/grub/grub.cfg
  • UEFI搭載機 … /boot/efi/EFI/[ID]/crub.cfg

設定はファイルは直接変更せずに/etc/default/grubファイルでを用いて操作する。 grub-mkconfigコマンド(grub2-mkconfigコマンド)を使用してgrub.cfgを作成できる。

なお/etc/default/grubファイルの設定パラメータは以下の通り。

パラメータ説明
GRUB_DEFAULTデフォルトで起動するOS番号/タイトル
GRUB_HIDDEN_TIMEOUTメニューを表示せず待機する時間
GRUB_HIDDEN_TIMEOUT_QUIETtrueでメニュー表示なし、falseであり
GRUB_TIMEOUTデフォルトOS起動までの秒数
GRUB_CMDLINE_LINUX_DEFAULTブートオプション
GRUB_CMDLINE_LINUXカーネルに渡すオプション

3.3.4. 起動オプションの指定

ブートローダは起動時にカーネル/ブートローダのinitプログラムに渡すオプションパラメータを指定可能。 GRUBの場合はメニュー画面で「e」キーを押すとオプションパラメータを編集可能。

指定できるパラメータは以下の通り。

パラメータ説明
init=パス指定したパスのコマンドを初期プログラムとして指定
mem=nM物理メモリの指定
nosmpSMPマシンをシングルプロセッサとして動作させる
nohtHyperThreading機構の無効化
maxcpus=数利用するCPUの数を指定した数に制限
root=デバイスルートファイルシステムを指定する
read-only, roルートファイルシステムを読み取り専用でマウントする
single, sシングルユーザモードで起動する
数値指定したランレベルで起動する

GRUB Legacyの起動オプションの指定方法

GRUB Legacyの場合以下のようになる。

grub> kernel [カーネルイメージ] [オプション]

GRUB2の起動オプションの指定方法

GRUB2の場合以下のようになる。

grub> linux [カーネルイメージ] [オプション]

3.4. その他のブートローダ

3.4.1. SYSLINUX

SYSLINUXやISOLINUXはFATファイルシステムが一般的なUSBメモリやCD-ROMから直接起動指定利用するLiveCDに使用されるブートローダ。

SYSLINUXは起動ディスクやレスキューディスクのブートローダに使われている。 またSYSLINUXはいくつかのコンポーネントで構成される。

コンポーネント説明
SYSLINUXFATファイルシステムからカーネルを起動するプログラム
ISOLINUXISO9660ファイルシステムからカーネルを起動するプログラム
EXTLINUXext2/ext3/ext4ファイルシステムからカーネルを起動するプログラム
PXELINUXPXEを使ってネットワークブートするプログラム

Isohybrid

Isohybridと呼ばれるシステムはUSBスティックなどでISOLINUXイメージのMBRコードを使ったブートを可能にし、ブロックデバイスの動作を提供するもの。 MBRコードとしてSYSLINUXのMBRコードであるisohdpfx.binが使用される。

UEFIのツール

ツール名説明
efiboot.imgUEFIでISOLINUXを使ってブートする際に使われるイメージ。FAT16で作成されている
/EFI/BOOT/bootx64.efiUEFIのブートマネージャー。標準ではUEFI起動時に読み込まれる
Secure Boot署名の確認を行い、起動を制限する機能
shim.efiセキュアブート時に最初に読み込まれるUEFIアプリケーション
grubx64.efigrubを起動するUEFIアプリケーション

3.4.2. PXEブート

PXEはIntel社に策定されたネットワークブートの規格。 DHCPやBOOTPを使ってネットワーク情報を取得し、TFTPでブートプログラムをダウンロードして起動する。 特徴としては以下の通り。

  • インストールメディアなしでネットワークインストールを開始できる
  • ディスクレスクライアントを起動できる

PXEクライアントにはPXE準拠のネットワークインターフェイスが必要となる。 PXEブートサーバではDHCP、TFTPサーバが稼働している必要がある。

3.4.3. systemd-boot

systemd-bootはsystemdに組み込まれているブートローダ。 UEFIのみに対応している。

3.4.4. U-Boot

U-Bootは組み込み系で利用されるブートローダ。 PowerPC、ARM、MIPSなどのアーキテクチャに対応している。

2.4 - 4.デバイスとファイルシステム

Linuxのファイルなどに関して

4.1. ファイルシステムの操作

ファイルシステムはハードディスクやフロッピーディスクなどの記憶媒体にファイル保存し管理する仕組みのこと。 ファイルシステムはOSごとに異なる

VFS

VFS(仮想ファイルシステム)はファイルシステムとユーザプログラムの中間にありファイルシステムの差異を吸収する仕組み。 このシステムによりユーザプログラムはファイルシステムの違いを気にせずに統一して扱える。

4.1.1. ファイルシステムの情報

システムで利用するファイルシステムは/etc/fstabに記載される。 書式は以下の通り。

/dev/sda1 /boot ext2 default 0 2
# デバイスファイル名/ラベル マウントポイント ファイルシステムの種類 マウントオプション dumpコマンドの対象 ブート時にfsckがチェックする順序

デバイスファイル名はUUIDで識別されるケースもある。 またUUIDはblkidコマンドや/dev/disk/by-uuidファイルで確認可能。 UUIDの変更はtune2fsコマンド、作成はuuidgenコマンドで利用可能。

またファイルシステムの種類は以下の通り。

タイプ説明
ext2Linuxファイルシステムextの拡張したシステム
ext3ext2にジャーナリングシステムを追加したもの
ext4ext3の機能拡張をしたもの
ReiserFSLinux用のジャーナリングシステム
JFSIBMにより開発されたジャーナリングシステム
XFSSGIにより開発されたジャーナリングシステム
BtrfsLinux向け堅牢ファイルシステム
ISO9660CD-ROM向けのファイルシステム
UDFDVDのファイルシステム
F2FSSSDなどフラッシュメモリ向け
msdosMS-DOS向けファイルシステム
FAT/FAT32フラッシュメモリなどで使われる
NTFSwindows NT/2000向け
hpfsOS/2のファイルシステム
HFSMacOS向けのシステム
HFS+MacOS8.1以降
NFSネットワークファイルシステム
CIFSWindows2000以降
procfsプロセス情報を扱う仮想ファイルシステム
sysfsデバイス情報を扱う仮想ファイルシステム
tmpfs仮想メモリベースの仮想ファイルシステム
devpts疑似端末を制御するための仮想ファイルシステム
usbfsUSBデバイス監視用ファイルシステム
cramfs組み込みデバイス向けの圧縮ファイルシステム

マウントオプションは以下の通り。

オプション説明
asyncファイルシステムのすべての入出力を非同期で行う
syncファイルシステムのすべての入出力を同期で行う
atimeファイルへのアクセスごとにinodeのアクセス時刻を更新する
relatimeファイル更新/アクセスの一定時間後にアクセス時刻を更新する
noatimeinodeのアクセス時刻を更新しない(ディスクアクセス高速化)
auto-aオプションでmountコマンドを実行したときにマウントする
noauto-aオプションでmountコマンドを実行したときにマウントしない
defaultsデフォルト(async, auto, dev, exec, nouser, rw, suid)
devファイルシステム上のデバイスファイルを利用できる
groupユーザのグループがデバイスファイルの所有グループと一致すればマウント許可
execバイナリ実行の許可
noexecバイナリ実行の禁止
suidSUID, SGIDビットを有効化する
nosuidSUID,SGIDビットの無効化
ro読み出し専用のマウント
rw読み書きを許可してマウント
uid=UIDすべてのファイル所有者を指定したUIDのユーザにする
gid=GIDすべてのファイルの所有グループを指定したGIDのグループにする
user一般ユーザのマウントを許可、マウントしたユーザのみがアンマウントできる
users一般ユーザのマウントを許可、マウントしたユーザ以外もアンマウントができる
nouser一般ユーザのマウントを禁止
ownerデバイスファイルの所有者によりマウントを許可する

なおカーネルがサポートしているファイルシステムは/proc/filesystemsで確認が可能。

また現時点でどのファイルシステムがマウントされているか、またどのようなマウントオプションが使われているかは/etc/mtabで確認可能。 なお/etc/mtabは直接編集してはならない。間違って編集した場合は/proc/mountsを利用し復旧が可能。 また/proc/mountsにも同様の情報がある。

4.1.2. マウントとアンマウント

ファイルシステムを利用するためには任意のディレクトリにマウントポイントとしてマウントする必要がある。 ファイルシステムのマウントにはmountコマンドを使用する。

mountコマンド

ファイルシステムのマウント、マウントされたデバイスの確認ができるコマンド。

mount [オプション]

mount /dev/sda1 /data # /dataをマウントポイントとしてマウントする
オプション説明
-a/etc/fstabで指定されているファイルシステムをマウントする
-f/etc/mtabの情報を書き換えるだけでマウントなし
-o オプションマウントオプションの指定(remount: 再マウント, noexec:バイナリ実行の不許可, nosuid:SUID,SGIDの無視, loop: イメージファイルのマウント)
-n/etc/mtabのマウント情報を書き込まない
-r読み取り専用でマウントする
-t タイプファイルシステムの種類を指定する
-w読み書き可能でマウントする

unmountコマンド

ファイルシステムをアンマウントするコマンド。

unmount [オプション] [デバイスファイル名/マウントポイント]
オプション説明
-a/etc/mtabで指定されているシステムすべてアンマウントする
-t タイプ指定した種類のファイルシステムをアンマウントする

fuserコマンド

指定のファイルを利用しているプロセスの一覧を得たり、そのプロセスをまとめて kill したりするために利用できるコマンド。 具体的にはどのプロセスがそのファイルシステムを利用中なのかも調べられる。

fuser

4.1.3. ファイルの書き込み動作

ファイルに書き込み処理をしてもすぐには書き込まれず、メモリ上のディスクバッファ領域に書き込まれる。 これはディスクアクセスがメモリアクセスに比べて格段に遅いためである。 そのためデータをまとめてディスクに書き込むことでパフォーマンスを向上させる。

syncコマンド

ディスクバッファ領域にあるデータをディスクに書き込むコマンド。

sync

キャッシュの種類

キャッシュにはいくつか種類があり、代表的なものにはバッファキャッシュページキャッシュがある。

種類説明
バッファキャッシュディスク書き込み終了時にディスクバッファのデータを保存することで、再読出しの際に高速化する
ページキャッシュページ単位で管理されているメモリ上の情報を保持しておくタイプのキャッシュ

4.1.4. スワップ領域

スワップ領域はブロックデバイス上の仮想的なメモリ領域のこと。 スワップ領域はシステム構成時に作成するが、後から作成も可能でmkswapコマンドでできる。

mkswapコマンド

スワップ領域を作成するコマンド。

mkswap [オプション] [デバイスファイル名/ファイル名]
オプション説明
-cスワップ作成前に不良ブロックのチェックを行う
-L ラベルラベルの作成

swaponコマンド

スワップ領域を有効にするコマンド。

swapon [オプション] [デバイスファイル名/ファイル名]
オプション説明
-a/etc/fstab内のスワップ領域すべての有効化
-sスワップ領域を表示する

swapoffコマンド

スワップ領域を無効にするコマンド

swapoff [オプション] [デバイスファイル名/ファイル名]
オプション説明
-a/etc/fstab内のスワップ領域すべての無効化

4.2. ファイルシステムの作成

4.2.1. ext2~ext4ファイルシステムの作成

ext2/ext3/ext4のファイルシステムの作成はmke2fsコマンドで可能。

mke2fs [オプション] デバイスファイル
オプション説明
-b サイズブロックサイズをバイト単位で指定する
-cファイルシステム作成前に不良ブロックのチェックを行う
-i サイズinodeあたりのバイト数を指定
-jrootユーザ用の予約領域を%指定する
-m 領域%rootユーザ用の予約領域を%で指定する
-nパラメータ確認
-t タイプファイルシステムのタイプを指定(ext2~ext4)

なおデフォルト値は/etc/mke2fs.confで指定可能。

使用例

ブロックサイズを2048Byte、不良ブロックのチェックを行い、/dec/sda1にext3ファイルシステムを作成する例

mke2fs -b 2048 -c -j /dev/sda1

ブロックサイズは平均低ファイルサイズが小さい場合は小さく、大きい場合は大きく設定する。 またinode1つ当たりのByte数は平均低名ファイルサイズを基準にしそれを超えないようにする。

ext3ファイルシステムの書き込みフロー

  1. 書き込み操作の発生
  2. メタデータ(inode番号など)の更新内容をログへ書き込み
  3. データとメタデータをディスクに書き込む
  4. ディスク書き込み後に該当ログを破棄する

ext4ファイルシステムの作成

ext4ファイルシステムの作成にはmkfs.ext4コマンドを使用する。 またext4システムはext3ファイルシステムと互換性がある。

変換例は以下の通り。

tune2fs -O extend,uninit_bg,dir_index /dev/sda4
e2fsck /dev/sda4 #  整合性の確認

ジャーナリングモード

ext3/ext4には3つのモードのジャーナリングモードがある。

種類説明
journalメインファイルシステムより前にすべてのデータがジャーナルに記録される
orderedメタデータがジャーナルに記録される前に、すべてのデータをメインファイルシステムに直接書き出す(デフォルトの設定)
writebackメタデータがジャーナルに記録された後に、すべてのデータをメインファイルシステムに上書きする

writebackはファイルシステムの完全性が保持されるが、クラッシュ後のリカバリでファイル内容が元に戻ることがある。

4.2.2. XFSファイルシステムの作成

XFSはSGI社が開発した堅固な高速なジャーナリングファイルシステムのこと。 最大ボリュームサイズ/最大ファイルサイズは8EBとなっている。

カーネルがxfsに対応しているかは以下のように確認可能。

modprobe xfs
grep xfs /proc/filesystems

mkfs.xfsコマンド

XFSのファイルシステムを作成するコマンド。

mkfs.xfs /dev/sda1

4.2.3. Btrfsファイルシステムの作成

BtrfsはLinux向けのファイルシステム、耐障害性に優れている。 特徴は以下の通り。

  • 最大16EiBのファイルサイズに対応
  • コピーオンライト
  • ディスク領域の効率的利用
  • inodeの動的割り当て
  • ストレージプールの対応
  • スナップショット機能
  • チェックサムによる完全性保証
  • 効率的な増分バックアップ

mfs.brtfsコマンド

Btrfsのファイルシステムを作成するコマンド。

mkfs.btrfs /dev/sdb1

4.2.4. mkfsコマンドによるファイルシステムの作成

mkfsコマンドはファイルシステムの作成などができるフロントエンドプログラム。

mkfs -t ext3 /dev/sdc1

対応しているファイルシステムは以下の通り。 ext2~ext4,XFS,Brtfs,cramfs,FAT/VFAT,MINXFS

オプション説明
-t タイプファイルシステムの種類を指定
-c不良ブロックのチェック
-V詳細情報の表示

4.2.5. CD/DVDの作成

LinuxでCD/DVDへ書き込みを行い場合の手順は以下の通り。

  1. CD-R/DVD-Rへ書き込むデータのファイルイメージの作成
  2. 作成したイメージファイルをライティングソフトで書きこむ

CD-ROMのファイルシステムはISO9660となる。 ファイルシステムはmkisofsコマンドで作成を行う。

mkisofs [オプション] ディレクトリ名
オプション説明
-bブータブルCDにする
-o ファイル名ISO9660/UEFIイメージの指定
-Jjolietフォーマット
-R,-rRockRidgeフォーマット
-TRockRidgeフォーマットが使えないファイルシステムで正しいファイル名を維持する
-udfDVDなどで用いられるUDFイメージの作成

jolietとRockridge

ISO9660ではファイル名は「8文字+.+3文字」構成(8.3形式)となる。 RockRidgeフォーマットはロングネームでもファイル名が対応できるように拡張したものでUnixOSで使用される。 Jolietフォーマットは最大64文字のファイル名に対応しているMicrosoftが開発したISO9660上位互換規格である。

4.2.6. 暗号化ファイルシステムの作成

ディスクやファイルの暗号化を行うことができる。 ディスクやファイルの暗号化は大きく分けて以下の種類がある。

  • ブロックデバイス(パーティション、ファイルシステムを含む)に対する暗号化
  • 個別のファイルに対する暗号化

ファイル自体を個別に暗号化する暗号化手法にはEncfs、eCryptfsなどがある。

dm-cryptによる暗号化

dm-cryptはカーネルの仕組みの1つ。 dm-cryptによる暗号化はブロックデバイスの暗号化機能を提供する。

dm-cryptはdevice-mapperを利用して、ブロックデバイス(物理デバイス)へのアクセス時に暗号化が行われるよう暗号化マッピングを行う。 またdevice-mapperは論理デバイスを/dev/mapper配下に作成し、物理デバイスと論理デバイス間のマッピングを行う。

暗号化にはcryptsetupコマンドを使用する。

なお暗号化のためには以下パッケージが必要。

  • RHell系ではcryptsetup-luks
  • Debian系ではcryptsetup

cryptsetupコマンド

ブロックデバイスを暗号化するコマンド。 入力されたパスフレーズをもとに暗号化する(覚えておく必要あり)

cryptsetup create 名前 デバイスファイル名 # ファイルシステムの暗号化
cryptsetup remove 名前 # 次回使用時に暗号化を解く
cryptsetup status 名前 

cryptsetup luksDump デバイスファイル名 # 暗号化の状態を表示
cryptsetup luksFormat デバイスファイル名 # 指定したデバイスを暗号化パーティションとして初期化
cryptsetup luksOpen デバイスファイル名 名前 # LuKSパーティションを名称を指定し開く
cryptsetup luksClose デバイスファイル名 # LUKSパーティションを閉じる

暗号化してマウントする手順は以下の通り

  1. cryptsetup create 名前 デバイスファイル名で暗号化
  2. /dev/mapper/名前にデバイスファイルが作成される
  3. 上記デバイスファイルにファイルシステムを作成(mkfs.ext4 /dev/mapper/名前など)
  4. マウントポイントの作成(mkdir /mnt/名前)、そしてマウントを行う(mount /dev/mapper/名前 /mnt/名前)

アンマウントして暗号化を削除する手順は以下の通り。

  1. unmount /dev/mapper/名前
  2. cryptsetup remove 名前

LUKS

LUKS(Linux Unified Key Setup) はLinuxにおいて標準的に使用される暗号化ファイルシステムの仕様のこと。 LUKSは異なるシステム、ディストリビューション間において相互運用ができる。 LUKSではKeySlotといって、暗号化管理のための鍵をパーティションごとに8つ持つことができる。

LUKSはLinuxにおいてdm-cryptを用いて実装されており、cryptsetupコマンドでファイルシステムの暗号化や管理を行う。

4.3. ファイルシステムの保守

4.3.1. ext2/ext3のファイルシステムの構造

ext2/2xt3のファイルシステムはブロック単位で管理され、ブロックにはデータブロック、iノードブロック、スーパブロックの3種類がある。 データブロックにはファイルの内容が保存される。1024の倍数でブロックサイズを指定可能となっている。指定しない場合は適切な値が自動で選択される。

またデータブロックなどはブロックグループという単位でまとめられる。 データブロックにどのデータが記録されているかはiノードに記録される。 iノードブロックにはファイルタイプや更新日、アクセス権所有者情報などのメタデータも保存される。

なおiノードブロックのサイズは128Byteで、1ブロックが1024Byteの場合は1ブロックに8つのiノードが格納される。 ext2/ext3ではiノードをシステム作成後に追加することはできない。

スーパーブロックにはファイルシステムの全般的な情報であるデータブロックサイズやマウント回数、iノードなどが格納される。 スーパーブロックはブロックグループごとにバックアップが作成される。 バックアップスーパーブロックの位置はファイルシステム作成時に表示され、後から確認はmke2fs -nで可能となっている。

確認例は以下の通り。

mke2fs -b 4096 -c -j -n /dev/sdb1

dumpe2fsコマンド

スーパーブロックの内容を確認できるコマンド。

dumpe2fs デバイスファイル名

4.3.2. ext4ファイルシステムの構造

ext4ファイルシステムの構造は基本的にはext2/ext3と同じだが以下の違いがある。

  • 最大ファイルサイズが16TB, 最大ファイルシステムサイズが1EB
  • エクステント方式のブロック管理
  • オンラインデフラグ
  • ナノ秒単位のタイムスタンプ
  • マルチブロック割り当て
  • ジャーナルチェックサム
  • fsckの高層化

4.3.3. ファイルシステムのチェック

ファイルシステムの整合性チェックはfscke2fsckコマンドで確認できる。 チェックする際はそのチェック対象のファイルシステムをマウントもしくは読み込みonlyでマウントする必要がある。

fsckコマンド

fsck [オプション] [デバイス名]
オプション説明
-r対話的に修復を実行
-t タイプファイルシステムの種類を指定
-A/etc/fstabに記載された全ファイルシステムに対し実行
-N実行せず、実行した場合の結果を表示

e2fsckコマンド

ext2/ext3/ext4ファイルシステムをチェックする際に使用するコマンド。

e2fsck [オプション] [デバイス名]
オプション説明
-b ブロック指定したスーパブロックのバックアップを使用して復元
-c不良ブロックのチェック
-fファイルシステムの状態がcleanでもチェックする
-pすべての不良ブロックを自動的に修復する
-y再帰問い合わせに関しすべて「yes」と回答する
-n再帰問い合わせに関しすべて「no」と回答する

なおマウント中のファイルシステムはチェックできないため、ルートファイルシステムをチェックする際は、CD-ROM等より起動するなどを行う必要がある。

もしくはshutdown -r -F nowコマンドで起動時でチェックを行うこともできる。

xfs_repairコマンド

XFSファイルシステムをチェックするコマンド。 -nオプションを付けるとチェックのみを行い修復はしない動作となる。

xfs_repair -n デバイス名

4.3.4. ext2~ext4ファイルシステムの管理

ext2/ext3/ext4ファイルシステムの様々なパラメータを設定するにはtune2fsコマンドを使用する。

tune2fsコマンド

tune2fs [オプション] デバイス名
オプション説明
-c 回数ファイルシステムチェックが行われるまでの最大マウント回数を指定する
-C 回数現在のマウント回数の設定
-i 間隔ファイルシステムのチェック間隔を指定
-jext2からext3へ変換する
-m 領域%rootユーザ用の予約領域のサイズを変更する
-iスーパーブロックの内容を表示する
-L ラベルファイルシステムのボリュームラベルを設定する
-U UUID指定したUUIDに変更する

badblocksコマンド

デバイス上の不良ブロックを検索するコマンド。

badblocks [オプション] [デバイスファイル名]
オプション説明
-b サイズブロックサイズを指定する
-o ファイル名指定したファイルに結果を出力する
-w書き込みモードでテストする

debugfsコマンド

ファイルシステムのデバックを対話式に行えるコマンド。

debugfs [オプション] [デバイスファイル名]
オプション説明
-wファイルシステムを読み書き可能モードで開く
-s ブロック番号指定したブロックをスーパーブロックとして利用する
サブコマンド説明
cat ファイル名ファイルの内容を表示する
cd ディレクトリ別のディレクトリに移動する
chroot ディレクトリルートディレクトリを変更する
closeファイルシステムを閉じる
dump ファイルA ファイルBファイルAの内容をファイルBとして保存
freei ファイル名ファイルのiノードを消去する
lsファイル一覧を表示する
mkdir ディレクトリディレクトリを作成する
open デバイス名ファイルシステムを開く
pwdカレントディレクトリを表示する
rm ファイル名ファイルを削除する
rmdir ディレクトリディレクトリを削除する
stat ファイル名inodeの内容を表示する
quit終了する

4.3.5. S.M.A.R.T

S.M.A.R.Tはハードディスクに組み込まれている自己診断機能のこと。 この機能を搭載しているハードディスクでは故障時期の予測や故障の兆候を発見可能となっている。 LinuxにはいくつかのS.M.A.R.T対応ソフトウェアがある。

代表的なものにはsmartmontoolsがある。 この仕組みではsmartdデーモンがハードウェアのS.M.A.R.T情報を取得し、smartctlコマンドで表示する。

smartctlコマンド

smartctl [オプション] [デバイスファイル名]
オプション説明
-a / –allS.M.A.R.T情報を表示する
-i / –infoS.M.A.R.Tの対応状況などを表示する
-c / –capabilitiesテストの診断状況の表示
-t / –testセルフテストを実施する
-l / –logテストログを表示する
-H / –health状態を表示する
–scan認識されているデバイスを表示

4.3.6. XFSファイルシステムの管理

xfs_adminコマンド

XFSファイルシステムのパラメータ変更はxfs_adminコマンドを使用する。

xfs_admin [オプション] [デバイス名]
オプション説明
-uUUIDを表示する
-lラベルを表示する
-L ラベルラベルの設定
-U UUIDUUIDを設定する

xfs_infoコマンド

XFSファイルシステムの情報を表示するコマンド。

xfs_info デバイス名

xfsdumpコマンド

XFSファイルシステムをバックアップするコマンド。

xfsdump オプション バックアップするファイルシステム
オプション説明
-f 出力先出力先を指定する
-l レベルダンプレベルの指定
-Jダンプ情報データベースを更新しない

xfsrestoreコマンド

xfsファイルシステムをリストアするコマンド。 XFSファイルシステムの復元を行うことができる。

xfsrestore オプション リストア先
オプション説明
-f ファイル名バックアップされたデバイスファイル名を指定する
-S セッションIDリストアされたバックアップのセッションIDを指定する
-L セッションラベルリストアするバックアップのセッションラベルを指定する
-r増分バックアップからリストアする
-i対話的にリストアする
-IすべてのダンプのセッションIDとセッションラベルを明示する

なお増分バックアップが含まれるテープデバイスからリストアするにはセッションIDまたはセッションラベルが必要となる。

xfs_repairコマンド

XFSファイルシステムの修復を行うコマンド。

xfs_repair デバイスファイル名

4.3.7. Btrfsファイルシステムの管理

Btrfsファイルシステムの管理を行う場合はbtrfsコマンドを使用する。

btrfsコマンド

btrfs コマンド サブコマンド
コマンド/サブコマンド説明
filesystem showファイルシステムの情報を表示
filesystem dfファイルシステムの使用状況を表示
filesystem labelファイルシステムのラベルを指定
filesystem resizeファイルシステムサイズの変更
subvolume createサブボリュームの作成
subvolume deleteサブボリュームの削除
subvolume listサブボリューム一覧の表示
subvolume snapshotサブボリュームのスナップショットの作成
subvolume showサブボリュームの情報の表示

Btrfsではサブボリュームが使用できる。 サブボリュームはファイルシステムを分割したものを示す。

btrfs-convertコマンド

ext4などのファイルシステムをBtrfsに変換するコマンド。

btrfs-convert デバイス名

4.3.8. オートマウント

autofsサービスによるオートマウントを実行することで、自動マウントがされる。 この機能を使えば手動でマウント/アンマウントする必要がない。

autofsサービスの開始

autofsサービスは以下コマンドで開始できる。 設定ファイルは/etc/auto.masterとファイルシステム毎に設定するマップファイルになる。

systemctl start autofs
systemctl restart autofs

/etc/auto.masterの書き方

マウントポイントの指定方法は直接マップ、間接マップの2つの方式がある。

/- /etc/auto.direct # 直接マップ
/mnt/sample /etc/sample.dvdrom --timeout=60 # 間接マップ
# マウントベース マップファイル オプション

なお/etc/auto.masterを編集した場合には、設定を反映させる為にデーモンの再起動(/etc/init.d/autofs reloadなど)が必要となる。

マップファイル

マップファイルではファイル名を自由に変更する設定を記述することができる。 マップファイルはオートマウントしたいファイルシステムの個数だけ作成する必要がある。

書式は以下の通り。

dvdrom -fstype=udf,ro :/dev/sdc1
# マウントベース以下に作成されるディレクトリ マウントオプション デバイスファイル名

2.5 - 5.高度なストレージ管理

Linuxのストレージ管理に関して

5.1. RAID

RAIDはハードディスクを組み合わせて使用できる技術のこと。 ハードディスクをまとめて扱うことで高い信頼性とパフォーマンスを実現することを目指すものといえる。

5.1.1. LinuxにおけるRAID

LinuxでRAIDを利用する際はソフトウェアRAIDハードウェアRAIDの2種類を利用できる。 Kernel2.4以降ではソフトウェアRAIDが実装されていてハードディスクのパーティションを複数使うことでRAIDアレイを実現する。 ハードウェアRAIDアレイはLinuxからはSCSIデバイスのように見える。

RAIDアレイ

複数のディスクもしくはパーティションを束ねたもののこと

5.1.2. RAIDの種類

RAID0(ストライピング)

RAID0は複数のディスクに分散してデータを書き込み1台のディスクのように扱うRAID構成。

特徴は以下の通り。

  • データ消失が許されない用途には不向き
  • 書き込みのパフォーマンスが高い
  • ディスク容量をフル利用できる

RAID1(ミラーリング)

RAID1は複数のディスクに全く同じ内容を並列して書き込み扱うRAID構成。

特徴は以下の通り。

  • RAIDアレイを構成する1台がクラッシュしても、残りのディスクで復旧が可能
  • ディスクサイズが1台当たりのディスクサイズ以上にはならない

RAID4

RAID4はRAID0のようにストライピングの機能にエラー訂正用のパリティ情報を保存する専用ディスクを用意したRAID構成。 つまり最低3台のディスクが必要

特徴は以下の通り。

  • データが保存されているディスクがクラッシュしてもパリティ情報から復旧できる
  • パリティ情報を保存するためパフォーマンスが良くない

RAID5

RAID5はRAID4と同じようにパリティ情報により冗長性を確保する構成でパリティ専用ディスクを使用しないRAID構成。 パリティ情報はデータと同様に複数のディスクに分散して保存される。 RAID5も最低3台のディスクが必要となる。

その他のRAID構成

RAID説明
RAID LINEARディスクを論理的に結合してサイズの大きな1つのディスクに見せる
RAID0+1RAID0でストライピング構成を複数作りそれをミラーリングする
RAID1+0RAID1でミラーリング構成を複数作りそれをストライピングする
RAID6RAID5に加えてパリティ情報をもう1台余分に2重パリティを行い冗長構成を高める

5.1.3. RAIDの構成と運用

LinuxでRAIDを構成するパーティションを作成する際はパーティションタイプを0xfdに設定する必要がある。 fdisk -l デバイスファイル名で確認可能。

mdadmコマンド

RAIDアレイの制御を行うコマンド。 RAIDアレイの作成はCREATEモードで行う。 /proc/mdstatの確認でも可能。

mdadm [オプション] [デバイス名]
オプション説明
CREATEモードのオプション-
-C md デバイス名RAIDアレイを指定して作成する
-a必要であればデバイスファイルを自動的に作成する
-c サイズチャンクサイズの指定(KB単位)
-l レベルRAIDレベルの指定
-n 数アクティブな構成デバイス数を指定する
-x 数スペアデバイスの数を指定する
MANAGEDモードのオプション-
–manageMANAGEモードにする
-a構成デバイスの追加
-r構成デバイスの削除
-f構成デバイスに不良マークを付ける
MISCモード-
–miscMISCモードにする
-QRAIDの状態を表示
-DRAIDの詳細情報の表示
-E構成デバイスの状態表示
–readonly読み取り専用にする
–readwrite書き込み可能にする
–stop-S md デバイス名
–stop -scanすべてのRAIDアレイの停止
Assembleモード-

RAIDアレイの状態は/proc/mdstatファイルで確認可能。

使用例は以下の通り。

# RAID1のRAIDアレイmd0を/dev/sdc5~sdc7で構成(アクティブは2つ、1つは予備)
mdadm -C /dev/md0 --level 1 --raid-devices 2 --spare-devices 1 /dev/sdc5 /dev/sdc6 /dev/sdc7
# /dev/md0の状態確認
mdadm --query /dev/md0

RAID構成デバイスに障害が発生した場合は以下手順でディスクを交換する。 例では/dev/sdc5が壊れたとする。

  1. デバイスに障害を通知するために不良マークをつける
    • mdadm --manage /dev/md0 -f /dev/sdc5
    • この際 予備デバイスがあれば自動的に予備デバイスに切り替わる(確認はcat /proc/mdSATAで可能)
  2. 構成デバイスをRAIDアレイから削除する
    • mdadm --manage /dev/md0 -r /dev/sdc5
  3. 予備デバイス(例では/dev/sdc7)を追加する
    • mdadm --manage /dev/md0 -a /dev/sdc7

またmdadmの設定ファイルは/etc/mdadm/mdadm.confとなる。 このファイルにあらかじめ設定を記述するとRAIDアレイをシステム起動時に自動認識できる。

5.2. LVM

LVM(論理ボリューム管理機能)はディスク管理を柔軟に行える機能のこと。 ディスクのパーティションを直接操作は行わず、仮想的なパーティションの論理ボリュームを動的に管理する。 以下のメリットがLVMにはある。

  • パーティションのサイズを変更できる(通常は一度決めるとできない)
  • 別ディスクにパーティションを移動させることができる
  • ディスクサイズを超える大きさのパーティションを作成できる

LVMでは仮想的なブロックデバイスの機能はデバイスマッパーと呼ばれる機能によって実現されている。 これらの仮想的なデバイスは/dev/mapper/VG名-LV名というデバイス名で扱われる。

まあカーネル内では/dev/dm-*という形で、LVMでは/dev/VG名/LV名というデバイス名も扱われる。

5.2.1. LVMの仕組み

LVMの概要は以下の通り。 ボリュームグループは仮想的ディスク、論理ボリュームは仮想的パーティションといえる。

LVM

  • 1台のハードディスクや1つのパーティションを物理ボリューム(PV)にする
  • 物理ボリュームは一定サイズの物理エクステント(PE)から構成される
  • 1つ以上の物理ボリュームからボリュームグループ(VG)が構成される
  • VG内でPEから論理ボリューム(LV)が構成される
  • 論理ボリュームは従来のパーティション同様ブロックデバイスとして扱える
  • LVのサイズ変更や他ディスクへの移動が可能
  • LVは複数ディスクにまたがって作成できる
  • VGは後からサイズ変更ができる

5.2.2. LVMの作成

LVM利用手順は以下の通り。

  1. パーティションの作成(fdisk)
  2. 物理ボリュームを用意(pvcreate)
  3. 物理ボリュームを束ねてボリュームグループを作成(vgcreate)
  4. ボリュームグループから論理ボリュームを切り出す(lvcreate)
  5. ファイルシステムの作成(mkfs)
  6. マウント(mount)

/dev/sdd1,/dev/sde1を使用した例

  1. LVM用のパーティションの用意 初めにLVMを作成するためのパーティションまたはハードディスクを用意する。 パーティションを利用する場合はタイプを8eに設定する
parted /dev/sdd1
parted /dev/sde1
  1. 物理ボリュームを初期化する pvcreateコマンドでデバイスを物理ボリュームとして初期化する
pvcreate /dev/sdd1 /dev/sde1
  1. ボリュームグループの作成 vgcreateコマンドでボリュームグループを作成する(例の名称ではgroup1)
vgcreate group1 /dev/sdd1 /dev/sde1

なお-sオプションで物理エクステントのサイズを指定可能(省略した場合デフォルトで4MB) 4. 論理ボリュームの作成 lvcreateコマンドで論理ボリュームを作成する(例の名称ではlv1)

lvcreate -L 500M -n lv1 group1

なおlvscanコマンドで論理ボリュームの状態を確認可能 5. ファイルシステムの作成/マウント ファイルシステムを作成してマウントを行う。例ではext4で/mntにマウントする

mkfs.ext4 /dev/group1/lv1
mount  /dev/group1/lv1 /mnt

なおdf -Tコマンドで確認可能。

5.2.3. LVMの管理

LVM関連のコマンドを記載する。

pvdisplay/pvscanコマンド

物理ボリュームの詳細情報の表示を行うコマンド。

pvdisplay /dev/sda1
pvscan # 簡潔に表示

vgextendコマンド

ボリュームグループに物理ボリュームを追加するコマンド。

vgextend [ボリュームグループ] [物理ボリューム]

pvmoveコマンド

物理ボリュームを別の物理ボリュームに移動させるコマンド。

pvmove [移動元物理ボリューム] [移動先物理ボリューム]

vgreduceコマンド

ボリュームグループから物理ボリュームを削除するコマンド。

vgreduce [ボリュームグループ] [削除する物理ボリューム]

pvremoveコマンド

物理ボリュームを削除するコマンド。

pvremove [物理ボリューム]

vgdisplayコマンド

ボリュームグループの詳細を表示するコマンド。

vgdisplay [ボリュームグループ]

lvdisplayコマンド

論理ボリュームの詳細情報の表示するコマンド。

lvdisplay [論理ボリューム]

lvextendコマンド

論理ボリュームを拡張するコマンド。

lvextend -L +100M [論理ボリューム]

このコマンドだけではファイルシステムまで拡張されない。 そのためresize2fsコマンドやxfs_growfsコマンドでファイルシステムのサイズも拡張する必要がある。

resize2fs/xfs_growsfsコマンド

resize2fsコマンドはext2~ext4ファイルシステムの場合ファイルシステムを広げるコマンド。 xfs_growfsコマンドはXFSの場合にファイルシステムを広げるコマンド。

e2fsck -f /dev/group1/lv1
resize2fs /dev/group1/lv1

lvremoveコマンド

論理ボリュームを削除するコマンド。

lvremove [論理ボリューム]

スナップショット機能

スナップショット機能を使用するとファイルシステムをマウントせずにバックアップすることができる。 具体的にはスナップショットの作成ではファイルシステムを書き込み禁止やアンマウントせずにバックアップができる。

スナップショットをsnap0という名前でとる例

lvcreate -s -L 100M -n snap0 /dev/group1/lv1
dump 0uf /dev/st0 /dev/group1/snap0

スナップショットの特性上、スナップショットの作成後にファイルシステムに変更が加われば加わるほどスナップショット領域は大きくなる。 そのためバックアップ取得後は、スナップショットを削除したほうが良い。

5.2.4. LVMの関連コマンド

物理ボリューム関連コマンド

コマンド説明
pvcreatePVの作成
pvdisplayPVの情報の表示
pvmovePV内のPEを移動
pvremovePVの削除
pvscanPVの検索
pvsPVの情報出力

ボリュームグループ関連のコマンド

コマンド説明
vgcreateVGを作成
vgchangeVGの属性を変更
vgdisplayVGの情報を表示
vgextendVGの拡張(PVの追加)
vgreduceVGの縮小(PVの削除)
vgremoveVGの削除
vgimportVGのインポート
vgexportVGのエクスポート
vgmerge2つのVGを統合する
vgrenameVG名の変更
vgscanVGの検索
vgsVGの情報表示

論理ボリューム関連のコマンド

コマンド説明
lvcreateLVの作成
lvdisplayLVの情報表示
lvextendLVの拡張(PEの追加)
lvreduceLVの縮小(PEの削除)
lvremoveLVを削除
lvrenameLV名を変更
lvscanLVの検索
lvsLVの情報表示

5.3. 記憶装置へのアクセス

5.3.1. デバイスファイル

記憶装置のデバイスファイルは以下の通り。

デバイスファイル説明
/dev/hdaIDEプライマリマスタに接続されたドライブ
/dev/hdbIDEプライマリスレーブに接続されたドライブ
/dev/hdcIDEセカンダリマスタに接続されたドライブ
/dev/hddIDEセカンダリスレーブに接続されたドライブ
/dev/sda1番目のSCSI/SATA/USB/IEEE1394デバイス
/dev/sdb2番目のSCSI/SATA/USB/IEEE1394デバイス
/dev/sdc3番目のSCSI/SATA/USB/IEEE1394デバイス
/dev/sdd4番目のSCSI/SATA/USB/IEEE1394デバイス
/dev/sr01番目のSCSI/SATA/USB CD/DVDドライブ
/dev/sr12番目のSCSI/SATA/USB CD/DVDドライブ
/dev/st01番目のSCSIテープドライブ
/dev/st12番目のSCSIテープドライブ

カーネル2.6.21以降はIDEデバイスもSCSIデバイスと同じ扱いになったため、IDEハードディスクも/dev/sdNといったデバイス名になる。

5.3.2. ハードディスクの管理

ハードディスクは5つのタイプに分かれる。

  • SATA(Serial ATA)
  • SCSI
  • SAS
  • USB
  • IEEE1394

Linuxの場合、SATAハードディスクもSCSIハードディスクとして扱われる。 なおKernel 2.6.21以降では基本的にすべてのハードディスクは/dev/sd*と扱われる。

IDEの転送モードにはメインメモリとハードディスクとの転送方式としてPIOモードDMAモードがある。

  • PIOモード … CPUがハードディスクに直接命令してデータを転送する方式。欠点はデータ読み書き中はCPUは他の処理を実行できない点がある
  • DMAモード … CPUとは異なり専用のコントローラがデータの伝送を管理する。現在一般的な手法

Ultra DMA は従来のDMAを拡張した企画で高速転送速度をサポートしている。 なおUltra DMAの利用はハードディスク/マザーボードのチップ/BIOSが対応している必要がある。

hdparmコマンド

DMAモード、IDEハードディスクのパラメータを確認/設定できるコマンド。 オプションなしでは適用されているパラメータを表示する。

hdparm [オプション] [デバイスファイル]
オプション説明
-iハードディスクの詳細情報確認
-Iドライブから直接情報を得る
-c数値32bit I/Oサポート(0:無効化、1:有効化、3:同期シーケンス付きで有効化)
-d数値DMAモードの使用不使用を指定 (0:無効化,1:有効化)
-W数値ライトキャッシュのON/OFF(0:無効化,1:有効化)
-tバッファキャッシュを使わずに読み込み速度を計測する
-Tバッファキャッシュの読み込み速度をテストする

sdramコマンド

SCSI/SATA/USBディスクに対してDMAモード、IDEハードディスクのパラメータを確認/設定できるコマンド。 オプションなしでは適用されているパラメータを表示する。

sdparm [オプション] [デバイスファイル]

sdparm --conmmand=stop [デバイスファイル] # ディスク回転の停止
sdparm --clear=WCE [デバイスファイル] # ディスクキャッシュの無効化

scsi_idコマンド

SCSI接続の記憶装置のWWIDの確認を行えるコマンド。

scsi_id

5.3.3. SSDの管理

SSDはHDDと異なりフラッシュメモリであるためHDDと削除動作が異なる。 SSDはデータを削除しても削除フラグが付けられるだけでデータは削除されない。 削除した箇所に再度書き込みを行う場合は、データを消去して書き込みを行う必要がある。 そのため長時間SSDを利用すると再利用ブロック(削除フラグが付いたブロック)が増えていくにつれてパフォーマンスが低下する。

なおNVMeという新しい規格がSSDでは利用できる。 またNVMeはPCI Express バスから SSD に接続するための規格である。

Trimという機能を使うことでブロックデータも削除するため速度低下が起こりにくくなる。 Trimの実行にはfstrimコマンドを実行する。 Trimの確認は以下コマンドで行う。

hdparm -I /dev/sda | grep TRIM

また、SSDには書き換え回数の上限があるため頻繁に書き込まないように以下内容に注意する。

  • スワップ領域をSSD上に作成しない
  • noatimeオプションをつけてファイルシステムにマウントする
  • 頻繁に書き込まれる/tmpなどはRAMディスクを利用する

fstrimコマンド

Trimの実行を行うコマンド。 ファイルシステムで使用していない領域を破棄できる。

fstrim -v /

NVMe

NVMeはSSD接続のための PCI Expressベースのインターフェイス規格。 AHCIと比べ、SSDの性能を十分に発揮できる。

AHCI

AHCIは、IDEに比べてはるかに高速なSATAを活かせるインターフェース仕様として登場した規格。 インテルが策定している。 IDEとの互換性を重視したSATAの規格SATA1.0では速度より互換性が重視され、性能は犠牲となったが、SATA2.0でAHCIは規格化され、SATA本来の機能・性能を満たすことができるようになった。

5.3.4. iSCSI

iSCSIはTCP/IP上でSCSIプロトコルを利用できるようにする仕組み。 クライアント/サーバモデルを採用している。 iSCSIによりネットワーク上のストレージをローカルストレージのように利用できる。 SANを構築できる。

LinuxにおいてはIETLIO TargetでiSCSIターゲット(iscSIストレージ)を構築できる。 なおデータの要求端末(クライアント)はiSCSIイニシエータと呼ばれる。

用語説明
ターゲットiSCSIストレージ
イニシエータiSCSIクライアント
LUNストレージ内の論理ドライブ番号(記憶装置の識別番号)
HBANICに相当するインターフェイスアダプタ
WWID / WWNMACAddressに相当する識別ナンバー

なお設定ファイルはiscsid.confとなる。

iscsiadmコマンド

iscsiadm [オプション]
オプション説明
-m / –mode [モード]モードの指定(discovery: 接続先のiSCSIターゲットの取得, node: 登録済みisCSIターゲットの取得, session: セッション一覧の取得)
-l / –loginiscsiターゲットにログイン
-u / –logoutiscsiターゲットからログアウト
-t / –typeタイプの指定
-p / –portal=IPアドレス[:ポート]接続先の指定
-T / –targetname=IQNiSCSIターゲットの指定

SAN

SAN(Storage Area Network)はストレージ専用のネットワークを使用してストレージにアクセスする技術。 物理接続にファイバチャネル、接続にSANスイッチが使用される。

2.6 - 6.ネットワーク管理

Linuxのネットワーク管理に関して

6.1. ネットワークの設定

6.1.1. ネットワークデバイス

Linuxではネットワークデバイスを以下のような名称で扱う。 またネットワークインターフェースの確認にはifconfigコマンドで行える。

インターフェイス説明
eth01番目のEthernetインターフェイス
eth12番目のEtrernetインターフェイス
ppp01番目のPPPインターフェイス
loループバックインターフェイス

またネットワークインターフェースの命名規則は以下の通り。

種別説明
enイーサネット
wl無線LAN
ww無線WAN

ifconfigコマンド

ネットワークインターフェースの設定/確認が行えるコマンド。

ipconfig
ipconfig [インターフェース] [IPv4アドレス] netmask [サブネットマスク]
ipconfig [インターフェース] [ up | down ]

6.1.2. ARP

EthernetではIPアドレスではなくMACアドレスで通信を行う。そのためIPアドレスをMACアドレスに変換する仕組みであるARPを用いる。 取得したARP情報はARPキャッシュと呼ばれるテーブルに一定時間キャッシュされる。

ARPキャッシュテーブルの表示にはarpコマンドで可能。

arp [オプション]
オプション説明
-a [ホスト]指定したホストすべてのエントリを表示する
-f ファイル名ホスト名とMACアドレスの対応ファイルを読み込む
-nホスト名をIPアドレスを表示
-d ホスト指定したホストのエントリを削除
-i インターフェースネットワークインターフェースの指定
-s ホスト MACアドレスホスト名とMACアドレスの対応を書き込む

6.1.3. インターフェースの冗長化技術

ボンディング

ボンディングは複数のネットワークインタフェースを1つに束ねる技術のこと。 ボンディングによって帯域幅を増やしたり、1つのNICに障害が発生しても他のNICで運用できるようにインタフェースを冗長化できる。 なおLinuxカーネルにはbondingモジュールが標準で実装されている。

ボンディングではネットワークインタフェースを以下のように分類する。

  • マスターインタフェース … bondingで束ねられた仮想インタフェース
  • スレーブインタフェース … bondingを構成する個々の物理インタフェース
  • アクティブインタフェース … bonding構成の中で実際にパケットの送受信を行うインタフェース

ボンディングの設定例

ボンディングは以下のような設定を2つのマシンに設定する

  1. マスターインタフェースの追加
    • nmcli connection add type bond ifname bond0 con-name bond0 mode balance-rr
  2. スレーブインタフェースの追加
    • nmcli connection add type bond-slave ifname eth0 con-name bond-slave-eth0 master bond0
    • nmcli connection add type bond-slave ifname eth1 con-name bond-slave-eth1 master bond0
  3. マスターインタフェースにIPアドレスを設定
    • nmcli connection modify bond0 ipv4.method manual ipv4.addresses 192.168.1.1/24

なおmodeオプションでbondingポリシーを設定できる。

ポリシー説明
balance-rrラウンドロビンによる送信負荷分散
active-backup1つのスレーブインターフェースのみがアクティブでもう一つは障害時に切り替え
balance-xor宛先MACに基づいたハッシュによる送信の負荷分散
802.3adLACPによるリンクアグリゲーション
balance-tlbスレーブインターフェースの負荷に応じた送信負荷分散
balance-albスレーブインターフェースの負荷に応じた送受信負荷分散

6.1.4. ネットワーク管理コマンド

Linuxにおけるネットワーク設定/トラブルシューティングに使うコマンドをいくつか記載する。

pingコマンド

指定したホストにICMPパケットを送った際の反応を確認できる。 なおIPv6の場合はping6コマンドを使う。

ping [ホスト名] [IPアドレス]
オプション説明
-nホスト名を指定せずにIPアドレスを表示する
-c 回数指定した回数のみICMPパケットを送信する
-i 間隔指定した間隔ごとにICMPパケットを送信する
-s サイズ指定したパケットデータのサイズで送信する

tracerouteコマンド

指定したホストまでパケットが伝わる経路を表示するコマンド。 ネットワークの途中経路に障害がある場合、障害個所を特定できるコマンドといえる。

なお注意事項としてネットワーク経路上にICMPパケットを返信しないホストが存在する場合は適切な動作は期待できない。 なおIPv6の場合はtraceroute6コマンドを使う。

traceroute [ ホスト名 | ドメイン名 | IPアドレス ]
オプション説明
-i インターフェースネットワークインターフェースを指定する
-nホスト名をIPアドレスで表示する

mtrコマンド

pingやtracerouteなどのようにICMP等を使って通信の可・不可や経路などを確認することができるコマンド。

mtr -r [IPアドレス | ドメイン名]

tcpdumpコマンド

指定したネットワークインターフェースを監視し、そこに到達したデータをコンソールに表示するコマンド。 用途としては以下の通り。

  • 不審な挙動をしているプログラムのデータの送信先の調査など
tcpdump [オプション] [条件式]
オプション説明
-i インターフェース監視するインターフェース指定する
-s バイト数パケットから取り出すバイト数の指定
-X16進数とASCII文字で表示
-n名前解決せずに表示する(IPアドレスで表示)
-Nホストのドメイン名を表示しない
-l標準出力のバッファリング
-t時刻表示しない
-v詳細に出力
条件式説明
portポート番号の指定
tcpudp
src指定した送信元からのパケットを対象
dst指定した送信元へのパケットを対象

使用例は以下の通り。

# eth0の53ポートの通信を表示
tcpdump -nil eth0 port 53

netstatコマンド

ネットワーク機能に関する様々な内容を表示するコマンド。 引数なしで実行すると、Active接続とActiveなUnixドメインソケット情報(ローカルホストのプロセス間通信)を表示する。

netstat [オプション]
オプション説明
-aすべてのソケットを表示
-c状況を1秒ごとにリアルタイムで定期的に表示する
-iネットワークインターフェースの統計を表示
-l接続待ち状態にあるソケットのみ表示する
-nアドレスやポートを数値で表示
-pPIDとプロセスの表示
-rカーネルのルーティングテーブルの表示
-tTCPを表示
-uUDPを表示

ssコマンド

netstat互換のコマンド。機能はnetstatコマンドとほぼ同じ。

ss [オプション]
オプション説明
-aすべてのソケットを表示
-nアドレスやポートを数値で表示
-pPIDとプロセスの表示
-rホスト名の解決
-tTCPの表示
-uUDPの表示
-4IPv4のみを表示
-6IPv6のみを表示

ncコマンド

ncコマンドはTCP/UDPを使ったネットワークの通信を行うコマンド。 ポートスキャンや通信状態の確認が可能。

nc [ ホスト名 | IPアドレス ] [ポート番号]

なおオプション-vzを指定することでポータ範囲の指定とポートスキャンが可能。 なおudpの場合はuを追加する。

ipコマンド

ネットワークインターフェース、ルーティングテーブル、ARPテーブルの管理ができるコマンド。 ipconfig, route, arpコマンドの統合した操作が可能。

ip [オプション] [操作対象] [コマンド] [デバイス]
オプション説明
-sステータスの表示
-r名前解決して表示
-f inet/inet6プロトコルファミリの指定
操作対象説明
linkデータリンク層
addrIPアドレス
routeルーティングテーブル
neighARPキャッシュ
コマンド説明
show指定した対象の情報表示
add指定した対象にパラメータ指定
del指定した対象のパラメータ削除

使用例は以下の通り。

# IPアドレスの設定
ip addr add 192.168.11.1/24 dev eth0
# GWをルーティングテーブルに追加
ip route add 10.0.0.1/16 via 192.168.11.254
# DGWの設定
ip route add default via 192.168.11.100

6.1.5. ルーティングの設定

Linuxにおいてルーティングテーブルの操作行う場合はrouteコマンドを使用する。 引数なしで実行するとルーティングテーブルが表示される。

routeコマンド

route [オプション]
route [add | del] [-host|-net] [ターゲット] [network ネットマスク] [gw ゲートウェイ] [[dev] デバイス]
オプション説明
-nホスト名の解決をしない
-Fカーネルのルーティングテーブルを表示する
-Cカーネルのルーティングキャッシュを表示する

routeコマンドを引数なしで実行すると以下のようにパラメータが表示される。

Destination # 宛先ネットワーク/ホスト
Gateway # ゲートウェイアドレス
Genmask # 宛先ネットマスク
Flags # 経路情報(U:経路が有効 H:宛先はホスト G:ゲートウェイを使用 !:経路は無効)
Metric # 宛先までの距離
Ref # ルートの参照数
Use # 経路の参照回数
Iface # この経路を使うネットワークインターフェース

6.1.6. 無線ネットワークの設定

無線LANの主な規格は以下のようなものがある。

規格周波数帯域幅伝送速度
IEEE802.11a5.2GHz54Mbps
IEEE802.11b2.4GHz11Mbps
IEEE802.11g2.4GHz54Mbps
IEEE802.11n2.4GHz/5GHz600Mbps
IEEE802.11ac5GHz433Mbps~7Gbps

なお無線LANのセキュリティ方式にはWEPWPAがある。

  • WEP … RC4アルゴリズムで通信を暗号化する(脆弱性あり)
  • WPA … TKIPやAESなどの暗号方式やIEEE802.1x認証などから構成される、AESの方がセキュリティ強度が高い

iwconfigコマンド

WLANの設定や状態を確認するコマンド。

iwconfig [wlanN] [essid ESSID] [key [s:]WEPキー]

なおWPA/WPA2の場合は、Wpa_passphraseコマンドで設定ファイルを作成する。

wpa_passphrase windsor wlan_no_passphrase ] ファイル名.conf

作成した上記ファイルは/etc/wpa_supplicant以下に保存する。 接続はwpa_supplicantコマンドで行う。

iwコマンド

無線インターフェースの情報を参照/設定することができるコマンド。

iw dev [デバイス名] [コマンド] # インターフェースに関する表示設定を行う
iw phy [デバイス名] [コマンド] # デバイスに関する表示設定を行う
devのコマンド説明
link接続状況の表示
scan接続可能なAPをスキャン
connectdisconnect
phyのコマンド説明
interface adddel
info暗号化や周波数の使用可能状況の表示

iwlistコマンド

無線インターフェースの情報を取得できるコマンド。

iwlist 無線インターフェース パラメータ
パラメータ説明
scanningscan [essid ID]
channel設定可能なチャネルを表示
rate伝送速度の表示

6.2. 高度なネットワークの設定/トラブルシューティング

6.2.1. ネットワーク関連のファイル

Linuxのネットワーク関連の設定ファイルに関して記載する。

/etc/hostname

ホスト名を記載する設定ファイル。

/etc/hosts

ホスト名とIPアドレスの対応表を記述するファイル。 記述方法は以下の通り。

# IPアドレス  ホスト名 ホスト名の別名

/etc/networks

ネットワーク名とネットワークアドレスの対応表を記述するファイル。 デフォルトでは未記載。

# ネットワーク名 ネットワークアドレス

/etc/nsswitch.conf

名前解決の問い合わせ順序を記述するファイル。 名前解決の手段は以下の通り。

  • /etc/hostsファイルの使用
  • DNSサーバの使用
  • LDAPサーバの使用

/etc/resolve.conf

問い合わせ先のDNSサーバやドメイン名の設定を記述するファイル。

/etc/sysconfig/network

ネットワーク機能の使用/不使用、ホスト名、デフォルトゲートウェイなどの設定を記述する。 原則RHELL系で使用される

なおRHEL7/CentOS7系以降ではnmcliコマンドでの設定が推奨されている。 またIPv6はNETWORKING_IPV6で有効化できる。

/etc/sysconfig/network-scripts/

ネットワークデバイスの設定ファイルが設置されるディレクトリ。

/etc/network/interfaces

Debian系で使用されるネットワークデバイスの設定ファイルが設置されるディレクトリ。

6.2.2. NetworkManager

Linuxでネットワークを動的管理する仕組み。 設定ファイルを書き換えてもこのサービスにより書き換えられる可能性があるため、設定する際は無効化するかnmciコマンドで設定するといった方法が挙げられる。

6.2.3. TCPラッパ

ネットワークサービスに対するアクセス制御を行うプログラム。 デーモン名はtcpd、使用するライブラリはlibwrapとなる。

TCPラッパーには/etc/hosts.allow/etc/hosts.denyという2つの主要なファイルがある。 /etc/hosts.allowファイルでアクセス許可の設定を行い、/etc/hosts.denyファイルでアクセス拒否の設定を行う。

なお設定ファイルの変更後は再起動しなくても設定は反映される。

これらのファイルの書式は以下の通り。

サービス名 : ホスト名|IPアドレス

具体的には以下のような形となる。

ALL : 192.168.10.0/255.255.255.0 : ALLOW
ALL : ALL : DENY

6.2.4. ネットワークのトラブルシューティング

ネットワークが正常につながらない場合

確認事項は以下の通り。

  1. pingによる疎通確認
  2. DNSサーバの稼働状況//etc/resolv.confの確認
  3. routeによるルートテーブルの確認

上記でうまくいかない場合はtraceroutemtrによる経路確認も行う。

パケット転送許可

Linux OSをルータとして機能させる場合はカーネルパラメータのnet.ipv4.ip_forwardを1にすることでパケット転送を有効化できる。 IPv4の場合は以下で可能。

sysctl -w net.ipv4.ip_forward=1

6.2.5. その他のネットワークのコマンド

nslookupコマンド

DNSでホスト名とIPアドレスを変換するコマンド。

nslookup

digコマンド

nslookupより詳細に行う。

hostnameコマンド

自身のホストに関する詳細を調べられるコマンド。

hostname [オプション]
オプション説明
なしホスト名を表示
-dDNSドメイン名の表示
-iIPアドレスを表示
-fFDQNを表示(完全修飾ドメイン名を表示)
-aエイリアスを表示

nmapコマンド

詳細が不明なネットワークの構造を調査したり、セキュリティ上の問題がないかを検査する目的で、ネットワークのスキャンを行うことができるコマンド。

nmap [スキャンタイプ] [オプション] 対象
スキャンタイプ説明
-sTTCPスキャン
-sUUDPスキャン
-sPPingスキャン
オプション説明
-p対象ポート範囲の指定
-F有名ポートを対象に高速スキャン
-O対象ホストのOS識別を行う

2.7 - 7.システムのメンテナンス

ソースからのインストール(makeコマンド)やLinuxのバックアップ方法に関して

7.1. ソースからのインストール

7.1.1. ソースの展開

Linuxのソフトウェアはアーカイブ形式で配布される。 アーカイブはtarコマンドで作成された後、gzipbzip2xzを使って圧縮される。

アーカイブの展開と回答は以下の通り。

tar zxvf [圧縮ファイル] # .gzの場合
tar jxvf [圧縮ファイル] # .bz2の場合
tar Jxvf [圧縮ファイル] # .xzの場合
  • .gzの場合 … gunzipgzip
  • .gzipの場合 … bunzip2bzip2
  • .xzの場合 … unxzxz

アーカイブの中には以下の内容が含まれることが多い。

  • ソースファイル … C言語などで書かれたソースコード
  • ヘッダファイル … C言語のヘッダファイル
  • configureファイル … コンパイルに必要な環境をチェックするスクリプト
  • ドキュメント … インストールの手順/注意事項が書かれたファイル

ソースファイルが含まれたアーカイブを展開した後、以下の手順でコンパイルからインストールを行う。

  1. ./configure
  2. make
  3. su (必要の場合)
  4. make install

なおインストール(make install )後にプログラムを起動するとき、環境変数LD_LIBRARY_PATHが正しく設定されていないと、プログラムの実行に必要な共有ライブラリを読み込むことができず、起動に失敗する事がある。

patchコマンド

差分ファイル(パッチファイル)を既存のソースコードに適用してソースコードをバージョンアップするコマンド。

patch [オプション] < [パッチファイル]
cat [パッチファイル] | patch [オプション]
オプション説明
-d ディレクトリ指定したディレクトリに移動して処理を行う
-pパッチファイル内に書かれたパス名を修正する(-p0: パス名を修正しない, -p1: 最後の/まで削除する, -p2: 次のディレクトリまで削除する)
-Cどういう処理を行うかテストする
-Rパッチの適用を取り消して戻す

7.1.2. Makefileの作成

Makefileはconfigureスクリプトにより、プログラムをコンパイルする際に必要な寛容をチェックし環境に合わせたファイル。 カレントディレクトリにあるスクリプトの実行はファイル名に./を付ける。

なおconfigureの主なオプションは以下の通り。

オプション説明
–help説明を表示する
-prefix=ディレクトリインストール先のトップディレクトリを指定する

7.1.3. コンパイルとインストール

makeコマンド

Makefileに従ってソースコードをコンパイル、リンクするコマンド。 なおコンパイル後はsudo make installでインストールする。

この際のinstallターゲットと呼ばれる。

make [オプション] [ターゲット]
オプション説明
-C ディレクトリ指定したディレクトリに移動してから処理を実行する
–file=ファイルMakefileを指定する
-j N同時にNのジョブを並行して実行する

またmakeのターゲットは以下のようなものがある。

ターゲット説明
allコンパイルを行う(デフォルト)
installソフトウェアのインストール
uninstallアンインストールする
cleanコンパイル時に生成された一時ファイルを削除する

なおインストールしたものは/usr/local/bin/usr/localsbinなどに配置された。

7.2. バックアップ

7.2.1. バックアップの種類

完全バックアップ(フルバックアップ)

すべてのファイルを対象としてバックアップを行うもの。 特徴は以下の通り。

  • バックアップに時間がかかる
  • バックアップに必要な容量も大きい

差分バックアップ

前回のフルバックアップ以後に作成/変更されたファイルのみをバックアップする。 特徴は以下の通り。

  • フルバックアップより処理に時間がかからない
  • バックアップ後にはフルバックアップと最新の差分バックアップが必要

増分バックアップ

前回のバックアップ(フルバックアップ/差分バックアップ/増分バックアップ)以後に作成/変更されたファイルのみをバックアップする。 特徴は以下の通り。

  • 3種類で最も処理時間が短い
  • 復元にはフルバックアップ/それ以降の増分バックアップが必要

7.2.2. バックアップデバイス

バックアップに利用できるデバイスには以下のようなものがある。

CD-R/RW リムーバブルハードディスク

CD-R/RWは安価で容量が小さい。 リムーバブルハードディスクは高速で大容量で高価となる。

DVD-R/RW

DVD-R/RWはCD-R/RWより大容量なディスク。 容量は4.7GB~8.54GBほど。

BD-R/RE

BD-R/REはDVD-R/RWよりも大容量なメディア。 容量は約25GB~50GBほど。

特徴は以下の通り。

  • BD-Rは一度のみ書き込み/追記が可能
  • BD-REは繰り返し書き換えできる

磁気テープ

大容量で低価格のメディア。 容量は規格により異なり、また定期的に取り換える必要がある。

規格容量
DDS440GB(圧縮時)
SuperDLT-300320GB(圧縮時)
LTO Ultrium3800GB(圧縮時)

7.2.3. オンサイトとオフサイト

バックアップの保管場所にはオンサイトオフサイトのバックアップがある。

  • オンサイト … バックアップ対象のシステムと同一拠点にバックアップを保管する
  • オフサイト … 別拠点にバックアップを保管する

ネットワーク経由のバックアップ

ツールではAMANDA, Balcula, BackupPC, Bareosなどでネットワーク経由でバックアップ可能。 またストレージ用のネットワーク構築にはSANが使用される。

  • AMANDA … 1台のAmandaサーバでネットワーク内の複数のクライアントをテープ/ディスクドライブにバックアップ可能
  • Balcula … 1台のBaculaサーバでネットワーク内の複数のクライアントを様々な記録メディアにバックアップ可能、CUI/GUIを使える
  • BackupPC … いくつかの標準プロトコルを利用するのでクライアント不要のバックアップツール、WebUIを使用可能
  • Berous … Baculaプロジェクトから派生したバックアップツール

7.2.3. ローカルのバックアップ

tarコマンド

tarコマンドはファイルやディレクトリを1つのアーカイブファイルにしたり、圧縮/展開するコマンド。 デフォルトで圧縮しないため、tarコマンドで圧縮を行うためには-zオプションや、-jオプションを指定する必要がある。

tar [オプション] [ファイル]
オプション説明
-cアーカイブの作成
-xアーカイブからファイルの取り出し
-tアーカイブの内容の確認
-f ファイル名アーカイブファイル名の指定
-zgzip による圧縮 ・ 展開
-jbzip2 による圧縮 ・ 展開
-J7zip による圧縮 ・ 展開
-v詳細な情報の表示
-uアーカイブ内にある同じ名前のファイルより新しいものだけを追加
-rアーカイブにファイルの追加
-N指定した日付より新しいデータのみを対象とする
-M複数デバイスへの分割
–deleteアーカイブからファイルの削除

使用例は以下の通り。

tar jcf /dev/sdb1 - # USBメモリにホームディレクトリ

cpioコマンド

ファイルをアーカイブファイルにコピーしたり、アーカイブからファイルをコピーできるコマンド。

cpio [フラグ] [オプション]
フラグ説明
-i オプション パターンアーカイブからファイルを抽出
-o オプションアーカイブの作成
-p オプション ディレクトリファイルを別のディレクトリにコピー
オプション説明
-A既存のアーカイブファイルに追加
-d必要な場合にディレクトリの作成
-rファイルを対話的に変更
-tコピーせず、入力内容の一覧表示
-vファイル名の一覧表示

使用例は以下の通り。

ls | cpio -o > /tmp/backup

ddコマンド

入力側に指定したファイル内容をファイルもしくは標準出力に送るコマンド。 デバイス間のディスクコピーやブートドライブの作成に利用可能。

dd [オプション]
オプション説明
if=入力ファイル入力側の指定(標準は標準入力)
of=出力ファイル出力側ファイルの指定(標準は標準出力)
bs=バイト数入出力のブロックサイズを指定
count=回数回数分の入力ブロックをコピーする

ddコマンドでは入力に以下のいずれかの特殊ファイルを指定してデータの上書きを行える。 格納されたデータを消去することが可能。

  • /dev/zero … 16進数のデータ「0x00」を生成する特殊ファイル
  • /dev/urandom … 擬似乱数を生成する特殊ファイル

dumpコマンド

ファイルシステム単位でext2/ext3/ext4ファイルシステムをバックアップするコマンド。 バックアップからファイルを取り出すときなどに使用でき、磁気テープにバックアップを取る際に適している

dump [オプション] [バックアップ対象]
オプション説明
0~9dumpレベルを指定する(0は完全バックアップ)
uバックアップ実装時に/etc/dumpdatesを更新する
f デバイス名バックアップ装置のデバイスを指定する

dumpレベルの指定で増分バックアップが可能。 なお増分バックアップを行う際はuオプションの指定し、バックアップの記録を/etc/dumpdatesに記録する必要がある。

dump 0uf /dev/st0 /dev/sda4

磁気テープの命名規則には以下のような特徴がある。

  • /dev/st0 … 自動巻き戻しをする
  • /dev/nst0 … 自動巻き戻しをしない

restoreコマンド

dumpコマンドで作成したバックアップからファイルやディレクトリを取り出すコマンド。

restore [オプション] [ファイル名]
オプション説明
rすべてのファイルを取り出す
i対話的にファイルを取り出す
f デバイス名バックアップ装置のデバイスを指定

mtコマンド

テープドライブを操作するコマンド。

mt [-f デバイス] [オペレーション]
オペレーション説明
statusテープの状態を表示
tellテープの現在地の表示
rewindテープを先頭に巻き戻す
fsf NテープをN個先のデータを先頭位置まで早送りにする
compression 1ハードウェア圧縮を使用する
compression 0ハードウェア圧縮を使用しない

使用例は以下の通り。

# テープの現在地から3つ先にあるデータの先頭位置までテープを早送り
mt -f /dev/st0 fsf 3

7.2.4. ネットワーク経由でのバックアップ

rsyncコマンド

リモートホスト間でファイルやディレクトリをコピーできるコマンド。

rsync [オプション] [ホスト名:] バックアップ元ディレクトリ [ホスト名:] バックアップ先ディレクトリ
オプション説明
-vコピー中のファイルを表示
-aアーカイブモード(属性もそのままコピー)
-rディレクトリ内を再帰的にコピーする
-u変更/追加されたファイルのみをコピーする
-lシンボリックリンクをそのままコピーする
-Hハードリンクをそのままコピーする
-o所有者をそのまま維持
-g所有グループをそのまま維持
-tタイムスタンプをそのまま維持する
-nテスト
-zファイルを圧縮する
-deleteコピー元ファイル削除コピー先でも削除する

使用例は以下の通り。

# ローカルホスト内でdirディレクトリを/backupディレクトリ内にコピー
rsync -auv --delete dir /backup
# ローカルホスト内でdirディレクトリ内のファイルを/backupディレクトリ内にコピー
rsync -auv --delete dir/ /backup

# host12の/backupに差分保存する例
rsync -auvz --delete -e ssh dir host12:/backup

7.3. ユーザのシステム管理情報の通知

7.3.1. ログイン前後にメッセージの送信

ログイン後と前のメッセージ

ログイン前のメッセージ表示は/etc/issueに、ログイン後のメッセージ表示は/etc/motdを使うことで可能。

具体的にはメンテナンス予定やサービス停止連絡/新しいソフトウェア情報などを告知する際に使用する。

システム情報の表示

ログインプロンプト表示前にシステム情報やメッセージ/etc/issueに表示される。 記述する方法は「\r」でカーネルバージョン、「\m」でマシンアーキテクチャ、「\n」でホスト名、「\l」は端末名を表す。

7.3.2. ログイン中のユーザへのメッセージ送信

wallコマンド

wallコマンドによるメッセージ送信はログイン中のユーザに一斉に送信できる。

wall "コメント"

shutdown -kコマンド

shutdown -kコマンドでも指定したメッセージを伝える。

shutdown -k now "メッセージ"

mesgコマンド

使用中のターミナルへ他のユーザがwriteコマンドやtalkコマンドでメッセージを送信できるかどうかを制御できるコマンド。

mesg [y | n]

talkコマンド

指定したログイン中のユーザとチャットができるコマンド。

talk ユーザ[@ホスト]

writeコマンド

コマンドの後に入力したメッセージを指定したユーザのターミナルに1行ずつ送信するコマンド。

write ユーザ [tty]

2.8 - 8.DNS

bind(DNSサーバ)やDNSをLinuxで使う際のポイントなど

8.1. DNSの基礎知識

8.1.1. 名前解決

DNSサーバはホスト名とIPアドレスを相互に変換する名前解決という仕組みを提供する。 ホスト名からIPアドレスを求めることは正引き、その逆を逆引きと呼ぶ。

ホスト名はコンピュータに付けられた固有の名前。 ドメイン名(XX.comなど)はホストの所属するネットワーク上の区画を表す。

www.XX.comなどはFDQN(完全修飾ドメイン名)と呼ばれる。

8.1.2. DNSの仕組み

LinuxにおけるDNSによる名前解決(www.XX.comの例)の手順は以下の通り。

  1. Webサーバやアプリは名前解決ライブラリのリゾルバに名前解決を依頼する
  2. リゾルバは/etc/resolv.confに指定されているDNSサーバAに問い合わせを行う
  3. DNSサーバAはルートDNSサーバに問い合わせを行う
  4. ルートDNSサーバはwww.XX.comを知らない代わりに、.com管轄のDNSサーバCの情報を返す
  5. DNSサーバAはDNSサーバCに対し問い合わせる
  6. DNSサーバCは名前解決対象のドメイン名を知らない代わりに、XX.com管轄のDNSサーバDの情報を返す
  7. DNSサーバAはDNSサーバDに対し問い合わせる
  8. DNSサーバDはwww.XX.comのIPアドレスを返す
  9. DNSサーバAは得られた情報をキャッシュしリゾルバに送信する
  10. リゾルバは得られたIPアドレスをWebブラウザやアプリに知らせる

8.1.3. DNSサーバ

BIND

BIND(ISC DNS)はDNSサーバソフトウェアであり、多くのLinuxディストリビューションで採用されている。 BINDのサーバデーモンはnamedである。

/etc/dhcpd.conf

BIND以外のDNSサーバ

名前説明設定ファイル
dnsmasqDNS/DHCPサーバ機能を提供する軽量ソフトウェア/etc/dnsmasq.conf
PowerDNSコンテンツサーバ/キャッシュサーバ機能を提供する。DNSのキャッシュサーバやDHCPサーバなどの機能を持つ/etc/pdns/pdns.conf
djbdnsDNSのキャッシュサーバとコンテンツサーバの機能が分かれているDNSサーバ。RDBは使用できない/var/djbdns/dnscache/以下

ゾーン

ゾーンはDNSサーバが管轄するドメインの範囲のこと。 ゾーンを管理できる権威を持っていることは権威を持つと呼ぶ。

また下位のDNSサーバに対しゾーン管理を移すことは委譲と呼ぶ。

マスタDNSサーバ/スレーブDNSサーバ

  • マスタDNSサーバ
    • ゾーンファイルを所有するDNSサーバ
  • スレーブDNSサーバ
    • マスターDNSサーバのゾーン情報をコピーするDNSサーバ

なおマスタDNSサーバからスレーブDNSサーバへゾーン情報をコピーすることはゾーン転送と呼ばれる。

再帰的な問い合わせ

再帰的な問い合わせは最終的な結果を要求するDNS問い合わせのこと。 無条件に再帰的に問い合わせを許可すると、第3者からの問い合わせに回答しなくならないため、自ドメインからのみの問い合わせに対し許可をする。

8.1.4. DNSクライアントコマンド

nslookupコマンド

IPを調べたり、DNSサーバに問い合わせなどを行えるコマンド。

nslookup [オプション] [ホスト名|ドメイン名|IPアドレス]
オプション説明
-type=レコードレコードタイプの指定
-norescue再帰的問い合わせをしない

hostコマンド

DNSサーバを用いてホスト/ドメインに関する情報を表示するコマンド。 デフォルトでホスト名/IPアドレスの変換のみを行い、またDNSによる名前解決の確認に利用される。

host [オプション] ホスト名|ドメイン名|IPアドレス [問い合わせDNSサーバ]
オプション説明
-t タイプリソースレコードタイプの指定
-v詳細情報の表示

digコマンド

詳細な情報をDNSサーバから取得できるコマンド。

dig [@問い合わせ先DNSサーバ] ホスト名|ドメイン名|IPアドレス [クエリタイプ]
オプション説明
-x指定されたIPアドレスの逆引きを行う
-p ポート番号問い合わせ先のポート番号を指定(53番がデフォルト)
クエリタイプ説明
aホスト名に対応するIPアドレス(デフォルト)
ptrIPアドレスに対応するホスト名
nsDNSサーバ
mxメールサーバ
soaSOAレコード情報
hinfoホスト情報
axfrゾーン転送
txt任意の文字列
anyすべての情報

なお問い合わせ後に表示されるflagsには以下のようなものがある。

フラグ説明
qr問い合わせに対する回答
aa権威のある回答
rd再帰検索を希望
ra再帰検索が可能

また回答の表示されるセクションは4つに分かれる。

  • QUSETION SECITION
    • 問い合わせ内容の表示
  • ANSWER SECTION
    • 問い合わせの回答内容の表示
  • AUTHORITY SECTION
    • 問い合わせ先に権威がある場合に表示
  • ADDITIONAL SECTION
    • 回答したホストのIPアドレスなど追加情報が表示

8.2. BINDの基本設定

BINDの設定は/etc/named.confとゾーンファイルで構成される。

8.2.1. /etc/named.conf

// rndcコマンドによるnamedの操作を許可するホストの指定
controls {
    inet 127.0.0.1 allow { localhost; };
};

// ゾーンファイルを格納するディレクトリ指定
options {
    directory "/var/named";
};

// ルートDNSサーバの指定
zone "." {
    type hint;
    file "named.ca";
};

// ローカルホストの正引き設定
zone "localhost" {
    type master;
    file "0.0.127.in-addr.zone";
};

// ローカルホストの逆引き設定
zone "0.0.127.in-addr.arpa" {
    type master;
    file "0.0.127.in-addr.arpa.zone";
};

// example.netドメインの正引き設定
zone "example.net" {
    type master;
    file "example.net.zone";
};

// example.netドメインの逆引き設定
zone "30.20.10.in-addr.arpa" {
    type master;
    file "30.20.10.in-addr.arpa.zone";
}

また/etc/named.confのステートメントは以下の通り。

ステートメント説明
aclACLの定義
controllsnamedを操作できるホストの設定
include外部ファイルの読み込み
key認証情報の設定
optionsnamedの操作に関する詳細設定
zoneゾーンの定義

aclステートメント

アクセス制御リスト(ACL)を定義する。 アドレスマッチリストにはIPアドレス/ネットワークアドレスを記述する。

acl acl名 {
    アドレスマッチリスト
};

なお定義済みACLは以下の通り。

  • any … すべてのIPアドレス
  • localhost … ローカルホストが使用しているIPアドレス
  • none … いずれのIPアドレスともマッチしないアドレス

includeステートメント

指定した外部ファイルを読み込む。

include "/etc/rndv.key";

optionsステートメント

namedの動作に関する詳細なオプションを設定する。 利用可能なオプションは以下の通り。

重要なパラメータは太字にしてある。

オプション説明
directory ディレクトリパスゾーンファイルを格納するディレクトリ
datasizeデータセグメントサイズの上限
coresizeコアファイルのサイズ上限
max-cache-size キャッシュサイズ最大キャッシュバイト(Byte単位)
rescursion Yes|No再帰問い合わせの受け付け有無
rescusive-clients クライアント数再帰問い合わせの最大同時接続数
allow-query問い合わせを受け付けるホスト
allow-transferゾーン転送を許可するホスト
allow-updateゾーン情報の動的アップデートを受け付けるホスト
blackhole問い合わせを受け付けないホスト
forwarders { IPアドレス; }問い合わせの回送先DNSサーバ
forward only|first問合せ転送の失敗時の動作を設定する
notifyゾーンデータの更新をスレーブサーバに通知するかの有無
versionバージョン表示

なおフォワード(回送)は自身がゾーン情報を保存せず、キャッシュもない場合に問い合わせがあれば別のDNSサーバに問い合わせる機能のこと。

controllsステートメント

namedを操作できるホストのIPアドレス/ポート番号を指定する。

controls {
    inet 127.0.0.1 allow { localhost; }
};

zoneステートメント

ゾーン名、ゾーンタイプ、ゾーンファイルの場所を指定する。 ゾーンタイプは以下の通り。

タイプ説明
hintルートDNSサーバの指定
master指定したゾーンに対してのマスタDNSサーバ
slave指定したゾーンに対してのスレーブDNSサーバ
zone "example.com" {
    type master;
    file "example.net.zone";
};

named.confの設定

ルートDNSサーバのIPアドレスを最新情報に変更するには以下のように操作する。

dig @m.root-servers.net. ns > /var/named/[hint情報ファイル]

named-checkconfigコマンド

named.confの設定の構文チェックを行うコマンド。

named-checkconf [named.confのパス]

chrootしている場合は-tオプションでchrootディレクトリパスを指定する。

named-checkconf -t [chrootのパス] [named.confのパス]

8.2.2. rndcコマンド

namedの操作を行うコマンド。

named [サブコマンド]
サブコマンド説明
stopnamedの終了
refreshゾーンデータべースのリフレッシュ
stats統計情報をnamed.statsに書きだす
statusnamedのステータスを表示する
dumpdbキャッシュの内容をファイル出力する
reload ドメイン指定したゾーンファイルを再読み込みする
haltnamedを停止する

8.3. ゾーンファイルの管理

DNSサーバは複数ゾーンの管理ができ、ゾーン情報はゾーンごとにゾーンファイルに記載する。 ゾーンファイルはnamed.confで指定した数だけ必要になる。

ゾーンファイルの種類は以下の通り。

種類説明
hint情報ファイルルートDNSサーバ一覧
正引きファイルホスト名からIPアドレスの対応関係を記述
逆引きファイルIPアドレスからホスト名への対応関係を記述

また書式は以下の通り。

名前 [TTL値] IN リソースレコードタイプ 値

8.3.1. リソースレコード

ソースファイルに記述する内容は以下の通り。

  • $ORIGIN … レコードで補完するドメイン名の指定
  • $TTL … 他のDNSサーバがゾーンデータをキャッシュする時間の指定

またリソースレコードではゾーン情報を記述する。 ドメイン名はFDQNで指定し、最後に.をつける。 リソースレコードのタイプは以下の通り。

リソースレコードタイプ説明
SOA管理情報の記述
NSゾーンを管理するDNSサーバを記述
MXメールサーバを記述(正引きのみ)
Aホスト名に対するIPアドレスを記述(正引きのみ)
AAAAホスト名に対するIPv6アドレスを記述(正引きのみ)
CNAMEホスト名の別名に対するホスト名を記述(正引きのみ)
PTRIPアドレスに対するホスト名を記述(逆引きのみ)
TLSAデジタル署名されたレコード。サーバ認証に使われる証明書や鍵の情報がドメイン名に対して関連付けられてDANE(DNSを使った認証の仕組み)で用いられる

SOAレコード

ゾーンに関する基本情報を記載する。

名前 IN SOA DNSサーバ  メールアドレス (
    [値] ;Serial 
    [値] ;Refresh
    [値] ;Retry
    [値] ;Expire
    [値] ;Negative TTL
)
項目説明
Serialシリアル番号の記述
RefreshマスタDNSサーバのゾーン情報変更をスレーブDNSサーバがチェックする間隔の指定
RetryスレーブDNSサーバがマスタDNSサーバにアクセスできないときに何秒後に再試行するかの指定
ExpireスレーブDNSサーバがマスタDNSサーバにアクセスできないときに何秒後にゾーン情報を破棄するかの指定
Negative TTL存在しないドメインに対するキャッシュの有効期限の設定

NSレコード

DNSサーバをFDQNで指定する。 DNSサーバ1つにつき1つずつ記述する。

名前 IN NS DNSサーバ名

MXレコード

MXレコードはメールサーバがメールを送る際に参照するもの。

名前 IN MX プリファレンス値 メールサーバ名

プリファレンス値は値が小さいほど優先度が高い。 「10」ずつ値を区切るのが一般的となる。

Aレコード

ホスト名に対するIPアドレスを指定する。

ホスト名 IN A IPアドレス

AAAAレコード

ホスト名に対するIPv6アドレスを指定する。

ホスト名 IN AAAA IPv6アドレス

CNAMEレコード

ホスト名の別名を記述する。

別名 IN CNAME ホスト名

PTRレコード

IPアドレスに対するホスト名を記述する。

IPアドレス.in-addr-arpa. IN PTR ホスト名

なおIPv6の場合は4bitごとに「.」を挿入、「:」を削除記載する。

8.3.2. ゾーンファイルの設定

named-checkzoneコマンド

ゾーンファイルの構文チェックを行うコマンド。

named-checkzone [オプション] ゾーン名 ゾーンファイル名
オプション説明
-t ディレクトリchrootしている場合のディレクトリ指定
-w ディレクトリゾーンファイルのディレクトリ指定

named-compilezoneコマンド

バイナリデータのゾーンファイルの内容を確認できるコマンド。

named-compilezone

8.4. DNSサーバのセキュリティ

8.4.1. 通常のセキュリティオプション

named.confの設定で強化できるセキュリティ設定をいくつか記載する。

ゾーン転送の制限

スレーブDNSサーバはマスタDNSサーバからゾーン情報を転送する必要があるが、スレーブDNSサーバ以外はその必要がない。 ゾーン転送をスレーブDNSサーバのみに限定する場合は以下のように行う。

zone "example.net" {
    allow-transfer { 192.168.128.3; };
};

この設定により、ゾーン情報の全体を外部から問い合わせることが制限できる。

DNS問い合わせの制限

DNS問い合わせの制限は不要なDNSサーバ利用を阻止することが可能。 また再帰的な問い合わせの禁止は不正なキャッシュデータをDNSサーバに送りつけるキャッシュ汚染攻撃を回避することができる。

; 192.168.120.0/24からの問い合わせ/再帰的な問い合わせの許可
options {
    allow-query { 192.168.120.0/24; };
    allow-rescursion { 192.168.120.0/24; };
};

; 以下のゾーンはすべてのホストからの問い合わせの許可
zone "example.net" {
    allow-query { any; };
};
zone "192.168.120.in-addr.arpa" {
    allow-query { any; };
};

バージョン番号の秘匿

digコマンドによりBINDのバナー情報として表示することができる。 そのためバージョンを秘匿するにはoptionsオプション内でversionオプションに任意の文字列を指定する。

options {
    version "unknown DNS Server";
};

root以外によるnamedの実行

root権限以外でnamedを実行すれば、DNSサーバがクラッカーにより侵入されたとしても被害を最低限に抑えることができる。 BINDをパッケージでインストールするとnamedユーザが生成され、その権限で実行されることになる。

確認はps -f -C namedで可能。 chrootを使用することでさらに侵入されたときの被害をおさえることができる。

chroot: 任意のディレクトリをプロセスにとっての「/」と扱うことで、そのディレクトリ以外をアクセスできないようにする手法

この場合、namedの運用に必要なファイルはchrootディレクトリ以下に配置する必要がある。

8.4.2. DNSSEC/TSIG

DNSの仕組み強化の仕組みにはDNSSEC/TSIGなどがある。

DNSSEC(DNS Security)はゾーン情報の信頼性を保証するための仕組みで、具体的にはゾーン情報に公開鍵暗号方式の電子署名を行うことでゾーン情報が改ざんされていないこと、DNS応答が正当な管理者により行われることを保証する。 DNSSECの利用にはDNSサーバ/クライアント両方対応している必要がある。

DNSSECの仕組みは以下の通り。

  1. ゾーン情報のハッシュ値(DS)とDNSサーバの秘密鍵で暗号化したものを電子署名とする
  2. DNS問い合わせの際にゾーン情報/電子署名をクライアントに送信する
  3. クライアントは電子署名をDNSサーバの公開鍵で復号する
  4. ゾーン情報のハッシュ値と電子署名の復号結果が一致すれば保証

DNSSEC

この仕組みを順につなげることで信頼性のあるDNSのつながりが完成する。

またゾーン情報に電子署名を行う鍵をZSK(Zone Security Key)、ZSKに電子署名を行う鍵をKSK(Key Signing Key)と呼ぶ。 BIND 9.3.0以降でDNSSECは対応している。

DNSSECの設定

DNSSECをBINDで実装する手順は以下の通り。

  1. ZSK鍵ペアを作成する(ゾーンファイルを格納しているディレクトリで行う)
    • 例:dnssec-keygen -r /dev/random -a RSASHA256 -b 1024 -n zone example.net
    • 上記により公開鍵と秘密鍵が生成される(生成されたファイル名最後5桁は鍵ID)
  2. KSK鍵ペアを作成する
    • 例:dnssec-keygen -r /dev/urandom -f KSK -a RSASHA256 -b 2048 -n zone example.net
    • 上記により公開鍵と秘密鍵が生成される(生成されたファイル名最後5桁は鍵ID)
  3. ゾーンファイルに生成した公開鍵が読みこまれるように設定する
    • $INCLUDE "鍵ファイル名"
  4. dnssec-signzoneコマンドによりゾーンファイルに署名を行う
    • 例:dnssec-signzone -o example.net example.net.zone
    • 署名後にゾーン名.signed(署名ファイル)が生成される

なお上位ゾーンへ管理する組織へDSレコード登録を申請する必要がある。

TSIGの設定

TSIG(Transaction SIGnatures)は共有秘密鍵の利用によりマスタDNSサーバになりすまし、偽のゾーンデータをスレーブDNSサーバに送ることや、ゾーンファイルを改ざんする攻撃を防ぐための仕組みのこと。 これはマスタDNSサーバ/スレーブDNSサーバがゾーン転送によりゾーンデータを同期することの性質によるもの。

TSIGの設定は以下の通り。

  1. dnssec-keygenコマンドにより共有鍵ファイルの作成
    • 例:dnssec-keygen -a HMAC-MD5 -b 128 -n HOST tsig-key
  2. named.confに共有鍵ファイルを記載する

マスタDNSサーバの例(tsig-keyは鍵名)

key "tsig-key" {
    alogorithm hmac-md5;
    secret "keyの中身":
};

zone "example.net" {
    type master;
    file "example.net.zone";
    allow-transfer { 192.168.1.100; };
};

スレーブDNSサーバの例(tsig-keyは鍵名)

key "tsig-key" {
    alogorithm hmac-md5;
    secret "keyの中身":
};

server 192.168.1.25 {
    keys { tsig-key; };
};

zone "example.net" {
    type slave;
    file "example.net.zone";
};

8.4.3. DANE

DANE(DNS-based Authentication of Named Entitie)はDNSSECの技術を応用して認証情報をDNSベースでやり取りする仕組み。 DNSSECにより、リソースレコードの正当性確認の仕組みがDNSに組み込まれたため、HTTPSなどで使われるX509の証明書とドメインの紐づけの役割を、認証局からDNSに移すことを目的にし、策定されている。

デジタル署名されたレコードをTLSAレコードと呼び、webのHTTPSで使用されるTLSと技術的には同じ方法を用いて、信頼の基盤を認証局からDNSSECに変更する。

2.9 - 9.Webサーバとプロキシサーバ

Web(Apache, Nginx)、プロキシ(Squid)に関して

9.1. Webサーバの設定

9.1.1. Apache

Apache(Apache HTTP Server)はOSSのWEBサーバの1つ。 Apacheの2.0系ではMPMへの対応やIPv6への対応が行われた。 また、2.2系ではキャッシュの改善や負荷分散機能の追加などが行われた。

MPM(Multi Processing Module):MPMにはprefork, worker, perchild, eventがある。

  • preforkは1.3系と同じマルチプロセスモデルでリクエストごとにプロセスを割り当てる
  • workerはスレッド対応モデルでクライアントのリクエストを子プロセスで処理し、処理増大で子プロセスを増やす
  • perchildはバーチャルホスト向けのスレッド対応で子プロセスを固定し負荷に応じてスレッドを増減する
  • eventはworkerと似た機能であるがkeepaliveの処理が異なる

なおCentOS7系の場合はApacheのMPMはpreforkとなる。

Apacheのインストール方法

Apacheのインストール方法は2通り。

  • ディストリビューションごとのパッケージを利用する方法
    • RedHat系: yum install httpd
    • Debian系: apt-get install apache2
  • ソースからコンパイルして使用する方法
    • configure
    • make
    • make install

またconfigureの役立つオプションは以下の通り。

オプション説明
–prefix=ディレクトリインストール先のディレクトリ
–sysconfdir=ディレクトリ設定ファイルのディレクトリ
–enable-module=モジュール標準モジュールの組み込む
–disable-module=モジュール標準モジュールを組み込まない
–enable-shared=モジュール標準モジュールをDSOで組み込む
–diable-shared=モジュール標準モジュールをDSOで組み込まない

使用例は以下の通り。

# インストールディレクトリの指定とsshモジュールの有効化
./configure --prefix=/usr/local/apache --enable-module=ssl

9.1.2. Apacheの基本設定

Apacheのメイン設定ファイルはhttpd.confとなる。 Apacheの主な設定ファイルのディレクトリは以下の通り。

ソースからインストールした場合

ファイル/ディレクトリ説明
/usr/local/apache2/conf/httpd.confメインの設定ファイル
/usr/local/apache2/conf/extra補助の設定ファイルを保存するディレクトリ
httpd-language.conf言語/文字コードの設定
httpd-userdir.conf一般ユーザのホームディレクトリ設定
httpd-info.confserver-info, server-statusの設定
httpd-vhosts.confバーチャルホストの指定
httpd-default.confデフォルトのサーバ全般設定
httpd-ssl.confSSL/TLSの設定

Red Hat系でインストールした場合

ファイル/ディレクトリ説明
/etc/httpd/conf/httpd.confメインの設定ファイル
/etc/httpd/conf.d/補助の設定ファイルを保存するディレクトリ
ssl.confSSL/TLS設定ファイル
php.confPHPモジュールの設定
perl.confPerlモジュールの設定

Debian系でインストールした場合

ファイル/ディレクトリ説明
/etc/apache2/apache2.confメインの設定ファイル
/etc/apache2/補助の設定ファイルを保存するディレクトリ
/etc/apache2/ports.confポートの設定
/etc/apache2/sites-enabled/サイト定義ファイルのリンク
/etc/apache2/sites-avaiable/サイト定義ファイル

httpd.confの設定項目

httpd.confの設定項目はディレクティブと呼ばれ以下のように設定する。

ディレクティブ名 設定値

また適用範囲は以下のように指定できる。

<Files ファイル名> ... </Files>

<Directory ディレクトリ名> ... </Directory>

<Location URL> ... </Location>

大まかな設定項目は以下の通り。

# Apacheの設定ファイル/ログファイルの起点となるトップディレクトリ
ServerRoot "/usr/local/apache2"

# 待ち受けポート
Listen 80

# ロードモジュール
LoadModule authn_file_module modules/mod_authn_file.so

# 実行ユーザと実行グループ
User apache
Group apache

# バージョン情報の出力設定
ServerSignature On
ServerTokens Full

# 管理者のメールアドレス
ServerAdmin root@localhost

# Webサーバーとして公開するホスト名を指定
# ホスト名は FQDN(Fully Qualified Domain Name) で記述
ServerName www.example.com:80

# /ディレクトリ以下の設定
<Directory />
    # AllowOverride は 上位のディレクトリ(この場合は/(root)ディレクトリ)でした設定を下位のディレクトリで設定を上書きできるかどうか(オーバーライドできるかどうか)を設定。none → 下位での変更が無効。all → 下位での変更が有効。
    AllowOverride none
    # アクセス制限に関する設定。デフォルトではすべて拒否する設定になっている。
    Require all denied
</Directory>

# ドキュメントルート(DocumentRoot)は、Webサーバーのトップディレクトリ
DocumentRoot "/var/www/html"

# ドキュメントルート以下の設定
<Directory "/var/www/html">
    # シンボリックリンクをたどれるようにする
    Options Indexes FollowSymLinks
    AllowOverride None
    # /var/wwwディレクト配下へのアクセスは全員が可能(Webサイトを閲覧することができる)
    Require all granted
</Directory>

# dirモジュールが有効時にディレクトインデックスの指定
<IfModule dir_module>
    DirectoryIndex index.html
</IfModule>

# ディレクトリに「.htaccess」ファイルや「.htpasswd」ファイルがあった場合、ユーザーに表示するかどうかを設定
<Files ".ht*">
    Require all denied
</Files>

# エラーログの場所を指定
ErrorLog "logs/error_log"

# ログレベルの指定
LogLevel warn
# emerg:緊急、システムが利用できないレベル
# alert:今すぐに対処が必要なレベル
# crit:致命的な状態
# error:エラーレベル
# warn:(デフォルト) 警告レベル
# notice:注意すべき重要な情報
# info:一般的な情報
# debug:デバッグレベル

<IfModule log_config_module>
    # ログのフォーマットを指定。ログフォーマットのニックネームを「combined」と名付ける。
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    # ログのフォーマットを指定。ログフォーマットのニックネームを「common」と名付ける。
    LogFormat "%h %l %u %t \"%r\" %>s %b" common

    # カスタムログの場所とフォーマットを指定。フォーマットは、ニックネーム「combined」の形式にする。
    CustomLog "logs/access_log" combined
</IfModule>

<IfModule alias_module>
    # 【例】http://sample.ne.jpの場合、「/var/www/cgi-bin/」ディレクトリを「http://sample.ne.jp/cgi-bin」に割り当てます。つまりどのディレクトリを「cgi-bin」に割り当てるのか設定する。エイリアス定義
    ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"

</IfModule>


# cgi-binディレクトリの動作について設定
<Directory "/var/www/cgi-bin">
    AllowOverride None
    # オプションは何もなし
    Options None
    # 全員がアクセス可能
    Require all granted
</Directory>

# エラーとエラーページの設定
ErrorDocument 500 "The Server mode a boo boo."
ErrorDocument 404 /missing.html

# 他の設定ファイルの読み込み
IncludeOptional conf.d/*.con

9.1.3. httpd.confの主要な設定

ServerTokens Prod|Major|Minor|MinOS|Full

HTTPヘッダ内に出力されるバージョン情報(バナー情報)を指定する。 クライアントに返信する応答ヘッダにどのような情報を含めるかということを決めれる。

セキュリティの関係で通常は「Prod」で良い。

ServerTokens Prod|Major|Minor|MinOS|Full
設定値出力
ProdServer: Apache
MajorServer: Apache/2
MinorServer: Apache/2.4
MinOSServer: Apache/2.4 (CentOS)
FullServer: Apache/2.4 (CentOS) OpenSSL/1.0.1e-fips PHP/5.4.16

ServerRoot パス

httpdが利用するトップディレクトの指定。 設定ファイルなどを格納する。

ServerRoot パス

ServerName サーバのホスト名

ホスト名の指定。

ServerName サーバのホスト名

ServerAdmin メールアドレス

サーバ管理者のメールアドレスを指定。

ServerAdmin メールアドレス

ServerSignature on|off

エラーメッセージなどのフッタ表示の有効無効化を指定。

ServerSignature on|off

TraceEnable on|off

TRACEメソッドの使用の有無の指定。

TracerEnable on|off

プロセス系の設定項目

Apacheでは複数のプロセスが処理を分担する。 仕組みとしては以下の通り。

  1. 親プロセスがクライアントからの接続を待ち受ける
  2. 個々のクライアントの対応は子プロセスが処理する

なお、待機している子プロセス数よりもクライアント数が多くなれば、子プロセス数を新たに不足分起動するのでレスポンスが低下する。 また待機している子プロセス数が多いほどメモリの使用量は多くなる。

# 起動時の子プロセス数の数
StartServers 子プロセス数
# 待機子プロセスの最小数
MinSpareServers 子プロセス数
# 待機子プロセスの最大数
MaxSpareServers 子プロセス数
# 生成される子プロセスの上限の指定
ServerLimits 子プロセス数
# 最大同時接続数の指定
MaxClients 同時接続数
MaxRequireWorkers 同時接続数
# クライアント接続がタイムアウトになる時間を秒数指定
Timeout タイムアウト時間
# KeepAlive(TCP接続のキープ)の設定(パフォーマンス向上が見込める)
KeepAlive on | off
KeepAliveRequires 上限リクエスト数
KeepAliveTimeout タイムアウト時間

Listen [IPアドレス:]ポート番号

待ち受けポート番号の指定。

Listen :80

User/group

httpd子プロセスの実行ユーザと実行グループの指定。

User ユーザ名
Group グループ名

DocumentRoot ディレクトリ

ドキュメントルートとなるディレクトリの指定

DocumentRoot ディレクトリ

UsrDir 公開ディレクトリ|disabled

一般ユーザの公開ディレクトリの指定。

UsrDir 公開ディレクトリ|disabled

DirectoryIndex インデックスファイル

ディレクトリのインデックスとして返すファイル名の指定。

DirectoryIndex インデックスファイル

ErrorLog ログファイルのパス

エラーログを記録するログファイルの指定。

ErrorLog ログファイルのパス

Loglevel ログレベル

エラーログのログレベルの指定。

Loglevel ログレベル

LogFormat “フォーマット” 書式名

ログを記録する項目と書式名を指定する。

LogFormat "フォーマット" 書式名

フォーマット文字列は以下の通り。

フォーマット文字列説明
%aリモート IP アドレス
%Aローカル IP アドレス
%Bレスポンスのバイト数。HTTP ヘッダは除く。
%bレスポンスのバイト数。HTTP ヘッダは除く。CLF 書式。 すなわち、1 バイトも送られなかったときは 0 ではなく、 ‘-’ になる
%fファイル名
%hリモートホスト
%Hリクエストプロトコル
%lリモートログ名。 これは mod_ident がサーバに存在して、 IdentityCheck ディレクティブが On に設定されていない限り、 - になる。
%mリクエストメソッド
%rリクエストの最初の行
%tリクエストを受付けた時刻。 CLF の時刻の書式 (標準の英語の書式)
%Tリクエストを扱うのにかかった時間、秒単位
%uリモートユーザ (認証によるもの。ステータス (%s) が 401 のときは意味がないものである可能性がある)
%Uリクエストされた URL パス。クエリ文字列は含まない
%>sサーバがクライアントに返すステータスコード
%{Referer}iリクエスト内のrefererヘッダの内容
%{User-agent}iリクエスト内のUserAgentヘッダの内容

Custom ログファイル名 ログ書式名

出力するログの指定を行う。

CustomLog logs/access_log combined

HostnameLookups on|off

DNSの逆引きを行いアクセス元IPアドレスからホスト名を取得する ログにホスト名やホスト名でアクセス制御を行う場合に使用する。

HostnameLookups on|off

Alias ディレクトリ パス

ドキュメントルートツリー以外の参照できるようにする際に使用する。

# /var/www/html/imagesではなく/home/www/imagesを参照できるようにする
Alias /images /home/www/images

Redirect ディレクトリ|ファイル 転送先URL

指定したURLにリダイレクトを行う

Redirect ディレクトリ|ファイル 転送先URL

ScriptAlias ディレクトリ CGI格納ディレクトリ

CGIスクリプト用ディレクトリを指定する。

ScriptAlias /cgi-bin/ /var/www/cgi-bin/

ErrorDocument エラーコード ファイル|ディレクトリ

エラーが発生した際の処理をエラーコードに続けて指定する。

ErrorDocument 404 /error.html

Options オプション

ディレクトリごとにオプションを指定できる。

オプション説明
AllMultiViews 以外のすべての機能を有効にする(デフォルト)
Noneすべての機能を無効にする
ExecCGICGI スクリプトの実行を許可する
FollowSymLinksシンボリックリンクをたどることを許可する
IncludesSSI を有効にする
Indexesファイル一覧の表示を行う
MultiViewsコンテントネゴシエーションを有効にする

9.1.4. 外部設定のファイル

httpd.conf以外に設定ファイルを記述し、httpd.confを上書きして設定することもできる。 外部設定のファイル名はhttpd.confのAccsessFileNameディレクティブで指定できる。

AccsessFileName

外部設定のファイルを指定できる。

AccsessFileName .htaccess

AllowOverride パラメータ

AllowOverrideディレクティブは外部ファイルの利用許可ができる。 複数パラメータの指定。

Directoryセクションで指定できる

AllowOverride パラメータ
パラメータ説明
AuthConfig認証に関する設定を有効にする
indexesDirectoryIndexなどの設定の有効にする
FileInfoファイルタイプの制御設定を有効にする
LimitOrder, Allow, Denyによる設定を有効にする
OptionsOpitionsの設定を有効にする
None.htaccessでの変更を無効にする
All.htaccsessで変更可能なすべての設定を有効にする

9.1.5. Apacheの制御

Apacheの起動方法は以下の通り。

# SysVinitを採用したシステムでのApacheの起動
/etc/init.d/httpd start
# Systemdを採用したシステムでのApacheの起動
systemctl start httpd.conf
# Ubuntuの場合
systemctl start apache2.service

# Apachectlによる起動
apachectl start

apachectlコマンド

apacheの操作/情報参照できるコマンド。

apachectl サブコマンド
サブコマンド説明
startApacheを起動
stopApacheの終了
restartApacheの再起動
gracefulApacheを安全に再起動
reload設定ファイルの再読み込み
configtest設定ファイルの構文チェック

9.1.6. モジュールの使用

Apacheではモジュールによって様々な機能を提供できる。 機能追加などもApacheのインストールのし直しの必要はなく、モジュールのロード/アンロードで行える。

Apacheの主要なモジュールは以下の通り。

モジュール名説明
mod_accsess_compatホストベースのアクセス制御
mod_authz_hostホストベースのアクセス制御(Requireディレクティブ)
mod_authz_userユーザベースのアクセス制御(Requireディレクティブ)
mod_auth_basic基本認証
mod_auth_digestDigest認証
mod_authn_file.htaccsessファイルによるユーザ認証
mod_aliasエイリアス機能の利用
mod_cgiCGIスクリプトの実行
mod_dirディレクティブのインデックス実行
mod_infoサーバの設定情報表示
mod_log_configリクエストログの生成
mod_mime拡張子に応じたファイルタイプの指定
mod_negotiationクライアントごとの自動判別機能の提供
mod_perlPerlの利用
mod_phpPHP5の利用
mod_proxyプロキシ機能
mod_soモジュールを読み込むDSO機能の提供
mod_sslSSL/TLS機能の利用
mod_statusサーバステータスの表示
mod_unixd実行ユーザ/グループのChroot機能
mod_userdirユーザディレクリの公開
mod_versionバージョン依存の設定

モジュールは/usr/lib/httpd/modulesなどにインストールされ、LoadModuleディレクティブで読み込む。

LoadModule perl_module modules/mod_perl.so

またApacheのインストール後にモジュールを読み込むには以下のように実施する方法もある。

  1. aspxコマンドによるコンパイル
  2. httpd.confLoadModulesディレクティブを追加

aspxコマンド

Apacheのインストール後にモジュールをDSOとしてインストールするコマンド。

sudo aspx -i -a -c mod_foofoo.c

httpdコマンド

組み込み済みのモジュールの確認や一覧の表示を行えるコマンド。

# 組み込み済みモジュールの確認
httpd -l
# Debian/Ubuntuの場合
apache2 -l

# 組み込みモジュール/DSOモジュールの一覧表示と設定ファイルの文法チェック
httpd -M

またDebian/Ubuntuの場合はa2enmodコマンドにより対話的にモジュールを有効化できる。

9.1.7. クライアントのアクセス認証

指定したディレクトリにアクセスするときにユーザ/パスワードがないときにアクセス制限をかけることができる。 認証にはBasic認証とDigest認証を使うことができる。

Basic認証

Basic認証の実装手順はhttpd.confにユーザ認証設定を実装することで可能。 なおBasic認証では平文で認証情報が流れる。 設定例は以下の通り。

<Directory "/var/www/html/private">
 # 認証タイプの指定
 AuthType Basic
 # 認証ダイアログのメッセージ
 AuthName "Please Enter Your ID and PassWord!"
 # パスワードファイル名
 AuthUserFile /etc/httpd/conf/passwd
 # AuthGroupFile
 # アクセス可能なユーザ(user ユーザ または valid-user)
 Require valid-user
</Directory>

valid-userにすると、パスワードファイルにエントリあるすべてのユーザがアクセスが許可される。 認証に用いるユーザ名とパスワードの設定はhtpasswdコマンドを用いる。

htpasswd [オプション] ファイル名 ユーザ名
オプション説明
-cパスワードファイルを新規に作成
-mMD5で暗号化する
-sSHA1で暗号化する
-Dユーザを削除する

注意点としてドキュメントルート以下のブラウザからアクセスできる場所にパスワードファイルを設置する際にアクセスできないようにする必要がある。

Digest認証

Digest認証ではチャレンジ/レスポンス形式で認証を行うので認証情報が盗聴されてもパスワードがすぐに漏洩しない特徴がある。 設定は以下の通り。

Digest認証ではAuthNameでは認証領域を指定する。

<Directory "/var/www/html/private">
 # 認証タイプの指定
 AuthType Digest
 # ユーザ認証の領域を指定
 AuthName "private"
 # パスワードファイル名
 AuthUserFile /etc/httpd/conf/passwd
 # AuthGroupFile
 # アクセス可能なユーザ(user ユーザ または valid-user)
 Require valid-user
</Directory>

認証に用いるユーザ名とパスワードの設定はhtdigestコマンドを用いる。

htdigest [オプション] ファイル名 領域 ユーザ名
オプション説明
-cパスワードファイルを新規に作成

ホストベースのアクセス認証

order, Allow,DenyディレクティブによりIPアドレス/ホスト名によるアクセス制御ができる。 なおこの制御の使用は非推奨になっているため、Requireディレクティブを代用が推奨されている。

# Allow Denyの評価順の指定
Order allow | Deny, allow | Den

# 接続許可するホストの指定
Allow from IPアドレス | ホスト名/ドメイン名
# 接続を許可しないホストの指定
Deny from IPアドレス | ホスト名/ドメイン名

なお現在推奨であるRequireディレクティブを使用する場合の書式は以下の通り。

Require エンティティ 値

指定するエンティティ例は以下の通り。

エンティティ説明
ip IPアドレスIPアドレス
ip 192.168 172.16192.168.0.0/24, 172.16.0.0/24のみ
host ドメイン名ドメイン名のホストのみ
group adminadminグループのみ
all grantedすべてのホストを許可
all deniedすべてのホストを拒否
localローカルホストのみ

また以下のディレクティブを使用して複数条件の指定も可能

ディレクティブ説明
RequireAllすべての条件にマッチで真
RequireAny1つ以上の条件にマッチで真
RequireNoneいずれにマッチしなければ真

またApache2.4以降ではorder, Allow,Denyディレクティブを使用する方法ではなく、Requireディレクティブを使用する形が推奨されている。

設定Order Deny,AllowOrder Allow,Deny
デフォルト全て許可すべて拒否
一部のアクセスのみ許可Order Deny,Allow
Deny from all
Allow from
IPアドレス/ホスト名
Order Allow,Deny
Allow from all
Deny from
IPアドレス/ホスト名
一部のアクセスのみ拒否Order Deny,Allow
Deny from
IPアドレス/ホスト名
Order Allow.Deny
Allow from
IPアドレス/ホスト名
すべて許可Order Deny,AllowOrder Allow,Deny
Allow from all
すべて拒否Order Deny,Allow
Deny from all
Order Allow,Deny

またアクセス制御をLimitLimitExceptディレクティブ内に設定して、特定のHTTPメソッドに適用することもできる。

<Limit DELETE POST PUT>
    Require vaild-user
</limit>

<LimitExcept DELETE POST PUT>
    Require All Deny
</limitExcept>

9.1.8. バーチャルホスト

バーチャルホストは1台のサーバで複数のWebサイトを管理する機能のこと。 バーチャルホストには以下の2種類がある。

  • 名前ベースバーチャルホスト … 1台のホストに1つのIPと複数のドメイン名を指定する方法
  • IPベースバーチャルホスト … 1台のホストに複数のIPアドレスと複数のドメインを指定する方法

名前ベースのバーチャルホスト

設定例は以下の通り。 下記設定の上でDNSを適切に設定するとWebサイトを複数1つのホストで運用できる。

NameVirtualHost *:80

<VirtualHost *:80>
    ServiceName web.hogehoge.jp
    ServerAdmin [email protected]
    DocumentRoot /var/www/virtual/hogehoge
</VirtualHost>
<VirtualHost *:80>
    ServiceName www.test.jp
    ServerAdmin [email protected]
    DocumentRoot /var/www/virtual/test
</VirtualHost>

IPベースのバーチャルホスト

設定例は以下の通り。

Listen 192.168.1.10:80
Listen 192.168.1.11:80

<VirtualHost 192.168.1.10:80>
    ServiceName web.hogehoge.jp
    ServerAdmin [email protected]
    DocumentRoot /var/www/virtual/hogehoge
</VirtualHost>
<VirtualHost 192.168.1.11:80>
    ServiceName www.test.jp
    ServerAdmin [email protected]
    DocumentRoot /var/www/virtual/test
</VirtualHost>

9.1.9. SSL/TLS

SSL/TLSは公開鍵暗号を使用したTCP/IPのアプリケーション層のセキュリティ技術。 SSL/TLSによりWebブラウザとサーバ間の通信を暗号化できセキュアな通信を実現できる。

認証には認証局により発行されたサーバ証明書によりサイトの正当性を保証し、セキュリティを担保する。 Apacheではmod_sslによりサイトをSSL化することができる。

SSLを利用してWebサーバの運用は以下の手順でサイト証明書を認証局から入手する。

  1. 公開鍵/暗号鍵の作成
  2. 作成した公開鍵を認証局(CA)へ送信する
  3. CAにて証明書を発行して受け取る
  4. 証明書をWebサーバにインストールする

自己署名証明書(オレオレ認証)

自己署名証明書はSSL接続をテストする為や、限られた利用者のみが使用するWEBサーバなどを構築する際に設定する。

作成手順は以下の通り。

  1. 秘密鍵(key.pem)と自己署名証明書(cacert.pem)の作成
  2. サーバ秘密鍵の作成(鍵名.key)
  3. 証明書発行要求書(CSR)の作成
  4. 証明書発行要求ファイルに対しCAが認証を行いサーバ証明書(.crt)の作成

自己署名証明書の作成例は以下の通り。 なおCA.sh -newcaCA.pl -newca(OpenSSL1.1.0以降)も使用可能。

# 秘密鍵と自己署名証明書の作成

./CA -newca
# パスフレーズを入力
# パスフレーズの再入力

# 国コードの入力
# 都道府県名
# 市町村名
# 会社名
# 部署名
# ホストのFDQN
# 管理者メールアドレス

# パスフレーズの入力
# サーバ秘密鍵の作成
openssl genrsa -out server.key 2048
# 証明書発行要求書(CSR)の作成
openssl req -new -key server.key -out server.csr
# サーバ証明書(.crt)の作成
openssl ca -out server.crt -infiles /etc/pki/ca/server.csr

SSL関連ファイル

ファイル説明
.keyサーバ秘密鍵
.csr証明書発行要求書
.crtサーバ証明書

またSSL設定(httpd.conf)例は以下の通り。 なおSSLには443ポートを使用するので注意する。

SSLEngine On
SSLProtocol all -SSLv2 -SSLv3
SSLCertificateFile [.crtのパス]
SSLCertificateKeyFile [.keyのパス]

SSL/TLSの主要ディレクティブ

ssl.confの主要なディレクティブは以下の通り。

ディレクティブ説明
SSLEngineSSL/TLSの有効無効
SSLProtocolall,SSLv2, SSLv3, TLSv1, TLSv1.1 , TLSv1.2がある。-で無効化、+で有効化
SSLCipherSuite使用する暗号化アルゴリズムのリスト
SSLCertificateFileサーバ証明書ファイル
SSLCertificateKeyFileサーバ秘密鍵のファイル
SSLCerificateChainFile中間CA証明書ファイル
SSLCACertificateFileクライアント証明書発行のCA証明書ファイル
SSLCAcertificatePathクライアント証明書発行のCA証明書ディレクトリ
SSLVerifyClientクライアント認証レベル(none, optional, opitional_no_ca, require)

SNI

SNI(Server Name Indication)は1つのWebサーバで複数のドメインのSSL/TLS証明書を利用できる仕組み名前ベースのVirtualHostであってもSSLに対応できるようにしたSSL/TLSの拡張仕様ともいえる。

この機能により、複数独自ドメインを利用するサーバにて複数のSSL/TLS証明書を使用することが可能になった。 特徴は以下の通り。

  • IPベースのVirtualHostであれば、クライアントに依存せずにSSLを使える
  • 名前ベースのVirtualHostの場合、クライアントがSNIに対応していればSSLを使用できる

SNIでは、SSLセッションのハンドシェイク(SSL接続)のタイミングでクライアント側から接続したいホスト名を提示する。これによりサーバは、クライアントが提示したホスト名を確認して適切な証明書を返すことができる。

なお、SNIはサーバだけでなくクライアント側(ブラウザ)も対応している必要がある

9.2. Webサーバの監視とメンテナンス

9.2.1. サーバ情報の取得

mod_statusモジュール

mod_statusモジュールの使用でサーバの稼働状況をブラウザに表示ができる。 mod_statusを使用する場合のhttpd.confは以下の通り。

LoadModule status_module modules/module_status.so

<Location /server-status>
    SetHandler server-status
</Location>

mod_infoモジュール

mod_infoモジュールの使用でサーバ設定の情報をブラウザに表示ができる。 mod_infoを使用する場合のhttpd.confは以下の通り。

LoadModule status_module modules/mod_info.so

<Location /server-info>
    SetHandler server-info
</Location>

9.2.2. ログファイル

Apacheの規定のログファイルにはaccsess_logerror_logがある。 /var/log/httpdなどに保存される。

  • アクセスログ … 要求のあったリクエストの情報などが保存される
  • エラーログ … エラー情報やサーバの挙動が記録される(ログレベルはLogLevelディレクティブで設定可能)

9.3. プロキシサーバの設定

プロキシサーバはクライアントPCの代理としてサーバとの通信を仲介するサーバのこと。 メリットは以下の通り。

  • 特定のWEBサイトへのアクセスを制限できる
  • クライアントからのアクセスを制御できる
  • 一度アクセスしたサイトをキャッシュしてアクセスの高速化を図れる

9.3.1. Squid

SquidはLinuxで最も使用されているプロキシサーバの1つ。 Squidはsquid.confで設定を行う。

squid.confの主要設定項目

設定項目説明
http_portSquidが利用するポート番号
visible_hostnameホスト名
hierarchy_stoplistキャッシュを利用しない文字列
maximum_object_sizeキャッシュ可能な最大ファイル数
minumum_object_sizeキャッシュ可能な最小ファイル数(0は無制限)
maximum_object_size_in_memoryメモリ上の最大ファイルサイズ
ipchache_sizeキャッシュするIPアドレス数
cache_dirキャッシュを格納するディレクトリと容量など
cache_mem総メモリの最大サイズ
cache_accsess_logクライアントのアクセスログ
cache_logキャッシュのログ
ftp_useranonymousでFTPアクセスするときのパスワード
ftp_passive_on/offFTPのパッシブモードの有効/無効
reference_ageキャッシュの保存期間
request_header_max_sizeHTTPリクエストヘッダの最大サイズ
requiest_body_max_sizeHTTPリクエストボディの最大サイズ
reply_body_max_sizeレスポンスの最大ボディサイズ(0は無制限)
aclアクセス制御リスト
http_accsessアクセス制御リストの制御
auth_paramユーザ認証方式などの設定

squid.confの設定例は以下の通り。

# ネットワークオプション
http_port 8080
visible_hostname www.example.com

# cgi-binという文字列があればキャッシュを利用せず直接アクセス
hierarchy_stoplist cgi-bin ?

# 禁止するURLを正規表現で指定
acl QUERY urlpath_regex cgi-bin \?
# 上の設定にACLを適用
no_cachedeny QUERY

# キャッシュサイズの指定
chache_mem 20MB
# キャッシュ可能な最大ファイルサイズの指定
maximum_object_size 4096KB
# 最小オブジェクトの制限
minumum_object_size 0KB
# メモリ上の最大キャッシュサイズ
maximum_object_size_in_memory 8KB
# キャッシュする最大IPアドレス数
ipchache_size 1024

# キャッシュディレクトリとサイズなどの指定
# キャッシュディレクトリ  サイズ(MB) ディレクトリ数  サブディレクトリ数
cache_dir ufs /var/spool/squid 100 16 256
# クライアントのアクセスログ
cache_accsess_log /var/log/squid/accsess.log
# キャッシュのログ
cache_log /var/log/squid/cache.log
# ストレージマネージャの管理ログ
cache_log /var/log/squid/store.log

# 匿名FTPのパスワード
ftp_user passpass
# パッシブモードの有効
ftp_passive on

# HTTPリクエストヘッダの最大サイズ
request_header_max_size 10KB
# HTTPリクエストボディの最大サイズ
requiest_body_max_size 1MB
# レスポンスの最大ボディサイズ
reply_body_max_size 0

アクセス制御の設定

Squidのアクセス制限はaclhttp_accessで行う。 aclの場合は以下の書式。

acl acl名 ACLタイプ 文字列orファイル名

ACLタイプは以下の通り。

タイプ説明
srcクライアントのIPアドレス
dst代理アクセス先サーバのIPアドレス
srcdomainクライアントのドメイン名
dstdomain代理アクセス先サーバのドメイン名
port代理アクセス先のサーバポート番号
myportクライアントのポート番号
arpMACアドレス
protoプロトコル
methodHTTPのメソッド
url_regexURLにマッチする正規表現
urlpath_regexURLからプロトコルとホスト名を除いたパス名にマッチする正規表現
time有効な時刻の指定(例: 10:00-12:00)
proxy_authユーザ認証の対象

設定例は以下の通り。

acl all src 0.0.0.0/0.0.0.0
acl localhost src 127.0.0.1/255.255.255.255
acl clients src 192.168.0.0/255.255.255.0
acl denydomain dstdomain x.com twitter.com
acl blacklist url_regex "/etc/squid/url_blacklist.txt"
acl SSL_ports port 443 563
acl Safe_ports port 80 21 443 563 70 210 1025-65535
acl CONNECT method CONNECT

# Safe_ports以外のアクセスを禁止
http_access deny !Safe_ports
# SSL_ports以外のポートのCONNECTメソッドを禁止
http_access deny CONNECT !SSL_ports

http_access deny denydomain
http_access deny blacklist
http_access allow localhost
http_access allow clients
http_access deny all

9.4. Nginxとリバースプロキシ

Nginxは高速で動作する負荷に強いWebサーバ。 特徴としてリバースプロキシやメールプロキシの機能も持つ。

9.4.1. Nginxの設定

Nginxは1つのマスタープロセスと複数のワーカープロセスから構成される。

  • ワーカープロセス … クライアントからのHTTPリクエストを受け付け処理する
  • マスタープロセス … ワーカープロセスを管理するプロセス

Nginxの設定ファイルは/etc/nginx/nginx.confとなる。 CentOSにおけるNginxの主要設定ファイルは以下の通り。

ファイル説明
/etc/nginx/nginx.confメイン設定ファィル
/etc/nginx/conf.d/default.confデフォルトサーバの設定ファイル
/etc/nginx/conf.d/ssl.confSSLの設定ファイル
/etc/nginx/conf.d/virtual.confバーチャルホストの設定ファイル

設定はディレクティブに値を指定する形で記述する。

ディレクティブ 値;

ディレクティブ {
    ディレクティブ 値;
}

またnginx.confの基本構造は以下の通り。

events {
    # 接続処理に関する記述
}

http {
    # httpサーバの設定
    server {
        # HTTPサーバ毎の設定
        location パス {
            # URI毎の設定
        }
    }
}

mail {
    # メールプロキシ関連の設定
}

またnginxの主要なディレクティブは以下の通り。

ディレクティブコンテキスト説明
includeすべて値の設定ファイルを読み込む
http {}mainhttpサーバとしての設定
server {}mainバーチャルホストの設定
usermainworkerプロセスの実行ユーザ
worker_processesmainworkerのプロセス数(CPUコア数)
worker_connectionsevents1つのworkerプロセスが同時処理できる最大接続数
log_formathttpアクセスログの書式形式
access_loghttp,server,locationアクセスログのパスとログレベル
error_logmain,http,server,locationエラーログのパスとログレベル
listenserverリクエストを受け付けるポート番号
server_nameserverバーチャルホストのサーバ名
proxy_passlocationプロキシ先の指定
fastcgi_passlocationFastCGFIサーバの指定
fastcgi_paramhttp,server,locationFastCGIサーバに渡すパラメータの設定
location プレフィックス URIパス条件{}server, location条件マッチのリクエストURIの設定
keepalive_requestshttp,server,location一度の接続で受け付けできるリクエスト数の上限
keepalive_timeouthttp,server,locationキープアライブのタイムアウト時間
server_tokenshttp,server,locationバージョン番号の表示/非表示
roothttp,server,locationドキュメントルート
indexhttp,server,locationインデックスファイル
autoindexhttp,server,locationインデックスリストの表示/非表示
error_pagehttp,server,locationエラーコードとエラーページのURI
proxy_set_headerhttp,server,locationプロキシ先に送られるリクエストヘッダフィールドの再定義
proxy_pass_headerhttp,server,locationプロキシ先からクライアントへの通過を許可するヘッダフィールドの指定

9.4.2. リバースプロキシの設定

Nginxはリバースプロキシとしてもよく利用される。 リバースプロキシの設置によりWEBサーバの負荷が軽減できる。

設定例は以下の通り。

server {
    location /{
        proxy_page http://localhost:8080

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

nginxコマンド

nginx -tコマンドによりnginx.confファイルの構文をチェックできる。

nginx -t

# 設定の再読み込み
nginx -s reload

2.10 - 10.ファイル共有

Linuxのファイル共有(smb,cifs)、Sambaなどに関して

10.1. Windowsネットワーク

Microsoft系技術の基本であるWindowsネットワークの概念について一部記載する。

10.1.1. Windowsネットワークの基本概念

ワークグループとドメイン

ワークグループはWindowsネットワークの基本単位のこと。 コンピュータをまとめたグループの1つの単位となる。

ワークグループ

マスターブラウザ

マスターブラウザは同一ネットワーク内のコンピュータのリストを取り扱いまとめて管理するホストのこと。 これは「ネットワーク」-「マイネットワーク」で一覧表示されるネットワークデータを指す。

ネットワークセグメント内に必ず1つ存在し、他のホストはマスターブラウザより参照して利用する。 マスターブラウザとなるホストは自動的に選出される

NTドメイン/ADドメイン

  • NTドメイン
    • NTドメインはWindows NTで使用されるユーザ管理の仕組み
    • ネットワーク上のWindowsホストをドメイン単位でグループ化し、ドメインコントローラ(認証サーバ)でアカウント情報を集中管理する。
    • ドメインにログインしたユーザはドメイン内の共有リソースやプリンタに認証なしでアクセスできる。
  • ADドメイン
    • AD(Active Directory)ドメインはWindows 2000 Server以降に採用されているドメインサービスのこと。
    • NTドメインと異なり、複数ドメインを階層構造で管理できる。そのため大規模ネットワークにも対応している。

ドメインコントローラ

ドメインコントローラはドメインを管理するためのサーバのこと。 ドメイン内のユーザのログオン認証を行う。

ドメイン内にドメインコントローラが1つ以上存在することで機能を実現する。 ユーザアカウント/グループはドメインコントローラに登録されユーザはドメインコントローラにユーザ名とパスワードを送り認証する。 なお冗長化のためにドメインコントローラは複数用意できる。

NetBIOS

NetBIOSはWindowsネットワークで使われているネットワーク用APIのこと。 ネットワーク内のホストにそれぞれ異なる15Byteの名称を付けて識別し、この名称に1Byteの通信アプリケーション情報を追加したものがNetBIOS名となる。 WindowsはこのNetBIOS名により通信対象のソフトウェアを区別する。

またNetBIOSをTCP/IPで使う仕組みにNetBIOS over TCP/IPというものがある。 これはTCP/IPでNetBIOSをカプセル化してTCP/IP上でセッション確立する仕組み。

WINSはIPアドレスとNetBIOS名の名前解決を行う仕組みのこととなる。

SMB/CIFS

SMB(Server Message Block)はWindows OSにおけるファイル共有プロトコルの1つ。 Windows以外のOS、LinuxやMacでも使用することができる

SMBプロトコルは、クライアントとサーバー間でのファイルや印刷データの共有、およびそれらのシリアルポートを通じた通信をサポートしている。 2022年現在はSMBを拡張したCIFS(Common Internet File System)も使用されている。

SMBとCIFSの特徴は以下の通り。

比較項目SMBCIFS
下位プロトコルNetBIOSインターフェースTCP/IP
暗号化のサポートなしあり
サポート範囲LinuxやMacでも使用可能Windowsシステム特化

SMB/CIFSの用途は以下用途で使用できる。

  • ファイル共有
  • プリンタ共有
  • リモートアクセスとその管理

WINSサーバ

WINSサーバはNetBIOSとIPアドレスの名前解決を行うサーバのこと。 WINSに情報が存在しない場合はLMHOSTSファイルが名前解決に使用される。

LMHOSTSの構造は以下の通り。

192.168.1.1   LPICSV   #PRE   
192.168.1.2.  HOST1    #PRE   #DOM:LPIC

10.2. Sambaサーバの構築

10.2.1. Sambaサーバ

SambaはWindowsネットワークで使用されるSMB/CIFSプロトコルを利用してWindowsでのファイル共有の仕組みを提供するOSSソフトウェアのこと。 機能としてはファイル共有のほかに、プリンタ共有、認証機能も提供する。

提供できる機能は以下の通り。

  • ファイルサーバ機能
  • プリントサーバ機能
  • WINSサーバ機能
  • ドメインコントローラ
  • ActiveDirectoryメンバーサーバ
  • Microsoftネットワーククライアント

Sambaにてサーバ機能を提供するデーモンはsmbdnmbとなる。 smbdはファイルやプリンタの共有、ユーザの認証、nmbdはブラウズ機能、NetBIOSによる名前解決を提供する。

Sambaのバージョン

Samba3とSamba4の主な違いを以下に記載する。

機能Samba3Samba4
ドメインコントローラNTドメインのドメインコントローラ構築ができる(NTMLv2の使用、WINSサーバによる名前解決、LDAP連携の可能)ADドメインのドメインコントローラ構築ができる(Keroberos認証、DNSによる名前解決、LDAP内蔵)
ファイルサーバSMB2に対応SMB2,SMB3に対応

10.2.2. Sambaの基本動作

Sambaは以下の3つのプロセスから構成される。

  • smbd
    • ファイル共有、認証
  • nmbd
    • ブラウジング機能、NETBIOS名前解決、WINSサーバ
  • winbindd
    • Winbind機能

またSambaサーバが利用するポートは以下の通り。

ポート番号説明
137/UDPNetBIOS名前解決やブラウジングに使用
138/UDPNetBIOS名前解決やドメインログオンに使用
139/TCPファイル共有(Microsoft Direct Hosting SMBを利用していない場合)
445/TCPファイル共有(Microsoft Direct Hosting SMBを利用している場合)

Sambaの起動方法はSystemdのシステムでは以下の通り。

systemctl start smb.client
systemctl start nmb.service

SysVinitを採用したシステムでは以下の通り。

/etc/init.d/smb start

10.2.3. smb.conf

Sambaサーバの設定はsmb.confファイルで行う。 smb.confは全体設定、共有定義から構成される。

smb.confの構造は以下の通り。 コメントアウトは#;で可能。

# 全体設定
[global]
パラメータ名 = 値

# 共有定義
[homes]
パラメータ名 = 値

[printers]
パラメータ名 = 値

[セクション名1]
パラメータ名 = 値

[セクション名2]
パラメータ名 = 値

globalセクションの設定

globalセクションではsmaba全体の設定を行う。 なお変更後はsambaの再起動が必要となる。

主要な項目は以下の通り。

# Sambaサーバが所属するワークグループ名もしくはドメイン名を指定する
workgroup = ワークグループ名|ドメイン名

# Sambaサーバの動作モードを指定する
server role = 動作モード
# サーバ動作モード
# AUTO : securityパラメータの設定に従う(デフォルト)
# STANDALONE : スタンドアロンのサーバ
# MEMBER SERVER : ドメインのメンバーサーバ
# CLASSIC PRIMARY DOMAIN CONTROLLER : NTドメインのプライマリーコントローラ(PDC)
# CLASSIC BACKUP DOMAIN CONTROLLER : NTドメインのバックアップドメインコントローラ(BDC)
# ACTIVE DIRECTORY DOMAIN CONTROLLER : Active Domainのドメインコントローラ

# NetBios名の指定
netbios name = NETBios名

# サーバの名前や説明の指定
server string = コメント

# 接続を許可するホストの指定(記載されていないホストは接続拒否)
hosts allow = ホスト

# Guestアカウントの定義(アカウントが存在しないユーザにGuestとしてアクセスさせれる)
guest account = ゲストユーザ名

# Sambaユーザとして認証できない際の動作の指定
map to guest = Never | Bad User | Bad password
# Never: ゲスト認証の否認
# Bad User: 存在しないユーザの指定でゲスト認証とみなす
# Bad Password: Bad Userに加えてパスワード入力ミスの場合もゲスト認証とみなす

# ログファイルの指定(「%m」で接続元ホストごとにログを分けれる)
log file = ログファイル名

# ログファイルの最大サイズをKB単位で指定
max log size = サイズ

# ハッシュ値を用いた暗号化パスワードの使用を設定
encrypt passwords = Yes | No

# パスワード認証をsmbpassword方式で行う場合のパスワードファイルの指定
smb password file = パスワードファイルのパス

# SambaのパスワードとLinuxのパスワードを同期させるかの設定
unix password sync = Yes | No
passwd program = パスワードコマンドのパス
passwd chat = 期待させる文字列

# UNIXユーザを別ユーザ名とマッピングさせる
# 「UNIXユーザ名=Windowsマシンのユーザ名」のように記述
username map = マッピングファイル名

# ログオフ時に実行するスクリプトファイルの指定
logon script = スクリプトファイル名

# SambaサーバをWINSサーバとして動作させる場合にYesを設定
wins support = Yes | No

# WINSサーバのIPアドレスをIPアドレスを指定する
wins server = IPアドレス

共有の設定

globalセクション以降では個々の共有設定を行う。

主要な項目は以下の通り。

# コメントの指定
comment = コメント

# ブラウジングしたときの表示設定
browseable = Yes | No

# 書き込みの許可設定
writeable = Yes | No
read only = No | Yes

# 共有ディレクトリのパスを指定
path = ディレクトリのパス

# 共有内に作成するファイル/ディレクトリの所有者/グループを強制的に変換
force user = ユーザ名
force group = グループ名

# 書き込みが例外許可されるユーザ/グループの指定
write list = ユーザ名 | @グループ名

# 「.」で始まる名前のファイル/ディレクトリを表示しないように隠し属性の適用の指定
hide dot files = Yes | No

# 任意の名前のファイルやディレクトリを表示させたくない場合に指定。「/」で複数指定可能。
veto files = /ファイル名/

# 共有内にファイルやディレクトリを作成する場合のパーミッション設定
# ファイルに適用可能なパーミッション(Default:0744)
create mask = mode
# ディレクトリに適用可能なパーミッション(Default:0755)
directory mask = mode
# 必ずファイルに適用されるパーミッション(Default:0000)
force create mode = mode
# 必ずディレクトリに適用されるパーミッション(Default:0000)
force directory mode = mode

# アクセス可能ユーザの指定
valid users = ユーザ名

# Guestユーザのログイン許可の指定
guest ok = Yes | No
public = yes | No

SambaサーバをADドメインに参加させる設定

SambaサーバをActive Directoryドメインに参加させる際には以下設定が必要となる。

設定項目説明
workgroup=ADドメインのNetBios名ADドメインのNetBIOS名の指定
realm=レルム名ADのドメイン名の指定(FDQNで指定)
security=動作モードsambaの動作モードの指定(adsと指定)
[global]
workgroup = SAMPLE
realm = SAMPLE.LOCAL
security = ads

なおレルム名はKerberos認証(ユーザが1つの認証で複数台のサーバへアクセスできるシングルサインオン)が管理する範囲のことを指す。 これはActive Directoryが認証にKerberosを使用することに起因する。

またActive Directoryドメインに参加するにはnet ads joinコマンドを実行する。

net ads join -U ユーザ名

homesセクションの設定

homeセクションはUNIXユーザの各ホームディレクトリを一括で共有するためのセクション。 そのため個々のユーザごとにホームディレクトリの共有を定義する必要はない。

printersセクションの設定

printersセクションは共有プリンタに関する設定を行うセクション。 複数プリンタがある場合も1つの設定のみで完結する。

# Yesならばファイル共有ではなくプリンタ共有として扱う
print ok = Yes | No
printable = Yes | No

個々の共有設定

共有フォルダ/共有プリンタなどネットワークで共有されるものは共有リソースと呼ばれる。 「globals」「homes」「printers」は予約語となっているが、それ以外は任意に作成可能。

共有名の最後に$をつけるとブラウズしても見えない隠し共有となる。

testparmコマンド

testparmコマンドはsmb.confの構文にミスがないかを調べるもの

testparm [オプション] [設定ファイル]
オプション説明
-s構文チェック後にsmb.confを表示
-vデフォルトパラメータの表示

なおSambaはSyslogを介さずにログを処理する。 smbdのログはlog.smbd、nmbdのログはlog.nmbdの保存される。

10.2.4. 設定に関する注意事項

マスターブラウザ

マスターブラウザはワークグループ単位/ドメイン単位で存在し、自動的に選出される。 なおOSレベルという値により算出され、OSレベルが高いほど算出優先度が高くなる。 Sambaサーバに33以上を設定すれば、優先的に選ばれる。

# ローカルマスターブラウザに選出されないようにする
local master = Yes | No

# ローカルマスターブラウザの選出に参加する
domain master = YeS | No

# ブラウザ選定を促す
preferred master = Yes | No | Auto

# OSレベルの設定
os level = 数値

認証の設定

認証方法はsecurityで設定を行う。 なおデフォルト値はUSERとなる。

security = USER | DOMAIN | ADS
# USERではsmbpasswdファイルなどを使い認証
# DOMAINではドメインコントローラに認証情報を送り認証(NTLM認証)
# ADSではActive DirectoryドメインにKerberos認証を使いログオフする

10.2.5. Sambaユーザの管理

security = USERの場合はUNIXシステムアカウントとは別に、Samba利用者用のユーザアカウントも必要となる。 なお作成には対応するUNIXユーザも必要になる。

Samba4ではユーザ情報が格納されるデータベースとして以下の4種類が使用可能。 またMySQLやPostgreSQLなどもユーザ情報格納に使用可能。

  • smbpasswd
    • Samba2.2系での利用形式
    • テキスト形式のパスワード(/etc/samba/smbpasswdなど)に1行つ図保存
    • 使用にはpassdb backend = smbpasswdとsmb.confに指定
  • tdbsam
    • バイナリ形式でデータベースファイル(/etc/samba/passdb.tdbなど)に保存
    • Sambaで使えるユーザ情報の全項目を格納可能
    • 使用にはpassdb backend = tdbsam:/etc/samba/passdb.tdbとsmb.confに指定
  • ldapsam
    • LDAPサーバにユーザ情報を格納する(LDAPサーバが必要)
    • 多数ユーザを扱う場合に向いている手法
    • 使用にはpassdb backend = ldapsam:ldap://LDAPサーバ名[:ポート番号]とsmb.confに指定

pdbeditコマンド

Samba3.0以降で利用できるユーザ管理コマンド。

pdbedit [オプション] Sambaユーザ名
オプション説明
-LSambaユーザ一覧表示
-aSambaユーザ追加
-xSambaユーザ削除

smbpasswdコマンド

Sambaユーザのパスワード変更を行うコマンド。

smbpasswd [オプション] [Sambaユーザ名]
オプション説明
-dSambaユーザの無効化
-eSambaユーザの有効化
-xSambaユーザの削除

10.2.6. Sambaの管理コマンド

smbstatusコマンド

Sambaサーバに接続されているクライアント、使用中の共有、ロックされているファイルを確認できるコマンド。

smbstatus

nmblookupコマンド

NetBIOS名を問い合わせたり、NetBIOS名からIPアドレスを検索したりできるコマンド。

nmblookup [オプション] NetBIOS名orIPアドレス、ワークグループ名
オプション説明
-A引数をIPアドレスとみなす
-Mマスターブラウザの検索

10.2.7. Sambaクライアント

Sambaサーバはサーバ機能のみではなく、LinuxがWindowsネットワーク上の共有リソースにアクセスするためのクライアント機能も提供する

smbclientコマンド

SambaサーバやWindowsホストにより提供される共有リソースを利用できるコマンド。

smbclient [オプション] 接続先
オプション説明
-Lリスト表示の要求
-N認証を行わない
-U ユーザ名接続ユーザの指定
サブコマンド説明
cd ディレクトリディレクトリを移動する
del ファイルファイルの削除
dirファイルリストの表示
exitsmbclientの終了
get ファイルファイルの取得
mget ファイル複数ファイルをまとめて取得
mkdir ディレクトリディレクトリの作成
mput ファイル複数ファイルをまとめてサーバに転送する
lcd ディレクトリローカル側のディレクトリに移動
put ファイルファイルをサーバに転送
rmdir ディレクトリディレクトリを削除する

使用例は以下の通り。

# 共有リソースの一覧表示
smbclient -L 192.168.1.2

# winhostの共有リソースpublicへのアクセス
smbclient //winhost/public

# 共有ディレクトリ/publicを/mnt/publicにマウント
mount -t cifs //winhost/public /mont/public

smbcontrolコマンド

Sambaの主要なデーモンであるsmbd、nmbd、winbinddにメッセージを送ることができるプログラム。

smbcontrol [対象] [メッセージタイプ]
メッセージタイプ説明
close-share指定した共有をClose
reload-config指定したデーモンに設定の再読み込みさせる
kill-client-ip指定したIPアドレスのクライアントを切断
ping = 指定した対象にpingし応答が来た対象のPIDを表示

なお/etc/init.d/winbindd restartでもwinbinddに設定ファイルを再読み込みは可能。

samba-toolコマンド

Samba4での管理のメインツールとなるコマンド。 ドメイン(AD等)の管理、DNSの管理の他、セキュリティ関連の操作やユーザー管理等も行える。

samba-tool <サブコマンド>
サブコマンド説明
dnsDNS管理
domainドメイン管理
testparm設定ファイルの構文チェック
userユーザ管理

10.3. NFSサーバの構築

10.3.1. NFS

NFS(Network File System)はネットワークを介してファイルを共有する仕組み。 Unix系OS同士のファイル共有にはNFSが使用される。

NFSサーバが公開したディレクトリはNFSクライアントがマウントすることでリモートファイルシステムをローカルファイルシステム同様に扱うことができる。 NFSサーバを実現するには以下の3つのサービスが必要となる。

サービスサーバクライアント説明
portmap必要必要RPCプログラム番号をTCP/IPポート番号に変換
nfsd必要不要ファイルシステムのエクスポート及びクライアント要求処理
mountd必要不要リモートファイルシステムのマウント/アンマウント

RPC(Remote Proceduce Call)はネットワーク上にあるリモートホストに機能を別のホストから使えるようにする仕組みのこと。 RPCサービスにはRPCプログラム番号が付けられている。対応表は/etc/rpcで確認可能。

RPCサービスが利用するTCP/UDPポートは動的に割り当てられるため、RPCクライアントの利用にはポート番号を確認する必要がある。 portmapはRPCプログラム番号とポート番号のマッピングを行うサービスとなる。

なおportmapはTCP Wrapprでアクセス制御することが可能。 NFSを利用する際の推奨設定(サービス提供範囲の限定)は以下のように行う。

portmap: 192.168.3.

NFSv3/NFSv4

NFSv4の特徴は以下の通り。

  • ポート番号が2049番固定
  • idimapdサービスによりUIDの考慮が不要
  • ルートディレクトリがエクスポートされているように見える

rpcinfoコマンド

RPCサービスの状況を確認するコマンド。

rpcinfo オプション [ホスト名]
オプション説明
-p指定したホストで動作するRPCサービス一覧の表示

10.3.2. NFSサーバの設定

NFSサーバで特定のディレクトリを公開することはエクスポートと呼ばれる。 エクスポートするディレクトリは/etc/exportsに記述する。

記述例は以下の通り。

/share      172.16.0.0/255.255.0.0(rw)
/public     *.local.jp(ro) local(rw,nor_root_squash)

また/etc/exportsのオプションは以下の通り。

オプション説明
ro読み取り専用でエクスポートする
rw読み取り/書き込み属性でエクスポート
no_root_squashrootアクセス時にroot権限で実行
root_squashrootアクセス時に匿名アカウント権限で実行(デフォルト設定)
all_squashすべてのアクセスを匿名アカウント権限で実行

NFSサーバの注意点としてUIDを統一するべき。(UNIXのUIDがそのままNFSサーバでも使用されるため) そうしないと別ユーザとして認識される場合がある。

exportsコマンド

現在のエクスポート状況の表示、/etc/exportsの変更を反映させるコマンド。

exports [オプション] [ホスト:パス]
オプション説明
-aすべてのディレクトリのエクスポート/アンエクスポート
-rすべてのディレクトリの再エクスポート
-Uアンエクスポート
-v詳細に表示

showmountコマンド

NFSサーバのディレクトリをマウントしているNFSクライアントを調べることができるコマンド。

showmount [オプション] [ホスト]
オプション説明
-aクライアントのホスト名とマウントしているディレクトリの表示
-e指定したホストでエクスポートしているディレクトリの表示

nfsstatコマンド

NFSの統計情報を表示するコマンド。

ntfsstat [オプション]
オプション説明
-sNFSサーバ側の統計のみを表示
-cNFSクライアント側の統計のみを表示
-nNFSの統計のみを表示
-rRPCの統計のみを表示
-o netネットワーク層の統計表示

10.3.3. NFSクライアントの設定

NFSを使いリモートファイルシステムをマウントするにはmountコマンドを使用する。 ファイルシステムタイプにはnfsを指定する。

mount -t nfs filerever:/public /mnt/nfs/public

またNFSをマウントする際のオプションは以下の通り。

オプション説明
bgマウント失敗時もバックグラウンドで試行し続ける
fgマウントをフォアグラウンドで行う
softソフトマウントを行う
hardハードマウントを行う
intrハードマウント時の割り込みを許可
retransソフトマウントの場合の再試行回数
rsize=バイト数読み取りのブロックサイズ
wsize=バイト数書き込みのブロックサイズ

ソフトマウントとハードマウントはNFSサーバがクラッシュしたり障害が起きた際のNFSサーバが応答がない場合の動作が異なる

  • ソフトマウント
    • NFSサーバが応答しない場合タイムアウトになる
  • ハードマウント
    • ハングアップしているように見える
    • 応答があるまで要求を再試行し続ける
    • これを設定する場合はinitrオプションも指定する必要ある

起動時に自動マウントするには/etc/fstabに追加しておく。

filesvr:/pub /mnt/nfs/pub nfs rw 0 0

2.11 - 11.ネットワーククライアントの管理

DHCPやディレクトリサービスであるLDAPに関して

11.1. DHCPの設定

11.1.1. dhcpdの設定

DHCPサーバにはdhcpdが、DHCPクライアントにはdhclient,pump,dhcpcdが利用される。 dhcpdの設定はdhcpd.confで行う。

項目説明
option domain-nameドメイン名
option domain-name-serversDNSサーバ
option routesDGWのIPアドレス
option subnet-maskサブネットマスク
option broadcast-addressブロードキャストアドレス
option ntp-serversNTPサーバのIPアドレス
option nis-domainNISドメイン名
option nis-serversNISサーバのIPアドレス
option netbios-name-serversWINSサーバのIPアドレス
default-lease-timeDHCPクライアントが期限を求めない場合のデフォルトリース期間
max-lease-timeDHCPクライアントが上限を求めた場合の最大リース期間
range [dynamic-bootp]クライアントに割り当てるIPアドレス範囲
hostクライアントで固定IPアドレスを使用
fixed-address固定で割り当てるIPアドレス
hardwareクライアントを特定するためのMACアドレス

dhcpdの設定例は以下の通り、サブネットごとに設定を記述する。

subnet 192.168.0.0 netmask 255.255.255.0 {
    option routers 192.168.0.1;
    option subnet-mask 255.255.255.0;
    option nis-domain "example.net";
    option domain-name "example.net";
    option domain-name-servers 192.168.1.1, 192.168.2.1;
    option ntp-servers 192.168.1.1;
    option netbios-name-servers 192.168.1.1;

    range 192.168.0.128 192.168.0.254;
    defaut-realse-time 21600;
    max-lease-time 43200;

    host hostmachine1 {
        hardware ethernet 01:23:34:2A:89:0A;
        fixed address 192.168.0.100;
    }

}

サブネット毎の設定

サブネットごとに割り当てるIPアドレス範囲や特定のマシンに固定IPアドレスを割り当てる設定を行う。 固定IPアドレスの割り当てはMACアドレスで識別を行う。

リース期間

リース期間はIPアドレスをクライアントに貸し出す期間のこと。 指定は秒数で指定する

なおdhcpdが貸し出しているIPアドレスはdhcpd.leasesに記録される。 作成はtouch /var/lib/dhcop/dhcpd.leaseなどで行える。

11.1.2. DHCPクライアントの設定

クライアント側でDHCPを有効にするには設定を行う必要がある。 またdhclientコマンドでもIPアドレスの取得が可能。

RedHat系の場合

/etc/sysconfig/network-scripts/ifcfg-eth0などで以下のように設定する。

BOOTPROTO=dhcp

Debian系の場合

/etc/network/interfacesなどで以下のように設定する。

iface eth0 inet dhcp

11.1.3. DHCPリレーエージェント

DHCPリレーエージェントは異なるネットワーク間でDHCPサーバを利用する際に設定するプログラムのこと。 使用するデーモンはdhcrelay

設定例ではIPアドレスが172.16.0.2のDHCPサーバにeth1で受け取ったDHCPリクエストをリレーする設定例。

dhcrelay -i eth1 172.16.0.2

11.1.4. IPv6アドレスの自動設定

IPv6の場合はDHCPを使わずにIPアドレスの自動設定ができる。 これはIPv6の仕組みが以下のようになっているからである

  1. IPv6クライアントはIPv6ルータにルータ要請(RS)を送信
  2. IPv6ルータはルータ通知(RA)をIPv6クライアントに返送
  3. IPv6クライアントはルータ情報(prefix)と自身のMACアドレスから生成されるインターフェースIDよりIPv6アドレスを生成する

LinuxではradvdパッケージによりRAを送信できるようにすることができる。 設定ファイルは/etc/radvd.confとなり以下のように記述する。

inteface eth0 {
    AdvSendvert on; #RAの定期的送信の有効化
    prefix 2001:db8:0:1::/64; #ローカルアドレス
}

11.2. PAM

11.2.1. PAMの仕組み

PAMはプログラムに対してユーザ認証をするための機能を提供する仕組み。 PAMによりプログラム自体がユーザ情報を/etc/passwdにあるか別のホストにあるかを気にせずに設定できる。 認証方法は設定ファイルの編集をするだけで可能で、特定ユーザのみの認証などもできる。

11.2.2. PAMの設定

PAMの設定ファイルは/etc/pam.dディレクトリに配置さ、ユーザ認証を行うプログラムごとにファイルが用意されている。 またPAM設定ファイルの書式は以下の通り。

モジュールタイプ コントロール モジュールパス 引数
項目説明
モジュールタイプモジュールが用いる認証の型
コントロール認証の成功/失敗時の処理を指定
モジュールパスどのモジュールを使うか指定
  • モジュールタイプ
    • auth … ユーザ認証を行う
    • account … ユーザ認証ができるか確認
    • password … ユーザの設定と変更に使用
    • session … ユーザ認証の前後に処理する内容を指定
  • コントロール
    • requisite … モジュールの実行に失敗したら認証拒否する
    • required … モジュールの実行に失敗してもすぐに拒否せず、同じモジュールの実行完了後に認証を拒否する
    • sufficient … モジュールの実行に成功した場合、上位のrequiredがすべて成功の場合認証を成功とする
    • optional … optionalを指定したモジュールタイプが1つだけの場合を除いてPAMに影響を与えない
    • include … 指定したファイルの設定を読み込んで処理する
    • substack 指定した設定を読み込んで処理する(認証の成否は指定したファイル内で完結し、1モジュールとしてカウントする)

またPAMモジュールは以下の通り。 PAMモジュールは/lib/security/lib64/securityに保存される。

PAMモジュール説明
pam-cracklib.soパスワード安全性の向上
pam_pwquality.soパスワード安全性の向上(RHEL7やCentOS7から使用)
pam_env.soユーザログイン時の環境変数の初期設定
pam_deny.so認証に対し常に失敗を返す
pam_limits.soユーザが利用できるリソースの制限
pam_listfile.soファイル内容に基づきサービスの許可/非許可
pam_nologin.so/etc/nologinファイルがあるとき一般ユーザのログインを拒否する
pam_pwdb.so/etc/passwd,/etc/shadow,NISを使ったユーザ認証/パスワード変更を行う
pam_rootok.sorootユーザによるアクセス許可をする
pam_secirty.so/etc/securityファイルに記載された端末のみrootログインの許可
pam_stack.so他のPAM設定ファイルをincludeする
pam_succedd_if.so特定のファイル属性をチェックしてサービス許可する
pam_unix.so通常のパスワード認証を行う
pam_ldap.soLDAP認証を行う
pam_warn.so認証時/パスワード変更時のログ出力する
pam_sss.soSSSDを使った認証を行う
pam_wheel.soroot権限アクセスをwheelグループメンバーのみに制限する

11.3. LDAP

11.3.1. LDAPとは

LDAPはネットワーク機器やユーザーID、パスワードを管理するディレクトリサービスの維持やアクセスを行うプロトコルのこと。 堅く言うと、X.500をベースとしたディレクトリサービスに接続するために使用されるプロトコルでDAPを軽量化したものともいえる。

一般的にLDAPは一元管理の認証サーバを構築する際に使用される。 LDAPによりユーザやリソースに関する情報を検索したり管理することができる。

なお、OpenLDAPの設定方法は、OpenLDAP2.3以降、テキストの設定ファイルから起動時に設定を読み込む一般的な方法から、LDAPを使った動的な設定方法に変更されている。

LDAPの概念

LDAPではデータをオブジェクトとして扱う。 オブジェクトとは現実世界に存在する何らかの実体をコンピュータ上で表したもの。

  • エントリ
    • LDAPでのオブジェクトの単位のこと
    • それぞれのエントリはオブジェクトクラスに属する
    • 下位のエントリを分類する目的のみに使用するエントリはコンテナと呼ばれる
  • 属性
    • エントリ(オブジェクト)が持つ情報を表すもの
    • 属性は属性名と属性値から構成される
  • DIT(ディレクトリ情報ツリー)
    • エントリ間の関係を階層構造(木構造)で表したもの

LDAP

11.3.2. LDAPの仕組み

ディレクトリ情報ツリーと識別名

LDAPでは情報はDIT(ディレクトリ情報ツリー)という階層に格納される。 ディレクトリ情報ツリー内のエントリ識別には識別名(DN)を使用する。 識別名はエントリ属性名とその値から構成される相対識別名を「,」でつないだもの、以下のように格納される。

uid=student,ou=IEducation,dc=CCNA,dc=ja

DIT上にあるエントリを識別するための識別子には、DN(Distinguished Name)とRDN(Relative Distinguished Name)がある。

LDIF

LDIFはディレクトリ内の情報を記述するファイル形式のこと。 LDAPサーバにディレクトリ情報を登録、変更する場合に使用されrる。

記法は以下の通り。

dn: 識別名
属性名: 値
属性名: 値
   :    

LDIFファイルでは最初の行でエントリの識別名(DN)を記述する。 また、複数のエントリを記載する場合は空行で区切り、コメントは行頭に「#」をつける。

なお、属性値は通常UTF-8のテキストで記載するが、バイナリデータなどの特殊なデータを指定する場合は「属性名::属性値」のようにし、属性値にはBase64でエンコードした値を指定する。

オブジェクトクラス

オブジェクトクラスはオブジェクトが持つべき属性(情報)を定義したもの

LDAPでのオブジェクトの単位であるエントリは、必ずオブジェクトクラスに属する。オブジェクトクラスによってエントリの実体(エントリが人を表すのか、組織を表すのかなど)が決定される。

オブジェクトクラスは以下の通り。

種類説明
ABSTRACT他のオブジェクトクラスを定義するための基底クラス
STRUCTURAL人や組織などを表すオブジェクトクラス
AUXILIARY構造型クラスと共に用いるイブジェクトクラス

スキーマ

スキーマはオブジェクトや属性の定義のこと。 LDAPでは様々なスキーマが事前に登録されており、/etc/openldap/schemaに格納されている。

主なスキーマファイルは以下の通り。

スキーマファイル説明
core.schemaOpenLDAP必須のスキーマ
cnやouなどの基本的属性が定義されている
cosine.schemaディレクトリサービスのX.500規格で規定された属性が定義されたスキーマ
inetorgperson.schemaアドレス帳/個人情報を扱うためのスキーマ
nis.schemaUnix/Linuxユーザ/グループ情報を扱うためのスキーマ

属性名

主な属性は以下の通り。

属性名説明
dn識別名
objectClassオブジェクトクラス
c国名
cn一飯名称
dcドメイン構成要素
mailメールアドレス
o組織名
ou部署などの組織単位
sn苗字
telephoneNumber電話番号
uidユーザのログイン名
uidNumberユーザID

オブジェクト識別子

オブジェクトクラスや属性にはオブジェクト識別子(OID)が割り振られる。 OIDは全世界で重複しないようにIANAにより管理されている。

新しいオブジェクトクラスや属性を作成するためにスキーマファイルを作成・拡張する場合は、IANAから一意のOIDを取得する必要がある。

ホワイトページ

ホワイトページは個人別電話帳のことを指す。 LDAPによりホワイトページを作成し個人別データを登録するとメーラなどのネットワーク経由で電話番号など情報検索が可能。

ホワイトページの使用にはinetorgperson.schemaで定義されたinetOrgPersonクラスを使用するのが一般的となる。

11.3.3. Open LDAPの設定

LinuxでLDAPを使用するにはOpenLDAPが一般的に使用される。 サーバデーモンはslapdとなる。

また設定ファイルは/etc/openldap/slapd.confとなる。 設定ファイルの例は以下の通り。

# スキーマ定義ファイルのInclude
include   /etc/openladp/schema/corba.schema
                 :
                 :

# DBの形式
database bdb

# 管理するディレクトリのトップエントリ
suffix "dc=study,dc=jp"

# ディレクトリ管理者のDN
rootdh "cn=Manager,dc=study,dc=jp"

# ディレクトリ管理者のパスワード
rootpw [SSHA]5en8MexzhkJ90K0myuY/BfQ=

# LDAPデータベースの格納ディレクトリ
directory /var/lib/idap

# LDAPのインデックス登録
index objectClass eq.pres
index ou,cn,mail,surname,givenname eq,pres,sub
                    :
                    :

slapd.confの設定項目は以下の通り。

設定項目説明
includeスキーマファイルなど別のファイルを読み込む
databaseディレクトリデータを格納するBackENDデータベースの形式指定
suffix管理するディレクトリのトップエントリの指定
rootdnディレクトリ管理者のDNを指定する
rootpwディレクトリ管理者のパスワードを指定する
directoryLDAPデータベースの格納ディレクトリのパス指定
index検索用インデックスを作成する属性とインデックスの種類の指定

アクセス制御

OpenLDAPではエントリ/属性に対しアクセス制御(ACL)できる。

accsess to アクセス制御対象
    by 接続元 アクセスレベル
アクセス制御対象説明
*すべてのエントリ
attrs=属性指定した属性のみ
dn=DN指定したDNのみ
接続元説明
*すべてのユーザ
annonymous認証前のユーザ
users認証されたユーザ
self接続中の認証済みユーザ自身
dn=DN指定したDNユーザ
アクセスレベル説明
write属性値を変更できる
read検索結果を参照できる
search検索できる
compare比較できる
auth認証を受けることができる
noneアクセスできない

設定例は以下の通り。

# userPassword属性に対し、管理DNとユーザ自身による更新は許可、ユーザ認証前ユーザは認証のみ許可、それ以外のユーザはアクセス禁止する例
access to attrs=userPassword
       by dn="cn=Manage,dc=study,dc=jp" write
       by self write
       by annonymous auth
       by * none

LDAPの起動

slapdの起動は以下のようにする。

/usr/local/etc/libexex/slapd

SysVinitのシステムでは以下のように起動。

/etc/init.d/slapd start

systemdのシステムでは以下の通り。

systemctl start slapd.service

slappasswdコマンド

slapd.confファイルのrootpwに関する管理者パスワードを作成するコマンド。 サーバ管理者のパスワードをハッシュ化して生成する。

slappasswd

slapcatコマンド

LDAPデータベースの内容をLDIF形式で出力するコマンド。

slapcat > ldapdb.ldif

slaptestコマンド

設定ファイルslapd.confの構文をチェックするコマンド。

slaptest

slapaddコマンド

LDIFデータをLDAPデータベースにリストアするコマンド。

slapadd -l ldapdb.ldif
オプション説明
-v詳細表示
-d 数デバッグレベルの指定
-f ファイル設定ファイルの指定
-cエラー時も処理を継続
-n 数使用するデータベースをDB番号で指定
-b DN使用するデータベースをDNで指定

slapindexコマンド

データベースのインデックスを再構築するコマンド。 slapaddコマンドの後に実行する。

slapindex

11.3.4. LDAPクライアントの利用

LDAPクライアントコマンドには以下のようなコマンドがある。

コマンド説明
ldapaddエントリを追加する
ldapsearchエントリを検索する
ldapdeleteエントリを削除する
ldapmodifyエントリを変更する
ldappasswdパスワードを変更する

ldapaddコマンド

エントリを追加するコマンド。 追加するには/tmp/test.ldifにLDIFで記述してからコマンドを実行して追加する。

ldapadd <オプション>
オプション説明
-h ホストLDAPサーバの指定(デフォルトはローカルホスト)
-xSASLを使わず簡易認証を用いる
-D バインドDN認証に利用するDNを指定する
-W認証時のパスワードを対話的に入力する
-w パスワード認証時のパスワードを指定する
-f ファイル名LDIFファイルの指定

ldapdeleteコマンド

LDAPサーバに登録されたエントリを削除するコマンド

ldapdelete 

ldapsearchコマンド

エントリを検索するコマンド。

ldapsearch <オプション> 検索フィルタ <出力属性>
オプション説明
-h ホストLDAPサーバの指定
-H URILDAPサーバの指定をldapurlで指定
-xSASLを使わず簡易認証を用いる
-D バインドDN検索を開始するDNを指定する
-L検索結果をLDIFv1形式で表示する
-LL検索結果をコメントなしで表示する
-LLL検索結果をコメントとLDAPバージョン表示なしで表示する
-b 識別名検索開始位置の指定

ldapsearchコマンド

LDAPサーバのエントリを検索するコマンド。

ldapsearch [オプション] 検索条件 [出力属性]
オプション説明
-h ホスト名/IPアドレス検索を行うLDAPサーバを指定
-H URI検索を行うLDAPサーバをldapuri形式で指定
-xSASLを使用せずに簡易認証を行う
-b 識別名検索開始位置の指定
-L検索結果をLDIFv1形式で表示
-LL検索結果をコメントなしで表示
-LLL検索結果をコメントとLDAPバージョン表記なしで表示

11.3.5. slapd-config

OpenLDAP2.3以降の設定方法はslapd-configと呼ばれる。 この方法ではLDAPのデータベース(ディレクトリ)に保存されている設定データを追加・変更・削除等することで、動的に設定を更新する。 これはディレクトリベースの設定と呼ばれ、通常は設定変更による再起動等が不要となる。

また、設定データベースのツリー構造のルートは、DN(識別名)がcn=configで定義され、変更できない。 設定を行う際は設定用のLDIFファイルを定義し、ldapaddldapdeleteldapmodifyといったコマンドにより、データベースを更新する。

グローバルセクションに使用する主なディレクティブ

グローバルセクションに使用する主なディレクティブは以下の通り。

slapd.confディレクティブslapd-configディレクティブ説明
argsfile ファイル名olcArgsFileslapdデーモン起動時のコマンド引数を格納するファイルの指定
pidfile ファイル名olcPidFileslapdのプロセスIDを格納するファイルの指定
include ファイル名olcInclude読み込む設定ファイルのを指定
logfile ファイル名olcLogFileデバックログの出力ファイルを指定
loglevel 数olcLogLevelログレベルの指定
idletimeut 秒数olcIdleTimeoutアイドル状態のクライアント接続を強制的に切断するまでの秒数指定
timelimit 秒数olcTimeLimitslapdが検索要求の応答に使う最大秒数の指定

データベースセクションで使用する主なディレクティブ

slapd.confとslapd-configのデータベースセクションで使用する主なディレクティブの対応表は以下の通り。

slapd.confディレクティブslapd-configディレクティブ説明
database 種類orcDatabaseバックエンドデータベースの種類を指定
suufix DNorcSuffixディレクリのトップとなるDNの指定
rootdn DNorcRootDNデータベース管理者のDNの指定
rootpw パスワードorcRootPWデータベース管理者のパスワードを指定
index 属性名 種類orcDbindex属性に作成するインデックスの種類の指定
dircetory ディレクトリorcDbDirectoryデータベースファイルを格納するディレクトリの指定

slapd-configで使用される基本的なディレクティブ

slapd-configで使用される基本的なディレクティブは以下の通り。 なお「olc」という文字は「OpenLDAP Configuration」の略となる。

ディレクティブ説明定義されるエントリと説明
orcLogLevelsyslogに出力するレベル指定
orcLogLevel:
cn=config
サーバ全体に適用
必須オブジェクトクラス: orcGlobal
orcIncludeincludeファイルを指定
orcInclude <ファイル名>
cn=include
slapd.confのincludeファイル用
必須オブジェクトクラス:orcIncludeFile
orcAttributeTypes属性名の定義
orcAttributeTypes: <属性名>
cn=schema
組み込みのスキーマ定義
必須オブジェクトクラス:orcSchemaConfig
orcObjectClassesオブジェクトクラスを定義
orcObjectClasses: <オブジェクトクラス>
cn=schema
組み込みのスキーマ定義
必須オブジェクトクラス:orcSchemaConfig
orcBackendバックエンドの指定
orbBackend = <タイプ>
必須オブジェクトクラス: orcBackendConfig: [type]
typeはbdb,config, ldap, ldif, passwdがある

slapd-configのアクセス権の設定

olcAccessディレクティブを用いてバインドしたDN(ユーザ)に応じたアクセス権の設定を行える。

olcAccess: to アクセス対象 by 要求者 アクセス権 by 要求者 アクセス権 ...

なお、複数行にまたがって記述する場合は2行目以降の行頭にスペースを入れる

olcAccess: to アクセス対象
 by 要求者 アクセス権
 by 要求者 アクセス権
アクセス制御対象説明
*すべてのエントリ
attrs=属性指定した属性のみ
dn=DN指定したDNのみ
filter=検索フィルタ検索フィルタにマッチするエントリ
接続元説明
*すべてのユーザ
annonymous認証前のユーザ
users認証されたユーザ
self接続中の認証済みユーザ自身
dn=DN指定したDNユーザ
アクセスレベル説明
write属性値を変更できる
read検索結果を参照できる
search検索できる
compare比較できる
auth認証を受けることができる
noneアクセスできない

11.4. SSSD

SSSDはLDAPなどの認証サービスとの通信を管理/情報をキャッシュする仕組み。 これによりLDAPサーバダウン時の可用性の向上や負荷を軽減することができる。

SSSDに設定は/etc/sssd/sssd.confで行う。

[sssd]
config_file_version = 2
services = nss, pam
domains = LDAP

[nss]
filter_users = root,dnsmasq,dbus,bin,daemon,games,gdm,lp,mail,mysql,news,ntp,openldap,sshd,sync,sys
filter_groups = root
homedir_substring = /home

[pam]

[domai/LDAP]
id_provider = ldap
ldap_uri = ldap://ldap.test.com:389
ldap_search_base = dc=test,dc=com
ldap_tls_reqcert = never
ldap_id_usb_start_tls = true
ldap_tls_cacert = /etc/pki/tls/certs/ca-bundle.crt

ldap_schema = rfc2307

cache_ceredentials = true
enumerate = true

sssdサービスはsystemctl start sssd.serviceで可能。 また/etc/nsswitch.confで以下のようにSSSDを参照するようにする。(sssと記述する)

passwd: files sss
shadow: files sss
group:  files sss

2.12 - 12.メールサービス

Linuxのメールシステムやpostfix,Sieveなどに関して

12.1. SMTPサーバの構築

12.1.1. メールの仕組み

メールを処理するソフトウェアにはMTA(メッセージ転送エージェント)、MDA(ローカルメール転送エージェント)、MUA(メールユーザエージェント)がある。MUAはメーラ(メールソフトウェア)となる。

  • MUA(Mail User Agent):メールの確認や作成を行うユーザインタフェース
  • MTA(Mail Transfer Agent):メールの転送
  • MDA(Mail Delivery Agent):メールの配送(仕分け)

メール

メール転送のフローは以下の通り。

  1. MUAからメールサーバMTAはメールを受け取る
  2. メールサーバMTAはDNSサーバに問い合わせ配送先のメールサーバMTAを調べて転送する
  3. 配送先メールサーバMTAがメールを受け取るとMDAにより宛先ユーザのメールボックスにメールを収納する
  4. 受取先ユーザはPOPサーバやIMAPサーバ経由でメールボックスからメールを取り出す

MUAからメールをMTAに送信するとき、MTA間でのやり取りはSMTPが使用されるため、MTAはSMTPサーバと呼ばれる。 MUAがメールを受け取る際はPOPやIMAPが使用され、現在は主にPOP3やIMAP4が使用される。

SMTPサーバの代表的なものにはPostfixsendmaileximなどがある。 POP/IMAPサーバにはDovecotやCourier Mail Serverなどがある。

メールボックスの形式には2種類ある。

  • mbox形式 … /var/mailディレクトリに1ユーザ1ファイルとして保存する形式(1つのファイルに全部保存)
  • Maildir形式 … ユーザのホームディレクトリ以下に1メール1ファイルとして保存する形式

12.1.2. Postfixとは

Postfixはsendmailと互換性を持つ新規開発されたMTA。 高速動作と設定が簡単なのが特徴で、デフォルトで使用するMTAとして最も一般的となっている。 Postfixは単一のデーモンプではなく複数のプログラムが協調して動作する。

Postfixを構成するプログラムは以下の通り。

プログラム役割
sendmailsendmail互換インターフェース
smtpd外部配送の処理
pickupmaildropキューの監視、内部配送の処理を行う
cleanupヘッダ内の書き換えなどを来ないincomingキューに入れqmgrに通知する
qmgrキュー内のメール配送プログラムに渡す
nqmgrqmgrと同じ(配送アルゴリズムのみ異なる)
master全体制御用デーモン
bounceバウンスメール(設定ミスなどで往復する)を処理する

12.1.3. Postfixの設定

Postfixの設定ファイルは/etc/postficディレクトリ以下のmain.cfmaster.cfで行う。 main.cfはMTAの基本設定ファイル、master.cfはPostfix構成する各種デーモンの設定ファイルとなる。

main.cfの設定

main.cfの書式は以下の通り。

設定項目 = パラメータ[, パラメータ ...]

#でコメントアウト$を設定項目に付けると変数名のように参照できる。 設定例は以下の通り。

# ホスト名
myhostname = www.sample.com

# ドメイン名
mydomain = example.com

# メールアドレスの@以降のドメイン名
myorigin = $mydomain

# SMTP接続を待ち受けるNIC
inet_interfaces = all

# IPv4/IPv6の動作をall/ipv4/ipv6で指定
ip_protocols = all

# ローカル配送を行うドメイン名(メール受け取りドメイン名)
mydistination = $myhostname, localhost. $mydomain, localhost, $mydomain,mail.$mydomain, www.$mydomain, ftp.$mydomain

# 中継許可するSMTPクライアントのアドレス
mynetworks = 172.20.0.0/16, 127.0.0.0/8

# メールスプールディレクトリ
mail_spool_directory = /var/spool/mail

# ローカル配送を行うプログラム
mailbox_command = /usr/bin/procmail

# SMTPで出力されるバナー情報(デフォルトではバージョン非表示)
smtpd_banner = $myhostname ESMTP $mail_name

postconfコマンド

Postfix全般設定値を表示するコマンド。 なお表示される値は設定ファイルに基づいて表示される。

postconf

-nオプションではデフォルト値から変更されている項目のみ表示される。

master.cfの設定

Postfixを構成するプロセスの動作を設定するファイル。

postfixコマンド

Postfixの制御を行うコマンド。

postfix <サブコマンド>
オプション説明
startPostfixの開始
stopPostfixの停止
abortPostfixの強制停止
flushキュー内にあるメッセージの再送
reloadPostfixの設定を再読み込みする
check設定ファイルの構文チェックを行う

また起動スクリプトやsystemdによる起動停止も行える。

/etc/init.d/postfix stop
systemctl stop postfix.services

Postfixの正規化機能

Postfixにはcanonical(正規化)と呼ばれる、送信者、受信者のアドレスを書き換える機能がある。 この機能により、以下のようなことが可能となる。

  • 異なる送信者から受け取ったメールを、単一の送信者から送られたように見せる
  • ユーザ名(ログインID)と異なるメールアドレスを使用する

canonical機能は以下の手順で有効にする。

  1. main.cfにて、書き換えルールの参照先(検索テーブル)を指定 * 書き換えルールには以下のパラメータが指定可能 * canonical_maps:送受信時の書き換えで参照する検索テーブル * sender_canonical_maps:送信者アドレスの書き換え時に参照する検索テーブル * recipient_canonical_maps:受信者アドレスの書き換え時に参照する検索テーブル
  2. 検索テーブルの作成、更新

なお、指定する検索テーブルにはMySQLやPostgreSQLなどのデータベース、LDAP、正規表現などが使える。

12.1.4. メールのリレー

メールのリレーはMTA間でのメール中継のこと。 他ホスト宛てのメールを受け取った場合、MTAはそのメールリレーを許可するか判断する。 リレーを無制限に許可すると、スパム送信の踏み台として利用されかねないので設定をしっかり行う必要がある。

以下の原則に従うと良い。

  • リレーを許可したいLAN内のアウトバンドメールは許可
  • リレーを許可したいドメインのメールは許可
  • 外部のアウトバンドメールは拒否

なお一般的にはデフォルト設定でメールリレーは禁止されている。 Postfixの場合はmydistinationパラメータやmynetworksパラメータで制御を行う。

12.1.5. メールエイリアス/メール転送

/etc/aliases(または/etc/mail/aliases)によりメールアカウントと実際に受け取るユーザ名の対応設定ができる。 書式は以下の通り。

アカウント:   受取ユーザ1[, 受取ユーザ2...]

受取ユーザの別名ではユーザ以外に以下のように指定できる。

別名説明
/pathパスにあるファイルにメールメッセージを追加する
|command指定したコマンドの標準入力へメールメッセージを送る
user@domain指定したメールアドレスにメールを転送する
:include:/pathパスに指定したファイルに別名として読み込む

newaliasesコマンド

/etc/aliasesのファイル内容を変更後に設定を反映させるコマンド。

newaliases

.forwardファイル

ユーザのホームディレクトリに.forwardファイルを作成し、そこに届けたい先のメールアドレスを記述すると、そのユーザに届いたメールアドレスを届けたい先のメールアドレスに転送できる。

12.1.6. SMTPサーバの運用と管理

メールキュー

メールキューは処理待ちメールが一時的に保持される場所のこと。 各MTAでは以下の場所に格納される。

  • Postfix
    • /var/spool/postfixディレクトリ以下のサブディレクトリ
    • mailqコマンドで内容表示可能
    • postfix flushコマンドで直ちに送信が可能
    • postsuper -dコマンドでメールキュー内のメールを削除可能
  • Sendmail
    • /var/spool/mqueueディレクトリ以下
    • postqueue -pコマンドで内容表示可能
    • postqueue -fコマンドで直ちに送信が可能

メールボックス

メールボックスはメールサーバが受け取ったメールが保存される場所。 各MTAでは以下の場所に格納される。

  • Postfix
    • /var/spool/postfixディレクトリ以下のユーザ名のテキストファイル
    • メールの保存にはmbox形式とmaildir形式が使用できる
    • maildir形式の利用設定にはhome_mailbox = Maildir/とmain.cfで記述する
  • Sendmail
    • /var/spool/mailディレクトリ以下のユーザ名のテキストファイル

12.2. メールのフィルタリング

メールのフィルタリングはスパムメールなどのメールをルールに従って振り分ける仕組み

12.2.1. Sieveの設定

Sieveはメールフィルタリングを行うための記述言語。 **「コントロール」「テスト」「アクション」**という3種類のコマンドで構成される。 Dovecotと連携し、サーバ側でメールフィルタリング処理を実行できる。

書式は以下の通り。

if 条件 {
    条件がマッチした場合の処理;
}

5GByteを超えるメールを拒否する設定例は以下の通り。

require ["reject"]

if size :over 5G {
    reject "Too Big Size";
}

sleveのコントロールは以下の通り。

コントロール説明
ifif-elsif-else
require拡張機能を指定
stop処理を停止

sieveの主なアクションは以下の通り。

アクション説明
fileinfoメールを指定したメールボックスに配送する
keepメールをデフォルトのメールアドレスに配送する
discardメールを破棄する
rejectメールを拒否する
redirectメールを指定したメールアドレスに転送する
stop処理を停止する
テスト説明
addressアドレスを評価
headerメールヘッダを評価
sizeメールサイズの評価
allofAND
anyofOR
notNOT
true
false

12.2.2. Procmailの設定

ProcmailはMDAの1つでMTAが受け取ったメールをここユーザに配送する。 procmaliをMDAに使うとメールフィルタリングや不要メールの自動破棄などが可能。

フィルタリング設定は各ユーザのホームディレクトリの.procmailrcファイルで設定を行う。 フィルタリングルールはレシピと呼ばれ3行で指定する。

:0 [フラグ] [:ロックファイル]
* 条件式
アクション

フラグはprocmailにメールを渡す方法を指定。条件式は正規表現でメール条件を記述する。

フラグ説明
D大文字小文字を区別する
Hメールのヘッダ部分で検索する
Bメールの本文部分で検索する
cメールのコピーを残す
hアクションにヘッダ部分を渡す
bアクションに本文部分を渡す
条件式説明
!条件否定
>指定したバイト数より大きいときに処理
<指定したバイト数より小さいときに処理
アクション説明
/dev/null破棄する
ファイル名指定したファイル名のファイルに格納する
ディレクトリ名ディレクトリ内にファイル名を付けて保存する
ディレクトリ名/.ディレクトリ内に連番を付けて格納する
|パス名指定したパスのプログラムに渡す
!メールアドレス指定したメールアドレスに転送する

12.3. POP/IMAP

POP/IMAPはメーラがメールボックスからメールを取りf出すのに使用する。 これらのサービスの利用にはDovecotCourier IMAPなどがある。

  • Dovecot
    • POP3/IMAPをサポートするMRA
    • Maildir及びmbox形式のメールボックスをサポート
  • Courier IMAP
    • 主にIMAPをサポートするMRA
    • Maildir形式のメールボックスのみをサポート

12.3.1. Dovecot

DovecotはPOP3/IMAP4に加えSSL/TLSに対応したMDA。 設定は/etc/dovecot.confで行う。

Dovecotの設定項目は以下の通り。

設定項目説明
auth_mechanisms利用する認証メカニズム
mail_locationメールの配送場所と配送形式
sslSSL/TLSの有効化のどうか
ssl_certサーバ証明書のファイル
ssl_keyサーバ鍵ファイル

メール関連のポートは以下の通り。

ポート説明
110POP3
143IMAP
993IMAP over SSL/TLS
995POP3 over SSL/TLS
# dovecot.confより
listen = 192.168.1.1

protocols = imap pop3 lmtp

# psコマンドの出力に詳細表示を行う
verbose_proctitle = yes

# /conf.d/10-mail.confより
mail_location = mbox:~/mail:INBOX=/var/spool/mail/%u

# /conf.d/10-auth.confより
auth_mechanisms = plain login cram-md5 apop digest-md5

# /conf.d/20-imap.confより
protocol imap {
    mail_max_userip_connections = 10
}

auth default {
    mechanisms = plain login cram-md5 apop digest-md5
}

doveconfコマンド

Dovecotの設定内容を出力できるコマンド。

doveconf
オプション説明
-nデフォルト以外の設定を表示
-c設定ファイルを指定

doveadmコマンド

Dovecotの管理用コマンド。

doveadm <サブコマンド>
サブコマンド説明
config設定内容を表示
reload設定の再読み込み
stopdovecotプロセスの終了
log findログファイルパスの確認
log testテストログメッセージの生成
mailboxメールボックスを管理
whoサーバログイン中のユーザ情報表示
pwパスワードハッシュ値の生成

2.13 - 13.システムセキュリティ

パケットフィルタリング、iptables、FTP/OpenSSH、Linuxのセキュリティ設定、OpenVPNなどに関して

13.1. パケットフィルタリング

パケットフィルタリングはカーネルが処理するパケット情報を調べて通過させたり遮断させたりすること。 パケットフィルタリングはINPUT(入力),OUTPUT(出力),FORWARD(転送)の3か所で行う。 それぞれINPUTチェイン、OUTPUTチェイン、FORWARDチェインと呼ばれる。

なおチェインはパケットを検査するためのルールセットのこと。 ネットワークインターフェイスを通過するパケットはチェインのルールに適合する検査され、破棄されたり通過させたりされる。 チェインのいくつか集めたセットはテーブルと呼ばれる。 テーブルには以下の種類がある。

テーブルデフォルトチェイン
filterINPUT, OUTPUT, FORWARD
natPREROUTING, POSTROUTING, OUTPUT
mangleINPUT, OUTPUT, FORWARD, PREROUTING, POSTROUTING

13.1.1. iptablesコマンド

iptablesコマンドはパケットフィルタリングやNAT(ネットワークアドレス変換)の設定を行うコマンド。 書式は以下の通り。

# チェインの最後にルールの追加/削除
iptables -[AD] チェイン ルール

# チェインのポリシ変更
iptables -P チェイン ターゲット

# ユーザ定義チェインの一覧表示/強制全削除/作成/削除
iptables -[LFNX] チェイン

# NATテーブルの表示
iptables -t NAT -L

# チェインにルールを挿入
iptables -I チェイン [ルール番号] ルール
オプション説明
-v詳細に表示する
-n数値で表示する
–line-numbersルール番号を表示する
コマンド説明
-A指定したチェインの最後にルールを追加
-D指定したチェインの最後のルールを削除
-P指定したチェインのポリシ変更を行う
-L [チェイン]ルールのリストを表示する
-N チェイン指定した名前のユーザ定義チェインを作成
-X チェイン指定した名前のユーザ定義チェインを削除
-lルール番号を指定してルールを挿入
-F チェイン指定したチェインのルールをすべて削除
チェイン説明
INPUTホストに入ってくるパケット
OUTPUTローカルマシンで生成されたパケット
FORWARDホストを経由するパケット
PREROUTING入ってきたパケットの変換
POSTROUTING出ていくパケットの変換
ターゲット説明
ACCEPTパケット通過の許可
DROPパケットを破棄
REJECTパケットを拒否(送信元に通知する)
MASQUERADE送信元IPアドレスのポート番号変換
SNAT送信元IPアドレスの変換
DNAT送信元IPアドレスの変換
LOGログに出力
ルール説明
-s 送信元送信元IPアドレス
-d 送信元送信元IPアドレス
–sport ポート番号送信元ポート番号
–dport ポート番号送信元ポート番号
–to宛先指定(IPアドレス:ポート番号)
-j ターゲット適用されるターゲット
-p プロトコルプロトコル(tcp,udp,icmp,all)
-i インターフェイス名入力インターフェースの指定
o インターフェース名出力インターフェースの指定

使用例は以下の通り。

# FORWARDチェインのポリシーをDROP変更
iptables -P FORWARD DROP

# 特定のIPからのICMPパケットを拒否する
iptables -A INPUT -p icmp -s 192.168.2.0/24 -j REJECT

# パケットフィルタリングの挙動をログに保存する(journalctlなどで確認可能)
iptables -A INPUT -p tcp --dport 23 -j LOG --log-prefix "Telnet Trying ..."
iptables -A INPUT -p tcp --dport 23 -j DROP

iptables設定の保存

各ディストリビューションにおけるiptablesの保存方法は以下の通り。

# RedHat系
service iptables save

iptables-save > /etc/sysconfig/iptables

# Debian系
iptables-save > /etc/iptables/rules.v4

iptables設定の復元

iptables設定の復元はiptables-restoreコマンドで行う。

iptables-restore < iptables.backup

firewalld

CentOS7系やUbuntu22.04などではFWの仕組みにfirewalldが採択されている。 そのためデフォルトではiptablesを利用できない。

この場合利用するとき、firewalldサービスを停止しiptables-serviceパッケージをインストールする必要がある。 なおUbuntuなどではiptablesコマンドではなくufwコマンドを用いてFWの設定を行うのが一般的となる。

13.1.2. ポート転送

ポート転送は外部から届いたパケットの送信先ポート番号を変えて内部に転送すること。 以下に、外部(eth1)、内部(172.16.0.0/16)の172.16.0.2の80ポートに届くようにする際の設定例を記載する。

iptables -A FORWARD -d 172.16.0.2 -p tcp --dport 80 -j ACCEPT
iptables -t nat -A PREROUTING -p tcp --dport 8080 -i eth0 -j DNAT --to 172.16.0.2:80

13.1.3. ip6tablesコマンド

IPv6の場合にパケットフィルタリングの設定を行うコマンド。 使い方はip6tablesコマンドとほぼ同じとなっている。

iptables設定の保存

各ディストリビューションにおけるip6tablesの保存方法は以下の通り。

# RedHat系
service ip6tables save

ip6tables-save > /etc/sysconfig/ip6tables

# Debian系
ip6tables-save > /etc/iptables/rules.v6

13.2. ルータの構成

Linuxホストをルータとして利用することもできる。 ルータとして使用するにはルーティングテーブルを適切に設定する必要がある。

13.2.1. ルーティングテーブル

route/netstat -rコマンド

routeコマンドやnetstat -rコマンドはルーティングテーブルを表示するコマンド。 ルーティングテーブルに表示されるエントリには静的経路、動的経路がある。

  • 静的経路 … routeコマンドにより設定される経路
  • 動的経路 … ルータ同士が情報交換することで自律的形成される経路

Linuxで動作するルーティングソフトにはQuaggaがある。 なお動的経路を使用しない場合はパケットフィルタリングのiptablesのみで十分となる。

Linuxをルータとして使用する場合は以下ファイルの値が1である必要がある。

  • IPv4の場合 … /proc/sys/net/ipv4/ip_forward
  • IPv6の場合 … /proc/sys/net/ipv6/conf/all/forwarding

上記設定のみではシステム再起動後に設定が初期化されるので、/etc/sysctl.confファイルや/etc/sysconfig/networkファイルにFORWARD_IPv4=yesnet.ipv4.ip_forward=1など記述する必要がある。

13.2.2. IPマスカレード

IPマスカレードはLAN側ホストがインターネットを利用する際にIPアドレスをグローバルアドレスに変換したり、その逆を行う機能のこと。 IPマスカレード設定をLinuxで行う場合はiptablesで以下のように設定する。

iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

設定例は以下の通り。

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth1 -j SNAT 10.1.2.3

13.3. FTPサーバのセキュリティ

Linux/Unix系OSで使用されているFTPサーバにはwu-ftpdや設定が容易であるProFTPDや、安全性の高いvsftpd、セキュリティと実用性重視のPure-FTPDなどがある。

13.3.1. ProFTPD

ProFTPDはproftpd.confで設定を行う。 なお書式はApacheの設定と似ているため設定しやすい。

# アクセス時表示のサーバ名
ServerName                      "ProFTPD Default Installation"
# デーモン(standalone)かスーパーサーバ(inetd)経由かを指定
ServerType                      standalone
# バージョンを隠す
ServerIdent                     No
# Rootログインを許可しない
RootLogin                       Off
# ホームディレクトリより上のディレクトリに移動禁止
DefaultRoot

# PAM認証
AuthPAMAuthorization            on

# タイムアウトするまでの秒数
TimeoutIdle 120
# ポート番号
Port                            21
# Umask値
Umask                           022
# 最大接続クライアント数
maxClientPerHost                10
# 最大子プロセス数
MaxInstances                    30
# 子プロセスの実行ユーザ/実行グループ
User                            nobody
Group                           nobody
<Global>
    # ファイル上書きファイル転送の許可
    AllowOverwrite yes
    <Limit All SITE_CHMOD>
        # 全てのFTPコマンドとアクセス権限の変更
        AllowAll
    </Limit>
</Global>

# 読み取りは許可/書き込みは禁止
<Limit READ>
    AllowAll
</Limit>
<Limit STOR>
    DenyAll
</Limit>

# 全てのIPアドレスからのログイン許可
<Limit LOGIN>
Order Deny.Allow
Allow from all
</Limit>

# 匿名ログインの同時接続ユーザ数と超過メッセージ
MaxClients  100 "Sorry, max %m users -- try again later"

# ファイル転送ログ
TransferLog /var/log/proftpd/xferlog/legacy

アクセス制御はLimitディレクティブで行う。 Limitディレクティブにはアクセス制御ディレクティブやFTPコマンド/FTPコマンドグループを記述できる。

<Limit FTPコマンド/FTPコマンドグループ>~</Limit>
アクセス制御ディレクティブ説明
Order Allow,deny/deny.allowAllowとDenyがチェックされる順序
Allow from 場所許可するホストやネットワーク設定
AllowAll許可を明示
AllowUser許可するユーザ
AllowGroup許可するグループ
Deny from 場所拒否するホストやネットワーク設定
DenyAll拒否を明示
DenyUser拒否するユーザ
DenyGroup拒否するグループ
FTPコマンド説明
RETRサーバからクライアントへのファイル転送
STORクライアントからサーバへのファイル転送
RENファイル名変更
DELEファイル削除
RMDディレクトリ削除
SITE_CHMODパーミッション変更
FTPコマンドグループ説明
DIRSファイル一覧の取得
READファイルの読み取り
WRITEファイル/ディレクトリの作成/削除
ALLすべてのFTPコマンド
LOGINログイン

13.3.2. vsftpd

vsftpdの設定はvsftpd.confで設定を行う。

# ローカルユーザログインの許可
local_enable=Yes

# 書き込みを許可
write_enable=Yes

# umask値を022にする
local_umask=022

# 20番ポートからの送信接続
connect_from_port_20=YES

# ファイル転送ログを残す
xferlog_enable=YES

# ファイル転送ログファイル
xferlog_file=/var/log/vsftpd.log

# ログファイルの形式(YESの場合はwu-ftpdと同様の形式)
xferlog_std_format=NO

13.3.3. FTPサーバのアクセス制御

FTPログインを許可しないユーザの指定は/etc/ftpusersにユーザリストを記述する。 主にrootユーザやシステムアカウントを記述すると良い

root
bin
daemon
mail
:
:

chroot機能で特定のディレクトリ以外のディレクトリにユーザが移動することを禁止できる。 これはセキュリティ上重要な設定となる。

  • proftpd.confの場合
    • DefaultRoot ~
  • vsftpd.confの場合
    • chroot_local_user=YES
    • chroot_list_file=/etc/vsftpd.chroot_List

13.3.4. Pure-FTPD

Pure-FTPDの場合はpure-ftpd.confで設定を行う他、起動時のオプションで動作を指定することもできる。

オプション説明
-4IPv4のみの利用
-A全ユーザにchrootの利用
-Bデーモンとして動作する
-c 数最大クライアント数
-C 数IPアドレスあたりの最大クライアント数
-e匿名ユーザのみログインを許可する
-E匿名ユーザの利用拒否
-i匿名ユーザにファイルのアップロードを禁止する
# 全ユーザに対してchrootを適用
ChrootEveryone yes

# 最大クライアント数
MaxClientsNumber 50

# IPアドレス当たりの最大クライアント数
MaxClientPerIP 8

# Yesでデーモン動作、Noでxinitd経由(スーパーデーモン)
Daemonize yes

# ドットファイルの表示の有無
DisplayDotFiles yes

# PureDBの利用
PureDB /etc/pure-ftpd/pureftpd.pdb

# PAM認証の利用有無
PAMAuthentication no

13.2.5. パッシブモード

通常FTPサーバはデータ転送に20/21番ポートを使用し、一般的にはクライアントからサーバ側へ接続要求を行う。 FTPのデータ転送に関してはFTPサーバ側からクライアントに接続要求するアクテイブモードと言われる方法となる。

この場合クライアント側のFWの設定なので接続できない場合があるためパッシブモードでFTPサーバを動作させることで回避できる。 パッシブモードではデータ転送の際にクライアント側からサーバへ接続要求することができる。

各サーバにおけるパッシブモードの設定方法は以下の通り。

# proftpd.confの場合

# ルータのWAN側IPアドレス
MasqueradeAddress 10.2.3.4

# 利用するポート設定
PassivePorts 52000 52020
# vsftpdの場合

pasv_enable=YES
# Pure-FTPDノヴァ愛

PassivePortRange 30000 50000

13.2.6. 匿名FTPサーバ

匿名FTPサーバ(Annonymous FTP)は匿名でFTPサーバを利用できるようにすること。 この場合chrootにより権限のないディレクトリにアクセスできないようにすることが重要となる。

方法としては以下の通り。

  1. /home/ftpなどのディレクトリを作成する
  2. /bin,/lib,/etcなどを作成しFTPサービス運営に必要なファイルをコピーする
  3. anonnymousユーザ用のディレクトリ(/home/ftp/pub)などを作成する
  4. /home/ftpにchrootする

上記手順により他のディレクトリにannonymousユーザはアクセスできなくなる。

# proftpdの場合

<Anonymous ~ftp>
User ftp
Group ftp

    # ダウンロードのみ許可
    <Limit READ>
        AllowAll
    </Limit>
    <Limit STOR>
        DenyAll
    <Limit>
</Anonymous>
# vsftpdの場合

# 匿名FTPの許可
anonymous_enable=YES
# 匿名ユーザによるアップロード禁止
anon_upload_enable=NO
# 匿名ユーザによるディレクトリ作成などを禁止
anon_mkdir_write_enable=NO

13.4. OpenSSH

SSHはリモートホスト通信において高いセキュリティで実現するものといえる。 LinuxではOpenBSDによるSSH実装であるOpenSSHが一般的に利用される。 SSHにはVer1.0とVer2.0系があり、それぞれ公開鍵認証のアルゴリズム形式が異なる。

SSHのバージョン公開鍵認証のアルゴリズム
1.0系RSA
2.0系DSA, ECDSA, ED25519, RSA

13.4.1. SSH設定

SSHサーバ機能はsshdデーモンにより提供される。 設定ファイルは/etc/ssh/sshd_configとなる。

主要な設定項目は以下の通り。

設定項目説明
PortSSHで使うポートの設定
Protocol使用するSSHのバージョン
ListenAddredd接続受付アドレス(0.0.0.0ですべて)
HostKeyホスト鍵のファイルパス
SyslogFaciltyログのファシリティ
LogLevelログのプライオリティ
LogGraceTimeログインを試みることのできる最大時間(秒)
PermitRootLoginrootログインの禁止許可
StrictModdesパーミッションを厳密にチェックするかどうか
MaxAuthTimes認証を試みることのできる最大数
RSAAuthenticationSSH1で公開鍵認証を許可するかどうか
PubkeyAuthenticationSSH2で公開鍵認証を許可するかどうか
AuthorizedKeysFile公開鍵を登録するファイル
PasswordAuthenticationパスワード認証の有効/無効化
PermitEmptyPasswords空パスワードの有効/無効
ChallengeResponseAuthenticationチャレンジレスポンス認証の有効/無効化
UsePAMPAMを使用する
X11ForwardingX11フォワーディングの無効/有効化
AllowUsersログインを許可するユーザ
DenyUsersログインを禁止するユーザ
AllowGroupsログインを許可するグループ
DenyGroupsログインを許可するグループ
SubSystem外部サブシステムの指定(ファイル転送デーモンなど)

また/etc/ssh/sshd_configの設定例は以下の通り。

Port 22
Protocol 2
ListenAddress 0.0.0.0

HostKey /etc/ssh/ssh_host_key
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key

SyslogFacility AUTHPRIV
LogLevel INFO

LOGGraceTime 2m
PermitRootLogin no
StrictMode yes
MaxAuthTries 6

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

PasswordAuthentication no
PermitEmptyPasswords no

UsePAM yes
X11Forwarding yes

# SFTPを行う場合の設定
Subsystem sftp /usr/libexec/openssh/sftp-server

13.4.2. ホスト認証/ユーザ認証

SSHでは最初にユーザ認証の前にホストの正当性を確認するホスト認証が行われる。

ホスト認証

ホスト認証は接続先ホストの正当性を確認する検証。 DNSサーバのクラックなど不正なホストに接続されてしまう場合などの対策のために実装されている。 具体的には公開鍵暗号方式を用いることでホストの正当性を保証する。

具体的には公開鍵と秘密鍵を用いて認証を行う。 OpenSSHのインストールでローカルホスト用の公開鍵と秘密鍵が生成される。 このとき秘密鍵は外部に漏れないように厳重に管理する。 なお生成されたファイルは/etc/ssh/以下に保存される。

ファイル名説明
ssh_host_key秘密鍵(Ver1.0)
ssh_host_dsa_key秘密鍵(Ver2.0 DSA用)
ssh_host_rsa_key秘密鍵(Ver2.0 RSA用)
ssh_host_key.pub公開鍵(Ver1.0)
ssh_host_dsa_key.pub公開鍵(Ver2.0 DSA用)
ssh_host_rsa_key.pub公開鍵(Ver2.0 RSA用)
ssh_host_ecdsa_key秘密鍵(Ver2.0 ECDSA用)
ssh_host_ecdsa_key.pub公開鍵(Ver2.0 ECDSA用)
ssh_host_2d25519_key秘密鍵(Ver2.0 ED25519用)
ssh_host_2d25519_key.pub公開鍵(Ver2.0 ED25519用)

SSH接続時にホストの公開鍵がクライアント側に送られる。 このときクライアントは所持するホスト鍵と一致することでホストの正当性を確認する。

ホスト鍵は~/.ssh/known_hostsに格納される。 検証するときにフィンガープリントをクライアント側に登録しておけばサーバに正当性があるかどうか検証できる。 サーバ側の鍵でフィンガープリントは以下のように確認できる。

ssh-keygen -l -f /etc/ssh/ssh_host_rsa_key.pub

2回目以降の接続は接続先から送られたホスト鍵をKnown_hosts内の鍵と比較し問題がないとユーザ認証に進むこととなる。 そのためこの段階で接続先が悪意あるものによりなりすましされていたら警告が出るようになる。

13.4.3. 公開鍵認証

SSHではホスト認証後にユーザ認証に進む。 ユーザ認証では公開鍵認証が試行される。 公開鍵認証の手順は以下の通り。

  1. サーバ側に公開鍵を登録する
  2. SSH接続時に公開鍵が利用できるか確認が行われる
  3. クライアント側は公開鍵にユーザ名などの情報を加え、秘密鍵で署名しサーバに送信する
  4. サーバはユーザの公開鍵を使用して署名を確認する
  5. 確認できるとログインを許可する

公開鍵

なおユーザの公開鍵と秘密鍵ペアの生成にはssh-keygenコマンドを使用する。

ssh-keygenコマンド

公開鍵と秘密鍵のペアを作成するコマンド。

ssh-keygen [オプション]
オプション説明
-f ファイル名鍵ファイル名の指定
-t暗号化方式の指定(rsa1, dsa, rsa,ecdsa, ed25519)
-p既存の鍵ファイルのパスフレーズを変更する
-P パスフレーズ古いパスフレーズを指定する
-N パスフレーズ新しいパスフレーズを指定する
-lフィンガープリントの表示
-R ホスト名指定されたホスト鍵をknown_hostsから削除する

生成される鍵のデフォルト名は以下の通り。

バージョン秘密鍵公開鍵
Ver1.0identityidentyty.pub
Ver2.0(DSA)id_dsaid_dsa.pub
Ver2.0(RSA)id_rsaid_rsa.pub
Ver2.0(ECDSA)id_ecdsaid_ecdsa.pub
Ver2.0(ED25519)id_ed25519id_ed25519.pub

ユーザの公開鍵を接続先に登録する

ssh-keygenコマンドで公開鍵ファイルを作成した後、接続先ホストの~/.ssh/authorized_keysに登録する。 この際はコマンドを利用する場合はscpコマンドなどで転送する。

なお公開鍵は保存するauthorized_keysファイルは所有者のみ読み書きできるようにしておく。

chmod 600 ~/.ssh/authorized_keys

13.4.4. ssh-agent

ssh-agentは秘密鍵使用時に尋ねられるパスフレーズの入力の手間を省く機能のこと。 ssh-agentはクライアント側で稼働するデーモンで、秘密鍵をメモリ上に保持しておき、必要時にそれを利用する仕組みとなっている。 そのため毎度パスフレーズを打つ必要がない。

ssh-agentの利用にはssh-agentの子プロセスにbashを起動し、ssh-addコマンドで秘密鍵を登録する。

ssh-agent bash
ssh-add

この設定以降、このbashや子プロセスではパスフレーズの入力が不要となる。 ssh-agentが保持している秘密鍵の一覧はssh-add -lコマンドで確認できる。

13.4.5. SSHポート転送

SSHポート転送(SSHポートフォワーディング)はあるポートに送られてきたTCPパケットをSSHを使用した安全経路でリモートホストの任意ポートに転送すること。 この機能によりPOP、FTPなどの暗号化されていないプロトコルを使った通信の安全性を高めることができる。

SSHポート転送

ポート転送を行う場合のssh書式は以下の通り。

ssh -L [ローカルポート]:[リモートホスト]:[リモートポート] [リモートホストユーザ名]@[リモートホスト]

13.4.6. SSHサーバのセキュリティ

SSHサーバをデフォルト設定ではなく、適切に設定するとよりセキュアな運用ができる。 項目は以下の通り。

  • SSH Version1.0の禁止
  • パスワード認証の禁止
  • rootログインの禁止
  • 接続元制限

SSH Version1.0の禁止

SSHバージョン2.0のみを許可することで、SSHバージョン1.0の脆弱性を防ぐことができる。 sshd_configProtocol 2にすることで可能。

パスワード認証の禁止

パスワード認証は原則は無効にした方がよい。 これはブルートフォースアタックやパスワードが知られる危険性があるためである。

同様にsshd_configPasswordAuthentication noと記述する。

rootログインの禁止

rootユーザのリモートログインも基本は許可すべきではない。 sshd_configPermitRootLogin noと記述することでrootログインを禁止にできる。

ログインユーザの制限

ユーザ単位でログイン制限することが可能。 AllowUsersディレクティブでユーザを指定すると、指定していないユーザのログインは禁止にできる。

書式説明
AllowUsers [ユーザ名]ユーザのみログインを許可
AllowUsers [ユーザ名1] [ユーザ名2]ユーザ1, ユーザ2をログインを許可
AllowUsers [ユーザ名]@172.16.0.1172.16.0.1のユーザのみログインを許可
AllowUsers [ユーザ名]@example.comexample.comのユーザのみをログイン許可
AllowUsers *@172.16.0.1ホストが172.16.0.1のユーザのみログイン許可
AllowGroups wheel adminグループがwheelとadminユーザのみ許可

接続元の制限

SSHアクセスは/etc/hosts.allow/etc/hosts.denyで制御できる。 これはsshdが通常TCP Wrapper機能を参照しているからとなる。 前提にlibwrapという機能が利用されている必要があるので確認は以下コマンドで可能。

ldd `which sshd` | grep libwrap

13.5. セキュリティの設定

13.5.1. セキュリティツール

Snort

Snortはネットワークインターフェイス上のトラフィックを監視しパケットをいろんな規則と照合することで攻撃や侵入を捕らえられるIDSツール。 Snortが参照するルールセットはインターネット上で入手することができる。 またSnortの使用にはパケットキャプチャであるlibcapが必要となる。

Tripwire

Tripwireはファイルシステムの状況を記録し比較することでファイル改ざんを検知するプログラム。 検知はリアルタイムではなくcronにより定期的なスケジューリングにより起動する。 インストールと設定方法は以下の通り。

  • パッケージ/ソースからインストール
  • ポリシーファイルの作成
  • ベースラインデータベースの作成
  • 定期的チェック
  • 必要に応じたポリシーファイル/ベースラインデータベースのアップデート

なおTripWireでは以下項目をチェックできる。

  • ファイルタイプ
  • リンク数
  • パーミッション
  • iノード番号
  • 所有ユーザ
  • iノードのタイムスタンプ
  • 所有グループ
  • iノードのあるデバイスID
  • アクセス時刻
  • MD5/SHA/Haval/CRC32ハッシュ値
  • ファイル更新日時
  • ブロック数
  • ファイルサイズ

OpenVAS

OpenVASはOSSのセキュリティスキャナーでネットワーク経由で脆弱性チェックできるツール。 OpenVASは以下のコンポーネントで構成される。

コンポーネント説明
OpenVAS Scannerセキュリティスキャナ
OpenVAS Managerスキャナ/スキャンタスク/データ管理ソフトウェア
OpenVAS Administratorサービスやユーザを管理するソフトウェア
Greebone Security AsiistantWEBブラウザベースで操作するインターフェイス
Greebone Security DesktopGUIベースのクライアント
OpenVAS CLIコマンドラインベースのクライアント

Fail2ban

Failbanはログファイルを監視し攻撃を検知し、攻撃元IPを遮断するソフトウェア。 内部的には一定時間内に何度もログインを失敗するといったイベントにより、iptablesルールを書き換えアクセス元からの接続を遮断する。

13.5.2. 開いているポートの確認

Nmap

Nmapはポートスキャンツールで、開いているポートから稼働しているサービスを特定できる。

nmap <スキャンタイプ> <オプション> <IPアドレス \| ドメイン>
オプション説明
-sT接続スキャン
-sSSYNスキャン(TCP接続のSYNパケットを送信し、SYN+ACKが帰るかどうかでポートスキャンを行う)
-sNNullスキャン
-sFFINスキャン
-sXXmasスキャン
-sRRFCスキャン
-OOSを調べる

XmasツリースキャンというTCPヘッダのFIN、URQ、PSHフラグを有効にしたパケットを送って藩のを確かめる手法も利用できる。

nmap -sX www.example.com

netstat/ss/lsof/fuserコマンド

netstat,ss,,lsof,fuserコマンドも同様に開いているポートを確認できる。

netstat -atun

ss -atun

lsof -f -n

fuser -v -n tcp 22

13.5.3. TCP Wrapper

TCP Wrapperは各種サーバプログラムへのアクセス制御を集中管理する仕組み。 libwrapライブラリにより機能が提供される。 アクセス制御は/etc/hosts.allow/etc/hosts.denyに記述すことで可能。 これらのファイルで使えるワイルドカードは以下の通り。

ワイルドカード意味
ALL全てのサービス/ホスト
A EXCEPT BB以外のA
LOCAL「.」を含まないすべてのホスト(ローカルセグメントのホスト)
PARANOIDホスト名からDNS検索したアドレスとサービス要求元アドレスが不一致

ローカルネットワークからすべてのsshdへのアクセスを許可する記述は/etc/hosts.allowに以下のように記述する。

sshd: LOCAL

またspawnを使い特定のコマンドを実行させることもできる。

ALL:ALL:spawn logger -t hosts.deny Connectiondenied from %c

13.5.4. セキュリティ情報

セキュリティの情報源には以下のようなものがある。

CERT/CC

セキュリティ事故情報を収集しセキュリティに関する技術支援情報を発信しているサイト。

BUGTRAQ

BUGTRUGはバグ情報を公開するためのメーリングリスト。

CIAC

CIACは米エネルギー省が運営するサイトで、セキュリティインシデントの報告を行っている。

13.5.5. インシデントへの対処

サーバがクラックされると以下のことが行われる可能性がある。

  • コマンドの改ざん
  • ログ改ざんやsyslog停止
  • 悪意のあるソフトウェアのインストールと使用

改ざんされたlsコマンドでは不正なファイルのみを表示しないようにしてある場合があり、この場合はecho *コマンドによりlsを代用できる。 またファイル改ざんのチェックはrpmコマンドにより確認できる。

rpm -Va

このオプションはイストール時のファイルの状態と現状を比較し、差があればプロパティと一緒に表示する。 表示されるRPM検証記号は以下の通り。

記号説明
Sファイルサイズが異なる
Mアクセス権またはファイルタイプの変更がされている
5MD5チェックサムの値が異なる
Lシンボリックリンクが変更されている
U所有者が変更されている
G所有グループが変更されている
Tファイルの更新時刻が異なる
Dデバイスファイルが変更されている
?不明
c設定ファイルを表す

13.6. OpenVPN

VPNはインターネットなどの公衆ネットワークを介して、まるで専用線で接続されているようにプライベートなネットワークを構築するサービスのこと。 VPNでは暗号化した経路を使用することで安全に通信ができることを実現している。

13.6.1. OpenVPNとは

OpenVPNはLinuxでVPNを通す際に選択されるVPNの1つ。 OpenVPNではL2/L3プロトコルをSSL/TLSでカプセル化しOpenVPNサーバとOpenVPNクライアントを接続する。

OpenVPNでは公開鍵基盤(PKI)を使用する。 CA(認証局)、OpenVPNサーバ、OpenVPNクライアントそれぞれで必要になるファイルを以下にまとめる。

サイド必要ファイル
CACA証明書、CA秘密鍵
OpenVPNサーバCA証明書、サーバ証明書、サーバ秘密鍵、DHパラメータ
OpenVPNクライアントCA証明書、クライアント証明書、クライアント秘密鍵

なおCAを自己証明で行う場合は、CA秘密鍵はOpenVPNサーバに設置する。

またOpenVPNのクライアント-サーバ接続形態にはルーティング接続ブリッジ接続がある。 これらはネットワーク1からネットワーク2に対してVPN接続をした際の、ネットワーク2への接続の行われ方が異なる。

ルーティング接続

仮想トンネルネットワークを通して異なるネットワークに接続する方法。 VPNクライアントのネットワークにアクセスする際には、VPNサーバや他のルータを経由して(ルーティングして)アクセスすることになる。

特徴は以下の通り。

  • OpenVPNサーバ/クライアントは別々のネットワークが利用できる
  • LAN同士を接続する用途に向いている
  • 大規模アクセス向き

ブリッジ接続

仮想インターフェイス経由で接続する方法。

接続先ネットワークと同じネットワークセグメントのIPアドレスをOpenVPNクライアントの仮想インターフェイス(TAP)に割り当てることでOpenVPNクライアントは接続先ネットワークに参加できる。

特徴は以下の通り。

  • ブロードキャストが届く
  • 小規模ネットワーク/個人向き

13.6.2. 必要となるファイルの作成

OpenVPNで必要となる各ファイルは用意されたスクリプトで作成する。

パラメータの準備

サーバ証明書やCA証明書の作成にはいくつかパラメータを指定する必要がある。 何度も入力するの晴れ間なので/etc/openvpn/varsを編集してパラメータを書き換える。

export KEY_cOUNTRY = "JP"
export KEY_PROVINCE = "TOKYO"
:
:

設定したファイルを読み込み不要なファイルは削除する。

cd /etc/openvpn
source vars
./clean-all

CA証明書/CA秘密鍵の作成

認証用のCA証明書とCA秘密鍵を作成する。

./build-ca

上記コマンドでCA証明書ファイルca.crtとCA秘密鍵ファイルca.keyが作成される。 これらのファイルは/etc/openvpn/keysに配置する。 またCA証明書ca.crtはOpenVPNサーバ/クライアントの/etc/opnvpn/keysにも配置する。

サーバ証明書/サーバ秘密鍵の作成

OpenVPNサーバ用のサーバ証明書と秘密鍵を作成する。

./build-key-server server

引数にはホスト名orファイル名を指定する。 上記例の場合はサーバ証明書のserver.crtとサーバ秘密鍵のserver.keyが生成される。 これらのファイルはOpenVPNサーバの/etc/openvpn/keysに配置する。

DHパラメータの作成

DHは鍵交換を安全に行うためのものでDHパラメータと呼ばれる。

./build-dh

これによりdh1024.pemまたはdh2048.pemが生成される。 これらのファイルはOpenVPNサーバの/etc/openvpn/keysに配置する。

クライアント証明書/クライアント秘密鍵の作成

OpenVPNクライアント用のクライアント証明書とクライアント秘密鍵を作成する。

./build-client client

引数にはホスト名orファイル名を指定する。なおクライアントが複数いる場合は引数を変更して作成する。 上記例の場合はサーバ証明書のclient.crtとサーバ秘密鍵のclient.keyが生成される。 これらのファイルは安全にOpenVPNクライアントの/etc/openvpn/keysに配置する。

ブリッジ接続を行う場合の起動スクリプトの設定

はじめにブリッジ接続のためのopenvpn-startupopenvpn-shutdownを編集する。 次に/usr/share/doc/openvpn-2.3.1.4/sample/sample-scripts以下ににあるbridge-startbridge-stopをコピーしておく。

# /etc/openvpn/openvpn-startup

#!/bin/bash
/etc/openvpn/bridge-start
route add -net default gw 192.168.1.1
iptables -I FORWARD -i br0 -j ACCEPT
# /etc/openvpn/bridge-stop

#!/bin/bash
/etc/openvpn/bridge-stop

13.6.3. ブリッジ接続をする場合のOpenVPNサーバの設定

OpemVPMサーバの設定ファイルは/etc/openvpn/server.confとなり、SampleファイルはCentOS7系では/usr/share/open-vpn/sample/sample-config-files以下にある。

# ポート番号とプロトコル
port 1194
proto udp

# ルーティング接続なら「tun」、ブリッジ接続なら「tap0」
dev tap0

# 認証局証明書のファイル(絶対パス/設定ファイル起点の相対パス)
ca keys/ca.crt

# サーバの証明書ファイル
cert keys/server.crt

# サーバーの秘密鍵ファイル
key keys/server.key

# DHパラメータのファイル名
dh keys/dh2048.pem

# OpenVPNクライアントへ渡す情報
push " route 192.168.1.1 255.255.255.0"

# 実行ユーザ/グループ
user nobody
group nobody

# 接続中クライアントリスト出力ファイル
status /var/log/openvpn-status.log

# ログ出力するファイル(ない場合はsyslog)
log /var/log/openvpn.log

OpenVPNはUDPのポート1194を使用するのでOpenVPNサーバ側のネットワークでルータやファイヤーウォールで1194ポートを許可する設定が必要となる。 またIPパケットのフォワーディング設定も有効にする必要がある。

echo 1 > /proc/sys/net/ipv4/ip_forward

OpenVPNサービスの起動は以下の通り。

systemctl start openvpn-bridge

13.6.4. OpenVPNクライアントの設定

設定ファイルの主要内容は以下の通り。

# プロトコル
proto udp

# ルーティング接続なら「tun」、ブリッジ接続なら「tap0」
dev tap0

# Clientの指定
client

# 接続先サーバとポート番号
remote 112.56.23.112 1194

# 認証局証明書のファイル(絶対パス/設定ファイル起点の相対パス)
ca keys/ca.crt

# クライアントの証明書ファイル
cert keys/client.crt

# クライアントの秘密鍵ファイル
key keys/client.key

OpenVPNクライアントの起動例は以下の通り。

/usr/sbin/opnevpn /etc/openvpn/client.conf

3 - 3.Linuxサーバの高度な運用管理

LPIC Lv3の範囲(AD互換ツールのSamba-AD、セキュリティ応用、仮想化技術)など。Linuxサーバの高度な運用管理はこの項目でカバー。2025年1月現在LPIC300とLPIC303の一部をカバー。

3.1 - 1.Sambaの基礎

【LPIC300範囲】ファイルサーバといえばSamba。それ以外にも機能あるよ~などの説明。

1.1. Sambaの概念とアーキテクチャ

1.1.1. Sambaのバージョンと機能

Sambaとは

Microsoft Winodwsのファイル/プリンタ共有・認証機能をUnix/Linux OSに実装したOSSソフトウェアのこと。

Sambaサービスの実現にはSMB/CIFSプロトコルが利用される。

提供できる機能は以下の通り。

  • ファイルサーバ機能
  • プリントサーバ機能
  • WINSサーバ機能
  • ドメインコントローラ
  • ActiveDirectoryメンバーサーバ
  • Microsoftネットワーククライアント

Sambaのバージョン

Sambaには3.0系と4.0系がある。

機能Samba3Samba4
ドメインコントローラNTドメインのドメインコントローラ構築ができる(NTMLv2の使用、WINSサーバによる名前解決、LDAP連携の可能)ADドメインのドメインコントローラ構築ができる(Keroberos認証、DNSによる名前解決、LDAP内蔵)
ファイルサーバSMB2に対応SMB2,SMB3に対応

Samba3.0系のデーモンプロセス

Samba3.0系のデーモンプロセスはsmbdnmbにより提供される。

  • smbd * ファイル/プリント共有とユーザ認証機能 * ポート番号:139/TCP,445/TCP(SMB without NetBIOS)
  • nmbd * ブラウジング/NetBIOS名前解決機能 * ポート番号:137/UDP,138/UDP
  • winbindd * Linuxアカウント/Windowsアカウントを統合的に扱う仕組み * ポート番号: 445/TCP

Samba4.0系のデーモンプロセス

Samba4.0系のデーモンプロセスは3.0系に加えて以下のプロセスが追加されている。

  • samba
    • ActiveDirectoryドメインコントローラ機能
      • Keroberos認証
        • ポート番号:88/TCP・UDP
      • LDAP
        • ポート番号:389/TCP・UDP,636/TCP
      • Global Catalog * ポート番号:3268/TCP,3269/TCP

1.2. Sambaの設定

1.2.1. Sambaの起動

Sambaのコマンドによる起動

Sambaの起動方法はSystemdのシステムでは以下の通り。

systemctl start smb.client
systemctl start nmb.service

SysVinitを採用したシステムでは以下の通り。

/etc/init.d/smb start

testparmコマンド

testparmコマンドはsmb.confにミスがないかチェックできるコマンド

testparm [オプション]
オプション説明
-s構文チェック後Enter押さなくてもsmb.conf内容を表示
-v構文チェック後smb.confに記述されていない内容も表示

レジストリを使用した起動方法

設定ファイルを極力使用せずに、レジストリを使用して設定を行う方法がある。 この方法によるSambaのメリットは以下の通り。

  • Sambaサーバにログインせずにリモートで設定を行える
  • Sambaのデーモンの起動にかかる時間が短くなる。これはデーモンは必要なタイミングまでレジストリの設定データを読み込まないため。
  • 設定反映についてSambaのデーモンのリロードが不要になる

なお、レジストリベースのSamba設定とはWindowsのレジストリのような、階層を持つキーと値による設定形式のことであり、レジストリベースであっても設定自体は設定ファイル(バックエンド)に保存される。

1.2.2. smb.conf

Sambaサーバの設定はsmb.confファイルで行う。 なお、パッケージからインストールした場合は/etc/samba、ソースコードからインストールした場合は/usr/local/samba/etcディレクトリに格納される。

smb.confは全体設定、共有定義から構成される。

smb.confの構造は以下の通り。 コメントアウトは#;で可能。

# 全体設定
[global]
パラメータ名 = 値

# 共有定義
[homes]
パラメータ名 = 値

[printers]
パラメータ名 = 値

[セクション名1]
パラメータ名 = 値

[セクション名2]
パラメータ名 = 値
セクション説明
globalSamba全体設定
homes各ユーザのホームディレクトリ
printes共有プリンタの設定
共有名指定した共有に適用される設定

なお各セクションの真偽値はyes/true/1,no/false/0が使用できる。

globalセクションの設定

globalセクションではsmaba全体の設定を行う。 なお変更後はsambaの再起動が必要となる。

主要な項目は以下の通り。

[global]
    # Sambaサーバが所属するワークグループ名もしくはドメイン名を指定する
    workgroup = ワークグループ名|ドメイン名

    # Sambaサーバの動作モードを指定する
    server role = 動作モード
    # サーバ動作モード
    # AUTO : securityパラメータの設定に従う(デフォルト)
    # STANDALONE : スタンドアロンのサーバ
    # MEMBER SERVER : ドメインのメンバーサーバ
    # CLASSIC PRIMARY DOMAIN CONTROLLER : NTドメインのプライマリーコントローラ(PDC)
    # CLASSIC BACKUP DOMAIN CONTROLLER : NTドメインのバックアップドメインコントローラ(BDC)
    # ACTIVE DIRECTORY DOMAIN CONTROLLER : Active Domainのドメインコントローラ

    # NetBios名の指定
    netbios name = NETBios名

    # サーバの名前や説明の指定
    server string = コメント

    # 接続を許可するホストの指定(記載されていないホストは接続拒否)
    hosts allow = ホスト

    # ファイル共有に使用するポート(プロトコル)の優先順位の設定
    smb ports = 445 139 # CIFS優先

    # Guestアカウントの定義(アカウントが存在しないユーザにGuestとしてアクセスさせれる)
    guest account = ゲストユーザ名

    # Sambaユーザとして認証できない際の動作の指定
    map to guest = Never | Bad User | Bad password
    # Never: ゲスト認証の否認
    # Bad User: 存在しないユーザの指定でゲスト認証とみなす
    # Bad Password: Bad Userに加えてパスワード入力ミスの場合もゲスト認証とみなす

    # ログファイルの指定(「%m」で接続元ホストごとにログを分けれる)
    log file = ログファイル名

    # ログファイルの最大サイズをKB単位で指定
    max log size = サイズ

    # SambaサーバのログをWindowsのイベントビューアから参照する機能
    eventlog list = イベントログ名

    # ハッシュ値を用いた暗号化パスワードの使用を設定
    encrypt passwords = Yes | No

    # パスワード認証をsmbpassword方式で行う場合のパスワードファイルの指定
    smb password file = パスワードファイルのパス

    # SambaのパスワードとLinuxのパスワードを同期させるかの設定
    unix password sync = Yes | No
    passwd program = パスワードコマンドのパス
    passwd chat = 期待させる文字列

    # UNIXユーザを別ユーザ名とマッピングさせる
    # 「UNIXユーザ名=Windowsマシンのユーザ名」のように記述
    username map = マッピングファイル名

    # ログオフ時に実行するスクリプトファイルの指定
    logon script = スクリプトファイル名

    # SambaサーバをWINSサーバとして動作させる場合にYesを設定
    wins support = Yes | No

    # WINSサーバのIPアドレスをIPアドレスを指定する
    wins server = IPアドレス

homesセクションの設定

homeセクションでは各ユーザのホームディレクトリを指定する。

[home]
    browseable = no     # homesをブラウザリストに表示しない
    valid users = %S    # 共有にアクセス可能なユーザを制限

printersセクションの設定

共有プリンタの設定

[printers]
    printable = yes | no # スプールフォルダへの印刷データ書き込み許可設定
    path = スプールディレクトリのパス

共有名セクションの設定

指定した共有に適用される設定(以下例ではshare)を指定する。

[share]
    # コメントの指定
    comment = コメント

    # ブラウジングしたときの表示設定
    browseable = Yes | No

    # 書き込みの許可設定
    writeable = Yes | No
    read only = No | Yes

    # 共有ディレクトリのパスを指定
    path = ディレクトリのパス

    # 読み取り不可能なリソースの設定
    hide unreadable = yes | no

    # 共有内に作成するファイル/ディレクトリの所有者/グループを強制的に変換
    force user = ユーザ名
    force group = グループ名

    # 書き込みが例外許可されるユーザ/グループの指定
    write list = ユーザ名 | @グループ名

    # 「.」で始まる名前のファイル/ディレクトリを表示しないように隠し属性の適用の指定
    hide dot files = Yes | No

    # 任意の名前のファイルやディレクトリを表示させたくない場合に指定。「/」で複数指定可能。
    veto files = /ファイル名/

    # 共有内にファイルやディレクトリを作成する場合のパーミッション設定
    ############ AND演算 ##########################
    # ファイルに適用可能なパーミッション(Default:0744)
    create mask = mode
    # ディレクトリに適用可能なパーミッション(Default:0755)
    directory mask = mode
    ############ OR演算 ###########################
    # 必ずファイルに適用されるパーミッション(Default:0000)
    force create mode = mode
    # 必ずディレクトリに適用されるパーミッション(Default:0000)
    force directory mode = mode
    ###############################################

    # アクセス可能ユーザの指定
    valid users = ユーザ名

    # Guestユーザのログイン許可の指定
    guest ok = Yes | No
    public = yes | No

1.2.3. Samba変数

Sambaの設定ファイルsmb.confでは変数を使用できる。 以下のようなものがある。

変数説明
%D現ユーザーが所属するドメイン/ワークグループ名
%LサーバのNetBIOS名
%mクライアントのNetBIOS名
%Uサーバに接続しているユーザ名
%G%Uのプライマリグループ
%Sユーザが接続した共有名
%u共有に接続しているユーザ名
%g%uのプライマリグループ
%H%uのホームディレクトリ

1.3. Sambaの通常メンテナンス

1.3.1. Sambaの制御

Sambaを制御するための手段として構成ファイルに設定を記述する方法(smb.confの編集)とプログラムにメッセージを送る方法(smbcontrolコマンド)がある。

smbcontrolコマンド

smbcontrolはSambaのプロセス(smbd、nmbd、winbindd)にメッセージを送って制御するためのプログラムのこと。

smbcontrol [destination] [message-type] [parameter]
# 例
smbcontrol smbd shutdown
  • [destination] … メッセージの宛先を指定
    • smbd,nmbd,winbindd or allで指定
  • [message-type] … プロセスに送るコマンド
    • shotdown:デーモン停止
    • reload-config:設定ファイルの再読み込み
    • dubug ログレベル:指定したログレベルに変更
    • debuglevel:デバックレベルを問い合わせて表示
  • [parameter] … パラメータを必要とするコマンドの場合

smbstatusコマンド

Sambaサーバに接続しているクライアントの確認/サーバの稼働状況を確認できるコマンド。

共有に接続しているクライアントのユーザ名、グループ名、接続元IPアドレスとポートに加え、接続を受け付けたSambaのプロセスIDを表示する。

smbstatus

1.3.2. Sambaのログレベル

[global]セクションで使用されるログ設定に関わる主な設定項目は以下の通り。

項目説明
log file = ファイル名ログファイルを指定
log level = レベルログレベルの指定
max log size = キロバイトログファイルの最大サイズの指定
debug timestamp = yes/noログファイルに時刻を出力するかどうか
dubug hires timestamp = yes/noログファイル二秒単位以上の時刻を出力するか指定
debug pid = yes/noログファイルにPIDを出力するかどうか
debug uid = yes/noログファイルにUIDを出力するかどうか
eventlog list = イベントログ名SambaサーバのログをWindosのイベントビューアから参照する機能

Samba3系からはクラスごとにログレベルを設定できる。 使用できる主なクラスは以下の通り。

  • all … すべてのクラス(デフォルト)
  • tdb … TDBに関するログ
  • smb … SMBプロトコルのデバッグに関するログ
  • passdb … パスワードデータベースに関するログ
  • auth … 認証に関するログ
  • winbind … Winbindに関するログ

例)ログレベルを、パスワードデータベース関連は3、認証関連は4、その他は1に設定する場合

log level = 1 passdb:3 auth:4

1.4. Sambaのトラブルシューティング

1.4.1. TDB(Trivial Datadase)

TDB(Trivial Datadase)はSamba3.0から使用可能になったバイナリ形式の簡易データベースで様々な情報が格納されている。

smb -bコマンド

smb -bコマンドはTDBのディレクトリを確認できるコマンド

出力内容は長いため、通常はgrepコマンドを使用して必要な設定を確認する。

smb -b

tdbbackupコマンド

TDBファイルの検査およびバックアップとリストアを行うコマンド

tdbbackup [-v] TDBファイル名

-vTDBファイルの検査と、問題がある場合はバックアップからリストアを行うオプション。

tdbdumpコマンド

TDBファイルの内容表示を行うコマンド。

tdbdump

tdbtoolコマンド

TDBファイルの対話的な管理を行うコマンド。

tdbtool

tdbrestoreコマンド

tdbバックアップからリストアするコマンド。

tdbrestore > <リストアファイル> <  <バックアップファイル>

1.4.2. TDBファイル

Sambaが使用するデータベースファイルにはsercret.tdbregistory.tdbがある。

secret.tdb

Sambaが認証情報(ユーザー名、パスワードなど)を格納するためのデータベースファイル。

Sambaサーバーがユーザー認証を行う際に使用される。 通常、このファイルには、ユーザーのパスワードハッシュやアクセス許可情報などが保存される。

具体的に保存されるデータは以下のものがある。

  • machine/domain (SID)
  • LDAPと共に使用される秘密パスワード
  • machine 秘密トークン

registory.tdb

Sambaサーバーの設定情報を格納するためのデータベース。 Windowsレジストリのように、Sambaサーバーの構成や設定を管理する。

例えば、共有フォルダの設定、ユーザーのアクセス権限、ネットワークのパラメータなどがこのファイルに保存される。

1.4.3. Sambaパスワードデータベースに問い合わせ

smbpasswdコマンド

Sambaのパスワードデータベースを管理するためのユーティリティ。 パスワードの設定、変更、削除などを行う際に使用する。

smbpasswd

pdbeditコマンド

Sambaのパスワードデータベースを直接操作するための高度なユーティリティ。 ユーザーアカウントの追加、削除、属性の変更など、より広範な管理作業が可能。

pdbedit
オプション説明
-Lv詳細の表示
-aユーザの追加
-xユーザの削除

1.4.4. LDAP

LDAPとは

LDAPはネットワーク機器やユーザーID、パスワードを管理するディレクトリサービスの維持やアクセスを行うプロトコルのこと。 堅く言うと、X.500をベースとしたディレクトリサービスに接続するために使用されるプロトコルでDAPを軽量化したものともいえる。

一般的にLDAPは一元管理の認証サーバを構築する際に使用される。 LDAPによりユーザやリソースに関する情報を検索したり管理することができる。

LDIF

LDIFはディレクトリ内の情報を記述するファイル形式のこと。 LDAPサーバにディレクトリ情報を登録、変更する場合に使用される。 記法は以下の通り。

dn: 識別名
属性名: 値
属性名: 値
   :    

LDIFファイルでは最初の行でエントリの識別名(DN)を記述する。 また、複数のエントリを記載する場合は空行で区切り、コメントは行頭に「#」をつける。

なお、属性値は通常UTF-8のテキストで記載するが、バイナリデータなどの特殊なデータを指定する場合は「属性名::属性値」のようにし、属性値にはBase64でエンコードした値を指定する。

ldbsearchコマンド

LDAPデータベース内のエントリーを検索するためのコマンド。 指定されたクエリやフィルタを使用して、LDAPディレクトリ内の情報を検索する。

例えば、ユーザーアカウントやグループ、機器などの情報を検索するために使用される。

ldbsearch
オプション解説
-h 検索を行うLDAPサーバーのホストを指定します。
-b 検索のベースDNを指定します。
-s 検索のスコープを指定します。デフォルトはbaseで、oneまたはsubを指定できます。
-D バインドに使用するDNを指定します。
-Wパスワードをプロンプトで入力するように求めます。

ldbmodifyコマンド

LDAPデータベース内のエントリーを変更するためのコマンド。

LDIFファイルを使用して、エントリーの属性を変更する。 これにより、ユーザーの属性の更新やグループメンバーシップの変更などが可能になる。

ldbmodify
オプション解説
-h 変更を行うLDAPサーバーのホストを指定します。
-b 変更の対象となるエントリーのベースDNを指定します。
-D バインドに使用するDNを指定します。
-Wパスワードをプロンプトで入力するように求めます。

ldbeditコマンド

インタラクティブな方法でLDAPエントリーを編集するためのコマンド。

エディタを介してエントリーの属性を直接編集できる。これは、手動でのエントリーの編集が必要な場合に使用される。

ldbedit
オプション解説
-h エディットするLDAPサーバーのホストを指定します。
-b エディットの対象となるエントリーのベースDNを指定します。
-D バインドに使用するDNを指定します。
-Wパスワードをプロンプトで入力するように求めます。

ldbaddコマンド

LDAPデータベースに新しいエントリーを追加するためのコマンド。

追加するエントリーの情報を含むLDIFファイルを使用する。ユーザーアカウントやグループ、機器などの新しいエントリーをLDAPディレクトリに追加する際に使用される。

ldbadd
オプション解説
-h エディットするLDAPサーバーのホストを指定します。
-b エディットの対象となるエントリーのベースDNを指定します。
-D バインドに使用するDNを指定します。
-Wパスワードをプロンプトで入力するように求めます。

ldbdelコマンド

LDAPデータベースからエントリーを削除するためのコマンド。

削除するエントリーのDNを指定して使用する。 ユーザーアカウントやグループの削除など、LDAPディレクトリからエントリーを削除する際に使用される。

ldbdel
オプション解説
-h 削除を行うLDAPサーバーのホストを指定します。
-D バインドに使用するDNを指定します。
-Wパスワードをプロンプトで入力するように求めます。

3.2 - 2.SambaとActiveDirectory

【LPIC300範囲】SambaでAD互換機能を提供できるよ~っていう説明

2.1. ActiveDirectoryドメインコントローラとしてのSamba

2.1.1. ActiveDirectory

ActiveDirectoryとは

ActiveDirectoryはWindowsのサーバの機能で、ネットワークにつないでいるクライアント端末やサーバー、プリンター、アプリケーションなどの情報を収集し、一元管理できるディレクトリサービスのこと。アカウントの管理を行うディレクトリ・サービス・システムともいえる。

ActiveDirectoryを使用するメリットは全てのネットワークリソースを、一つのオブジェクトとして、一元管理することが出来るようになることにある。

ドメイン環境とドメインコントローラ(DC)

ActiveDirectoryではユーザやコンピュータなどのリソースがドメインに参加することによりリソースの一元管理することが可能となう。 この一元管理にはドメインコントローラ(DC)と呼ばれる専用サーバが使用される。

ドメインコントローラによる認証手順は以下の通り

  1. ユーザがドメイン参加コンピュータにログインする
  2. 認証データをドメインコントローラに送信する
  3. ドメインコントローラで認証データが正しいと確認できた場合チケットを発行し返送する
  4. チケットを受け取ったクライアントはチケットを提示してアクセス先コンピュータで認証を試みる
  5. アクセス先コンピュータはチケットがドメインコントローラで発行されたか確認し、正しければクライアントアクセスを許可する

上記認証方式はKeroberos認証と呼ばれる。

2.1.2. ActiveDirectoryの構成要素

ドメイン

ドメインはActiveDirectoryの基本単位Active Directoryデータベースを共有する範囲のこと。 言い換えるとACtiveDirectoryの管理が及ぶ範囲のこと。 ドメインを作成することで、組織のユーザー・グループ・コンピューターを集中して管理することが可能になる。

ActiveDirectoryデータベースにはユーザーオブジェクトをはじめとする、各オブジェクトの登録情報、共有フォルダやプリンタの情報、システムの構成情報などが保存される。

OU(組織単位)

OU(組織単位)は入れ物のことで、複数オブジェクトを簡単に管理することが可能なもののこと。 これはドメインで管理するリソースが増加した場合に、バラバラ管理となり負担がかかるのを防ぐためにある。

またOUはグループポリシー設定を割り当てたり、権限を委任することができる、最小単位となる。

ドメインツリー

ドメインツリーはドメインを複数に分け管理する機能*で、ユーザーオブジェクトやコンピューターオブジェクトの経営方針が異なる場合に使用できる。

ドメインツリーでは複数のドメインを作成するとき、親ドメインの下に子ドメインを作成することになるがこの際に必ず親ドメインからドメイン名の一部を継承する。 そして互いのドメインソースを利用できる関係性=「信頼関係」が結ばれることで、別のドメインで管理されていても、リソースを共有することが可能になる。

フォレスト

フォレストはドメインツリー同士に信頼関係を持たせた状態のこと。 同じ組織内でも、名前の階層を分けたい場合に用いる。また、フォレストはActive Directory構造におけるグループの最大単位となる。

フォレストは1つ以上のドメインツリーで構成されるため、実際には1つのドメインツリーでもフォレストとなり得る。

フォレスト構築の要件は以下の通り。

  • Active Directoryを拠点ごとに全く別々に管理を行う場合
  • Active Directoryを導入している企業同士が合併する場合
  • 組織内に異なる名前空間にしたいドメインツリーが複数存在する場合

2.1.3. FSMO(操作マスタ)

FSMO(操作マスタ)はドメインコントローラ(DC)の中で一番信頼する(優先する)ドメインコントローラのこと。 これはDCを複数構築している環境で、それぞれのDCから矛盾する設定を適応されてしまうと困ってしまうため、優先するDCを決めるということである。

FSMOの種類

FSMOには以下の種類がある。

操作マスタ役割構成
スキーママスタスキーマの原本(各オブジェクトに対するデータ型の定義情報)をもつドメインコントローラフォレストで1台のみ
ドメイン名前付けマスタドメインを追加したり削除したりする際に必要となるドメインコントローラフォレストで1台のみ
RIDマスタSIDを構成するために必要な「RID」情報を保持しているドメインコントローラドメイン全体で1台
PDCエミュレータアカウントのパスワードやロックアウト情報を管理しているドメインコントローラドメイン全体で1台
インフラストラクチャマスタドメイン内のユーザーやコンピューターと、グループアカウントのメンバー情報とのマッピング情報を保持ドメイン全体で1台

2.1.4. ドメインコントローラ(DC)のレプリケーション

ドメインコントローラはユーザ認証など重要な役割を果たすサーバであるため、もしドメインコントローラーにトラブルが発生して利用できなくなれば、システム全体に大きな影響を及ぼす。そこで一般的にはドメインコントローラーは2台以上のサーバーを用意し、何かあった場合に備え、どちらのサーバーも同じ役割を果たせるようにする

このとき、2台のドメインコントローラーは、同じ内容のデータベースを保持していなければならない。 そこでドメインコントローラはレプリケーションと呼ばれる、ドメインコントローラー同士が定期的にデータベースの内容を確認し、自動的にその内容を同一にするための同期処理を行っている。

2.1.5. ActiveDirectoryデータベースとSYSVOLフォルダ

ADには情報を管理するために、ActiveDirectoryデータベースとSYSVOLフォルダがある。

ActiveDirectoryデータベース

ドメインのユーザーやグループ、コンピューターアカウントなど、ドメインの管理に必要な各種オブジェクトの情報が管理されているデータベース。 DC間で自動レプリケーションする。

SYSVOLフォルダ

グループポリシーと呼ばれるドメインに参加している各コンピューター端末にシステム設定を配布する設定情報に関するデータが管理されているフォルダ。 DC間でレプリケーションしない。

rsyncrobocopyを用いてレプリケーションを行うように設定できる。

2.1.6. GlobalCatalog

GlobalCatalogはActiveDirectory内の全てのドメインの一部の属性を保持する特別なデータベースのこと。 GlobalCatalogによりクロスドメインの検索やクエリが高速化される。

ポートは3268/TCP3269/TCPが使用される。 なお通常、GlobalCatalogはActive Directoryの最初のドメインコントローラー(通常はフォレストのルートドメイン内のもの)に配置される。

Partial Attribute Se(PAS)

PASはグローバルカタログ内で保持される属性の部分集合のこと。 特定の属性のみをグローバルカタログに保持することにより、クライアントが迅速かつ効率的に検索やクエリを実行できる。

2.1.7. Samba-AD-DC

Samba-AD-DCとは

Samba-AD-DCはWindowsベースのActive Directory(AD)ドメインコントローラと互換性のある機能を提供することを目的とするOSSのソフトウェア。 Samba-AD-DCは、特に中小企業や教育機関などで、Windows環境とLinux/UNIX環境の統合を必要とする場合に役立つ。

Samba-AD-DCは、以下の主な機能を提供する。

  • ActiveDirectory互換性
    • Windowsクライアントや他のActive Directoryリソースと連携できる
    • LinuxやUNIXサーバーがWindowsベースのネットワークに統合され、シングルサインオン、ユーザー認証、アクセス制御などのActive Directory機能を利用できる
  • ドメインコントローラ機能
    • ドメイン内のユーザーアカウント、コンピュータアカウント、ポリシー、セキュリティグループなどの管理するドメインコントローラとして機能する
    • ユーザーとリソースの管理を中央集権化し、セキュリティと管理を向上させることができる
  • LDAPサーバ
    • LDAPサーバーを提供し、ディレクトリサービスの要件を満たす。ユーザー情報や認証情報などを保存および検索するために使用される。
  • DNSサーバ
    • Active Directoryに関連するDNSサービスも提供する。ドメイン内のリソースの名前解決が可能になり、正確なドメイン構造が維持される。

2.2. ActiveDirectoryの名前解決

2.2.1. ドメインコントローラの検索

ドメインコントローラを見つけ出すのにDNSが使用される。 このDNSはドメインコントローラ(DC)を作成した際にSRVレコードAレコードが生成されるので、これをDNSサーバに登録することで利用できる。

  • SRVレコード … ドメインコントローラーが提供するサービスが登録されているリソースレコード
  • Aレコード … ホスト名をIPv4に変換するためのリソースレコード

2.3. ActiveDirectoryのユーザ管理

2.4. Sambaドメインメンバーシップ

2.5. Sambaのローカルユーザ管理

3.3 - 3.Samba共有の設定

【LPIC300範囲】未記載

3.1. ファイルの共有設定

3.2. ファイル共有のセキュリティ

3.3. DFS共有構成

3.4. プリンタ共有の設定

3.4 - 4.Sambaクライアントの設定

【LPIC300範囲】未記載

4.1. Linux認証クライアント

4.2. Linux CIFSクライアント

4.3. Windowsクライアント

3.5 - 5.Linuxアイデンティティ管理/ファイル共有

【LPIC300旧範囲】FreeIPA(Linux認証基盤)に関する説明

5.1. FreeIPAのインストール/メンテナンス

5.1.1 FreeIPA

FreeIPAはLinuxの統合認証基盤のこと。 オープンソースで開発されており、KerberosやDNS, SELinuxなどを用いて統合された認証環境を提供する。 なお、IPAはIdentity, Policy, Auditの略である。

また、クライアントのコンポーネントとしてSSSDを使用している。

FreeIPAで管理できる対象(エンティティ)には以下の通り。

  • ユーザ/グループ
  • SMB共有
  • SSH認証鍵

FreeIPAのコンポーネント

FreeIPAは以下のコンポーネントで構成されてる。 またFreeIPAのコンポーネントには汎用のLinuxシステムが統合されている。

コンポーネント説明
389 Directory ServerLDAP
MIT Keroberos認証サービス
Dogtag Certificate SystemPKI(公開鍵基盤)
NTP時刻同期
DNSIPアドレス/ドメインの紐づけ
SSSD識別/認証サービス管理
Certmonger証明書期限の監視/更新

5.1.2. FreeIPAのインストール

FreeIPAは、インストール自体はスクリプト化されており容易にできる。 求められるスペックは以下の通り。

  • ユーザ数 10,000、グループ数 100 … 最低 2GB の RAM と 1GB のスワップスペース
  • ユーザ数 100,000、グループ数 50,000 … 最低 16GB の RAM と 4GB のスワップスペース

FreeIPAサーバ/ドメインのインストール

  • ipa-server-install … IPAサーバのインストール
  • ipa-client-install … IPAクライアントのインストール
  • ipa-replica-install … IPAサーバのレプリカインストール
  • ipa-replica-prepare … IPAサーバのレプリカ用イメージファイル作成
  • ipa-replica-manage … IPAレプリカサーバの設定確認など

5.1.3. ADのレプリケーションとKerberosのCrossRealm認証

Kerberosではrealmという管理対象ノード群の枠組みがある。 realmは複数作成することができるが、複数のrealm間で相互に信頼関係を構築する方法をCrossrealmと呼ぶ。

CrossRealm認証によりADとの信頼関係を構築することで、ADドメインに参加しているユーザがLinuxマシンへSSOができるようになったり、Linuxドメインのサービスやリソースへアクセスできるようになる(Windowsクライアントの管理はできません)。

IPAとADとのCrossRealm認証はipa-adtrust-installによるSamba(CIFS)の構築とipa trust-addコマンドによる信頼関係の構築を行う必要がある。

sudo、autofs、SSHおよびSELinuxの統合

FreeIPAのクライアントではSSSDがデフォルトで構成される。 SSSDによって、sudoの統合、ホストベースのアクセス制御(HBAC)のポリシー、SELinuxユーザマッピングなどができるようになる。 これらの設定は、FreeIPAの4.0以降のバージョンでは基本的にインストール時に設定される。

  • sudo … LDAPにファイルを登録することにより統一的に管理することができる
  • SSH … LDAPに公開鍵をインストールすることで、ホストローカルな設定ファイルをドメイン対応させることができる
  • SELinuxユーザマッピング … SELinuxでは、ホストベースのアクセス制御(HBAC)をドメインに提供する。リモートユーザや新しいホストの追加時に一貫した制御ポリシーを適用・管理できる

5.1.4. ipaコマンド

ipaコマンドはFreeIPAでユーザ・グループの管理やドメインの操作などを行うことができるコマンド。

ipa <コマンド> [パラメータ]
コマンド説明
user-addユーザの追加
user-delユーザの削除
group-addグループの追加
group-delグループの削除
user-findユーザの検索
group-add-memberグループへのユーザ追加
user-showユーザ情報表示
group-showグループ情報表示
trust-addドメインの信頼関係追加

5.2. FreeIPAのエンティティ管理

5.3. FreeIPAのActiveDirectoryインテグレーション

5.4. ネットワークファイルシステム(NFS)

5.4.1. NFSv4

NFS(Network File System)はLinuxでの一般的なファイル共有プロトコル。 NFSv4はNFSのVersion4.0。

NFSv4の主な特徴は以下の通り。

  • セキュアな認証メカニズム「Kerberos」「SPKM」「LIPKEY」の導入
  • 擬似(Pseudo)ファイルシステムの提供
  • ACLによるアクセス制御
  • パフォーマンスの改善(一部の権限をクライアント側へ委譲)

NFSv4の認証メカニズム

NFSv4では、セキュアな通信を確立するために以下の認証メカニズムが採用された。

認証メカニズム説明
KeroberosSSOを使用可能にする
SPKMシンプルな公開鍵基盤を提供する認証方式
LIPEKYSPKMを使用したクライアント-サーバ間で暗号化通信を行う

疑似(Pseudo)ファイルシステム

擬似(Pseudo)ファイルシステムは複数のファイルシステムをクライアント側で一つのツリーに見せかけることができる仕組み。 これはNFSv3の欠点を補った仕組みともいえる。

NFSv4サーバの設定

  • /etc/exports
    • NFSv4の共有ディレクトリの設定は/etc/exportsで行う
  • /etc/idmapd.conf
    • NFSv4のデーモンの挙動を設定する

5.4.2. CIFS

CIFSはSMBを拡張したファイル/プリンタ共有などのプロトコル。 CIFSはWindows系OS以外でも利用できるように仕様が公開されている。

CIFSには以下のような特徴は以下の通り。

  • Unicodeに対応
  • oplockと呼ばれる便宜的ロックにより、共有ファイルへのロック情報をクライアントでキャッシュすることで高いパフォーマンスを発揮

CIFSによるファイル/ディレクトリのパーミッション

Linux上でマウントしたWindowsマシンの共有は、デフォルトでrootユーザが所有者として設定され、一般ユーザでは書き込みができない。 WindowsのファイルシステムにはLinuxのような所有者やパーミッションの仕組みが無いため起こる 。 Windowsマシンの共有の所有者やパーミッションを設定するには、マウント時のオプションとしてUIDやGID、ファイルやディレクトリのパーミッションを指定する必要がある。

CIFSのセキュリティモード

  • NTLM(NT LAN Manager authentication) * Windows OSのネットワークにおける認証方式の一つ * 共有フォルダや共有プリンタなどに利用される
  • Keroberos * SSO認証を可能にする認証方式

CIFSのマウント/アンマウント

CIFSのマウントにはmount.cifsコマンド、もしくはmount -t cifsを使用する。 なおアンマウントはunmountコマンドで行う。

setcifsaclコマンド

CIFSのACLに関する操作を行うコマンド。

setcifsacl <オプション>

getcifsaclコマンド

CIFSのACLに関する操作を行うコマンド。

getcifsacl <オプション>

3.6 - 6.Linuxの暗号化

【LPIC303範囲】SSL/TLS、Linuxファイルシステム、DNSの暗号化のための解説

6.1. 暗号化の基礎

6.1.1. 暗号化とは

暗号化は暗号文を使用して通信と情報を保護する手法のこと。

コンピュータサイエンスにおいて、暗号化は、解読が困難な方法でメッセージを変換するための、数学的概念とアルゴリズムと呼ばれる一連のルールベースの計算から派生した安全な情報および通信技術を指す。 これらの決定論的アルゴリズムは、暗号キーの生成、デジタル署名、データ プライバシーを保護するための検証、インターネット上の Web ブラウジング、クレジット カード取引や電子メールなどの機密通信に使用される。

暗号化の用途

  • 暗号化 … 情報をその本当の意味を隠す秘密コードに変換する方法。情報の暗号化と復号化の仕組みは暗号化と呼ばれる
  • 完全性 …. 情報は、変更が検出されない限り、保存中または送信者と目的の受信者の間での転送中に変更されることはないことを保証する
  • 認証 … 送信者と受信者は、互いの身元と情報の発信元/宛先を確認できる

暗号化の主要な要素

暗号化には2つの主要な要素がある。

  • キー … データの暗号化に使用されるもの。秘密にしておく必要がある
  • アルゴリズム … メッセージのエンコードとデコードに使用されるメソッドのこと。

共通鍵暗号方式(対称暗号方式)

共通鍵暗号方式は暗号化と復号を同じ鍵で行うもの

AESDESblowfishなどが代表例としてある。

このタイプの暗号化は、平文を暗号文に暗号化し、その暗号文を平文に復号化するために同じ鍵が使われるため対称と言える。 一般的に、非対称暗号化よりも高速となる。

公開鍵暗号方式(非対称暗号方式)

公開鍵暗号は暗号化/復号化に公開鍵ペアを使用する暗号。 対になる鍵の一方が公開鍵で、もう一方が秘密鍵となる。

説明
公開鍵一般にアクセス可能なリポジトリで公開され、公開鍵ペアの所有者と通信する必要がある人は誰でもアクセス可能
秘密鍵秘密鍵は所有者のみが所有する

これらの鍵はそれぞれ平文を暗号化された暗号文に変換することができるが、 一方の鍵で暗号化された暗号文はもう一方の鍵でしか復号できない

特徴は以下の通り。

  • 公開鍵で暗号化された暗号文は秘密鍵でしか復号化できない
  • 秘密鍵で暗号化された暗号文は公開鍵を使ってのみ復号できる
  • 共有秘密鍵を交換することなくメッセージを送信できる

またRSA暗号方式による秘密鍵の生成に関しては「512bitや1024bit程度の長さは容易に計算できる」とされているため、2048bit以上の長さを用いることが推奨されている。

ハッシュによるデータの整合性

ハッシュ関数を用いた暗号化では特定のデータを一定長の固定サイズの値に変換する暗号化を行う。この変換された値はハッシュ値と呼ばれる。

ハッシュの特徴は以下の通り。

  • ハッシュ関数は固定長の出力を生成する
  • ハッシュ値から元のデータを再構築するのは困難(一方向性)
  • セキュリティを向上させるためにソルトを使用してハッシュ化する方法がある
  • ハッシュアルゴリズムにはCRC2(非推奨)md5、**sha-1*などがある

6.1.2. 公開鍵基盤(PKI)とトラストチェーン

公開鍵基盤(PKI)

PKI(公開鍵基盤)は異なるコンピュータシステム間の通信を保護するために使用されるシステムのこと。 暗号化に用いられる「公開鍵」と「公開鍵の持ち主」の関係を保証する仕組みともいえる。

PKIは暗号化キーのペアとデジタル証明書に基づき、公開鍵基盤は認証局の階層と証明書署名要求プロセスで構成される。

認証局(CA)

認証局(CA)はWeb サイト、電子メール アドレス、企業、個人などの身元を検証するために機能する組織のこと。 公開キーの信頼性を検証する第三者といえる。

デジタル証明書として知られる電子文書の発行を通じて、それらを暗号キーにバインドする。 公開キーの信頼性を検証する信頼できる第三者機関と言える。

認証局には以下の役割がある。

  • 有効なCSRに署名する
  • 秘密鍵のセキュリティを維持する
  • 侵害された証明書または悪用された証明書を取り消す

証明書署名要求(CSR)

証明書署名要求(CSR) は基本的に生成される公開キーであり、CA に送信して署名を受けることができるもの。

CAがCSRに署名すると、署名したCAによって信頼される証明書が生成される。

OCSP/CRL

OCSP (オンライン証明書ステータス プロトコル) または CRL (証明書失効リスト) を使用して証明書を無効にするための仕組み

CAによって使用される。

トラストチェーン

トラストチェーンはX.509が想定する認証局のシステムも、認証局が下位の証明局を認証し、その下位の認証局がさらにその下に位置する認証局を認証する…といった証明の連鎖で成り立つことを想定し「信頼できるものが署名したものは信頼の連鎖に加えられる」という前提に成り立っている様子のこと。

6.1.3. 公開鍵証明書(ディジタル証明書)と認証局

公開鍵暗号方式においては公開鍵証明書によって公開された鍵が意図している所有者のものであることが保証されている必要がある。

公開鍵証明書は、信頼できる第三者として認証局(CA:Certification Authority)によりデジタル署名(後述)されて発行され、その証明書に含まれる公開鍵の真正性と有効性(公開鍵の所有者が正当な所有者であること、証明書が有効期限内であること等)を保証する仕組みです。ちょうど、公的身分証明書が、信頼できる公的機関の発行証明によって信頼性を担保するのと似ている。

公開鍵証明書には、公開鍵そのものに加えて発行者の情報や有効期間などの情報が含まれる。

ディジタル署名

デジタル署名はデータが通信の途中で改ざんされていないこと、またメッセージが作成者本人のものであることを証明するための技術

デジタル署名は送信するメッセージからハッシュ関数を用いてメッセージダイジェスト(MD)を求め、MDから秘密鍵を用いて署名を生成し送信する。 受信者は、公開鍵を用いて署名を検証(MDを復号)する。

またメッセージからMDを求め、復号したものと照合し、一致していることを確認するという仕組みといえる。

認証局(CA)

認証局(CA)はWeb サイト、電子メール アドレス、企業、個人などの身元を検証するために機能する組織のこと。

デジタル証明書として知られる電子文書の発行を通じて、それらを暗号キーにバインドする。 公開キーの信頼性を検証する信頼できる第三者機関と言える。

認証局には以下の役割がある。

  • 公開鍵証明書の発行 * 認証局は電子証明書の発行依頼を受けて、申請内容と証明書署名要求(CSR※)と呼ばれる情報を精査した上で公開鍵証明書を発行する
  • 公開鍵証明書の失効、CRLの発行 * 認証局は申請を受けて証明書の失効手続きを行い、証明書が失効されていることを以下の二つの手段で公開する * 証明書失効リスト(CRL:Certificate Revocation List)の発行 * OCSP(Online Certificate Status Protocol)への応答

また認証局にはパブリック認証局とプライベート認証局(オレオレ認証局,自己証明認証局)がある。 パブリック認証局の発行したルート証明書(認証局が自らの正当性を証明するために発行するデジタル証明書)は、いわゆる公的機関の証明書の扱いであり一般的なメーラやブラウザに組み込まれている。対してプライベート認証局は社内などの制限された場だけで利用することを想定されたもの。運用規定を自由に設定できるという柔軟性がある。

6.1.4. サーバ証明書とクライアント証明書

サーバ証明書

サーバ証明書はでクライアントがアクセスしているサーバが確かに目的の相手に間違いないことを確認するために使用されるもので、サーバの公開鍵を含んだ証明書に認証局が署名をして発行されているのが一般的となる。企業内などでは、プライベート認証局を使って自己署名が行われる場合もある。

Webサイトなどにアクセスする際に提示される。

クライアント証明書

クライアント証明書は企業内LANや外部から自社内にアクセスする場合、クライアント側が正当な権利を持っているか確認する必要がある場合に用いられるもの。

6.2. X.509証明書と公開鍵暗号基盤

6.2.1. OpenSSL

SSLの実装としてのツールにOpenSSLがある。 SSLはWebサーバとWebブラウザ間でよく使用される暗号化通信を行うための設定で、使用にはサーバ証明書が必要になる。

サーバ証明書にはサーバについての情報と、サーバの公開鍵、証明書を発行した認証局の情報とその署名が含まれる。 署名は、証明書を発行する認証局(CA)が「認証局の秘密鍵」で行う。SSLサーバはこの証明書をクライアントに渡し、クライアントであるブラウザは予め内蔵している認証局の公開鍵を使って、受け取った証明書の署名を復号する。復号できれば証明書が改ざんされていない(接続先サーバが正しい)ことが確認できる。

なお、サーバ証明書の署名はルートCAもしくは中間CAによって署名されますが、現在ではセキュリティレベルの向上などの理由で、ルートCAが直接署名するのではなく、中間CAを1つ以上用いる階層構造を取る認証が主流となっている。

opensslの設定ファイル

openSSLの設定ファイルは以下の通り。

  • Debian系 … /usr/lib/ssl/openssl.cnf
  • RedHat系 … /etc/pki/tls/openssl.cnf

opensslコマンド

OpenSSLの操作を行うコマンド。

openssl <サブコマンド> [オプション]
サブコマンド説明
caCAの管理
dgstメッセージダイジェストの計算
genrsaRSA暗号方式の秘密鍵を生成
rsaRSA暗号方式の鍵管理
reqCSRの管理
x509X.509証明書の管理
s_clientSSL/TLSプロトコルを使用し指定しサーバ接続
s_serverSSL/TLSプロトコルを使用しデータを受け取るサーバとして動作
ciphers使用可能な暗号スイートを一覧表示
verifyX.509証明書の検証

OpenSSLのコマンド例

# 設定ファイルの確認
openssl ca

# 秘密鍵の作成
openssl genrsa -des3 2048 > /etc/pki/CA/private/cakey.pem

# 秘密鍵の作成
openssl genrsa -<algorithm> -out <key_filename> <key_size>
openssl genrsa -aes128 -out mykey.key 2048

# 公開鍵の作成
openssl req -utf8 -new -key <key_filename> -x509 -days <cert-lifespan> -out <cert_filename> -set_serial 0

# CSRにCAとして署名する
openssl ca -in <CSR> -out <crt>

# CSRの作成
openssl req -new -key <priv_key.pem> -out <output.csr>

# 証明書情報の確認
openssl x509 -in <cert_filename.crt> -text -nout | less

OpenSSLによる証明書の作成と操作

opensslコマンドにより秘密鍵/証明書などを作成できる。 使用例は以下の通り。

# 秘密鍵の生成
openssl genrsa -<algorithm> -out <key_filename> <key_size>
openssl genrsa -aes128 -out mykey.pem 2048

# 自己証明書(オレオレ認証)の生成
openssl req -utf8 -new -key <key_filename> -x509 -days <cert_lifespan> -out <cert_filename>

#認証の表示
openssl x509 -in mycert.crt -text -noout

#CSR(証明書失効リスト)の作成
openssl req -new -key <priv_key.pem> -out <output.csr>

OpenSSLによるX.509証明書形式の変換

#DERをPEMに変換する
openssl x509 -inform der -in certificate.cer -out certificate.pem

#PEMをDERに変換する
openssl x509 -outform der -in certificate.pem -out certificate.der
#p7b/pkcs#7をPEMに変換する
openssl pkcs7 -print_certs -in certificate.p7b -out certificate.pem.

#PEMをp7b/pkcs#7に変換する
openssl pkcs7 -print_certs -in certificate.p7b -out certificate.cer

OpenSSLによるトラブルシューティング

## セキュアなコネクションの確立
openssl s_client -connect <host>:<port> 

## トラストチェーンの検証 
openssl verify -verbose <certificate> 

## CAチェーンのすべての証明書を確認する
openssl s_client -connect <host>:<port> -showcerts

## 証明書の詳細を見る
openssl x509 —text <cert_file> 

6.2.2. Genkey

genkeyはOpensslの互換ツールでRedHat系OSで使用できるもの。 コマンドはOpenSSLより単純で、TUIが使用できる。

6.2.3. X.509証明書

X.509とはITU-T(国際通信連合(ITU)の電気通信標準化部門)の規格であり、公開鍵暗号方式に基づいて認証局によって発行される公開鍵証明書の標準形式などを定めてたもの

X.509証明書にはいくつかのエンコードタイプがあるが、代表的なものにPEMDERがある。

  • PEM
    • DERをBase64でテキスト化したもの
    • サーバー証明書、中間証明書、および秘密キーを1つのファイル内に含めることができる
    • テキスト エディタで開くことができる
    • OpenSSLデフォルトのファイル形式
  • DER
    • JavaベースのWebサーバーに使用される
    • Binary形式
  • PKCS#7
    • 証明書のみを保存する
    • 秘密キーは保存できない
  • PKCS#12
    • Windowsプラットフォームで使用される
    • サーバー証明書、中間証明書、および秘密キーをパスワードで保護された単一の.pfxファイル内に保存できる

また、それぞれの特徴を表にまとめると以下の通り。

フォーマットエンコードファイルフォーマット
PEMBase64 ASCII.crt、.pem、.cer、.key
DERBinary.der または .cer
PKCS#7Base64 ASCII
PKCS#12Binary.pfx、 .p12

X.509証明書のフィールド

フィールド1フィールド2説明
tbsCertificate証明書の基本情報と公開鍵の情報
versionX.509証明書のバージョン X509v3では3(0x2)
serialNumber証明書の識別番号
signatureCAが証明書に署名する際のアルゴリズム
issuerCAの名前
validity証明書の有効期間
subject証明書の所有者の名前
subjectPublicKeyInfo証明書所有者の公開鍵に関する情報
extentions拡張領域。X.503v3にて追加
signatureAlogorithm証明書の署名アルゴリズム
signatureValueデジタル署名

X.509証明書の拡張フィールド

拡張フィールド説明
basicConstraints基本制約。証明書がCAnのものである、証明書のパスの深さなどを指定
authorityKeyIdentifier認証局鍵識別子
subjectKeyIdentifierサブジェクト識別子
KeyUsaga鍵の用途
extendedKeyUsage拡張鍵用途
certificatePolicies証明書の目的や発行時情報
subjectAltNameサブジェクトの代替名
cRLDistributionPointsCRLの配布ポイント
authorityInfoAccess機関情報アクセス

6.3. 暗号化/署名および認証のX.509証明書

6.3.1. SSL/TLS

SSL(Secure Sockets Layer)/TLS(Transport Layer Security)はトランスポート層の暗号化プロトコルでWebトランザクションを保護するために開発されたが、トランスポート層でTCPを利用するあらゆる種類のネットワークトラフィックの保護にも使用できる

TLSとしてIETFによってRFC化され、SSL3.0からTLSが派生した。SSL3.1がTLS1.0に該当します。一般的名称として、SSLという言葉が広く普及しているため、SSL/TLSと呼ばれている。

現在、SSLは脆弱性が発見されているため使用は非推奨となっており、TLSの使用が推奨されている。暗号強度等ではTLS1.2、もしくは2018年3月にIETFに承認されたTLS1.3が良い。

項目SSLTLS
正式名称Secure Sockets LayerTransport Layer Security
プロトコルWeb トラフィックを保護するために使用されていたプロトコルTLS プロトコルは、SSLv3 に代わる TLS 1.0 から始まる SSL の後継プロトコル
状況最新バージョンは SSLV3 だが、これは非推奨現在の標準は TLS 1.2 。ただし、TLS 1.3 はインターネット標準として目的とされている

TLS/SSLのハンドシェイクプロセス

TLS は、データを安全に送信する際のパフォーマンスとセキュリティの間で適切な妥協点を提供するため、公開鍵暗号方式と共通鍵暗号方式を組み合わせて使用​​する。 手順は以下の通り。

  1. 各TLS証明書は、公開キーと秘密キーで構成されるキーペアで構成される。これらのキーは、Web サイトのトランザクション中に相互作用する。
  2. Web サイトにアクセスするたびに、クライアント サーバーと Web ブラウザが通信して、安全な TLS/SSL 暗号化接続が確立されていることを確認する。
  3. Web ブラウザ (またはクライアント) がセキュリティで保護された Web サイトにアクセスすると、Web サイト サーバーは TLS/SSL 証明書とその公開キーをクライアントと共有して、安全な接続と一意のセッション キーを確立する。
  4. ブラウザは、SSL 証明書の発行者または認証局を認識し、信頼していることを確認します。また、ブラウザは、TLS/SSL 証明書の有効期限が切れていないこと、取り消されていないこと、および信頼できることを確認します。
  5. ブラウザは対称セッションキーを送り返し、サーバーは秘密キーを使用して対称セッションキーを復号化する。次に、サーバーはセッションキーで暗号化された確認応答を送り返し、暗号化されたセッションを開始する。
  6. サーバーとブラウザは、送信されるすべてのデータをセッションキーで暗号化するようになる。これらは、メッセージのプライバシー、メッセージの整合性、およびサーバーのセキュリティを保護する安全なセッションを開始することを意味する。

トランスポート層のセキュリティ

SSL と TLS はどちらも以下のセキュリティ要件を満たす。

  • 交換されるデータを安全に暗号化する
  • 少なくとも1人の当事者を認証する
  • データの整合性を確保する
  • リプレイ攻撃を防ぐ

トランスポート層のセキュリティは、PKI と一般的な暗号化の使用を通じてこれを実現する。

SSLに対する中間者攻撃

  • POODLE攻撃の脆弱性 * POODLE攻撃(CVE-2014-3566) はSSLセッション内の選択されたコンテンツを復号化できる中間者(MITM) エクスプロイトのこと。
  • BEAST攻撃の脆弱性 * BEAST攻撃(CVE-2011-3389)はSSL/TLS 暗号ブロック チェーン (CBC) の弱点を悪用し、中間者攻撃者が Cookie データなどの特定のセッション情報を何からでも回復できるようにする。

ApacheのHTTPSの設定(SSL/TLSを使ったHTTP)

HTTPSと呼ばれるプロトコルはWebのプロトコルであるHTTPをSSL/TLSでセキュアなプロトコルとして通信させるもの。 代表的なWebサーバ(httpd)であるApacheもSSL/TLSに対応しており、パッチまたはモジュール(mod_ssl)での対応が可能となっている。

Apacheの基本的な動作設定は/etc/httpd/conf/httpd.confにて行う。 SSLの設定も同ファイルに記述できるが、デフォルトでは/etc/httpd/conf.d/ssl.confが用意されており、ここに記述するのが一般的となる。

サーバ認証関連のディレクティブ説明
SSLEngine on/offSSL/TLSプロトコルを使用するかどうかの設定
SSLProtocol SSLv3/TLSv1/TLSv1.2SSL/TLSのバージョン指定
SSLCipherSuite !AAA/-AAA/+AAA使用する暗号化スイートの指定
SSLCertificateFileサーバ証明書の指定
SSLCertificateKeyFileサーバの秘密鍵を指定
SSLCertificateChainFile中間認証局(CA)の証明書を指定
クライアント認証関連のディレクティブ説明
SSLCACertificateFileクライアント証明書を発行したCAの証明書を指定
SSLVerifyClientクライアントの認証レベルの指定
SSLVerifyDepth有効なクライアント証明書を確認する深さを指定
OCSP stapling関連のディレクティブ説明
SSLUseStapling on/offOCSP staplingの有効/無効
SSLStaplingResponderTimeiutOCSP staplingの応答タイムアウト
SSLStaplingReturnResponseErrors on/offOCSP staplingのエラーをクライアントに送信するかどうか
SSLStaplingCacheOCSP staplingのキャッシュに使用するストレージタイプ
SNI関連のディレクティブ説明
SSLStrictSNIVhostCheck on/off非SNIクライアントの挙動設定

SNI

SNI(Server Name Indication)は1つのWebサーバで複数のドメインのSSL/TLS証明書を利用できる仕組み。 名前ベースのVirtualHostであってもSSLに対応できるようにしたSSL/TLSの拡張仕様ともいえる。

SNIでは、コネクション確立時にクライアントからサーバへアクセスしたいホスト名を渡すことにより、適切なサーバ証明書を返すことができる仕様とした。 これにより、コネクション前にホスト名を確認することが可能となり、名前ベースの仮想ホストを使用可能となった。

HSTS

HSTS(HTTP Strict Transport Security)はWebセキュリティの仕組みの一つでウェブサイトがHTTPSを使用することを強制するための仕組みのこと。 HSTSはウェブブラウザに対して、特定の期間内でHTTPSを使用するように指示する。

HSTSの主な目的はMITM攻撃を防ぐことにある。 通常、攻撃者はHTTP通信を盗聴し、変更することができるが、HTTPSを使用すると通信が暗号化され、改ざんや盗聴が難しくなる。 HSTSは、ウェブサイトがHTTPSを使用するように強制し、ユーザーが暗号化された通信を確実に得ることを支援する。 クライアントが一度HTTPSでアクセスしたサイトがHSTSを強制するようクライアントに指示した場合、以後一定の有効期間内はクライアント側からはHTTPSで通信を行うようになる。

また、初回のHTTPSアクセスまでの脅威に対応するため、予め「このドメインはHSTSに対応している」という情報をブラウザ側に知らせておく「プリロードHSTS(Preload HSTS)」という仕組みも提唱されてきている。

Apacheのクライアントアクセス制御

SSL/TLSを利用したApacheでは、クライアントの証明書を使ってアクセス制御を行うことができる。 「ssl.conf」では設定項目SSLVerifyClientにより、クライアントに対して証明書を提示させるよう指定することができる。

OCSP Stapling

OCSPはクライアントがOCSPサーバ(OCSPレスポンダ)へ問い合わせを行い、証明書の失効確認を行うためのプロトコル

しかし、レスポンダとの通信次第で問い合わせに遅延が発生し、確認手続きが失敗するなどの弊害もあった。これに対応する方法としてOCSPを拡張したものが、OCSP stapling(OCSPステープリング)となる。 クライアントが行っていたOCSPレスポンダへの問い合わせを証明書提供側のサーバが行うことにより、クライアントが確認手続きで失敗するリスクをなくす。 「ssl.conf」では設定項目SSLUseStaplingにて有効化するか否かを選択できる。

#OCSP Stapling: 
SSLUseStapling On 
SSLStaplingCache "shmcb:logs/ssl_stapling(32 768)"

CipherSuite

CipherSuiteは暗号化の組み合わせのことを指す。 SSL/TLSで使用できる暗号化には様々な種類があり、暗号といっても、目的によって使用できる暗号技術が異なる。

SSL/TLSの動作は複数の暗号技術の組み合わせで成り立っており、通信の開始から終了までの間に数種類の暗号技術を使用する。 この組み合わせは暗号スイートと呼ばれ、OpenSSLではopenssl chipersコマンドで使用できる暗号スイートを確認できる。

6.4. 暗号化ファイルシステム

6.4.1. ディスク暗号化の基礎

ディスク全体の暗号化は盗難や偶発的な紛失の場合にディスクを保護する。 ディスク全体の暗号化では、スワップファイル、システムファイル、休止状態ファイルを含むディスク全体が暗号化される。 暗号化されたディスクが紛失、盗難された場合でも、ドライブの暗号化状態は変更されず、許可されたユーザーのみがその内容にアクセスできる。

ファイルの暗号化では起動中にシステムにログインし、その後コンピュータを放置した場合、権限のないユーザーはディスク上の任意のファイルを開くことができないようにできる。 またファイルシステムの暗号化は以下の方法がある。

  • ブロックデバイス
  • ファイルシステムレベル

ディスク暗号化ツール

ディスクを暗号化するためのツールは以下のようなものがある。

  • dm-encryptLUKS (通常は連携して使用する)
  • cryptmount (エンドユーザーがデータを暗号化するのに役立ちます)
  • eCryptfs (ファイル システム レベルの暗号化)
  • EncFS (eCryptfs互換)

6.4.2. ブロックデバイスとファイルシステムの暗号化

dm-cryptとLUKS

dm-cryptsはブロックデバイスの暗号化を行う暗号化の方法の1つ。 dm、すなわちdevice-mapper(デバイスマッパー:物理デバイスと論理デバイスをマッピングするLinuxカーネルの標準機能)の暗号化機能を使ってデバイス全体に対する暗号化を行う。

dm-cryptを扱うためのツールには以下の2つがある

  • cryptsetup … 暗号化デバイスの作成・管理・各種操作
  • cryptmount … 暗号化ファイルシステムのマウント・アンマウントなど

cryptsetupコマンドでは、暗号化のタイプとしてplain(plain dm-crypt)モードLUKSモードを選択することができる。

LUKS(Linux Unified Key Setup:ラックス)とはLinuxにおけるディスク暗号化の標準仕様で、dm-cryptを用いて実装されている。 ファイルシステムに依存しておらず、Linuxで一般的なファイルシステムのext3やext4、Brtfs、さらにSWAP領域を暗号化することも可能である。

  • /etc/crypttab
    • cryptsetupで設定した暗号化ボリュームをOS起動時に自動的にマウントするためには、「/etc/crypttab」にエントリを追加する必要がある
    • 「/etc/crypttab」は「/etc/fstab」より先に読み込まれるため、暗号化を解除した上で復号されたファイルシステムをマウントすることが可能になる

eCryptfs

eCryptfsはファイルシステムの暗号化を行う技術の一つで、ファイルやディレクトリを暗号化することができるもの。 dm-cryptと異なり、ブロックデバイスではなくファイルやディレクトリを暗号化する。 カーネルモードで動作し、各ファイルのヘッダに暗号化メタデータを持つことにより、ホスト間で暗号化ファイルをやり取りすることができる。 特にUbuntuにおけるホームディレクトリの暗号化の仕組みとして広く利用されている。

またecryptfsdと呼ばれるデーモンによって制御が行われ、ecryptfs-*コマンドで各種操作を行う。

ENcFS

ファイルの暗号化のシステムとして、eCryptfsのほかにEncFS(Encrypted Filesystem)が知られている。

歴史はeCryptfsよりも古く、暗号化ファイルシステムとしては最も扱いやすいファイルシステムと言われている。FUSE(Filesystem in Userspace:カーネルを弄ることなくユーザ空間でファイルシステムを作成するソフトウェア)を用いているため制約もありますが、GUIや、WindowsやMacなどのOSもサポートされているのが特徴である。

6.4.3. dm-crypt

dm-cryptはブロックデバイスの暗号化を行うコマンド。 dm-cryptを扱うためのツールには以下の2つがある。

  • cryptsetup … 暗号化デバイスの作成・管理・各種操作
  • cryptmount … 暗号化ファイルシステムのマウント・アンマウントなど

cryptsetupコマンド

暗号化ファイルシステム利用を行うコマンド。

cryptsetup <アクション> <アクションごとのオプション>
アクション【plainモード】説明
open –type plain デバイス名 名称マッピング名とデバイスを指定して暗号化マッピングの作成
close 名前 / remove 名前暗号化マッピングの削除
resize 名前暗号化マッピングのサイズ変更
status 名前暗号化マッピングの状態表示
アクション【LUKSモード】説明
luksFormat デバイス名デバイスをLUKSパーティションとして初期化
luksOpen デバイス名 名前デバイスとLUKSパーティション名を指定しLUKSパーティションを開く
luksClose 名前Luksパーティションを閉じる
luksAddkey デバイス名 キーファイル名LUKSパーティションにパスフレーズを追加
luksKillSlot デバイス名 キースロット番号
luksDelKey デバイス名 キースロット番号
LUKSパーティションから設定したパスフレーズを削除
luksDump デバイス名LUKSパーティションの状態表示
isLuks デバイス名デバイスがLUKSパーティションの場合は真をそうでない場合は偽を返す

cryptmountコマンド

cryptmount [オプション] [ターゲット]
オプション説明
-mターゲットのマウント
-uターゲットのアンマウント
-Sターゲットのマウント状況の表示
-l利用可能なターゲットの基本情報の表示
-sターゲットのスワップ領域の有効化
-xターゲットのスワップ領域の無効化
-pターゲットに対するデバイスの準備
-rターゲットから全デバイスの開放
-cターゲットのパスワード変更
-g復号キーの作成

cryptsetupによる暗号化デバイスの利用方法

cryptsetupを用いて暗号化デバイス(パーティション)を利用する流れは以下の通り

  1. (LUKSモード利用時)luksFormatによるパーティションの初期化
    • cryptsetup luksFormal /dev/sdb2
  2. openまたはluksOpenによる暗号化マッピングの作成
    • cryptsetup open --type plain /devsdb1 dm01
    • cryptsetup luksOpen /dev/sdb2 dm02
  3. mkfsおよびパーティションのマウント
    • mkfs.ext4 /dev/mapper/dm02
    • mount /dev/mapper/dm02 /mnt/luks

なお利用終了時は、アンマウントし暗号化マッピングを削除する。

  1. パーティションのアンマウント
    • unmount /mnt/luks
  2. closeまたはluksCloseによる暗号化マッピングの削除
    • cryptsetup close dm01
    • cryptsetup luksClose dm02

6.4.4. eCryptfs

eCryptfsはファイルシステムの暗号化を行う技術の一つで、ファイルやディレクトリを暗号化することができるもの。 擬似ファイルシステムとも呼ばれ、マウントすることでeCryptfs層を通過させることにより復号を行う。

カーネルモードで動作し、各ファイルのヘッダに暗号化メタデータを持つことにより、ホスト間で暗号化ファイルをやり取りすることができる。 特にUbuntuにおけるホームディレクトリの暗号化の仕組みとして広く利用されている。 またecryptfsdと呼ばれるデーモンによって制御が行われ、ecryptfs-*コマンドで各種操作を行う。

ecryptfsコマンド

ecryptfsコマンドはecryptfsの操作を行うコマンド。 mount.ecryptfs, umount.ecryptfsでも操作をおこ会う。

オプション説明
ecryptfs-setup-private暗号化ディレクトリのセットアップ
ecryptfs-migrate-homeユーザディレクトリの暗号化
ecryptfs-mount-private暗号化ディレクトリのマウント
ecryptfs-umount-private暗号化ディレクトリのアンマウント
ecryptfs-unwrap-passphraseパスフレーズの複合
# eCryptfsのセットアップを行う
ecryptfs-setup-private

# 暗号化ディレクトリのマウント、アンマウントを行う
ecryptfs-mount-private
ecryptfs-umount-private

# rootユーザが、一般ユーザのホームディレクトリ全体を暗号化するコマンド
ecryptfs-migrate-home

# 「wrapped-passphrase」を復号する
ecryptfs-unwrap-passphrase

なおファイルのマウントはmount -t encryptfsコマンドでも可能となる。 また、マウントした状態(復号した状態)でバックアップを取ると、暗号化されていないデータもバックアップされることになるので注意する。 暗号化した状態のみにしたい場合はumountしてからバックアップを実施する。

eCryptfsのディレクトリ構造

ecryptfs-migrate-homeコマンドなどにより暗号化ディレクトリを作成すると、以下のようなファイルやディレクトリが作成される。

$HOME
  ├ Private/ ... 復号されたデータを含むマウントポイント
  ├ .ecryptfs/
  │  ├ Private.mnt ... 暗号化ディレクトリのマウントポイントが書かれたファイル
  │  ├ Private.sig ... 暗号化パスフレーズの署名ファイル
  │  ├ wrapped-passphrase ... マウント用の暗号化パスフレーズ
  │  ├ auto-mount ... 自動マウント用の空ファイル
  │  └ auto-umount ... 自動アンマウント用の空ファイル
  └ .Private/ ... 暗号化されたデータを含むディレクトリ

6.4.5. ENcFS

encfsパッケージは ecryptfs と同様の機能を提供するが、スーパーユーザー以外が使用するように設計されている

6.5. DNSと暗号化

6.5.1. DNSの概要

DNSとは

DNSはIPアドレスやその他のデータを保存し、名前によるクエリを可能にする階層型の仕組みのこと。 DNS サーバーはドメイン名のデータベースを保存し、ネットワーク内のクライアントからの DNS クエリに基づいてドメイン名を処理する。

DNSサーバの種類

DNSサーバには以下の種類がある。

  • マスタDNSサーバ(権威DNSサーバ)
    • ゾーンファイルを所有するDNSサーバ
    • A、AAAA、CNAME などのDNS名レコードを保持する
  • スレーブDNSサーバ(キャッシュDNSサーバ)
    • マスターDNSサーバのゾーン情報をコピーするDNSサーバ
    • ドメインに対する以前のクエリに基づいてキャッシュファイルを構築している

再帰問い合わせと反復問い合わせ

ドメイン名とIPアドレス対応に関する問い合わせは再帰問い合わせ(Recursive query)と反復問い合わせ(Iterative query)の2種類がある。

  • 再帰問い合わせ
    • リゾルバからの問い合わせ要求を受けたDNSサーバが、他のDNSサーバに問い合わせを行い、その最終的な結果をリゾルバに応答する必要のある問い合わせ
  • 反復問い合わせ
    • リゾルバから再帰問い合わせを受けたキャッシュDNSサーバが、再帰問い合わせの結果を返すために、答えを得られるまで繰り返し他のDNSサーバへ行う問い合わせのこと

DNSゾーン

DNS構成はゾーンリソースレコード で構成される。 ゾーンの種類は以下の通り。

  • パブリックDNSゾーン * インターネットから参照できるゾーン * パブリックゾーンに DNS レコードを作成して、インターネット上にサービスを公開できる
  • プライベートDNSゾーン * パブリックインターネット経由でクエリできないゾーンのこと
  • サブゾーン * ゾーンの所有者が NS レコードを使用してサブドメインを別のネーム サーバーに委任できるもの * example.comの場合、aaa.example.combbb.example.com作成し、親ドメインのゾーンから見つけられるようにする(委任)するもの

スプリットビューDNS(スプリットホライズンDNS)

スプリットホライズンDNSを使用すると、要求に応じて同じ名前に対して異なる回答 (異なるリソースレコードセット) を提供できる

この機能は、クエリが開発ネットワークから送信された場合はアプリの開発/ステージング バージョンを提供し、クエリがパブリックインターネットから送信された場合はアプリの運用/公開バージョンを提供するといったことに利用できる。

リソースレコード

リソースレコードはドメイン名と IP アドレスに関するデータを保存するために使用されるもの。 DNSゾーンのデータベースは、リソース レコードのコレクションで構成される。 各リソース レコードは、特定のオブジェクトに関する情報を指定する。

リソースレコードタイプ説明
SOA管理情報の記述
NSゾーンを管理するDNSサーバを記述
MXメールサーバを記述(正引きのみ)
Aホスト名に対するIPアドレスを記述(正引きのみ)
AAAAホスト名に対するIPv6アドレスを記述(正引きのみ)
CNAMEホスト名の別名に対するホスト名を記述(正引きのみ)
PTRIPアドレスに対するホスト名を記述(逆引きのみ)
TLSAデジタル署名されたレコード。サーバ認証に使われる証明書や鍵の情報がドメイン名に対して関連付けられてDANE(DNSを使った認証の仕組み)で用いられる

レコードセット

レコードセットは同じ名前と同じタイプで、データ値が異なるレコードのこと。 以下は同じ名前とタイプを持つ複数のレコードを含むレコードセットの例。

DNS名タイプTTL (秒)データ
db-01.dev.gcp.example.comA5010.128.1.35
db-01.dev.gcp.example.comA5010.128.1.10

6.5.2. ドメインレジストラ

ドメインレジストラはパブリックゾーンのインターネットドメイン名の予約を管理する組織のこと。 レジストラは汎用トップレベル ドメイン (gTLD) レジストリまたは国コード トップレベル ドメイン (ccTLD) レジストリによって認定される必要がある。

6.5.3. SOAレコードのシリアル番号

SOAレコードのシリアル番号はDNSゾーンのバージョン番号のこと。 すべてのネームサーバーがゾーンの最新のバージョンであるためには、それらのネーム サーバーが同じSOAシリアル番号を持っている必要がある。

EDNS

EDNSはDNSの拡張プロトコルEDNS(Extension mechanism for DNS)のこと。 DNSでUDPを用いる場合、パケットサイズが512byteを超えることができないという制約を緩和するためのものともいえる。 EDNS の最も一般的な実装はDNSSECである。

また、EDNSは基本的なDNSプロトコルの枠組みは残したままで512byte以上の通信を可能にする。

DOビット/ADビット

EDNSによって拡張されたDNSパケットでは、DO bitという識別情報がやりとりされる。 DO=「DNSSEC OK」bitであり、このbitを識別できることがDNSSECを使用できる前提となる。つまりENDSを理解できない場合はDNSSECを利用といえる。

またDNSSECで認証確認が成立した場合は、DNS応答のAD(Authentic Data)ビットに1が格納される。

6.5.4. BINDの保護

TSIG

TSIGはトランザクション署名とも呼ばれるDNS メッセージを保護し、安全なサーバー間通信を提供するための仕組みのこと。BIND v8.2 以降で使用できる。 DNSサーバ同士でなりすましを防ぐために認証を行う仕組みともいえる。

TSIG は2つのDNS サーバー間の次のタイプのトランザクションを保護できる。 TSIG は、共有シークレットと一方向ハッシュ関数を使用して DNS メッセージを認証する。

chroot jailによるBIND実行

chrootは指定したディレクトリを新しいルートディレクトリとしてプロセスを制限できる機能のこと。 この機能によりディレクトリ内のソフトウェアが乗っ取られても、被害をソフトウェア内だけにとどめることができる。

/etc/named.confの主要なディレクティブ

CentOSにおける設定例は以下の通り。

options {
        listen-on port 53 { 127.0.0.1; };
        listen-on-v6 port 53 { ::1; };
        directory       "/var/named";
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        secroots-file   "/var/named/data/named.secroots";
        recursing-file  "/var/named/data/named.recursing";
        allow-query     { localhost; };

        recursion yes;

        dnssec-enable yes;
        dnssec-validation yes;

        managed-keys-directory "/var/named/dynamic";

        pid-file "/run/named/named.pid";
        session-keyfile "/run/named/session.key";

        /* https://fedoraproject.org/wiki/Changes/CryptoPolicy */
        include "/etc/crypto-policies/back-ends/bind.config";
};

logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};

zone "." IN {
        type hint;
        file "named.ca";
};

include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
ディレクティブ説明
allow-queryネームサーバーへのクエリを許可するホストを指定する
allow-recursion再帰クエリに適用できる。デフォルトではすべてのホストがネームサーバー上で再帰的クエリを実行できる。
allow-transferゾーンの情報の転送要求を許可するスレーブサーバーを指定する。デフォルトではすべての転送リクエストが許可される。
allow-updateゾーン内の情報を動的に更新できるホストを指定する。デフォルトでは、すべての動的更新リクエストが拒否される。

Rndc

rndc (リモート ネーム デーモン コントロール)は、BIND にてローカルホストまたはリモートホストから指定されたデーモンをコマンドラインで管理できるようにするツール。BIND 9.0以降で使用できる。

rndcは、デジタル署名された名前付きコマンドを TCP 接続経由で送信する。

rndc の設定ファイルは/etc/rndc.confとなる。 この構成ファイルには、接続するネームサーバーやデジタル署名に使用するキーなどの構成情報が保存される。

rndc ユーティリティは、初期化スクリプトを使用してnamedが開始されるときに開始される。 rndc.confファイルはrndc-confgenコマンドユーティリティを使用してランダムキーを使用して生成できる。

6.5.5. DNS関連のコマンド

digコマンド

dig(Domain Information Groper)コマンドはDNSにクエリを実行するためのコマンド。 DNS 問題の検証とトラブルシューティングに使用できる。

dig <ドメイン名>
digコマンド説明
dig google.com MXドメインの MX レコードをクエリする
dig google.com SOAドメインの SOA レコードをクエリする
dig google.com TTLドメインの TTL レコードをクエリする
dig @8.8.8.8 google.comクエリに別の DNS サーバーを使用する
digdigコマンドのバージョンとルートDNS サーバーを表示します

delvコマンド

delvコマンドはBIND 9.10以降のdigコマンドの後継ツール

delv <オプション> ドメイン名
オプション説明
+rtraceクエリされたすべてのレコードリソースをリストするだけ。DNSSEC の詳細は含まれない
+mtracertrace と同じだが、すべてのレコードリソースの完全な内容が含まれる
+vtrace多くの追加メモを含む検証プロセスの追跡

6.5.6. DNSSECによるDNSの保護

DNSSEC

DNSSECはDNSの応答にデジタル署名の機能を使って正当性を付与し、改ざんされていないこと、正当な管理者の管理しているレコードであることを保証する仕組みのこと。

DNSはもともとルートサーバから始まる名前解決の木構造で、順に権限移譲しながら最終的な名前解決に辿り着くという仕組みとなる。 この際、自己の署名に対する公開鍵を上位DNSサーバへ登録することで、信頼される権威サーバであることを担保し、これによりその応答レコードも信頼される…という信頼の連鎖によって一覧のDNSレコードの信頼性を確保する。

DNSサーバは、ドメイン情報を保持・提供する権威DNSサーバと、権威DNSサーバに問い合わせをするキャッシュDNSサーバに分かれているが、DNSSECを使用するにはそれぞれがDNSSECに対応している必要がある。

DNSSECでは2種類の鍵を用いる

  • ゾーンの署名鍵(ZSK:Zone Signing Key)… ゾーンに署名する
  • 鍵の署名鍵(KSK: Key Signing Key)… ゾーンに署名した鍵に署名する

それぞれは公開鍵と秘密鍵のペアになっている。

DNSSECを利用するためにはBINDの場合、設定ファイル/etc/named.confoptionsセクションへ以下の二つの項目を設定する必要がある。

options {
   dnssec-enable   yes; # DNSSECの有効(yes)/無効(no)を設定する
   dnssec-validation  auto; # DNSSEC検証の有効/無効を設定する (auto または yes)
# auto: DNSSEC検証を有効にし、トラストアンカー
# yes: DNSSEC検証を有効にする。トラストアンカー(trusted-key)を手動で設定する必要がある
# no : DNSSEC検証を無効にする
   :(以下省略)

これらのパラメータは、BINDのバージョンによってデフォルト値が異なる。 BINDのバージョンを確認するには、BINDサーバ上で直接named -vコマンドを実行するか、クライアントからBINDサーバへ向けて確認するには上述のdigコマンドを使用できる。

named -v

dig

セキュリティのためにバージョンを隠す場合は設定ファイル/etc/named.confoptionsセクションに以下のように記載する。

options {
    version "表示したい文字列";
    :(以下省略)

DNSのリソースレコード

DNSはIPアドレスとドメイン名とを紐づけるためのデータベースをリソースレコードと呼ばれる形で保持する。 DNSSECで使用されるリソースレコードは以下の通り。

リソースレコード説明
DSKSK公開鍵のハッシュ値を含む情報
親ゾーンに登録すると信頼の連鎖を構築する
DNSKEY公開鍵の情報
キャッシュDNSサーバが署名を検証するために公開鍵を使用する
RRSIG各リソースレコードへのデジタル署名
キャッシュDNSサーバが権威DNSサーバからの応答に対する正当性を検証するために使用
NSEC存在しないサーバへ問い合わせがあった際に不在証明のため辞書順で並べた際に次の位置するゾーン情報を示す
NSEC3NSECを改良したもの。直接のゾーン名ではなくハッシュ化されたゾーン名を示す
NSEC3PARAM権威DNSサーバがNSEC3を生成する際に必要な情報
TLSADANEにおいて用いられるレコード(ドメイン名にX.509証明書情報の紐づけ)

TLSAレコードを除き、基本的には署名を行うと署名や公開鍵を含んだレコード(ゾーンファイル)が作成される。 DNSKEYリソースレコードには上述の通りKSK・ZSKの公開鍵が含まれ、これらは各リソースレコードの検証に使用される。

BINDのDNSSEC関連ユーティリティ

DNSサーバソフトウェアであるBINDには、サーバやKSK、ZSKの生成・管理などを行うための以下のようなコマンドユーティリティがある。

コマンド機能
dnssec-keygenDNSSECのZSK/KSKを生成する
dnssec-signzoneゾーンファイルへの署名を行う(NSEC, NSEC3, RRSIG, DNSKEYなどの生成)
dnssec-settime鍵ファイルのメタデータである時間の表示/変更
dnssec-dsfromkey鍵ファイルから上位サーバに登録するDSレコード生成する
opensslTLSAレコードの検証を行う
rndcBIND 9.0以降の制御設定ツール
delvBIND 9.10以降の検証/解析ツール

6.5.7. DNSSECの設定

dnssec-keygenコマンド

dnssec-keygenはDNSSECのキーを生成することができるコマンド。

dnssec-keygen -a RSASHA256 -b 512 -n ZONE -f KSK myzone.
オプション説明
-aアルゴリズムの指定
-bキーサイズ
-nnametype
-f指定されたフラグをKEY/DNSKEYレコードのフラグフィールドに設定する

dnssec には、ゾーンに署名するための ZSK キーのペアも必要となる。

dnssec-signzoneコマンド

dnssec-signzone はゾーンに署名しゾーンの署名付きバージョンを生成するコマンド。

dnssec-signzone -o myzone. -S db.myzoneFetching ZSK 63075/RSASHA256 from key repository.

ファイル内部は以下のようになる。

; File written on Mon Apr  9 01:45:42 2018
; dnssec_signzone version 9.10.3-P4-Ubuntu
myzone.            604800    IN SOA    myzone. root.myzone. (
                    51         ; serial
                    604800     ; refresh (1 week)
                    86400      ; retry (1 day)
                    2419200    ; expire (4 weeks)
                    604800     ; minimum (1 week)
                    )
            604800    RRSIG    SOA 8 1 604800 (
                    20180509074542 20180409074542 63075 myzone.
                    eHu3B0s9AcclEMfkaXK+zUcqnhYTRXO2BBoR
                    s4z9DGxbwcTXoy8MbIACkuVOhkM6+tQ8r7pr
                    clIKoUALm4I4mQ== )

dnssec-settimeコマンド

指定されたキーの有効期間を管理するコマンド。

dnssec-dsfromkeyコマンド

特定の KSK の DS RR を生成するために使用されるコマンド。

6.5.8. DANE

DANEはDNSSECの技術を応用した認証の仕組みのこと。 DNSSECの導入により、DNSサーバの応答の正当性が検証できるようになった。

DANEで用いられるリソースレコードをTLSAレコードと呼ぶ。

TLSAレコード

TLSAレコードはTLS サーバー証明書または公開キーを、レコードが見つかったドメイン名に関連付けるために使用される。

3.7 - 7.ホストのセキュリティ

【LPIC303範囲】Linuxのホスト自体(OSなど)のセキュリティを上げるためのポイントを記載

7.1. ホストセキュリティの強化

7.1.1. カーネルセキュリティ

不要なソフトウェアを無効化

実行中のすべてのプログラムには、セキュリティ上の脅威が存在する可能性があるため、使用されていないサービスを無効にすることは、セキュリティ上の良い設定となる。

サービスの無効化にはsystemctlおよびchkconfigを使用することで可能。 一般的に無効化するサービスには、atd、ava hi-daemon、cups がある。

リソース使用量の制限

ユーザーはスレッド、開いているファイル、メモリなどのシステムリソースを制限することができる。

paml_limits.soモジュールを使用すると、オペレーターはハード制限およびソフト制限を通じてユーザーがアクセスできる 1 つのリソースの量を制御できる。

ulimitコマンドでもユーザーがアクセスできるリソース量を制限可能。 また恒久的な設定は/etc/security/limits.confで可能。

ulimit <オプション> 値
オプション説明
-a現在設定されている値を全て表示
-fシェルとその子によって書き込まれるファイルの最大サイズ
-t最大 CPU 時間 (秒単位)
-u1 人のユーザーが使用できるプロセスの最大数
-Tスレッドの最大数

カーネルパラメータのチューニング

sysctlコマンドは、カーネルパラメータを表示および設定できる。

# 設定の全表示
sysctl -a

# カーネルパラメータからの表示
sysctl -n

# 設定の検索
sysctl -ar [検索パターン]

procfs 

# 設定の保存
sysctl -w  <param>=<value>

# 恒久的な設定の記述ファイル
/etc/sysctl.conf

# /etc/sysctl.confからの反映(ファイルから読み込む)
sysctl -p

7.1.2. Linuxの機能

プロセス機能

特定のプロセスの機能を確認するには/procディレクトリ内のステータスファイルを確認する。

cat /proc/self/statusで現在で実行中のプロセスを、capsh --printまたは/proc/<pid>/statusで他のユーザの実行中のプロセスを確認できる。

cat /proc/1234/status | grep Cap
cat /proc/$$/status | grep Cap

上記コマンドで表示される各行は以下内容を意味する。

  • CapInh … 継承された機能
  • CapPrm … 許可される機能
  • CapEff … 有効な能力
  • CapBnd … 境界セット
  • CapAmb … アンビエント機能セット

また、実行中のプロセスの機能を確認するには、getpcapsツールの後にプロセス ID (PID) を続けて使用することでできる。

バイナリ機能

バイナリには、実行中に使用できる機能を含めることができる。 たとえば、cap_net_rawのような機能をping持つバイナリを見つけるのは非常に一般的となる。

getcap /usr/bin/ping
/usr/bin/ping = cap_net_raw+ep

バイナリ検索はgetcap -r / 2>/dev/nullで行える。

capsh による機能の削除

pingのCAP_NET_RAW機能を削除すると、ping ユーティリティは機能しなくなる。

capsh --drop=cap_net_raw --print -- -c "tcpdump"

バイナリ機能の削除

バイナリの機能を削除するには以下コマンドで行える。

setcap -r </path/to/binary>

7.1.3. USBGuard

USBGuard ソフトウェア は、デバイス属性に基づいた基本的なホワイトリスト機能とブラックリスト機能を実装することにより、USB デバイスに対するシステム保護を提供する。 ユーザー定義のポリシーを強制するために、USBGuard はLinux カーネルの USB デバイス認証機能を使用する。 USBGuardフレームワークは次のコンポーネントを提供する。

  • 動的対話とポリシー適用のためのプロセス間通信 (IPC) インターフェイスを備えたデーモンコンポーネント
  • 実行中のUSBGuardインスタンスと対話するためのCLI
  • USB デバイス認証ポリシーを記述するためのルール言語
  • 共有ライブラリに実装されたデーモンコンポーネントと対話するための C++ API

USBGuardの機能

# 初期ルールセットを作成する
usbguard generate-policy > /etc/usbguard/rules.conf

# USBGuard ルール セットをカスタマイズする
vi /etc/usbguard/rules.conf

# USBGuard デーモンを起動する
systemctl enable usbguard.service

# USBGuard によって認識されるすべての USB デバイスをリストする
usbguard list-devices

# デバイスがシステムと対話することを許可する
usbguard allow-device <device-num>

# デバイスを認証解除してシステムから削除する
usbguard reject-device <device-num>

# デバイスの認証を解除するだけ
usbguard block-device <device-num>

またUSBGuardでは、blockおよび拒rejectという用語を次の意味で使用する。

  • block … 現在このデバイスと通信しないようにする
  • reject … このデバイスを存在しないかのように扱う

ホワイトリスト/ブラックリストの作成

ホワイトリスト/ブラックリストはusbguard-daemon.confによりロードされ、デーモンの実行時パラメータの構成に使用される。

ホワイトリストまたはブラックリストを作成するには、/etc/usbguard/usbguard-daemon.confファイルを編集し、そのオプションを使用することで実現できる。

RedHat系におけるUSBGuard

USBGuardのデーモンはUSBGuardパブリックIPCインターフェイスを提供する。 このインターフェイスへのアクセスはRedHat系の場合、rootユーザーのみに制限されている。

アクセス制限にはIPCAccessControlFilesオプション、またはIPCAllowedUsersオプションの設定で制御できる。 なお必ずIPCAllowedGroupsオプションの設定も行う必要があり、これを行わない場合、IPCインターフェイスがすべてのローカルユーザーに公開され、USB デバイスの認証状態を操作したり、USBGuardポリシーを変更したりできるようになってしまう。

7.2.4. ASLRの管理

ASLR(Address Space Layout Randomization)はプログラムがロードされるたびに、メモリ内の異なる場所にロードされるようにする仕組みのこと。

ASLR の設定または設定解除はカーネル パラメータによって制御される。 設定すべきカーネルパラメータはkernel.randomize_va_spaceとなる。

各値毎の動作は以下の通り。

  • 0 … ALSR が無効
  • 1 … ALSR が保守モードで動作
  • 2 … ALSR が完全に機能して動作

7.2.5. NXビット

NXビットはCPUの機能で保護されたメモリ領域からの実行を防ぐことができるもの

この機能の利用により実行可能なメモリ空間を制限することできる。そのため悪意のあるプログラムによる任意のコードの実行が困難にすることが可能。

NXビットは CPUレベルの機能であるため、CPU 情報を確認して確認する必要がある。

grep -Fw nx /proc/cpuinfo

7.2.6. Exec-Shield

Exec-ShieldはNXビットの機能のない CPU をサポートするように設計された、同じ問題に対するソフトウェア手法のこと。 NXビットと同様に保護されたメモリ領域からの実行を防ぐことができる。

7.2.7. ICMPのセキュリティ設定

ICMPの無効化はカーネルパラメータのnet.ipv4.icmp_echo_ignore_all=1で設定ができる。

sysctl -w net.ipv4.icmp_echo_ignore_all=1

このICMPの無効化はICMP(ping)応答の無効化やDDoSの軽減などホストの稼働状況に関する情報漏洩を防ぐことができる。

なお、ICMPエコーブロードキャストのみ無効化させる場合はnet.ipv4.icmp_echo_ignore_broadcasts=1で可能。

7.2.8. SSH認証局

SSH公開鍵認証の問題

SSH 接続が初めて確立されると、SSH サーバーは自分自身を識別するための公開キーをユーザーに送信する。この認証スキームは「初回使用時の信頼」または TOFU と呼ばれる。

この認証スキームはホストのIP、名前、または公開キーが変更されると、ユーザ側にホストが信頼できないようなメッセージが表示される。

SSH CAベースの認証

SSHの認証で認証局を使用してサーバーとクライアントを認証する機能を利用するとクライアントに対してホストを認証でき、ホストの信頼性を検証できないという混乱を招くSSH公開鍵認証の問題を回避できる

この構成を行い場合、接続先ホストとクライアントの2台だけではなく、認証局用のCAサーバが必要となる。

7.2.9. Chroot環境

chrootは特定のユーザーおよびプロセスに対して設定される疑似的なルートファイルシステムのこと。 特徴は以下の通り。

  • 特権のないプロセスは、chroot 環境外のファイルにアクセスできない
  • chroot 環境ではハードリンクできないため、ファイル自体をコピーして配置しておく必要がある

最新のプロセス分離ではChroot環境ではなく、仮想化コンテナが使用される。

7.2.10. Spectre/Meltdown脆弱性

Spectre/Meltdown脆弱性はプロセッサまたは CPU のハードウェアの脆弱性のこと。 この脆弱性は発見されてはいるが、悪用するには非常に難しいとされている。 具体的にはIntel製のプロセッサに対する脆弱性で内容は以下の通り。

  • Spectre脆弱性 * コンピュータにインストールされているアプリケーション間の分離が破壊されるもの * 攻撃者は安全性の低いアプリケーションをだまして、オペレーティング システムのカーネル モジュールから他の安全なアプリケーションに関する情報を朗詠させられる
  • Meltdown脆弱性 * ユーザー、アプリケーション、オペレーティング システム間の分離を破壊するもの * 攻撃者は、そのプログラムや他のプログラムのメモリ位置にアクセスし、システムから機密情報を取得するプログラムを作成することができる

Linux マシンに Meltdown と Spectre に対するパッチが適用されているかどうかを確認するには以下プロジェクトのソフトウェアで可能。

git clone https://github.com/speed47/spectre-meltdown-checker.git
  1. cd spectre-meltdown-checker
  2. chmod u+x spectre-meltdown-checker.sh
  3. ./spectre-meltdown-checker.sh

7.2.11. Polkit

PolKitは特権のないユーザセッションと特権のあるシステムとの間のネゴシエーターとして機能するアプリケーションのこと。 内部的にはユーザセッションのプロセスがシステムコンテキストでアクションを実行しようとするたびにPolkitがクエリされる。

Polkitの動作はsudoなどの従来の権限承認プログラムとは異なり、rootセッション全体に権限を付与するのではなく、特定のアクションにのみ権限を付与する。

7.2.12. Grubの制御

GRUB はパスワード機能を提供し、管理者だけが対話型操作を開始できるようにすべきものといえる。 これはGrubが構成を変更したり、実行時に任意のコマンドを実行したりできる機能があるためユーザレベルの制御としては強すぎるためである。

7.2. ホストへの侵入検知

7.2.1. スレッド検出ツール

Linuxの脅威検出ツールには以下のようなものがある。

  • AIDE … ホストの改ざん・侵入検知ツール
  • OPENScap … システム監視用のRedHat系向けのツール
  • Linux Malware Detect(LMD) … 悪意のあるソフトウェアを検出するための別のツール
  • Rkhunter … ルートキットを検知/駆除ツール
  • Chkrootkit … ルートキットを検知/駆除ツール

7.2.2. AIDE

AIDEはLinux向けのファイルとディレクトリの整合性をチェックする強力なOSS侵入検知ツール。 AIDE はファイルとディレクトリの整合性をチェックするための独自のデータベースを持つ。そのファイル署名のデータベースを維持し、ファイル署名を定期的に検証する。

またAIDEは、最近変更または変更されたファイルの監視に役立つ。誰かがファイルやディレクトリを修正または変更しようとしたときに、それらを追跡できるようになっている。

/etc/aide.conf

AIDEの設定ファイルは/etc/aide.confであり、検査対象と検査内容を設定できる。

# 記述例
CONTENT_EX = sha256+ftype+p+u+g+n+acl+selinux+xattrs
検査ルール意味
pパーティション
ftypeファイル種別
iinode番号
lリンク名
nリンク数
uユーザ
gグループ
sファイルサイズ
bブロック数
m最終更新時刻
a最終アクセス時刻
c最終ステータス更新時刻
Sサイズの増分
I inode番号の変更は無視
aclアクセスコントロールリスト
selinuxSELinuxのコンテキスト
xattrs拡張ファイル属性
md5チェックサム(MD5)
sha256チェックサム(SHA256)
# 設定例
/boot/ CONTENT_EX # ルールの適用

!/etc/.*~ # etc以下の「.」ファイルは無視
=/var/log # /var/log以下のチェック
ディレクトリ/ファイルのルール説明
!<ターゲット>指定したファイル/ディレクトリを検査しない
=<ターゲット>指定したファイル/ディレクトリを検査する(下層ファイル含まず)
<ターゲット> <ルール>指定したファイルやディレクトリは以下ヘルール適用

aideコマンド

# データベースの初期化
aide --init

# データベースのチェック
aide --check

# データベースの更新
aide --update

aideの設定

システムに AIDE を実装するには、データベースを初期化する必要がある。 データベースは/var/lib/aideディレクトリに作成される。

7.2.3. OpenSCAP

OpenSCAPはSCAPのOSSで拡張構成チェックリスト記述形式(XDDCF)を利用する脆弱性/セキュリティ設定監査ツールのこと。 このツールではシステムのセキュリティ対策の設定や、脆弱性対策をどこまで行っているかなどを診断・HTMLファイルとしてレポートすることができる。

なおOpenSCAPは自動化のための言語OVAL(Open Vulnerability and Assessment Language)とセキュリティ設定のチェックリストのフォーマットであるXCCDF(The Extensible Configuration Checklist Description Format)などに対応している。

7.2.4. Maldet

MaldetはLinux Malware Detect(LMD)とも呼ばれる、マルウェア検出ツールのこと。 以下のような特徴を持つ。

  • 脅威を迅速に識別するためのMD5ファイルハッシュ検出
  • ClamAV(アンチウイルスソフトウェア)をスキャナエンジンとして統合
  • シグネチャ(マルウェア検体が持つバイトデータ)のアップデート機能
  • 脅威を安全に隔離・保存、脅威を取り除いた隔離ファイルの復元
  • マルウェアが挿入された文字列の削除を試行
  • cronによる日次のスキャン

標準ではインストールパッケージにcronスクリプトが含まれており、定期的にスキャンおよびシグネチャのアップデートが動作するよう設定されている。 動作設定は/etc/maldetect/conf.maldetで行う。

maldetコマンド

# スキャン
maldet -a
maldet --scan-all <ディレクトリ>

# レポート
maldet -e

7.2.5. ルートキットの検出

ルートキットはコンピュータへ侵入した後に、その活動や存在を隠蔽するためにシステムを改変し、侵入の形跡を隠滅してしまうソフトウェアのこと

chkrootkit

chkrootkit セキュリティスキャナは、システムが「ルートキット」に感染している兆候を検索できる。なおchkrootkitはrootkitを検出しても自動的に対処してくれるわけではないため、検出後は手動で処理する必要がある。

# ルートキットのチェック
chkrootkit

# ルートキットのチェック(冗長出力OFF)
chkrootkit -q

rkhunter

rkhunterはルートキット検知ツールで、マルウェア対策ソフトのように、定義データベースをアップデートすることで最新のrootkitに対応することができる。 設定ファイルは/etc/rkhunter.confとなる。

# 更新
rkhunter --update

# 保持されたデータファイルを現在値で更新
rkhunter --propupd

7.2.6. Auditdによるシステム監査

ログ監査システムはシステムによって保存場所やソフトウェアが異なる。 以下は通常のOS以上のログファイルを扱うプログラムである。

  • syslog … /var/logにログを保存
  • systemd-journald

LinuxのOSシステム監査にはAuditシステムが使用される。 auditdというデーモンによって、ファイルアクセスやシステムコールの監視、ユーザの特定の操作、セキュリティイベントの記録、ネットワークアクセスの監視など、様々なイベントを監視することができる。

監査の構成と記録

Auditにおいて、監査のログ(Auditログ)や監査のルールを設定するには以下のファイルやauditctlコマンドを用いる。

  • /etc/audit/auditd.conf … Auditログ全般の設定(ログファイルやローテーションの頻度など)
  • /etc/audit/audit.rules … Auditルールを設定(永続的な設定)
  • auditctlコマンド … Auditルールを設定(一時的)

なお、これらルールによる監査の結果は、デフォルトでは/var/log/audit/audit.logへ出力される。

Auditルール

audit.rulesauditctlコマンドで設定するAuditルールには、以下の3つがある。

  • 制御ルール … Auditルールの動作設定
  • システムコールルール … システムコールの呼び出し
  • ファイルシステムルール … 特定ファイル/ディクトリへのアクセス

auditctlコマンド

auditctlはAuditシステムのカーネルコンポーネントを制御し、Auditシステムの設定やパラメータ設定が行えるコマンド

auditctl <オプション>

# ファイルシステムルールの設定オプション
audtictl -w <パス> -p <パーミッション> -k <キーワード>

# システムコールルールの設定ぷしょん
auditctl -a <リスト,アクション> -S <システムコール名> -F <フィールド> -k <キーワード>
制御ルールのオプション説明
-b <値>Auditバッファの最大値
-e [0,1,2]監査設定(0:無効,1:有効,2:ロック)
-f [0,1,2]深刻なエラー時の挙動(0:何もなし,1:printkへ出力,2:カーネルパニック)
-r <メッセージ数>1秒あたりのメッセージ上限
-D全ルールの削除
-l現在の設定のリスト表示
-sAuditシステムのステータス表示
ファイルシステムルールに関するオプション説明
-w <パス>監査対象のファイル/ディレクトリ
-p <パーミッション>ログに記録するパーミッション設定(r:読み取り,w:書き込み,x:実行, a:属性変更)
-k <キーワード>ログエントリ参照時のキーワード
システムコールに関するオプション説明
-a [リスト, アクションリスト]リストおよびアクションの追加
-d <リスト,アクション>リスト/アクションの削除
-S <システムコール名>システムコール名または番号(全監視はall)
-F =アーキテクチャ/ユーザIDの条件に基づいてイベント照合する際の追加オプションを指定
-k <キーワード>ログエントリ参照時のキーワード
システムコールルールのアクション説明
always常に監査ログを記録
never監査ログの作成を行わない
システムコールルールのリスト説明
exclude特定イベントの除外
exitシステムコールの終了時
taskプロセス生成,プロセスコピー時
userアプリケーションイベントの対象にする

なお、システムコールの番号はusr/include/asm/unisted_64.hの参照、またはausyscallコマンドにより調べることができる。

その他のAuditユーティリティ

# Auditログファイル内のイベント検索
ausearch

# Auditログファイルに記録されたイベントについてサマリー/レポートの作成
aureport

# プログラム終了までシステム コールとプロセスを追跡できるコマンド
autrace

TTY入力の監視

各ユーザのTTY入力の監視の有効化はpam_tty_audit.soの設定を行う。 この設定によりユーザがどのコマンドを実行したかログに記録できる。

監査の有効化は/etc/pam.d/password-auth/etc/pam.d/system-auth陛下のように定義する。

# rootのみ、TTY入力の監査を有効にする
session required pam_tty_audit.so diable=* enable=root

なお、結果はaureport --ttyで参照できる。

7.3. リソース制御

LinuxOSにはユーザが使用できるシステムリソース量を制限できる機能があり、制限にはulimitコマンドを用いる。

7.3.1. ulimitコマンド

シェルやシェルにより開始されるプロセスが使用できるリソースを制限できるコマンド。

ulimit -a

/etc/security/limits.conf

再起動時にulimitの設定を維持するには、/etc/security/limits.confでシステム全体に制限をかける必要がある。

なお制限方法は以下の2種類がある。

  • ソフトリミット … 現在有効なユーザーの利用可能なリソースの制限
  • ハードリミット … 実際の最大制限

7.3.2. pam_limits.so

pam_limits.soモジュールはユーザセッションで取得できるシステムリソースに制限を設定できるもの。

なおuid=0のユーザも影響を受ける。 またデフォルトに制限は構成ファイル/etc/security/limits.conf、次にディレクトリ/etc/security/limit.dの各ファイルが読み取られる。

7.3.3. Cgroup

CgroupはRedHat系の機能でシステム上で実行されているユーザー定義のタスク (プロセス) グループ間で、CPU 時間、システム、メモリ、ネットワーク帯域幅、またはこれらのリソースの組み合わせなどのリソースを割り当てることができる仕組みのこと。

一言で言うとカーネル内の特定のサブシステムを制御するためのメカニズムといえる。

Cgroups V1(RHEL8以前)の仕組み

CgroupsはKubernetes、Docker等のコンテナ技術でも使用されている。 Cgroupにおいてデバイス、CPU,メモリ(RAM)、ネットワークアクセスなどのサブシステムはコントローラと呼ぶ。

コントローラのタイプ(Cpu,blkio,memoryなど)はツリー上に細分化され、各枝や葉には独自の重み/制限がある。 コントローラのグループは複数のプロセスが関連付けられているため、リソースしよるいつが細かくなっており微調整が容易となっている。

Cgropus

cgroup はリソースタイプごとに作成され、相互に関連付けはない。 つまり、すべてのコントローラにグループを関連付けることはできるが、グループは独立して扱われる

/proc/cgroups

コンピュータ上で有効なコントロールグループが確認できる。

cat /proc/cgroups

/sys/fs/group

sysfs経由でも確認できる。

ls -l  /sys/fs/group

コントロールグループに関する情報の取得

systemd-cglsコマンドで制御グループの階層を表示ができるsystemd-cgtopコマンドではのリソース消費をリアルタイムで監視できる

systemd-cgls

systemd-cgtop

3.8 - 8.アクセス制御

【LPIC303範囲】LinuxのACLや権限設定、SELinuxなどに関する説明

8.1. 任意アクセス制御

任意アクセス制御はDACとも呼ばれ、アクセス制御リスト(ACL)を用いて実装できる。

8.1.1. 基本的なシステム権限設定

chmodコマンド

ファイルのアクセス許可を変更するために使用できるコマンド。

詳細はコチラから。

suid/guid

Linux権限システムでは、SUIDでユーザIDベースの、GUIDでグループIDベースのアクセスモードが提供されている。

プログラムにSUIDアクセスモード(u+s)で設定されている場合、そのファイルの所有者によりプロセスが開始されたように見える。

またプログラムにGUIDアクセスモード(g+s)で設定されている場合、プログラムはファイルのグループに属しているように実行される。

詳細はコチラから。

スティッキービット

ディレクトリにスティッキービット(o+t)を設定すると、ファイルの削除またはリンク解除を所有ユーザーまたはrootのみに許可できる

詳細はコチラから。

chownコマンド

rootユーザが使用できるコマンドでファイルの所有権を変更できるコマンド

詳細はコチラから。

拡張属性

拡張属性(xattr)はファイルシステム内のファイルまたはディレクトリに追加データを追加するメカニズムで、ext2、ext3、ext4、jfs、xfs、reiserfs、btrfs などの多くのファイル システムがサポートしている。

拡張ファイル属性は、ファイル システム、データ管理 API などの他のミドルウェア、オペレーティング システム、またはユーザーによってプログラム的に設定できるキーと値のペアのこと。

拡張属性の名前は、次の拡張属性名のように、名前空間名、ドット、属性名で構成される。

user.swift.metadata

system.posix_acl_access

パブリックの名前空間は以下の通り。

  • user … 名前や内容の制限なし名前空間
  • Trusted … 通常のプロセスがアクセスできない拡張属性に情報を保持するメカニズムをユーザー空間に実装するために使用される
  • security … SELinux によって使用される
  • system … 主にカーネルによってアクセス制御リスト (ACL) 用に使用される

getgfattr/setfattrコマンド

attrパッケージで使用できるコマンドにはgetgfattr/setfattrコマンドがある。 拡張属性の設定・確認に使用する。

# 指定されたパス内のファイルごとに、ファイル名と、そのファイルに関連付けられている拡張属性名 (およびオプションで値) のセットを表示
getfattr

# 指定されたパスの名前付き属性を返す
getfattr -n <name>
getfattr --name <name>

# 拡張属性名および値を表示
getfattr -d
getfattr --dump

# 指定されたパターンに一致する属性を持つ属性を返す
getfattr -m <pattern>

# 拡張属性の値の表示形式を指定する
getfattr -e <エンコード>
getfattr --encoding=<エンコード>
# 指定された各ファイルの拡張属性名に新しい値を関連付ける
setfattr

# 指定されたパスの名前付き属性を返す
setfattr -n <name>
setfattr --name <name>
# 指定された属性に割り当てる新しい値
setfattr -v <value>
setfattr --value <value>
# 属性を完全に削除
setfattr -x  <name>
setfattr --remove  <name>
# 指定したACLをデフォルトACLに設定
setfattr -d 
setfattr --default
# 指定したACLに設定を変更/追加
setfattr -m <権限>

8.1.2. ACLの使用

ACLは所有者以外のユーザーまたはグループに対して異なる権限であっても、特定の権限を定義する場合に使用できる。

また、ACLの使用は基本的な所有権や権限を (必然的に) 変更することなく、より具体的な権限のセットをファイルまたはディレクトリに適用できる。これにより、他のユーザーまたはグループのアクセスを追加できるようになる。

ACL権限を割り当てることができるエントリ タグは4つある。

  • user(u) … ファイル所有者または指定されたユーザ
  • group(g) … グループ所有者または指定されたグループ
  • mask(m) … ファイル所有者のユーザー エントリを除く、任意の ACL エントリによって付与できる最大アクセスを指定するエントリ
  • other(o) … ユーザーまたはグループの ACL エントリに一致しないプロセスに許可されるアクセスを指定するエントリ

設定例は以下の通り。

# ユーザー john には読み取りおよび書き込みアクセス権を与える
u:john:rw-
# グループ スタッフには読み取りアクセス権を付与
g:staff:r--
# その他のアクセスはなし
o::---

getfaclコマンド

getfaclコマンドはファイルごとにファイル アクセス制御リスト(ACL)を取得できるコマンド。 ディレクトリにデフォルト ACL がある場合は、 getfaclデフォルト ACL も表示される。

getfacl <ファイル名/ディレクトリ名>
オプション説明
-a設定されているACLの表示
-dデフォルトACLを表示
-RファイルやディレクトリのACLを再帰的に表示

setfaclコマンド

setfaclコマンドはACLを設定するコマンド。構文は以下の通り。

setfacl [オプション] [アクション] ファイル

なおアクションは-mで変更、-xで削除になる。

使用例は以下の通り。

# Userにパーミッションを追加する
setfacl -m "u:user:permissions" /path/to/file

ACLのマスク設定

マスク設定を行うとすべてのユーザーに許可される最大設定に設定される。 また、マスク設定は、chmodまたは setfaclコマンドのいずれかを使用してアクセス許可を変更すると、間接的に自動的に再度更新される。

コマンド説明
setfacl -m u:lisa:r file追加のユーザーに読み取りアクセスを許可する
setfacl -m m::rx fileすべてのグループおよびすべての指定ユーザーからの書き込みアクセスを取り消す (有効な権限マスクを使用)
setfacl -x g:staff fileファイルの ACL からの名前付きグループ エントリの削除
getfacl file1setfacl –set-file=- file2
getfacl –access dirsetfacl -d -M- dir

8.2. 強制アクセス制御

8.2.1. DACとMAC

ほとんどの主流のOSのセキュリティシステムはDACと呼ばれる所有権によりセキュリティを強制する任意アクセス制御(DAC)に基づいている。 DACではユーザーがファイルを所有している場合、そのファイルに対する読み取り、書き込み、および実行のアクセス許可を設定できる。 つまりユーザの裁量でデータを制御するのがDACと呼べる。

Linuxにおいてはrootアカウントによりもたらされる危険性、具体的に言えばすべてのファイルとプロセスを制御する権限を持っているため、root アカウント、またはその権限で実行されるプロセスが侵害されると、攻撃者がシステムとそのデータを制御する可能性がある。

MAC(強制アクセス制御)はrootアカウントの必要性が制限される、または排除され、権限がユーザアカウントからシステムの所有者に移される。 MACではセキュリティポリシの適用を強制する。なおセキュリティポリシーは、システム所有者が設定し、システム管理者またはセキュリティ管理者が実装できる。 これらのポリシーが設定されると、たとえ root 権限を持っていたとしても、ユーザーはポリシーを上書きできない。そのためMACではファイルとプロセスの保護は所有者から独立しているといえる。

有名な強制アクセス制御(MAC)のシステムは以下のようなものがある。

  • SELinux
  • AppArmor
    • UbuntuやSUSE Linuxで使用されているセキュリティモジュール
    • プロファイルと呼ばれるセキュリティポリシーを使用して、アプリケーション単位のアクセス権を設定することができる
    • AppArmorはファイルパスで保持するため、ファイルシステムを選ばずに利用できるという利点がある
  • Smack
    • 設定がシンプルなセキュリティモジュール
    • カーネルモジュール、起動スクリプト、GNUセキュリティパッケージ用のパッチセット、の三つで構成される

DACとMACの処理順序

Linuxにおいてプロセスがファイルアクセスをする際、DAC => MACの順に処理される。 この際、DACとMAC両方許可されたときのみファイルアクセスに成功する。

なお、アクセス先がファイルではない場合、DACは関係なく、MACのみ処理される。 また、SELinuxでエラーが発生したときは監査ログ(/var/log/audit/audit.log)に記述される。

8.2.2. SELinux

SELinux(Security - Enhanced Linux)は管理者がシステムにアクセスできるユーザーをより詳細に制御できるようにするLinuxアーキテクチャのこと。 米国のNSAにより開発された。

SELinuxの動作

SELinuxは、システム上のアプリケーション、プロセス、ファイルのアクセス制御を定義する。 これはSELinux にアクセスできるものとできないものを指示する一連のルールであるセキュリティポリシーを使用して、ポリシーによって許可されたアクセスを強制する

アプリケーションまたはプロセスがファイルなどのオブジェクトへのアクセス要求(サブジェクトと呼ばれる)を行うとSELinux はサブジェクトとオブジェクトのアクセス許可がキャッシュされているアクセスベクターキャッシュ (AVC) を使用してチェックする。 SELinux がキャッシュされたアクセス許可に基づいてアクセスを決定できない場合、リクエストをセキュリティサーバーに送信する。 セキュリティサーバーは、アプリまたはプロセスとファイルのセキュリティコンテキストをチェックする。セキュリティコンテキストは SELinux ポリシーデータベースから適用され、その後、許可が付与または拒否される。

なおアクセス許可が拒否された場合、avc: denied/var/log.messagesに表示される。

SELinuxの機能

  • TE(Type Enforcement) * プロセスやリソースに対する操作権限を制限する * プロセスには「ドメイン」、ファイルやディレクトリなどのリソースには「タイプ」というラベルを付与することにより、細かなアクセス制御を実現する
  • ドメイン遷移 * 子プロセスを、親プロセスとは異なるドメインに遷移させる * 子プロセスを親プロセスと異なるドメインに遷移させる事により、親プロセスの持つ権限を引き継がず個別に権限を制御できる
  • RBAC(Role Based Access Control) * 従来のLinuxにおいてrootユーザが持っていた絶対的な権限を分散し、「システム管理者」や「Web管理者」といったロール(役割)をユーザに割り当てる
  • MAC(Mandatory Access Control)

SELinuxの設定

SELinux を構成するに様々な方法があるが、一般的な方法には対象を絞ったポリシーまたは**マルチレベルセキュリティ (MLS)**がある。

  • 対象を絞ったポリシー … デフォルト設定。さまざまなプロセス、タスク、サービスをカバーする
  • MLS … 通常は政府機関の機器で使用される設定

SELinuxの動作は/etc/sysconfig/selinuxファイルの確認で可能。 このファイルにはSELinuxが許容モード、強制モード、または無効のいずれであるか、またはどのポリシーがロードされることになっているかが保存される。

cat /etc/sysconfig/selinux
  • Enforcing … アクセス違反は拒否する
  • Permissive … アクセス違反は許可されるが、ログに記録する

セキュリティコンテキスト

セキュリティコンテキストの書式は以下の通り。

ユーザ識別子:ロール識別子:対応識別子[:MLS]
  • ユーザ識別子 … SELinuxユーザ
  • ロール識別子 … ユーザに割り当てるロールを表す
  • タイプ識別子 … TEで使用するドメインまたはタイプを表す
  • MLS … 情報の機密性を表す
ユーザ識別子説明
rootシステム管理者用
system_uプロセスなどを使用するユーザ用
user_u一般ユーザ用
ロール識別子説明
object_rファイルなどロールが不要なものに付与
staff_r一般ユーザが使用(sysadm_rに変更可能)
user_r一般ユーザが使用(sysadm_rに利用不可能)
sysadm_rシステム管理者が使用
system_rプロセスが使用
タイプ識別子説明
sshd_tSSH接続時に使用
sysdam_tシステム管理者が使用

セキュリティコンテキストの確認

セキュリティコンテキストの確認は以下コマンドで行える。

  • プロセス … ps Zコマンド
  • ファイル/ディレクトリ … ls -Zコマンド

SELinuxの動作モード確認

SELinuxはデフォルトで有効になっており、デフォルトモードであるEnforceモードで動作している。 確認にはsestatusコマンドで確認できる。

sestatus

またSELinuxポリシーの一部をクエリするにはseinfoコマンドで行える。

seinfo

またapolと呼ばれるGUI SELinux ポリシー分析ツールではsesinfoコマンドと同様の機能をGUIで提供する。 利用にはsetools-uiパッケージをインストールする必要がある。

SELinuxの一次的な有効化/無効化

getenforceコマンドで可能。

getenforce

またsetenforceコマンドはSELinuxのステータスを設定するコマンド。 設定できるパラメータは以下の通り。

  • Disabled … SELinuxの無効化
  • Permissive … ポリシを強制する代わりに警告表示。アクセス制限は無効。
  • Enforcing … セキュリティポリシの強制。アクセス制御が有効。
# 無効化
setenforce 0
# 有効化
setenforce 1

SELinuxの永続的な有効化/無効化

SELinuxの永続設定は/etc/selinux/configファイルの編集にて行う。 再起動後に設定が反映される。

# 有効化
SELINUX=enforcing

# 無効化
SELINUX=disabled

Bool値によるSELinuxポリシの設定

Bool値を使用すると、SELinuxポリシの作成に関する知識がなくても実行時に、SELinuxのポリシ一部を変更できる。 これはSELinuxのポリシのリロード、再コンパイルを行わずに、サービスによるNFSボリュームへのアクセス許可などの変更が可能になることを意味する。

またBool値を設定/表示するコマンドは以下の通り。

コマンド説明
getseboolコマンドはBool値をリストするコマンド
setseboolブール値を有効または無効にするコマンド

SELinuxにおけるファイルのラベル付け

SELinuxではSELinuxコンテキストと呼ばれるすべてのプロセスとファイルにセキュリティ関連の情報を表すラベルが付けられる。

確認にはls -Z <ファイル名/ディレクトリ名>で行える。

ls -Z file1
-rw-rw-r--  user1 group1 unconfined_u:object_r:user_home_t:s0 file1

SELinuxはユーザ(u)/ロール(r)/タイプ(t)/レベル(s0)の情報を提供する。 これらの情報はアクセス制御の決定を行うために使用される。

またSELinuxにはファイルシステムへのラベル付けを管理するためのコマンドで以下のものを提供している。

  • chcon
  • semanage fcontext
  • restorecon

SELinux関連コマンド一覧

操作系コマンド説明
getenforce現在の動作モード表示
setenforce動作モードの一時的変更
selinuxenabledSELinuxが有効か数値で返す
chconファイルやディレクトリのセキュリティコンテキストを変更
restoreconセキュリティコンテキストの復元
runcon指定されたセキュリティコンテキストでコマンドを実行
fixfilesSELinuxの設定ファイルに従いすべてのファイルにラベルを付与
setfiles指定した設定ファイルに従ってファイルにラベルを付与
sestatusSELinuxの現状を表示
seinfoSELinuxのロールやドメインなど各種情報を表示
newrole指定したロールに変更してシェルを起動
getseboolBool値で示されるポリシーの状態取得
setseboolBool値で示されるポリシーの設定
toggleseboolBool値で示されるポリシーの値変更
semanageSELinuxに関する各種操作
解析系コマンド説明
apolGUIでSELinuxポリシの分析
seauditGUIでSELinuxの監査ログを解析
seaudit-report監査ログのSELinux用カスタムレポートの作成
audit2why監査ログを解析し、アクセス拒否が発生した理由と解決方法を提示
audit2allow監査ログを解析しアクセス拒否が起きないルールを提示

chconコマンド

chconコマンドはファイル/ディレクトリのセキュリティコンテキストを変更するコマンド。 ただし、このchconコマンドで行われた変更は、ファイルシステムのラベルを変更したり、restoreconコマンドを実行したりしても保持されない。

# ファイルタイプの変更
chcon -t httpd_sys_content_t file-name
# ファイルタイプと内容の再帰的変更
chcon -R -t httpd_sys_content_t directory-name

8.2.1. SELinuxコンテキストを管理するためのツール

restoreconコマンド

ファイルの SELinux コンテキストを以前のタイプに復元するコマンド。 -vオプションで変更内容を表示する。

restorecon -v file1

fixfilesコマンド

restoreconコマンドと同じ機能を提供するコマンド。

restorecon

setfilesコマンド

SELinux ファイルのセキュリティコンテキストを設定するために使用できるコマンド。

setfiles

8.2.2. SELinuxコンテキストとロールをテストするためのツール

SELinux の一部には、Role-Based Access Control (RBAC) セキュリティモデルが実装されている。ロールは RBAC の属性となる。 SELinux ユーザーにはロールが承認され、ロールはドメインに対して承認される。 この役割はドメインと SELinux ユーザーの間の仲介者として機能する これは、権限昇格攻撃に対する脆弱性を軽減するのに役立つ。

newroleコマンド

新しいコンテキストで新しいシェルを実行するコマンド。

newrole

runco​​nコマンド

指定された SELinux コンテキストでコマンドを実行するコマンド。

runco​​n

8.2.3. 汎用的なSELinux管理コマンド

semanageコマンド

ポリシーソースの変更や再コンパイルを必要とせずに、SELinux ポリシーの特定の要素を構成するために使用されるコマンド。

semanage <引数>
引数説明
importローカルのカスタマイズをインポート
exportローカルのカスタマイズを出力
loginLinux ユーザーと SELinux 制限付きユーザーの間のログイン マッピングを管理する
userSELinux 制限付きユーザーの管理 (SELinux ユーザーの役割とレベル)
portネットワークポートタイプ定義の管理
interfaceネットワークインターフェースタイプの定義を管理する
moduleSELinux ポリシーモジュールの管理
nodenetworkノード タイプの定義を管理する
fcontextファイルコンテキストマッピング定義の管理
booleanブール値を管理して機能を選択的に有効にする
permissiveプロセスタイプ強制モードの管理
dontauditポリシー内の dontaudit ルールを無効/有効にする
ibpkeyinfiniband pkey タイプ定義の管理
ibendportInfiniband エンドポートタイプ定義の管理

semanage booleanコマンド

許可ルールのセットを有効または無効にすることができるコマンド。 これにより、異なるユースケースに対して異なるルールセットを許可することが可能になる。

ユースケースはユーザーのホーム ディレクトリのデータなどのユーザー コンテンツの読み取りを許可する必要がある Web サーバーがある場合などがある。このとき、SELinux ではデフォルトではそれができないが、semanage booleanコマンドを使用すると、その機能を有効にすることができる。

semanage boolean -l | grep httpd

semanage fcontextコマンド

アクセス制御を決定するための追加情報 (SELinux ユーザー、ロール、タイプ、レベルなど) を含むファイル コンテキスト定義を管理するために使用されるコマンド。

# 利用可能なポリシーの完全なリストを表示する
semanage fcontext -l

semanage portコマンド

カスタムポートでサービスを実行できるコマンド。

semanage port -a -t ssh_port_t -p tcp 2112

カスタムポートでサービスを実行しようとすると、サービスは失敗する。 例として、SSH デーモンを標準以外のポートで実行したいとする。このために単に sshd_config を構成すると、SELinux はこの変更が行われたことを認識しないため、SELinux がアクセスをブロックする。

8.2.4. CUIでのSELinux AVCメッセージのトラブルシューティング

SELinux がアクションを拒否すると、アクセス ベクター キャッシュ (AVC) メッセージがファイルに記録される。 保存される場所は/var/log/audit/audit.log/var/log/messagesに保存され、またそれはjournaldデーモンによって記録される。

ausearchコマンド

最近の AVC メッセージを検索し、SELinux がアクションを拒否していることを確認できるコマンド。

ausearch -m AVC,USER_AVC -ts recent

-mオプションはausearch が返す情報の種類を指定、-tsはタイムスタンプを指定する。

  • -ts recently … 過去10分間のAVCメッセージを表示
  • -ts today … 1日全体のメッセージを表示

sealertコマンド

AVC メッセージをさらに詳細に確認するコマンド。

sealert -l [メッセージID]

8.2.5. Seaudit

Seauditはログを表示し、特定の SELinux ポリシーに基づいてフィルタリングするためのGUIツール。

8.2.6. MACの代替ツール

SELinux以外のMACツールには以下のようなものがある。

  • AppArmor
    • Ubuntuで人気のMACツール
    • SELinuxよりも管理が容易
    • inode番号ではなくファイルパスにタイプを割り当てる
    • モード:EnforcementComplainの2つ
    • aa-genprofaa-logpro fコマンド(ポリシ作成に使用)がある
  • Smack
    • カーネルにコンパイルする必要がある
    • ラベルの割り当てに拡張ファイル属性を使用
    • -ZSELinux のようなフラグを使用
    • chsmackコマンドをラベル情報のクエリと設定に使用する

3.9 - 9.ネットワークセキュリティ

【LPIC303範囲】Radiusサーバ、Snort、iptablesによるファイヤーウォール設定、OpenVPN/WireGuardなどに関して。

9.1. ネットワークセキュリティの強化

9.1.1. Radius

Radius(Remote Authentication Dial-In User Service)は接続するユーザーとネットワーク サービスに一元的な認証、認可、アカウンティング(通称AAA)を提供するプロトコルのこと。

  • 認証(Authentication) … クライアント (ユーザー、デバイス、またはプロセス) がシステムの本物のユーザーであるかどうかを判断するプロセス
  • 認可(Authorization) … クライアントがネットワーク上で何を行うことが許可されているかを決定するプロセス
  • アカウンティング … ネットワーク上のクライアントのアクティビティを監視し、サービスのコストを計算するために必要な情報を提供するプロセス

3つの AAA プロトコルすべてを使用する必要はなく、必要なプロトコルのみを使用する。

9.1.2. FreeRADIUS

FreeRADIUSはOSSのRadius実装で最も広く使用されている RADIUS サーバのこと。 FreeRADIUSは認証サービスを提供するradiusdデーモンを提供する。

インストール

dnf install  freeradius freeradius-utils freeradius-mysql freeradius-perl

サービスの開始

systemctl enable radiusd --now

/etc/raddb/*

/etc/raddb/*以下にFreeRADIUSの設定ファイルが格納される。 代表的な設定ファイルは以下の通り。

  • radiusd.conf … FreeRADIUSのプライマリ設定ファイル。サーバーのログ記録とパフォーマンスの設定ができる
  • client.conf … クライアント構成ディレクティブ
  • proxy.conf … プロキシ半径およびrealm設定ディレクティブ
  • policy.d

Radmin

radminは実行中のサーバーの制御ソケットに接続し、それにCLIを提供するFreeRADIUSサーバー管理ツールのこと。

radmin <オプション>
オプション説明
-dデフォルトは/etc/raddb。 radmin はここでサーバー構成ファイルを検索し、制御ソケットのファイル名を定義する「listen」セクションを見つけます。
-D 辞書ディレクトリメイン辞書ディレクトリを設定する。 デフォルトは/usr/share/freeradiusとなる
-e コマンドコマンドを実行して終了する
-E実行中のコマンドをEchoする
-f ソケットファイルソケットファイル名を直接指定する
-hヘルプ情報の表示
-i 入力ファイル指定されたファイルから入力を読み取る。指定しない場合はstdin が使用される
-n 名前/raddb/radiusd.confの代わりに/raddb/name.confを読み取る

基本構成

デフォルトの構成を使用することがサーバの設定を最も破壊せずに使用できる方法といえる。 この場合、ユーザとパスワードの設定のみでよくなる。 手順は以下の通り。

  1. /etc/raddb/clients.confを編集してエントリ追加する
  2. ipaddrにクライアントIP、secretには通信の暗号化と復号化に使用される共有秘密を指定
  3. /etc/raddb/usersを編集しユーザアカウントを作成する
  4. testing Cleartext-Password := "password"のように設定
  5. サーバーをデバッグモードで起動する(radiusd -X)

なお、クライアントの設定方式は以下のようになる。

client test {
    ipaddr = 192.168.0.0/24
    secret = test_abcz
}

radtestコマンド

FreeRADIUS サーバーが動作可能になった際に、アカウントをテストできるコマンド。

radtest {username} {password} Pradius-server} {nas-port-number} {radius_secret}

使用例は以下の通り。

radtest testing mypass localhost 0 s3cre3t

radclientコマンド

radclientは任意のRADIUSパケットをRADIUSサーバに送信し応答を表示するコマンド。れは、RADIUS サーバーの設定に加えた変更をテストするために使用したり、RADIUS サーバーが稼働しているかどうかを監視したりするために使用できる。

radclient <オプション>

radlastコマンド

radlastコマンドはlastコマンドのFreeRADIUS サーバーにおけるフロントエンド。

radlast <オプション>

radwhoコマンド

radwhoコマンドは現在ログオンしているユーザーを表示するコマンド。

radwho <オプション>

9.1.3. ネットワークユーティリティ

tcpdumpコマンド

tcpdumpはシステムを通過する TCP/IP パケットなどのネットワーク トラフィックをキャプチャ、フィルタリング、分析するために使用できるコマンド。 システム管理者が Linux での接続の問題をトラブルシューティングするためのコマンドともいえる。

なおtcpdumpを用いて.pcapファイルにパケット情報を保存することもできる。

tcpdump <オプション> [条件式]
オプション説明
-i <インターフェイス>指定したインターフェイスの監視
-nホスト名ではなくIPアドレスの表示
-r <ファイル>ファイルからパケット情報を取得
-w <ファイル>パケット情報をファイルへ出力する
-s <バイト数>パケットを取り出すバイト数を指定する
-xパケット内容を16進数で表示する
-Xパケット内容を16進数とASCII文字列で表示する
-pプロミスキャスモードにしない
-mMIBモジュールを読み込む
条件式修飾子説明
host <ホスト>送信先/送信元がホストならば真
port <ポート番号>送信元/送信先がポート番号ならば真
src <送信元>
dst <送信元>
送信元/送信先の条件指定
and , or複合条件の設定

WireShark

Wireshark はパケットを分析するためのGUIツール。 Wireshark は GUI ツールだが、tshark として知られる CLI に相当するツールがある。

Wiresharkでは、条件を指定することで表示するパケットをフィルタリングすることができる。

フィルタ条件説明
host <ホスト>送信先/送信元がホストのパケットをキャプチャ
net <ネットワーク>対象のネットワークを流れるパケットをキャプチャ
[tcp/udp] port <ポート>対象プロトコルのポートが流れるパケットをキャプチャ
src/dst <送信元>送信先/送信元が送信元/送信先のパケットのみをキャプチャ
portrange A-Bポート番号A-Bの範囲のパケットをキャプチャ

条件式は以下の通り。

  • A eq B … A=B
  • A gt B … A>B
  • A ge B … A>=B
  • A lt B … A<B
  • A le B … A<=B
  • A and B … AかつB
  • A or B … AまたはB
  • not <条件式> … 条件満たさないとき
  • A[パターン] == B … パターンがBに合致でおk

Tshark

TSharkはWireSharkのCUIユーティリティ。 使用できるコマンドは以下の通り。

tshark [オプション]
オプション説明
-D有効なネットワークインターフェイス一覧表示
-i <インターフェイス>ネットワークインターフェイスを指定
-f <フィルタ条件>キャプチャするパケットフィルタ
-w <ファイル>キャプチャしたパケットをファイルへ保存
-r <ファイル>ファイルからパケット情報を読みこむ
-z <項目>項目に対する統計情報を出力
-V詳細表示

ndpmon

ndpmonはNDP(Neighbor Discovery Protocol)を監視するツール。NDPに関する状況をlogに記載したり、アラートメールを送信することも可能。

NDPはIPv6においてデータリンク層のアドレス解決を行うプロトコル。 NDPで利用されるメッセージの一つに、IPv6ルータからの応答であるルータ広告(RA:Router Advertisement)がある。RAはICMPv6を用いたグローバルIPアドレスのプレフィックスなどの情報で、悪意ある攻撃者がルータに成りすますとRAが書き換えられ不正なRAが発信される可能性がある。

ndpmonは、NDPをモニタリングすることにより、不正なRAを検出することができる。

Kismet

Kismetはワイヤレス ネットワークとデバイスの検出器、スニファー、ワードライビング ツール、および WIDS (ワイヤレス侵入検出) フレームワークのこと。

kismet_clientkismet_dronekismet_serverコマンド/ユーティリティで構成される。

aircrack_ng

aircrack_ngはWiFi ネットワークのセキュリティを評価するためのツール。 可能なことは以下の通り。

  • モニタリング … パケットのキャプチャとデータのテキスト ファイルへのエクスポートにより、サードパーティ ツールによるさらなる処理が可能
  • 攻撃 … パケットインジェクションによるリプレイ攻撃、認証解除、偽のアクセスポイントなど
  • テスト … WiFi カードとドライバーの機能を確認する (キャプチャとインジェクション)
  • クラッキング … WEP および WPA PSK (WPA 1 および 2)

Bettercap

BettercapはIEEE.802.11、BLE、IPv4、IPv6 ネットワークの偵察と MITM 攻撃用のツール。

9.1.4. ネットワークスレッド

不正ルーターによるアドバタイズメント

不正ルータによるルータ通知(アドバタイズメント)を防ぐにはカーネルを調整することで軽減できる。設定すべきファイルは以下の通り。

  • /proc/sys/net/ipv6/conf/<interface>/forwarding
  • /proc/sys/net/ipv6/conf/<interface>/accept_ra

Rouge DHCP メッセージ

DHCP スヌーピングを使用して対処できる。

9.2. ネットワーク侵入の検知

9.2.1. ネットワーク帯域監視

帯域監視は、トラフィック監視などとも呼ばれ、ネットワーク上を流れるデータ通信量を監視することを指す。

Linuxで帯域監視を行えるソフトウェアにntopCacti)がある。

Ntop(ntopng)

ntopはネットワークトラフィック(L2,L3)監視ソフトウェアで、ネットワークのステータス、UDP、TCP、DNS、HTTP、その他のプロトコルのトラフィックのプロトコルごとの分布をWebブラウザ上で確認できる。

設定ファイルは/etc/ntopng.confとなる。

ntop コマンド説明
/usr/sbin/ntop -Antop 管理者ユーザーのパスワードを設定する
ntop –set-admin-password=NewP@$$新しい管理者パスワードを設定する
ntop -P /etc/ntop -w4242 -d/etc/ntop 設定ファイルをポート番号 4242 で使用して、ntop をデーモンとして実行する。
-Wオプションは、Web ブラウザを通じて ntop にアクセスするポートを有効にする。このオプションを指定しない場合、デフォルトのポートは3000。
-dオプションを指定すると、ntop がデーモン モードで有効になる。

Cacti

Cactiは、RRDtoolと呼ばれるデータロギングとグラフィカルな描画を行う業界標準のツールを使った、WebUIを持つネットワーク監視ソフトのこと。

サーバ等の機器の動作状況をSNMP(Simple Network Management Protocol)を用いて監視できる。

RRDtool: RRDへデータを保持し、グラフを作成するOSS

9.2.2. Snort

Snortはネットワーク型IDSとして代表的なソフトウェア。 検知するパケットのルール(シグネチャ)を定義したルールファイルを参照して不正なパケットを検知する。

Snortには以下の用途で使用できる。

  • tcpdumpのようにパケットスニファとしての使用
  • パケット ロガーとしての使用
  • 本格的なIDSとしての運用

Snortのインストール

ソースからのダウンロードや、RedHatユーザはコチラからダウンロードできる。

Snortの構成

Snortの設定は/etc/snort/snort.confファイルで行う。 Debianの場合はSnort のデフォルト構成ファイル内の一部のネットワーク設定を上書きする必要がある。手順は/etc/snort/snort.debian.confを確認して行う。詳しくは公式ドキュメントより。

/etc/snort/*

ファイル説明
/etc/snort/snort.confネットワーク構成/監視するポートの定義が可能

Snortルール

Snortルールはシグネチャとは異なる検出手法でルールを作成するには、脆弱性が実際にどのように機能するかを正確に理解してルールを作成する必要がある。そのためデフォルトのルールセットを通常は用いると良い。

なおSnortルールは、/etc/snort/snort.confファイル内の行をコメント化またはコメント解除することによって有効または無効になる。 ルールは/etc/snort/rulesに保存される。

Snortルールの構文

Snortルールは、ルールヘッダルールオプションという 2 つの主要なコンポーネントで構成される。

なおルールセット(ルールファイル)に記述したシグネチャ(ルール)を変更した後は、snortプロセスを再起動することで変更が反映される。

alert ip any any -> any any (msg: "IP packet Detected";)

構成は以下の通り。

ルールアクション プロトコル IPアドレス ポート番号 <方向演算子> IPアドレス ポート番号 (ルールオプション)
  • ルールアクション
    • alert … ルールマッチしたパケットのログを記録し警告を出力する
    • log … ルールにマッチしたパケットをログに記録
    • pass … ルールにマッチしたパケットを無視
    • activate … ルールにマッチしたパケットについて警告出力し、対応するdynamicアクションの実行を行う
    • dynamic … activateアクションから呼び出され、該当パケットをログに記録
  • プロトコル
    • 検知対象(tcp, udp, icmp, ip)を記録
  • IPアドレス
    • x.x.x.xか範囲([x.x.x.x,y.y.y.y])または任意(any)で指定
  • ポート番号
    • ポート番号(x)または範囲((x,y))または任意(any)で指定
  • 方向演算子
    • ->:右側が送信先、左側が送信元となる
    • <>:左右に記載されるIP/ポートが送信先/送信元どちらでもよい
  • ルールオプション
    • 検知するパケットルールの指定
    • 未指定の場合はルールヘッダに垣外数るすべてのパケットがマッチする

snortのルールセット

Snortの主なルールセットは以下の通り。

ルールファイル説明
dos.rulesDoS攻撃を検出するためのルール
ftp.rulesFTPサービスへの攻撃を通知するためのルール
local.rulesユーザ独自のルール
scan.rulesスキャンを検知するためのルール
smtp.rulessmtpサービスへの攻撃を検知するためのルール
telnet.rulestelnetサービスへの攻撃を検知するためのルール
web-cgi.rulesWEBサーバのCGIに対する攻撃を検知するためのルール

snortコマンド

snort [オプション] <フィルタオプション>
オプション説明
-bログをtcpdump形式で記録
-c 設定ファイル設定ファイルの指定
-dアプリケーション層のデータも記録
-Dバックグラウンドで実行
-g <グループ>記録するグループの指定
-u <ユーザ>起動するユーザの指定
-i <インターフェイス>ネットワークインターフェイスの指定
-l <ディレクトリ>ログディレクトリの指定

9.2.3. OpenVASとNASL

OpenVAS(Open Vulnerability Assessment System)は、OSSの脆弱性スキャナソフトウェア。Network Vulnerability Tests(NVTs)と呼ばれる脆弱性テストを常に更新でき、最新の脆弱性情報にすばやく対応できることが強みで、CLIでもGUIでも操作できるインタフェースを持つ。

NASLはNessusやOpenVASなどの脆弱性スキャナーで使用されるセキュリティ対策用に特化したスクリプト言語のこと。NASLを使用すると、既知の脆弱性に基づいて特定の攻撃を自動化できる。

なおOpenVasの設定は/etc/openvas/以下に配置され、/etc/openvas/openvassd.confが全体における主要な動作の設定ファイルとなる。

openVASのユーティリティ

OpenVASを操作するユーティリティには以下のようなものがある。

ユーティリティ機能
openvasmdOpenVasManager: 各種操作が行える
openvasmd –rebuildデータベースの再構築を行う
openvassdスキャン処理を行う
openvas-nvt-syncNVTsを更新する
openvas-mkcertクライアントと暗号化通信を行うための証明書を発行する

ユーザの追加と削除

OpenVASではユーザごとにスキャン内容を設定することができる。 ユーザ追加/削除は以下コマンドで可能。

# 追加
openvasmd --create-user
# 削除
openvasmd --delete-user

NTSsのアップデート

openvas-nvt-syncコマンドで最新の状態にアップデートすることができる。

openvas-nvt-sync

クライアントとの通信の暗号化

OpenVASスキャナとこれを使うクライアント間の通信はSSL化される。 この際に必要な証明書はopenvas-mkcertコマンドで作成できる。

openvas-mkcert

9.3. パケットフィルタリング

9.3.1. ファイヤーウォールの基礎

ファイヤーウォールのアーキテクチャ

ファイヤーウォールのアーキテクチャにはパケットフィルタリング型ゲートウェイ型がある。

  • パケットフィルタリング型
    • 通信を細分化したパケットを監視するファイアウォール
    • 通信をパケット単位で解析し、決められたルールに基づいて通過の許否を判断する
    • アプリケーション層レベルの判断はできない
  • ゲートウェイ型
    • 内部コンピュータの代わりに通信を行うファイアウォール
    • アプリケーション型、プロキシサーバ型とも呼ばれる
    • データの細切れであるパケットの中身まで把握できる
    • アプリケーション層(FTP, HTTPなど)でのフィルタリングを行うことができる

パケットフィルタリング型ファイヤーウォール

パケットフィルタリング型には以下の2種類がある。

  • ステートレス … 個々のパケットについて、スタティックなIPアドレスおよびポート番号のみのフィルタリングを行う
  • ステートフル … 往きのパケットに基づき、戻りのパケットに対してもフィルタリングルールを適用する

9.3.2. ファイヤーウォール

Netfilter

Netfilterはカーネルモジュールであり、カーネルがインターフェイスに転送するネットワークトラフィックはすべて netfilter を通過するようになっている。 netfilterモジュールへの主要なインターフェイスはiptablesであり、Linux ファイアウォールで高度な構成を行うことができる。

iptablesは複雑であるため、ufw 、 firewalld などの他の解決策が考案された。 これらは iptables と連携して動作し、ファイアウォールの設定を簡単に行えるようにする。

Iptables

iptablesはテーブルとして動作し以下の3種類の機能を提供する。

  • Filter … パケットフィルタリングとして使用される
  • NAT … アドレス変換に使用される
  • MANGLE … パケットを特別な処理をしたい場合に使用される

各テーブルにはチェインがあり、どの種類のパケットをフィルタリングするか定義するために使用される。 以下の種類がある。

  • PREROUTING - (NAT, MANGLE) * パケットがルーティングテーブルに渡される前に処理する * 通常はパケットを別のアドレスまたはポートにリダイレクトするために使用する(DNAT)
  • INPUT - (NAT, Filter, MANGLE) * パケットがホストに到着するときに処理する * ネットワークからの着信接続や、ローカルプロセスからのローカルホストへの通信が含まれる
  • OUTPUT - (NAT, Filter, MANGLE) * ホストから発信されるパケットを処理する * ローカルホストから外部のネットワークへの接続や、ローカルプロセスからの通信が含まれる
  • FORWARD - (Filter, MANGLE) * ホストを経由して他のホストに送信されるパケットを処理する * ルーターがパケットを他のネットワークセグメントにルーティングする際に使用する
  • POSTROUTING - (NAT, MANGLE) * パケットがルーティングテーブルを通過した後に処理する * パケットが送信元または宛先の IP アドレスを変更するために使用する

チェインはルールを作成できるフィルタリングポイントであり、ルールはトラフを通過するパケットに適用される。 ルールは、パケットに対して正確に何が起こるべきかを定義するもので以下のようにターゲットを指定できる。

  • ACCEPT … パケットの許可
  • DROP … パケットをドロップする
  • REJECT … パケットを拒否し、送信者にはICMP警告メッセージを送信する
  • LOG … ログを取る
  • MASQUARATE … NATに使用される

iptablesコマンド

iptablesコマンドは、Linuxシステムでファイアウォールを構成および管理するためのコマンド。 iptablesは、パケットのフィルタリング、NAT (Network Address Translation)、パケットの転送などの機能を提供している。

iptables -A chain [-i/-o interface] [-s/-d address] -p udp --sport/--dport 80  -j TARGET

| オプション | 説明 | | -L <チェーン名> -t <テーブル名> | 指定されたチェーンおよびテーブル内のすべてのルールをリストする。チェーンまたはテーブルが指定されていない場合は、すべてを表示する。 | | -D | 特定のチェーン内のルールを番号によって削除する | | -バツ | チェーンを削除する | | -F (または –flush) | ルールのすべて (または指定されたチェーン) をフラッシュする | | -P | チェーンのデフォルトポリシーを変更する(DROPまたはACCEPTに設定可能) | | -v | 通常は、追加の出力を提供するために -F(または –flush) とともに使用される | | -n | IPアドレスとポートを数値形式で表示する |

# 現在のルールをリストする
iptables -nvL

# ポリシの作成
iptables -P INPUT DROP

# ルールの追加
iptables [-t table] {-A|-C|-D} chain rule-specification
# -A : 選択したチェーンの末尾に 1 つ以上のルールを追加
# -C : 仕様に一致するルールが選択したチェーンに存在するかどうかを確認
# -D : 選択したチェーンから 1 つ以上のルールを削除

# ルールの挿入
iptables [-t table] -I chain [ルール番号] rule-specification

# ルールの削除
iptables [-t table] -D chain ルール番号

# パケットカウンタとバイトカウンタをゼロに設定
iptables [-t table] -Z

/etc/sysconfig/iptables

/etc/sysconfig/iptablesブート時またはサービスの開始時にカーネルがパケット フィルタリング サービスを設定するために使用する情報が保存されるファイル。

  • iptables-save … iptablesルールを永続保存するためのコマンド * iptables-save > /etc/sysconfig/iptables.$(date +%d-%m-%y) * -c:パケットカウンタ及びバイトカウンタの現在値を表示 * -t テーブル:テーブルを指定
  • iptables-restore … バックアップの設定からiptablesの設定を復元するコマンド * iptables-restore < /etc/sysconfig/iptables.20-09-22 * -c:パケットカウンタ及びバイトカウンタの値を復元 * -n:復元する際に現在のテーブル内容を削除しない

iptablesによるIP毎の接続制限

connlimitジュールを使用すると、クライアントIP アドレス (またはアドレス ブロック) ごとにサーバーへの並列 TCP 接続の数を制限できる。 これは、サーバ または VPS をフラッディング、スパム、Webスクレイピングから保護するのに役立つといえる。

iptables -A INPUT -p tcp --syn --dport $port -m connlimit --connlimit-above N -j REJECT --reject-with tcp-reset

例は以下の通り。

# クライアントホストごとに3つのSSH接続のみを許可する
iptables  -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 3 -j REJECT

# IP/ホストごとに20個のHTTP接続までに制限する
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 20 -j REJECT --reject-with tcp-reset

iptablesによる1秒あたりの接続数制限

staterecentモジュールを使用すると、1秒あたりの接続数制限ができる。

ip6tables

Ip6tables は IPv6 パケット フィルタ ルールのテーブルの設定、維持、および検査に使用される。

9.3.3. 高度なファイアウォール

IPset

IPsetはIPアドレス、ネットワーク範囲、MACアドレス、ポート番号、およびネットワークインターフェイス名の保存されたコレクションであり、 iptablesツールは、IPセットを利用して、より効率的なルール照合を行うことができる。netfilterと連携して使用できる。

利用例としては悪意のある通信元が分かっているアドレスがあるときに、IPセットを作成しiptablesで参照することでルール セットが動的になり、構成が容易になる。

ipsetコマンド

ipsetコマンドはIP セットを作成および変更できるコマンド。

ipset <オプション>

range_setは名称、hashは保存方法、netはデータ型を定義する。

ipset create <range_set> <hash:net>

オプションは以下の通り。

オプション説明
create新しいIPセットを作成
addIPセットにエントリを追加
delIPセットからエントリを削除
destroyIPセットを破棄
listIPセットの内容をリスト
flushIPセット内のすべてのエントリを削除
test指定したIPがIPセットに含まれているかどうかを確認
swap2つのIPセットの内容を交換
renameIPセットの名前を変更

ipsetの永続化

作成した ipset はメモリに保存され、再起動すると消去される。 ipset を永続的にするには以下コマンドで可能。

ipset save > /etc/ipset.conf

復元には以下コマンド。

ipset restore < /etc/ipset.conf

DMZネットワーク

DMZは組織の内部ローカル エリア ネットワークを信頼できないトラフィックから保護し、セキュリティ層を追加する境界ネットワークのこと。 通常DMZはパブリックインターネットとプライベートネットワークの間にあるサブネットワークを指す

DMZを設置する目的は以下の通り。

  • プライベートネットワークや LAN の安全性を確保しながら、インターネットなどの信頼できないネットワークにアクセスできるようにする
  • 外部向けのサービスとリソースに加え、DNS、ファイル転送プロトコル (FTP)、メール、プロキシ、VoIP、および Web サーバーのサーバーを DMZ に設置する

DMZを置くことでハッカーがインターネット経由で組織のデータや内部サーバーに直接アクセスすることがより困難になる

Connection Tracking

ConntrackはLinux カーネルのネットワークスタックの中核機能の1つでカーネルはすべての論理ネットワーク接続またはフローを追跡でき、各フローを構成するすべてのパケットを識別して、それらを一貫して一緒に処理できる機能のこと。

Conntrackは通常、フロー内の最初のパケットのみが完全なネットワークスタック処理を通過して処理を決定する必要があるため、パフォーマンスを向上させる (CPU の削減とパケット遅延の削減)。 設定ファイルは/proc/sys/net/nf_conntrack_maxとなる。

またconntrack-toolsパッケージには 2 つのプログラムが含まれている。

  • conntrack * 接続追跡システムと対話するためのフル機能のコマンド ライン ユーティリティを提供する * 既存のフロー エントリを一覧表示、更新、削除できる
  • conntackd * ユーザー空間の接続追跡デーモン * ユーザスペースで動作する

NAT

NATは送信元と宛先の IP アドレスとポートを変更すること。 アドレス変換により、IPv4 パブリック アドレスの必要性が減り、プライベート ネットワーク アドレス範囲が隠蔽される。 このプロセスは通常、ルーターまたはファイアウォールによって実行される。

  • SNAT * ソースのプライベート IP アドレスをパブリック IP アドレスに変換するプロセスのこと
  • DNAT * パケットの IP ヘッダー内の宛先アドレスを変更すること * インターネット ホストからプライベート ホストにトラフィックをリダイレクトするために使用される

NATにおけるアドレス変換には以下の種類がある。

  • 静的NAT … 1 つのプライベート IP アドレスをパブリック IP アドレスに変換する
  • ダイナミックNAT … プライベート IP アドレスはパブリック IP アドレスのプールにマッピングする
  • NPAT(PAT) … 1 つのパブリック IP アドレスがすべての内部デバイスに使用されますが、各プライベート IP アドレスには異なるポートが割り当てられる

ebtables

ebtablesはイーサネットフレームを検査するルールのテーブル (Linux カーネル内) を設定および維持するために使用されるプログラムのこと。 ebtablesでは、iptablesと同様に「テーブル」「チェイン」「ターゲット」を用いてルールを構築する。

ebtables -Ln # ルール セットを印刷するときに行番号をリスト
ebtables -Lc # 各ルールのパケットおよびバイトカウンターをリスト

またebtablesのテーブルには以下の3種類がある。

  • filter … Ethernetテーブルのフィルタリング
  • nat … MACアドレスの変更
  • broute … ブリッジ+ルータの機能を実行

Nftables

nftables(ntf)は iptables の代替ツール。 テーブルやチェインなどが予め用意されていたiptablesに対して、nftではユーザが自分で作成する。

ルール作成の手順は以下の通り

  1. テーブル作成 … nft add table
  2. チェインの作成 … nft add chain
  3. ルールの作成 … nft add rule

ルールセットの確認はnft list rulesetで可能。

9.4. VPN

9.4.1. OpenVPN

OpenVPNは安全なポイントツーポイント接続またはサイト間接続を作成する仮想プライベート ネットワーク (VPN) 技術を実装するOSSソフトウェア。

OpenVPN は、事前共有秘密キー、証明書、ユーザー名/パスワードなどのさまざまな方法を使用して、クライアントがサーバーに対して認証できるようにする。

なおデフォルトではOpenVPNは1194のUDPポートで動作する。

OpenVPNのインストール

ダウンロードする前にIP転送を有効にする必要がある。

sysctl -w net.ipv4.ip_forward=1

RedHat系では以下のようにインストールする。

dnf install epel-release -y
dnf install openvpn -y

Easy-RSAの構成

OpenVPNのインストール後、SSL証明書を追加して構築する必要がある。

cd /etc/openvpn/
wget https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.6/EasyRSA-unix-v3.0.6.tgz
tar -xvzf EasyRSA-unix-v3.0.6.tgz
mv EasyRSA-v3.0.6 easy-rsa
cd /etc/openvpn/easy-rsa
vi vars

easy-rsaのvarsを作成したら以下ステップを実行する

  1. ./easyrsa init-pkiでpkiディレクトリの開始
  2. sudo ./easyrsa build-caでCA証明書の作成
  3. sudo ./easyrsa gen-req myov-server nopassでキーペアと証明書のリクエストを作成
  4. sudo ./easyrsa sign-req server myov-serverでサーバキーに署名する
  5. sudo ./easyrsa gen-dhでキー交換のためのDH鍵を作成する
  6. 上記で作成したファイルを/etc/openvpn/server/にコピーする(ca.crt,dh.pem, .key, .crt)
  7. sudo ./easyrsa gen-req client nopassでクライアント キーを取得する
  8. sudo ./easyrsa sign-req client clientで生成された CA 証明書を使用してクライアント キーに署名する
  9. 上記で生成したファイルを/etc/openvpn/client/にコピーする(ca.crt,client.crt,client.key)

OpenVPNサーバの構築

/etc/openvpn/server/server.confにEasy-RSAの構成で構成したファイルをもとに設定ファイルを以下のように記述する。

なお設定は0から作成する必要はなく、/usr/share/doc/openvpn-/sample/sample-config-files/server.confに設定ファイルの散歩ウルがあるためそれを利用すると良い。

port 1194
proto udp
dev tun
ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/myov-server.crt
key /etc/openvpn/server/myov-server.key
dh /etc/openvpn/server/dh.pem
server 10.8.0.0 255.255.255.0
push "redirect-gateway def1"
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"
duplicate-cn
cipher AES-256-CBC
tls-version-min 1.2
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-128-CBC-SHA256
auth SHA512
auth-nocache
keepalive 20 60
persist-key
persist-tun
compress lz4
daemon
user nobody
group nobody
log-append /var/log/openvpn.log
verb 3

OpenVPNサービスの有効化

以下コマンドを使用してサーバーを起動し、有効にする。

systemctl start openvpn-server@server

なおこのコマンドにより、正常にVPNサーバが起動すると新しいネットワーク インターフェイスtun0が作成される。

クライアント構成ファイルの生成

OpenVPNクライアント構成ファイルを生成するには以下.ovpnファイルを作成することで可能。ファイル内容は以下のように記述する。

サンプルファイルは/usr/share/doc/openvpn-/sample/sample-config-files/client.confに存在するためこのファイルの改造で可能となる。

client
dev tun
proto udp
remote vpn-server-ip 1194
ca ca.crt
cert client.crt
key client.key
cipher AES-256-CBC
auth SHA512
auth-nocache
tls-version-min 1.2
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-128-CBC-SHA256
resolv-retry infinite
compress lz4
nobind
persist-key
persist-tun
mute-replay-warnings
verb 3

ルーティングの構成

以下コマンドでOpenVPNサービスの通信がファイヤーウォールを通過できるようにできる。

firewall-cmd --permanent --add-service=openvpn
firewall-cmd --permanent --zone=trusted --add-service=openvpn
firewall-cmd --permanent --zone=trusted --add-interface=tun0
firewall-cmd --add-masquerade
firewall-cmd --permanent --add-masquerade

VPN からの受信トラフィックをローカル ネットワークに転送するようにルーティングを設定するには以下の通り。

routecnf=$(ip route get 8.8.8.8 | awk 'NR==1 {print $(NF-2)}')
firewall-cmd --permanent --direct --passthrough ipv4 -t nat -A POSTROUTING -s 10.8.0.0/24 -o $routecnf -j MASQUERADE

変更の有効化/再読み込みはfirewall-cmd --reloadで可能。

クライアントマシンにOpenVPNをインストールする

インストールする

dnf install epel-release -y
dnf install openvpn -y

サーバからクライアント構成をコピー

sudo scp -r root@vpn-server-ip:/etc/openvpn/client .

OpenVPNサーバに接続する。

cd client/
openvpn --config client.ovpn

OpenVPNコマンド

openVPNを操作するユーティリティ

openvpn <オプション>

9.4.2. IPSecサーバとクライアント操作

IPsec

IPsecは保護されたネットワークと保護されていないネットワークの間に境界を作成する。境界を通過するトラフィックは、IPSec 構成を担当するユーザーまたは管理者によって指定されたアクセス制御の対象になる。

IKE: RFC 7296 で定義されている IKE は、2 つのシステムまたはデバイスが信頼されていないネットワーク上で安全な通信チャネルを確立できるようにするプロトコル。 このプロトコルは、一連のキー交換を使用して、クライアントとサーバーの間に暗号化されたトラフィックを送信できる安全なトンネルを作成する

IPsecのポリシー

IPSecりよるサービスは2つのデータベースによって定義される。 1つが**SPD(Security Policy Database)SAD(Security Association Database)**のこと。このポリシは送信元から宛先に送信される各 IP パケットに適用される。

セキュリティアソシエーション

セキュリティアソシエーションは両方のノードが認証および暗号化メカニズムに関する情報を交換するための概念で、送信者と受信者の間で伝送されるトラフィックにセキュリティ サービスを提供する。

IPsec

IPsecのアーキテクチャではセキュリティアソシエーションを識別するパラメータは3つある。

  1. SPI(Security Parameter Index)、受信側システムが受信パケットを選択するためのIPSecプロトコルヘッダを伝えるビット文字列
  2. IP宛先アドレス、IPSecのエンドポイントアドレス
  3. セキュリティプロトコル識別子

SAD(Security Association Database)

SPD(Security Policy Database)

IPSecプロトコル

IPSecではAH(プロトコル認証ヘッダ)、ESP(カプセル化セキュリティペイロード)の2つのプロトコルを使用してトラフィックセキュリティサービスを提供する。

  • プロトコル認証ヘッダ (AH) * IP ヘッダーとデータ ペイロードがハッシュされるために使用 * ハッシュから新しい AH ヘッダーが構築され、パケットに追加される * 認証機能と未改竄の保証
  • セキュリティペイロードのカプセル化 (ESP) * データ パケットの暗号化と整合性を提供するセキュリティ プロトコル * 標準 IP ヘッダーの後に追加される * AHの機能+暗号化

IPSec暗号化の技術

IPSecのセキュリティアソシエーションではトンネルモードトランスポートモードの2つのモードの操作を設定できる。

  • トンネルモード * ペイロードとヘッダーの両方が暗号化される * ゲートウェイ間、またはエンド ステーションからゲートウェイへの使用が一般的 * パケットの送信元がセキュリティを提供するデバイスと異なる場合は、トンネル モードが使用
  • トランスポートモード * 各パケットのデータ部分のみが暗号化される * エンド ステーション間、またはエンド ステーションとゲートウェイの間に適用できる

IPsec画像

IPSecのトラフィック処理

Racoon

RacoonはIPsec IKE プロトコルのキー交換デーモンのこと。 設定ファイルは/etc/racoon/racoon.confとなる。

setkey

setkeyはIPsecにおける二つのデータベース(SAD、SPD)を操作するためのユーティリティ

ipsec-tools

ipsec-toolsはIPsec接続を確立するために必要なユーティリティ。 なお現在はRedHat系OSではIPsec-toolsは使用されておらず、LibreSwanといったツールでVPNが構成されている。

設定ファイルは/etc/ipsec-tools.confとなる。

9.4.3. StrongSwan

StrongSwan はIPsec ベースのOSSのVPN。 StrongSwan は元々 Linux 用に設計されたが、その後 Android、FreeBSD、Mac OS X、Windows およびその他のプラットフォームに移植された。特徴は以下の通り。

  1. 構成がシンプル
  2. 強力な暗号化と認証方法の提供
  3. 大規模で複雑なVPNネットワークをサポートする
  4. 拡張性に優れたモジュラー設計

StrongSwanのインストール

dnf install -y epel-release
dnf install -y strongswan.x86_64

strongsan.conf

strongswanの設定ファイル。

# strongswan.conf - strongSwan configuration file
#
# Refer to the strongswan.conf(5) manpage for details
#
# Configuration changes should be made in the included files

charon {
        load_modular = yes
        plugins {
                include strongswan.d/charon/*.conf
        }
}

include strongswan.d/*.conf 

swanctl

swanctlはインターフェイス プラグインを介して StrongSwan IKE デーモン ( charon )を設定、制御、監視するためのコマンドライン。

swanctl <オプション>

swanctl.conf

9.4.4. WireGuard

WireGuardは非常にシンプルで高速な最新の VPN 。 OpenVPN よりも大幅にパフォーマンスが向上している。

Wireguardのインストール

sudo dnf install elrepo-release epel-release -y
sudo dnf install kmod-wireguard wireguard-tools -y

Wireguard サーバの構成

適切な権限を持つ Wireguard 設定用の空の構成ファイルをサーバー上に作成する。

mkdir /etc/wireguard

ディレクトリを作成した後、wgおよび``tee`コマンドライン ツールを使用して公開キーと秘密キーを作成する。

wg genkey | sudo tee /etc/wireguard/privatekey | wg pubkey | sudo tee /etc/wireguard/publickey

次に、VPN トラフィックをルーティングするためにトンネル デバイスを設定する必要があり、/etc/wireguard以下にwg0.conf等を作成する必要がある。

[Interface]

## IP Address of VPN server ##
Address = 192.168.108.101/24

## Save the configuration when a new client will add ##
SaveConfig = true

## port number of VPN server ##
ListenPort = 51820

## Private Key of VPN Server ##
PrivateKey = SERVER_PRIVATE_KEY

## Command to be executed before starting the interface ##
PostUp     = firewall-cmd --zone=public --add-port 51820/udp && firewall-cmd --zone=public --add-masquerade

## Command to be executed before turning off the interface ##
PostDown   = firewall-cmd --remove-port 51820/udp --zone=public && firewall-cmd --remove-masquerade --zone=public

インターフェイスはsudo wg-quick up wg0コマンドで起動する。 またsudo systemctl enable wg-quick@wg0で有効化できる。

wgコマンド

wgはWireGuard トンネル インターフェイスの構成を取得および設定するための構成ユーティリティ。 インターフェイス自体は を使用して追加および削除でき、その IP アドレスとルーティング テーブルはと をip-link(8)使用して設定できる。

wg <サブコマンド>
サブコマンド説明
show現在の構成とデバイス情報を表示する
showconf指定された WireGuard インターフェイスの現在の設定を表示する
set現在の構成の変更、ピアの追加、ピアの削除、またはピアの変更

IPv4転送の有効化

NATのIPv4転送の有効化には/etc/sysctl.d99-custom.confを作成する。

## for enabling IPv4 forwarding ##
net.ipv4.ip_forward = 1

## for enabling IPv6 forwarding ##
#net.ipv6.conf.all.forwarding = 1
sysctl -p /etc/sysctl.d/99-custom.conf

Wireguard クライアントの構成

手順はサーバの時と同じで、設定ファイルのみが少し異なる。

[Interface]
## Private Key of VPN Client ##
PrivateKey = qCi5ugILVhTOOmCzchqFzkNaHM3HP1qFUWgtYun2A3w=

## IP address of VPN Client ##
Address = 192.168.108.102/24

[Peer]
## Public Key of Rocky 8 VPN Server ##
PublicKey = m58H6KTuRt+4z6g+jMIeRCdAkQoikkiVvTd7pJvrPGE=

## set ACL ##
AllowedIPs = 0.0.0.0/0

## IP address and Port of CentOS 8 VPN Server ##
Endpoint = 192.168.108.101:51820

なお起動後に、WireGuardサーバにVPN クライアント マシンの IP アドレスと公開キーを登録する必要がある。

[Peer]
## Public Key of VPN Client ##
PublicKey = 73gw+v4V0TKsw2uGLHJ9EI26qfMEwvk+JZ+xED2ttAs=

## IP Address of VPN Client ##
AllowedIPs = 192.168.108.102/32

wg-quickコマンド

wg-quickはWireGuardインターフェイスを起動するコマンド。

wg-quick up wg0

3.10 - 10.脅威と脆弱性の評価

【LPIC303範囲】Linuxとはあまり関係ないがOSやアプリケーションを取り巻く脅威に関して説明。

10.1. 一般的なセキュリティ脆弱性と脅威

10.1.1. マルウェア

ウィルス

コンピュータウイルスは、実行されると他のコンピュータプログラムを変更し、独自のコードを挿入することによって自分自身を複製するコンピュータプログラムの一種のこと。

コンピュータウイルスには通常、ホスト プログラムが必要です。ウイルスは独自のコードをホスト プログラムに書き込みます。プログラムを実行すると、先に書かれたウイルスプログラムが実行され、感染や被害を引き起こす。

マルウェア

マルウェアは悪意のあるソフトウェアのことで、コンピュータに損害を与えるように意図的に設計されたソフトウェアを指す。

マルウェアは、個人情報の漏洩、情報やシステムへの不正アクセスの原因となり、ユーザーの情報へのアクセスを奪ったり、ユーザーのコンピュータのセキュリティやプライバシーを知らず知らずのうちに妨害したりする。

10.1.2. その他のマルウェア

ワーム

コンピュータワームは、複数のデバイス上で活動を続けながら複数のデバイスに拡散するように設計された、潜行性のタイプのマルウェアのこと。

ワームの定義としては、ワームをユーザーの介入なしで実行および増殖できる自己完結型のマルウェアといえる。

ルートキット

ルートキットはコンピュータまたは他のソフトウェアへの不正アクセスを許可するように設計された悪意のあるソフトウェアバンドルのこと。 ルートキットは検出が難しく、感染したシステム内でその存在を隠すことができる。

ルートキットが定着すると、システムはゾンビ コンピュータであるかのように動作し、ハッカーはリモートアクセスを使用してデバイスを完全に制御できるようになる。

トロイの木馬

トロイの木馬は正当で安全であるように見えるファイル、プログラム、またはコードの一部に偽装された悪意のあるソフトウェアのこと。

通常、トロイの木馬はパッケージ化されて正規のソフトウェア内に配信され、多くの場合、被害者を監視したりデータを盗んだりするように設計されている。

キーロガ

キーロガはコンピュータ上で行われるすべてのキーストロークを記録する悪意のあるソフトウェアのこと。 キーロガーはスパイウェアの一種で、被害者を監視するように設計されたマルウェア。キーロガーは入力されたものをすべてキャプチャできるため、最も侵入的な形式のマルウェアの 1 つといえる。

キーロガーには主にソフトウェアとハ​​ードウェアの2つのタイプがある。

10.1.3. その他の脅威や攻撃

ソーシャルエンジニアリング

ソーシャルエンジニアリングは、心理学的手法を使用して行動を操作すること。ソーシャルエンジニアリングは、人的ミスを悪用し、被害者に自分の利益に反する行動を促すことによって行われる。

情報セキュリティにおけるソーシャル エンジニアリングの定義は、ログインの詳細や財務情報などの個人データをオンラインで漏洩させることを指す。

ソーシャルエンジニアリングの攻撃の1つにはフィッシングがある。

フィッシング

フィッシングはソーシャルエンジニアリング攻撃の一種で、通信が信頼できる送信元からのものであるかのように偽装されたメッセージから引き起こされる、個人情報や財務情報の漏洩を狙ったもの。

フィッシング攻撃は以下の3つの要素から構成される。

  1. 攻撃は電子メールや電話などの電子通信を介して行われる
  2. 攻撃者は、信頼できる個人または組織を装う
  3. 攻撃者の目的は、ログイン資格情報やクレジット カード番号などの機密の個人情報を取得すること

ブルートフォースアタック

ブルートフォース攻撃とは、ハッカーがコンピュータを利用した集中的な試行錯誤を通じてパスワードを解読しようとすること

ブルートフォースアタックではできるだけ多くのパスワードの組み合わせを試し、いずれかが機能することを狙う。

ブルートフォースアタックの種類には以下の種類がある。

  1. 単純攻撃
  2. 辞書攻撃
  3. ハイブリッド攻撃
  4. リバース攻撃
  5. クレデンシャルスタッフィング

レインボー攻撃

レインボー攻撃は特別なテーブル (「レインボー テーブル」) を使用してデータベース内のパスワード ハッシュを解読するパスワード クラッキング手法のこと。

レインボー テーブル自体は、認証プロセス中に使用される各プレーン テキスト文字のパスワード ハッシュ値を含む事前計算されたテーブルを指す。 ハッカーがパスワード ハッシュのリストにアクセスすると、レインボーテーブルを使用してすべてのパスワードを非常に迅速に解読する。

バッファオーバフロー攻撃

バッファオーバフローはデータ量がメモリ バッファの記憶容量を超えると発生し、原理としてはバッファにデータを書き込もうとするプログラムは、隣接するメモリ位置を上書きしてしまうことに起因する。

バッファオーバフロー攻撃ではアプリケーションのメモリを上書きすることプログラムの実行パスが変更され、ファイルが破損したり個人情報が漏洩したりする反応を狙う

攻撃者がプログラムのメモリ レイアウトを知っている場合、バッファに保存できない入力を意図的にフィードし、実行可能コードを保持する領域を上書きして、独自のコードに置き換えることができる。

なお、CやC++はメモリ内のデータの上書きやアクセスに対する保護機能が組み込まれていないため、バッファオーバフロー攻撃の影響を最も受けやすい言語といえる。

クロスサイトスクリプティング(XSS)

XSSはハッカーが正規の Web サイトに悪意のあるコードを挿入したときに発生する攻撃のこと。

XSS攻撃は、コードインジェクション攻撃の1種である。

クロスサイトリクエストフォージェリ(CSRF)

CSRFはエンド ユーザーが現在認証されている Web アプリケーション上で望ましくないアクションの実行を強制する攻撃のこと。

IPスプーフィング攻撃は

IPスプーフィングは偽の送信元アドレスを使用し、ハッカーはネットワーク上で信頼できるデバイスのように見せかけ、デバイスが自由に提供する機密情報を要求する可能性がある攻撃。

なお、IP アドレス スプーフィング攻撃は検出が難しい。 また中間者攻撃の種類にはDDos攻撃MITM攻撃がある。

DDoS攻撃

DDoS攻撃(分散型サービス拒否)はインターネット トラフィックを大量に送信して Web サイトやサーバーをクラッシュさせることを目的とした攻撃のこと。

DDoSでは複数のコンピュータを使用してサーバーに TCP および UDP パケットを大量に送信する。

MITM攻撃

MITM攻撃(中間者攻撃)は 2 つのデバイス間の通信を傍受し、IP パケットを静かに変更し 2 台のコンピュータ間の通信を傍受する攻撃のこと。

権限昇格

権限の昇格とは、ユーザーが資格のない権限を受け取ることを指す。 これらの権限は、ファイルの削除、個人情報の表示、ウイルスなどの不要なプログラムのインストールに使用される可能性がある。

権限昇格は以下の2種類の形式で行われる。

  • 垂直権限昇格 … 権限昇格とも呼ばれ、権限の低いユーザーまたはアプリケーションが、権限の高いユーザーまたはアプリケーション用に予約されている機能またはコンテンツにアクセスする
  • 水平的権限昇格 … 通常のユーザーが他の通常のユーザー向けに予約されている機能またはコンテンツにアクセスするもの

SQLインジェクション

SQLインジェクションは、ハッカーが独自のコードを Web サイトに挿入してセキュリティ対策を破り、保護されたデータにアクセスする秘密のタイプの攻撃

10.2. ペネトレーションテスト

10.2.1. 侵入テスト

侵入テスト(ペネトレーションテスト)はコンピュータ システムのセキュリティを評価するためにコンピュータ システムに対して実行される、許可された模擬攻撃のこと。

ペネトレーションテストでは、攻撃者と同じツール、テクニック、プロセスを使用して、システムの弱点がビジネスに与える影響を見つけて実証する。

侵入テストの種類

侵入テストには以下の3つの種類がある。

  • ブラックボックスペネトレーションテスト * テスターに​​会社名のみなど、最小限の情報が提供されるテスト
  • グレーボックスペネトレーションテスト * ターゲットとなる特定のホストやネットワークなど、もう少し詳しい情報がテスターに​​提供されるテスト
  • ホワイトボックスペネトレーションテスト * あらゆる種類の内部文書や構成計画などの情報が提供されているテスト

侵入テストのプロセス

侵入テストは通常以下のプロセスで実施される。

  1. 偵察
  2. スキャニング
  3. アクセス権の取得
  4. アクセス維持の確保
  5. 痕跡の消去

定番の侵入テストツール

侵入テストツールには以下のようなものがある。

  • Nmap … 開いているポートとサービスをスキャンできる
  • Metasploit … 脆弱性悪用ツール
  • WireShark … ネットワークからパケット データをキャプチャし、読み取り可能な形式にデコードできるネットワーク分析ツール
  • BurpSuite … Web アプリケーション セキュリティ テスト ツール