Thứ tư, 16/09/2020 | 00:00 GMT+7

Cách xử lý sandbox với Systemd trên Ubuntu 20.04

Sandboxing là một kỹ thuật bảo mật máy tính tập trung vào việc cô lập một chương trình hoặc quy trình khỏi các phần của hệ thống mà nó không cần phải tương tác trong quá trình hoạt động bình thường. Khi một chương trình mới được bắt đầu, nó có tất cả các khả năng của user mà nó chạy. Những khả năng này thường nhiều hơn những gì chương trình cần để thực hiện chức năng của nó. Điều này có thể dẫn đến các vấn đề bảo mật khi một kẻ xấu thao túng chương trình để truy cập vào một số khả năng không được sử dụng của nó để làm điều gì đó mà chương trình thường không làm.

Mục đích của sandbox là để xác định chính xác những khả năng và tài nguyên mà một chương trình cần, sau đó chặn mọi thứ khác.

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 Linux chính để khởi động, dừng và quản lý các chương trình và quy trình. Nó có nhiều tùy chọn sandbox để hạn chế cách quá trình nó bắt đầu truy cập vào hệ thống server , giúp nó an toàn hơn.

Mục đích của hướng dẫn này không phải là tạo ra môi trường sandbox nghiêm ngặt nhất có thể, mà là sử dụng các cài đặt được khuyến khích và dễ dàng kích hoạt để làm cho hệ thống của bạn an toàn hơn.

Trong hướng dẫn này, bạn sẽ chạy qua phần trình diễn thực tế về cách sử dụng các kỹ thuật sandbox của systemd trên Ubuntu 20.04 để có một quy trình làm việc hiệu quả để triển khai và kiểm tra các kỹ thuật này. Bất kỳ quá trình nào chạy trên hệ thống Linux sử dụng systemd đều có thể được đảm bảo an toàn hơn với các kỹ thuật này.

Yêu cầu

Bạn cần những thứ sau để bắt đầu hướng dẫn này:

Bước 1 - Cài đặt lighttpd

Trong hướng dẫn này, ta sẽ sandbox web server lighttpd . lighttpd không được chọn vì nó kém an toàn hơn các phần mềm khác, mà vì nó là một chương trình nhỏ với một chức năng duy nhất dễ bị sandbox. Điều này làm cho nó trở thành một lựa chọn tuyệt vời cho một ứng dụng học tập.

Hãy cập nhật hệ thống để bắt đầu:

  • sudo apt update

Kiểm tra các gói sẽ đượ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

Quá trình cài đặt này sẽ tự động cài đặt và kích hoạt file dịch vụ systemd cho lighttpd. Điều này sẽ làm cho lighttpd bắt đầu khi server khởi động lại hệ thống.

Bây giờ ta đã cài đặt lighttpd và chạy trên hệ thống của bạn , ta sẽ làm quen với các công cụ systemd mà ta sẽ sử dụng khi bắt đầu sandbox.

Bước 2 - Chuẩn bị hệ thống của bạn

Trong bước này, bạn sẽ làm quen với các lệnh systemd mà bạn sẽ sử dụng và chuẩn bị hệ thống của bạn để cho phép bạn sandbox một quy trình hiệu quả.

systemd là tên chung cho một bộ công cụ mà mỗi công cụ có tên khác nhau. Hai cái mà bạn sẽ sử dụng là systemctljournalctl . systemctl quản lý các quy trình và file dịch vụ của chúng, trong khi journalctl tương tác với log hệ thống.

systemd sử dụng các file dịch vụ để xác định cách một quy trình sẽ được quản lý. systemd tải các file này từ một số vị trí trong hệ thống file . Lệnh sau sẽ hiển thị cho bạn vị trí của file dịch vụ đang hoạt động và hiển thị bất kỳ overrides nào đang được sử dụng:

  • sudo systemctl cat process.service

Bạn cần thay thế process bằng quy trình mà bạn đang làm việc. Ở đây lighttpd được sử dụng:

  • sudo systemctl cat lighttpd.service

Đây là kết quả từ lệnh trước:

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

Kết quả này cho thấy rằng file dịch vụ được đặt tại /lib/systemd/system/lighttpd.service và không có tùy chọn overrides nào được sử dụng. Tùy chọn overrides thêm vào hoặc sửa đổi file dịch vụ cơ sở. Bạn sẽ sử dụng overrides cho sandbox lighttpd bằng một file overrides chuyên dụng.

Các file overrides được đặt tại /etc/systemd/system/ process .service.d/override.conf . systemd có một lệnh edit chuyên dụng sẽ tạo file overrides ở vị trí chính xác và chạy systemctl daemon-reload sau khi lưu và thoát khỏi editor . systemctl daemon-reload hướng dẫn systemd sử dụng bất kỳ cấu hình mới nào bạn đã viết.

Lệnh chỉnh sửa systemd có dạng sau:

  • sudo systemctl edit process.service

Khi bạn chạy lệnh này systemd thường sẽ chọn trình soạn thảo CLI mặc định của bạn, nhưng điều này không phải lúc nào cũng đúng và bạn có thể thấy mình đang ở trong vi hoặc thậm chí ed . Bạn có thể cấu hình trình soạn thảo systemd nào sẽ sử dụng bằng cách đặt biến shell SYSTEMD_EDITOR .

Đặt biến shell này bằng cách thêm một dòng vào file ~/.bashrc của bạn. Mở file này bằng editor :

  • nano ~/.bashrc

Và thêm dòng sau:

~ / .bashrc
export SYSTEMD_EDITOR=editor 

Thay đổi editor sửa thành editor sửa CLI bạn muốn . Đây là dòng được cài đặt để sử dụng editor nano :

~ / .bashrc
export SYSTEMD_EDITOR=nano 

Xác nhận điều này được đặt sau khi bạn đăng xuất và đăng nhập lại bằng lệnh echo :

  • echo $SYSTEMD_EDITOR

Lệnh này sẽ in tên của trình soạn thảo mà bạn đã đặt.

SYSTEMD_EDITOR shell SYSTEMD_EDITOR chỉ được đặt trong shell của user của bạn chứ không phải shell của root do sudo mở. Để chuyển biến này đến root’s shell, hãy gọi systemctl edit bằng cách sử dụng sudo -E :

  • sudo -E systemctl edit process.service

Đề xuất cuối cùng sẽ giúp gỡ lỗi sandbox của bạn dễ dàng hơn bằng cách hiển thị cho bạn bất kỳ lỗi nào mà các thay đổi đã gây ra. Các lỗi này sẽ được ghi lại bằng log hệ thống, được truy cập bằng lệnh journalctl .

Trong quá trình sandbox của bạn, bạn sẽ thực hiện nhiều thay đổi phá vỡ quá trình bạn đang cố gắng sandbox . Vì lý do đó, bạn nên mở một terminal thứ hai và dành nó để theo dõi log hệ thống. Điều này sẽ tiết kiệm thời gian mở lại log hệ thống.

Thực hiện theo log hệ thống trong terminal thứ hai bằng lệnh:

  • sudo journalctl -f -u process.service
  • -f : Theo dõi hoặc nối đuôi log hệ thống để các dòng mới được hiển thị ngay lập tức.
  • -u process .service : Chỉ hiển thị các dòng log cho process bạn đang sandbox.

Sau Đây là kết quả bạn cần chạy để chỉ in các lỗi của lighttpd:

  • sudo journalctl -f -u lighttpd.service

Tiếp theo, bạn sẽ bắt đầu chỉnh sửa file override.conf và bắt đầu sandboxing lighttpd.

Bước 3 - Bắt buộc user và group

Trong bước này, bạn sẽ đặt user không phải root mà lighttpd sẽ chạy.

Trong cấu hình mặc định của nó, lighttpd bắt đầu chạy với quyền user root và sau đó thay đổi thành user và group www-data . Đây là một vấn đề vì trong khi lighttpd đang chạy dưới quyền root, nó có thể làm bất cứ điều gì mà root có thể làm — đó là bất cứ điều gì.

systemd cung cấp khả năng chạy quy trình với quyền user không phải root, do đó tránh được vấn đề này.

Quay lại phiên terminal đầu tiên của bạn và bắt đầu chỉnh sửa file overrides bằng lệnh:

  • sudo -E systemctl edit lighttpd.service

Bây giờ, thêm các dòng sau:

file overrides lighttpd
[Service] User=www-data Group=www-data 
  • [Service] : Cho systemd biết rằng các tùy chọn sau sẽ được áp dụng cho phần [Service] .
  • User=www-data : Xác định user bắt đầu quá trình với quyền là.
  • Group=www-data : Xác định group để bắt đầu quá trình với quyền là.

Tiếp theo, lưu và thoát khỏi editor 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ì nó đang sử dụng quyền root để ghi file PID vào vị trí do root sở hữu. User www-data không thể ghi vào các folder do root sở hữu. Sự cố này được chỉ ra trong log hệ thống sẽ xuất hiện trong phiên terminal 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

Giải quyết vấn đề này tuân theo quy trình sandbox :

  1. Thực hiện hạn chế sandbox .
  2. Khởi động lại quá trình và kiểm tra lỗi.
  3. Sửa mọi lỗi.

Tiếp theo, bạn sẽ giải quyết vấn đề file PID trong khi vẫn thực thi các giới hạn group và user mà bạn đã đặt trong phần này.

Bước 4 - Quản lý file PID

Tệp PID là file chứa PID hoặc Số nhận dạng quy trình của một quy trình đang chạy. Các chương trình chạy lâu như lighttpd sử dụng chúng để quản lý các quy trình của riêng chúng. Sự cố mà bạn gặp phải trong phần trước là lighttpd không thể ghi file PID của nó vào /run/lighttpd.pid , vì /run/ thuộc sở hữu của root .

systemd có tùy chọn RuntimeDirectory cho vấn đề này, bạn sẽ sử dụng tùy chọn này để cung cấp cho lighttpd một vị trí mà nó có thể ghi file PID của nó vào.

Tùy chọn RuntimeDirectory cho phép bạn chỉ định một folder trong /run/ sẽ được tạo với user và group bạn đã đặt ở Bước 3 khi systemd khởi động lighttpd. lighttpd sẽ có thể ghi PID của nó vào folder này mà không cần quyền của root .

Trước tiên, hãy mở và chỉnh sửa file overrides bằng cùng lệnh mà bạn đã sử dụng ở Bước 3 :

  • sudo -E systemctl edit lighttpd.service

Tiếp theo, thêm dòng sau vào hai dòng mà bạn đã thêm vào file overrides :

file overrides lighttpd
RuntimeDirectory=lighttpd 

Lưu và thoát khỏi editor .

Bạn không thêm đường dẫn đầy đủ vào folder với RuntimeDirectory , chỉ có tên của folder dưới /run/ . Trong trường hợp này, folder mà systemd sẽ tạo là /run/lighttpd/ .

Đến đây bạn cần cấu hình lighttpd để ghi file PID của nó vào folder mới /run/lighttpd/ thay vì /run/ .

Mở file cấu hình của lighttpd bằng editor :

  • sudo nano /etc/lighttpd/lighttpd.conf

Thay đổi dòng sau:

/etc/lighttpd/lighttpd.conf
server.pid-file             = "/run/lighttpd.pid" 

Đến:

/etc/lighttpd/lighttpd.conf
server.pid-file             = "/run/lighttpd/lighttpd.pid" 

Lưu và thoát khỏi editor .

Bây giờ, khởi động lại lighttpd:

  • sudo systemctl restart lighttpd.service

Nó sẽ không bắt đầu vì nó không thể thực hiện một cái gì đó cần một trong những khả năng của root . Tiếp theo, bạn sẽ giải quyết vấn đề mới này.

Bước 5 - Mượn khả năng của root

Dòng sau trong log hệ thống giải thích sự cố khiến lighttpd ngừ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 có thể mở một cổng mạng dưới số 1024 . lighttpd đang cố gắng mở cổng HTTP 80 , nhưng nó đang bị từ chối vì user www-data không thể làm điều đó.

Sự cố được giải quyết bằng cách cung cấp cho quy trình lighttpd một phần nhỏ sức mạnh của root — nghĩa là để mở các cổng dưới 1024 .

" quyền " của root được chia thành các khả năng được gọi là "khả năng". User root có mọi khả năng và do đó có thể làm bất cứ điều gì. Việc tăng cường sức mạnh của root thành các khả năng nghĩa là chúng có thể được cung cấp riêng lẻ cho các quy trình không phải root. Điều này cho phép quá trình đó thực hiện điều gì đó mà lẽ ra phải có user root đầy đủ, nhưng user bình thường hiện có thể làm với một trong các khả năng của root .

Tùy chọn systemd để cung cấp cho quá trình một hoặc nhiều khả năng của root là tùy chọn AmbientCapabilities .

Mở file overrides :

  • sudo -E systemctl edit lighttpd.service

Sau đó thêm dòng sau vào dòng bạn đã thêm:

file overrides lighttpd
AmbientCapabilities=CAP_NET_BIND_SERVICE 

Khả năng CAP_NET_BIND_SERVICE cho phép quá trình mở các cổng dưới 1024 .

Lưu và thoát khỏi file .

lighttpd bây giờ sẽ có thể bắt đầu.

Đến đây bạn có một web server lighttpd đang hoạt động mà bạn đã bảo mật hơn cấu hình mặc định của nó. Có nhiều tùy chọn sandbox hơn do systemd cung cấp mà bạn có thể sử dụng để làm cho quy trình mục tiêu của bạn an toàn hơn nữa. Ta sẽ khám phá một số điều này trong các phần sau.

Trong bước tiếp theo, bạn sẽ hạn chế những gì lighttpd có thể truy cập trong hệ thống file .

Bước 6 - Khóa hệ thống file

Quá trình lighttpd chạy với quyền là user www-data và do đó có thể truy cập các file nào trên hệ thống mà www-data có quyền đọc và ghi vào. Trong trường hợp dữ liệu www không nhiều nhưng vẫn nhiều hơn nhu cầu của lighttpd.

Cài đặt sandbox đầu tiên và dễ dàng nhất là tùy chọn ProtectHome . Tùy chọn này dừng quá trình đọc hoặc ghi vào bất kỳ thứ gì trong /home/ . lighttpd không cần quyền truy cập vào bất kỳ thứ gì trong /home/ vì vậy việc triển khai điều này sẽ bảo vệ tất cả các file riêng tư của bạn mà không ảnh hưởng đến lighttpd.

Mở file overrides :

  • sudo -E systemctl edit lighttpd.service

Sau đó, thêm dòng sau vào cuối file :

file overrides lighttpd
ProtectHome=true 

Lưu và thoát khỏi editor , sau đó khởi động lại lighttpd để kiểm tra xem nó có hoạt động như bạn mong đợi hay không bằng lệnh sau:

  • sudo systemctl restart lighttpd.service

Bạn đã bảo vệ /home/ , nhưng điều đó vẫn để lại phần còn lại của hệ thống file . Điều này được thực hiện với tùy chọn ProtectSystem , tùy chọn này ngăn quá trình ghi vào các phần của hệ thống file .

Tùy chọn ProtectSystem có ba cài đặt cung cấp mức độ bảo vệ ngày càng cao. Chúng như sau:

  • true : Đặt các folder sau thành chỉ đọc:
    • /usr/
    • /boot/
    • /efi/
  • full : Đặt các folder sau thành chỉ đọc:
    • /usr/
    • /boot/
    • /efi/
    • /etc/
  • strict : Đặt các folder sau thành chỉ đọc:
    • Toàn bộ hệ thống file

Mức độ bảo vệ cao hơn sẽ an toàn hơn, vì vậy hãy đặt tùy chọn ProtectSystem thành strict bằng cách thêm dòng sau vào file overrides :

file overrides lighttpd
ProtectSystem=strict 

Lưu và thoát khỏi editor 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ì nó cần ghi các file log của bạn vào /var/log/lighttpd/ và cài đặt strict cấm điều đó. Dòng sau trong log hệ thống cho thấy 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ự đoán với tùy chọn LogsDirectory . Nó lấy tên của một folder trong /var/log/ mà tiến trình được phép ghi log của nó vào.

Mở lại file overrides trong phiên đầu tiên của bạn:

  • sudo -E systemctl edit lighttpd.service

Thư mục log lighttpd là /var/log/lighttpd/ vì vậy hãy thêm dòng sau vào cuối file overrides :

file overrides lighttpd
LogsDirectory=lighttpd 

Lưu và thoát khỏi editor và khởi động lại lighttpd:

  • sudo systemctl restart lighttpd.service

lighttpd bây giờ sẽ có thể chạy .

Lưu ý: Nếu bạn đang sandbox một quy trình không phải lighttpd và muốn cho phép quy trình của bạn ghi quyền truy cập vào một folder cụ thể bên ngoài /var/log/ sử dụng tùy chọn ReadWritePaths .

Trong bước tiếp theo, bạn sẽ giới hạn cách quá trình lighttpd có thể tương tác với phần còn lại của hệ thống bằng cách hạn chế các lệnh gọi hệ thống mà nó được phép thực hiện.

Bước 7 - Hạn chế cuộc gọi hệ thống

Lời gọi hệ thống là cách một chương trình yêu cầu một cái gì đó từ kernel . Số lượng lệnh gọi hệ thống khá lớn và bao gồm các hành động như đọc, ghi và xóa file , các việc liên quan đến phần cứng như gắn hệ thống file , quá trình sinh sản, khởi động lại, v.v.

systemd đã tạo các group lệnh gọi hệ thống xử lý, như lighttpd, thường sử dụng và loại trừ các lệnh gọi mà chúng không xử lý. Các lệnh gọi hệ thống bị chặn là những thứ như gắn hệ thống file và khởi động lại hệ thống, điều mà lighttpd không bao giờ cần làm.

Đầu tiên, hãy mở file overrides :

  • sudo -E systemctl edit lighttpd.service

Thêm dòng sau vào cuối file để sử dụng tùy chọn SystemCallFilter để đặt group @system-service :

file overrides lighttpd
SystemCallFilter=@system-service 

Lưu và thoát khỏi editor và khởi động lại lighttpd:

  • sudo systemctl restart lighttpd.service

Trong phần tiếp theo, bạn sẽ áp dụng các tùy chọn sandbox được đề xuất còn lại.

Bước 8 - Triển khai các tùy chọn khác

Tài liệu systemd đề xuất các tùy chọn sau được bật cho các quy trình được nối mạng, chạy lâu dài như lighttpd. Tất cả các cài đặt này đều là tùy chọn, nhưng mỗi cài đặt làm cho quá trình bạn sử dụng sandbox an toàn hơn và nên được sử dụng nếu bạn có thể.

Bạn nên bật từng tùy chọn này và khởi động lại quy trình của bạn sau mỗi tùy chọn. Nếu bạn thêm tất cả chúng cùng một lúc, việc gỡ lỗi sẽ khó hơn nhiều.

Các tùy chọn được đề xuất sau đây có kèm theo mô tả ngắn gọn về những gì chúng làm. Thêm các dòng này vào file overrides của bạn dưới các dòng bạn đã thêm:

file overrides lighttpd
NoNewPrivileges=true 

Tùy chọn này ngăn quá trình sandbox và bất kỳ con nào của nó nhận được các quyền mới.

file overrides lighttpd
ProtectKernelTunables=true 

Tùy chọn này ngăn quá trình thay đổi bất kỳ biến nhân nào.

file overrides lighttpd
ProtectKernelModules=true 

Tùy chọn này dừng quá trình tải hoặc dỡ các module kernel .

file overrides lighttpd
ProtectKernelLogs=true 

Tùy chọn này dừng quá trình đọc và ghi trực tiếp vào log kernel . Nó phải sử dụng ứng dụng log hệ thống để ghi lại bất kỳ thông báo log nào.

file overrides lighttpd
ProtectControlGroups=true 

Tùy chọn này dừng quá trình sửa đổi các group điều khiển hệ thống.

file overrides lighttpd
MemoryDenyWriteExecute=true 

Tùy chọn này ngăn quá trình sửa đổi bất kỳ mã nào đang chạy trong bộ nhớ của hệ thống.

file overrides lighttpd
RestrictSUIDSGID=true 

Tùy chọn này ngăn quá trình cài đặt ID user (SUID) hoặc ID group (SGID) trên file hoặc folder . Khả năng này có thể bị lạm dụng để nâng cao quyền .

file overrides lighttpd
KeyringMode=private 

Tùy chọn này ngăn quá trình truy cập vào khóa nhân của các quá trình khác đang chạy với cùng một user .

file overrides lighttpd
ProtectClock=true 

Tùy chọn này ngăn quá trình thay đổi đồng hồ hệ thống phần cứng và phần mềm.

file overrides lighttpd
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ể bị lạm dụng để làm quá tải CPU.

file overrides lighttpd
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 như thiết bị lưu trữ hoặc thiết bị USB.

file overrides lighttpd
PrivateTmp=true 

Tùy chọn này buộc quá trình sử dụng /tmp/ private /tmp//var/tmp/ . Điều này ngăn quá trình không thể đọc các file tạm thời của chương trình khác được lưu trữ trong các folder hệ thống được chia sẻ đó.

file overrides lighttpd
ProtectHostname=true 

Tùy chọn này ngăn quá trình thay đổi tên server của hệ thống.

Quá trình mà bạn có sandbox giờ đây an toàn hơn nhiều so với quá trình trong cấu hình mặc định của nó. Đến đây bạn có thể thực hiện các kỹ thuật này và sử dụng chúng cho bất kỳ quy trình nào khác mà bạn cần bảo mật trên hệ thống Linux của bạn .

Kết luận

Trong bài viết này, bạn đã làm cho chương trình lighttpd an toàn hơn bằng cách sử dụng các tùy chọn sandbox systemd. Bạn có thể sử dụng các kỹ thuật này với bất kỳ quy trình nào mà systemd quản lý cho phép bạn tiếp tục cải thiện tính bảo mật của hệ thống.

Toàn bộ danh sách sandbox và các tùy chọn bảo mật khác được tìm thấy trong tài liệu trực tuyến của systemd. Ngoài ra, hãy xem các chủ đề bảo mật khác trên Cộng đồng DigitalOcean.


Tags:

Các tin trước

Cách cài đặt và cấu hình Neo4j trên Ubuntu 20.04 2020-09-15
Cách cài đặt Webmin trên Ubuntu 20.04 2020-08-26
Cách thiết lập môi trường JupyterLab trên Ubuntu 18.04 2020-08-26
Cách cài đặt Node.js trên Ubuntu 18.04 2020-08-06
Cách cài đặt MongoDB trên Ubuntu 20.04 2020-07-31
Cách cấu hình truy cập từ xa cho MongoDB trên Ubuntu 20.04 2020-07-31
Cách bảo mật MongoDB trên Ubuntu 20.04 2020-07-31
Cách thiết lập Mattermost trên Ubuntu 20.04 2020-07-29
Làm thế nào để quản lý OpenSSH trên Ubuntu 18.04 2020-07-28
Cách sử dụng Discord Webhooks để nhận thông báo về trạng thái trang web của bạn trên Ubuntu 18.04 2020-07-27