これは、このセクションの複数ページの印刷可能なビューです。 印刷するには、ここをクリックしてください.
Linux(UNIX系OS)基礎
- 1: 1.Linux/シェル基礎
- 1.1: 1.Linuxの基礎知識
- 1.2: 2.システムアーキテクチャ
- 1.3: 3.Linuxのインストールとパッケージ管理
- 1.4: 4.UNIX/Linuxコマンド
- 1.5: 5.Linuxのテキストエディタの使い方
- 1.6: 6.ファイルとプロセスの管理
- 1.7: 7.パーティションとファイルシステム
- 1.8: 8.シェルとシェルスクリプト
- 1.9: 9.LinuxGUIとデスクトップ
- 1.10: 10.アカウント管理と管理タスク
- 1.11: 11.システムサービスの管理
- 1.12: 12.ネットワークの設定
- 1.13: 13.Linuxのセキュリティ
- 2: 2.Linuxサーバの構築/運用基礎
- 2.1: 1.キャパシティプランニング
- 2.2: 2.Linuxカーネル
- 2.3: 3.システムの起動と管理
- 2.4: 4.デバイスとファイルシステム
- 2.5: 5.高度なストレージ管理
- 2.6: 6.ネットワーク管理
- 2.7: 7.システムのメンテナンス
- 2.8: 8.DNS
- 2.9: 9.Webサーバとプロキシサーバ
- 2.10: 10.ファイル共有
- 2.11: 11.ネットワーククライアントの管理
- 2.12: 12.メールサービス
- 2.13: 13.システムセキュリティ
- 3: 3.Linuxサーバの高度な運用管理
- 3.1: 1.Sambaの基礎
- 3.2: 2.SambaとActiveDirectory
- 3.3: 3.Samba共有の設定
- 3.4: 4.Sambaクライアントの設定
- 3.5: 5.Linuxアイデンティティ管理/ファイル共有
- 3.6: 6.Linuxの暗号化
- 3.7: 7.ホストのセキュリティ
- 3.8: 8.アクセス制御
- 3.9: 9.ネットワークセキュリティ
- 3.10: 10.脅威と脆弱性の評価
1 - 1.Linux/シェル基礎
1.1 - 1.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) |
CentOS | RHELをベースにした無料のOSSディストリビューション。 | RPM (yum/dnf) |
AlmaLinux | CentOS 8の終了に伴い代替として注目されているディストリビューション | RPM (yum/dnf) |
Fedora | 新機能の実験場としての役割を持つ、コミュニティ駆動型のディストリビューション。 | RPM (dnf) |
Debian | OSS志向で安定性を重視するディストリビューション。 | APT (apt) |
Ubuntu | 初心者にも使いやすいデスクトップディストリビューション。 | APT (apt) |
Linux Mint | Ubuntuベースで、使いやすさと美しいデスクトップ環境に特化。 | APT (apt) |
openSUSE | ユーザーと開発者の共同作業を重視し、堅牢なシステムを提供。 | Zypper |
Arch Linux | ユーザーカスタマイズと最新ソフトウェアに重点を置くローリングリリース。 | Pacman |
Manjaro | Arch 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 行ずつ記述して作成する。 作成したシェルスクリプトを実行することで、コマンドの実行を自動化することができる。
また作成したシェルスクリプトをサーバーの起動時に実行したり、数時間毎に実行したりすることも可能。
シェルの種類
以下にいくつかの一般的なシェルとそれらの特徴を表で示す。
シェル名 | 特徴と説明 |
---|---|
Bash | Bourne Again SHellの略。Linuxシステムで広く使用されるデフォルトのシェル。豊富なコマンドとスクリプト機能を提供。 |
Zsh | オープンソースの拡張可能なシェル。Bashの拡張版で、カスタマイズ性が高く、タブ補完などの便利な機能を備えている。 |
Fish | ユーザーフレンドリーな対話型シェル。自動補完やシンタックスハイライトなど、新しいユーザーにも親しみやすい特徴がある。 |
Csh | Cシェルの略。Unixの初期から存在するシェルで、C言語に似た構文を持つ。カスタマイズ性は低いが、一部のユーザーには好まれる。 |
Ksh | Korn SHellの略。Bourne Shellの拡張版で、シェルスクリプトの開発をサポートする高度な機能を提供。 |
Dash | Debian Almquist SHellの略。軽量なシェルで、起動が速く、システムの基本的なタスクを処理するのに適している。 |
1.2 - 2.システムアーキテクチャ
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/cpuinfo | CPUの情報を格納したファイル |
/proc/interrupts | IPQなどの情報を格納したファイル |
/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.0 | 12Mbps |
USB 1.1 | 12Mbps |
USB 2.0 | 480Mbps |
USB 3.0 | 5Gbps |
USB 3.1 | 10Gbps |
USB 4.0 | 40Gbps |
デバイスドライバ
ハードウェアの利用にはデバイスドライバが必要となる。 ドライバはベンダーが用意した専用ドライバとLinuxシステムが提供するクラスドライバに分けられる。
USBデバイスを使用するにはデバイスドライバが必要。これはUSBデバイスがデバイスクラスに応じて異なる方法で通信するために使用される。また、クラスドライバはデバイスクラスに準拠する。
デバイスクラス | サポートするUSBデバイスの例 |
---|---|
HID: Human Interface Devices | kbd, mouse |
USB Mass Storage Device | USBメモリ、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アーキテクチャ構成の場合)
- BIOS/UEFIが起動し、ハードウェアチェックや初期化を行い、ブートローダを読み出し制御を移す
- カーネルはメモリの初期化、システムクロックの設定を行い、初期RAMディスクをマウントする
- カーネルは最初のプロセスである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による起動順序は以下の通り。
- initが/etc/inittabファイルを読み込む
- initが/etc/rc.sysinitnスクリプトを読み込む
- initが/etc/rcスクリプトを実行する
- /etc/rcスクリプトが /etc/rc<ランレベル>.dディレクトリ以下のスクリプトを実行する
SysVinitはサービスを順次起動に時間がかかる、依存関係を適切に処理できない問題があった。これらの問題を解決した起動の仕組みにはupstartやsystemdがある。
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は処理を分割して並列化することでシステム起動処理を高速化している。具体的には以下のような複数のデーモンプロセスが連携して動作する
プロセス | 説明 |
---|---|
systemd | systemdを統括するメインプロセス |
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を置き換えると以下のようになる。
ランレベル | ターゲット |
---|---|
0 | poweroff.target |
1 | rescue.target |
2 ~ 4 | multi-user.target |
5 | graphical.target (multi-user.target + ) |
6 | reboot.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-dependencies | Unitの依存関係の表示 |
2.4.4. journalctlコマンド
journalctlコマンドはsystemd-journaldが収集したログを表示するためのコマンド。パイプやgrepコマンドと組み合わせて使用することが多い。
journalctl
1.3 - 3.Linuxのインストールとパッケージ管理
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 Legacy | GRUB2 |
---|---|---|
Version | 0.9x | 1.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, apt | rpm, 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-upgrade | Debianのシステムを最新にアップグレードする |
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, –checksig | RPMパッケージの電子署名の検証 |
使用例は以下の通り。
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コマンド
4.1. シェル
4.1.1. シェルとシェルの種類
シェルとは
シェルはコマンドを解釈して実行するプログラムのこと。
利用可能なシェルは/etc/shells
で確認可能。
シェルの種類
シェル | 説明 |
---|---|
sh | UNIX V7から標準添付されているUNIXの基本的なシェル |
csh | C言語スタイルの構文を持ったUNIX系OSの代表的なシェル |
tcsh | Cシェルの派生版の中で特にユーザーインターフェイス部分を中心に拡張されたシェル |
ksh | Bシェルと上位互換を保ちながら、Cシェルなどから優れた機能を取り込んだシェル |
bash | UNIX系のシェルの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 | コマンド履歴を格納するファイル |
HISTFILESIZE | HISTFILEに保存する履歴数 |
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 | ディレクトリ自身の表示 |
-i | inode番号表示 |
-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 | 文字の名前 |
c | ASCII文字かバックスラッシュつきのエスケープ文字 |
d | 符号付きの10進数 |
f | 浮動小数点数 |
o | 8 進数 |
u | 符号なしの10進数 |
x | 16 進数 |
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 |
コマンド1 | tee ファイル |
teeコマンド
teeコマンドは標準入力から読み込んでファイルに書き込み、次のコマンドへ実行結果を引き渡せられるもの。 使用例は以下の通り。
オプション-a
でファイルに追記する。
ls -l | tea data.txt
4.3.3. リダイレクト
リダイレクトを使用することでコマンドの実行結果を画面上ではなくファイルに保存することが可能。
リダイレクト | 説明 |
---|---|
> | 出力のリダイレクト |
» | 出力をファイルに追記 |
< | 入力のリダイレクト |
« | 入力終端文字の指定 |
2> | エラー出力をファイルに設定し、コマンドを実行 |
2>&1 | 標準出力とエラー出力をファイルに設定し、コマンドを実行 |
4.3.4. ヒアドキュメント
ヒアドキュメントは<<EOF
で始まる特定の文字列(この例ではEOF)が現れるまで標準入力から入力を受け付けるもの。
1.5 - 5.Linuxのテキストエディタの使い方
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-F | 1 画面先のページを表示 |
Ctrl-D | 半画面先にスクロール |
Ctrl-B | 1 画面前のページを表示 |
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 + X | nanoの終了 |
Ctrl + K | Shift + ←→ で文字列の指定し文字列をカットする |
Ctrl + U | 文字列のペースト |
Ctrl + \ | 文字列の置換 |
alt + U | 前回の操作を取り消す |
Ctrl + W | 文字列検索 |
Ctrl + R | Ctrl + Tでカレントディレクトリ起点にファイル内容挿入 |
5.3. Vimの使用方法
1.6 - 6.ファイルとプロセスの管理
6.1. 基本的なファイルの管理
6.1.1. ファイルの圧縮と解凍
ファイルの圧縮解凍
ファイルの圧縮解凍を行うコマンドはいくつかあり、gzip, bzip2, xzなどがある。
gzip | bzip2 | xz | |
---|---|---|---|
圧縮コマンド | gzip | bzip2 | xz |
圧縮率 | 低い | 中 | 高い |
時間 | 短い | 中 | 長い |
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 ファイル名 | アーカイブファイル名の指定 |
-z | gzip による圧縮 ・ 展開 |
-j | bzip2 による圧縮 ・ 展開 |
-J | 7zip による圧縮 ・ 展開 |
-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で作成されるファイルやディレクトリにはアクセス権(パーミッション)が設定される。 これでユーザごとにファイルへのアクセスの許可または禁止を設定できる。
アクセス権 | 表記 | 説明 |
---|---|---|
読み取り | r | read。ファイルの読み取りが可能 ( 内容表示など ) |
書き込み | w | write。ファイルへの書き込みが可能 ( 編集や上書きコピーなど ) |
実行 | x | execute。ファイルの実行が可能 ( プログラムやシェルスクリプトの実行 ) |
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 | 実行権限 |
s | SUID または 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 | シグナル名 | 動作 |
---|---|---|
1 | HUP | ハングアップ |
2 | INT | 割り込み(Ctrl + C) |
9 | KILL | 強制終了 |
15 | TERM | 終了(デフォルト) |
18 | CONT | 停止しているプロセスを再開 |
19 | STOP | 一時停止 |
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で割って計算する | |
-l | LowメモリとHighメモリの状況も表示する ※※ |
-t | 物理メモリとスワップメモリの合計を示す行も表示する |
-s 間隔 | 再出力の間隔を「ss.tt秒」で指定する(デフォルトは1回出力して終了する) |
-c 回数 | 再出力する回数を指定する(デフォルトは1回出力して終了する) |
uptimeコマンド
システムの稼働時間、システムの平均負荷状況はuptimeコマンドにより確認できるコマンド。
uptime
以下情報が確認可能。
- システム稼働時間
- 現在ログイン中のユーザ数
- システムの平均負荷状況
unameコマンド
システムやカーネルの情報を表示するコマンド。
uname <オプション>
オプション | 説明 |
---|---|
-a, –all | 全ての情報を表示 |
-n | ネットワークノードとしてのホスト名を表示 |
-r | カーネルのリリース番号を表示 |
-s | カーネル名を表示(標準) |
-v | カーネルのバージョンを表示 |
-m | マシンのハードウェア名を表示 |
-p | プロセッサの種類を表示 |
-i | ハードウェアプラットフォームを表示 |
-o | OS名を表示 |
watchコマンド
コマンドをn秒ごと(デフォルトでは2秒間隔ごと)に繰り返し実行させるコマンド。
watch <コマンド>
短いオプション | 意味 |
---|---|
-t | ヘッダを表示しない |
-e | エラー時(実行したコマンドエラーコード0以外で終了したとき)はwatchコマンドも終了する |
-b | エラー時にはビープ音を鳴らす |
-d | 直前の実行結果から変化した箇所をハイライト表示する。「permanent」または「cumulative」オプションを付けると初回実行時から変化した箇所を表示する(「-d=permanent」のように指定) |
-c | ANSIによるスタイル指定を行う |
-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. ターミナルマルチプレクサ
ターミナルマルチプレクサは一つの端末画面の中に複数の仮想端末を作成/切り替えができる仕組み。 デタッチ/アタッチ機能、つまり各ウィンドウの作業状況を保ったまま終了/再開が可能。
有名なターミナルマルチプレクサとしてはtmux、screenがある。
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.パーティションとファイルシステム
7.1. ハードディスクとその関連規格
7.1.1. Linuxにおけるハードディスクの利用方法
Linuxでハードディスクを使用するには以下のステップを行う必要がある。
- 電源OFFの状態で、ハードディスクをシステムに物理的に接続
- 追加したハードディスクのデバイスファイルが作成されていることを確認
- ハードディスクにパーティションを切る(
fdisk
コマンド) - 各パーティションにおいてext3ファイルシステムを作成(
mke2fs
コマンド) - ファイルシステムのマウント(
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/sda | 1番目のSCSI/SATA/USBに接続したHDD |
/dev/sdb | 2番目のSCSI/SATA/USBに接続したHDD |
/dev/sdc | 3番目のSCSI/SATA/USBに接続したHDD |
/dev/sdd | 4番目のSCSI/SATA/USBに接続したHDD |
/dev/sr0 | 1番目のCD/DVDドライブ |
/dev/st0 | 1番目のテープドライブ |
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はパーティション形式。
MBR | GPT | |
---|---|---|
ハードディスク制限 | 2GB | - |
基本パーティション | 4個 | 128 |
MBR
MBR(Master Boot Record)は1983年にIBM PC DOS 2.0に初発表された古いディスクタイプのこと。 BIOSをサポートする。
MBRセクターとパーティションで構成される。 特徴は以下の通り。
- 基本パーティションと拡張パーティションといった2種類のみを作成可能
- 最大4つのパーティションが作成可能
- MBRディスクの最大容量の制限が2TB
GPT
GPT(GUIDパーティションテーブル)はMBRより新しい規格。 UEFIをサポートする。
保護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などが選択できる。 それ以上のファイルシステムは別コマンドを利用する必要がある |
パーティション情報を表示する | |
quit | partedを終了する |
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 | 標準 |
ext3 | ext2機能+ジャーナリング機能 |
ext4 | ext3+拡張機能 |
UNIX系OSから移植されたファイルシステム
ファイルシステム | 説明 |
---|---|
XFS | SGI社が開発。ジャーナリング機能あり |
JFS | IBM社が開発。ジャーナリング機能あり |
その他のファイルシステム
ファイルシステム | 説明 |
---|---|
Brtfs | 高機能なファイルシステム |
iso9660 | CD-ROMのファイルシステム |
msdos | MS-DOSのファイルシステム |
vfat | SDカードや古いwindowsのファイルシステム |
exFAT | FAT後継規格でフラッシュメモリ向けのファイルシステム |
7.5.3. ファイルシステムのマウント
マウントはあるパーティションとあるディレクトリを関連づける作業のこと。 パーティションにファイルシステムを作成した後、マウントを行う必要がある。
恒常的なマウント設定
恒常的なマウントを行うためには以下の手順でマウントを行う必要がある。
/etc/fstab
ファイルの編集mount
コマンドの実行、または再起動(init 6)の実行
/etc/fstabの書き方
/etc/fstab
ファイルは以下のように記述される。
/dev/sda5 /home ext4 defaults 1 2
左から順に以下意味となる。
- マウントするデバイスファイル名
- マウントポイント
- ファイルシステムの種類(ext2,xfsなど)
- マウントオプション(async, auto, defaults, exex, noexecなど)
- dumpコマンドによるアップデート対象かどうかの指定(0:バックアップ必要なし、1:バックアップ必要あり)
mountコマンド
ファイルシステムのマウントを行うコマンド。
mount /dev/sda6 /home3
unmountコマンド
現在マウントされているファイルシステムをアンマウントするコマンド。
unmount /dev/sda6 /home3
7.5.3. ファイルシステムの確認コマンド
dfコマンド
ファイルシステムの空き容量やinodeの使用状況が確認できるコマンド。 ファイルシステムの空き容量の表示ができる。
df <オプション> <デバイス名/ディレクトリ>
オプション | 説明 |
---|---|
-i | inodeの使用状況を表示 |
-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 ファイルシステムタイプ | ファイルシステムの種類を指定する |
-j | ext3ファイルシステムを作成する |
-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を付けると「週」 |
-j | ext2をext3ファイルシステムに変換 |
-L ラベル名 | ファイルシステムのボリュームラベルを設定 |
1.8 - 8.シェルとシェルスクリプト
8.1. シェル環境のカスタマイズ
8.1.1. 環境変数とシェル変数
Linuxの変数には環境変数とシェル変数がある。 特徴は以下の通り。
変数 | 説明 | 代表的な |
---|---|---|
環境変数 | シェル自身とそのシェルから起動されるすべてのプロセスに引き継がれる | PATH, HOMEなど |
シェル変数 | そのシェル内のみで有効な変数 | - |
詳しくはコチラ。
8.1.2. 環境変数/シェル変数を表示するコマンド
env/printenvコマンド
環境変数を表示するコマンド。
printenv
は環境変数名を指定可能。
env
printenv HOME
setコマンド
環境変数とシェル変数を表示するコマンド。
set <オプション>
オプション | 説明 |
---|---|
-o | 一覧表示 |
-a | 自動的にエクスポート |
–help | ヘルプ |
-o / +o | オプション有効/無効化 |
ignoreeof | Ctrl + 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.bashrc | bash起動時に実行される |
/etc/bashrc | ~/.bashrcから参照 |
~/.bash_profile | ログイン時に実行 |
~/.bash_login | ~/.bash_profileがない場合、ログイン時に実行 |
~/.profile | |
~/.bashrc | bash起動時に実行 |
~/.bash_logout | ログアウト時に実行 |
/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 | シェルスクリプトファイル名 |
$1 | 1番目の引数。※ 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とデスクトップ
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 | フォント関連のパスの設定 |
Module | Xサーバがロード予定のダイナミックモジュールの設定 |
InputDevice | Xサーバに対する入力デバイス(キーボード等)の設定 |
Monitor | システムにより使用されるモニタタイプの設定 |
Device | システム用のビデオカードの設定 |
Screen | ディスプレイの色深度と画面サイズの設定 |
Xクライアントコマンド
X Window Systemの設定確認、情報収集のためのコマンドは以下の通り。
コマンド | 説明 |
---|---|
showrgb | X 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などがある。
GNOME | KDE Plasma | |
---|---|---|
テキストエディタ | gedit | KEdit |
端末 | GNOME端末 | Konsole |
ファイルマネージャ | Nautilus | Dolphin |
GUIツールキット | GTK+ | Qt |
ディスプレイマネージャ | GDM | SDDM |
ウィンドウマネージャ | Mutter | KWin |
標準採用 | RedHat, CentOS, Fedora, Ubuntu | openSUSE, Slackware, Kubuntu |
9.2.4. リモートデスクトップ
リモートデスクトップは別のマシン上からリモートで別のマシンのデスクトップを操作できるもの。 Linux向けに制御する機能にはVNC、RDP、SPICE、XDMCPなどがある。
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.アカウント管理と管理タスク
10.1. ユーザとグループの管理
10.1.1. ユーザアカウント
Linuxは複数のユーザが同時にログインし利用できるシステムとなっている。
またユーザアカウント情報は/etc/passwd
ファイルに保存される。
/etc/passwdファイル
/etc/passwd
ファイルは以下のような構成となり、一般ユーザでも読み取り可能。
<ユーザ名>:<暗号化されたパスワード>:<UID>:<GID>:<GECOS(コメント)>:<ホームディレクトリ>:<デフォルトシェル>
デフォルトシェルはログインを想定しない場合/bin/false
や/sbin/nologin
となる。
/bin/false | /sbin/noloin | |
---|---|---|
Telnet接続 | x | x |
SSH接続 | x | x |
FTP接続 | x | o |
SFTP接続 | x | x |
シェルの実行 | x | x |
/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 UID | UIDの指定 |
-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
オプション | 説明 |
---|---|
-d | atrmのエイリアス |
-r | atrmのエイリアス |
-l | atqのエイリアス |
-f ファイルパス | STDINではなくファイルからジョブ指定 |
atrm
コマンドは予約中のジョブをジョブ番号で指定して削除できるコマンド。
atq
コマンドは予約中のジョブを表示するコマンド
crontabコマンド
cronを設定するコマンド。
crontab <オプション>
オプション | 説明 |
---|---|
-e | viエディタなどを使用して、crontabファイルを編集 |
-l | crontabファイルの内容を表示 |
-r | crontabファイルの削除 |
-i | crontabファイル削除時の確認 |
-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) | システムクロックの時刻をハードウェアクロックに反映 |
-u | UTC (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など) |
cron | cron |
daemon | 各種デーモン |
kern | カーネル |
lpr | 印刷システム |
メールサービス | |
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-pager | 1ページごとに表示せず、すべてのログを出力する |
11.2.4. ログの調査
主要なログファイルは/var/log/messages
に保存されるが、ディストリビューションにより差異がある。
ログの種類
システム状態に応じて出力される各種ログは以下表のようなログファイルに出力される。
ログファイル名 | 内容 |
---|---|
/var/log/messages | 一般的なシステム関連のメッセージ |
/var/log/secure | セキュリティに関するメッセージ |
/var/log/cron | 定期的に実行される処理結果に関するメッセージ |
/var/log/maillog | メールに関するメッセージ |
/var/log/spooler | 印刷に関するメッセージ |
/var/log/boot.log | OS起動時に関するメッセ |
ログの確認方法
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においてメールの配送はMTA、MDA,MUAにより構成/実現される。
MTA
MTA(Mail Transfer Agent)は電子メールを配信/転送するプログラム、つまりメールサーバソフトウェアを表す。 MTAにはsendmail、qmail、postfix、eximなどがある。
MTA | 処理速度 | セキュリティ | 説明 |
---|---|---|---|
sendmail | × | × | かつてMTAの標準ソフトウェアと広く普及した。 |
qmail | ○ | ◎ | セキュリティ面に優れており、非常に堅牢なつくり。パフォーマンスもsendmailより優れている。 |
postfix | ◎ | ○ | パフォーマンスが最も優れたMTA。設定が簡単でセキュリティ面も高い。sendmailとの互換性がある。 |
exim | △ | ○ | Debian系の標準のMTA。 |
MDA(Mail Delivery Agent)
メールボックスにメールを送るプログラム。
MUA(Mail User Agent)
MUAはメールクライアント(メーラ)を表しメール作成、閲覧が可能なもの。
11.3.2. メールの配送フロー
- メールクライアントソフトウェア(MUA)でメール作成
- 送信元側のメールサーバ上のMTA(1)へ送る
- 宛先側のメールサーバ上のMTA(2)へ転送(相手ドメインのDNSサーバに尋ねる)
- MTA(2)がメールを受け取ると、MDAがメールをメールボックスに格納する
- 受取人は自分のメールボックスからメールを取り出す(POP,IMAPを使用)
11.3.3. MTAの起動とメールの確認
MTAプログラムの確認
LinuxシステムでどのMTAプログラムがインストールされているのかは、以下プログラムで確認可能。
netstat -atnp | grep 25
メールの送信、受信メールの確認
mail
コマンドで確認可能。
mail # 受信メールの確認
mail -s <題名> <宛先ユーザー名 | 宛先メールアドレス> # メールの送信「.」で入力終了
メールの転送とエイリアス
メールを転送する場合以下の2つの方法がある.
/etc/aliases
ファイルに設定する方法- 各ユーザーのホームディレクトリに存在する
~.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ファイルを格納される)
- AdobeのPPD形式のファイルでデバイスドライバの設定ができる(
- Web画面での設定
- Webブラウザから設定可能(ポート631)
- プリンタクラスのサポート
- 複数のローカルプリンタを1つのクラスにグループ化
CUPSの情報は/etc/cups
ディレクトリに格納され、CUPSの設定ファイルは/etc/cups/cupsd.conf
に保存される。
CUPSの設定方法は以下の2つある。
- 設定ファイルを直接編集する方法
- WebブラウザでCUPSの設定ページにアクセスして編集する方法
印刷の流れ
- 印刷データ受け取る
- スプーラが印刷データを受け付け、スケジューリングを行う
- プリンタが直接受け付けられないデータを中間形式に変換
- PPDに定義されたフィルタにより、最終の印刷データに変換する
- 処理した印刷データをCUPSのバックエンドに送る
- CUPSバックエンドは印刷データをプリンタに渡す
11.4.2. 印刷関連のコマンド
lprコマンド
ファイルや標準入力を印刷するコマンド。
lpr <オプション> ファイル名
オプション | 説明 |
---|---|
-# 部数 | 印刷部数を指定 |
-P プリンタ名 | 指定したプリンタに出力 |
lpqコマンド
プリンタキューに登録されている印刷ジョブを確認するコマンド。
lpq <オプション> <ユーザー名> <ジョブ番号>
オプション | 説明 |
---|---|
-a | 全てのプリンタの情報を表示 |
-P プリンタ名 | 指定したプリンタの情報を表示 |
lprmコマンド
プリンタキューにある印刷ジョブを削除するコマンド。
lprm <オプション> <ジョブ番号>
オプション | 説明 |
---|---|
- | 自分の印刷ジョブを全て削除 |
-P プリンタ名 | 指定したプリンタの印刷ジョブを削除 |
1.12 - 12.ネットワークの設定
12.1. ポート番号
Linuxにおいてポート番号とサービスとの対応は/etc/services
に記述される。
番号 | トランスポート層 | 上位サービス・プロトコル | 説明 |
---|---|---|---|
20 | TCP | FTP | FTPのデータ転送 |
21 | TCP/UDP | FTP | FTPの制御情報 |
22 | TCP | SSH | SSH |
23 | TCP | Telnet | Telnet接続 |
25 | TCP/UDP | SMTP | 電子メール |
53 | TCP/UDP | DNS | DNS |
80 | TCP | HTTP | Web |
110 | TCP | POP3 | 電子メール(受信) |
123 | UDP | NTP | NTPサービス |
139 | TCP/UDP | NetBIOS | Microsoftネットワーク |
143 | TCP | IMAP | 電子メール(IMAP2/IMAP4) |
161 | UDP | SNMP | ネットワークの監視 |
162 | TCP/UDP | SNMP Trap | ネットワークの監視(警告通知等) |
389 | TCP/UDP | LDAP | ディレクトリサービス |
443 | TCP/UDP | HTTP over SSL/TLS | SSL/TLSによるHTTP接続 |
465 | TCP | SMTP over SSL/TLS | SSL/TLSによるSMTP接続 |
514 | UDP | Syslog | ロギングサービス |
636 | TCP/UDP | LDAP over SSL/TLS | SSL/TLSによるディレクトリサービス |
993 | TCP/UDP | IMAP over SSL/TLS | SSL/TLSによるIMAP接続 |
995 | TCP/UDP | POP3 over SSL/TLS | SSL/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 | データリンク層 |
addr | IPアドレス |
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 | ルーティングテーブルを表示 |
-t | TCPポートのみを表示 |
-u | UDPポートのみを表示 |
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/hostname | Linuxのホスト名の設定が行われる(RedHat系, Debian系) |
/etc/hosts | ホスト名とIPアドレスの対応表 |
/etc/resolv.conf | DNSサーバやドメイン名の設定。直接触らずコマンドで設定する |
/etc/nsswitch.conf | 名前解決の問い合わせ順の設定 |
12.3.2. DNS管理コマンド
hostコマンド
DNSサーバを使ってホストやドメインに関する情報を表示するコマンド。
host localhost
digコマンド
DNSサーバに対して問い合わせを行い、その応答結果を表示するコマンド。
dig <オプション> <ドメイン名 or ホスト名> <検索タイプ>
オプション | 説明 |
---|---|
-x | IPアドレスからホスト名を検索 |
検索タイプ | 説明 |
---|---|
a | IPアドレス |
any | 全ての情報 |
mx | メールサーバの情報 |
ns | ネームサーバの情報 |
whoisコマンド
調べたいドメイン名を指定しwhoisデータベースに問い合わせるコマンド。
whois < ドメイン名 >
1.13 - 13.Linuxのセキュリティ
13.1. Linuxサーバのセキュリティの基本
Linuxをサーバとして運用する場合はセキュリティの観点から主に以下の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サーバなどの接続頻度の高くないサーバに向いている。
スーパサーバの種類
スーパサーバにはinetd、xinetdがあり、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 <オプション> <接続先ホスト>
オプション | 説明 |
---|---|
-1 | SSHプロトコルバージョン 1 を使用 |
-2 | SSHプロトコルバージョン 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サーバとクライアントはユーザー認証を行わずホストの認証のみを行う。
認証手順は以下の通り。
- サーバの公開鍵をクライアントに送る
- クライアント側で保存されているサーバの公開鍵(場所は
~/.ssh/known_hosts
)と一致確認
またホストベース認証の鍵のファイルパスは以下に配置される。
暗号化方式 | 鍵 | 鍵のファイルパス |
---|---|---|
RSA | 秘密鍵 | /etc/ssh_host_rsa_key |
RSA | 公開鍵 | /etc/ssh_host_rsa_key.pub |
13.5.4. 公開鍵認証
公開鍵認証はユーザ認証の方式の1つ。 認証フローは以下の通り。
- クライアント側で鍵ペア作る(
ssh-keygen
) - クライアントの公開鍵をホストに渡す
- クライアントの鍵が使用できるか確認する
- クライアントの秘密鍵で署名を作る
- サーバに送る
- サーバ側の、クライアント公開鍵で署名を検証する
13.5.5. SSH Agent
SSH Agentは秘密鍵ファイルを使用する際にパスワード認証なしにログインすることができる仕組み。 秘密鍵をメモリ上に保存しておいて必要時に利用するようにすることで実現している。
利用は以下のように行う。
- ssh-agentの子プロセスとしてbashシェルの起動(
ssh-agent bash
) ssh-add
コマンドを使用して秘密鍵を登録
13.5.6. OpenSSH
OpenSSHは高いセキュリティでリモートホスト間通信できる仕組み。 SSH v1系、v2系両対応しており、ファイル転送、リモート操作が可能。
認証機能と暗号化が含まれる。
OpenSSHのインストール
インストールする際のパッケージは以下表の通り。
また設定ファイルは/etc/sshd_config
となる。
client | server | |
---|---|---|
Ubuntu, Debian | openssh-client | openssh-server |
Ret Hat系 | openssh, openssh-client | openssh-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サーバの構築/運用基礎
2.1 - 1.キャパシティプランニング
1.1. キャパシティプランニング
1.1.1.キャパシティプラニングとは
キャパシティプランニングはシステムのリソースが将来的にも不足しないようにするための設計することをいう。 具体的には以下パラメータに注目/監視を行いリソースを見積もることで実現する。
- CPU
- メモリ
- ディスク
- ネットワーク帯域
キャパシティプランニングではシステムが最大どれだけのリソースを必要とするか測定を行うことで必要なリソースを見積もる。 また、システムパフォーマンスのボトルネックになるものには以下のようなものがある。
- ディスクI/O
- スワップの利用率
- ネットワークI/O
1.1.2. パフォーマンスチューニング
パフォーマンスチューニングは効率よくシステム上のリソースを使えるようにさまざまな設定を調整すること。
1.2. リソース使用率とトラブルシューティング
リソース使用率の測定では現時点における各種リソースの利用状況を計測を行う。 これはキャパシティプランニングやパフォーマンスチューニングのために実施する。
1.2.1. 総合的なリソース使用率の測定
各コマンドで確認できる項目は以下の通り。
- CPU
- システム全体CPU使用率の表示
top(htop), vmstat, iostat, mpstat ALL
- プロセスごとのCPU使用率表示
top(htop) ps aux
- CPUの平均負荷の表示
top(htop), uptime, w
- システム全体CPU使用率の表示
- 物理メモリ
- システム全体物理メモリ使用率の表示
top(htop), free, vmstat, sar -r
- プロセスごとの物理メモリ使用率の表示
top(htop), ps aux
- システム全体物理メモリ使用率の表示
- スワップ領域
- スワップ領域の使用状況の表示
top(htop), free, vmstat, sar -S, swapon -s
- スワップイン/アウトの表示
vmstat
- スワップ領域の使用状況の表示
- ディスクI/O
iostat, iotop, vmstat, sar -b
- ネットワークI/O
iptraf, netstat -i/-s, sar -n DEV|EDEV
- プロセスのPID
pstree -p, ps aux, top, lsof
topコマンド
システムリソースの使用状況やプロセスの実行状況などを継続的に表示することができるコマンド。
top [オプション]
オプション | 説明 |
---|---|
-b | 対話モードではなくバッチモードで実行する |
-d 秒 | 表示をする間隔を指定する |
-n 回 | 指定した回数だけ更新すると終了する |
-u ユーザ | 指定したUIDのプロセスのみ監視する |
-p PID | 指定するPIDのプロセスのみ実行する |
実行した結果は以下の通り。
htopコマンド
全体およびプロセスごとのCPUやメモリの使用状況を一定時間ごとに更新して表示するコマンド。
htop
vmstatコマンド
物理メモリやスワップ領域の詳細な情報やプロセスやCPUの統計情報などを継続的に表示するコマンド。 スワップやブロックのI/Oの値を出力可能。
vmstat [表示間隔(秒) [回数]]
iostatコマンド
CPUの利用状況およびディスクI/Oの状況などを継続的に表示するコマンド。
iostat [オプション] [表示間隔(秒) [回数]]
オプション | 説明 |
---|---|
-c | CPU使用率のみを出力する |
-d | ディスクI/O情報のみを出力する |
-k | ブロック単位ではなくKB単位で表示する |
-t | 時間を表示する |
iotopコマンド
ディスクI/Oの情報がプロセスごとに表示するコマンド。
iotop
sarコマンド
システムのアクティビティ情報を定期的に収集し報告するためのコマンド。
sysstat
パッケージに含まれる。sysstatdが有効になると/var/log/saX
(Xは数字)でログが格納される。
定期的な実行を比較的簡易に導入できる/usr/lib/sa/sa1
(sadcの定期的な実行),/usr/lib/sa/sa2
(sarの定期的な実行)というスクリプトが用意されている。
具体的には以下のシステムのパフォーマンスを詳細に確認するために用いられる。
- CPUの使用率
- メモリ使用量
- I/O活動
- ネットワーク使用
sar [オプション] [ 時間間隔(回数) ]
オプション | 説明 | 使用例 |
---|---|---|
-A | 全てのオプションを表示 | sar -A |
-u | CPU使用率を表示 | sar -u 1 3 |
-P | 指定したCPUの使用率表示 | sart -P 1 |
-r | 物理メモリ使用状況を表示 | sar -r 1 3 |
-b | ディスクI/O操作に関する情報を表示 | sar -b 1 3 |
-S | スワップ領域の使用状況を表示 | sar -S 1 3 |
-n DEV | ネットワークI/Oの統計を表示 | sar -n DEV 1 3 |
-n EDEV | ネットワークI/Oのエラー統計を表示 | sar -n EDEV 1 3 |
-d | ディスクI/O統計を表示 | sar -d 1 3 |
-q | システムの負荷平均値を表示 | sar -q 1 3 |
-W | スワップ領域の情報を表示する | sar -W 1 3 |
-f | データを取り出すログファイル指定 | sar -f logging.log |
-o [file] | バイナリ形式で[file]に出力 | sar -o outputfile 1 3 |
sadfコマンド
sadc
コマンドによるログをTSVやXML形式に出力するコマンド。
sadf [オプション] -- [ sarコマンドのオプション ]
オプション | 説明 |
---|---|
-j | JSON形式で出力 |
-x | XML形式で出力 |
-t | ロケール日時で表示 |
– | sarコマンドに渡す |
uptimeコマンド
システムの稼働時間や負荷平均などを表示するコマンド。
top
の上部とほぼ同じ。
uptime
表示されるload average
は1, 5, 15分での平均で表示される。
wコマンド
現在ログインしているユーザとそのプロセス情報を表示するコマンド。 システムの稼働時間や負荷平均も表示できる。
w [オプション] [ユーザ名]
オプション | 説明 |
---|---|
-h | ヘッダを非表示 |
-s | ログイン時刻、JCPU、PCPUを表示しない |
1.2.2. CPU使用率の測定
psコマンド
稼働中のプロセスおよび、プロセス毎のCPUやメモリの使用量を表示するコマンド。
ps [オプション]
ps aux # すべてのプロセス表示
オプション | 意味 |
---|---|
a | 端末を持つ全てのプロセスを表示する |
e | コマンド名の後に環境変数などを表示する |
x | 端末を持たない全てのプロセスを表示する |
u | 実行ユーザ名も表示する |
r | 実行中のプロセスだけを表示する |
l | 長いフォーマットで表示する |
-C コマンドリスト | 実行ファイル名を指定して表示する |
-u ユーザーリスト | ユーザーを指定して表示する |
-e | すべてのプロセスを表示 |
-f | 引数を含めた完全フォーマットで表示 |
-l | ロング形式で表示 |
-p PID | PIDで選択 |
-t tty | 端末名で選択 |
-u UID | ユーザIDで選択 |
pstreeコマンド
動作中のプロセスの親子関係をツリー状で表示するコマンド。
pstree
lsofコマンド
ファイルを開いているプロセスを表示するコマンド。
lsof
iostatコマンド
CPUの利用状況およびディスクI/Oの状況などを表示するコマンド。
iostat
mpstatコマンド
マルチプロセッサシステムのCPUの使用状況を表示するコマンド。
mpstat
1.2.3. メモリ/スワップ領域使用量の測定
freeコマンド
メモリやスワップ領域の使用状況を表示するコマンド。
free [オプション]
swaponコマンド
スワップ領域を有効/確認するコマンド。
-s
オプションでスワップ領域の利用状況を確認できる。
swapon
1.2.4. ディスク使用量の測定
dfコマンド
ディスクの使用量、使用割合を計測できるコマンド。
df [オプション]
オプション | 意味 |
---|---|
-a | すべてのファイルシステムの情報を表示 |
-h | 1MB=1024MBで表示 |
-H | 1MB=1000KBで表示 |
-i | iノードの使用状況を表示 |
-l | ローカルファイルシステムの表示 |
-m | MB単位で表示 |
-T | ファイルシステムタイプの表示 |
iotopコマンド
ディスクI/Oの情報がプロセスごとに確認できるコマンド。
iotop
1.2.4. ネットワークトラフィック量の測定
netstatコマンド
ネットワークの状態に関する情報を表示するコマンド。
netstat
オプション | 説明 |
---|---|
-i | ネットワークインターフェースの状態を表示 |
-s | プロトコル毎にパケットの送受信に関する情報を表示 |
ssコマンド
netstatの後継のコマンド。
-s
コマンドで接続状態統計を確認可能。
ss -s
netserver/netperfコマンド
netserver
コマンドはサーバ側で接続待ちするコマンド。
ポートはデフォルトで12865番が使用される。
netperf
コマンドでサーバに接続し通信速度を計測する
iptrafコマンド
ネットワークのトラフィックをモニターした情報が表示できるコマンド
iptraf
1.3. リソース需要の分析と予測
1.3.1. リソース監視系ツール
リソースの監視は各種コマンドでも実行できるが、OSSのツールを用いることで効率的に監視が可能となる。 監視ツールにおいてリソースの状態の測定(監視)する場合はSNMPで行われる。
Collectd
サーバ状態を監視するデーモンプログラム。 システムにかかる負荷が少ない特徴がある。
データの監視と記録を行うには/etc/collectd.conf
で設定を行う。
Catciなどと合わせて使用することが多い。
なおデータの監視・記録にはプラグインを追加する必要があり、設定ファイルの/etc/collectd.conf
でLoadPluginで指定する。
Nagios
サーバの動作確認(死活監視)、ネットワークサービス状態/リソース使用状況の監視が行えるOSSソフトウェア
MRTG
ネットワークやリソースの使用状況を監視しグラフ化するツール。 死活監視は行えない。
Catcti
ネットワークやリソースの使用状況を監視しグラフ化するツール。 WEBブラウザ上で設定を行うことができる。 MRTGより設定が容易という特徴がある。
Icinga2
Nagios互換の監視ツール。 WebAPIを使って監視情報のやりとりを行うといったNagiosにない機能を追加されている。 そのためオブジェクト管理を主体とした監視環境を提供する。
2.2 - 2.Linuxカーネル
2.1. カーネルの構成要素
2.1.1. カーネルバージョン
カーネルにはバージョン番号が付けられており、「3.X.Y」の形のようにあらわされる。
- 2.6より前の場合
- Xの部分が偶数で安定版、奇数で開発版を示す
- Yの部分が開発版の修正版を表す場合がある
- 2.6以降の場合
- 正式版かどうかの判断に番号の偶奇は関係ない
- -の後に続く記号によって判断する
なおカーネルバージョンを知るにはuname -r
コマンド、もしくは/proc/version
の確認で可能となる。
またusr/src/kernel/hogehoge
のmakefileを確認することでも可能。
Linuxカーネルのカテゴリ
リリースされるLinuxカーネルは主に以下の4つのカテゴリに分類される。
- prepatch(プレパッチ) … リリース候補
- mainline(メインライン)… prepatchの後にリリースされる正式版
- stable(ステーブル)… mainlineの後にリリースされる安定版
- longterm(ロングターム) … stableから選ばれ新しいカーネルに行われたものと同様のバグフィックスが行われるリリース
Linuxカーネルのアーカイブの内容
Linuxカーネルはtar.gz
形式、またはtar.xz
形式でアーカイブして配布され以下内容が含まれる。
- カーネルソース
- カーネルモジュールのソース
- ドキュメント
- Makefile
2.1.2. カーネルイメージ
カーネルイメージはイメージファイルとして格納されたLinuxカーネルのこと。
カーネルイメージは/boot/vmlinuz*
という名称で保存されている。
カーネルイメージの形式
カーネルイメージにはzImageとbzImageがある。
なおこれらはgzip
で圧縮されている。
- zImage
- 512KB以下のイメージのみ扱える
- ローメモリを使用
- bzImage
- ハイメモリを使用
2.2. カーネルモジュールの管理
2.2.1. カーネルモジュール
Linuxカーネルはローダブルモジュールのサポートを有効化するとカーネル機能の一部をモジュール化して、必要なときのみ読み込むことができる。 この機能でカーネル起動時間の短縮、多様なハードウェアへの対応が可能。
具体的には頻繁に利用するデバイスのドライバはLinuxカーネルに組み込み、利用頻度の低いドライバはモジュール化するのが良い。
なおカーネルモジュールの拡張子は.ko
となる。
2.2.2. カーネルモジュールの操作コマンド
lsmodコマンド
現在ロードされているすべてのモジュールを一覧表示するコマンド。 モジュール名とそのサイズ、参照回数、モジュールの参照しているモジュール名などが表示される。
なお/proc/modules
からも参照が可能。
lsmod
modinfoコマンド
モジュール情報を表示するコマンド。
modinfo [オプション] [モジュール名]
オプション | 意味 |
---|---|
-a | モジュール作者情報の表示 |
-d | モジュール説明の表示 |
-l | モジュールライセンス表示 |
-n | モジュールファイル名表示 |
insmodコマンド
ローダブルモジュールをロードするコマンド。 読み込む再依存関係がある場合、依存元のモジュールからロードする必要がある。
insmod [オプション] [モジュールパス]
オプション | 意味 |
---|---|
-s | 結果を標準出力ではなくsyslogに出力する |
-v | 詳細情報の表示 |
rmmodコマンド
ロードされているモジュールをアンロードするコマンド。 使用中、依存関係のあるモジュールはアンロードできない。
rmmod [オプション] [モジュール名]
オプション | 意味 |
---|---|
-a | 未使用のモジュールをすべてアンロードする |
-s | 動作結果を標準出力ではなくsyslogに出力する |
modprobeコマンド
モジュールのロード/アンロードを行うコマンド。 このコマンドでは依存関係を調べ、インストールする必要のあるモジュールも自動ロードする特徴がある。
modprobe [オプション] [モジュール名]
オプション | 意味 |
---|---|
-a | すべてのモジュールのロード |
-c | 現在使われている設定の表示 |
-r | モジュールのアンロード |
-C ファイル名 | 設定ファイルの指定 |
-show-depends | モジュールの依存関係を表示 |
なおmodprobeが参照するモジュールの依存関係はmodules.dep
に記載。
このファイルは/lib/modules/カーネルバージョン
以下にある。
記載方法は以下の通り。
モジュール名: 依存しているモジュール 依存しているモジュール
またモジュールのロード/アンロードの際に何かしら処理を行う場合は/etc/modprobe.conf
で設定を行う。
depmodコマンド
modules.depを作成するコマンド。 カーネルモジュールの依存関係情報を更新する。
modprobeがにより参照される。
2.3. カーネルのコンパイル
カーネルは必要な場合はソースコードからコンパイルが可能。 これはカーネルの再構築と呼ばれる。 カーネルの再構築するケースは以下の通り。
- 必要なデバイスドライバがカーネルに含まれていない
- 使用しているハードウェアに最適したカーネルを利用したい
- カーネルの最新機能を使いたい
2.3.1. カーネルコンパイルとインストール
カーネルのコンパイル手順は以下の通り。
- カーネルソースを用意する
- カーネルコンフィギュレーションの設定
- カーネルをコンパイル
- カーネルモジュールをコンパイル
- カーネルとカーネルモジュールを配置
- ブートローダの設定
カーネルソースの準備
カーネルソースコードは/usr/src/linux*
に保存される。
カーネルソースコードのディレクトリには以下ディレクトリがある。
ディレクトリ名 | 説明 |
---|---|
arch | アーキテクチャ(i368, x86_64)に依存したコード |
configs | それぞれの.config |
crypto | 暗号処理関数 |
drivers | デバイスドライバ関連 |
fs | 仮想ファイルシステム/システムファイル関連 |
include | C言語のincludeファイル |
init | 初期化用コード |
ipc | SystemV互換プロセス間通信関連ファイル |
kernel | 各種カーネル機能 |
lib | 各種モジュール関連 |
mm | メモリ管理関連 |
net | 各種ネットワークプロトコル関連 |
scripts | カーネル作成支援コマンド |
Documentations | 各種ドキュメント |
ファイル | 説明 |
---|---|
.config | カーネルのビルド設定ファイル |
Makefile | makeの設定やカーネルバージョンの記載 |
なおxzファイルで圧縮されたカーネルソースの展開例は以下の通り。
xz -dc ファイル名.xz | tar xvf -
カーネルコンフィギュレーションの設定
カーネルの設定ファイルは.config
に記載される。
カーネルの設定を新しい設定に反映させる場合は以下コマンドを実施する。
make oldconfig
このコマンドでは新しいカーネルで付け加えられた機能のみに対して問い合わせを行い、既存設定はそのままとなる。
カーネルの設定
カーネルの設定ではカーネルの機能を直接カーネルに埋め込むか、埋め込まずにローダブルモジュールにするか、組み込まないか設定が可能。
make config # カーネルオプションごとに答える形で設定
make menuconfig # メニュー形式で表示されているオプション項目を選択して設定
make oldconfig # 現在のカーネルの設定を引き継ぐ
make xconfig # KDE上で設定
make gconfig # GNOME上で設定
なおmake config
やmake menuconfig
で行った設定は/usr/src/linux/.config
に保存される。
カーネルとカーネルモジュールのコンパイル
make
コマンドを引数なしで実行するとカーネル、カーネルモジュール共にコンパイルされる。
make
カーネルとカーネルモジュールのインストール
カーネルモジュール(.ko
)を適切なディレクトリに保存するにはmake modules_install
コマンドを実行する。
なお保存先は/lib/modules/カーネル
以下に保存される。
またカーネルのインストールはmake install
コマンドで行える。
このコマンドは以下処理を行う。
- /boot以下にビルドされたカーネルをバージョンをファイル名にしてコピー
- 初期RAMディスクが必要な場合は作成
- ブートローダの設定ファイルに新しいカーネル用の起動設定を追加
makeコマンド
make
コマンドはソースコマンドをコンパイル、ビルドなどを行うコマンド。
make [ターゲット] 対象
ターゲット | 説明 |
---|---|
clean | .config以外のファイルを削除する |
all | すべてのビルドを実施 |
modules | カーネルモジュールをすべてビルドする |
modules_install | カーネルモジュールをインストール |
rpm | カーネルをビルド後にRPMパッケージを作成 |
rpm-pkg | ソースRPMパッケージの作成 |
defconfig | デフォルト状態の設定ファイルを作る |
mrproper | カーネルツリーの初期化(設定ファイルもクリア可能) |
なおカーネルのビルドと再構築はソールから以下のような手順で行う。
- 設定の初期化(
make mrproper
) - 設定を行う(
make oldconfig
) - ビルドを行う(
make all
) - モジュールをインストール(
make modules_install
) - カーネル本体をインストール(
make install
)
DKMS(Dynamic Kernel Module Support)
カーネルのソースツリー外にあるカーネルモジュールを自動的に生成する仕組み。
DKMSはカーネルアップデートの際に、カーネルとは独立して自動的にカーネルモジュールをコンパイルしインストールする。 現在、多くのディストリビューションがDKMSをパッケージに含んでいる。
2.4. カーネルのパラメータ変更
2.4.1. カーネルパラメータの設定
カーネルパラメータは以下目的で使用される。
- 機能の有効化/無効化
- システムパフォーマンスチューニング
- システム情報の参照
設定はproc/sys/kernel
以下のファイルで設定可能。
2.4.2. カーネルパラメータに関するコマンド
sysctlコマンド
カーネルパラメータを設定/表示できるコマンド。
なお再起動後もカーネルパラメータを永続変更したい場合は/etc/sysctl.conf
への設定記述で可能。
sysctl [オプション] [パラメータ]
オプション | 意味 |
---|---|
-a | 現在利用できるすべてのパラメータを表示する |
-p | 指定したファイルから設定を読み込む(DFで/etc/sysctl.conf) |
-w | パラメータを更新する |
2.4.3. 初期RAMディスク
RAMディスクはメモリ上にファイルシステムを作成する機能のことで、ループバックマウントはファイルをファイルシステムとしてマウントできる機能をいう。 この仕組みを利用してファイルとして用意されたファイルシステムをRAMディスクとしてメモリ上に展開し、そのうえで暫定的にカーネルを起動しその後に本来利用するルートファイルシステムをマウントする起動方法は初期RAMディスクと呼ばれる。
初期RAMディスクのイメージファイルの形式には以下2種類がある。
- initrd
- 素のファイルシステムを圧縮したもの
gunzip
、mount -o loop
でイメージの確認が可能
- initramfs
- cpioアーカイブをgzip圧縮したもの
gunzip
、cpio
でイメージの確認が可能
initramfsはinitrdと比べてファイルシステムをドライバが不要、メモリ効率が優れているという特徴がある。
近年ではinitramfsが利用されている。またCentOSなどではDracutユーティリティ(dracut
)を初期RAMディスク作成で使用する場合がある。
初期RAMディスクの作成はmkinitrd
コマンド、mkinitrams
コマンドが利用される。
mkinitrdコマンド
初期RAMディスクの作成コマンド。
mkinitrd RAMディスクイメージ カーネルバージョン
mkinitramsコマンド
初期RAMディスクの作成コマンド。 cpio アーカイブを利用した形式の場合はこちらを使う。
mkinitrams -o RAMディスクイメージ カーネルバージョン
dracutコマンド
初期RAMディスクの作成コマンド。
dracut 出力ファイル名 カーネルバージョン
2.5. カーネル管理と課題解決
2.5.1. /procの確認
/proc
はカーネル内のデータへのインターフェイスとなるファイルシステムのこと。
lsdevコマンド
デバイスごとのDMA(/proc/dma
),IRQ(/proc/interrupts
),I/Oアドレス(/proc/ioports
)を表示するコマンド。
lsdev
lspciコマンド
すべてのPCIバスと接続されているPCIデバイスに関する情報を表示するコマンド。
lspci [オプション]
オプション | 意味 |
---|---|
-v | 詳細に情報表示 |
-vv | さらに詳細に情報表示 |
-t | ツリー上に表示 |
-b | カーネルではなくPCIバス認識に沿って表示 |
lsusbコマンド
接続されているUSBデバイスに関する情報の表示をするコマンド。
lsusb [オプション]
オプション | 意味 |
---|---|
-v | 詳細に情報表示 |
-t | ツリー上に表示 |
2.5.2. デバイスファイル
デバイスファイルはデバイスを抽象化したファイルで/dev
以下に存在する。
デバイスファイルにはブロックデバイスとキャラクタデバイスの2種類がある。
それぞれファイルタイプはbとcとなる。
- ブロックデバイス
- バッファを持ちランダムアクセスが可能
- ブロック単位でアクセス可能
- ハードディスク、フロッピーディスク、RAMディスク、RAIDボリュームなど
- キャラクタデバイス
- ランダムアクセスが不可能なデバイス
- キーボード、マウス、プリンタなど
なおカーネルが認識しているデバイスは/proc/devices
ファイルで確認可能。
2.5.3. udev
udevはデバイスファイルを管理するための仕組み。 実際にはudevとsysfsが連携して管理するようになっている。 udevの仕組みは以下の通り。
- ハードウェアの接続をカーネルが検知
- udevデーモンが必要なデバイスファイルを作成する
このため認識している分のデバイスファイルしか作成されないということになる。
またデバイスファイル作成の際に参照される設定ファイルは/etc/udev/rules.d
となる。
/etc/udev/rules.dの書式
この設定ファイルの書式は以下の通り。
認識キー==値, 代入キー==値
またsysfsがどのデバイスを扱うかはudevadm info
コマンドで確認可能
udevadm infoコマンド
sysfsがデバイスをどのように扱っている確認できるコマンド。
udevadm info [オプション]
オプション | 意味 |
---|---|
-a | 指定したデバイスの上位デバイスについても表示する |
-p デバイス | sysfsより上のデバイスを指定 |
-n デバイス | /dev以下のデバイスファイルを指定 |
-q 種類 | 表示する情報の種類を指定(name, symlink, path, env, all) |
udevadm monitorコマンド
デバイスの検知をモニタリングするコマンド。 カーネルのイベントを監視して、udevのルールやイベントの表示を行える。
udevmonitor
コマンドでも可能。
udevadm monitor
2.3 - 3.システムの起動と管理
3.1. システムの起動のプロセスとカスタマイズ
3.1.1. ブートからカーネル起動まで
電源起動からシステム化起動するまで以下のようなフローとなる。
BIOS/UEFI => ブートローダ => カーネル
BIOS/UEFI
BIOS/UEFIはマザーボードに焼き付けられた基本的な制御プログラムで、基本的な入出力管理を行う。 重要な動作としては起動デバイスのマスターブートレコードに格納されたブートローダを実行することがある。
- BIOSのブートプロセス … BIOS → MBRのブートローダ → カーネル → init
- UEFIのブートプロセス … UEFI → ESP(のブートローダ) → カーネル → init
UEFI
UEFIは以下の要素から構成される。
要素 | 説明 |
---|---|
EFI System Partition (ESP) | UEFIシステムにおける物理的なマシンを起動、ファームウエアが読み込まれた後の起動シーケンスで最初にアクセスされる領域。/boot/efi にマウントされFAT16またはFAT32でフォーマットされている必要がある |
UEFIブートマネージャ | 起動情報(OSをどこからどのようにロードするか)を管理するプログラム |
efibootmgr | UEFIブートマネージャーの起動エントリをOS上から操作するコマンド |
MBR/GPT
BIOSでは起動デバイスの最初のセクタであるMBR(マスターブートレコード)でパーティションを管理する。 UEFIではGPTでパーティションを管理する。
GPTでは起動ドライブに2TB以上割り当てることができる特徴があり、またブートローダはESPに格納される。 UEFIシステムパーティションではFATまたはVFATでフォーマットされる。
ブートローダ
ブートローダはマスターブートレコードに格納されて部分(第1部分)とそこから呼び出される部分(第2部分)に分かれている。 動作としては第1部分が第2部分のブートローダをロードしそれを起動する。また第2部分のブートローダは指定したパーティションからカーネルをロードし制御を移す。
Linuxで使用されるブートローダにはGRUB Legacy、GRUB2がある。
カーネル
カーネルはinit(/sbin/init)を起動するもので、その過程で以下処理を行う。
- 組み込まれたハードウェアの検出
- メモリの初期化
- システムクロックの設定
- IRQの設定
- ルートパーティションのマウント
またカーネル起動中のメッセージはdmesgコマンドで確認可能。
3.1.2. SysVinitの概要
サービスが起動する仕組みはこれまでSysVinitが主流であったが、現在ではSystemdという仕組みが主流となっている。
SysVinit
SysVinitではLinuxシステムで最初に実行されるinitが/etc/inittab
に従いシステムに必要なサービスを順次起動するものであった。
initのPIDは1番となりすべてのプロセスはinitの子プロセス/孫プロセスとなる。
起動のプロセスは以下の通り。
- initが
/etc/inittab
を読み込む - initが
/etc/rc.sysinit
を読み込む - initが
/etc/rc
を実行する /etc/rc
が/etc/rcN.d
(Nはランレベル)ディレクトリ以下のスクリプトを実行する
なお/etc/inittab
の書式は以下の通り。
1:1245:respawn:/sbin/mingetty tty2
- 1 … ID
- 1245 … ランレベル
- respawn … アクション指示子
- /sbin/migetty tty2 … 処理
アクション指示子は以下の通り。
アクション指示子 | 意味 |
---|---|
boot | システム起動時に実行され、プロセスの終了を待たずに次の処理を実行 |
bootwait | システム起動時に一度実行され、プロセスが終了するまで次の処理を行わない |
ctrlaltdel | Ctrl,Alt,Deleteキーが同時に押されるSIGINTがinitに送られた場合に実行する |
initdefault | デフォルトのランレベルを指定する |
once | 指定したランレベルになったときに一度だけ実行され、プロセスの終了を待たずに次の処理を行う |
respawn | プロセスが終了すれば再起動させる |
sysinit | システム起動時にbootやbootwaitより先に実行 |
wait | 指定したランレベルになった時に1度のみ実行し、プロセス終了まで次の処理はしない |
3.1.3. 起動スクリプトとランレベル
起動されるスクリプトはランレベルごとに異なる。
ランレベルごとに用意されているサービスは/etc/rc[0-6].d
で確認できる。
サービスの起動は以下の書式の通り。
/etc/init.d/[サービス名] [コマンド]
起動スクリプトの主なコマンドは以下の通り。
コマンド | 説明 |
---|---|
start | サービスの開始 |
stop | サービスの停止 |
restart | サービスの再起動 |
condrestart | サービスが起動している場合のみ再起動 |
status | 情報を表示する |
なお各ランレベルに応じたスクリプトは/etc/rc[0-6].d
に入っており、以下のようなファイル名となる。
S55sshd
K15httpd
Sは起動、Kは終了を意味する。 数字は実行順序、残りはサービス名を表す。
なおK→Sの順で実行される。
デフォルトのランレベル
SysVinitを採用したシステムでは以下の方法でデフォルトランレベルの指定ができる。
/etc/inittab
- ブートローダの設定ファイルでのカーネル起動時に渡すコマンドラインパラメータ
serviceコマンド
RedHat系OSやUbuntuでは/etc/init.d/
の代わりにservice
コマンドを使用できる場合がある。
具体的にはRed Hat(6.xまで)系ディストリビューションで使用できる。
service [サービス名] [コマンド]
LSB
LSB(Linux Standard Base)はLinuxの内部構造を標準化するプロジェクト。 LSBでは以下仕様が決められている。
- コマンド/標準ライブラリ
- ファイルシステム階層構造
- 印刷システム
- X Window System
確認は以下コマンドで可能。
lsb_release -a
3.1.4. サービスの自動起動
ランレベルごとにサービスをデフォルトで起動させるもしくはさせないようにするには以下のような手法がある。
- 手動でリンクを作成する
- chconfigコマンドでの設定
- update-rc.dコマンドでの設定
手動でリンクを作成
手動でリンクを作成するには/etc/rc[0-6].d
以下に、自動に起動させたいサービスのシンボリックリンクの作成することで設定ができる。
chkconfigコマンド
chkconfigコマンドはRed Hat系(6.xまで)ディストリビューションで使用できるコマンド。 サービスの自動起動を設定することができる。
chkconfig [オプション] [サービス名] [on | off]
オプション | 説明 |
---|---|
–list | サービスの自動起動設定をランレベルごとに表示する |
–level レベル | ランレベルを指定する |
–add | サービスの追加登録をする |
-del | サービスを削除する |
update-rc.dコマンド
update-rc.dコマンドはDebian系ディストリビューションで使用できるコマンド。 サービスの自動起動を設定することができる。
- 自動起動設定を追加・削除できる
- 優先順位を指定することができる
具体的にはランレベルごとにシンボリックリンクの作成/削除を行うことで実現する。
update-rc.d [オプション] [サービス名] remove
update-rc.d [オプション] [サービス名] [defaults] [NW | SNN kNN]
update-rc.d [オプション] [サービス名] start | stop NN ランレベル
オプション | 説明 |
---|---|
-n | 表示するだけ何もしない |
-f | /etc/init.dにスクリプトがあっても強制的にシンボリックリンクを削除する |
remove | 起動スクリプトのシンボリックリンクを削除する |
defaults | デフォルトのスクリプトを作成する |
start | 起動用のスクリプト(S)を作成する |
stop | 停止用のスクリプト(K)を作成する |
NN | 0~99の数字 |
intsservコマンド
intsservコマンドはSUSE系やVer6.0以降のDebian系のディストリビューションで使用できるコマンド。 サービスの自動起動を設定することができる。
insserv [オプション] [サービス名] # 自動起動設定
insserv -r [オプション] [サービス名] # 指定したサービスの自動起動を止める
3.1.5. systemdの概要
systemdの採用システムではinitプロセスの代わりにsystemdプロセスが起動しサービスを管理する。 systemdでは以下デーモンが連携して動作する。
プロセス | 説明 |
---|---|
systemd | メインプロセス |
systemd-journal | ジャーナル管理プロセス |
systemd-logind | ログイン処理プロセス |
systemd-udevd | デバイス動的検知プロセス |
systemdではシステムの処理は多数のUnitという処理単位で別れる。 Unitはいくつか種類があり、以下のような種類がある。
種類 | 説明 |
---|---|
service | 各種サービスの起動 |
device | 各種デバイスを表す |
mount | ファイルシステムをマウントする |
swap | スワップ領域を有効にする |
target | 複数のUnitをグループ化する |
systemdの特徴は起動順序関係やサービスの依存関係を処理できることがある。 そのためシステム起動速度もSysVinitより速くなる。
systemdの起動順序
systemdではシステムが起動するとdefault.targetというUnitが処理される。
これは/etc/systemd/system/
以下にある。
デフォルトのターゲットにシンボリックリンクを作成することで、デフォルトの起動方法を設定できる。
# グラフィカルログインの起動構成の例
ln -sf /lib/systemd/system/graphical.target /etc/systemd/system/default.target
ランレベル | ターゲット |
---|---|
0 | poweroff.target |
1 | rescue.target |
2,3,4 | multi-user.target |
5 | graphical.target |
6 | reboot.target |
systemdのディレクトリ
ディレクトリ | 説明 | 優先順位 |
---|---|---|
/usr/lib/systemd/system | 永続的なユニット・ターゲットの定義ファイルが置かれるディレクトリ | - |
/etc/systemd/system | カスタム用のディレクトリ | 優先度が高い |
/run/systemd/system | 再起動されると削除される | /usr/lib/systemd/system より高い |
systemctlコマンド
systemdでサービスを管理するコマンドがsystemctl
コマンドとなる。
systemctl [サブコマンド] [Unit名] [-t 種類]
サブコマンド | 説明 |
---|---|
start | サービスを起動する |
stop | サービスを終了する |
restart | サービスを再起動する |
reload | サービス設定の再読み込みをする |
status | サービス稼働状況の確認 |
is-active | サービスが稼働状態か確認する |
enable | システム起動時にサービスを自動起動する |
disable | システム起動時にサービスを自動起動しない |
list-units | 起動しているUnitを表示する |
list-unit-files | すべてのUnitを表示する |
list-dependencies | 指定したサービスが必要とするUnitを表示する |
get-default | デフォルトターゲットを確認 |
set-default | デフォルトターゲットを設定する |
isolate | 他のUnitを停止して対象のUnitを起動 |
systemd-deltaコマンド
systemd-deltaコマンドはデフォルトの定義ファイルを上書きしている場合などにどのファイルがどのように影響を受けているか確認できるコマンド。 同じファイル名のユニット、ターゲットの定義ファイルが複数あり、上図のディレクトリの優先度に基づいてファイルを上書きした場合などに使用する。
systemd-delta
Unit設定ファイル
Unit設定ファイルは/etc/systemd/system
ディレクトリ以下に配置される。
Unit設定ファイルはUnit、Service、Installのセクションに分かれる。
ファイルの構成は以下例のようになる。
[Unit]
Descriptions=HogeHoge
After=syslog.target network.target
Conflicts=sendmail.service exim.service
[Service]
Type=forking
:
[Install]
WantedBy=multi-user.target
主なUnit設定ファイルのパラメータは以下の通り。
パラメータ | 説明 |
---|---|
Description | Unitの説明 |
Documentation | ドキュメントの場所 |
After | ここに書かれたUnit以降に起動する |
Before | ここに書かれたUnit以前に起動する |
Wants | ここに書かれたUnitが必要 |
Type | サービスのタイプ(simple, forking, oneshot, notify, dbus) |
ExecStartPre | startでの実行前に実行するコマンド |
ExecStart | startで実行するコマンド |
ExecReload | reloadで実行するコマンド |
ExecStop | stopで実行するコマンド |
WantedBy | systemctl enable |
RequiredBy | systemctl enable |
systemdのログ
systemdを採用したシステム下ではjournalctl
コマンドによりsystemdのログが確認可能。
journalctl [オプション]
オプション | 説明 |
---|---|
-f | 末尾のログを表示し続ける |
-n 行数 | 指定した行数だけログの末尾を表示 |
-p [priolity] | メッセージがpriority以上のものだけ表示 |
-r | ログを新しい順に表示 |
-u Unit名 | 指定したUnitを表示 |
-full | プレーンテキストで表示 |
–no-pager | すべてのログを表示する |
3.2. システムのリカバリ
システムがハードディスクから起動できなくなった場合は、インストールCD/DVD ROM内臓のレスキューモードで起動してシステムを修復する。
レスキューモードで起動すると、ハードディスクのルートファイルシステムは/mnt/sysimage
にマウントされる。
この場合、一部コマンドが正常に動作しなくなるため、実行させるにはルートディレクトリを指定する必要がある。
なおレスキューモードの終了はexit
で可能。
rpm -qf --root /mnt/sysimage
3.2.1. chrootコマンド
chroot
コマンドはルートディレクトリを指定してコマンドを実行できたり、ルートディレクトリを変更できたりするコマンド。
chroot [ディレクトリ] [コマンド [引数]]
3.2.1. 壊れたGRUBを再インストールする例
# ルートディレクトリを指定する
chroot /mnt/sysimage
#
3.3. ブートローダ
ブートローダはカーネルをディスク上から読み取りシステムを起動するためのプログラムのこと。 ブートローダでは以下のことが実現できる。
- OSの切り替え
- 複数バージョンのカーネルの使い分け
代表的なブートローダにはGRUBやLILOがある。
3.3.1. GRUB
GRUB(GRand Unified Bootloader)は多くのディストリビューションで標準利用されているブートローダ。 以下のような特徴がある。
- 多数のファイルシステムを認識可能
- シェル機能を搭載しコマンドにより高度管理が可能
GRUBには昔から使われているGRUB Legacyと新たに設計し直されたGRUB 2がある。
3.3.2. Grub Legacy
Grub Legacyは昔から使われている古いタイプのGRUB。 Grub Legacyは3つのステージで構成される。
ステージ | 説明 |
---|---|
1 | MBR内に配置されたステージ1,5または2をロードするプログラム |
1.5 | ステージ2を見つけてロードするためのプログラム |
2 | /boot/grub ディレクトリ以下にあるGRUB本体 |
ブートローダとしてGRUBをインストールするにはgrub-install(grub2-install)コマンドを実行する。
またGRUB Legacyの設定ファイルは/boot/grub/menu.lst
となる。
/boot/grub/menu.lst
menu.lst
の設定パラメータは以下の通り。
パラメータ | 説明 |
---|---|
time | メニューを表示している時間(秒) |
default | デフォルトで起動するエントリ番号 |
splashimage | メニュー表示時の背景画面 |
title | メニューに表示されるエントリ名 |
root | カーネルイメージ/OSが格納されたパーティションの指定 |
kernel | カーネルイメージとカーネルオプションの指定 |
initrd | 初期RAMディスクファイルの指定 |
makeactive | ルートパーティションをアクティブ化 |
chainloader | 指定されたセクタの読み込みと実行 |
hiddenmenu | 起動時の選択メニューを表示しない |
grubコマンド
grubコマンドはGRUBシェルと呼ばれる対話型コマンド。
grub
grubシェルで利用できるコマンドは以下の通り。
3.3.3. GRUB2
GRUB2は最近のディストリビューションで採用されているGRUB。 設定ファイルの配置は以下の通り。
- BIOS機 …
/boot/grub/grub.cfg
- UEFI搭載機 …
/boot/efi/EFI/[ID]/crub.cfg
設定はファイルは直接変更せずに/etc/default/grub
ファイルでを用いて操作する。
grub-mkconfig
コマンド(grub2-mkconfig
コマンド)を使用してgrub.cfg
を作成できる。
なお/etc/default/grub
ファイルの設定パラメータは以下の通り。
パラメータ | 説明 |
---|---|
GRUB_DEFAULT | デフォルトで起動するOS番号/タイトル |
GRUB_HIDDEN_TIMEOUT | メニューを表示せず待機する時間 |
GRUB_HIDDEN_TIMEOUT_QUIET | trueでメニュー表示なし、falseであり |
GRUB_TIMEOUT | デフォルトOS起動までの秒数 |
GRUB_CMDLINE_LINUX_DEFAULT | ブートオプション |
GRUB_CMDLINE_LINUX | カーネルに渡すオプション |
3.3.4. 起動オプションの指定
ブートローダは起動時にカーネル/ブートローダのinitプログラムに渡すオプションパラメータを指定可能。 GRUBの場合はメニュー画面で「e」キーを押すとオプションパラメータを編集可能。
指定できるパラメータは以下の通り。
パラメータ | 説明 |
---|---|
init=パス | 指定したパスのコマンドを初期プログラムとして指定 |
mem=nM | 物理メモリの指定 |
nosmp | SMPマシンをシングルプロセッサとして動作させる |
noht | HyperThreading機構の無効化 |
maxcpus=数 | 利用するCPUの数を指定した数に制限 |
root=デバイス | ルートファイルシステムを指定する |
read-only, ro | ルートファイルシステムを読み取り専用でマウントする |
single, s | シングルユーザモードで起動する |
数値 | 指定したランレベルで起動する |
GRUB Legacyの起動オプションの指定方法
GRUB Legacyの場合以下のようになる。
grub> kernel [カーネルイメージ] [オプション]
GRUB2の起動オプションの指定方法
GRUB2の場合以下のようになる。
grub> linux [カーネルイメージ] [オプション]
3.4. その他のブートローダ
3.4.1. SYSLINUX
SYSLINUXやISOLINUXはFATファイルシステムが一般的なUSBメモリやCD-ROMから直接起動指定利用するLiveCDに使用されるブートローダ。
SYSLINUXは起動ディスクやレスキューディスクのブートローダに使われている。 またSYSLINUXはいくつかのコンポーネントで構成される。
コンポーネント | 説明 |
---|---|
SYSLINUX | FATファイルシステムからカーネルを起動するプログラム |
ISOLINUX | ISO9660ファイルシステムからカーネルを起動するプログラム |
EXTLINUX | ext2/ext3/ext4ファイルシステムからカーネルを起動するプログラム |
PXELINUX | PXEを使ってネットワークブートするプログラム |
Isohybrid
Isohybridと呼ばれるシステムはUSBスティックなどでISOLINUXイメージのMBRコードを使ったブートを可能にし、ブロックデバイスの動作を提供するもの。 MBRコードとしてSYSLINUXのMBRコードであるisohdpfx.binが使用される。
UEFIのツール
ツール名 | 説明 |
---|---|
efiboot.img | UEFIでISOLINUXを使ってブートする際に使われるイメージ。FAT16で作成されている |
/EFI/BOOT/bootx64.efi | UEFIのブートマネージャー。標準ではUEFI起動時に読み込まれる |
Secure Boot | 署名の確認を行い、起動を制限する機能 |
shim.efi | セキュアブート時に最初に読み込まれるUEFIアプリケーション |
grubx64.efi | grubを起動するUEFIアプリケーション |
3.4.2. PXEブート
PXEはIntel社に策定されたネットワークブートの規格。 DHCPやBOOTPを使ってネットワーク情報を取得し、TFTPでブートプログラムをダウンロードして起動する。 特徴としては以下の通り。
- インストールメディアなしでネットワークインストールを開始できる
- ディスクレスクライアントを起動できる
PXEクライアントにはPXE準拠のネットワークインターフェイスが必要となる。 PXEブートサーバではDHCP、TFTPサーバが稼働している必要がある。
3.4.3. systemd-boot
systemd-bootはsystemdに組み込まれているブートローダ。 UEFIのみに対応している。
3.4.4. U-Boot
U-Bootは組み込み系で利用されるブートローダ。 PowerPC、ARM、MIPSなどのアーキテクチャに対応している。
2.4 - 4.デバイスとファイルシステム
4.1. ファイルシステムの操作
ファイルシステムはハードディスクやフロッピーディスクなどの記憶媒体にファイル保存し管理する仕組みのこと。 ファイルシステムはOSごとに異なる。
VFS
VFS(仮想ファイルシステム)はファイルシステムとユーザプログラムの中間にありファイルシステムの差異を吸収する仕組み。 このシステムによりユーザプログラムはファイルシステムの違いを気にせずに統一して扱える。
4.1.1. ファイルシステムの情報
システムで利用するファイルシステムは/etc/fstab
に記載される。
書式は以下の通り。
/dev/sda1 /boot ext2 default 0 2
# デバイスファイル名/ラベル マウントポイント ファイルシステムの種類 マウントオプション dumpコマンドの対象 ブート時にfsckがチェックする順序
デバイスファイル名はUUIDで識別されるケースもある。
またUUIDはblkid
コマンドや/dev/disk/by-uuid
ファイルで確認可能。
UUIDの変更はtune2fs
コマンド、作成はuuidgen
コマンドで利用可能。
またファイルシステムの種類は以下の通り。
タイプ | 説明 |
---|---|
ext2 | Linuxファイルシステムextの拡張したシステム |
ext3 | ext2にジャーナリングシステムを追加したもの |
ext4 | ext3の機能拡張をしたもの |
ReiserFS | Linux用のジャーナリングシステム |
JFS | IBMにより開発されたジャーナリングシステム |
XFS | SGIにより開発されたジャーナリングシステム |
Btrfs | Linux向け堅牢ファイルシステム |
ISO9660 | CD-ROM向けのファイルシステム |
UDF | DVDのファイルシステム |
F2FS | SSDなどフラッシュメモリ向け |
msdos | MS-DOS向けファイルシステム |
FAT/FAT32 | フラッシュメモリなどで使われる |
NTFS | windows NT/2000向け |
hpfs | OS/2のファイルシステム |
HFS | MacOS向けのシステム |
HFS+ | MacOS8.1以降 |
NFS | ネットワークファイルシステム |
CIFS | Windows2000以降 |
procfs | プロセス情報を扱う仮想ファイルシステム |
sysfs | デバイス情報を扱う仮想ファイルシステム |
tmpfs | 仮想メモリベースの仮想ファイルシステム |
devpts | 疑似端末を制御するための仮想ファイルシステム |
usbfs | USBデバイス監視用ファイルシステム |
cramfs | 組み込みデバイス向けの圧縮ファイルシステム |
マウントオプションは以下の通り。
オプション | 説明 |
---|---|
async | ファイルシステムのすべての入出力を非同期で行う |
sync | ファイルシステムのすべての入出力を同期で行う |
atime | ファイルへのアクセスごとにinodeのアクセス時刻を更新する |
relatime | ファイル更新/アクセスの一定時間後にアクセス時刻を更新する |
noatime | inodeのアクセス時刻を更新しない(ディスクアクセス高速化) |
auto | -aオプションでmountコマンドを実行したときにマウントする |
noauto | -aオプションでmountコマンドを実行したときにマウントしない |
defaults | デフォルト(async, auto, dev, exec, nouser, rw, suid) |
dev | ファイルシステム上のデバイスファイルを利用できる |
group | ユーザのグループがデバイスファイルの所有グループと一致すればマウント許可 |
exec | バイナリ実行の許可 |
noexec | バイナリ実行の禁止 |
suid | SUID, SGIDビットを有効化する |
nosuid | SUID,SGIDビットの無効化 |
ro | 読み出し専用のマウント |
rw | 読み書きを許可してマウント |
uid=UID | すべてのファイル所有者を指定したUIDのユーザにする |
gid=GID | すべてのファイルの所有グループを指定したGIDのグループにする |
user | 一般ユーザのマウントを許可、マウントしたユーザのみがアンマウントできる |
users | 一般ユーザのマウントを許可、マウントしたユーザ以外もアンマウントができる |
nouser | 一般ユーザのマウントを禁止 |
owner | デバイスファイルの所有者によりマウントを許可する |
なおカーネルがサポートしているファイルシステムは/proc/filesystems
で確認が可能。
また現時点でどのファイルシステムがマウントされているか、またどのようなマウントオプションが使われているかは/etc/mtab
で確認可能。
なお/etc/mtab
は直接編集してはならない。間違って編集した場合は/proc/mounts
を利用し復旧が可能。
また/proc/mounts
にも同様の情報がある。
4.1.2. マウントとアンマウント
ファイルシステムを利用するためには任意のディレクトリにマウントポイントとしてマウントする必要がある。
ファイルシステムのマウントにはmount
コマンドを使用する。
mountコマンド
ファイルシステムのマウント、マウントされたデバイスの確認ができるコマンド。
mount [オプション]
mount /dev/sda1 /data # /dataをマウントポイントとしてマウントする
オプション | 説明 |
---|---|
-a | /etc/fstab で指定されているファイルシステムをマウントする |
-f | /etc/mtab の情報を書き換えるだけでマウントなし |
-o オプション | マウントオプションの指定(remount: 再マウント, noexec:バイナリ実行の不許可, nosuid:SUID,SGIDの無視, loop: イメージファイルのマウント) |
-n | /etc/mtab のマウント情報を書き込まない |
-r | 読み取り専用でマウントする |
-t タイプ | ファイルシステムの種類を指定する |
-w | 読み書き可能でマウントする |
unmountコマンド
ファイルシステムをアンマウントするコマンド。
unmount [オプション] [デバイスファイル名/マウントポイント]
オプション | 説明 |
---|---|
-a | /etc/mtab で指定されているシステムすべてアンマウントする |
-t タイプ | 指定した種類のファイルシステムをアンマウントする |
fuserコマンド
指定のファイルを利用しているプロセスの一覧を得たり、そのプロセスをまとめて kill したりするために利用できるコマンド。 具体的にはどのプロセスがそのファイルシステムを利用中なのかも調べられる。
fuser
4.1.3. ファイルの書き込み動作
ファイルに書き込み処理をしてもすぐには書き込まれず、メモリ上のディスクバッファ領域に書き込まれる。 これはディスクアクセスがメモリアクセスに比べて格段に遅いためである。 そのためデータをまとめてディスクに書き込むことでパフォーマンスを向上させる。
syncコマンド
ディスクバッファ領域にあるデータをディスクに書き込むコマンド。
sync
キャッシュの種類
キャッシュにはいくつか種類があり、代表的なものにはバッファキャッシュとページキャッシュがある。
種類 | 説明 |
---|---|
バッファキャッシュ | ディスク書き込み終了時にディスクバッファのデータを保存することで、再読出しの際に高速化する |
ページキャッシュ | ページ単位で管理されているメモリ上の情報を保持しておくタイプのキャッシュ |
4.1.4. スワップ領域
スワップ領域はブロックデバイス上の仮想的なメモリ領域のこと。
スワップ領域はシステム構成時に作成するが、後から作成も可能でmkswap
コマンドでできる。
mkswapコマンド
スワップ領域を作成するコマンド。
mkswap [オプション] [デバイスファイル名/ファイル名]
オプション | 説明 |
---|---|
-c | スワップ作成前に不良ブロックのチェックを行う |
-L ラベル | ラベルの作成 |
swaponコマンド
スワップ領域を有効にするコマンド。
swapon [オプション] [デバイスファイル名/ファイル名]
オプション | 説明 |
---|---|
-a | /etc/fstab 内のスワップ領域すべての有効化 |
-s | スワップ領域を表示する |
swapoffコマンド
スワップ領域を無効にするコマンド
swapoff [オプション] [デバイスファイル名/ファイル名]
オプション | 説明 |
---|---|
-a | /etc/fstab 内のスワップ領域すべての無効化 |
4.2. ファイルシステムの作成
4.2.1. ext2~ext4ファイルシステムの作成
ext2/ext3/ext4のファイルシステムの作成はmke2fs
コマンドで可能。
mke2fs [オプション] デバイスファイル
オプション | 説明 |
---|---|
-b サイズ | ブロックサイズをバイト単位で指定する |
-c | ファイルシステム作成前に不良ブロックのチェックを行う |
-i サイズ | inodeあたりのバイト数を指定 |
-j | rootユーザ用の予約領域を%指定する |
-m 領域% | rootユーザ用の予約領域を%で指定する |
-n | パラメータ確認 |
-t タイプ | ファイルシステムのタイプを指定(ext2~ext4) |
なおデフォルト値は/etc/mke2fs.conf
で指定可能。
使用例
ブロックサイズを2048Byte、不良ブロックのチェックを行い、/dec/sda1
にext3ファイルシステムを作成する例
mke2fs -b 2048 -c -j /dev/sda1
ブロックサイズは平均低ファイルサイズが小さい場合は小さく、大きい場合は大きく設定する。 またinode1つ当たりのByte数は平均低名ファイルサイズを基準にしそれを超えないようにする。
ext3ファイルシステムの書き込みフロー
- 書き込み操作の発生
- メタデータ(inode番号など)の更新内容をログへ書き込み
- データとメタデータをディスクに書き込む
- ディスク書き込み後に該当ログを破棄する
ext4ファイルシステムの作成
ext4ファイルシステムの作成にはmkfs.ext4
コマンドを使用する。
またext4システムはext3ファイルシステムと互換性がある。
変換例は以下の通り。
tune2fs -O extend,uninit_bg,dir_index /dev/sda4
e2fsck /dev/sda4 # 整合性の確認
ジャーナリングモード
ext3/ext4には3つのモードのジャーナリングモードがある。
種類 | 説明 |
---|---|
journal | メインファイルシステムより前にすべてのデータがジャーナルに記録される |
ordered | メタデータがジャーナルに記録される前に、すべてのデータをメインファイルシステムに直接書き出す(デフォルトの設定) |
writeback | メタデータがジャーナルに記録された後に、すべてのデータをメインファイルシステムに上書きする |
writebackはファイルシステムの完全性が保持されるが、クラッシュ後のリカバリでファイル内容が元に戻ることがある。
4.2.2. XFSファイルシステムの作成
XFSはSGI社が開発した堅固な高速なジャーナリングファイルシステムのこと。 最大ボリュームサイズ/最大ファイルサイズは8EBとなっている。
カーネルがxfsに対応しているかは以下のように確認可能。
modprobe xfs
grep xfs /proc/filesystems
mkfs.xfsコマンド
XFSのファイルシステムを作成するコマンド。
mkfs.xfs /dev/sda1
4.2.3. Btrfsファイルシステムの作成
BtrfsはLinux向けのファイルシステム、耐障害性に優れている。 特徴は以下の通り。
- 最大16EiBのファイルサイズに対応
- コピーオンライト
- ディスク領域の効率的利用
- inodeの動的割り当て
- ストレージプールの対応
- スナップショット機能
- チェックサムによる完全性保証
- 効率的な増分バックアップ
mfs.brtfsコマンド
Btrfsのファイルシステムを作成するコマンド。
mkfs.btrfs /dev/sdb1
4.2.4. mkfsコマンドによるファイルシステムの作成
mkfsコマンドはファイルシステムの作成などができるフロントエンドプログラム。
mkfs -t ext3 /dev/sdc1
対応しているファイルシステムは以下の通り。 ext2~ext4,XFS,Brtfs,cramfs,FAT/VFAT,MINXFS。
オプション | 説明 |
---|---|
-t タイプ | ファイルシステムの種類を指定 |
-c | 不良ブロックのチェック |
-V | 詳細情報の表示 |
4.2.5. CD/DVDの作成
LinuxでCD/DVDへ書き込みを行い場合の手順は以下の通り。
- CD-R/DVD-Rへ書き込むデータのファイルイメージの作成
- 作成したイメージファイルをライティングソフトで書きこむ
CD-ROMのファイルシステムはISO9660となる。
ファイルシステムはmkisofs
コマンドで作成を行う。
mkisofs [オプション] ディレクトリ名
オプション | 説明 |
---|---|
-b | ブータブルCDにする |
-o ファイル名 | ISO9660/UEFIイメージの指定 |
-J | jolietフォーマット |
-R,-r | RockRidgeフォーマット |
-T | RockRidgeフォーマットが使えないファイルシステムで正しいファイル名を維持する |
-udf | DVDなどで用いられるUDFイメージの作成 |
jolietとRockridge
ISO9660ではファイル名は「8文字+.+3文字」構成(8.3形式)となる。 RockRidgeフォーマットはロングネームでもファイル名が対応できるように拡張したものでUnixOSで使用される。 Jolietフォーマットは最大64文字のファイル名に対応しているMicrosoftが開発したISO9660上位互換規格である。
4.2.6. 暗号化ファイルシステムの作成
ディスクやファイルの暗号化を行うことができる。 ディスクやファイルの暗号化は大きく分けて以下の種類がある。
- ブロックデバイス(パーティション、ファイルシステムを含む)に対する暗号化
- 個別のファイルに対する暗号化
ファイル自体を個別に暗号化する暗号化手法にはEncfs、eCryptfsなどがある。
dm-cryptによる暗号化
dm-cryptはカーネルの仕組みの1つ。 dm-cryptによる暗号化はブロックデバイスの暗号化機能を提供する。
dm-cryptはdevice-mapperを利用して、ブロックデバイス(物理デバイス)へのアクセス時に暗号化が行われるよう暗号化マッピングを行う。
またdevice-mapperは論理デバイスを/dev/mapper
配下に作成し、物理デバイスと論理デバイス間のマッピングを行う。
暗号化にはcryptsetup
コマンドを使用する。
なお暗号化のためには以下パッケージが必要。
- RHell系では
cryptsetup-luks
- Debian系では
cryptsetup
cryptsetupコマンド
ブロックデバイスを暗号化するコマンド。 入力されたパスフレーズをもとに暗号化する(覚えておく必要あり)
cryptsetup create 名前 デバイスファイル名 # ファイルシステムの暗号化
cryptsetup remove 名前 # 次回使用時に暗号化を解く
cryptsetup status 名前
cryptsetup luksDump デバイスファイル名 # 暗号化の状態を表示
cryptsetup luksFormat デバイスファイル名 # 指定したデバイスを暗号化パーティションとして初期化
cryptsetup luksOpen デバイスファイル名 名前 # LuKSパーティションを名称を指定し開く
cryptsetup luksClose デバイスファイル名 # LUKSパーティションを閉じる
暗号化してマウントする手順は以下の通り
cryptsetup create 名前 デバイスファイル名
で暗号化/dev/mapper/名前
にデバイスファイルが作成される- 上記デバイスファイルにファイルシステムを作成(
mkfs.ext4 /dev/mapper/名前
など) - マウントポイントの作成(
mkdir /mnt/名前
)、そしてマウントを行う(mount /dev/mapper/名前 /mnt/名前
)
アンマウントして暗号化を削除する手順は以下の通り。
unmount /dev/mapper/名前
cryptsetup remove 名前
LUKS
LUKS(Linux Unified Key Setup) はLinuxにおいて標準的に使用される暗号化ファイルシステムの仕様のこと。 LUKSは異なるシステム、ディストリビューション間において相互運用ができる。 LUKSではKeySlotといって、暗号化管理のための鍵をパーティションごとに8つ持つことができる。
LUKSはLinuxにおいてdm-cryptを用いて実装されており、cryptsetup
コマンドでファイルシステムの暗号化や管理を行う。
4.3. ファイルシステムの保守
4.3.1. ext2/ext3のファイルシステムの構造
ext2/2xt3のファイルシステムはブロック単位で管理され、ブロックにはデータブロック、iノードブロック、スーパブロックの3種類がある。 データブロックにはファイルの内容が保存される。1024の倍数でブロックサイズを指定可能となっている。指定しない場合は適切な値が自動で選択される。
またデータブロックなどはブロックグループという単位でまとめられる。 データブロックにどのデータが記録されているかはiノードに記録される。 iノードブロックにはファイルタイプや更新日、アクセス権所有者情報などのメタデータも保存される。
なおiノードブロックのサイズは128Byteで、1ブロックが1024Byteの場合は1ブロックに8つのiノードが格納される。 ext2/ext3ではiノードをシステム作成後に追加することはできない。
スーパーブロックにはファイルシステムの全般的な情報であるデータブロックサイズやマウント回数、iノードなどが格納される。
スーパーブロックはブロックグループごとにバックアップが作成される。
バックアップスーパーブロックの位置はファイルシステム作成時に表示され、後から確認はmke2fs -n
で可能となっている。
確認例は以下の通り。
mke2fs -b 4096 -c -j -n /dev/sdb1
dumpe2fsコマンド
スーパーブロックの内容を確認できるコマンド。
dumpe2fs デバイスファイル名
4.3.2. ext4ファイルシステムの構造
ext4ファイルシステムの構造は基本的にはext2/ext3と同じだが以下の違いがある。
- 最大ファイルサイズが16TB, 最大ファイルシステムサイズが1EB
- エクステント方式のブロック管理
- オンラインデフラグ
- ナノ秒単位のタイムスタンプ
- マルチブロック割り当て
- ジャーナルチェックサム
- fsckの高層化
4.3.3. ファイルシステムのチェック
ファイルシステムの整合性チェックはfsck
やe2fsck
コマンドで確認できる。
チェックする際はそのチェック対象のファイルシステムをマウントもしくは読み込みonlyでマウントする必要がある。
fsckコマンド
fsck [オプション] [デバイス名]
オプション | 説明 |
---|---|
-r | 対話的に修復を実行 |
-t タイプ | ファイルシステムの種類を指定 |
-A | /etc/fstabに記載された全ファイルシステムに対し実行 |
-N | 実行せず、実行した場合の結果を表示 |
e2fsckコマンド
ext2/ext3/ext4ファイルシステムをチェックする際に使用するコマンド。
e2fsck [オプション] [デバイス名]
オプション | 説明 |
---|---|
-b ブロック | 指定したスーパブロックのバックアップを使用して復元 |
-c | 不良ブロックのチェック |
-f | ファイルシステムの状態がcleanでもチェックする |
-p | すべての不良ブロックを自動的に修復する |
-y | 再帰問い合わせに関しすべて「yes」と回答する |
-n | 再帰問い合わせに関しすべて「no」と回答する |
なおマウント中のファイルシステムはチェックできないため、ルートファイルシステムをチェックする際は、CD-ROM等より起動するなどを行う必要がある。
もしくはshutdown -r -F now
コマンドで起動時でチェックを行うこともできる。
xfs_repairコマンド
XFSファイルシステムをチェックするコマンド。
-n
オプションを付けるとチェックのみを行い修復はしない動作となる。
xfs_repair -n デバイス名
4.3.4. ext2~ext4ファイルシステムの管理
ext2/ext3/ext4ファイルシステムの様々なパラメータを設定するにはtune2fs
コマンドを使用する。
tune2fsコマンド
tune2fs [オプション] デバイス名
オプション | 説明 |
---|---|
-c 回数 | ファイルシステムチェックが行われるまでの最大マウント回数を指定する |
-C 回数 | 現在のマウント回数の設定 |
-i 間隔 | ファイルシステムのチェック間隔を指定 |
-j | ext2からext3へ変換する |
-m 領域% | rootユーザ用の予約領域のサイズを変更する |
-i | スーパーブロックの内容を表示する |
-L ラベル | ファイルシステムのボリュームラベルを設定する |
-U UUID | 指定したUUIDに変更する |
badblocksコマンド
デバイス上の不良ブロックを検索するコマンド。
badblocks [オプション] [デバイスファイル名]
オプション | 説明 |
---|---|
-b サイズ | ブロックサイズを指定する |
-o ファイル名 | 指定したファイルに結果を出力する |
-w | 書き込みモードでテストする |
debugfsコマンド
ファイルシステムのデバックを対話式に行えるコマンド。
debugfs [オプション] [デバイスファイル名]
オプション | 説明 |
---|---|
-w | ファイルシステムを読み書き可能モードで開く |
-s ブロック番号 | 指定したブロックをスーパーブロックとして利用する |
サブコマンド | 説明 |
---|---|
cat ファイル名 | ファイルの内容を表示する |
cd ディレクトリ | 別のディレクトリに移動する |
chroot ディレクトリ | ルートディレクトリを変更する |
close | ファイルシステムを閉じる |
dump ファイルA ファイルB | ファイルAの内容をファイルBとして保存 |
freei ファイル名 | ファイルのiノードを消去する |
ls | ファイル一覧を表示する |
mkdir ディレクトリ | ディレクトリを作成する |
open デバイス名 | ファイルシステムを開く |
pwd | カレントディレクトリを表示する |
rm ファイル名 | ファイルを削除する |
rmdir ディレクトリ | ディレクトリを削除する |
stat ファイル名 | inodeの内容を表示する |
quit | 終了する |
4.3.5. S.M.A.R.T
S.M.A.R.Tはハードディスクに組み込まれている自己診断機能のこと。 この機能を搭載しているハードディスクでは故障時期の予測や故障の兆候を発見可能となっている。 LinuxにはいくつかのS.M.A.R.T対応ソフトウェアがある。
代表的なものにはsmartmontoolsがある。
この仕組みではsmartdデーモンがハードウェアのS.M.A.R.T情報を取得し、smartctl
コマンドで表示する。
smartctlコマンド
smartctl [オプション] [デバイスファイル名]
オプション | 説明 |
---|---|
-a / –all | S.M.A.R.T情報を表示する |
-i / –info | S.M.A.R.Tの対応状況などを表示する |
-c / –capabilities | テストの診断状況の表示 |
-t / –test | セルフテストを実施する |
-l / –log | テストログを表示する |
-H / –health | 状態を表示する |
–scan | 認識されているデバイスを表示 |
4.3.6. XFSファイルシステムの管理
xfs_adminコマンド
XFSファイルシステムのパラメータ変更はxfs_admin
コマンドを使用する。
xfs_admin [オプション] [デバイス名]
オプション | 説明 |
---|---|
-u | UUIDを表示する |
-l | ラベルを表示する |
-L ラベル | ラベルの設定 |
-U UUID | UUIDを設定する |
xfs_infoコマンド
XFSファイルシステムの情報を表示するコマンド。
xfs_info デバイス名
xfsdumpコマンド
XFSファイルシステムをバックアップするコマンド。
xfsdump オプション バックアップするファイルシステム
オプション | 説明 |
---|---|
-f 出力先 | 出力先を指定する |
-l レベル | ダンプレベルの指定 |
-J | ダンプ情報データベースを更新しない |
xfsrestoreコマンド
xfsファイルシステムをリストアするコマンド。 XFSファイルシステムの復元を行うことができる。
xfsrestore オプション リストア先
オプション | 説明 |
---|---|
-f ファイル名 | バックアップされたデバイスファイル名を指定する |
-S セッションID | リストアされたバックアップのセッションIDを指定する |
-L セッションラベル | リストアするバックアップのセッションラベルを指定する |
-r | 増分バックアップからリストアする |
-i | 対話的にリストアする |
-I | すべてのダンプのセッションIDとセッションラベルを明示する |
なお増分バックアップが含まれるテープデバイスからリストアするにはセッションIDまたはセッションラベルが必要となる。
xfs_repairコマンド
XFSファイルシステムの修復を行うコマンド。
xfs_repair デバイスファイル名
4.3.7. Btrfsファイルシステムの管理
Btrfsファイルシステムの管理を行う場合はbtrfs
コマンドを使用する。
btrfsコマンド
btrfs コマンド サブコマンド
コマンド/サブコマンド | 説明 |
---|---|
filesystem show | ファイルシステムの情報を表示 |
filesystem df | ファイルシステムの使用状況を表示 |
filesystem label | ファイルシステムのラベルを指定 |
filesystem resize | ファイルシステムサイズの変更 |
subvolume create | サブボリュームの作成 |
subvolume delete | サブボリュームの削除 |
subvolume list | サブボリューム一覧の表示 |
subvolume snapshot | サブボリュームのスナップショットの作成 |
subvolume show | サブボリュームの情報の表示 |
Btrfsではサブボリュームが使用できる。 サブボリュームはファイルシステムを分割したものを示す。
btrfs-convertコマンド
ext4などのファイルシステムをBtrfsに変換するコマンド。
btrfs-convert デバイス名
4.3.8. オートマウント
autofsサービスによるオートマウントを実行することで、自動マウントがされる。 この機能を使えば手動でマウント/アンマウントする必要がない。
autofsサービスの開始
autofsサービスは以下コマンドで開始できる。
設定ファイルは/etc/auto.master
とファイルシステム毎に設定するマップファイルになる。
systemctl start autofs
systemctl restart autofs
/etc/auto.masterの書き方
マウントポイントの指定方法は直接マップ、間接マップの2つの方式がある。
/- /etc/auto.direct # 直接マップ
/mnt/sample /etc/sample.dvdrom --timeout=60 # 間接マップ
# マウントベース マップファイル オプション
なお/etc/auto.master
を編集した場合には、設定を反映させる為にデーモンの再起動(/etc/init.d/autofs reload
など)が必要となる。
マップファイル
マップファイルではファイル名を自由に変更する設定を記述することができる。 マップファイルはオートマウントしたいファイルシステムの個数だけ作成する必要がある。
書式は以下の通り。
dvdrom -fstype=udf,ro :/dev/sdc1
# マウントベース以下に作成されるディレクトリ マウントオプション デバイスファイル名
2.5 - 5.高度なストレージ管理
5.1. RAID
RAIDはハードディスクを組み合わせて使用できる技術のこと。 ハードディスクをまとめて扱うことで高い信頼性とパフォーマンスを実現することを目指すものといえる。
5.1.1. LinuxにおけるRAID
LinuxでRAIDを利用する際はソフトウェアRAIDとハードウェアRAIDの2種類を利用できる。 Kernel2.4以降ではソフトウェアRAIDが実装されていてハードディスクのパーティションを複数使うことでRAIDアレイを実現する。 ハードウェアRAIDアレイはLinuxからはSCSIデバイスのように見える。
RAIDアレイ
複数のディスクもしくはパーティションを束ねたもののこと
5.1.2. RAIDの種類
RAID0(ストライピング)
RAID0は複数のディスクに分散してデータを書き込み1台のディスクのように扱うRAID構成。
特徴は以下の通り。
- データ消失が許されない用途には不向き
- 書き込みのパフォーマンスが高い
- ディスク容量をフル利用できる
RAID1(ミラーリング)
RAID1は複数のディスクに全く同じ内容を並列して書き込み扱うRAID構成。
特徴は以下の通り。
- RAIDアレイを構成する1台がクラッシュしても、残りのディスクで復旧が可能
- ディスクサイズが1台当たりのディスクサイズ以上にはならない
RAID4
RAID4はRAID0のようにストライピングの機能にエラー訂正用のパリティ情報を保存する専用ディスクを用意したRAID構成。 つまり最低3台のディスクが必要。
特徴は以下の通り。
- データが保存されているディスクがクラッシュしてもパリティ情報から復旧できる
- パリティ情報を保存するためパフォーマンスが良くない
RAID5
RAID5はRAID4と同じようにパリティ情報により冗長性を確保する構成でパリティ専用ディスクを使用しないRAID構成。 パリティ情報はデータと同様に複数のディスクに分散して保存される。 RAID5も最低3台のディスクが必要となる。
その他のRAID構成
RAID | 説明 |
---|---|
RAID LINEAR | ディスクを論理的に結合してサイズの大きな1つのディスクに見せる |
RAID0+1 | RAID0でストライピング構成を複数作りそれをミラーリングする |
RAID1+0 | RAID1でミラーリング構成を複数作りそれをストライピングする |
RAID6 | RAID5に加えてパリティ情報をもう1台余分に2重パリティを行い冗長構成を高める |
5.1.3. RAIDの構成と運用
LinuxでRAIDを構成するパーティションを作成する際はパーティションタイプを0xfdに設定する必要がある。
fdisk -l デバイスファイル名
で確認可能。
mdadmコマンド
RAIDアレイの制御を行うコマンド。
RAIDアレイの作成はCREATEモードで行う。
/proc/mdstat
の確認でも可能。
mdadm [オプション] [デバイス名]
オプション | 説明 |
---|---|
CREATEモードのオプション | - |
-C md デバイス名 | RAIDアレイを指定して作成する |
-a | 必要であればデバイスファイルを自動的に作成する |
-c サイズ | チャンクサイズの指定(KB単位) |
-l レベル | RAIDレベルの指定 |
-n 数 | アクティブな構成デバイス数を指定する |
-x 数 | スペアデバイスの数を指定する |
MANAGEDモードのオプション | - |
–manage | MANAGEモードにする |
-a | 構成デバイスの追加 |
-r | 構成デバイスの削除 |
-f | 構成デバイスに不良マークを付ける |
MISCモード | - |
–misc | MISCモードにする |
-Q | RAIDの状態を表示 |
-D | RAIDの詳細情報の表示 |
-E | 構成デバイスの状態表示 |
–readonly | 読み取り専用にする |
–readwrite | 書き込み可能にする |
–stop | -S md デバイス名 |
–stop -scan | すべてのRAIDアレイの停止 |
Assembleモード | - |
RAIDアレイの状態は/proc/mdstat
ファイルで確認可能。
使用例は以下の通り。
# RAID1のRAIDアレイmd0を/dev/sdc5~sdc7で構成(アクティブは2つ、1つは予備)
mdadm -C /dev/md0 --level 1 --raid-devices 2 --spare-devices 1 /dev/sdc5 /dev/sdc6 /dev/sdc7
# /dev/md0の状態確認
mdadm --query /dev/md0
RAID構成デバイスに障害が発生した場合は以下手順でディスクを交換する。
例では/dev/sdc5
が壊れたとする。
- デバイスに障害を通知するために不良マークをつける
mdadm --manage /dev/md0 -f /dev/sdc5
- この際 予備デバイスがあれば自動的に予備デバイスに切り替わる(確認は
cat /proc/mdSATA
で可能)
- 構成デバイスをRAIDアレイから削除する
mdadm --manage /dev/md0 -r /dev/sdc5
- 予備デバイス(例では/dev/sdc7)を追加する
mdadm --manage /dev/md0 -a /dev/sdc7
またmdadmの設定ファイルは/etc/mdadm/mdadm.conf
となる。
このファイルにあらかじめ設定を記述するとRAIDアレイをシステム起動時に自動認識できる。
5.2. LVM
LVM(論理ボリューム管理機能)はディスク管理を柔軟に行える機能のこと。 ディスクのパーティションを直接操作は行わず、仮想的なパーティションの論理ボリュームを動的に管理する。 以下のメリットがLVMにはある。
- パーティションのサイズを変更できる(通常は一度決めるとできない)
- 別ディスクにパーティションを移動させることができる
- ディスクサイズを超える大きさのパーティションを作成できる
LVMでは仮想的なブロックデバイスの機能はデバイスマッパーと呼ばれる機能によって実現されている。
これらの仮想的なデバイスは/dev/mapper/VG名-LV名
というデバイス名で扱われる。
まあカーネル内では/dev/dm-*
という形で、LVMでは/dev/VG名/LV名
というデバイス名も扱われる。
5.2.1. LVMの仕組み
LVMの概要は以下の通り。 ボリュームグループは仮想的ディスク、論理ボリュームは仮想的パーティションといえる。
- 1台のハードディスクや1つのパーティションを物理ボリューム(PV)にする
- 物理ボリュームは一定サイズの物理エクステント(PE)から構成される
- 1つ以上の物理ボリュームからボリュームグループ(VG)が構成される
- VG内でPEから論理ボリューム(LV)が構成される
- 論理ボリュームは従来のパーティション同様ブロックデバイスとして扱える
- LVのサイズ変更や他ディスクへの移動が可能
- LVは複数ディスクにまたがって作成できる
- VGは後からサイズ変更ができる
5.2.2. LVMの作成
LVM利用手順は以下の通り。
- パーティションの作成(
fdisk
) - 物理ボリュームを用意(
pvcreate
) - 物理ボリュームを束ねてボリュームグループを作成(
vgcreate
) - ボリュームグループから論理ボリュームを切り出す(
lvcreate
) - ファイルシステムの作成(
mkfs
) - マウント(
mount
)
/dev/sdd1,/dev/sde1を使用した例
- LVM用のパーティションの用意 初めにLVMを作成するためのパーティションまたはハードディスクを用意する。 パーティションを利用する場合はタイプを8eに設定する
parted /dev/sdd1
parted /dev/sde1
- 物理ボリュームを初期化する
pvcreate
コマンドでデバイスを物理ボリュームとして初期化する
pvcreate /dev/sdd1 /dev/sde1
- ボリュームグループの作成
vgcreate
コマンドでボリュームグループを作成する(例の名称ではgroup1)
vgcreate group1 /dev/sdd1 /dev/sde1
なお-s
オプションで物理エクステントのサイズを指定可能(省略した場合デフォルトで4MB)
4. 論理ボリュームの作成
lvcreate
コマンドで論理ボリュームを作成する(例の名称ではlv1)
lvcreate -L 500M -n lv1 group1
なおlvscan
コマンドで論理ボリュームの状態を確認可能
5. ファイルシステムの作成/マウント
ファイルシステムを作成してマウントを行う。例ではext4で/mntにマウントする
mkfs.ext4 /dev/group1/lv1
mount /dev/group1/lv1 /mnt
なおdf -T
コマンドで確認可能。
5.2.3. LVMの管理
LVM関連のコマンドを記載する。
pvdisplay/pvscanコマンド
物理ボリュームの詳細情報の表示を行うコマンド。
pvdisplay /dev/sda1
pvscan # 簡潔に表示
vgextendコマンド
ボリュームグループに物理ボリュームを追加するコマンド。
vgextend [ボリュームグループ] [物理ボリューム]
pvmoveコマンド
物理ボリュームを別の物理ボリュームに移動させるコマンド。
pvmove [移動元物理ボリューム] [移動先物理ボリューム]
vgreduceコマンド
ボリュームグループから物理ボリュームを削除するコマンド。
vgreduce [ボリュームグループ] [削除する物理ボリューム]
pvremoveコマンド
物理ボリュームを削除するコマンド。
pvremove [物理ボリューム]
vgdisplayコマンド
ボリュームグループの詳細を表示するコマンド。
vgdisplay [ボリュームグループ]
lvdisplayコマンド
論理ボリュームの詳細情報の表示するコマンド。
lvdisplay [論理ボリューム]
lvextendコマンド
論理ボリュームを拡張するコマンド。
lvextend -L +100M [論理ボリューム]
このコマンドだけではファイルシステムまで拡張されない。
そのためresize2fs
コマンドやxfs_growfs
コマンドでファイルシステムのサイズも拡張する必要がある。
resize2fs/xfs_growsfsコマンド
resize2fs
コマンドはext2~ext4ファイルシステムの場合ファイルシステムを広げるコマンド。
xfs_growfs
コマンドはXFSの場合にファイルシステムを広げるコマンド。
e2fsck -f /dev/group1/lv1
resize2fs /dev/group1/lv1
lvremoveコマンド
論理ボリュームを削除するコマンド。
lvremove [論理ボリューム]
スナップショット機能
スナップショット機能を使用するとファイルシステムをマウントせずにバックアップすることができる。 具体的にはスナップショットの作成ではファイルシステムを書き込み禁止やアンマウントせずにバックアップができる。
スナップショットをsnap0という名前でとる例
lvcreate -s -L 100M -n snap0 /dev/group1/lv1
dump 0uf /dev/st0 /dev/group1/snap0
スナップショットの特性上、スナップショットの作成後にファイルシステムに変更が加われば加わるほどスナップショット領域は大きくなる。 そのためバックアップ取得後は、スナップショットを削除したほうが良い。
5.2.4. LVMの関連コマンド
物理ボリューム関連コマンド
コマンド | 説明 |
---|---|
pvcreate | PVの作成 |
pvdisplay | PVの情報の表示 |
pvmove | PV内のPEを移動 |
pvremove | PVの削除 |
pvscan | PVの検索 |
pvs | PVの情報出力 |
ボリュームグループ関連のコマンド
コマンド | 説明 |
---|---|
vgcreate | VGを作成 |
vgchange | VGの属性を変更 |
vgdisplay | VGの情報を表示 |
vgextend | VGの拡張(PVの追加) |
vgreduce | VGの縮小(PVの削除) |
vgremove | VGの削除 |
vgimport | VGのインポート |
vgexport | VGのエクスポート |
vgmerge | 2つのVGを統合する |
vgrename | VG名の変更 |
vgscan | VGの検索 |
vgs | VGの情報表示 |
論理ボリューム関連のコマンド
コマンド | 説明 |
---|---|
lvcreate | LVの作成 |
lvdisplay | LVの情報表示 |
lvextend | LVの拡張(PEの追加) |
lvreduce | LVの縮小(PEの削除) |
lvremove | LVを削除 |
lvrename | LV名を変更 |
lvscan | LVの検索 |
lvs | LVの情報表示 |
5.3. 記憶装置へのアクセス
5.3.1. デバイスファイル
記憶装置のデバイスファイルは以下の通り。
デバイスファイル | 説明 |
---|---|
/dev/hda | IDEプライマリマスタに接続されたドライブ |
/dev/hdb | IDEプライマリスレーブに接続されたドライブ |
/dev/hdc | IDEセカンダリマスタに接続されたドライブ |
/dev/hdd | IDEセカンダリスレーブに接続されたドライブ |
/dev/sda | 1番目のSCSI/SATA/USB/IEEE1394デバイス |
/dev/sdb | 2番目のSCSI/SATA/USB/IEEE1394デバイス |
/dev/sdc | 3番目のSCSI/SATA/USB/IEEE1394デバイス |
/dev/sdd | 4番目のSCSI/SATA/USB/IEEE1394デバイス |
/dev/sr0 | 1番目のSCSI/SATA/USB CD/DVDドライブ |
/dev/sr1 | 2番目のSCSI/SATA/USB CD/DVDドライブ |
/dev/st0 | 1番目のSCSIテープドライブ |
/dev/st1 | 2番目のSCSIテープドライブ |
カーネル2.6.21以降はIDEデバイスもSCSIデバイスと同じ扱いになったため、IDEハードディスクも/dev/sdN
といったデバイス名になる。
5.3.2. ハードディスクの管理
ハードディスクは5つのタイプに分かれる。
- SATA(Serial ATA)
- SCSI
- SAS
- USB
- IEEE1394
Linuxの場合、SATAハードディスクもSCSIハードディスクとして扱われる。
なおKernel 2.6.21以降では基本的にすべてのハードディスクは/dev/sd*
と扱われる。
IDEの転送モードにはメインメモリとハードディスクとの転送方式としてPIOモードとDMAモードがある。
- PIOモード … CPUがハードディスクに直接命令してデータを転送する方式。欠点はデータ読み書き中はCPUは他の処理を実行できない点がある
- DMAモード … CPUとは異なり専用のコントローラがデータの伝送を管理する。現在一般的な手法。
Ultra DMA は従来のDMAを拡張した企画で高速転送速度をサポートしている。 なおUltra DMAの利用はハードディスク/マザーボードのチップ/BIOSが対応している必要がある。
hdparmコマンド
DMAモード、IDEハードディスクのパラメータを確認/設定できるコマンド。 オプションなしでは適用されているパラメータを表示する。
hdparm [オプション] [デバイスファイル]
オプション | 説明 |
---|---|
-i | ハードディスクの詳細情報確認 |
-I | ドライブから直接情報を得る |
-c数値 | 32bit I/Oサポート(0:無効化、1:有効化、3:同期シーケンス付きで有効化) |
-d数値 | DMAモードの使用不使用を指定 (0:無効化,1:有効化) |
-W数値 | ライトキャッシュのON/OFF(0:無効化,1:有効化) |
-t | バッファキャッシュを使わずに読み込み速度を計測する |
-T | バッファキャッシュの読み込み速度をテストする |
sdramコマンド
SCSI/SATA/USBディスクに対してDMAモード、IDEハードディスクのパラメータを確認/設定できるコマンド。 オプションなしでは適用されているパラメータを表示する。
sdparm [オプション] [デバイスファイル]
sdparm --conmmand=stop [デバイスファイル] # ディスク回転の停止
sdparm --clear=WCE [デバイスファイル] # ディスクキャッシュの無効化
scsi_idコマンド
SCSI接続の記憶装置のWWIDの確認を行えるコマンド。
scsi_id
5.3.3. SSDの管理
SSDはHDDと異なりフラッシュメモリであるためHDDと削除動作が異なる。 SSDはデータを削除しても削除フラグが付けられるだけでデータは削除されない。 削除した箇所に再度書き込みを行う場合は、データを消去して書き込みを行う必要がある。 そのため長時間SSDを利用すると再利用ブロック(削除フラグが付いたブロック)が増えていくにつれてパフォーマンスが低下する。
なおNVMeという新しい規格がSSDでは利用できる。 またNVMeはPCI Express バスから SSD に接続するための規格である。
Trimという機能を使うことでブロックデータも削除するため速度低下が起こりにくくなる。
Trimの実行にはfstrim
コマンドを実行する。
Trimの確認は以下コマンドで行う。
hdparm -I /dev/sda | grep TRIM
また、SSDには書き換え回数の上限があるため頻繁に書き込まないように以下内容に注意する。
- スワップ領域をSSD上に作成しない
- noatimeオプションをつけてファイルシステムにマウントする
- 頻繁に書き込まれる
/tmp
などはRAMディスクを利用する
fstrimコマンド
Trimの実行を行うコマンド。 ファイルシステムで使用していない領域を破棄できる。
fstrim -v /
NVMe
NVMeはSSD接続のための PCI Expressベースのインターフェイス規格。 AHCIと比べ、SSDの性能を十分に発揮できる。
AHCI
AHCIは、IDEに比べてはるかに高速なSATAを活かせるインターフェース仕様として登場した規格。 インテルが策定している。 IDEとの互換性を重視したSATAの規格SATA1.0では速度より互換性が重視され、性能は犠牲となったが、SATA2.0でAHCIは規格化され、SATA本来の機能・性能を満たすことができるようになった。
5.3.4. iSCSI
iSCSIはTCP/IP上でSCSIプロトコルを利用できるようにする仕組み。 クライアント/サーバモデルを採用している。 iSCSIによりネットワーク上のストレージをローカルストレージのように利用できる。 SANを構築できる。
LinuxにおいてはIETやLIO TargetでiSCSIターゲット(iscSIストレージ)を構築できる。 なおデータの要求端末(クライアント)はiSCSIイニシエータと呼ばれる。
用語 | 説明 |
---|---|
ターゲット | iSCSIストレージ |
イニシエータ | iSCSIクライアント |
LUN | ストレージ内の論理ドライブ番号(記憶装置の識別番号) |
HBA | NICに相当するインターフェイスアダプタ |
WWID / WWN | MACAddressに相当する識別ナンバー |
なお設定ファイルはiscsid.conf
となる。
iscsiadmコマンド
iscsiadm [オプション]
オプション | 説明 |
---|---|
-m / –mode [モード] | モードの指定(discovery: 接続先のiSCSIターゲットの取得, node: 登録済みisCSIターゲットの取得, session: セッション一覧の取得) |
-l / –login | iscsiターゲットにログイン |
-u / –logout | iscsiターゲットからログアウト |
-t / –type | タイプの指定 |
-p / –portal=IPアドレス[:ポート] | 接続先の指定 |
-T / –targetname=IQN | iSCSIターゲットの指定 |
SAN
SAN(Storage Area Network)はストレージ専用のネットワークを使用してストレージにアクセスする技術。 物理接続にファイバチャネル、接続にSANスイッチが使用される。
2.6 - 6.ネットワーク管理
6.1. ネットワークの設定
6.1.1. ネットワークデバイス
Linuxではネットワークデバイスを以下のような名称で扱う。
またネットワークインターフェースの確認にはifconfig
コマンドで行える。
インターフェイス | 説明 |
---|---|
eth0 | 1番目のEthernetインターフェイス |
eth1 | 2番目のEtrernetインターフェイス |
ppp0 | 1番目のPPPインターフェイス |
lo | ループバックインターフェイス |
またネットワークインターフェースの命名規則は以下の通り。
種別 | 説明 |
---|---|
en | イーサネット |
wl | 無線LAN |
ww | 無線WAN |
ifconfigコマンド
ネットワークインターフェースの設定/確認が行えるコマンド。
ipconfig
ipconfig [インターフェース] [IPv4アドレス] netmask [サブネットマスク]
ipconfig [インターフェース] [ up | down ]
6.1.2. ARP
EthernetではIPアドレスではなくMACアドレスで通信を行う。そのためIPアドレスをMACアドレスに変換する仕組みであるARPを用いる。 取得したARP情報はARPキャッシュと呼ばれるテーブルに一定時間キャッシュされる。
ARPキャッシュテーブルの表示にはarp
コマンドで可能。
arp [オプション]
オプション | 説明 |
---|---|
-a [ホスト] | 指定したホストすべてのエントリを表示する |
-f ファイル名 | ホスト名とMACアドレスの対応ファイルを読み込む |
-n | ホスト名をIPアドレスを表示 |
-d ホスト | 指定したホストのエントリを削除 |
-i インターフェース | ネットワークインターフェースの指定 |
-s ホスト MACアドレス | ホスト名とMACアドレスの対応を書き込む |
6.1.3. インターフェースの冗長化技術
ボンディング
ボンディングは複数のネットワークインタフェースを1つに束ねる技術のこと。 ボンディングによって帯域幅を増やしたり、1つのNICに障害が発生しても他のNICで運用できるようにインタフェースを冗長化できる。 なおLinuxカーネルにはbondingモジュールが標準で実装されている。
ボンディングではネットワークインタフェースを以下のように分類する。
- マスターインタフェース … bondingで束ねられた仮想インタフェース
- スレーブインタフェース … bondingを構成する個々の物理インタフェース
- アクティブインタフェース … bonding構成の中で実際にパケットの送受信を行うインタフェース
ボンディングの設定例
ボンディングは以下のような設定を2つのマシンに設定する
- マスターインタフェースの追加
nmcli connection add type bond ifname bond0 con-name bond0 mode balance-rr
- スレーブインタフェースの追加
nmcli connection add type bond-slave ifname eth0 con-name bond-slave-eth0 master bond0
nmcli connection add type bond-slave ifname eth1 con-name bond-slave-eth1 master bond0
- マスターインタフェースにIPアドレスを設定
nmcli connection modify bond0 ipv4.method manual ipv4.addresses 192.168.1.1/24
なおmodeオプションでbondingポリシーを設定できる。
ポリシー | 説明 |
---|---|
balance-rr | ラウンドロビンによる送信負荷分散 |
active-backup | 1つのスレーブインターフェースのみがアクティブでもう一つは障害時に切り替え |
balance-xor | 宛先MACに基づいたハッシュによる送信の負荷分散 |
802.3ad | LACPによるリンクアグリゲーション |
balance-tlb | スレーブインターフェースの負荷に応じた送信負荷分散 |
balance-alb | スレーブインターフェースの負荷に応じた送受信負荷分散 |
6.1.4. ネットワーク管理コマンド
Linuxにおけるネットワーク設定/トラブルシューティングに使うコマンドをいくつか記載する。
pingコマンド
指定したホストにICMPパケットを送った際の反応を確認できる。
なおIPv6の場合はping6
コマンドを使う。
ping [ホスト名] [IPアドレス]
オプション | 説明 |
---|---|
-n | ホスト名を指定せずにIPアドレスを表示する |
-c 回数 | 指定した回数のみICMPパケットを送信する |
-i 間隔 | 指定した間隔ごとにICMPパケットを送信する |
-s サイズ | 指定したパケットデータのサイズで送信する |
tracerouteコマンド
指定したホストまでパケットが伝わる経路を表示するコマンド。 ネットワークの途中経路に障害がある場合、障害個所を特定できるコマンドといえる。
なお注意事項としてネットワーク経路上にICMPパケットを返信しないホストが存在する場合は適切な動作は期待できない。
なおIPv6の場合はtraceroute6
コマンドを使う。
traceroute [ ホスト名 | ドメイン名 | IPアドレス ]
オプション | 説明 |
---|---|
-i インターフェース | ネットワークインターフェースを指定する |
-n | ホスト名をIPアドレスで表示する |
mtrコマンド
pingやtracerouteなどのようにICMP等を使って通信の可・不可や経路などを確認することができるコマンド。
mtr -r [IPアドレス | ドメイン名]
tcpdumpコマンド
指定したネットワークインターフェースを監視し、そこに到達したデータをコンソールに表示するコマンド。 用途としては以下の通り。
- 不審な挙動をしているプログラムのデータの送信先の調査など
tcpdump [オプション] [条件式]
オプション | 説明 |
---|---|
-i インターフェース | 監視するインターフェース指定する |
-s バイト数 | パケットから取り出すバイト数の指定 |
-X | 16進数とASCII文字で表示 |
-n | 名前解決せずに表示する(IPアドレスで表示) |
-N | ホストのドメイン名を表示しない |
-l | 標準出力のバッファリング |
-t | 時刻表示しない |
-v | 詳細に出力 |
条件式 | 説明 |
---|---|
port | ポート番号の指定 |
tcp | udp |
src | 指定した送信元からのパケットを対象 |
dst | 指定した送信元へのパケットを対象 |
使用例は以下の通り。
# eth0の53ポートの通信を表示
tcpdump -nil eth0 port 53
netstatコマンド
ネットワーク機能に関する様々な内容を表示するコマンド。 引数なしで実行すると、Active接続とActiveなUnixドメインソケット情報(ローカルホストのプロセス間通信)を表示する。
netstat [オプション]
オプション | 説明 |
---|---|
-a | すべてのソケットを表示 |
-c | 状況を1秒ごとにリアルタイムで定期的に表示する |
-i | ネットワークインターフェースの統計を表示 |
-l | 接続待ち状態にあるソケットのみ表示する |
-n | アドレスやポートを数値で表示 |
-p | PIDとプロセスの表示 |
-r | カーネルのルーティングテーブルの表示 |
-t | TCPを表示 |
-u | UDPを表示 |
ssコマンド
netstat互換のコマンド。機能はnetstat
コマンドとほぼ同じ。
ss [オプション]
オプション | 説明 |
---|---|
-a | すべてのソケットを表示 |
-n | アドレスやポートを数値で表示 |
-p | PIDとプロセスの表示 |
-r | ホスト名の解決 |
-t | TCPの表示 |
-u | UDPの表示 |
-4 | IPv4のみを表示 |
-6 | IPv6のみを表示 |
ncコマンド
ncコマンドはTCP/UDPを使ったネットワークの通信を行うコマンド。 ポートスキャンや通信状態の確認が可能。
nc [ ホスト名 | IPアドレス ] [ポート番号]
なおオプション-vz
を指定することでポータ範囲の指定とポートスキャンが可能。
なおudpの場合はu
を追加する。
ipコマンド
ネットワークインターフェース、ルーティングテーブル、ARPテーブルの管理ができるコマンド。 ipconfig, route, arpコマンドの統合した操作が可能。
ip [オプション] [操作対象] [コマンド] [デバイス]
オプション | 説明 |
---|---|
-s | ステータスの表示 |
-r | 名前解決して表示 |
-f inet/inet6 | プロトコルファミリの指定 |
操作対象 | 説明 |
---|---|
link | データリンク層 |
addr | IPアドレス |
route | ルーティングテーブル |
neigh | ARPキャッシュ |
コマンド | 説明 |
---|---|
show | 指定した対象の情報表示 |
add | 指定した対象にパラメータ指定 |
del | 指定した対象のパラメータ削除 |
使用例は以下の通り。
# IPアドレスの設定
ip addr add 192.168.11.1/24 dev eth0
# GWをルーティングテーブルに追加
ip route add 10.0.0.1/16 via 192.168.11.254
# DGWの設定
ip route add default via 192.168.11.100
6.1.5. ルーティングの設定
Linuxにおいてルーティングテーブルの操作行う場合はroute
コマンドを使用する。
引数なしで実行するとルーティングテーブルが表示される。
routeコマンド
route [オプション]
route [add | del] [-host|-net] [ターゲット] [network ネットマスク] [gw ゲートウェイ] [[dev] デバイス]
オプション | 説明 |
---|---|
-n | ホスト名の解決をしない |
-F | カーネルのルーティングテーブルを表示する |
-C | カーネルのルーティングキャッシュを表示する |
route
コマンドを引数なしで実行すると以下のようにパラメータが表示される。
Destination # 宛先ネットワーク/ホスト
Gateway # ゲートウェイアドレス
Genmask # 宛先ネットマスク
Flags # 経路情報(U:経路が有効 H:宛先はホスト G:ゲートウェイを使用 !:経路は無効)
Metric # 宛先までの距離
Ref # ルートの参照数
Use # 経路の参照回数
Iface # この経路を使うネットワークインターフェース
6.1.6. 無線ネットワークの設定
無線LANの主な規格は以下のようなものがある。
規格 | 周波数帯域幅 | 伝送速度 |
---|---|---|
IEEE802.11a | 5.2GHz | 54Mbps |
IEEE802.11b | 2.4GHz | 11Mbps |
IEEE802.11g | 2.4GHz | 54Mbps |
IEEE802.11n | 2.4GHz/5GHz | 600Mbps |
IEEE802.11ac | 5GHz | 433Mbps~7Gbps |
なお無線LANのセキュリティ方式にはWEPとWPAがある。
- WEP … RC4アルゴリズムで通信を暗号化する(脆弱性あり)
- WPA … TKIPやAESなどの暗号方式やIEEE802.1x認証などから構成される、AESの方がセキュリティ強度が高い
iwconfigコマンド
WLANの設定や状態を確認するコマンド。
iwconfig [wlanN] [essid ESSID] [key [s:]WEPキー]
なおWPA/WPA2の場合は、Wpa_passphrase
コマンドで設定ファイルを作成する。
wpa_passphrase windsor wlan_no_passphrase ] ファイル名.conf
作成した上記ファイルは/etc/wpa_supplicant
以下に保存する。
接続はwpa_supplicant
コマンドで行う。
iwコマンド
無線インターフェースの情報を参照/設定することができるコマンド。
iw dev [デバイス名] [コマンド] # インターフェースに関する表示設定を行う
iw phy [デバイス名] [コマンド] # デバイスに関する表示設定を行う
devのコマンド | 説明 |
---|---|
link | 接続状況の表示 |
scan | 接続可能なAPをスキャン |
connect | disconnect |
phyのコマンド | 説明 |
---|---|
interface add | del |
info | 暗号化や周波数の使用可能状況の表示 |
iwlistコマンド
無線インターフェースの情報を取得できるコマンド。
iwlist 無線インターフェース パラメータ
パラメータ | 説明 |
---|---|
scanning | scan [essid ID] |
channel | 設定可能なチャネルを表示 |
rate | 伝送速度の表示 |
6.2. 高度なネットワークの設定/トラブルシューティング
6.2.1. ネットワーク関連のファイル
Linuxのネットワーク関連の設定ファイルに関して記載する。
/etc/hostname
ホスト名を記載する設定ファイル。
/etc/hosts
ホスト名とIPアドレスの対応表を記述するファイル。 記述方法は以下の通り。
# IPアドレス ホスト名 ホスト名の別名
/etc/networks
ネットワーク名とネットワークアドレスの対応表を記述するファイル。 デフォルトでは未記載。
# ネットワーク名 ネットワークアドレス
/etc/nsswitch.conf
名前解決の問い合わせ順序を記述するファイル。 名前解決の手段は以下の通り。
- /etc/hostsファイルの使用
- DNSサーバの使用
- LDAPサーバの使用
/etc/resolve.conf
問い合わせ先のDNSサーバやドメイン名の設定を記述するファイル。
/etc/sysconfig/network
ネットワーク機能の使用/不使用、ホスト名、デフォルトゲートウェイなどの設定を記述する。 原則RHELL系で使用される。
なおRHEL7/CentOS7系以降ではnmcliコマンドでの設定が推奨されている。 またIPv6はNETWORKING_IPV6で有効化できる。
/etc/sysconfig/network-scripts/
ネットワークデバイスの設定ファイルが設置されるディレクトリ。
/etc/network/interfaces
Debian系で使用されるネットワークデバイスの設定ファイルが設置されるディレクトリ。
6.2.2. NetworkManager
Linuxでネットワークを動的管理する仕組み。
設定ファイルを書き換えてもこのサービスにより書き換えられる可能性があるため、設定する際は無効化するかnmci
コマンドで設定するといった方法が挙げられる。
6.2.3. TCPラッパ
ネットワークサービスに対するアクセス制御を行うプログラム。 デーモン名はtcpd、使用するライブラリはlibwrapとなる。
TCPラッパーには/etc/hosts.allow
、/etc/hosts.deny
という2つの主要なファイルがある。
/etc/hosts.allow
ファイルでアクセス許可の設定を行い、/etc/hosts.deny
ファイルでアクセス拒否の設定を行う。
なお設定ファイルの変更後は再起動しなくても設定は反映される。
これらのファイルの書式は以下の通り。
サービス名 : ホスト名|IPアドレス
具体的には以下のような形となる。
ALL : 192.168.10.0/255.255.255.0 : ALLOW
ALL : ALL : DENY
6.2.4. ネットワークのトラブルシューティング
ネットワークが正常につながらない場合
確認事項は以下の通り。
ping
による疎通確認- DNSサーバの稼働状況/
/etc/resolv.conf
の確認 route
によるルートテーブルの確認
上記でうまくいかない場合はtraceroute
やmtr
による経路確認も行う。
パケット転送許可
Linux OSをルータとして機能させる場合はカーネルパラメータのnet.ipv4.ip_forward
を1にすることでパケット転送を有効化できる。
IPv4の場合は以下で可能。
sysctl -w net.ipv4.ip_forward=1
6.2.5. その他のネットワークのコマンド
nslookupコマンド
DNSでホスト名とIPアドレスを変換するコマンド。
nslookup
digコマンド
nslookup
より詳細に行う。
hostnameコマンド
自身のホストに関する詳細を調べられるコマンド。
hostname [オプション]
オプション | 説明 |
---|---|
なし | ホスト名を表示 |
-d | DNSドメイン名の表示 |
-i | IPアドレスを表示 |
-f | FDQNを表示(完全修飾ドメイン名を表示) |
-a | エイリアスを表示 |
nmapコマンド
詳細が不明なネットワークの構造を調査したり、セキュリティ上の問題がないかを検査する目的で、ネットワークのスキャンを行うことができるコマンド。
nmap [スキャンタイプ] [オプション] 対象
スキャンタイプ | 説明 |
---|---|
-sT | TCPスキャン |
-sU | UDPスキャン |
-sP | Pingスキャン |
オプション | 説明 |
---|---|
-p | 対象ポート範囲の指定 |
-F | 有名ポートを対象に高速スキャン |
-O | 対象ホストのOS識別を行う |
2.7 - 7.システムのメンテナンス
7.1. ソースからのインストール
7.1.1. ソースの展開
Linuxのソフトウェアはアーカイブ形式で配布される。
アーカイブはtar
コマンドで作成された後、gzip
、bzip2
、xz
を使って圧縮される。
アーカイブの展開と回答は以下の通り。
tar zxvf [圧縮ファイル] # .gzの場合
tar jxvf [圧縮ファイル] # .bz2の場合
tar Jxvf [圧縮ファイル] # .xzの場合
- .gzの場合 …
gunzip
、gzip
- .gzipの場合 …
bunzip2
、bzip2
- .xzの場合 …
unxz
、xz
アーカイブの中には以下の内容が含まれることが多い。
- ソースファイル … C言語などで書かれたソースコード
- ヘッダファイル … C言語のヘッダファイル
- configureファイル … コンパイルに必要な環境をチェックするスクリプト
- ドキュメント … インストールの手順/注意事項が書かれたファイル
ソースファイルが含まれたアーカイブを展開した後、以下の手順でコンパイルからインストールを行う。
- ./configure
- make
- su (必要の場合)
- make install
なおインストール(make install
)後にプログラムを起動するとき、環境変数LD_LIBRARY_PATH
が正しく設定されていないと、プログラムの実行に必要な共有ライブラリを読み込むことができず、起動に失敗する事がある。
patchコマンド
差分ファイル(パッチファイル)を既存のソースコードに適用してソースコードをバージョンアップするコマンド。
patch [オプション] < [パッチファイル]
cat [パッチファイル] | patch [オプション]
オプション | 説明 |
---|---|
-d ディレクトリ | 指定したディレクトリに移動して処理を行う |
-p | パッチファイル内に書かれたパス名を修正する(-p0: パス名を修正しない, -p1: 最後の/まで削除する, -p2: 次のディレクトリまで削除する) |
-C | どういう処理を行うかテストする |
-R | パッチの適用を取り消して戻す |
7.1.2. Makefileの作成
Makefileはconfigure
スクリプトにより、プログラムをコンパイルする際に必要な寛容をチェックし環境に合わせたファイル。
カレントディレクトリにあるスクリプトの実行はファイル名に./
を付ける。
なおconfigureの主なオプションは以下の通り。
オプション | 説明 |
---|---|
–help | 説明を表示する |
-prefix=ディレクトリ | インストール先のトップディレクトリを指定する |
7.1.3. コンパイルとインストール
makeコマンド
Makefileに従ってソースコードをコンパイル、リンクするコマンド。
なおコンパイル後はsudo make install
でインストールする。
この際のinstall
はターゲットと呼ばれる。
make [オプション] [ターゲット]
オプション | 説明 |
---|---|
-C ディレクトリ | 指定したディレクトリに移動してから処理を実行する |
–file=ファイル | Makefileを指定する |
-j N | 同時にNのジョブを並行して実行する |
またmakeのターゲットは以下のようなものがある。
ターゲット | 説明 |
---|---|
all | コンパイルを行う(デフォルト) |
install | ソフトウェアのインストール |
uninstall | アンインストールする |
clean | コンパイル時に生成された一時ファイルを削除する |
なおインストールしたものは/usr/local/bin
や/usr/localsbin
などに配置された。
7.2. バックアップ
7.2.1. バックアップの種類
完全バックアップ(フルバックアップ)
すべてのファイルを対象としてバックアップを行うもの。 特徴は以下の通り。
- バックアップに時間がかかる
- バックアップに必要な容量も大きい
差分バックアップ
前回のフルバックアップ以後に作成/変更されたファイルのみをバックアップする。 特徴は以下の通り。
- フルバックアップより処理に時間がかからない
- バックアップ後にはフルバックアップと最新の差分バックアップが必要
増分バックアップ
前回のバックアップ(フルバックアップ/差分バックアップ/増分バックアップ)以後に作成/変更されたファイルのみをバックアップする。 特徴は以下の通り。
- 3種類で最も処理時間が短い
- 復元にはフルバックアップ/それ以降の増分バックアップが必要
7.2.2. バックアップデバイス
バックアップに利用できるデバイスには以下のようなものがある。
CD-R/RW リムーバブルハードディスク
CD-R/RWは安価で容量が小さい。 リムーバブルハードディスクは高速で大容量で高価となる。
DVD-R/RW
DVD-R/RWはCD-R/RWより大容量なディスク。 容量は4.7GB~8.54GBほど。
BD-R/RE
BD-R/REはDVD-R/RWよりも大容量なメディア。 容量は約25GB~50GBほど。
特徴は以下の通り。
- BD-Rは一度のみ書き込み/追記が可能
- BD-REは繰り返し書き換えできる
磁気テープ
大容量で低価格のメディア。 容量は規格により異なり、また定期的に取り換える必要がある。
規格 | 容量 |
---|---|
DDS4 | 40GB(圧縮時) |
SuperDLT-300 | 320GB(圧縮時) |
LTO Ultrium3 | 800GB(圧縮時) |
7.2.3. オンサイトとオフサイト
バックアップの保管場所にはオンサイトとオフサイトのバックアップがある。
- オンサイト … バックアップ対象のシステムと同一拠点にバックアップを保管する
- オフサイト … 別拠点にバックアップを保管する
ネットワーク経由のバックアップ
ツールではAMANDA, Balcula, BackupPC, Bareosなどでネットワーク経由でバックアップ可能。 またストレージ用のネットワーク構築にはSANが使用される。
- AMANDA … 1台のAmandaサーバでネットワーク内の複数のクライアントをテープ/ディスクドライブにバックアップ可能
- Balcula … 1台のBaculaサーバでネットワーク内の複数のクライアントを様々な記録メディアにバックアップ可能、CUI/GUIを使える
- BackupPC … いくつかの標準プロトコルを利用するのでクライアント不要のバックアップツール、WebUIを使用可能
- Berous … Baculaプロジェクトから派生したバックアップツール
7.2.3. ローカルのバックアップ
tarコマンド
tarコマンドはファイルやディレクトリを1つのアーカイブファイルにしたり、圧縮/展開するコマンド。
デフォルトで圧縮しないため、tarコマンドで圧縮を行うためには-z
オプションや、-j
オプションを指定する必要がある。
tar [オプション] [ファイル]
オプション | 説明 |
---|---|
-c | アーカイブの作成 |
-x | アーカイブからファイルの取り出し |
-t | アーカイブの内容の確認 |
-f ファイル名 | アーカイブファイル名の指定 |
-z | gzip による圧縮 ・ 展開 |
-j | bzip2 による圧縮 ・ 展開 |
-J | 7zip による圧縮 ・ 展開 |
-v | 詳細な情報の表示 |
-u | アーカイブ内にある同じ名前のファイルより新しいものだけを追加 |
-r | アーカイブにファイルの追加 |
-N | 指定した日付より新しいデータのみを対象とする |
-M | 複数デバイスへの分割 |
–delete | アーカイブからファイルの削除 |
使用例は以下の通り。
tar jcf /dev/sdb1 - # USBメモリにホームディレクトリ
cpioコマンド
ファイルをアーカイブファイルにコピーしたり、アーカイブからファイルをコピーできるコマンド。
cpio [フラグ] [オプション]
フラグ | 説明 |
---|---|
-i オプション パターン | アーカイブからファイルを抽出 |
-o オプション | アーカイブの作成 |
-p オプション ディレクトリ | ファイルを別のディレクトリにコピー |
オプション | 説明 |
---|---|
-A | 既存のアーカイブファイルに追加 |
-d | 必要な場合にディレクトリの作成 |
-r | ファイルを対話的に変更 |
-t | コピーせず、入力内容の一覧表示 |
-v | ファイル名の一覧表示 |
使用例は以下の通り。
ls | cpio -o > /tmp/backup
ddコマンド
入力側に指定したファイル内容をファイルもしくは標準出力に送るコマンド。 デバイス間のディスクコピーやブートドライブの作成に利用可能。
dd [オプション]
オプション | 説明 |
---|---|
if=入力ファイル | 入力側の指定(標準は標準入力) |
of=出力ファイル | 出力側ファイルの指定(標準は標準出力) |
bs=バイト数 | 入出力のブロックサイズを指定 |
count=回数 | 回数分の入力ブロックをコピーする |
ddコマンドでは入力に以下のいずれかの特殊ファイルを指定してデータの上書きを行える。 格納されたデータを消去することが可能。
/dev/zero
… 16進数のデータ「0x00」を生成する特殊ファイル/dev/urandom
… 擬似乱数を生成する特殊ファイル
dumpコマンド
ファイルシステム単位でext2/ext3/ext4ファイルシステムをバックアップするコマンド。 バックアップからファイルを取り出すときなどに使用でき、磁気テープにバックアップを取る際に適している。
dump [オプション] [バックアップ対象]
オプション | 説明 |
---|---|
0~9 | dumpレベルを指定する(0は完全バックアップ) |
u | バックアップ実装時に/etc/dumpdates を更新する |
f デバイス名 | バックアップ装置のデバイスを指定する |
dumpレベルの指定で増分バックアップが可能。
なお増分バックアップを行う際はu
オプションの指定し、バックアップの記録を/etc/dumpdates
に記録する必要がある。
dump 0uf /dev/st0 /dev/sda4
磁気テープの命名規則には以下のような特徴がある。
/dev/st0
… 自動巻き戻しをする/dev/nst0
… 自動巻き戻しをしない
restoreコマンド
dumpコマンドで作成したバックアップからファイルやディレクトリを取り出すコマンド。
restore [オプション] [ファイル名]
オプション | 説明 |
---|---|
r | すべてのファイルを取り出す |
i | 対話的にファイルを取り出す |
f デバイス名 | バックアップ装置のデバイスを指定 |
mtコマンド
テープドライブを操作するコマンド。
mt [-f デバイス] [オペレーション]
オペレーション | 説明 |
---|---|
status | テープの状態を表示 |
tell | テープの現在地の表示 |
rewind | テープを先頭に巻き戻す |
fsf N | テープをN個先のデータを先頭位置まで早送りにする |
compression 1 | ハードウェア圧縮を使用する |
compression 0 | ハードウェア圧縮を使用しない |
使用例は以下の通り。
# テープの現在地から3つ先にあるデータの先頭位置までテープを早送り
mt -f /dev/st0 fsf 3
7.2.4. ネットワーク経由でのバックアップ
rsyncコマンド
リモートホスト間でファイルやディレクトリをコピーできるコマンド。
rsync [オプション] [ホスト名:] バックアップ元ディレクトリ [ホスト名:] バックアップ先ディレクトリ
オプション | 説明 |
---|---|
-v | コピー中のファイルを表示 |
-a | アーカイブモード(属性もそのままコピー) |
-r | ディレクトリ内を再帰的にコピーする |
-u | 変更/追加されたファイルのみをコピーする |
-l | シンボリックリンクをそのままコピーする |
-H | ハードリンクをそのままコピーする |
-o | 所有者をそのまま維持 |
-g | 所有グループをそのまま維持 |
-t | タイムスタンプをそのまま維持する |
-n | テスト |
-z | ファイルを圧縮する |
-delete | コピー元ファイル削除コピー先でも削除する |
使用例は以下の通り。
# ローカルホスト内でdirディレクトリを/backupディレクトリ内にコピー
rsync -auv --delete dir /backup
# ローカルホスト内でdirディレクトリ内のファイルを/backupディレクトリ内にコピー
rsync -auv --delete dir/ /backup
# host12の/backupに差分保存する例
rsync -auvz --delete -e ssh dir host12:/backup
7.3. ユーザのシステム管理情報の通知
7.3.1. ログイン前後にメッセージの送信
ログイン後と前のメッセージ
ログイン前のメッセージ表示は/etc/issue
に、ログイン後のメッセージ表示は/etc/motd
を使うことで可能。
具体的にはメンテナンス予定やサービス停止連絡/新しいソフトウェア情報などを告知する際に使用する。
システム情報の表示
ログインプロンプト表示前にシステム情報やメッセージは/etc/issue
に表示される。
記述する方法は「\r」でカーネルバージョン、「\m」でマシンアーキテクチャ、「\n」でホスト名、「\l」は端末名を表す。
7.3.2. ログイン中のユーザへのメッセージ送信
wallコマンド
wall
コマンドによるメッセージ送信はログイン中のユーザに一斉に送信できる。
wall "コメント"
shutdown -kコマンド
shutdown -k
コマンドでも指定したメッセージを伝える。
shutdown -k now "メッセージ"
mesgコマンド
使用中のターミナルへ他のユーザがwriteコマンドやtalkコマンドでメッセージを送信できるかどうかを制御できるコマンド。
mesg [y | n]
talkコマンド
指定したログイン中のユーザとチャットができるコマンド。
talk ユーザ[@ホスト]
writeコマンド
コマンドの後に入力したメッセージを指定したユーザのターミナルに1行ずつ送信するコマンド。
write ユーザ [tty]
2.8 - 8.DNS
8.1. DNSの基礎知識
8.1.1. 名前解決
DNSサーバはホスト名とIPアドレスを相互に変換する名前解決という仕組みを提供する。 ホスト名からIPアドレスを求めることは正引き、その逆を逆引きと呼ぶ。
ホスト名はコンピュータに付けられた固有の名前。
ドメイン名(XX.comなど
)はホストの所属するネットワーク上の区画を表す。
www.XX.com
などはFDQN(完全修飾ドメイン名)と呼ばれる。
8.1.2. DNSの仕組み
LinuxにおけるDNSによる名前解決(www.XX.com
の例)の手順は以下の通り。
- Webサーバやアプリは名前解決ライブラリのリゾルバに名前解決を依頼する
- リゾルバは
/etc/resolv.conf
に指定されているDNSサーバAに問い合わせを行う - DNSサーバAはルートDNSサーバに問い合わせを行う
- ルートDNSサーバは
www.XX.com
を知らない代わりに、.com
管轄のDNSサーバCの情報を返す - DNSサーバAはDNSサーバCに対し問い合わせる
- DNSサーバCは名前解決対象のドメイン名を知らない代わりに、
XX.com
管轄のDNSサーバDの情報を返す - DNSサーバAはDNSサーバDに対し問い合わせる
- DNSサーバDは
www.XX.com
のIPアドレスを返す - DNSサーバAは得られた情報をキャッシュしリゾルバに送信する
- リゾルバは得られたIPアドレスをWebブラウザやアプリに知らせる
8.1.3. DNSサーバ
BIND
BIND(ISC DNS)はDNSサーバソフトウェアであり、多くのLinuxディストリビューションで採用されている。 BINDのサーバデーモンはnamedである。
/etc/dhcpd.conf
BIND以外のDNSサーバ
名前 | 説明 | 設定ファイル |
---|---|---|
dnsmasq | DNS/DHCPサーバ機能を提供する軽量ソフトウェア | /etc/dnsmasq.conf |
PowerDNS | コンテンツサーバ/キャッシュサーバ機能を提供する。DNSのキャッシュサーバやDHCPサーバなどの機能を持つ | /etc/pdns/pdns.conf |
djbdns | DNSのキャッシュサーバとコンテンツサーバの機能が分かれているDNSサーバ。RDBは使用できない | /var/djbdns/dnscache/以下 |
ゾーン
ゾーンはDNSサーバが管轄するドメインの範囲のこと。 ゾーンを管理できる権威を持っていることは権威を持つと呼ぶ。
また下位のDNSサーバに対しゾーン管理を移すことは委譲と呼ぶ。
マスタDNSサーバ/スレーブDNSサーバ
- マスタDNSサーバ
- ゾーンファイルを所有するDNSサーバ
- スレーブDNSサーバ
- マスターDNSサーバのゾーン情報をコピーするDNSサーバ
なおマスタDNSサーバからスレーブDNSサーバへゾーン情報をコピーすることはゾーン転送と呼ばれる。
再帰的な問い合わせ
再帰的な問い合わせは最終的な結果を要求するDNS問い合わせのこと。 無条件に再帰的に問い合わせを許可すると、第3者からの問い合わせに回答しなくならないため、自ドメインからのみの問い合わせに対し許可をする。
8.1.4. DNSクライアントコマンド
nslookupコマンド
IPを調べたり、DNSサーバに問い合わせなどを行えるコマンド。
nslookup [オプション] [ホスト名|ドメイン名|IPアドレス]
オプション | 説明 |
---|---|
-type=レコード | レコードタイプの指定 |
-norescue | 再帰的問い合わせをしない |
hostコマンド
DNSサーバを用いてホスト/ドメインに関する情報を表示するコマンド。 デフォルトでホスト名/IPアドレスの変換のみを行い、またDNSによる名前解決の確認に利用される。
host [オプション] ホスト名|ドメイン名|IPアドレス [問い合わせDNSサーバ]
オプション | 説明 |
---|---|
-t タイプ | リソースレコードタイプの指定 |
-v | 詳細情報の表示 |
digコマンド
詳細な情報をDNSサーバから取得できるコマンド。
dig [@問い合わせ先DNSサーバ] ホスト名|ドメイン名|IPアドレス [クエリタイプ]
オプション | 説明 |
---|---|
-x | 指定されたIPアドレスの逆引きを行う |
-p ポート番号 | 問い合わせ先のポート番号を指定(53番がデフォルト) |
クエリタイプ | 説明 |
---|---|
a | ホスト名に対応するIPアドレス(デフォルト) |
ptr | IPアドレスに対応するホスト名 |
ns | DNSサーバ |
mx | メールサーバ |
soa | SOAレコード情報 |
hinfo | ホスト情報 |
axfr | ゾーン転送 |
txt | 任意の文字列 |
any | すべての情報 |
なお問い合わせ後に表示されるflagsには以下のようなものがある。
フラグ | 説明 |
---|---|
qr | 問い合わせに対する回答 |
aa | 権威のある回答 |
rd | 再帰検索を希望 |
ra | 再帰検索が可能 |
また回答の表示されるセクションは4つに分かれる。
- QUSETION SECITION
- 問い合わせ内容の表示
- ANSWER SECTION
- 問い合わせの回答内容の表示
- AUTHORITY SECTION
- 問い合わせ先に権威がある場合に表示
- ADDITIONAL SECTION
- 回答したホストのIPアドレスなど追加情報が表示
8.2. BINDの基本設定
BINDの設定は/etc/named.conf
とゾーンファイルで構成される。
8.2.1. /etc/named.conf
// rndcコマンドによるnamedの操作を許可するホストの指定
controls {
inet 127.0.0.1 allow { localhost; };
};
// ゾーンファイルを格納するディレクトリ指定
options {
directory "/var/named";
};
// ルートDNSサーバの指定
zone "." {
type hint;
file "named.ca";
};
// ローカルホストの正引き設定
zone "localhost" {
type master;
file "0.0.127.in-addr.zone";
};
// ローカルホストの逆引き設定
zone "0.0.127.in-addr.arpa" {
type master;
file "0.0.127.in-addr.arpa.zone";
};
// example.netドメインの正引き設定
zone "example.net" {
type master;
file "example.net.zone";
};
// example.netドメインの逆引き設定
zone "30.20.10.in-addr.arpa" {
type master;
file "30.20.10.in-addr.arpa.zone";
}
また/etc/named.confのステートメントは以下の通り。
ステートメント | 説明 |
---|---|
acl | ACLの定義 |
controlls | namedを操作できるホストの設定 |
include | 外部ファイルの読み込み |
key | 認証情報の設定 |
options | namedの操作に関する詳細設定 |
zone | ゾーンの定義 |
aclステートメント
アクセス制御リスト(ACL)を定義する。 アドレスマッチリストにはIPアドレス/ネットワークアドレスを記述する。
acl acl名 {
アドレスマッチリスト
};
なお定義済みACLは以下の通り。
- any … すべてのIPアドレス
- localhost … ローカルホストが使用しているIPアドレス
- none … いずれのIPアドレスともマッチしないアドレス
includeステートメント
指定した外部ファイルを読み込む。
include "/etc/rndv.key";
optionsステートメント
namedの動作に関する詳細なオプションを設定する。 利用可能なオプションは以下の通り。
重要なパラメータは太字にしてある。
オプション | 説明 |
---|---|
directory ディレクトリパス | ゾーンファイルを格納するディレクトリ |
datasize | データセグメントサイズの上限 |
coresize | コアファイルのサイズ上限 |
max-cache-size キャッシュサイズ | 最大キャッシュバイト(Byte単位) |
rescursion Yes|No | 再帰問い合わせの受け付け有無 |
rescusive-clients クライアント数 | 再帰問い合わせの最大同時接続数 |
allow-query | 問い合わせを受け付けるホスト |
allow-transfer | ゾーン転送を許可するホスト |
allow-update | ゾーン情報の動的アップデートを受け付けるホスト |
blackhole | 問い合わせを受け付けないホスト |
forwarders { IPアドレス; } | 問い合わせの回送先DNSサーバ |
forward only|first | 問合せ転送の失敗時の動作を設定する |
notify | ゾーンデータの更新をスレーブサーバに通知するかの有無 |
version | バージョン表示 |
なおフォワード(回送)は自身がゾーン情報を保存せず、キャッシュもない場合に問い合わせがあれば別のDNSサーバに問い合わせる機能のこと。
controllsステートメント
namedを操作できるホストのIPアドレス/ポート番号を指定する。
controls {
inet 127.0.0.1 allow { localhost; }
};
zoneステートメント
ゾーン名、ゾーンタイプ、ゾーンファイルの場所を指定する。 ゾーンタイプは以下の通り。
タイプ | 説明 |
---|---|
hint | ルートDNSサーバの指定 |
master | 指定したゾーンに対してのマスタDNSサーバ |
slave | 指定したゾーンに対してのスレーブDNSサーバ |
zone "example.com" {
type master;
file "example.net.zone";
};
named.confの設定
ルートDNSサーバのIPアドレスを最新情報に変更するには以下のように操作する。
dig @m.root-servers.net. ns > /var/named/[hint情報ファイル]
named-checkconfigコマンド
named.confの設定の構文チェックを行うコマンド。
named-checkconf [named.confのパス]
chrootしている場合は-t
オプションでchrootディレクトリパスを指定する。
named-checkconf -t [chrootのパス] [named.confのパス]
8.2.2. rndcコマンド
namedの操作を行うコマンド。
named [サブコマンド]
サブコマンド | 説明 |
---|---|
stop | namedの終了 |
refresh | ゾーンデータべースのリフレッシュ |
stats | 統計情報をnamed.stats に書きだす |
status | namedのステータスを表示する |
dumpdb | キャッシュの内容をファイル出力する |
reload ドメイン | 指定したゾーンファイルを再読み込みする |
halt | namedを停止する |
8.3. ゾーンファイルの管理
DNSサーバは複数ゾーンの管理ができ、ゾーン情報はゾーンごとにゾーンファイルに記載する。
ゾーンファイルはnamed.conf
で指定した数だけ必要になる。
ゾーンファイルの種類は以下の通り。
種類 | 説明 |
---|---|
hint情報ファイル | ルートDNSサーバ一覧 |
正引きファイル | ホスト名からIPアドレスの対応関係を記述 |
逆引きファイル | IPアドレスからホスト名への対応関係を記述 |
また書式は以下の通り。
名前 [TTL値] IN リソースレコードタイプ 値
8.3.1. リソースレコード
ソースファイルに記述する内容は以下の通り。
$ORIGIN
… レコードで補完するドメイン名の指定$TTL
… 他のDNSサーバがゾーンデータをキャッシュする時間の指定
またリソースレコードではゾーン情報を記述する。
ドメイン名はFDQNで指定し、最後に.
をつける。
リソースレコードのタイプは以下の通り。
リソースレコードタイプ | 説明 |
---|---|
SOA | 管理情報の記述 |
NS | ゾーンを管理するDNSサーバを記述 |
MX | メールサーバを記述(正引きのみ) |
A | ホスト名に対するIPアドレスを記述(正引きのみ) |
AAAA | ホスト名に対するIPv6アドレスを記述(正引きのみ) |
CNAME | ホスト名の別名に対するホスト名を記述(正引きのみ) |
PTR | IPアドレスに対するホスト名を記述(逆引きのみ) |
TLSA | デジタル署名されたレコード。サーバ認証に使われる証明書や鍵の情報がドメイン名に対して関連付けられてDANE(DNSを使った認証の仕組み)で用いられる |
SOAレコード
ゾーンに関する基本情報を記載する。
名前 IN SOA DNSサーバ メールアドレス (
[値] ;Serial
[値] ;Refresh
[値] ;Retry
[値] ;Expire
[値] ;Negative TTL
)
項目 | 説明 |
---|---|
Serial | シリアル番号の記述 |
Refresh | マスタDNSサーバのゾーン情報変更をスレーブDNSサーバがチェックする間隔の指定 |
Retry | スレーブDNSサーバがマスタDNSサーバにアクセスできないときに何秒後に再試行するかの指定 |
Expire | スレーブDNSサーバがマスタDNSサーバにアクセスできないときに何秒後にゾーン情報を破棄するかの指定 |
Negative TTL | 存在しないドメインに対するキャッシュの有効期限の設定 |
NSレコード
DNSサーバをFDQNで指定する。 DNSサーバ1つにつき1つずつ記述する。
名前 IN NS DNSサーバ名
MXレコード
MXレコードはメールサーバがメールを送る際に参照するもの。
名前 IN MX プリファレンス値 メールサーバ名
プリファレンス値は値が小さいほど優先度が高い。 「10」ずつ値を区切るのが一般的となる。
Aレコード
ホスト名に対するIPアドレスを指定する。
ホスト名 IN A IPアドレス
AAAAレコード
ホスト名に対するIPv6アドレスを指定する。
ホスト名 IN AAAA IPv6アドレス
CNAMEレコード
ホスト名の別名を記述する。
別名 IN CNAME ホスト名
PTRレコード
IPアドレスに対するホスト名を記述する。
IPアドレス.in-addr-arpa. IN PTR ホスト名
なおIPv6の場合は4bitごとに「.」を挿入、「:」を削除記載する。
8.3.2. ゾーンファイルの設定
named-checkzoneコマンド
ゾーンファイルの構文チェックを行うコマンド。
named-checkzone [オプション] ゾーン名 ゾーンファイル名
オプション | 説明 |
---|---|
-t ディレクトリ | chrootしている場合のディレクトリ指定 |
-w ディレクトリ | ゾーンファイルのディレクトリ指定 |
named-compilezoneコマンド
バイナリデータのゾーンファイルの内容を確認できるコマンド。
named-compilezone
8.4. DNSサーバのセキュリティ
8.4.1. 通常のセキュリティオプション
named.conf
の設定で強化できるセキュリティ設定をいくつか記載する。
ゾーン転送の制限
スレーブDNSサーバはマスタDNSサーバからゾーン情報を転送する必要があるが、スレーブDNSサーバ以外はその必要がない。 ゾーン転送をスレーブDNSサーバのみに限定する場合は以下のように行う。
zone "example.net" {
allow-transfer { 192.168.128.3; };
};
この設定により、ゾーン情報の全体を外部から問い合わせることが制限できる。
DNS問い合わせの制限
DNS問い合わせの制限は不要なDNSサーバ利用を阻止することが可能。 また再帰的な問い合わせの禁止は不正なキャッシュデータをDNSサーバに送りつけるキャッシュ汚染攻撃を回避することができる。
; 192.168.120.0/24からの問い合わせ/再帰的な問い合わせの許可
options {
allow-query { 192.168.120.0/24; };
allow-rescursion { 192.168.120.0/24; };
};
; 以下のゾーンはすべてのホストからの問い合わせの許可
zone "example.net" {
allow-query { any; };
};
zone "192.168.120.in-addr.arpa" {
allow-query { any; };
};
バージョン番号の秘匿
dig
コマンドによりBINDのバナー情報として表示することができる。
そのためバージョンを秘匿するにはoptions
オプション内でversion
オプションに任意の文字列を指定する。
options {
version "unknown DNS Server";
};
root以外によるnamedの実行
root権限以外でnamedを実行すれば、DNSサーバがクラッカーにより侵入されたとしても被害を最低限に抑えることができる。 BINDをパッケージでインストールするとnamedユーザが生成され、その権限で実行されることになる。
確認はps -f -C named
で可能。
chrootを使用することでさらに侵入されたときの被害をおさえることができる。
chroot: 任意のディレクトリをプロセスにとっての「
/
」と扱うことで、そのディレクトリ以外をアクセスできないようにする手法
この場合、namedの運用に必要なファイルはchrootディレクトリ以下に配置する必要がある。
8.4.2. DNSSEC/TSIG
DNSの仕組み強化の仕組みにはDNSSEC/TSIGなどがある。
DNSSEC(DNS Security)はゾーン情報の信頼性を保証するための仕組みで、具体的にはゾーン情報に公開鍵暗号方式の電子署名を行うことでゾーン情報が改ざんされていないこと、DNS応答が正当な管理者により行われることを保証する。 DNSSECの利用にはDNSサーバ/クライアント両方対応している必要がある。
DNSSECの仕組みは以下の通り。
- ゾーン情報のハッシュ値(DS)とDNSサーバの秘密鍵で暗号化したものを電子署名とする
- DNS問い合わせの際にゾーン情報/電子署名をクライアントに送信する
- クライアントは電子署名をDNSサーバの公開鍵で復号する
- ゾーン情報のハッシュ値と電子署名の復号結果が一致すれば保証
この仕組みを順につなげることで信頼性のあるDNSのつながりが完成する。
またゾーン情報に電子署名を行う鍵をZSK(Zone Security Key)、ZSKに電子署名を行う鍵をKSK(Key Signing Key)と呼ぶ。 BIND 9.3.0以降でDNSSECは対応している。
DNSSECの設定
DNSSECをBINDで実装する手順は以下の通り。
- ZSK鍵ペアを作成する(ゾーンファイルを格納しているディレクトリで行う)
- 例:
dnssec-keygen -r /dev/random -a RSASHA256 -b 1024 -n zone example.net
- 上記により公開鍵と秘密鍵が生成される(生成されたファイル名最後5桁は鍵ID)
- 例:
- KSK鍵ペアを作成する
- 例:
dnssec-keygen -r /dev/urandom -f KSK -a RSASHA256 -b 2048 -n zone example.net
- 上記により公開鍵と秘密鍵が生成される(生成されたファイル名最後5桁は鍵ID)
- 例:
- ゾーンファイルに生成した公開鍵が読みこまれるように設定する
$INCLUDE "鍵ファイル名"
dnssec-signzone
コマンドによりゾーンファイルに署名を行う- 例:
dnssec-signzone -o example.net example.net.zone
- 署名後に
ゾーン名.signed
(署名ファイル)が生成される
- 例:
なお上位ゾーンへ管理する組織へDSレコード登録を申請する必要がある。
TSIGの設定
TSIG(Transaction SIGnatures)は共有秘密鍵の利用によりマスタDNSサーバになりすまし、偽のゾーンデータをスレーブDNSサーバに送ることや、ゾーンファイルを改ざんする攻撃を防ぐための仕組みのこと。 これはマスタDNSサーバ/スレーブDNSサーバがゾーン転送によりゾーンデータを同期することの性質によるもの。
TSIGの設定は以下の通り。
dnssec-keygen
コマンドにより共有鍵ファイルの作成- 例:
dnssec-keygen -a HMAC-MD5 -b 128 -n HOST tsig-key
- 例:
named.conf
に共有鍵ファイルを記載する
マスタDNSサーバの例(tsig-keyは鍵名)
key "tsig-key" {
alogorithm hmac-md5;
secret "keyの中身":
};
zone "example.net" {
type master;
file "example.net.zone";
allow-transfer { 192.168.1.100; };
};
スレーブDNSサーバの例(tsig-keyは鍵名)
key "tsig-key" {
alogorithm hmac-md5;
secret "keyの中身":
};
server 192.168.1.25 {
keys { tsig-key; };
};
zone "example.net" {
type slave;
file "example.net.zone";
};
8.4.3. DANE
DANE(DNS-based Authentication of Named Entitie)はDNSSECの技術を応用して認証情報をDNSベースでやり取りする仕組み。 DNSSECにより、リソースレコードの正当性確認の仕組みがDNSに組み込まれたため、HTTPSなどで使われるX509の証明書とドメインの紐づけの役割を、認証局からDNSに移すことを目的にし、策定されている。
デジタル署名されたレコードをTLSAレコードと呼び、webのHTTPSで使用されるTLSと技術的には同じ方法を用いて、信頼の基盤を認証局からDNSSECに変更する。
2.9 - 9.Webサーバとプロキシサーバ
9.1. Webサーバの設定
9.1.1. Apache
Apache(Apache HTTP Server)はOSSのWEBサーバの1つ。 Apacheの2.0系ではMPMへの対応やIPv6への対応が行われた。 また、2.2系ではキャッシュの改善や負荷分散機能の追加などが行われた。
MPM(Multi Processing Module):MPMにはprefork, worker, perchild, eventがある。
- preforkは1.3系と同じマルチプロセスモデルでリクエストごとにプロセスを割り当てる
- workerはスレッド対応モデルでクライアントのリクエストを子プロセスで処理し、処理増大で子プロセスを増やす
- perchildはバーチャルホスト向けのスレッド対応で子プロセスを固定し負荷に応じてスレッドを増減する
- eventはworkerと似た機能であるがkeepaliveの処理が異なる
なおCentOS7系の場合はApacheのMPMはpreforkとなる。
Apacheのインストール方法
Apacheのインストール方法は2通り。
- ディストリビューションごとのパッケージを利用する方法
- RedHat系:
yum install httpd
- Debian系:
apt-get install apache2
- RedHat系:
- ソースからコンパイルして使用する方法
configure
make
make install
またconfigure
の役立つオプションは以下の通り。
オプション | 説明 |
---|---|
–prefix=ディレクトリ | インストール先のディレクトリ |
–sysconfdir=ディレクトリ | 設定ファイルのディレクトリ |
–enable-module=モジュール | 標準モジュールの組み込む |
–disable-module=モジュール | 標準モジュールを組み込まない |
–enable-shared=モジュール | 標準モジュールをDSOで組み込む |
–diable-shared=モジュール | 標準モジュールをDSOで組み込まない |
使用例は以下の通り。
# インストールディレクトリの指定とsshモジュールの有効化
./configure --prefix=/usr/local/apache --enable-module=ssl
9.1.2. Apacheの基本設定
Apacheのメイン設定ファイルはhttpd.confとなる。 Apacheの主な設定ファイルのディレクトリは以下の通り。
ソースからインストールした場合
ファイル/ディレクトリ | 説明 |
---|---|
/usr/local/apache2/conf/httpd.conf | メインの設定ファイル |
/usr/local/apache2/conf/extra | 補助の設定ファイルを保存するディレクトリ |
httpd-language.conf | 言語/文字コードの設定 |
httpd-userdir.conf | 一般ユーザのホームディレクトリ設定 |
httpd-info.conf | server-info, server-statusの設定 |
httpd-vhosts.conf | バーチャルホストの指定 |
httpd-default.conf | デフォルトのサーバ全般設定 |
httpd-ssl.conf | SSL/TLSの設定 |
Red Hat系でインストールした場合
ファイル/ディレクトリ | 説明 |
---|---|
/etc/httpd/conf/httpd.conf | メインの設定ファイル |
/etc/httpd/conf.d/ | 補助の設定ファイルを保存するディレクトリ |
ssl.conf | SSL/TLS設定ファイル |
php.conf | PHPモジュールの設定 |
perl.conf | Perlモジュールの設定 |
Debian系でインストールした場合
ファイル/ディレクトリ | 説明 |
---|---|
/etc/apache2/apache2.conf | メインの設定ファイル |
/etc/apache2/ | 補助の設定ファイルを保存するディレクトリ |
/etc/apache2/ports.conf | ポートの設定 |
/etc/apache2/sites-enabled/ | サイト定義ファイルのリンク |
/etc/apache2/sites-avaiable/ | サイト定義ファイル |
httpd.confの設定項目
httpd.confの設定項目はディレクティブと呼ばれ以下のように設定する。
ディレクティブ名 設定値
また適用範囲は以下のように指定できる。
<Files ファイル名> ... </Files>
<Directory ディレクトリ名> ... </Directory>
<Location URL> ... </Location>
大まかな設定項目は以下の通り。
# Apacheの設定ファイル/ログファイルの起点となるトップディレクトリ
ServerRoot "/usr/local/apache2"
# 待ち受けポート
Listen 80
# ロードモジュール
LoadModule authn_file_module modules/mod_authn_file.so
# 実行ユーザと実行グループ
User apache
Group apache
# バージョン情報の出力設定
ServerSignature On
ServerTokens Full
# 管理者のメールアドレス
ServerAdmin root@localhost
# Webサーバーとして公開するホスト名を指定
# ホスト名は FQDN(Fully Qualified Domain Name) で記述
ServerName www.example.com:80
# /ディレクトリ以下の設定
<Directory />
# AllowOverride は 上位のディレクトリ(この場合は/(root)ディレクトリ)でした設定を下位のディレクトリで設定を上書きできるかどうか(オーバーライドできるかどうか)を設定。none → 下位での変更が無効。all → 下位での変更が有効。
AllowOverride none
# アクセス制限に関する設定。デフォルトではすべて拒否する設定になっている。
Require all denied
</Directory>
# ドキュメントルート(DocumentRoot)は、Webサーバーのトップディレクトリ
DocumentRoot "/var/www/html"
# ドキュメントルート以下の設定
<Directory "/var/www/html">
# シンボリックリンクをたどれるようにする
Options Indexes FollowSymLinks
AllowOverride None
# /var/wwwディレクト配下へのアクセスは全員が可能(Webサイトを閲覧することができる)
Require all granted
</Directory>
# dirモジュールが有効時にディレクトインデックスの指定
<IfModule dir_module>
DirectoryIndex index.html
</IfModule>
# ディレクトリに「.htaccess」ファイルや「.htpasswd」ファイルがあった場合、ユーザーに表示するかどうかを設定
<Files ".ht*">
Require all denied
</Files>
# エラーログの場所を指定
ErrorLog "logs/error_log"
# ログレベルの指定
LogLevel warn
# emerg:緊急、システムが利用できないレベル
# alert:今すぐに対処が必要なレベル
# crit:致命的な状態
# error:エラーレベル
# warn:(デフォルト) 警告レベル
# notice:注意すべき重要な情報
# info:一般的な情報
# debug:デバッグレベル
<IfModule log_config_module>
# ログのフォーマットを指定。ログフォーマットのニックネームを「combined」と名付ける。
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
# ログのフォーマットを指定。ログフォーマットのニックネームを「common」と名付ける。
LogFormat "%h %l %u %t \"%r\" %>s %b" common
# カスタムログの場所とフォーマットを指定。フォーマットは、ニックネーム「combined」の形式にする。
CustomLog "logs/access_log" combined
</IfModule>
<IfModule alias_module>
# 【例】http://sample.ne.jpの場合、「/var/www/cgi-bin/」ディレクトリを「http://sample.ne.jp/cgi-bin」に割り当てます。つまりどのディレクトリを「cgi-bin」に割り当てるのか設定する。エイリアス定義
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
</IfModule>
# cgi-binディレクトリの動作について設定
<Directory "/var/www/cgi-bin">
AllowOverride None
# オプションは何もなし
Options None
# 全員がアクセス可能
Require all granted
</Directory>
# エラーとエラーページの設定
ErrorDocument 500 "The Server mode a boo boo."
ErrorDocument 404 /missing.html
# 他の設定ファイルの読み込み
IncludeOptional conf.d/*.con
9.1.3. httpd.confの主要な設定
ServerTokens Prod|Major|Minor|MinOS|Full
HTTPヘッダ内に出力されるバージョン情報(バナー情報)を指定する。 クライアントに返信する応答ヘッダにどのような情報を含めるかということを決めれる。
セキュリティの関係で通常は「Prod」で良い。
ServerTokens Prod|Major|Minor|MinOS|Full
設定値 | 出力 |
---|---|
Prod | Server: Apache |
Major | Server: Apache/2 |
Minor | Server: Apache/2.4 |
MinOS | Server: Apache/2.4 (CentOS) |
Full | Server: Apache/2.4 (CentOS) OpenSSL/1.0.1e-fips PHP/5.4.16 |
ServerRoot パス
httpdが利用するトップディレクトの指定。 設定ファイルなどを格納する。
ServerRoot パス
ServerName サーバのホスト名
ホスト名の指定。
ServerName サーバのホスト名
ServerAdmin メールアドレス
サーバ管理者のメールアドレスを指定。
ServerAdmin メールアドレス
ServerSignature on|off
エラーメッセージなどのフッタ表示の有効無効化を指定。
ServerSignature on|off
TraceEnable on|off
TRACEメソッドの使用の有無の指定。
TracerEnable on|off
プロセス系の設定項目
Apacheでは複数のプロセスが処理を分担する。 仕組みとしては以下の通り。
- 親プロセスがクライアントからの接続を待ち受ける
- 個々のクライアントの対応は子プロセスが処理する
なお、待機している子プロセス数よりもクライアント数が多くなれば、子プロセス数を新たに不足分起動するのでレスポンスが低下する。 また待機している子プロセス数が多いほどメモリの使用量は多くなる。
# 起動時の子プロセス数の数
StartServers 子プロセス数
# 待機子プロセスの最小数
MinSpareServers 子プロセス数
# 待機子プロセスの最大数
MaxSpareServers 子プロセス数
# 生成される子プロセスの上限の指定
ServerLimits 子プロセス数
# 最大同時接続数の指定
MaxClients 同時接続数
MaxRequireWorkers 同時接続数
# クライアント接続がタイムアウトになる時間を秒数指定
Timeout タイムアウト時間
# KeepAlive(TCP接続のキープ)の設定(パフォーマンス向上が見込める)
KeepAlive on | off
KeepAliveRequires 上限リクエスト数
KeepAliveTimeout タイムアウト時間
Listen [IPアドレス:]ポート番号
待ち受けポート番号の指定。
Listen :80
User/group
httpd子プロセスの実行ユーザと実行グループの指定。
User ユーザ名
Group グループ名
DocumentRoot ディレクトリ
ドキュメントルートとなるディレクトリの指定
DocumentRoot ディレクトリ
UsrDir 公開ディレクトリ|disabled
一般ユーザの公開ディレクトリの指定。
UsrDir 公開ディレクトリ|disabled
DirectoryIndex インデックスファイル
ディレクトリのインデックスとして返すファイル名の指定。
DirectoryIndex インデックスファイル
ErrorLog ログファイルのパス
エラーログを記録するログファイルの指定。
ErrorLog ログファイルのパス
Loglevel ログレベル
エラーログのログレベルの指定。
Loglevel ログレベル
LogFormat “フォーマット” 書式名
ログを記録する項目と書式名を指定する。
LogFormat "フォーマット" 書式名
フォーマット文字列は以下の通り。
フォーマット文字列 | 説明 |
---|---|
%a | リモート IP アドレス |
%A | ローカル IP アドレス |
%B | レスポンスのバイト数。HTTP ヘッダは除く。 |
%b | レスポンスのバイト数。HTTP ヘッダは除く。CLF 書式。 すなわち、1 バイトも送られなかったときは 0 ではなく、 ‘-’ になる |
%f | ファイル名 |
%h | リモートホスト |
%H | リクエストプロトコル |
%l | リモートログ名。 これは mod_ident がサーバに存在して、 IdentityCheck ディレクティブが On に設定されていない限り、 - になる。 |
%m | リクエストメソッド |
%r | リクエストの最初の行 |
%t | リクエストを受付けた時刻。 CLF の時刻の書式 (標準の英語の書式) |
%T | リクエストを扱うのにかかった時間、秒単位 |
%u | リモートユーザ (認証によるもの。ステータス (%s) が 401 のときは意味がないものである可能性がある) |
%U | リクエストされた URL パス。クエリ文字列は含まない |
%>s | サーバがクライアントに返すステータスコード |
%{Referer}i | リクエスト内のrefererヘッダの内容 |
%{User-agent}i | リクエスト内のUserAgentヘッダの内容 |
Custom ログファイル名 ログ書式名
出力するログの指定を行う。
CustomLog logs/access_log combined
HostnameLookups on|off
DNSの逆引きを行いアクセス元IPアドレスからホスト名を取得する ログにホスト名やホスト名でアクセス制御を行う場合に使用する。
HostnameLookups on|off
Alias ディレクトリ パス
ドキュメントルートツリー以外の参照できるようにする際に使用する。
# /var/www/html/imagesではなく/home/www/imagesを参照できるようにする
Alias /images /home/www/images
Redirect ディレクトリ|ファイル 転送先URL
指定したURLにリダイレクトを行う
Redirect ディレクトリ|ファイル 転送先URL
ScriptAlias ディレクトリ CGI格納ディレクトリ
CGIスクリプト用ディレクトリを指定する。
ScriptAlias /cgi-bin/ /var/www/cgi-bin/
ErrorDocument エラーコード ファイル|ディレクトリ
エラーが発生した際の処理をエラーコードに続けて指定する。
ErrorDocument 404 /error.html
Options オプション
ディレクトリごとにオプションを指定できる。
オプション | 説明 |
---|---|
All | MultiViews 以外のすべての機能を有効にする(デフォルト) |
None | すべての機能を無効にする |
ExecCGI | CGI スクリプトの実行を許可する |
FollowSymLinks | シンボリックリンクをたどることを許可する |
Includes | SSI を有効にする |
Indexes | ファイル一覧の表示を行う |
MultiViews | コンテントネゴシエーションを有効にする |
9.1.4. 外部設定のファイル
httpd.conf以外に設定ファイルを記述し、httpd.confを上書きして設定することもできる。
外部設定のファイル名はhttpd.confのAccsessFileName
ディレクティブで指定できる。
AccsessFileName
外部設定のファイルを指定できる。
AccsessFileName .htaccess
AllowOverride パラメータ
AllowOverride
ディレクティブは外部ファイルの利用許可ができる。
複数パラメータの指定。
Directoryセクションで指定できる。
AllowOverride パラメータ
パラメータ | 説明 |
---|---|
AuthConfig | 認証に関する設定を有効にする |
indexes | DirectoryIndexなどの設定の有効にする |
FileInfo | ファイルタイプの制御設定を有効にする |
Limit | Order, Allow, Denyによる設定を有効にする |
Options | Opitionsの設定を有効にする |
None | .htaccessでの変更を無効にする |
All | .htaccsessで変更可能なすべての設定を有効にする |
9.1.5. Apacheの制御
Apacheの起動方法は以下の通り。
# SysVinitを採用したシステムでのApacheの起動
/etc/init.d/httpd start
# Systemdを採用したシステムでのApacheの起動
systemctl start httpd.conf
# Ubuntuの場合
systemctl start apache2.service
# Apachectlによる起動
apachectl start
apachectlコマンド
apacheの操作/情報参照できるコマンド。
apachectl サブコマンド
サブコマンド | 説明 |
---|---|
start | Apacheを起動 |
stop | Apacheの終了 |
restart | Apacheの再起動 |
graceful | Apacheを安全に再起動 |
reload | 設定ファイルの再読み込み |
configtest | 設定ファイルの構文チェック |
9.1.6. モジュールの使用
Apacheではモジュールによって様々な機能を提供できる。 機能追加などもApacheのインストールのし直しの必要はなく、モジュールのロード/アンロードで行える。
Apacheの主要なモジュールは以下の通り。
モジュール名 | 説明 |
---|---|
mod_accsess_compat | ホストベースのアクセス制御 |
mod_authz_host | ホストベースのアクセス制御(Requireディレクティブ) |
mod_authz_user | ユーザベースのアクセス制御(Requireディレクティブ) |
mod_auth_basic | 基本認証 |
mod_auth_digest | Digest認証 |
mod_authn_file | .htaccsessファイルによるユーザ認証 |
mod_alias | エイリアス機能の利用 |
mod_cgi | CGIスクリプトの実行 |
mod_dir | ディレクティブのインデックス実行 |
mod_info | サーバの設定情報表示 |
mod_log_config | リクエストログの生成 |
mod_mime | 拡張子に応じたファイルタイプの指定 |
mod_negotiation | クライアントごとの自動判別機能の提供 |
mod_perl | Perlの利用 |
mod_php | PHP5の利用 |
mod_proxy | プロキシ機能 |
mod_so | モジュールを読み込むDSO機能の提供 |
mod_ssl | SSL/TLS機能の利用 |
mod_status | サーバステータスの表示 |
mod_unixd | 実行ユーザ/グループのChroot機能 |
mod_userdir | ユーザディレクリの公開 |
mod_version | バージョン依存の設定 |
モジュールは/usr/lib/httpd/modules
などにインストールされ、LoadModule
ディレクティブで読み込む。
LoadModule perl_module modules/mod_perl.so
またApacheのインストール後にモジュールを読み込むには以下のように実施する方法もある。
aspx
コマンドによるコンパイルhttpd.conf
にLoadModules
ディレクティブを追加
aspxコマンド
Apacheのインストール後にモジュールをDSOとしてインストールするコマンド。
sudo aspx -i -a -c mod_foofoo.c
httpdコマンド
組み込み済みのモジュールの確認や一覧の表示を行えるコマンド。
# 組み込み済みモジュールの確認
httpd -l
# Debian/Ubuntuの場合
apache2 -l
# 組み込みモジュール/DSOモジュールの一覧表示と設定ファイルの文法チェック
httpd -M
またDebian/Ubuntuの場合はa2enmod
コマンドにより対話的にモジュールを有効化できる。
9.1.7. クライアントのアクセス認証
指定したディレクトリにアクセスするときにユーザ/パスワードがないときにアクセス制限をかけることができる。 認証にはBasic認証とDigest認証を使うことができる。
Basic認証
Basic認証の実装手順はhttpd.conf
にユーザ認証設定を実装することで可能。
なおBasic認証では平文で認証情報が流れる。
設定例は以下の通り。
<Directory "/var/www/html/private">
# 認証タイプの指定
AuthType Basic
# 認証ダイアログのメッセージ
AuthName "Please Enter Your ID and PassWord!"
# パスワードファイル名
AuthUserFile /etc/httpd/conf/passwd
# AuthGroupFile
# アクセス可能なユーザ(user ユーザ または valid-user)
Require valid-user
</Directory>
valid-user
にすると、パスワードファイルにエントリあるすべてのユーザがアクセスが許可される。
認証に用いるユーザ名とパスワードの設定はhtpasswd
コマンドを用いる。
htpasswd [オプション] ファイル名 ユーザ名
オプション | 説明 |
---|---|
-c | パスワードファイルを新規に作成 |
-m | MD5で暗号化する |
-s | SHA1で暗号化する |
-D | ユーザを削除する |
注意点としてドキュメントルート以下のブラウザからアクセスできる場所にパスワードファイルを設置する際にアクセスできないようにする必要がある。
Digest認証
Digest認証ではチャレンジ/レスポンス形式で認証を行うので認証情報が盗聴されてもパスワードがすぐに漏洩しない特徴がある。 設定は以下の通り。
Digest認証ではAuthName
では認証領域を指定する。
<Directory "/var/www/html/private">
# 認証タイプの指定
AuthType Digest
# ユーザ認証の領域を指定
AuthName "private"
# パスワードファイル名
AuthUserFile /etc/httpd/conf/passwd
# AuthGroupFile
# アクセス可能なユーザ(user ユーザ または valid-user)
Require valid-user
</Directory>
認証に用いるユーザ名とパスワードの設定はhtdigest
コマンドを用いる。
htdigest [オプション] ファイル名 領域 ユーザ名
オプション | 説明 |
---|---|
-c | パスワードファイルを新規に作成 |
ホストベースのアクセス認証
order, Allow,Deny
ディレクティブによりIPアドレス/ホスト名によるアクセス制御ができる。
なおこの制御の使用は非推奨になっているため、Require
ディレクティブを代用が推奨されている。
# Allow Denyの評価順の指定
Order allow | Deny, allow | Den
# 接続許可するホストの指定
Allow from IPアドレス | ホスト名/ドメイン名
# 接続を許可しないホストの指定
Deny from IPアドレス | ホスト名/ドメイン名
なお現在推奨であるRequire
ディレクティブを使用する場合の書式は以下の通り。
Require エンティティ 値
指定するエンティティ例は以下の通り。
エンティティ | 説明 |
---|---|
ip IPアドレス | IPアドレス |
ip 192.168 172.16 | 192.168.0.0/24, 172.16.0.0/24のみ |
host ドメイン名 | ドメイン名のホストのみ |
group admin | adminグループのみ |
all granted | すべてのホストを許可 |
all denied | すべてのホストを拒否 |
local | ローカルホストのみ |
また以下のディレクティブを使用して複数条件の指定も可能
ディレクティブ | 説明 |
---|---|
RequireAll | すべての条件にマッチで真 |
RequireAny | 1つ以上の条件にマッチで真 |
RequireNone | いずれにマッチしなければ真 |
またApache2.4以降ではorder, Allow,Deny
ディレクティブを使用する方法ではなく、Require
ディレクティブを使用する形が推奨されている。
設定 | Order Deny,Allow | Order Allow,Deny |
---|---|---|
デフォルト | 全て許可 | すべて拒否 |
一部のアクセスのみ許可 | Order Deny,Allow Deny from all Allow from IPアドレス/ホスト名 | Order Allow,Deny Allow from all Deny from IPアドレス/ホスト名 |
一部のアクセスのみ拒否 | Order Deny,Allow Deny from IPアドレス/ホスト名 | Order Allow.Deny Allow from IPアドレス/ホスト名 |
すべて許可 | Order Deny,Allow | Order Allow,Deny Allow from all |
すべて拒否 | Order Deny,Allow Deny from all | Order Allow,Deny |
またアクセス制御をLimit
、LimitExcept
ディレクティブ内に設定して、特定のHTTPメソッドに適用することもできる。
<Limit DELETE POST PUT>
Require vaild-user
</limit>
<LimitExcept DELETE POST PUT>
Require All Deny
</limitExcept>
9.1.8. バーチャルホスト
バーチャルホストは1台のサーバで複数のWebサイトを管理する機能のこと。 バーチャルホストには以下の2種類がある。
- 名前ベースバーチャルホスト … 1台のホストに1つのIPと複数のドメイン名を指定する方法
- IPベースバーチャルホスト … 1台のホストに複数のIPアドレスと複数のドメインを指定する方法
名前ベースのバーチャルホスト
設定例は以下の通り。 下記設定の上でDNSを適切に設定するとWebサイトを複数1つのホストで運用できる。
NameVirtualHost *:80
<VirtualHost *:80>
ServiceName web.hogehoge.jp
ServerAdmin [email protected]
DocumentRoot /var/www/virtual/hogehoge
</VirtualHost>
<VirtualHost *:80>
ServiceName www.test.jp
ServerAdmin [email protected]
DocumentRoot /var/www/virtual/test
</VirtualHost>
IPベースのバーチャルホスト
設定例は以下の通り。
Listen 192.168.1.10:80
Listen 192.168.1.11:80
<VirtualHost 192.168.1.10:80>
ServiceName web.hogehoge.jp
ServerAdmin [email protected]
DocumentRoot /var/www/virtual/hogehoge
</VirtualHost>
<VirtualHost 192.168.1.11:80>
ServiceName www.test.jp
ServerAdmin [email protected]
DocumentRoot /var/www/virtual/test
</VirtualHost>
9.1.9. SSL/TLS
SSL/TLSは公開鍵暗号を使用したTCP/IPのアプリケーション層のセキュリティ技術。 SSL/TLSによりWebブラウザとサーバ間の通信を暗号化できセキュアな通信を実現できる。
認証には認証局により発行されたサーバ証明書によりサイトの正当性を保証し、セキュリティを担保する。
Apacheではmod_ssl
によりサイトをSSL化することができる。
SSLを利用してWebサーバの運用は以下の手順でサイト証明書を認証局から入手する。
- 公開鍵/暗号鍵の作成
- 作成した公開鍵を認証局(CA)へ送信する
- CAにて証明書を発行して受け取る
- 証明書をWebサーバにインストールする
自己署名証明書(オレオレ認証)
自己署名証明書はSSL接続をテストする為や、限られた利用者のみが使用するWEBサーバなどを構築する際に設定する。
作成手順は以下の通り。
- 秘密鍵(key.pem)と自己署名証明書(cacert.pem)の作成
- サーバ秘密鍵の作成(鍵名.key)
- 証明書発行要求書(CSR)の作成
- 証明書発行要求ファイルに対しCAが認証を行いサーバ証明書(.crt)の作成
自己署名証明書の作成例は以下の通り。
なおCA.sh -newca
やCA.pl -newca
(OpenSSL1.1.0以降)も使用可能。
# 秘密鍵と自己署名証明書の作成
./CA -newca
# パスフレーズを入力
# パスフレーズの再入力
# 国コードの入力
# 都道府県名
# 市町村名
# 会社名
# 部署名
# ホストのFDQN
# 管理者メールアドレス
# パスフレーズの入力
# サーバ秘密鍵の作成
openssl genrsa -out server.key 2048
# 証明書発行要求書(CSR)の作成
openssl req -new -key server.key -out server.csr
# サーバ証明書(.crt)の作成
openssl ca -out server.crt -infiles /etc/pki/ca/server.csr
SSL関連ファイル
ファイル | 説明 |
---|---|
.key | サーバ秘密鍵 |
.csr | 証明書発行要求書 |
.crt | サーバ証明書 |
またSSL設定(httpd.conf)例は以下の通り。 なおSSLには443ポートを使用するので注意する。
SSLEngine On
SSLProtocol all -SSLv2 -SSLv3
SSLCertificateFile [.crtのパス]
SSLCertificateKeyFile [.keyのパス]
SSL/TLSの主要ディレクティブ
ssl.conf
の主要なディレクティブは以下の通り。
ディレクティブ | 説明 |
---|---|
SSLEngine | SSL/TLSの有効無効 |
SSLProtocol | all,SSLv2, SSLv3, TLSv1, TLSv1.1 , TLSv1.2がある。- で無効化、+ で有効化 |
SSLCipherSuite | 使用する暗号化アルゴリズムのリスト |
SSLCertificateFile | サーバ証明書ファイル |
SSLCertificateKeyFile | サーバ秘密鍵のファイル |
SSLCerificateChainFile | 中間CA証明書ファイル |
SSLCACertificateFile | クライアント証明書発行のCA証明書ファイル |
SSLCAcertificatePath | クライアント証明書発行のCA証明書ディレクトリ |
SSLVerifyClient | クライアント認証レベル(none, optional, opitional_no_ca, require) |
SNI
SNI(Server Name Indication)は1つのWebサーバで複数のドメインのSSL/TLS証明書を利用できる仕組み。 名前ベースのVirtualHostであってもSSLに対応できるようにしたSSL/TLSの拡張仕様ともいえる。
この機能により、複数独自ドメインを利用するサーバにて複数のSSL/TLS証明書を使用することが可能になった。 特徴は以下の通り。
- IPベースのVirtualHostであれば、クライアントに依存せずにSSLを使える
- 名前ベースのVirtualHostの場合、クライアントがSNIに対応していればSSLを使用できる
SNIでは、SSLセッションのハンドシェイク(SSL接続)のタイミングでクライアント側から接続したいホスト名を提示する。これによりサーバは、クライアントが提示したホスト名を確認して適切な証明書を返すことができる。
なお、SNIはサーバだけでなくクライアント側(ブラウザ)も対応している必要がある。
9.2. Webサーバの監視とメンテナンス
9.2.1. サーバ情報の取得
mod_statusモジュール
mod_status
モジュールの使用でサーバの稼働状況をブラウザに表示ができる。
mod_statusを使用する場合のhttpd.conf
は以下の通り。
LoadModule status_module modules/module_status.so
<Location /server-status>
SetHandler server-status
</Location>
mod_infoモジュール
mod_info
モジュールの使用でサーバ設定の情報をブラウザに表示ができる。
mod_infoを使用する場合のhttpd.conf
は以下の通り。
LoadModule status_module modules/mod_info.so
<Location /server-info>
SetHandler server-info
</Location>
9.2.2. ログファイル
Apacheの規定のログファイルにはaccsess_logとerror_logがある。
/var/log/httpd
などに保存される。
- アクセスログ … 要求のあったリクエストの情報などが保存される
- エラーログ … エラー情報やサーバの挙動が記録される(ログレベルは
LogLevel
ディレクティブで設定可能)
9.3. プロキシサーバの設定
プロキシサーバはクライアントPCの代理としてサーバとの通信を仲介するサーバのこと。 メリットは以下の通り。
- 特定のWEBサイトへのアクセスを制限できる
- クライアントからのアクセスを制御できる
- 一度アクセスしたサイトをキャッシュしてアクセスの高速化を図れる
9.3.1. Squid
SquidはLinuxで最も使用されているプロキシサーバの1つ。
Squidはsquid.conf
で設定を行う。
squid.confの主要設定項目
設定項目 | 説明 |
---|---|
http_port | Squidが利用するポート番号 |
visible_hostname | ホスト名 |
hierarchy_stoplist | キャッシュを利用しない文字列 |
maximum_object_size | キャッシュ可能な最大ファイル数 |
minumum_object_size | キャッシュ可能な最小ファイル数(0は無制限) |
maximum_object_size_in_memory | メモリ上の最大ファイルサイズ |
ipchache_size | キャッシュするIPアドレス数 |
cache_dir | キャッシュを格納するディレクトリと容量など |
cache_mem | 総メモリの最大サイズ |
cache_accsess_log | クライアントのアクセスログ |
cache_log | キャッシュのログ |
ftp_user | anonymousでFTPアクセスするときのパスワード |
ftp_passive_on/off | FTPのパッシブモードの有効/無効 |
reference_age | キャッシュの保存期間 |
request_header_max_size | HTTPリクエストヘッダの最大サイズ |
requiest_body_max_size | HTTPリクエストボディの最大サイズ |
reply_body_max_size | レスポンスの最大ボディサイズ(0は無制限) |
acl | アクセス制御リスト |
http_accsess | アクセス制御リストの制御 |
auth_param | ユーザ認証方式などの設定 |
squid.confの設定例は以下の通り。
# ネットワークオプション
http_port 8080
visible_hostname www.example.com
# cgi-binという文字列があればキャッシュを利用せず直接アクセス
hierarchy_stoplist cgi-bin ?
# 禁止するURLを正規表現で指定
acl QUERY urlpath_regex cgi-bin \?
# 上の設定にACLを適用
no_cachedeny QUERY
# キャッシュサイズの指定
chache_mem 20MB
# キャッシュ可能な最大ファイルサイズの指定
maximum_object_size 4096KB
# 最小オブジェクトの制限
minumum_object_size 0KB
# メモリ上の最大キャッシュサイズ
maximum_object_size_in_memory 8KB
# キャッシュする最大IPアドレス数
ipchache_size 1024
# キャッシュディレクトリとサイズなどの指定
# キャッシュディレクトリ サイズ(MB) ディレクトリ数 サブディレクトリ数
cache_dir ufs /var/spool/squid 100 16 256
# クライアントのアクセスログ
cache_accsess_log /var/log/squid/accsess.log
# キャッシュのログ
cache_log /var/log/squid/cache.log
# ストレージマネージャの管理ログ
cache_log /var/log/squid/store.log
# 匿名FTPのパスワード
ftp_user passpass
# パッシブモードの有効
ftp_passive on
# HTTPリクエストヘッダの最大サイズ
request_header_max_size 10KB
# HTTPリクエストボディの最大サイズ
requiest_body_max_size 1MB
# レスポンスの最大ボディサイズ
reply_body_max_size 0
アクセス制御の設定
Squidのアクセス制限はacl
とhttp_access
で行う。
aclの場合は以下の書式。
acl acl名 ACLタイプ 文字列orファイル名
ACLタイプは以下の通り。
タイプ | 説明 |
---|---|
src | クライアントのIPアドレス |
dst | 代理アクセス先サーバのIPアドレス |
srcdomain | クライアントのドメイン名 |
dstdomain | 代理アクセス先サーバのドメイン名 |
port | 代理アクセス先のサーバポート番号 |
myport | クライアントのポート番号 |
arp | MACアドレス |
proto | プロトコル |
method | HTTPのメソッド |
url_regex | URLにマッチする正規表現 |
urlpath_regex | URLからプロトコルとホスト名を除いたパス名にマッチする正規表現 |
time | 有効な時刻の指定(例: 10:00-12:00) |
proxy_auth | ユーザ認証の対象 |
設定例は以下の通り。
acl all src 0.0.0.0/0.0.0.0
acl localhost src 127.0.0.1/255.255.255.255
acl clients src 192.168.0.0/255.255.255.0
acl denydomain dstdomain x.com twitter.com
acl blacklist url_regex "/etc/squid/url_blacklist.txt"
acl SSL_ports port 443 563
acl Safe_ports port 80 21 443 563 70 210 1025-65535
acl CONNECT method CONNECT
# Safe_ports以外のアクセスを禁止
http_access deny !Safe_ports
# SSL_ports以外のポートのCONNECTメソッドを禁止
http_access deny CONNECT !SSL_ports
http_access deny denydomain
http_access deny blacklist
http_access allow localhost
http_access allow clients
http_access deny all
9.4. Nginxとリバースプロキシ
Nginxは高速で動作する負荷に強いWebサーバ。 特徴としてリバースプロキシやメールプロキシの機能も持つ。
9.4.1. Nginxの設定
Nginxは1つのマスタープロセスと複数のワーカープロセスから構成される。
- ワーカープロセス … クライアントからのHTTPリクエストを受け付け処理する
- マスタープロセス … ワーカープロセスを管理するプロセス
Nginxの設定ファイルは/etc/nginx/nginx.conf
となる。
CentOSにおけるNginxの主要設定ファイルは以下の通り。
ファイル | 説明 |
---|---|
/etc/nginx/nginx.conf | メイン設定ファィル |
/etc/nginx/conf.d/default.conf | デフォルトサーバの設定ファイル |
/etc/nginx/conf.d/ssl.conf | SSLの設定ファイル |
/etc/nginx/conf.d/virtual.conf | バーチャルホストの設定ファイル |
設定はディレクティブに値を指定する形で記述する。
ディレクティブ 値;
ディレクティブ {
ディレクティブ 値;
}
またnginx.conf
の基本構造は以下の通り。
events {
# 接続処理に関する記述
}
http {
# httpサーバの設定
server {
# HTTPサーバ毎の設定
location パス {
# URI毎の設定
}
}
}
mail {
# メールプロキシ関連の設定
}
またnginxの主要なディレクティブは以下の通り。
ディレクティブ | コンテキスト | 説明 |
---|---|---|
include | すべて | 値の設定ファイルを読み込む |
http {} | main | httpサーバとしての設定 |
server {} | main | バーチャルホストの設定 |
user | main | workerプロセスの実行ユーザ |
worker_processes | main | workerのプロセス数(CPUコア数) |
worker_connections | events | 1つのworkerプロセスが同時処理できる最大接続数 |
log_format | http | アクセスログの書式形式 |
access_log | http,server,location | アクセスログのパスとログレベル |
error_log | main,http,server,location | エラーログのパスとログレベル |
listen | server | リクエストを受け付けるポート番号 |
server_name | server | バーチャルホストのサーバ名 |
proxy_pass | location | プロキシ先の指定 |
fastcgi_pass | location | FastCGFIサーバの指定 |
fastcgi_param | http,server,location | FastCGIサーバに渡すパラメータの設定 |
location プレフィックス URIパス条件{} | server, location | 条件マッチのリクエストURIの設定 |
keepalive_requests | http,server,location | 一度の接続で受け付けできるリクエスト数の上限 |
keepalive_timeout | http,server,location | キープアライブのタイムアウト時間 |
server_tokens | http,server,location | バージョン番号の表示/非表示 |
root | http,server,location | ドキュメントルート |
index | http,server,location | インデックスファイル |
autoindex | http,server,location | インデックスリストの表示/非表示 |
error_page | http,server,location | エラーコードとエラーページのURI |
proxy_set_header | http,server,location | プロキシ先に送られるリクエストヘッダフィールドの再定義 |
proxy_pass_header | http,server,location | プロキシ先からクライアントへの通過を許可するヘッダフィールドの指定 |
9.4.2. リバースプロキシの設定
Nginxはリバースプロキシとしてもよく利用される。 リバースプロキシの設置によりWEBサーバの負荷が軽減できる。
設定例は以下の通り。
server {
location /{
proxy_page http://localhost:8080
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
nginxコマンド
nginx -t
コマンドによりnginx.confファイルの構文をチェックできる。
nginx -t
# 設定の再読み込み
nginx -s reload
2.10 - 10.ファイル共有
10.1. Windowsネットワーク
Microsoft系技術の基本であるWindowsネットワークの概念について一部記載する。
10.1.1. Windowsネットワークの基本概念
ワークグループとドメイン
ワークグループはWindowsネットワークの基本単位のこと。 コンピュータをまとめたグループの1つの単位となる。
マスターブラウザ
マスターブラウザは同一ネットワーク内のコンピュータのリストを取り扱いまとめて管理するホストのこと。 これは「ネットワーク」-「マイネットワーク」で一覧表示されるネットワークデータを指す。
ネットワークセグメント内に必ず1つ存在し、他のホストはマスターブラウザより参照して利用する。 マスターブラウザとなるホストは自動的に選出される。
NTドメイン/ADドメイン
- NTドメイン
- NTドメインはWindows NTで使用されるユーザ管理の仕組み。
- ネットワーク上のWindowsホストをドメイン単位でグループ化し、ドメインコントローラ(認証サーバ)でアカウント情報を集中管理する。
- ドメインにログインしたユーザはドメイン内の共有リソースやプリンタに認証なしでアクセスできる。
- ADドメイン
- AD(Active Directory)ドメインはWindows 2000 Server以降に採用されているドメインサービスのこと。
- NTドメインと異なり、複数ドメインを階層構造で管理できる。そのため大規模ネットワークにも対応している。
ドメインコントローラ
ドメインコントローラはドメインを管理するためのサーバのこと。 ドメイン内のユーザのログオン認証を行う。
ドメイン内にドメインコントローラが1つ以上存在することで機能を実現する。 ユーザアカウント/グループはドメインコントローラに登録されユーザはドメインコントローラにユーザ名とパスワードを送り認証する。 なお冗長化のためにドメインコントローラは複数用意できる。
NetBIOS
NetBIOSはWindowsネットワークで使われているネットワーク用APIのこと。 ネットワーク内のホストにそれぞれ異なる15Byteの名称を付けて識別し、この名称に1Byteの通信アプリケーション情報を追加したものがNetBIOS名となる。 WindowsはこのNetBIOS名により通信対象のソフトウェアを区別する。
またNetBIOSをTCP/IPで使う仕組みにNetBIOS over TCP/IPというものがある。 これはTCP/IPでNetBIOSをカプセル化してTCP/IP上でセッション確立する仕組み。
WINSはIPアドレスとNetBIOS名の名前解決を行う仕組みのこととなる。
SMB/CIFS
SMB(Server Message Block)はWindows OSにおけるファイル共有プロトコルの1つ。 Windows以外のOS、LinuxやMacでも使用することができる。
SMBプロトコルは、クライアントとサーバー間でのファイルや印刷データの共有、およびそれらのシリアルポートを通じた通信をサポートしている。 2022年現在はSMBを拡張したCIFS(Common Internet File System)も使用されている。
SMBとCIFSの特徴は以下の通り。
比較項目 | SMB | CIFS |
---|---|---|
下位プロトコル | NetBIOSインターフェース | TCP/IP |
暗号化のサポート | なし | あり |
サポート範囲 | LinuxやMacでも使用可能 | Windowsシステム特化 |
SMB/CIFSの用途は以下用途で使用できる。
- ファイル共有
- プリンタ共有
- リモートアクセスとその管理
WINSサーバ
WINSサーバはNetBIOSとIPアドレスの名前解決を行うサーバのこと。 WINSに情報が存在しない場合はLMHOSTSファイルが名前解決に使用される。
LMHOSTSの構造は以下の通り。
192.168.1.1 LPICSV #PRE
192.168.1.2. HOST1 #PRE #DOM:LPIC
10.2. Sambaサーバの構築
10.2.1. Sambaサーバ
SambaはWindowsネットワークで使用されるSMB/CIFSプロトコルを利用してWindowsでのファイル共有の仕組みを提供するOSSソフトウェアのこと。 機能としてはファイル共有のほかに、プリンタ共有、認証機能も提供する。
提供できる機能は以下の通り。
- ファイルサーバ機能
- プリントサーバ機能
- WINSサーバ機能
- ドメインコントローラ
- ActiveDirectoryメンバーサーバ
- Microsoftネットワーククライアント
Sambaにてサーバ機能を提供するデーモンはsmbdとnmbとなる。 smbdはファイルやプリンタの共有、ユーザの認証、nmbdはブラウズ機能、NetBIOSによる名前解決を提供する。
Sambaのバージョン
Samba3とSamba4の主な違いを以下に記載する。
機能 | Samba3 | Samba4 |
---|---|---|
ドメインコントローラ | NTドメインのドメインコントローラ構築ができる(NTMLv2の使用、WINSサーバによる名前解決、LDAP連携の可能) | ADドメインのドメインコントローラ構築ができる(Keroberos認証、DNSによる名前解決、LDAP内蔵) |
ファイルサーバ | SMB2に対応 | SMB2,SMB3に対応 |
10.2.2. Sambaの基本動作
Sambaは以下の3つのプロセスから構成される。
- smbd
- ファイル共有、認証
- nmbd
- ブラウジング機能、NETBIOS名前解決、WINSサーバ
- winbindd
- Winbind機能
またSambaサーバが利用するポートは以下の通り。
ポート番号 | 説明 |
---|---|
137/UDP | NetBIOS名前解決やブラウジングに使用 |
138/UDP | NetBIOS名前解決やドメインログオンに使用 |
139/TCP | ファイル共有(Microsoft Direct Hosting SMBを利用していない場合) |
445/TCP | ファイル共有(Microsoft Direct Hosting SMBを利用している場合) |
Sambaの起動方法はSystemdのシステムでは以下の通り。
systemctl start smb.client
systemctl start nmb.service
SysVinitを採用したシステムでは以下の通り。
/etc/init.d/smb start
10.2.3. smb.conf
Sambaサーバの設定はsmb.confファイルで行う。 smb.confは全体設定、共有定義から構成される。
smb.confの構造は以下の通り。
コメントアウトは#
か;
で可能。
# 全体設定
[global]
パラメータ名 = 値
# 共有定義
[homes]
パラメータ名 = 値
[printers]
パラメータ名 = 値
[セクション名1]
パラメータ名 = 値
[セクション名2]
パラメータ名 = 値
globalセクションの設定
globalセクションではsmaba全体の設定を行う。 なお変更後はsambaの再起動が必要となる。
主要な項目は以下の通り。
# Sambaサーバが所属するワークグループ名もしくはドメイン名を指定する
workgroup = ワークグループ名|ドメイン名
# Sambaサーバの動作モードを指定する
server role = 動作モード
# サーバ動作モード
# AUTO : securityパラメータの設定に従う(デフォルト)
# STANDALONE : スタンドアロンのサーバ
# MEMBER SERVER : ドメインのメンバーサーバ
# CLASSIC PRIMARY DOMAIN CONTROLLER : NTドメインのプライマリーコントローラ(PDC)
# CLASSIC BACKUP DOMAIN CONTROLLER : NTドメインのバックアップドメインコントローラ(BDC)
# ACTIVE DIRECTORY DOMAIN CONTROLLER : Active Domainのドメインコントローラ
# NetBios名の指定
netbios name = NETBios名
# サーバの名前や説明の指定
server string = コメント
# 接続を許可するホストの指定(記載されていないホストは接続拒否)
hosts allow = ホスト
# Guestアカウントの定義(アカウントが存在しないユーザにGuestとしてアクセスさせれる)
guest account = ゲストユーザ名
# Sambaユーザとして認証できない際の動作の指定
map to guest = Never | Bad User | Bad password
# Never: ゲスト認証の否認
# Bad User: 存在しないユーザの指定でゲスト認証とみなす
# Bad Password: Bad Userに加えてパスワード入力ミスの場合もゲスト認証とみなす
# ログファイルの指定(「%m」で接続元ホストごとにログを分けれる)
log file = ログファイル名
# ログファイルの最大サイズをKB単位で指定
max log size = サイズ
# ハッシュ値を用いた暗号化パスワードの使用を設定
encrypt passwords = Yes | No
# パスワード認証をsmbpassword方式で行う場合のパスワードファイルの指定
smb password file = パスワードファイルのパス
# SambaのパスワードとLinuxのパスワードを同期させるかの設定
unix password sync = Yes | No
passwd program = パスワードコマンドのパス
passwd chat = 期待させる文字列
# UNIXユーザを別ユーザ名とマッピングさせる
# 「UNIXユーザ名=Windowsマシンのユーザ名」のように記述
username map = マッピングファイル名
# ログオフ時に実行するスクリプトファイルの指定
logon script = スクリプトファイル名
# SambaサーバをWINSサーバとして動作させる場合にYesを設定
wins support = Yes | No
# WINSサーバのIPアドレスをIPアドレスを指定する
wins server = IPアドレス
共有の設定
globalセクション以降では個々の共有設定を行う。
主要な項目は以下の通り。
# コメントの指定
comment = コメント
# ブラウジングしたときの表示設定
browseable = Yes | No
# 書き込みの許可設定
writeable = Yes | No
read only = No | Yes
# 共有ディレクトリのパスを指定
path = ディレクトリのパス
# 共有内に作成するファイル/ディレクトリの所有者/グループを強制的に変換
force user = ユーザ名
force group = グループ名
# 書き込みが例外許可されるユーザ/グループの指定
write list = ユーザ名 | @グループ名
# 「.」で始まる名前のファイル/ディレクトリを表示しないように隠し属性の適用の指定
hide dot files = Yes | No
# 任意の名前のファイルやディレクトリを表示させたくない場合に指定。「/」で複数指定可能。
veto files = /ファイル名/
# 共有内にファイルやディレクトリを作成する場合のパーミッション設定
# ファイルに適用可能なパーミッション(Default:0744)
create mask = mode
# ディレクトリに適用可能なパーミッション(Default:0755)
directory mask = mode
# 必ずファイルに適用されるパーミッション(Default:0000)
force create mode = mode
# 必ずディレクトリに適用されるパーミッション(Default:0000)
force directory mode = mode
# アクセス可能ユーザの指定
valid users = ユーザ名
# Guestユーザのログイン許可の指定
guest ok = Yes | No
public = yes | No
SambaサーバをADドメインに参加させる設定
SambaサーバをActive Directoryドメインに参加させる際には以下設定が必要となる。
設定項目 | 説明 |
---|---|
workgroup=ADドメインのNetBios名 | ADドメインのNetBIOS名の指定 |
realm=レルム名 | ADのドメイン名の指定(FDQNで指定) |
security=動作モード | sambaの動作モードの指定(adsと指定) |
[global]
workgroup = SAMPLE
realm = SAMPLE.LOCAL
security = ads
なおレルム名はKerberos認証(ユーザが1つの認証で複数台のサーバへアクセスできるシングルサインオン)が管理する範囲のことを指す。 これはActive Directoryが認証にKerberosを使用することに起因する。
またActive Directoryドメインに参加するにはnet ads join
コマンドを実行する。
net ads join -U ユーザ名
homesセクションの設定
homeセクションはUNIXユーザの各ホームディレクトリを一括で共有するためのセクション。 そのため個々のユーザごとにホームディレクトリの共有を定義する必要はない。
printersセクションの設定
printersセクションは共有プリンタに関する設定を行うセクション。 複数プリンタがある場合も1つの設定のみで完結する。
# Yesならばファイル共有ではなくプリンタ共有として扱う
print ok = Yes | No
printable = Yes | No
個々の共有設定
共有フォルダ/共有プリンタなどネットワークで共有されるものは共有リソースと呼ばれる。 「globals」「homes」「printers」は予約語となっているが、それ以外は任意に作成可能。
共有名の最後に$
をつけるとブラウズしても見えない隠し共有となる。
testparmコマンド
testparmコマンドはsmb.confの構文にミスがないかを調べるもの。
testparm [オプション] [設定ファイル]
オプション | 説明 |
---|---|
-s | 構文チェック後にsmb.confを表示 |
-v | デフォルトパラメータの表示 |
なおSambaはSyslogを介さずにログを処理する。
smbdのログはlog.smbd
、nmbdのログはlog.nmbd
の保存される。
10.2.4. 設定に関する注意事項
マスターブラウザ
マスターブラウザはワークグループ単位/ドメイン単位で存在し、自動的に選出される。 なおOSレベルという値により算出され、OSレベルが高いほど算出優先度が高くなる。 Sambaサーバに33以上を設定すれば、優先的に選ばれる。
# ローカルマスターブラウザに選出されないようにする
local master = Yes | No
# ローカルマスターブラウザの選出に参加する
domain master = YeS | No
# ブラウザ選定を促す
preferred master = Yes | No | Auto
# OSレベルの設定
os level = 数値
認証の設定
認証方法はsecurityで設定を行う。
なおデフォルト値はUSER
となる。
security = USER | DOMAIN | ADS
# USERではsmbpasswdファイルなどを使い認証
# DOMAINではドメインコントローラに認証情報を送り認証(NTLM認証)
# ADSではActive DirectoryドメインにKerberos認証を使いログオフする
10.2.5. Sambaユーザの管理
security = USER
の場合はUNIXシステムアカウントとは別に、Samba利用者用のユーザアカウントも必要となる。
なお作成には対応するUNIXユーザも必要になる。
Samba4ではユーザ情報が格納されるデータベースとして以下の4種類が使用可能。 またMySQLやPostgreSQLなどもユーザ情報格納に使用可能。
- smbpasswd
- Samba2.2系での利用形式
- テキスト形式のパスワード(
/etc/samba/smbpasswd
など)に1行つ図保存 - 使用には
passdb backend = smbpasswd
とsmb.confに指定
- tdbsam
- バイナリ形式でデータベースファイル(
/etc/samba/passdb.tdb
など)に保存 - Sambaで使えるユーザ情報の全項目を格納可能
- 使用には
passdb backend = tdbsam:/etc/samba/passdb.tdb
とsmb.confに指定
- バイナリ形式でデータベースファイル(
- ldapsam
- LDAPサーバにユーザ情報を格納する(LDAPサーバが必要)
- 多数ユーザを扱う場合に向いている手法
- 使用には
passdb backend = ldapsam:ldap://LDAPサーバ名[:ポート番号]
とsmb.confに指定
pdbeditコマンド
Samba3.0以降で利用できるユーザ管理コマンド。
pdbedit [オプション] Sambaユーザ名
オプション | 説明 |
---|---|
-L | Sambaユーザ一覧表示 |
-a | Sambaユーザ追加 |
-x | Sambaユーザ削除 |
smbpasswdコマンド
Sambaユーザのパスワード変更を行うコマンド。
smbpasswd [オプション] [Sambaユーザ名]
オプション | 説明 |
---|---|
-d | Sambaユーザの無効化 |
-e | Sambaユーザの有効化 |
-x | Sambaユーザの削除 |
10.2.6. Sambaの管理コマンド
smbstatusコマンド
Sambaサーバに接続されているクライアント、使用中の共有、ロックされているファイルを確認できるコマンド。
smbstatus
nmblookupコマンド
NetBIOS名を問い合わせたり、NetBIOS名からIPアドレスを検索したりできるコマンド。
nmblookup [オプション] NetBIOS名orIPアドレス、ワークグループ名
オプション | 説明 |
---|---|
-A | 引数をIPアドレスとみなす |
-M | マスターブラウザの検索 |
10.2.7. Sambaクライアント
Sambaサーバはサーバ機能のみではなく、LinuxがWindowsネットワーク上の共有リソースにアクセスするためのクライアント機能も提供する。
smbclientコマンド
SambaサーバやWindowsホストにより提供される共有リソースを利用できるコマンド。
smbclient [オプション] 接続先
オプション | 説明 |
---|---|
-L | リスト表示の要求 |
-N | 認証を行わない |
-U ユーザ名 | 接続ユーザの指定 |
サブコマンド | 説明 |
---|---|
cd ディレクトリ | ディレクトリを移動する |
del ファイル | ファイルの削除 |
dir | ファイルリストの表示 |
exit | smbclientの終了 |
get ファイル | ファイルの取得 |
mget ファイル | 複数ファイルをまとめて取得 |
mkdir ディレクトリ | ディレクトリの作成 |
mput ファイル | 複数ファイルをまとめてサーバに転送する |
lcd ディレクトリ | ローカル側のディレクトリに移動 |
put ファイル | ファイルをサーバに転送 |
rmdir ディレクトリ | ディレクトリを削除する |
使用例は以下の通り。
# 共有リソースの一覧表示
smbclient -L 192.168.1.2
# winhostの共有リソースpublicへのアクセス
smbclient //winhost/public
# 共有ディレクトリ/publicを/mnt/publicにマウント
mount -t cifs //winhost/public /mont/public
smbcontrolコマンド
Sambaの主要なデーモンであるsmbd、nmbd、winbinddにメッセージを送ることができるプログラム。
smbcontrol [対象] [メッセージタイプ]
メッセージタイプ | 説明 |
---|---|
close-share | 指定した共有をClose |
reload-config | 指定したデーモンに設定の再読み込みさせる |
kill-client-ip | 指定したIPアドレスのクライアントを切断 |
ping = 指定した対象にpingし応答が来た対象のPIDを表示 |
なお/etc/init.d/winbindd restart
でもwinbinddに設定ファイルを再読み込みは可能。
samba-toolコマンド
Samba4での管理のメインツールとなるコマンド。 ドメイン(AD等)の管理、DNSの管理の他、セキュリティ関連の操作やユーザー管理等も行える。
samba-tool <サブコマンド>
サブコマンド | 説明 |
---|---|
dns | DNS管理 |
domain | ドメイン管理 |
testparm | 設定ファイルの構文チェック |
user | ユーザ管理 |
10.3. NFSサーバの構築
10.3.1. NFS
NFS(Network File System)はネットワークを介してファイルを共有する仕組み。 Unix系OS同士のファイル共有にはNFSが使用される。
NFSサーバが公開したディレクトリはNFSクライアントがマウントすることでリモートファイルシステムをローカルファイルシステム同様に扱うことができる。 NFSサーバを実現するには以下の3つのサービスが必要となる。
サービス | サーバ | クライアント | 説明 |
---|---|---|---|
portmap | 必要 | 必要 | RPCプログラム番号をTCP/IPポート番号に変換 |
nfsd | 必要 | 不要 | ファイルシステムのエクスポート及びクライアント要求処理 |
mountd | 必要 | 不要 | リモートファイルシステムのマウント/アンマウント |
RPC(Remote Proceduce Call)はネットワーク上にあるリモートホストに機能を別のホストから使えるようにする仕組みのこと。
RPCサービスにはRPCプログラム番号が付けられている。対応表は/etc/rpc
で確認可能。
RPCサービスが利用するTCP/UDPポートは動的に割り当てられるため、RPCクライアントの利用にはポート番号を確認する必要がある。 portmapはRPCプログラム番号とポート番号のマッピングを行うサービスとなる。
なおportmapはTCP Wrapprでアクセス制御することが可能。 NFSを利用する際の推奨設定(サービス提供範囲の限定)は以下のように行う。
portmap: 192.168.3.
NFSv3/NFSv4
NFSv4の特徴は以下の通り。
- ポート番号が2049番固定
- idimapdサービスによりUIDの考慮が不要
- ルートディレクトリがエクスポートされているように見える
rpcinfoコマンド
RPCサービスの状況を確認するコマンド。
rpcinfo オプション [ホスト名]
オプション | 説明 |
---|---|
-p | 指定したホストで動作するRPCサービス一覧の表示 |
10.3.2. NFSサーバの設定
NFSサーバで特定のディレクトリを公開することはエクスポートと呼ばれる。
エクスポートするディレクトリは/etc/exports
に記述する。
記述例は以下の通り。
/share 172.16.0.0/255.255.0.0(rw)
/public *.local.jp(ro) local(rw,nor_root_squash)
また/etc/exports
のオプションは以下の通り。
オプション | 説明 |
---|---|
ro | 読み取り専用でエクスポートする |
rw | 読み取り/書き込み属性でエクスポート |
no_root_squash | rootアクセス時にroot権限で実行 |
root_squash | rootアクセス時に匿名アカウント権限で実行(デフォルト設定) |
all_squash | すべてのアクセスを匿名アカウント権限で実行 |
NFSサーバの注意点としてUIDを統一するべき。(UNIXのUIDがそのままNFSサーバでも使用されるため) そうしないと別ユーザとして認識される場合がある。
exportsコマンド
現在のエクスポート状況の表示、/etc/exports
の変更を反映させるコマンド。
exports [オプション] [ホスト:パス]
オプション | 説明 |
---|---|
-a | すべてのディレクトリのエクスポート/アンエクスポート |
-r | すべてのディレクトリの再エクスポート |
-U | アンエクスポート |
-v | 詳細に表示 |
showmountコマンド
NFSサーバのディレクトリをマウントしているNFSクライアントを調べることができるコマンド。
showmount [オプション] [ホスト]
オプション | 説明 |
---|---|
-a | クライアントのホスト名とマウントしているディレクトリの表示 |
-e | 指定したホストでエクスポートしているディレクトリの表示 |
nfsstatコマンド
NFSの統計情報を表示するコマンド。
ntfsstat [オプション]
オプション | 説明 |
---|---|
-s | NFSサーバ側の統計のみを表示 |
-c | NFSクライアント側の統計のみを表示 |
-n | NFSの統計のみを表示 |
-r | RPCの統計のみを表示 |
-o net | ネットワーク層の統計表示 |
10.3.3. NFSクライアントの設定
NFSを使いリモートファイルシステムをマウントするにはmount
コマンドを使用する。
ファイルシステムタイプにはnfs
を指定する。
mount -t nfs filerever:/public /mnt/nfs/public
またNFSをマウントする際のオプションは以下の通り。
オプション | 説明 |
---|---|
bg | マウント失敗時もバックグラウンドで試行し続ける |
fg | マウントをフォアグラウンドで行う |
soft | ソフトマウントを行う |
hard | ハードマウントを行う |
intr | ハードマウント時の割り込みを許可 |
retrans | ソフトマウントの場合の再試行回数 |
rsize=バイト数 | 読み取りのブロックサイズ |
wsize=バイト数 | 書き込みのブロックサイズ |
ソフトマウントとハードマウントはNFSサーバがクラッシュしたり障害が起きた際のNFSサーバが応答がない場合の動作が異なる
- ソフトマウント
- NFSサーバが応答しない場合タイムアウトになる
- ハードマウント
- ハングアップしているように見える
- 応答があるまで要求を再試行し続ける
- これを設定する場合はinitrオプションも指定する必要ある
起動時に自動マウントするには/etc/fstab
に追加しておく。
filesvr:/pub /mnt/nfs/pub nfs rw 0 0
2.11 - 11.ネットワーククライアントの管理
11.1. DHCPの設定
11.1.1. dhcpdの設定
DHCPサーバにはdhcpd
が、DHCPクライアントにはdhclient
,pump
,dhcpcd
が利用される。
dhcpdの設定はdhcpd.conf
で行う。
項目 | 説明 |
---|---|
option domain-name | ドメイン名 |
option domain-name-servers | DNSサーバ |
option routes | DGWのIPアドレス |
option subnet-mask | サブネットマスク |
option broadcast-address | ブロードキャストアドレス |
option ntp-servers | NTPサーバのIPアドレス |
option nis-domain | NISドメイン名 |
option nis-servers | NISサーバのIPアドレス |
option netbios-name-servers | WINSサーバのIPアドレス |
default-lease-time | DHCPクライアントが期限を求めない場合のデフォルトリース期間 |
max-lease-time | DHCPクライアントが上限を求めた場合の最大リース期間 |
range [dynamic-bootp] | クライアントに割り当てるIPアドレス範囲 |
host | クライアントで固定IPアドレスを使用 |
fixed-address | 固定で割り当てるIPアドレス |
hardware | クライアントを特定するためのMACアドレス |
dhcpdの設定例は以下の通り、サブネットごとに設定を記述する。
subnet 192.168.0.0 netmask 255.255.255.0 {
option routers 192.168.0.1;
option subnet-mask 255.255.255.0;
option nis-domain "example.net";
option domain-name "example.net";
option domain-name-servers 192.168.1.1, 192.168.2.1;
option ntp-servers 192.168.1.1;
option netbios-name-servers 192.168.1.1;
range 192.168.0.128 192.168.0.254;
defaut-realse-time 21600;
max-lease-time 43200;
host hostmachine1 {
hardware ethernet 01:23:34:2A:89:0A;
fixed address 192.168.0.100;
}
}
サブネット毎の設定
サブネットごとに割り当てるIPアドレス範囲や特定のマシンに固定IPアドレスを割り当てる設定を行う。 固定IPアドレスの割り当てはMACアドレスで識別を行う。
リース期間
リース期間はIPアドレスをクライアントに貸し出す期間のこと。 指定は秒数で指定する。
なおdhcpdが貸し出しているIPアドレスはdhcpd.leases
に記録される。
作成はtouch /var/lib/dhcop/dhcpd.lease
などで行える。
11.1.2. DHCPクライアントの設定
クライアント側でDHCPを有効にするには設定を行う必要がある。
またdhclient
コマンドでもIPアドレスの取得が可能。
RedHat系の場合
/etc/sysconfig/network-scripts/ifcfg-eth0
などで以下のように設定する。
BOOTPROTO=dhcp
Debian系の場合
/etc/network/interfaces
などで以下のように設定する。
iface eth0 inet dhcp
11.1.3. DHCPリレーエージェント
DHCPリレーエージェントは異なるネットワーク間でDHCPサーバを利用する際に設定するプログラムのこと。
使用するデーモンはdhcrelay
。
設定例ではIPアドレスが172.16.0.2のDHCPサーバにeth1で受け取ったDHCPリクエストをリレーする設定例。
dhcrelay -i eth1 172.16.0.2
11.1.4. IPv6アドレスの自動設定
IPv6の場合はDHCPを使わずにIPアドレスの自動設定ができる。 これはIPv6の仕組みが以下のようになっているからである
- IPv6クライアントはIPv6ルータにルータ要請(RS)を送信
- IPv6ルータはルータ通知(RA)をIPv6クライアントに返送
- IPv6クライアントはルータ情報(prefix)と自身のMACアドレスから生成されるインターフェースIDよりIPv6アドレスを生成する
LinuxではradvdパッケージによりRAを送信できるようにすることができる。
設定ファイルは/etc/radvd.conf
となり以下のように記述する。
inteface eth0 {
AdvSendvert on; #RAの定期的送信の有効化
prefix 2001:db8:0:1::/64; #ローカルアドレス
}
11.2. PAM
11.2.1. PAMの仕組み
PAMはプログラムに対してユーザ認証をするための機能を提供する仕組み。
PAMによりプログラム自体がユーザ情報を/etc/passwd
にあるか別のホストにあるかを気にせずに設定できる。
認証方法は設定ファイルの編集をするだけで可能で、特定ユーザのみの認証などもできる。
11.2.2. PAMの設定
PAMの設定ファイルは/etc/pam.d
ディレクトリに配置さ、ユーザ認証を行うプログラムごとにファイルが用意されている。
またPAM設定ファイルの書式は以下の通り。
モジュールタイプ コントロール モジュールパス 引数
項目 | 説明 |
---|---|
モジュールタイプ | モジュールが用いる認証の型 |
コントロール | 認証の成功/失敗時の処理を指定 |
モジュールパス | どのモジュールを使うか指定 |
- モジュールタイプ
- auth … ユーザ認証を行う
- account … ユーザ認証ができるか確認
- password … ユーザの設定と変更に使用
- session … ユーザ認証の前後に処理する内容を指定
- コントロール
- requisite … モジュールの実行に失敗したら認証拒否する
- required … モジュールの実行に失敗してもすぐに拒否せず、同じモジュールの実行完了後に認証を拒否する
- sufficient … モジュールの実行に成功した場合、上位のrequiredがすべて成功の場合認証を成功とする
- optional … optionalを指定したモジュールタイプが1つだけの場合を除いてPAMに影響を与えない
- include … 指定したファイルの設定を読み込んで処理する
- substack 指定した設定を読み込んで処理する(認証の成否は指定したファイル内で完結し、1モジュールとしてカウントする)
またPAMモジュールは以下の通り。
PAMモジュールは/lib/security
や/lib64/security
に保存される。
PAMモジュール | 説明 |
---|---|
pam-cracklib.so | パスワード安全性の向上 |
pam_pwquality.so | パスワード安全性の向上(RHEL7やCentOS7から使用) |
pam_env.so | ユーザログイン時の環境変数の初期設定 |
pam_deny.so | 認証に対し常に失敗を返す |
pam_limits.so | ユーザが利用できるリソースの制限 |
pam_listfile.so | ファイル内容に基づきサービスの許可/非許可 |
pam_nologin.so | /etc/nologin ファイルがあるとき一般ユーザのログインを拒否する |
pam_pwdb.so | /etc/passwd ,/etc/shadow ,NISを使ったユーザ認証/パスワード変更を行う |
pam_rootok.so | rootユーザによるアクセス許可をする |
pam_secirty.so | /etc/security ファイルに記載された端末のみrootログインの許可 |
pam_stack.so | 他のPAM設定ファイルをincludeする |
pam_succedd_if.so | 特定のファイル属性をチェックしてサービス許可する |
pam_unix.so | 通常のパスワード認証を行う |
pam_ldap.so | LDAP認証を行う |
pam_warn.so | 認証時/パスワード変更時のログ出力する |
pam_sss.so | SSSDを使った認証を行う |
pam_wheel.so | root権限アクセスをwheelグループメンバーのみに制限する |
11.3. LDAP
11.3.1. LDAPとは
LDAPはネットワーク機器やユーザーID、パスワードを管理するディレクトリサービスの維持やアクセスを行うプロトコルのこと。 堅く言うと、X.500をベースとしたディレクトリサービスに接続するために使用されるプロトコルでDAPを軽量化したものともいえる。
一般的にLDAPは一元管理の認証サーバを構築する際に使用される。 LDAPによりユーザやリソースに関する情報を検索したり管理することができる。
なお、OpenLDAPの設定方法は、OpenLDAP2.3以降、テキストの設定ファイルから起動時に設定を読み込む一般的な方法から、LDAPを使った動的な設定方法に変更されている。
LDAPの概念
LDAPではデータをオブジェクトとして扱う。 オブジェクトとは現実世界に存在する何らかの実体をコンピュータ上で表したもの。
- エントリ
- LDAPでのオブジェクトの単位のこと
- それぞれのエントリはオブジェクトクラスに属する
- 下位のエントリを分類する目的のみに使用するエントリはコンテナと呼ばれる
- 属性
- エントリ(オブジェクト)が持つ情報を表すもの
- 属性は属性名と属性値から構成される
- DIT(ディレクトリ情報ツリー)
- エントリ間の関係を階層構造(木構造)で表したもの
11.3.2. LDAPの仕組み
ディレクトリ情報ツリーと識別名
LDAPでは情報はDIT(ディレクトリ情報ツリー)という階層に格納される。 ディレクトリ情報ツリー内のエントリ識別には識別名(DN)を使用する。 識別名はエントリ属性名とその値から構成される相対識別名を「,」でつないだもの、以下のように格納される。
uid=student,ou=IEducation,dc=CCNA,dc=ja
DIT上にあるエントリを識別するための識別子には、DN(Distinguished Name)とRDN(Relative Distinguished Name)がある。
LDIF
LDIFはディレクトリ内の情報を記述するファイル形式のこと。 LDAPサーバにディレクトリ情報を登録、変更する場合に使用されrる。
記法は以下の通り。
dn: 識別名
属性名: 値
属性名: 値
:
LDIFファイルでは最初の行でエントリの識別名(DN)を記述する。 また、複数のエントリを記載する場合は空行で区切り、コメントは行頭に「#」をつける。
なお、属性値は通常UTF-8のテキストで記載するが、バイナリデータなどの特殊なデータを指定する場合は「属性名::属性値」のようにし、属性値にはBase64でエンコードした値を指定する。
オブジェクトクラス
オブジェクトクラスはオブジェクトが持つべき属性(情報)を定義したもの。
LDAPでのオブジェクトの単位であるエントリは、必ずオブジェクトクラスに属する。オブジェクトクラスによってエントリの実体(エントリが人を表すのか、組織を表すのかなど)が決定される。
オブジェクトクラスは以下の通り。
種類 | 説明 |
---|---|
ABSTRACT | 他のオブジェクトクラスを定義するための基底クラス |
STRUCTURAL | 人や組織などを表すオブジェクトクラス |
AUXILIARY | 構造型クラスと共に用いるイブジェクトクラス |
スキーマ
スキーマはオブジェクトや属性の定義のこと。
LDAPでは様々なスキーマが事前に登録されており、/etc/openldap/schema
に格納されている。
主なスキーマファイルは以下の通り。
スキーマファイル | 説明 |
---|---|
core.schema | OpenLDAP必須のスキーマ cnやouなどの基本的属性が定義されている |
cosine.schema | ディレクトリサービスのX.500規格で規定された属性が定義されたスキーマ |
inetorgperson.schema | アドレス帳/個人情報を扱うためのスキーマ |
nis.schema | Unix/Linuxユーザ/グループ情報を扱うためのスキーマ |
属性名
主な属性は以下の通り。
属性名 | 説明 |
---|---|
dn | 識別名 |
objectClass | オブジェクトクラス |
c | 国名 |
cn | 一飯名称 |
dc | ドメイン構成要素 |
メールアドレス | |
o | 組織名 |
ou | 部署などの組織単位 |
sn | 苗字 |
telephoneNumber | 電話番号 |
uid | ユーザのログイン名 |
uidNumber | ユーザID |
オブジェクト識別子
オブジェクトクラスや属性にはオブジェクト識別子(OID)が割り振られる。 OIDは全世界で重複しないようにIANAにより管理されている。
新しいオブジェクトクラスや属性を作成するためにスキーマファイルを作成・拡張する場合は、IANAから一意のOIDを取得する必要がある。
ホワイトページ
ホワイトページは個人別電話帳のことを指す。 LDAPによりホワイトページを作成し個人別データを登録するとメーラなどのネットワーク経由で電話番号など情報検索が可能。
ホワイトページの使用にはinetorgperson.schema
で定義されたinetOrgPerson
クラスを使用するのが一般的となる。
11.3.3. Open LDAPの設定
LinuxでLDAPを使用するにはOpenLDAPが一般的に使用される。 サーバデーモンはslapdとなる。
また設定ファイルは/etc/openldap/slapd.conf
となる。
設定ファイルの例は以下の通り。
# スキーマ定義ファイルのInclude
include /etc/openladp/schema/corba.schema
:
:
# DBの形式
database bdb
# 管理するディレクトリのトップエントリ
suffix "dc=study,dc=jp"
# ディレクトリ管理者のDN
rootdh "cn=Manager,dc=study,dc=jp"
# ディレクトリ管理者のパスワード
rootpw [SSHA]5en8MexzhkJ90K0myuY/BfQ=
# LDAPデータベースの格納ディレクトリ
directory /var/lib/idap
# LDAPのインデックス登録
index objectClass eq.pres
index ou,cn,mail,surname,givenname eq,pres,sub
:
:
slapd.confの設定項目は以下の通り。
設定項目 | 説明 |
---|---|
include | スキーマファイルなど別のファイルを読み込む |
database | ディレクトリデータを格納するBackENDデータベースの形式指定 |
suffix | 管理するディレクトリのトップエントリの指定 |
rootdn | ディレクトリ管理者のDNを指定する |
rootpw | ディレクトリ管理者のパスワードを指定する |
directory | LDAPデータベースの格納ディレクトリのパス指定 |
index | 検索用インデックスを作成する属性とインデックスの種類の指定 |
アクセス制御
OpenLDAPではエントリ/属性に対しアクセス制御(ACL)できる。
accsess to アクセス制御対象
by 接続元 アクセスレベル
アクセス制御対象 | 説明 |
---|---|
* | すべてのエントリ |
attrs=属性 | 指定した属性のみ |
dn=DN | 指定したDNのみ |
接続元 | 説明 |
---|---|
* | すべてのユーザ |
annonymous | 認証前のユーザ |
users | 認証されたユーザ |
self | 接続中の認証済みユーザ自身 |
dn=DN | 指定したDNユーザ |
アクセスレベル | 説明 |
---|---|
write | 属性値を変更できる |
read | 検索結果を参照できる |
search | 検索できる |
compare | 比較できる |
auth | 認証を受けることができる |
none | アクセスできない |
設定例は以下の通り。
# userPassword属性に対し、管理DNとユーザ自身による更新は許可、ユーザ認証前ユーザは認証のみ許可、それ以外のユーザはアクセス禁止する例
access to attrs=userPassword
by dn="cn=Manage,dc=study,dc=jp" write
by self write
by annonymous auth
by * none
LDAPの起動
slapdの起動は以下のようにする。
/usr/local/etc/libexex/slapd
SysVinitのシステムでは以下のように起動。
/etc/init.d/slapd start
systemdのシステムでは以下の通り。
systemctl start slapd.service
slappasswdコマンド
slapd.confファイルのrootpwに関する管理者パスワードを作成するコマンド。 サーバ管理者のパスワードをハッシュ化して生成する。
slappasswd
slapcatコマンド
LDAPデータベースの内容をLDIF形式で出力するコマンド。
slapcat > ldapdb.ldif
slaptestコマンド
設定ファイルslapd.conf
の構文をチェックするコマンド。
slaptest
slapaddコマンド
LDIFデータをLDAPデータベースにリストアするコマンド。
slapadd -l ldapdb.ldif
オプション | 説明 |
---|---|
-v | 詳細表示 |
-d 数 | デバッグレベルの指定 |
-f ファイル | 設定ファイルの指定 |
-c | エラー時も処理を継続 |
-n 数 | 使用するデータベースをDB番号で指定 |
-b DN | 使用するデータベースをDNで指定 |
slapindexコマンド
データベースのインデックスを再構築するコマンド。 slapaddコマンドの後に実行する。
slapindex
11.3.4. LDAPクライアントの利用
LDAPクライアントコマンドには以下のようなコマンドがある。
コマンド | 説明 |
---|---|
ldapadd | エントリを追加する |
ldapsearch | エントリを検索する |
ldapdelete | エントリを削除する |
ldapmodify | エントリを変更する |
ldappasswd | パスワードを変更する |
ldapaddコマンド
エントリを追加するコマンド。
追加するには/tmp/test.ldif
にLDIFで記述してからコマンドを実行して追加する。
ldapadd <オプション>
オプション | 説明 |
---|---|
-h ホスト | LDAPサーバの指定(デフォルトはローカルホスト) |
-x | SASLを使わず簡易認証を用いる |
-D バインドDN | 認証に利用するDNを指定する |
-W | 認証時のパスワードを対話的に入力する |
-w パスワード | 認証時のパスワードを指定する |
-f ファイル名 | LDIFファイルの指定 |
ldapdeleteコマンド
LDAPサーバに登録されたエントリを削除するコマンド
ldapdelete
ldapsearchコマンド
エントリを検索するコマンド。
ldapsearch <オプション> 検索フィルタ <出力属性>
オプション | 説明 |
---|---|
-h ホスト | LDAPサーバの指定 |
-H URI | LDAPサーバの指定をldapurlで指定 |
-x | SASLを使わず簡易認証を用いる |
-D バインドDN | 検索を開始するDNを指定する |
-L | 検索結果をLDIFv1形式で表示する |
-LL | 検索結果をコメントなしで表示する |
-LLL | 検索結果をコメントとLDAPバージョン表示なしで表示する |
-b 識別名 | 検索開始位置の指定 |
ldapsearchコマンド
LDAPサーバのエントリを検索するコマンド。
ldapsearch [オプション] 検索条件 [出力属性]
オプション | 説明 |
---|---|
-h ホスト名/IPアドレス | 検索を行うLDAPサーバを指定 |
-H URI | 検索を行うLDAPサーバをldapuri形式で指定 |
-x | SASLを使用せずに簡易認証を行う |
-b 識別名 | 検索開始位置の指定 |
-L | 検索結果をLDIFv1形式で表示 |
-LL | 検索結果をコメントなしで表示 |
-LLL | 検索結果をコメントとLDAPバージョン表記なしで表示 |
11.3.5. slapd-config
OpenLDAP2.3以降の設定方法はslapd-configと呼ばれる。 この方法ではLDAPのデータベース(ディレクトリ)に保存されている設定データを追加・変更・削除等することで、動的に設定を更新する。 これはディレクトリベースの設定と呼ばれ、通常は設定変更による再起動等が不要となる。
また、設定データベースのツリー構造のルートは、DN(識別名)がcn=configで定義され、変更できない。
設定を行う際は設定用のLDIFファイルを定義し、ldapadd
、ldapdelete
、ldapmodify
といったコマンドにより、データベースを更新する。
グローバルセクションに使用する主なディレクティブ
グローバルセクションに使用する主なディレクティブは以下の通り。
slapd.confディレクティブ | slapd-configディレクティブ | 説明 |
---|---|---|
argsfile ファイル名 | olcArgsFile | slapdデーモン起動時のコマンド引数を格納するファイルの指定 |
pidfile ファイル名 | olcPidFile | slapdのプロセスIDを格納するファイルの指定 |
include ファイル名 | olcInclude | 読み込む設定ファイルのを指定 |
logfile ファイル名 | olcLogFile | デバックログの出力ファイルを指定 |
loglevel 数 | olcLogLevel | ログレベルの指定 |
idletimeut 秒数 | olcIdleTimeout | アイドル状態のクライアント接続を強制的に切断するまでの秒数指定 |
timelimit 秒数 | olcTimeLimit | slapdが検索要求の応答に使う最大秒数の指定 |
データベースセクションで使用する主なディレクティブ
slapd.confとslapd-configのデータベースセクションで使用する主なディレクティブの対応表は以下の通り。
slapd.confディレクティブ | slapd-configディレクティブ | 説明 |
---|---|---|
database 種類 | orcDatabase | バックエンドデータベースの種類を指定 |
suufix DN | orcSuffix | ディレクリのトップとなるDNの指定 |
rootdn DN | orcRootDN | データベース管理者のDNの指定 |
rootpw パスワード | orcRootPW | データベース管理者のパスワードを指定 |
index 属性名 種類 | orcDbindex | 属性に作成するインデックスの種類の指定 |
dircetory ディレクトリ | orcDbDirectory | データベースファイルを格納するディレクトリの指定 |
slapd-configで使用される基本的なディレクティブ
slapd-configで使用される基本的なディレクティブは以下の通り。 なお「olc」という文字は「OpenLDAP Configuration」の略となる。
ディレクティブ | 説明 | 定義されるエントリと説明 |
---|---|---|
orcLogLevel | syslogに出力するレベル指定 orcLogLevel: | cn=config サーバ全体に適用 必須オブジェクトクラス: orcGlobal |
orcInclude | includeファイルを指定 orcInclude <ファイル名> | cn=include slapd.confのincludeファイル用 必須オブジェクトクラス:orcIncludeFile |
orcAttributeTypes | 属性名の定義 orcAttributeTypes: <属性名> | cn=schema 組み込みのスキーマ定義 必須オブジェクトクラス:orcSchemaConfig |
orcObjectClasses | オブジェクトクラスを定義 orcObjectClasses: <オブジェクトクラス> | cn=schema 組み込みのスキーマ定義 必須オブジェクトクラス:orcSchemaConfig |
orcBackend | バックエンドの指定 orbBackend = <タイプ> | 必須オブジェクトクラス: orcBackendConfig: [type] typeはbdb,config, ldap, ldif, passwdがある |
slapd-configのアクセス権の設定
olcAccessディレクティブを用いてバインドしたDN(ユーザ)に応じたアクセス権の設定を行える。
olcAccess: to アクセス対象 by 要求者 アクセス権 by 要求者 アクセス権 ...
なお、複数行にまたがって記述する場合は2行目以降の行頭にスペースを入れる。
olcAccess: to アクセス対象
by 要求者 アクセス権
by 要求者 アクセス権
アクセス制御対象 | 説明 |
---|---|
* | すべてのエントリ |
attrs=属性 | 指定した属性のみ |
dn=DN | 指定したDNのみ |
filter=検索フィルタ | 検索フィルタにマッチするエントリ |
接続元 | 説明 |
---|---|
* | すべてのユーザ |
annonymous | 認証前のユーザ |
users | 認証されたユーザ |
self | 接続中の認証済みユーザ自身 |
dn=DN | 指定したDNユーザ |
アクセスレベル | 説明 |
---|---|
write | 属性値を変更できる |
read | 検索結果を参照できる |
search | 検索できる |
compare | 比較できる |
auth | 認証を受けることができる |
none | アクセスできない |
11.4. SSSD
SSSDはLDAPなどの認証サービスとの通信を管理/情報をキャッシュする仕組み。 これによりLDAPサーバダウン時の可用性の向上や負荷を軽減することができる。
SSSDに設定は/etc/sssd/sssd.conf
で行う。
[sssd]
config_file_version = 2
services = nss, pam
domains = LDAP
[nss]
filter_users = root,dnsmasq,dbus,bin,daemon,games,gdm,lp,mail,mysql,news,ntp,openldap,sshd,sync,sys
filter_groups = root
homedir_substring = /home
[pam]
[domai/LDAP]
id_provider = ldap
ldap_uri = ldap://ldap.test.com:389
ldap_search_base = dc=test,dc=com
ldap_tls_reqcert = never
ldap_id_usb_start_tls = true
ldap_tls_cacert = /etc/pki/tls/certs/ca-bundle.crt
ldap_schema = rfc2307
cache_ceredentials = true
enumerate = true
sssdサービスはsystemctl start sssd.service
で可能。
また/etc/nsswitch.conf
で以下のようにSSSDを参照するようにする。(sssと記述する)
passwd: files sss
shadow: files sss
group: files sss
2.12 - 12.メールサービス
12.1. SMTPサーバの構築
12.1.1. メールの仕組み
メールを処理するソフトウェアにはMTA(メッセージ転送エージェント)、MDA(ローカルメール転送エージェント)、MUA(メールユーザエージェント)がある。MUAはメーラ(メールソフトウェア)となる。
- MUA(Mail User Agent):メールの確認や作成を行うユーザインタフェース
- MTA(Mail Transfer Agent):メールの転送
- MDA(Mail Delivery Agent):メールの配送(仕分け)
メール転送のフローは以下の通り。
- MUAからメールサーバMTAはメールを受け取る
- メールサーバMTAはDNSサーバに問い合わせ配送先のメールサーバMTAを調べて転送する
- 配送先メールサーバMTAがメールを受け取るとMDAにより宛先ユーザのメールボックスにメールを収納する
- 受取先ユーザはPOPサーバやIMAPサーバ経由でメールボックスからメールを取り出す
MUAからメールをMTAに送信するとき、MTA間でのやり取りはSMTPが使用されるため、MTAはSMTPサーバと呼ばれる。 MUAがメールを受け取る際はPOPやIMAPが使用され、現在は主にPOP3やIMAP4が使用される。
SMTPサーバの代表的なものにはPostfixやsendmail、eximなどがある。 POP/IMAPサーバにはDovecotやCourier Mail Serverなどがある。
メールボックスの形式には2種類ある。
- mbox形式 …
/var/mail
ディレクトリに1ユーザ1ファイルとして保存する形式(1つのファイルに全部保存) - Maildir形式 … ユーザのホームディレクトリ以下に1メール1ファイルとして保存する形式
12.1.2. Postfixとは
Postfixはsendmailと互換性を持つ新規開発されたMTA。 高速動作と設定が簡単なのが特徴で、デフォルトで使用するMTAとして最も一般的となっている。 Postfixは単一のデーモンプではなく複数のプログラムが協調して動作する。
Postfixを構成するプログラムは以下の通り。
プログラム | 役割 |
---|---|
sendmail | sendmail互換インターフェース |
smtpd | 外部配送の処理 |
pickup | maildropキューの監視、内部配送の処理を行う |
cleanup | ヘッダ内の書き換えなどを来ないincomingキューに入れqmgrに通知する |
qmgr | キュー内のメール配送プログラムに渡す |
nqmgr | qmgrと同じ(配送アルゴリズムのみ異なる) |
master | 全体制御用デーモン |
bounce | バウンスメール(設定ミスなどで往復する)を処理する |
12.1.3. Postfixの設定
Postfixの設定ファイルは/etc/postfic
ディレクトリ以下のmain.cf
とmaster.cf
で行う。
main.cfはMTAの基本設定ファイル、master.cfはPostfix構成する各種デーモンの設定ファイルとなる。
main.cfの設定
main.cfの書式は以下の通り。
設定項目 = パラメータ[, パラメータ ...]
#
でコメントアウト$
を設定項目に付けると変数名のように参照できる。
設定例は以下の通り。
# ホスト名
myhostname = www.sample.com
# ドメイン名
mydomain = example.com
# メールアドレスの@以降のドメイン名
myorigin = $mydomain
# SMTP接続を待ち受けるNIC
inet_interfaces = all
# IPv4/IPv6の動作をall/ipv4/ipv6で指定
ip_protocols = all
# ローカル配送を行うドメイン名(メール受け取りドメイン名)
mydistination = $myhostname, localhost. $mydomain, localhost, $mydomain,mail.$mydomain, www.$mydomain, ftp.$mydomain
# 中継許可するSMTPクライアントのアドレス
mynetworks = 172.20.0.0/16, 127.0.0.0/8
# メールスプールディレクトリ
mail_spool_directory = /var/spool/mail
# ローカル配送を行うプログラム
mailbox_command = /usr/bin/procmail
# SMTPで出力されるバナー情報(デフォルトではバージョン非表示)
smtpd_banner = $myhostname ESMTP $mail_name
postconfコマンド
Postfix全般設定値を表示するコマンド。 なお表示される値は設定ファイルに基づいて表示される。
postconf
-n
オプションではデフォルト値から変更されている項目のみ表示される。
master.cfの設定
Postfixを構成するプロセスの動作を設定するファイル。
postfixコマンド
Postfixの制御を行うコマンド。
postfix <サブコマンド>
オプション | 説明 |
---|---|
start | Postfixの開始 |
stop | Postfixの停止 |
abort | Postfixの強制停止 |
flush | キュー内にあるメッセージの再送 |
reload | Postfixの設定を再読み込みする |
check | 設定ファイルの構文チェックを行う |
また起動スクリプトやsystemdによる起動停止も行える。
/etc/init.d/postfix stop
systemctl stop postfix.services
Postfixの正規化機能
Postfixにはcanonical(正規化)と呼ばれる、送信者、受信者のアドレスを書き換える機能がある。 この機能により、以下のようなことが可能となる。
- 異なる送信者から受け取ったメールを、単一の送信者から送られたように見せる
- ユーザ名(ログインID)と異なるメールアドレスを使用する
canonical機能は以下の手順で有効にする。
- main.cfにて、書き換えルールの参照先(検索テーブル)を指定
* 書き換えルールには以下のパラメータが指定可能
*
canonical_maps
:送受信時の書き換えで参照する検索テーブル *sender_canonical_maps
:送信者アドレスの書き換え時に参照する検索テーブル *recipient_canonical_maps
:受信者アドレスの書き換え時に参照する検索テーブル - 検索テーブルの作成、更新
なお、指定する検索テーブルにはMySQLやPostgreSQLなどのデータベース、LDAP、正規表現などが使える。
12.1.4. メールのリレー
メールのリレーはMTA間でのメール中継のこと。 他ホスト宛てのメールを受け取った場合、MTAはそのメールリレーを許可するか判断する。 リレーを無制限に許可すると、スパム送信の踏み台として利用されかねないので設定をしっかり行う必要がある。
以下の原則に従うと良い。
- リレーを許可したいLAN内のアウトバンドメールは許可
- リレーを許可したいドメインのメールは許可
- 外部のアウトバンドメールは拒否
なお一般的にはデフォルト設定でメールリレーは禁止されている。
Postfixの場合はmydistination
パラメータやmynetworks
パラメータで制御を行う。
12.1.5. メールエイリアス/メール転送
/etc/aliases
(または/etc/mail/aliases
)によりメールアカウントと実際に受け取るユーザ名の対応設定ができる。
書式は以下の通り。
アカウント: 受取ユーザ1[, 受取ユーザ2...]
受取ユーザの別名ではユーザ以外に以下のように指定できる。
別名 | 説明 |
---|---|
/path | パスにあるファイルにメールメッセージを追加する |
|command | 指定したコマンドの標準入力へメールメッセージを送る |
user@domain | 指定したメールアドレスにメールを転送する |
:include:/path | パスに指定したファイルに別名として読み込む |
newaliasesコマンド
/etc/aliases
のファイル内容を変更後に設定を反映させるコマンド。
newaliases
.forwardファイル
ユーザのホームディレクトリに.forward
ファイルを作成し、そこに届けたい先のメールアドレスを記述すると、そのユーザに届いたメールアドレスを届けたい先のメールアドレスに転送できる。
12.1.6. SMTPサーバの運用と管理
メールキュー
メールキューは処理待ちメールが一時的に保持される場所のこと。 各MTAでは以下の場所に格納される。
- Postfix
/var/spool/postfix
ディレクトリ以下のサブディレクトリmailq
コマンドで内容表示可能postfix flush
コマンドで直ちに送信が可能postsuper -d
コマンドでメールキュー内のメールを削除可能
- Sendmail
/var/spool/mqueue
ディレクトリ以下postqueue -p
コマンドで内容表示可能postqueue -f
コマンドで直ちに送信が可能
メールボックス
メールボックスはメールサーバが受け取ったメールが保存される場所。 各MTAでは以下の場所に格納される。
- Postfix
/var/spool/postfix
ディレクトリ以下のユーザ名のテキストファイル- メールの保存にはmbox形式とmaildir形式が使用できる
- maildir形式の利用設定には
home_mailbox = Maildir/
とmain.cfで記述する
- Sendmail
/var/spool/mail
ディレクトリ以下のユーザ名のテキストファイル
12.2. メールのフィルタリング
メールのフィルタリングはスパムメールなどのメールをルールに従って振り分ける仕組み。
12.2.1. Sieveの設定
Sieveはメールフィルタリングを行うための記述言語。 **「コントロール」「テスト」「アクション」**という3種類のコマンドで構成される。 Dovecotと連携し、サーバ側でメールフィルタリング処理を実行できる。
書式は以下の通り。
if 条件 {
条件がマッチした場合の処理;
}
5GByteを超えるメールを拒否する設定例は以下の通り。
require ["reject"]
if size :over 5G {
reject "Too Big Size";
}
sleveのコントロールは以下の通り。
コントロール | 説明 |
---|---|
if | if-elsif-else |
require | 拡張機能を指定 |
stop | 処理を停止 |
sieveの主なアクションは以下の通り。
アクション | 説明 |
---|---|
fileinfo | メールを指定したメールボックスに配送する |
keep | メールをデフォルトのメールアドレスに配送する |
discard | メールを破棄する |
reject | メールを拒否する |
redirect | メールを指定したメールアドレスに転送する |
stop | 処理を停止する |
テスト | 説明 |
---|---|
address | アドレスを評価 |
header | メールヘッダを評価 |
size | メールサイズの評価 |
allof | AND |
anyof | OR |
not | NOT |
true | 真 |
false | 偽 |
12.2.2. Procmailの設定
ProcmailはMDAの1つでMTAが受け取ったメールをここユーザに配送する。 procmaliをMDAに使うとメールフィルタリングや不要メールの自動破棄などが可能。
フィルタリング設定は各ユーザのホームディレクトリの.procmailrc
ファイルで設定を行う。
フィルタリングルールはレシピと呼ばれ3行で指定する。
:0 [フラグ] [:ロックファイル]
* 条件式
アクション
フラグはprocmailにメールを渡す方法を指定。条件式は正規表現でメール条件を記述する。
フラグ | 説明 |
---|---|
D | 大文字小文字を区別する |
H | メールのヘッダ部分で検索する |
B | メールの本文部分で検索する |
c | メールのコピーを残す |
h | アクションにヘッダ部分を渡す |
b | アクションに本文部分を渡す |
条件式 | 説明 |
---|---|
! | 条件否定 |
> | 指定したバイト数より大きいときに処理 |
< | 指定したバイト数より小さいときに処理 |
アクション | 説明 |
---|---|
/dev/null | 破棄する |
ファイル名 | 指定したファイル名のファイルに格納する |
ディレクトリ名 | ディレクトリ内にファイル名を付けて保存する |
ディレクトリ名/. | ディレクトリ内に連番を付けて格納する |
|パス名 | 指定したパスのプログラムに渡す |
!メールアドレス | 指定したメールアドレスに転送する |
12.3. POP/IMAP
POP/IMAPはメーラがメールボックスからメールを取りf出すのに使用する。 これらのサービスの利用にはDovecotやCourier IMAPなどがある。
- Dovecot
- POP3/IMAPをサポートするMRA
- Maildir及びmbox形式のメールボックスをサポート
- Courier IMAP
- 主にIMAPをサポートするMRA
- Maildir形式のメールボックスのみをサポート
12.3.1. Dovecot
DovecotはPOP3/IMAP4に加えSSL/TLSに対応したMDA。
設定は/etc/dovecot.conf
で行う。
Dovecotの設定項目は以下の通り。
設定項目 | 説明 |
---|---|
auth_mechanisms | 利用する認証メカニズム |
mail_location | メールの配送場所と配送形式 |
ssl | SSL/TLSの有効化のどうか |
ssl_cert | サーバ証明書のファイル |
ssl_key | サーバ鍵ファイル |
メール関連のポートは以下の通り。
ポート | 説明 |
---|---|
110 | POP3 |
143 | IMAP |
993 | IMAP over SSL/TLS |
995 | POP3 over SSL/TLS |
# dovecot.confより
listen = 192.168.1.1
protocols = imap pop3 lmtp
# psコマンドの出力に詳細表示を行う
verbose_proctitle = yes
# /conf.d/10-mail.confより
mail_location = mbox:~/mail:INBOX=/var/spool/mail/%u
# /conf.d/10-auth.confより
auth_mechanisms = plain login cram-md5 apop digest-md5
# /conf.d/20-imap.confより
protocol imap {
mail_max_userip_connections = 10
}
auth default {
mechanisms = plain login cram-md5 apop digest-md5
}
doveconfコマンド
Dovecotの設定内容を出力できるコマンド。
doveconf
オプション | 説明 |
---|---|
-n | デフォルト以外の設定を表示 |
-c | 設定ファイルを指定 |
doveadmコマンド
Dovecotの管理用コマンド。
doveadm <サブコマンド>
サブコマンド | 説明 |
---|---|
config | 設定内容を表示 |
reload | 設定の再読み込み |
stop | dovecotプロセスの終了 |
log find | ログファイルパスの確認 |
log test | テストログメッセージの生成 |
mailbox | メールボックスを管理 |
who | サーバログイン中のユーザ情報表示 |
pw | パスワードハッシュ値の生成 |
2.13 - 13.システムセキュリティ
13.1. パケットフィルタリング
パケットフィルタリングはカーネルが処理するパケット情報を調べて通過させたり遮断させたりすること。 パケットフィルタリングはINPUT(入力),OUTPUT(出力),FORWARD(転送)の3か所で行う。 それぞれINPUTチェイン、OUTPUTチェイン、FORWARDチェインと呼ばれる。
なおチェインはパケットを検査するためのルールセットのこと。 ネットワークインターフェイスを通過するパケットはチェインのルールに適合する検査され、破棄されたり通過させたりされる。 チェインのいくつか集めたセットはテーブルと呼ばれる。 テーブルには以下の種類がある。
テーブル | デフォルトチェイン |
---|---|
filter | INPUT, OUTPUT, FORWARD |
nat | PREROUTING, POSTROUTING, OUTPUT |
mangle | INPUT, OUTPUT, FORWARD, PREROUTING, POSTROUTING |
13.1.1. iptablesコマンド
iptablesコマンドはパケットフィルタリングやNAT(ネットワークアドレス変換)の設定を行うコマンド。 書式は以下の通り。
# チェインの最後にルールの追加/削除
iptables -[AD] チェイン ルール
# チェインのポリシ変更
iptables -P チェイン ターゲット
# ユーザ定義チェインの一覧表示/強制全削除/作成/削除
iptables -[LFNX] チェイン
# NATテーブルの表示
iptables -t NAT -L
# チェインにルールを挿入
iptables -I チェイン [ルール番号] ルール
オプション | 説明 |
---|---|
-v | 詳細に表示する |
-n | 数値で表示する |
–line-numbers | ルール番号を表示する |
コマンド | 説明 |
---|---|
-A | 指定したチェインの最後にルールを追加 |
-D | 指定したチェインの最後のルールを削除 |
-P | 指定したチェインのポリシ変更を行う |
-L [チェイン] | ルールのリストを表示する |
-N チェイン | 指定した名前のユーザ定義チェインを作成 |
-X チェイン | 指定した名前のユーザ定義チェインを削除 |
-l | ルール番号を指定してルールを挿入 |
-F チェイン | 指定したチェインのルールをすべて削除 |
チェイン | 説明 |
---|---|
INPUT | ホストに入ってくるパケット |
OUTPUT | ローカルマシンで生成されたパケット |
FORWARD | ホストを経由するパケット |
PREROUTING | 入ってきたパケットの変換 |
POSTROUTING | 出ていくパケットの変換 |
ターゲット | 説明 |
---|---|
ACCEPT | パケット通過の許可 |
DROP | パケットを破棄 |
REJECT | パケットを拒否(送信元に通知する) |
MASQUERADE | 送信元IPアドレスのポート番号変換 |
SNAT | 送信元IPアドレスの変換 |
DNAT | 送信元IPアドレスの変換 |
LOG | ログに出力 |
ルール | 説明 |
---|---|
-s 送信元 | 送信元IPアドレス |
-d 送信元 | 送信元IPアドレス |
–sport ポート番号 | 送信元ポート番号 |
–dport ポート番号 | 送信元ポート番号 |
–to | 宛先指定(IPアドレス:ポート番号) |
-j ターゲット | 適用されるターゲット |
-p プロトコル | プロトコル(tcp,udp,icmp,all) |
-i インターフェイス名 | 入力インターフェースの指定 |
o インターフェース名 | 出力インターフェースの指定 |
使用例は以下の通り。
# FORWARDチェインのポリシーをDROP変更
iptables -P FORWARD DROP
# 特定のIPからのICMPパケットを拒否する
iptables -A INPUT -p icmp -s 192.168.2.0/24 -j REJECT
# パケットフィルタリングの挙動をログに保存する(journalctlなどで確認可能)
iptables -A INPUT -p tcp --dport 23 -j LOG --log-prefix "Telnet Trying ..."
iptables -A INPUT -p tcp --dport 23 -j DROP
iptables設定の保存
各ディストリビューションにおけるiptablesの保存方法は以下の通り。
# RedHat系
service iptables save
iptables-save > /etc/sysconfig/iptables
# Debian系
iptables-save > /etc/iptables/rules.v4
iptables設定の復元
iptables設定の復元はiptables-restore
コマンドで行う。
iptables-restore < iptables.backup
firewalld
CentOS7系やUbuntu22.04などではFWの仕組みにfirewalldが採択されている。 そのためデフォルトではiptablesを利用できない。
この場合利用するとき、firewalldサービスを停止しiptables-serviceパッケージをインストールする必要がある。
なおUbuntuなどではiptables
コマンドではなくufw
コマンドを用いてFWの設定を行うのが一般的となる。
13.1.2. ポート転送
ポート転送は外部から届いたパケットの送信先ポート番号を変えて内部に転送すること。 以下に、外部(eth1)、内部(172.16.0.0/16)の172.16.0.2の80ポートに届くようにする際の設定例を記載する。
iptables -A FORWARD -d 172.16.0.2 -p tcp --dport 80 -j ACCEPT
iptables -t nat -A PREROUTING -p tcp --dport 8080 -i eth0 -j DNAT --to 172.16.0.2:80
13.1.3. ip6tablesコマンド
IPv6の場合にパケットフィルタリングの設定を行うコマンド。
使い方はip6tables
コマンドとほぼ同じとなっている。
iptables設定の保存
各ディストリビューションにおけるip6tablesの保存方法は以下の通り。
# RedHat系
service ip6tables save
ip6tables-save > /etc/sysconfig/ip6tables
# Debian系
ip6tables-save > /etc/iptables/rules.v6
13.2. ルータの構成
Linuxホストをルータとして利用することもできる。 ルータとして使用するにはルーティングテーブルを適切に設定する必要がある。
13.2.1. ルーティングテーブル
route/netstat -rコマンド
route
コマンドやnetstat -r
コマンドはルーティングテーブルを表示するコマンド。
ルーティングテーブルに表示されるエントリには静的経路、動的経路がある。
- 静的経路 …
route
コマンドにより設定される経路 - 動的経路 … ルータ同士が情報交換することで自律的形成される経路
Linuxで動作するルーティングソフトにはQuaggaがある。 なお動的経路を使用しない場合はパケットフィルタリングのiptablesのみで十分となる。
Linuxをルータとして使用する場合は以下ファイルの値が1である必要がある。
- IPv4の場合 …
/proc/sys/net/ipv4/ip_forward
- IPv6の場合 …
/proc/sys/net/ipv6/conf/all/forwarding
上記設定のみではシステム再起動後に設定が初期化されるので、/etc/sysctl.conf
ファイルや/etc/sysconfig/network
ファイルにFORWARD_IPv4=yesやnet.ipv4.ip_forward=1など記述する必要がある。
13.2.2. IPマスカレード
IPマスカレードはLAN側ホストがインターネットを利用する際にIPアドレスをグローバルアドレスに変換したり、その逆を行う機能のこと。
IPマスカレード設定をLinuxで行う場合はiptables
で以下のように設定する。
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
設定例は以下の通り。
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth1 -j SNAT 10.1.2.3
13.3. FTPサーバのセキュリティ
Linux/Unix系OSで使用されているFTPサーバにはwu-ftpdや設定が容易であるProFTPDや、安全性の高いvsftpd、セキュリティと実用性重視のPure-FTPDなどがある。
13.3.1. ProFTPD
ProFTPDはproftpd.conf
で設定を行う。
なお書式はApacheの設定と似ているため設定しやすい。
# アクセス時表示のサーバ名
ServerName "ProFTPD Default Installation"
# デーモン(standalone)かスーパーサーバ(inetd)経由かを指定
ServerType standalone
# バージョンを隠す
ServerIdent No
# Rootログインを許可しない
RootLogin Off
# ホームディレクトリより上のディレクトリに移動禁止
DefaultRoot
# PAM認証
AuthPAMAuthorization on
# タイムアウトするまでの秒数
TimeoutIdle 120
# ポート番号
Port 21
# Umask値
Umask 022
# 最大接続クライアント数
maxClientPerHost 10
# 最大子プロセス数
MaxInstances 30
# 子プロセスの実行ユーザ/実行グループ
User nobody
Group nobody
<Global>
# ファイル上書きファイル転送の許可
AllowOverwrite yes
<Limit All SITE_CHMOD>
# 全てのFTPコマンドとアクセス権限の変更
AllowAll
</Limit>
</Global>
# 読み取りは許可/書き込みは禁止
<Limit READ>
AllowAll
</Limit>
<Limit STOR>
DenyAll
</Limit>
# 全てのIPアドレスからのログイン許可
<Limit LOGIN>
Order Deny.Allow
Allow from all
</Limit>
# 匿名ログインの同時接続ユーザ数と超過メッセージ
MaxClients 100 "Sorry, max %m users -- try again later"
# ファイル転送ログ
TransferLog /var/log/proftpd/xferlog/legacy
アクセス制御はLimitディレクティブで行う。 Limitディレクティブにはアクセス制御ディレクティブやFTPコマンド/FTPコマンドグループを記述できる。
<Limit FTPコマンド/FTPコマンドグループ>~</Limit>
アクセス制御ディレクティブ | 説明 |
---|---|
Order Allow,deny/deny.allow | AllowとDenyがチェックされる順序 |
Allow from 場所 | 許可するホストやネットワーク設定 |
AllowAll | 許可を明示 |
AllowUser | 許可するユーザ |
AllowGroup | 許可するグループ |
Deny from 場所 | 拒否するホストやネットワーク設定 |
DenyAll | 拒否を明示 |
DenyUser | 拒否するユーザ |
DenyGroup | 拒否するグループ |
FTPコマンド | 説明 |
---|---|
RETR | サーバからクライアントへのファイル転送 |
STOR | クライアントからサーバへのファイル転送 |
REN | ファイル名変更 |
DELE | ファイル削除 |
RMD | ディレクトリ削除 |
SITE_CHMOD | パーミッション変更 |
FTPコマンドグループ | 説明 |
---|---|
DIRS | ファイル一覧の取得 |
READ | ファイルの読み取り |
WRITE | ファイル/ディレクトリの作成/削除 |
ALL | すべてのFTPコマンド |
LOGIN | ログイン |
13.3.2. vsftpd
vsftpdの設定はvsftpd.conf
で設定を行う。
# ローカルユーザログインの許可
local_enable=Yes
# 書き込みを許可
write_enable=Yes
# umask値を022にする
local_umask=022
# 20番ポートからの送信接続
connect_from_port_20=YES
# ファイル転送ログを残す
xferlog_enable=YES
# ファイル転送ログファイル
xferlog_file=/var/log/vsftpd.log
# ログファイルの形式(YESの場合はwu-ftpdと同様の形式)
xferlog_std_format=NO
13.3.3. FTPサーバのアクセス制御
FTPログインを許可しないユーザの指定は/etc/ftpusers
にユーザリストを記述する。
主にrootユーザやシステムアカウントを記述すると良い。
root
bin
daemon
mail
:
:
chroot機能で特定のディレクトリ以外のディレクトリにユーザが移動することを禁止できる。 これはセキュリティ上重要な設定となる。
- proftpd.confの場合
DefaultRoot ~
- vsftpd.confの場合
chroot_local_user=YES
chroot_list_file=/etc/vsftpd.chroot_List
13.3.4. Pure-FTPD
Pure-FTPDの場合はpure-ftpd.conf
で設定を行う他、起動時のオプションで動作を指定することもできる。
オプション | 説明 |
---|---|
-4 | IPv4のみの利用 |
-A | 全ユーザにchrootの利用 |
-B | デーモンとして動作する |
-c 数 | 最大クライアント数 |
-C 数 | IPアドレスあたりの最大クライアント数 |
-e | 匿名ユーザのみログインを許可する |
-E | 匿名ユーザの利用拒否 |
-i | 匿名ユーザにファイルのアップロードを禁止する |
# 全ユーザに対してchrootを適用
ChrootEveryone yes
# 最大クライアント数
MaxClientsNumber 50
# IPアドレス当たりの最大クライアント数
MaxClientPerIP 8
# Yesでデーモン動作、Noでxinitd経由(スーパーデーモン)
Daemonize yes
# ドットファイルの表示の有無
DisplayDotFiles yes
# PureDBの利用
PureDB /etc/pure-ftpd/pureftpd.pdb
# PAM認証の利用有無
PAMAuthentication no
13.2.5. パッシブモード
通常FTPサーバはデータ転送に20/21番ポートを使用し、一般的にはクライアントからサーバ側へ接続要求を行う。 FTPのデータ転送に関してはFTPサーバ側からクライアントに接続要求するアクテイブモードと言われる方法となる。
この場合クライアント側のFWの設定なので接続できない場合があるためパッシブモードでFTPサーバを動作させることで回避できる。 パッシブモードではデータ転送の際にクライアント側からサーバへ接続要求することができる。
各サーバにおけるパッシブモードの設定方法は以下の通り。
# proftpd.confの場合
# ルータのWAN側IPアドレス
MasqueradeAddress 10.2.3.4
# 利用するポート設定
PassivePorts 52000 52020
# vsftpdの場合
pasv_enable=YES
# Pure-FTPDノヴァ愛
PassivePortRange 30000 50000
13.2.6. 匿名FTPサーバ
匿名FTPサーバ(Annonymous FTP)は匿名でFTPサーバを利用できるようにすること。 この場合chrootにより権限のないディレクトリにアクセスできないようにすることが重要となる。
方法としては以下の通り。
/home/ftp
などのディレクトリを作成する/bin
,/lib
,/etc
などを作成しFTPサービス運営に必要なファイルをコピーする- anonnymousユーザ用のディレクトリ(
/home/ftp/pub
)などを作成する /home/ftp
にchrootする
上記手順により他のディレクトリにannonymousユーザはアクセスできなくなる。
# proftpdの場合
<Anonymous ~ftp>
User ftp
Group ftp
# ダウンロードのみ許可
<Limit READ>
AllowAll
</Limit>
<Limit STOR>
DenyAll
<Limit>
</Anonymous>
# vsftpdの場合
# 匿名FTPの許可
anonymous_enable=YES
# 匿名ユーザによるアップロード禁止
anon_upload_enable=NO
# 匿名ユーザによるディレクトリ作成などを禁止
anon_mkdir_write_enable=NO
13.4. OpenSSH
SSHはリモートホスト通信において高いセキュリティで実現するものといえる。 LinuxではOpenBSDによるSSH実装であるOpenSSHが一般的に利用される。 SSHにはVer1.0とVer2.0系があり、それぞれ公開鍵認証のアルゴリズム形式が異なる。
SSHのバージョン | 公開鍵認証のアルゴリズム |
---|---|
1.0系 | RSA |
2.0系 | DSA, ECDSA, ED25519, RSA |
13.4.1. SSH設定
SSHサーバ機能はsshdデーモンにより提供される。
設定ファイルは/etc/ssh/sshd_config
となる。
主要な設定項目は以下の通り。
設定項目 | 説明 |
---|---|
Port | SSHで使うポートの設定 |
Protocol | 使用するSSHのバージョン |
ListenAddredd | 接続受付アドレス(0.0.0.0ですべて) |
HostKey | ホスト鍵のファイルパス |
SyslogFacilty | ログのファシリティ |
LogLevel | ログのプライオリティ |
LogGraceTime | ログインを試みることのできる最大時間(秒) |
PermitRootLogin | rootログインの禁止許可 |
StrictModdes | パーミッションを厳密にチェックするかどうか |
MaxAuthTimes | 認証を試みることのできる最大数 |
RSAAuthentication | SSH1で公開鍵認証を許可するかどうか |
PubkeyAuthentication | SSH2で公開鍵認証を許可するかどうか |
AuthorizedKeysFile | 公開鍵を登録するファイル |
PasswordAuthentication | パスワード認証の有効/無効化 |
PermitEmptyPasswords | 空パスワードの有効/無効 |
ChallengeResponseAuthentication | チャレンジレスポンス認証の有効/無効化 |
UsePAM | PAMを使用する |
X11Forwarding | X11フォワーディングの無効/有効化 |
AllowUsers | ログインを許可するユーザ |
DenyUsers | ログインを禁止するユーザ |
AllowGroups | ログインを許可するグループ |
DenyGroups | ログインを許可するグループ |
SubSystem | 外部サブシステムの指定(ファイル転送デーモンなど) |
また/etc/ssh/sshd_config
の設定例は以下の通り。
Port 22
Protocol 2
ListenAddress 0.0.0.0
HostKey /etc/ssh/ssh_host_key
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key
SyslogFacility AUTHPRIV
LogLevel INFO
LOGGraceTime 2m
PermitRootLogin no
StrictMode yes
MaxAuthTries 6
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication no
PermitEmptyPasswords no
UsePAM yes
X11Forwarding yes
# SFTPを行う場合の設定
Subsystem sftp /usr/libexec/openssh/sftp-server
13.4.2. ホスト認証/ユーザ認証
SSHでは最初にユーザ認証の前にホストの正当性を確認するホスト認証が行われる。
ホスト認証
ホスト認証は接続先ホストの正当性を確認する検証。 DNSサーバのクラックなど不正なホストに接続されてしまう場合などの対策のために実装されている。 具体的には公開鍵暗号方式を用いることでホストの正当性を保証する。
具体的には公開鍵と秘密鍵を用いて認証を行う。
OpenSSHのインストールでローカルホスト用の公開鍵と秘密鍵が生成される。
このとき秘密鍵は外部に漏れないように厳重に管理する。
なお生成されたファイルは/etc/ssh/
以下に保存される。
ファイル名 | 説明 |
---|---|
ssh_host_key | 秘密鍵(Ver1.0) |
ssh_host_dsa_key | 秘密鍵(Ver2.0 DSA用) |
ssh_host_rsa_key | 秘密鍵(Ver2.0 RSA用) |
ssh_host_key.pub | 公開鍵(Ver1.0) |
ssh_host_dsa_key.pub | 公開鍵(Ver2.0 DSA用) |
ssh_host_rsa_key.pub | 公開鍵(Ver2.0 RSA用) |
ssh_host_ecdsa_key | 秘密鍵(Ver2.0 ECDSA用) |
ssh_host_ecdsa_key.pub | 公開鍵(Ver2.0 ECDSA用) |
ssh_host_2d25519_key | 秘密鍵(Ver2.0 ED25519用) |
ssh_host_2d25519_key.pub | 公開鍵(Ver2.0 ED25519用) |
SSH接続時にホストの公開鍵がクライアント側に送られる。 このときクライアントは所持するホスト鍵と一致することでホストの正当性を確認する。
ホスト鍵は~/.ssh/known_hosts
に格納される。
検証するときにフィンガープリントをクライアント側に登録しておけばサーバに正当性があるかどうか検証できる。
サーバ側の鍵でフィンガープリントは以下のように確認できる。
ssh-keygen -l -f /etc/ssh/ssh_host_rsa_key.pub
2回目以降の接続は接続先から送られたホスト鍵をKnown_hosts内の鍵と比較し問題がないとユーザ認証に進むこととなる。 そのためこの段階で接続先が悪意あるものによりなりすましされていたら警告が出るようになる。
13.4.3. 公開鍵認証
SSHではホスト認証後にユーザ認証に進む。 ユーザ認証では公開鍵認証が試行される。 公開鍵認証の手順は以下の通り。
- サーバ側に公開鍵を登録する
- SSH接続時に公開鍵が利用できるか確認が行われる
- クライアント側は公開鍵にユーザ名などの情報を加え、秘密鍵で署名しサーバに送信する
- サーバはユーザの公開鍵を使用して署名を確認する
- 確認できるとログインを許可する
なおユーザの公開鍵と秘密鍵ペアの生成にはssh-keygen
コマンドを使用する。
ssh-keygenコマンド
公開鍵と秘密鍵のペアを作成するコマンド。
ssh-keygen [オプション]
オプション | 説明 |
---|---|
-f ファイル名 | 鍵ファイル名の指定 |
-t | 暗号化方式の指定(rsa1, dsa, rsa,ecdsa, ed25519) |
-p | 既存の鍵ファイルのパスフレーズを変更する |
-P パスフレーズ | 古いパスフレーズを指定する |
-N パスフレーズ | 新しいパスフレーズを指定する |
-l | フィンガープリントの表示 |
-R ホスト名 | 指定されたホスト鍵をknown_hostsから削除する |
生成される鍵のデフォルト名は以下の通り。
バージョン | 秘密鍵 | 公開鍵 |
---|---|---|
Ver1.0 | identity | identyty.pub |
Ver2.0(DSA) | id_dsa | id_dsa.pub |
Ver2.0(RSA) | id_rsa | id_rsa.pub |
Ver2.0(ECDSA) | id_ecdsa | id_ecdsa.pub |
Ver2.0(ED25519) | id_ed25519 | id_ed25519.pub |
ユーザの公開鍵を接続先に登録する
ssh-keygen
コマンドで公開鍵ファイルを作成した後、接続先ホストの~/.ssh/authorized_keys
に登録する。
この際はコマンドを利用する場合はscp
コマンドなどで転送する。
なお公開鍵は保存するauthorized_keys
ファイルは所有者のみ読み書きできるようにしておく。
chmod 600 ~/.ssh/authorized_keys
13.4.4. ssh-agent
ssh-agentは秘密鍵使用時に尋ねられるパスフレーズの入力の手間を省く機能のこと。 ssh-agentはクライアント側で稼働するデーモンで、秘密鍵をメモリ上に保持しておき、必要時にそれを利用する仕組みとなっている。 そのため毎度パスフレーズを打つ必要がない。
ssh-agentの利用にはssh-agentの子プロセスにbashを起動し、ssh-add
コマンドで秘密鍵を登録する。
ssh-agent bash
ssh-add
この設定以降、このbashや子プロセスではパスフレーズの入力が不要となる。
ssh-agentが保持している秘密鍵の一覧はssh-add -l
コマンドで確認できる。
13.4.5. SSHポート転送
SSHポート転送(SSHポートフォワーディング)はあるポートに送られてきたTCPパケットをSSHを使用した安全経路でリモートホストの任意ポートに転送すること。 この機能によりPOP、FTPなどの暗号化されていないプロトコルを使った通信の安全性を高めることができる。
ポート転送を行う場合のssh書式は以下の通り。
ssh -L [ローカルポート]:[リモートホスト]:[リモートポート] [リモートホストユーザ名]@[リモートホスト]
13.4.6. SSHサーバのセキュリティ
SSHサーバをデフォルト設定ではなく、適切に設定するとよりセキュアな運用ができる。 項目は以下の通り。
- SSH Version1.0の禁止
- パスワード認証の禁止
- rootログインの禁止
- 接続元制限
SSH Version1.0の禁止
SSHバージョン2.0のみを許可することで、SSHバージョン1.0の脆弱性を防ぐことができる。
sshd_config
のProtocol 2
にすることで可能。
パスワード認証の禁止
パスワード認証は原則は無効にした方がよい。 これはブルートフォースアタックやパスワードが知られる危険性があるためである。
同様にsshd_config
でPasswordAuthentication no
と記述する。
rootログインの禁止
rootユーザのリモートログインも基本は許可すべきではない。
sshd_config
でPermitRootLogin no
と記述することでrootログインを禁止にできる。
ログインユーザの制限
ユーザ単位でログイン制限することが可能。 AllowUsersディレクティブでユーザを指定すると、指定していないユーザのログインは禁止にできる。
書式 | 説明 |
---|---|
AllowUsers [ユーザ名] | ユーザのみログインを許可 |
AllowUsers [ユーザ名1] [ユーザ名2] | ユーザ1, ユーザ2をログインを許可 |
AllowUsers [ユーザ名]@172.16.0.1 | 172.16.0.1のユーザのみログインを許可 |
AllowUsers [ユーザ名]@example.com | example.comのユーザのみをログイン許可 |
AllowUsers *@172.16.0.1 | ホストが172.16.0.1のユーザのみログイン許可 |
AllowGroups wheel admin | グループがwheelとadminユーザのみ許可 |
接続元の制限
SSHアクセスは/etc/hosts.allow
や/etc/hosts.deny
で制御できる。
これはsshdが通常TCP Wrapper機能を参照しているからとなる。
前提にlibwrapという機能が利用されている必要があるので確認は以下コマンドで可能。
ldd `which sshd` | grep libwrap
13.5. セキュリティの設定
13.5.1. セキュリティツール
Snort
Snortはネットワークインターフェイス上のトラフィックを監視しパケットをいろんな規則と照合することで攻撃や侵入を捕らえられるIDSツール。 Snortが参照するルールセットはインターネット上で入手することができる。 またSnortの使用にはパケットキャプチャであるlibcapが必要となる。
Tripwire
Tripwireはファイルシステムの状況を記録し比較することでファイル改ざんを検知するプログラム。 検知はリアルタイムではなくcronにより定期的なスケジューリングにより起動する。 インストールと設定方法は以下の通り。
- パッケージ/ソースからインストール
- ポリシーファイルの作成
- ベースラインデータベースの作成
- 定期的チェック
- 必要に応じたポリシーファイル/ベースラインデータベースのアップデート
なおTripWireでは以下項目をチェックできる。
- ファイルタイプ
- リンク数
- パーミッション
- iノード番号
- 所有ユーザ
- iノードのタイムスタンプ
- 所有グループ
- iノードのあるデバイスID
- アクセス時刻
- MD5/SHA/Haval/CRC32ハッシュ値
- ファイル更新日時
- ブロック数
- ファイルサイズ
OpenVAS
OpenVASはOSSのセキュリティスキャナーでネットワーク経由で脆弱性チェックできるツール。 OpenVASは以下のコンポーネントで構成される。
コンポーネント | 説明 |
---|---|
OpenVAS Scanner | セキュリティスキャナ |
OpenVAS Manager | スキャナ/スキャンタスク/データ管理ソフトウェア |
OpenVAS Administrator | サービスやユーザを管理するソフトウェア |
Greebone Security Asiistant | WEBブラウザベースで操作するインターフェイス |
Greebone Security Desktop | GUIベースのクライアント |
OpenVAS CLI | コマンドラインベースのクライアント |
Fail2ban
Failbanはログファイルを監視し攻撃を検知し、攻撃元IPを遮断するソフトウェア。 内部的には一定時間内に何度もログインを失敗するといったイベントにより、iptablesルールを書き換えアクセス元からの接続を遮断する。
13.5.2. 開いているポートの確認
Nmap
Nmapはポートスキャンツールで、開いているポートから稼働しているサービスを特定できる。
nmap <スキャンタイプ> <オプション> <IPアドレス \| ドメイン>
オプション | 説明 |
---|---|
-sT | 接続スキャン |
-sS | SYNスキャン(TCP接続のSYNパケットを送信し、SYN+ACKが帰るかどうかでポートスキャンを行う) |
-sN | Nullスキャン |
-sF | FINスキャン |
-sX | Xmasスキャン |
-sR | RFCスキャン |
-O | OSを調べる |
XmasツリースキャンというTCPヘッダのFIN、URQ、PSHフラグを有効にしたパケットを送って藩のを確かめる手法も利用できる。
nmap -sX www.example.com
netstat/ss/lsof/fuserコマンド
netstat,ss,,lsof,fuserコマンドも同様に開いているポートを確認できる。
netstat -atun
ss -atun
lsof -f -n
fuser -v -n tcp 22
13.5.3. TCP Wrapper
TCP Wrapperは各種サーバプログラムへのアクセス制御を集中管理する仕組み。
libwrapライブラリにより機能が提供される。
アクセス制御は/etc/hosts.allow
や/etc/hosts.deny
に記述すことで可能。
これらのファイルで使えるワイルドカードは以下の通り。
ワイルドカード | 意味 |
---|---|
ALL | 全てのサービス/ホスト |
A EXCEPT B | B以外のA |
LOCAL | 「.」を含まないすべてのホスト(ローカルセグメントのホスト) |
PARANOID | ホスト名からDNS検索したアドレスとサービス要求元アドレスが不一致 |
ローカルネットワークからすべてのsshdへのアクセスを許可する記述は/etc/hosts.allow
に以下のように記述する。
sshd: LOCAL
またspawn
を使い特定のコマンドを実行させることもできる。
ALL:ALL:spawn logger -t hosts.deny Connectiondenied from %c
13.5.4. セキュリティ情報
セキュリティの情報源には以下のようなものがある。
CERT/CC
セキュリティ事故情報を収集しセキュリティに関する技術支援情報を発信しているサイト。
- CERT/CC … https://www.cert.org
- JPCERT… https://www.jpcert.or.jp
BUGTRAQ
BUGTRUGはバグ情報を公開するためのメーリングリスト。
CIAC
CIACは米エネルギー省が運営するサイトで、セキュリティインシデントの報告を行っている。
13.5.5. インシデントへの対処
サーバがクラックされると以下のことが行われる可能性がある。
- コマンドの改ざん
- ログ改ざんやsyslog停止
- 悪意のあるソフトウェアのインストールと使用
改ざんされたls
コマンドでは不正なファイルのみを表示しないようにしてある場合があり、この場合はecho *
コマンドによりlsを代用できる。
またファイル改ざんのチェックはrpm
コマンドにより確認できる。
rpm -Va
このオプションはイストール時のファイルの状態と現状を比較し、差があればプロパティと一緒に表示する。 表示されるRPM検証記号は以下の通り。
記号 | 説明 |
---|---|
S | ファイルサイズが異なる |
M | アクセス権またはファイルタイプの変更がされている |
5 | MD5チェックサムの値が異なる |
L | シンボリックリンクが変更されている |
U | 所有者が変更されている |
G | 所有グループが変更されている |
T | ファイルの更新時刻が異なる |
D | デバイスファイルが変更されている |
? | 不明 |
c | 設定ファイルを表す |
13.6. OpenVPN
VPNはインターネットなどの公衆ネットワークを介して、まるで専用線で接続されているようにプライベートなネットワークを構築するサービスのこと。 VPNでは暗号化した経路を使用することで安全に通信ができることを実現している。
13.6.1. OpenVPNとは
OpenVPNはLinuxでVPNを通す際に選択されるVPNの1つ。 OpenVPNではL2/L3プロトコルをSSL/TLSでカプセル化しOpenVPNサーバとOpenVPNクライアントを接続する。
OpenVPNでは公開鍵基盤(PKI)を使用する。 CA(認証局)、OpenVPNサーバ、OpenVPNクライアントそれぞれで必要になるファイルを以下にまとめる。
サイド | 必要ファイル |
---|---|
CA | CA証明書、CA秘密鍵 |
OpenVPNサーバ | CA証明書、サーバ証明書、サーバ秘密鍵、DHパラメータ |
OpenVPNクライアント | CA証明書、クライアント証明書、クライアント秘密鍵 |
なおCAを自己証明で行う場合は、CA秘密鍵はOpenVPNサーバに設置する。
またOpenVPNのクライアント-サーバ接続形態にはルーティング接続とブリッジ接続がある。 これらはネットワーク1からネットワーク2に対してVPN接続をした際の、ネットワーク2への接続の行われ方が異なる。
ルーティング接続
仮想トンネルネットワークを通して異なるネットワークに接続する方法。 VPNクライアントのネットワークにアクセスする際には、VPNサーバや他のルータを経由して(ルーティングして)アクセスすることになる。
特徴は以下の通り。
- OpenVPNサーバ/クライアントは別々のネットワークが利用できる
- LAN同士を接続する用途に向いている
- 大規模アクセス向き
ブリッジ接続
仮想インターフェイス経由で接続する方法。
接続先ネットワークと同じネットワークセグメントのIPアドレスをOpenVPNクライアントの仮想インターフェイス(TAP)に割り当てることでOpenVPNクライアントは接続先ネットワークに参加できる。
特徴は以下の通り。
- ブロードキャストが届く
- 小規模ネットワーク/個人向き
13.6.2. 必要となるファイルの作成
OpenVPNで必要となる各ファイルは用意されたスクリプトで作成する。
パラメータの準備
サーバ証明書やCA証明書の作成にはいくつかパラメータを指定する必要がある。
何度も入力するの晴れ間なので/etc/openvpn/vars
を編集してパラメータを書き換える。
export KEY_cOUNTRY = "JP"
export KEY_PROVINCE = "TOKYO"
:
:
設定したファイルを読み込み不要なファイルは削除する。
cd /etc/openvpn
source vars
./clean-all
CA証明書/CA秘密鍵の作成
認証用のCA証明書とCA秘密鍵を作成する。
./build-ca
上記コマンドでCA証明書ファイルca.crt
とCA秘密鍵ファイルca.key
が作成される。
これらのファイルは/etc/openvpn/keys
に配置する。
またCA証明書ca.crt
はOpenVPNサーバ/クライアントの/etc/opnvpn/keys
にも配置する。
サーバ証明書/サーバ秘密鍵の作成
OpenVPNサーバ用のサーバ証明書と秘密鍵を作成する。
./build-key-server server
引数にはホスト名orファイル名を指定する。
上記例の場合はサーバ証明書のserver.crt
とサーバ秘密鍵のserver.key
が生成される。
これらのファイルはOpenVPNサーバの/etc/openvpn/keys
に配置する。
DHパラメータの作成
DHは鍵交換を安全に行うためのものでDHパラメータと呼ばれる。
./build-dh
これによりdh1024.pem
またはdh2048.pem
が生成される。
これらのファイルはOpenVPNサーバの/etc/openvpn/keys
に配置する。
クライアント証明書/クライアント秘密鍵の作成
OpenVPNクライアント用のクライアント証明書とクライアント秘密鍵を作成する。
./build-client client
引数にはホスト名orファイル名を指定する。なおクライアントが複数いる場合は引数を変更して作成する。
上記例の場合はサーバ証明書のclient.crt
とサーバ秘密鍵のclient.key
が生成される。
これらのファイルは安全にOpenVPNクライアントの/etc/openvpn/keys
に配置する。
ブリッジ接続を行う場合の起動スクリプトの設定
はじめにブリッジ接続のためのopenvpn-startup
とopenvpn-shutdown
を編集する。
次に/usr/share/doc/openvpn-2.3.1.4/sample/sample-scripts
以下ににあるbridge-start
、bridge-stop
をコピーしておく。
# /etc/openvpn/openvpn-startup
#!/bin/bash
/etc/openvpn/bridge-start
route add -net default gw 192.168.1.1
iptables -I FORWARD -i br0 -j ACCEPT
# /etc/openvpn/bridge-stop
#!/bin/bash
/etc/openvpn/bridge-stop
13.6.3. ブリッジ接続をする場合のOpenVPNサーバの設定
OpemVPMサーバの設定ファイルは/etc/openvpn/server.conf
となり、SampleファイルはCentOS7系では/usr/share/open-vpn/sample/sample-config-files
以下にある。
# ポート番号とプロトコル
port 1194
proto udp
# ルーティング接続なら「tun」、ブリッジ接続なら「tap0」
dev tap0
# 認証局証明書のファイル(絶対パス/設定ファイル起点の相対パス)
ca keys/ca.crt
# サーバの証明書ファイル
cert keys/server.crt
# サーバーの秘密鍵ファイル
key keys/server.key
# DHパラメータのファイル名
dh keys/dh2048.pem
# OpenVPNクライアントへ渡す情報
push " route 192.168.1.1 255.255.255.0"
# 実行ユーザ/グループ
user nobody
group nobody
# 接続中クライアントリスト出力ファイル
status /var/log/openvpn-status.log
# ログ出力するファイル(ない場合はsyslog)
log /var/log/openvpn.log
OpenVPNはUDPのポート1194を使用するのでOpenVPNサーバ側のネットワークでルータやファイヤーウォールで1194ポートを許可する設定が必要となる。 またIPパケットのフォワーディング設定も有効にする必要がある。
echo 1 > /proc/sys/net/ipv4/ip_forward
OpenVPNサービスの起動は以下の通り。
systemctl start openvpn-bridge
13.6.4. OpenVPNクライアントの設定
設定ファイルの主要内容は以下の通り。
# プロトコル
proto udp
# ルーティング接続なら「tun」、ブリッジ接続なら「tap0」
dev tap0
# Clientの指定
client
# 接続先サーバとポート番号
remote 112.56.23.112 1194
# 認証局証明書のファイル(絶対パス/設定ファイル起点の相対パス)
ca keys/ca.crt
# クライアントの証明書ファイル
cert keys/client.crt
# クライアントの秘密鍵ファイル
key keys/client.key
OpenVPNクライアントの起動例は以下の通り。
/usr/sbin/opnevpn /etc/openvpn/client.conf
3 - 3.Linuxサーバの高度な運用管理
3.1 - 1.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系がある。
機能 | Samba3 | Samba4 |
---|---|---|
ドメインコントローラ | NTドメインのドメインコントローラ構築ができる(NTMLv2の使用、WINSサーバによる名前解決、LDAP連携の可能) | ADドメインのドメインコントローラ構築ができる(Keroberos認証、DNSによる名前解決、LDAP内蔵) |
ファイルサーバ | SMB2に対応 | SMB2,SMB3に対応 |
Samba3.0系のデーモンプロセス
Samba3.0系のデーモンプロセスはsmbdとnmbにより提供される。
- 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
- Keroberos認証
- ActiveDirectoryドメインコントローラ機能
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]
パラメータ名 = 値
セクション | 説明 |
---|---|
global | Samba全体設定 |
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ファイル名
-v
はTDBファイルの検査と、問題がある場合はバックアップからリストアを行うオプション。
tdbdumpコマンド
TDBファイルの内容表示を行うコマンド。
tdbdump
tdbtoolコマンド
TDBファイルの対話的な管理を行うコマンド。
tdbtool
tdbrestoreコマンド
tdbバックアップからリストアするコマンド。
tdbrestore > <リストアファイル> < <バックアップファイル>
1.4.2. TDBファイル
Sambaが使用するデータベースファイルにはsercret.tdbとregistory.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
2.1. ActiveDirectoryドメインコントローラとしてのSamba
2.1.1. ActiveDirectory
ActiveDirectoryとは
ActiveDirectoryはWindowsのサーバの機能で、ネットワークにつないでいるクライアント端末やサーバー、プリンター、アプリケーションなどの情報を収集し、一元管理できるディレクトリサービスのこと。アカウントの管理を行うディレクトリ・サービス・システムともいえる。
ActiveDirectoryを使用するメリットは全てのネットワークリソースを、一つのオブジェクトとして、一元管理することが出来るようになることにある。
ドメイン環境とドメインコントローラ(DC)
ActiveDirectoryではユーザやコンピュータなどのリソースがドメインに参加することによりリソースの一元管理することが可能となう。 この一元管理にはドメインコントローラ(DC)と呼ばれる専用サーバが使用される。
ドメインコントローラによる認証手順は以下の通り
- ユーザがドメイン参加コンピュータにログインする
- 認証データをドメインコントローラに送信する
- ドメインコントローラで認証データが正しいと確認できた場合チケットを発行し返送する
- チケットを受け取ったクライアントはチケットを提示してアクセス先コンピュータで認証を試みる
- アクセス先コンピュータはチケットがドメインコントローラで発行されたか確認し、正しければクライアントアクセスを許可する
上記認証方式は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間でレプリケーションしない。
rsync
やrobocopy
を用いてレプリケーションを行うように設定できる。
2.1.6. GlobalCatalog
GlobalCatalogはActiveDirectory内の全てのドメインの一部の属性を保持する特別なデータベースのこと。 GlobalCatalogによりクロスドメインの検索やクエリが高速化される。
ポートは3268/TCP、3269/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.5 - 5.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 Server | LDAP |
MIT Keroberos | 認証サービス |
Dogtag Certificate System | PKI(公開鍵基盤) |
NTP | 時刻同期 |
DNS | IPアドレス/ドメインの紐づけ |
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では、セキュアな通信を確立するために以下の認証メカニズムが採用された。
認証メカニズム | 説明 |
---|---|
Keroberos | SSOを使用可能にする |
SPKM | シンプルな公開鍵基盤を提供する認証方式 |
LIPEKY | SPKMを使用したクライアント-サーバ間で暗号化通信を行う |
疑似(Pseudo)ファイルシステム
擬似(Pseudo)ファイルシステムは複数のファイルシステムをクライアント側で一つのツリーに見せかけることができる仕組み。 これはNFSv3の欠点を補った仕組みともいえる。
NFSv4サーバの設定
/etc/exports
- NFSv4の共有ディレクトリの設定は
/etc/exports
で行う
- NFSv4の共有ディレクトリの設定は
/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の暗号化
6.1. 暗号化の基礎
6.1.1. 暗号化とは
暗号化は暗号文を使用して通信と情報を保護する手法のこと。
コンピュータサイエンスにおいて、暗号化は、解読が困難な方法でメッセージを変換するための、数学的概念とアルゴリズムと呼ばれる一連のルールベースの計算から派生した安全な情報および通信技術を指す。 これらの決定論的アルゴリズムは、暗号キーの生成、デジタル署名、データ プライバシーを保護するための検証、インターネット上の Web ブラウジング、クレジット カード取引や電子メールなどの機密通信に使用される。
暗号化の用途
- 暗号化 … 情報をその本当の意味を隠す秘密コードに変換する方法。情報の暗号化と復号化の仕組みは暗号化と呼ばれる
- 完全性 …. 情報は、変更が検出されない限り、保存中または送信者と目的の受信者の間での転送中に変更されることはないことを保証する
- 認証 … 送信者と受信者は、互いの身元と情報の発信元/宛先を確認できる
暗号化の主要な要素
暗号化には2つの主要な要素がある。
- キー … データの暗号化に使用されるもの。秘密にしておく必要がある。
- アルゴリズム … メッセージのエンコードとデコードに使用されるメソッドのこと。
共通鍵暗号方式(対称暗号方式)
共通鍵暗号方式は暗号化と復号を同じ鍵で行うもの。
AESやDES、blowfishなどが代表例としてある。
このタイプの暗号化は、平文を暗号文に暗号化し、その暗号文を平文に復号化するために同じ鍵が使われるため対称と言える。 一般的に、非対称暗号化よりも高速となる。
公開鍵暗号方式(非対称暗号方式)
公開鍵暗号は暗号化/復号化に公開鍵ペアを使用する暗号。 対になる鍵の一方が公開鍵で、もう一方が秘密鍵となる。
鍵 | 説明 |
---|---|
公開鍵 | 一般にアクセス可能なリポジトリで公開され、公開鍵ペアの所有者と通信する必要がある人は誰でもアクセス可能 |
秘密鍵 | 秘密鍵は所有者のみが所有する |
これらの鍵はそれぞれ平文を暗号化された暗号文に変換することができるが、 一方の鍵で暗号化された暗号文はもう一方の鍵でしか復号できない。
特徴は以下の通り。
- 公開鍵で暗号化された暗号文は秘密鍵でしか復号化できない
- 秘密鍵で暗号化された暗号文は公開鍵を使ってのみ復号できる
- 共有秘密鍵を交換することなくメッセージを送信できる
また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 <サブコマンド> [オプション]
サブコマンド | 説明 |
---|---|
ca | CAの管理 |
dgst | メッセージダイジェストの計算 |
genrsa | RSA暗号方式の秘密鍵を生成 |
rsa | RSA暗号方式の鍵管理 |
req | CSRの管理 |
x509 | X.509証明書の管理 |
s_client | SSL/TLSプロトコルを使用し指定しサーバ接続 |
s_server | SSL/TLSプロトコルを使用しデータを受け取るサーバとして動作 |
ciphers | 使用可能な暗号スイートを一覧表示 |
verify | X.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証明書にはいくつかのエンコードタイプがあるが、代表的なものにPEMとDERがある。
- PEM
- DERをBase64でテキスト化したもの
- サーバー証明書、中間証明書、および秘密キーを1つのファイル内に含めることができる
- テキスト エディタで開くことができる
- OpenSSLデフォルトのファイル形式
- DER
- JavaベースのWebサーバーに使用される
- Binary形式
- PKCS#7
- 証明書のみを保存する
- 秘密キーは保存できない
- PKCS#12
- Windowsプラットフォームで使用される
- サーバー証明書、中間証明書、および秘密キーをパスワードで保護された単一の
.pfx
ファイル内に保存できる
また、それぞれの特徴を表にまとめると以下の通り。
フォーマット | エンコード | ファイルフォーマット |
---|---|---|
PEM | Base64 ASCII | .crt、.pem、.cer、.key |
DER | Binary | .der または .cer |
PKCS#7 | Base64 ASCII | |
PKCS#12 | Binary | .pfx、 .p12 |
X.509証明書のフィールド
フィールド1 | フィールド2 | 説明 |
---|---|---|
tbsCertificate | 証明書の基本情報と公開鍵の情報 | |
version | X.509証明書のバージョン X509v3では3(0x2) | |
serialNumber | 証明書の識別番号 | |
signature | CAが証明書に署名する際のアルゴリズム | |
issuer | CAの名前 | |
validity | 証明書の有効期間 | |
subject | 証明書の所有者の名前 | |
subjectPublicKeyInfo | 証明書所有者の公開鍵に関する情報 | |
extentions | 拡張領域。X.503v3にて追加 | |
signatureAlogorithm | 証明書の署名アルゴリズム | |
signatureValue | デジタル署名 |
X.509証明書の拡張フィールド
拡張フィールド | 説明 |
---|---|
basicConstraints | 基本制約。証明書がCAnのものである、証明書のパスの深さなどを指定 |
authorityKeyIdentifier | 認証局鍵識別子 |
subjectKeyIdentifier | サブジェクト識別子 |
KeyUsaga | 鍵の用途 |
extendedKeyUsage | 拡張鍵用途 |
certificatePolicies | 証明書の目的や発行時情報 |
subjectAltName | サブジェクトの代替名 |
cRLDistributionPoints | CRLの配布ポイント |
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が良い。
項目 | SSL | TLS |
---|---|---|
正式名称 | Secure Sockets Layer | Transport Layer Security |
プロトコル | Web トラフィックを保護するために使用されていたプロトコル | TLS プロトコルは、SSLv3 に代わる TLS 1.0 から始まる SSL の後継プロトコル |
状況 | 最新バージョンは SSLV3 だが、これは非推奨 | 現在の標準は TLS 1.2 。ただし、TLS 1.3 はインターネット標準として目的とされている |
TLS/SSLのハンドシェイクプロセス
TLS は、データを安全に送信する際のパフォーマンスとセキュリティの間で適切な妥協点を提供するため、公開鍵暗号方式と共通鍵暗号方式を組み合わせて使用する。 手順は以下の通り。
- 各TLS証明書は、公開キーと秘密キーで構成されるキーペアで構成される。これらのキーは、Web サイトのトランザクション中に相互作用する。
- Web サイトにアクセスするたびに、クライアント サーバーと Web ブラウザが通信して、安全な TLS/SSL 暗号化接続が確立されていることを確認する。
- Web ブラウザ (またはクライアント) がセキュリティで保護された Web サイトにアクセスすると、Web サイト サーバーは TLS/SSL 証明書とその公開キーをクライアントと共有して、安全な接続と一意のセッション キーを確立する。
- ブラウザは、SSL 証明書の発行者または認証局を認識し、信頼していることを確認します。また、ブラウザは、TLS/SSL 証明書の有効期限が切れていないこと、取り消されていないこと、および信頼できることを確認します。
- ブラウザは対称セッションキーを送り返し、サーバーは秘密キーを使用して対称セッションキーを復号化する。次に、サーバーはセッションキーで暗号化された確認応答を送り返し、暗号化されたセッションを開始する。
- サーバーとブラウザは、送信されるすべてのデータをセッションキーで暗号化するようになる。これらは、メッセージのプライバシー、メッセージの整合性、およびサーバーのセキュリティを保護する安全なセッションを開始することを意味する。
トランスポート層のセキュリティ
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/off | SSL/TLSプロトコルを使用するかどうかの設定 |
SSLProtocol SSLv3/TLSv1/TLSv1.2 | SSL/TLSのバージョン指定 |
SSLCipherSuite !AAA/-AAA/+AAA | 使用する暗号化スイートの指定 |
SSLCertificateFile | サーバ証明書の指定 |
SSLCertificateKeyFile | サーバの秘密鍵を指定 |
SSLCertificateChainFile | 中間認証局(CA)の証明書を指定 |
クライアント認証関連のディレクティブ | 説明 |
---|---|
SSLCACertificateFile | クライアント証明書を発行したCAの証明書を指定 |
SSLVerifyClient | クライアントの認証レベルの指定 |
SSLVerifyDepth | 有効なクライアント証明書を確認する深さを指定 |
OCSP stapling関連のディレクティブ | 説明 |
---|---|
SSLUseStapling on/off | OCSP staplingの有効/無効 |
SSLStaplingResponderTimeiut | OCSP staplingの応答タイムアウト |
SSLStaplingReturnResponseErrors on/off | OCSP staplingのエラーをクライアントに送信するかどうか |
SSLStaplingCache | OCSP 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-encryptとLUKS (通常は連携して使用する)
- 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
を用いて暗号化デバイス(パーティション)を利用する流れは以下の通り
- (LUKSモード利用時)luksFormatによるパーティションの初期化
cryptsetup luksFormal /dev/sdb2
- openまたはluksOpenによる暗号化マッピングの作成
cryptsetup open --type plain /devsdb1 dm01
cryptsetup luksOpen /dev/sdb2 dm02
- mkfsおよびパーティションのマウント
mkfs.ext4 /dev/mapper/dm02
mount /dev/mapper/dm02 /mnt/luks
なお利用終了時は、アンマウントし暗号化マッピングを削除する。
- パーティションのアンマウント
unmount /mnt/luks
- 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.com
やbbb.example.com
作成し、親ドメインのゾーンから見つけられるようにする(委任)するもの
スプリットビューDNS(スプリットホライズンDNS)
スプリットホライズンDNSを使用すると、要求に応じて同じ名前に対して異なる回答 (異なるリソースレコードセット) を提供できる。
この機能は、クエリが開発ネットワークから送信された場合はアプリの開発/ステージング バージョンを提供し、クエリがパブリックインターネットから送信された場合はアプリの運用/公開バージョンを提供するといったことに利用できる。
リソースレコード
リソースレコードはドメイン名と IP アドレスに関するデータを保存するために使用されるもの。 DNSゾーンのデータベースは、リソース レコードのコレクションで構成される。 各リソース レコードは、特定のオブジェクトに関する情報を指定する。
リソースレコードタイプ | 説明 |
---|---|
SOA | 管理情報の記述 |
NS | ゾーンを管理するDNSサーバを記述 |
MX | メールサーバを記述(正引きのみ) |
A | ホスト名に対するIPアドレスを記述(正引きのみ) |
AAAA | ホスト名に対するIPv6アドレスを記述(正引きのみ) |
CNAME | ホスト名の別名に対するホスト名を記述(正引きのみ) |
PTR | IPアドレスに対するホスト名を記述(逆引きのみ) |
TLSA | デジタル署名されたレコード。サーバ認証に使われる証明書や鍵の情報がドメイン名に対して関連付けられてDANE(DNSを使った認証の仕組み)で用いられる |
レコードセット
レコードセットは同じ名前と同じタイプで、データ値が異なるレコードのこと。 以下は同じ名前とタイプを持つ複数のレコードを含むレコードセットの例。
DNS名 | タイプ | TTL (秒) | データ |
---|---|---|---|
db-01.dev.gcp.example.com | A | 50 | 10.128.1.35 |
db-01.dev.gcp.example.com | A | 50 | 10.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 サーバーを使用する |
dig | digコマンドのバージョンとルートDNS サーバーを表示します |
delvコマンド
delvコマンドはBIND 9.10以降のdigコマンドの後継ツール。
delv <オプション> ドメイン名
オプション | 説明 |
---|---|
+rtrace | クエリされたすべてのレコードリソースをリストするだけ。DNSSEC の詳細は含まれない |
+mtrace | rtrace と同じだが、すべてのレコードリソースの完全な内容が含まれる |
+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.conf
のoptions
セクションへ以下の二つの項目を設定する必要がある。
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.conf
のoptions
セクションに以下のように記載する。
options {
version "表示したい文字列";
:(以下省略)
DNSのリソースレコード
DNSはIPアドレスとドメイン名とを紐づけるためのデータベースをリソースレコードと呼ばれる形で保持する。 DNSSECで使用されるリソースレコードは以下の通り。
リソースレコード | 説明 |
---|---|
DS | KSK公開鍵のハッシュ値を含む情報 親ゾーンに登録すると信頼の連鎖を構築する |
DNSKEY | 公開鍵の情報 キャッシュDNSサーバが署名を検証するために公開鍵を使用する |
RRSIG | 各リソースレコードへのデジタル署名 キャッシュDNSサーバが権威DNSサーバからの応答に対する正当性を検証するために使用 |
NSEC | 存在しないサーバへ問い合わせがあった際に不在証明のため辞書順で並べた際に次の位置するゾーン情報を示す |
NSEC3 | NSECを改良したもの。直接のゾーン名ではなくハッシュ化されたゾーン名を示す |
NSEC3PARAM | 権威DNSサーバがNSEC3を生成する際に必要な情報 |
TLSA | DANEにおいて用いられるレコード(ドメイン名にX.509証明書情報の紐づけ) |
TLSAレコードを除き、基本的には署名を行うと署名や公開鍵を含んだレコード(ゾーンファイル)が作成される。 DNSKEYリソースレコードには上述の通りKSK・ZSKの公開鍵が含まれ、これらは各リソースレコードの検証に使用される。
BINDのDNSSEC関連ユーティリティ
DNSサーバソフトウェアであるBINDには、サーバやKSK、ZSKの生成・管理などを行うための以下のようなコマンドユーティリティがある。
コマンド | 機能 |
---|---|
dnssec-keygen | DNSSECのZSK/KSKを生成する |
dnssec-signzone | ゾーンファイルへの署名を行う(NSEC, NSEC3, RRSIG, DNSKEYなどの生成) |
dnssec-settime | 鍵ファイルのメタデータである時間の表示/変更 |
dnssec-dsfromkey | 鍵ファイルから上位サーバに登録するDSレコード生成する |
openssl | TLSAレコードの検証を行う |
rndc | BIND 9.0以降の制御設定ツール |
delv | BIND 9.10以降の検証/解析ツール |
6.5.7. DNSSECの設定
dnssec-keygenコマンド
dnssec-keygenはDNSSECのキーを生成することができるコマンド。
dnssec-keygen -a RSASHA256 -b 512 -n ZONE -f KSK myzone.
オプション | 説明 |
---|---|
-a | アルゴリズムの指定 |
-b | キーサイズ |
-n | nametype |
-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.ホストのセキュリティ
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 時間 (秒単位) |
-u | 1 人のユーザーが使用できるプロセスの最大数 |
-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
cd spectre-meltdown-checker
chmod u+x spectre-meltdown-checker.sh
./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 | ファイル種別 |
i | inode番号 |
l | リンク名 |
n | リンク数 |
u | ユーザ |
g | グループ |
s | ファイルサイズ |
b | ブロック数 |
m | 最終更新時刻 |
a | 最終アクセス時刻 |
c | 最終ステータス更新時刻 |
S | サイズの増分 |
I inode番号の変更は無視 | |
acl | アクセスコントロールリスト |
selinux | SELinuxのコンテキスト |
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.rules
やauditctl
コマンドで設定する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 | 現在の設定のリスト表示 |
-s | Auditシステムのステータス表示 |
ファイルシステムルールに関するオプション | 説明 |
---|---|
-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など)はツリー上に細分化され、各枝や葉には独自の重み/制限がある。 コントローラのグループは複数のプロセスが関連付けられているため、リソースしよるいつが細かくなっており微調整が容易となっている。
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.アクセス制御
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 file1 | setfacl –set-file=- file2 |
getfacl –access dir | setfacl -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_t | SSH接続時に使用 |
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 | 動作モードの一時的変更 |
selinuxenabled | SELinuxが有効か数値で返す |
chcon | ファイルやディレクトリのセキュリティコンテキストを変更 |
restorecon | セキュリティコンテキストの復元 |
runcon | 指定されたセキュリティコンテキストでコマンドを実行 |
fixfiles | SELinuxの設定ファイルに従いすべてのファイルにラベルを付与 |
setfiles | 指定した設定ファイルに従ってファイルにラベルを付与 |
sestatus | SELinuxの現状を表示 |
seinfo | SELinuxのロールやドメインなど各種情報を表示 |
newrole | 指定したロールに変更してシェルを起動 |
getsebool | Bool値で示されるポリシーの状態取得 |
setsebool | Bool値で示されるポリシーの設定 |
togglesebool | Bool値で示されるポリシーの値変更 |
semanage | SELinuxに関する各種操作 |
解析系コマンド | 説明 |
---|---|
apol | GUIでSELinuxポリシの分析 |
seaudit | GUIで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
runconコマンド
指定された SELinux コンテキストでコマンドを実行するコマンド。
runcon
8.2.3. 汎用的なSELinux管理コマンド
semanageコマンド
ポリシーソースの変更や再コンパイルを必要とせずに、SELinux ポリシーの特定の要素を構成するために使用されるコマンド。
semanage <引数>
引数 | 説明 |
---|---|
import | ローカルのカスタマイズをインポート |
export | ローカルのカスタマイズを出力 |
login | Linux ユーザーと SELinux 制限付きユーザーの間のログイン マッピングを管理する |
user | SELinux 制限付きユーザーの管理 (SELinux ユーザーの役割とレベル) |
port | ネットワークポートタイプ定義の管理 |
interface | ネットワークインターフェースタイプの定義を管理する |
module | SELinux ポリシーモジュールの管理 |
nodenetwork | ノード タイプの定義を管理する |
fcontext | ファイルコンテキストマッピング定義の管理 |
boolean | ブール値を管理して機能を選択的に有効にする |
permissive | プロセスタイプ強制モードの管理 |
dontaudit | ポリシー内の dontaudit ルールを無効/有効にする |
ibpkey | infiniband pkey タイプ定義の管理 |
ibendport | Infiniband エンドポートタイプ定義の管理 |
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番号ではなくファイルパスにタイプを割り当てる
- モード:
Enforcement
とComplain
の2つ aa-genprof
とaa-logpro f
コマンド(ポリシ作成に使用)がある
- Smack
- カーネルにコンパイルする必要がある
- ラベルの割り当てに拡張ファイル属性を使用
-Z
SELinux のようなフラグを使用chsmack
コマンドをラベル情報のクエリと設定に使用する
3.9 - 9.ネットワークセキュリティ
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 を読み取る |
基本構成
デフォルトの構成を使用することがサーバの設定を最も破壊せずに使用できる方法といえる。 この場合、ユーザとパスワードの設定のみでよくなる。 手順は以下の通り。
/etc/raddb/clients.conf
を編集してエントリ追加するipaddr
にクライアントIP、secret
には通信の暗号化と復号化に使用される共有秘密を指定/etc/raddb/users
を編集しユーザアカウントを作成するtesting Cleartext-Password := "password"
のように設定- サーバーをデバッグモードで起動する(
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 | プロミスキャスモードにしない |
-m | MIBモジュールを読み込む |
条件式修飾子 | 説明 |
---|---|
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=BA gt B
… A>BA ge B
… A>=BA lt B
… A<BA le B
… A<=BA and B
… AかつBA or B
… AまたはBnot <条件式>
… 条件満たさないとき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_client
とkismet_drone
、kismet_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で帯域監視を行えるソフトウェアにntopやCacti)がある。
Ntop(ntopng)
ntopはネットワークトラフィック(L2,L3)監視ソフトウェアで、ネットワークのステータス、UDP、TCP、DNS、HTTP、その他のプロトコルのトラフィックのプロトコルごとの分布をWebブラウザ上で確認できる。
設定ファイルは/etc/ntopng.conf
となる。
ntop コマンド | 説明 |
---|---|
/usr/sbin/ntop -A | ntop 管理者ユーザーのパスワードを設定する |
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.rules | DoS攻撃を検出するためのルール |
ftp.rules | FTPサービスへの攻撃を通知するためのルール |
local.rules | ユーザ独自のルール |
scan.rules | スキャンを検知するためのルール |
smtp.rules | smtpサービスへの攻撃を検知するためのルール |
telnet.rules | telnetサービスへの攻撃を検知するためのルール |
web-cgi.rules | WEBサーバの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を操作するユーティリティには以下のようなものがある。
ユーティリティ | 機能 |
---|---|
openvasmd | OpenVasManager: 各種操作が行える |
openvasmd –rebuild | データベースの再構築を行う |
openvassd | スキャン処理を行う |
openvas-nvt-sync | NVTsを更新する |
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秒あたりの接続数制限
state
とrecent
モジュールを使用すると、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セットを作成 |
add | IPセットにエントリを追加 |
del | IPセットからエントリを削除 |
destroy | IPセットを破棄 |
list | IPセットの内容をリスト |
flush | IPセット内のすべてのエントリを削除 |
test | 指定したIPがIPセットに含まれているかどうかを確認 |
swap | 2つのIPセットの内容を交換 |
rename | IPセットの名前を変更 |
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ではユーザが自分で作成する。
ルール作成の手順は以下の通り
- テーブル作成 …
nft add table
- チェインの作成 …
nft add chain
- ルールの作成 …
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を作成したら以下ステップを実行する
./easyrsa init-pki
でpkiディレクトリの開始sudo ./easyrsa build-ca
でCA証明書の作成sudo ./easyrsa gen-req myov-server nopass
でキーペアと証明書のリクエストを作成sudo ./easyrsa sign-req server myov-server
でサーバキーに署名するsudo ./easyrsa gen-dh
でキー交換のためのDH鍵を作成する- 上記で作成したファイルを
/etc/openvpn/server/
にコピーする(ca.crt,dh.pem, .key, .crt) sudo ./easyrsa gen-req client nopass
でクライアント キーを取得するsudo ./easyrsa sign-req client client
で生成された CA 証明書を使用してクライアント キーに署名する- 上記で生成したファイルを
/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のアーキテクチャではセキュリティアソシエーションを識別するパラメータは3つある。
- SPI(Security Parameter Index)、受信側システムが受信パケットを選択するためのIPSecプロトコルヘッダを伝えるビット文字列
- IP宛先アドレス、IPSecのエンドポイントアドレス
- セキュリティプロトコル識別子
SAD(Security Association Database)
SPD(Security Policy Database)
IPSecプロトコル
IPSecではAH(プロトコル認証ヘッダ)、ESP(カプセル化セキュリティペイロード)の2つのプロトコルを使用してトラフィックセキュリティサービスを提供する。
- プロトコル認証ヘッダ (AH) * IP ヘッダーとデータ ペイロードがハッシュされるために使用 * ハッシュから新しい AH ヘッダーが構築され、パケットに追加される * 認証機能と未改竄の保証
- セキュリティペイロードのカプセル化 (ESP) * データ パケットの暗号化と整合性を提供するセキュリティ プロトコル * 標準 IP ヘッダーの後に追加される * AHの機能+暗号化
IPSec暗号化の技術
IPSecのセキュリティアソシエーションではトンネルモードとトランスポートモードの2つのモードの操作を設定できる。
- トンネルモード * ペイロードとヘッダーの両方が暗号化される * ゲートウェイ間、またはエンド ステーションからゲートウェイへの使用が一般的 * パケットの送信元がセキュリティを提供するデバイスと異なる場合は、トンネル モードが使用
- トランスポートモード * 各パケットのデータ部分のみが暗号化される * エンド ステーション間、またはエンド ステーションとゲートウェイの間に適用できる
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 およびその他のプラットフォームに移植された。特徴は以下の通り。
- 構成がシンプル
- 強力な暗号化と認証方法の提供
- 大規模で複雑なVPNネットワークをサポートする
- 拡張性に優れたモジュラー設計
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.d
に99-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.脅威と脆弱性の評価
10.1. 一般的なセキュリティ脆弱性と脅威
10.1.1. マルウェア
ウィルス
コンピュータウイルスは、実行されると他のコンピュータプログラムを変更し、独自のコードを挿入することによって自分自身を複製するコンピュータプログラムの一種のこと。
コンピュータウイルスには通常、ホスト プログラムが必要です。ウイルスは独自のコードをホスト プログラムに書き込みます。プログラムを実行すると、先に書かれたウイルスプログラムが実行され、感染や被害を引き起こす。
マルウェア
マルウェアは悪意のあるソフトウェアのことで、コンピュータに損害を与えるように意図的に設計されたソフトウェアを指す。
マルウェアは、個人情報の漏洩、情報やシステムへの不正アクセスの原因となり、ユーザーの情報へのアクセスを奪ったり、ユーザーのコンピュータのセキュリティやプライバシーを知らず知らずのうちに妨害したりする。
10.1.2. その他のマルウェア
ワーム
コンピュータワームは、複数のデバイス上で活動を続けながら複数のデバイスに拡散するように設計された、潜行性のタイプのマルウェアのこと。
ワームの定義としては、ワームをユーザーの介入なしで実行および増殖できる自己完結型のマルウェアといえる。
ルートキット
ルートキットはコンピュータまたは他のソフトウェアへの不正アクセスを許可するように設計された悪意のあるソフトウェアバンドルのこと。 ルートキットは検出が難しく、感染したシステム内でその存在を隠すことができる。
ルートキットが定着すると、システムはゾンビ コンピュータであるかのように動作し、ハッカーはリモートアクセスを使用してデバイスを完全に制御できるようになる。
トロイの木馬
トロイの木馬は正当で安全であるように見えるファイル、プログラム、またはコードの一部に偽装された悪意のあるソフトウェアのこと。
通常、トロイの木馬はパッケージ化されて正規のソフトウェア内に配信され、多くの場合、被害者を監視したりデータを盗んだりするように設計されている。
キーロガ
キーロガはコンピュータ上で行われるすべてのキーストロークを記録する悪意のあるソフトウェアのこと。 キーロガーはスパイウェアの一種で、被害者を監視するように設計されたマルウェア。キーロガーは入力されたものをすべてキャプチャできるため、最も侵入的な形式のマルウェアの 1 つといえる。
キーロガーには主にソフトウェアとハードウェアの2つのタイプがある。
10.1.3. その他の脅威や攻撃
ソーシャルエンジニアリング
ソーシャルエンジニアリングは、心理学的手法を使用して行動を操作すること。ソーシャルエンジニアリングは、人的ミスを悪用し、被害者に自分の利益に反する行動を促すことによって行われる。
情報セキュリティにおけるソーシャル エンジニアリングの定義は、ログインの詳細や財務情報などの個人データをオンラインで漏洩させることを指す。
ソーシャルエンジニアリングの攻撃の1つにはフィッシングがある。
フィッシング
フィッシングはソーシャルエンジニアリング攻撃の一種で、通信が信頼できる送信元からのものであるかのように偽装されたメッセージから引き起こされる、個人情報や財務情報の漏洩を狙ったもの。
フィッシング攻撃は以下の3つの要素から構成される。
- 攻撃は電子メールや電話などの電子通信を介して行われる
- 攻撃者は、信頼できる個人または組織を装う
- 攻撃者の目的は、ログイン資格情報やクレジット カード番号などの機密の個人情報を取得すること
ブルートフォースアタック
ブルートフォース攻撃とは、ハッカーがコンピュータを利用した集中的な試行錯誤を通じてパスワードを解読しようとすること。
ブルートフォースアタックではできるだけ多くのパスワードの組み合わせを試し、いずれかが機能することを狙う。
ブルートフォースアタックの種類には以下の種類がある。
- 単純攻撃
- 辞書攻撃
- ハイブリッド攻撃
- リバース攻撃
- クレデンシャルスタッフィング
レインボー攻撃
レインボー攻撃は特別なテーブル (「レインボー テーブル」) を使用してデータベース内のパスワード ハッシュを解読するパスワード クラッキング手法のこと。
レインボー テーブル自体は、認証プロセス中に使用される各プレーン テキスト文字のパスワード ハッシュ値を含む事前計算されたテーブルを指す。 ハッカーがパスワード ハッシュのリストにアクセスすると、レインボーテーブルを使用してすべてのパスワードを非常に迅速に解読する。
バッファオーバフロー攻撃
バッファオーバフローはデータ量がメモリ バッファの記憶容量を超えると発生し、原理としてはバッファにデータを書き込もうとするプログラムは、隣接するメモリ位置を上書きしてしまうことに起因する。
バッファオーバフロー攻撃ではアプリケーションのメモリを上書きすることプログラムの実行パスが変更され、ファイルが破損したり個人情報が漏洩したりする反応を狙う。
攻撃者がプログラムのメモリ レイアウトを知っている場合、バッファに保存できない入力を意図的にフィードし、実行可能コードを保持する領域を上書きして、独自のコードに置き換えることができる。
なお、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つの種類がある。
- ブラックボックスペネトレーションテスト * テスターに会社名のみなど、最小限の情報が提供されるテスト
- グレーボックスペネトレーションテスト * ターゲットとなる特定のホストやネットワークなど、もう少し詳しい情報がテスターに提供されるテスト
- ホワイトボックスペネトレーションテスト * あらゆる種類の内部文書や構成計画などの情報が提供されているテスト
侵入テストのプロセス
侵入テストは通常以下のプロセスで実施される。
- 偵察
- スキャニング
- アクセス権の取得
- アクセス維持の確保
- 痕跡の消去
定番の侵入テストツール
侵入テストツールには以下のようなものがある。
- Nmap … 開いているポートとサービスをスキャンできる
- Metasploit … 脆弱性悪用ツール
- WireShark … ネットワークからパケット データをキャプチャし、読み取り可能な形式にデコードできるネットワーク分析ツール
- BurpSuite … Web アプリケーション セキュリティ テスト ツール