Thứ tư, 05/09/2018 | 00:00 GMT+7

Cách cài đặt và bảo mật Redis trên Debian 9

Redis là một repository key-value trong bộ nhớ được biết đến với tính linh hoạt, hiệu suất và 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 Debian 9.

Yêu cầu

Để hoàn thành hướng dẫn này, bạn cần truy cập vào server Debian 9 có user không phải root có quyền sudo và một 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 của ta .

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

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 Debian chính thức.

Cập nhật cache ẩn gói apt local của bạn 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 Debian, sử dụng hệ thống systemd init, hãy thay đổi nó 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 và đóng nó khi bạn hoàn tất. Sau đó, reload file 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

Sau đó, 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

Như với bất kỳ phần mềm mới được cài đặt nào, bạn nên đảm bảo Redis đang hoạt động như mong đợi trước khi thực hiện bất kỳ thay đổi nào đối với cấu hình của nó. 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-09-05 20:19:44 UTC; 41s ago Docs: http://redis.io/documentation, man:redis-server(1) Process: 10829 ExecStopPost=/bin/run-parts --verbose /etc/redis/redis-server.post-down.d (code=exited, status=0/SUCCESS) Process: 10825 ExecStop=/bin/kill -s TERM $MAINPID (code=exited, status=0/SUCCESS) Process: 10823 ExecStop=/bin/run-parts --verbose /etc/redis/redis-server.pre-down.d (code=exited, status=0/SUCCESS) Process: 10842 ExecStartPost=/bin/run-parts --verbose /etc/redis/redis-server.post-up.d (code=exited, status=0/SUCCESS) Process: 10838 ExecStart=/usr/bin/redis-server /etc/redis/redis.conf (code=exited, status=0/SUCCESS) Process: 10834 ExecStartPre=/bin/run-parts --verbose /etc/redis/redis-server.pre-up.d (code=exited, status=0/SUCCESS) Main PID: 10841 (redis-server) Tasks: 3 (limit: 4915) CGroup: /system.slice/redis-server.service └─10841 /usr/bin/redis-server 127.0.0.1:6379 . . .

Tại đây, bạn có thể thấy rằng 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 của bạn 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 ứng dụ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

Đầu ra 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

Truy xuất 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

Là bài kiểm tra cuối cùng, ta sẽ kiểm tra xem Redis có thể duy trì dữ liệu ngay cả sau 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 version Redis:

  • sudo systemctl restart redis

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

  • redis-cli
  • get test

Giá trị của 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 đã hoạt động hoàn toàn và sẵn sàng để bạn 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 và tạo cơ hội cho các tác nhân độc hại tấn công và giành quyền truy cập vào server của bạn và dữ liệu của 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 này, 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 chức năng nếu bạn chọn không làm theo họ, ta khuyên 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 như ràng buộc với localhost .

Để 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 

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 10959/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 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 :

# 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. Bằng cách nối kết quả của lệnh đầu tiên đến lệnh openssl thứ hai, như được hiển thị ở đây, nó sẽ loại bỏ mọi ngắt dòng do lệnh đầu tiên tạo ra:

  • 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 , 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ề 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 đượ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 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 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ư thể hiện 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

Để 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 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 bộ mô tả thay thế. Để 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

Trong hướng dẫn này, bạn đã cài đặt và cấu hình Redis, xác thực rằng cài đặt Redis của bạn đang 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 nó để làm cho nó ít bị tấn công từ các tác nhân độc hại.

Lưu ý khi ai đó đã đăng nhập vào server của bạn, rất dễ dàng để 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 của bạn (mà bạn đã cấu hình nếu bạn làm theo hướng dẫn Cài đặt server ban đầu tiên quyết), vì điều này khiến các tác nhân độc hại cực kỳ khó có thể nhảy qua hàng rào đó.


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 bảo mật cài đặt Redis của bạ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