You are on page 1of 233

目次 目次

目次

まえがき 5
執筆者・制作者紹介 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
岡田 賢治(バージョン 1 執筆担当) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
川井 義治(バージョン 1 執筆担当) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
宮原 徹(バージョン 2 執筆/バージョン 3 監修担当) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
遠山 洋平(バージョン 2 校正・図版作成担当) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
田口 貴久(バージョン 2 技術検証担当). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
高橋 征義(バージョン 2 PDF / EPUB 版制作担当) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
恒川 裕康(バージョン 3 執筆担当) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
著作権 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
使用に関する権利 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
表示 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
非営利 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
改変禁止 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
本教科書の使用に関するお問合せ先 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
本教科書の目的 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
想定している実習環境 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
講師と受講生 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
教室と割当 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1 名で学習する場合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
仮想マシン環境 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
マシンの構成とハードディスク . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
OS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
ネットワーク . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
全体の流れ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

1 Linux のインストール準備と事前学習 9
1.1 用語集 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.2 実習で利用するハードウェア . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.3 利用する Linux のディストリビューション . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.3.1 インストール DVD/USB の入手方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.3.2 バージョン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.4 ネットワーク環境について . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.4.1 ネットワークの設定項目 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.4.2 ネットワークの設定項目の確認シートの例 (受講者 1 用) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.5 高度なストレージ管理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.5.1 LVM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.5.2 LVM の仕組み . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.5.3 LVM の利点 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.6 RAID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.6.1 RAID とは . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.6.2 RAID の種類 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.6.3 ハードウェア RAID とソフトウェア RAID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
1.6.4 高度なストレージの利用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

2 Linux のインストール 17
2.1 用語集 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.2 インストールの前に用意するもの . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.3 インストールの開始 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.3.1 インストールメディアの読み込み . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

LPI-Japan 1 https://linuc.org
目次 目次

2.3.2 言語設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.3.3 インストール先ディスクの設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.3.4 ネットワークとホスト名の設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.3.5 ソフトウェアの選択 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
2.3.6 インストールの開始とパスワード設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2.3.7 インストール後の初期設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.4 ログインする . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
2.5 コマンドの実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.5.1 端末を利用する . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.5.2 Windows から SSH を使って接続する . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.5.3 root で設定を行う . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
2.6 ローカルリポジトリの設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

3 DNS サーバーの構築 34
3.1 用語集 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.2 DNS の仕組み . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.3 ドメインの構造 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.3.1 ルートドメイン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.3.2 ドメイン名の記述 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
3.3.3 サブドメイン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
3.3.4 ドメイン名の取得 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
3.4 DNS を使った名前解決 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
3.5 これから構築する DNS の概略 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
3.5.1 アドレス解決の流れ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
3.6 講師マシンへの DNS キャッシュサーバーの設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
3.6.1 必要なパッケージを確認 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
3.6.2 unbound のインストール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
3.6.3 リクエストを受け付ける IP アドレスの設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.6.4 利用可能なクライアントの設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.6.5 受講者用ドメインの設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.6.6 unbound-keygen の起動 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.6.7 unbound の設定確認 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.6.8 ファイアウォールの設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.6.9 unbound の起動と確認 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.6.10 自動起動の設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
3.6.11 名前解決の確認 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
3.7 受講者マシンへの DNS コンテンツサーバーの設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
3.7.1 chroot 機能を利用した BIND のセキュリティ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
3.7.2 BIND パッケージの確認 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
3.7.3 BIND のインストール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
3.7.4 ゾーンを設定する流れ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
3.7.5 /etc/named.conf の基本設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
3.7.6 ゾーンファイルの作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
3.7.7 設定ファイルの書式確認と注意点 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
3.7.8 ファイアウォールの設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
3.7.9 BIND の起動と確認 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
3.7.10 自動起動の設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
3.7.11 名前解決の確認 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
3.8 リゾルバの変更 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
3.8.1 名前解決の確認 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
3.9 DNS コンテンツサーバーのセキュリティ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54

4 Web サーバーの構築 55
4.1 用語集 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55

LPI-Japan 2 https://linuc.org
目次 目次

4.2 Web サーバーの仕組み . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56


4.3 これから構築する Web サーバーの概略 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
4.4 Web サーバーの設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
4.4.1 必要なパッケージを確認 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
4.4.2 必要なパッケージをインストール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
4.4.3 設定ファイルの修正 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
4.4.4 テストファイルの作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
4.4.5 ファイアウォールの設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
4.4.6 Apache を起動 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
4.4.7 自動起動の設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
4.4.8 Web ブラウザーで自分のアドレスを確認 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
4.5 ページが見つからないとき . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
4.5.1 Apache のエラーコードについて . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
4.5.2 ログファイルの確認 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
4.6 アクセス制御 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
4.6.1 テキストファイルを作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
4.6.2 アクセス制御を設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
4.6.3 設定の再読み込み . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
4.6.4 Web ブラウザーで自分のアドレスを確認 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
4.6.5 ログファイルの確認 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
4.7 バーチャルホストを作成する . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
4.7.1 IP アドレスと名前の確認 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
4.7.2 バーチャルホストの設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
4.7.3 テストファイルを作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
4.7.4 設定ファイルの再読み込み . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
4.7.5 Web ブラウザーで自分のアドレスを確認 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
4.7.6 ログファイルの確認 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70

5 メールサーバーの構築 71
5.1 用語集 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
5.2 メールサーバー実習の説明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
5.2.1 メールとメールサーバー . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
5.2.2 メールのやり取り . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
5.3 実習の進め方 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
5.3.1 実習後の注意点 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
5.3.2 実習で使用するソフトウェアについて . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
5.3.3 実習環境 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
5.4 Postix のインストール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
5.4.1 必要なパッケージをインストール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
5.4.2 main.cf の設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
5.4.3 書式のチェック . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
5.4.4 ファイアウォールの設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
5.4.5 Postix の再起動 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
5.4.6 saslauthd サービスの起動 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
5.5 アカウントの作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
5.5.1 host1.alpha.jp に usera を作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
5.5.2 host2.beta.jp に userb を作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
5.6 メールの送受信 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
5.6.1 ログの確認用端末の設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
5.6.2 メール送受信用端末の起動とユーザー切り替え . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
5.6.3 usera@alpha.jp から userb@beta.jp へメール送信 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
5.6.4 userb のメール着信確認 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
5.7 メールクライアントソフトでのメールの送受信 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83

LPI-Japan 3 https://linuc.org
目次 目次

5.7.1 Dovecot パッケージの追加 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83


5.7.2 Dovecot の設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
5.7.3 ファイアウォールの設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
5.7.4 Dovecot の再起動 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
5.7.5 Thunderbird のインストール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
5.7.6 Thunderbird の起動 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
5.7.7 メールの送信 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
5.7.8 起動時のスタートページの設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
5.8 まとめ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93

6 ネットワークとセキュリティの管理 94
6.1 用語集 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
6.2 ネットワーク管理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
6.2.1 ネットワークインターフェースの確認 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
6.2.2 ネットワークインターフェースの再設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
6.2.3 ネットワークインターフェースの動作確認 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
6.2.4 サービスのポート番号を確認 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
6.3 SSH によるリモートログイン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
6.3.1 TELNET との違い . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
6.3.2 パスワードによる認証 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
6.3.3 公開鍵による認証 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
6.3.4 パスワード認証の禁止 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
6.4 ファイアウォールの設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
6.4.1 ファイアウォール設定の確認 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
6.4.2 許可サービスの追加 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
6.4.3 許可サービスの取り消し . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
6.4.4 ファイアウォール設定の保存 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103

104

LPI-Japan 4 https://linuc.org
目次 目次

まえがき

このたび、特定非営利活動法人エルピーアイジャパンは、Linux 技術者教育に利用していただくことを目的とした教材、「Linux
サーバー構築標準教科書」を開発し、インターネット上にて公開し、提供することとなりました。

この「Linux サーバー構築標準教科書」は、多くの教育機関から、Linux によるサーバーの構築を「基礎」から学習するための教


材や学習環境の整備に対するご要望があり、開発したものです。

「Linux サーバー構築標準教科書」に添付されたライセンス(クリエイティブ・コモンズ・ライセンス)の下
公開にあたっては、
に公開されています。

本教科書は、最新の技術動向に対応するため、随時アップデートを行っていきます。また、テキスト作成やアップデートについ
ては、意見交換のメーリングリストで、誰でもオープンに参加できます。

メーリングリストの URL

http :// list.ospn.jp/ mailman / listinfo /linux -text

執筆者・制作者紹介

岡田 賢治(バージョン 1 執筆担当)

UNIX/Linux を初めて触ってから 15 年、ユーザー、管理者そして育成に携わってきました。本テキストは、実際に用いた説明


方法などを使い、今までのノウハウを集約して執筆したつもりです。認定試験を通しての Linux 技術者の発展と、育成に関わる
先生方のお役に立てれば幸いです。

川井 義治(バージョン 1 執筆担当)

Linux の講義をするとき、多肢に渡る知識と解説が必要で、前後の内容が複雑に絡み合うむため、教材選定に苦労したり、自作
教材を使っていました。多くの内容の中から実践として使える項目を選び、使いやすい並びを目指して書きました。学校教材の
選択肢の一つや、個人教材として使って頂ければ幸いです。

宮原 徹(バージョン 2 執筆/バージョン 3 監修担当)

本教科書は、Linux/オープンソースソフトウェアをこれから勉強する皆さんと、熱心に指導に当たられている先生方の一助にな
ればと思い、作成いたしました。バージョン 3 の改訂にあたっては、新しいディストリビューションへの対応と合わせて、冗長
だった部分を減らして学習しやすい構成にしてあります。

遠山 洋平(バージョン 2 校正・図版作成担当)

Linux サーバー構築標準教科書のバージョン 1 のリリースから 3 年がたちました。本教科書は CentOS6.2 を使ったサーバー構


築のノウハウが集約されています。これからサーバー構築を実践してみたい! そんなチャレンジ精神のある皆さんのお役に立て
れば幸いです。

田口 貴久(バージョン 2 技術検証担当)

改版にあたり、わかりやすい教科書になるよう、構築でつまづきやすい部分を重点的に検証いたしました。Linux 技術者を目指
す方のお役に立てれば幸いです。

高橋 征義(バージョン 2 PDF / EPUB 版制作担当)

本教科書の PDF・EPUB 作成のお手伝いをいたしました。サーバーエンジニアの方々の技術力向上に貢献できれば幸いです。

LPI-Japan 5 https://linuc.org
目次 目次

恒川 裕康(バージョン 3 執筆担当)

バージョン 3 では、CentOS7 で採用された systemd、NetworkManager、irewalld などに合わせて内容を変更しました。近年の


セキュリティの動向にも配慮して改訂を行っています。さらに、仮想マシン上で実習をする場合に合わせて、Windows からの
SSH 接続なども盛り込んでいます。本書を少しでも多くの方に活用していただければ幸いです。

著作権

本教材の著作権は特定非営利活動法人エルピーアイジャパンに帰属します。

All Rights Reserved. Copyright © LPI-Japan.

使用に関する権利

本教科書は、クリエイティブ・コモンズ・パブリック・ライセンスの「表示 - 非営利 - 改変禁止 4.0 国際 (CC BY-NC-ND 4.0)」


でライセンスされています。

表示

本教材は、特定非営利活動法人エルピーアイジャパンに著作権が帰属するものであることを表示してください。

非営利

本教科書は、非営利目的で教材として自由に利用することができます。商業上の利得や金銭的報酬を主な目的とした営利目的で
の利用は、特定非営利活動法人エルピーアイジャパンによる許諾が必要です。ただし、本教科書を利用した教育において、本教
科書自体の対価を請求しない場合は、営利目的の教育であっても基本的に利用できます。その場合も含め、LPI-Japan 事務局ま
でお気軽にお問い合わせください。

(※)営利目的の利用とは以下のとおり規定しております。
営利企業または非営利団体において、商業上の利得や金銭的報酬を目的に当教材の印刷実費以上の対価を受講者に請求して当教
材の複製を用いた研修や講義を行うこと。

• http://list.ospn.jp/mailman/listinfo/linux-text

改変禁止

本教科書は、改変せず使用してください。ただし、引用等、著作権法上で認められている利用を妨げるものではありません。本
教科書に対する改変は、特定非営利活動法人エルピーアイジャパンまたは特定非営利活動法人エルピーアイジャパンが認める団
体により行われています。

本教科書の使用に関するお問合せ先

特定非営利活動法人エルピーアイジャパン(LPI-Japan)事務局
〒106-0041 東京都港区麻布台 1-11-9 BPR プレイス神谷町 7F
TEL:03-3568-4482
E-Mail:info@lpi.or.jp

LPI-Japan 6 https://linuc.org
目次 目次

本教科書の目的

本教科書の目的は、LinuC レベル 2 の 201 試験と 202 試験の学習範囲に含まれるサーバー構築の知識を、構築の実習を通しな


がら学習することにあります。サーバーを構築した環境で、実際に Web アクセスをしたりメールの送受信をしたりすることで、
サーバーの動作原理やプロトコルの仕組みを理解することも可能です

想定している実習環境

本教科書での実習環境として、以下の環境を構築しています。

講師と受講生

講師 1 名と受講生が 2 名以上存在すること前提とします。これは、実習のなかで受講生同士 2 名でペアを組み、お互いの設定し


たサーバーにアクセスをする作業を行うためです。

教室と割当

実習はコンピューター実習室のような教室で行うことを想定してます。講師の指示に従いながら、受講生が実習を行う形式にな
ります。マシンは、講師、受講生に各名 1 台ずつを想定しています。

1 名で学習する場合

1 名で学習する場合は、マシンは最低 3 台必要になります。講師用マシン 1 台と受講生用マシン 2 台です。後述する仮想マシン


環境を活用すれば、1 台で実習を行うことも可能です。

仮想マシン環境

仮想マシン環境を利用すると、Windows や Linux、Mac OS X 上の仮想マシンに Linux をインストールし、動作させることが


できます。仮想マシンは複数同時に動作させることができるので、3 台必要となる実習環境を 1 台のマシンでまかなうこともで
きます。仮想マシン環境を実現するソフトウェアとして、たとえば VMware 社の VMware Workstation(Windows) や VMware
Fusion(Mac OS X)、Parallels 社の Parallels Desktop(Mac OS X) や Oracle 社の VirtualBox(Windows、Linux、Mac OS X)
などが挙げられます。

マシンの構成とハードディスク

マシンの構成は、市販されている一般的な構成の PC を想定しています。その PC に Linux をインストールします。ハードディ


スクの内容は完全に消去されるので、ハードディスクの内容を消去しても良いマシンを用意するか、必要に応じてハードディス
クの内容をあらかじめバックアップしておく必要があります。

OS

本教科書では、Linux ディストリビューションとして CentOS のバージョン 7.6(64 ビット版)を利用します。

ネットワーク

実習で利用するマシンは、すべて 1 つのネットワークで接続されていることを前提とします。インターネットへの接続は任意
です。

LPI-Japan 7 https://linuc.org
目次 目次

全体の流れ

本教科書では、以下の通りに実習を進めます。

• 1 章 Linux のインストール準備と事前学習
• 2 章 Linux のインストールと設定を行う
• 3 章 DNS サーバーのインストールと設定を行う
• 4 章 Web サーバーのインストールと設定を行う
• 5 章 メールサーバーのインストールと設定を行う
• 6 章 サーバーのネットワークを管理しセキュリティの設定を行う

まず、1 章を学習してから、2 章から 5 章でサーバーのインストールと設定を行います。6 章は、インストール後に設定を変更し


たい場合に参考にして頂くための付録です。IP アドレスを変更したい場合、リモート管理をしたい場合、ファイアウォールの設
定変更が必要な場合などに参考にしてください。

LPI-Japan 8 https://linuc.org
1 LINUX のインストール準備と事前学習

1 Linux のインストール準備と事前学習

本教科書では、Linux をインストールし、サーバー環境を構築する実習をしながら、LinuC レベル 2 の範囲の理解と取得を目指


します。第 1 章では、2 章以降に行う実習に必要な環境の確認と知識の確認を行います。

1.1 用語集

Linux

Linus Torvalds 氏により開発された、UNIX 互換を目指した OS の総称を Linux といいます。ソースコードは公開されており、


世界中の開発者の協力により、日々開発が継続されています。

ディストリビューション

Linux は狭い意味では OS の中心部(=カーネル)のみを指しますが、Linux カーネルだけではシステムは動作しません。カー


ネル以外のさまざまなソフトウェアやインストーラを追加して、利用できるようにしたのがディストリビューションです。ディ
ストリビューションごとに開発方針があり、それに沿ってソフトウェアがまとめられたり、リリースが行われています。

CentOS

Linux のディストリビューションの 1 つです。Red Hat Enterprise Linux という商用のディストリビューション互換の環境を無


償で提供しているディストリビューションで、CentOS コミュニティによってリリースされています。

ネットワークアドレス

IP ネットワークを小さく分割して利用するときに、ネットワークアドレス部とホストアドレス部に分かれます。ネットワークア
ドレスの識別に利用されるのが、ネットワークアドレス部です。

IP アドレス

インターネットにおいて、IP で通信が行われる場合、端末一つ一つに IP アドレスが割り当てられます。IP アドレスとはイン


ターネット上での端末の所在地を示す” 住所” にあたります。

サブネットマスク

IP アドレスのうちネットワークアドレス部とホストアドレス部を識別するための数値のことをいいます。通常 8 ビット毎
に.(ドット) で区切って入力されます。

DNS サーバーアドレス

IP アドレスと FQDN(=ホスト名+ドメイン名)の変換を行うのが DNS サービスであり、そのサービスを提供する DNS サー


バーの IP アドレスのことです。

ホスト名

ネットワークに接続されたコンピューターに割り当てられた名称のことをいいます。特定のホストを識別するために使われます。

ドメイン名

インターネット上に存在するコンピューターやネットワークを識別するために付けらている名前の一種のことをいいます。ドメ
イン名はアルファベット、数字、一部の記号の組み合わせで構成されますが、日本語.jp のような国際化ドメインも使われるよう
になっています。

LPI-Japan 9 https://linuc.org
1 LINUX のインストール準備と事前学習 1.2 実習で利用するハードウェア

DVD

光学メディアの 1 種類で、ビデオ再生での利用で普及し、現在ではデータ記録の用途でも利用されています。約 700MB の


CD-ROM に比べ、約 4.7GB と大容量でも利用できることから、OS のインストールディスクとしても利用されています。

ハードディスク

磁気を用いた記憶媒体であり、パソコンの記憶媒体の他、音楽プレーヤー、ビデオなどの記憶媒体としても用いられています。

SSD

半導体メモリであるフラッシュメモリを用いた記憶媒体であり、ハードディスクよりも読み書きの処理性能に優れています。

LVM

LVM(Logical Volume Manager)とは,複数のハードディスクやパーティションにまたがった記憶領域を一つの論理的なディ


スクとして扱うことのできるディスク管理の機能のことです。Linux をはじめとした UNIX 系 OS 上で利用できます。

RAID

複数のハードディスクをまとめて 1 台のハードディスクとして管理する技術のことです。RAID を使うことによりデータを分散


して記録するため、高速化や安全性の向上が期待できます。RAID の方法には、専用のハードウェアを使う方法(ハードウェア
RAID)とソフトウェアで実現する方法(ソフトウェア RAID)があり、高速性や安全性のレベルにより、RAID 0 や RAID 5
などいくつかの種類があります。

1.2 実習で利用するハードウェア

本教科書の実習では、市販されているような一般的な構成の PC に Linux を導入して、その環境上に様々なサーバーを導入し実


際に動作させます。この実習で必要な、ハードウェアの仕様は次の通りです。

マシン本体

Windows や Linux が動作する、いわゆる「パソコン」を想定しています。ただ、実習用のパソコンを用意することが難しい場


「VirtualBox」のような仮想マシンソフトウェアを利用して実習環境を用意することもできます。VirutalBox は、次の
合には、
URL からダウンロードすることができます。

https :// www. virtualbox .org/

実装メモリ

CentOS 7 では 1024MB のメモリが推奨されています。実装メモリが少ない場合はテキストインストールが実行されることがあ


ります。

DVD 光学ドライブ

本教科書の実習では、インストール用 DVD を利用するので、光学ドライブが DVD を読み取りできる必要があります。DVD の


光学ドライブがない機種では、USB ドライブを利用することもできます。また一部のノートパソコン等で、光学ドライブが無い
マシンもあります。そういったときは、USB 等で接続する DVD ドライブを用意します。それを利用することにより、インス
トール DVD を起動することができます。

USB メモリ

最近の PC では USB メモリからのブートもサポートしています。そのため、インストール DVD の代わりに、USB メモリを利


用することができます。

LPI-Japan 10 https://linuc.org
1 LINUX のインストール準備と事前学習 1.3 利用する Linux のディストリビューション

ハードディスク

Linux をインストールするためには記憶装置が必要です。ここでは記憶装置としてハードディスクを使います。インストールに
はハードディスクに約 8GB の空き領域があれば十分なので、一般的な構成の PC では十分満たしていると思います。またハー
ドディスクをフォーマット(初期化)して Linux をインストールします。従って、ハードディスクの中身は全部消去されます。
その為、ハードディスクを削除していい PC を利用するか、バックアップを取ってから作業を行ってください。

その他周辺機器

本体や DVD、光学ドライブ、ハードディスクドライブの他にも、一般的に利用するためにはキーボード、マウス、ディスプレイ
等の周辺機器が必要です。キーボードは、日本語か英語かで設定が異なりますので、日本語キーボード、英語キーボードの区別
を「確認シート」に記述します。

1.3 利用する Linux のディストリビューション

本教科書では、CentOS のバージョン 7.6、64 ビット版を利用します。

CentOS 公式サイト

http :// www. centos .org/

CentOS は、商用ディストリビューションである Red Hat Enterprise Linux の互換ディストリビューションとして提供されてい


ます。本家 Red Hat とのバイナリ互換を保ちながら、サポートも同等を目指すという方針で開発されています。利用に際し費用
が発生することはない、無償で提供されているディストリビューションです。

1.3.1 インストール DVD/USB の入手方法

今回インストールには、DVD または USB のインストーラーを利用します。CentOS のインストール用 DVD、USB の入手方法


には次の 2 通りが存在します。

ISO イメージをダウンロードする

CentOS が配布している ISO イメージを、ダウンロードします。ダウンロード元の URL は以下のとおりです。CentOS の最新


版の、ISO イメージのページへのリンクになっています。

ダウンロードサイト

http :// isoredirect . centos .org/ centos /7.6.1810/ isos/ x86_64 /

この URL をクリックすると、多くのミラーサイトが表示されます。その中でバージョン 7.6 の ISO イメージをダウンロードし


ます。例えば、riken(理化学研究所)が提供しているミラーサイトの URL であれば次のようになります。

ダウンロードする ISO イメージ

http :// ftp.riken.jp/Linux/ centos /7.6.1810/ isos/ x86_64 /CentOS -7- x86_64 -DVD -1810. iso

この DVD イメージ (CentOS-7-x86_64-DVD-1810.iso) をダウンロードします。ISO イメージは合計で 4.3GB あり、転送に時


間がかかります。

また、BitTorrent を使ってのダウンロードも行えます。ダウンロードサイトに.torrent という拡張子のファイル名が置かれてい


るので、このファイルをダウンロード後、BitTorrent に対応したソフトウェアを使ってダウンロードが行えます。

ダウンロードした ISO イメージは、DVD や USB のライティングソフトウェアを使って DVD/USB に書き込んでください。


データとしてではなく、イメージとして書き込む点に注意してください。

雑誌や解説書の付録

CentOS は雑誌に付属していたり、CentOS の解説書が多く出版されています。それらに付属しているインストール DVD を利


用してもかまいません。

LPI-Japan 11 https://linuc.org
1 LINUX のインストール準備と事前学習 1.4 ネットワーク環境について

図 1 CentOS7.6 のダウンロードサイト

1.3.2 バージョン

本教科書では、本教科書の作成時点で最新であった CentOS 7.6 を利用した構築方法について解説しています。雑誌や解説書な


どの付録など、入手の方法によっては 7.6 ではない、より新しいバージョンの CentOS を手にすることがあるかもしれません。
しかし、バージョン 7.x 系であれば大きな差は無いようです。従って CentOS の 7.x 系であれば、同様の手順でサーバーの構築
ができるようになっています。

1.4 ネットワーク環境について

本教科書での実習ではネットワークを利用します。ネットワークの設定項目は複数ありますので、次の「ネットワークの設定項
目」の説明を参考にしてあらかじめ別紙「確認シート」を作成した上で設定を行いましょう。

利用するネットワークの各種設定情報が組織のネットワーク管理担当者から指示されている場合は、その内容を「確認シート」
に記述します。本教科書では特定の IP アドレスを用いて設定しますが、それを適宜指示された内容に読み替えてください。

ネットワークを自由に設定できる場合は、本教科書で用いているネットワークの設定を利用して下さい。本教科書では、ネット
ワーク環境としてコンピューター実習教室を想定しています。教室には PC が 3 台以上あり、講師用 PC が 1 台と受講生用 PC
が 2 台以上あるとします。ネットワークは、講師用、受講生用 PC の区別無く、すべての PC が 1 つのネットワークに接続され
ていることを想定しています。

CentOS7 は、インターネットからパッケージを自動的にダウンロードする機能など、インターネットに接続できる環境で利用す
ることを想定しています。そのため、実際にインターネットに接続できる IP アドレスと DNS サーバの設定をすると、簡単に設
定を行うことができます。できるだけ、そのような環境を用意することをお勧めします。

1.4.1 ネットワークの設定項目

ドメイン名

ドメイン名は、DNS サーバーを設定するときに必要になります。受講生同士が同じドメイン名にならなければ、各自自由なドメ
イン名をつけてかまいません。このドメイン名は、あくまでこのネットワーク内のみで有効なドメイン名で、外部の DNS とは
隔離された状態にあります。本教科書では、受講生用に alpha.jp と beta.jp の 2 つを使用します。

ホスト名

LPI-Japan 12 https://linuc.org
1 LINUX のインストール準備と事前学習 1.5 高度なストレージ管理

自分の PC に設定するホスト名です。今回は host +受講生番号 + ドメイン名とします。確認のため「確認シート」に記述し


ます。

IP アドレス

IP アドレスは、PC の IP アドレスです。できれば、実際にインターネットに接続できる IP アドレスを設定してください。な


お、本教科書では、講師用 PC の IP アドレスを 192.168.1.10、受講生用 PC の IP アドレスを 192.168.1.101 と 192.168.1.102 と
しています。適宜テキストを読み替えて利用してください。

サブネットマスク

サブネットマスクは、IP アドレスのネットワーク部とホスト部を分ける値です。本教科書では 255.255.255.0(/24) とします。実


際のネットワークに合わせた値を設定してください。

ネットワークアドレス

ネットワークアドレスは、PC が含まれているネットワーク全体を示すアドレスです。本教科書では 192.168.1.0 とします。

デフォルトゲートウエイ

異なるサブネットとの通信に必要な値です。本教科書では 192.168.1.1 とします。実際のネットワークに合わせた値を設定して


ください。

DNS サーバーアドレス

ホスト名と IP アドレスの対応を解決する、DNS(ドメインネームシステム)という機構があります。DNS を利用するためには


DNS サーバーの IP アドレスが必要です。インストール時には、できるだけ実際のネットワークで利用可能な DNS サーバーの
アドレスを設定してください。

なお、本教科書では 3 章で、実際に DNS サーバーを設定し動作させます。実習では、最初は外部の DNS サーバを使ってパッ


ケージをインストールし、DNS サーバを構築します。その後は、自分自身で動作させている DNS サーバーを参照するため、
DNS サーバーアドレスを自分の IP アドレスに変更します。

1.4.2 ネットワークの設定項目の確認シートの例 (受講者 1 用)

設定項目 本教科書の例 備考

ドメイン名 alpha.jp
ホスト名 host1.alpha.jp
IP アドレス 192.168.1.101
サブネットマスク 255.255.255.0(/24)
ネットワークアドレス 192.168.1.0
デフォルトゲートウエイ 192.168.1.1
DNS サーバーアドレス 192.168.1.10

1.5 高度なストレージ管理

ここでは、高度なストレージ管理として LVM(Logical Volume Manager) と RAID(Redundant Arrays of Inexpensive Disks)


について説明します。インストールを開始すると、LVM の設定が施されるところがあり、それについての説明です。少々高度な
内容になるため、インストール作業後に読んでもかまいません。

1.5.1 LVM

Logical Volume Manager(LVM)という機構は、一言で言えば「ディスク管理操作を非常に便利にしてくれる機構」と言えま


す。ハードディスクを利用する際には、いくつかの「パーティション」に分割します。Windows のみならず、Linux でもパー

LPI-Japan 13 https://linuc.org
1 LINUX のインストール準備と事前学習 1.5 高度なストレージ管理

ティションを分割する作業を行います。パーティション分割作業は、容量を決めるのに非常に困難が伴います。
「思ったより利用
が多く、足りなくなってしまった」
「念のため多めにパーティションを割り当てたら、あまり利用されず、大半が未使用になって
しまった」といった具合です。だからといって、パーティションを再分割することは非常に手間がかかります。ハードディスク
の内容を、一度全部消してしまうからです。再度インストール作業を行なった後、設定を行いデータを復元する作業は、相当な
時間や手間を使います。LVM を用いると、パーティションを柔軟に取り扱うことができます。

1.5.2 LVM の仕組み

LVM の仕組みは、次のようになっています。

図 2 LVM の仕組み

PV(Physical Volume)

ディスクの物理領域です。パーティションの 1 区画であったり、ディスク 1 台丸ごと PV ということもありえます。

VG(Volume Group)

一つ以上の PV の集まりが Volume Group です。

LV(Logical Volume)

VG から、LV 領域を切り出して利用します。LV は自由に容量を増やしたり減らしたりできます。LV の容量の合計が、切り出し


元の VG より大きくなることはありません。LV の領域にファイルシステムを作成して、ファイルやディレクトリなどのデータ
が格納されます。

1.5.3 LVM の利点

LVM を用いると、どんな点が便利なのでしょうか?実際にケーススタディで学習してみましょう。

ディスク領域が不足した場合にディスク容量の増加が容易

LV に保存したデータが増加し、割り当てた LV の容量では足りなくなった場合は、LV の大きさを増やすことで対応可能です。


使用しているファイルシステムによっては、OS を止めることなく容量を増やすこともできます。逆に LV を大きく切り出しすぎ
て余ってしまった場合には、ファイルシステムを縮めた後に LV を小さくします。これで VG の未使用領域が増えるので、他の
LV を増やしたり、新しく LV を切り出したりするときに利用できます。

LPI-Japan 14 https://linuc.org
1 LINUX のインストール準備と事前学習 1.6 RAID

ハードディスクを増設するのも容易

LV の利用率も増え、その元である VG の空き容量が少なくなったとします。そのときは、ハードディスクを増設しますが、LVM
を用いると作業は簡単です。ハードディスクを取り付けて、そのハードディスクを PV とします。その PV を VG に追加する
と、VG 全体の容量が増えます。増えた VG から新しく LV を切り出したり、既存の LV のサイズを増やしたりすることに利用
できる領域を増やすことができます。

1.6 RAID

1.6.1 RAID とは

RAID とは Redundant Arrays of Inexpensive Disks の略で、ディスクの耐障害性を高めたり、機能を高めたりすることに用い


られます。ディスクのアクセス性能を上げたい場合や、重要なデータを置いておく場合に利用します。

1.6.2 RAID の種類

RAID にはその機能でさまざまな種類があります。ここでは広く用いられる RAID 0,1,5,6,1+0 について説明します。

RAID 0(ストライピング)

2 台以上のディスクを用意し、書き込み時にそれぞれのディスクに分散書き込みを行います。ディスクの処理が分散するので、読
み書きの速度が高速になります。また、使用できるディスク容量はすべてのディスクの容量の合計となります。欠点は、1 台で
もディスクが壊れるとすべてのデータが読み書きできなくなることです。

RAID 1(ミラーリング)

ディスクを 2 台用意し、それぞれに同じ内容を書き込みます。一方のディスクが壊れても、もう一方のディスクが正常であれば
データは失われません。そのため、ディスク障害に強い構成を実現できます。欠点は、利用できる容量が総容量の半分になって
しまうことです。例えば容量 500GB のディスクを 2 台用意しても、使用できる容量は 500GB のままです。

RAID 5(パリティ分散)

ディスクを 3 台以上用意し、パリティという特別な仕組みを一緒に書き込むことでディスクの冗長化を図っています。ディスク
が 1 台故障してもデータを失うことはありません。RAID 5 は 1 台あたりのディスク容量 × (台数-1) の容量が使えますの
で、ディスクの利用効率も良いことになります。たとえば 500GB のディスクを 3 台用意すれば、合計 1TB のディスク容量にな
ります。欠点は、データ書き込み時のパリティ計算の負荷が高いため書き込み性能が高くないことや、故障に耐えられるディス
クが 1 台までなので、運悪く 2 台以上同時に壊れると元データの復元ができないといった点が挙げられます。

RAID 6(複数分散パリティ)

パリティを 2 重に計算し書き込むことで、ディスクが 2 台まで故障しても大丈夫にした RAID 構成です。欠点は、より高度なパ


リティ計算を高速に行うために専用のハードウェアが必要となる点です。

RAID1+0(ミラーリング+ストライピング)

RAID 1+0 はミラーリング (RAID 1) したディスクをストライピング (RAID 0) する RAID の構成です。ストライピングはディ


スクが 1 台でも壊れるとすべてのデータが失われてしまいますが、RAID 1+0 ではミラーリングが行われているので、ディスク
が 1 台壊れてもデータは失われません。ただし、ミラーリングされた両方のディスクが壊れてしまうと、通常の RAID 0 と同様
にデータは失われてしまいます。欠点は、ディスクが最低でも 4 台必要であることと、ミラーリングされているため容量が半分
になってしまうという点です。

その他の RAID

RAID には、他にも 2,3,4 がありますが、あまり使われていません。

LPI-Japan 15 https://linuc.org
1 LINUX のインストール準備と事前学習 1.6 RAID

1.6.3 ハードウェア RAID とソフトウェア RAID

RAID ではハードウェア RAID とソフトウェア RAID が存在します。

ハードウェア RAID

ハードウェア RAID は、RAID の処理をハードウェアが行います。従って、OS、マザーボード側から見ると、ディスクが 1 台存


在しているように見えるだけです。RAID コントローラは OS、マザーボードにディスクが 1 台と「見せかけながら」
、その背後
で RAID の処理を行っています。ハードウェア RAID を使う利点は、OS は一般的なハードディスクとして認識されるために特
別なドライバーを導入する必要がないことと、OS やハードウェアに負荷がかからないことです。欠点として特別なハードウェ
ア(RAID コントローラ)が必要であるため、費用がかかる点が挙げられます。

ソフトウェア RAID

ソフトウェア RAID は、OS やドライバーが RAID 作業を行います。ソフトウェア RAID は特別なハードウェア(RAID コント


ローラ)が必要ではないため、コストを抑えて RAID を組むことができますが、欠点として OS の対応やドライバーの対応が必
要であることや、ハードウェア RAID と比べて OS、ハードウェア(特に CPU)に負荷がかかる点が挙げられます。

1.6.4 高度なストレージの利用

高度なストレージとして、LVM と RAID を紹介しました。ではどのような場面で利用するのが好ましいでしょうか?

Linux では(後に紹介しますが)、ディスクを使用するためにパーティションに対して特定のディレクトリをマウントさせます。
デフォルトの構成ではパーティションが一つ作成され、そこにすべてのディレクトリの大元となるルートディレクトリ(”/”)が
マウントされ、そのサブディレクトリとして/var や/home といったディレクトリが作成されます。

/var には、ログファイルなどシステムが様々なデータを書き出します。/home は、ユーザーが作成したデータが置かれます。こ


の 2 つのディレクトリは非常に重要であり、なおかつ利用量が非常に変化しやすいディレクトリなので、このようなディレクト
リはパーティションを分け、ルートディレクトリと切り離してマウントし、そのパーティションを LVM を用いて可変としたり、
RAID を用いて冗長化されるよう構成することが望ましいと言えます。

LPI-Japan 16 https://linuc.org
2 LINUX のインストール

2 Linux のインストール

本章では、実際に Linux のインストールと設定を行います。ネットワークの設定や、インストールするソフトウェアの選択など、


次章以降に影響する重要な内容ですので、しっかり学習しましょう。

2.1 用語集

メディアの整合性

作成されたメディアが、配布されたオリジナルの内容と違いが無いかどうかはメディアの整合性が取れているかどうかで確認で
きます。何らかの原因により整合性が取れていない場合、ソフトウェアのインストールに失敗してしまいます。CentOS ではイ
ンストール手順の開始時、メディアの整合性が取れているかどうかチェックが行えるようになっています。

BIOS

PC の周辺機器を制御するプログラムのことをいいます。PC には必ずこの BIOS が内蔵され、BIOS が起動後、OS が起動しま


す。内蔵の時計や、起動デバイスの選択等を設定できます。設定は、マザーボード上のフラッシュメモリに保存されています。

起動順序

どの記憶装置から OS を起動するか、起動デバイスの優先順位をつけることをいいます。起動順序は、BIOS で設定することが


できます。ハードディスクの他、CD/DVD 等の光学ドライブ、USB のストレージデバイス、FDD 等を選ぶことができます。

タイムゾーン

Linux の動作時に時刻を設定します。通常の時刻を設定するほか、そのマシンが起動している場所の時間帯を設定できます。日
本で動作させるときは、日本標準時 (=JST) に設定します。

フォーマット

ハードディスク等を OS で読み書きできる状態にすることで初期化ともいいます。フォーマットを実行すると、ディスクのデー
タはすべて削除されます。

ファイアウォール

インターネットにコンピューターを直接接続すると不正にアクセスされるおそれがあるため、ファイアウォールを構築します。
ファイアウォールを動作させることで、ネットワークのセキュリティ機能を高めることができます。通常の利用では有効化する
ことが推奨されます。

2.2 インストールの前に用意するもの

確認シート

インストールの前に、1 章で記入した「確認シート」を手元に用意します。この内容を確認しながら、インストール作業を行い
ます。

インストール DVD/USB

CentOS 7.6 のインストール DVD/USB を用意します。

LPI-Japan 17 https://linuc.org
2 LINUX のインストール 2.3 インストールの開始

マシンの設定

インストールを開始するにあたり、マシンの設定を確認します。確認する内容は、BIOS で設定する「起動順序」です。DVD か
らインストールする場合には、起動順序で必ず DVD ドライブを優先にします。同様に、USB からインストールする場合には、
起動順序で USB デバイスを優先にします。これらのデバイスよりハードディスクの優先度が高いと、ハードディスクにインス
トールされている OS が起動してしまいます。

ハードディスク

本教科書では、CentOS をインストールする際にハードディスクの中身を消去します。従ってハードディスクの中身を消去して
も良い PC を利用するか、ハードディスクの中身のバックアップを取ってから作業を行います。

2.3 インストールの開始

それでは、インストールを開始します。

2.3.1 インストールメディアの読み込み

1. DVD ドライブ、USB デバイスの起動優先順位をハードディスクより高くします。

2. インストール DVD/USB をセットし、マシンを起動します。

3. 起動画面が現れます。

4. ↓↑などのキーを使ってメニューを選択します。「Install CentOS 7」を選択し、Enter キーを押すとインストールが始ま


ります。
「Test this media & Install CentOS 7」を選択すると、メディアの内容の整合性をチェックし、問題がなければインス
トールが始まります。

2.3.2 言語設定

1. 言語の選択画面が表示されるので、左側のメニューから「日本語 Japanese」を選択します。画面右側のメニューに「日本
語(日本)
」と表示されます。

LPI-Japan 18 https://linuc.org
2 LINUX のインストール 2.3 インストールの開始

2.「続行」をクリックします。すると、インストールメニュー画面が表示されます。

「!」が付いた項目は、必ず設定を行わなければならない項目です。

LPI-Japan 19 https://linuc.org
2 LINUX のインストール 2.3 インストールの開始

2.3.3 インストール先ディスクの設定

1.「インストール先」のアイコンをクリックします。すると、「インストール先のディスク設定」画面が表示されます。

2.「ローカルの標準ディスク」の欄で、利用するディスクを選択します。

3.「パーティション構成」の欄の「パーティションを自動構成する」を選択します。

4.「完了」をクリックします。すると、インストールメニュー画面に戻ります。

2.3.4 ネットワークとホスト名の設定

1.「ネットワークとホスト名」のアイコンをクリックします。すると、「ネットワーク設定」画面が表示されます。

2.「ホスト名」の欄に、ホスト名を入力します。入力後、
「適用」をクリックします。適用されると、右側の「設定」ボタンの
下にホスト名が表示されます。

LPI-Japan 20 https://linuc.org
2 LINUX のインストール 2.3 インストールの開始

3.「設定」をクリックします。次のような画面が表示されます。

4.「IPv4 のセッティング」タブをクリックします。すると、次のような画面が表示されます。

5.「方式」を「手動」に変更します。

6. アドレスの欄の「追加」をクリックすると、アドレス、ネットマスク、ゲートウェイの項目が入力できるようになります。
各項目に設定を行います。

7.「DNS サーバー」に DNS サーバーのアドレスを入力します。

8. 設定が終わったら「保存」をクリックします。

9. ネットワークとホスト名の設定画面に戻ります。「オフ」になっているスイッチをクリックして、「オン」に変更します。

LPI-Japan 21 https://linuc.org
2 LINUX のインストール 2.3 インストールの開始

先ほど設定したアドレス、サブネットマスク、デフォルトゲートルート、DNS の値が表示され、ネットワークが有効にな
ります。

10.「完了」をクリックして、インストールメニュー画面に戻ります。

2.3.5 ソフトウェアの選択

1.「ソフトウェアの選択」のアイコンをクリックします。「ソフトウェアの選択」画面が表示されます。

2. ベース環境メニューから「サーバー(GUI 使用)」を選択します。また、選択した環境のアドオンのメニューから「開発
ツール」を選択します。

3. 設定ができたら、「完了」をクリックして、インストールメニューに戻ります。
自動的にソフトウェアの依存関係のチェックが行われます。チェックが終わると「!」がはずれ、
「インストール開始」が
クリックできるようになります。

LPI-Japan 22 https://linuc.org
2 LINUX のインストール 2.3 インストールの開始

2.3.6 インストールの開始とパスワード設定

1.「インストール開始」をクリックすると、インストールが始まり、「インストール状況の表示」画面が表示されます。

2.「ROOT パスワード」のアイコンをクリックします。root パスワードの設定画面が表示されます。

3.「root パスワード」「確認」の項目に、root のパスワードを入力します。英文字の大文字、小文字、数字、記号などを組み


合わせて、複雑なパスワードを設定します。パスワードの強度が足りない場合や、2つのパスワードが一致しない場合に
は、画面の最下部に警告メッセージが表示されます。

4. 設定ができたら「完了」をクリックして、「インストール状況の表示」画面に戻ります。

5.「ユーザの作成」のアイコンをクリックします。「ユーザの作成」画面が表示されます。ここでは、管理ユーザを設定し
ます。

LPI-Japan 23 https://linuc.org
2 LINUX のインストール 2.3 インストールの開始

6. ユーザ名に管理ユーザの名前を入力します。どのような名前でも構いませんが、本書では、admin を入力します。

7.「このユーザを管理者にする」「このアカウントを使用する場合にパスワードを必要とする」をクリックし、チェックし
ます。

8.「パスワード」「パスワードの確認」に、管理ユーザのパスワードを入力します。パスワードの強度が足りない場合や、2
つのパスワードが一致しない場合には、画面の最下部に警告メッセージが表示されます。

9.「完了」をクリックして、インストール状況の表示画面に戻ります。

10. インストールが完了すると、次のような画面が表示されます。

「再起動」をクリックします。

LPI-Japan 24 https://linuc.org
2 LINUX のインストール 2.3 インストールの開始

2.3.7 インストール後の初期設定

1. 再起動すると、ブートローダーが起動する OS の選択を求めてきます。そのまま待つか Enter キーを押します。

2. 起動プロセスが進み、「初期セットアップ」画面が表示されます。

3.「LICENSE INFORMAITON」のアイコンをクリックします。すると、「ライセンス情報」画面が表示されます。

LPI-Japan 25 https://linuc.org
2 LINUX のインストール 2.4 ログインする

4.「ライセンス契約に同意します。」のチェックボックスをクリックします。

5.「完了」をクリックし、「ライセンス情報」画面に戻ります。

6.「設定の完了」ボタンをクリックすると、初期設定作業はすべて完了です。

2.4 ログインする

ログイン画面が表示されるので、管理者ユーザー admin でログインします。

1. ユーザ名をクリックします。すると、パスワード入力欄が表示されます。

2. admin のパスワードを入力します。

3. 最初にログインすると、「ようこそ」の画面が表示されます。

LPI-Japan 26 https://linuc.org
2 LINUX のインストール 2.4 ログインする

4. 使用言語が「日本語」になっていることを確認して、「次へ」をクリックします。すると、「入力」画面が表示されます。

5.「日本語(かな漢字)」を選択して、「次へ」をクリックします。すると「プライバシー」画面が表示されます。

LPI-Japan 27 https://linuc.org
2 LINUX のインストール 2.4 ログインする

6.「次へ」をクリックします。「オンラインアカウントへの接続」画面が表示されます。

7. サーバーの管理には不要な項目ですので、「スキップ」をクリックします。すると、「準備完了」画面が表示されます。

LPI-Japan 28 https://linuc.org
2 LINUX のインストール 2.5 コマンドの実行

8.「CentOS Linux を使い始める」ボタンをクリックすると、ウィザードが終了します。

2.5 コマンドの実行

GUI でログインすると、Windows などと同じように様々なグラフィカルなアプリケーションが利用できますが、「端末」を実行


すると Linux のコマンドを実行できます。

2.5.1 端末を利用する

端末を起動するには以下の方法があります。

•「アプリケーション」メニューから「システムツール」、「端末」を選択する
• デスクトップ上を右クリックし、ポップアップメニューから「端末を開く」を選択する

「端末」ウインドウは複数起動できるので、一方で操作をしながら一方でログを表示したり、ユーザーを切り替えて操作すること
もできます。

2.5.2 Windows から SSH を使って接続する

VirtualBox などの仮想環境で実習を行っている場合には、Windows からネットワーク経由で接続することで、Linux のコマン


ドを使う方法が便利です。この方法を使う場合には、Windows に SSH 用のアプリケーションをインストールする必要がありま
す。Windows で利用できる SSH のソフトウェアとしては、TeraTerm がよく使われています。TeraTerm は、telnet や SSH に
対応したオープンソースソフトウェアです。日本語の表示にも対応しています。

TeraTerm は、次の URL から入手することができます。

https :// ja.osdn.net/ projects / ttssh2 /

ソフトウェアをダウンロードし、PC にインストールします。

TeraTerm の使い方

1. TeraTerm を起動すると、次のような画面が表示されます。

LPI-Japan 29 https://linuc.org
2 LINUX のインストール 2.5 コマンドの実行

2.「ホスト」の項目に SSH で接続したいホスト名か IP アドレスを入力します。サービスとバージョンは、標準で SSH、


SSH2 になっていますので、変更不要です。「OK」をクリックすると、SSH 接続が行われます。

3. 初めて SSH 接続を行った場合には、SSH サーバーの電子証明書が送られてきて、接続してよいか尋ねられますので、「続


行」をクリックします。

図 3 TeraTerm の起動画面

4. ユーザ認証の画面が表示されますので、ユーザ名に admin、パスワードに admin に設定したパスワードを入力して、


「OK」をクリックします。

LPI-Japan 30 https://linuc.org
2 LINUX のインストール 2.6 ローカルリポジトリの設定

5. ログインできると、プロンプトが表示され、端末と同じように利用できるようになります。

TeraTerm も、端末と同様に複数起動し、必要に応じて切り替えて使うことができます。

2.5.3 root で設定を行う

実際に、サーバーの設定を行う場合には、root ユーザで設定を行う必要があります。root ユーザになるには、次のようにコマン


ドを実行します。パスワードには、インストール時に設定した root パスワードを入力します。

root ユーザになる

[ admin@host1 ~]$ su -
パ ス ワ ー ド : ******** ← root パ ス ワ ー ド を 入 力
[ root@host1 ~]#

先頭の「[root@host1 ~]#」はプロンプトで、入力待ちであることを示しています。プロンプトには、ユーザ名、ホスト名、カレ
ントディレクトリが表示されています。admin ユーザの場合には、その後ろに「$」が付きます。root ユーザになっている場合
には、必ず「#」になります。確認しながら作業を行います。なお、本書では特に理由がない限り、プロンプトは省略して「# 」
とだけ表記しています。

2.6 ローカルリポジトリの設定

CentOS7 では、標準では、ソフトウェアのパッケージはインターネットからダウンロードするようになっています。もし、イン
ターネットに接続していない状態で演習を行う場合には、ローカルリポジトリの設定を行います。

LPI-Japan 31 https://linuc.org
2 LINUX のインストール 2.6 ローカルリポジトリの設定

ローカルリポジトリの設定ファイルは、/etc/yum.repos.d/CentOS-Media.repo です。このファイルを編集し、ローカルリポジ
トリを有効にし、DVD からインストールが行われるようにします。

/etc/yum.repos.d/CentOS-Media.repo の編集

# vi /etc/yum.repos.d/CentOS -Media.repo

/etc/yum.repos.d/CentOS-Media.repo

[c7 -media]
name=CentOS - $releasever - Media
baseurl ='file :/// run/media/admin/ CentOS 7 x86_64 ' ← 変更する
gpgcheck =1
enabled =1 ← 変更する
gpgkey =file :/// etc/pki/rpm -gpg/RPM -GPG -KEY -CentOS -7

この設定を行うと、admin ユーザでログインし、DVD を挿入したときにローカルリポジトリが使えるようになります。また、


base や updates など、インターネットに接続した時にしか使えないリポジトリを無効にしておきます。

/etc/yum.repos.d/CentOS-Base.repo の編集

# vi /etc/yum.repos.d/CentOS -Base.repo

/etc/yum.repos.d/CentOS-Base.repo

# CentOS -Base.repo
#
# The mirror system uses the connecting IP address of the client and the
# update status of each mirror to pick mirrors that are updated to and
# geographically close to the client . You should use this for CentOS updates
# unless you are manually picking other mirrors .
#
# If the mirrorlist = does not work for you , as a fall back you can try the
# remarked out baseurl = line instead .
#
#

[base]
name=CentOS - $releasever - Base
mirrorlist =http :// mirrorlist . centos .org /? release = $releasever &arch= $basearc
h&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
enabled =0 ← 追加

# released updates
[ updates ]
name=CentOS - $releasever - Updates
mirrorlist =http :// mirrorlist . centos .org /? release = $releasever &arch= $basearc
h&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
enabled =0 ← 追加

LPI-Japan 32 https://linuc.org
2 LINUX のインストール 2.6 ローカルリポジトリの設定

# additional packages that may be useful


[ extras ]
name=CentOS - $releasever - Extras
mirrorlist =http :// mirrorlist . centos .org /? release = $releasever &arch= $basearc
h&repo= extras &infra= $infra
# baseurl =http :// mirror . centos .org/ centos / $releasever / extras / $basearch /
gpgcheck =1
gpgkey =file :/// etc/pki/rpm -gpg/RPM -GPG -KEY -CentOS -7
enabled =0 ← 追加

# additional packages that extend functionality of existing packages


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

LPI-Japan 33 https://linuc.org
3 DNS サーバーの構築

3 DNS サーバーの構築

ネットワークサービスを使うための土台となる名前解決のサービス (DNS) を設定します。自分の DNS サーバーを他のコン


ピューターから参照できるように設定をします。DNS に問い合わせを行うコマンドに慣れ、ドメインを管理する BIND プログ
ラムの設定ファイルを扱います。

3.1 用語集

ドメイン名とゾーン

組織に割り当てられてインターネットで使用する名前をドメイン名と呼びます。ドメイン名は ICANN(Internet Corporation for


Assigned Names and Numbers) により管理されています。DNS でドメイン名を設定するときは、ドメインではなく「ゾーン」
と呼びます。

FQDN

ドメイン名表記で、一番右に「.」
(ドット)でルートドメインまでを記述する方式を FQDN と呼びます。

DNS

DNS(Domain Name System) は、IP アドレスと対応するホスト名を登録しておき、プログラムからの問い合わせに応じて IP


アドレスやホスト名を返答するシステムです。

ゾーン

DNS の名前空間の一部分を取り出したものをゾーンとよびます。ゾーンは、DNS を管理する単位として使われます。ゾーンに


は、ドメイン、サブドメイン、ホスト名などが含まれています。DNS 名前空間はツリー構造で表されますが、ゾーンは特定の
ノード以下の一部または全部を含む部分です。

DNS キャッシュサーバー

プログラムからの名前問い合わせを代行して、様々な DNS サーバーへ名前問い合わせを行って結果を返却するサーバーです。


調べた結果をキャッシュしておき、次回問い合わせ時にキャッシュの情報を返すことから、DNS キャッシュサーバーと呼ばれま
す。単純に、DNS サーバーと呼んだときには、DNS キャッシュサーバーのことを指します。

DNS コンテンツサーバー

委託されたゾーンの IP アドレスやホスト名を管理する DNS サーバーです。

リゾルバ

ドメイン名をもとに IP アドレス情報の検索をしたり、IP アドレスからドメイン情報の検索を行う、名前解決を行うプログラム


のことです。

BIND

BIND(Berkeley Internet Name Domain) は、Linux と組み合わせて多く使用されている DNS サーバーのソフトウェアです。


DNS キャッシュサーバーとしても、DNS コンテンツサーバーとしても利用することができます。

unbound

unbound は、高機能で高速な DNS キャッシュサーバーです。攻撃に強いことから、最近は BIND に変わって利用されることが


多くなっています。

LPI-Japan 34 https://linuc.org
3 DNS サーバーの構築 3.2 DNS の仕組み

グルーレコード

管理を委任しているゾーンについての問合せに対して、DNS サーバーが委任先のゾーンの DNS コンテンツサーバーのアドレス


を返す際に、追加情報として必要となる委任先 DNS コンテンツサーバーの A レコードをグルーレコードといいます。

A レコード

名前に対して IP アドレスを指定するためのレコードです。

NS(Name Server) レコード

ゾーンの権威を持つ DNS コンテンツサーバーを指定するためのレコードです。

MX(Mail eXchange) レコード

メールアドレスに利用するドメイン名を定義するためのレコードです。メールサーバーの障害にも対応するために、複数個の
メールサーバーを記述でき、プリファレンス値の低いサーバーにメール配信が優先されます。

3.2 DNS の仕組み

インターネットでのコンピューター同士の通信は、IP(Internet Protocol) を使って行われています。IP 通信には相手の IP アド


レスが必要ですが、インターネット上の大量のコンピューターを IP アドレスで識別するのは困難です。そこでドメイン名やホ
スト名という考え方が導入されました。ドメイン名は組織を表し、ホスト名はその組織が管理しているコンピューターです。表
記するときは「ホスト名. ドメイン名」とドット区切りで表記しますが、両方を合わせてホスト名と呼ぶこともあります。

インターネットの研究が始まった当初は IP アドレスが割り当てられたコンピューターの数も数えるほどだったので、ホスト名
と IP アドレスの対応関係はファイルに記述されて、定期的に更新されていました。この仕組みは今でも残っており、Linux で
は/etc/hosts がそのファイルです。しかし、インターネットが広まるに従って、ホストファイルでは管理しきれなくなってきま
した。そこで登場したのが DNS(Domain Name System) です。

DNS コンテンツサーバーは、ドメイン名を割り当てられた組織毎に用意します。DNS コンテンツサーバーの管理者は、そのド


メインに所属しているホスト名と割り当てられた IP アドレスを DNS コンテンツサーバー登録します。ホストにアクセスしたい
利用者は、そのホストが所属するドメインの DNS コンテンツサーバーに問い合わせを行うことで、IP アドレスを得ることがで
きます。しかし、ユーザが、アクセスする毎にどの DNS コンテンツサーバーに問い合わせをするのかを調べることは面倒です。
DNS キャッシュサーバーは、その調査を自動的に行ってくれます。また、調査結果を一定時間キャッシュし、毎回調べなくても
良いようにしてくれます。

DNS の仕組みでは、ゾーンの管理権限がそれぞれの DNS 管理者に権限委譲されているので、ホストファイルのような一元管理


ではなく、分散管理となります。管理作業が分担されていて更新も頻繁に行われるので、リアルタイムにホスト名と IP アドレス
の対応関係を調べることができる仕組みとなっています。

3.3 ドメインの構造

DNS が取り扱うドメイン名は設計上、ルートドメインを頂点とした階層型のツリー構造となっています。ちょうど、コンピュー
ターのファイルシステムがルートディレクトリを頂点としたツリー構造になっているのと同じだと考えてよいでしょう。そして、
その配下にあるドメインはサブドメインとよばれます。ドメインの階層型のツリーは、ルートドメインとたくさんのサブドメイ
ンから構成されています。

3.3.1 ルートドメイン

ルートドメインは、ドメイン名の開始点です。通常は省略されますが、DNS 名として記述する際には「.」(ドット)で表され
ます。

LPI-Japan 35 https://linuc.org
3 DNS サーバーの構築 3.3 ドメインの構造

図 4 DNS の構造

トップレベルドメイン

トップレベルドメインには、.com や.org のような組織別ドメインや、.jp のような国別ドメインがあります。また、日本の場合


には.co.jp のような組織種別型ドメインと、example.jp のような汎用 JP ドメインなどがあります。

3.3.2 ドメイン名の記述

ドメイン名の記述は、右側から記述していきます。FQDN(Fully Qualiied Domain Name) であれば一番右にルートドメイン、


そしてトップレベルドメインを記述し、さらに左側に各組織毎に割り当てられたドメイン名を記述していきます。各要素の間は
「.」
(ドット)で区切っていきます。

ドメイン名の記述例

• example.com.
• example.jp.
• example.co.jp.

トップレベルドメイン以降のドメイン名は、ドメイン取得者が独自にドメイン名を決めることができます。上記の例では example
ルートドメイン
の部分が独自のドメイン名にあたります。なお、最後の「.」は、トップレベルドメインを示していますが、省略して表記するこ
とがあります。

LPI-Japan 36 https://linuc.org
3 DNS サーバーの構築 3.4 DNS を使った名前解決

3.3.3 サブドメイン

記述例のようにドメイン名の左側にさらにドメイン名を記述していくことを「サブドメイン化」と呼びます。たとえば、
example.co.jp ドメインをさらに東京と大阪の 2 つに分けて表記したいような場合には、以下の例のように記述します。

• tokyo.example.co.jp.
• osaka.example.co.jp.

サブドメイン化は、上位の(右側の)ドメインを管理している管理者が行います。たとえば、tokyo.example.co.jp ドメインまで
のサブドメインの階層は次のようになっています。

1. jp ドメインはルートドメインのサブドメイン
2. co.jp ドメインは jp ドメインのサブドメイン
3. example.co.jp ドメインは co.jp ドメインのサブドメイン
4. tokyo.example.co.jp ドメインは example.co.jp ドメインのサブドメイン

3.3.4 ドメイン名の取得

ドメイン名を取得するということは、上位のドメイン名の管理者にサブドメインを作ってもらい、管理権限を委譲してもらうと
いうことになります。短いドメイン名を取得したいのであればトップレベルドメインを管理している管理組織からサブドメイン
化してもらうことになりますが、既にドメイン名を取得している管理者からサブドメインの管理権限を委譲してもらうこともで
きます。

3.4 DNS を使った名前解決

DNS を使って名前を解決する、すなわち名前から IP アドレスを調べる時には、次のような手順で調査が行われます。

1. PC は、自分の組織やプロバイダーの DNS キャッシュサーバーへ問い合わせます。


2. DNS キャッシュサーバーは、ルートサーバーに「jp」を管理する DNS コンテンツサーバーのアドレスを問い合わせます。
「jp」を管理する DNS コンテンツサーバーのアドレスを DNS キャッシュサーバーへ返します。
ルートサーバーは、
3. DNS キャッシュサーバーは、「jp」を管理する DNS コンテンツサーバーへ、サブドメイン「alpha.jp」を管理する DNS
コンテンツサーバーのアドレスを問い合わせます。「alpha.jp」を管理する DNS コンテンツサーバーは、サブドメイン
「alpha」を管理する DNS コンテンツサーバーのアドレスを DNS キャッシュサーバーへ返します。
4. DNS キャッシュサーバーは、「alpha.jp」を管理する DNS コンテンツサーバーへ、「www.alpha.jp」のアドレスを問い合
わせます。 「alpha.jp」を管理する DNS コンテンツサーバーは、「www.alpha.jp」のアドレスを DNS キャッシュサーバー
へ返します。
5. DNS キャッシュサーバーは、PC に「www.alpha.jp」のアドレスを返します。

3.5 これから構築する DNS の概略

各自が jp. ドメインのサブドメインを管理する DNS サーバーを作る演習を進めてもらうので、ドメインを管理する次の 3 台以


上のマシンがある環境が望ましいです。

各マシンには、以下のような役割を割り当てます。

• 講師のマシン
DNS キャッシュサーバー
• 受講生 A のマシン
alpha.jp ドメインを受け持つ DNS コンテンツサーバー
• 受講生 B のマシン
beta.jp ドメインを受け持つ DNS コンテンツサーバー

教室の環境はインターネットに接続されている必要はありません。

LPI-Japan 37 https://linuc.org
3 DNS サーバーの構築 3.5 これから構築する DNS の概略

図 5 DNS の名前解決の仕組み

図6 演習の環境

以降の章 (特にメール) では DNS サーバーが正しく設定されていることを前提としているので、この章の演習内容が完全に終


わっている必要があります。

表 2: 演習で使うドメインと IP アドレス

講師 受講生 A 受講生 B

ドメイン名 alpha.jp. beta.jp.


IP アドレス 192.168.1.10 192.168.1.101 192.168.1.102

LPI-Japan 38 https://linuc.org
3 DNS サーバーの構築 3.6 講師マシンへの DNS キャッシュサーバーの設定

図 7 演習で使うアドレスとドメイン

3.5.1 アドレス解決の流れ

受講生 A のマシン (192.168.1.101) がホスト www.beta.jp を解決するときの動きを追ってみましょう。

Web ブラウザーで Web ページを表示させるとき、DNS キャッシュサーバーのことは特に意識せず Web サイトのアドレスを入


力しています。ここでは Web アドレスを入力してリクエストしてページが表示されるまでの流れを例に、DNS がどのように動
くのか簡単に説明します。

1. 受講生 A は、受講生 A のマシンの Web ブラウザーにアドレスとして www.beta.jp を入力します


2. Web ブラウザーは、Linux のリゾルバに問い合わせします
3. リ ゾ ル バ は、/etc/resolv.conf フ ァ イ ル で 指 定 さ れ て い る DNS キ ャ ッ シ ュ サ ー バ ー (こ の 場 合 は 講 師 用 サ ー
バー:192.168.1.10)へ問い合わせます
4. 講師のマシンは、講師の DNS キャッシュサーバーを参照します
5. 講師の DNS キャッシュサーバーは、受講生 B の DNS サーバーに問い合わせします
6. 受講生 B の DNS サーバーは、www.beta.jp ホストの IP アドレス(www.beta.jp → 192.168.1.102)を講師のマシンに返
します
7. 講師のマシンは、結果を受講生 A のマシンへ返します
8. 受講生 A のマシンは、www.beta.jp に HTTP でアクセスし、Web ページを受け取って表示します

3.6 講師マシンへの DNS キャッシュサーバーの設定

最初に講師マシンを DNS キャッシュサーバーとして用意します。

3.6.1 必要なパッケージを確認

DNS キャッシュサーバーの構築に必要なパッケージは、unbound です。また、DNS サーバーの動作確認には、bind-utils パッ


ケージが必要です。rpm コマンドに-q オプションとパッケージ名を指定し、パッケージがインストールされているか確認しま
す。パッケージがインストールされている場合には、次のように表示されます。

unbound パッケージの確認

# rpm -q unbound bind -utils


unbound -1.6.6 -1. el7. x86_64
bind -utils -9.9.4 -72. el7. x86_64

パッケージがインストールされていない場合には、次のように表示されます。

LPI-Japan 39 https://linuc.org
3 DNS サーバーの構築 3.6 講師マシンへの DNS キャッシュサーバーの設定

unbound パッケージがない場合

# rpm -q unbound bind -utils


パ ッ ケ ー ジ unbound は イ ン ス ト ー ル さ れ て い ま せ ん 。
パ ッ ケ ー ジ bind -utils は イ ン ス ト ー ル さ れ て い ま せ ん 。

3.6.2 unbound のインストール

unbound パッケージがインストールされていない時には、yum コマンドでインストールします。インターネットに接続できな


い環境では、GUI から admin でログインし、インストールメディアが自動マウントされた状態でインストール作業を進めます。

unbound のインストール

# yum install unbound bind -utils


読 み 込 ん だ プ ラ グ イ ン : fastestmirror , langpacks
Loading mirror speeds from cached hostfile
* base: ftp.jaist.ac.jp
* updates : ftp.jaist.ac.jp
* extras : ftp.jaist.ac.jp
依存性の解決をしています
--> ト ラ ン ザ ク シ ョ ン の 確 認 を 実 行 し て い ま す 。
---> パ ッ ケ ー ジ bind -utils. x86_64 32:9.9.4 -72. el7 を イ ン ス ト ー ル
---> パ ッ ケ ー ジ unbound . x86_64 0:1.6.6 -1. el7 を イ ン ス ト ー ル
--> 依 存 性 解 決 を 終 了 し ま し た 。

依存性を解決しました

================================================================================
Package アー キ テ ク チャー
バー ジョ ン リ ポ ジ ト リー 容量
================================================================================
イ ン ス トー ル 中:
bind -utils x86_64 32:9.9.4 -72. el7 base 206 k
unbound x86_64 1.6.6 -1. el7 base 673 k

ト ラ ン ザ ク ショ ン の 要 約
================================================================================
イ ン ス トー ル 2 パッ ケー ジ

総 ダ ウ ン ロ ー ド 容 量 : 879 k
イ ン ス ト ー ル 容 量 : 2.8 M
Is this ok [y/d/N]: y ← yを 入 力
Downloading packages :
(1/2): bind -utils -9.9.4 -72. el7. x86_64 .rpm | 206 kB 00:00
(2/2): unbound -1.6.6 -1. el7. x86_64 .rpm | 673 kB 00:00
--------------------------------------------------------------------------------
合計 1.5 MB/s | 879 kB 00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
イ ン ス トー ル 中 : 32: bind -utils -9.9.4 -72. el7. x86_64 1/2
イ ン ス トー ル 中 : unbound -1.6.6 -1. el7. x86_64 2/2
検証中 : unbound -1.6.6 -1. el7. x86_64 1/2

LPI-Japan 40 https://linuc.org
3 DNS サーバーの構築 3.6 講師マシンへの DNS キャッシュサーバーの設定

検証中 : 32: bind -utils -9.9.4 -72. el7. x86_64 2/2

イ ン ス トー ル:
bind -utils. x86_64 32:9.9.4 -72. el7 unbound . x86_64 0:1.6.6 -1. el7

完 了 し ま し た!

3.6.3 リクエストを受け付ける IP アドレスの設定

/etc/unbound/local.d/interface.conf ファイルを作成し、DNS キャッシュサーバーがリクエストを受け付ける IP アドレスの設


定をします。講師 PC の IP アドレスと、ループバックアドレスを許可します。

/etc/unbound/local.d/interface.conf

interface : 192.168.1.10
interface : 127.0.0.1

3.6.4 利用可能なクライアントの設定

DNS キャッシュサーバーは、不正に利用されないように必ず利用者を制限して使います。/etc/unbound/local.d/client.conf
ファイルを作成し、この DNS キャッシュサーバーを利用できるクライアントの設定を行います。ここでは、192.168.1.0/24 の
ネットワーク全体を許可します。

/etc/unbound/local.d/client.conf

access - control : 192.168.1.0/24 allow

3.6.5 受講者用ドメインの設定

演習の環境では、jp ドメインの管理サーバーに alpha.jp、beta.jp という受講者用のドメインを登録することができません。そ


のため、DNS キャッシュサーバーに特別にスタブゾーンの設定を行います(この設定は、正式にドメイン名を取得した場合には
。設定のために、次のような/etc/unbound/conf.d/stub.conf ファイルを作成します。
不要な設定です)

/etc/unbound/conf.d/stub.conf

stub -zone:
name: alpha.jp.
stub -addr: 192.168.1.101
stub -prime: no
stub -first: no
stub -zone:
name: beta.jp.
stub -addr: 192.168.1.102
stub -prime: no
stub -first: no

3.6.6 unbound-keygen の起動

設定が終わったら、unbound の制御に使う鍵の生成を行います。次のように、unbound-keygen を起動すると、鍵が自動的に生


成されます。

unbound-keygen の起動

# systemctl start unbound - keygen

LPI-Japan 41 https://linuc.org
3 DNS サーバーの構築 3.6 講師マシンへの DNS キャッシュサーバーの設定

3.6.7 unbound の設定確認

設定を行ったら、書式のチェックを行っておきましょう。

unbound の設定の確認

# unbound - checkconf
unbound - checkconf : no errors in /etc/ unbound / unbound .conf

「no errors」と表示されていれば、書式エラーがないということです。エラーがある場合には、次のようにエラーの内容が表示さ
れます。

unbound の設定にエラーがあるとき

# unbound - checkconf
[1550047518] unbound - checkconf [27152:0] fatal error: cannot parse interface specified
as '127.0.0.1. '

エラーの内容を確認して、修正します。

3.6.8 ファイアウォールの設定

次に、DNS キャッシュサーバーへの問い合わせができるようにファイアウォールのサービス許可設定を行います。

DNS アクセスの許可

# firewall -cmd --add - service =dns

さらに、設定を保存しておきます。

Firewall ルールの保存

# firewall -cmd --runtime -to - permanent

3.6.9 unbound の起動と確認

設定が終わったら、unbound を起動しましょう。systemctl で、unbound ユニットを起動します.

unbound の起動

# systemctl start unbound

起動ができたら、念のため確認します。

unbound の起動確認

# systemctl status unbound


● unbound . service - Unbound recursive Domain Name Server
Loaded : loaded (/ usr/lib/ systemd / system / unbound . service ; disabled ; vendor preset :
disabled )
Active : active ( running ) since 水 2019 -02 -13 17:46:55 JST; 4s ago
Process : 28377 ExecStartPre =/ usr/sbin/unbound - anchor -a /var/lib/ unbound /root.key -c
/etc/ unbound / icannbundle .pem (code=exited , status =0/ SUCCESS )
Process : 28373 ExecStartPre =/ usr/sbin/unbound - checkconf (code=exited ,
status =0/ SUCCESS )
Main PID: 28383 ( unbound )
Tasks: 4

LPI-Japan 42 https://linuc.org
3 DNS サーバーの構築 3.6 講師マシンへの DNS キャッシュサーバーの設定

CGroup : / system .slice/ unbound . service


└ ─ 28383 /usr/sbin/ unbound -d

2 月 13 17:46:55 host0 systemd [1]: Starting Unbound recursive Domain Nam .....
2 月 13 17:46:55 host0 unbound - checkconf [28373]: unbound - checkconf : no err ...
2 月 13 17:46:55 host0 systemd [1]: Started Unbound recursive Domain Name ...r.
2 月 13 17:46:55 host0 unbound [28383]: [28383:0] notice : init module 0: i...d
2 月 13 17:46:55 host0 unbound [28383]: [28383:0] notice : init module 1: v...r
2 月 13 17:46:55 host0 unbound [28383]: [28383:0] notice : init module 2: i...r
2 月 13 17:46:55 host0 unbound [28383]: [28383:0] info: start of service (....
Hint: Some lines were ellipsized , use -l to show in full.

Active の欄に「active (running)」と表示されていることを確認します。また、下の方にはログが表示されます。ここでも、


「info:
start of service」と表示されていて、unbound のサービスが起動していることが確認できます。

unbound の再起動

既に unbound を起動している状態で、設定変更などをした場合には、次のように unbound を再起動します。

unbound の再起動

# systemctl restart unbound

3.6.10 自動起動の設定

Linux 起動時に unbound が必ず起動されるように設定しておきましょう。自動起動になっているかは、次のように確認でき


ます。

unbound の自動起動の確認

# systemctl is - enabled unbound


disabled

「enabled」と表示されます。この例のように「disabled」と表示される場合には、自動起
自動起動の設定がされている場合には、
動設定が行われていません。次のようにして、自動起動設定を行います。

unbound の自動起動の設定

# systemctl enable unbound


Created symlink from /etc/ systemd / system /multi -user. target .wants/ unbound . service to
/usr/lib/ systemd / system / unbound . service .

3.6.11 名前解決の確認

講師 PC がインターネットと通信できる環境の場合には、この時点でインターネットの様々なサイトの名前解決ができるはずで
す。まずは、それを確認しておきましょう。

名前解決の確認

# host www.yahoo.co.jp 192.168.1.10


Using domain server :
Name: 192.168.1.10
Address : 192.168.1.10#53
Aliases :

www.yahoo.co.jp is an alias for edge12 .g.yimg.jp.


edge12 .g.yimg.jp has address 182.22.25.252 ← IP ア ド レ ス が 表 示 さ れ る

LPI-Japan 43 https://linuc.org
3 DNS サーバーの構築 3.7 受講者マシンへの DNS コンテンツサーバーの設定

3.7 受講者マシンへの DNS コンテンツサーバーの設定

受講者マシンは、DNS コンテンツサーバーとして設定します。DNS コンテンツサーバーのソフトウェアとして BIND をインス


トールして設定します。

3.7.1 chroot 機能を利用した BIND のセキュリティ

chroot 機能はプログラムに対して特定のディレクトリ以外にはアクセスできないようにするための機能です。

chroot 機能を使って BIND を実行すると、bind プロセスは/var/named/chroot ディレクトリを/(ルート)ディレクトリとして


動作します。たとえば、bind プロセスが/etc ディレクトリにアクセスしても、実際にアクセスされるのは/var/named/chroot/etc
ディレクトリになります。

図 8 chroot 利用時のディレクトリイメージ

DNS というサービスを提供している関係上、BIND はインターネット上の数多くのサーバーで実行されており、セキュリティの


攻撃を受けやすくなっています。万が一、BIND がセキュリティ攻撃を受けて乗っ取られてしまったとしても、chroot 機能のお
かげで bind プロセスがアクセスできるディレクトリを限定することができるので、システムのその他のファイルへのアクセス
を妨げ、被害を最小限に食い止めることができます。

CentOS7 では、シンボリックリンクやマウントなどの Linux の機能を使って、chroot 機能を使った場合でも、ほとんど管理方


法が変わらないように工夫されています。そのため、本書でも chroot 機能を有効にします。

3.7.2 BIND パッケージの確認

DNS サーバーの構築に必要なパッケージを確認します。DNS の機能を提供するプログラムとして BIND があり、bind パッケー


ジと bind-chroot パッケージが必要です。また、動作確認をするには bind-utils パッケージも必要です。rpm コマンドに-q オプ
3つ
ションとパッケージ名を指定し、2 つのパッケージがインストールされているか確認します。パッケージがインストールされて
いる場合は次のように表示されます。

bind パッケージの確認

# rpm -q bind bind - chroot bind -utils

LPI-Japan 44 https://linuc.org
3 DNS サーバーの構築 3.7 受講者マシンへの DNS コンテンツサーバーの設定

bind -9.9.4 -72. el7. x86_64


bind -chroot -9.9.4 -72. el7. x86_64
bind -utils -9.9.4 -72. el7. x86_64

パッケージがインストールされていない場合は次のように表示されます。

bind パッケージがない場合

# rpm -q bind bind - chroot


パ ッ ケ ー ジ bind は イ ン ス ト ー ル さ れ て い ま せ ん 。
パ ッ ケ ー ジ bind - chroot は イ ン ス ト ー ル さ れ て い ま せ ん 。
パ ッ ケ ー ジ bind -utils は イ ン ス ト ー ル さ れ て い ま せ ん 。

3.7.3 BIND のインストール

DNS サーバーの構築に必要なパッケージがインストールされていないときは、yum コマンドでインストールをします。イン


ターネットに接続できない環境では、GUI から admin でログインし、インストールメディアが自動マウントされた状態でイン
ストール作業を進めます。

bind のインストール

# yum install bind bind - chroot bind -utils


読 み 込 ん だ プ ラ グ イ ン : fastestmirror , langpacks
Loading mirror speeds from cached hostfile
* base: ftp.jaist.ac.jp
* updates : ftp.jaist.ac.jp
* extras : ftp.jaist.ac.jp
依存性の解決をしています
--> ト ラ ン ザ ク シ ョ ン の 確 認 を 実 行 し て い ま す 。
---> パ ッ ケ ー ジ bind. x86_64 32:9.9.4 -72. el7 を イ ン ス ト ー ル
---> パ ッ ケ ー ジ bind - chroot . x86_64 32:9.9.4 -72. el7 を イ ン ス ト ー ル
---> パ ッ ケ ー ジ bind -utils. x86_64 32:9.9.4 -72. el7 を イ ン ス ト ー ル
--> 依 存 性 解 決 を 終 了 し ま し た 。

依存性を解決しました

================================================================================
Package アー キ テ ク チャー
バー ジョ ン リ ポ ジ ト リー 容量
================================================================================
イ ン ス トー ル 中:
bind x86_64 32:9.9.4 -72. el7 base 1.8 M
bind - chroot x86_64 32:9.9.4 -72. el7 base 88 k
bind -utils x86_64 32:9.9.4 -72. el7 base 206 k

ト ラ ン ザ ク ショ ン の 要 約
================================================================================
イ ン ス トー ル 3 パッ ケー ジ

総 ダ ウ ン ロ ー ド 容 量 : 2.1 M
イ ン ス ト ー ル 容 量 : 5.0 M
Is this ok [y/d/N]: y ← yを 入 力
Downloading packages :
(1/3): bind -chroot -9.9.4 -72. el7. x86_64 .rpm | 88 kB 00:00
(2/3): bind -utils -9.9.4 -72. el7. x86_64 .rpm | 206 kB 00:00

LPI-Japan 45 https://linuc.org
3 DNS サーバーの構築 3.7 受講者マシンへの DNS コンテンツサーバーの設定

(3/3): bind -9.9.4 -72. el7. x86_64 .rpm | 1.8 MB 00:00


--------------------------------------------------------------------------------
合計 3.4 MB/s | 2.1 MB 00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
イ ン ス トー ル 中 : 32: bind -9.9.4 -72. el7. x86_64 1/3
イ ン ス トー ル 中 : 32: bind -chroot -9.9.4 -72. el7. x86_64 2/3
イ ン ス トー ル 中 : 32: bind -utils -9.9.4 -72. el7. x86_64 3/3
検証中 : 32: bind -9.9.4 -72. el7. x86_64 1/3
検証中 : 32: bind -chroot -9.9.4 -72. el7. x86_64 2/3
検証中 : 32: bind -utils -9.9.4 -72. el7. x86_64 3/3

イ ン ス トー ル:
bind. x86_64 32:9.9.4 -72. el7 bind - chroot . x86_64 32:9.9.4 -72. el7
bind -utils. x86_64 32:9.9.4 -72. el7

完 了 し ま し た!

3.7.4 ゾーンを設定する流れ

ゾーンを追加するために必要な作業は次となります。

• named.conf ファイルにゾーンを追加
• ゾーンファイルを記述

ゾーンを DNS サーバーである BIND で取り扱うために、BIND の基本的な設定ファイルである/etc/named.conf ファイルがあ


ります。/etc/named.conf に基本的な設定とゾーンの定義を追加したら、ゾーンの詳細を定義するゾーンファイルを/var/named
ディレクトリに作ります。

3.7.5 /etc/named.conf の基本設定

まず最初に、/etc/named.conf ファイルに DNS コンテンツサーバーとして動作する場合の、基本設定を行います。

/etc/named.conf の編集

# vi /etc/named.conf

受け付ける IP アドレスの設定(/etc/named.conf)

options {
listen -on port 53 { 127.0.0.1; 192.168.1.101; }; ← 修正
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 ";
recursing -file "/ var/named/data/named. recursing ";
secroots -file "/ var/named/data/named. secroots ";
allow -query { any; }; ← 修正

recursion no; ← 修正

dnssec - enable yes;

LPI-Japan 46 https://linuc.org
3 DNS サーバーの構築 3.7 受講者マシンへの DNS コンテンツサーバーの設定

dnssec - validation yes;

/* Path to ISC DLV key */


bindkeys -file "/ etc/named. iscdlv .key ";

managed -keys - directory "/ var/named/ dynamic ";

pid -file "/ run/named/named.pid ";


session - keyfile "/ run/named/ session .key ";
};

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 ";

zone "alpha.jp" IN { ← 正 引 き ゾー ン の 設 定 を 追 加
type master ;
file "alpha.jp.zone ";
allow - update { none; };
};

問い合わせを受け付けるアドレスの設定

デフォルトの named.conf ファイルは、127.0.0.1(ローカルループバックインターフェース) への問い合わせにしか返答しない設


「192.168.1.101;」を listen-on に追加します。
定なので、外部からの問い合わせを受けられるように、

問い合わせを許可するアドレスの設定

allow-query にはデフォルトでは「localhost;」と設定されていて、ローカルからしか DNS 問い合わせができないようになって


います。DNS コンテンツサーバーは、インターネット上のすべての人から参照できなければならないので、この設定を「any」
に変更します。

DNS コンテンツサーバーとしての設定

DNS コンテンツサーバーでは、recursion(再帰問合せ)を禁止にしておく必要があります。そのため、recursion に「no」を設


定します。

正引きゾーンの設定

alpha.jp の正引きゾーンの設定を追加します。指定している「alpha.jp.zone」という名前のファイルにゾーンの設定を行います。

LPI-Japan 47 https://linuc.org
3 DNS サーバーの構築 3.7 受講者マシンへの DNS コンテンツサーバーの設定

3.7.6 ゾーンファイルの作成

named.conf で定義したゾーンの内容を記述するゾーンファイルの作成を行います。

ゾーンファイルの準備

ゾーンファイルのお手本となる/var/named/named.empty ファイルをコピーします。

ゾーンファイルのコピー

# cd /var/named
# cp -p named.empty alpha.jp.zone
# ls -l alpha.jp.zone
-rw -r-----. 1 root named 152 12 月 15 2009 alpha.jp.zone

ゾーンファイルの修正

コピーした/var/named/alpha.jp.zone ファイルを修正します。

ゾーンファイルの修正

# vi /var/named/alpha.jp.zone

alpha.jp.zone

$TTL 3H
$ORIGIN alpha.jp.
@ IN SOA host1 root (
2019021401 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS host1.alpha.jp.
MX 10 mail.alpha.jp.

host1 A 192.168.1.101
www A 192.168.1.101
mail A 192.168.1.101
vhost1 A 192.168.1.101
vhost2 A 192.168.1.101

@から始まるゾーンファイルの最初のレコードは SOA レコードで、このゾーンの管理ポリシーについて設定します。シリアル


ナンバー (serial) は、西暦 (4 桁の年) と月日 (2 桁ずつ) の後に 01 から 99 までの数字 (2 桁) が付いた 10 桁の数字で指定します。
SOA レコードの先頭には@がありますが、これは$ORIGIN で指定したゾーン(ここでは alpha.jp.)に置き換えられます。

MX レコードは受講生ドメインのメールサーバーを定義します。

NS レコードや MX レコードの定義では、右側に FQDN を入れるので、最後に必ず「.」を付けてください。また、先頭が空白に


なっていますが、これは前の行と同じ対象(この場合には@)が省略されていることを示しています。

A レコードで名前と IP アドレスの対応を定義する箇所は、左側にホスト名、右側に IP アドレスが入ります。受講生マシンのホ


スト名である host1 や、以降の章で使うサーバーの名前である www や mail、vhost1、vhost2 と IP アドレスへの対応を記述し
ました。最後に「.」が付かない名前には、$ORIGIN で定義しているゾーン名 (ここでは alpha.jp.) が自動的に追加されます。

LPI-Japan 48 https://linuc.org
3 DNS サーバーの構築 3.7 受講者マシンへの DNS コンテンツサーバーの設定

ゾーンファイルの書式確認

ゾーンファイルを編集時、よくあるミスとしては、括弧の不足、セミコロンの不足などがあります。編集後、BIND を起動する
前に編集したゾーンファイルに間違いがないかよく確認しましょう。

zone ファイルの確認

# named - checkzone alpha.jp. /var/named/alpha.jp.zone


zone alpha.jp/IN: loaded serial 2019021401
OK

named-checkzone の引数は、$ORIGIN に指定したドメイン名と、ゾーンファイル名です。書式に問題がなければ、この例のよ


うに設定したシリアルナンバーが表示され、OK と表示されます。設定が間違っている場合には、次のように問題のある行番号
が表示されます。

zone ファイルの書式が不正な場合

# named - checkzone alpha.jp. /var/named/alpha.jp.zone


alpha.jp.zone :9: unknown RR type 'host1.alpha.jp.'
zone alpha.jp/IN: loading from master file alpha.jp.zone failed : unknown class/type
zone alpha.jp/IN: not loaded due to errors .

3.7.7 設定ファイルの書式確認と注意点

/etc/named.conf ファイルでも、括弧の不足やセミコロンの不足などは良くあるミスです。一通りの設定ができたら、/etc/-
named.conf の初期確認をしておきましょう。次のように、named-checkconf を実行します。

/etc/named.conf の確認

# named - checkconf

この例のように、何も表示されなければ書式に問題がないということです。問題がある場合には、次のように問題がありそうな
行番号が表示されます。

/etc/named.conf の書式が不正な場合

# named - checkconf
/etc/named.conf :68: missing ';' before end of file

listen-on port の{〜}にアドレスを追加するときに、IP アドレスの後にセミコロンを入れ忘れたり、allow-query { any; }; のよ


うに、{ }の中と外にセミコロンを入れ忘れたりといったミスが起こりがちです。エラー表示を見ながら、こうした問題を取り除
きましょう。

3.7.8 ファイアウォールの設定

次に、DNS コンテンツサーバーへの問い合わせができるようにファイアウォールのサービス許可設定を行います。

DNS アクセスの許可

# firewall -cmd --add - service =dns

さらに、設定を保存しておきます。

Firewall ルールの保存

# firewall -cmd --runtime -to - permanent

LPI-Japan 49 https://linuc.org
3 DNS サーバーの構築 3.7 受講者マシンへの DNS コンテンツサーバーの設定

3.7.9 BIND の起動と確認

各自のドメインを定義したら BIND を起動してみましょう。BIND の起動は、systemctl コマンドで named-chroot を使います。

BIND の起動

# systemctl start named - chroot

起動ができたら、念のため確認します。

BIND の起動確認

# systemctl status named - chroot


named - chroot . service - Berkeley Internet Name Domain (DNS)
Loaded : loaded (/ usr/lib/ systemd / system /named - chroot . service ; disabled ; vendor
preset : disabled )
Active : active ( running ) since 木 2019 -02 -14 16:00:12 JST; 5s ago
Process : 32681 ExecStart =/ usr/sbin/named -u named -c ${ NAMEDCONF } -t
/var/named/ chroot $OPTIONS (code=exited , status =0/ SUCCESS )
Process : 32678 ExecStartPre =/ bin/bash -c if [ ! " $DISABLE_ZONE_CHECKING " == "yes" ];
then /usr/sbin/named - checkconf -t /var/named/ chroot -z " $NAMEDCONF "; else echo
" Checking of zone files is disabled "; fi (code=exited , status =0/ SUCCESS )
Main PID: 32683 (named)
Tasks: 4
CGroup : / system .slice/named - chroot . service
└ ─ 32683 /usr/sbin/named -u named -c /etc/named.conf -t /var/named /...

2 月 14 16:00:12 centos7 named [32683]: managed -keys -zone: loaded serial 57


2 月 14 16:00:12 centos7 named [32683]: zone 0.in -addr.arpa/IN: loaded serial 0
2 月 14 16:00:12 centos7 named [32683]: zone alpha.jp/IN: loaded serial 2019...1
2 月 14 16:00:12 centos7 named [32683]: zone 1.0.0.127. in -addr.arpa/IN: load ...0
2 月 14 16:00:12 centos7 named [32683]: zone 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0...0
2 月 14 16:00:12 centos7 named [32683]: zone localhost /IN: loaded serial 0
2 月 14 16:00:12 centos7 named [32683]: zone localhost . localdomain /IN: loade ...0
2 月 14 16:00:12 centos7 named [32683]: all zones loaded
2 月 14 16:00:12 centos7 named [32683]: running
2 月 14 16:00:12 centos7 systemd [1]: Started Berkeley Internet Name Domain ...).
Hint: Some lines were ellipsized , use -l to show in full.

Active の欄に「active (running)」と表示されていることを確認します。また、下の方にはログが表示されます。ここでも、


「Started Berkeley Internet Name Domain…」と表示されていて、BIND のサービスが起動していることが確認できます。

BIND の再起動

既に BIND を起動している状態で、設定変更などをした場合には、次のように BIND を再起動します。

BIND の再起動

# systemctl restart named - chroot

3.7.10 自動起動の設定

Linux 起動時に BIND が必ず起動されるように設定しておきましょう。自動起動になっているかは、次のように確認できます。

LPI-Japan 50 https://linuc.org
3 DNS サーバーの構築 3.7 受講者マシンへの DNS コンテンツサーバーの設定

BIND の自動起動の確認

# systemctl is - enabled named - chroot


disabled

「enabled」と表示されます。この例のように「disabled」と表示される場合には、自動起
自動起動の設定がされている場合には、
動設定が行われていません。次のようにして、自動起動設定を行います。

BIND の自動起動の設定

# systemctl enable named - chroot


Created symlink from /etc/ systemd / system /multi -user. target .wants/named - chroot . service
to /usr/lib/ systemd / system /named - chroot . service .

3.7.11 名前解決の確認

BIND が起動したら、名前解決が正常に行われるかを確認します。名前解決の確認には、host コマンドと dig コマンドが使用で


きます。

host コマンドで名前を確認

host コマンドで名前から IP アドレスを確認します。host コマンドの最初の引数は調査するアドレス、2つめの引数は調査対象


サーバーのアドレスです。さきほど設定した DNS サーバーの IP アドレスを指定します。

host コマンドでの確認

# host host1.alpha.jp 192.168.1.101


Name: 192.168.1.101
Address : 192.168.1.101#53
Aliases :

host1.alpha.jp has address 192.168.1.101


# host www.alpha.jp 192.168.1.101
Using domain server :
Name: 192.168.1.101
Address : 192.168.1.101#53
Aliases :

www.alpha.jp has address 192.168.1.101


# host mail.alpha.jp 192.168.1.101
Using domain server :
Name: 192.168.1.101
Address : 192.168.1.101#53
Aliases :

mail.alpha.jp has address 192.168.1.101

-t オプションで ns を指定すると、ドメインに登録されている NS レコード (ネームサーバーの情報) が表示されます。

host コマンドでの NS レコードの動作確認

# host -t ns alpha.jp 192.168.1.100


Name: 192.168.1.101
Address : 192.168.1.101#53
Aliases :

alpha.jp name server host1.alpha.jp.

LPI-Japan 51 https://linuc.org
3 DNS サーバーの構築 3.8 リゾルバの変更

-t オプションで mx を指定するとドメインに登録されている MX レコード (メールサーバーの情報) が表示されます。

host コマンドでの MX レコードの動作確認

# host -t mx alpha.jp 192.168.1.101


Name: 192.168.1.101
Address : 192.168.1.101#53
Aliases :

alpha.jp mail is handled by 10 mail.alpha.jp.

dig コマンドでドメインを確認

dig コマンドでは、ゾーン全体の情報も確認できます。次のように、ドメイン名の後に axfr を指定するとゾーンに登録されてい


る全ての情報が表示されます。問い合わせをするサーバーは、[@をつけて指定します]。

dig コマンドでの確認

# dig alpha.jp axfr @192 .168.1.101

; <<>> DiG 9.9.4 - RedHat -9.9.4 -73. el7_6 <<>> alpha.jp axfr @192 .168.1.101
;; global options : +cmd
alpha.jp. 10800 IN SOA host1.alpha.jp. root.alpha.jp. 2019021401 86400 3600
604800 10800
alpha.jp. 10800 IN NS host1.alpha.jp.
alpha.jp. 10800 IN MX 10 mail.alpha.jp.
host1.alpha.jp. 10800 IN A 192.168.1.101
mail.alpha.jp. 10800 IN A 192.168.1.101
vhost1 .alpha.jp. 10800 IN A 192.168.1.101
vhost2 .alpha.jp. 10800 IN A 192.168.1.101
www.alpha.jp. 10800 IN A 192.168.1.101
alpha.jp. 10800 IN SOA host1.alpha.jp. root.alpha.jp. 2019021401 86400 3600
604800 10800
;; Query time: 6 msec
;; SERVER : 192.168.1.101#53(192.168.1.101)
;; WHEN: 木 2 月 14 16:28:03 JST 2019
;; XFR size: 9 records ( messages 1, bytes 242)

3.8 リゾルバの変更

講師マシンの DNS キャッシュサーバーの設定と、受講生マシンの DNS コンテンツサーバーの設定が完了したので、受講生マ


シンから講師マシンを経由すればすべての下位ドメインを問合せできます。講師マシンがインターネットと通信できる環境の場
合には、すべてのドメインを問合せすることができます。受講生マシンと講師マシンの DNS サーバーの設定を変更しておきま
しょう。

GNOME のデスクトップのアプリケーションメニューから「システムツール」→「設定」を選択します。表示された設定画面の
左側のメニューから「ネットワーク」を選択します。

「有線」の欄にある歯車のボタンをクリックすると、接続プロファイルの設定画面が表示されます。「IPv4」のタブをクリックす
ると、次のような画面になります。

DNS サーバーのアドレスを講師マシンの IP アドレス「192.168.1.10」に変更します。変更したら、


「適用」ボタンを押して元の画
面に戻ります。 「有線」の項目にあるスイッチを、一旦「オフ」に変えます。再度、 「オン」に変えると DNS 設定が変更されます。

LPI-Japan 52 https://linuc.org
3 DNS サーバーの構築 3.8 リゾルバの変更

図9 設定画面

図 10 ネットワーク詳細設定画面

LPI-Japan 53 https://linuc.org
3 DNS サーバーの構築 3.9 DNS コンテンツサーバーのセキュリティ

3.8.1 名前解決の確認

リゾルバの変更ができたら、DNS サーバーを指定しなくても DNS の問い合わせができるようになります。host コマンドで、自


分のドメインの NS レコードや MX レコードを問い合わせてみてください。host コマンドでは、-t オプションを使うことで、問
い合わせるレコードを指定することができます。

host コマンドでの動作確認

# host -t ns alpha.jp
alpha.jp name server host1.alpha.jp.
# host -t mx alpha.jp
alpha.jp mail is handled by 10 mail.alpha.jp.

また、他の受講者マシンの設定も問合せができることを確認してみましょう。

host コマンドでの動作確認

# host -t ns beta.jp
beta.jp name server host1.beta.jp.
# host -t mx beta.jp
beta.jp mail is handled by 10 mail.beta.jp.

3.9 DNS コンテンツサーバーのセキュリティ

動作確認のため、dig の axfr を使ってゾーンを転送する例を紹介しました。しかし、インターネット上の見知らぬサイトに、す


賢明
べてのゾーンデータを教えるのは懸命ではありません。BIND のデフォルトでは、すべてのホストへのゾーン転送が許可されま
す。zone ステートに allow-transfer オプションが記述された場合、options ステートメントの設定を上書きできます。下記のよ
うに設定することで、ゾーン転送を localhost とネットワークアドレス 192.168.1.0 以下にある端末からのみ許可できます。

/etc/named.conf への allow-transfer の設定

options {
( 略 )
allow - transfer { localhost ; 192.168.1.0/24; };
( 略 )
};

LPI-Japan 54 https://linuc.org
4 WEB サーバーの構築

4 Web サーバーの構築

ホームページや Web システムを公開するための Web サービスを設定します。基本としては、アクセス制限をかける設定と動作


を確認します。応用としては、サーバーとして広く使われているバーチャルホスト機能にも触れてもらいます。

4.1 用語集

HTML(HyperText Markup Language)

Web サーバー用のドキュメントを書くためのタグを使って文章を構造的に記述できるマークアップ言語です。他ドキュメントへ
のハイパーリンクを書いたり、画像利用したり、リストや表などの高度な表現も可能です。

HTTP(HyperText Transfer Protocol)

Web ブラウザーと Web サーバーの間で HTML などのコンテンツ (データ) 送受信に使われる通信手順です。ファイルのリクエ


スト (要求) とファイルのレスポンス (返送) が組でセッションになります。

Apache Web サーバー

世界中でもっとも使われている Web サーバーであり、大規模な商用サイトから自宅サーバーまで幅広く利用されています。


Apache ソフトウェア財団の Apache HTTP サーバープロジェクトで行われている、オープンソースソフトウェアです。

セッション

通信の接続を確立してから切断するまでを一つのセッションといいます。

ディレクティブ

Apache の設定ファイルで Apache の動作を設定する項目名です。

BASIC 認証

ユーザー名とパスワードを使い、HTTP で定義された認証方式です。ユーザー名とパスワードの組を:でつなぎ、Base64 でエン


コードして送信します。盗聴や改竄が簡単であるという欠点がありますが、ほぼ全ての Web サーバーおよび Web ブラウザーが
対応しており、広く使われています。

DIGEST 認証

ユーザー名とパスワードを使う認証方式です。ユーザー名とパスワードを MD5 でハッシュ化して送るため、盗聴や改竄を防げ


るため推奨される認証方式ですが、Web ブラウザーや端末によって対応していないものがあるために注意が必要です。

URL(Uniform Resource Locator)

インターネット上のリソースを指定するための記述方法で、ホームページのアドレスやメールのアドレスなどを指定できます。
リソースを特定するスキーム名とアドレスを://でつないで書きます。

LPI-Japan 55 https://linuc.org
4 WEB サーバーの構築 4.2 Web サーバーの仕組み

4.2 Web サーバーの仕組み

Web システムとは、インターネット環境で最も代表的なクライアントサーバーシステムで、クライアントの Web ブラウザーと


Web サーバーから構成されます。Web サーバーは要求されたファイルを Web クライアントに提供し、クライアントは受け取っ
たファイルを表示します。提供される情報はテキストから画像や動画と幅広く、クライアントが対応しているデータならば広く
扱えます。Web システムの文章データとしては XML ベースの規格である XHTML や従来の HTML などが一般的に使われて
います。Web サーバーとして Apache が使われている割合はかなり高いでしょう。

図 11 Web サーバーの動作の仕組み

Web サーバーと Web ブラウザーは HTTP 形式の通信手順でデータを転送します。転送されるデータはテキストや画像などの


ファイルで、HTML 形式 (フォーマット) のファイルが標準形式として使われています。HTML 形式のファイル内には、他の
ページやファイル、他の Web サーバーへのリンクが含まれていて、HTML 形式のデータはクモの巣 (web) 状にデータがつなが
るのも特徴です。

LPI-Japan 56 https://linuc.org
4 WEB サーバーの構築 4.3 これから構築する Web サーバーの概略

4.3 これから構築する Web サーバーの概略

各自が受講生マシンで Web サーバーを起ち上げ、Web ブラウザーから隣の受講生マシンの Web サーバーへのアクセスを試し


ます。名前の解決には 3 章で構築した講師の DNS サーバーと隣の受講生マシンの DNS サーバーを利用します。Web システム
はクライアントとサーバーが同一のマシンに混在しても、2 台以上で構成されても動作に違いはありませんが、テスト確認を曖
昧としないために 2 台ペアでの演習を行いましょう。まず、実習を始める前に、Web サーバーのデフォルト設定に問題がなく、
Web サーバーとして着実に動くかを確認します。必要なパッケージが導入されているか、設定ファイルが正しく設定されている
かなどを確認するため、Web サーバーを起動して Web ブラウザーでアクセスしたり、Apache のログファイルを確認するなど
して、Web サーバーが正常に起動していることを確認します。

図 12 実習の環境

表 3: 講師

項目 設定値

ホスト名 host0.jp
IP アドレス 192.168.1.10

表 4: 受講生 A

項目 設定値

役割 Web サーバー
ホスト名 host1.alpha.jp
IP アドレス 192.168.1.101

LPI-Japan 57 https://linuc.org
4 WEB サーバーの構築 4.4 Web サーバーの設定

表 5: 受講生 B

項目 設定値

役割 Web ブラウザー
ホスト名 host2.beta.jp
IP アドレス 192.168.1.102

4.4 Web サーバーの設定

Web サーバーの動作に必要なパッケージおよび設定ファイルを確認し、サービスを起動して動作を確認します。

4.4.1 必要なパッケージを確認

rpm コマンドで必要なパッケージがインストールされているかを確認します。

httpd パッケージの確認

# rpm -q httpd
httpd -2.4.6 -88. el7. centos . x86_64

パッケージがインストールされていない場合は次のように表示されます。

httpd パッケージがない場合

# rpm -q httpd
パ ッ ケ ー ジ httpd は イ ン ス ト ー ル さ れ て い ま せ ん 。

4.4.2 必要なパッケージをインストール

Web サーバーの構築に必要なパッケージがインストールされていないときは、yum コマンドでインストールをします。インター


ネットに接続できない環境では、GUI から admin でログインし、インストールメディアが自動マウントされた状態でインストー
ル作業を進めます。

httpd のインストール

# yum install httpd


読 み 込 ん だ プ ラ グ イ ン : fastestmirror , langpacks
Loading mirror speeds from cached hostfile
* base: ftp.jaist.ac.jp
* extras : ftp.jaist.ac.jp
* updates : ftp.jaist.ac.jp
base | 3.6 kB 00:00
extras | 3.4 kB 00:00
updates | 3.4 kB 00:00
依存性の解決をしています
--> ト ラ ン ザ ク シ ョ ン の 確 認 を 実 行 し て い ま す 。
---> パ ッ ケ ー ジ httpd. x86_64 0:2.4.6 -88. el7. centos を イ ン ス ト ー ル
--> 依 存 性 の 処 理 を し て い ま す : httpd -tools = 2.4.6 -88. el7. centos の パ ッ ケ ー ジ :
httpd -2.4.6 -88. el7. centos . x86_64
--> 依 存 性 の 処 理 を し て い ま す : /etc/mime.types の パ ッ ケ ー ジ :
httpd -2.4.6 -88. el7. centos . x86_64
--> ト ラ ン ザ ク シ ョ ン の 確 認 を 実 行 し て い ま す 。
---> パ ッ ケ ー ジ httpd - tools. x86_64 0:2.4.6 -88. el7. centos を イ ン ス ト ー ル
---> パ ッ ケ ー ジ mailcap . noarch 0:2.1.41 -2. el7 を イ ン ス ト ー ル

LPI-Japan 58 https://linuc.org
4 WEB サーバーの構築 4.4 Web サーバーの設定

--> 依 存 性 解 決 を 終 了 し ま し た 。

依存性を解決しました

================================================================================
Package アー キ テ ク チャー
バー ジョ ン リ ポ ジ ト リー
容量
================================================================================
イ ン ス トー ル 中:
httpd x86_64 2.4.6 -88. el7. centos base 2.7 M
依 存 性 関 連 で の イ ン ス トー ル を し ま す:
httpd -tools x86_64 2.4.6 -88. el7. centos base 90 k
mailcap noarch 2.1.41 -2. el7 base 31 k

ト ラ ン ザ ク ショ ン の 要 約
================================================================================
イ ン ス トー ル 1 パ ッ ケ ー ジ (+2 個 の 依 存 関 係 の パ ッ ケ ー ジ )

総 ダ ウ ン ロ ー ド 容 量 : 2.8 M
イ ン ス ト ー ル 容 量 : 9.6 M
Is this ok [y/d/N]: y ← 確 認 し てyを 入 力
Downloading packages :
(1/3): httpd -tools -2.4.6 -88. el7. centos . x86_64 .rpm | 90 kB 00:00
(2/3): httpd -2.4.6 -88. el7. centos . x86_64 .rpm | 2.7 MB 00:00
(3/3): mailcap -2.1.41 -2. el7. noarch .rpm | 31 kB 00:00
--------------------------------------------------------------------------------
合計 2.6 MB/s | 2.8 MB 00:01
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
イ ン ス トー ル 中 : mailcap -2.1.41 -2. el7. noarch 1/3
イ ン ス トー ル 中 : httpd -tools -2.4.6 -88. el7. centos . x86_64 2/3
イ ン ス トー ル 中 : httpd -2.4.6 -88. el7. centos . x86_64 3/3
検証中 : httpd -tools -2.4.6 -88. el7. centos . x86_64 1/3
検証中 : mailcap -2.1.41 -2. el7. noarch 2/3
検証中 : httpd -2.4.6 -88. el7. centos . x86_64 3/3

イ ン ス トー ル:
httpd. x86_64 0:2.4.6 -88. el7. centos

依 存 性 関 連 を イ ン ス トー ル し ま し た:
httpd -tools. x86_64 0:2.4.6 -88. el7. centos mailcap . noarch 0:2.1.41 -2. el7

完 了 し ま し た!

4.4.3 設定ファイルの修正

Apache の設定ファイルは/etc/httpd/conf/httpd.conf ファイルと/etc/httpd/conf.d ディレクトリにある拡張子が conf のファ


イルです。設定ファイルで、先頭が#の行はコメント、ディレクティブの後にはスペースやタブで区切った設定内容の文字列を
書きます。httpd.conf ファイルを見てみてください。

LPI-Japan 59 https://linuc.org
4 WEB サーバーの構築 4.4 Web サーバーの設定

httpd のインストール

# cat /etc/httpd/conf/httpd.conf
( 略 )
#
# ServerRoot : The top of the directory tree under which the server 's
# configuration , error , and log files are kept.
#
# Do not add a slash at the end of the directory path. If you point
# ServerRoot at a non -local disk , be sure to specify a local disk on the
# Mutex directive , if file -based mutexes are used. If you wish to share the
# same ServerRoot for multiple httpd daemons , you will need to change at
# least PidFile .
#
ServerRoot "/ etc/httpd"

#
# Listen : Allows you to bind Apache to specific IP addresses and/or
# ports , instead of the default . See also the <VirtualHost >
# directive .
#
# Change this to Listen on specific IP addresses as shown below to
# prevent Apache from glomming onto all bound IP addresses .
#
# Listen 12.34.56.78:80
Listen 80

#
# Dynamic Shared Object (DSO) Support
#
# To be able to use the functionality of a module which was built as a DSO you
# have to place corresponding `LoadModule ' lines at this location so the
# directives contained in it are actually available _before_ they are used.
# Statically compiled modules (those listed by `httpd -l') do not need
# to be loaded here.
#
# Example :
# LoadModule foo_module modules / mod_foo .so
#
Include conf. modules .d/*. conf
( 略 )

ディレクティブでデフォルトの設定と同じ内容の多くはコメントになっています。いくつかの基本的なディレクティブを次の表
にまとめました。このデフォルトで設定されているディレクティブは最小限必要な項目なので、これらのディレクティブの設定
値があれば (ディレクトリなどがあれば)、Apache は動作します。

表 6: 基本的なディレクティブ

ディレクティブ名 内容 設定例

Listen サービスを受けるポート番号 80
DocumentRoot 公開するディレクトリ /var/www/html
ServerName サーバーの名前 www.alpha.jp
DirectoryIndex /をアクセスした時にアクセスするファイル index.html

LPI-Japan 60 https://linuc.org
4 WEB サーバーの構築 4.4 Web サーバーの設定

ディレクティブ名 内容 設定例

AddDefaultCharset レスポンスに使われる文字コード of…なし、UTF-8

4.4.4 テストファイルの作成

Web サーバーの機能を一文に要約すると、クライアントが要求するドキュメントや画像などのデータを転送する働きをするのが
Web サーバーです。Web サーバーが動作するかチェックするためには/var/www/html ディレクトリに index.html ファイルを
作成します。

テストファイルの作成

# echo -n 'This is TEST Page on ' > /var/www/html/index.html


# hostname >> /var/www/html/index.html
# cat /var/www/html/index.html
This is TEST Page on host1.alpha.jp

4.4.5 ファイアウォールの設定

Apache の起動の前に、Web サーバーへの問い合わせができるようにファイアウォールのサービス許可設定を行います。

HTTP アクセスの許可

# firewall -cmd --add - service =http

さらに、設定を保存しておきます。

Firewall ルールの保存

# firewall -cmd --runtime -to - permanent

4.4.6 Apache を起動

設定とテスト用ファイルができたので Apache を起動してみましょう。systemctl コマンドで、httpd を起動します。

Apache の起動

# systemctl start httpd

Apache が起動しているかを、systemctl の status サブコマンドで確認します。Apache が起動している場合、下記のようにス


テータスが表示されます。

Apache の起動

# systemctl status httpd


● httpd. service - The Apache HTTP Server
Loaded : loaded (/ usr/lib/ systemd / system /httpd. service ; enabled ; vendor preset :
disabled )
Active : active ( running ) since 月 2019 -02 -18 15:39:15 JST; 4s ago
Docs: man:httpd (8)
man: apachectl (8)
Process : 27591 ExecStop =/ bin/kill -WINCH ${ MAINPID } (code=exited , status =0/ SUCCESS )
Process : 28290 ExecReload =/ usr/sbin/httpd $OPTIONS -k graceful (code=exited ,
status =0/ SUCCESS )
Main PID: 27616 (httpd)
Status : " Processing requests ..."

LPI-Japan 61 https://linuc.org
4 WEB サーバーの構築 4.4 Web サーバーの設定

Tasks: 6
CGroup : / system .slice/httpd. service
├ ─ 27616 /usr/sbin/httpd -DFOREGROUND
├ ─ 27617 /usr/sbin/httpd -DFOREGROUND
├ ─ 27618 /usr/sbin/httpd -DFOREGROUND
├ ─ 27619 /usr/sbin/httpd -DFOREGROUND
├ ─ 27620 /usr/sbin/httpd -DFOREGROUND
└ ─ 27621 /usr/sbin/httpd -DFOREGROUND

2 月 18 15:39:15 centos7 systemd [1]: Starting The Apache HTTP Server ...
2 月 18 15:39:15 centos7 systemd [1]: Started The Apache HTTP Server .

Active の欄に「active (running)」と表示されていることを確認します。また、下の方にはログが表示されます。ここでも、


「Started The Apache HTTP Server.」と表示されていて、Apache のサービスが起動していることが確認できます。

4.4.7 自動起動の設定

Linux 起動時に Apache が必ず起動されるように設定しておきましょう。自動起動になっているかは、次のように確認できます。


Apache の自動起動の確認

# systemctl is - enabled httpd


disabled

「enabled」と表示されます。この例のように「disabled」と表示される場合には、自動起
自動起動の設定がされている場合には、
動設定が行われていません。次のようにして、自動起動設定を行います。

Apache の自動起動の設定

# systemctl enable httpd


Created symlink from /etc/ systemd / system /multi -user. target .wants/httpd. service to
/usr/lib/ systemd / system /httpd. service .

4.4.8 Web ブラウザーで自分のアドレスを確認

Web システムはコマンドで確認する代わりに、Web ブラウザーを使いグラフィカルに結果を確認できます。Web ブラウザーで


ある Firefox から自分のアドレスを確認します。

http :// www.alpha.jp/

図 13 ブラウザーの表示

自分のサーバーのアクセスができたら、隣の受講生マシンの Apache へアクセスします。

http :// www.beta.jp/

LPI-Japan 62 https://linuc.org
4 WEB サーバーの構築 4.5 ページが見つからないとき

図 14 隣の受講生のブラウザー表示

4.5 ページが見つからないとき

テストファイルを作る前に Apache を起動し、Web ブラウザーである Firefox から用意されていないページをアクセスすると、ど


んな結果が出るでしょうか? 実際に無いページにアクセスしてみてください。ファイルが無い旨のエラー (Not Found) が出ます。
エラーページが表示されるのは Apache で対応するページが用意されているからです。エラーページは/usr/share/httpd/error
ディレクトリにあり、トップページが無い場合は特別に用意されたテストページが表示されます。

図 15 テストページ

エラーページのファイル群

# ls /usr/share/httpd/error/
HTTP_BAD_GATEWAY .html.var HTTP_REQUEST_ENTITY_TOO_LARGE .html.var
HTTP_BAD_REQUEST .html.var HTTP_REQUEST_TIME_OUT .html.var
HTTP_FORBIDDEN .html.var HTTP_REQUEST_URI_TOO_LARGE .html.var
HTTP_GONE .html.var HTTP_SERVICE_UNAVAILABLE .html.var
HTTP_INTERNAL_SERVER_ERROR .html.var HTTP_UNAUTHORIZED .html.var
HTTP_LENGTH_REQUIRED .html.var HTTP_UNSUPPORTED_MEDIA_TYPE .html.var
HTTP_METHOD_NOT_ALLOWED .html.var HTTP_VARIANT_ALSO_VARIES .html.var
HTTP_NOT_FOUND .html.var README
HTTP_NOT_IMPLEMENTED .html.var contact .html.var
HTTP_PRECONDITION_FAILED .html.var include

「アクセスしたページが見つからない」などの理由によって、それに対応するエラーページが表示されます。

LPI-Japan 63 https://linuc.org
4 WEB サーバーの構築 4.5 ページが見つからないとき

4.5.1 Apache のエラーコードについて

Apache はアクセス情報とエラー情報をログに記録しています。また、エラーメッセージに対応するエラーページを表示します。
ここでは Aapche がエラーを表示したときのエラーコードに対する意味を説明します。

表 7: Apache のエラーコード

番号 理由 意味

400 BAD_REQUEST 要求されたコードを理解できません


401 UNAUTHORIZED アクセスする権利があることを確証できませんでした
403 FORBIDDEN 要求するディレクトリにアクセスする為の許可がありません
404 NOT_FOUND 要求されたファイルが見つかりません
405 METHOD_NOT_ALLOWED 許可されていないメソッドを受け取りました
408 REQUEST_TIME_OUT 指定時間内にリクエストを終えなかったのでネットワーク接続を閉じました
410 GONE 要求された URL はサーバー利用できず、転送先アドレスも理解できません
411 LENGTH REQUIRED Content-Length メソッドが不正です
412 PRECONDITION_FAILED URL に対してリクエストの必要条件は、明確な評価に失敗しました
413 REQUEST_ENTITY_TOO_LARGE 要求されたデータ量が容量限度を超えました
414 REQUEST_URI_TOO_LARGE 要求された URL 長は、このサーバーの容量限度を超えた為、処理できません
415 UNSUPPORTED_MEDIA_TYPE サーバーは、メディアタイプがリクエストで送ったことをサポートしません
500 INTERNAL_SERVER_ERROR サーバーは内部エラーの為、要求を完了することができませんでした
501 NOT_IMPLEMENTED サーバーはリクエストを実行する為の必要な機能をサポートしていません
502 BAD_GATEWAY ゲートウェイやプロキシが、無効な応答を上位のサーバーから受け取りました
503 SERVICE_UNAVAILABLE サーバーが一時的な過負荷または保守時間のため、要求を受け付けられませんでした
506 VARIANT_ALSO_VARIES 要求するエンティティの値は、そのもの自体で交渉できるリソースです

LPI-Japan 64 https://linuc.org
4 WEB サーバーの構築 4.6 アクセス制御

4.5.2 ログファイルの確認

Apache が起動すると、アクセスされたファイルの履歴が/var/log/httpd/access_log ログファイルに記録され、エラーメッセー


ジが/var/log/httpd/error_log ログファイルに記録されます。ログファイルを確認してみてください。

ログの確認

# tail /var/log/httpd/ access_log


( 略 )
192.168.1.101 - - [18/ Feb /2019:15:51:28 +0900] "GET / images / poweredby .png HTTP /1.1" 200
3956 "http :// www.alpha.jp/" " Mozilla /5.0 (X11; Linux x86_64 ; rv :60.0)
Gecko /20100101 Firefox /60.0"
192.168.1.101 - - [18/ Feb /2019:15:52:44 +0900] "GET / HTTP /1.1" 200 34 "-" " Mozilla /5.0
(X11; Linux x86_64 ; rv :60.0) Gecko /20100101 Firefox /60.0"
192.168.1.101 - - [18/ Feb /2019:15:56:32 +0900] "GET / HTTP /1.1" 200 33 "-" " Mozilla /5.0
(X11; Linux x86_64 ; rv :60.0) Gecko /20100101 Firefox /60.0"

# tail /var/log/httpd/ error_log


( 略 )
[Mon Feb 18 15:51:27.787711 2019] [ autoindex :error] [pid 2493] [ client
192.168.1.101:46718] AH01276 : Cannot serve directory /var/www/html /: No matching
DirectoryIndex (index.html) found , and server - generated directory index forbidden
by Options directive
[Mon Feb 18 15:52:22.858248 2019] [ autoindex :error] [pid 2491] [ client
192.168.1.101:46726] AH01276 : Cannot serve directory /var/www/html /: No matching
DirectoryIndex (index.html) found , and server - generated directory index forbidden
by Options directive
[Mon Feb 18 15:59:30.202894 2019] [ autoindex :error] [pid 2494] [ client
192.168.1.101:46766] AH01276 : Cannot serve directory /var/www/html /: No matching
DirectoryIndex (index.html) found , and server - generated directory index forbidden
by Options directive

ログファイルの名前は httpd.conf 設定ファイルで設定されています。エラーログの出力ファイル名は ErrorLog ディレクティブ


で、アクセスログの出力ファイル名は CustomLog ディレクティブです。ログファイルに記録されるクライアント情報はデフォ
ルトが IP アドレスとなり、HostnameLookups ディレクティブを on にすると IP アドレスから調べたクライアントの名前を保
存することも可能です。DNS サーバーから名前を引くと時間がかかるので、デフォルトでは of となっています。

表 8: ログ関係のディレクティブ

ディレクティブ名 内容 設定例

ErrorLog エラーのログファイル /var/log/httpd/error_log


CustomLog アクセスのログファイルと形式 /var/log/httpd/access_log
HostnameLookups DNS への問い合わせ on…問い合わせ、of…問い合わせない

4.6 アクセス制御

通常、多くの人から自由に見てもらいたい情報を Web サービスで公開します。その一方で、特定の権限がある人だけに見せる


会員制のホームページを作りたいときがあると思います。特定の個人だけアクセスできるように限定する手段として Apache に
は BASIC 認証と DIGEST 認証という機能が備えられています。この節では DocumentRoot ディレクティブで指定されてい
る/var/www/html ディレクトリにある secret ディレクトリを特定の個人だけアクセスできるよう設定するために、セキュリ
ティ上で安心な DIGEST 認証を設定してみましょう。

LPI-Japan 65 https://linuc.org
4 WEB サーバーの構築 4.6 アクセス制御

4.6.1 テキストファイルを作成

認証をかけたディレクトリとファイルを作成します。

認証を掛けるディレクトリとページの作成

# mkdir /var/www/html/ secret


# echo -n 'This is Secret Page on ' > /var/www/html/ secret /index.html
# hostname >> /var/www/html/ secret /index.html

アクセス制御を設定する前であれば、制限をかけたいディレクトリやファイルであっても見えてしまいます。Web ブラウザーで
以下のアドレスにアクセスできることを確認します。

http :// www.alpha.jp/ secret /

図 16 認証を掛ける前のページ

4.6.2 アクセス制御を設定

Apache でアクセス制御を設定するには設定ファイルにアクセス制御の設定を追加し、コマンドでパスワードファイルを作りま
す。/etc/httpd/conf/httpd.conf 設定ファイルに/var/www/html/secret ディレクトリの設定を追記します。

/etc/httpd/conf/httpd.conf ファイルの最下行に追記

<Directory /var/www/html/secret >


AuthType Digest
AuthName " Secret Zone"

AuthUserFile /etc/httpd /. htdigest


Require user linuc
</Directory >

Directory ディレクティブ (<Directory >〜</Directory >) は/var/www/html/secret ディレクトリに認証をかける複数の


ディレクティブを囲みます。AuthType は認証の種類を Digest とし、AuthName は認証のダイアログに表示される認証名を
“Secret Zone” とし、AuthUserFile でパスワードファイルを指定し、Require user でユーザー名を linuc としました。

表 9: アクセス制御関係のディレクティブ

ディレクティブ名 内容 設定例

Directory ディレクトリ /var/www/html/secret


AuthType 認証タイプ Digest
AuthName 認証ドメイン Secret Zone
AuthUserFile パスワードファイル /etc/httpd/.htdigest
Require user ユーザー指定 linuc
LPI-Japan 66 https://linuc.org
4 WEB サーバーの構築 4.6 アクセス制御

Require user では、認証を許可するユーザーを指定します。認証にはユーザーとパスワードの情報が必要です。

次にパスワードファイルを作成します。パスワードファイルは重要なファイルなので、他のユーザーから見えないように設定し
ます。ファイル作成後、Apache を動かしている apache ユーザーからのみ読みこめるように、ファイルの所有者とモードを変更
します。

パスワードファイルを作成し、ユーザ linuc を登録

# htdigest -c /etc/httpd /. htdigest 'Secret Zone ' linuc


Adding password for linuc in realm Secret Zone.
New password : linuc ← 実 際 に は 表 示 さ れ な い
Re -type new password : linuc ← 実 際 に は 表 示 さ れ な い
# ls -l /etc/httpd /. htdigest
-rw -r--r--. 1 root root 51 2 月 18 16:26 /etc/httpd /. htdigest
# chown apache . apache /etc/httpd /. htdigest
# chmod 400 /etc/httpd /. htdigest
# ls -l /etc/httpd /. htdigest
-r--------. 1 apache apache 51 2 月 18 16:26 /etc/httpd /. htdigest

4.6.3 設定の再読み込み

設定を変更したので、Apache に設定を再読み込みさせます。

設定の再読み込み

# systemctl reload httpd

4.6.4 Web ブラウザーで自分のアドレスを確認

Web ブラウザーで自分のアドレス(http://www.alpha.jp/secret)を確認します。認証のダイアログが表示されるので、初めに
登録していない適当なユーザー名と適当なパスワードを入力すると何度も認証のダイアログが表示されること (認証エラー) を確
認します。次に登録した linuc ユーザーとパスワードを入力すると作成したファイルが表示されます。

正しいユーザー名、パスワードを入力した場合は、secret フォルダの中の index.html ファイルにアクセスできるようになりま


す。認証をかけたディレクトリにあるディレクトリの中もリカーシブ (再帰的) にユーザー名とパスワードの組み合わせを知って
いるユーザーのみがアクセスできます。

図 17 認証を掛けたページへのアクセス

4.6.5 ログファイルの確認

認証時のログファイルを確認します。

認証時のログの確認

# tail /var/log/httpd/ access_log


( 略 )
192.168.1.101 - - [18/ Feb /2019:16:55:01 +0900] "GET / secret / HTTP /1.1" 401 381 "-"
" Mozilla /5.0 (X11; Linux x86_64 ; rv :60.0) Gecko /20100101 Firefox /60.0"

LPI-Japan 67 https://linuc.org
4 WEB サーバーの構築 4.7 バーチャルホストを作成する

192.168.1.101 - linuc [18/ Feb /2019:16:55:08 +0900] "GET / secret / HTTP /1.1" 304 - "-"
" Mozilla /5.0 (X11; Linux x86_64 ; rv :60.0) Gecko /20100101 Firefox /60.0"

# tail /var/log/httpd/ error_log


(略)
[Mon Feb 18 16:58:56.588983 2019] [ auth_digest :error] [pid 12524] [ client
192.168.1.101:46884] AH01790 : user `lpic ' in realm `Secret Zone ' not found:
/ secret /

認証に失敗するとエラーログファイルにユーザーがみつからないというエラーメッセージが残ります。

4.7 バーチャルホストを作成する

バーチャルホスト機能を利用すると、1 台の Web サーバーで別々のホームページを見せることができます。バーチャルホスト機


能を利用するには、以下の設定が必要です。

• DNS で 1 つの IP アドレスに対して別々のホスト名を割り当てる
• Apache でバーチャルホストの設定を行う
• Linux にそれぞれのバーチャルホスト用のディレクトリを作成する

ここでは、vhost1.alpha.jp と vhost2.alpha.jp という 2 つのバーチャルホストを作成します。それぞれの名前で Web ブラウザー


からアクセスした時に、別々のホームページが見えるように設定を行います。

4.7.1 IP アドレスと名前の確認

2 つの名前を 1 つの IP アドレスに割り振っている設定を、host コマンドで確認します。

DNS を確認

# host vhost1 .alpha.jp


vhost1 .alpha.jp has address 192.168.1.101
# host vhost2 .alpha.jp
vhost2 .alpha.jp has address 192.168.1.101

4.7.2 バーチャルホストの設定

バーチャルホストの設定には、VirtualHost ディレクティブを使います。vhost1.alpha.jp と vhost2.alpha.jp という 2 つの URL


アドレスを定義します。

表 10: バーチャルホスト関係のディレクティブ

ディレクティブ 内容 具体例

VirtualHost 指定した IP アドレスとポートに対するバーチャルホストの設定をする *:80

/etc/httpd/conf.d/virtualhost.conf ファイルを作成し、次のように設定を行います。

/etc/httpd/conf.d/virtualhost.conf を作成

<VirtualHost *:80 >


ServerName www.alpha.jp
DocumentRoot /var/www/html
ServerAdmin webmaster@www .alpha .jp
ErrorLog /var/log/httpd/ error_log
CustomLog /var/log/httpd/ access_log common

LPI-Japan 68 https://linuc.org
4 WEB サーバーの構築 4.7 バーチャルホストを作成する

</ VirtualHost >

<VirtualHost *:80 >


ServerName vhost1 .alpha.jp
DocumentRoot /var/www/ vhost1 .alpha.jp
ServerAdmin webmaster@vhost1 .alpha.jp
ErrorLog /var/log/httpd/ vhost1 .alpha.jp - error_log
CustomLog /var/log/httpd/ vhost1 .alpha.jp - access_log common
</ VirtualHost >

<VirtualHost *:80 >


ServerName vhost2 .alpha.jp
DocumentRoot /var/www/ vhost2 .alpha.jp
ServerAdmin webmaster@vhost2 .alpha.jp
ErrorLog /var/log/httpd/ vhost2 .alpha.jp - error_log
CustomLog /var/log/httpd/ vhost2 .alpha.jp - access_log common
</ VirtualHost >

VirtualHost のブロック内では、ドメイン名、ドメインにアクセスしたときに表示するコンテンツの参照先、サーバーの管
理者のメールアドレス、ログの出力先を定義します。上記のように設定した場合は、www.alpha.jp にアクセスした場合は
/var/www/html 配下のコンテンツが表示され、ログが/var/log/httpd/access_log に保存されます。エラーがあった場合はエ
ラーログが/var/log/httpd/error_log に保存されます。

4.7.3 テストファイルを作成

同じマシンで 2 つの URL に対応するので、全く違った内容を表示するようにテストファイルを作成します。2 カ所の


DocumentRoot ディレクティブで指定した 2 つのディレクトリを作成し、各ディレクトリにサンプルファイルを用意します。

テスト用ページの作成

# mkdir /var/www/ vhost1 .alpha.jp


# mkdir /var/www/ vhost2 .alpha.jp
# echo -n 'This is Virtual Page 1 on ' > /var/www/ vhost1 .alpha.jp/index.html
# hostname >> /var/www/ vhost1 .alpha.jp/index.html
# echo -n 'This is Virtual Page 2 on ' > /var/www/ vhost2 .alpha.jp/index.html
# hostname >> /var/www/ vhost2 .alpha.jp/index.html

4.7.4 設定ファイルの再読み込み

バーチャルホストの定義を書き加えて設定ファイルを変更したので、Apache に設定ファイルを再読み込みさせます。

設定ファイルの再読み込み

# systemctl reload httpd

4.7.5 Web ブラウザーで自分のアドレスを確認

それでは、vhost1.alpha.jp や vhost2.alpha.jp にアクセスして別々のコンテンツが表示されるか早速確認してみましょう。

http :// vhost1 .alpha.jp/


http :// vhost2 .alpha.jp/

2 つの URL が表示されないときは、DNS の設定が正しいかどうかを host コマンド等で再確認します。

LPI-Japan 69 https://linuc.org
4 WEB サーバーの構築 4.7 バーチャルホストを作成する

図 18 vhost1.alpha.jp の表示

図 19 vhost2.alpha.jp の表示

4.7.6 ログファイルの確認

正しく起動したかをログファイルが作られているかで確認してみてください。

バーチャルホストログの確認

# ls -l /var/log/httpd
合 計 20
-rw -r--r--. 1 root root 8482 2 月 18 17:13 access_log
-rw -r--r--. 1 root root 7075 2 月 18 17:26 error_log
-rw -r--r--. 1 root root 144 2 月 18 17:28 vhost1 .alpha.jp - access_log
-rw -r--r--. 1 root root 0 2 月 18 17:26 vhost1 .alpha.jp - error_log
-rw -r--r--. 1 root root 210 2 月 18 17:33 vhost2 .alpha.jp - access_log
-rw -r--r--. 1 root root 0 2 月 18 17:26 vhost2 .alpha.jp - error_log

LPI-Japan 70 https://linuc.org
5 メールサーバーの構築

5 メールサーバーの構築

メールのやり取りが行えるよう、メールサーバーを設定します。まずは Postix を使って、メールサーバー同士でメールのやり


取りが行えるように設定します。さらに POP/IMAP サーバーとメールクライアントを使って、より実践的なメール環境を構築
します。

5.1 用語集

メールサーバー

電子メールのサービスを行います。クライアントよりメールを受け取り、バケツリレーの方式で相手先のメールサーバーまで送
ります。また、受信用のメールサーバーでは、送ってきたメールを蓄積しておいて、クライアントの要求に応じて応答します。

MTA(Mail Transfer Agent)

メールの転送を行うプログラムです。Sendmail や Postix などが代表例です。

SMTP(Simple Mail Transfer Protocol)

電子メールの送信、転送のときに利用されるプロトコルのことです。

SMTP 認証

SMTP でのメールを送信する際に認証を行う機構です。迷惑メール対策としてのメール中継の制限を、この認証機能で許可す
る、といった利用方法があります。

POP3(Post Oice Protocol version3)

クライアントが電子メールを取り寄せるときに利用されるプロトコルです。シンプルな設計で、IMAP4 と比べて機能が少ない
です。

IMAP4(Internet Message Access Protocol 4)

クライアントが電子メールを取り寄せるときに利用されるプロトコルです。メールのフォルダ機能サポート等、多機能です。

Postix

MTA として動作するサーバープログラムです。Linux や Unix のシステムで古くから使われてきた Sendmail よりもセキュリ


ティが高く、高速に動作すると言われています。

Dovecot

POP3 や IMAP4 のサーバー機能を提供するプログラムです。

Thunderbird

Mozilla Project が配布している、高機能なメールクライアントソフトウェアです。

5.2 メールサーバー実習の説明

メールサーバーの設定と動作確認を行います。メールは、インターネットにおいて、Web に並んで重要なサービスです。メール
サーバーを設定し、実際にメールをやり取りすることで、動作原理を確認してみましょう。

LPI-Japan 71 https://linuc.org
5 メールサーバーの構築 5.2 メールサーバー実習の説明

5.2.1 メールとメールサーバー

メールは、メールサーバーを介してやり取りが行われます。

メールサーバーがメールを受け取ると、宛先のメールアドレスを担当しているメールサーバーまでバケツリレー方式で送られま
す。これは、Thunderbird/Outlook のようなメールクライアントソフトからのメールでも、Gmail/Hotmail/Yahoo メールのよ
うな Web メールからのメールでも、動作原理は同じです。

MTA(Mail Transfer Agent)

メールがバケツリレー方式で運ばれることは、前述の通りです。このバケツリレーをするプログラムのことを MTA といいます。


sendmail
本教科書では Postix という MTA を利用します。他に有名な MTA として Postix などがあります。

SMTP(Simple Mail Transfer Protocol)

メールサーバー間は、SMTP というプロトコルでやり取りされています。SMTP はかなり昔に設計、定義されたプロトコルのた


め、認証やアクセス制限などが無く、勝手にメールサーバーを利用されて迷惑メールを送られてしまうなどの問題がありました。
そこでこのような問題を解決するために、ESMTP(拡張 SMTP)が定義されました。SMTP と呼ぶ場合、この ESMTP で定義
された機能も含んでいることがあります。

SMTP 認証 (SMTP Authentication)

正規の SMTP 接続では、メールの中継を行います。ところが前述の通り、SMTP には認証機能が無いため、多くの場合、特定


の場所以外からの中継を拒否します。SMTP 認証は、SMTP 上に認証 (Authentication) 機能を加え、その中継要求が正規のも
のか不正なものかを判断します。SMTP 認証は ESMTP の機能のうちの 1 つです。

POP3(Post Oice Protocol version 3)

電子メールは、送受信でプロトコルが異なります。POP3 は電子メールを受信するときに利用するプロトコルです。非常にシン
プルなプロトコルで、ユーザー名、パスワードを利用して接続し、メールの内容を受信します。

IMAP4

IMAP4 も POP3 同様、メールを受信するときに利用するプロトコルです。IMAP4 は POP3 に比べて機能が豊富で、大きな特


徴としてフォルダ機能をサポートしていることが挙げられます。そのため、メール管理が非常に楽になります。

5.2.2 メールのやり取り

インターネット上で、沢山の人が電子メールを利用しています。電子メールは以下の手順でやり取りされます。

1. 送信側のメールクライアントからメールを送信します
2. メールは送信用メールサーバーを経由して相手のメールサーバーに配信されます
3. 相手の受信側のメールサーバーにメールが届きます
4. 受信側のメールクライアントで受信側のメールサーバーに接続します
5. メールが受信され、メールを見ることができます

前述の構成で実習を行う場合、サーバー、クライアントをそれぞれ 2 台ずつ、計 4 台必要になります。本実習では二人一組のペ


アを組んで 2 台で実習を行うため、以下のような構成を取ります。

• 1 台のマシンで、メールサーバーとメールクライアントの 1 台 2 役とします
• 自分のメールサーバーに、自分のメールアカウントを作成します
• 相手のメールサーバーに、相手のメールアカウントが作成されます
• 自分のメールクライアントは、自分のメールサーバーを送受信用サーバーとして設定します

ポイントは、自分のマシンは 1 台ですが、メールサーバーとメールクライアントの 1 台 2 役であることです。

LPI-Japan 72 https://linuc.org
5 メールサーバーの構築 5.3 実習の進め方

5.3 実習の進め方

本章では、次の手順で実習を行います。実習でのメールの送受信は、大きく分けて 2 回あります。

mail コマンドを利用する

端末で mail コマンドを使って相手にメール送信します。以下の手順に従ってください。

1. 二人一組になります。それぞれ host1.alpha.jp を利用する A さん (usera@alpha.jp) と、host2.beta.jp を利用する B さん


(userb@beta.jp) とします。
2. Postix の設定ファイルを作成し、Postix を再起動します。
3. 送受信テスト用の自分のアカウント(usera@alpha.jp、userb@beta.jp)を、それぞれのホストに作成します。
4. A さんが host1.alpha.jp から mail コマンドを使って、B さんにメールを送ります。
5. B さんは mail コマンドを使って、到着を確認します。
6. 逆に B さんから A さんにメールを送り、確認します。

図 20 実習の流れ

LPI-Japan 73 https://linuc.org
5 メールサーバーの構築 5.3 実習の進め方

メールクライアントソフトを利用する

メールクライアントを使って相手にメール送信します。本実習では Thunderbird を使います。以下の手順に従ってください。

1. POP/IMAP サーバーとして Dovecot の設定を行い、POP/IMAP サーバーを起動します。


2. メールクライアントとして Thunderbird を設定します。
3. A さんが host1.alpha.jp からメールクライアントを使って、B さんにメールを送ります。
4. B さんはメールクライアントを使って、到着を確認します。
5. 逆に B さんから A さんにメールを送り、確認します。

図 21 メールクライアントを使った実習の流れ

5.3.1 実習後の注意点

設定したメールサーバーは、あくまで実習用にメールのやり取りをするために設定されています。ですが、セキュリティ等決し
て頑丈に設定してある訳ではないので、以下の点に留意します。

• 決してグローバル環境には接続しない。
• 実習後はメールサーバーを止める、もしくは本体自体を止める。LAN の中に不正中継を探すマシンがあった場合、それに
利用される可能性があるからです。

5.3.2 実習で使用するソフトウェアについて

Postix

今回の実習では、MTA として Postix を利用します。

mail コマンド

mail コマンドは、標準でインストールされている、メールを操作するコマンドです。mail コマンドには、メールを送る以外に、


届いたメールを読む機能もあります。

本実習では、メールで送るときと届いたメールを読むときに利用します。

Dovecot

LPI-Japan 74 https://linuc.org
5 メールサーバーの構築 5.3 実習の進め方

Dovecot は、POP3 や IMAP4 を機能させるサーバーのソフトウェアです。実習では、メールのクライアントソフトから IMAP4


でメールを受信します。そのときに IMAP4 のサーバーとして動作させます。標準ではインストールされていないので、実習時
にパッケージを追加し、設定ファイルを書き換えます。

Thunderbird

Mozilla Project により開発されている、フリーのメールクライアントソフトがこの Thunderbird です。Windows, Mac OS X,


Linux 等と、動作環境は多岐に渡っており、各国語版も用意されております。機能も必要十分な内容がそろっています。本実習
では、メールのクライアントソフトとして Thunderbird を使って実習を行います。実際に Thunderbird をインストールしメー
ルの送受信を行うことで、メール設定が正しいか確認を行います。

saslauthd

saslauthd は、SMTP 認証の認証機構です。Postix は設定ファイルで SMTP 認証の機能を有効にできますが、Postix 自体は認


証の機能を持っていません。設定ファイルで SMTP 認証の機能を有効にすると、Postix は saslauthd に認証を依頼してその結
果を受け取ります。

LPI-Japan 75 https://linuc.org
5 メールサーバーの構築 5.4 Postix のインストール

5.3.3 実習環境

実習では、受講生二人一組で実習を行います。本章では、それを便宜的に「A さん」
「B さん」と呼びます。特に明示がない場合
は、両者とも作業を行います。どちらか片方の方が作業をするときは、「次は A さんの作業です」といったように、作業する方
を明示します。

設定は、alpha.jp のマシン上で行うものとします。ホスト名は、各自読み替えてください。

図 22 実習環境

5.4 Postix のインストール

Postix は、CentOS7 では標準でインストールされています。念のため、rpm コマンドでパッケージがインストールされている


かを確認します。

postix パッケージの確認

# rpm -q postfix
postfix -2.10.1 -7. el7. x86_64

パッケージがインストールされていない場合は次の様に表示されます。

postix パッケージの確認

# rpm -q postfix
パ ッ ケ ー ジ postfix は イ ン ス ト ー ル さ れ て い ま せ ん 。

5.4.1 必要なパッケージをインストール

postix パッケージがインストールされていないときは、yum コマンドでインストールをします。インターネットに接続できな


い環境では、GUI から admin でログインし、インストールメディアが自動マウントされた状態でインストール作業を進めます。

postix のインストール

# yum install postfix


読 み 込 ん だ プ ラ グ イ ン : fastestmirror , langpacks
Loading mirror speeds from cached hostfile
* base: ftp -srv2. kddilabs .jp
* extras : ftp -srv2. kddilabs .jp

LPI-Japan 76 https://linuc.org
5 メールサーバーの構築 5.4 Postix のインストール

* updates : ftp -srv2. kddilabs .jp


依存性の解決をしています
--> ト ラ ン ザ ク シ ョ ン の 確 認 を 実 行 し て い ま す 。
---> パ ッ ケ ー ジ postfix . x86_64 2:2.10.1 -7. el7 を イ ン ス ト ー ル
--> 依 存 性 解 決 を 終 了 し ま し た 。

依存性を解決しました

================================================================================
Package アー キ テ ク チャー
バー ジョ ン リ ポ ジ ト リー 容量
================================================================================
イ ン ス トー ル 中:
postfix x86_64 2:2.10.1 -7. el7 base 2.4 M

ト ラ ン ザ ク ショ ン の 要 約
================================================================================
イ ン ス トー ル 1 パッ ケー ジ

総 ダ ウ ン ロ ー ド 容 量 : 2.4 M
イ ン ス ト ー ル 容 量 : 12 M
Is this ok [y/d/N]: y ← 確 認 し てyを 入 力
Downloading packages :
postfix -2.10.1 -7. el7. x86_64 .rpm | 2.4 MB 00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
イ ン ス トー ル 中 : 2: postfix -2.10.1 -7. el7. x86_64 1/1
検証中 : 2: postfix -2.10.1 -7. el7. x86_64 1/1

イ ン ス トー ル:
postfix . x86_64 2:2.10.1 -7. el7

完 了 し ま し た!

5.4.2 main.cf の設定

Postix の設定ファイルは、/etc/postix/main.cf です。このファイルを確認してみると、次のような書式で設定されています。

/etc/postix/main.cf の確認

# cat /etc/ postfix /main.cf


(略)
# LOCAL PATHNAME INFORMATION
#
# The queue_directory specifies the location of the Postfix queue.
# This is also the root directory of Postfix daemons that run chrooted .
# See the files in examples /chroot -setup for setting up Postfix chroot
# environments on different UNIX systems .
#
queue_directory = /var/spool/ postfix

# The command_directory parameter specifies the location of all

LPI-Japan 77 https://linuc.org
5 メールサーバーの構築 5.4 Postix のインストール

# postXXX commands .
#
command_directory = /usr/sbin
( 略 )
# INTERNET HOST AND DOMAIN NAMES
#
# The myhostname parameter specifies the internet hostname of this
# mail system . The default is to use the fully - qualified domain name
# from gethostname (). $myhostname is used as a default value for many
# other configuration parameters .
#
# myhostname = host. domain .tld
# myhostname = virtual . domain .tld

queue_directory や command_directory は、設定パラメータです。Postix では、設定パラメータに値を指定することで、設定


を行います。先頭が#で始まる行はコメント行です。myhostname のように、設定例がコメントで記載されていますので、それを
参考に設定を行います。また、設定パラメーターは、$myhostname のようにして、変数のように参照して使うこともできます。

/etc/postix/main.cf の編集

# vi /etc/ postfix /main.cf

次のパラメータを探して設定します。

表 11: 設定が必要な項目

パラメータ 内容 設定例

myhostname メールサーバーのホスト名 mail.alpha.jp


mydomain メールサーバーのドメイン名 alpha.jp
inet_interfaces メールを受け付ける IP アドレス localhost, 192.168.1.101
mydestination 受信するメールドメイン alpha.jp
mynetworks クライアントの IP またはネットワーク 192.168.1.101
smtpd_sasl_auth_enable SMTP 認証用の sasl を有効にします yes
smtpd_recipient_restrictions SMTP 認証を有効にします permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destinaition

自ホスト名とドメインの設定

myhostname と mydomain に、自ホスト名とドメインを設定します。

自ホスト名とドメインの設定(/etc/postix/main.cf)

# INTERNET HOST AND DOMAIN NAMES


#
# The myhostname parameter specifies the internet hostname of this
# mail system . The default is to use the fully - qualified domain name
# from gethostname (). $myhostname is used as a default value for many
# other configuration parameters .
#
# myhostname = host. domain .tld
# myhostname = virtual . domain .tld
myhostname = mail.alpha.jp ← 設定を追加

LPI-Japan 78 https://linuc.org
5 メールサーバーの構築 5.4 Postix のインストール

# The mydomain parameter specifies the local internet domain name.


# The default is to use $myhostname minus the first component .
# $mydomain is used as a default value for many other configuration
# parameters .
#
# mydomain = domain .tld
mydomain = alpha .jp ← 設定を追加

メールを受け付ける IP アドレスの設定

inet_interfaces に、メールを受け付ける IP アドレスを設定します。

メールを受け付ける IP アドレスの設定(/etc/postix/main.cf)

# The inet_interfaces parameter specifies the network interface


# addresses that this mail system receives mail on. By default ,
# the software claims all active interfaces on the machine . The
# parameter also controls delivery of mail to user@[ip. address ].
#
# See also the proxy_interfaces parameter , for network addresses that
# are forwarded to us via a proxy or network address translator .
#
# Note: you need to stop/start Postfix when this parameter changes .
#
# inet_interfaces = all
# inet_interfaces = $myhostname
# inet_interfaces = $myhostname , localhost
inet_interfaces = localhost , 192.168.1.101 ← 設定を追加

受信するメールドメインの設定

mydestination には、このメールサーバが受信するドメインを設定します。

受信するメールドメインの設定(/etc/postix/main.cf)

# The local machine is always the final destination for mail addressed
# to user@[the.net.work. address ] of an interface that the mail system
# receives mail on (see the inet_interfaces parameter ).
#
# Specify a list of host or domain names , /file/name or type:table
# patterns , separated by commas and/or whitespace . A /file/name
# pattern is replaced by its contents ; a type:table is matched when
# a name matches a lookup key (the right -hand side is ignored ).
# Continue long lines by starting the next line with whitespace .
#
# See also below , section " REJECTING MAIL FOR UNKNOWN LOCAL USERS ".
#
# mydestination = $myhostname , localhost .$mydomain , localhost
# mydestination = $myhostname , localhost .$mydomain , localhost , $mydomain
mydestination = alpha.jp ← 設定を追加

クライアントの設定

mynetworks には、このメールサーバを使ってメールを送信するクライアントのアドレスを設定します。192.168.1.0/24 のよう


にネットワークで指定することもできます。ですが、この実習では自分の IP アドレスだけで充分です。

LPI-Japan 79 https://linuc.org
5 メールサーバーの構築 5.4 Postix のインストール

クライアントの設定(/etc/postix/main.cf)

# Alternatively , you can specify the mynetworks list by hand , in


# which case Postfix ignores the mynetworks_style setting .
#
# Specify an explicit list of network / netmask patterns , where the
# mask specifies the number of bits in the network part of a host
# address .
#
# You can also specify the absolute pathname of a pattern file instead
# of listing the patterns here. Specify type:table for table -based lookups
# (the value on the table right -hand side is not used ).
#
# mynetworks = 168.100.189.0/28 , 127.0.0.0/8
# mynetworks = $config_directory / mynetworks
# mynetworks = hash :/ etc/ postfix / network_table
mynetworks = 192.168.1.101 ← 設定を追加

SMTP 認証の設定

SMTP 認証の設定として、smtpd_sasl_auth_enable と、smtpd_recipient_restrictions を設定します。コメントが用意されて


いませんので、ファイルの最後に追加しておきます。

SMTP 認証の設定(/etc/postix/main.cf)

smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions = permit_mynetworks , permit_sasl_authenticated ,
reject_unauth_destination

5.4.3 書式のチェック

/etc/postix/main.cf の修正ができたら、書式チェックを行っておきます。

main.cf の書式チェック

# postfix check

書式が正しい場合には、何も表示されません。エラーが表示された場合には、エラー内容をよく見て修正します。

5.4.4 ファイアウォールの設定

Postix の再起動の前に、メールサーバーでメールの受信ができるようにファイアウォールのサービス許可設定を行います。

SMTP アクセスの許可

# firewall -cmd --add - service =smtp

さらに、設定を保存しておきます。

Firewall ルールの保存

# firewall -cmd --runtime -to - permanent

LPI-Japan 80 https://linuc.org
5 メールサーバーの構築 5.5 アカウントの作成

5.4.5 Postix の再起動

postix サービスを再起動します。

postix サービスの再起動

# systemctl restart postfix

postix サービスの自動起動を確認します。

自動起動設定の確認

# systemctl is - enabled postfix


enabled

5.4.6 saslauthd サービスの起動

SMTP 認証用の saslauthd サービスを起動します。

saslauthd の起動

# systemctl start saslauthd

sasluauthd の自動起動設定も行っておきます。

saslauthd の自動起動設定

# systemctl enable saslauthd


Created symlink from /etc/ systemd / system /multi -user. target .wants/ saslauthd . service to
/usr/lib/ systemd / system / saslauthd . service .

5.5 アカウントの作成

それでは、実際にメールを送信する前に、宛先となるアカウントを作成します。

5.5.1 host1.alpha.jp に usera を作成

host1.alpha.jp で usera というアカウントを作成します。このアカウントは usera@alpha.jp というメールアドレスになります。

usera の作成

[ root@host1 postfix ]# useradd usera


[ root@host1 postfix ]# passwd usera
ユ ー ザ ー usera の パ ス ワ ー ド を 変 更 。
新 し い パ ス ワ ー ド : userapass ← 入 力 文 字 は 非 表 示
新 し い パ ス ワ ー ド を 再 入 力 し て く だ さ い : userapass ← 入力文字は非表示
passwd : す べ て の 認 証 ト ー ク ン が 正 し く 更 新 で き ま し た 。

5.5.2 host2.beta.jp に userb を作成

host2.beta.jp で userb というアカウントを作成します。このアカウントは userb@beta.jp というメールアドレスになります。

userb の作成

[ root@host2 postfix ]# useradd userb


[ root@host2 postfix ]# passwd userb

LPI-Japan 81 https://linuc.org
5 メールサーバーの構築 5.6 メールの送受信

ユ ー ザ ー userb の パ ス ワ ー ド を 変 更 。
新 し い パ ス ワ ー ド : userbpass ← 入 力 文 字 は 非 表 示
新 し い パ ス ワ ー ド を 再 入 力 し て く だ さ い : userbpass ← 入力文字は非表示
passwd : す べ て の 認 証 ト ー ク ン が 正 し く 更 新 で き ま し た 。

5.6 メールの送受信

次にメールを送信します。メールの送受信は作成した一般ユーザーで行います。一般ユーザーで操作できるよう別の端末を起動
し、su コマンドを使ってユーザーを切り替えます。メールの送信は mail コマンドを使用します。

5.6.1 ログの確認用端末の設定

1.「端末」を起動します
2. tail コマンドを実行して、/var/log/maillog を表示します。-f オプションを付けて実行すると、ログが書き込まれる毎に
再読み込みされて最新のログを閲覧できます。

メールログの確認

# tail -f /var/log/ maillog

5.6.2 メール送受信用端末の起動とユーザー切り替え

メール送受信用の端末を起動し、su コマンドでユーザーの切り替えを行います。

1.「端末」を起動します
2. su コマンドでユーザーを切り替えます

host1.alpha.jp で usera に切り替え

usera に切り替え

[ root@host1 ~]# su - usera


[ usera@host1 ~]$ id
uid =1003( usera) gid =1003( usera) groups =1003( usera ) ,12( mail)
context = unconfined_u : unconfined_r : unconfined_t :s0 -s0:c0.c1023

host2.beta.jp で userb に切り替え

userb に切り替え

# su - userb
[ userb@host2 ~]$ id
uid =1001( userb) gid =1001( userb) groups =1001( userb ) ,12( mail)
context = unconfined_u : unconfined_r : unconfined_t :s0 -s0:c0.c1023

5.6.3 usera@alpha.jp から userb@beta.jp へメール送信

mail コマンドを使って、host1.alpha.jp の usera から userb@beta.jp へメールを送信します。

メール送信

[ usera@host1 ~]$ mail userb@beta .jp ← mail コ マ ン ド の 引 数 に 宛 先 の ア ド レ ス を 指 定


Subject : Test mail from usera ← Subject を 入 力
This is Test Mail from usera ← メッ セー ジ 本 文 を 入 力
. ← メッ セー ジ 本 文 の 入 力 が 終 わっ た ら ピ リ オ ド を 入 力

LPI-Japan 82 https://linuc.org
5 メールサーバーの構築 5.7 メールクライアントソフトでのメールの送受信

EOT

5.6.4 userb のメール着信確認

mail コマンドを使って、host2.beta.jp の userb にメールが届いているかを確認します。

メールの確認

[ userb@host2 ~]$ mail


Heirloom Mail version 12.5 7/5/10. Type ? for help.
"/ var/spool/mail/userb ": 1 message 1 new
>N 1 usera@mail .alpha.jp Tue Feb 19 13:38 21/751 "Test mail from usera"
& 1 ← 1を 入 力
Message 1:
From usera@mail .alpha.jp Tue Feb 19 13:38:31 2019
Return -Path: <usera@mail .alpha.jp >
X-Original -To: userb@beta .jp
Delivered -To: userb@beta .jp
Date: Tue , 19 Feb 2019 13:38:31 +0900
To: userb@beta .jp
Subject : Test mail from usera
User -Agent: Heirloom mailx 12.5 7/5/10
Content -Type: text/plain; charset =us -ascii
From: usera@mail .alpha.jp
Status : R

This is Test Mail from usera

& q ← qを 入 力
Held 1 message in /var/spool/mail/userb

このように、host1.alpha.jp から host2.beta.jp にメールが送られていることがわかります。以上で、A さんによる実習が終了で


す。次に、今度は B さんが A さんに対してメールを送ってみましょう。

5.7 メールクライアントソフトでのメールの送受信

通常のメールサーバーの運用では、メールの利用者はメールクライアントを使用してメールの送受信を行います。送信は SMTP、
受信は IMAP や POP3 をプロトコルとして使用します。IMAP サーバーを利用してメールを受信できるよう、IMAP サーバー
である Devecot と、メールクライアントとして Thunderbird をインストールしてメールを送受信してみます。

5.7.1 Dovecot パッケージの追加

それでは早速、必要なパッケージを追加して、クライアントでメールを送受信できるように設定してみましょう。まずは IMAP
サーバーである Dovecot をインストールします。インターネットに接続できない環境では、GUI から admin でログインし、イ
ンストールメディアが自動マウントされた状態でインストール作業を進めます。

dovecot パッケージのインストール

# yum install dovecot


読 み 込 ん だ プ ラ グ イ ン : fastestmirror , langpacks
Loading mirror speeds from cached hostfile
* base: ftp.riken.jp
依存性の解決をしています
--> ト ラ ン ザ ク シ ョ ン の 確 認 を 実 行 し て い ま す 。

LPI-Japan 83 https://linuc.org
5 メールサーバーの構築 5.7 メールクライアントソフトでのメールの送受信

図 23 メールクライアントソフトでのメールの流れ

---> パ ッ ケ ー ジ dovecot . x86_64 1:2.2.36 -3. el7 を イ ン ス ト ー ル


--> 依 存 性 の 処 理 を し て い ま す : libclucene - shared .so .1()(64 bit) の パ ッ ケ ー ジ :
1: dovecot -2.2.36 -3. el7. x86_64
--> 依 存 性 の 処 理 を し て い ま す : libclucene -core.so .1()(64 bit) の パ ッ ケ ー ジ :
1: dovecot -2.2.36 -3. el7. x86_64
--> ト ラ ン ザ ク シ ョ ン の 確 認 を 実 行 し て い ま す 。
---> パ ッ ケ ー ジ clucene -core. x86_64 0:2.3.3.4 -11. el7 を イ ン ス ト ー ル
--> 依 存 性 解 決 を 終 了 し ま し た 。

依存性を解決しました

================================================================================
Package アー キ テ ク チャー
バー ジョ ン リ ポ ジ ト リー 容量
================================================================================
イ ン ス トー ル 中:
dovecot x86_64 1:2.2.36 -3. el7 base 4.4 M
依 存 性 関 連 で の イ ン ス トー ル を し ま す:
clucene -core x86_64 2.3.3.4 -11. el7 base 528 k

ト ラ ン ザ ク ショ ン の 要 約
================================================================================
イ ン ス ト ー ル 1 パ ッ ケ ー ジ (+1 個 の 依 存 関 係 の パ ッ ケ ー ジ )

総 ダ ウ ン ロ ー ド 容 量 : 4.9 M
イ ン ス ト ー ル 容 量 : 16 M
Is this ok [y/d/N]: y ← 確 認 し てyを 入 力
Downloading packages :
(1/2): clucene -core -2.3.3.4 -11. el7. x86_64 .rpm | 528 kB 00:15

LPI-Japan 84 https://linuc.org
5 メールサーバーの構築 5.7 メールクライアントソフトでのメールの送受信

(2/2): dovecot -2.2.36 -3. el7. x86_64 .rpm | 4.4 MB 00:15


--------------------------------------------------------------------------------
合計 317 kB/s | 4.9 MB 00:15
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
イ ン ス トー ル 中 : clucene -core -2.3.3.4 -11. el7. x86_64 1/2
イ ン ス トー ル 中 : 1: dovecot -2.2.36 -3. el7. x86_64 2/2
検証中 : clucene -core -2.3.3.4 -11. el7. x86_64 1/2
検証中 : 1: dovecot -2.2.36 -3. el7. x86_64 2/2

イ ン ス トー ル:
dovecot . x86_64 1:2.2.36 -3. el7

依 存 性 関 連 を イ ン ス トー ル し ま し た:
clucene -core. x86_64 0:2.3.3.4 -11. el7

完 了 し ま し た!

5.7.2 Dovecot の設定

次に、IMAP サーバーである Dovecot の設定を行います。設定ファイルは/etc/dovecot/dovecot.conf と/etc/dovecot/conf.d


ディレクトリ以下に分かれています。

/etc/dovecot/dovecot.conf

全体的な設定ファイルです。デフォルトの設定がコメントアウトで記述されています。特に変更は必要ありません。

dovecot.conf を開く

# vi /etc/ dovecot / dovecot .conf

/etc/dovecot/dovecot.conf の確認

( 略 )
# Protocols we want to be serving .
# protocols = imap pop3 lmtp ← IMAP/POP3/LMTP が 使 用 可 能

# A comma separated list of IPs or hosts where to listen in for connections .


# "*" listens in all IPv4 interfaces , "::" listens in all IPv6 interfaces .
# If you want to specify non - default ports or anything more complex ,
# edit conf.d/ master .conf.
# listen = *, :: ← ホ ス ト の す べ て の IP ア ド レ ス で 接 続 を 受 け 付 け る

/etc/dovecot/conf.d/10-mail.conf

メールボックスの位置やアクセス権などを設定するファイルです。今回は mbox 形式のメールボックスを指定し、mail グループ


にて管理ができるようにします。

10-mail.conf を編集

# vi /etc/ dovecot /conf.d/10- mail.conf

LPI-Japan 85 https://linuc.org
5 メールサーバーの構築 5.7 メールクライアントソフトでのメールの送受信

/etc/dovecot/10-mail.conf(メールボックスの設定)

( 略 )
# mail_location = maildir :~/ Maildir
# mail_location = mbox :~/ mail:INBOX =/ var/mail /%u
# mail_location = mbox :/ var/mail /%d/%1n/%n:INDEX =/ var/ indexes /%d/%1n/%n
#
# <doc/wiki/ MailLocation .txt >
#
mail_location = mbox :~/ mail:INBOX =/ var/mail /%u ← 修正

次に、同じファイルの中のメールを管理するためのグループの設定を追加します。

/etc/dovecot/10-mail.conf(グループ設定)

# Group to enable temporarily for privileged operations . Currently this is


# used only with INBOX when either its initial creation or dotlocking fails.
# Typically this is set to "mail" to give access to /var/mail.
mail_privileged_group = mail ← 修正

# Grant access to these supplementary groups for mail processes . Typically


# these are used to set up access to shared mailboxes . Note that it may be
# dangerous to set these if users can create symlinks (e.g. if "mail" group is
# set here , ln -s /var/mail ~/ mail/var could allow a user to delete others '
# mailboxes , or ln -s / secret / shared /box ~/ mail/mybox would allow reading it).
mail_access_groups = mail ← 修正

/etc/dovecot/conf.d/10-auth.conf

認証を設定するファイルです。今回は暗号化していない平文での認証を許可し、Linux のログイン情報を認証に利用できるよう
に設定します。

10-auth.conf を編集

# vi /etc/ dovecot /conf.d/10- auth.conf

/etc/dovecot/10-auth.conf

##
## Authentication processes
##

# Disable LOGIN command and all other plaintext authentications unless


# SSL/TLS is used ( LOGINDISABLED capability ). Note that if the remote IP
# matches the local IP (ie. you 're connecting from the same computer ), the
# connection is considered secure and plaintext authentication is allowed .
# See also ssl= required setting .
# disable_plaintext_auth = yes
disable_plaintext_auth = no ← 追 加

/etc/dovecot/conf.d/10-ssl.conf

SSL/TLS を設定するファイルです。今回は SSL/TLS 暗号化をしませんので、SSL の利用を停止しておきます。

10-ssl.conf の編集

# vi /etc/ dovecot /conf.d/10- ssl.conf

LPI-Japan 86 https://linuc.org
5 メールサーバーの構築 5.7 メールクライアントソフトでのメールの送受信

/etc/dovecot/10-ssl.conf

##
## SSL settings
##

# SSL/TLS support : yes , no , required . <doc/wiki/SSL.txt >


# disable plain pop3 and imap , allowed are only pop3+TLS , pop3s , imap+TLS and imaps
# plain imap and pop3 are still allowed for local connections
#ssl = required ← コ メ ン ト ア ウ ト
ssl = no ← 追加

5.7.3 ファイアウォールの設定

Dovecot の起動の前に、POP3 と IMAP4 でメールの受信ができるようにファイアウォールのサービス許可設定を行います。

POP3, IMAP4 アクセスの許可

# firewall -cmd --add - service =pop3


# firewall -cmd --add - service =imap

さらに、設定を保存しておきます。

Firewall ルールの保存

# firewall -cmd --runtime -to - permanent

5.7.4 Dovecot の再起動

dovecot サービスを再起動します。

dovecot サービスの起動

# systemctl start dovecot

自動起動設定も行っておきます。

dovecot の自動起動設定

# systemctl enable dovecot


Created symlink from /etc/ systemd / system /multi -user. target .wants/ dovecot . service to
/usr/lib/ systemd / system / dovecot . service .

5.7.5 Thunderbird のインストール

メールクライアントとして Thunderbird をインストールします。インターネットに接続できない環境では、GUI から admin で


ログインし、インストールメディアが自動マウントされた状態でインストール作業を進めます。

# yum install thunderbird


読 み 込 ん だ プ ラ グ イ ン : fastestmirror , langpacks
Loading mirror speeds from cached hostfile
* base: mirrors .cat.net
依存性の解決をしています
--> ト ラ ン ザ ク シ ョ ン の 確 認 を 実 行 し て い ま す 。
---> パ ッ ケ ー ジ thunderbird . x86_64 0:52.9.1 -1. el7. centos を イ ン ス ト ー ル
--> 依 存 性 解 決 を 終 了 し ま し た 。

LPI-Japan 87 https://linuc.org
5 メールサーバーの構築 5.7 メールクライアントソフトでのメールの送受信

依存性を解決しました

================================================================================
Package アー キ テ ク チャー
バー ジョ ン リ ポ ジ ト リー
容量
================================================================================
イ ン ス トー ル 中:
thunderbird x86_64 52.9.1 -1. el7. centos base 76 M

ト ラ ン ザ ク ショ ン の 要 約
================================================================================
イ ン ス トー ル 1 パッ ケー ジ

総 ダ ウ ン ロ ー ド 容 量 : 76 M
イ ン ス ト ー ル 容 量 : 144 M
Is this ok [y/d/N]: y ← 確 認 し てyを 入 力
Downloading packages :
thunderbird -52.9.1 -1. el7. centos . x86_64 .rpm | 76 MB 00:22
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
イ ン ス トー ル 中 : thunderbird -52.9.1 -1. el7. centos . x86_64 1/1
検証中 : thunderbird -52.9.1 -1. el7. centos . x86_64 1/1

イ ン ス トー ル:
thunderbird . x86_64 0:52.9.1 -1. el7. centos

完 了 し ま し た!

5.7.6 Thunderbird の起動

次に Thunderbird の設定を行います。以下の手順は受講者 A の場合です。

1. admin でログインしている場合にはログアウトします。ログアウトは、GNOME メニューバーの電源アイコン付近をク


「admin」をクリックすると表示される「ログアウト」をクリックします。
リックし、

LPI-Japan 88 https://linuc.org
5 メールサーバーの構築 5.7 メールクライアントソフトでのメールの送受信

2. メールの送受信テスト用に作成したユーザーアカウント usera でログインします。パスワードは userapass です。正しく


設定されていない場合には、再度 admin でログインし、root ユーザになって passwd コマンドで設定し直して下さい。こ
のパスワードがメールの送受信にも使用されます。

3.「アプリケーション」メニューから「インターネット」→「Thunderbird」を選択します。

4. Thunderbird が起動すると「Thunderbird のご利用ありがとうございます」の画面が表示されます。

LPI-Japan 89 https://linuc.org
5 メールサーバーの構築 5.7 メールクライアントソフトでのメールの送受信

5.「メ ー ル ア カ ウ ン ト を 設 定 す る」 を ク リ ッ ク す る と、「メ ー ル ア カ ウ ン ト 設 定」 ダ イ ア ロ グ が 表 示 さ れ ま す。

6. 以下のように設定して「続ける」をクリックします。

表 12: アカウント設定の設定値

設定項目 値

あなたの名前 UserA
メールアドレス usera@alpha.jp
パスワード userapass
パスワードを記憶する チェックしておく

LPI-Japan 90 https://linuc.org
5 メールサーバーの構築 5.7 メールクライアントソフトでのメールの送受信

すると、「アカウント設定を Mozilla ISP データベースから検索しています。」と表示されます。検索はしばらく時間がか


かります。

7.「アカウント設定が、一般的なサーバー名で検索したことにより見つかりました。」と表示されます。

図 24 メールアカウント画面

もし、アカウントの検索時「Thunderbird はあなたのアカウント設定を見つけられませんでした。
」のように表示された場
合には、次のような設定になるように手動設定をし、
「再テスト」ボタンをクリックします。

表 13: メールアカウント設定の設定値

カテゴリ 項目 設定値

ユーザ名 usera
受信サーバー サーバーのホスト名 mail.alpha.jp
プロトコル IMAP
受信ポート番号 143
SSL 接続の保護なし
認証方式 通常のパスワード
送信サーバー サーバーのホスト名 mail.alpha.jp
送信ポート番号 25
SSL 接続の保護なし
認証方式 通常のパスワード

8.「完了」をクリックします。すると、接続が暗号化されないため、警告が表示されます。

「接続する上での危険性を理解しました」をチェックし、
「完了」ボタンをクリックします。

5.7.7 メールの送信

メールを送信するには、
「作成」ボタンをクリックしてメール作成ウインドウを呼び出します。

1. 宛先に自分のメールアドレス(usera@alpha.jp)を指定して、メールを作成、送信してみます。
2.「受信」ボタンをクリックして、メールが受信できることを確認します。
3. 宛先に他の受講生のメールアドレス(userb@beta.jp)を指定して、メールを作成、送信してみます。
4. 相手がメールを受信できたこと、相手からのメールを受信できることを確認します。

LPI-Japan 91 https://linuc.org
5 メールサーバーの構築 5.7 メールクライアントソフトでのメールの送受信

図 25 警告画面

5.7.8 起動時のスタートページの設定

インターネットに接続できない環境で実習をしている場合には、起動時に「サーバーが見つかりませんでした」のエラーが表示
されることがあります。エラーが表示されないようにするには、以下の手順で設定を修正します。

1. 三本線のボタンからメニューを表示し、「設定」→「設定」を選択します。

図 26 メニューから設定を選ぶ

1.「Thunderbird スタートページ」の「起動時にメッセージペインにスタートページを表示する」のチェックを外して、「閉
じる」をクリックします。

LPI-Japan 92 https://linuc.org
5 メールサーバーの構築 5.8 まとめ

図 27 メニューから設定を選ぶ

5.8 まとめ

本章では、電子メールに関する学習を行いました。また、実際にメールサーバーを設定し、mail コマンドや Thunderbird を利用


してメールの送受信の確認を行いました。メールサーバーの設定は、メールサーバーが正しく設定され起動していたとしても、
DNS サーバーが正しく動いていなければ利用できないなどの理由から難しかったと思います。設定ファイルの記述に問題がない
のに、メールがどうしても送れない、受信できない場合は、まず DNS が正しく動いているか、host コマンドや dig コマンドを
実行して確認します。また、ログ(/var/log/mail)を見て、エラーが出ていないか確認することも大切です。

LPI-Japan 93 https://linuc.org
6 ネットワークとセキュリティの管理

6 ネットワークとセキュリティの管理

CentOS では、基本的なネットワークやセキュリティの設定はインストール時に行われます。ここでは、これらの設定を管理す
るための方法について説明します。

6.1 用語集

ネットワークインターフェース

LAN ケーブルを接続して、外部のマシンとの間でデータをやり取りするための物理的なインターフェースです。

ループバックインターフェース

マシン内部でデータをやり取りするための仮想的なインターフェースです。

IP(Internet Protocol)

IP は、ネットワークに接続したコンピューター間でデータをやり取りするためのプロトコルです。

IP アドレス

IP アドレスは、IP 通信で各コンピューターに割り当てられる値です。データの送り先として IP アドレスを指定すると、その


IP アドレスが割り当てられたコンピューターに送信されたデータが届きます。

IPv4(Internet Protocol version 4)

現在のインターネットで利用されている通信プロトコルです。IPv4 では、IP アドレスを 4 バイト(32 ビット)で表します。本


来は 32 個の 2 進数(0 と 1)の羅列ですが、人間に分かりやすくするために 1 バイトごとに 10 進数に変換して. (ドット) で区
切って「192.168.1.1」の様に表記します。次世代の IP である IPv6 では、IP アドレスを 128 ビットで表します。

ネットワークアドレス

ホストが属しているネットワーク自体を指し示す IP アドレスです。

ブロードキャスト

ホストが属しているネットワーク全体を指し示す IP アドレスです。

ネットマスク

IP アドレスのうち、どこまでがネットワーク部で、どこまでがホスト部かを示すための値です。IP アドレスとネットマスクの 2
つの値から、ネットワークアドレス、ブロードキャストアドレスを割り出すことができます。

デフォルトゲートウェイ

インターネットは、小さなネットワークが相互に接続したネットワークです。小さなネットワーク間を接続する機器としてルー
ター (ゲートウェイ) が使われます。ゲートウェイは 1 つのネットワークに複数設置することができますが、特に指定が無い場合
にはデフォルトゲートウェイを使って外部のネットワークとの通信を行います。

DHCP(Dynamic Host Coniguration Protocol)

IP アドレスなどのネットワーク設定を自動的に割り当てるプロトコルです。

LPI-Japan 94 https://linuc.org
6 ネットワークとセキュリティの管理 6.1 用語集

TCP(Transmission Control Protocol)

TCP は、コネクション方式で通信するプロトコルです。IP と組み合わせた TCP/IP がインターネットの標準的な通信プロトコ


ルです。TCP の特長として、届かなかった通信パケットを再送信して確実に通信を行う仕組みがあります。

UDP(User Datagram Protocol)

UDP は、コネクションレス方式で通信するプロトコルです。TCP とは異なり、データの再送信が行われないので通信の確実性


は劣りますが、セッションを確立するための「3 ウェイハンドシェイク」の手間が不要なためシンプルな通信に適しています。た
とえば、大量に問い合わせが行われる DNS への名前解決の問い合わせは UDP となっています。

ポート番号

ポート番号は、TCP と UDP が通信する際に使用する値です。たとえば Web サーバーはポート番号 80 番を使用して動作してい


るので、Web ブラウザーは目的の Web サーバーのポート番号 80 番に接続します。ポート番号は 0 番から 65535 番まで使用で
きますが、0〜1023 番は WELL KNOWN PORT、1024〜49151 番は REGISTERED PORT として予約されています。

ICMP(Internet Control Message Protocol)

データの転送エラーやデータ転送量などの情報を通知するためのプロトコルです。

ping コマンド

ping コマンドは、ICMP を使って宛先に指定したホストに到達することができるかどうかを確認するコマンドです。

LPI-Japan 95 https://linuc.org
6 ネットワークとセキュリティの管理 6.2 ネットワーク管理

6.2 ネットワーク管理

ネットワークが上手く使えない場合には、確認のためにネットワークインターフェースが正しく設定されているかを調べる必要
があります。また、設定が間違っている場合には、インターフェースの設定を変更する必要があります。ここでは、ネットワー
クインターフェースの確認と設定の方法について解説します。

6.2.1 ネットワークインターフェースの確認

Linux をインストールしたマシンが正常にネットワークに接続できるかどうか、設定を確認します。ip コマンドで確認します。

ネットワークインターフェースの確認

# ip addr show
1: lo: <LOOPBACK ,UP ,LOWER_UP > mtu 65536 qdisc noqueue state UNKNOWN group default qlen
1000
link/ loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp0s3 : <BROADCAST ,MULTICAST ,UP ,LOWER_UP > mtu 1500 qdisc pfifo_fast state UP group
default qlen 1000
link/ether 08:00:27: cb:f6 :31 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.101/24 brd 192.168.1.255 scope global noprefixroute enp0s8
valid_lft forever preferred_lft forever
inet6 2001: db8 ::10/64 scope global noprefixroute
valid_lft forever preferred_lft forever
inet6 fe80 ::40 f4 :1400:1 f0d :132b/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: virbr0 : <NO -CARRIER ,BROADCAST ,MULTICAST ,UP > mtu 1500 qdisc noqueue state DOWN group
default qlen 1000
link/ether 52:54:00:96:78:2 c brd ff:ff:ff:ff:ff:ff
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
valid_lft forever preferred_lft forever
4: virbr0 -nic: <BROADCAST ,MULTICAST > mtu 1500 qdisc pfifo_fast master virbr0 state DOWN
group default qlen 1000
link/ether 52:54:00:96:78:2 c brd ff:ff:ff:ff:ff:ff

ip コマンドで表示された lo は仮想的なループバックインターフェースです。また、この例では enp0s3 が物理的なインター


フェースです。この名称は、インストールした PC によって変わります。enoXX、ensXX、enpXsX、ethX、enxXX などの名称
になる場合もあります。

6.2.2 ネットワークインターフェースの再設定

インストール時に IP アドレスの設定を間違えた時などは、ネットワークインターフェースを再設定します。設定は、GNOME
の管理画面から行うことができます。

GNOME のデスクトップのアプリケーションメニューから「システムツール」→「設定」を選択します。表示された設定画面の
左側のメニューから「ネットワーク」を選択します。

「有線」の欄にある歯車のボタンをクリックすると、接続プロファイルの設定画面が表示されます。「IPv4」のタブをクリックす
ると、次のような画面になります。

LPI-Japan 96 https://linuc.org
6 ネットワークとセキュリティの管理 6.2 ネットワーク管理

図 28 設定画面

図 29 ネットワーク詳細設定画面

LPI-Japan 97 https://linuc.org
6 ネットワークとセキュリティの管理 6.2 ネットワーク管理

この画面で、設定を変更することで、ネットワークインターフェースの設定を変更することができます。変更したら、
「適用」ボ
タンを押して元の画面に戻ります。
「有線」の項目にあるスイッチを、一旦「オフ」に変えます。再度、
「オン」に変えるとネット
ワークインターフェース設定が変更されます。

6.2.3 ネットワークインターフェースの動作確認

ネットワークインターフェースが動作しているかは ping コマンドで確認します。ping コマンドで確認する IP アドレスとして自


分の物理ネットワークインターフェースの IP アドレス、講師のマシンの IP アドレス (192.168.1.10) やその他のマシンの IP ア
ドレスなどを指定します。ping コマンドは [Control]+[c] で中止できます。

ping コマンドによる確認

# ping 192.168.1.101 ← 自 分 の IP ア ド レ ス
PING 192.168.1.101 (192.168.1.101) 56(84) bytes of data.
64 bytes from 192.168.1.101: icmp_seq =1 ttl =64 time =0.209 ms
64 bytes from 192.168.1.101: icmp_seq =2 ttl =64 time =0.151 ms
64 bytes from 192.168.1.101: icmp_seq =3 ttl =64 time =0.174 ms
64 bytes from 192.168.1.101: icmp_seq =4 ttl =64 time =0.144 ms
64 bytes from 192.168.1.101: icmp_seq =5 ttl =64 time =0.144 ms
^C
--- 192.168.1.101 ping statistics ---
5 packets transmitted , 5 received , 0% packet loss , time 3998 ms
rtt min/avg/max/mdev = 0.144/0.164/0.209/0.027 ms

6.2.4 サービスのポート番号を確認

どんなネットワークサービスが自分の PC で動いているかを、ss コマンドと lsof コマンドで確認します。ss -at コマンドを実行


すると、現在の TCP 通信の状態をすべて表示します。

ss コマンドによる確認

# ss -at
State Recv -Q Send -Q Local Address :Port Peer Address :Port
LISTEN 0 50 *: microsoft -ds *:*
LISTEN 0 50 *: netbios -ssn *:*
LISTEN 0 100 *: pop3 *:*
LISTEN 0 100 *: imap *:*
LISTEN 0 128 *: sunrpc *:*
LISTEN 0 5 192.168.122.1: domain *:*
LISTEN 0 10 192.168.1.101: domain *:*
LISTEN 0 10 127.0.0.1: domain *:*
LISTEN 0 128 *: ssh *:*
( 略 )

lsof -i コマンドを実行すると現在開かれているすべてのポートを表示します。

lsof コマンドによる確認

# lsof -i
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rpcbind 655 rpc 6u IPv4 15791 0t0 UDP *: sunrpc
rpcbind 655 rpc 7u IPv4 15855 0t0 UDP *:821
rpcbind 655 rpc 8u IPv4 15856 0t0 TCP *: sunrpc ( LISTEN )
rpcbind 655 rpc 9u IPv6 15857 0t0 UDP *: sunrpc
rpcbind 655 rpc 10u IPv6 15858 0t0 UDP *:821
rpcbind 655 rpc 11u IPv6 15859 0t0 TCP *: sunrpc ( LISTEN )

LPI-Japan 98 https://linuc.org
6 ネットワークとセキュリティの管理 6.3 SSH によるリモートログイン

avahi -dae 672 avahi 12u IPv4 17393 0t0 UDP *: mdns
avahi -dae 672 avahi 13u IPv4 17394 0t0 UDP *:37814
chronyd 707 chrony 1u IPv4 17271 0t0 UDP localhost :323
chronyd 707 chrony 2u IPv6 17272 0t0 UDP localhost :323
dhclient 943 root 6u IPv4 20446 0t0 UDP *: bootpc
sshd 1155 root 3u IPv4 22236 0t0 TCP *: ssh ( LISTEN )
sshd 1155 root 4u IPv6 22370 0t0 TCP *: ssh ( LISTEN )
( 略 )

ss コマンドは-a オプションでサービスの状態をすべて表示、-t オプションで TCP(Transmission Control Protocol) のサービス


が使うポートなどの情報のみを表示します。lsof コマンドは-i オプションでサービスを受けているポートと対応するプログラム
の情報を表示します。ポート番号とサービスの対応 (WELL KNOWN PORT NUMBERS:0〜1023 や REGISTERED PORT
NUMBERS:1024〜49151) が定義されている/etc/services ファイルも確認してみてください。

lsof コマンドによる確認

# cat /etc/ services


(略)
tcpmux 1/ tcp # TCP port service multiplexer
tcpmux 1/ udp # TCP port service multiplexer
rje 5/ tcp # Remote Job Entry
rje 5/ udp # Remote Job Entry
echo 7/ tcp
echo 7/ udp
discard 9/ tcp sink null
discard 9/ udp sink null
systat 11/ tcp users

6.3 SSH によるリモートログイン

SSH はネットワーク経由でリモートにある Linux サーバーにログインするために使用するプロトコルです。通信が暗号化されて


いるため、覗き見されてもパスワードや作業内容が分からない他、公開鍵を使った認証を行うことでパスワードをネットワーク
に流すことなくログインすることができます。Linux では、OpenSSH のサーバーとクライアントが用意されています。

6.3.1 TELNET との違い

SSH と同様のリモートログインに TELNET が使用できますが、TELNET は通信が暗号化されていないためパスワードや作業


内容などを覗き見することができてしまうという問題があります。SSH は特別な設定をしなくても TELNET と同様のパスワー
ドによるリモートログインが行えるので、通信が暗号化されている SSH が標準的に使われており、現在では TELNET を使用す
る必要は無くなっています。CentOS 7 では、デフォルトでは telnet コマンドはインストールされていません。

6.3.2 パスワードによる認証

ssh コマンドは特別な設定を行わなくても、パスワード認証でリモートログインすることができます。

以下のようにして、自分自身に SSH で接続してみます。初めての接続の場合には、SSH サーバーの電子証明書が送られてきて


接続してもよいか訪ねられるので「yes」と入力します。パスワード認証が可能だと、パスワードの入力が要求されます。

ssh による接続

[ root@host1 admin ]# ssh usera@localhost ← usera と し て localhost に 接 続


The authenticity of host 'localhost (::1) ' can 't be established .
ECDSA key fingerprint is SHA256 : qeRiiKeZpaNMdtkClnl4n0iRsjGPrnvGcLpcbhwXH8g .
ECDSA key fingerprint is MD5 :25: d1:b0:2e:b8:f8 :19: fb:f7:e0:a7:a6 :19:06: b7 :96.

LPI-Japan 99 https://linuc.org
6 ネットワークとセキュリティの管理 6.3 SSH によるリモートログイン

Are you sure you want to continue connecting (yes/no)? yes ← yes を 入 力
Warning : Permanently added 'localhost ' (ECDSA) to the list of known hosts.
usera@localhost 's password : userapass ← 実際には非表示
Last failed login: Tue Feb 19 15:23:31 JST 2019 from 192.168.7.1 on ssh:notty
There were 5 failed login attempts since the last successful login.
Last login: Tue Feb 19 14:36:42 2019
[ usera@host1 ~]$ exit ← リ モー ト ロ グ イ ン を 修 了
ログアウト
Connection to localhost closed .
[ root@host1 admin ]# ← 元 の ユ ー ザ ー root に 復 帰

6.3.3 公開鍵による認証

パスワード認証は、通信経路が SSH で暗号化されているといっても、パスワードがネットワークを流れていること、またパス


ワードを自動的に生成して順番に試していく「総当たり攻撃」を受けた場合不正にログインされてしまう可能性があるので、イ
ンターネット上に公開されているサーバーで使用するには相応しくありません。

公開鍵認証は、あらかじめサーバーに設置した公開鍵と対になっている秘密鍵を持っているユーザーしかリモートログインでき
ない認証方法です。

以下の手順で公開鍵認証を設定します。

1. 公開鍵と秘密鍵を生成する
ssh-keygen コマンドを使用して一対の公開鍵 (id_dsa.pub) と秘密鍵 (id_dsa) を生成します。鍵のファイルはホームディ
レクトリに作られた.ssh ディレクトリに保存されます。
秘密鍵には不正利用を防止するためのパスフレーズを設定します。接続時にパスフレーズを正しく入力できないと、秘密
鍵は利用できないので、公開鍵認証による接続はできません。このパスフレーズは SSH クライアント側で秘密鍵に対して
処理されるので、ネットワーク上には情報は流れません。

公開鍵と秘密鍵の作成

[ root@host1 ~]# su - usera ← ユ ー ザ ー usera に ユ ー ザ を 切 り 替 え


[ usera@host1 ~]$ ssh - keygen -t dsa ← DSA 暗 号 形 式 で 鍵 を 生 成
Generating public / private dsa key pair.
Enter file in which to save the key (/ home/usera /. ssh/ id_dsa ): ← Enter キ ー を 入 力
Created directory '/home/usera /.ssh '.
Enter passphrase (empty for no passphrase ): ← パ ス フ レ ー ズ を 入 力( 非 表 示 )
Enter same passphrase again: ← パ ス フ レ ー ズ を 入 力( 非 表 示 )
Your identification has been saved in /home/usera /. ssh/ id_dsa .
Your public key has been saved in /home/usera /. ssh/ id_dsa .pub.
The key fingerprint is: ↓ 鍵 に つ い た 指 紋 。鍵 の 称 号 に 使 用 可 能
SHA256 : Y5FJTNhlaIA7z3dT / bCTf0br + X4ZjIQCFFUKDSmtttE usera@host1 .alpha.jp
The key 's randomart image is:
+---[DSA 1024]----+
| .+@O ++. |
| ...=*=. |
| .+.=. .. |
| o+ E o ...o |
| .+o S ... o= |
| .o...o .+oo|
| . . . ++|
| o*|
| .=*|
+----[ SHA256 ]-----+
[ usera@host1 ~]$

LPI-Japan 100 https://linuc.org


6 ネットワークとセキュリティの管理 6.3 SSH によるリモートログイン

2. 接続先に~/.ssh/authorized_keys を作成する
ユーザーに SSH での接続を許可するには、ユーザーアカウントを作成し、そのユーザーのホームディレクトリに
~/.ssh/authorized_keys ファイルを作成しておきます。~/.ssh/のパーミッションは 700(drwx——)、authorized_keys
ファイルのパーミッションは 600(-rwx——) に設定する必要があります。

認証用ファイルの作成

[ usera@host1 ~]$ ls -ld .ssh


drwx ------. 2 usera usera 38 2 月 19 17:28 .ssh
[ usera@host1 ~]$ cd .ssh
[ usera@host1 .ssh]$ cat id_dsa .pub >> authorized_keys
[ usera@host1 .ssh]$ chmod 600 authorized_keys
[ usera@host1 .ssh]$ ls -l authorized_keys
-rw -------. 1 usera usera 610 2 月 19 17:34 authorized_keys

3. 公開鍵認証で接続する
公開鍵認証で接続します。ssh コマンドの使用法自体はパスワード認証と同じですが、パスワードの代わりに秘密鍵に設
定したパスフレーズの入力が必要です。

公開鍵での接続

[ usera@host1 ~]$ ssh usera@localhost


The authenticity of host 'localhost (::1) ' can 't be established .
ECDSA key fingerprint is SHA256 : qeRiiKeZpaNMdtkClnl4n0iRsjGPrnvGcLpcbhwXH8g .
ECDSA key fingerprint is MD5 :25: d1:b0:2e:b8:f8 :19: fb:f7:e0:a7:a6 :19:06: b7 :96.
Are you sure you want to continue connecting (yes/no)? yes
Warning : Permanently added 'localhost ' (ECDSA) to the list of known hosts.
Enter passphrase for key '/home/usera /. ssh/id_dsa ': ← パ ス フ レ ー ズ を 入 力
Last login: Tue Feb 19 17:34:19 2019
[ usera@host1 ~]$ exit
ログアウト
Connection to localhost closed .

6.3.4 パスワード認証の禁止

パスワード認証が有効になっていると、パスワードの総当たり攻撃により不正にリモートログインできてしまいます。公開鍵認
証で接続できるようになった後には、OpenSSH サーバーの設定を変更してパスワード認証を禁止しておきます。

1. パスワード認証で接続できることを確認します。

パスワード認証での確認

# ssh localhost
root@localhost 's password :
Last login: Tue Feb 19 17:13:43 2019
[ root@host1 ~]# exit
ログアウト
Connection to localhost closed .

2. 設定ファイル/etc/ssh/sshd_conig を修正します。

パスワード認証の禁止

( 略 )
# To disable tunneled clear text passwords , change to no here!
# PasswordAuthentication yes
# PermitEmptyPasswords no

LPI-Japan 101 https://linuc.org


6 ネットワークとセキュリティの管理 6.4 ファイアウォールの設定

PasswordAuthentication no ← 変更
( 略 )

3. 設定を変更後、sshd 設定の再読み込み

sshd のリロード

# systemctl reload sshd

4. 公開鍵認証を設定していないユーザーで OpenSSH サーバーに接続します。

接続の確認

# ssh localhost
Permission denied (publickey ,gssapi -keyex ,gssapi -with -mic ).

6.4 ファイアウォールの設定

ファイアウォールはネットワークにおいて様々なアクセス制限を行い、ネットワークからの攻撃や不正なアクセス等を防ぐ機能
です。CentOS7 のファイアウォール機能は、irewalld によって管理されています。irewalld では、ネットワークインターフェー
スへのパケットの受信の許可、拒否のルールを管理しています。irewalld の設定は irewall-cmd というコマンドで、設定を行い
ます。

6.4.1 ファイアウォール設定の確認

許可されているサービスを調べるには、–list-services オプションを使います。

許可サービスの確認

# firewall -cmd --list - services


ssh dhcpv6 - client dns smtp pop3 http imap

6.4.2 許可サービスの追加

許可サービスを追加するには、次のように–add-service オプションを使います。

許可サービスの追加

# firewall -cmd --add - service =imap


success

この例では、imap サービスを許可しています。設定可能なサービスについては、次のようにして–get-services オプションで調


べることができます。

利用可能なサービスの調査

# firewall -cmd --get - services


RH -Satellite -6 amanda - client amanda -k5 - client bacula bacula - client bgp bitcoin
bitcoin -rpc bitcoin - testnet bitcoin -testnet -rpc ceph ceph -mon cfengine
condor - collector ctdb dhcp dhcpv6 dhcpv6 - client dns docker - registry docker -swarm
dropbox - lansync elasticsearch freeipa -ldap freeipa -ldaps freeipa - replication
freeipa -trust ftp ganglia - client ganglia - master git gre high - availability http
https imap imaps ipp ipp - client ipsec irc ircs iscsi - target jenkins kadmin
kerberos kibana klogin kpasswd kprop kshell ldap ldaps libvirt libvirt -tls
managesieve mdns minidlna mongodb mosh mountd ms -wbt mssql murmur mysql nfs nfs3
nmea -0183 nrpe ntp openvpn ovirt - imageio ovirt - storageconsole ovirt - vmconsole pmcd

LPI-Japan 102 https://linuc.org


6 ネットワークとセキュリティの管理 6.4 ファイアウォールの設定

pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy -dhcp ptp pulseaudio
puppetmaster quassel radius redis rpc -bind rsh rsyncd samba samba - client sane sip
sips smtp smtp - submission smtps snmp snmptrap spideroak - lansync squid ssh
syncthing syncthing -gui synergy syslog syslog -tls telnet tftp tftp - client tinc
tor -socks transmission - client upnp - client vdsm vnc - server wbem -https xmpp -bosh
xmpp - client xmpp -local xmpp - server zabbix -agent zabbix - server

6.4.3 許可サービスの取り消し

許可されているサービスを停止するには、–remove-service オプションを使います。

許可サービスの追加

# firewall -cmd --remove - service =imap


success

6.4.4 ファイアウォール設定の保存

–add-service、–remove-service などで行ったファイアウォールルールの変更は、一時的なものです。そのため、再起動をすると
失われてしまいます。再起動後も設定をに有効にするには、次のように–runtime-to-permanent オプションを使って、設定を保
存します。

許可サービスの追加

# firewall -cmd --runtime -to - permanent

LPI-Japan 103 https://linuc.org


6 ネットワークとセキュリティの管理 6.4 ファイアウォールの設定

Linux サーバー構築標準教科書

2012 年 6 月 1 日 V2.0.0 発行

2012 年 6 月 20 日 V2.0.1 発行

2019 年 10 月 1 日 V3.0.0 発行

© LPI-Japan

LPI-Japan 104 https://linuc.org


1.4 SSH によるリモートログイン

図 1.4 ターミナル画面が表示されます

パスワード認証が成功すると、ターミナル画面が表示されてログインシェルが起動します。

1.4.15 Tera Term を使った公開鍵・秘密鍵の作成

Tera Term の公開鍵・秘密鍵の作成機能を使って鍵を作成し、サーバに転送して公開鍵認証を行え


るようにします。

1. 鍵生成ダイアログを呼び出します。

図 1.5 「生成」ボタンをクリックします

www.lpi.or.jp 32 (C) LPI-Japan


第 1 章 ユーザとグループの管理

Tera Term のターミナル画面の「設定」メニューから「SSH 鍵生成」を選択します。サーバに接続


していない場合には、「新しい接続」ダイアログのキャンセルボタンをクリックすれば、サーバ接続
を行わずにターミナル画面を表示できます。
「TTSSH:鍵生成」ダイアログが表示されるので「生成」
ボタンをクリックします。

2. 公開鍵と秘密鍵を保存します。

図 1.6 パスフレーズを入力して、公開鍵と秘密鍵をそれぞれ保存します

パスフレーズを入力し、
「公開鍵の保存」ボタン、
「秘密鍵の保存」ボタンをクリックして、それぞれ
の鍵ファイルを保存します。

3. 鍵生成ダイアログを閉じます。

保存後、「キャンセル」ボタンをクリックしてダイアログを閉じます。

1.4.16 Tera Term を使ったファイル転送

Tera Term は SSH SCP 機能でファイルの送受信が行えます。作成した公開鍵をサーバに設置する


ために、公開鍵(id_rsa.pub)をサーバにコピーします。

1. Secure File Copy ダイアログを呼び出します。

www.lpi.or.jp 33 (C) LPI-Japan


1.4 SSH によるリモートログイン

図 1.7 「From:」に作成した公開鍵を指定します

TeraTerm でサーバにログインした状態のまま、「ファイル」メニューから「SSH SCP」を選択し


ます。

2. 公開鍵ファイルを選択します。
「TTSSH: Secure File Copy」ダイアログが表示されます。上側の「From:」の右横にある「...」
ボタンをクリックしてファイルダイアログを開き、保存した公開鍵ファイル(id_rsa.pub)
ファイルを選択します。
3. 公開鍵ファイルをコピーします。
「Send」ボタンをクリックすると、ファイルがサーバ側のユーザのホームディレクトリにコ
ピーされます。
4. 公開鍵ファイルを確認します。

[sshuser@server ~]$ ls
id_rsa.pub sftptestfile testdir

1. 公開鍵ファイルを設置します。
2. コピーした公開鍵は、Linux での公開鍵の設置と同じ手順で authorized_keys に追加してお
きます。以下は、初めてサーバに公開鍵を登録する場合のコマンド例です。

[sshuser@server ~]$ mkdir .ssh


[sshuser@server ~]$ chmod 700 .ssh
[sshuser@server ~]$ touch .ssh/authorized_keys
[sshuser@server ~]$ chmod 600 .ssh/authorized_keys
[sshuser@server ~]$ cat id_rsa.pub >> .ssh/authorized_keys

www.lpi.or.jp 34 (C) LPI-Japan


第 1 章 ユーザとグループの管理

1.4.17 Tera Term を使った Windows クライアントからの公開鍵認証による接続

Tera Term を使って、公開鍵認証でサーバに接続します。

1. Tera Term を起動し、サーバに接続します。


2.「SSH 認証」ダイアログで、ユーザ名、パスフレーズ(秘密鍵に設定したもの)を入力します。
3.「RSA/DSA/EC DSA 鍵を使う」を選択し、
「秘密鍵」ボタンをクリックして保存しておいた
秘密鍵ファイル(id_rsa)を選択し、
「OK」ボタンをクリックします。

図 1.8 「RSA/DSA/EC DSA 鍵を使う」を選択して、秘密鍵を指定します

これで、TeraTerm を使って公開鍵認証でログインができました。

1.4.18 パスワード認証の禁止と管理者ユーザ root のログインの禁止

公開鍵認証による接続ができるようになったら、OpenSSH サーバの設定を変更してパスワード認証
による接続を禁止しておきます。

www.lpi.or.jp 35 (C) LPI-Japan


1.5 root 権限の管理

OpenSSH サーバの設定ファイル/etc/ssh/sshd_config を以下のように設定変更します。

[root@server ~]# vi /etc/ssh/sshd_config

PasswordAuthentication no ← no に変更

また、管理者ユーザ root の外部からの直接ログインを禁止することもできます。root ユーザの直接


ログインを許すかどうかは後述します。root ユーザの SSH ログインを禁止するには、以下のように
変更します。

PermitRootLogin no ← no に変更

設定を保存したら、service コマンドで sshd を再起動します。

[root@server ~]# service sshd restart


sshd を停止中: [ OK ]
sshd を起動中: [ OK ]

これで、外部からのパスワード認証を使ったログインが禁止され、かつ root ユーザでの SSH ログ


インが禁止されました。

1.5 root 権限の管理

管理者ユーザである root は最も高い権限を持っているアカウントとなるため、管理方法には注意が


必要です。
root 権限を取得するには、以下の 3 つの方法があります。

• root で直接ログインする
• 一般ユーザでログインした後、su コマンドを実行して管理者ユーザ root に切り替える
• 一般ユーザでログインした後、sudo コマンドを使って root 権限でコマンドを実行する

どの方法も一長一短がありますが、root で直接ログインするのは許さず、一般ユーザでログインし
た後、su コマンドか sudo コマンドを使用させることが多いようです。

また、root 権限を使った作業を中断して席を離れる際には、ログアウトするか画面をロックするな
どして、他人に勝手に操作されないようにするなど十分注意を払う必要があります。もちろん、一
般ユーザでのログイン時も同様に気を付けましょう。

サーバの設置場所も重要です。サーバに物理的にアクセスされてしまうと、システムの様々なセ
キュリティ対策も用を為さなくなってしまいます。サーバはロックのかかったマシンルームやサー
バラック内に設置し、許可された作業者のみアクセスできるようにすることが望ましいでしょう。

www.lpi.or.jp 36 (C) LPI-Japan


目次 目次

目次

まえがき 5
執筆者・制作担当者紹介 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
松田 神一(第 1 版企画・進行担当) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
宮原徹(第 1 版企画・執筆担当、第 2 版監修/株式会社びぎねっと). . . . . . . . . . . . . . . . . . . . . . . . . 5
喜田紘介(第 2 版執筆担当/株式会社アシスト/ NPO 法人 日本 PostgreSQL ユーザ会理事) . . . . . . . . . . . 5
高橋征義(第 1 版 PDF 版・EPUB 版制作担当/株式会社達人出版会) . . . . . . . . . . . . . . . . . . . . . . . 6
中谷徹(第 2 版 PDF 版・EPUB 版・Kindle 版制作担当/ NPO 法人 LPI-Japan). . . . . . . . . . . . . . . . . 6
木村 真之介 (意見交換用 Wiki サイト作成) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
教科書開発に協力いただいた皆さん (第 1 版) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
著作権 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
使用に関する権利 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
表示 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
非営利 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
改変禁止 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
本教材の使用に関するお問合せ先 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
この教科書の目的 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
想定している実習環境 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
データベース . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
OS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
マシンの構成と HDD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
ネットワーク . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
仮想環境 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
クラウド環境 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
その他の情報源 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

1 SQL によるデータベースの操作基礎編 10
1.1 データベース利用の基本パターン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.2 psql ツールの利用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.2.1 psql でデータベースに接続する . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.2.2 psql のヘルプを表示する . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.2.3 メタコマンド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.2.4 psql を終了する . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.2.5 表の確認 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.2.6 表定義の確認 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.2.7 表とテーブル、リレーション . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.3 pgAdmin4(GUI ツール) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.4 SQL の実行方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.4.1 複数行入力のプロンプト表示 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.4.2 テキストファイルからの読み込み実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
1.5 データの検索(SELECT). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
1.5.1 全件全項目検索 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
1.5.2 SELECT 項目リスト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
1.5.3 WHERE 句による絞り込み検索 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
1.6 ORDER BY 句による並べ替え . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
1.7 表の結合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
1.7.1 JOIN 句による結合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
1.7.2 表別名の利用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
1.8 行データの入力(INSERT) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
1.9 データの更新(UPDATE) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

LPI-Japan 1 https://oss-db.jp
目次 目次

1.10 行データの削除(DELETE) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

2 データ型 28
2.1 数値データ型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.1.1 integer 型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.1.2 numeric 型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.1.3 その他の数値型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.2 文字列データ型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.2.1 character varying 型 (varchar 型) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.2.2 character 型 (char 型) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
2.2.3 text 型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
2.3 日付・時刻データ型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

3 表 33
3.1 表の作成(CREATE TABLE) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.1.1 表を作成する . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.1.2 staf 表にデータを格納する . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.2 表定義の修正(ALTER TABLE). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.2.1 ALTER TABLE による変更 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.2.2 表定義の修正は原則として行わない . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.3 表の削除 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
3.3.1 DROP TABLE 文による表の削除 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
3.3.2 DROP TABLE、DELETE、TRUNCATE の利用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
3.4 行データのセーブ・ロード . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.4.1 行データのセーブ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.4.2 CSV ファイルのロード . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.4.3 \copy メタコマンド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39

4 基礎編 演習 40
4.1 演習 1:データ操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
4.1.1 データ操作演習 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
4.1.2 解答例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
4.2 演習 2:郵便番号データベース . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
4.2.1 郵便番号データのダウンロード . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
4.2.2 郵便番号データベース表の作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
4.2.3 データのロードと文字コードについて . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
4.2.4 郵便番号データの確認 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44

5 SQL によるデータベースの操作応用編 45
5.1 演算子と関数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
5.1.1 演算子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
5.1.2 関数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
5.1.3 GROUP BY 句と集約関数の組み合わせ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
5.1.4 HAVING 句 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
5.1.5 WHERE 句、GROUP BY 句、HAVING 句の適用順序 . . . . . . . . . . . . . . . . . . . . . . . . . . 49
5.2 副問い合わせ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
5.2.1 EXISTS 演算子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
5.2.2 IN 演算子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
5.3 日付・時刻型データの取り扱い . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
5.3.1 日付形式を確認・設定する . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
5.3.2 現在時刻を取得する . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
5.3.3 文字列の入力値を日付型の列に格納する . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
5.4 複雑な結合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
5.4.1 外部結合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54

LPI-Japan 2 https://oss-db.jp
目次 目次

5.4.2 クロス結合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
5.4.3 自己結合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
5.5 LIMIT 句による検索行数制限 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
5.5.1 LIMIT と並び順の指定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
5.5.2 OFFSET 句 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

6 データベース定義の応用 59
6.1 主キー . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
6.1.1 主キーを指定する . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
6.1.2 主キーの動作を確認する . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
6.1.3 複数列からなる主キー . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
6.2 外部キー . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
6.2.1 参照整合性制約 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
6.2.2 外部キーを指定する . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
6.2.3 CREATE TABLE 文で主キー、外部キーを設定する . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
6.2.4 主キー、外部キーは必要か? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
6.3 正規化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
6.4 NULL について . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
6.4.1 NOT NULL 制約 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
6.4.2 NULL の判定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
6.4.3 NULL の集約関数での取り扱い . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
6.4.4 空文字 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
6.5 シーケンス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
6.5.1 シーケンスの作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
6.5.2 シーケンスの操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
6.5.3 シーケンスを SQL 文で使用する . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
6.5.4 シーケンスと飛び番 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68

7 マルチユーザーでの利用 70
7.1 ユーザーの作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
7.1.1 ユーザーとロール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
7.1.2 スーパーユーザー . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
7.2 接続と認証 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
7.2.1 接続認証の設定を確認 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
7.2.2 接続ユーザーの指定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
7.2.3 パスワード認証の設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
7.2.4 パスワードの設定、変更 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
7.2.5 設定値の再読み込み . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
7.2.6 パスワード認証による接続 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
7.3 ネットワーク経由接続 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
7.3.1 ネットワーク経由接続の設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
7.3.2 PostgreSQL の再起動 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
7.3.3 psql を使ったネットワーク経由接続 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
7.4 アクセス権限 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
7.4.1 アクセス権限の付与 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
7.4.2 アクセス権限の確認 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
7.4.3 アクセス権限の取り消し . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
7.5 トランザクション . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
7.5.1 読み取り一貫性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
7.5.2 ロック機構と更新の競合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
7.5.3 デッドロック . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82

8 パフォーマンスチューニング 85

LPI-Japan 3 https://oss-db.jp
目次 目次

8.1 インデックス(索引) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
8.1.1 主キーのインデックス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
8.1.2 インデックスの作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
8.1.3 インデックスを削除する . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
8.1.4 インデックスは万能ではない . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
8.2 SQL 実行プランの分析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
8.2.1 インデックスが存在しない場合の SQL 実行プラン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
8.2.2 インデックスが存在する場合の SQL 実行プラン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
8.2.3 インデックスが存在しても必ず使われるわけではない . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
8.3 バキューム処理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
8.3.1 PostgreSQL のデータ管理方式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
8.3.2 VACUUM と VACUUM FULL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
8.3.3 VACUUM ANALYZE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
8.3.4 自動バキュームデーモン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
8.4 クラスタ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88

9 バックアップとリストア 90
9.1 バックアップ手法の整理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
9.1.1 主なバックアップ手法一覧 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
9.2 ファイルのコピー . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
9.3 pg_dump コマンドによるバックアップ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
9.4 pg_restore によるリストア . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91

10 Web アプリケーションとの連携 93
10.1 PHP とは? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
10.2 PHP の動作イメージ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
10.3 Apache と PHP 環境の設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
10.3.1 Apache と PHP をパッケージでインストール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
10.3.2 Apache+PHP の設定とテスト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
10.4 PHP と PostgreSQL の連携 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
10.4.1 データ検索ページの作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
10.4.2 フォームからのデータの取得方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
10.4.3 フォームからの入力を SQL 文に組み込む . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100

11 実習環境の構築方法 103
11.1 OS のインストール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
11.1.1 OS ユーザーの作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
11.1.2 セキュリティの設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
11.2 PostgreSQL のインストール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
11.2.1 手順 1 yum リポジトリの設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
11.2.2 手順 2 PostgreSQL のインストール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
11.2.3 手順 3 PostgreSQL 利用環境の初期設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
11.2.4 参考 yum を使わないインストール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
11.3 データベースの初期化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
11.3.1 データベースクラスタと initdb コマンド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
11.3.2 データディレクトリ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
11.3.3 initdb コマンドの実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
11.4 データベースを起動 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
11.5 動作の確認 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112

12 付録 実習の準備方法 113
12.1 データベースの作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
12.2 表の作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
12.3 データの入力 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114

LPI-Japan 4 https://oss-db.jp
目次 目次

まえがき

このたび、特定非営利活動法人エルピーアイジャパンは、オープンソースデータベース技術者教育に利用していただくことを
目的とした教材、
「オープンソースデータベース標準教科書」を開発し、インターネット上にて公開し、提供することとなりま
した。

この「オープンソースデータベース標準教科書」は、データベース技術習得のニーズの高まりに応えるべく、まったく初めて
データベースについて学習する人のために開発されました。既にリリースされ好評を得ている「Linux 標準教科書」「Linux
サーバー構築標準教科書」の姉妹版となります。

公開にあたっては、
「オープンソースデータベース標準教科書」に添付されたライセンス(クリエイティブ・コモンズ・ライセ
ンス表示 - 非営利 - 改変禁止)の下に公開されています。

本教材は、最新の技術動向に対応するため、随時アップデートを行っていきます。また、テキスト作成やアップデートについ
ては、意見交換のメーリングリストで、誰でもオープンに参加できます。

「オープンソースデータベース標準教科書」PDF 版、EPUB 版のダウンロード

• https://oss-db.jp/ossdbtext/text.shtml

メーリングリストの URL

• http://list.ospn.jp/mailman/listinfo/linux-text

意見交換用 Wiki サイト

• http://oss-db.jp/oss-db-wiki/

執筆者・制作担当者紹介

松田神一(第 1 版企画・進行担当)

オープンソースソフトウェアの進歩・普及と PC の低価格化・高性能化により、誰でも簡単に Web アプリケーションを構築


できるようになりました。ほとんどの Web アプリケーションでは、そのバックエンドにデータベースを利用しており、デー
タベースの利用・運用管理技術は IT 技術者にとって必須のものとなっています。

しかし、データベースの利用に使われる SQL 言語は、他のプログラム言語とは特性が大きく異なるため、習得が簡単ではあ


りません。データベースの初心者が、SQL 言語とデータベース運用管理技術の基礎を学ぶことのできる、教科書のようなもの
が必要と考えて、本書を企画しました。

宮原徹(第 1 版企画・執筆担当、第 2 版監修/株式会社びぎねっと)

本教科書は、データベースを初めて触る方でも迷わないためのガイドとなるよう、できるだけ簡潔に分かりやすく、実際に動
かしてみて理解できることを目標に執筆しました。一方で、データベースは OS と同じく奥が深いソフトウェアのため、本教
科書で解説できたのはほんのさわりに過ぎません。特に運用管理やパフォーマンス、データベース設計については、より詳細
な解説書にあたってみてください。この教科書を手に取った方のデータベーススキル修得の一助になれば幸いです。

喜田 紘介(第 2 版執筆担当/株式会社アシスト/ NPO 法人日本 PostgreSQL ユーザ会理事)

本教科書の第 1 版が登場した当時、ちょうど自社で PostgreSQL 担当に任命されたのを良く覚えています。データベース


や Linux については、仕事で必要になる度に手を止めて調べている程度にまだまだ初級者でした。ふと思い立って参加した
LPI-Japan 様の Linux セミナー(講師は本書の第 1 版を執筆された宮原さんでした。)をきっかけに多くのボランティアの方
で成り立つ技術コミュニティや勉強会に触れ、本教科書シリーズも当然のように全部ダウンロードしていました。本書のレベ
ル感は、当時の私は本業でデータベースをやっていたこともあり、1 周はサラッと手を動かしてみて、短時間で入門レベルを
総ざらいできたな、と感じていました。そのまま実行できるようコマンドが紹介されていますので初心者でも十分読み進める

LPI-Japan 5 https://oss-db.jp
目次 目次

ことができますし、私の場合は各実行例ごとに、もう少し違うコマンドでも状態を確認してみるなど、本書をきっかけに幅を
広げようと思って 2 周目、3 周目に取り組みました。それ以降は PostgreSQL のマニュアルを隅々まで読み込むような、詳細
を知らなければならない仕事をしてきたわけですが、自身がセミナー講師を担当する側になって、たまに本書を読み返してい
ます。これから学習される方向けの外せない部分や難しいポイントを確認しては「なるほど、この説明か。
」と、その度になに
か発見があり、より良い仕事の助けとさせていただきました。

さて、改訂版のお話をいただいたのは、2017 年夏、PostgreSQL の大規模メジャーバージョンアップであるバージョン 10 の


リリースが 2017 年秋に決定した頃でした。第 1 版当時の PostgreSQL 9.0 からは 7 つのバージョンを経ており、PostgreSQL
の機能・安定性・性能いずれも格段に向上しています。データベース製品の進化だけでなく、企業での OSS 利用が当たり前に
検討されるようになったことや、クラウド化をはじめとした IT インフラ環境の移り変わりなど、IT を取り巻く世の中の変化
も著しいもので、それに伴い有用な OSS 製品への興味は増していくばかりです。そんな中で、今から学習される方向けに本教
科書をアップデートし、より多くの方にお役立ていただけることは、このような世界で活動することのきっかけをくれた皆様
に対する一番の恩返しであると思い、ありがたくお話をお請けすることになりました。

改訂にあたって注力したことは、そのまま試せる豊富な実行例が本書の良い点ですので、2018 年時点で主流の OS、PostgreSQL


環境をお使いいただき、初めての方でも迷わず手を動かせるよう、コマンドの修正や補足説明、デフォルト値の変更などを行
いました。少し応用的と思うような説明も追加しています。
「そのまま試して結果を確認できる」という点では初心者の方にも
変わらずご理解いただけるようにしていますし、とはいえ少し高度な内容まで扱う事で一歩ステップアップしたい方にもより
満足いただけるようにできたと思います。

高橋征義(第 1 版 PDF 版・EPUB 版制作担当/株式会社達人出版会)

本教科書の PDF・EPUB 作成のお手伝いをいたしました。技術の習得において、紙の書籍で学ぶことの優位性はまだまだ大


きいものがありますが、特に進化の激しい業界においては、素早い制作と頻繁な改訂を得意とする電子書籍のメリットも小さ
くありません。さらに、今回採用した EPUB は、PC・タブレットからスマートフォンまで、一つのファイルで対応できるの
が特徴です。このような便利なテキストを提供することで、エンジニアの方々の技術力向上に貢献できれば幸いです。

中谷 徹(第 2 版 PDF 版・EPUB 版・Kindle 版制作担当/ NPO 法人 LPI-Japan)

本教科書第 2 版の PDF・EPUB の作成で協力させていただきました。第 2 版は第 1 版とは原稿のファイル形式も生成工程も


異なるため、第 1 版とルック&フィールが異なってますが、ご利用いただく上で最も良いワークアラウンドを選択したつもり
ですのでご容赦ください。皆様の学習のお役に立てていただければ幸いです。

木村 真之介 (意見交換用 Wiki サイト作成)

皆様の意見交換用の Wiki サイト (http://oss-db.jp/oss-db-wiki/) を開設しました。本教科書に関するご意見・ご質問・誤植


等の報告はぜひ Wiki サイトにお寄せください。本教科書が皆様の学習のお役に立てれば幸いです。

教科書開発に協力いただいた皆さん (第 1 版)

本教科書は、オープンソースソフトウェア開発の手法を取り入れ、何回かのフェーストゥフェースのミーティングと、メーリ
ングリストを使ったコミュニケーションで構成の企画および原稿のレビューなどを行いました。

• 案浦浩二
• 石井達夫(SRA OSS, Inc. 日本支社)
• 伊津野匡
• 上田和章(ネットプラン松山)
• 岡田賢治(株式会社ネットマイスター)
• 加藤剛(株式会社アークシステム)
• 綱川貴之(富士通株式会社)
• 遠山洋平(株式会社びぎねっと)
• 永安悟史(アップタイム・テクノロジーズ合同会社)
• 濱田大助(日本文理大学)
• 早坂一王(株式会社クレスコ)

LPI-Japan 6 https://oss-db.jp
目次 目次

• 古橋勇作(日本 HP)
• 本間裕一(株式会社エヌサイト)
• 三谷篤(SRA 西日本)
• 吉田貴紀(SRA OSS, Inc. 日本支社)
• 吉田敏和(NTT コムウェア株式会社)

著作権

本教材の著作権は特定非営利活動法人エルピーアイジャパンに帰属します。

All Rights Reserved. Copyright © LPI-Japan.

使用に関する権利

本教科書は、クリエイティブ・コモンズ・パブリック・ライセンスの「表示 - 非営利 - 改変禁止 4.0 国際 (CC BY-NC-ND


4.0)」でライセンスされています。

表示

本教材は、特定非営利活動法人エルピーアイジャパンに著作権が帰属するものであることを表示してください。

非営利

本教科書は、非営利目的で教材として自由に利用することができます。商業上の利得や金銭的報酬を主な目的とした営利目的
での利用は、特定非営利活動法人エルピーアイジャパンによる許諾が必要です。ただし、本教科書を利用した教育において、
本教科書自体の対価を請求しない場合は、営利目的の教育であっても基本的に利用できます。その場合も含め、LPI-Japan 事
務局までお気軽にお問い合わせください。

(※)営利目的の利用とは以下のとおり規定しております。
営利企業または非営利団体において、商業上の利得や金銭的報酬を目的に当教材の印刷実費以上の対価を受講者に請求して当
教材の複製を用いた研修や講義を行うこと。

改変禁止

本教科書は、改変せず使用してください。ただし、引用等、著作権法上で認められている利用を妨げるものではありません。
本教科書に対する改変は、特定非営利活動法人エルピーアイジャパンまたは特定非営利活動法人エルピーアイジャパンが認め
る団体により行われています。

• http://list.ospn.jp/mailman/listinfo/linux-text

本教材の使用に関するお問合せ先

特定非営利活動法人エルピーアイジャパン(LPI-Japan)事務局
〒106-0041 東京都港区麻布台 1-11-9 BPR プレイス神谷町 7F
TEL:03-3568-4482
E-Mail:info@lpi.or.jp

LPI-Japan 7 https://oss-db.jp
目次 目次

この教科書の目的

本書の目的は、データベースの経験の無い技術者を対象に、基本的なデータベースの操作方法について実習を通して学習す
ることにあります。SQL 文を使ってデータベースを操作したり、データベースの作成や管理についての基礎を学習します。
OSS-DB エンジニアのスキルを認定する OSS-DB 技術者認定試験のための教育および学習にも役立てていただけます。

想定している実習環境

本書での実習環境として、以下の環境を構築しています。

データベース

本書では、PostgreSQL バージョン 10.1 を利用します。バージョンに依存する内容はほとんど無いため、その他のバージョン


でも学習は可能ですが、表示など一部異なる場合があります。インストールは RPM パッケージから行っていますが、独自に
ソースコードからインストールしてもかまいません。

OS

本書では、CentOS バージョン 7 を利用します。PostgreSQL のバージョン 10.1 が動作すれば、その他のディストリビュー


ションでもかまいません。

マシンの構成と HDD

マシンの構成は、市販されている一般的な構成の PC を想定しています。その PC に Linux と PostgreSQL をインストールし


ます。よって、HDD の内容は完全にクリアされます。そのため HDD の中を消してよい PC を用意するか、HDD の中身をあ
らかじめバックアップしておく必要があります。

ネットワーク

利用する PC は、ネットワークで接続されており、インターネットにも接続できることを前提としています。接続されていな
い場合には、別の方法で PostgreSQL のパッケージをダウンロードおよびコピーしてインストールを行ってください。

仮想環境

専用の PC 環境が用意できない場合は仮想環境を使う方法もあります。仮想環境とは Windows や Mac OS X 上で PC をソ


フトウェアで実現し、稼働している OS 上にあたかも別のマシンが動作しているかの様に振る舞うもので、たとえば VMware
社の VMware Workstation(Windows) や VMware Fusion(Mac OS X)、Parallels 社の Parallels Desktop(Mac OS X) や
VirtualBox、Linux KVM 等があげられます。

クラウド環境

クラウド上に用意した環境を使う方法もあります。CentOS、またはその他の Linux が動作する環境に PostgreSQL がインス


トールしてあれば、本書の内容を学習できます。

その他の情報源

• オープンソースデータベース技術者認定試験
– https://oss-db.jp/
• 日本 PostgreSQL ユーザ会(JPUG)
– https://www.postgresql.jp/
• PostgreSQL のマニュアル (JPUG のサイトから「日本語ドキュメント」)

LPI-Japan 8 https://oss-db.jp
目次 目次

– https://www.postgresql.jp/document/
• メーリングリスト(pgsql-jp)
– https://www.postgresql.jp/npo/mailinglist
• Let’s PostgreSQL
– http://lets.postgresql.jp/

LPI-Japan 9 https://oss-db.jp
1 SQL によるデータベースの操作基礎編

1 SQL によるデータベースの操作基礎編

データベースの操作には SQL を使用します。この章では SQL を利用したデータベースの操作の基礎を学びます。すでに作


成されているデータベースに対して SQL を使ってデータの検索や更新などを行ってみましょう。

1.1 データベース利用の基本パターン

データベースの役目は、利用者からの要求に応じて様々なデータを管理することです。それらを分類すると、以下のようなパ
ターンに分けることができます。

• 表を作成する(CREATE TABLE)
「表(TABLE)
データベースにデータを保管するには、 」を作成する必要があります。表の項目名や、データの種類(文
字や数値など)を指定する必要があります。

• データを挿入する(INSERT)
データベースにデータを保管することを「挿入 (INSERT)」と呼びます。データの種類に合わせたデータを挿入する必
要があります。

• データを検索する(SELECT)
データベースからデータを取り出すことを「検索 (SELECT)」と呼びます。条件を指定して一部を取り出したり、複数
の表から組み合わせでデータを取り出すなど、様々な検索が行えるのがデータベースのメリットです。

• データを更新する(UPDATE)
データベースのデータを修正することを「更新 (UPDATE)」と呼びます。すべてのデータを一括で修正したり、条件を
指定して一部のデータだけを修正したりできます。

• データを削除する(DELETE)
データベースからデータを取り除くことを「削除 (DELETE)」と呼びます。条件を指定して、取り除きたいデータを絞
り込みます。

1.2 psql ツールの利用

PostgreSQL に対して SQL を実行してデータベースを操作するには、psql ツール(以下 psql)を利用します。

注意:ここからの作業は第 11 章で説明しているセットアップが行われていることを前提としています。うまく作業が行えな
い場合には、セットアップが正しく行われていることを確認してください。

1.2.1 psql でデータベースに接続する

psql は Linux 上で実行できるコマンドとして提供されているので、利用するには Linux にログインする必要があります。

■1.2.1.1 ユーザー postgres で作業可能にする

psql を実行するには、シェルで作業しているユーザーをユーザー postgres に切り替えます。

ユーザー postgres は、Linux に PostgreSQL をパッケージでインストールした時に自動的に作成されているユーザーです。管


理者ユーザー root でログインした後、su コマンドでユーザー postgres に切り替えます。

su コマンドでユーザーを切り替えるには、以下のように su コマンドに-(ハイフン)をつけて実行するようにしてください。
[root@localhost ~]# su - postgres
[postgres@localhost ~]$

LPI-Japan 10 https://oss-db.jp
1 SQL によるデータベースの操作基礎編 1.2 psql ツールの利用

環境によっては、root ユーザーでログインすることができず、代わりに sudo 権限を有する管理者ユーザーが提供されている


場合があります。

以下の例では sudo 権限を持つユーザー centos でログインし、postgres ユーザーに変更する例です。


[centos@localhost ~]$ sudo su - postgres
[postgres@localhost ~]$

本書では OS の管理者ユーザー root で操作可能なものとして例示しますが、自身の環境に応じて適宜読み替えるようにしてく


ださい。

■1.2.1.2 データベース一覧を表示する

psql に-l オプションをつけて実行します。psql は PostgreSQL に接続し、現在作成されているデータベースの一覧を表示し


ます。
[postgres@localhost ~]$ psql -l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+---------+-------+-----------------------
ossdb | postgres | UTF8 | C | C |
postgres | postgres | UTF8 | C | C |
template0 | postgres | UTF8 | C | C | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | C | C | =c/postgres +
| | | | | postgres=CTc/postgres
(4 rows)

■1.2.1.3 データベースに接続する

psql を利用してデータベースに接続します。PostgreSQL は同時に複数のデータベースを管理できますが、psql ではそのうち


の 1 つを選んで接続して操作します。

以下のように、psql の引数として接続したいデータベースの名前を指定して実行します。
[postgres@localhost ~]$ psql ossdb
psql (10.1)
Type "help" for help.

ossdb=#

接続に成功すると、プロンプトが表示されて SQL 文などの実行命令を受け付ける状態になります。接続できない場合には、


PostgreSQL が正しく実行されているか、ユーザー postgres で psql を実行しているかを確認してください。

1.2.2 psql のヘルプを表示する

psql のヘルプを表示します。help と入力します。


ossdb=# help
You are using psql, the command-line interface to PostgreSQL.
Type: \copyright for distribution terms
\h for help with SQL commands
\? for help with psql commands
\g or terminate with semicolon to execute query
\q to quit

LPI-Japan 11 https://oss-db.jp
1 SQL によるデータベースの操作基礎編 1.2 psql ツールの利用

1.2.3 メタコマンド

psql は SQL を受け付けて、PostgreSQL に対して SQL を実行する他に、\(バックスラッシュ)で始まるメタコマンドを受


け付けます。メタコマンドは、ヘルプを表示したり、データベースに対する操作を行ったり、様々な種類のコマンドが用意さ
れています。

■1.2.3.1 psql メタコマンド\h

利用できる SQL のヘルプが確認できます。


ossdb=# \h
Available help:
ABORT
ALTER AGGREGATE
ALTER COLLATION
ALTER CONVERSION
ALTER DATABASE
(以下略)

■1.2.3.2 psql メタコマンド\h SQL コマンド

psql メタコマンド\h の引数に SQL コマンドを指定すると、その SQL コマンドのヘルプが確認できます。SQL コマンドの指


定は大文字でも小文字でも構いません。
ossdb=# \h DELETE
Command: DELETE
Description: delete rows of a table
Syntax:
[ WITH [ RECURSIVE ] with_query [, ...] ]
DELETE FROM [ ONLY ] table_name [ * ] [ [ AS ] alias ]
[ USING using_list ]
[ WHERE condition | WHERE CURRENT OF cursor_name ]
[ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ]

■1.2.3.3 psql メタコマンド\?

psql メタコマンド\?で、利用できる psql メタコマンドのヘルプが確認できます。


ossdb=# \?
General
\copyright show PostgreSQL usage and distribution terms
\crosstabview [COLUMNS] execute query and display results in crosstab
\errverbose show most recent error message at maximum verbosity
\g [FILE] or ; execute query (and send results to file or |pipe)
(以下略)

1.2.4 psql を終了する

psql を終了するには、psql メタコマンドの\q を入力します。

LPI-Japan 12 https://oss-db.jp
1 SQL によるデータベースの操作基礎編 1.2 psql ツールの利用

ossdb=# \q
[postgres@localhost ~]$

1.2.5 表の確認

作成されている表を確認するには psql メタコマンド\d を利用します。


ossdb=# \d
List of relations
Schema | Name | Type | Owner
--------+----------+-------+----------
public | customer | table | postgres
public | orders | table | postgres
public | prod | table | postgres
(3 rows)

1.2.6 表定義の確認

表がどのような項目を持っているのかを確認するには psql メタコマンド\d に確認したい表名を付けて実行します。


ossdb=# \d customer
Table "public.customer"
Column | Type | Collation | Nullable | Default
---------------+---------+-----------+----------+---------
customer_id | integer | | |
customer_name | text | | |

ossdb=# \d orders
Table "public.orders"
Column | Type | Collation | Nullable | Default
-------------+-----------------------------+-----------+----------+---------
order_id | integer | | |
order_date | timestamp without time zone | | |
customer_id | integer | | |
prod_id | integer | | |
qty | integer | | |

ossdb=# \d prod
Table "public.prod"
Column | Type | Collation | Nullable | Default
-----------+---------+-----------+----------+---------
prod_id | integer | | |
prod_name | text | | |
price | numeric | | |

1.2.7 表とテーブル、リレーション

本書ではデータの格納先を「表」と記述していますが、psql の実行結果には「リレーション」や「テーブル」と表記されてい
ます。基本的に表とテーブルは同じものと考えて構いません。リレーションは、本来的な意味ではデータの集合を指していま
すが、リレーショナルデータベースではリレーションは表形式で表されますので、リレーションと表もほぼ同義と考えて良い
でしょう。同様に、「行」と「レコード」や「タプル」
、「列」と「カラム」も同義語になります。

LPI-Japan 13 https://oss-db.jp
1 SQL によるデータベースの操作基礎編 1.3 pgAdmin4(GUI ツール)

1.3 pgAdmin4(GUI ツール)

psql に並ぶ標準ツールとして pgAdmin4 も用意されています。pgAdmin4 は GUI 管理ツールで、Windows などの GUI 環境


では psql よりも簡単に使うことができます。(Linux 版の pgAdmin4 も提供されています。Linux の構築時点で GUI 利用を
前提に作成している場合は有用でしょう。)

• pgAdmin プロジェクト
– https://www.pgadmin.org/

Windows 版の PostgreSQL をインストールすると、一緒に pgAdmin4 もインストールされますし、上記 URL から pgAdmin4


を個別にインストールして外部のデータベースサーバーに接続して使用することもできます。

図 1 psql と pgAdmin4

複数の管理対象データベースを登録しておいて、操作対象を切り替えながらデータベースの稼動状態、表や索引の一覧やそれ
ぞれの定義情報、状態を確認できます。

代表的な機能としては、データベースを選択した状態で上部メニューより「ツール」→「クエリツール」を選択すると SQL を
実行したり、よく使う SQL を保存しておくことができます。

データベース名を右クリックして表示されるメニューから「Backup」したり、バックアップを使った「Restore」で簡単にデー
タをファイルに出力したり、戻すこともできます。テーブル名を右クリックすると「先頭 n 件のデータを取得」したり、テー
ブルのメンテナンスが行えるといった形で、GUI ならではの直感的な操作が可能です。ぜひいろいろ試してみてください。

1.4 SQL の実行方法

psql は、psql メタコマンドと SQL コマンドの 2 つを受け付けて実行します。psql メタコマンドは必ず\から始まるので区別


されます。psql メタコマンド以外は、PostgreSQL データベースに対する SQL コマンドとして実行されます。psql では、改
行やスペースは単に SQL コマンドの整形のために用いるもので、SQL 構文としての意味を持ちません。SQL コマンドの実行
をサーバーに指示する;(セミコロン)または psql メタコマンド\g を文の末尾に記述することで、文全体をひとつの命令とし
てサーバーに送信し、処理が行われます。SQL コマンドの実行は、行末に;(セミコロン)をつけて入力を行うか、psql メタ
コマンド\g を実行します。改行しても複数行に渡って入力を受け付けるので、SQL 文の入力が終わったら忘れずに;(セミコ
ロン)か、psql メタコマンド\g を実行してください。

1.4.1 複数行入力のプロンプト表示

psql で複数行入力をした時に表示されるプロンプトは、通常時と複数行入力中の 2 行目以降で異なります。

LPI-Japan 14 https://oss-db.jp
1 SQL によるデータベースの操作基礎編 1.4 SQL の実行方法

図 2 pgAdmin4 を用いた状態確認

図 3 pgAdmin4 から SQL 実行

LPI-Japan 15 https://oss-db.jp
1 SQL によるデータベースの操作基礎編 1.4 SQL の実行方法

■1.4.1.1 psql のプロンプト

表記 動作モード

データベース名=# 通常のプロンプト
データベース名-# 2 行目以降のプロンプト

プロンプトに何を表示するかは、psql の内部変数 PROMPT1、PROMPT2 で定義されています。たとえば 2 行目以降のプロ


ンプトに何も表示したくない場合、psql メタコマンドの\unset で PROMPT2 の変数値を解除します。
ossdb=# 1st line
ossdb-# 2nd line
ossdb-# 3rd line;
ERROR: syntax error at or near "1"
行 1: 1st line
^
ossdb=# \unset PROMPT2
ossdb=# 1st line
2nd line
3rd line;
ERROR: syntax error at or near "1"
行 1: 1st line
^

本書では、複数行に渡る SQL を電子版からのコピー&ペーストで簡単に実行できるように実行例を掲載しています。実習時


には 2 行目以降のプロンプトが出ているのが正しい表示です。

1.4.2 テキストファイルからの読み込み実行

psql はテキストファイルから読み込んだ内容を実行する機能があります。同じ処理を何度も繰り返し実行したい場合には、あ
らかじめメタコマンドや SQL コマンドをファイルに記述して、psql に読み込ませて実行できます。

■1.4.2.1 ファイルを読み込ませる場合の psql の構文

$ psql -f ファイル名 [データベース名] [ユーザー名]

以下の例では、メタコマンド\d を記述したファイル test.sql を psql に読み込ませて実行しています。


[postgres@localhost ~]$ cat test.sql
\d
[postgres@localhost ~]$ psql -f test.sql ossdb
List of relations
Schema | Name | Type | Owner
--------+----------+-------+----------
public | customer | table | postgres
public | orders | table | postgres
public | prod | table | postgres
(3 rows)

LPI-Japan 16 https://oss-db.jp
1 SQL によるデータベースの操作基礎編 1.5 データの検索(SELECT)

1.5 データの検索(SELECT)

データの検索はデータベース利用の一番の基本です。データベースは様々な種類のデータを表形式で保管しているので、その
データを必要な形で取り出すのがデータの検索です。データの検索には SQL の SELECT 文を使用します。

■1.5.0.1 SELECT 文の基本構文


SELECT [DISTINCT] * | SELECT 項目リスト
FROM 表名 [,…]
[WHERE 検索条件式]
[GROUP BY グループ化式]
[HAVING 検索条件式]
[ORDER BY 並べ替え式]

1.5.1 全件全項目検索

データベースの表データを全件、全項目で取り出すのが全件全項目検索です。*(アスタリスク) を指定することで、対象とな
る検索表の全項目を検索します。

■1.5.1.1 全件全項目検索の SELECT 文

SELECT * FROM 表

以下の例では、customer 表、prod 表、orders 表の全件全項目検索を行っています。


ossdb=# SELECT * FROM customer;
customer_id | customer_name
-------------+---------------
1 | 佐藤商事
2 | 鈴木物産
3 | 高橋商店
(3 rows)

ossdb=# SELECT * FROM prod;


prod_id | prod_name | price
---------+-----------+-------
1 | みかん | 50
2 | りんご | 70
3 | メロン | 100
(3 rows)

ossdb=# SELECT * FROM orders;


order_id | order_date | customer_id | prod_id | qty
----------+----------------------------+-------------+---------+-----
1 | 2018-01-22 12:34:51.510398 | 1 | 1 | 10
2 | 2018-01-22 12:34:58.875188 | 2 | 2 | 5
3 | 2018-01-22 12:35:07.440391 | 3 | 3 | 8
4 | 2018-01-22 12:35:16.847541 | 2 | 1 | 3
5 | 2018-01-22 12:35:26.164922 | 3 | 2 | 4
(5 rows)

LPI-Japan 17 https://oss-db.jp
1 SQL によるデータベースの操作基礎編 1.5 データの検索(SELECT)

1.5.2 SELECT 項目リスト

SELECT 文で検索したい列名をカンマ区切りで並べて指定します。

■1.5.2.1 SELECT 項目リストを使った SELECT 文


SELECT 列名 [, 列名...] FROM 表

以下の例では、prod 表から prod_name 列、price 列のみ検索しています。


ossdb=# SELECT prod_name,price FROM prod;
prod_name | price
-----------+-------
みかん | 50
りんご | 70
メロン | 100
(3 rows)

1.5.3 WHERE 句による絞り込み検索

検索で取り出すデータ行を条件で絞り込むには、WHERE 句を使用します。

■1.5.3.1 WHERE 句の構文


WHERE 列名 条件式 条件値

■1.5.3.2 主な条件式

条件式 意味

= 等しい
<> 等しくない
> よりも大きい
< よりも小さい(未満)
>= 以上
<= 以下
BETWEEN 範囲指定
LIKE 部分一致

それぞれの条件式を使ってどのような結果が得られるか見てみましょう。

■1.5.3.3 等号、不等号

• 等しい (=)、等しくない (<>)


ある列の値が指定した条件値と等しい、あるいは等しくないデータを取り出します。条件値を文字列として指定する場
合には'(シングルクォート) で括ります。以下の例では、customer 表から customer_id 列の値が 2 の行データを検索
します。

LPI-Japan 18 https://oss-db.jp
1 SQL によるデータベースの操作基礎編 1.5 データの検索(SELECT)

ossdb=# SELECT * FROM customer WHERE customer_id = 2;


customer_id | customer_name
-------------+---------------
2 | 鈴木物産
(1 row)

以下の例では、customer 表から customer_id 列の値が 2 以外の行データを検索します。


ossdb=# SELECT * FROM customer WHERE customer_id <> 2;
customer_id | customer_name
-------------+---------------
1 | 佐藤商事
3 | 高橋商店
(2 rows)

以下の例では、customer 表から customer_name 列の値が「佐藤商事」の行データを検索します。文字列データを指定する場


合、'(シングルクォート)で前後を括ります。

ossdb=# SELECT * FROM customer WHERE customer_name = ' 佐藤商事';


customer_id | customer_name
-------------+---------------
1 | 佐藤商事
(1 row)

• よりも大きい (>)、よりも小さい(未満)(<)
ある列の値が指定した条件値よりも大きい、あるいは小さい(未満)データを取り出します。以下の例では、prod 表か
ら price 列の値が 70 よりも大きい行データを検索します。price 列の値が 70 のりんごは含まれません。
ossdb=# SELECT * FROM prod WHERE price > 70;
prod_id | prod_name | price
---------+-----------+-------
3 | メロン | 100
(1 row)

• 以上 (>=)、以下 (<=)
ある列の値が指定した条件値以上、あるいは以下のデータを取り出します。以下の例では、prod 表から price 列の値が
70 以上の行データを検索します。price 列の値が 70 のりんごも含まれます。
ossdb=# SELECT * FROM prod WHERE price >= 70;
prod_id | prod_name | price
---------+-----------+-------
2 | りんご | 70
3 | メロン | 100
(2 rows)

■1.5.3.4 範囲検索

• A 以上 B 以下
条件式に 2 つの値を指定し、その間の範囲に該当するデータを取り出します。以下の例では、prod 表から price 列の値
が 10 以上 80 以下の行データを検索します。price 列が 50 のみかん、70 のりんごが含まれ、範囲外であるメロンは含
まれません。
ossdb=# SELECT * FROM prod WHERE price BETWEEN 10 AND 80;
prod_id | prod_name | price
---------+-----------+-------
1 | みかん | 50

LPI-Japan 19 https://oss-db.jp
1 SQL によるデータベースの操作基礎編 1.5 データの検索(SELECT)

2 | りんご | 70
(2 rows)

この結果は、不等号を使った「以上、以下」を組み合わせた場合と同じです。
ossdb=# SELECT * FROM prod WHERE price >= 10 AND price <= 80;
prod_id | prod_name | price
---------+-----------+-------
1 | みかん | 50
2 | りんご | 70
(2 rows)

■1.5.3.5 部分一致検索

部分一致検索には LIKE 演算子を用います。文字列の一部に指定した文字列を含むデータを取り出します。

• 指定した値がデータのどこかに一致(中間一致検索)
文字列中に「ん」を含むものを検索します。検索したい文字を % で囲みました。文字列なので’(シングルクォート) で
囲む点はこれまでの検索と同じです。以下の例では、文字列中に「ん」を含む「みかん」
「りんご」が該当します。
(「メ
ロン」は「ン」を含みますが、コンピューターは「ん」と「ン」を通常は区別します。

ossdb=# SELECT * FROM prod WHERE prod_name LIKE '% ん %';


prod_id | prod_name | price
---------+-----------+-------
1 | みかん | 50
2 | りんご | 70
(2 rows)

• 前方一致検索、後方一致検索
文字列の最後に「ん」を含むものを検索します。先ほど同様 % と組み合わせますが、文字列の最後であることを表すた
「ん」の後の % は指定しません。このような検索を後方一致検索と呼びます。以下の例では、文字列の最後に「ん」
めに、
を含む「みかん」が該当します。

ossdb=# SELECT * FROM prod WHERE prod_name LIKE '% ん';


prod_id | prod_name | price
---------+-----------+-------
1 | みかん | 50
(1 row)

前方一致検索の場合は、検索したい文字列を先頭にします。(例:’ り %’ とすると「りんご」が該当)

• 該当する文字位置を指定する場合
指定した値が文字列中の何文字目にあるか指定する検索です。先ほどの % は複数文字を表しましたが、その代わりに 1
文字につきひとつの_(アンダースコア)を使います。以下の例では、3 文字目が「ん」であるものを検索するためにア
ンダースコアを 2 つ並べて「__ん」を条件にしており、結果として「みかん」が検索されています。アンダースコア 1
文字分では結果は得られません。

ossdb=# SELECT * FROM prod WHERE prod_name LIKE '__ん';


prod_id | prod_name | price
---------+-----------+-------
1 | みかん | 50
(1 row)
ossdb=# SELECT * FROM prod WHERE prod_name LIKE '_ん';
prod_id | prod_name | price
---------+-----------+-------

LPI-Japan 20 https://oss-db.jp
1 SQL によるデータベースの操作基礎編 1.6 ORDER BY 句による並べ替え

(0 rows)

• 指定した文字列を「含まない」検索
一致=に対して、不一致を表す<>があったように、LIKE に対してその文字列を含まないことを表す NOT LIKE が用意さ
れています。以下の例では、NOT LIKE を使って「ん」を含まないものを検索します。
「メロン」のみ該当します。

ossdb=# SELECT * FROM prod WHERE prod_name NOT LIKE '% ん %';
prod_id | prod_name | price
---------+-----------+-------
3 | メロン | 100
(1 row)

同様に「前方(後方)不一致検索」も可能です。

ossdb=# SELECT * FROM prod WHERE prod_name NOT LIKE '% ん';
prod_id | prod_name | price
---------+-----------+-------
2 | りんご | 70
3 | メロン | 100
(2 rows)

1.6 ORDER BY 句による並べ替え

検索結果を指定した順番に並べ替えるには、ORDER BY 句を使用します。リレーショナルデータベースではデータを集合とし
て扱うため、並び順を指定しない限り結果の表示順を保証しません。ORDER BY 句で並べ替えを指定することで、期待した
順番で行データを取り出すことができます。DESC を指定すると、降順で並べ替えが行われます。

■1.6.0.1 ORDER BY 句の構文


ORDER BY 列名 [DESC]

以下の例では、prod 表から price 列の値で昇順、降順で並べ替えをしています。


ossdb=# SELECT * FROM prod ORDER BY price;
prod_id | prod_name | price
---------+-----------+-------
1 | みかん | 50
2 | りんご | 70
3 | メロン | 100
(3 rows)

ossdb=# SELECT * FROM prod ORDER BY price DESC;


prod_id | prod_name | price
---------+-----------+-------
3 | メロン | 100
2 | りんご | 70
1 | みかん | 50
(3 rows)

1.7 表の結合

リレーショナルデータベースでは、表と表を結びつけてデータを取り出すことができます。表を結びつけることを「結合」と
呼びます。

LPI-Japan 21 https://oss-db.jp
1 SQL によるデータベースの操作基礎編 1.7 表の結合

1.7.1 JOIN 句による結合

結合を行うには JOIN 句で結合したい列を指定します。指定された列の値を比較し、同じ値のデータを結合します。

■1.7.1.1 JOIN 〜 ON 構文
FROM 表 1
JOIN 表 2 ON 表 1. 列 = 表 2. 列

単一の表に対する SELECT では、対象の表を FROM 句で指定してきましたが、結合では二つ目の表を指定するために JOIN 句


のあとに表名を続けます。このとき表の指定とセットで使う ON 句も重要です。ON 句の後には結合条件を記述します。二つの
表同士で関連する列を結合条件に指定し、この値が一致するデータが結果として取得されます。

結合の使い方を順を追ってみていきましょう。

• 単一の表を検索
以下の例では、結合を行う元となる表である orders 表の order_id 列、customer_id 列、prod_id 列、qty 列を SELECT
項目リストに指定した SELECT 文です。
ossdb=# SELECT order_id,customer_id,prod_id,qty FROM orders;
order_id | customer_id | prod_id | qty
----------+-------------+---------+-----
1 | 1 | 1 | 10
2 | 2 | 2 | 5
3 | 3 | 3 | 8
4 | 2 | 1 | 3
5 | 3 | 2 | 4
(5 rows)
-- ↑ ↑
-- 「customer 表」「prod 表」から合致する値を取得する

この検索結果のうち、customer_id 列と prod_id 列はそれぞれ customer 表、prod 表から別の値を持ってきて置き換えるこ


とにします。

• orders 表と customer 表を結合


FROM 句または JOIN 句で複数の表を指定した場合には、SELECT 項目リストや結合条件では「表名. 列名」と指
定します。まずは orders 表と customer 表の 2 つの表を JOIN 句で結合します。ここでは先の結果と比較するため、
order_id 列、customer_id 列と並べて、新たに customer 表から得られた customer_name 列の値を表示します。
ossdb=# SELECT orders.order_id,orders.customer_id,customer.customer_name
FROM orders
JOIN customer ON orders.customer_id = customer.customer_id;
order_id | customer_id | customer_name
----------+-------------+---------------
1 | 1 | 佐藤商事
2 | 2 | 鈴木物産
3 | 3 | 高橋商店
4 | 2 | 鈴木物産
5 | 3 | 高橋商店
(5 rows)

customer 表には以下のデータが格納されていましたので、customer_id が「1」のときは「佐藤商事」、


「2」のときは「鈴木物
産」というように、行ごとに関連する値が customer 表から検索されていることがわかります。

LPI-Japan 22 https://oss-db.jp
1 SQL によるデータベースの操作基礎編 1.7 表の結合

customer_id customer_name

1 佐藤商事
2 鈴木物産
3 高橋商店

図 4 orders 表と customer 表の JOIN

• orders 表と prod 表を結合


同様に、orders 表と prod 表を JOIN 句で結合します。
ossdb=# SELECT orders.order_id,prod.prod_name
FROM orders
JOIN prod ON orders.prod_id = prod.prod_id;
order_id | prod_name
----------+-----------
1 | みかん
2 | りんご
3 | メロン
4 | みかん

LPI-Japan 23 https://oss-db.jp
1 SQL によるデータベースの操作基礎編 1.7 表の結合

5 | りんご
(5 rows)

• 3 つの表を結合
この 2 つの JOIN 句を 1 つの SELECT 文にまとめます。最初に実行した SELECT 文は以下の通りでした。
SELECT order_id,customer_id,prod_id,qty
FROM orders

最初の SELECT 文と比較して、SELECT 項目リストの置き換わりと、JOIN 句が 2 つ並べて追加されている点に注目してく


ださい。
ossdb=# SELECT orders.order_id,customer.customer_name,prod.prod_name,orders.qty
FROM orders
JOIN customer ON orders.customer_id = customer.customer_id
JOIN prod ON orders.prod_id = prod.prod_id;
order_id | customer_name | prod_name | qty
----------+---------------+-----------+-----
1 | 佐藤商事 | みかん | 10
2 | 鈴木物産 | りんご | 5
3 | 高橋商店 | メロン | 8
4 | 鈴木物産 | みかん | 3
5 | 高橋商店 | りんご | 4
(5 rows)

customer_id を customer 表から取得した店名、prod_id を prod 表から取得した商品名に置き換えることができました。

図 5 3 つの表の JOIN

LPI-Japan 24 https://oss-db.jp
1 SQL によるデータベースの操作基礎編 1.8 行データの入力(INSERT)

1.7.2 表別名の利用

SQL 文の中で何度も使用する表名は、FROM 句、または JOIN 句で別名を指定できます。短い別名を指定すれば、SQL 文を


短くして見やすくすることができます。

■1.7.2.1 表別名の指定方法

FROM 表名 別名
JOIN 表名 別名

前の JOIN 句による結合を行う SQL 文に表別名を適用すると、以下のようになります。


ossdb=# SELECT o.order_id,c.customer_name,p.prod_name,o.qty
FROM orders o
JOIN customer c ON o.customer_id = c.customer_id
JOIN prod p ON o.prod_id = p.prod_id;
order_id | customer_name | prod_name | qty
----------+---------------+-----------+-----
1 | 佐藤商事 | みかん | 10
2 | 鈴木物産 | りんご | 5
3 | 高橋商店 | メロン | 8
4 | 鈴木物産 | みかん | 3
5 | 高橋商店 | りんご | 4
(5 rows)

1.8 行データの入力(INSERT)

表に行データを入力するには、INSERT 文を使用します。

■1.8.0.1 INSERT 文の構文


INSERT INTO 表名 (列名 [,…])
VALUES (値 [,...])

値に文字列データを指定する場合には、'(シングルクォート)で括る必要があります。

ossdb=# INSERT INTO prod(prod_id,prod_name,price) VALUES (4,' バナナ',30);


INSERT 0 1
ossdb=# SELECT * FROM prod;
prod_id | prod_name | price
---------+-----------+-------
1 | みかん | 50
2 | りんご | 70
3 | メロン | 100
4 | バナナ | 30
(4 rows)

1.9 データの更新(UPDATE)

行データを更新するには、UPDATE 文を使用します。

LPI-Japan 25 https://oss-db.jp
1 SQL によるデータベースの操作基礎編 1.10 行データの削除(DELETE)

■1.9.0.1 UPDATE 文の構文


UPDATE 表名
SET 列名 = 値
WHERE 条件式

以下の例では、prod 表の prod_id 列の値が 4 の行データを、price 列の値を 40 に更新しています。


ossdb=# UPDATE prod SET price = 40 WHERE prod_id = 4;
UPDATE 1
ossdb=# SELECT * FROM prod;
prod_id | prod_name | price
---------+-----------+-------
1 | みかん | 50
2 | りんご | 70
3 | メロン | 100
4 | バナナ | 40
(4 rows)

更新値は、既存の行データの値に対する演算で設定することもできます。以下の例では、prod 表の price 列の値を一律 10 増


加させています(その後、元に戻しています)。
ossdb=# UPDATE prod SET price = price + 10;
UPDATE 4
ossdb=# SELECT * FROM prod;
prod_id | prod_name | price
---------+-----------+-------
1 | みかん | 60
2 | りんご | 80
3 | メロン | 110
4 | バナナ | 50
(4 rows)

ossdb=# UPDATE prod SET price = price - 10;


UPDATE 4

1.10 行データの削除(DELETE)

行データを削除するには、DELETE 文を使用します。DELETE 文は WHERE 句で指定した条件式に適合した行データをす


べて削除します。WHERE 句を指定しなかった場合には、指定された表の行データはすべて削除されます。

■1.10.0.1 DELETE 文の構文


DELETE FROM 表名
WHERE 条件式

以下の例では、prod 表から prod_id 列の値が 4 の行データを削除しています。


ossdb=# DELETE FROM prod WHERE prod_id = 4;
DELETE 1
ossdb=# SELECT * FROM prod;
prod_id | prod_name | price

LPI-Japan 26 https://oss-db.jp
1 SQL によるデータベースの操作基礎編 1.10 行データの削除(DELETE)

---------+-----------+-------
1 | みかん | 50
2 | りんご | 70
3 | メロン | 100
(3 rows)

LPI-Japan 27 https://oss-db.jp
2 データ型

2 データ型

PostgreSQL では、データをいくつかのデータ型に分類して保管しています。これまで利用してきたサンプルデータベースで
は、以下の 3 つのデータ型を使用しています。

• 数値データ型
• 文字列データ型
• 日付データ型

2.1 数値データ型

数値データ型は、いわゆる「数字」を保管するためのデータ型です。データベースでは四則演算をはじめ、様々な数値演算の
ための関数などが用意されているので、簡単に数値データを加工して取り扱うことができます。

2.1.1 integer 型

整数のデータ型です。-2147483648 から +2147483647 までの整数値を格納することができます。整数値のため、小数点以下


の値は格納されません。小数点以下の値は四捨五入されます。

以下の例では、値を 30.4 で INSERT すると小数点以下は四捨五入されて 30 で格納されています。値を 30.5 に UPDATE す


ると四捨五入されて 31 で格納されています。

ossdb=# INSERT INTO prod(prod_id,prod_name,price) VALUES (4,' バナナ',30.4);


INSERT 0 1
ossdb=# SELECT * FROM prod WHERE prod_id = 4;
prod_id | prod_name | price
---------+-----------+-------
4 | バナナ | 30
(1 row)

ossdb=# UPDATE prod SET price = 30.5 WHERE prod_id = 4;


UPDATE 1
ossdb=# SELECT * FROM prod WHERE prod_id = 4;
prod_id | prod_name | price
---------+-----------+-------
4 | バナナ | 31
(1 row)

2.1.2 numeric 型

任意の精度の数値データ型です。小数点以下の値を含む数値を格納することができます。小数点より上は 131072 桁まで、小


数点より下は 16383 桁までの桁数を指定できます。桁数を指定する場合、整数と小数点以下を合わせた桁数を「精度」、小数
点以下の桁数を「位取り」と呼び、以下のように指定します。

numeric(精度, 位取り)

たとえば「numeric(6,2)」と指定すると、全体の桁数は 6 桁、小数点以下は 2 桁、整数部は 6-2 で 4 桁なので最大 9999.99 ま


での値を格納することができます。

以下の例では、numeric 型の id 列を持った numeric_test 表を作成しています。整数部は 4 桁なので、5 桁の値である 19999


を指定した INSERT 文はエラーとなっています。

LPI-Japan 28 https://oss-db.jp
2 データ型 2.2 文字列データ型

ossdb=# CREATE TABLE numeric_test(


id numeric(6,2));
CREATE TABLE
ossdb=# \d numeric_test
Table "public.numeric_test"
Column | Type | Collation | Nullable | Default
--------+--------------+-----------+----------+---------
id | numeric(6,2) | | |

ossdb=# INSERT INTO numeric_test VALUES (9999.99);


INSERT 0 1
ossdb=# INSERT INTO numeric_test VALUES (19999.99);
ERROR: numeric field overflow
DETAIL: A field with precision 6, scale 2 must round to an absolute value less than 10^4.

2.1.3 その他の数値型

PostgreSQL は integer 型、numeric 型以外の数値型も備えています。これらはデータの性質に合わせたデータベースへの保管


や、互換性の維持などの目的のために用意されています。

■2.1.3.1 数値型一覧表

データ型 サイズ 範囲

smallint 2 バイト -32768 から +32767


integer 4 バイト -2147483648 から +2147483647
bigint 8 バイト -9223372036854775808 から +9223372036854775807
decimal 可変長 小数点より上は 131072 桁まで、小数点より下は 16383 桁まで
numeric 可変長 小数点より上は 131072 桁まで、小数点より下は 16383 桁まで
real 4 バイト 6 桁精度
double precision 8 バイト 15 桁精度
serial 4 バイト 1 から 2147483647
bigserial 8 バイト 1 から 9223372036854775807

2.2 文字列データ型

文字列データ型は、文字のデータを保管することができます。数値型のような演算に比べて大小比較や演算などを行うことは
できませんが、LIKE 演算子のように部分一致検索などを行うことができます。

2.2.1 character varying 型 (varchar 型)

文字数に上限のある可変長の文字列型です。可変長ですから、文字数制限内であれば何文字の文字データでも構いません。上
限を超える文字列を格納しようとするとエラーになります。

以下の例では、長さ 3 の varchar 型を持った varchar_test 表を作成しています。文字数の長さは半角、全角にかかわらず長さ


3(3 文字)までを許容します。
ossdb=# CREATE TABLE varchar_test(
varstring varchar(3));
CREATE TABLE

LPI-Japan 29 https://oss-db.jp
2 データ型 2.2 文字列データ型

ossdb=# INSERT INTO varchar_test VALUES ('ABC');


INSERT 0 1
ossdb=# INSERT INTO varchar_test VALUES (' あいうえお');
ERROR: value too long for type character varying(3)
ossdb=# INSERT INTO varchar_test VALUES (' あいう');
INSERT 0 1
ossdb=# INSERT INTO varchar_test VALUES ('AIUEO');
ERROR: value too long for type character varying(3)
ossdb=# SELECT * FROM varchar_test;
varstring
-----------
ABC
あいう
(2 rows)

2.2.2 character 型 (char 型)

文字数に上限のある固定長の文字列型です。固定長のため、足りない分の文字数は空白で埋められます。

以下の例では、長さ 3 の char 型を持った char_test 表を作成しています。一文字を格納すると末尾まで空白で埋められてお


り、後方一致検索を使って空白を検索することで確認できます。
ossdb=# CREATE TABLE char_test(
string char(3));
CREATE TABLE
ossdb=# INSERT INTO char_test VALUES (' あ');
INSERT 0 1
ossdb=# SELECT * FROM char_test WHERE string LIKE '% ';
string
--------

(1 row)

上限である 3 文字を超える文字列を格納しようとするとエラーになります。文字列数の長さは半角、全角にかかわらず長さ 3
(3 文字)までです。
ossdb=# INSERT INTO char_test VALUES ('ABC');
INSERT 0 1
ossdb=# INSERT INTO char_test VALUES (' あいうえお');
ERROR: value too long for type character(3)
ossdb=# INSERT INTO char_test VALUES (' あいう');
INSERT 0 1
ossdb=# INSERT INTO char_test VALUES ('AIUEO');
ERROR: value too long for type character(3)
ossdb=# SELECT * FROM char_test;
string
--------

ABC
あいう
(3 rows)

LPI-Japan 30 https://oss-db.jp
2 データ型 2.3 日付・時刻データ型

2.2.3 text 型

文字数に上限のない可変長の文字列型です。文字列長の指定が必要ないため便利ですが、ANSI SQL 標準には定義されていな


いデータ型です。

■2.2.3.1 文字列型一覧表

データ型 説明

character varying(n), varchar(n) 上限付き可変長


character(n), char(n) 空白で埋められた固定長
text 制限なし可変長

2.3 日付・時刻データ型

日付・時刻データ型は、日付だけを格納するデータ型、時刻だけを格納するデータ型、両方を同時に格納するデータ型の3つ
が使用できます。目的に応じて使い分けるとよいでしょう。なお、本項では日付・時刻データ型の紹介とし、日付・時刻デー
タを検索する際の特有の記述については後述します。

■2.3.0.1 日付・時刻データ型一覧表

データ型 説明

date 日付のみ格納(時刻データは切り捨てられ 00:00:00 となる)


time 時刻のみ格納(日付データを持たず日付型への変換不可)
timestamp 日付と時刻を格納

以下の例では、date 型、time 型、timestamp 型の 3 つの列を持った date_test 表を作成しています。それぞれに現在時刻を


挿入すると、各データ型で定められた「日付」
「時刻」
「日付と時刻」が格納されていることを確認します。
(現在時刻を取得す
る now() 関数については後述します。

ossdb=# CREATE TABLE date_test ( d_test date,
t_test time,
ts_test timestamp);
CREATE TABLE
ossdb=# \d date_test
Table "public.date_test"
Column | Type | Collation | Nullable | Default
---------+-----------------------------+-----------+----------+---------
d_test | date | | |
t_test | time without time zone | | |
ts_test | timestamp without time zone | | |

ossdb=# INSERT INTO date_test VALUES (now(),now(),now());


INSERT 0 1
ossdb=# SELECT * FROM date_test;
d_test | t_test | ts_test
------------+-----------------+----------------------------

LPI-Japan 31 https://oss-db.jp
2 データ型 2.3 日付・時刻データ型

2018-01-23 | 12:34:56.526066 | 2018-01-23 12:34:56.526066


(1 row)

LPI-Japan 32 https://oss-db.jp
3 表 3.1 表の作成(CREATE TABLE)

3 表

3.1 表の作成(CREATE TABLE)

前の章では例文中で簡単な表を作成し、その表に対して SQL 文を実行していました。実際のデータベースでは利用者が目的


に応じて表を作成します。表の作成方法を見ていましょう。

3.1.1 表を作成する

表の作成は、CREATE TABLE 文を使用します。

■3.1.1.1 CREATE TABLE 文の構文


CREATE TABLE 表名
(列名 データ型 [NULL|NOT NULL]
| [UNIQUE]
| [PRIMARY KEY (列名 [,...])]
| [REFERNCES 外部参照表名 (参照列名)]
[,...])

表を作成するには、列の名前と、その列にどのようなデータが入るのかを決めなければいけません。ここでは、以下のような
3 つの列を持つテーブルを作成します。

■3.1.1.2 staf 表の定義

列名 データ型

社員番号 id integer 型
氏名 name text 型
誕生日 birthday date 型

これを SQL 文にすると、以下のようになります。作成ができたら、表の一覧に入っていることと、表の定義を確認しておきま


しょう。
ossdb=# CREATE TABLE staff
(id integer,
name text,
birthday date);
CREATE TABLE

ossdb=# \d
List of relations
Schema | Name | Type | Owner
--------+--------------+-------+----------
public | char_test | table | postgres
public | customer | table | postgres
public | date_test | table | postgres
public | numeric_test | table | postgres
public | orders | table | postgres

LPI-Japan 33 https://oss-db.jp
3 表 3.2 表定義の修正(ALTER TABLE)

public | prod | table | postgres


public | staff | table | postgres
public | varchar_test | table | postgres
(8 rows)

ossdb=# \d staff
Table "public.staff"
Column | Type | Collation | Nullable | Default
----------+---------+-----------+----------+---------
id | integer | | |
name | text | | |
birthday | date | | |

3.1.2 staf 表にデータを格納する

INSERT 文を使って staf 表にデータを格納してみましょう。


ossdb=# INSERT INTO staff (id,name,birthday) VALUES (1,' 宮原徹','1972-01-09');
INSERT 0 1
ossdb=# SELECT * FROM staff;
id | name | birthday
----+--------+------------
1 | 宮原徹 | 1972-01-09
(1 row)

3.2 表定義の修正(ALTER TABLE)

表を作成した後で表定義を修正するには ALTER TABLE 文を使用します。

3.2.1 ALTER TABLE による変更

ALTER TABLE 文では表そのものの定義や動作の修正に加え、表内の列定義の修正も可能で、その分指定の方法が複雑に


なっています。

メタコマンド\h で構文のヘルプを確認してみましょう。ここでは詳細を覚える必要はありませんが、変更対象の表を指定し、
さらに「新しい列を追加する(=ADD COLUMN)
」のような action を指定することをヘルプから読み取ってみてください。
ossdb=# \h ALTER TABLE
Command: ALTER TABLE
Description: change the definition of a table
Syntax:
ALTER TABLE [ IF EXISTS ] [ ONLY ] name [ * ]
action [, ... ]

(略)

where action is one of:

ADD [ COLUMN ] [ IF NOT EXISTS ] column_name data_type [ COLLATE collation ] [ column_constraint [ ... ] ]
DROP [ COLUMN ] [ IF EXISTS ] column_name [ RESTRICT | CASCADE ]
ALTER [ COLUMN ] column_name [ SET DATA ] TYPE data_type [ COLLATE collation ] [ USING expression ]

(略)

LPI-Japan 34 https://oss-db.jp
3 表 3.2 表定義の修正(ALTER TABLE)

ここでは新たに列を追加する ALTER TABLE 文を試してみましょう。staf 表に所属部署コードを表す dept_cd 列を追加し、


その列に UPDATE 文で値を格納しています。
ossdb=# ALTER TABLE staff ADD COLUMN dept_cd integer;
ALTER TABLE
ossdb=# \d staff
Table "public.staff"
Column | Type | Collation | Nullable | Default
----------+---------+-----------+----------+---------
id | integer | | |
name | text | | |
birthday | date | | |
dept_cd | integer | | |

ossdb=# UPDATE staff SET dept_cd = 1 WHERE id = 1;


UPDATE 1
ossdb=# SELECT * FROM staff;
id | name | birthday | dept_cd
----+--------+------------+---------
1 | 宮原徹 | 1972-01-09 | 1
(1 row)

3.2.2 表定義の修正は原則として行わない

ALTER TABLE 文で修正できる内容は様々ですが、すでにデータが格納されている状態で安易に列の定義を修正することは


望ましくありません。少なくとも以下のような設計の面や、作業による影響を考慮して実施方法を検討しましょう。

• 正しい設計になっているか
例えば、上記では staf 表に dept_cd 列を追加しましたが、所属部門を staf 表で管理することは理想的な対応だったで
しょうか。SELECT * FROM staff; とすれば所属情報込みでスタッフを一覧表示できることは確かに便利かもしれま
せん。しかし、1 名のスタッフが複数部門に所属するケースは起こりえないでしょうか。
このような場合は、新たに所属部門表を作成し「01 番のスタッフは A という組織に所属する」という事実を表すよう
「01 番のスタッフは同時に C という組織に所属する」場合はもう一行追加すればよいのです。
にします。

■3.2.2.1 所属部門表の例

スタッフ ID 部門コード 意味

01 A スタッフ 01 は A という組織に所属
02 B スタッフ 02 は B という組織に所属
03 C スタッフ 03 は C という組織に所属
01 C スタッフ 01 は C という組織に所属(同時に A と C に所属していることがわかる)

• 表定義の変更作業そのものがどんな影響を及ぼすか
仮に、スタッフ一覧に部門コードを持つことが適切であったとして、変更作業そのものがシステム全体に悪影響を及ぼ
す可能性があります。
小規模なスタッフ表であれば問題は少ないかもしれませんが、数百万人のデータを収めたウェブサービスの会員表であ
る場合はどうでしょうか。利用者がログインするたびに参照されているような場合、表の変更作業中は誰もログインで
きなくなり社会的影響にまで及ぶことを考慮します。(これは極端な例で、実際のデータベース製品の実装では変更中
の参照は許されていることが多いです。しかし、データの更新などはブロックされてしまいますので無視できるもので
はありません。

この場合もやはり上記のような所属部門表を新規に作成することで、利用者の操作を妨げることなく必要なデータは保

LPI-Japan 35 https://oss-db.jp
3 表 3.3 表の削除

図 6 ALTER TABLE は行うべきか

持することができます。

• 短期の対策と中長期の対策
さしあたって必要なデータを格納するために、新規に所属部門表を作成したとします。しかし、やはり設計上はスタッ
フ一覧に部門コードを持つことが最適という場合もあるでしょう。
大規模メンテナンスのためのサービス休止期間を利用者にアナウンスし、理想的な表に変更することは長期的な対策と
しては有用です。

ある操作が他の SQL やプログラムにどのような影響を与えるかは、いかなる操作であっても考慮が必要です。その中でも特


に表のメンテナンスは影響範囲が大きくなりやすいですので十分に注意しましょう。

3.3 表の削除

3.3.1 DROP TABLE 文による表の削除

表を削除するには、DROP TABLE 文を使用します。表を削除すると、表に格納されているデータも一緒に削除されて元に戻


すことができません。
ossdb=# \d
List of relations
Schema | Name | Type | Owner
--------+--------------+-------+----------
public | char_test | table | postgres
public | customer | table | postgres
public | date_test | table | postgres

LPI-Japan 36 https://oss-db.jp
3 表 3.3 表の削除

public | numeric_test | table | postgres


public | orders | table | postgres
public | prod | table | postgres
public | staff | table | postgres
public | varchar_test | table | postgres
(8 rows)

ossdb=# DROP TABLE staff;


DROP TABLE
ossdb=# \d
List of relations
Schema | Name | Type | Owner
--------+--------------+-------+----------
public | char_test | table | postgres
public | customer | table | postgres
public | date_test | table | postgres
public | numeric_test | table | postgres
public | orders | table | postgres
public | prod | table | postgres
public | varchar_test | table | postgres
(7 rows)

3.3.2 DROP TABLE、DELETE、TRUNCATE の利用

データを削除する操作には、表を定義ごと削除する DROP TABLE の他にも、WHERE 条件に該当した行だけを削除する


DELETE、表のデータのみ全件削除する TRUNCATE があります。条件に該当する特定の行のデータだけを削除したい場合
には DELETE 文を使用しますが、DELETE 文でのデータ削除は対象となるデータの件数が多いと時間がかかることがあり
ます。例えば時系列に沿って蓄積されるデータのうち、保管期限を過ぎたものを一括削除するようなケースでは、表を月別な
どに分割しておき、月単位で TRAUNCATE することも考えます。

DROP TABLE 文は表と表データだけでなく、関連する索引やビューなど、その他のものも併せて削除してしまうため、再作


成する場合はこれらも再定義する必要に時間がかかるなどの問題が発生することがあります。行データだけを一括で削除する
場合には TRUNCATE 文を使用します。

■3.3.2.1 TRUNCATE 文の構文


TRAUNCATE 表名

以下の例では、char_test 表のすべての行データをすべて TRUNCATE 文で削除しています。


ossdb=# SELECT * FROM char_test;
string
--------

ABC
あいう
(3 rows)

ossdb=# TRUNCATE char_test;


TRUNCATE TABLE
ossdb=# SELECT * FROM char_test;
string

LPI-Japan 37 https://oss-db.jp
3 表 3.4 行データのセーブ・ロード

--------
(0 rows)

3.4 行データのセーブ・ロード

COPY 文を使用すると、行データをファイルにセーブしたり、ファイルからロードすることができます。FORMAT 句で csv


を指定することで、CSV 形式のファイルをセーブ、ロードができます。

注意:COPY は DB サーバー上のファイルに直接データを書き出す操作で、PostgreSQL のスーパーユーザーでのみ実行する


ことができます。似た操作ではクライアント端末側にデータを出力する psql メタコマンド\copy や、バックアップの章で解
説する pg_dump などが利用できますので、目的に応じて使い分けるようにしてください。

3.4.1 行データのセーブ

COPY TO 文で行データをファイルにセーブできます。

■3.4.1.1 COPY 文によるデータのセーブ


COPY 表名 TO ファイル (FORMAT 形式)

以下の例は、customer 表のデータを CSV 形式でファイルにセーブしています。\!メタコマンドは Linux のシェルコマンドを


実行しています。
ossdb=# COPY customer TO '/home/postgres/customer.csv' (FORMAT csv);
COPY 3
ossdb=# \! ls /home/postgres
customer.csv
ossdb=# \! cat /home/postgres/customer.csv
1, 佐藤商事
2, 鈴木物産
3, 高橋商店

3.4.2 CSV ファイルのロード

COPY FROM 文でファイルから行データをロードできます。

■3.4.2.1 COPY 文によるデータのロード


COPY 表名 FROM ファイル (FORMAT 形式)

以下の例は、customer 表のデータを CSV 形式のファイルからロードしています。


ossdb=# DELETE FROM customer;
DELETE 3
ossdb=# SELECT * FROM customer;
customer_id | customer_name
-------------+---------------
(0 rows)

ossdb=# COPY customer FROM '/home/postgres/customer.csv' (FORMAT csv);


COPY 3
ossdb=# SELECT * FROM customer;

LPI-Japan 38 https://oss-db.jp
3 表 3.4 行データのセーブ・ロード

customer_id | customer_name
-------------+---------------
1 | 佐藤商事
2 | 鈴木物産
3 | 高橋商店
(3 rows)

3.4.3 \copy メタコマンド

psql は COPY 文と同様の動作をする\copy メタコマンドが使用できます。異なるのは以下の点です。

• COPY 文は SQL であり、DB サーバーが実行する。出力ファイルは DB サーバー内に作成される。


• psql メタコマンド\copy はクライアントからのデータ取得操作であり、出力ファイルはクライアント端末内に作成さ
れる。
• ファイル指定が絶対指定のほか、psql 実行時のクライアント端末のカレントディレクトリからの相対指定でも可能
• 形式の指定が with csv

具体的な使用例はこの後の演習で解説します。

LPI-Japan 39 https://oss-db.jp
4 基礎編 演習

4 基礎編 演習

これまでの章で、SQL を使ったデータベースの基礎について学びました。2 つの演習問題で、学習した内容を確認してみま


しょう。

4.1 演習 1:データ操作

4.1.1 データ操作演習

1. すべての商品の価格を 10% アップします


2. 価格が 100 以上の商品の価格を元に戻します
3. prod 表のデータをファイルにコピーします
4. prod 表を削除します
5. prod 表を再度作成します
6. データをファイルからコピーします

表の定義はあらかじめ確認しておきましょう。また、巻末の付録にも表を作成するための CREATE TABLE 文の例がありま


すので、参考にしてください。

4.1.2 解答例

• 演習 1-1: すべての商品の価格を 10% アップします

• 商品表の価格列を指定して UPDATE

ossdb=# \d prod
Table "public.prod"
Column | Type | Collation | Nullable | Default
-----------+---------+-----------+----------+---------
prod_id | integer | | |
prod_name | text | | |
price | integer | | |

ossdb=# SELECT * FROM prod;


prod_id | prod_name | price
---------+-----------+-------
1 | みかん | 50
2 | りんご | 70
3 | メロン | 100
4 | バナナ | 31
(4 rows)
ossdb=# UPDATE prod SET price = price * 1.1;
UPDATE 4
ossdb=# SELECT * FROM prod;
prod_id | prod_name | price
---------+-----------+-------
1 | みかん | 55
2 | りんご | 77
3 | メロン | 110
4 | バナナ | 34

LPI-Japan 40 https://oss-db.jp
4 基礎編 演習 4.1 演習 1:データ操作

(4 rows)

• 演習 1-2: 価格が 100 以上の商品の価格を元に戻します

• 価格が 100 以上の商品を指定して UPDATE

ossdb=# UPDATE prod SET price = price/1.1 WHERE price >= 100;
UPDATE 1
ossdb=# SELECT * FROM prod;
prod_id | prod_name | price
---------+-----------+-------
1 | みかん | 55
2 | りんご | 77
4 | バナナ | 34
3 | メロン | 100
(4 rows)

• 演習 1-3: prod 表のデータをファイルにコピーします

• COPY コマンドでデータをファイルにセーブ

ossdb=# COPY prod TO '/home/postgres/prod.csv' (FORMAT csv);


COPY 4
ossdb=# \! ls -l prod.csv
-rw-r--r--. 1 postgres postgres 61 1 月 29 02:01 prod.csv

• 演習 1-4: prod 表を削除します

• 表の削除には DROP TABLE を使用

ossdb=# DROP TABLE prod;


DROP TABLE

• 演習 1-5: 表を再度作成します

• 表の作成時は列ごとに格納するデータに合わせた型を指定する

• ID のような整数には integer 型、文字には text 型、計算に用いる数値は numeric 型

ossdb=# CREATE TABLE prod ( prod_id integer,


prod_name text,
price numeric );
CREATE TABLE

• 演習 1-6: データをファイルからコピーします

• セーブ時と同様、COPY コマンドを使用

ossdb=# COPY prod FROM '/home/postgres/prod.csv' (FORMAT csv);


COPY 4
ossdb=# SELECT * FROM prod;
prod_id | prod_name | price

LPI-Japan 41 https://oss-db.jp
4 基礎編 演習 4.2 演習 2:郵便番号データベース

---------+-----------+-------
1 | みかん | 55
2 | りんご | 77
4 | バナナ | 34
3 | メロン | 100
(4 rows)

4.2 演習 2:郵便番号データベース

郵便番号データベースを設計してみましょう。郵便番号のデータは CSV 形式で公開されています。この郵便番号データを格


納するデータベースを設計し、実際にデータを格納してみましょう。

4.2.1 郵便番号データのダウンロード

郵便番号データは以下の Web ページからダウンロードできます。

• 郵便番号データダウンロード Web ページの利用


データは ZIP 形式で配布されています。
「住所の郵便番号(CSV 形式)
」-「読み仮名データの促音・拗音を小書きで表
記するもの」をクリックして ZIP 形式でダウンロードしてください。ここでは「全国一括」のデータを用います。

• http://www.post.japanpost.jp/zipcode/download.html

• 郵便番号データのダウンロード
以下の例は、wget コマンドを使って郵便番号 CSV データをダウンロードして、unzip コマンドで解凍しています。
[postgres@localhost ~]$ wget http://www.post.japanpost.jp/zipcode/dl/kogaki/zip/ken_all.zip
--2018-01-29 01:14:02-- http://www.post.japanpost.jp/zipcode/dl/kogaki/zip/ken_all.zip
www.post.japanpost.jp (www.post.japanpost.jp) を DNS に問いあわせています... 43.253.37.203
www.post.japanpost.jp (www.post.japanpost.jp)|43.253.37.203|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 1686409 (1.6M) [application/zip]
`ken_all.zip' に保存中

100%[===============================================================================>] 1,686,409 10.4MB/s 時間

2018-01-29 01:14:02 (10.4 MB/s) - `ken_all.zip' へ保存完了 [1686409/1686409]

[postgres@localhost ~]$ ls
customer.csv ken_all.zip test.sql
[postgres@localhost ~]$ unzip ken_all.zip
Archive: ken_all.zip
inflating: KEN_ALL.CSV
[postgres@localhost ~]$ ls -l KEN_ALL.CSV
-rw-rw-r--. 1 postgres postgres 12288638 12 月 22 14:22 KEN_ALL.CSV

4.2.2 郵便番号データベース表の作成

郵便番号データを格納するための表をデータベースに作成します。

• 郵便番号データ項目
データの項目は以下の通りです。

内容 備考

全国地方公共団体コード (JIS X0401、X0402) 半角数字

LPI-Japan 42 https://oss-db.jp
4 基礎編 演習 4.2 演習 2:郵便番号データベース

内容 備考

(旧) 郵便番号 (5 桁) 半角数字


郵便番号 (7 桁) 半角数字
都道府県名 半角カタカナ (コード順に掲載)
市区町村名 半角カタカナ (コード順に掲載)
町域名 半角カタカナ (五十音順に掲載)
都道府県名 漢字 (コード順に掲載)
市区町村名 漢字 (コード順に掲載)
町域名 漢字 (五十音順に掲載)
一町域が二以上の郵便番号で表される場合の表示
小字毎に番地が起番されている町域の表示
丁目を有する町域の場合の表示
一つの郵便番号で二以上の町域を表す場合の表示
更新の表示
変更理由

• 郵便番号データ用の表定義
以下の例は、文字列データを char 型および text 型で定義した表作成のための CREATE TABLE 文です。
ossdb=# CREATE TABLE zip (
lgcode char(5),
oldzip char(5),
newzip char(7),
prefkana text,
citykana text,
areakana text,
pref text,
city text,
area text,
largearea integer,
koaza integer,
choume integer,
smallarea integer,
change integer,
reason integer
);
CREATE TABLE

• 郵便番号データサンプル
データは以下のような内容です。
[postgres@localhost ~]$ head -5 KEN_ALL_UTF8.CSV
01101,"060 ","0600000","ホツカイドウ","サツポロシチユウオウク","イカニケイサイガナイバアイ","北海道","札幌市中央区","以下
01101,"064 ","0640941","ホツカイドウ","サツポロシチユウオウク","アサヒガオカ","北海道","札幌市中央区","旭ケ丘",0,0,1,0,0
01101,"060 ","0600041","ホツカイドウ","サツポロシチユウオウク","オオドオリヒガシ","北海道","札幌市中央区","大通東",0,0,1
01101,"060 ","0600042","ホツカイドウ","サツポロシチユウオウク","オオドオリニシ (1-19 チヨウメ)","北海道","札幌市中央区","
01101,"064 ","0640820","ホツカイドウ","サツポロシチユウオウク","オオドオリニシ (20-28 チヨウメ)","北海道","札幌市中央区",

4.2.3 データのロードと文字コードについて

ダウンロードできる CSV データは、日本語部分がシフト JIS で作成されています。一方、現在使用しているデータベースは


日本語を UTF-8 で格納するようにしているため、文字コードを UTF-8 に揃える必要があります。

シフト JIS のデータを UTF-8 に変換するには、psql で\encoding メタコマンドを使用する方法と、Linux のコマンドで文字

LPI-Japan 43 https://oss-db.jp
4 基礎編 演習 4.2 演習 2:郵便番号データベース

コード変換をする方法があります。

• psql メタコマンドを使用する方法
\encoding メタコマンドを使用すると、psql が扱うデータの文字コードを変更できます。
以下の例は、\encoding メタコマンドで psql が扱うデータの文字コードをシフト JIS に変更しています。データベー
スは UTF-8 で格納するので、シフト JIS から UTF-8 への文字コード変換が行われます。
ossdb=# \encoding SJIS
ossdb=# \copy zip from KEN_ALL.CSV with csv
COPY 124165
ossdb=# \encoding UTF-8

• Linux のコマンドを使用する方法
Linux であれば nkf コマンドで文字コード変換が行えます。他に iconv コマンドも使用できますが、改行コードを別
途 dos2unix コマンドで変換する必要があります。Linux 環境によっては nkf コマンドがインストールされていない場
合がありますので、その場合には yum コマンドでインストールしてください。
• nkf コマンドで郵便番号データを UTF-8 に変換
[postgres@localhost ~]$ nkf -w KEN_ALL.CSV > KEN_ALL_UTF8.CSV

• iconv コマンドと dos2unix コマンドで郵便番号データを UTF-8 に変換


[postgres@localhost ~]$ iconv -f SHIFT-JIS -t UTF-8 KEN_ALL.CSV | dos2unix > KEN_ALL_UTF8.CSV

• 変換後、psql から\copy メタコマンドでロードします。


ossdb=# \copy zip from KEN_ALL_UTF8.CSV with csv

4.2.4 郵便番号データの確認

ロードされた郵便番号データを確認します。

以下の例では、現在使用されている郵便番号のデータが格納されている newzip 列で絞り込み検索を行っています。


ossdb=# SELECT * FROM zip WHERE newzip = '1500002';
lgcode | oldzip | newzip | prefkana | citykana | areakana | pref | city | area | largearea | koaza | choum
--------+--------+---------+----------+----------+----------+--------+--------+------+-----------+-------+------
13113 | 150 | 1500002 | トウキョウト | シブヤク | シブヤ | 東京都 | 渋谷区 | 渋谷 | 0 | 0 | 1 |
(1 row)

LPI-Japan 44 https://oss-db.jp
5 SQL によるデータベースの操作応用編

5 SQL によるデータベースの操作応用編

データベースの操作に使用する SQL 文には、他にも様々な文法が存在しています。この章では、特に多用する SQL 文の文法


について解説します。

• 以降の実行例は、prod 表が以下の状態になっている前提で記載します。
ossdb=# DROP TABLE prod;
DROP TABLE
ossdb=# CREATE TABLE prod ( prod_id integer,
prod_name text,
price numeric );
CREATE TABLE
ossdb=# INSERT INTO prod(prod_id,prod_name,price) VALUES
(1,' みかん',50),
(2,' りんご',70),
(3,' メロン',100),
(4,' バナナ',30);
INSERT 0 4
ossdb=# SELECT * FROM prod;
prod_id | prod_name | price
---------+-----------+-------
1 | みかん | 50
2 | りんご | 70
3 | メロン | 100
4 | バナナ | 30
(4 rows)

5.1 演算子と関数

5.1.1 演算子

• AND/OR 演算子
SELECT 文などに指定する WHERE 句の条件で、複数の条件を設定したい場合には AND 演算子、OR 演算子が使用
できます。
AND 演算子は指定した条件が両方満たされる場合、OR 演算子は指定した条件のいずれかが満たされる場合に SQL 文
の結果が表示されます。
以下の例は、prod 表の price 列の値が 50 よりも大きく、100 よりも小さい行データのみを検索しています。
ossdb=# SELECT * FROM prod WHERE price > 50 AND price < 100;
prod_id | prod_name | price
---------+-----------+-------
2 | りんご | 70
(1 row)

以下の例は、customer 表の customer_id 列が 1 または 2 の行データを検索しています。


ossdb=# SELECT * FROM customer WHERE customer_id = 1 OR customer_id = 2;
customer_id | customer_name
-------------+---------------
1 | 佐藤商事
2 | 鈴木物産
(2 rows)

LPI-Japan 45 https://oss-db.jp
5 SQL によるデータベースの操作応用編 5.1 演算子と関数

• LIKE 演算子
ある列の値が指定した条件に部分的に一致する行データを取り出します。
以下の例では、customer 表の customer_name 列が「鈴木」で始まる行データを検索しています。

ossdb=# SELECT * FROM customer WHERE customer_name LIKE ' 鈴木 %';


customer_id | customer_name
-------------+---------------
2 | 鈴木物産
(1 row)

以下の例では、customer 表の customer_name 列に「商」が含まれる行データを検索しています。前後に % がついているの


で、値のどこに「商」があっても検索条件に一致します。

ossdb=# SELECT * FROM customer WHERE customer_name LIKE '% 商 %';


customer_id | customer_name
-------------+---------------
1 | 佐藤商事
3 | 高橋商店
(2 rows)

なお LIKE 演算子は便利な反面、性能上検索速度が遅くなる場合があるので、注意して使う必要があるでしょう。

■5.1.1.1 LIKE 演算子で使用できるワイルドカード

ワイルドカード 内容

_ 1 文字
% 0 文字以上の文字列

• BETWEEN 演算子
ある列の値が指定した 2 つの条件値の範囲内にあるデータを取り出します。2 つの条件値は AND で指定します。条件
値そのものも含まれるので「○以上、○以下」という条件であると考えればよいでしょう。
以下の例では、prod 表の price 列が 50 から 70 の間の行データを検索しています。
ossdb=# SELECT * FROM prod WHERE price BETWEEN 50 AND 70;
prod_id | prod_name | price
---------+-----------+-------
1 | みかん | 50
2 | りんご | 70
(2 rows)

5.1.2 関数

• 集約関数
集約関数を使用すると、データを SQL 文で集計することができ、データを一括で処理して 1 つの結果を返します。

■5.1.2.1 主な集約関数

関数 説明

count 関数 対象データの件数を返す
sum 関数 対象データ(数値)の合計値を返す
avg 関数 対象データ(数値)の平均値を返す

LPI-Japan 46 https://oss-db.jp
5 SQL によるデータベースの操作応用編 5.1 演算子と関数

関数 説明

max 関数 対象データ(数値または文字)の最大値を返す
文字の場合、コード順で大小を評価
min 関数 対象データ(数値または文字)の最小値を返す
文字の場合、コード順で大小を評価

• count 関数
count 関数はデータの行数を数える関数です。
ossdb=# SELECT count(order_id) FROM orders;
count
------
5
(1 row)

• sum 関数
sum 関数は指定された列の合計を計算する関数です。
ossdb=# SELECT sum(qty) FROM orders;
sum
----
30
(1 row)

• avg 関数
avg 関数は指定された列の平均を計算する関数です。
ossdb=# SELECT avg(qty) FROM orders;
avg
-------------------
6.0000000000000000
(1 row)

• max 関数
max 関数は指定された列の最大値を計算する関数です。
ossdb=# SELECT max(qty) FROM orders;
max
-----
10
(1 row)

• min 関数
min 関数は指定された列の最小値を計算する関数です。
ossdb=# SELECT min(qty) FROM orders;
min
-----
3
(1 row)

参考: 文字データの最大/最小
文字データの大小関係は、文字コードの並び順により評価されます。
以下の例では、「あ」~「お」を表す UTF-8 の文字コードを表示し、その順序通りに並べ替えが行われていることを確認して
います。max 関数や min 関数の結果も並び順に従っていることがわかります。

LPI-Japan 47 https://oss-db.jp
5 SQL によるデータベースの操作応用編 5.1 演算子と関数

ossdb=# TRUNCATE char_test;


TRUNCATE TABLE
ossdb=# INSERT INTO char_test VALUES (' あ'),(' い'),(' う'),(' え'),(' お');
INSERT 0 5
ossdb=# SELECT string,convert_to(string,'utf8') FROM char_test
ORDER BY string DESC;
string | convert_to
--------+------------
お | \xe3818a
え | \xe38188
う | \xe38186
い | \xe38184
あ | \xe38182
(5 rows)
ossdb=# SELECT max(string),min(string) FROM char_test ;
max | min
------+------
お | あ
(1 row)

5.1.3 GROUP BY 句と集約関数の組み合わせ

GROUP BY 句を使うと、指定された列で行をグループ化し、それぞれのグループ毎に集約関数の計算を行うことができます。

以下の例は、orders 表の行データを prod_id 列の値毎にグループ化し、各グループ毎に集約関数で計算を行っています。


ossdb=# SELECT prod_id,count(qty),sum(qty),avg(qty),min(qty),max(qty)
FROM orders
GROUP BY prod_id;
prod_id | count | sum | avg | min | max
---------+-------+-----+--------------------+-----+-----
3 | 1 | 8 | 8.0000000000000000 | 8 | 8
2 | 2 | 9 | 4.5000000000000000 | 4 | 5
1 | 2 | 13 | 6.5000000000000000 | 3 | 10
(3 rows)

prod 表では、prod_id の 1 番は「みかん」でした。みかんが 2 回販売され、そのときに販売された数量 qty を集計していま


す。合計数量は 13 個、もっとも多く売れたときは一度に 10 個売れた、というようにみかんについての情報が得られます。同
様に「りんご」は 9 個、
「メロン」は 8 個というように、GROUP BY で指定した列の各データに対して集計が行われます。

5.1.4 HAVING 句

HAVING 句を使うと、グループ化した後のグループに対して条件による絞り込みを行うことができます。HAVING 句はグ


ループに対しての絞り込みを行うため、比較対象は集約関数である必要があります。

以下の例では、orders 表の行データを prod_id 列の値毎にグループ化し、qty 列の合計値が 10 未満の結果のみ取得してい


ます。
ossdb=# SELECT prod_id,sum(qty) FROM orders
GROUP BY prod_id;
prod_id | sum
---------+-----
3 | 8
2 | 9
1 | 13

LPI-Japan 48 https://oss-db.jp
5 SQL によるデータベースの操作応用編 5.1 演算子と関数

(3 rows)

ossdb=# SELECT prod_id,sum(qty) FROM orders


GROUP BY prod_id
HAVING sum(qty) < 10;
prod_id | sum
---------+-----
3 | 8
2 | 9
(2 rows)

5.1.5 WHERE 句、GROUP BY 句、HAVING 句の適用順序

集約関数を使った検索では、WHERE 句、GROUP BY 句、HAVING 句が以下の順序で適用されます。

1. WHERE 句による行に対する絞り込み
2. GROUP BY 句によるグループ化
3. HAVING 句によるグループに対する絞り込み

まず WHERE 句で検索対象になる行全体に対して絞り込みが行われます。この時点で除外された行は集約関数の対象にはな
りません。次に GROUP BY 句によるグループ化が行われます。HAVING 句はこのグループに対して集約関数で計算を行い、
指定された演算子に基づいて絞り込みを行います。

例えば、ある学習塾の “優秀な” 高校生向けプロモーションのために、現在の生徒情報から①「年齢別」


「地域別」に生徒数を
集計し生徒数の傾向を調べることを考えます。②今回は「高校生向け」という条件があるので、年齢を絞ることで集計対象に
なる件数集計対象の年齢を大きく減らし絞ります。③優秀な学生というプロモーションの趣旨をどう検索に落とし込むかは担
当者の腕の見せ所かと思いますが、ここでは「進学校がある」のような地域性を考え「地域別にみたときのテストの平均点が
80 点を超える」とします。

SQL を考えると以下のようになるでしょう。
SELECT 年齢, 地域,count(*),avg(点数)
FROM 生徒一覧
WHERE 年齢 BETWEEN 16 AND 18 --------- ② 年齢の条件で分類に関係ないデータを除外
GROUP BY 年齢, 地域--------------------- ① 年齢、地域別に分類
HAVING avg(点数) >= 80;---------------- ③ 平均点が 80 点を超えるグループを抽出

ここで注目して欲しいのは②の年齢の条件と、③の平均点の条件です。実は、両条件を HAVING 句にまとめて書いても良い


のです。得られる結果は全く同じです。

SELECT 年齢, 地域,count(*),avg(点数)


FROM 生徒一覧
GROUP BY 年齢, 地域
HAVING avg(点数) >= 80
AND 年齢 BETWEEN 16 AND 18;------- 年齢の条件を HAVING 句に記述

2 つの SQL の違いは、その検索パフォーマンスに現れます。ある「年齢・地域」グループの平均点が 80 点以上であることは、


集計された結果をみて初めて適用できる条件ですので、HAVING 句に書くほかありません。前者は、集計対象とする 16 歳以
上 18 歳以下という条件を WHERE 句で記述し、絞り込んだ行のみを集計しています。後者は年齢による絞り込みをせずに全
件(おそらく小学生、中学生が名簿には多数含まれるでしょう)を対象に集計し、最後に HAVING 句で年齢を絞り込んでい
ます。無駄な集計作業に時間をかけているのです。

LPI-Japan 49 https://oss-db.jp
7 マルチユーザーでの利用

7 マルチユーザーでの利用

PostgreSQL はマルチユーザーのデータベースです。複数のユーザーを使い分けることで、あるユーザーは表のデータを更新
でき、あるユーザーは検索のみ行えるようにするなど、ユーザー毎に行えるデータベースの操作を変えたりすることができ
ます。

7.1 ユーザーの作成

PostgreSQL のユーザーを作成するには、CREATE USER 文を使用します。また、Linux のコマンドラインから createuser


コマンドを使用してもユーザーを作成できます。

ユーザーを確認するには\du メタコマンドを実行します。

以下の例では、ユーザー sato を作成しています。このユーザーでログインするときに必要なパスワードも指定しています。


[postgres@localhost ~]$ psql ossdb
ossdb=# CREATE USER sato PASSWORD 'sato';
CREATE ROLE
ossdb=# \du
List of roles
Role name | Attributes | Member of
-----------+------------------------------------------------------------+-----------
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
sato | | {}

以下の例では、Linux のコマンドラインから、createuser コマンドを使用してユーザー suzuki を作成しています。-P オプショ


ンをつけると、このユーザーでログインするときに必要なパスワードを対話式で指定することができます。
[postgres@localhost ~]$ createuser -P suzuki
新しいロールのためのパスワード:
もう一度入力してください:
[postgres@localhost ~]$ psql ossdb
ossdb=# \du
List of roles
Role name | Attributes | Member of
-----------+------------------------------------------------------------+-----------
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
sato | | {}
suzuki | | {}

7.1.1 ユーザーとロール

CREATE USER 文や createuser コマンドの結果表示にはユーザーではなくロール (ROLE) と表示されています。PostgreSQL


ではログイン属性を持つロールをユーザーと呼びます。理想的なアクセス制御は、権限の集合としてのロール(グループロー
ル)と、ログイン可能な属性を持つロール(ユーザーロール)を適切に使い分けることで実現します。例えば、あるサービスを
運用するために必要な複数の表に対するアクセス権限(A 表に対する更新可能、B 表に対しては参照のみ可能のような細やか
な設定)をまとめたグループロールを作成し、そのグループロールを特定の管理ユーザーに付与するようにします。ユーザー
の棚卸やサービスの変更(テーブル構成の見直し)などがあった場合に柔軟に対処するためです。本書では、単にデータベー
スに接続し SQL の基礎を学習するという目的に沿って、ログイン時に使用するユーザーという概念を重視し、ユーザーの作
成として解説しています。

LPI-Japan 70 https://oss-db.jp
7 マルチユーザーでの利用 7.2 接続と認証

7.1.2 スーパーユーザー

データベースには一番最初に初期化した際に、データベースに対するすべての権限を持ったユーザーが作成されます。これを
スーパーユーザーと呼びます。Linux における root ユーザーや、Windows における Administrator ユーザーのようなもの
と考えればよいでしょう。PostgreSQL では、Linux 上でデータベースの初期化(initdb コマンドの実行)を行った OS ユー
ザーの名前でスーパーユーザーが作成されます。このユーザーのユーザ名は慣習的に postgres となっています。

7.2 接続と認証

マルチユーザーで利用する際には、外部からネットワーク経由での PostgreSQL への接続や、接続時の認証が必要となります。


これらはデフォルトでは設定されていないので、設定方法について解説します。

7.2.1 接続認証の設定を確認

PostgreSQL での接続認証の設定は、設定ファイルの一つである pg_hba.conf に記述します。デフォルトでは、以下のように


設定が記述されています。
[postgres@localhost ~]$ cat $PGDATA/pg_hba.conf
------
(略)
# TYPE DATABASE USER ADDRESS METHOD

# "local" is for Unix domain socket connections only


local all all trust
# IPv4 local connections:
host all all 127.0.0.1/32 trust
# IPv6 local connections:
host all all ::1/128 trust
(略)
------

各項目の設定は、左から順に以下のようになっています。

• 接続方法(TYPE)
クライアントがどのように PostgreSQL に接続するかを指定します。

■7.2.1.1 接続方法の設定

接続タイプ 説明

local PostgreSQL が実行されているホストと同じホストからの接続


host 外部からの TCP/IP を使った接続
hostssl 外部からの SSL を使った接続

• データベース(DATABASE)
接続認証の対象となるデータベースを指定します。all と記述するとすべてのデータベースが対象となります。

• ユーザー(USER)
接続認証の対象となるユーザーを指定します。all と記述するとすべてのユーザーが対象となります。

• 認証方法(METHOD)
認証方式を指定します。

LPI-Japan 71 https://oss-db.jp
7 マルチユーザーでの利用 7.2 接続と認証

■7.2.1.2 認証方法の設定

認証メソッド 説明

trust 認証なしに接続
reject 接続拒否
md5 MD5 パスワード認証
password 平文パスワード認証
scram-sha-256 SCRAM 認証
gss GSSAPI 認証
sspi SSPI
ident IDENT 認証
peer peer 認証
pam PAM 認証
ldap LDAP 認証
radius RADIUS 認証
cert SSL クライアント証明書認証

RPM からインストールした場合のデフォルトの設定では、ローカルホストでの接続で、すべてのデータベース、ユーザーに
対して trust 認証を行うことが設定されています。

7.2.2 接続ユーザーの指定

psql でデータベースに接続する際、本来はどのユーザーで接続するか指定する必要がありますが、明示的に指定されなかった
場合には psql を実行した Linux のユーザー名が暗黙の内に指定されます。接続ユーザーは\set メタコマンドを実行して変数
USER の値で確認できます。

以下の例では、id コマンドの結果で Linux のユーザー名が postgres であること、接続のユーザーも postgres になっているこ


とを確認しています。psql にはデータベース名として ossdb のみ指定しているので、接続ユーザーは暗黙の内に postgres が
指定されているのが分かります。
[postgres@localhost ~]$ id
uid=1001(postgres) gid=1001(postgres) groups=1001(postgres) context=unconfined_u:unconfined_r:unconfined_t:s0-s0
[postgres@localhost ~]$ psql ossdb
psql (10.1)
Type "help" for help.

ossdb=# \set
AUTOCOMMIT = 'on'
COMP_KEYWORD_CASE = 'preserve-upper'
DBNAME = 'ossdb'
ECHO = 'none'
ECHO_HIDDEN = 'off'
ENCODING = 'UTF8'
FETCH_COUNT = '0'
HISTCONTROL = 'none'
HISTSIZE = '500'
HOST = '/var/run/postgresql'
IGNOREEOF = '0'
ON_ERROR_ROLLBACK = 'off'
ON_ERROR_STOP = 'off'

LPI-Japan 72 https://oss-db.jp
7 マルチユーザーでの利用 7.2 接続と認証

PORT = '5432'
PROMPT1 = '%/%R%# '
PROMPT2 = '%/%R%# '
PROMPT3 = '>> '
QUIET = 'off'
SERVER_VERSION_NAME = '10.1'
SERVER_VERSION_NUM = '100001'
SHOW_CONTEXT = 'errors'
SINGLELINE = 'off'
SINGLESTEP = 'off'
USER = 'postgres'
VERBOSITY = 'default'
VERSION = 'PostgreSQL 10.1 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-16), 64-b
VERSION_NAME = '10.1'
VERSION_NUM = '100001'

次に、ユーザー sato で接続した場合の例です。ログイン時にユーザー名を指定して、その通りになっていることがわかりま


す。また、psql のプロンプトが「=#」ではなく「=>」になっており、これはユーザー sato が、スーパーユーザーでなく一般
ユーザーであることを表します。
[postgres@localhost ~]$ psql ossdb sato
psql (10.1)
Type "help" for help.

ossdb=> \set
(該当箇所のみ抜粋)
DBNAME = 'ossdb'
USER = 'sato'

7.2.3 パスワード認証の設定

データベースへの接続時にパスワード認証を行うように設定してみます。パスワード認証を設定するには pg_hba.conf に以下


のような設定を行います。設定の変更は OS ユーザーを postgres にして行います。
vi $PGDATA/pg_hba.conf
-----
# TYPE DATABASE USER ADDRESS METHOD

# "local" is for Unix domain socket connections only


local all all md5
# IPv4 local connections:
host all all 127.0.0.1/32 md5
# IPv6 local connections:
host all all ::1/128 md5

設定の変更は PostgreSQL を再起動(または設定の再読み込み)をするまでは有効になりません。ユーザーにパスワードの設


定を行ってから pg_ctl reload で設定を再読み込みします。パスワードの設定を行わないまま本設定を読み込むと、TRUST
認証が無効になってしまうためデータベースに接続できなくなりますす。

7.2.4 パスワードの設定、変更

パスワード認証が有効になると、パスワードが設定されていないユーザーはデータベースに接続できなくなるので、パスワー
ドを設定しておきます。

• 既存ユーザーにパスワード設定

LPI-Japan 73 https://oss-db.jp
7 マルチユーザーでの利用 7.2 接続と認証

既存のユーザーに対して ALTER USER 文でパスワードを設定します。初期ユーザーである postgres ユーザーにはパ


スワードが設定されていませんので、インストール直後に必ず本操作を実施しましょう。#### ALTER USER 文で
パスワードを設定する構文

ALTER USER ユーザー名 PASSWORD ' パスワード'

以下の例では、ユーザー postgres に対してパスワードを postgres に設定しています。


[postgres@localhost ~]$ psql ossdb
ossdb=# ALTER USER postgres PASSWORD 'postgres';
ALTER ROLE

• 強度の高いパスワード格納方式
pg_hba.conf で指定する認証方式には、password、md5、scram-sha-256 という 3 つのパスワード格納方式が指定で
きます。このうち、デフォルトの格納方式は md5 ですが、近年では暗号化強度が弱いとされ、PostgreSQL 10 からは
scram-sha-256 が利用可能になっています。
[postgres@localhost ~]$ psql ossdb
ossdb=# SET password_encryption = 'scram-sha-256';
SET
ossdb=# ALTER USER postgres PASSWORD 'postgres';
ALTER ROLE

この場合、pg_hba.conf の記述も上記の md5 の代わりに scram-sha-256 とします。


vi $PGDATA/pg_hba.conf
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all scram-sha-256
# IPv4 local connections:
host all all 127.0.0.1/32 scram-sha-256
# IPv6 local connections:
host all all ::1/128 scram-sha-256

7.2.5 設定値の再読み込み

PostgreSQL の各設定には、その設定が反映されるタイミングが定められています。ほぼすべてのパラメーターが起動時に読
み込まれるほか、pg_hba.conf の設定やその他の一部のパラメーターは設定の再読み込みで反映されるようになっています。

以下の例は、ユーザー postgres で pg_ctl コマンドで PostgreSQL の設定を再読み込みしています。


[postgres@localhost ~]$ pg_ctl reload
サーバにシグナルを送信しました

PostgreSQL の停止または再起動は、他のユーザーがデータベースを使用している場合、デフォルトでは実行中の処理を中断
して停止処理が優先される動作になっています。重要な処理の実行に影響しないよう、メンテナンス時間帯を設けて作業を行
うことが大切ですが、このように他の処理への影響を軽微にできる方法が用意されている場合もあります。

7.2.6 パスワード認証による接続

パスワード認証が有効になったかどうかを確認します。

以下の例では、ユーザー postgres、ユーザー sato での接続を確認しています。


[postgres@localhost ~]$ psql ossdb
Password:
psql (10.1)
Type "help" for help.

LPI-Japan 74 https://oss-db.jp
7 マルチユーザーでの利用 7.3 ネットワーク経由接続

ossdb=# \q
[postgres@localhost ~]$ psql ossdb sato
Password for user sato:
psql (10.1)
Type "help" for help.

ossdb=> \q

7.3 ネットワーク経由接続

PostgreSQL は、TCP/IP を利用したネットワーク経由での接続も受け付けることができます。

7.3.1 ネットワーク経由接続の設定

ネットワーク経由接続を受け付けるには、postgresql.conf に listen_addresses の設定を行って、PostgreSQL を再起動します。


デフォルトでは、listen_addresses = 'localhost' が設定されていて、PostgreSQL が実行されているホストでのローカ
ルループバック接続のみが有効になっています。値を*(アスタリスク)に設定することで、ホストが用意しているすべてのイ
ンターフェースからの接続を受け付けるようになります。もし特定のインターフェースからのみ受け付けたい場合には、その
インターフェースに設定された IP アドレスを記述します。接続受付のポート番号はデフォルトで 5432 に設定されています。
ポート番号を変更したい場合には、port の設定値を変更します。

以下の例では、すべてのインターフェースからの接続を受け付けるように設定しています。
[postgres@localhost ~]$ vi $PGDATA/postgresql.conf
-----
#listen_addresses = 'localhost' # what IP address(es) to listen on;
listen_addresses = '*' # what IP address(es) to listen on;
# comma-separated list of addresses;
# defaults to 'localhost', '*' for all
# (change requires restart)
#port = 5432 # (change requires restart)

あわせて、接続認証の設定も行います。pg_hba.conf の host アクセス制御を設定します。

以下の例では、ネットワーク経由接続で ossdb データベースに sato ユーザーがアクセスする際にパスワード認証するよう


に設定しています。pg_hba.conf の設定反映は再読み込みで良いですが、今回は listen_addresses も変更していますので、
PostgreSQL の再起動で両方の設定を反映させます。
[postgres@localhost ~]$ vi $PGDATA/pg_hba.conf
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all scram-sha-256
# IPv4 local connections:
host ossdb sato 0.0.0.0/0 scram-sha-256
host all all 127.0.0.1/32 scram-sha-256
# IPv6 local connections:
host all all ::1/128 scram-sha-256

7.3.2 PostgreSQL の再起動

設定変更後に設定を反映させるため PostgreSQL を再起動します。ユーザー root で systemctl restart postgresql-


10.service を実行するか、ユーザー postgres で pg_ctl restart コマンドを実行します。

以下の例は、ユーザー root で PostgreSQL を再起動しています。

LPI-Japan 75 https://oss-db.jp
7 マルチユーザーでの利用 7.4 アクセス権限

[root@localhost ~]# systemctl restart postgresql-10.service

以下の例は、ユーザー postgres で pg_ctl コマンドで PostgreSQL を再起動しています。


[postgres@localhost ~]$ pg_ctl restart
サーバ停止処理の完了を待っています.... 完了
サーバは停止しました
サーバの起動完了を待っています....

7.3.3 psql を使ったネットワーク経由接続

psql を使って PostgreSQL にネットワーク経由接続するにはオプション-h でホスト名、-p でポート番号を指定します。ユー


ザー、データベース、クライアント端末の組み合わせが pg_hba.conf で許可されている必要があります。

■7.3.3.1 psql でネットワーク経由接続


psql -h ホスト名 -p ポート番号 -U ユーザー名 データベース名

以下の例では、サーバーの IP アドレスに対してネットワーク経由接続を行っています。
[postgres@localhost ~]$ psql -h 192.168.101.10 -p 5432 -U sato ossdb
Password for user sato:
psql (10.1)
Type "help" for help.

ossdb=>

pg_hba.conf に定義した組み合わせ(sato ユーザー、ossdb データベース)以外では、認証エラーが出ています。


[postgres@localhost ~]$ psql -h 192.168.101.10 -p 5432 -U sato postgres
psql: FATAL: no pg_hba.conf entry for host "192.168.101.10", user "sato", database "postgres", SSL off

7.4 アクセス権限

1 つのデータベースに複数のユーザーが接続できる場合、アクセス権限を設定することで表などに対する操作を制御すること
ができます。

7.4.1 アクセス権限の付与

アクセス権限を付与するには、GRANT 文を使用します。

■7.4.1.1 GRANT 文の構文


GRANT {ALL | SELECT | INSERT | DELETE | UPDATE}
ON object TO {user | PUBLIC}

以下の例は、ユーザー sato に対して prod 表に対するすべての権限を付与しています。prod 表の所有者(owner)である


postgres ユーザーで操作してユーザー sato に対して権限を与えます。
[postgres@localhost ~]$ psql -U postgres ossdb
Password for user postgres:
psql (10.1)
Type "help" for help.

LPI-Japan 76 https://oss-db.jp
9 バックアップとリストア 9.2 ファイルのコピー

9 バックアップとリストア

データベースのバックアップとリストアは、重要なデータを扱うデータベースにとって重要な作業です。ハードディスクの障
害などでデータが失われた時、あらかじめ取得しておいたバックアップから確実にリストアが行えるようにしておく必要があ
ります。

9.1 バックアップ手法の整理

データベースのデータは、多数のユーザーにより同時に更新される可能性があり、テキスト文書や表計算ソフトのファイルを
USB メモリにコピーするような単純な手法ではバックアップになりません。

以下のようなバックアップ手法を知り、利用目的に応じて使い分ける必要があります。

9.1.1 主なバックアップ手法一覧

手法 復旧ポイント 説明

ファイルコピー バックアップ取得時点 データベースを停止して、OS コマンドでファイルをコピーする方法。アプ


リケーションを停止できる場合は最も簡単。
SELECT 文 バックアップ取得時点 データベースを停止せずに、SELECT した結果をファイルに書き出す。
COPY 文や\o メタコマンドを使用。
pg_dump バックアップ取得時点 データベースを停止せずに専用のコマンドでデータをファイルに書き出す。
内部的には COPY 文相当の処理が行われる。バックアップ対象や出力形式
を柔軟に選択でき、復旧ポイント次第では有力な選択肢である。
pg_basebackup 障害発生直前 バックアップ取得以降に発生した障害に対して有効な選択肢である。バッ
クアップファイルに変更履歴を順に適用することで障害発生直前の状態ま
で復旧することができるほか、時刻やトランザクション位置を指定して、
変更履歴に含まれる任意の時点に復旧することもできる。
レプリケー リアルタイム~指定 レプリケーション機能でデータベースまたはテーブル単位の複製を作成す
ション 間隔 る。標準機能ではストリーミングレプリケーションやロジカルレプリケー
ション、他にもさまざまなレプリケーションツールが公開されており、リア
ルタイム性の高いものやクラウドで保管するなどツールにより特徴がある。

本書では、バックアップ手法の一例として、環境準備や事前設定が不要で簡単に試すことができる「ファイルコピー」と
「pg_dump」を紹介します。

9.2 ファイルのコピー

最も確実で簡単なバックアップは、ファイルレベルでのバックアップです。必要となるファイルをすべてコピーすることで
バックアップができます。ただし、ファイルのコピーを行うには PostgreSQL を完全に停止する必要があります。

以下の例では、tar コマンドを使用して PostgreSQL の関連ファイルが格納されているデータディレクトリ$PGDATA 以下を


アーカイブしています。
[postgres@localhost ~]$ pg_ctl stop -m fast
サーバ停止処理の完了を待っています.... 完了
サーバは停止しました
[postgres@localhost ~]$ tar cvf backup.tar $PGDATA
tar: メンバ名から先頭の `/' を取り除きます
/var/lib/pgsql/10/data/

LPI-Japan 90 https://oss-db.jp
9 バックアップとリストア 9.3 pg_dump コマンドによるバックアップ

/var/lib/pgsql/10/data/pg_wal/
/var/lib/pgsql/10/data/pg_wal/archive_status/
/var/lib/pgsql/10/data/pg_wal/000000010000000000000003
/var/lib/pgsql/10/data/pg_wal/000000010000000000000004

[postgres@localhost ~]$ ls -l backup.tar
-rw-rw-r--. 1 postgres postgres 95887360 1月 23 12:34 backup.tar
[postgres@localhost ~]$ pg_ctl start
サーバの起動完了を待っています....
2018-02-05 02:09:45.616 JST [4866] LOG: redirecting log output to logging collector process
2018-02-05 02:09:45.616 JST [4866] HINT: Future log output will appear in directory "log".
完了
サーバ起動完了

注意:この方法はデータベースを構成する すべてのファイルを利用者自身が指定する必要があります。テーブルスペース機能
を用いて複数ディレクトリに分かれて保持されているデータがある場合、もれなく取得しなければなりません。

9.3 pg_dump コマンドによるバックアップ

pg_dump コマンドは、データベースを SQL 文としてバックアップするコマンドです。ファイルのコピーと違い、データベー


スを停止することなくバックアップすることができます。pg_dump コマンドを実行すると、データベースまたは表単位で、
指定した形式でファイルに出力することができます。

pg_dump コマンドは指定したデータベースや表だけをバックアップするコマンドですが、pg_dumpall コマンドを使うと、


すべてのデータベース、作成したユーザーなどの情報をまとめてバックアップすることができます。

以下の例では、pg_dump コマンドでデータベース ossdb をバックアップしています。実行時オプションとして、-F で出力形


式「ディレクトリ」、-f で「ディレクトリ名」、最後の引数は対象データベース名を指定しています。ディレクトリ形式とは、
指定したディレクトリ配下にテーブル毎にダンプファイルを作成するものです。リストア時に対象テーブルがわかっていれば
必要なファイルのみを渡せばよい点や、-j オプションと組み合わせることで複数コアを使った並列ダンプに対応しています。
[postgres@localhost ~]$ mkdir backup.d
[postgres@localhost ~]$ ls -l | grep backup.d
drwxrwxr-x. 2 postgres postgres 4096 1 月 23 12:34 backup.d

[postgres@localhost ~]$ pg_dump -Fd -f backup.d ossdb


パスワード:<postgres ユーザーのパスワード>

[postgres@localhost ~]$ ls backup.d


3711.dat.gz 3713.dat.gz 3715.dat.gz 3717.dat.gz 3719.dat.gz toc.dat
3712.dat.gz 3714.dat.gz 3716.dat.gz 3718.dat.gz 3720.dat.gz

9.4 pg_restore によるリストア

pg_dump コマンドを使ってバックアップしたファイルは、専用の pg_restore コマンドでデータベースに読み込ませることが


できます。pg_restore の実行時オプションでは、ダンプファイルに含まれる「データベース」または「表」を指定して対象の
みをリストアできます。ダンプファイルに含まれるデータベース定義を元に CREATE DATABSE から実施する方法や、デー
タベースに対して CREATE TABLE したり、既存のテーブルにデータのみ INSERT する方法などが柔軟に指定可能です。

以下の例では、障害に見立てて ossdb データベースを削除した後、先ほど取得したバックアップ「backup.d」を指定してデー


タベース全体をリストアしています。pg_restore コマンド実行時のポイントとしては、いまは ossdb データベースが存在し
ないため、リストア操作のために一時的に postgres データベースに接続し、-C オプションで新規に ossdb データベースを作
成していることです。

LPI-Japan 91 https://oss-db.jp
9 バックアップとリストア 9.4 pg_restore によるリストア

/* 障害に見立てて ossdb データベースを削除 */

[postgres@localhost ~]$ dropdb ossdb


パスワード:
[postgres@localhost ~]$ psql ossdb
Password:
psql: FATAL: database "ossdb" does not exist

/* ossdb データベースを復旧 */

[postgres@localhost ~]$ pg_restore -d postgres -c -C backup.d


パスワード:
pg_restore: [アーカイバ (db)] TOC 処理中にエラーがありました:
pg_restore: [アーカイバ (db)] TOC エントリ 3726; 1262 16384 DATABASE ossdb postgres のエラーです
pg_restore: [アーカイバ (db)] could not execute query: ERROR: database "ossdb" does not exist
コマンド: DROP DATABASE ossdb;

警告: リストアにてエラーを無視しました: 1

/* ここではデータベース ossdb が存在しない旨のエラーが表示されますが、問題ありません。


* pg_restore ではリストア対象(今回は ossdb データベース)と重複するデータを最初に削除する処理(今回は dropdb ossdb)を実行し
* 直前の dropdb コマンドで削除対象の ossdb データベースがすでに存在しないため、内部で実行しようとした dropdb 処理のみが失敗して
*/

[postgres@localhost ~]$ psql ossdb


Password:
psql (10.1)
Type "help" for help.

ossdb=# \d
List of relations
Schema | Name | Type | Owner
--------+--------------+----------+----------
public | char_test | table | postgres
public | customer | table | postgres
public | date_test | table | postgres
public | numeric_test | table | postgres
public | order_id_seq | sequence | postgres
public | orders | table | postgres
public | prod | table | postgres
public | student | table | postgres
public | varchar_test | table | postgres
public | zip | table | postgres
(10 rows)

ossdb=# SELECT count(*) FROM zip;


count
--------
124165
(1 row)

LPI-Japan 92 https://oss-db.jp
10 WEB アプリケーションとの連携

10 Web アプリケーションとの連携

データベースの一般的な利用方法として、Web アプリケーションと連携してデータベースでデータの管理を行う形がありま
す。このように Web アプリケーションの背後で動作するデータベースを「バックエンドデータベース」と呼びます。この章で
は、Web アプリケーション開発でよく利用されている言語「PHP」との組み合わせでのバックエンドデータベースとしての利
用方法を学びます。

10.1 PHP とは?

PHP とは、Web サーバー上で動作する Web アプリケーション開発でよく利用される言語です。HTML ファイルにアプリ


ケーションのコードを埋め込むことができるので、Web ページの一部分にアプリケーションの動作を組み込んだりすることが
できます。

10.2 PHP の動作イメージ

PHP は Web サーバーの「Apache HTTP サーバー(以下、Apache)」に組み込んで利用するモジュールが配布されており、


これを利用すると簡単に Web アプリケーションの開発を始められます。Web ブラウザから拡張子が.php になっているファイ
ルを要求されると、そのファイル内に含まれている PHP のコードが実行され、最終的な結果は HTML として Web ブラウザ
に渡されます。

10.3 Apache と PHP 環境の設定

Apache と PHP を利用できるようにインストールと設定を行います。インストールするのは PostgreSQL が動作しているマシ


ン上でも、別々のマシンでも構いません。別々のマシンにインストールした場合、PHP と PostgreSQL の間はネットワーク
経由で接続することになります。ここでは PostgreSQL が動作している同じマシンに Apache と PHP をインストールします。

10.3.1 Apache と PHP をパッケージでインストール

CentOS では Apache と PHP が RPM パッケージで提供されているので、yum コマンドを使ってインストールします。yum


コマンドでインストールが行えない場合には、インストールメディアから rpm コマンドを使って必要なパッケージをインス
トールします。インストールするパッケージは php と php-pgsql です。
[root@localhost ~]# yum install php php-pgsql
読み込んだプラグイン:fastestmirror, langpacks
base | 3.6 kB 00:00:00
extras | 3.4 kB 00:00:00
pgdg10 | 4.1 kB 00:00:00
updates | 3.4 kB 00:00:00
Loading mirror speeds from cached hostfile
* base: ftp.iij.ad.jp
* extras: ftp.iij.ad.jp
* updates: ftp.iij.ad.jp
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ php.x86_64 0:5.4.16-43.el7_4 を インストール
--> 依存性の処理をしています: php-common(x86-64) = 5.4.16-43.el7_4 のパッケージ: php-5.4.16-43.el7_4.x86_64
--> 依存性の処理をしています: php-cli(x86-64) = 5.4.16-43.el7_4 のパッケージ: php-5.4.16-43.el7_4.x86_64
--> 依存性の処理をしています: httpd-mmn = 20120211x8664 のパッケージ: php-5.4.16-43.el7_4.x86_64
--> 依存性の処理をしています: httpd のパッケージ: php-5.4.16-43.el7_4.x86_64

LPI-Japan 93 https://oss-db.jp
10 WEB アプリケーションとの連携 10.3 Apache と PHP 環境の設定

---> パッケージ php-pgsql.x86_64 0:5.4.16-43.el7_4 を インストール


--> 依存性の処理をしています: php-pdo(x86-64) = 5.4.16-43.el7_4 のパッケージ: php-pgsql-5.4.16-43.el7_4.x86_64
--> トランザクションの確認を実行しています。
---> パッケージ httpd.x86_64 0:2.4.6-67.el7.centos.6 を インストール
--> 依存性の処理をしています: httpd-tools = 2.4.6-67.el7.centos.6 のパッケージ: httpd-2.4.6-67.el7.centos.6.x86_64
--> 依存性の処理をしています: /etc/mime.types のパッケージ: httpd-2.4.6-67.el7.centos.6.x86_64
---> パッケージ php-cli.x86_64 0:5.4.16-43.el7_4 を インストール
---> パッケージ php-common.x86_64 0:5.4.16-43.el7_4 を インストール
--> 依存性の処理をしています: libzip.so.2()(64bit) のパッケージ: php-common-5.4.16-43.el7_4.x86_64
---> パッケージ php-pdo.x86_64 0:5.4.16-43.el7_4 を インストール
--> トランザクションの確認を実行しています。
---> パッケージ httpd-tools.x86_64 0:2.4.6-67.el7.centos.6 を インストール
---> パッケージ libzip.x86_64 0:0.10.1-8.el7 を インストール
---> パッケージ mailcap.noarch 0:2.1.41-2.el7 を インストール
--> 依存性解決を終了しました。

依存性を解決しました

================================================================================================
Package アーキテクチャー バージョン リポジトリー 容量
================================================================================================
インストール中:
php x86_64 5.4.16-43.el7_4 updates 1.4 M
php-pgsql x86_64 5.4.16-43.el7_4 updates 86 k
依存性関連でのインストールをします:
httpd x86_64 2.4.6-67.el7.centos.6 updates 2.7 M
httpd-tools x86_64 2.4.6-67.el7.centos.6 updates 88 k
libzip x86_64 0.10.1-8.el7 base 48 k
mailcap noarch 2.1.41-2.el7 base 31 k
php-cli x86_64 5.4.16-43.el7_4 updates 2.7 M
php-common x86_64 5.4.16-43.el7_4 updates 565 k
php-pdo x86_64 5.4.16-43.el7_4 updates 98 k

トランザクションの要約
================================================================================================
インストール 2 パッケージ (+7 個の依存関係のパッケージ)

総ダウンロード容量: 7.7 M
インストール容量: 27 M
Is this ok [y/d/N]: y
Downloading packages:
(1/9): libzip-0.10.1-8.el7.x86_64.rpm | 48 kB 00:00:01
(2/9): mailcap-2.1.41-2.el7.noarch.rpm | 31 kB 00:00:01
(3/9): httpd-tools-2.4.6-67.el7.centos.6.x86_64.rpm | 88 kB 00:00:01
(4/9): php-5.4.16-43.el7_4.x86_64.rpm | 1.4 MB 00:00:01
(5/9): httpd-2.4.6-67.el7.centos.6.x86_64.rpm | 2.7 MB 00:00:02
(6/9): php-pdo-5.4.16-43.el7_4.x86_64.rpm | 98 kB 00:00:00
(7/9): php-common-5.4.16-43.el7_4.x86_64.rpm | 565 kB 00:00:00
(8/9): php-pgsql-5.4.16-43.el7_4.x86_64.rpm | 86 kB 00:00:00
(9/9): php-cli-5.4.16-43.el7_4.x86_64.rpm | 2.7 MB 00:00:00
-------------------------------------------------------------------------------------------------
合計 3.1 MB/s | 7.7 MB 00:00:02

LPI-Japan 94 https://oss-db.jp
10 WEB アプリケーションとの連携 10.3 Apache と PHP 環境の設定

Running transaction check


Running transaction test
Transaction test succeeded
Running transaction
インストール中 : libzip-0.10.1-8.el7.x86_64 1/9
インストール中 : php-common-5.4.16-43.el7_4.x86_64 2/9
インストール中 : php-cli-5.4.16-43.el7_4.x86_64 3/9
インストール中 : php-pdo-5.4.16-43.el7_4.x86_64 4/9
インストール中 : httpd-tools-2.4.6-67.el7.centos.6.x86_64 5/9
インストール中 : mailcap-2.1.41-2.el7.noarch 6/9
インストール中 : httpd-2.4.6-67.el7.centos.6.x86_64 7/9
インストール中 : php-5.4.16-43.el7_4.x86_64 8/9
インストール中 : php-pgsql-5.4.16-43.el7_4.x86_64 9/9
検証中 : php-cli-5.4.16-43.el7_4.x86_64 1/9
検証中 : php-common-5.4.16-43.el7_4.x86_64 2/9
検証中 : php-5.4.16-43.el7_4.x86_64 3/9
検証中 : php-pgsql-5.4.16-43.el7_4.x86_64 4/9
検証中 : mailcap-2.1.41-2.el7.noarch 5/9
検証中 : httpd-2.4.6-67.el7.centos.6.x86_64 6/9
検証中 : httpd-tools-2.4.6-67.el7.centos.6.x86_64 7/9
検証中 : libzip-0.10.1-8.el7.x86_64 8/9
検証中 : php-pdo-5.4.16-43.el7_4.x86_64 9/9

インストール:
php.x86_64 0:5.4.16-43.el7_4 php-pgsql.x86_64 0:5.4.16-43.el7_4

依存性関連をインストールしました:
httpd.x86_64 0:2.4.6-67.el7.centos.6 httpd-tools.x86_64 0:2.4.6-67.el7.centos.6
libzip.x86_64 0:0.10.1-8.el7 mailcap.noarch 0:2.1.41-2.el7
php-cli.x86_64 0:5.4.16-43.el7_4 php-common.x86_64 0:5.4.16-43.el7_4
php-pdo.x86_64 0:5.4.16-43.el7_4

完了しました!

10.3.2 Apache+PHP の設定とテスト

インストールが終わったら、動作テストを行います。
テスト用の PHP を埋め込んだファイル index.php を、Apache が HTML ファイルを参照する/var/www/html ディレクトリ
に作成します。
[root@localhost ~]# echo "<?php phpinfo(); ?>" > /var/www/html/index.php
[root@localhost ~]# cat /var/www/html/index.php
<?php phpinfo(); ?>

Web サーバーを起動します。
以下の例では、systemctl のサブコマンド list-unit-files で httpd の起動に用いるサービス名を確認し、start でサー
ビスを起動、status や ps コマンドで正常に起動したことを確認しています。
[root@localhost ~]# systemctl list-unit-files | grep httpd
httpd.service disabled
[root@localhost ~]# systemctl start httpd.service
[root@localhost ~]# systemctl status httpd.service
● httpd.service - The Apache HTTP Server

LPI-Japan 95 https://oss-db.jp
10 WEB アプリケーションとの連携 10.4 PHP と PostgreSQL の連携

Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)


Active: active (running) since 月 2018-02-05 04:31:17 JST; 7s ago
Docs: man:httpd(8)
man:apachectl(8)
Main PID: 6807 (httpd)
Status: "Processing requests..."
CGroup: /system.slice/httpd.service
tq6807 /usr/sbin/httpd -DFOREGROUND
tq6809 /usr/sbin/httpd -DFOREGROUND
tq6810 /usr/sbin/httpd -DFOREGROUND
tq6811 /usr/sbin/httpd -DFOREGROUND
tq6812 /usr/sbin/httpd -DFOREGROUND
mq6814 /usr/sbin/httpd -DFOREGROUND

2 月 05 04:31:16 localhost systemd[1]: Starting The Apache HTTP Server...


2 月 05 04:31:17 localhost httpd[6807]: AH00558: httpd: Could not reliably determine the server's fully qualifie
2 月 05 04:31:17 localhost systemd[1]: Started The Apache HTTP Server.
Hint: Some lines were ellipsized, use -l to show in full.
[root@localhost ~]# ps ax | grep httpd
6807 ? Ss 0:00 /usr/sbin/httpd -DFOREGROUND
6809 ? S 0:00 /usr/sbin/httpd -DFOREGROUND
6810 ? S 0:00 /usr/sbin/httpd -DFOREGROUND
6811 ? S 0:00 /usr/sbin/httpd -DFOREGROUND
6812 ? S 0:00 /usr/sbin/httpd -DFOREGROUND
6814 ? S 0:00 /usr/sbin/httpd -DFOREGROUND
6825 pts/0 S+ 0:00 grep --color=auto httpd

ブラウザで Web サーバーに接続します。Apache や PHP、PostgreSQL が動作しているマシン上で Firefox などの Web ブラ


ウザを起動し、以下のアドレスを入力してアクセスします。
http://localhost/

同じマシンで Web ブラウザを実行できない場合には、別のマシンから Web サーバーに接続してください。

上記 URL にアクセスすると、index.php に書いておいた phpinfo() 関数が実行され、インストールされている PHP の詳


細な情報が Web ページで表示されます。

10.4 PHP と PostgreSQL の連携

PHP から PostgreSQL に接続し、データを取得して HTML ファイルに組み込む簡単なアプリケーションを作成します。サン


プルアプリケーションを作成して、実行してみましょう。サンプルで使用している PHP で用意された PostgreSQL 用の関数
は以下の通りです。

■10.4.0.1 サンプルで使用している PostgreSQL 用関数

関数名 説明

pg_connect() PostgreSQL に接続します。


pg_query() SQL を実行します。
pg_last_error() エラーを取得します。
pg_num_rows() 行数を取得します。
pg_num_ields() 列数を取得します。

LPI-Japan 96 https://oss-db.jp
10 WEB アプリケーションとの連携 10.4 PHP と PostgreSQL の連携

関数名 説明

pg_ield_name() 列名を取得します。
pg_fetch_object() 行データを取得します。
pg_close() PostgreSQL との接続を終了します。

また、使用している他の(PostgreSQL 操作以外の)関数は以下の通りです。

関数名 説明

htmlspecialchars() 引数の文字列の中から HTML で特別な意味を持つ文字を正しく表示可能な形式に変換しま


す。変換されるのは&や<>といった文字です。
strtoupper() 引数の文字列をすべて大文字にします。

LPI-Japan 97 https://oss-db.jp
10 WEB アプリケーションとの連携 10.4 PHP と PostgreSQL の連携

図 11 phpinfo

10.4.1 データ検索ページの作成

サンプルアプリケーションを作成します。ossdb データベースに PostgreSQL ユーザー postgres で接続し、SQL 文「SELECT


* FROM prod」を実行します。実行した結果は HTML のテーブルとして加工し、Web ブラウザで表示します。

以下のサンプルを適当なファイル名(例 selectProd.php)でディレクトリ/var/www/html に保存します。作業はユーザー


root で行うか、ディレクトリ/var/www/html のパーミッションを変更して適当なユーザーで行ってください。データベース
への接続情報を記述している pg_connect 関数内のパスワードは、各自で設定済みの postgres ユーザーのパスワードに変更
してください。

selectProd.php
<html>
<body>
<?php
$dbcon = pg_connect("dbname=ossdb user=postgres password=password");
if (!$dbcon) {
die("<hr>pg_connect 失敗<hr>");
}
$sql = "SELECT * FROM prod";
echo "SQL=$sql<brx>\n";
$result = pg_query ($dbcon, $sql);
if (!$result) {
pg_last_error($dbcon);

LPI-Japan 98 https://oss-db.jp
10 WEB アプリケーションとの連携 10.4 PHP と PostgreSQL の連携

die( "pg_exec 失敗<hr>");


}
$numrows = pg_num_rows($result);
$fnum = pg_num_fields($result);
echo "<table border>";
echo "<tr>";
for ($x = 0; $x < $fnum; $x++) {
echo "<td><b>";
echo htmlspecialchars(strtoupper(pg_field_name($result, $x)));
echo "</b></td>";
}
echo "</tr>";
for ($i = 0; $i < $numrows; $i++) {
$row = pg_fetch_object($result, $i);
echo "<tr align='center'>";
for ($x = 0; $x < $fnum; $x++) {
$fieldname = pg_field_name($result, $x);
echo "<td>";
echo htmlspecialchars($row->$fieldname);
echo "</td>";
}
echo"</tr>";
}
echo "</table>";
pg_close($dbcon);
?>
</body>
</html>

ファイルを作成したら、Web ブラウザからアクセスして結果を確認します。
http://localhost/selectProd.php

10.4.2 フォームからのデータの取得方法

HTML フォームに入力されたデータを PHP で取得するには、$_POST 変数を使用します。HTML フォームから ACTION


として呼び出された PHP は POST メソッドで送信された値を連想配列として保持しています。$_POST 変数はこの連想
配列にアクセスするための変数です。動作を確認するために、HTML フォームの test.html と PHP プログラム test.php
を/var/www/html ディレクトリに作成します。

test.html
<html>
<body>
<form action="test.php" method="post">
<input type=text name="foo">
<input type=submit>
</form>
</body>
</html>

test.php
<?php
echo htmlspecialchars($_POST['foo']);

LPI-Japan 99 https://oss-db.jp
10 WEB アプリケーションとの連携 10.4 PHP と PostgreSQL の連携

図 12 selectProd

?>

Web ブラウザから test.html を呼び出し、フォームに値を入力して実行ボタンをクリックします。PHP の echo は変数の値を


表示する命令ですので、フォームからの値を Web ブラウザに表示します。
http://localhost/test.html

10.4.3 フォームからの入力を SQL 文に組み込む

PHP で SQL 文を実行するには、一度 SQL 文を文字列変数に代入し、その変数を pg_query 関数に渡します。文字列変


数に代入する際にフォームからの入力を SQL 文に組み込めば、フォーム入力に応じて動作を変更することができます。
selectForm.php ではデータベースにアクセスしますので、pg_connect 関数内のパスワードは各自で設定したパスワードに変
更します。

selectForm.html
<html>
<body>
検索したいテーブル名を入力して下さい。
<form action="selectForm.php" method="post">
<input type=text name="table">
<input type=submit>
</form>
</body>
</html>

LPI-Japan 100 https://oss-db.jp


10 WEB アプリケーションとの連携 10.4 PHP と PostgreSQL の連携

図 13 testhtml

selectForm.php
<html>
<body>
<?php
$dbcon = pg_connect("dbname=ossdb user=postgres password=password");
if (!$dbcon) {
die("<hr>pg_connect 失敗<hr>");
}
$table = $_POST['table'];
$sql = "SELECT * FROM $table";
echo "SQL=$sql<brx>\n";
$result = pg_query ($dbcon, $sql);
if (!$result) {
pg_last_error($dbcon);
die( "pg_exec 失敗<hr>");
}
$numrows = pg_num_rows($result);
$fnum = pg_num_fields($result);
echo "<table border>";
echo "<tr>";
for ($x = 0; $x < $fnum; $x++) {
echo "<td><b>";
echo htmlspecialchars(strtoupper(pg_field_name($result, $x)));

LPI-Japan 101 https://oss-db.jp


10 WEB アプリケーションとの連携 10.4 PHP と PostgreSQL の連携

図 14 testphp

echo "</b></td>";
}
echo "</tr>";
for ($i = 0; $i < $numrows; $i++) {
$row = pg_fetch_object($result, $i);
echo "<tr align='center'>";
for ($x = 0; $x < $fnum; $x++) {
$fieldname = pg_field_name($result, $x);
echo "<td>";
echo htmlspecialchars($row->$fieldname);
echo "</td>";
}
echo"</tr>";
}
echo "</table>";
pg_close($dbcon);
?>
</body>
</html>

作成したフォームにアクセスし、検索したい表の名前を入力します。
http://localhost/selectForm.html

LPI-Japan 102 https://oss-db.jp


11 実習環境の構築方法

図 15 selectFormhtml

11 実習環境の構築方法

11.1 OS のインストール

本書では Linux ディストリビューションは CentOS 7.4 64 ビット版を使用しています。インストール手順には特別なところ


はありませんので、インストーラーのデフォルト設定でインストールします。

11.1.1 OS ユーザーの作成

yum や RPM で PostgreSQL をインストールすると、OS ユーザー postgres が内部的に作成され各プログラムの実行権限が


付与されます。この postgres ユーザーをあらかじめ作成しておくことで、OS ユーザーとしての設定(ホームディレクトリや
環境変数など)の管理がしやすくなりますので本書ではそのように進めます。

以下では useradd コマンドで OS ユーザー postgres を作成、passwd コマンドでユーザーのパスワードを設定しています。そ


の後、postgres ユーザーにログインしてプロンプトの表示やホームディレクトリ位置を確認し、ログアウトしておきます。
[root@localhost ~]# useradd postgres
[root@localhost ~]# passwd postgres
ユーザー postgres のパスワードを変更。
新しいパスワード:
新しいパスワードを再入力してください:
passwd: すべての認証トークンが正しく更新できました。
[root@localhost ~]# su - postgres

LPI-Japan 103 https://oss-db.jp


11 実習環境の構築方法 11.2 PostgreSQL のインストール

図 16 selectFormphp.png

[postgres@localhost ~]$ pwd


/home/postgres
[postgres@localhost ~]$ exit
[root@localhost ~]#

11.1.2 セキュリティの設定

セキュリティの設定では、外部からの攻撃などを受けない環境であることを確認した上で、ファイアーウォールや SELinux
は無効にしていることを想定しています。
[root@localhost ~]# setenforce 0
[root@localhost ~]# systemctl stop firewalld.service

11.2 PostgreSQL のインストール

CentOS では PostgreSQL のバージョン 10 が標準で提供されていないので、yum の外部リポジトリを利用して、PostgreSQL


10 をインストールします。本書では 2018 年 1 月現在の最新版、PostgreSQL 10.1 をインストールします。

11.2.1 手順 1 yum リポジトリの設定

PostgreSQL の最新版は PostgreSQL 開発コミュニティ内の PostgreSQL RPM Building Project により配布されています。


web ブラウザで以下の URL にアクセスすると現在サポートされているバージョンの yum リポジトリ設定用の RPM パッケー
ジが配布されています。

LPI-Japan 104 https://oss-db.jp


11 実習環境の構築方法 11.2 PostgreSQL のインストール

PostgreSQL RPM Building Project * https://yum.postgresql.org/repopackages.php

注意:開発中の最新版(α版、β版や RC 版)が同ページで配布されていることがありますが、不具合修正の後、数か月後に
正式リリースされるものですので、新機能検証などの目的以外では利用しないことを推奨します。

図 17 PostgreSQL RPM Building Project

利用する OS ディストリビューションに対応したリンクを右クリックし、リンクの URL をコピーしておきます。例えば、


CentOS 7 系、PostgreSQL 10 では、以下のような RPM パッケージが直接リンクされています。https://download.post-
gresql.org/pub/repos/yum/10/redhat/rhel-7-x86_64/pgdg-centos10-10-2.noarch.rpm

これを Linux サーバー上の yum install コマンドで指定します。


[root@localhost ~]# yum install https://download.postgresql.org/pub/repos/yum/10/redhat/rhel-7-x86_64/pgdg-cento
読み込んだプラグイン:fastestmirror, langpacks
pgdg-centos10-10-2.noarch.rpm | 4.6 kB 00:0

(中略)

Is this ok [y/d/N]: y
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction

LPI-Japan 105 https://oss-db.jp


11 実習環境の構築方法 11.2 PostgreSQL のインストール

インストール中 : pgdg-centos10-10-2.noarch
検証中 : pgdg-centos10-10-2.noarch

インストール:
pgdg-centos10.noarch 0:10-2

完了しました!

11.2.2 手順 2 PostgreSQL のインストール

手順 1 で PostgreSQL 10 の yum リポジトリが利用できるようになりましたので、必要なパッケージを指定してインストール


します。
[root@localhost ~]# yum install postgresql10 postgresql10-server postgresql10-contrib postgresql10-devel
読み込んだプラグイン:fastestmirror, langpacks
pgdg10 | 4.1 kB 00:00:00
(1/2): pgdg10/7/x86_64/group_gz | 245 B 00:00:01
(2/2): pgdg10/7/x86_64/primary_db | 145 kB 00:00:01
Loading mirror speeds from cached hostfile
* base: ftp.iij.ad.jp
* extras: ftp.iij.ad.jp
* updates: ftp.iij.ad.jp
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ postgresql10.x86_64 0:10.1-1PGDG.rhel7 を インストール
--> 依存性の処理をしています: postgresql10-libs(x86-64) = 10.1-1PGDG.rhel7 のパッケージ: postgresql10-10.1-1PGDG.rhel
--> 依存性の処理をしています: libpq.so.5()(64bit) のパッケージ: postgresql10-10.1-1PGDG.rhel7.x86_64
---> パッケージ postgresql10-contrib.x86_64 0:10.1-1PGDG.rhel7 を インストール
---> パッケージ postgresql10-devel.x86_64 0:10.1-1PGDG.rhel7 を インストール
--> 依存性の処理をしています: libicu-devel のパッケージ: postgresql10-devel-10.1-1PGDG.rhel7.x86_64
---> パッケージ postgresql10-server.x86_64 0:10.1-1PGDG.rhel7 を インストール
--> トランザクションの確認を実行しています。
---> パッケージ libicu-devel.x86_64 0:50.1.2-15.el7 を インストール
---> パッケージ postgresql10-libs.x86_64 0:10.1-1PGDG.rhel7 を インストール
--> 依存性解決を終了しました。

依存性を解決しました

================================================================================================
Package アーキテクチャー バージョン リポジトリー 容量
================================================================================================
インストール中:
postgresql10 x86_64 10.1-1PGDG.rhel7 pgdg10 1.5 M
postgresql10-contrib x86_64 10.1-1PGDG.rhel7 pgdg10 587 k
postgresql10-devel x86_64 10.1-1PGDG.rhel7 pgdg10 2.0 M
postgresql10-server x86_64 10.1-1PGDG.rhel7 pgdg10 4.3 M
依存性関連でのインストールをします:
libicu-devel x86_64 50.1.2-15.el7 base 702 k
postgresql10-libs x86_64 10.1-1PGDG.rhel7 pgdg10 347 k

トランザクションの要約
================================================================================================

LPI-Japan 106 https://oss-db.jp


11 実習環境の構築方法 11.2 PostgreSQL のインストール

インストール 4 パッケージ (+2 個の依存関係のパッケージ)

総ダウンロード容量: 9.3 M
インストール容量: 40 M
Is this ok [y/d/N]: y
Downloading packages:
警告: /var/cache/yum/x86_64/7/base/packages/libicu-devel-50.1.2-15.el7.x86_64.rpm: ヘッダー V3 RSA/SHA256 Signatur
libicu-devel-50.1.2-15.el7.x86_64.rpm の公開鍵がインストールされていません
(1/6): libicu-devel-50.1.2-15.el7.x86_64.rpm | 702 kB 00:00:00
(2/6): postgresql10-contrib-10.1-1PGDG.rhel7.x86_64.rpm | 587 kB 00:00:02
(3/6): postgresql10-10.1-1PGDG.rhel7.x86_64.rpm | 1.5 MB 00:00:03
(4/6): postgresql10-libs-10.1-1PGDG.rhel7.x86_64.rpm | 347 kB 00:00:00
(5/6): postgresql10-devel-10.1-1PGDG.rhel7.x86_64.rpm | 2.0 MB 00:00:01
(6/6): postgresql10-server-10.1-1PGDG.rhel7.x86_64.rpm | 4.3 MB 00:00:03
-----------------------------------------------------------------------------------------------------
合計 1.4 MB/s | 9.3 MB 00:00:06
file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 から鍵を取得中です。
Importing GPG key 0xF4A80EB5:
Userid : "CentOS-7 Key (CentOS 7 Official Signing Key) <security@centos.org>"
Fingerprint: 6341 ab27 53d7 8a78 a7c2 7bb1 24c6 a8a7 f4a8 0eb5
Package : centos-release-7-4.1708.el7.centos.x86_64 (@anaconda)
From : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
上記の処理を行います。よろしいでしょうか? [y/N]y
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
インストール中 : postgresql10-libs-10.1-1PGDG.rhel7.x86_64 1/6
インストール中 : postgresql10-10.1-1PGDG.rhel7.x86_64 2/6
インストール中 : libicu-devel-50.1.2-15.el7.x86_64 3/6
インストール中 : postgresql10-devel-10.1-1PGDG.rhel7.x86_64 4/6
インストール中 : postgresql10-server-10.1-1PGDG.rhel7.x86_64 5/6
インストール中 : postgresql10-contrib-10.1-1PGDG.rhel7.x86_64 6/6
検証中 : postgresql10-server-10.1-1PGDG.rhel7.x86_64 1/6
検証中 : postgresql10-libs-10.1-1PGDG.rhel7.x86_64 2/6
検証中 : postgresql10-devel-10.1-1PGDG.rhel7.x86_64 3/6
検証中 : postgresql10-contrib-10.1-1PGDG.rhel7.x86_64 4/6
検証中 : libicu-devel-50.1.2-15.el7.x86_64 5/6
検証中 : postgresql10-10.1-1PGDG.rhel7.x86_64 6/6

インストール:
postgresql10.x86_64 0:10.1-1PGDG.rhel7 postgresql10-contrib.x86_64 0:10.1-1PGDG.rhel7
postgresql10-devel.x86_64 0:10.1-1PGDG.rhel7 postgresql10-server.x86_64 0:10.1-1PGDG.rhel7

依存性関連をインストールしました:
libicu-devel.x86_64 0:50.1.2-15.el7 postgresql10-libs.x86_64 0:10.1-1PGDG.rhel7

完了しました!

インストールが完了すると、以下の通りディレクトリとバイナリが配置されています。
[postgres@localhost ~]$ ls /usr/pgsql-10/
bin doc include lib share

LPI-Japan 107 https://oss-db.jp


11 実習環境の構築方法 11.2 PostgreSQL のインストール

[postgres@localhost ~]$ ls /usr/pgsql-10/bin


clusterdb ecpg pg_config pg_isready pg_rewind pg_waldump postm
createdb initdb pg_controldata pg_receivewal pg_standby pgbench psql
createuser oid2name pg_ctl pg_recvlogical pg_test_fsync postgres reind
dropdb pg_archivecleanup pg_dump pg_resetwal pg_test_timing postgresql-10-check-db-dir vacuu
dropuser pg_basebackup pg_dumpall pg_restore pg_upgrade postgresql-10-setup vacuu

11.2.3 手順 3 PostgreSQL 利用環境の初期設定

インストール直後はデータベースが作成されておらず、次のステップ以降で利用者が作成します。インストールした
PostgreSQL は、OS ユーザー postgres が初期化ユーザーとして管理権限を持っているので、su コマンドでユーザー postgres
に変更して操作を行います。PostgreSQL に対する各種操作がしやすいように OS 側の設定を行います。なお、データディレ
クトリの位置はデータベース作成時に指定できますが、その際に本項の設定(環境変数と起動スクリプト)が正しく設定され
ている必要があります。本書ではデフォルトの位置(/var/lib/pgsql/10/data)に作成することとします。

■11.2.3.1 環境変数の設定

環境変数 説明

PGDATA データディレクトリ位置を指定します。
PGHOME PostgreSQL のインストールディレクトリを指定します。
PATH PostgreSQL インストールディレクトリ配下の bin を指定します。

以下では、postgresql ユーザーの環境変数設定ファイル .bash_proile を編集し、PGDATA、PGHOME、PATH 環境変数を


追加しています。
[root@localhost ~]# su - postgres
[postgres@localhost ~]$ vi .bash_profile
---------
# .bash_profile

# Get the aliases and functions


if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/.local/bin:$HOME/bin

export PATH

### edit for PostgreSQL 10


export PGDATA=/var/lib/pgsql/10/data
export PGHOME=/usr/pgsql-10
export PATH=$PGHOME/bin:.:$PATH
-------
[postgres@localhost ~]$ source .bash_profile

LPI-Japan 108 https://oss-db.jp


11 実習環境の構築方法 11.2 PostgreSQL のインストール

■11.2.3.2 起動スクリプトの確認

yum や RPM で PostgreSQL をインストールすると、起動停止スクリプトが自動作成されます。先の手順で設定した環境変数


PGDATA が Location of database directory と一致していることを確認します。本書の範囲では変更する必要はありません。
[root@localhost ~]# vi /usr/lib/systemd/system/postgresql-10.service
------
# Location of database directory
Environment=PGDATA=/var/lib/pgsql/10/data/
------

11.2.4 参考 yum を使わないインストール

インターネットへの接続が行えないなどの制限がある場合には、Web サイトから以下のパッケージをダウンロードしてサー
バーに配置し、RPM コマンドでインストールしてください。

11.2.4.0.1 ダウンロード Web ページ

http://yum.pgrpms.org/packages.php

11.2.4.0.2 CentOS 7 64 ビット版用ダウンロード Web ページ

https://yum.postgresql.org/10/redhat/rhel-7-x86_64/repoview/postgresqldbserver10.group.html

LPI-Japan 109 https://oss-db.jp


11 実習環境の構築方法 11.3 データベースの初期化

以下のパッケージをダウンロードしサーバーに配置します。

パッケージ名 説明

postgresql10 PostgreSQL を利用する上で必須のクライアントプログラムやライブラリ


postgresql10-libs PostgreSQL を利用する上で必須の共有ライブラリ
postgresql10-server サーバープログラムの本体
postgresql10-contrib 拡張機能(本書の範囲では必須ではありません)

各パッケージのリンク先にはさらに複数マイナーバージョンが配布されている場合があります。本書ではいずれも 10.1 を利
用しています。

■11.2.4.1 RPM コマンドでインストール

実際にダウンロードするファイルは postgresql10-10.1-1PGDG.rhel7.x86_64.rpm のような RPM 形式です。RPM コマ


ンドでインストールします。postgresql10-libs、postgresql10-server、postgresql10-contrib も同様にインストールします。

[root@localhost ~]# cd <ファイル配置先ディレクトリ>


[root@localhost ~]# rpm -ivh postgresql10-10.1-1PGDG.rhel7.x86_64.rpm

11.3 データベースの初期化

データベースクラスタを作成します。この作業をデータベースの初期化と呼び、インストール後に 1 回だけ行います。

LPI-Japan 110 https://oss-db.jp


11 実習環境の構築方法 11.3 データベースの初期化

11.3.1 データベースクラスタと initdb コマンド

PostgreSQL が管理するデータベースそのもの(実体は OS 上のファイル)や各種設定ファイル、変更履歴ファイル、ログファ


イルなどをひとまとめにしたものをデータベースクラスタと呼びます。初期化とはデータベースクラスタを構成するすべての
ファイルやディレクトリを新規作成することを指します。データベースの初期化は initdb コマンドを使用し、日本語環境で
利用するうえで推奨されている-E utf8 および--no-locale オプションを指定してデータベースを初期化します。

11.3.2 データディレクトリ

データベースクラスタを構成するすべてのファイルやディレクトリは 1 つのディレクトリ配下にまとめて配置されます。この
ディレクトリをデータディレクトリと呼び、環境変数 PGDATA で指定されます。initdb 時、環境変数 PGDATA が参照さ
れ、ここで指定した位置にデータベースクラスタが作成されます。

11.3.3 initdb コマンドの実行

以下の例では、前述の手順の従ってデータディレクトリ位置が環境変数 PGDATA に設定された状態で initdb コマンドを実行


しています。initdb 完了後、cd コマンドでデータディレクトリに移動し、作成されたファイルを確認しています。
[postgres@localhost ~]$ env | grep PGDATA
PGDATA=/var/lib/pgsql/10/data
[postgres@localhost ~]$ initdb -E utf8 --no-locale
データベースシステム内のファイルの所有者は"postgres"ユーザでした。
このユーザがサーバプロセスを所有しなければなりません。

データベースクラスタはロケール"C"で初期化されます。
デフォルトのテキスト検索設定は english に設定されました。

データベージのチェックサムは無効です。

ディレクトリ/var/lib/pgsql/10/data の権限を設定しています ... ok


サブディレクトリを作成しています ... ok
デフォルトの max_connections を選択しています ... 100
デフォルトの shared_buffers を選択しています ... 128MB
selecting dynamic shared memory implementation ... posix
設定ファイルを作成しています ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
データをディスクに同期しています...ok

警告: ローカル接続向けに"trust"認証が有効です。
pg_hba.conf を編集する、もしくは、次回 initdb を実行する時に-A オプショ
ン、または、--auth-local および--auth-host を使用することで変更するこ
とができます。

Success. You can now start the database server using:

pg_ctl -D /var/lib/pgsql/10/data -l logfile start

[postgres@localhost ~]$ cd $PGDATA


[postgres@localhost data]$ ls
PG_VERSION pg_commit_ts pg_ident.conf pg_notify pg_snapshots pg_subtrans pg_wal postgresq
base pg_dynshmem pg_logical pg_replslot pg_stat pg_tblspc pg_xact

LPI-Japan 111 https://oss-db.jp


11 実習環境の構築方法 11.4 データベースを起動

global pg_hba.conf pg_multixact pg_serial pg_stat_tmp pg_twophase postgresql.auto.conf

11.4 データベースを起動

PostgreSQL の起動・停止には systemctl コマンドを使用します。


[root@localhost ~]# systemctl start postgresql-10.service

PostgreSQL が正しく起動されている場合、ステータスは以下のようになります。
[root@localhost ~]# systemctl status postgresql-10.service
● postgresql-10.service - PostgreSQL 10 database server
Loaded: loaded (/usr/lib/systemd/system/postgresql-10.service; disabled; vendor preset: disabled)
Active: active (running) since 月 2018-01-22 01:59:14 JST; 6s ago
Docs: https://www.postgresql.org/docs/10/static/
Process: 22602 ExecStartPre=/usr/pgsql-10/bin/postgresql-10-check-db-dir ${PGDATA} (code=exited, status=0/SUCC
Main PID: 22611 (postmaster)
CGroup: /system.slice/postgresql-10.service
tq22611 /usr/pgsql-10/bin/postmaster -D /var/lib/pgsql/10/data/
tq22614 postgres: logger process
tq22616 postgres: checkpointer process
tq22617 postgres: writer process
tq22618 postgres: wal writer process
tq22619 postgres: autovacuum launcher process
tq22620 postgres: stats collector process
mq22621 postgres: bgworker: logical replication launcher
(以下略)

デフォルトでは手動起動になっているので、システムの起動毎に自動的に起動したい場合には systemctl で enable サブコマ


ンドを指定します。自動起動を無効にする場合は disable を指定します。
[root@localhost ~]# systemctl enable postgresql-10.service
Created symlink from /etc/systemd/system/multi-user.target.wants/postgresql-10.service to /usr/lib/systemd/syste
[root@localhost ~]# systemctl list-unit-files | grep postgres
postgresql-10.service enabled

11.5 動作の確認

データベースの動作確認を行います。PostgreSQL サーバーに対するすべての操作は postgres ユーザーで実施します。


[root@localhost ~]# su - postgres

psql に-l オプションを付けて実行し、作成されているデータベースを確認します。


[postgres@localhost ~]$ psql -l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+---------+-------+-----------------------
postgres | postgres | UTF8 | C | C |
template0 | postgres | UTF8 | C | C | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | C | C | =c/postgres +
| | | | | postgres=CTc/postgres
(3 rows)

LPI-Japan 112 https://oss-db.jp


12 付録 実習の準備方法

12 付録 実習の準備方法

実習で使用するデータベースを作成し、データベースに接続します。そして、表を作成し、初期データを入力します。

12.1 データベースの作成

実習用のデータベース ossdb を作成します。データベースの作成は OS ユーザー postgres で行います。作成後、接続できるこ


とを確認しておきます。
[root@localhost ~]# su - postgres
[postgres@localhost ~]$ createdb ossdb
[postgres@localhost ~]$ psql ossdb
psql (10.1)
Type "help" for help.

ossdb=#

12.2 表の作成

表を作成します。prod 表、customer 表、orders 表の 3 つを作成します。

以下の SQL 文を psql を実行している端末にコピー&ペーストすれば、必要な表が作成されます。


CREATE TABLE prod
(prod_id integer,
prod_name text,
price integer);

CREATE TABLE customer


(customer_id integer,
customer_name text);

CREATE TABLE orders


(order_id integer,
order_date timestamp,
customer_id integer,
prod_id integer,
qty integer);

以下は実行例です。
ossdb=# CREATE TABLE prod
(prod_id integer,
prod_name text,
price integer);
CREATE TABLE
(略)

LPI-Japan 113 https://oss-db.jp


12 付録 実習の準備方法 12.3 データの入力

12.3 データの入力

作成した表に初期データを入力します。以下の SQL 文を psql を実行している端末にコピー&ペーストすれば、初期データが


それぞれの表に入力されます。

-- 複数行を同時に INSERT
INSERT INTO customer(customer_id,customer_name) VALUES
(1,' 佐藤商事'),
(2,' 鈴木物産'),
(3,' 高橋商店');

INSERT INTO prod(prod_id,prod_name,price) VALUES


(1,' みかん',50),
(2,' りんご',70),
(3,' メロン',100);

-- 一行ずつ個別に INSERT し、now() 関数で取得される時刻に差をつける


INSERT INTO orders(order_id,order_date,customer_id,prod_id,qty) VALUES (1,now(),1,1,10);
INSERT INTO orders(order_id,order_date,customer_id,prod_id,qty) VALUES (2,now(),2,2,5);
INSERT INTO orders(order_id,order_date,customer_id,prod_id,qty) VALUES (3,now(),3,3,8);
INSERT INTO orders(order_id,order_date,customer_id,prod_id,qty) VALUES (4,now(),2,1,3);
INSERT INTO orders(order_id,order_date,customer_id,prod_id,qty) VALUES (5,now(),3,2,4);

以下は実行例です。

ossdb=# -- 複数行を同時に INSERT


ossdb=# INSERT INTO customer(customer_id,customer_name) VALUES
(1,' 佐藤商事'),
(2,' 鈴木物産'),
(3,' 高橋商店');
INSERT 0 3
(略)

LPI-Japan 114 https://oss-db.jp


12 付録 実習の準備方法 12.3 データの入力

LPI-Japan 115 https://oss-db.jp

You might also like