私は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ベースでも、どんなアドバイスでも大歓迎です。
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として非常に制限されたコマンドを実行し、移動/削除できるようにします。postgres
ユーザーに/home/export
に書き込むための特別な権限を付与します(ファイルシステムでPOSIX ACLが有効になっている場合)/home/export
のグループ所有者をpostgres
に設定し、その権限をg=wx
にします。 PostgreSQLは新しいエントリを追加し、書き込み権限があるものを上書きできますが、エントリをリストすることはできません。このオプションはあまり好きではありません。私はおそらくこれに非常に遅れていますが、誰かが行き詰まった場合に備えてこれを追加したいだけです:
あなたが実行しているプログラムなので、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'
コピーを完了する前にファイルへのアクセス許可を設定します。