📃
PostgreSQL 패스워드 정책 설정 (CredCheck)

· March 12, 2025 · 6 min read


️🧪 테스트 환경

  • Amazon Linux 2023 (EC2)
  • PostgreSQL 17.2

✋ 들어가며

PostgreSQL을 사용하면서 패스워드 복잡도와 같은 정책들을 적용하게 되었는데 다양한 정책을 쉽게 적용할 수 있는 CredCheck를 활용하기로 했다. 'pass123' 같은 쉬운 패스워드를 설정하지 못하게 하려면 cracklib 패키지를 추가로 설치해야하는데 이 글에서는 다루지 않는다.

🏗️ CredCheck 확장프로그램 설치하기

다운로드

만약 Git이 설치되어있지 않다면 CredCheck↗에서 다운받아 아래 경로에 올려둔다.

cd `PostgreSQL설치경로`/share/contrib
git clone https://github.com/MigOpsRepos/CredCheck

설치 전 설정

Makefile을 열어서 PG_CONFIG 경로를 지정한다.

cd `PostgreSQL설치경로`/share/contrib/credcheck
vi Makefile
...
#PG_CONFIG = pg_config
PG_CONFIG = `PostgreSQL설치경로`/bin/pg_config
...

컴파일 및 설치

make
make install

설치 후 설정

PostgreSQL 데이터 경로에서 postgresql.conf를 아래와 같이 수정한다.

vi `PostgreSQL데이터경로`/postgresql.conf
...
#shared_preload_libraries = ''          # (change requires restart)
shared_preload_libraries = '$libdir/credcheck'
...

DB 설정

데이터베이스에 접근 후 쿼리로 CredCheck 확장 프로그램을 활성화한다.

create extension credcheck;
select * from pg_extension;

아래와 같이 CredCheck 확장 프로그램이 활성화된걸 확인할 수 있다.

✔
  oid  |  extname  | extowner | extnamespace | extrelocatable | extversion | extconfig | extcondition
-------+-----------+----------+--------------+----------------+------------+-----------+--------------
 22488 | credcheck |       10 |         2200 | f              | 3.0.0      |           |
...

🔐️ PostgreSQL 패스워드 정책 설정

설치가 완료되었으면 이제 아주 간단하게 패스워드 정책을 설정할 수 있다. 모든 작업은 데이터베이스에 접근해서 쿼리로 수행한다.

사용가능한 정책 목록

Check Type Description
username_min_length username 사용자 이름의 최소 길이
username_min_special username 최소 특수 문자 수
username_min_digit username 최소 숫자 수
username_min_upper username 최소 대문자 수
username_min_lower username 최소 소문자 수
username_min_repeat username 문자가 반복될 수 있는 최대 횟수
username_contain_password username 사용자 이름에 비밀번호가 포함되어서는 안 됨
username_contain username 사용자 이름에 다음 문자 중 하나가 포함되어야 함
username_not_contain username 사용자 이름에 다음 문자가 포함되어서는 안 됨
username_ignore_case username 위의 검사를 수행할 때 대소문자를 무시함
password_min_length password 비밀번호의 최소 길이
password_min_special password 최소 특수 문자 수
password_min_digit password 비밀번호의 최소 숫자 수
password_min_upper password 최소 대문자 수
password_min_lower password 최소 소문자 수
password_min_repeat password 문자가 반복될 수 있는 최대 횟수
password_contain_username password 비밀번호에 사용자 이름이 포함되어서는 안 됨
password_contain password 비밀번호에 다음 문자가 포함되어야 함
password_not_contain password 비밀번호에 다음 문자가 포함되어서는 안 됨
password_ignore_case password 위의 검사를 수행할 때 대소문자를 무시함
password_valid_until password 최소 일수와 함께 CREATE ROLE 문에서 VALID UNTIL 절 사용 강제화
password_valid_max password 최대 일수와 함께 CREATE ROLE 문에서 VALID UNTIL 절 사용 강제화

정책 적용 방법

ALTER SYSTEM SET 구문을 이용해서 위 정책들을 하나씩 설정할 수 있다.

ALTER SYSTEM SET credcheck.password_min_length = 8; -- 비밀번호의 최소 길이
ALTER SYSTEM SET credcheck.password_min_special = 1; -- 특수문자 포함
ALTER SYSTEM SET credcheck.password_min_digit = 1; -- 숫자 포함
ALTER SYSTEM SET credcheck.password_min_upper = 1; -- 대문자 포함
ALTER SYSTEM SET credcheck.password_min_lower = 1; -- 소문자 포함
ALTER SYSTEM SET credcheck.password_contain_username  = on; -- 사용자명 포함 불가

SELECT pg_reload_conf();

설정된 정책을 확인하기 위해서는 SHOW 구문을 사용해서 출력한다.

SHOW credcheck.password_min_length;
✔
 credcheck.password_min_length
-------------------------------
 8

테스트

위 설정이 모두 끝났다면 실제로 User를 생성해보면 정상적으로 설정되었는지 확인할 수 있다.

CREATE USER aa WITH PASSWORD 'aaa';

설정하려고하는 패스워드의 길이가 8자리가 안되기 떄문에 어림없다는 메시지와 함께 정상 설정 되었음을 알 수 있다.

```sql
✔
ERROR:  password length should match the configured credcheck.password_min_length (8)

👋 마치며

PostgreSQL에서 안전한 비밀번호 관리 절차와 작성 규칙을 수립하기 위해서 CredCheck를 사용해봤는데 간단하고 유용한 것 같다.

@rundevelrun
똑바로 해, 넌 정말