他のバージョンの文書 15 | 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

68.3. プランナの統計情報とセキュリティ

テーブルpg_statisticへのアクセスはスーパーユーザのみに制限されているため、一般ユーザはこのテーブルを使って他のユーザのテーブル内容について調べることはできません。 選択性推定関数には保存されている統計情報を解析するためにユーザ定義の演算子(問い合わせに現れる演算子あるいは関連する演算子)を使うものがあります。 例えば、保存されている最頻値を適用できるかどうかを調べるためには、選択性推定関数は適切な=演算子を実行して問い合わせ内の定数を保存されている値と比較する必要があるでしょう。 従って、pg_statistic内のデータは、潜在的に、ユーザ定義演算子に渡される可能性があります。 巧妙に作られた演算子を使うと、渡された引数を意図的に漏らす(例えば、それをログに出力する、他のテーブルに書き出すなど)、あるいはその値をエラーメッセージに出力することで偶然に漏らすことが可能で、いずれにせよpg_statisticのデータを、それを見ることができないはずのユーザに対して露出する可能性があります。

このことを防ぐため、すべての組み込みの選択性推定関数には以下のことが適用されます。 問い合わせの計画を作成するとき、保存されている統計情報を使用できるためには、現在のユーザはテーブルあるいは対象の列にSELECT権限を持っている必要がある、あるいは使用する演算子(正確には、演算子の元となる関数)がLEAKPROOFである必要があります。 そうでないときは、選択性推定はあたかも利用可能な統計情報がないかのような動作をし、プランナはデフォルトあるいは代替の推定に従って処理をします。

ユーザがテーブルや列について必要な権限を持っていない場合、最終的には権限不足のエラーを受け取ることが多いでしょう。 この場合、上記の仕組みは実際にはユーザからはわかりません。 しかし、ユーザがセキュリティバリアビューから読み取ろうとしている場合、プランナはそのビューの元となっているテーブルの統計情報を検査したいと思うかもしれず、またユーザはそのテーブルにはアクセス権がないかもしれません。 その場合は、演算子がリークプルーフ(leak-proof)でなければ、統計情報は使用されません。 そのことについての直接的なフィードバックは何もなく、プランが理想的ではないかもしれないというだけです。 このことが起きているかもしれないと思った場合は、より権限のあるユーザで問い合わせを実行して、異なる計画が得られるかどうか調べることができます。

この制限は、プランナがpg_statisticの1つ以上の値についてユーザ定義演算子を実行する必要がある場合にのみ適用されます。 従って、列内でのNULL値の割合や異なる値の個数といった一般的な統計情報については、プランナはアクセス権限に関わらず使用することが許されています。

サードパーティの拡張に含まれる選択性推定関数で、ユーザ定義演算子で統計情報の演算をする可能性のあるものは、同じセキュリティ規則に従うべきです。 そのための手引については、PostgreSQLのソースコードを参照してください。