如何在Linux上執行安全的Redis安裝

Redis 對許多事情都有好處,其中之一就是緩存。您也可以將 Redis 用作主要數據存儲,甚至可以用它來替代數據庫。但是如何執行安全的 Redis 安裝呢?安裝 Redis 可能會很痛苦,如果不小心,您可能會遇到許多錯誤。幸運的是,這篇教程為您提供了完整的解決方案。

在本教程中,您將學習如何在 Linux 系統上安全地安裝 Redis,並提供一些避免常見錯誤的提示。

繼續閱讀,免去為解決 Redis 安裝錯誤而感到頭痛的麻煩!

先決條件

本教程將進行實際操作演示。如果您想跟著做,請確保您擁有以下內容:

  • 一台 Ubuntu 20.04 LTS 機器 – 本教程使用 Ubuntu 20.04 LTS,但對於大多數 Linux 發行版,指導都是類似的。
  • Root 權限或具有 sudo 權限的非 root 用戶

使用 APT 軟件包管理器安裝 Redis

有幾種方法可以在Ubuntu上安裝Redis,但在這個教程中,您將使用APT軟件包管理器來安裝Redis。

Redis是用C編寫的,所以您需要從源代碼手動編譯Redis。需要安裝幾個依賴項,並且構建過程並不完全無憂。

不建議從源代碼編譯Redis,但優點是您可以根據需要自定義安裝。您可以下載源代碼,然後手動配置它。

打開您的終端並運行下面的apt update命令來確保您擁有最新的軟件包列表

sudo apt update -y
Updating the Linux system

現在,運行下面的apt install命令來在您的機器上安裝Redis。

下面的命令使用apt軟件包管理器從Ubuntu存儲庫中下載並安裝redis-server軟件包到您的機器上。-y標誌告訴apt在安裝過程中自動接受提示。

sudo apt install redis-server -y
Installing Redis on your machine

配置Redis.conf文件以運行Redis作為服務

你剛剛安裝了Redis,但它還沒準備好使用。在你開始使用Redis之前,你首先需要配置redis.conf文件。

安裝的Redis套件包含了redis.conf配置文件,默認存儲在/etc/redis/目錄中。該文件包含了Redis的所有配置選項。

conf文件擴展名是合乎邏輯的,因為它遵循了常規模式。許多其他程序也使用了這種相同的風格。例如,Apache Web服務器使用.conf文件擴展名作為其主配置文件。

1.執行以下systemctl命令來停止redis-server服務。當你首次開始使用Redis時,停止Redis服務的運行是一種推薦的做法。

sudo systemctl stop redis.service

2. 接下來,在你首選的文本編輯器中打開/etc/redis/redis.conf文件。

找到supervised指令,然後將其設置為systemd,如下所示,並保存更改。這樣做告訴操作系統將Redis作為一個服務運行。

Setting up the systemd directive

3. 現在,執行下面的systemctl restart命令來重新啟動Redis服務(redis.service),因為Redis服務尚不知道這些更改。

sudo systemctl restart redis.service

4. 最後,執行下面的systemctl status命令來查看Redis是否正在運行。

sudo systemctl status redis.service

如您在下面看到的,輸出顯示Redis服務正在運行。

Checking if Redis Service is Running

測試Redis服務器功能是否正常

您已經配置並驗證了Redis服務正在積極運行,但這並不意味着Redis服務器正在運作。如何測試Redis服務器功能是否正常?連接到Redis服務器並發送命令以查看服務器是否有響應。

1. 執行下面的redis-cli命令來連接到Redis服務器。redis-cli 是Redis的命令行界面,它允許您向服務器發送命令並檢查其狀態。

redis-cli

下面,您可以看到您在Redis服務器提示符(127.0.0.1:6379>)中。默認情況下,redis-cli命令嘗試連接到127.0.0.1:6379的Redis服務器。

Connecting to the Redis Server

2. 接下來,執行下面的ping命令來檢查Redis服務器是否可達。

ping

如您所見,服務器返回了PONG,這表明Redis服務器是可達的,現在可以成功地與服務通信。

Pinging the Redis server

也许你还持怀疑态度;运行下面的set命令。set命令是一个Redis命令,用于在数据库中设置键值对。

set test "This is a test"

如你所见,set命令返回“OK”,这表示Redis服务正在正常工作。

Testing the Redis server

3. 运行下面的exit命令以退出redis-cli。这样做会关闭与Redis服务器的连接。

exit

将Redis服务器绑定到本地主机

你刚刚测试了Redis服务器是否正常工作,但它也许可以从你网络上的其他设备访问。这种行为是不可取的,通常你希望保护Redis服务器免受陌生人的访问。

将Redis服务器绑定到localhost会设置一种行为,即只有安装Redis的计算机可以访问Redis服务器。

1. 在你的文本编辑器中打开/etc/redis/redis.conf文件。

2. 找到一行写着bind 127.0.0.1 ::1的行,并删除行首的井号#取消注释该行。

Uncommenting the bind 127.0.0.1 ::1 line

3. 现在,运行下面的命令以重新启动redis-server服务。

sudo systemctl restart redis-server

4. 最后,运行以下命令检查你的Redis服务器是否已绑定到localhost。netstat -lnp命令会列出所有活动的网络连接,grep redis部分会过滤包含“redis”的行。

-lnp代表本地名称协议,它是UNIX-like系统用于将主机名解析为IP地址的网络协议。

sudo netstat -lnp | grep redis

你可以看到Redis服务器现在只在本地接口上监听(127.0.0.1:6379)。根据配置文件的更改,你可以看到只有本地接口在你的活动互联网连接下列出(tcp)。

现在,你的网络上的其他设备无法连接到你的Redis服务器。

Listing all active network connections

使用密码保护Redis服务器连接

此时,Redis未设置要求用户使用密码进行身份验证。任何知道你的Redis服务器的IP地址或主机名的人都可以连接并更改其数据。

如何保护你的Redis服务器?设置一个密码,要求用户在连接到你的Redis服务器时进行身份验证。

1. 在你的文本/代码编辑器中重新打开redis.conf配置文件。

2. 接下来,使用以下命令设置一个强密码:

  • SECURITY部分查找requirepass foobared
  • 删除行首的井号(#
  • foobared替换为你选择的强密码,并保存更改
Providing a secure password

3. 运行以下命令重新启动并连接到你的Redis服务器。

sudo systemctl restart redis-server
redis-cli

4. 现在,运行ping命令查看是否能从服务器获得响应。

ping

以下是一個錯誤訊息,說明需要 NOAUTH 認證。這表示您需要一個認證密碼才能遠程訪問您的 Redis 服務器。

Testing connection with the server

5. 執行以下命令auth,然後跟著您的密碼來驗證您與 Redis 服務器的連接。

auth Qae9p_fY:YjdtJ7k

當驗證成功時,您將會收到一個像下面這樣的OK回應。

Authenticating Redis Server Connection

6. 最後,重新運行ping命令來測試您是否已經成功驗證您與 Redis 服務器的連接。

ping

在驗證連接後,您現在將會收到PONG回應,如下所示。此時,您已成功保護了 Redis 服務器。

Pinging the Redis server

禁用危險命令以保護您的 Redis 服務器

設置密碼以驗證與 Redis 服務器的連接並不能百分之百地保護它。默認情況下,Redis 包含幾個危險命令,允許用戶更改數據庫中的數據。

當未經授權的用戶運行這些命令時,這些命令允許入侵者讀取、修改、破壞甚至清除 Redis 數據庫的數據。

以下並不是一個全面的列表,因為您的 Redis 服務器可能有其他危險命令,但在大多數情況下,這些都是危險的命令:

FLUSHDB, FLUSHALL, KEYS, PEXPIRE, DEL, CONFIG, SHUTDOWN, BGREWRITEAOF
BGSAVE, SAVE, SPOP, SREM, RENAME, DEBUG, EVAL

為了進一步保護您的 Redis 服務器,在redis.conf文件中將這些危險命令重命名:

1. 在您的文本編輯器中打開redis.conf文件,並查找命令重命名部分。

將命令重命名為空字符串以禁用它們,按照以下語法進行操作。將the-command替換為要禁用的實際命令。

rename-command the-command ""

例如,通過將CONFIG的名稱更改為空字符串來禁用CONFIG命令,如下所示,然後保存更改。雙引號(“”)表示空字符串,表示禁用命令。

Renaming the CONFIG command

2. 退出文本編輯器,運行以下命令以重新啟動Redis服務器。

sudo systemctl restart redis-server

3. 現在運行以下命令以連接到您的Redis服務器。

redis-cli
auth Qae9p_fY:YjdtJ7k

4. 最後,運行config get命令來測試是否已禁用CONFIG命令。

config get requirepass

您將獲得一個ERR unknown command config的響應,如下所示,表示已禁用CONFIG命令。

Checking the CONFIG command

如果config get requirepass命令成功執行,它將請求您的Redis服務器提供密碼以驗證連接到Redis服務器的連接。

您已成功將危險的Redis命令重命名以保護您的Redis服務器。現在繼續禁用redis.conf文件中的其他危險命令。

使用防火牆阻止對Redis服務器的連接請求

保護Redis服務器的另一種方法是設置防火牆。設置防火牆需要僅允許每個運行在服務器上的服務所需的端口。

例如,如果您在服务器上以端口6379运行Redis,则只需打开该端口。如果需要允许来自特定IP地址或地址范围的访问,您可以将这些地址添加到防火墙规则。

要设置防火墙,您首先需要安装防火墙配置工具。此示例使用UFW,这是Linux上常用的防火墙配置工具。但您也可以使用其他工具,例如iptables来设置防火墙。

1. 运行以下命令在您的机器上安装UFW。

sudo apt install ufw -y

2. 接下来,运行以下命令启用UFW。

sudo ufw enable

在出现以下提示时输入’Y’以继续运行命令。

Enabling UFW

3. 运行下面的ufw命令添加规则,允许端口6379上的Redis服务器流量。将11.22.33.44 IP地址替换为您预期用户的IP地址。

sudo ufw allow from 11.22.33.44 to any port 6379
Adding a firewall rule to allow traffic on port 6379

4. 最后,运行以下命令验证您已成功添加防火墙规则。该命令检查防火墙的status

sudo ufw status

您可以在下面的输出中看到防火墙是active,并具有允许从IP地址11.22.33.44访问Redis端口6379的规则。

Checking the UFW rules

現在,任何使用IP地址為11.22.33.44的用戶都可以通過端口6379連接到Redis,並需要用密碼進行身份驗證。您可以以類似的方式添加其他服務的額外端口。

結論

在本教程中,您已經學會了如何通過將危險命令重命名為空字符串並設置防火牆來安裝和保護您的Redis服務器。

有了這些新的知識,您可以享受Redis的全部好處,而不必擔心將您的服務器暴露於不必要的風險之下。

想要了解更多嗎?為什麼不從在Kubernetes中保護Redis服務器開始呢?

Source:
https://adamtheautomator.com/redis-install/