![[PostgreSQL] 외부 IP로부터의 접속 관리하기(pg_hba, postgresql)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FA2C1k%2FbtsCCxeIT82%2F6i0jfq05SA7xxUFEZhx8u0%2Fimg.png)
🧐 개요
지난 포스팅에서 PostgreSQL의 사용자 권한을 설정하는 방법을 다루면서 '환경 설정을 통해 외부 IP로부터의 접속을 허용할 수 있다' 고 언급하였는데 오늘은 그 방법을 확인하도록 하겠습니다.
conf 디렉토리 경로 확인하기
저는 MacOS 환경에서 brew 명령어로 패키지를 설치하였기 때문에 다음의 명령어를 입력해줍니다.
cd "$(brew --prefix postgresql)"
이제 해당 디렉토리 내부 어딘가에 있는 'conf 파일들이 모인 폴더'를 찾으시면 됩니다.
패키지 관리자마다, 혹은 PostgreSQL 설치 환경마다 위치가 상이할 수 있습니다.
저 같은 경우에는 아래의 경로에 conf 파일들이 모여 있습니다.
/opt/homebrew/opt/postgresql@14/share/postgresql@14
해당 경로를 확인해보시면 config 파일들의 샘플이 첨부되어 있습니다.
이 중, pg_hba.conf 파일과 postgresql.conf 파일이 필요합니다. 아래의 명령어를 통해 샘플 파일들을 복재해 두겠습니다.
cp pg_hba.conf.sample pg_hba.conf
cp postgresql.conf.sample postgresql.conf
🖍️ pg_hba 파일 설정하기
pg_hba 파일은 데이터베이스에 대한 유저의 접속을 관리해주는 장부 역할을 맡습니다.
sample 파일에 PostgreSQL에서 남긴 공식 가이던스가 주석으로 기록되어 있으므로, 해당 내용을 먼저 확인해 보겠습니다.
vi pg_hba.conf
# Records take one of these forms:
#
# local DATABASE USER METHOD [OPTIONS]
# host DATABASE USER ADDRESS METHOD [OPTIONS]
# hostssl DATABASE USER ADDRESS METHOD [OPTIONS]
# hostnossl DATABASE USER ADDRESS METHOD [OPTIONS]
# hostgssenc DATABASE USER ADDRESS METHOD [OPTIONS]
# hostnogssenc DATABASE USER ADDRESS METHOD [OPTIONS]
# The first field is the connection type:
# - "local" is a Unix-domain socket
# - "host" is a TCP/IP socket (encrypted or not)
# - "hostssl" is a TCP/IP socket that is SSL-encrypted
# - "hostnossl" is a TCP/IP socket that is not SSL-encrypted
# - "hostgssenc" is a TCP/IP socket that is GSSAPI-encrypted
# - "hostnogssenc" is a TCP/IP socket that is not GSSAPI-encrypted
입력해야 할 스크립트의 형식 및 내용 설명이 기재되어 있습니다.
첫 부분은 접속 방식을 지정하는 부분으로, 다음과 같이 설정할 수 있습니다.
- local 로컬로 접속
- host TCP/IP 소켓을 통해 접속 - 설정에 따라 SSL(암호화) 및 GSSAPI 적용
그 외의 연결 방식은 SSL 또는 GSSAPI를 사용한 암호화 방식의 사용 유무를 지정합니다.
# DATABASE can be "all", "sameuser", "samerole", "replication", a
# database name, or a comma-separated list thereof. The "all"
# keyword does not match "replication". Access to replication
# must be enabled in a separate record (see example below).
DATABASE 항목은 규칙을 적용할 데이터베이스 이름을 지정하는 부분입니다.
- all 전체 데이터베이스 적용
- <database_이름>
sameuser, samerole 및 replication은 특수한 상황에서 사용하는 설정으로 일반적으로 사용할 일은 많지 않을 것으로 생각됩니다.
# USER can be "all", a user name, a group name prefixed with "+", or a
# comma-separated list thereof. In both the DATABASE and USER fields
# you can also write a file name prefixed with "@" to include names
# from a separate file.
USER 항목은 접근을 허용할 유저명을 설정하는 부분입니다.
- all 전체 유저 적용
- <user_이름>
# ADDRESS specifies the set of hosts the record matches. It can be a
# host name, or it is made up of an IP address and a CIDR mask that is
# an integer (between 0 and 32 (IPv4) or 128 (IPv6) inclusive) that
# specifies the number of significant bits in the mask. A host name
# that starts with a dot (.) matches a suffix of the actual host name.
# Alternatively, you can write an IP address and netmask in separate
# columns to specify the set of hosts. Instead of a CIDR-address, you
# can write "samehost" to match any of the server's own IP addresses,
# or "samenet" to match any address in any subnet that the server is
# directly connected to.
ADDRESS 항목은 연결할 주소를 IPv4 또는 IPv6으로 설정하는 부분입니다.
# METHOD can be "trust", "reject", "md5", "password", "scram-sha-256",
# "gss", "sspi", "ident", "peer", "pam", "ldap", "radius" or "cert".
# Note that "password" sends passwords in clear text; "md5" or
# "scram-sha-256" are preferred since they send encrypted passwords.
METHOD 항목은 연결 과정에서의 인증 방법을 설정하는 부분입니다.
마지막 부분의 내용을 살펴보면, scram-sha-256 사용이 선호된다고 나와 있습니다. scram-sha-256 인증 방식은 입력한 비밀번호를 encrypted password의 형태로 암호화하여 전송한다고 합니다.
# OPTIONS are a set of options for the authentication in the format
# NAME=VALUE. The available options depend on the different
# authentication methods -- refer to the "Client Authentication"
# section in the documentation for a list of which options are
# available for which authentication methods.
OPTIONS 항목은 앞서 지정한 METHOD 항목에 대한 추가 설정을 수행하는 공간입니다. 연결 과정에서 복잡한 설정을 포함하는 특수한 경우가 아니라면 크게 신경쓰지 않아도 될 것 같습니다.
앞에서 확인한 내용들을 기반으로 간단한 권한 설정을 적용해 보겠습니다.
# 기본 postgres 계정에 대한 전체 권한 허용
local all postgres peer
# 전체 계정 / local 접속 / 암호 요구
local all all scram-sha-256
# master 계정 / 전역 접속 / 암호 요구
host all master 0.0.0.0/0 scram-sha-256
권한 설정의 예시
현재 postgres 기본 유저와 추가로 생성한 master 계정 2개만 있는 상태이므로,
master 계정은 전역 접속을 허용하고, 기본 유저는 로컬 접속을 허용하였습니다.
🖍️ postgresql 파일 설정하기
postgresql 파일에서는 postgresql 서버의 기본적인 환경 설정을 수행할 수 있습니다.
많은 내용들이 있지만, 접속 권한과 관련하여 중요한 설정이 바로 listen_addresses 입니다.
해당 설정을 통해 접속을 허용할 외부 서버의 IP 주소를 지정할 수 있습니다. Django에서 수행하는 그 설정과 동일합니다.
vi postgresql.conf
파일 내부에 다음과 같이 내용을 입력하겠습니다.
listen_addresses = '*'
해당 설정은 와일드카드(*)를 통해 외부 IP로부터의 접속을 전역 허용하는 설정입니다. 와일드카드 대신 0.0.0.0/0 을 입력하여도 동일하게 전역 접속을 허용하게 됩니다.
🧑💻 외부에서 PostgreSQL 접속하기
외부 PostgreSQL 서버로 접속을 시도할 경우, 아래의 명령어를 사용할 수 있습니다.
** MySQL과 마찬가지로, psql 명령어를 사용하기 위해선 접속을 시도하는 로컬 환경에도 PostgreSQL이 설치되어 있어야 합니다.
psql -h <IPv4_주소> -U <user_이름> -d <database_이름>
📝 마치며
데이터베이스의 보안을 설계하는 일은 시스템의 가용성을 유지하고 데이터를 보호하는 목적에 있어 무척이나 중요한 일입니다. 높은 수준의 보안을 유지하기 위해 다양한 장치들을 사용할 수 있으나, 기본적으로 SQL 서버에서 제공하는 자체 보안 로직을 활용하여 강력한 성능의 보안 기능을 빠르고 쉽게 구현할 수 있을 것입니다.
'데이터 이모저모 > SQL' 카테고리의 다른 글
[PostgreSQL] 데이터베이스 백업 및 S3 업로드 (1) | 2023.12.27 |
---|---|
[PostgreSQL] 유저 생성 및 권한 설정하기 (0) | 2023.12.23 |
발자취를 로그처럼 남기고자 하는 초보 개발자의 블로그