2016-04-26 86 views
0

我需要同步從主服務器到從服務器的資源。我使用rsync,因爲它可以使用增量文件列表遞歸地同步文件夾。我已經能夠使用ssh-keys以最簡單的方式工作。一切都很好,但它不能通過php shell_exec函數。這是我迄今爲止所做的,以及我陷入困境的地方。幫助將不勝感激!通過php/linux同步服務器之間的資源的安全方式

主從服務器上的Ubuntu用戶的主目錄中14.04.4

創作中的SSH密鑰文件夾。沒有密碼

ssh-keygen -f ~/.ssh/id_rsa -q -P "" 

不確定從屬服務器可以接收主SSH密鑰

// log in slave server 
mkdir ~/.ssh 
chmod 0700 ~/.ssh 
touch ~/.ssh/authorized_keys 
chmod 0644 ~/.ssh/authorized_keys 

複製公鑰到從服務器的私人/公共SSH密鑰的

mkdir ~/.ssh 
chmod 0700 ~/.ssh 

創建(其中我想同步資源)

// log in master server 
su ssh-copy-id -i ~/.ssh/id_rsa.pub [slave user]@[slave host] 

現有文件夾的測試同步...讓我們說WWW/JS/

rsync -avz -e "ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" --progress ~/www/js/ [slave user]@[slave host]:~/www/js/ 

耶,一切工作正常。

我登錄從服務器,遞歸地刪除www/js文件夾。

我登錄主服務器上

我創建了一個簡單的PHP腳本來測試它是否內爲「shell命令」

test.php的工作

var_dump(shell_exec('rsync -avz -e "ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" --progress ~/www/js/ [slave user]@[slave host]:~/www/js/')); 

同步不從PHP工作。可能是因爲php運行寬度www-data用戶?我怎樣才能使它從pĥp安全地工作?

+0

您可以使用rsync,也可以將主目錄存儲在通用文件夾中,並將它們安裝到每臺服務器上。 – mkaatman

+1

您的主變量'〜'可能無法正確擴展。嘗試完整路徑 –

+0

在我的情況下,從服務器就像內容交付。安裝一個通用文件夾可以,但在我的情況下,php創建或更新資源,然後必須在從屬服務器上同步它們,並且php必須繼續運行。因此,必須從php中啓動同步。 – Simmoniz

回答

0

**編輯:這個答案是不安全的。請看到我的其他答案**


我終於找到了如何使它工作

複製私有SSH密鑰到www數據的主文件夾。那麼PHP將可以通過了shell_exec功能

www數據的主文件夾是/ var/WWW /(在我的情況的Ubuntu 14)

創建與rsync。如果不存在

mkdir /var/www/.ssh 
chown www-data /var/www/.ssh 
chmod 0700 /var/www/.ssh 

複製SSH密鑰,並設置適當的權限

SSH文件夾
cp ~/.ssh/id_rsa /var/www/.ssh 
chown www-data /var/www/.ssh/id_rsa 
chmod 0600 /var/www/.ssh/id_rsa 

該行現在對我的作品:

shell_exec('rsync -avz -e "ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" --progress [absolute_path]/www/js/ [slave user]@[slave host]:~/www/js/'); 

如果幫助別人......

但是由於我在安全方面知道很多,但不能說我是專家,我不知道這是否安全?

+0

不,這不安全。您應該儘量減少web服務器uid可以寫入的內容。儘管這本身並不是一個漏洞,但它爲其他人提供了一種手段讓別人接管你的兩臺服務器。最簡單的解決方案(假設您擁有root用戶訪問權限)是爲其他用戶設置SSH訪問權限,並通過PHP從sudo(如果需要)調用它。但是這也意味着如果你還沒有權限模型,你需要一個權限模型。 – symcbean

+0

在我的情況下,後端實際上都是sercure,運行很長時間,並且已經過很好的測試。在php創建/更新/ rsync資源之前執行正確的認證和授權。但正如你所說,如果PHP通過其他用戶調用它,小雞可以找到無論如何...... – Simmoniz

+0

這是一個非常天真的計算機安全觀點。 – symcbean

0

正如symcbean所建議的,我之前的回答是安全風險。 使萬維網數據能夠無密碼地訪問遠程主機可能是非常危險的。一個更好的方法是設置一個linux用戶,可以說「wwwsync」,它將處理遠程主機的rsync,並讓www-data在「wwwsync user」下執行rsync。這樣,我們可以通過設置wwwsync用戶可以或不可以執行的操作來控制/保護rsync。

創建一個將處理同步的Linux用戶(讓我們說wwwsync),並在用戶的主目錄中創建ssh-key文件夾。

// log as root user  
adduser wwwsync 
// log as wwwsync 
su wwwsync 
// create ssh folder for ssh key creation 
mkdir ~/.ssh 
chmod 0700 ~/.ssh 

創建無密碼

ssh-keygen -f ~/.ssh/id_rsa -q -P "" 

不確定從屬服務器可以接收主SSH密鑰

// log in slave server 
mkdir ~/.ssh 
chmod 0700 ~/.ssh 
touch ~/.ssh/authorized_keys 
chmod 0644 ~/.ssh/authorized_keys 

複製公鑰的私有/公共SSH密鑰的到從屬服務器(我想要同步的地方) ressources)

// log in master server as wwwsync 
su ssh-copy-id -i ~/.ssh/id_rsa.pub [slave user]@[slave host] 

製作www數據用戶(PHP)能夠在wwwsync用戶執行的rsync

// log in as root 
su root 
// edit sudo configuration 
sudo visudo 
// add this line at the bottom of the file 
www-data ALL=(wwwsync) NOPASSWD: /usr/bin/rsync 

這條線將隨後從PHP

shell_exec('rsync -H -u wwwsync -avz -e "ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" --progress ~/www/js/ [slave user]@[slave host]:~/www/js/') 

正常工作下一步重要步驟:確保wwwsync擁有正確的權限t,根據您的需要,所以www-data不會將不需要的資源同步到您的遠程服務器。

相關問題