database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
ㆍPostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
PostgreSQL Q&A 7045 게시물 읽기
No. 7045
타 DB 정보 열람 등등...
작성자
tyro
작성일
2007-02-12 11:25
조회수
4,897

postgresql 8.1 사용중입니다.


특정 유저가 특정 DB 에 접근할 수 있다면

모든 DB 리스트를 다 볼 수 있는데  이거 어떻게 mysql 처럼 자신의 것만 볼 수 있게 할 수 있는 방법이 없을까요?

DB 리스트는 물론이고 owner 와 테이블 구조, 심지어는 function, trigger, view 등의 구조도 모두 다 볼 수가 있습니다.


레코드에 직접 액세스 할 수 없다는 거 뿐이지..
구조를 전체 다 볼 수 있으니....조금은 곤란한 문제가 생길 거 같습니다.

특히 onwer 를 알 수 있으니 비밀번호를 같게 하거나 혹은 유추하여 원하는 DB 의 내용을 볼 수 있는 가능성을 가지게 하는거 같아서요..

이 글에 대한 댓글이 총 7건 있습니다.

분명 보안상 문제가 되겠네요.

한번 검색해봐야 할 듯 합니다.

박성철(gyumee)님이 2007-02-12 16:39에 작성한 댓글입니다.

이곳 게시판에서 몇번 다룬 문제인데요. 

PostgreSQL의 접근 권한은 초기값이 모든 user 에게 읽기 전용으로 열려 있습니다.

이 정책은 10여년 전이나 지금이나 바뀌지 않았습니다.


특정 사용자가 특정 데이터베이스 접근 권한을 조정해야할 필요가 있다면, 

방법은 두가지 인데요. 

하나는 pg_hba.conf 에서 사용자별 접근할 수 있는 데이터베이스의 접근 제한을 두는 방법입니다.

전통적인 방법입니다. 


다른 하나는 grant 명령으로 섬세하게 각 사용자별, 각 개체별 접근 권한을 지정하는 방법입니다. 



하지만 궁극적으로 데이터베이스 클러스 단위의 카타로그들 - 사용자 테이블, 데이터베이스 테이블, 테이블 스페이스 테이블 - 의 접근은 막을 수 없을 것 같습니다. 



님이 2007-02-13 01:29에 작성한 댓글입니다. Edit

지금 테스트를 해보니까, 

각 데이터베이스 별로, 그런 클러스트 전체에 공용으로 사용되는 테이블들에 대해서 

grant 설정을 다시 조정할 수 있게 되어있네요.



그냥 원하는 시스템 카탈로그 테이들이나 뷰의 모든 설정을 다시 지정하면 될 것 같습니다. 


예를 들어서 데이터베이스 목록을 데이터베이스 관리자 외에 모두가 볼 수 없다고 한다면, 

revoke all pg_catalog.pg_database from public;

해버리면 될 것같네요.

이렇게 하면, pg_database 의 소유주만 그 테이블을 참조할 수 있게 되겠죠.


문제는 이렇게 한다고 해서 모든 데이터베이스의 pg_database 의 권한 설정 값이 한꺼번에 바뀌지는 않더군요. 


버그인지, 정책인지는 모르겠습니다.

뭐, 여튼 데이터베이스 단위로 시스템 카탈로그의 접근 권한 설정을 다시 조정하시면 이 문제는 풀릴 것 같습니다.

김상기(ioseph)님이 2007-02-13 10:01에 작성한 댓글입니다.

답변 감사드립니다.


상기님의 댓글을 토대로 8.2 에서 시행해봤습니다.


revoke all on pg_catalog.pg_database from public;


이렇게 하면 psql 상에서 \l 하면 역시 다 튀어 나옵니다. 

그것도 그럴 것이 일반 유저는 public 이 아니므로 revoke 에 해당하지 않는다는 것이죠..


근데 좀 희얀한게


shell 상에서 psql -U user -l 하면

퍼미션 에러가 납니다.

참 희얀하네요..


아울러서..


pg_catalog.pg_user,   pg_catalog.pg_roles 를 모두 revoke 해도

역시나 \du 하면 다 나오고요.. 

근데 이걸 모둔 유저로부터 revoke 하고 해당 database 의 주인에게만 grant 해 주자니....

뒤가 두려워서 말이죠...



일단 revoke connect on database <dbname> from public ;

을 실행하면 자신의 것만 컨넥션 할 수 있어 조금은 안심 (?) 이 됩니다만...


아..


유저리스트 어디 못보게 할 수 없을까나요?


유저리스트와 디비리스트 그리고 connect 만 제한해도..

하긴 connect 는 revoke 가 아닌 그냥 pg_hba.conf 에 일일이 DB 별로 설정해 두면 되긴 합니다만..

(디비 생성할때마다 셋팅하는것도 귀찮고.. )


tyro님이 2007-02-14 00:29에 작성한 댓글입니다. Edit

아침에 테스트 한 결과로는 
public 에 대해서 revoke all 하면,

일반 유저라면, \l 이든 psql -l 이든 다 안되는 것이 정상입니다. 

뭔가 놓친게 있나봅니다.

사용자 목록 보는 것도 마찬가지입니다.
pg_roles 와 pg_user 모두 권한을 박탈해야 모든 클라이언트 버전들에 적용이 될듯.


핵심은 클러스트 기반 카탈로그들은 하나의 데이터베이스에서 그것을 고치면
전체 데이터베이스에 적용될지 알았는데, 그게 아니더군요.
이놈만 기억하고 있으면 될듯싶네요.

김상기(ioseph)님이 2007-02-14 01:18에 작성한 댓글입니다.

상기님의 말을 이제서야 이해했습니다.


좀 전에 테스트 해보니 정말 그렇더군요..


아울러서..


skel DB 인 template1 을 DB 생성시 백프로 복제 하는군요....

무슨 말인고 하니..


template1 에 들어가서 원하는 작업 (revoke, grant 등등) 을 한 후

그 이후로 생성되는 DB 는 모두 적용되는군요 ^^;



아..그래서 다 좋은데....


한가지 문제가있더군요..


pg_database, pg_roles 를 막아버리니..

자신의 것도 못 읽는 사태가 발생하네요..


즉...

\d 하여 테이블 리스트를 볼려고 했더니만... 권한이 없다네요....


아... 이것만 해결되면 참 좋을텐데.... 


tyro님이 2007-02-14 20:44에 작성한 댓글입니다. Edit

\d 테이블 명령은 pg_class 관련일터인데요. 

\d 명령은 해당 데이터베이스 안에 있는 모든 객체를 소유주와 스키마를 함께 보여주는 것이니, 

당연히, pg_roles, pg_user 쪽에서 접근권한 없이 나오겠죠. 


필요하다면, \d 같은 모양의 view를 하나 만들어서 써야할 것같네요.


이런 문제를 해결하는 방법은 


하나의 데이터베이스에는 하나의 일반 사용자만 쓴다고 하고, 

그 사용자만 그 데이터베이스에 접근 할 수 있다고 정하면 될 것 같네요. 

그리고, pg_database 만 모든 일반 사용자는 접근을 금지한다고 하면 될 것같습니다.

제일 현실적인 방법 같네요.

 

김상기(ioseph)님이 2007-02-15 16:45에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
70487.1.1버전에서 유저들의 실행 쿼리 파악하는 법? [3]
dba
2007-02-14
4208
7047[질문]template0을 vacuum으로 돌릴수가 있나요? [3]
최재원
2007-02-14
5350
7046도와주실분 급구합니다. [2]
김창섭
2007-02-13
4592
7045타 DB 정보 열람 등등... [7]
tyro
2007-02-12
4897
7040몇분전 자료 가져오기 [2]
박중규
2007-02-08
4606
7039급 질문하나여.. [4]
조진우
2007-02-07
4241
7038비밀번호 입력이 안됩니다;; [1]
초보탈출기
2007-02-06
4614
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.018초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다