티스토리 뷰

반응형

 

0. 개발환경

- Ubuntu 버전: 18.04

- PostgreSQL 버전: 10

 

1. postgresql debian packages key  및 repository 추가

 

sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt/ `lsb_release -cs`-pgdg main" >> /etc/apt/sources.list.d/pgdg.list'
sudo apt-get install wget ca-certificates
sudo wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -

 

2. apt-get 업데이트 및 postgresql 설치

- ubuntu 18.04에서는 postgresql 버전 10이 설치된다

sudo apt update
sudo apt install postgresql postgresql-contrib -y

 

3. Postgresql 서비스 등록 및 활성화 확인

systemctl status postgresql

 

결과예시:

 

- Ubuntu에 postgresql.service로 등록되며, 설치 완료 후 자동으로  Active 상태가 활성화된 것을 확인 할 수 있다.

 

4. 외부접속 가능하게 하기

 

PostgreSQL을 기본 설치하면 외부에서는 접속할 수가 없다. config를 수정해 줘야 한다.

우선 Ubuntu에서 열려있는 포트를 확인해 보자.

포트 확인은 netstat -ntlp로 확인하자

결과를 보면 127.0.0.1:5432 을 볼수 있는데 postgresql 포트가 5432이고 내부 127.0.0.1 아이피에만 접속가능하다는  것이다.

 

외부에서 접속가능하게 하기 위해서 두 개의 config 파일의 내용을 수정해줘야 한다.

두개의 config은 파일은 다음과 같다.

 

하나는 /etc/postgresql/10/main/postgresql.conf 

다른 하나는 /etc/postgresql/10/main/pg_hba.conf

 

외부에 접속할 수 있게 첫번째로 postgresql.conf 파일 에서 listen_addresses를 찾는다. 기본으로 localhost로 설정되어 있는 부분을 '*' 로 변경해 외부 어디서든 접근할 수 있도록 해준다.

 

 

결과

 

수정된 내용을 저장한 후 postgresql 서버를 다시 시작해야 한다.

 

포트 개방 상태를 확인한다.

127.0.0.1:5432 가 0.0.0.0.0:5432로 변경된 것을 알 수 있다.

 

postgresql를 설치하면 첫 사용자가 potgres이고 데이터베이스 이름도 postgres인데 암호는 없다.

그래서 외부접속할 때 암호가 없으면 접속되지 않는다. 하지만 암호없이 접속하기 위해서는 

md5를 trust로 변경하면 된다. 

 

수정된 내용을 반영하기 위해서는 저장한 후 postgresql 서버를 다시 시작해야 한다.

 

DBeaver 접속화면

 

접속결과

 

 

 

<참고>

인증 방법

트러스트 인증

trust 인증이 지정된 경우 PostgreSQL는 지정한 데이터베이스 사용자 이름을 사용하여 서버에 연결 가능한 모든 이가 데이터베이스 액세스에 대한 인증을 받는 것으로 간주한다(수퍼유저 이름 포함). 물론, database  user 컬럼의 제한도 계속 적용된다. 이 방법은 서버 연결에 대한 적절한 운영 체제 수준의 보호가 제공되는 경우에만 사용되어야 한다.

 

trust 인증은 단일 사용자 워크스테이션에 대한 로컬 연결 시 적절하며, 매우 편리하다.

다중 사용자 머신에서는 일반적으로 적절하지 않다.

 

그러나, 파일 시스템 권한을 사용하여 서버의 Unix 도메인 소켓 파일에 대한 액세스를 제한하는 경우 다중 사용자 머신에서도 trust를 사용 가능할 수 있다. 이렇게 하려면 unix_socket_permissions(및 가능하면 unix_socket_group) 환경 설정 매개 변수를 18.3절에서 설명한 대로 설정해야 한다. 또는 unix_socket_directories 환경 설정 매개 변수를 설정하여 소켓 파일을 적절히 제한된 디렉토리에 배치할 수 있다.

파일 시스템 권한 설정은 Unix 소켓 연결 시에만 유용하다. 로컬 TCP/IP 연결은 파일 시스템 권한에 의해 제한되지 않는다. 따라서 로컬 보안을 위해 파일 시스템 권한을 사용하려면 host ... 127.0.0.1 ... 줄을 pg_hba.conf에서 삭제하거나, 비 trust 방법으로 변경해야 한다.

trust 인증은 trust를 지정하는 pg_hba.conf 줄에 의해 서버로의 연결이 허용된 모든 머신의 모든 사용자를 신뢰하는 경우에 TCP/IP 연결에 대해서만 적합하다. localhost(127.0.0.1) 외에 TCP/IP 연결에 대해 trust를 사용하는 것은 별로 합당하지 않다.

패스워드 인증

패스워드 기반 인증 방법은 md5  password이다.

 

패스워드가 연결 간에, 즉 MD5 해시 및 일반 텍스트로 각각 전송되는 방법을 제외하고는 이 방법은 유사하게 작동된다.

어쨌든 패스워드 "스니핑" 공격에 관심이 있는 경우에는 md5가 바람직하다.

 

항상 일반 password는 가능하면 피해야 한다. 단, md5는 db_user_namespace db_user_namespace 기능과 함께 사용할 수 없다. 연결이 SSL 암호화로 보호되는 경우 password를 안전하게 사용할 수 있다(SSL을 사용하는 경우 SSL 인증서 인증이 더 나을 수 있지만).

PostgreSQL 데이터베이스 패스워드는 운영 체제 사용자 패스워드와 구분된다. 각 데이터베이스 사용자에 대한 패스워드는 pg_authid 시스템 카탈로그에 저장된다. 패스워드는 SQL 명령 CREATE USER  ALTER ROLE으로 관리할 수 있으며, 예를 들면 CREATE USER foo WITH PASSWORD 'secret'와 같다. 패스워드가 사용자에 대해 설정되지 않은 경우 저장된 패스워드는 null이고 패스워드 인증은 해당 사용자에 대해 항상 실패한다.

반응형
댓글