2done.org

Linuxメインなメモ書き。二度寝してから書く。(ご意見は Twitter あたりで。そのうちコメント欄つけます。)

PostgreSQL 9.1.0 で SE-PostgreSQL

本構築は、Fedora 15 を最小インストールして、以下のパッケージを追加した状態で行っています。

必要に応じて入れたり外したりしてください。

# yum -y install gcc gcc-c++ make man wget vim-enhanced which less lv git policycoreutils-python strace mlocate policycoreutils-newrole setools-console libsemanage-python libselinux-python3 libselinux-devel libsepol-devel libsepol libsemanage-devel libsemanage libselinux-ruby selinux-policy-mls readline-devel openssl-devel zlib-devel

作者の海外さん曰く、インストール方法はここ参照とのことです。

1. PostggreSQL 9.1.0 インストール

手元に tar ボールがある前提です。

http://www.postgresql.org/ftp/source/v9.1.0/

$ ./configure --with-selinux
$ make
$ sudo -s
# make install
# cd ./contrib/start-scripts/
# chmod 755 linux
# cp -p linux /etc/init.d/postgresql
# useradd postgres
# echo 'export PATH=/usr/local/pgsql/bin:$PATH' >> ~postgres/.bash_profile
# echo 'export PGDATA=/usr/local/pgsql/data' >> ~postgres/.bash_profile
# mkdir /usr/local/pgsql/data
# chown -R postgres:postgres /usr/local/pgsql/data
※ 以降、プロンプトが $ で始まっている行の作業は postgres ユーザで行うものとします。

2. データベース・クラスタを初期化

$ su - postgres
$ initdb --no-locale

3. SE-PostgreSQL 用モジュールインストール

contrib から SE-PosgreSQL 用のモジュールをインストールします。

# cd $SRCDIR/contrib/sepgsql
# make
# make install

4. 各種ラベル設定

PostgreSQL が正しいラベルで動作するようラベル付けを行います。(た、多分、正しいです。)

# semanage fcontext -a -t postgresql_db_t "/usr/local/pgsql/data(/.*)?"
# semanage fcontext -a -t postgresql_exec_t "/usr/local/pgsql/bin/initdb"
# semanage fcontext -a -t postgresql_exec_t "/usr/local/pgsql/bin/postgres"
# semanage fcontext -a -t lib_t "/usr/local/pgsql/lib(/.*)?"
# semanage fcontext -a -t locale_t "/usr/local/pgsql/share/timezone.*"

5. postgresql.conf の設定

インストールした SE-PosgreSQL 用のモジュールを読み込むよう設定します。

# vim /usr/local/pgsql/data/postgresql.conf
shared_preload_libraries = '$libdir/sepgsql' を追加

6. ラベル再設定

オブジェクトに設定したラベルを再割り当てします。

# restorecon -RF /usr/local/pgsql
# restorecon -RF /etc/rc.d/init.d

7. SE-PostgreSQL 用 Function 追加

/usr/local/pgsql/share/contrib/sepgsql.sql の内容に従います。サンプルには「\」が多く付いているので注意が必要です。

$ for DBNAME in template0 template1 postgres; do
postgres --single -F -O -c exit_on_error=true $DBNAME \
< /usr/local/pgsql/share/contrib/sepgsql.sql > /dev/null
done

libselinux のバージョンによっては以下のようなメッセージが出力される場合がありますが無害だそうです。

/etc/selinux/targeted/contexts/sepgsql_contexts: line 33 has invalid object type db_blobs
/etc/selinux/targeted/contexts/sepgsql_contexts: line 36 has invalid object type db_language
/etc/selinux/targeted/contexts/sepgsql_contexts: line 37 has invalid object type db_language
/etc/selinux/targeted/contexts/sepgsql_contexts: line 38 has invalid object type db_language
/etc/selinux/targeted/contexts/sepgsql_contexts: line 39 has invalid object type db_language
/etc/selinux/targeted/contexts/sepgsql_contexts: line 40 has invalid object type db_language

8. サーバ起動

# run_init /etc/init.d/postgresql start
# ps axZ | grep post

9. とりあえず、作ってつなぐ

$ createdb sample
$ psql sample
sample=# SELECT sepgsql_getcon();
sepgsql_getcon
-------------------------------------------------------
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
(1 row)

一応、これで使える環境が整いました。

実際の使い方についてはドキュメントやサンプルを見ながら追々と。