Redis ACL
Redis ACL (접근 제어 목록)
Redis ACL(Access Control List)은 특정 연결이 실행할 수 있는 명령과 접근할 수 있는 키를 제한하는 기능입니다. 동작 방식은 연결 후 클라이언트가 사용자 이름과 유효한 비밀번호를 제시해 인증하는 것이며, 인증에 성공하면 해당 연결은 주어진 사용자와 그 사용자의 제한에 묶입니다. Redis는 새 연결이 이미 "default" 사용자로 인증되도록 구성할 수 있습니다(기본 구성). default 사용자 구성을 바꾸면, 명시적으로 인증하지 않은 연결에 기능의 부분집합만 제공하는 효과도 얻을 수 있습니다.
기본 구성에서 ACL이 처음 등장한 Redis 6는 이전 버전과 똑같이 동작합니다. 모든 새 연결은 모든 명령을 호출하고 모든 키에 접근할 수 있어, ACL 기능은 구 클라이언트·애플리케이션과 하위 호환됩니다. 또 기존 비밀번호 설정 방식인 requirepass 구성 지시어도 그대로 동작하되, 이제 default 사용자의 비밀번호를 설정합니다.
Redis AUTH 명령은 Redis 6에서 확장되어 두 인자 형태로 쓸 수 있게 됐습니다.
AUTH <username> <password>
출처: https://redis.io/docs/latest/operate/oss_and_stack/management/security/acl/
ACL이 유용한 때
- Redis에 통합 애플리케이션이 여러 개 붙는 등, 여러 사용자가 같은 서버를 쓰면서 각자의 기능을 제한해야 할 때.
- 클라이언트가 자격 증명을 받아 Redis에 접속하길 원하는데, 사람마다 접근 권한을 달리하고 싶을 때.
- 무인(无人) 또는 스크립팅 클라이언트가 실수로 큰 피해를 낼 수 있는 명령을 실행하지 못하게 막고 싶을 때. 예를 들어 특정 클라이언트는
FLUSHALL을 호출하지 못하게.
ACL 명령으로 ACL 구성
기본적으로 Redis는 default 사용자의 ACL을 구성합니다. 주 기능 명령은 다음과 같습니다.
ACL— 기본 기능 일람(헬퍼).ACL LIST— 현재 활성 ACL 목록.ACL CAT— 사용 가능한 명령 카테고리 목록.ACL SETUSER <username> ...— 사용자 생성/편집.ACL DELUSER <username>— 사용자 삭제.ACL GETUSER <username>— 사용자의 ACL 규칙 조회.ACL WHOAMI— 현재 연결의 사용자 이름.ACL USERS— 모든 등록 사용자 이름 목록.
ACL 규칙
ACL은 명령 규칙, 키 규칙, 선택자(selector) 등 여러 규칙으로 정의합니다. 대표 규칙:
on/off— 사용자 활성/비활성.off사용자는 새 연결에 권한이 없고(기존 연결 유지) 비밀번호로 인증할 수 없습니다.+<command>— 명령을 화이트리스트에 추가.+@<category>,+<command>|subcommand(하위 명령),+<command>|first-arg(첫 인자 매칭) 형식으로 명령·카테고리·하위 명령·첫 인자를 지정합니다.-<command>— 명령을 블랙리스트에 추가(위와 같은 형식).~<pattern>— 키 패턴을 허용 목록에 추가.%R~·%W~로 읽기/쓰기 권한을 세분화합니다.allkeys(~*) — 모든 키 접근 허용.resetkeys— 모든 키 패턴 제거.allcommands(+@all) — 모든 명령 허용.nocommands(-@all) — 모든 명령 거부.reset— 사용자를 기본 상태로 리셋.>password/<password/#hash/!hash— 비밀번호 추가/제거(평문·SHA256 해시).nopass— 비밀번호 없이 접근 허용.resetpass— 비밀번호 목록 제거.selectors/clearselectors— 명령 선택자 관리(아래 참조).
ACL SETUSER 명령으로 사용자 ACL 생성·편집
ACL SETUSER로 새 사용자를 만들거나 규칙을 추가·제거해 기존 사용자를 편집합니다. 예:
ACL SETUSER alice on >p1pp0 ~cached:* +get +set +mget +configure
위는 alice 사용자를 켜고, 비밀번호 p1pp0, cached: 접두사 키 패턴, 그리고 GET·SET·MGET·CONFIGURE(오타 규칙 예시) 명령을 허용합니다.
ACL SETUSER의 여러 호출
ACL SETUSER를 같은 사용자에게 여러 번 호출하면 기존 규칙에 새 규칙이 이어 붙습니다(누적). 예를 들어 두 호출을 합치면 두 규칙 모두 적용됩니다. 규칙을 제거하려면 같은 규칙에 반대 형식(예: +get → -get)을 명시해야 합니다.
명령 카테고리
+@<category> 형식으로 카테고리 단위 화이트리스트가 가능합니다. 대표 카테고리: admin, bitmap, blocking, connection, dangerous, fast, geo, hash, hyperloglog, keyspace, list, pubsub, read, scripting, set, sortedset, slow, stream, string, transaction, write 등. 각 명령은 하나 이상의 카테고리에 속합니다. 예를 들어 +@read는 읽기 전용 명령들을 허용합니다.
하위 명령 허용/차단
+<command>|subcommand 형식으로 특정 하위 명령만 허용하거나(+CONFIG|SET), 차단할 수 있습니다. 해당 하위 명령만 규칙에 넣거나, 전체 명령을 허용한 뒤 특정 하위 명령을 차단하는 식(+CONFIG -CONFIG|SET)으로 조합합니다.
차단된 명령의 첫 인자 허용
+<command>|first-arg 형식으로 명령의 특정 첫 인자를 허용 목록에 넣을 수 있습니다. 예를 들어 +CLIENT|SETNAME은 CLIENT 명령의 SETNAME 첫 인자만 허용합니다. 이 기능은 특정 명령의 첫 인자가 연산 대상(패턴 등)인 경우 기여할 수 있지만, 실제 사용보다 보안상 함정이 될 수 있어 주의가 필요합니다.
+@all VS -@all
+@all은 모든 명령을 허용하고, -@all은 모든 명령을 거부합니다. 너무 광범위하게 권한을 주는 일을 피하려면 기본을 -@all로 거부하고 필요한 것만 더하는 최소 권한(least privilege) 원칙이 권장됩니다.
명령 선택자 (Selectors)
선택자는 같은 사용자에게 조건부로 다른 명령 권한을 부여하는 방식입니다. (<규칙들>) 형태로 별도의 명령 권한 집합을 만들 수 있습니다. 예를 들어 한 사용자가 일상 명령과 별도로 특정 상황에서만 관리자 명령을 쓰게 하는 등, 키 패턴은 공유하되 명령 규칙을 여러 묶음으로 나눌 수 있습니다.
키 권한
~<pattern>으로 접근 가능한 키 패턴을, %R~<pattern>·%W~<pattern>으로 읽기/쓰기 권한을 세분해 지정합니다. 예를 들어 ~cache:*는 cache: 접두사 키 전부, %R~cache:*는 그 키들에 대한 읽기만 허용합니다. 키 패턴이 일치하지 않으면 해당 키에 접근하는 명령은 거부됩니다.
비밀번호 내부 저장 방식
Redis는 ACL 비밀번호를 평문으로 저장하지 않고 SHA256 해시로 저장합니다. ACL GETUSER로 보면 비밀번호가 해시로 표시됩니다. #<sha256> 규칙으로 해시를 직접 지정하거나, !<sha256>으로 해시값을 제거할 수 있습니다. 평문 >password로 설정하면 내부적으로 해시로 변환해 저장합니다.
외부 ACL 파일 사용
기본적으로 ACL은 redis.conf 내 user 지시어로 구성하거나 ACL 명령으로 인증 후 구성하며, 명령 구성은 재시작 시 초기 ACL과 비교됩니다. 대규모 구성은 외부 ACL 파일을 쓸 수 있습니다. aclfile /path/to/users.acl 구성 지시어로 파일 경로를 지정하고, ACL SAVE로 현재 ACL을 파일에 저장합니다.
Sentinel과 Replica를 위한 ACL 규칙
Sentinel 인스턴스는 Redis 서버로부터 구성 정보(복제본 주소 등)를 얻어야 하므로, Sentinel이 연결할 사용자에게는 특정 명령(INFO, SENTINEL 인증에 필요한 읽기 명령 등)과 키 접근이 허용돼야 합니다. MongoDB 같은 다른 소프트웨어의 ACL과 달리, Sentinel·Replica 인증용으로는 관련 명령·키 패턴을 명시적으로 허용해 주는 것이 필요합니다.
더 알아보기 (Learn more)
- 인증을 포함한 Redis 보안 전반: Redis security
- 클라이언트 측 캐싱에서
@readACL 범주: Client-side caching - 관련 명령: ACL, AUTH