Cài đặt Redis trên CentOS 7 - Install Redis on CentOS 7
Redis được thiết kế để sử dụng bởi các máy khách đáng tin cậy trong môi trường đáng tin cậy và không có các tính năng bảo mật mạnh mẽ riêng. Tuy nhiên, Redis vẫn có một số tính năng bảo mật bao gồm mật khẩu cơ bản không được mã hóa, việc đổi tên và tắt các lệnh. Hướng dẫn này cung cấp cách cấu hình các tính năng bảo mật và một số cài đặt nâng cao tính bảo mật của install Redis độc lập trên CentOS 7.
Redis là một hệ thống lưu trữ dữ liệu trong bộ nhớ mã nguồn mở, xuất sắc trong việc lưu trữ dữ liệu tạm thời (cache). Là một cơ sở dữ liệu phi quan hệ, Redis nổi tiếng về tính linh hoạt, hiệu suất, khả năng mở rộng và khả năng hỗ trợ nhiều ngôn ngữ lập trình.
Lưu ý rằng hướng dẫn này không đề cập đến các tình huống mà máy chủ Redis và ứng dụng máy khách nằm trên các máy chủ khác nhau hoặc trong các trung tâm dữ liệu khác nhau. Các cài đặt nơi lưu lượng Redis phải trải qua mạng không an toàn hoặc không đáng tin cậy sẽ yêu cầu một tập hợp cấu hình khác, chẳng hạn như thiết lập proxy SSL hoặc mạng riêng ảo (VPN) giữa các máy chủ Redis.
Chuẩn bị trước khi cài đặt
Để làm theo hướng dẫn này, bạn sẽ cần:
- Một Droplet CentOS 7 được cấu hình sử dụng
- Firewalld được cài đặt và cấu hình sử dụng, bao gồm cả bước "Bật tường lửa".
Tiến hành install Redis trên CentOS 7
Bước 1 — Cài đặt Redis
Trước khi cài đặt Redis, chúng ta cần thêm kho lưu trữ Extra Packages for Enterprise Linux (EPEL) vào danh sách gói của máy chủ. EPEL là kho lưu trữ gói chứa nhiều gói phần mềm bổ sung mã nguồn mở, hầu hết được duy trì bởi Dự án Fedora.
Cài đặt EPEL bằng yum
:
sudo yum install epel-release
Sau khi cài đặt EPEL hoàn thành, bạn cài đặt Redis bằng yum
:
sudo yum install redis -y
Việc này có thể mất một vài phút để hoàn thành. Sau khi cài đặt hoàn tất, khởi động dịch vụ Redis:
sudo systemctl start redis.service
Nếu bạn muốn Redis khởi động cùng với hệ thống, bạn bật với lệnh enable
:
sudo systemctl enable redis
Kiểm tra trạng thái của Redis:
sudo systemctl status redis.service
Đầu ra mẫu:
Output
● redis.service - Redis persistent key-value database
Loaded: loaded (/usr/lib/systemd/system/redis.service; disabled; vendor preset: disabled)
Drop-In: /etc/systemd/system/redis.service.d
└─limit.conf
Active: active (running) since Thu 2018-03-01 15:50:38 UTC; 7s ago
Main PID: 3962 (redis-server)
CGroup: /system.slice/redis.service
└─3962 /usr/bin/redis-server 127.0.0.1:6379
Sau khi bạn đã xác nhận rằng Redis đang hoạt động, thử nghiệm cài đặt bằng lệnh này:
redis-cli ping
Lệnh này sẽ in ra "PONG" như phản hồi. Nếu điều này đúng, có nghĩa bạn đã cài đặt thành công Redis trên máy chủ và chúng ta đã có thể cấu hình để nâng cao tính bảo mật.
Bước 2 — Ràng buộc Redis và bảo mật bằng Tường lửa
Một cách hiệu quả để bảo vệ Redis là bảo mật máy chủ đang chạy Redis. Bạn có thể làm điều này bằng cách đảm bảo rằng Redis được ràng buộc chỉ đến localhost hoặc đến một địa chỉ IP riêng tư và máy chủ có tường lửa hoạt động.
Tuy nhiên, nếu bạn đã chọn thiết lập một cụm Redis bằng cách sử dụng hướng dẫn này, thì bạn đã cập nhật tệp cấu hình để cho phép kết nối từ bất kỳ đâu, điều này không an toàn như việc ràng buộc với localhost hoặc địa chỉ IP riêng tư.
Để khắc phục điều này, mở tệp cấu hình Redis để chỉnh sửa:
sudo vi /etc/redis.conf
Tìm dòng bắt đầu bằng "bind" và đảm bảo rằng nó không được ghi chú:
bind 127.0.0.1
Nếu bạn cần ràng buộc Redis với địa chỉ IP khác (như trong các trường hợp bạn sẽ truy cập Redis từ máy khách riêng biệt), mình khuyến khích bạn ràng buộc nó với địa chỉ IP riêng tư. Ràng buộc với địa chỉ IP công cộng sẽ tăng khả năng giao diện Redis của bạn bị tiết lộ cho bên ngoài.
bind your_private_ip
Nếu bạn đã tuân theo các tiền điều kiện và đã cài đặt firewalld trên máy chủ và bạn không có kế hoạch kết nối với Redis từ máy khách khác, thì bạn không cần thêm bất kỳ luật tường lửa bổ sung nào cho Redis. Mọi lưu lượng đến sẽ bị từ chối mặc định, trừ khi được cho phép rõ ràng bởi các luật tường lửa. Vì một cài đặt Redis độc lập mặc định chỉ lắng nghe trên giao diện loopback (127.0.0.1 hoặc localhost), không nên lo lắng về lưu lượng đến trên cổng mặc định của nó.
Tuy nhiên, nếu bạn kế hoạch truy cập Redis từ máy khách khác, bạn sẽ cần thực hiện một số thay đổi vào cấu hình firewalld của bạn bằng cách sử dụng lệnh firewall-cmd
. Một lần nữa, bạn chỉ nên cho phép truy cập vào máy chủ Redis của bạn từ các máy khách riêng biệt bằng cách sử dụng địa chỉ IP riêng tư của chúng để hạn chế số lượng máy chủ mà dịch vụ của bạn được tiếp xúc.
Để bắt đầu, thêm một khu vực Redis riêng biệt vào chính sách firewalld của bạn:
sudo firewall-cmd --permanent --new-zone=redis
Tiếp theo, xác định cổng bạn muốn mở. Redis sử dụng cổng 6379 theo mặc định:
sudo firewall-cmd --permanent --zone=redis --add-port=6379/tcp
Tiếp theo, chỉ định bất kỳ địa chỉ IP riêng tư nào được phép thông qua tường lửa và truy cập Redis:
sudo firewall-cmd --permanent --zone=redis --add-source=client_server_private_IP
Sau khi chạy các lệnh đó, tải lại tường lửa để thực hiện các luật mới:
sudo firewall-cmd --reload
Trong cấu hình này, khi tường lửa nhận được một gói tin từ địa chỉ IP của máy khách của bạn, nó sẽ áp dụng các luật trong khu vực Redis riêng biệt cho kết nối đó. Tất cả các kết nối khác sẽ được xử lý bởi khu vực công cộng mặc định. Các dịch vụ trong khu vực mặc định áp dụng cho mọi kết nối, không chỉ là những kết nối không khớp rõ ràng, vì vậy bạn không cần thêm các dịch vụ khác (ví dụ: SSH) vào khu vực Redis vì các luật đó sẽ được áp dụng tự động cho kết nối đó.
Nếu bạn đã chọn cài đặt tường lửa sử dụng Iptables, bạn sẽ cần cho phép các máy khách thứ cấp truy cập vào cổng mà Redis đang sử dụng bằng các lệnh sau:
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -p tcp -s client_servers_private_IP/32 --dport 6379 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -P INPUT DROP
Hãy đảm bảo lưu các luật tường lửa Iptables sử dụng cơ chế được cung cấp bởi bản phân phối của bạn.
Việc sử dụng bất kỳ công cụ tường lửa nào cũng sẽ hoạt động. Quan trọng là tường lửa hoạt động để ngăn các cá nhân không xác định có thể truy cập vào máy chủ của bạn. Trong bước tiếp theo, chúng ta sẽ cấu hình Redis chỉ có thể truy cập bằng mật khẩu mạnh.
Bước 3 — Cấu hình mật khẩu Redis
Nếu bạn đã cài đặt Redis cấu hình cụm Redis trên CentOS 7 và đã cấu hình mật khẩu cho nó. Tùy ý của bạn, bạn có thể tạo một mật khẩu an toàn hơn bằng cách làm theo bước 3. Nếu bạn chưa thiết lập mật khẩu, hướng dẫn trong phần này sẽ hướng dẫn cách đặt mật khẩu máy chủ cơ sở dữ liệu.
Cấu hình mật khẩu Redis cho phép một trong các tính năng bảo mật tích hợp sẵn của nó — lệnh "auth" — yêu cầu khách hàng xác thực trước khi được phép truy cập vào cơ sở dữ liệu. Giống như cài đặt "bind", mật khẩu được cấu hình trực tiếp trong tệp cấu hình của Redis, /etc/redis.conf. Mở lại tệp này để chỉnh sửa:
sudo vi /etc/redis.conf
Di chuyển đến phần SECURITY và tìm kiếm chỉ thị có ký hiệu dưới dạng chú thích:
# requirepass foobared
Bạn loại bỏ dấu #
và thay thế "foobared
" bằng một mật khẩu rất mạnh mẽ do bạn lựa chọn. Thay vì tự tạo mật khẩu, bạn có thể sử dụng một công cụ như "apg" hoặc "pwgen" để tạo ra một mật khẩu. Tuy nhiên, nếu bạn không muốn cài đặt một ứng dụng chỉ để tạo mật khẩu, bạn có thể sử dụng lệnh sau.
Lưu ý rằng việc nhập lệnh này theo cách viết sẽ tạo ra cùng một mật khẩu mỗi lần. Để tạo một mật khẩu khác với mật khẩu mà điều này sẽ tạo ra, thay đổi từ trong dấu ngoặc kép thành bất kỳ từ hoặc cụm từ nào khác.
echo "digital-ocean" | sha256sum
Mặc dù mật khẩu được tạo ra sẽ không thể phát âm, nó lại rất mạnh mẽ và rất dài, chính xác là loại mật khẩu yêu cầu cho Redis. Sau khi sao chép và dán đầu ra của lệnh này là giá trị mới cho "requirepass
", nó sẽ như sau:
requirepass password_copied_from_output
Nếu bạn thích một mật khẩu ngắn hơn, hãy sử dụng đầu ra của lệnh sau thay thế. Một lần nữa, thay đổi từ trong dấu ngoặc kép để nó không tạo ra cùng một mật khẩu như này:
echo "digital-ocean" | sha1sum
Sau khi đặt mật khẩu, lưu và đóng tệp rồi khởi động lại Redis:
sudo systemctl restart redis.service
Để kiểm tra xem mật khẩu hoạt động, truy cập dòng lệnh Redis:
redis-cli
Dưới đây là một chuỗi các lệnh được sử dụng để kiểm tra xem mật khẩu Redis hoạt động. Lệnh đầu tiên cố gắng đặt một khóa cho một giá trị trước khi xác thực.
set key1 10
Điều này sẽ không hoạt động vì chúng ta chưa xác thực, vì vậy Redis sẽ trả về một lỗi.
Output
(error) NOAUTH Authentication required.
Lệnh sau xác thực bằng mật khẩu được chỉ định trong tệp cấu hình Redis.
auth your_redis_password
Redis sẽ xác nhận chúng ta đã được xác thực:
Output
OK
Sau đó, chạy lại lệnh trước sẽ thành công:
set key1 10
Output
OK
Lệnh "get key1
" truy vấn Redis để lấy giá trị của khóa mới.
get key1
Output
"10"
Lệnh cuối cùng này thoát khỏi redis-cli. Bạn cũng có thể sử dụng lệnh "exit
":
quit
Bây giờ, việc truy cập vào cài đặt Redis của bạn bởi người dùng chưa được ủy quyền sẽ rất khó khăn. Lưu ý, tuy nhiên, rằng mật khẩu không được mã hóa sẽ vẫn hiển thị cho bên ngoài nếu bạn đang kết nối với Redis từ xa.
Tiếp theo, chúng ta sẽ xem xét việc đổi tên các lệnh Redis để bảo vệ Redis khỏi các hành động độc hại.
Bước 4 — Đổi tên các lệnh nguy hiểm
Tính năng bảo mật khác được tích hợp vào Redis cho phép bạn đổi tên hoặc vô hiệu hóa một số lệnh được coi là nguy hiểm. Khi chạy bởi người dùng không được ủy quyền, các lệnh như vậy có thể được sử dụng để cấu hình lại, phá hủy hoặc xóa dữ liệu của bạn. Một số lệnh được biết đến là nguy hiểm bao gồm:
- FLUSHDB
- FLUSHALL
- KEYS
- PEXPIRE
- DEL
- CONFIG
- SHUTDOWN
- BGREWRITEAOF
- BGSAVE
- SAVE
- SPOP
- SREM
- RENAME
- DEBUG
Đây không phải là một danh sách toàn diện, nhưng việc đổi tên hoặc vô hiệu hóa tất cả các lệnh trong danh sách đó là một điểm khởi đầu tốt.
Việc bạn vô hiệu hóa hoặc đổi tên một lệnh là tùy theo từng trang web. Nếu bạn biết bạn sẽ không bao giờ sử dụng một lệnh có thể bị lạm dụng, bạn có thể vô hiệu hóa hoặc đổi tên nó.
Giống như mật khẩu xác thực, việc đổi tên hoặc vô hiệu hóa các lệnh được cấu hình trong phần SECURITY của tệp /etc/redis.conf.
Để bật hoặc vô hiệu hóa lệnh Redis, mở tệp cấu hình để chỉnh sửa một lần nữa:
sudo vi /etc/redis.conf
CHÚ Ý: Đây chỉ là ví dụ. Bạn nên chọn để vô hiệu hóa hoặc đổi tên các lệnh thích hợp. Bạn có thể kiểm tra các lệnh cho chính mình và xác định cách chúng có thể bị lạm dụng tại redis.io/commands.
Để vô hiệu hóa hoặc tắt một lệnh, chỉ đơn giản là đổi tên nó thành một chuỗi rỗng, như được hiển thị dưới đây:
# It is also possible to completely kill a command by renaming it into
# an empty string:
#
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command GỠ LỖI ""
Để đổi tên một lệnh, đặt cho nó một tên khác như trong các ví dụ dưới đây. Các lệnh đã được đổi tên nên khó đoán cho người khác, nhưng dễ nhớ đối với bạn:
rename-command CẤU HÌNH ""
rename-command TẮT TẮT_MENOT
rename-command CẤU HÌNH ASC12_CẤU HÌNH
Lưu các thay đổi và đóng tệp, sau đó áp dụng thay đổi bằng cách khởi động lại Redis:
sudo systemctl restart redis.service
Để kiểm tra lệnh mới, nhập dòng lệnh Redis:
redis-cli
Xác thực bản thân bằng mật khẩu bạn đã định nghĩa trước đó:
auth your_redis_password
Output
OK
Giả sử bạn đã đổi tên lệnh CẤU HÌNH thành ASC12_CẤU HÌNH, việc cố gắng sử dụng lệnh config sẽ thất bại.
config get requirepass
Output
(error) ERR unknown command 'config'
Gọi lệnh đã đổi tên sẽ thành công (không phân biệt chữ hoa chữ thường):
asc12_config get requirepass
Output
1) "requirepass"
2) "your_redis_password"
Cuối cùng, bạn có thể thoát khỏi redis-cli:
exit
Lưu ý rằng nếu bạn đã sử dụng dòng lệnh Redis và sau đó khởi động lại Redis, bạn sẽ cần xác thực lại. Nếu không, bạn sẽ nhận được lỗi này nếu bạn nhập một lệnh:
Output
NOAUTH Authentication required.
Về việc đổi tên các lệnh, có một tuyên bố cảnh báo ở cuối phần SECURITY trong tệp /etc/redis.conf:
. . .
# Please note that changing the name of commands that are logged into the
# AOF file or transmitted to slaves may cause problems.
. . .
Điều đó có nghĩa là nếu lệnh đã được đổi tên không có trong tệp AOF hoặc nếu nó có nhưng tệp AOF chưa được truyền đến các slave, thì không nên có vấn đề gì. Hãy nhớ điều đó khi bạn đổi tên các lệnh. Thời gian tốt nhất để đổi tên một lệnh là khi bạn không sử dụng AOF persistence hoặc ngay sau khi cài đặt (nghĩa là trước khi ứng dụng sử dụng Redis của bạn đã được triển khai).
Khi bạn sử dụng AOF và gặp phải cài đặt master-slave, hãy xem xét câu trả lời này từ trang GitHub của dự án. Dưới đây là một câu trả lời cho câu hỏi:
- Các lệnh được ghi lại trong tệp AOF và được sao chép đến slave theo cùng cách chúng được gửi đi, vì vậy nếu bạn cố gắng phát lại AOF trên một instance không có tên đổi tương tự, bạn có thể gặp sự không nhất quán khi lệnh không thể thực thi (tương tự cho slaves).
- Cách tốt nhất để xử lý việc đổi tên trong những trường hợp như thế là đảm bảo rằng các lệnh đã đổi tên được áp dụng cho tất cả các phiên bản của cài đặt master-slave.
Bước 5 — Đặt quyền sở hữu thư mục dữ liệu và quyền tập tin
Trong bước này, chúng ta sẽ xem xét một số thay đổi về quyền sở hữu và quyền truy cập bạn có thể thực hiện để cải thiện hồ sơ bảo mật của cài đặt Redis của bạn. Bao gồm đảm bảo rằng chỉ người dùng cần truy cập Redis có quyền đọc dữ liệu. Người dùng đó theo mặc định, là người dùng redis.
Bạn xác minh điều này bằng lệnh grep
để tìm kiếm thư mục dữ liệu Redis trong danh sách dài của thư mục cha. Lệnh và đầu ra như dưới đây.
ls -l /var/lib | grep redis
Output
drwxr-xr-x 2 redis redis 4096 Aug 6 09:32 redis
Từ output có thể thấy thư mục dữ liệu Redis thuộc sở hữu của người dùng redis, với quyền truy cập phụ được cấp cho nhóm redis. Cài đặt sở hữu này an toàn, nhưng quyền của thư mục (được đặt thành 755) thì không. Để đảm bảo chỉ người dùng Redis có quyền truy cập vào thư mục và nội dung của nó, thay đổi cài đặt quyền thành 770
:
sudo chmod 770 /var/lib/redis
Quyền hạn khác bạn nên thay đổi là của tệp cấu hình Redis. Mặc định, nó có quyền tập tin là 644 và được sở hữu bởi root, với quyền sở hữu phụ bởi nhóm root:
ls -l /etc/redis.conf
Output
-rw-r--r-- 1 root root 30176 Jan 14 2014 /etc/redis.conf
Quyền hạn đó (644) có thể đọc toàn cầu. Điều này tạo ra một vấn đề về bảo mật vì tệp cấu hình chứa mật khẩu chưa được mã hóa bạn đã cấu hình trong Bước 4, điều này có nghĩa là chúng ta cần thay đổi sở hữu và quyền của tệp cấu hình. Lý tưởng là nó sẽ thuộc sở hữu của người dùng redis, với quyền sở hữu phụ bởi nhóm redis. Để làm điều đó, chạy lệnh sau:
sudo chown redis:redis /etc/redis.conf
Sau đó, thay đổi quyền hạn để chỉ người sở hữu tệp có thể đọc và/hoặc ghi:
sudo chmod 600 /etc/redis.conf
Bạn có thể xác minh sở hữu và quyền hạn mới bằng cách sử dụng:
ls -l /etc/redis.conf
Output
total 40
-rw------- 1 redis redis 29716 Sep 22 18:32 /etc/redis.conf
Cuối cùng, khởi động lại Redis:
sudo systemctl restart redis.service
Chúc mừng, cài đặt Redis của bạn nên được bảo mật hơn!
Lưu ý: Sau khi ai đó đã đăng nhập vào máy chủ của bạn, rất dễ dàng để vượt qua các tính năng bảo mật cụ thể của Redis mà chúng tôi đã thiết lập. Đây là lý do tại sao tính năng bảo mật quan trọng nhất được đề cập trong hướng dẫn này là tường lửa, vì nó ngăn người dùng không xác định khỏi đăng nhập vào máy chủ của bạn từ đầu.
Tóm lại, việc install Redis trên CentOS 7 là một quá trình quan trọng mang lại nhiều lợi ích cho hệ thống của bạn. Việc tối ưu hóa hiệu suất, cải thiện khả năng mở rộng và quản lý dữ liệu dễ dàng chỉ là một phần trong những gì Redis mang lại. Với những bước hướng dẫn chi tiết trên, bạn có thể bắt đầu sử dụng Redis một cách hiệu quả trên môi trường CentOS 7 của mình. Đừng ngần ngại khám phá và tận dụng sức mạnh của Redis để nâng cao trải nghiệm và khả năng của hệ thống.
Mọi người cùng tìm kiếm: install redis centos 7, centos install redis, install redis on centos 7, redis centos 7