web-dev-qa-db-ja.com

postgresコピーの権限をエクスポートファイルに変更

私はSO=でこの質問をしましたが、おそらくそれは間違った場所でした。二重に投稿することをお詫びしますが、質問はここでより良い聴衆を持っているかもしれません。

元の質問は次のとおりです: https://stackoverflow.com/questions/25619290/change-permissions-of-postgres-copy-to-exported-file

そして、テキストは以下です。ありがとう。


Postgresql [9.3]の「COPY TO」機能を実行すると、postgresユーザーがファイルを作成します。 tmpディレクトリにファイルを置くように指示しました(ただし、必要に応じて変更できます)。

これはcronジョブの一部として実行され、ユーザーは特にこのタスク用に設定された「エクスポート」ユーザーです。最終的な目標は、エクスポートされたファイルが最終的に/home/export/created_file.csvになることです。

1)postgresは、フォルダーを過度に許可するように設定しないと、エクスポートされたファイルを別のユーザーのホームディレクトリに直接格納できません。

2)エクスポートユーザーは/tmpからそのホームディレクトリにファイルをコピーできますが、/tmp内のpostgres所有ファイルをクリーンアップ(削除)できません。

これは毎日のプロセスなので、古いファイルは何らかの方法で削除する必要があります。後でファイルをクリーンアップするcronジョブを追加できますが、よりクリーンな解決策-postgresが作成するファイルのアクセス許可を変更する方法、またはエクスポートユーザーに追加の権限を与える方法のいずれかを望んでいました作成前にそのファイルを削除できる権限。

ただし、エクスポートユーザーにpostgresと同じ権限を与えることは、データベースを自由に支配できるため、一般的にはオプションではありません。

UnixベースでもPostgresベースでも、どんなアドバイスでも大歓迎です。

2
Mitch Kent

t(sticky)権限ビット を設定せずにディレクトリを作成し、PostgreSQLにファイルをそこにコピーする必要があります。また、グループを作成プロセスではなくディレクトリから継承するため、ディレクトリをsetgid(g+s)にする必要があります。 setgidディレクトリ を参照してください。

このディレクトリは/tmpに置くこともできますが、個人的には/var/libのような中立的な場所に置くか、または/tmpが自動的にクリーンアップされるため、ボリュームをどこかにマウントします。ディレクトリがない場合は、ディレクトリが再作成されます。

/tmpを使用すると仮定します。

mkdir -p /tmp/pgcsv
chgrp users /tmp/pgcsv
chmod u=rwX,g=rwsX,o= /tmp/pgcsv

そこにcsvを作成します。グループオーナーのusersで自動的に作成され、ユーザーが読みやすくなります(PostgreSQLのumaskの制限が厳しくない場合)。ディレクトリはusers(または使用するグループ)によってグループ書き込み可能であり、t(スティッキー)ビットセットがないため、ユーザーはファイルを削除できます彼らはそれを所有していません。

/tmp/を直接使用するときにこれが機能しない理由は、セキュリティのために/tmpにスティッキービットが設定されているため、user1がuser2によって作成されたファイルを削除して、シンボリックリンクに置き換えることができないためです。次にuser2が書き込みを行い、user1がデータを盗んだり、だまして物事を上書きしたりできるようにします。


別のオプション:

  • export\copyコマンドを使用して、ユーザーpsqlとしてcronジョブを実行します。これにより、クライアント/サーバーソケットを介してデータが書き込まれ、最初にexportユーザーとしてファイルが作成されます。これは非常に単純なオプションであり、直接のCOPYよりも少しだけ遅くなります。
  • rootがPostgreSQL copyを呼び出してcronジョブを実行し、データファイルを移動して、COPYが終了したらその所有権を変更します。
  • エクスポートユーザーに、Sudoを介してrootとして非常に制限されたコマンドを実行し、移動/削除できるようにします。
  • POSIX ACLを使用して、postgresユーザーに/home/exportに書き込むための特別な権限を付与します(ファイルシステムでPOSIX ACLが有効になっている場合)
  • /home/exportのグループ所有者をpostgresに設定し、その権限をg=wxにします。 PostgreSQLは新しいエントリを追加し、書き込み権限があるものを上書きできますが、エントリをリストすることはできません。このオプションはあまり好きではありません。
4
Craig Ringer

私はおそらくこれに非常に遅れていますが、誰かが行き詰まった場合に備えてこれを追加したいだけです:

あなたが実行しているプログラムなので、COPY TO PROGRAMは、selectの結果を入力として受け取る通常のbashコマンドです。ファイルを処理する前に、chmodを追加してファイルのアクセス許可を変更するだけです。

たとえば、次のように変更できます。

COPY (SELECT * from ...) TO PROGRAM 'gzip > my_new_file'

COPY (SELECT * from ...) TO PROGRAM 'gzip > my_new_file_path && chmod 755 my_new_file_path'

コピーを完了する前にファイルへのアクセス許可を設定します。

1
aboedo