Linux

即使由 postgres 擁有,創建 postgres 表空間權限也被拒絕

  • March 14, 2018

我一直在嘗試在 postgresql 9.5 中創建一個表空間,並且一直遇到權限被拒絕的問題。我終於決定我要創建一個目錄,/看看我是否可以做任何事情,但到目前為止還沒有運氣。

以供參考:

[root@server ~]# cd /
[root@server /]# mkdir test
[root@server /]# chown postgres:postgres test
[root@server /]# su postgres
bash-4.3$ psql
psql (9.5.5)
Type "help" for help.

postgres=# CREATE TABLESPACE test LOCATION '/test';
ERROR:  could not set permissions on directory "/test": Permission denied
postgres=# \q
bash-4.3$ cd test
bash-4.3$ chmod 777 .
bash-4.3$ ls -alh
total 8.0K
drwsrwsrwx.  2 postgres postgres 4.0K Jan 27 20:15 .
dr-xr-xr-x. 19 root     root     4.0K Jan 27 20:15 ..
bash-4.3$ pwd -P
/test
bash-4.3$ psql
psql (9.5.5)
Type "help" for help.

postgres=# CREATE TABLESPACE test LOCATION '/test';
ERROR:  could not set permissions on directory "/test": Permission denied

我什至給出了目錄 777,它顯然歸 postgres 所有。在這一點上,我不確定該怎麼做才能讓它發揮作用。我正在執行 fedora-25。理想情況下,我不想/把它放進去,而是把它放在一個單獨的磁碟上,但我什至無法讓這個基本案例工作。我在這裡遺漏了一些明顯的東西嗎?

您啟用了 SELinux,但錯過了它阻止了這一點。

您可以在審核日誌中看到日誌條目/var/log/audit/audit.log

解決問題的最簡單方法是使用預設數據目錄位置,/var/lib/pgsql並且不要嘗試覆蓋它。相反,將您的儲存安裝在此位置。

我在 Fedora 也遇到過類似的問題。甚至/var/log/audit/audit.log沒有提供任何線索的原因是SElinux。

表空間目錄沒問題。

[me@my /]$ ls -alr /psql
drwx------.  2 postgres postgres 4096 14.Mar 22.56 a
dr-xr-xr-x. 19 root     root     4096 14.Mar 15.13 ..
drwxr-xr-x.  3 postgres postgres 4096 14.Mar 15.21 .

但是 CREATE TABLESPACE 失敗了。

[me@my /]# psql -U postgres 
postgres=# create tablespace test_index location '/psql/a';
ERROR:  could not set permissions on directory "/psql/a": Permission denied
postgres=# \quit

跟踪確認了一個問題:

[me@my /]$ ps ax |grep postgres
18719 ?        S      0:00 /usr/bin/postgres -D /var/lib/pgsql/data
18720 ?        Ss     0:00 postgres: logger process
18722 ?        Ss     0:00 postgres: checkpointer process
18723 ?        Ss     0:00 postgres: writer process
18724 ?        Ss     0:00 postgres: wal writer process
18725 ?        Ss     0:00 postgres: autovacuum launcher process
18726 ?        Ss     0:00 postgres: stats collector process
20446 ?        Ss     0:00 postgres: postgres postgres [local] idle

strace failed:

[me@my /]$ sudo strace -p 20446
strace: Process 20446 attached
epoll_pwait(3, [{EPOLLIN, {u32=2672404064, u64=94302974355040}}], 1, -1, NULL, 8) = 1
recvfrom(11, "Q\0\0\0005create tablespace test_inde"..., 8192, 0, NULL, NULL) = 54
lseek(5, 0, SEEK_END)                   = 8192
chmod("/psql/a", 0700)                  = -1 EACCES (Permission denied)

關閉SElinux終於解決了問題

[me@my /]# setenforce 0
[me@my /]# sestatus
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   permissive
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Memory protection checking:     actual (secure)
Max kernel policy version:      31
[me@my /]# psql -U postgres 
psql (9.6.7)

postgres=# create tablespace test_index location '/psql/a';
CREATE TABLESPACE

strace 成功:

epoll_pwait(3, [{EPOLLIN, {u32=3479758432, u64=94226472298080}}], 1, -1, NULL, 8) = 1
recvfrom(11, "Q\0\0\0005create tablespace test_inde"..., 8192, 0, NULL, NULL) = 54
lseek(5, 0, SEEK_END)                   = 8192
chmod("/psql/a", 0700)                  = 0
mkdir("/psql/a/PG_9.6_201608131", 0700) = 0
symlink("/psql/a", "pg_tblspc/16454")   = 0

注意:將postgres使用者添加到root組沒有幫助。

引用自:https://serverfault.com/questions/829110