將 postgres 副本的權限更改為導出的文件
我已經在 SO 上問過這個問題,但也許那是錯誤的位置。為重複發佈道歉,但這個問題可能在這裡有更好的聽眾。
原來的問題是:https ://stackoverflow.com/questions/25619290/change-permissions-of-postgres-copy-to-exported-file
正文如下。謝謝。
執行 postgresql 時
$$ 9.3 $$“複製到”功能,postgres 使用者創建一個文件。我已經告訴它將文件放在 tmp 目錄中(儘管如果需要可以更改)。 這是作為 cron 作業的一部分執行的,使用者是專門為此任務設置的“導出”使用者。最終目標是導出的文件最終位於 /home/export/created_file.csv 中。
1)
postgres
如果不將文件夾設置為過於寬鬆,則無法將導出的文件直接儲存到另一個使用者的主目錄中。2)導出使用者可以將文件從它的主目錄複製到它的主目錄
/tmp
,但不能清理(刪除).postgres``/tmp
這是一個日常過程,因此需要以某種方式刪除舊文件。之後我可以添加一個 cron 作業來清理文件,但我希望有一個更乾淨的解決方案 - 一種更改
postgres
創建文件權限的方法,或者某種方式為導出使用者提供能夠刪除的額外權限該文件在創建之前。然而,為導出使用者提供與一般相同的權限
postgres
不是一種選擇,因為它可以自由支配數據庫。非常歡迎任何建議,無論是基於 unix 還是基於 postgres,謝謝。
您需要創建一個沒有設置
t
(粘性)權限位的目錄,並讓 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。它將使用 group-owner 自動創建
users
,這將使您的使用者可以閱讀(除非 PostgreSQL 的umask
限制太嚴格)。因為該目錄可由users
(或您使用的任何組)組寫入*並且沒有t
設置(粘性)位,*您的使用者可以從中刪除他們不擁有的文件。直接使用時這不起作用的原因是為了安全
/tmp/
而設置了粘滯位/tmp
,因此 user1 無法刪除 user2 創建的文件並將其替換為 user2 然後寫入的符號連結,從而允許 user1 竊取他們的數據/欺騙他們覆蓋東西。其他選項:
export
使用psql
‘s命令以 user 身份執行 cron 作業\copy
,因此它將數據寫入客戶端/伺服器套接字,並export
首先以使用者身份創建文件。這是迄今為止最簡單的選擇,並且只比直接的COPY
.- 讓 cron 作業作為
root
呼叫 PostgreSQL執行,copy
然後在完成後移動數據文件並更改其所有權COPY
。sudo
讓導出使用者能夠通過移動/刪除以 root 身份執行非常受限的命令。- 使用 POSIX ACL 授予
postgres
使用者寫入的特殊權限/home/export
(如果您的文件系統上啟用了 POSIX ACL)- 將 group-owner 設置為
/home/export
topostgres
並設置其權限g=wx
。PostgreSQL 可以添加新條目,並覆蓋它具有寫入權限的任何內容,但不能列出條目。我不太喜歡這個選項。