安全cron PHP
本主題討論如何保護安全性 pub/cron.php
以防止它用於惡意利用。 如果您不保護cron的安全,任何使用者都可能執行cron來攻擊您的Commerce應用程式。
cron工作會執行數個排程工作,且是Commerce設定的重要部分。 已排程的工作包括但不限於:
- 重新索引
- 產生電子郵件
- 產生電子報
- 產生網站地圖
您可以透過下列方式執行cron工作:
- 使用
magento cron:run
命令列或crontab中的命令 - 存取
pub/cron.php?[group=<name>]
在網頁瀏覽器中
magento cron:run
命令以執行cron,因為它使用已安全的不同程式。使用Apache的安全CRON
本節將討論如何透過Apache使用HTTP基本驗證來保護Cron安全。 這些指示是根據具有CentOS 6的Apache 2.2。 如需詳細資訊,請參閱下列資源之一:
建立密碼檔案
基於安全考量,您可以在網頁伺服器docroot以外的任何地方找到密碼檔案。 在此範例中,我們將密碼檔案儲存在新目錄中。
以使用者身分輸入以下命令,並附上 root
許可權:
mkdir -p /usr/local/apache/password
htpasswd -c /usr/local/apache/password/passwords <username>
位置 <username>
可以是網頁伺服器使用者或其他使用者。 在此範例中,我們使用Web伺服器使用者,但使用者的選擇由您決定。
按照畫面上的提示為使用者建立密碼。
若要將其他使用者新增至您的密碼檔案,請輸入以下命令作為使用者 root
許可權:
htpasswd /usr/local/apache/password/passwords <username>
新增使用者以建立授權的cron群組(選用)
您可以將這些使用者新增到您的密碼檔案(包括群組檔案),讓多個使用者執行cron。
若要將其他使用者新增至您的密碼檔案:
htpasswd /usr/local/apache/password/passwords <username>
若要建立授權群組,請在網頁伺服器docroot之外的任意位置建立群組檔案。 群組檔案指定群組的名稱以及群組中的使用者。 在此範例中,群組名稱為 MagentoCronGroup
.
vim /usr/local/apache/password/group
檔案內容:
MagentoCronGroup: <username1> ... <usernameN>
安全cron輸入 .htaccess
保護Cron安全 .htaccess
檔案:
-
以檔案系統擁有者的身分登入或切換到您的Commerce伺服器。
-
開啟
<magento_root>/pub/.htaccess
在文字編輯器中。(因為
cron.php
位於pub
目錄,編輯此.htaccess
僅限。) -
一或多個使用者的Cron存取權。 取代現有的
<Files cron.php>
指示詞:code language-conf <Files cron.php> AuthType Basic AuthName "Cron Authentication" AuthUserFile /usr/local/apache/password/passwords Require valid-user </Files>
-
群組的Cron存取權。 取代現有的
<Files cron.php>
指示詞:code language-conf <Files cron.php> AuthType Basic AuthName "Cron Authentication" AuthUserFile /usr/local/apache/password/passwords AuthGroupFile <path to optional group file> Require group <name> </Files>
-
將變更儲存至
.htaccess
並退出文字編輯器。 -
繼續使用 驗證cron是否安全.
使用Nginx提供安全的cron
本節討論如何使用Nginx網頁伺服器來保護cron的安全。 您必須執行下列工作:
- 設定Nginx的加密密碼檔案
- 修改您的nginx設定,以在存取時參照密碼檔案
pub/cron.php
建立密碼檔案
在繼續之前,請查詢下列資源之一以建立密碼檔案:
安全cron輸入 nginx.conf.sample
Commerce提供立即可用的最佳化nginx設定檔範例。 我們建議您修改它以保護cron。
-
將下列專案新增至
nginx.conf.sample
檔案:code language-conf #Securing cron location ~ cron\.php$ { auth_basic "Cron Authentication"; auth_basic_user_file /etc/nginx/.htpasswd; try_files $uri =404; fastcgi_pass fastcgi_backend; fastcgi_buffers 1024 4k; fastcgi_read_timeout 600s; fastcgi_connect_timeout 600s; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }
1.重新啟動nginx:
systemctl restart nginx
- 繼續使用 驗證cron是否安全.
驗證cron是否安全
最簡單的確認方法 pub/cron.php
安全是驗證它是否在 cron_schedule
設定密碼驗證後的資料庫表格。 此範例使用SQL命令來檢查資料庫,但您可以使用任何您喜歡的工具。
default
您在此範例中執行的cron會根據中定義的排程執行 crontab.xml
. 某些cron工作一天只執行一次。 第一次從瀏覽器執行cron時, cron_schedule
表格已更新,但後續更新 pub/cron.php
要求會依設定的排程執行。驗證cron是否安全:
-
以Commerce資料庫使用者身分或以下列身分登入資料庫:
root
.例如,
code language-bash mysql -u magento -p
-
使用Commerce資料庫:
code language-shell use <database-name>;
例如,
code language-shell use magento;
-
從刪除所有列
cron_schedule
資料庫表格:code language-shell TRUNCATE TABLE cron_schedule;
-
從瀏覽器執行cron:
code language-shell http[s]://<Commerce hostname or ip>/cron.php?group=default
例如:
code language-shell http://magento.example.com/cron.php?group=default
-
出現提示時,輸入授權使用者的名稱和密碼。 下圖顯示一個範例。
-
確認資料列已新增至表格:
code language-shell SELECT * from cron_schedule; mysql> SELECT * from cron_schedule; +-------------+-----------------------------------------------+---------+----------+---------------------+---------------------+-------------+-------------+ | schedule_id | job_code | status | messages | created_at | scheduled_at | executed_at | finished_at | +-------------+-----------------------------------------------+---------+----------+---------------------+---------------------+-------------+-------------+ | 1 | catalog_product_outdated_price_values_cleanup | pending | NULL | 2017-09-27 14:24:17 | 2017-09-27 14:24:00 | NULL | NULL | | 2 | sales_grid_order_async_insert | pending | NULL | 2017-09-27 14:24:17 | 2017-09-27 14:24:00 | NULL | NULL | | 3 | sales_grid_order_invoice_async_insert | pending | NULL | 2017-09-27 14:24:17 | 2017-09-27 14:24:00 | NULL | NULL | | 4 | sales_grid_order_shipment_async_insert | pending | NULL | 2017-09-27 14:24:17 | 2017-09-27 14:24:00 | NULL | NULL | | 5 | sales_grid_order_creditmemo_async_insert | pending | NULL | 2017-09-27 14:24:17 | 2017-09-27 14:24:00 | NULL | NULL | | 6 | sales_send_order_emails | pending | NULL | 2017-09-27 14:24:17 | 2017-09-27 14:24:00 | NULL | NULL | | 7 | sales_send_order_invoice_emails | pending | NULL | 2017-09-27 14:24:17 | 2017-09-27 14:24:00 | NULL | NULL | | 8 | sales_send_order_shipment_emails | pending | NULL | 2017-09-27 14:24:17 | 2017-09-27 14:24:00 | NULL | NULL | | 9 | sales_send_order_creditmemo_emails | pending | NULL | 2017-09-27 14:24:17 | 2017-09-27 14:24:00 | NULL | NULL | | 10 | newsletter_send_all | pending | NULL | 2017-09-27 14:24:17 | 2017-09-27 14:25:00 | NULL | NULL | | 11 | captcha_delete_old_attempts | pending | NULL | 2017-09-27 14:24:17 | 2017-09-27 14:30:00 | NULL | NULL | | 12 | captcha_delete_expired_images | pending | NULL | 2017-09-27 14:24:17 | 2017-09-27 14:30:00 | NULL | NULL | | 13 | outdated_authentication_failures_cleanup | pending | NULL | 2017-09-27 14:24:17 | 2017-09-27 14:24:00 | NULL | NULL | | 14 | magento_newrelicreporting_cron | pending | NULL | 2017-09-27 14:24:17 | 2017-09-27 14:24:00 | NULL | NULL | +-------------+-----------------------------------------------+---------+----------+---------------------+---------------------+-------------+-------------+ 14 rows in set (0.00 sec)
從網頁瀏覽器執行cron
您可以隨時使用網頁瀏覽器執行cron,例如在開發期間。
如果您使用Apache Web Server,您必須從 .htaccess
檔案中執行cron:
-
以具有寫入Commerce檔案系統許可權的使用者身分登入您的Commerce伺服器。
-
在文字編輯器中開啟下列任一專案(視您的Magento進入點而定):
code language-text <magento_root>/pub/.htaccess <magento_root>/.htaccess
-
刪除或註解下列專案:
code language-conf ## Deny access to cron.php <Files cron.php> order allow,deny deny from all </Files>
例如,
code language-conf ## Deny access to cron.php #<Files cron.php> # order allow,deny # deny from all #</Files>
-
儲存變更並退出文字編輯器。
然後您可以在網頁瀏覽器中執行cron,如下所示:
code language-text <your hostname or IP>/<Commerce root>/pub/cron.php[?group=<group name>]
其中:
-
<your hostname or IP>
是Commerce安裝的主機名稱或IP位址 -
<Commerce root>
是您安裝Commerce軟體的網頁伺服器docroot相對目錄您用來執行Commerce應用程式的確切URL取決於您設定Web伺服器和虛擬主機的方式。
-
<group name>
是任何有效的cron群組名稱(選擇性)
例如,
https://magento.example.com/magento2/pub/cron.php?group=index