Amazon RDS for PostgreSQL에서 암호 정책을 생성하려면 어떻게 해야 합니까?
Amazon Relational Database Service(Amazon RDS) for PostgreSQL에서 암호 정책을 생성하고 싶습니다.
간략한 설명
기본적으로 Amazon RDS for PostgreSQL에는 암호 정책을 적용하는 기능이 없습니다. 그러나 PostgreSQL 후크 및 TLE(신뢰할 수 있는 언어 확장) 확장을 사용하여 핵심 기능을 확장할 수 있습니다. 사용자 또는 역할의 암호를 만들거나 변경할 때 PostgreSQL에서 암호를 처리하는 방법을 사용자 지정하려면 passcheck 후크를 사용하십시오.
참고: TLE는 Amazon RDS for PostgreSQL 버전 16.1 이상, 15.2 이상, 14.5 이상, 13.12 이상을 지원합니다. 자세한 내용은 PostgreSQL의 신뢰할 수 있는 언어 확장을 사용하기 위한 요구 사항을 참조하십시오.
해결 방법
참고: AWS Command Line Interface(AWS CLI) 명령을 실행할 때 오류가 발생하면 AWS CLI의 오류 해결을 참조하십시오. 또한 최신 AWS CLI 버전을 사용하고 있는지 확인하십시오.
고객 파라미터 그룹 생성 및 TLE 확장 설정
다음 단계를 완료하십시오.
-
사용자 지정 파라미터 그룹을 생성한 다음, Amazon RDS for PostgreSQL 인스턴스에 연결합니다.
참고: 파라미터 그룹을 변경하면 가동 중지 시간이 발생합니다. 즉각적인 가동 중지 시간을 방지하려면 유지 관리 기간을 사용하십시오. -
인스턴스에 로그인하고 다음 쿼리를 실행한 후 shared_preload_libraries 파라미터가 업데이트되었는지 확인합니다.
postgres=> SHOW shared_preload_libraries;shared_preload_libraries rdsutils,pg_tle,pg_stat_statements (1 row) postgres=> -
다음 쿼리를 실행하여 TLE 확장을 생성합니다.
CREATE EXTENSION pg_tle;참고: pg_tle 확장을 설정하고 구성하려면 데이터베이스 사용자 역할에 rds_superuser 역할 권한이 있어야 합니다.
-
Amazon RDS for PostgreSQL 인스턴스 기본 사용자에 pgtle_admin 역할을 부여합니다. 기본 사용자를 사용한 경우 해당 사용자가 기본 postgres 사용자입니다.
GRANT pgtle_admin TO example-user;참고: example-user를 Amazon RDS for PostgreSQL 인스턴스 기본 사용자로 바꾸십시오.
passcheck 후크 설정
PostgreSQL passcheck 후크는 SQL 작업의 암호를 검사하며 사용자가 password_check.bad_passwords 테이블에 나열된 암호를 설정하도록 허용하지 않습니다. 또한 passcheck 후크는 암호 길이를 검사하고 암호에 대문자, 소문자, 숫자 및 특수 문자가 포함되어 있는지 확인합니다.
참고: PostgreSQL 후크의 함수를 특정 요구 사항에 맞게 수정할 수 있습니다. bad_passwords 테이블에 암호를 더 추가하거나, 필요한 암호 길이를 변경하거나, 암호 복잡성을 검사하도록 함수를 수정할 수 있습니다.
다음 단계를 완료하십시오.
-
다음 pgtle.install_extension SQL 명령을 실행합니다. 특정 요구 사항에 맞게 SQL 코드를 수정합니다.
SELECT pgtle.install_extension ( 'example-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 password_check.bad_passwords (plaintext) AS VALUES ('123456'), ('password'), ('12345678'), ('qwerty'), ('123456789'), ('12345'), ('1234'), ('111111'), ('1234567'), ('dragon'); 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; BEGIN -- Check password length IF length(password) < 8 THEN RAISE EXCEPTION 'Password must be at least 8 characters long.'; END IF; -- Check common passwords from password from bad_passwords table 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; -- Check password contains uppercase lowercase number and special character 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_$);참고: 이전 명령에서 example-password-check-rules를 암호 검사 규칙의 이름으로 바꾸십시오.
-
다음 쿼리를 실행하여 확장을 생성합니다.
postgres=> CREATE EXTENSION "example-password-check-rules";참고: 이전 명령에서 ****example-password-check-rules를 암호 검사 규칙의 이름으로 바꾸십시오.
-
인스턴스와 연결된 사용자 지정 파라미터 그룹을 수정한 다음, pgtle.enable_password_check 파라미터를 활성화합니다.
-
암호 검사 규칙을 테스트하려면 다음 예를 사용합니다.
예:postgres=> CREATE ROLE t_role PASSWORD 'password';ERROR: Cannot use passwords from the common password dictionary CONTEXT: PL/pgSQL function password_check.passcheck_hook(text,text,pgtle.password_types,timestamp with time zone,boolean) line 25 at RAISE 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)"참고: 위 예는 일반 암호 사전의 암호를 사용할 수 없으므로 오류가 발생했음을 나타냅니다.
예:postgres=> CREATE ROLE t_role PASSWORD 'pass';ERROR: Password must be at least 8 characters long. CONTEXT: PL/pgSQL function password_check.passcheck_hook(text,text,pgtle.password_types,timestamp with time zone,boolean) line 7 at RAISE 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자 이상이어야 하므로 오류가 발생했음을 나타냅니다.
예:postgres=> CREATE ROLE t_role PASSWORD 'passwordd';ERROR: Password must contain uppercase letters, lowercase letters, numbers, and special characters CONTEXT: PL/pgSQL function password_check.passcheck_hook(text,text,pgtle.password_types,timestamp with time zone,boolean) line 31 at RAISE 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)"참고: 위 예에서는 암호에 대문자, 소문자, 숫자 및 특수 문자가 포함되어야 하므로 오류가 발생했음을 나타냅니다.
TLE를 지원하지 않는 Amazon RDS for PostgreSQL 버전의 경우 Amazon RDS 또는 Kerberos 인증에 AWS Identity and Access Management(IAM)를 사용하십시오. 또한 암호 생성을 역할 집합 또는 특정 역할로 제한하려면 사용자 암호 관리 위임 및 제어를 참조하십시오.
