Đến năm 2025, thế giới sẽ lưu trữ khoảng 200 zettabyte dữ liệu. Dữ liệu đó sẽ được lưu trữ trong công cộng, riêng tư, tại chỗ hoặc lưu trữ đám mây, PC, máy tính xách tay, điện thoại thông minh và cả các thiết bị Internet-of-Things (IoT). Theo dự báo, số lượng thiết bị được kết nối internet cũng được dự đoán sẽ tăng lên gần 75 tỷ thiết bị vào năm 2025. Đối với một số người trong chúng ta hoặc những người có nền tảng CNTT ít hơn, những con số đó không là gì cả. Nhưng đối với những người đam mê bảo mật, điều này thật đáng lo ngại vì ngày càng có nhiều dữ liệu gặp rủi ro.
Trong thế giới công nghệ và cơ sở dữ liệu mã nguồn mở, bảo mật là một trong những chủ đề quan trọng. Thỉnh thoảng sẽ có rất nhiều phát minh và phát triển mới liên quan đến bảo mật. Một trong số đó là Security-Enhanced Linux hay gọi tắt là (SELinux), được phát triển gần 21 năm trước bởi Cơ quan An ninh Quốc gia Hoa Kỳ (NSA). Mặc dù điều này đã được giới thiệu cách đây nhiều năm, nhưng nó đã phát triển nhanh chóng và được sử dụng rộng rãi như một trong những biện pháp bảo mật cho hệ thống Linux. Mặc dù khá không dễ dàng để tìm thông tin về cách định cấu hình nó với cơ sở dữ liệu, nhưng MongoDB đã tận dụng điều này. Trong bài đăng trên blog này, chúng ta sẽ giới thiệu về SELinux và cách định cấu hình nó trong các bộ bản sao MongoDB.
Với mục đích này, chúng tôi sẽ sử dụng 3 máy ảo CentOS 8 cho môi trường thử nghiệm của mình và sử dụng MongoDB 4.4. Trước khi bắt đầu, hãy tìm hiểu sâu hơn một chút về SELinux.
Chế độ cưỡng chế, cho phép và vô hiệu hóa
Đây là ba chế độ mà SELinux có thể chạy bất kỳ lúc nào. Tất nhiên, tất cả chúng đều có chức năng và mục đích riêng về chính sách bảo mật. Chúng ta sẽ đi qua từng cái một.
Khi ở chế độ thực thi, mọi chính sách đã định cấu hình sẽ được thực thi trên hệ thống và mọi nỗ lực truy cập trái phép của cả người dùng hoặc quy trình đều bị SELinux từ chối. Không chỉ vậy, những hành động bị từ chối truy cập đó cũng sẽ được ghi lại trong các tệp nhật ký liên quan. Mặc dù đây là chế độ được khuyến nghị nhất, nhưng hầu hết các hệ thống Linux hiện nay không được quản trị viên hệ thống bật chế độ này do nhiều lý do khác nhau như sự phức tạp của bản thân SELinux.
Đối với chế độ cho phép, chúng ta có thể nói một cách an toàn rằng SELinux đang ở trạng thái nửa bật. Trong chế độ này, SELinux sẽ không áp dụng chính sách nào, đồng thời sẽ không có quyền truy cập nào bị từ chối. Mặc dù vậy, bất kỳ vi phạm chính sách nào vẫn được ghi lại và ghi vào nhật ký kiểm toán. Thông thường, chế độ này được sử dụng để kiểm tra SELinux trước khi hoàn thiện và tiến hành thực thi nó.
Đối với chế độ cuối cùng bị tắt, không có bảo mật nâng cao nào đang chạy trên hệ thống. Bạn có biết hệ thống của bạn đang chạy chế độ SELinux nào không? Chỉ cần chạy lệnh sau để xem:
$ sestatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: enforcing
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Memory protection checking: actual (secure)
Max kernel policy version: 33
Đối với các hệ thống thử nghiệm của chúng tôi, SELinux đã được kích hoạt và định cấu hình để thực thi để chúng tôi có thể tiếp tục với phần còn lại của hướng dẫn. Trong trường hợp SELinux bị vô hiệu hóa hoặc cho phép trong hệ thống của bạn, bạn có thể làm theo các bước bên dưới để bật nó và thay đổi để thực thi.
-
Chỉnh sửa / etc / selinux / config tệp để thay đổi lệnh thành thực thi
vi /etc/sysconfig/selinux
...
SELINUX=enforcing
…
Bạn cần đảm bảo rằng lệnh trên được đặt thành thực thi.
-
Khởi động lại hệ thống để áp dụng cài đặt
$ khởi động lại
Sau khi hệ thống trực tuyến, chúng tôi cần xác nhận rằng SELinux đã được định cấu hình chính xác và thay đổi đã diễn ra. Chạy lệnh sau để kiểm tra, đây là một cách khác để kiểm tra nó ngoài lệnh đầu tiên mà tôi đã đề cập trước đó (sestatus).
$ getenforce
Thực thi
Khi chúng ta nhìn thấy từ "Enforcing", bây giờ chúng ta có thể xác nhận rằng điều này là tốt để thực hiện. Vì chúng ta sẽ sử dụng một tập hợp bản sao, chúng ta cần đảm bảo rằng SELinux đã được định cấu hình trên tất cả các nút MongoDB. Tôi tin rằng đây là phần quan trọng nhất mà chúng ta nên đề cập trước khi tiến hành định cấu hình SELinux cho MongoDB.
Cài đặt “ulimit” được đề xuất
Trong ví dụ này, chúng tôi giả định rằng MongoDB 4.4 đã được cài đặt trên 3 nút. Việc cài đặt rất đơn giản và dễ dàng, để tiết kiệm thời gian của chúng tôi, chúng tôi sẽ không chỉ cho bạn các bước mà đây là liên kết đến tài liệu.
Trong một số trường hợp, "ulimit" của hệ thống sẽ gây ra một số vấn đề nếu các giới hạn có giá trị mặc định thấp. Để đảm bảo MongoDB chạy chính xác, chúng tôi thực sự khuyên bạn nên đặt "ulimit" theo khuyến nghị của MongoDB tại đây. Mặc dù mọi triển khai đều có thể có các yêu cầu hoặc cài đặt riêng, nhưng tốt nhất bạn nên tuân theo cài đặt “ulimit” sau:
-f (file size): unlimited
-t (cpu time): unlimited
-v (virtual memory): unlimited
-l (locked-in-memory size): unlimited
-n (open files): 64000
-m (memory size): unlimited
-u (processes/threads): 64000
Để thay đổi giá trị “ulimit”, chỉ cần sử dụng lệnh sau, chẳng hạn như thay đổi giá trị cho “-n” (tệp đang mở):
$ ulimit -n 64000
Sau khi tất cả các giới hạn được thay đổi, phiên bản mongod phải được khởi động lại để đảm bảo các thay đổi giới hạn mới diễn ra:
$ sudo systemctl restart mongod
Định cấu hình SELinux
Theo tài liệu MongoDB, Chính sách SELinux hiện tại không cho phép quy trình MongoDB truy cập / sys / fs / cgroup, quy trình này được yêu cầu để xác định bộ nhớ khả dụng trên hệ thống của bạn. Vì vậy, đối với trường hợp của chúng tôi, trong đó SELinux đang ở chế độ thực thi, điều chỉnh sau đây phải được thực hiện.
Cho phép Truy cập vào cgroup
Bước đầu tiên là đảm bảo rằng hệ thống của chúng tôi đã cài đặt gói “checkpolicy”:
$ sudo yum install checkpolicy
yum install checkpolicy
Last metadata expiration check: 2:13:40 ago on Fri 11 Jun 2021 05:32:10 AM UTC.
Package checkpolicy-2.9-1.el8.x86_64 is already installed.
Dependencies resolved.
Nothing to do.
Complete!
Tiếp theo, chúng tôi cần tạo tệp chính sách tùy chỉnh cho “mongodb_cgroup_memory.te”:
cat > mongodb_cgroup_memory.te <<EOF
module mongodb_cgroup_memory 1.0;
require {
type cgroup_t;
type mongod_t;
class dir search;
class file { getattr open read };
}
#============= mongod_t ==============
allow mongod_t cgroup_t:dir search;
allow mongod_t cgroup_t:file { getattr open read };
EOF
Sau khi tệp chính sách được tạo, các bước cuối cùng là biên dịch và tải mô-đun chính sách tùy chỉnh bằng cách chạy ba lệnh sau:
$ checkmodule -M -m -o mongodb_cgroup_memory.mod mongodb_cgroup_memory.te
$ semodule_package -o mongodb_cgroup_memory.pp -m mongodb_cgroup_memory.mod
$ sudo semodule -i mongodb_cgroup_memory.pp
Lệnh cuối cùng sẽ mất một lúc và sau khi hoàn tất, quy trình MongoDB sẽ có thể truy cập đúng tệp với chế độ thực thi SELinux.
Cho phép Truy cập vào netstat cho FTDC
/ proc / net / netstat là bắt buộc để Thu thập Dữ liệu Chẩn đoán Toàn thời gian (FTDC). FTDC trong ngắn hạn là một cơ chế để tạo điều kiện phân tích máy chủ MongoDB. Các tệp dữ liệu trong FTDC được nén, con người không thể đọc được và kế thừa quyền truy cập tệp giống như các tệp dữ liệu MongoDB. Do đó, chỉ những người dùng có quyền truy cập vào tệp dữ liệu FTDC mới có thể truyền dữ liệu.
Các bước để cấu hình nó gần như giống với bước trước. Chỉ là chính sách tùy chỉnh là khác nhau.
$ sudo yum install checkpolicy
Create a custom policy file “mongodb_proc_net.te”:
cat > mongodb_proc_net.te <<EOF
module mongodb_proc_net 1.0;
require {
type proc_net_t;
type mongod_t;
class file { open read };
}
#============= mongod_t ==============
allow mongod_t proc_net_t:file { open read };
EOF
Các bước cuối cùng là biên dịch và tải chính sách tùy chỉnh:
$ checkmodule -M -m -o mongodb_proc_net.mod mongodb_proc_net.te
$ semodule_package -o mongodb_proc_net.pp -m mongodb_proc_net.mod
$ sudo semodule -i mongodb_proc_net.pp
Đường dẫn thư mục MongoDB tùy chỉnh
Một điều quan trọng cần lưu ý là nếu bạn đã cài đặt MongoDB trong thư mục tùy chỉnh, bạn cũng cần phải tùy chỉnh chính sách SELinux. Các bước này hơi khác so với bước trước nhưng không quá phức tạp.
Trước tiên, chúng ta cần cập nhật chính sách SELinux để cho phép dịch vụ mongod sử dụng thư mục mới, cần lưu ý rằng chúng ta cần đảm bảo bao gồm. * ở cuối thư mục:
$ sudo semanage fcontext -a -t <type> </some/MongoDB/directory.*>
-
mongod_var_lib_t cho thư mục dữ liệu
-
mongod_log_t cho thư mục tệp nhật ký
-
mongod_var_run_t cho thư mục tệp pid
Sau đó, cập nhật chính sách người dùng SELinux cho thư mục mới:
$ sudo chcon -Rv -u system_u -t <type> </some/MongoDB/directory>
-
mongod_var_lib_t cho thư mục dữ liệu
-
mongod_log_t cho thư mục nhật ký
-
mongod_var_run_t cho thư mục tệp pid
Bước cuối cùng là áp dụng các chính sách SELinux đã cập nhật cho thư mục:
restorecon -R -v </some/MongoDB/directory>
Vì MongoDB đang sử dụng đường dẫn mặc định cho cả tệp dữ liệu và tệp nhật ký, chúng ta có thể xem các ví dụ sau về cách áp dụng:
Đối với đường dẫn dữ liệu MongoDB không phải mặc định của / mongodb / data:
$ sudo semanage fcontext -a -t mongod_var_lib_t '/mongodb/data.*'
$ sudo chcon -Rv -u system_u -t mongod_var_lib_t '/mongodb/data'
$ restorecon -R -v '/mongodb/data'
For non-default MongoDB log directory of /mongodb/log (e.g. if the log file path is /mongodb/log/mongod.log):
$ sudo semanage fcontext -a -t mongod_log_t '/mongodb/log.*'
$ sudo chcon -Rv -u system_u -t mongod_log_t '/mongodb/log'
$ restorecon -R -v '/mongodb/log'
Cổng MongoDB tùy chỉnh
Đối với một số trường hợp, một số bản cài đặt MongoDB đang sử dụng số cổng khác với số cổng mặc định là 27017. Trong trường hợp cụ thể này, chúng ta cũng cần phải định cấu hình SELinux và lệnh này khá đơn giản :
$ sudo semanage port -a -t mongod_port_t -p tcp <portnumber>
For example, we are using port 37017:
$ sudo semanage port -a -t mongod_port_t -p tcp 37017
Triển khai MongoDB SELinux được kích hoạt với ClusterControl
Với ClusterControl, bạn có tùy chọn bật SELinux trong quá trình triển khai bộ bản sao MongoDB của mình. Tuy nhiên, bạn vẫn cần thay đổi chế độ thành thực thi vì ClusterControl chỉ đặt chế độ này thành cho phép. Để bật nó trong quá trình triển khai, bạn có thể bỏ chọn “Disable AppArmor / SELinux” theo ảnh chụp màn hình bên dưới.
Sau đó, bạn có thể tiếp tục và thêm các nút cho bộ bản sao MongoDB của mình và bắt đầu triển khai. Trong ClusterControl, chúng tôi đang sử dụng phiên bản 4.2 cho MongoDB.
Khi cụm đã sẵn sàng, chúng ta cần thay đổi SELinux để thực thi đối với tất cả các nút và tiến hành định cấu hình nó bằng cách tham khảo các bước mà chúng tôi đã trải qua ngay bây giờ.
Kết luận
Có 3 chế độ SELinux có sẵn cho bất kỳ hệ thống Linux nào. Đối với chế độ thực thi SELinux, cần tuân theo một số bước để đảm bảo MongoDB chạy mà không gặp bất kỳ sự cố nào. Cũng cần lưu ý rằng một số cài đặt “ulimit” cũng cần được thay đổi để phù hợp với yêu cầu hệ thống cũng như thông số kỹ thuật.
Với ClusterControl, SELinux có thể được bật trong quá trình triển khai, tuy nhiên bạn vẫn cần chuyển sang chế độ thực thi và định cấu hình chính sách sau khi bộ bản sao đã sẵn sàng.
Chúng tôi hy vọng rằng bài đăng trên blog này sẽ giúp bạn thiết lập SELinux cho máy chủ MongoDB của mình