2014-07-25 3 views
0

나는 Plpython으로 약간의 PostgreSQL 트리거를 만들었습니다. 이 트리거는 파일 시스템에서 조금씩 재생되고, 내 일부 파일을 생성하고 삭제합니다. 생성 된 파일은 "postgres"유닉스 사용자가 소유하고 있지만 다른 사용자가 소유하고 싶습니다. foobar라고합시다. 트리거는 사용자 "foobar"와 함께 설치되며 사용자 "foobar"와도 실행됩니다.주어진 역할을 가진 PostgreSQL 트리거

PostgreSQL 또는 Plpython에서 유닉스 사용자 'foobar'로 SQL 트리거를 실행하는 방법이 있습니까? SET ROLE foobar을 사용해야합니까?

SECURITY INVOKERSECURITY DEFINER을 가지고 노는 것은 충분하지 않은 것 같습니다.

답변

2

운영체제 사용자와 PostgreSQL 사용자가 혼란 스럽습니다.

SECURITY DEFINER을 사용하면 postgresql 사용자 정의 함수를 실행할 수 있습니다. 그러나 PostgreSQL 사용자가 운영 체제 사용자를 실행하고 있더라도 백엔드 서버는 항상 동일하게 실행됩니다. 대개 운영 체제 사용자 postgres입니다.

의도적으로 PostgreSQL 서버는 운영 체제 명령이나 시스템 호출을 다른 운영 체제 사용자로 실행할 수 없습니다. 그것은 심한 보안 구멍이 될 것입니다.

그러나 허용하려면 허용 할 수 있습니다. 당신은 할 수 :

  • 다른 사용자 등의 일부 또는 전부 명령을 실행할 수 sudo 권리 postgres 사용자에게 부여; 또는
  • setuid 실행 권한이있는 프로그램을 작성하여 원하는 것을 수행하고 postgres 사용자에게 실행할 권한을 부여하십시오.

이러한 프로그램을 실행하는 유일한 방법은 plpython이나 plperl 또는 C 확장자와 같은 신뢰할 수없는 절차 언어에서 실행하는 것입니다.'

처음에는 파일 소유권을 설정하려는 이유가 명확하지 않지만 좋은 생각은 아닙니다. PostgreSQL 클라이언트와 서버가 같은 컴퓨터에 있지 않은 경우에는 어떻게해야합니까? PostgreSQL 사용자를위한 운영 체제 사용자가 없거나 사용자 이름이 다른 경우에는 어떻게해야합니까?

2

사용자가 Postgres에서 가정하는 '역할'은 데이터베이스에 로컬입니다. 데이터베이스의 사용자 역할은 데이터베이스 사용 권한을 시행합니다. 그래서, foobar가이 저장된 proc을 실행하거나이 테이블을 선택할 수 있다고 말하면 Postgres는 이것을 강제 할 것입니다. SECURITY INVOKER를 사용하여 프로 시저를 만들면 실행중인 프로 시저가 현재 로그인 된 Postgres 사용자를 사용하여 실행됨을 의미합니다. SECURITY DEFINER는 프로 시저가 생성 된 역할을 사용하여 프로 시저가 실행됨을 의미합니다. 어느 쪽이든, 프로 시저가 Postgres 밖에서 (파일 생성과 같은) 어떤 일을 수행한다면, 당신이 발견 한 것처럼 Postgres를 시작한 아이덴티티로 처리 될 것입니다. 제 경우에는 유닉스 사용자 인 'postgres'를 가지고 있고 Postgres를 시작할 때 나는 그 사용자로합니다. 따라서 생성 된 모든 파일은 'postgres'사용자가 소유하게됩니다.

운영체제에 대해 말씀하지 않으 셨습니다. Windows는 * nix와 다를 수 있습니다. 이 대답은 * nix 용입니다.

저장된 proc 언어가 plpython이라고 언급했습니다. 따라서 파일을 만든 다음 프로 시저에서 파일을 만든 후에 소유권을 변경할 수 있습니다. 마찬가지로 :

import os 
import pwd 

f = open('/tmp/myfile','w') 
f.write('hello') 
f.close() 
user_id = pwd.getpwnam("foobar").pw_uid  
os.chown('/tmp/myfile', user_id, -1) 

포스트 그레스가이 일을해야 실행되는 호스트의는 foobar 사용자가 있다고 가정.

-g

관련 문제