最終回 SE-PostgreSQLの実運用に向けて


海外 浩平
日本SELinuxユーザ会
2007/11/27


 Labeled IPsecの動きを確認する

 Labeled IPsecの設定が終わったら、クライアント側からサーバ側のSE-PostgreSQLに接続してみましょう。psqlコマンドの-hオプションで接続先のホストを指定します。

[kaigai@masu ~]$ psql -h 192.168.1.10 postgres

 racoonデーモンの鍵交換プロセスが介在する分、若干接続のレスポンスが低下すると思います。接続できなかった場合は、IPsecの設定とPostgreSQLのクライアント認証の設定を見直してください【注2】

【注2】
SE-PostgreSQL/PostgreSQLともに、デフォルト設定ではネットワーク経由の接続をすべて拒否するようになっています。  

外部からの接続を受け付けるには、データベースクラスタ直下のpg_hba.confファイルを編集する必要があります。通常は/var/lib/sepgsql/data/pg_hba.confに配置されています。
 

例えば192.168.1.0/24ネットワークからの接続に対してパスワード認証を要求する場合には、以下の1行を追加します。

host  all   all    192.168.1.0/24   password

より詳しい情報は、PostgreSQL 8.2.5文書「第20章 クライアント認証」を参照してください。

 SE-PostgreSQLへの接続が確立したら、SQL関数sepgsql_getcon()を用いて、自分自身のセキュリティコンテキストを確認してみましょう。

[kaigai@fedora8 ~]$ id -Z
system_u:system_r:unconfined_t

[kaigai@fedora8 ~]$ psql -q -h 192.168.1.10 postgres
Password:
postgres=# SELECT sepgsql_getcon();
       sepgsql_getcon
--------------------------------
system_u:system_r:unconfined_t
(1 row)

postgres=#
リスト4 sepgsql_getcon()でセキュリティコンテキストを確認する

 シェル上でid -Zを実行したのと同様のセキュリティコンテキストが表示されるはずです。ログインシェルのセキュリティコンテキストを標準設定から変更していないにもかかわらず「user_u:user_r:user_t」が表示される場合には、SE-PostgreSQLがクライアント側のセキュリティコンテキストを取得できていません。

 Fallback Context の設定

 さて、先ほどSE-PostgreSQLがクライアント側のセキュリティコンテキストを取得できないケースに言及しました。これは、Labeled IPsecの設定が正しく行われていない、あるいは設定が行われていない場合です。この場合にクライアントのセキュリティコンテキストとして適用されるのは、Fallback Contextと呼ばれるセキュリティコンテキストで、デフォルトでは「user_u:user_r:user_t」に設定されています。

 これを変更するには、設定ファイル/etc/sysconfig/sepostgresqlを作成し、シェル変数SEPGSQL_FALLBACK_CONTEXTにFallback Contextを設定します。

 このファイルは起動スクリプトによって参照され、SE-PostgreSQLの起動パラメータとして渡されます。

SEPGSQL_FALLBACK_CONTEXT="system_u:system_r:unconfined_t"
リスト5 /etc/sysconfig/sepostgresqlの内容例

 SELinux開発者コミュニティでは、Labeled IPsecが設定されていない通信経路からの接続に対して、どのようなセキュリティコンテキストを割り当てるかが議論されました。その中では、接続元のIPアドレスや、接続に利用されているNICごとに、代替のセキュリティコンテキストを付与するということで大まかな方向性が決まったようですが、残念ながら、本稿執筆時点ではまだ利用可能な状態にはなっていません。

 ラベル情報付きバックアップ&リストア

 定期的なデータベースのバックアップは、ディスク故障などに対する有効な対処策です。SE-PostgreSQLでもこれは同様ですが、SE-PostgreSQLはテーブル/カラム/行などのデータベースオブジェクトに対してセキュリティコンテキストを関連付けており、バックアップ&リストアを行った後でも、これが正しく元の状態に復元できていなければ、正しくバックアップ&リストアが可能であるとはいえません。

 オリジナルのPostgreSQLには、pg_dump/pg_dumpallコマンドが同梱されており、ユーザーはこれを利用してデータベースのバックアップを行うことが可能です。しかしながら、この中にはセキュリティコンテキストの情報が含まれていないため、SE-PostgreSQLのデータベースのバックアップにpg_dump/pg_dumpallコマンドをそのまま適用することはできません。

 SE-PostgreSQLではpg_dump/pg_dumpallの各コマンドを拡張し、セキュリティコンテキスト付きバックアップの生成を可能にしています。これらのコマンドは/usr/bin/sepgdumpと/usr/bin/sepgdump_allとしてインストールされ、--enable-selinuxオプションによって有効化されます。

図3 バックアップ&リストアにおけるpg_dumpコマンドとsepg_dumpコマンドの比較

 図3は、オリジナルのpg_dumpコマンドと、SE-PostgreSQLのsepg_dumpコマンドを利用した場合の比較図です。

 pg_dumpで生成したバックアップにはセキュリティコンテキストが含まれていないため、リストア時にはすべて新しいテーブルや行にデフォルトのセキュリティコンテキストが付与されます。

 一方、sepg_dumpで生成したバックアップにはセキュリティコンテキスト情報が含まれています。これをSE-PostgreSQLにリストアすることは、明示的にセキュリティコンテキストを指定したテーブルの作成や行の挿入と同じ意味を持ちます。従って、セキュリティコンテキスト付きのバックアップをリストアする際には、これらの操作を実行するために十分な権限が必要になることに留意してください。

 また、pg_dumpコマンド、sepg_dumpコマンドのどちらを使った場合でも、コマンドを実行したユーザーが読み出すことのできるデータベースオブジェクトだけがバックアップイメージとして出力されます。バックアップといえども、アクセス制御の例外にはなりません。そのため、バックアップ作業はデータベース全体を参照できるだけの権限を持ったユーザーが実行する必要があります。

[kaigai@masu ~]$ sepg_dump postgres --enable-selinux
   :
  (中略)
   :
--
-- Name: drink; Type: TABLE; Schema: public; Owner: kaigai; Tablespace:
--


CREATE TABLE drink (
     id integer NOT NULL CONTEXT = 'system_u:object_r:sepgsql_table_t',
     name text CONTEXT = 'system_u:object_r:sepgsql_table_t',
     price integer CONTEXT = 'system_u:object_r:sepgsql_table_t',
     alcohol boolean CONTEXT = 'system_u:object_r:sepgsql_table_t'
) CONTEXT = 'system_u:object_r:sepgsql_table_t';


ALTER TABLE public.drink OWNER TO kaigai;
   :
  (中略)
   :
--
-- Data for Name: drink; Type: TABLE DATA; Schema: public; Owner: kaigai
--


COPY drink (security_context, id, name, price, alcohol) FROM stdin;
system_u:object_r:sepgsql_table_t       1       coke   110     
f
system_u:object_r:sepgsql_table_t       2       tea     120      f
system_u:object_r:sepgsql_table_t       3       juice   150      f
system_u:object_r:sepgsql_table_t       4       water  120      f
user_u:object_r:sepgsql_table_t:s0:c0   5       wine   340      t
user_u:object_r:sepgsql_table_t:s0:c0   6       beer    240     t
user_u:object_r:sepgsql_table_t:s0:c0   7       coffee 240     f
\.
   :
リスト6 sepg_dumpによるデータベースダンプの結果

 上記の出力結果は、sepg_dumpコマンドに--enable-selinuxオプションを付けてデータベースをダンプしたものの一部です。テーブルや各行のセキュリティコンテキストがデータとともに出力されていることが分かります。

【関連記事】
スイッチ・オン! SELinux
第2回 SELinuxでいろいろバックアップ/リストアしてみた
http://www.atmarkit.co.jp/fsecurity/rensai/selinux202/selinux01.html

2/3

Index
SE-PostgreSQLの実運用に向けて
  Page1
ネットワーク越しのSE-PostgreSQL接続
Labeled IPsecの設定
Page2
Labeled IPsecの動きを確認する
Fallback Context の設定
ラベル情報付きバックアップ&リストア
  Page3
気になるSE-PostgreSQLのパフォーマンス
ユーザーの声が、次のSE-PostgreSQLを作る


SE-PostgreSQLによるセキュアDB構築 連載インデックス


Security&Trust フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Security & Trust 記事ランキング

本日 月間