티스토리 뷰
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이고 패스워드 인증은 해당 사용자에 대해 항상 실패한다.