Sandbox là một kĩ thuật bảo mật giúp tách biệt các ứng dụng, phần mềm với các phần khác của hệ thống nhằm bảo vệ và không cho các phần mềm độc hại xâm nhập vào máy tính, điện thoại để hạn chế hỏng hệ thống máy tính hoặc rò rỉ thông tin cá nhân. Cùng Vietnix theo dõi bài viết này để nắm được cách xử lý Sandbox với Systemd trên Ubuntu 20.04.
Giới thiệu về Sandbox
Trong máy tính, việc các ứng dụng đều dùng chung tài nguyên sẽ dẫn đến những sự cố không mong muốn, ví dụ nếu một chương trình hay ứng dụng bị lỗi thì các chương trình và ứng dụng khác cũng bị lỗi theo. Hoặc một ứng dụng độc hại lợi dụng việc dùng chung tài nguyên với các ứng dụng khác để truy cập trái phép đến các khu vực riêng tư hay sử dụng trái phép tài nguyên máy tính, gây ảnh hưởng xấu đến người dùng.
Vì vậy, sandbox là một kĩ thuật rất quan trọng nhằm tăng tính bảo mật cho bất kì chương trình hay ứng dụng nào trong máy tính, xác định rõ ràng những khả năng, quyền, tài nguyên cần cho ứng dụng được chỉ định chạy sandbox và khóa các phần còn lại
Bộ công cụ quản lí hệ thống systemd được sử dụng trên hầu hết các bản phân phối chính của Linux nhằm quản lí các chương trình và ứng dụng. Systemd có nhiều tùy chọn sandbox giúp hạn chế việc ứng dụng trái phép truy cập vào hệ thống máy chủ, làm cho hệ thống máy chủ an toàn hơn.
Trong hướng dẫn này, bạn sẽ sử dụng các kĩ thuật sandbox của systemd trên Ubuntu 20.04 để bảo mật các chương trình và ứng dụng chạy trên hệ điều hành Linux, nhằm giúp các ứng dụng làm việc hiệu quả hơn.
Yêu cầu để có thể thực hiện cách xử lý Sandbox với Systemd trên Ubuntu 20.04
Để thực hiện theo hướng dẫn này, bạn cần một hệ thống Ubuntu 20.04, user non-root được cấp quyền sudo. Ngoài ra bạn cần có hiểu biết nhất định về quản lí các process với systemd và các tệp đơn vị system cũng như hiểu biết cơ bản về systemd unit file.
Sandbox là giải pháp hoàn hảo để đảm bảo tính riêng tư, bảo mật và ổn định của hệ thống. Tuy nhiên, để VPS vận hành ổn định, mượt mà và đạt hiệu quả tối đa thì tốc độ cũng là một yếu tố quan trọng cần được chú trọng.
Hiện tại Vietnix đang cung cấp các gói dịch vụ thuê máy chủ ảo (VPS) tốc độ cao, đa dạng cấu hình, tính năng hiện đại, bảo mật cao gồm: VPS NVMe, VPS Giá Rẻ, VPS Phổ Thông, VPS Cao Cấp và VPS GPU với nhiều mức giá khác nhau.
Nhanh tay liên hệ Vietnix để được tư vấn gói VPS tốc độ cao phù hợp với nhu cầu ngay hôm nay.
Bước 1 : Cài đặt lighttpd
Trong hướng dẫn này, bạn sẽ sử dụng web server lighttpd, một chương trình nhỏ với một chức năng duy nhất để thực hiện kĩ thuật sandbox.
Cập nhật hệ thống để bắt đầu:
$ sudo apt update
Kiểm tra các package được nâng cấp trên hệ thống của bạn trước khi nhập y:
$ sudo apt upgrade
Sau đó cài đặt lighttpd:
$ sudo apt install lighttpd
Lệnh trên sẽ tự động cài đặt và kích hoạt service file systemd cho lighttpd, tiếp đến lighttpd sẽ bắt đầu khởi động lại hệ thống.
Khi đã cài đặt và chạy lighttpd trên hệ thống của mình, bạn sẽ làm quen với các công cụ systemd khi bắt đầu thực hiện kĩ thuật sandbox.
Bước 2 : Chuẩn bị cho hệ thống
Trong bước này, bạn sẽ sử dụng các lệnh systemd để thực hiện kĩ thuật sandbox một cách hiệu quả.
Systemd là tên chung cho một bộ công cụ mà mỗi công cụ có một tên khác nhau. Hai công cụ mà bạn sẽ sử dụng là systemctl
và journalctl
. systemctl
quản lí các process và service file, đồng thời journalctl
tương tác với system log.
Systemd sử dụng các service file để xác định cách quản lí một process. Systemd tải các tệp trên bằng lệnh sau:
$ sudo systemctl cat process.service
Bạn cần thay thế process
bằng tiến trình mà bạn đang thực hiện. Trong hướng dẫn này sử dụng lighttpd:
Output của lệnh trên như sau:
Output
# /lib/systemd/system/lighttpd.service
[Unit]
Description=Lighttpd Daemon
After=network-online.target
[Service]
Type=simple
PIDFile=/run/lighttpd.pid
ExecStartPre=/usr/sbin/lighttpd -tt -f /etc/lighttpd/lighttpd.conf
ExecStart=/usr/sbin/lighttpd -D -f /etc/lighttpd/lighttpd.conf
ExecReload=/bin/kill -USR1 $MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target
Output này cho biết rằng service file được đặt tại /lib/systemd/system/lighttpd.service
và không có tùy chọn override nào đang được sử dụng. Các tùy chọn override được thêm vào hoặc sửa đổi service file cơ bản. Bạn sẽ sử dụng các phần ghi đè lên sandbox lighttpd bằng một file override chuyên dụng.
Các file override sẽ được đặt ở etc/systemd/system/process.service.d/override.conf
systemd có dòng lệnh chuyên dùng để chỉnh sửa, qua đó sẽ tạo một file override ở chính vị trí đó, chạy systemctl daemon-reload sau khi lưu chỉnh sửa và đóng file. Tiến trình này sẽ hướng dẫn systemd dùng cấu hình mới từ người dùng tạo ra.
Dạng lệnh systemd edit như sau:
$ sudo systemctl edit process.service
systemd thường sẽ chọn trình soạn thảo CLI mặc định, nhưng không phải trường hợp nào cũng vậy, người dùng sẽ phải tự thực hiện bằng vi editor hoặc thậm chí là ed editor. Bạn có thể cấu hình trình soạn thảo systemd bằng cách sử dụng biến shell SYSTEMD_EDITOR
.
Mở tệp ~/.bashrc
bằng trình soạn thảo văn bản để thêm biến shell:
$ nano ~/.bashrc
Và thêm dòng sau:
export SYSTEMD_EDITOR=editor
Thay đổi editor
, ở đây thay trình chỉnh sửa CLI bằng nano:
export SYSTEMD_EDITOR=nano
Xác nhận thay đổi trình chỉnh sửa sau khi bạn đăng xuất và đăng nhập lại bằng lệnh:
$ echo $SYSTEMD_EDITOR
Lệnh trên sẽ in tên của trình soạn thảo mà bạn đã đặt.
Biến shell SYSTEMD_EDITOR
chỉ được đặt trong shell của user chứ không phải shell root được mở bởi sudo. Để chuyển biến shell tới root shell, hãy sử dụng lệnh sau:
$ sudo -E systemctl edit process.service
Thao tác cuối cùng sẽ giúp sandbox debugging dễ dàng hơn bằng cách hiển thị các lỗi khi thực hiện. Những lỗi này sẽ được ghi lại bằng system log, được truy cập bằng lệnh journalctl
.
Trong quá trình sandboxing, bạn nên mở thêm một terminal thứ hai và sử dụng terminal đó để theo dõi system log. Điều này sẽ tiết kiệm thời gian mở lại system log.
Theo dõi system log trong terminal thứ hai bằng lệnh sau:
$ sudo journalctl -f -u process.service
-f
: theo dõi system log để hiển thị lỗi mới ngay lập tức.-u process.service
: chỉ hiển thị các lỗi cho process sandboxing mà bạn đang sử dụng.
Nếu bạn chỉ in các lỗi của lighttpd, chạy lệnh sau:
$ sudo journalctl -f -u lighttpd.service
Tiếp theo, bạn sẽ chỉnh sửa tệp override.conf
và bắt đầu tiến hành sandboxing lighttpd.
Bước 3 : Thực thi user và group
Trong bước này, bạn sẽ cài đặt user non-root cho lighttpd.
Trong cấu hình mặc định, lighttpd bắt đầu chạy với tư cách là user root và sau đó thay đổi thành user và group www-data. Đây là một vấn đề vì khi lighttpd đang chạy với root, lighttpd có thể làm bất cứ điều gì và gây ra sự cố đến hệ thống của bạn.
Systemd giúp các process chạy với tư cách user non-root, do đó tránh được sự cố trên.
Quay lại terminal session đầu tiên và chỉnh sửa file override bằng lệnh sau:
$ sudo -E systemctl edit lighttpd.service
Sau đó thêm các dòng:
lighttpd override file
[Service]
User=www-data
Group=www-data
[Service]
: cho systemd biết các tùy chọn được áp dụng cho phần [Service].User=www-data
: xác định user để bắt đầu quá trình.Group=www-data
: xác định group để bắt đầu quá trình.
Tiếp theo, lưu và thoát khỏi trình chỉnh sửa, sau đó khởi động lại lighttpd bằng lệnh sau:
$ sudo systemctl restart lighttpd.service
Lighttpd sẽ không thể tự động khởi động vì đang sử dụng root để ghi tệp PID vào một vị trí do root sở hữu. User www-data không thể ghi vào các thư mục do root sở hữu. Sự cố được chỉ ra trong system log sẽ xuất hiện trong terminal session thứ hai của bạn:
journalctl error message
Aug 29 11:37:35 systemd lighttpd[7097]: 2020-08-29 11:37:35: (server.c.1233) opening pid-file failed: /run/lighttpd.pid Permission denied
Việc giải quyết sự cố trên tuân theo process sandboxing, đó là:
- Thực hiện hạn chế sandbox.
- Khởi động lại quá trình và kiểm tra lỗi.
- Sửa tất cả các lỗi.
Tiếp theo, bạn sẽ giải quyết vấn đề về file PID trong khi vẫn thực hiện hạn chế đối với user và group mà bạn đã thực hiện trong bước này.
Bước 4 : Quản lí tệp PID
File PID là nơi chứa PID hoặc Mã số nhận dạng quá trình của một process đang chạy. Các chương trình chạy lâu dài như lighttpd sử dụng file PID để quản lí các process. Vấn đề mà bạn gặp phải trong phần trước là lighttpd không thể ghi file PID vào mục /run/lighttpd.pid
vì thư mục /run/
được sở hữu bởi root.
Systemd có tùy chọn RuntimeDirectory
để giải quyết vấn đề trên. Bạn có thể sử dụng tùy chọn này để cung cấp cho lighttpd một vị trí để ghi file PID vào.
Tùy chọn RuntimeDirectory
cho phép bạn chỉ định thư mục /run/
được tạo với user và group mà bạn đã đặt ở bước 3 khi systemd khởi động lighttpd. Lighttpd ghi PID vào thư mục /run/
mà không cần root.
Đầu tiên, mở và chỉnh sửa file override bằng lệnh:
$ sudo -E systemctl edit lighttpd.service
Tiếp theo, thêm dòng sau vào dưới hai dòng bạn đã thêm vào file override:
lighttpd override file
RuntimeDirectory=lighttpd
Lưu và thoát khỏi trình chỉnh sửa.
Nếu bạn không thêm đường dẫn đầy đủ vào thư mục có phần RuntimeDirectory mà chỉ thêm tên của thư mục có phần /run/
, thì thư mục mà systemd sẽ tạo là /run/lighttpd/
.
Tiếp theo bạn cần cấu hình lighttpd để ghi tệp PID vào thư mục /run/lighttpd/
thay vì /run/
.
Mở tệp cấu hình của lighttpd bằng trình soạn thảo văn bản:
$ sudo nano /etc/lighttpd/lighttpd.conf
Thay đổi dòng sau:
/etc/lighttpd/lighttpd.conf
server.pid-file = "/run/lighttpd.pid"
Thành:
/etc/lighttpd/lighttpd.conf
server.pid-file = "/run/lighttpd/lighttpd.pid"
Lưu và thoát khỏi trình chỉnh sửa.
Bây giờ, hãy khởi động lại lighttpd:
$ sudo systemctl restart lighttpd.service
Lighttpd không thể khởi động vì cần một trong những capability của root. Bạn sẽ giải quyết vấn đề này trong bước tiếp theo.
Bước 5 : Cung cấp đặc quyền root cho process lighttpd
Dòng sau trong system log giải thích sự cố khiến lighttpd dừng khởi động:
journalctl error message
Aug 29 12:07:22 systemd lighttpd[7220]: 2020-08-29 12:07:22: (network.c.311) can't bind to socket: 0.0.0.0:80 Permission denied
Chỉ root mới có thể mở port nhỏ hơn port 1024
. Lighttpd bị từ chối khi mở cổng HTTP 80
vì user www-data không thể làm điều đó.
Vấn đề trên được giải quyết bằng cách cung cấp cho process lighttpd một phần quyền root, sử dụng để mở các port nhỏ hơn port 1024
.
Đặc quyền của root được chia thành các capability, user root có mọi capability và do đó mà user root có thể thực hiện bất kì điều gì. Việc chia nhỏ đặc quyền của root cho phép các non-root process có thể sở hữu một số capability của root và thực hiện các tiến trình yêu cầu quyền root mà user bình thường sẽ bị từ chối.
Tùy chọn systemd cung cấp một hoặc nhiều capability của root cho một process là AmbientCapabilites
.
Mở file override:
$ sudo -E systemctl edit lighttpd.service
Sau đó thêm dòng sau:
lighttpd override file
AmbientCapabilities=CAP_NET_BIND_SERVICE
Capability CAP_NET_BIND_SERVICE
cho phép một process mở các port dưới 1024.
Lưu và thoát tệp. lighttpd đã có thể khởi động.
Khi đã có web server lighttpd đang hoạt động với cấu hình an toàn, bạn sẽ hạn chế khả năng truy cập của lighttpd trong hệ thống tệp.
Bước 6 : Khóa File system
Process lighttpd chạy với tư cách là www-data user, do đó lighttpd có thể truy cập bất kì tệp nào trên hệ thống mà www-data có quyền đọc và ghi vào. Dù www-data không có nhiều file có quyền truy cập, nhưng vẫn nhiều hơn cần thiết cho lighttpd.
Cài đặt sanbox dễ dàng nhất là sử dụng tùy chọn ProtectHome
. Tùy chọn này dừng tiến trình đọc hoặc ghi vào bất kì nội dung nào trong thư mục /home/
. lighttpd không cần quyền truy cập vào bất cứ thành phần nào bên dưới tệp /home/
nên sử dụng tùy chọn ProtectHome
giúp bảo vệ các tệp riêng tư của bạn mà không ảnh hưởng đến lighttpd.
Mở file override:
$ sudo -E systemctl edit lighttpd.service
Sau đó thêm dòng sau vào cuối file:
ProtectHome=true
Lưu và thoát khỏi trình chỉnh sửa, sau đó khởi động lại lighttpd để kiểm tra xem lighttpd có hoạt động chính xác hay không bằng lệnh sau:
$ sudo systemctl restart lighttpd.service
Bạn đã bảo vệ thư mục /home/
, tuy nhiên phần còn lại trong file hệ thống thì chưa. Với tùy chọn ProtectSystem
, các phần còn lại sẽ được an toàn, dừng các tiến trình ghi lên file system.
Tùy chọn ProtectSystem
có ba mức độ bảo vệ, tăng dần theo thứ tự như sau:
true
: đặt các thư mục/usr/
,/boot/
,/efi/
thành thư mục chỉ có thể đọc.full
: đặt các thư mục/usr/
,/boot/
,/efi/
,/ect/
thành thư mục chỉ có thể đọc.strict
: đặt toàn bộ hệ thống tập tin thành các thư mục chỉ có thể đọc.
Mức bảo vệ cao nhất và an toàn nhất là strict
, vì vậy đặt tùy chọn ProtectSystem
thành strict
bằng cách thêm dòng sau vào file override:
ProtectSystem=strict
Lưu và thoát khỏi trình chỉnh sửa và khởi động lại lighttpd bằng lệnh sau:
$ sudo systemctl restart lighttpd.service
lighttpd sẽ không thể khởi động vì lighttpd cần ghi các file log vào mục /var/log/lighttpd
nhưng cài đặt strict
chặn hành động này. Dòng sau trong system log cho biết sự cố:
journalctl error message
Aug 29 12:44:41 systemd lighttpd[7417]: 2020-08-29 12:44:41: (server.c.752) opening errorlog '/var/log/lighttpd/error.log' failed: Read-only file system
Sự cố này được systemd dự liệu với tùy chọn LogsDirectory
. Tùy chọn này lấy tên của một thư mục mà process được phép ghi file log vào.
Mở lại file override trong terminal session đầu tiên của bạn:
$ sudo -E systemctl edit lighttpd.service
Thêm các dòng sau vào cuối file override của lighttpd:
LogsDirectory=lighttpd
Lưu và thoát khỏi trình chỉnh sửa, sau đó khởi động lại lighttpd:
$ sudo systemctl restart lighttpd.service
lighttpd đã có thể khởi động. Trong bước tiếp theo, bạn sẽ giới hạn các process mà lighttpd có thể tương tác với các phần còn lại của hệ thống bằng cách hạn chế các cuộc gọi hệ thống mà lighttpd được phép thực hiện.
Bước 7 : Hạn chế System call
System call là cách một chương trình yêu cầu từ kernel. Số lượng lệnh gọi hệ thống khá lớn, vì vậy systemd đã tạo các nhóm lệnh gọi hệ thống mà các process, như lighttpd, thường sử dụng và loại bỏ những lệnh gọi mà process không cần đến. Các lần gọi nếu bị chặn là vì các thao tác như mount file system và khởi động lại hệ thống, điều mà lighttpd không cần thực hiện.
Đầu tiên, mở file override:
$ sudo -E systemctl edit lighttpd.service
Thêm dòng sau vào cuối file:
SystemCallFilter=@system-service
Lưu và thoát trình chỉnh sửa, sau đó khởi động lại lighttpd:
$ sudo systemctl restart lighttpd.service
Trong phần cuối cùng của hướng dẫn, bạn sẽ áp dụng các tùy chọn sandbox được đề xuất
Bước 8 : Thực hiện các tùy chọn khác
Tài liệu systemd đề xuất các tùy chọn cho các process được nối mạng, chạy lâu dài như lighttpd. Bạn nên sử dụng các tùy chọn để làm cho quy trình sandbox an toàn hơn, ngoài ra bạn nên bật từng tùy chọn này và khởi động lại process sau mỗi tùy chọn. Nếu bạn thêm tất cả tùy chọn cùng một lúc, việc gỡ lỗi sẽ khó khăn hơn nhiều.
Các tùy chọn được đề xuất sau cùng với mô tả ngắn về chức năng đi kèm, người dùng có thể thêm các dòng lệnh này vào dưới cùng của file override:
NoNewPrivileges=true
Tùy chọn này dừng tiến trình sandboxing và những tiến trình con nhận được các đặc quyền mới.
ProtectKernelTunables=true
Tùy chọn này ngăn quá trình thay đổi biến kernel.
ProtectKernelModules=true
Tùy chọn này dừng quá trình tải và ngắt tải các kernel module.
ProtectKernelLogs=true
Tùy chọn này dừng quá trình đọc và ghi trực tiếp vào kernel log.
ProtectControlGroups=true
Tùy chọn này dừng quá trình sửa đổi các nhóm điều khiển hệ thống.
MemoryDenyWriteExecute=true
Tùy chọn này ngăn quá trình sửa đổi code đang chạy trong bộ nhớ hệ thống.
RestrictSUIDSGID=true
Tùy chọn này dừng quá trình thiết lập set-user-ID (SUID) hoặc set-group-ID (SGID) trên các tệp hoặc thư mục.
KeyringMode=private
Tùy chọn này ngăn việc truy cập kernel keyring của các process khác đang chạy với cùng một user.
ProtectClock=true
Tùy chọn này ngăn quá trình thay đổi phần cứng và phần mềm của system clocks (đồng hồ đồng bộ của hệ thống).
RestrictRealtime=true
Tùy chọn này ngăn quá trình kích hoạt lập lịch thời gian thực, có thể gây quá tải CPU.
PrivateDevices=true
Tùy chọn này dừng quá trình truy cập các thiết bị vật lí được gắn vào hệ thống, chẳng hạn như các thiết bị lưu trữ hay USB.
PrivateTmp=true
Tùy chọn này dừng quá trình thay đổi hostname của hệ thống.
ProtectHostname=true
Quy trình sandbox của bạn hiện an toàn hơn nhiều so với quy trình trong cấu hình mặc định. Giờ đây, bạn có thể sử dụng kĩ thuật sandbox để bảo mật cho bất kì process nào trên hệ thống Linux của bạn.
Vietnix với hơn 10 năm hoạt động đã đồng hành với hơn 50.000 khách hàng cá nhân và doanh nghiệp. Đến năm 2022 Vietnix vinh dự được nhận giải Thương hiệu Việt Nam xuất sắc nhất. Đồng thời, với tỷ lệ 97% khách hàng sau khi sử dụng dịch vụ tại Vietnix đã giới thiệu đến bạn bè, đồng nghiệp cũng là một minh chứng cho chất lượng dịch vụ luôn đáp ứng được mọi nhu cầu của khách hàng.
Nhanh tay đăng ký Vietnix VPS ngay và trải nghiệm dịch vụ ổn định, tốc độ cao, hỗ trợ nhanh chóng với nhiều ưu đãi hấp dẫn nhất.
- Địa chỉ: 265 Hồng Lạc, Phường 10, Quận Tân Bình, Thành Phố Hồ Chí Minh.
- Hotline: 1800 1093 – 07 088 44444
- Email: sales@vietnix.com.vn
Lời kết
Trong bài viết về hướng dẫn cách xử lý Sandbox với Systemd trên Ubuntu 20.04 này, bạn đã thực hiện bảo mật cho chương trình lighttpd bằng cách sử dụng các tùy chọn sandbox của bộ công cụ systemd. Hi vọng bạn có thể sử dụng kĩ thuật sandbox để cải thiện tính bảo mật cho hệ thống của mình. Chúc các bạn cài đặt thành công và đừng quên theo dõi các bài viết tiếp theo của Vietnix.