Cách bảo mật cài đặt Redis của bạn trên Ubuntu 18.04
Redis là bộ nhớ đệm trong bộ nhớ, NoSQL, bộ nhớ đệm và lưu trữ key-value cũng có thể được lưu giữ trên đĩa. Nó được thiết kế để sử dụng bởi các khách hàng tin cậy trong một môi trường tin cậy , không có các tính năng bảo mật mạnh mẽ của riêng nó. Để nhấn mạnh điểm đó, đây là trích dẫn từ trang web chính thức của Redis :Redis được thiết kế để khách hàng tin cậy có thể truy cập bên trong môi trường tin cậy . Điều này nghĩa là thông thường không phải là ý kiến hay nếu để version Redis trực tiếp lên internet hoặc nói chung là trong một môi trường nơi các client không tin cậy có thể truy cập trực tiếp vào cổng Redis TCP hoặc socket UNIX.
…
Nói chung, Redis không được tối ưu hóa để bảo mật tối đa nhưng cho hiệu suất tối đa và sự đơn giản.
Mặc dù vậy, Redis có một vài tính năng bảo mật cơ bản được tích hợp sẵn. Chúng bao gồm khả năng tạo password không được mã hóa và quyền tự do đổi tên và tắt các lệnh. Đáng chú ý, nó thiếu một hệ thống kiểm soát truy cập thực sự.
Các tính năng này tự nó không thể đảm bảo an toàn cho Cài đặt Redis của bạn. Tuy nhiên, cấu hình chúng vẫn là một bước tiến lớn so với việc database của bạn hoàn toàn không được bảo mật.
Trong hướng dẫn này, bạn sẽ đọc cách cấu hình một vài tính năng bảo mật mà Redis có và thực hiện một số thay đổi đối với cấu hình hệ thống của bạn, điều này sẽ tăng cường vị thế bảo mật của cài đặt Redis độc lập trên server Ubuntu.
Lưu ý hướng dẫn này không giải quyết các tình huống trong đó server Redis và các ứng dụng client nằm trên các server khác nhau hoặc trong các trung tâm dữ liệu khác nhau. Các cài đặt trong đó lưu lượng Redis phải đi qua một mạng không an toàn hoặc không tin cậy yêu cầu một bộ cấu hình hoàn toàn khác, chẳng hạn như cài đặt proxy SSL hoặc VPN giữa các máy Redis, ngoài những cấu hình được cung cấp ở đây.
Yêu cầu
Đối với hướng dẫn này, bạn cần :
Server Ubuntu 18.04. Server này cũng phải có user không phải root có quyền
sudo
cũng như firewall được cài đặt với UFW, bạn có thể cấu hình theo Hướng dẫn cài đặt server ban đầu cho Ubuntu 18.04 của ta .Red được cài đặt và cấu hình trên server của bạn. Bạn có thể cài đặt điều này theo hướng dẫn này cho server Ubuntu 18.04 .
Bước 1 - Xác minh Redis đang chạy
Đầu tiên, SSH vào server của bạn với user không phải root của bạn.
Để kiểm tra xem Redis có hoạt động không, hãy mở dòng lệnh Redis bằng lệnh redis-cli
:
- redis-cli
Lưu ý : Nếu bạn đã đặt password cho Redis, bạn phải xác thực bằng lệnh auth
sau khi kết nối:
- auth your_redis_password
OutputOK
Nếu bạn chưa đặt password cho Redis, bạn có thể đọc cách thực hiện trong Bước 4 của hướng dẫn này.
Kiểm tra kết nối bằng lệnh ping
:
- ping
Nếu Redis hoạt động bình thường, bạn sẽ thấy như sau:
OutputPONG
Sau đó, thoát khỏi dòng lệnh Redis:
- quit
Đến đây bạn đã xác nhận Redis đang chạy và hoạt động bình thường, bạn có thể chuyển sang bước quan trọng nhất để tăng cường bảo mật cho server của bạn : cấu hình firewall .
Bước 2 - Bảo mật server bằng UFW
Redis chỉ là một ứng dụng đang chạy trên server của bạn. Bởi vì nó chỉ có một số tính năng bảo mật cơ bản của riêng nó, nên bước đầu tiên để thực sự bảo mật nó là bảo vệ server mà nó đang chạy. Trong trường hợp server công khai như server Ubuntu 18.04 của bạn, cấu hình firewall như được mô tả trong Hướng dẫn cài đặt server ban đầu cho Ubuntu 18.04 là bước đầu tiên. Theo liên kết đó và cài đặt firewall của bạn ngay bây giờ nếu bạn chưa làm như vậy.
Nếu bạn không chắc mình đã cài đặt firewall hay chưa, bạn có thể kiểm tra bằng cách chạy như sau:
- sudo ufw status
Nếu bạn đã làm theo Hướng dẫn Cài đặt Server Ban đầu cho Ubuntu 18.04, bạn sẽ thấy kết quả sau:
OutputStatus: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6)
Nếu bạn đã triển khai các luật firewall bằng cách sử dụng hướng dẫn đó, thì bạn không cần phải thêm luật bổ sung cho Redis vì theo mặc định, UFW loại bỏ tất cả lưu lượng đến trừ khi nó được cho phép rõ ràng. Vì cài đặt độc lập mặc định của server Redis chỉ lắng nghe trên giao diện loopback ( 127.0.0.1
hoặc localhost ), nên không cần quan tâm đến lưu lượng đến trên cổng mặc định của nó.
Để biết thêm thông tin về cách thêm luật , vui lòng xem hướng dẫn này về các luật và lệnh phổ biến của UFW .
Bước 3 - Liên kết với localhost
Theo mặc định, Redis chỉ có thể truy cập được từ localhost . Tuy nhiên, nếu bạn đã làm theo hướng dẫn cấu hình Redis khác với hướng dẫn được đưa ra trong phần yêu cầu , bạn có thể đã cập nhật file cấu hình để cho phép kết nối từ mọi nơi. Điều này không an toàn như ràng buộc với localhost .
Mở file cấu hình Redis để chỉnh sửa:
- sudo nano /etc/redis/redis.conf
Xác định vị trí dòng này và đảm bảo nó không có chú thích (xóa #
nếu nó tồn tại):
bind 127.0.0.1
Lưu file khi hoàn tất (nhấn CTRL + X
, Y
, sau đó ENTER
).
Sau đó, khởi động lại dịch vụ đảm bảo rằng systemd đọc các thay đổi :
- sudo systemctl restart redis
Để kiểm tra xem thay đổi này đã có hiệu lực chưa, hãy chạy netstat
sau:
- sudo netstat -lnp | grep redis
Outputtcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 2855/redis-server 1
Kết quả này cho thấy rằng chương trình redis-server
được liên kết với localhost ( 127.0.0.1
), phản ánh thay đổi bạn vừa thực hiện đối với file cấu hình. Nếu bạn thấy một địa chỉ IP khác trong cột đó (ví dụ: 0.0.0.0
), thì bạn nên kiểm tra lại xem bạn đã bỏ comment chính xác chưa và khởi động lại dịch vụ Redis.
Bây giờ cài đặt Redis của bạn chỉ đang nghe trên localhost , sẽ khó khăn hơn cho các tác nhân độc hại đưa ra yêu cầu hoặc giành quyền truy cập vào server của bạn. Tuy nhiên, Redis hiện không được cài đặt để yêu cầu user xác thực bản thân trước khi áp dụng các thay đổi đối với cấu hình của nó hoặc dữ liệu mà nó nắm giữ. Để khắc phục điều này, Redis cho phép bạn yêu cầu user xác thực bằng password trước khi thực hiện thay đổi thông qua ứng dụng client Redis ( redis-cli
).
Bước 4 - Cấu hình password Redis
Việc cấu hình password Redis cho phép một trong hai tính năng bảo mật tích hợp của nó - lệnh auth
, yêu cầu khách hàng xác thực để truy cập database . Mật khẩu được cấu hình trực tiếp trong file cấu hình của Redis, /etc/redis/redis.conf
, vì vậy hãy mở lại file đó bằng editor bạn muốn :
- sudo nano /etc/redis/redis.conf
Cuộn đến phần SECURITY
và tìm chỉ thị được comment có nội dung:
# requirepass foobared
Bỏ ghi chú nó bằng cách loại bỏ các #
, và thay đổi foobared
đến một password an toàn.
Lưu ý: Phía trên requirepass
chỉ trong redis.conf
file , có một cảnh báo comment :
# Warning: since Redis is pretty fast an outside user can try up to # 150k passwords per second against a good box. This means that you should # use a very strong password otherwise it will be very easy to break. #
Vì vậy, điều quan trọng là bạn phải chỉ định một giá trị rất mạnh và rất dài làm password của bạn . Thay vì tự tạo password , bạn có thể sử dụng lệnh openssl
để tạo một password ngẫu nhiên, như trong ví dụ sau. Đường ống dẫn đến lệnh openssl
thứ hai sẽ loại bỏ bất kỳ dấu ngắt dòng nào được xuất ra bởi lệnh đầu tiên:
- openssl rand 60 | openssl base64 -A
Đầu ra của bạn sẽ giống như sau:
OutputRBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE
Sau khi copy paste kết quả của lệnh đó làm giá trị mới cho requirepass
, nó sẽ đọc:
/etc/redis/redis.confrequirepass RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE
Sau khi đặt password , hãy lưu file và khởi động lại Redis:
- sudo systemctl restart redis.service
Để kiểm tra xem password có hoạt động hay không, hãy truy cập vào dòng lệnh Redis:
- redis-cli
Sau đây là một chuỗi các lệnh được sử dụng để kiểm tra xem password Redis có hoạt động hay không. Lệnh đầu tiên cố gắng đặt khóa thành một giá trị trước khi xác thực:
- set key1 10
Điều đó sẽ không hoạt động vì bạn không xác thực, vì vậy Redis trả về một lỗi:
Output(error) NOAUTH Authentication required.
Lệnh tiếp theo xác thực bằng password được chỉ định trong file cấu hình Redis:
- auth your_redis_password
Redis thừa nhận:
OutputOK
Sau đó, chạy lại lệnh trước đó sẽ thành công:
- set key1 10
OutputOK
get key1
các truy vấn get key1
Redis cho giá trị của khóa mới.
- get key1
Output"10"
Sau khi xác nhận bạn có thể chạy các lệnh trong client Redis sau khi xác thực, bạn có thể thoát khỏi redis-cli
:
- quit
Tiếp theo, ta sẽ xem xét việc đổi tên các lệnh Redis, nếu nhập nhầm hoặc bởi một tác nhân độc hại, có thể gây ra thiệt hại nghiêm trọng cho máy của bạn.
Bước 5 - Đổ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 trong Redis liên quan đến việc đổi tên hoặc tắt hoàn toàn một số lệnh được coi là nguy hiểm.
Khi chạy do nhầm lẫn hoặc bởi user lạ , các lệnh đó được dùng để cấu hình lại, phá hủy hoặc xóa sạch dữ liệu . Giống như password xác thực, các lệnh đổi tên hoặc tắt được cấu hình trong cùng một phần SECURITY
của file /etc/redis/redis.conf
.
Một số lệnh được coi là nguy hiểm bao gồm: FLUSHDB , FLUSHALL , KEYS , PEXPIRE , DEL , CONFIG , SHUTDOWN , BGREWRITEAOF , BGSAVE , SAVE , SPOP , SREM , RENAME và DEBUG . Đây không phải là danh sách toàn diện, nhưng đổi tên hoặc tắt tất cả các lệnh trong danh sách đó là một điểm khởi đầu tốt để tăng cường bảo mật cho server Redis của bạn.
Việc bạn nên tắt hay đổi tên lệnh tùy thuộc vào nhu cầu cụ thể của bạn hoặc nhu cầu của 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, thì bạn có thể vô hiệu hóa nó. Nếu không, bạn nên đổi tên nó.
Để bật hoặc tắt các lệnh Redis, hãy mở file cấu hình :
- sudo nano /etc/redis/redis.conf
Cảnh báo: Các bước sau đây chỉ ra cách tắt và đổi tên lệnh là ví dụ. Bạn chỉ nên chọn tắt hoặc đổi tên các lệnh phù hợp với bạn. Bạn có thể xem lại danh sách đầy đủ các lệnh cho chính mình và xác định cách chúng có thể bị sử dụng sai tại redis.io/commands .
Để vô hiệu hóa một lệnh, chỉ cần đổi tên nó thành một chuỗi trống (được biểu thị bằng một cặp dấu ngoặc kép không có ký tự nào khác giữa chúng), như được hiển thị bên dưới:
. . . # It is also possible to completely kill a command by renaming it into # an empty string: # rename-command FLUSHDB "" rename-command FLUSHALL "" rename-command DEBUG "" . . .
Để đổi tên một lệnh, hãy đặt cho nó một tên khác như trong các ví dụ bên dưới. Các lệnh được đổi tên sẽ khó đoán đối với người khác, nhưng dễ nhớ đối với bạn:
. . . rename-command CONFIG "" rename-command SHUTDOWN SHUTDOWN_MENOT rename-command CONFIG ASC12_CONFIG . . .
Lưu các thay đổi và đóng file.
Sau khi đổi tên một lệnh, hãy á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, hãy nhập dòng lệnh Redis:
- redis-cli
Tiếp theo, xác thực:
- auth your_redis_password
OutputOK
Giả sử rằng bạn đã đổi tên lệnh CONFIG
thành ASC12_CONFIG
, như trong ví dụ trước. Đầu tiên, hãy thử sử dụng lệnh CONFIG
ban đầu. Nó sẽ không thành công, vì bạn đã đổi tên nó:
- config get requirepass
Output(error) ERR unknown command 'config'
Tuy nhiên, gọi lệnh đã đổi tên sẽ thành công. Nó không phân biệt chữ hoa chữ thường:
- asc12_config get requirepass
Output1) "requirepass" 2) "your_redis_password"
Cuối cùng, bạn có thể thoát khỏi redis-cli
:
- exit
Lưu ý nếu bạn đã sử dụng dòng lệnh Redis và sau đó khởi động lại Redis, bạn cần phải xác thực lại. Nếu không, bạn sẽ gặp lỗi này nếu nhập lệnh:
OutputNOAUTH Authentication required.
Về cách đổi tên các lệnh, có một cảnh báo ở cuối phần SECURITY
trong /etc/redis/redis.conf
có nội dung:
Please note that changing the name of commands that are logged into the AOF file or transmitted to slaves may cause problems.
Lưu ý: Dự án Redis chọn sử dụng các thuật ngữ “chính” và “ slaver ”, trong khi DigitalOcean nói chung thích các lựa chọn thay thế “chính” và “phụ”. Để tránh nhầm lẫn, ta đã chọn sử dụng các điều khoản được sử dụng trong tài liệu Redis tại đây.
Điều đó nghĩa là nếu lệnh được đổi tên không có trong file AOF hoặc nếu có nhưng file AOF chưa được truyền tới slaver , thì sẽ không có vấn đề gì.
Vì vậy, hãy ghi nhớ điều đó khi bạn đang cố gắng đổi tên các lệnh. Thời điểm tốt nhất để đổi tên lệnh là khi bạn không sử dụng AOF liên tục hoặc ngay sau khi cài đặt, tức là trước khi ứng dụng sử dụng Redis của bạn được triển khai.
Khi bạn đang sử dụng AOF và xử lý cài đặt master-slave, hãy xem xét câu trả lời này từ trang vấn đề GitHub của dự án . Sau đây là phần trả lời câu hỏi của tác giả:
Các lệnh được ghi vào AOF và được sao chép tới slaver giống như cách chúng được gửi, vì vậy nếu bạn cố gắng phát lại AOF trên một version không có cùng cách đổi tên, bạn có thể gặp phải sự mâu thuẫn vì không thể thực hiện lệnh ( tương tự đối với slaver ).
Do đó, cách tốt nhất để xử lý việc đổi tên trong những trường hợp như vậy là đảm bảo các lệnh đã đổi tên được áp dụng cho tất cả các version trong cài đặt master-slave.
Kết luận
Lưu ý một khi ai đó đã đăng nhập vào server của bạn, bạn rất dễ phá vỡ các tính năng bảo mật dành riêng cho Redis mà ta đã đưa ra. Do đó, tính năng bảo mật quan trọng nhất là firewall của bạn, điều này khiến các tác nhân độc hại rất khó có thể nhảy qua hàng rào đó.
Nếu bạn đang cố gắng bảo mật thông tin liên lạc của Redis trên một mạng không tin cậy , bạn sẽ phải sử dụng proxy SSL, theo khuyến nghị của các nhà phát triển Redis trong hướng dẫn bảo mật chính thức của Redis .
Các tin liên quan
Cách cài đặt Redis từ nguồn trên Ubuntu 18.042018-06-27
Cách thiết lập server Redis làm trình xử lý phiên cho PHP trên Ubuntu 16.04
2016-11-14
Cách cấu hình Redis Replication trên Ubuntu 16.04
2016-11-11
Cách mã hóa lưu lượng truy cập vào Redis với Spiped trên Ubuntu 16.04
2016-11-09
Cách mã hóa lưu lượng truy cập vào Redis với Stunnel trên Ubuntu 16.04
2016-11-08
Cách mã hóa lưu lượng truy cập vào Redis với PeerVPN trên Ubuntu 16.04
2016-11-08
Cách cài đặt và cấu hình Redis trên Ubuntu 16.04
2016-05-11
Cách di chuyển dữ liệu Redis với Master-Slave Replication trên Ubuntu 14.04
2016-05-05
Cách tìm log Redis trên Ubuntu
2016-03-01
Cách bảo mật cài đặt Redis của bạn trên Ubuntu 14.04
2015-09-25