2016-08-11 4 views
1

이 사용자가 COPY 명령을 실행할 수 있도록 새로운 수퍼 유저를 만들었습니다. 수퍼 유저가 아닌 사용자는 복사 명령을 실행할 수 없습니다. 백업 응용 프로그램으로 인해이 사용자가 필요하며 해당 응용 프로그램이 COPY 명령을 실행해야합니다.사용자 포스트 그레스와 수퍼 유저의 차이점은 무엇입니까?

그러나 지정한 모든 제한이 적용되지 않습니다 (아래 참조). 사용자 포스트 그레스와 수퍼 유저의 차이점은 무엇입니까?

내가 원하는 것을 얻는 더 좋은 방법이 있습니까? 나는 보안 정의자를 포스트 그레스 (postgres)라고 부르는 함수를 들여다 보았다. 그것은 여러 테이블에 대해 많은 작업을하는 것처럼 보인다. 그것을 읽거나 서버가 액세스 권한을 가진 파일을 작성 수 있기 때문에 STDOUT에 쓰고 STDIN에서 읽는 것보다 다른 옵션

DROP ROLE IF EXISTS mynewuser; 
CREATE ROLE mynewuser PASSWORD 'somepassword' SUPERUSER NOCREATEDB NOCREATEROLE NOINHERIT LOGIN; 
-- ISSUE: the user can still CREATEDB, CREATEROLE 

REVOKE UPDATE,DELETE,TRUNCATE ON ALL TABLES IN SCHEMA public, schema1, schema2, schema3 FROM mynewuser; 
-- ISSUE: the user can still UPDATE, DELETE, TRUNCATE 

REVOKE CREATE ON DATABASE ip2_sync_master FROM mynewuser; 
-- ISSUE: the user can still create table; 
+0

당신이 뭘 원하는거야 :

여기에 기본 예제? "COPY"할 수있는 슈퍼 유저가 아닌 역할? – Nicarus

답변

1

사용자가 데이터베이스를 실행하지만 수퍼 유저가 아닌 서버에 파일을 쓸 수있는 상황을 설명합니다. 불가능하지는 않지만 확실히 이상합니다. DB 서버에 액세스 할 수있는 사람을 선택하는 것이 매우 중요합니다.

그런데 이런 상황이 발생하면 postgres 사용자가 소유 한 테이블 (copy 사용)을로드하고 함수를 실행할 권한을 사용자에게 부여하는 함수를 만듭니다. 파일 이름을 매개 변수로 전달할 수 있습니다.

사용자가 원하는 경우 사용자 및 테이블 테이블을 만들어 사용자가 어떤 테이블에 업로드 할 수 있는지 정의하고 테이블 이름도 매개 변수로 지정할 수 있습니다.

꽤 이상한 일이지만 생각입니다.

CREATE OR REPLACE FUNCTION load_table(TABLENAME text, FILENAME text) 
    RETURNS character varying AS 
$BODY$ 
DECLARE 
    can_upload integer; 
BEGIN 

    select count (*) 
    into can_upload 
    from upload_permissions p 
    where p.user_name = current_user and p.table_name = TABLENAME; 

    if can_upload = 0 then 
    return 'Permission denied'; 
    end if; 

    execute 'copy ' || TABLENAME || 
    ' from ''' || FILENAME || '''' || 
    ' csv'; 

    return ''; 
END; 
$BODY$ 
    LANGUAGE plpgsql VOLATILE 
    COST 100; 
+1

tablename에'execute'quote_identifier()를 추가하고 filename에 quote_literal()을 사용하십시오. – Jasen

+0

이 아이디어는 postgres에 의해 함수의 소유자가되는 것이 매우 좋습니다. 일반 사용자가 실행하지만 이것은 나에게 적합하지 않습니다. 여전히 COPY가 수퍼 유저를 필요로한다고 말하는 오류가 발생했습니다. – pillesoft

+0

@pilesoft - 수퍼 유저 기능의 소유자입니까? – Hambone

0

COPY는 데이터베이스에 대한 슈퍼 유저 역할을 허용됩니다. 서버에서 파일이되지 않도록 "는 COPY하지만/... TO STDOUT... FROM STDIN를 호출 의미 -

\copy

COPY와 동일한 기능을 제공하지만, 이렇게 로컬 파일을 처리 할 수있는 서버에면하지 않는 psql의 클라이언트 커맨드 만져 ".

수퍼 유저로부터 특정 권한을 취소 할 수 없습니다. 나는이 일에 문서를 인용하고 있습니다 :

Docs: Access DB 슈퍼 유저 인

당신이 액세스 제어의 대상이되지 않음을 의미합니다. 데이터베이스 내의 모든 액세스 제한을 재정의 할 수 있습니다

Docs: CREATE ROLE

"수퍼 유저". 수퍼 유저 상태는 위험하므로 실제로 필요할 때만 사용해야합니다.

+1

엄밀히 말하자면, 'COPY'는 슈퍼 유저가 아닌 사람들에게는 허용되지만, COPY ... TO STDOUT/COPY ... STOM으로만 가능합니다. '\ copy'가 사용하는 것은 무엇입니까.psycopg2, PgJDBC 등의 다른 클라이언트는 수퍼 유저 없이도'COPY'를 사용할 수 있기 때문에 서버의 디스크에있는 파일이 아닌 클라이언트로/클라이언트에서 행을 스트리밍하기 때문에이 문제가 중요합니다. –

+0

@CraigRinger 나는 COPY 부분을 강조했다. 기여 해줘서 고마워. –