PREPARATION
受験対策

OSS-DB入門

第2回 ユーザ管理とセキュリティ

前回はPostgreSQLをインストールしサーバーに接続するところまでを確認しました。
今回は、ユーザ管理とセキュリティの設定をテーマに取り扱います。前回のインストールで作成した環境を使い、実際に手を動かしながら読み進めてください。
なお、文中のSQLは予約語を大文字、それ以外を小文字で表記していますが、すべて小文字で入力しても実行可能です。

PostgreSQLにおけるユーザ

PostgreSQLはマルチユーザのデータベースです。どのユーザでデータベースに接続するかに応じて、実行できるSQLの権限を制御したり、特定のユーザに認証設定をかけたりするといった管理ができるようになっています。
PostgreSQLのインストール時にはデフォルトでユーザpostgresが作成されますが、ここでは、それ以外の新規ユーザの作成やユーザごとの認証設定を通じて、PostgreSQLのユーザ管理・セキュリティ設定について学んでいきたいと思います。

ユーザ操作

まずは端末を立ち上げてください。この時点では、Ubuntuにログインしたときのユーザ(ここでは"ossdb"と仮定します)になっていると思います。プロンプトの先頭はユーザ名@マシン名となっているので、そこを参考にユーザ名を確認してください。
ここで、PostgreSQLサーバーに接続するコマンド

$ psql

を打ってみましょう。次のようなメッセージが表示されるはずです。(図1.データベース接続エラー)
PostgreSQLには"ossdb"というロール(ユーザと同じような意味だと捉えてください)が存在しないと言われてしまいました。
PostgreSQLのインストール時にデフォルトで作成されるユーザはpostgresのみですので、それ以外のユーザでアクセスするためには新規にユーザを登録する必要があります。

1. 登録ユーザの確認

一旦、ユーザpostgresに変更してからPostgreSQLサーバーに接続します。

$ su postgres
$ psql

登録ユーザを確認するには、次のようにpsqlのメタコマンドを使う方法と、SQLを使う方法とがあります。

psqlのメタコマンド: \du

SQL: SELECT * FROM pg_user;

\duを実行して、登録ユーザの一覧を表示させてみます。(図2. ユーザの一覧表示(初期状態))
登録ユーザはpostgresのみであることが分かります。ここに新規ユーザossdbを追加してみましょう。

2. 新規ユーザの登録
ユーザの登録にはCREATE USER文を利用します。

CREATE USER ossdb;
※"createuser ossdb"でも同じ結果が得られますが、createuserコマンドを利用する場合は、一旦データベースへの接続を切ってOS端末から実行する必要があります。

再度\duを実行してみましょう。ossdbが追加されていることが分かります。(図3. ユーザの一覧表示(新規ユーザ追加後))

2列目の値は、ユーザに付与されている権限を表しています。postgresが保有している権限はそれぞれ以下のような意味を持ちます。 Superuser: "スーパーユーザ"であることを示します。 "スーパーユーザ"はデータベース内のアクセス制限をすべて変更することができます。 Create DB: 新規にデータベースを作成できることを示します。 Create Role: 新しいロール(=ユーザ)を作成できることを示します。 ロールを変更することも削除することもできます。 Replication: ロールがストリーミングレプリケーションを初期化でき、システムをバックアップモードとの遷移が可能かどうかを決定します。 これらの権限はCREATE USER文のオプションで付与することができます。またユーザ作成後に変更する場合には、ALTER USER文を利用します。オプションの詳細は以下をご覧ください。 http://www.postgresql.jp/document/9.1/html/sql-createuser.html

3. 新規ユーザからの接続
さて、本当にユーザossdbからも接続できるようになったのでしょうか。
ユーザossdbに戻って確認してみましょう。(PostgreSQLサーバーから抜けるには\qを、postgresを抜けてossdbに戻るにはexitコマンドを使ってください。)

あらためて、ossdbユーザでpsqlコマンドを実行してみます。psqlのみだと、ユーザ名と同じ名前のデータベースに接続しようとするので、postgresデータベースに接続するよう明示的に指定します。(図4. ossdbユーザでのデータベース接続)
PostgreSQLサーバーに接続できるようになったことが確認できました。
なお、プロンプトが「postgres=>」となっているのは、一般ユーザで接続していることを示しています。管理ユーザ(postgres)で接続した場合には「postgres=#」となります。

pg_hba.confの設定

設定ファイルであるpg_hba.confを使えば、データベース接続時の認証設定をユーザ毎に定義することができます。ここでは、ユーザossdbからデータベースに接続する際にパスワード認証を求めるように設定してみましょう。
まずはPostgreSQLユーザのossdbにパスワードを設定します。以下のようにALTER USER文を実行してください。
(図5. ユーザのパスワード設定)
続いてpg_hba.confを編集します。ファイルパスは/etc/postgresql/9.1/main/pg_hba.confとなります。デフォルトではユーザpostgresのみがpg_hba.confへの書き込み権限を持っているので、一度データベースへの接続を切って、ユーザpostgresに変更してから作業を行います。

\q
su postgres
vi /etc/postgresql/9.1/main/pg_hba.conf

pg_hba.confでは、接続元ホスト、接続先データベース、ユーザの組み合わせに対して認証方法を定義します。「Unixドメインソケットでユーザossdbから接続する場合にはパスワード認証を行う」ようにするには、次の図のように

local all ossdb md5

を追加してください。(図6. pg_hba.confの編集)
設定を反映させるために以下のコマンドを実行します。(ユーザpostgresで実行してください。ossdbには実行権限がありませんのでご注意ください。)

service postgresql reload

設定の再読み込みが完了したら、ユーザossdbに変更してデータベースへの接続を試してみます。
(図7. ossdbユーザでのデータベース接続(パスワード認証あり))

パスワード認証が機能していることが確認できました。
pg_hba.confでは、他にも特定のユーザからの接続を拒絶したり、自社ドメインからの接続のみを受け付けるといった様々な設定が可能です。書式の詳細はオンラインマニュアルをご参照ください。
http://www.postgresql.jp/document/9.1/html/auth-pg-hba-conf.html

ネットワーク越しの接続

アプリケーションサーバーとデータベースサーバーといった構成でシステムを組むような場合など、ネットワーク越しにデータベースへアクセスする必要が出てくるケースがあります。ネットワーク接続の設定はpostgresql.confファイルで行います。
ここでは、ファイルの紹介だけにとどめ、特に設定の変更は行いません。
postgresql.confの中身を覗いてみましょう。ファイルパスは/etc/postgresql/9.1/main/postgresql.confとなります。
view /etc/postgresql/9.1/main/postgresql.conf
接続設定を定義する箇所は下図の通りです。(図8. postgresql.confの接続設定部分)
listen_addressesにIPアドレスを追加することで、そのアドレスで接続を受け付けることができるようになります。"*"を指定すれば、ホスト側に設定されたすべてのネットワークインターフェースからの接続を受け付けるようになります。
また、ポート番号を変更したい場合にはportの値を変更してください。
listen_addressesの設定変更を反映させるためには、PostgreSQLを再起動(リロードではなく)する必要があります。ファイル変更後は、

service postgresql restart

を忘れずに行って下さい。

※postgresql.confのパラメータの中にはreloadで反映されるものとrestartが必要なものとが混在しています。ファイル中の"change requires restart"という記述の有無を参考にしてください。

なお、ネットワーク越しの接続認証についても、先で説明したpg_hba.confで設定することが可能です。

以上、具体例に沿ってユーザ管理とセキュリティ設定を見てまいりましたが、PostgreSQLでは、他にもより細かいレベルでユーザ権限を定義したり様々な条件で接続設定を行うことが可能です。設定・書式の詳細はオンラインマニュアルやオープンソースデータベース標準教科書などをご参照ください。

・第 19章クライアント認証
http://www.postgresql.jp/document/9.1/html/client-authentication.html

・第 20章データベースロール
http://www.postgresql.jp/document/9.1/html/user-manag.html

・オープンソースデータベース標準教科書 -PostgreSQL-
http://www.oss-db.jp/ossdbtext/text.shtml

執筆:
市脇 康二 氏(OSS-DB Gold認定者)株式会社オークニージオソリューション事業部 マネージャー
PostGISを含めたFOSS4G(Free Open Source Software for Geospatial)ソフトウェアを活用し、地図やGPS等の位置情報を組み合わせたアプリケーションやサービスの設計・開発に従事。
サービスプラットフォームがクラウドへ、利用シーンがモバイルへと広がりを見せる中、位置情報の更なる活用シーンを模索中。

アドバイザー:
森 亮 氏 株式会社オークニー代表取締役
2002年にオークニーを設立し、代表取締役に就任。マッピング・ GIS・LBS・ITS関連プロジェクトのビジネスコンサルティングを経て、現在は会社経営の傍ら、『入門Webマッピング』(Tyler Mitchell原著;オライリー・ジャパン発行)の翻訳、Open Source Geospatial財団日本支部の代表者を務めるなど、FOSS4G(オープンソース地理空間ソフトウェア)の普及活動に取り組んでいる。

監修:
松田 神一

LPI-Japan
Platinum Sponsors

関連資格