Redis

如何在 Redis 中關閉“保護模式”?

  • September 9, 2021

我想禁用protected-mode我的生產 Redis。關於我從其他 Redis-Sentinel 實例得到的以下錯誤,我可以通過從它執行的主機連接到 Redis 來實時禁用它。

拒絕 Redis 在保護模式下執行,因為啟用了保護模式,沒有指定綁定地址,也沒有向客戶端請求身份驗證密碼。在此模式下,僅接受來自環回介面的連接。如果您想從外部電腦連接到 Redis,您可以採用以下解決方案之一:

  1. 通過從伺服器正在執行的同一主機連接到 Redis,只需禁用從環回介面發送命令“CONFIG SET protected-mode no”的保護模式,但是如果這樣做,請確保 Redis 不能從 Internet 公開訪問。使用 CONFIG REWRITE 使此更改永久生效。

  2. 或者,您可以通過編輯 Redis 配置文件並將保護模式選項設置為“否”來禁用保護模式,然後重新啟動伺服器。

  3. 如果您手動啟動伺服器只是為了測試,請使用“–protected-mode no”選項重新啟動它。

  4. 設置綁定地址或認證密碼。

注意:您只需執行上述操作之一,伺服器即可開始接受來自外部的連接。

但是當我連接並嘗試禁用它時,我得到了 Error (error) ERR Unsupported CONFIG parameter: protected-mode

沒有配置身份驗證或其他任何東西 - 所有安全性都由防火牆規則管理。redis.conf幾乎是預設的。

展示

root@svim-redis03 /etc/redis # redis-cli

127.0.0.1:6379> CONFIG GET protected*
(empty list or set)
127.0.0.1:6379> CONFIG GET bind*
1) "bind"
2) "127.0.0.1"
127.0.0.1:6379> CONFIG SET protected-mode no
(error) ERR Unsupported CONFIG parameter: protected-mode
127.0.0.1:6379> exit

root@svim-redis03 /etc/redis # redis-server --version
Redis server v=3.2.9 sha=00000000:0 malloc=jemalloc-4.0.3 bits=64 build=86450d2ba8219c1e

之前有什麼需要檢查或更改的嗎?我在文件GitHub 問題中找不到任何提示。

更新01

甚至不可能更改綁定地址或任何其他配置參數。我需要先啟用配置更改嗎?

127.0.0.1:6379> config set bind "127.0.0.1 11.12.13.14"
(error) ERR Unsupported CONFIG parameter: bind

事實證明,目前執行的伺服器與我安裝的二進製文件版本不同。

如何重現這個?

只需通過連接redis-cli到您的 redis 實例並鍵入INFO server返回一堆資訊。

127.0.0.1:6379> INFO server
# Server
redis_version:3.0.7
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:869e89100d5ea8c2
redis_mode:standalone
os:Linux 4.2.0-35-generic x86_64
arch_bits:64
multiplexing_api:epoll
gcc_version:4.8.4
process_id:26720
run_id:6645270dd2ac6a7f96caa054f9dbba9e66566755
tcp_port:6379
uptime_in_seconds:10971777
uptime_in_days:126
hz:10
lru_clock:6676576
config_file:/etc/redis/redis.conf

正如你所看到的,這個 redis-instance 執行了將近 127 天並使用redis_version:3.0.7.

如何解決這個問題?

重新啟動您的伺服器,並確保您真的重新啟動它!例如,對於大多數 Linux 發行版,您可以通過點擊以下命令來實現。

root@svim-redis03 ~ # service redis-server stop
Stopping redis-server: redis-server.

通過嘗試連接來檢查它是否真的離線redis-cli。如果您仍然可以連接,則實例仍在執行。通過搜尋活動的 redis 程序來檢查這一點。

root@svim-redis03 ~ # ps -efl |grep redis
1 S redis    12418     1  0  80   0 - 10673 ep_pol  2016 ?        05:33:17 /usr/bin/redis-server 127.0.0.1:6381
1 S redis    12442     1  0  80   0 - 11697 ep_pol  2016 ?        05:33:46 /usr/bin/redis-server 127.0.0.1:6382
1 S redis    12453     1  0  80   0 - 10673 ep_pol  2016 ?        05:40:17 /usr/bin/redis-server 127.0.0.1:6383
4 S root     16570 16386  0  80   0 -  2489 wait_w 10:42 pts/7    00:00:00 tail -f /var/log/redis/redis-server-6379.log
0 S root     17064 12637  0  80   0 -  3617 pipe_w 10:47 pts/1    00:00:00 grep --color=auto redis
1 S redis    26720     1  0  80   0 - 453041 ep_pol Mar07 ?       08:37:01 /usr/bin/redis-server 127.0.0.1:6379

如您所見,實例(程序 ID:26720)仍在執行。使用以下命令退出它。

kill 26720

在您終止程序後,再次檢查ps -efl |grep redis實例是否真的關閉。

最後重新開始

root@svim-redis03 ~ # service redis-server start
Starting redis-server: redis-server.

現在檢查實例是否以正確的版本執行。

root@svim-redis03 ~ # redis-cli
127.0.0.1:6379> INFO server
# Server
redis_version:3.2.9
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:86450d2ba8219c1e
redis_mode:standalone
os:Linux 4.2.0-35-generic x86_64
arch_bits:64
multiplexing_api:epoll
gcc_version:4.8.4
process_id:17135
run_id:40d6fa2e2b25e8f5b97a3c97ec1bddb8edda0014
tcp_port:6379
uptime_in_seconds:11
uptime_in_days:0
hz:10
lru_clock:6677102
executable:/usr/bin/redis-server
config_file:/etc/redis/redis.conf

引用自:https://serverfault.com/questions/861519