CentOS7にPostgreSQL9系をインストールする方法

Pocket

今回はCentOS 7上にPostgreSQLをインストールする方法を紹介します。yumでのインストールはコマンド一発で終了してしまうので、ソースからのインストール方法と基本的な設定方法を説明します。

この記事の環境

OS、ミドルウェア バージョン等
CentOS 7.2
PostgreSQL 7.0
PostgreSQLインストールディレクトリ /usr/local/pkg/postgresql-9.6.1
PostgreSQLデータディレクトリ /data/pgsql

事前準備

依存ライブラリのインストール

PostgreSQLのインストールを行うには、gcc-c++、readline-devel、zlib-develが必要になるので、yumでインストールします。

ユーザーおよびインストールディレクトリの作成

インストールおよび動作させるユーザーを作成します。ここで作成したユーザーで、PostgreSQLのインストールと、PostgreSQLの実行ユーザーとして使用します。

先程作成したユーザーでPostgreSQLをインストールするために、予めインストールディレクトリを作成します。
この操作を行うことで、rootユーザー以外でもホームディレクトリ以外の指定したディレクトリにインストールすることができます。

インストールおよび初期設定

インストール

PostgreSQLのインストールを行います。日本PostgreSQLユーザー会のページからソースファイルをダウンロードしてインストールを行います。
ソースファイルのURLは以下の方法で取得できます。

  1. 日本PostgreSQLユーザー会のページ上部にあるダウンロードリンクをクリックします。

    日本PostgreSQLユーザー会 公式HP

  2. ダウンロードページにあるsourceのURLをクリックします。

    日本PostgreSQLユーザー会 ダウンロードページ

  3. PostgreSQL公式サイト(英語)のFile Browserページへ遷移しますので、インストールしたいバージョン(今回はv9.6.1)をクリックします。

    PostgreSQL FIle Browser source

  4. PostgreSQL公式サイトで用意しているファイルの一覧が表示されますので、扱いやすいファイルのURLをコピーしてください。今回はtar.gzファイルを使用します。

    PostgreSQL File Browser v9.6.1

ダウンロードできたら、解答してコンパイルおよびインストールを行います。
ソースコードからインストールする場合は、インストール先はすべて一箇所に纏めておいたほうがバージョンアップ等が行いやすいため、configureオプションは–prefixのみ指定します。

以上でインストール自体は終了ですが、後々のバージョンアップを行った際の手間を削減するためにシンボリックリンクを作成します。

データベースの初期化

PostgreSQLのデータベースの保存領域を作成するために、データベースの初期化を行います。
まずはデータベースの保存領域であるデータディレクトリを作成します。ここもPostgreSQL実行ユーザーでファイルが作成されますので、上で作成したユーザーの権限にしておきます。

初期化を行うにはinitdbコマンドを使用します。initdbコマンドを使用する場合は、rootユーザーではできませんので注意してください。

これでデータベースの初期化が完了しました。initdbコマンドを実行すると、作成したデータディレクトリのアクセス権が700に変わっているので確認してください。このディレクトリにはPostgreSQLの設定ファイルが保存されており、第三者が操作できるようになっている場合は情報を抜き出したり、データを削除したりすることができてしまいますので十分に注意してください。

この後に説明する起動スクリプトの設定変更を行わないようにするために、データディレクトリのシンボリックリンクを作っておきます。

自動起動設定

PostgreSQLをサービスとして登録します。
起動スクリプトは、ダウンロードしたソースファイルの中にありますのでそれを流用します。

もし、複数のPostgreSQLをインストールしたり、データディレクトリを複数持たせたりする場合は、起動スクリプトのprefixやPGDATAを修正する必要があります。

起動スクリプトの準備ができたら、実行権限を与えてPostgreSQLを起動します。

ユーザー設定

PostgreSQLを操作するユーザーの設定を行います。

postgresユーザーのパスワード変更

initdbを実行するとデフォルトでpostgresというスーパーユーザーがデータベース上に作成されます。CentOS上に作成したpostgresユーザーとは別物ですので注意してください。
まずはデータベース上のpostgresユーザーのパスワードを変更します。インストール直後はパスワードが無しの状態になっていますので、必ず設定するようにしてください。

操作ユーザーの作成

次に、データベースを操作するユーザーを作成します。postgresユーザーはスーパーユーザーであり、このユーザーでも操作することについて何の問題もありませんが、逆に何でもできてしまうため誤ってデータやデータベースを削除してしまったり、悪意のあるユーザーに乗っ取られた場合には被害が大きくなってしまいます。よって、スーパーユーザーよりも権限の低いユーザーを使用して操作を行います。

ユーザーの作成方法は2種類あります。createuserというシェル(shell)コマンドを使用するか、SQLのCREATE USERおよびALTER ROLEを使用するかになります。

シェルコマンドの場合(この操作もrootユーザーではできませんので注意してください。)

SQLの場合

データベースの作成およびユーザーの所有権の紐付け

データベースの初期化と、ユーザーの作成ができたらデータベースを作成します。

データベースの作成

データベースの作成方法は2種類あります。createdbというシェル(shell)コマンドを使用するか、SQLのCREATE DATABASEを使用するかになります。

シェルコマンドの場合

SQLの場合

データベースとユーザーの紐付け

データベースが作成できたら、先程作成したユーザーにこのデータベースの操作権限を与えます。今回与える権限は、先程作成したデータベースに対しての全権限を与えます。

アクセス制限

外部接続制限

ユーザーとデータベースの作成が完了したら、そのデータベースへのアクセス制限を設定します。デフォルトのままだと、外部(このマシン以外)からの接続はすべて拒否しており、内部(このマシン)からデータベースにアクセスするとパスワード認証無しで操作することができてしまいます。
JavaやPHPなどからデータベースへ接続する際にもこの設定がされていないと接続できない場合があります。

外部からのアクセスを限定して許可する方法です。データディレクトリにあるpostgresql.confおよびpg_hba.confというファイルで管理していますので、そのファイルを修正します。

このファイルでそもそも外部からの接続を許可するかどうかを設定しています。

lieten_addressesの項目が、localhostの場合は外部からの接続はできず、*(アスタリスク)にすることで外部からの接続が許可されます。デフォルトはlocalhostになっています。

このファイルの書式はこのファイル内に書いてありますが、外部からのアクセスを制御しているのはADDRESSという部分です。
このADDRESSという部分で許可するネットワーク範囲を設定します。
以下のサンプルでは、ローカルホスト(このマシン)と、192.168.1.0~192.168.1.255までのIPを持つマシンからの接続を許可するようになっています。

データベース接続認証

データベースへ接続する際にデフォルトの場合はユーザー名とデータベースを入力しただけでログインできてしまいます。セキュリティを考慮してパスワードなどの認証を行うようにします。

データベースの認証についてはMETHODという部分で制御をしています。
METHODに指定できる値はいくつかあります。

trust
認証なし。
md5
パスワードをmd5でハッシュした形で保存し認証します。
password
パスワードを平文で保存し認証します。
ident
OSのユーザーと一致しているかどうかで認証します。OS上とデータベース上で同じユーザー名のユーザーが存在する必要があります。

以下の例ではローカルマシン上ではOSのユーザーと同じユーザーであれば認証が承認され、それ以外(ローカルマシン上でホストを指定した場合も含む)の場合は、md5ハッシュを使用したパスワード認証が行われます。

作成したユーザーでデータベースを操作する

以上の操作を行うことで、データベースとユーザーの組み合わせで操作することができるようになります。

データベース名 sample_db
ユーザー名 sample
テーブル名 tbl_sample

以下のようなテーブル(sample)を作成します。

カラム名 制約
id integer primary key, not null
name text not null
job text

以上で、CentOS 7上にPostgreSQL9系のインストールおよび初期設定は完了です。

Pocket

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です