Thứ tư, 27/06/2018 | 00:00 GMT+7

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 :

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
Output
OK

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:

Output
PONG

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:

Output
Status: 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):

/etc/redis/redis.conf
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
Output
tcp 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:

/etc/redis/redis.conf
# 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 :

/etc/redis/redis.conf
# 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:

Output
RBOJ9cCNoGCKhlEBwQLHri1g+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.conf
requirepass 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:

Output
OK

Sau đó, chạy lại lệnh trước đó sẽ thành công:

  • set key1 10
Output
OK

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 , RENAMEDEBUG . Đâ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:

/etc/redis/redis.conf
. . . # 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:

/etc/redis/redis.conf
. . . 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
Output
OK

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
Output
1) "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:

Output
NOAUTH 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 .


Tags:

Các tin liên quan

Cách cài đặt Redis từ nguồn trên Ubuntu 18.04
2018-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