上級国民専用SQL関数をどうやってリストアップすべきか
superuser専用SQL関数
最近、PostgreSQLのsuperuser権限でのみ実行可能な操作ってなんじゃろ?というのを調べていたんだけど、その調べ物の一環として、SQL関数についてもsuperuser権限でのみ実行可能なものが何かを調べようとしていた。
最初、システムカタログ pg_proc あたりを調べればすぐに分かるかな?とか軽く考えていたけど、よくよく思い出してみると、そもそもCREATE FUNCTIONやALTER FUNCTIONにそんなオプションなかったよなあと気づいた。
なので、CREATE FUNCTION背景で更新される pg_proc のメンバにもそんなフラグはない。
pg_proc.proacl には権限情報は設定されるが、上級国民たるsuperuserはこの指定は無視するしなあ。
PostgreSQL文書から調べる
PostgreSQL文書のSQL関数の章に、この関数はスーパーユーザのみ実行可能、みたいな記述がある関数はある。
例えば、サーバシグナル送信関数などは
これらの関数の使用は、注記された例外を除き、大抵の場合スーパーユーザのみに制限されています。
とか書いてある。実際、スーパーユーザ権限をもたない、一般国民一般ユーザ権限のユーザ(foo)で実行すると、
[nuko@localhost src]$ psql postgres -U foo -c "SELECT pg_reload_conf()" ERROR: permission denied for function pg_reload_conf [nuko@localhost src]$ psql postgres -U postgres -c "SELECT pg_reload_conf()" pg_reload_conf ---------------- t (1 row)
許可がないと怒られてしまう。上級国民スーパーユーザは問題なく実行できるのに!
PostgreSQL文書に明記されている関数はいいのだが、問題はそうした明記がないような関数だ。
例えば、pg_ls_dir()という指定したパスのディレクトリの内容を一覧表示するSQL関数があるのだが、この関数の説明には実行にスーパーユーザ権限が必要、とは書かれていない(少なくとも自分にはそう書かれていると理解できなかった)。
実際、この関数はスーパーユーザ権限がないと実行できない。
[nuko@localhost src]$ psql postgres -U postgres -c "SELECT pg_ls_dir('.')" pg_ls_dir ---------------------- pg_xlog global pg_clog (中略) postmaster.opts postmaster.pid (24 rows) [nuko@localhost src]$ psql postgres -U foo -c "SELECT pg_ls_dir('.')" ERROR: must be superuser to get directory listings [nuko@localhost src]$
データベースクラスタ内のファイルやディレクトリの情報を、一般ユーザに参照させないというのは分からんでもないが、だとしてもPostgreSQL文書には明記して欲しい気もするのよ。
まあ、ちょいとPostgreSQL的な常識を働かせれば、スーパーユーザ権限でないと実行できない関数というのは、
くらいじゃないかと推測できるのかもしれないが、一応確認してみたくはなる。
で、どうやって調べるか。
結局はソースを当たるしかないのかな・・・
PostgreSQLソース内で、カレントユーザがスーパーユーザ権限なのかどうかを判定するC関数 superuser() というのがあるので、それをリストアップして、使っているSQL関数のソースを探り当てるしかないのかな・・・
[nuko@localhost src]$ find . -name "*.c" | xargs egrep -n "if \(.?superuser\(\)\)" | wc 59 177 3188 [nuko@localhost src]$
9.5のソースだと59箇所あるのか・・・。面倒だのう。
自分でSQL関数を動かして確認するほうが手っ取り早いかなぁ。