Aurora PostgreSQL 호환 DB 클러스터 연결의 암호 복잡성과 만료를 관리하려면 어떻게 해야 합니까?
Amazon Aurora PostgreSQL 호환 버전 데이터베이스(DB) 클러스터 연결의 암호 복잡성과 만료를 관리하고 싶습니다.
간략한 설명
Aurora PostgreSQL 호환 DB 클러스터의 암호를 관리하려면 다음 방법을 사용하면 됩니다.
- 신뢰할 수 있는 언어 확장(TLE)에서 암호 확인 후크를 생성합니다.
- 제한된 암호 관리 기능을 켭니다.
- AWS Identity and Access Management(IAM) 데이터베이스 인증을 사용합니다.
- IAM 사용자를 위한 사용자 지정 암호 정책을 생성합니다.
- AWS Secrets Manager를 사용합니다.
해결 방법
TLE에서 암호 확인 후크 사용
TLE에서 암호 확인 후크를 사용하려면 먼저 Aurora PostgreSQL 호환 DB 클러스터에서 TLE를 설정해야 합니다. 그런 다음 암호 확인 후크를 생성합니다.
참고: 후크 이름을 지정할 때는 user-password-check-rules를 사용할 수 없습니다.
암호 확인 후크 코드의 예:
SELECT pgtle.install_extension( 'user-password-check-rules', '1.0', 'Do not let users use the 10 most commonly used passwords', $_pgtle_$ CREATE SCHEMA password_check; REVOKE ALL ON SCHEMA password_check FROM PUBLIC; GRANT USAGE ON SCHEMA password_check TO PUBLIC; -- Create table for bad passwords CREATE TABLE password_check.bad_passwords (plaintext) AS VALUES ('123456'), ('password'), ('12345678'), ('qwerty'), ('123456789'), ('12345'), ('1234'), ('111111'), ('1234567'), ('dragon'); -- Create table for tracking user password changes CREATE TABLE password_check.usertime ( user_name text PRIMARY KEY, lasttime timestamp ); CREATE UNIQUE INDEX ON password_check.bad_passwords (plaintext); CREATE FUNCTION password_check.passcheck_hook(username text, password text, password_type pgtle.password_types, valid_until timestamptz, valid_null boolean) RETURNS void AS $$ DECLARE invalid bool := false; userexists bool; last_password_change timestamp; BEGIN -- Check if user already exists SELECT EXISTS (SELECT user_name FROM password_check.usertime WHERE user_name = username) INTO userexists; -- If user exists, check password age IF (userexists) THEN SELECT lasttime INTO last_password_change FROM password_check.usertime WHERE user_name = username; -- Check if password is older than 90 days IF (CURRENT_TIMESTAMP - last_password_change) > INTERVAL '90 days' THEN RAISE EXCEPTION 'Password has expired. It must be changed every 90 days. Last change was on %', last_password_change; END IF; -- Update timestamp for new password change UPDATE password_check.usertime SET lasttime = CURRENT_TIMESTAMP WHERE user_name = username; ELSE -- First time user, add to tracking table INSERT INTO password_check.usertime VALUES(username, CURRENT_TIMESTAMP); END IF; -- Existing password length check IF length(password) < 8 THEN RAISE EXCEPTION 'Password must be at least 8 characters long.'; END IF; -- Existing common password check IF password_type = 'PASSWORD_TYPE_MD5' THEN SELECT EXISTS( SELECT 1 FROM password_check.bad_passwords bp WHERE ('md5' || md5(bp.plaintext || username)) = password ) INTO invalid; IF invalid THEN RAISE EXCEPTION 'Cannot use passwords from the common password dictionary'; END IF; ELSIF password_type = 'PASSWORD_TYPE_PLAINTEXT' THEN SELECT EXISTS( SELECT 1 FROM password_check.bad_passwords bp WHERE bp.plaintext = password ) INTO invalid; IF invalid THEN RAISE EXCEPTION 'Cannot use passwords from the common password dictionary'; END IF; END IF; -- Existing complexity check IF NOT (password ~ '[A-Z]' AND password ~ '[a-z]' AND password ~ '[0-9]' AND password ~ '[^a-zA-Z0-9]') THEN RAISE EXCEPTION 'Password must contain uppercase letters, lowercase letters, numbers, and special characters'; END IF; END $$ LANGUAGE plpgsql SECURITY DEFINER; GRANT EXECUTE ON FUNCTION password_check.passcheck_hook TO PUBLIC; SELECT pgtle.register_feature('password_check.passcheck_hook', 'passcheck'); $_pgtle_$ );
참고: 요구 사항에 맞게 코드를 수정하십시오. 예를 들어 bad_passwords 테이블에 암호를 더 추가하거나, 필요한 암호 길이 요구 사항을 변경하거나, 암호 복잡성을 확인할 수 있습니다.
암호가 길이 요구 사항을 충족하는지 확인하려면 다음 명령을 실행합니다.
CREATE ROLE user1 PASSWORD '123456';
예상 출력:
ERROR: Password must be at least 8 characters long. CONTEXT: PL/pgSQL function password_check.passcheck_hook(text,text,pgtle.password_types,timestamptz,bool) SQL statement "SELECT password_check.passcheck_hook($1::pg_catalog.text, $2::pg_catalog.text, $3::pgtle.password_types, $4::pg_catalog.timestamptz, $5::pg_catalog.bool)"
참고: 위 예에서는 암호가 8자 이상이어야 하므로 오류가 발생했음을 나타냅니다.
암호가 너무 흔한지 확인하려면 다음 명령을 실행합니다.
CREATE ROLE user1 PASSWORD 'password';
예상 출력:
ERROR: Cannot use passwords from the common password dictionary CONTEXT: PL/pgSQL function password_check.passcheck_hook(text,text,pgtle.password_types,timestamptz,bool) SQL statement "SELECT password_check.passcheck_hook($1::pg_catalog.text, $2::pg_catalog.text, $3::pgtle.password_types, $4::pg_catalog.timestamptz, $5::pg_catalog.bool)"
참고: 위 예는 일반 암호 사전의 암호를 사용할 수 없으므로 오류가 발생했음을 나타냅니다.
암호 만료를 확인하려면 다음 단계를 완료하십시오.
-
사용자가 마지막으로 암호를 변경한 시간을 확인하려면 다음 명령을 실행하십시오.
SELECT * FROM password_check.usertime WHERE user_name = 'user1';예상 출력:
user_name | lasttime ----------+---------------------------- user1 | 2025-10-01 18:48:07.319908 (1 row) -
마지막 시간을 91일 전으로 설정하려면 다음 명령을 실행하십시오.
UPDATE password_check.usertime SET lasttime = CURRENT_TIMESTAMP - INTERVAL '91 days' WHERE user_name = 'user1';예상 출력:
UPDATE 1 -
마지막 시간이 91일 전인지 확인하려면 다음 명령을 실행하십시오.
SELECT * FROM password_check.usertime WHERE user_name = 'user1';예상 출력:
user_name | lasttime ----------+---------------------------- user1 | 2025-07-02 18:55:36.248913 (1 row) -
암호 만료 기능을 테스트하려면 다음 명령을 실행하십시오.
ALTER USER user1 WITH PASSWORD 'NewTestPass786!';예상 출력:
NOTICE: Password has expired. It must be changed every 90 days. Last change was on 2025-07-02 18:55:36.248913 ALTER ROLE -
사용자 암호 변경과 마지막 업데이트 시간을 확인하려면 다음 명령을 실행하십시오.
SELECT * FROM password_check.usertime WHERE user_name = 'user1';예상 출력:
user_name | lasttime ----------+---------------------------- user1 | 2025-10-01 19:18:42.028533 (1 row)
제한된 암호 관리 기능 켜기
rds_password 역할을 부여한 데이터베이스 사용자만 암호를 관리할 수 있도록 rds.restrict_password_commands 파라미터를 1로 설정합니다.
다음 단계를 완료하십시오.
- DB 클러스터 파라미터 그룹을 생성합니다.
- DB 클러스터 파라미터 그룹을 DB 클러스터와 연결합니다.
- DB 클러스터 파라미터 그룹을 수정하여 rds.restrict_password_commands를 1로 설정합니다.
참고: 변경 사항을 적용하려면 Aurora PostgreSQL 호환 기본 DB 인스턴스를 재부팅해야 합니다.
IAM 데이터베이스 인증 사용
IAM 데이터베이스 인증을 사용하면 암호 대신 인증 토큰을 사용하여 DB 클러스터에 연결할 수 있습니다.
IAM 데이터베이스 인증을 사용하려면 다음 단계를 완료하십시오.
- IAM 데이터베이스 인증을 켭니다.
- IAM 데이터베이스 액세스에 대한 IAM 정책을 생성합니다.
- 기본 사용자 또는 권한을 생성하고 부여할 수 있는 사용자 권한으로 DB 클러스터에 연결합니다.
- 사용자에게 rds_iam 역할을 부여합니다.
- IAM 인증을 사용하여 DB 클러스터에 연결합니다.
IAM 사용자를 위한 사용자 지정 암호 정책 생성
자세한 내용은 IAM 사용자의 계정 암호 정책 설정을 참조하십시오.
Secrets Manager 사용
AWS Secrets Manager를 사용하여 기본 사용자 암호를 관리합니다. IAM 조건 키를 사용하여 기본 사용자 암호의 Aurora 관리를 적용합니다.
자세한 내용은 Amazon Aurora를 사용한 암호 관리 및 AWS Secrets Manager를 참조하십시오.
관련 정보
신규 – Amazon Aurora 및 Amazon RDS의 PostgreSQL을 위한 신뢰할 수 있는 언어 확장
