2012-09-05 6 views
3

PostgreSQL의 테이블에 파일 COPY을 보내려고합니다. 테이블 소유자가 postgres이고 파일 소유자가 postgres입니다.권한을 부여하는 Postgresql COPY 명령이 거부되었습니다.

파일은 /tmp입니다.

여전히 나는 오류 메시지가 점점 오전 :

읽기위한 파일을 열 수 없습니다 "/ tmp 디렉토리/파일"수 : 권한 내가 같은 잘못하고있는 무슨 이해하지

거부 내가 찾은 모든 게시물은 /tmp에 파일이 있고 소유자가 postgres 인 경우 COPY 명령이 작동해야한다고 말합니다.

+1

사용한 구문과 파일에 대한 사용 권한을 추가하십시오. –

+0

예를 들면, PostgreSQL 버전, Pg 설치 방법, OS와 버전, 파일 사용 권한 ('ls -l filename'과'ls --lcontext filename'), 테이블 사용 권한 ('\ d + tablename 'psql'에서), 당신이 실행 한 명령의 정확한 텍스트 + 오류 메시지가 도움이 될 것입니다. –

답변

5

추측 : 기본적으로 SELinux을 사용하는 Fedora, Red Hat Enterprise Linux, CentOS, Scientific Linux 또는 다른 배포판 중 하나를 사용하고 있습니다.

PostgreSQL에 대한 SELinux 정책에 따라 서버가 PostgreSQL 데이터 디렉토리 외부의 파일을 읽을 수 없거나 대상 정책이 적용되는 서비스에서 파일을 만들었으므로 해당 운영 체제/버전에서 PostgreSQL은 읽을 수 없습니다.

setenforce 0 

다음 다시 테스트 :

이 루트로 실행하여 문제가 있는지 여부를 확인할 수 있습니다. 실행 후 :

setenforce 1 

테스트 후 SELinux를 다시 활성화하십시오. setenforce은 영구적이지 않습니다. SELinux는 재부팅 할 때 자동으로 다시 활성화됩니다. SELinux를 영구적으로 비활성화하는 것은 일반적으로 이와 같은 문제에 대해서는 좋은 해결책이 아닙니다. 문제가 SELinux인지 확인하면 더 자세히 조사 할 수 있습니다. 당신이 등은 사용하고있는 OS 또는 버전 테이블의 파일에 PostgreSQL의 버전을 실행중인 정확한 명령, ls -al, \d+를 지정하지 않은 때문에


, 그것은 더 이상 제공하기 어렵다 세부 사항을 확인하거나 이것이 추측 이상의 것인지 알 수 있습니다. 파일을 모두 업데이트하고 파일의 ls --lcontext도 업데이트 해보십시오.

+0

감사합니다 ... setenforce 0 및 1 방법이 나를 위해 일했습니다. – user1439690

+2

@ user1439690 좋아, 이제 SELinux라는 것을 알게되었습니다. 'setenforce'는 일시적인 값입니다. 올바른 수정은 파일의 SELinux 컨텍스트를 설정하는 것입니다. https://access.redhat.com/knowledge/docs/en-US/Red_Hat_Enterprise_Linux/6/html/Security-Enhanced_Linux/chap-Security-Enhanced_Linux-SELinux_Contexts.html을 참조하십시오. –

1

COPY (파일 이름 포함)은 PostgreSQL 서버가 파일을 직접 읽거나 쓰도록 지시합니다. 이 파일은 PostgreSQL 사용자 (서버가 실행되는 사용자 ID)가 액세스 할 수 있어야하며 서버의 관점에서 이름을 지정해야합니다. (출처 : postgresql documentation)

그래서 파일은 postgresql 서버가 실행중인 (즉, 사용자가 아닌) 유닉스 사용자가 읽을 수 있어야합니다 (또는 쓰기 가능). 절대적으로 확실하려면 sudo -u postgres head /tmp/test.csv을 실행 해보십시오 (사용자가 sudo을 사용하고 데이터베이스 사용자가 postgres라고 가정 할 경우).

이것이 실패하면 SELinux와 관련된 문제 일 수 있습니다 (Craig Ringer의 언급). Red Hat/Fedora/CentOS, Scientific Linux, Debian 및 기타에서 사용되는 가장 일반적인 SELinux 정책 ("대상"참조 정책)에서 ... postgresql 서버 프로세스는 제한되어 있습니다. 몇 가지 파일 유형만 읽기/쓰기 할 수 있습니다 .

donaudit 규칙으로 인해 auditd의 로그 파일 (/var/log/audit/audit.log)에 거부가 기록되지 않을 수 있습니다. 따라서 보통의 SELinux 빠른 테스트는 다음과 같이 적용됩니다. getenforce;setengorce 0;getenforce을 실행하여 SELinux가 모든 프로세스를 제한하지 않도록하고 postgresql의 COPY을 테스트합니다. 그런 다음 setenforce 1을 실행하여 SELinux를 다시 활성화합니다 (이 명령은 구성 파일이 아닌 실행 상태를 수정하므로 재부팅 후 SELinux가 활성화됩니다 (적용).

올바른 방법은 해당 SELinux 컨텍스트의 SELinux 컨텍스트를 변경하는 것입니다. .로드 파일을 빠른 해킹 실행하는 것입니다 :

chcon -t postgresql_tmp_t /tmp/a.csv 

그러나 했나 파일 시스템이 새 파일을 만들 경우 레이블을 다시 지정 또는 경우이 파일 라벨은 살아남지 못할 것이다 당신은 SELinux에 파일 컨텍스트와 디렉토리를 생성해야합니다. 매핑 :

which semanage || yum install policycoreutils-python 
semanage fcontext -a -t postgresql_tmp_t '/srv/psql_copydir(/.*)?' 
mkdir /srv/psql_copydir 
chmod 750 /srv/psql_copydir 
chgrp postgres /srv/psql_copydir 
restorecon -Rv /srv/psql_copydir 
ls -Zd /srv/psql_copydir 

해당 디렉토리에서 생성 된 모든 파일은 자동으로 적절한 파일 컨텍스트를 가져야 만 postgresql 서버에서 해당 파일 컨텍스트를 읽고 쓸 수 있습니다.

은 ( postgresql_t를 인쇄해야 ps xaZ | grep "postmaste[r]" | grep -o "[a-z_]*_t" 실행 실행 포스트 그레스하는 아래의 SELinux 문맥을, 확인합니다. sesearch -s postgresql_t -A | grep ': file.*write'를 사용 postgresql_t 쓸 수있는 상황에 맞는 유형을 나열합니다. 명령 sesearchsetools-console RPM 패키지에 속한).