생성 된 사용자는 허가없이 PostgreSQL의 모든 데이터베이스에 액세스 할 수 있습니다


44

PostgreSQL 설정과 관련하여 무언가가 빠져 있어야합니다. 내가하고 싶은 것은 특정 사용자가 내가 지정한 데이터베이스에만 액세스 할 수 있도록 서로 격리 된 여러 데이터베이스와 사용자를 만드는 것입니다. 그러나 내가 결정할 수 있듯이 생성 된 모든 사용자는 특정 권한을 부여하지 않고도 모든 데이터베이스에 액세스 할 수 있습니다.

Ubuntu Server 12.04에서 수행하는 작업은 다음과 같습니다.

  1. apt-get postgresql 설치
  2. sudo -u postgres createuser -DRSP mike1 (새 사용자의 비밀번호 지정)
  3. sudo -u postgres createdb data1
  4. psql -h localhost -U mike1 data1 (로그인 할 사용자 mike1의 비밀번호 지정)

새로운 사용자 "mike1"은 데이터베이스 "data1"에 연결하고 테이블 등을 만드는 데 아무런 문제가없는 것 같습니다. 그리고 GRANT 명령을 전혀 실행하지 않고 "data1"의 소유자는 "postgres"입니다. 3 단계의 소유자). 이것이 실제로 작동하는 방식입니까?

내가하고 싶은 것은 mike1에게 data1에 대한 모든 액세스 권한을 부여한 다음 더 많은 사용자와 데이터베이스에 대해이 작업을 반복하여 사용자가 선택한 하나 또는 여러 데이터베이스에만 액세스 할 수 있도록하는 것입니다.


1
사용자가 하나의 데이터베이스로 제한되어 있어도 전역 테이블을 쿼리 할 수 ​​있으므로 데이터베이스 이름 목록과 사용자 목록을 볼 수 있습니다.
kgrittn

답변:


46

SQL 레벨에서 모든 사용자는 다음 SQL 명령이 실행될 때까지 새로 작성된 데이터베이스에 실제로 연결할 수 있습니다.

REVOKE connect ON DATABASE database_name FROM PUBLIC;

완료되면 연결할 수있는 각 사용자 또는 역할에 명시 적으로 연결 권한이 부여되어야합니다.

GRANT connect ON DATABASE database_name TO rolename;

편집 : 다중 테넌트 시나리오에서는 connect권한 이상 이 제거됩니다. 다중 테넌트 팁 및 모범 사례를 보려면 postgresql 퍼블릭 위키 (PostgreSQL의 공유 데이터베이스 호스팅관리 권한)를 참조하십시오 .


기본값은 다른 방법이었습니다. 무작위로 생성 된 암호로 사용자를 만들고 단일 데이터베이스에 대한 액세스 권한을 부여하여 postgres모든 데이터베이스에 액세스 할 수 있음을 알고 싶습니다 .
TheRealChx101

24

PUBLIC은 기본적으로 데이터베이스에 액세스 할 수 있지만 데이터에 액세스 할 수 없습니다. 공개를 취소 할 수 있습니다.

REVOKE CONNECT ON DATABASE your_database FROM PUBLIC;

향후 모든 데이터베이스에 대해이 설정을 원하는 경우 template1 데이터베이스 (새 데이터베이스를 작성하기위한 기본 템플리트 데이터베이스)에서 CONNECT를 취소하십시오.

REVOKE CONNECT ON DATABASE template1 FROM PUBLIC;

내가 참조. 이제 더 의미가 있습니다. 나는 PostgreSQL의 새로운 이민자로 여기에 와서는 안되며 PUBLIC이 template1에 대한 CONNECT 권한을 기본값으로 사용해서는 안된다는 논쟁을 제기합니다. 감사!
mikeplate

1
분쟁 환경에 대한 새로운 이민자 여러분을 환영합니다. 누구나 배울 수 있습니다!
Frank Heikens가

1
실제로 해당 CONNECT 특권은 템플리트에서 새 데이터베이스로 전달되지 않으므로 template1에서이를 취소해도 언급 된 효과가 없습니다.
Daniel Vérité

2
@ DanielVérité 내가 본다. 따라서 해결책은 새 데이터베이스를 만들 때 항상 기억하고 REVOKE CONNECT를 수행하는 것입니다. 이것이 실제로 PostgreSQL 관리자가 수행하는 방식입니까, 아니면 데이터에 액세스 할 수 없기 때문에별로 신경 쓰지 않아야합니까? 여전히 다중 테넌트 환경에서 이미 권한이 부여 된 사용자들 사이에서만 테이블 목록이 향후 공격에 불필요한 정보를 제공 할 수 있다고 생각합니다. 또한 : 공개는 REVOKE CONNECT가 아닌 모든 데이터베이스에서 자체 테이블을 만들 수도 있다는 것을 깨달았습니다. 기본값으로 가지고있는 것이 조금 이상하다고 생각합니다.
mikeplate

1
예. 내 답변에 관련 링크를 추가하고 있습니다. 이에 대한 몇 가지 문서를 더 읽어보십시오.
Daniel Vérité

4

기본적으로 PUBLIC에서 연결 권한을 취소하고 구체적으로 원하는 권한을 부여하는 것 외에도 액세스를 제어 할 수있는 다른 수준은 pg_hba.conf 파일을 통하는 것입니다.

파일이 저장된 위치는 다음과 같습니다.

SHOW hba_file;

이 메커니즘을 사용하기로 선택한 경우 시작하기에 충분한 주석이 포함되어 있습니다. 문서는 다음과 같습니다.

http://www.postgresql.org/docs/current/interactive/auth-pg-hba-conf.html


감사! pg_hba.conf 파일을 보았지만 데이터베이스에 연결할 때 사용자가 인증 하는 방법 과 동일한 데이터베이스에서 사용자가 가진 권한이 아니라는 점만 관리한다는 인상을 받았습니다 .
mikeplate

1
사용자는 pg_hba.conf에서 허용 한 데이터베이스 에만 연결할 수 있습니다 . 여기에는 사용자와 데이터베이스의 조합뿐만 아니라 연결하는 호스트와 허용되는 인증 방법도 포함됩니다. 제어의 세분성이 필요하지 않은 경우 다른 답변에서 논의 된 GRANT/ REVOKE기술이 더 쉬울 것입니다. 우선, 파일을 편집 할 수있는 OS 로그인이 필요한 것과 비교하여 슈퍼 유저 데이터베이스 연결이 필요합니다.
kgrittn

0

사용자가 다른 데이터베이스 이름을 나열하지 못하게하는 방법을 찾기 위해이 스레드를 발견했습니다. 는 REVOKE CONNECT이를 방지하지 않습니다.

이 SO 질문에 대한 답변에 따르면 그것을 달성하는 (권장) 방법은 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.