PostgreSQLでCOPYを使う時のSELinux設定を教えてもらった

PostgreSQLでCOPYを使ってCSV取込を行おうとしたところ「許可がありません」と表示され取り込むことができなかった。調べたところSELinuxが悪さをしている模様。いつもならすぐさまSELinuxを停止するんだけど、今回は様子が違うようで...
11
ishikawa84g @ishikawa84g

@kazuhisa1976 おー。よかったです。やや長いですが、解説してもいいですか?

2012-07-19 20:15:31
ishikawa84g @ishikawa84g

@kazuhisa1976 PostgreSQLがpostgresql_t というドメインで動いているはずです(ps axZ|grep postgres)。このドメインがファイルを open search getattr できるディレクトリでなければファイルを読むことが出来ません

2012-07-19 20:16:31
ishikawa84g @ishikawa84g

@kazuhisa1976 初め、HOMEDIR にファイルを置いていました。ここを postgresql_t が参照することはできません。確認方法は「sesearch -A -C -s postgresql_t -t user_home_t -c file」

2012-07-19 20:18:20
ishikawa84g @ishikawa84g

@kazuhisa1976 ディレクトリの search 権限が与えられていないため、Permission Denied となっていました。さらに初めにログが抑止されているかも、といった通りディレクトリに対するログ抑止の設定が入っていました。

2012-07-19 20:24:46
ishikawa84g @ishikawa84g

@kazuhisa1976 具体的には /home/USER が持つ user_home_dir_t に対する拒否ログ抑止です。確認方法は sesearch --dontaudit -s postgresql_t -t user_home_dir_t

2012-07-19 20:25:36
ishikawa84g @ishikawa84g

@kazuhisa1976 semaange dontaudit off して貰うことで解決することで解決が早まったはずなのですが、なぜログ出力が回復しなかったかは不明です。。

2012-07-19 20:26:35
ishikawa84g @ishikawa84g

@kazuhisa1976 postgresql_t からファイルを読めるようにする一番早い方法は既にアクセス許可が与えられているファイルコンテキスト(ラベル)を与えるです。

2012-07-19 20:28:41
ishikawa84g @ishikawa84g

@kazuhisa1976 /var/lib/pgsql/data への移動 & restorecon がまさにそれで、postgresql_t が参照できる postgresql_db_t のファイルコンテキストを hogehoge.csv に与えました。

2012-07-19 20:30:13
ishikawa84g @ishikawa84g

@kazuhisa1976 こうすることで、PostgreSQL のデーモンが CSV ファイルを読み込めるようになった。というわけです。

2012-07-19 20:30:47
Yamamoto Kazuhisa @kazuhisa1976

@ishikawa84g 今回はcsvファイルが毎日更新されるのですが大丈夫でしょうか?ディレクトリに対してアクセス権を与えることができますかね?

2012-07-19 20:30:09
ishikawa84g @ishikawa84g

@kazuhisa1976 /home 以下に取得し続ける場合はポリシーを自作追加する必要があります。また、セキュリティ的に弱くなります。

2012-07-19 20:31:35
ishikawa84g @ishikawa84g

@kazuhisa1976 おすすめはどこかに新規のディレクトリを作り、postgresql_db_t を与えるのが良いと思います。

2012-07-19 20:32:04
ishikawa84g @ishikawa84g

@kazuhisa1976 たとえば、mkdir /csv ; semanage fcontext -a -t postgresql_db_t "/csv(/.*)?" ; restorecon -RFv /csv

2012-07-19 20:32:46
Yamamoto Kazuhisa @kazuhisa1976

@ishikawa84g なるほど。/home以外のディレクトリを作成してそこにファイルを置くようにすべきということですね。

2012-07-19 20:33:01
ishikawa84g @ishikawa84g

@kazuhisa1976 ですね。/home はそもそも見れないので諦めるかヒャッハー!!キョカダー!!と許可するしかないです。

2012-07-19 20:33:42
ishikawa84g @ishikawa84g

@kazuhisa1976 こうしている理由は、PostgreSQL が乗っ取られた場合、権限のないファイルを読ませないようにするためです。psql の中からファイルオープンコマンドが使えますので、SELinux ではこれの影響範囲を絞りたいと考えています。

2012-07-19 20:35:18
Yamamoto Kazuhisa @kazuhisa1976

@ishikawa84g お、今/csvをls -Zで確認してみたら system_u:object_r:postgresql_db_tになってますね。

2012-07-19 20:35:30
ishikawa84g @ishikawa84g

そこに作ったファイルは postgresql_db_t が付くはずです。

2012-07-19 20:35:53
ishikawa84g @ishikawa84g

@kazuhisa1976 ただし、mv だとラベルを保持したまま移動してくるのでダメですw

2012-07-19 20:36:17
ishikawa84g @ishikawa84g

これとぅぎゃっておいたら役に立つ?<PostgreSQL が CSV ファイルを読めない件( vs SELinux)

2012-07-19 20:37:16
Yamamoto Kazuhisa @kazuhisa1976

@ishikawa84g おおお。/csvにhogehoge.csvをコピーして取り込むとうまく行きました!これが正しい姿なのですね!

2012-07-19 20:38:17
ishikawa84g @ishikawa84g

@kazuhisa1976 そこは運用ポリシーにもよりますが、大体そんな感じです。笑

2012-07-19 20:39:01
Yamamoto Kazuhisa @kazuhisa1976

@ishikawa84g 初めてSELinuxの設定を行いました。実行中のプログラムが何のラベルを使ってるかはps axZコマンドで確認して、適切なファイルやフォルダにsemanageでラベルを付けていくという感じでしょうか?

2012-07-19 20:40:47