Cách bảo mật cài đặt Redis của bạn trên Ubuntu 14.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.Hướng dẫn này chỉ ra cách triển khai bảo mật cơ bản cho server Redis.
Tuy nhiên, hãy nhớ rằng Redis đượ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ó 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.
Hiệu suất và sự đơn giản mà không có bảo mật là một công thức cho thảm họa. Ngay cả một vài tính năng bảo mật mà Redis có cũng thực sự không có gì đáng để chê. Chúng bao gồm: password cơ bản không được mã hóa, đổi tên và tắt lệnh. Nó thiếu một hệ thống kiểm soát truy cập thực sự.
Tuy nhiên, việc cấu hình các tính năng bảo mật hiện có vẫn là một bước tiến lớn so với việc database của bạ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à một vài tính năng bảo mật hệ thống khác sẽ tăng cường vị thế bảo mật của cài đặt Redis độc lập trên Ubuntu 14.04.
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 14.04 với user sudo được thêm vào, từ cài đặt server ban đầu
iptables được cấu hình bằng cách sử dụng hướng dẫn iptables này , thông qua bước Cập nhật server tên (Tùy chọn) (nếu bạn không thực hiện phần cấu hình server tên, APT sẽ không hoạt động). Sau khi cấu hình server định danh, bạn đã hoàn tất
Redis đã cài đặt và hoạt động bằng cách sử dụng hướng dẫn từ cài đặt chỉ dành cho chính từ hướng dẫn Redis này , lên đến Bước 2 - Bước cấu hình Redis Master
Bước 1 - Xác minh Redis đang chạy
Đầu tiên đăng nhập vào server của bạn bằng SSH:
- ssh username@server-ip-address
Để kiểm tra xem Redis có đang hoạt động hay không, hãy sử dụng dòng lệnh Redis. Lệnh redis-cli
được sử dụng để truy cập vào dòng lệnh Redis.
- redis-cli
Nếu bạn đã đặt password cho Redis, bạn phải auth
sau khi kết nối.
- auth your_redis_password
OK
Kiểm tra server database :
- ping
Phản ứng:
PONG
Lối ra:
- quit
Bước 2 - Bảo mật server bằng iptables
Nếu bạn đã tuân theo các yêu cầu cho iptables, vui lòng bỏ qua bước này. Hoặc, bạn có thể làm điều đó ngay bây giờ.
Redis chỉ là một ứng dụng đang chạy trên server của bạn và vì nó không có các tính năng bảo mật thực sự của riêng nó, nên bước đầu tiên để thực sự bảo mật nó là trước tiên phải bảo mật server mà nó đang chạy.
Trong trường hợp server công khai như server Ubuntu 14.04 của bạn, cấu hình firewall như được cung cấp trong hướng dẫn iptables này 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 đã 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, tất cả lưu lượng truy cập đến đều bị loại bỏ trừ khi được 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 lo lắng về lưu lượng đến trên cổng mặc định của nó.
Nếu bạn cần phải đặc biệt cho phép một địa chỉ IP cho Redis, bạn có thể kiểm tra những địa chỉ IP Redis đang lắng nghe trên, và những gì cổng nó được ràng buộc để bởi grep
-ing kết quả của netstat
lệnh. Cột thứ tư - 127.0.0.1:6379 ở đây - cho biết địa chỉ IP và kết hợp cổng được liên kết với Redis:
- sudo netstat -plunt | grep -i redis
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 8562/redis-server 1
Đảm bảo rằng địa chỉ IP này được phép trong policy Tường lửa của bạn. Để biết thêm thông tin về cách thêm luật , vui lòng xem bài viết cơ bản về iptables này .
Bước 3 - Liên kết với localhost
Theo mặc định, server 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ài đặt server Redis, bạn đã 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
Ta sẽ tiếp tục sử dụng file này, vì vậy hãy giữ nó mở ngay bây giờ.
Bước 4 - Cấu hình password Redis
Nếu bạn đã cài đặt Redis bằng cách sử dụng bài viết Cách cấu hình cụm Redis trên Ubuntu 14.04 , bạn nên cấu hình password cho nó. Theo quyết định của bạn, bạn có thể tạo password an toàn hơn ngay bây giờ theo phần này. Nếu không, hướng dẫn trong phần này cho biết cách đặt password server database .
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
, mà bạn vẫn nên mở từ bước trước.
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 xóa #
và thay đổi foobared
thành một giá trị rất mạnh và rất dài.
Thay vì tự tạo password , bạn có thể sử dụng một công cụ như apg
hoặc pwgen
để tạo password . Nếu bạn không muốn cài đặt một ứng dụng chỉ để tạo password , bạn có thể sử dụng một lớp lót bên dưới. Để tạo password khác với password sẽ tạo, hãy thay đổi từ trong dấu ngoặc kép.
- echo "digital-ocean" | sha256sum
Đầu ra của bạn sẽ giống như sau:
960c3dac4fa81b4204779fd16ad7c954f95942876b9c4fb1a255667a9dbe389d
Mặc dù password được tạo sẽ không thể phát âm được, nhưng nó cung cấp cho bạn một password rất mạnh và rất dài, đây chính xác là loại password cần thiết cho Redis. Sau khi copy paste kết quả của lệnh đó làm giá trị mới cho requirepass
, nó sẽ đọc:
requirepass 960c3dac4fa81b4204779fd16ad7c954f95942876b9c4fb1a255667a9dbe389d
Nếu bạn thích một password ngắn hơn, hãy sử dụng kết quả của lệnh bên dưới. , hãy thay đổi từ trong dấu ngoặc kép để nó không tạo ra cùng một password như sau:
- echo "digital-ocean" | sha1sum
Lần này, bạn sẽ nhận được kết quả ngắn hơn một chút:
10d9a99851a411cdae8c3fa09d7290df192441a9
Sau khi đặt password , hãy lưu file và khởi động lại Redis:
- sudo service redis-server restart
Để 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
Kết quả sau đây cho thấy 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ì vậy Redis trả về một lỗi.
(error) NOAUTH Authentication required.
Lệnh thứ hai 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.
OK
Sau đó, chạy lại lệnh trước đó thành công.
- set key1 10
OK
get key1
các truy vấn get key1
Redis cho giá trị của khóa mới.
- get key1
"10"
Lệnh cuối cùng thoát khỏi redis-cli
. Bạn cũng có thể sử dụng exit
:
- quit
Tiếp theo, ta sẽ xem xét đổi tên các lệnh Redis.
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 cho phép bạn đổi tên hoặc vô hiệu hóa 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 cho là nguy hiểm bao gồm: FLUSHDB , FLUSHALL , KEYS , PEXPIRE , DEL , CONFIG , SHUTDOWN , BGREWRITEAOF , BGSAVE , SAVE , SPOP , SREM , RENAME và DEBUG . Đó không phải là một 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.
Việc bạn tắt hay đổ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, thì bạn có thể vô hiệu hóa nó. Nếu không, hãy đổi tên nó.
Để bật hoặc tắt các lệnh Redis, hãy mở file cấu hình để chỉnh sửa :
- sudo nano /etc/redis/redis.conf
Đây là những ví dụ. Bạn 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ể kiểm tra 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 .
Để tắt hoặc hủy một lệnh, chỉ cần đổi tên nó thành một chuỗi trố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 ""
Và để đổi tên một lệnh, hãy đặt tên khác cho nó, 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. Đừng tự làm khó cuộc sống của bạn .
rename-command CONFIG "" rename-command SHUTDOWN SHUTDOWN_MENOT rename-command CONFIG ASC12_CONFIG
Lưu các thay đổi .
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 service redis-server restart
Để kiểm tra lệnh mới, hãy nhập dòng lệnh Redis:
- redis-cli
Sau đó, giả sử rằng bạn đã đổi tên lệnh CONFIG thành ASC12_CONFIG , kết quả kết quả sau đây cho thấy cách kiểm tra xem lệnh mới đã được áp dụng hay chưa.
Sau khi xác thực:
- auth your_redis_password
OK
Lần thử đầu tiên sử dụng lệnh config
sẽ không thành công vì nó đã được đổi tên.
- config get requirepass
(error) ERR unknown command 'config'
Việc gọi lệnh được đổi tên sẽ thành công (không phân biệt chữ hoa chữ thường):
- asc12_config get requirepass
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:
NOAUTH Authentication required.
Về việc đổ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.
Đ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 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 ).
Vì vậy, 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 trường hợp trong cài đặt master-slave.
Bước 6 - Đặt quyền sở hữu folder dữ liệu và quyền file
Trong bước này, ta sẽ xem xét một số thay đổi về quyền sở hữu và quyền mà bạn có thể thực hiện để cải thiện profile bảo mật của cài đặt Redis của bạn. Điều này liên quan đến việc đảm bảo chỉ user cần truy cập Redis mới có quyền đọc dữ liệu của nó. User đó, theo mặc định, là user redis .
Bạn có thể xác minh điều này bằng cách grep
-ing cho folder dữ liệu Redis trong một danh sách dài folder mẹ của nó. Lệnh và kết quả của nó được đưa ra bên dưới.
- ls -l /var/lib | grep redis
drwxr-xr-x 2 redis redis 4096 Aug 6 09:32 redis
Bạn có thể thấy rằng folder dữ liệu Redis thuộc sở hữu của user redis , với quyền truy cập thứ cấp được cấp cho group redis . Phần đó là tốt.
Phần không phải là quyền của folder , là 755. Để đảm bảo chỉ user Redis mới có quyền truy cập vào folder và nội dung của nó, hãy thay đổi quyền thành 700:
- sudo chmod 700 /var/lib/redis
Quyền khác mà bạn nên thay đổi là quyền của file cấu hình Redis. Theo mặc định, nó có quyền đối với file là 644 và được sở hữu bởi root , với quyền sở hữu thứ cấp của group root :
- ls -l /etc/redis/redis.conf
-rw-r--r-- 1 root root 30176 Jan 14 2014 /etc/redis/redis.conf
Quyền đó (644) có thể đọc được trên toàn thế giới, điều này không phải là một ý kiến hay, vì nó chứa password chưa được mã hóa được cấu hình ở Bước 4.
Ta cần thay đổi quyền sở hữu và quyền. Tốt nhất, nó nên được sở hữu bởi user redis , với quyền sở hữu thứ cấp của user root . Để làm điều đó, hãy chạy lệnh sau:
- sudo chown redis:root /etc/redis/redis.conf
Sau đó, thay đổi quyền sở hữu để chỉ chủ sở hữu của file có thể đọc và / hoặc ghi vào file đó:
- sudo chmod 600 /etc/redis/redis.conf
Bạn có thể xác minh quyền sở hữu và quyền mới bằng cách sử dụng:
- ls -l /etc/redis/redis.conf
total 40 -rw------- 1 redis root 29716 Sep 22 18:32 /etc/redis/redis.conf
Cuối cùng, khởi động lại Redis:
- sudo service redis-server restart
Kết luận
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. Vì vậy, tính năng bảo mật quan trọng nhất là một tính năng khiến việc nhảy hàng rào đó trở nên cực kỳ khó khăn.
Đó phải là firewall của bạn.
Để đưa bảo mật server của bạn lên cấp độ tiếp theo, bạn có thể cấu hình hệ thống phát hiện xâm nhập như OSSEC. Để cấu hình OSSEC trên Ubuntu 14.04, hãy xem hướng dẫn OSSEC này .
Nếu bạn đang cố gắng bảo mật thông tin liên lạc của Redis qua một mạng không tin cậy , bạn sẽ phải sử dụng proxy SSL, như các nhà phát triển Redis khuyến cáo trong hướng dẫn bảo mật chính thức của Redis . Cài đặt proxy SSL để bảo mật thông tin liên lạc của Redis là một chủ đề riêng biệt.
Ta đã không đưa vào danh sách đầy đủ các lệnh Redis trong phần đổi tên. Tuy nhiên, bạn có thể tự mình kiểm tra điều này và xác định cách chúng có thể bị sử dụng sai tại redis.io/commands .
Các tin liên quan
Cách backup và khôi phục dữ liệu Redis của bạn trên Ubuntu 14.042015-09-14
Cách thiết lập server Redis làm Trình xử lý phiên cho PHP trên Ubuntu 14.04
2015-08-21
Cách cấu hình một cụm Redis trên CentOS 7
2015-07-30
Cách cấu hình cụm Redis trên Ubuntu 14.04
2015-07-16
Cách cấu hình bộ đệm Redis để tăng tốc WordPress trên Ubuntu 14.04
2014-12-15
Cách cấu hình giám sát Sensu, RabbitMQ và Redis trên Ubuntu 14.04
2014-09-29