
postgresql이 아래 중 하나를 지원하는 것 같습니다.
- 비밀번호 인증과 함께 tcp(예: localhost:5432)를 사용하세요.
- 피어/신뢰 인증과 함께 Unix 도메인 scoket(예: /var/run/postgresql/.s.PGSQL.5432 )을 사용하십시오.
유닉스 도메인 소켓으로 비밀번호를 가질 수 있습니까?
배경:
저는 php-fpm을 사용하여 여러 앱을 실행합니다. 서로 다른 앱이 서로 다른 데이터베이스와 비밀번호를 갖기를 원하지만 동일한 사용자(www-data)로 실행됩니다. 따라서 피어/신뢰 인증은 좋지 않습니다. 한 앱이 손상되면 다른 앱의 데이터도 읽을 수 있기 때문입니다. PrivateNetwork=yes
앱이 외부 요청을 할 수 없도록 php-fpm 서비스를 실행하므로 tcp 인증도 사용할 수 없습니다 . 또한 unix 도메인 소켓은 tcp보다 성능이 더 좋습니다.
답변1
- 비밀번호 인증과 함께 tcp(예: localhost:5432)를 사용하세요.
- 피어/신뢰 인증과 함께 Unix 도메인 scoket(예: /var/run/postgresql/.s.PGSQL.5432 )을 사용하십시오.
이는 일반적인 기본 구성이지만 고정된 동작은 아닙니다.
서버측이군요pg_hba.conf연결 유형 및 출처, 대상 데이터베이스 및 사용자 이름에 따라 어떤 인증 방법이 사용되는지 알려주는 구성 파일입니다.
peer
Unix 로컬 도메인 소켓에 대한 인증을 트리거하는 처음 몇 개의 규칙에 다음 줄이 있는 경우가 많습니다 .
# "local" is for Unix domain socket connections only
local all all peer
비밀번호를 요청하려면 비밀번호를 다음으로 바꾸세요.
# "local" is for Unix domain socket connections only
local all all md5
(또는 서버에 SCRAM으로 해시된 비밀번호가 있는 경우 scram-sha-256
대신 Postgres 10부터 사용 가능한 최신 버전 ).md5
종종 postgres 사용자를 위한 구성에는 위의 보다 구체적인 규칙이 있습니다.
# Database administrative login by Unix domain socket
local all postgres peer
상황에 따라 그대로 두거나 변경할 수도 있습니다. 규칙은 나타나는 순서대로 해석되므로 보다 구체적인 규칙이 맨 위에 옵니다.
답변2
저는 php-fpm에 익숙하지 않지만 일반적으로 Postgres에서는 연결 문자열에 호스트를 생략하고 사용자 이름을 지정하면 지정된 사용자로 연결됩니다. 적어도 그것은 문서화된 동작입니다(예: psql
.
그래야 해결됨
한 앱이 손상되면 다른 앱의 데이터도 읽을 수 있습니다.
예를 들어 각 앱에 대해 하나의 스키마를 설정하고, 각 앱에 대해 한 명의 사용자를 갖고, 해당 스키마에 대한 사용자 액세스만 허용할 수 있습니다.
php-fm에서는 www-data 권한을 가진 사람이 사용자 선택에 영향을 줄 수 없도록 해야 합니다.
그러나 비밀번호는 제공하지 않습니다. (하지만 스크립트에 저장된 비밀번호는 어쨌든 안전하지 않습니다...)