Thứ năm, 30/04/2020 | 00:00 GMT+7

Cài đặt và bảo mật Redis trên Ubuntu 18.04

Redis là một kho lưu key-value (khóa & giá-trị) trong bộ nhớ , và có tính linh hoạt, hiệu suất cao, hỗ trợ ngôn ngữ rộng rãi. Hướng dẫn này sẽ cài đặt, cấu hình và bảo mật Redis trên server Ubuntu 18.04.

Yêu cầu

Để hoàn thành hướng dẫn này, bạn cần quyền truy cập vào server Ubuntu 18.04 có user không phải root có quyền sudo và firewall cơ bản được cấu hình. Bạn có thể cài đặt điều này theo hướng dẫn Cài đặt Server Ban đầu .

Khi đã sẵn sàng bắt đầu, hãy đăng nhập vào server Ubuntu 18.04 với quyền là user sudo của bạn và tiếp tục.

Bước 1 - Cài đặt và cấu hình Redis

Để có được version Redis mới nhất, ta sẽ sử dụng apt để cài đặt nó từ repository chính thức của Ubuntu.

Cập nhật apt và cài đặt Redis bằng lệnh:

  • sudo apt update
  • sudo apt install redis-server

Thao tác này sẽ download và cài đặt Redis và các phụ thuộc của nó. Sau đây, có một thay đổi cấu hình quan trọng cần thực hiện trong file cấu hình Redis, file này được tạo tự động trong quá trình cài đặt.

Mở file này bằng editor bạn muốn:

  • sudo nano /etc/redis/redis.conf

Bên trong file, tìm chỉ thị được supervised . Chỉ thị này cho phép bạn khai báo một hệ thống init để quản lý Redis như một dịch vụ, cung cấp cho bạn nhiều quyền kiểm soát hơn đối với hoạt động của nó. Chỉ thị được supervised được đặt thành no theo mặc định. Vì bạn đang chạy Ubuntu, sử dụng hệ thống systemd init, hãy thay đổi thành systemd :

/etc/redis/redis.conf
. . .

# If you run Redis from upstart or systemd, Redis can interact with your
# supervision tree. Options:
#   supervised no      - no supervision interaction
#   supervised upstart - signal upstart by putting Redis into SIGSTOP mode
#   supervised systemd - signal systemd by writing READY=1 to $NOTIFY_SOCKET
#   supervised auto    - detect upstart or systemd method based on
#                        UPSTART_JOB or NOTIFY_SOCKET environment variables
# Note: these supervision methods only signal "process is ready."
#       They do not enable continuous liveness pings back to your supervisor.
supervised systemd

. . .

Đó là thay đổi duy nhất bạn cần thực hiện đối với file cấu hình Redis tại thời điểm này, vì vậy hãy lưu file đó khi bạn hoàn tất. Sau đó, khởi động lại dịch vụ Redis để áp dụng thay đổi bạn đã thực hiện đối với file cấu hình:

  • sudo systemctl restart redis.service

Vậy, bạn đã cài đặt và cấu hình Redis và nó đang chạy trên máy của bạn. Tuy nhiên, trước khi bắt đầu sử dụng, trước tiên bạn nên kiểm tra xem Redis có hoạt động chính xác hay không.

Bước 2 - Kiểm tra Redis

Ta sẽ xem xét một số cách để kiểm tra xem Redis có hoạt động chính xác không trong bước này.

Bắt đầu bằng cách kiểm tra xem dịch vụ Redis đang chạy:

  • sudo systemctl status redis

Nếu nó đang chạy mà không có bất kỳ lỗi nào, lệnh này sẽ tạo ra kết quả tương tự như sau:

Output
● redis-server.service - Advanced key-value store
   Loaded: loaded (/lib/systemd/system/redis-server.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2018-06-27 18:48:52 UTC; 12s ago
     Docs: http://redis.io/documentation,
           man:redis-server(1)
  Process: 2421 ExecStop=/bin/kill -s TERM $MAINPID (code=exited, status=0/SUCCESS)
  Process: 2424 ExecStart=/usr/bin/redis-server /etc/redis/redis.conf (code=exited, status=0/SUCCESS)
 Main PID: 2445 (redis-server)
    Tasks: 4 (limit: 4704)
   CGroup: /system.slice/redis-server.service
           └─2445 /usr/bin/redis-server 127.0.0.1:6379
. . .

Tại đây, bạn có thể thấy Redis đang chạy và đã được kích hoạt, nghĩa là nó được cài đặt để khởi động mỗi khi server khởi động.

Lưu ý: Cài đặt này phù hợp với nhiều trường hợp sử dụng phổ biến của Redis. Tuy nhiên, nếu bạn muốn khởi động Redis theo cách thủ công mỗi khi server khởi động, bạn có thể cấu hình điều này bằng lệnh sau:

  • sudo systemctl disable redis

 

Để kiểm tra xem Redis có hoạt động chính xác hay không, hãy kết nối với server bằng dòng lệnh:

  • redis-cli

Trong dấu nhắc sau đó, hãy kiểm tra kết nối bằng lệnh ping :

  • ping
Output
PONG

Kết quả này xác nhận kết nối server vẫn còn tồn tại. Tiếp theo, hãy kiểm tra xem bạn có thể đặt khóa bằng lệnh:

  • set test "It's working!"
Output
OK

Lấy giá trị bằng lệnh:

  • get test

Giả sử mọi thứ đang hoạt động, bạn có thể truy xuất giá trị bạn đã lưu trữ:

Output
"It's working!"

Sau khi xác nhận bạn có thể tìm nạp giá trị, hãy thoát khỏi dấu nhắc Redis để quay lại shell:

  • exit

Bài test cuối cùng, ta sẽ kiểm tra xem Redis có thể duy trì dữ liệu ngay cả khi nó bị dừng hoặc khởi động lại hay không. Để thực hiện việc này, trước tiên hãy khởi động lại Redis:

  • sudo systemctl restart redis

Sau đó, kết nối với client dòng lệnh và xác nhận giá trị thử nghiệm của bạn vẫn còn:

  • redis-cli
  • get test

Giá trị khóa của bạn vẫn có thể truy cập được:

Output
"It's working!"

Thoát ra khỏi shell khi bạn hoàn thành:

  • exit

Cùng với đó, cài đặt Redis của bạn đã sẵn sàng để sử dụng. Tuy nhiên, một số cài đặt cấu hình mặc định của nó không an toàn. Các bước còn lại trong hướng dẫn này bao gồm các phương pháp giảm thiểu các lỗ hổng bảo mật, theo quy định của trang web Redis chính thức . Mặc dù các bước sau là tùy chọn và Redis sẽ vẫn hoạt động nếu bạn chọn không làm theo họ, nhưng bạn nên hoàn thành chúng theo thứ tự để củng cố an ninh của hệ thống.

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 đã cài đặt và cấu hình Redis theo hướng dẫn khác với hướng dẫn này, 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.

Để sửa lỗi này, hãy 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 ::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 systemd áp dụng 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      14222/redis-server  
tcp6       0      0 ::1:6379                :::*                    LISTEN      14222/redis-server  

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 đúng chưa và khởi động lại dịch vụ Redis.

Bây giờ cài đặt Redis của bạn chỉ nghe trên localhost. Tuy nhiên, Redis hiện không có phần cài đặt yêu cầu user xác thực trước khi thực hiện lệnh trên Redis. Để 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

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 client xác thực để truy cập database. Password đượ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 trình chỉnh sửa bạn muốn:

  • sudo nano /etc/redis/redis.conf

Cuộn đến phần SECURITY và tìm chỉ thị 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:

# 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 đặ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. Bằng cách nối kết quả của lệnh đầu tiên với lệnh openssl thứ hai, như được hiển thị ở đây:

  • openssl rand 60 | openssl base64 -A

Kết quả của bạn sẽ giống như sau:

Output
RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE

Copy paste kết quả của lệnh đó làm giá trị mới cho requirepass:

/etc/redis/redis.conf
requirepass RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE

 

Sau khi đặt password, hãy lưu file, sau đó 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ề 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 trả lại:

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 có thể chạy các lệnh trong ứng dụng 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 được chạy bởi user lạ, các lệnh như vậy đượ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 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à một danh sách đầy đủ, 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 .

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ệnhg, 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. 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 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 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

Sau đó, 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 đang 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 lệnh, có một cảnh báo ở cuối phần SECURITY trong /etc/redis/redis.conf có nội dung:

/etc/redis/redis.conf
. . .
# Please note that changing the name of commands that are logged into the
# AOF file or transmitted to replicas may cause problems.
. . .

Lưu ý: Dự án Redis chọn sử dụng các thuật ngữ "master" và "slaver".

[AOF - Append Only File - là dạng file chỉ được thêm vào của Redis]
Đ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 đến các 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 lâu dài 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 chạy AOF trên một version không có cùng cách đổi tên, bạn có thể gặp lỗi 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

Trong hướng dẫn này, bạn đã cài đặt và cấu hình Redis, kiểm tra  Redis hoạt động chính xác và sử dụng các tính năng bảo mật tích hợp của để làm cho an toàn hơn.

Lưu ý khi ai đó đã đăng nhập vào server, rất dễ phá vỡ các tính năng bảo mật dành riêng cho Redis mà ta đã áp dụng. Do đó, tính năng bảo mật quan trọng nhất trên server Redis của bạn là firewall (bạn đã cấu hình firewall nếu bạn làm theo hướng dẫn Cài đặt server ban đầu), vì điều này làm giảm nguy cơ bị xâm nhập trái phép.


Tags:

Các tin trước

Cài đặt Linux Apache MySQL PHP (LAMP) trên Ubuntu 20 04 2020-04-29
Bảo mật apache với let-s-encrypt trên Ubuntu 20.04 2020-04-29
Cài đặt LEMP Linux Nginx MySQL PHP (LEMP ) trên Ubuntu 20 04 2020-04-29
Cài đặt Apache Web Server trên Ubuntu 20.04 2020-04-27
Cài đặt Nginx trên Ubuntu 20.04 2020-04-24
Khởi tạo bảo mật Server Ubuntu 20.04 2020-04-23
Cài đặt SSH Key trên Ubuntu 20.04 2020-04-23
Cài đặt MySQL trên Ubuntu 18.04 2020-04-21
Cài đặt và bảo mật phpMyAdmin trên Ubuntu 18.04 2020-04-21
Cài đặt Webserver Apache trên CentOS 7 2019-05-29