나는 당신이 인증 및 권한 부여를 생각하고 있다고 생각합니다 .
LedgerSMB가 여러 클라이언트의 액세스를 염두에두고 설계되었으므로 DB에 보안 모델을 유지하는 것이 현명하다는 데 전적으로 동의합니다. 당신이 미들웨어 층과 3 층을 갈 계획이 아니라면 그것은 만드는 완벽한 특히 회계 응용 프로그램 같은 것을 위해, 데이터베이스 역할로 사용자를하는 것이.
그렇다고 PostgreSQL 지원 인증 방법을 사용하여 데이터베이스에 대해 사용자를 인증 할 필요 는 없습니다 . 데이터베이스 사용자, 역할 및 권한 부여는 원하는 경우에만 권한 부여에 사용될 수 있습니다 .
예를 들어 웹 UI에서 작동하는 방법은 다음과 같습니다.
jane
웹 UI 서버에 연결하고 원하는 방법을 사용하여 인증합니다 (예 : HTTPS X.509 클라이언트 인증서 핸드 셰이크 및 DIGEST 인증). 서버는 이제 사용자로부터 실제로 연결되어 jane
있습니다.
서버는 고정 사용자 이름 / 암호 (또는 Kerberos 또는 원하는 것을 사용)를 사용하여 PostgreSQL에 연결하여 사용자로서 자신을 db 서버에 인증합니다 webui
. db 서버 webui
는 사용자 인증을 신뢰 하므로 webui
적절한 권한을 부여받습니다 GRANT
(아래 참조).
해당 연결에서 서버는 SET ROLE jane;
사용자의 권한 수준을 가정하는 데 사용 합니다 jane
. 까지 RESET ROLE;
또는 또 다른 SET ROLE
실행, 연결은 동일한 액세스 권한으로 작동 jane
하고 SELECT current_user()
등보고합니다 jane
.
서버가 가지고있는 데이터베이스 연결 사이의 관계 유지 SET ROLE
에 jane
사용자의 웹 세션 jane
, PostgreSQL의 연결이 새없이 다른 사용자와 다른 연결에서 사용하는 것을 허용하지 SET ROLE
inbetween을.
이제하는 인증 서버 외부하지만 유지 권한을 서버에. Pg는 어떤 사용자가 있는지 알아야하지만 비밀번호 나 인증 방법은 필요하지 않습니다.
보다:
세부
webui 서버는 쿼리 실행을 제어하며 jane
원시 SQL을 실행 하지 못하게 하므로 웹 UI를 통해 수행 jane
할 수 없습니다 RESET ROLE; SET ROLE special_admin_user;
. 추가 안전을 위해 나는 거부 서버에 문 필터를 추가 할 것 SET ROLE
와 RESET ROLE
연결하지 않는 한 또는 할당되지 않은 연결 풀을 입력했다.
다른 클라이언트에서는 Pg에 대한 직접 인증을 계속 사용할 수 있습니다. 자유롭게 믹스 앤 매치 할 수 있습니다. 당신은 단지에있는 에 대한 사용자 권한을 웹을 통해 로그인 한 다음 해당 사용자에게 어떤 정상적인 제공 할 수 있습니다 사용자가 원하는 권한, 암호, 등. 웹 전용으로 만들려면 데이터베이스에 대한 권한 (및에서 )을 사용하십시오.GRANT
webui
SET ROLE
CONNECT
REVOKE
CONNECT
public
이러한 인증 / 권한 분할을 쉽게하기 위해 새로 만든 모든 사용자에게 특별한 역할 assume_any_user
이 GRANT
있습니다. 그런 다음 GRANT assume_any_user
신뢰할 수있는 웹 프런트 엔드와 같은 항목에서 사용하는 실제 사용자 이름으로 자신이 좋아하는 사용자가 될 수있는 권한을 부여합니다.
역할을 수행 assume_any_user
하는 것이 중요 NOINHERIT
하므로 webui
사용자 나 그 자체로는 권한이 없으며 SET ROLE
실제 사용자 에게만 데이터베이스에 대해 작업 할 수 있습니다 . 어떠한 상황에서도 webui
수퍼 유저 또는 DB 소유자 가되어서는 안됩니다 .
연결 풀링 인 SET LOCAL ROLE
경우 트랜잭션 내에서만 역할을 설정하여 COMMIT
또는 이후에 풀에 연결을 반환 할 수 있습니다 ROLLBACK
. RESET ROLE
여전히 작동 한다는 점에 유의하십시오 . 따라서 클라이언트가 원하는 SQL을 실행하도록하는 것은 여전히 안전하지 않습니다.
SET SESSION AUTHORIZATION
이 명령의 관련이지만 더 강력한 버전입니다. 역할 멤버 자격이 필요하지 않지만 수퍼 유저 전용 명령입니다. 웹 UI가 수퍼 유저로 연결되는 것을 원하지 않습니다. 그것은으로 반전 될 수있다 RESET SESSION AUTHORIZATION
, SET SESSION AUTHORIZATION DEFAULT
또는 SET SESSION AUTHORIZATION theusername
이 두 특권-떨어 보안 장벽되지 않도록 수퍼 유저 권한을 회복 할 수 있습니다.
SET SESSION AUTHORIZATION
역할은 수행했지만 수퍼 유저는 아닌 것처럼 작동했지만 되돌릴 수없는 명령은 훌륭했습니다. 이 시점에서 하나는 없지만주의를 기울이면 인증과 권한을 분리 할 수 있습니다.
예와 설명
CREATE ROLE dbowner NOLOGIN;
CREATE TABLE test_table(x text);
INSERT INTO test_table(x) VALUES ('bork');
ALTER TABLE test_table OWNER TO dbowner;
CREATE ROLE assume_any_user NOINHERIT NOLOGIN;
CREATE ROLE webui LOGIN PASSWORD 'somepw' IN ROLE assume_any_user;
CREATE ROLE jane LOGIN PASSWORD 'somepw';
GRANT jane TO assume_any_user;
GRANT ALL ON TABLE test_table TO jane;
CREATE ROLE jim LOGIN PASSWORD 'somepw';
GRANT jim TO assume_any_user;
이제로 연결하십시오 webui
. 참고 당신은 아무것도 할 수 없어 test_table
하지만 당신은 할 수 SET ROLE
로 jane
및 다음 사용자가 액세스 할 수 있습니다 test_table
:
$ psql -h 127.0.0.1 -U webui regress
Password for user webui:
regress=> SELECT session_user, current_user;
session_user | current_user
--------------+--------------
webui | webui
(1 row)
regress=> SELECT * FROM test_table;
ERROR: permission denied for relation test_table
regress=> SET ROLE jane;
SET
regress=> SELECT session_user, current_user;
session_user | current_user
--------------+--------------
webui | jane
(1 row)
regress=> SELECT * FROM test_table;
x
------
bork
(1 row)
참고 webui
캔 SET ROLE
에 jim
이미 경우에도, SET ROLE
d 내지 jane
에도 불구하고 jane
되지 않은 GRANT
역할을 가정하는 권리를 에드 jim
. SET ROLE
효과적인 사용자 ID를 설정하지만 SET ROLE
현재 역할이 아닌 연결된 역할의 속성 인 다른 역할에 대한 기능을 제거하지는 않습니다 . 결과적으로 SET ROLE
및 RESET ROLE
명령에 대한 액세스를 신중하게 제어해야 합니다. AFAIK SET ROLE
에는 연결 을 영구적으로 할 수있는 방법이 없으며 , 실제로 사용자에게는 좋을 것입니다.
비교:
$ psql -h 127.0.0.1 -U webui regress
Password for user webui:
regress=> SET ROLE jane;
SET
regress=> SET ROLE jim;
SET
regress=> SELECT session_user, current_user;
session_user | current_user
--------------+--------------
webui | jim
(1 row)
에:
$ psql -h 127.0.0.1 -U jane regress
Password for user jane:
regress=> SET ROLE webui;
ERROR: permission denied to set role "webui"
regress=> SET ROLE jim;
ERROR: permission denied to set role "jim"
이것은 SET ROLE
주어진 역할로 로그인하는 것과 정확히 동일하지 않다는 것을 의미합니다 .
webui
수 SET ROLE
에 dbowner
그것이되지 않았기 때문에 GRANT
그 권리 에드 :
regress=> SET ROLE dbowner;
ERROR: permission denied to set role "dbowner"
따라서 자체적으로는 힘이 거의 없으므로 다른 사용자의 권한을 가질 수 있으며 해당 사용자가 웹 액세스를 활성화 한 경우에만 가능합니다.