[Redis] ACL

Redis ACL #

  • Redis 6 Version 부터 ACL(Access Control List)로 User라는 개념이 도입

    • 이 User를 통해 실행 가능 Command와 접근 가능 키를 제한할 수 있다.
  • ACL : Access Control List. 접근 제어

  • 사용자를 생성하고 암호 지정, 사용 가능한 Command와 키 지정 가능

  • ACL 사용을 통해 보안성과 안전성 구현 가능

    • KEYS/FLUSHALL 호출 방지, 사용자에게 필요한 권한만 부여 등

사용자 조회 #

사용자 정보 리스트 조회 #

1127.0.0.1:6379> ACL LIST
21) "user default on nopass ~* +@all"
  • 초기 Redis 서버에는 default user가 등록되어 있음
  • 사용자명 default
    • 활성 상태
    • 비밀번호 없음
    • 모든 키 접근 가능
    • 모든 Command 수행 가능

사용자 목록 조회 #

1127.0.0.1:6379> ACL USERS

사용자 조회 #

1127.0.0.1:6379> ACL GETUSER user

본인 확인 #

1127.0.0.1:6379> ACL WHOAMI

로그인 AUTH #

1127.0.0.1:6379> AUTH user password
  • user명 생략 시 default user로 로그인

사용자 등록 ACL SETUSER #

1127.0.0.1:6379> ACL SETUSER user on|off >password keys commands
  • user : user id 설정

  • on|off : 활성화 여부 설정. 사용자를 등록하지만 일단 사용하지 못하게 할 때 off 사용

    • 새로 로그인(auth) 할 수는 없지만, 이미 로그인한 사용자의 사용을 막을 수는 없음
  • >password : 비밀번호는 > 구분자 다음에 지정

    • nopass : 비밀번호 없이 사용하려는 경우 지정. 로그인 시 아무 문자열이나 입력해도 됨
    • 비밀번호 저장 시 내부적으로 SHA-256 암호화 알고리즘 사용
  • keys : 사용가능한 키 지정

    • 모든 키 허용 : allkeys 또는 ~*
    • 특정 패턴 지정 : ~user* 로 지정 시 user로 시작하는 키만 사용 가능
    • ~* 상태에서 특정 패턴을 지정하려면 resetkeys 사용 ex) ACL SETUSER user resetkeys ~user*
  • commands : 사용 가능한 Command 지정

    • 모든 Command 허용 : allcommands 또는 +@all
    • 모든 Command 비허용 : nocommands 또는 -@all
    • Command 지정 : +command로 추가, -command로 빼기
    • Command 그룹 지정 : +@group으로 추가, -@group으로 빼기
  • ACL SETUSER Command는 비밀번호가 포함되므로 로그에 남지 않음

  • 관리자 user 설정

    1127.0.0.1:6379> ACL SETUSER admin on >password allkeys allcommands
  • 조회 user 설정

    1127.0.0.1:6379> ACL SETUSER reader on >password allkeys +@read
  • Read/Write 가능한 일반 사용자 설정

    1127.0.0.1:6379> ACL SETUSER writer on >password allkeys allcommands -@dangerous
  • read-only:로 시작하는 key만 접근 가능

    1127.0.0.1:6379> ACL SETUSER reader on >abcd ~read-only:* +@all -@set &*
    • reader라는 User의 비밀번호를 abcd로 설정
    • key는 read-only:로 시작하는 key만 접근 가능
    • +@all은 모든 Command 사용 가능
    • -@set은 set Command는 사용 불가능
    • &*는 모든 pub/sub채널에 대해 접근 가능

Command 그룹 #

Command 그룹 목록 조회 #

 1127.0.0.1:6379> ACL CAT
 2 1) "keyspace"
 3 2) "read"
 4 3) "write"
 5 4) "set"
 6 5) "sortedset"
 7 6) "list"
 8 7) "hash"
 9 8) "string"
10 9) "bitmap"
1110) "hyperloglog"
1211) "geo"
1312) "stream"
1413) "pubsub"
1514) "admin"
1615) "fast"
1716) "slow"
1817) "blocking"
1918) "dangerous"
2019) "connection"
2120) "transaction"
2221) "scripting"
  • keyspace : del, expire, flushdb, keys, ttl, scan 등
  • read : get, lrange, smembers, zrange, hget, xrange 등
  • write : set, lpush, sadd, zadd, hset, xadd 등
  • set : sadd, scard, srem, spop 등
  • sortedset : zadd, zcard, srem, zpopmin 등
  • list : lpush, llen, lrem, lpop 등
  • hash : hset, hlen, ldel, hget 등
  • string : set, get, incr 등
  • bitmap : setbit, bitop, getbit 등
  • hyperloglog : pfadd, pfmerge, pfcount, pfselftest
  • geo : geoadd, geodist, georadius 등
  • stream : xadd, xlen, xrange, xdel 등
  • pubsub : publish, subscribe, pubsub 등
  • admin : bgsave, config, debug, shutdown 등
    • admin 명령은 dangerous 그룹에 포함됨
  • fast : get, lpush, hget 등
  • slow : lrem, mset, save 등
  • blocking : blpop, brpop, brpoplpush, bzpopmin, bzpopmax, xread, xreadgroup
  • dangerous : flushall, keys, shutdown, failover, cluster, client, module 등
  • connection : hello, client, auth, echo, ping, command
  • transaction : watch, multi, unwatch, discard, exec
  • scripting : evalsha, eval, script

Dangerous 그룹 #

  • 보안 위험, 성능 저하 위험이 있는 Command들이 포함됨
  • flushall : Redis 서버의 모든 데이터(key, value) 삭제
  • flushdb : 현재 사용중인 DB의 모든 데이터(key, value) 삭제
  • swapdb : 두 DB를 swap
  • keys : 패턴에 일치하는 모든 key 반환 ➡️ scan 사용으로 대체
  • shutdown : Redis 종료
  • monitor : 서버에서 실행되는 모든 Command 관찰/감시. monitor 수행 시 서버 성능 50% 하락
  • role : 자신의 역할(master/slave/sentinel)과 부가 정보 조회
  • sync : 내부 Command replication
  • psync : 내부 Command partial replication
  • replconf : 내부 명령 cluster
  • pfselftest : 내부 명령 HyperLogLog
  • sort : list 데이터를 정렬
  • sort_ro : sort와 동일하지만 결과를 저장하지 않음
  • migrate : data를 다른 redis server로 옮기기. 내부적으로 dump, restore, del 명령이 실행됨
  • restore, restore-asking : serialized value를 deserialize하여 저장
  • failover : master와 replica 변경
  • info : Redis 서버 정보와 통계값 조회
  • debug, pfdebug : redis 개발/테스트 용도. 여러 관리 명령 실행 가능
  • save : RDB 파일 저장 (foreground 수행). 수행 완료까지 서버가 다른 일 수행 불가
  • bgsave : RDB 파일 저장 (background 수행). 하위 프로세스를 생성하여 수행
  • bgrewriteaof : AOF 파일 저장(background 수행). 하위 프로세스를 생성하여 수행
  • lastsave : RDB 마지막 저장 일시를 timestamp 형식으로 출력
  • slaveof : 슬레이브 설정 변경
  • replicaof : 복제노드 설정 변경
  • config : 서버 설정 변경
  • client : 클라이언트 관리 (조회, 제거, 이름 변경 등)
  • cluster : 클러스터 설정 변경
  • module : 모듈 관리
  • slowlog : 명령 성능 측정/기록. 성능 저하 발생
  • latency : 서버 성능 분석. 성능 저하 발생
  • acl : 사용자 관리

그룹의 Command 목록 조회 #

1127.0.0.1:6379> ACL CAT group
  • Command가 어느 그룹에 속하는지 확인

    1127.0.0.1:6379> COMMAND INFO <Command명>

사용자 삭제 DELUSER #

1127.0.0.1:6379> ACL DELUSER user
  • Default user 삭제 불가

ACL file #

  • 사용자 정보 저장

    1127.0.0.1:6379> ACL SAVE
    • 사용자 정보를 redis.conf에 설정된 옵션에 따라 acl file에 저장
    • 저장하는 사용자 정보는 ACL LIST의 결과와 같음
  • 사용자 정보 로드

    1127.0.0.1:6379> ACL LOAD
    • redis 서버 시작 시 acl file에서 사용자 정보 로드

ACL(Auth) 로그 #

1127.0.0.1:6379> ACL LOG [<count> | RESET]
  • 실패한 로그인 정보 조회

ACL 참고

Advertisement