Redis의 Lua 스크립트 실행 기능은 강력한 확장성을 제공하지만, 최근 보안 취약점(CVE-2024-31449, CVE-2024-46981 등)이 발견됨에 따라 보안 강화가 필수적입니다. Redis Lua 스크립트 실행 환경을 보다 안전하게 구성하는 방법입니다.
Redis 최신 버전으로 업데이트
Redis의 보안 취약점이 해결된 최신 버전으로 업데이트해야 합니다. 현재 패치가 적용된 버전은 다음과 같습니다.
- Redis 7.4.2
- Redis 7.2.7
- Redis 6.2.17
업데이트 방법
- Redis 개발팀은 cmsgpack 및 struct 라이브러리 관련 보안 문제를 해결하는 패치를 제공했습니다.
- Redis의 Lua 스크립트 실행을 악용하여 원격 코드 실행(RCE) 가능성이 있었으므로, 최신 버전 사용이 필수적입니다.
Debian/Ubuntu
sudo apt-get update && sudo apt-get install redis-server
CentOS/RHEL
sudo yum update && sudo yum install redis
Docker 컨테이너
docker pull redis:latest
docker run -d --name redis-secure redis:latest
Lua 스크립트 실행에 대한 접근 통제
1. ACL을 사용하여 EVAL
/EVALSHA
제한
Redis의 ACL(Access Control List) 기능을 활용하여 특정 사용자만 Lua 명령어를 실행하도록 제한할 수 있습니다.
특정 사용자에게만 EVAL
및 EVALSHA
허용
ACL SETUSER lua_user on >securepassword ~* +eval +evalsha
ACL SETUSER default off ~* -eval -evalsha
lua_user
: Lua 스크립트 실행을 허용한 사용자default
: 기본 사용자에게EVAL
,EVALSHA
실행 금지
모든 사용자에서 EVAL
/EVALSHA
완전히 비활성화 (redis.conf
수정)
rename-command EVAL ""
rename-command EVALSHA ""
2. Lua 스크립트 화이트리스트 적용
미리 검증된 스크립트만 실행되도록 제한
스크립트를 Redis에 등록하고 SHA1 해시값을 기록
SCRIPT LOAD "return redis.call('SET', KEYS[1], ARGV[1])"
허용된 해시값만 실행하도록 애플리케이션에서 화이트리스트 적용
ALLOWED_SCRIPTS = {
"c664a3bf70bd1d45c4284ffebb65a6f2299bfc9f" # 허용된 SHA1 해시값
}
def execute_script(sha1_hash):
if sha1_hash not in ALLOWED_SCRIPTS:
raise ValueError("Unauthorized script execution attempt detected!")
Redis 프로세스 권한 최소화
1. Redis 실행 계정 제한
Redis 전용 사용자 생성
sudo adduser --system --group --no-create-home redis
redis.conf
에서 Redis를 전용 계정으로 실행
user redis
데이터 디렉터리 및 로그 권한 설정
sudo chown -R redis:redis /var/lib/redis
sudo chown -R redis:redis /var/log/redis
2. Seccomp/Sandboxing 적용
Seccomp를 사용하여 불필요한 시스템 호출 차단
Redis Docker 컨테이너 실행 시 Seccomp 적용
docker run --security-opt seccomp=./seccomp_profile.json redis:latest
✔ Seccomp 프로파일 예시 (seccomp_profile.json
)
{
"defaultAction": "SCMP_ACT_ERRNO",
"syscalls": [
{ "names": ["read", "write", "close", "fstat"], "action": "SCMP_ACT_ALLOW" }
]
}
AppArmor를 사용한 실행 제한
sudo aa-complain /etc/apparmor.d/usr.sbin.redis-server
네트워크 보안
1. 바인딩 인터페이스 제한
Redis를 외부에서 접근하지 못하도록 설정
bind 127.0.0.1
2. TLS 암호화 활성화
OpenSSL로 인증서 생성
openssl req -x509 -nodes -newkey rsa:2048 -keyout redis.key -out redis.crt -days 365
redis.conf
에서 TLS 활성화
tls-cert-file /path/to/redis.crt
tls-key-file /path/to/redis.key
tls-port 6379
Redis 클라이언트에서도 TLS 활성화
redis-cli --tls --cert redis.crt --key redis.key
Lua 스크립트 보안 점검
1. 입력값 검증
Lua 스크립트에서 전달받은 모든 입력값을 검증해야 합니다.
✔ 안전한 Lua 스크립트 예제
local key = KEYS[1]
local value = ARGV[1]
-- 입력값 검증
if not key or not value then
return redis.error_reply("Invalid input")
end
return redis.call("SET", key, value)
2. 외부 호출 차단
- Lua 스크립트에서 외부 파일 I/O 및 Shell 호출 방지
- Redis 설정에서
sandbox
기능을 활성화
운영 모니터링 및 감사
1. Redis 명령 로깅
Redis에서 실행된 모든 명령을 로깅하여 비정상적인 Lua 스크립트 실행을 감지할 수 있습니다.
redis.conf
설정
loglevel notice
logfile /var/log/redis/redis.log
2. Lua 스크립트 실행 실시간 모니터링
redis-cli monitor | grep -E 'EVAL|EVALSHA'
✅ Redis 최신 버전 업데이트: 취약점 패치 적용
✅ ACL로 Lua scripting 접근 제한 및 EVAL
비활성화
✅ Redis 프로세스 권한 최소화 및 Seccomp
/AppArmor
적용
✅ 네트워크 접근 통제 (TLS 암호화
, bind 127.0.0.1
)
✅ Lua 스크립트 보안 점검 (입력값 검증
, 외부 호출 차단
)
✅ 실행 로그 및 Lua 스크립트 모니터링 (logfile
, redis-cli monitor
)
Redis의 Lua 스크립팅 기능을 안전하게 운영하려면 최신 보안 패치를 적용하고, ACL 제한, 실행 환경 격리, 네트워크 보안 설정을 철저히 관리하는 것이 필수적입니다. 이러한 보안 조치를 준수하면 Redis 환경에서 안전하게 Lua 스크립트를 실행할 수 있습니다.
댓글