重要數據的丟失可能意味著致命的破壞。盡管如此,還是有無數專業人員忽視了對他們的數據的備份。雖然原因可能各不相同,但是,最常見的一個解釋是,執行例行備份確實煩瑣。由於機器擅長於完成普通而重復的任務,因此,自動化備份的過程是降低工作內在的枯燥性和人們與生俱來的拖延傾向的關鍵所在。 如果您使用 Linux,那麼您就已經可以使用那些創建定制備份解決方案的極其強大的工具。本文中的方案,可以讓您使用幾乎每個 Linux 發行版本都附帶的開放源代碼工具來執行從簡單的到更高級而且安全的網絡備份。
簡單備份 本文按照一步一步的方法來進行講述,只要您遵循那些基本的步驟,此方法會是非常直觀的。 在研究更高級的分布式備份解決方案之前,讓我們首先來看一個簡單而強大的存檔機制。讓我們來分析一個名為 arc 的方便的腳本,它可以讓我們在 Linux shell 提示符中創建備份快照。 清單 1. arc shell 腳本 #!/bin/sh tar czvf $1.$(date +%Y%m%d%-H%M%S).tgz $1 exit $? arc 腳本接收一個單獨的文件或目錄名作為參數,創建一個壓縮的存檔文件,同時將當前日期嵌入到生成的存檔文件的名字之中。例如,如果您有一個名為 beoserver 的目錄,您可以調用 arc 腳本,將 beoserver 目錄名傳遞給它以創建一個壓縮的存檔文件,如: beoserver.20040321-014844.tgz 使用 date 命令是為了嵌入一個日期和時間戳以幫助您組織存檔文件。日期的格式是年、月、日、小時、分、秒 —— 雖然秒域的使用有一些多余。查看 data 命令的手冊( man date)來了解其他選項。另外,在清單 1 中,我們向 tar 傳遞了 -v(verbose)選項。這就使得 tar 顯示出它正在存檔的文件。如果您喜歡靜默地進行備份,那麼刪除這個 -v 選項。 清單 2. 存檔 beoserver 目錄 $ ls arc beoserver $ ./arc beoserver beoserver/ beoserver/bookl.dat beoserver/beoserver_ab_off beoserver/beoserver_ab_on $ ls arc beoserver beoserver.20040321-014844.tgz
高級備份 這個簡單備份是實用的;不過,它仍然包含一個人工備份的過程。行業最佳經驗通常建議將數據備份到多個媒體上,並備份到分開的不同地理位置。中心思想是避免依賴於任何一個單獨的存儲媒體或單獨的位置。 在下一個例子中我們將應對這一挑戰,我們將分析一個如圖 1 所示的假想的分布式網絡,它展示了對兩台遠程服務器和一台離線存儲服務器的系統管理。 圖 1. 分布式網絡 服務器 #1 和 #2 上的備份文件將安全地傳輸到離線存儲服務器上,而且整個分布式備份過程將在沒有人工干涉的情況下定期進行。我們將使用一組標准的工具(開放安全 shell 工具套件(OpenSSH)的一部分),以及磁帶存檔器(tar)和 cron 任務調度服務。我們的全部計劃是,使用 cron 進行調度,使用 shell 程序和 tar 應用程序完成備份過程,使用 OpenSSH 安全 shell(ssh)加密進行遠程訪問、認證、安全 shell 拷貝(scp)以自動完成文件傳輸。要獲得另外的資料請務必查看每個工具的手冊。 使用公鑰/私鑰進行安全的遠程訪問 在數字安全的上下文中,密鑰(key)指的是用來加密或解密其他數據片斷的一個數據片斷。公鑰私鑰模式的有趣之處在於,使用公鑰加密的數據,只有用相應的私鑰才可以解密。您可以自由地發布一個公鑰,這樣別人就可以對發送給您的消息進行加密。公鑰/私鑰模式徹底改變了數字安全的原因之一是,發送者和接收者不必再共享一個通用的密碼。除了其他方面的貢獻,公鑰/私鑰加密使用電子商務和其他安全傳輸成為可能。在本文中,我們將創建並使用公鑰和私鑰來創建一個非常安全的分布式備份解決方案。 要進行備份過程的每台機器都必須運行 OpenSSH 安全 shell 服務(sshd),同時讓 22 端口可以通過任何內部防火牆被訪問。如果您訪問遠程的服務器,那麼很有可能您正在使用安全 shell。 我們的目標將是,不需要人工提供密碼就可以安全地訪問機器。一些人認為最簡單的辦法是設置無密碼的訪問:不要這樣做。這樣做不安全。不用那樣,本文中我們將使用的方法可能會占用您大約一個小時的時間,建立起一個與使用“無密碼”帳號同樣方便的系統 —— 不過它是公認非常安全的。 讓我們首先確保 OpenSSH 已經安裝,接下來查看它的版本號。完成本文時,最新的發行的 OpenSSH 是 2004 年 2 月 24 日發布的版本 3.8。您應該考慮使用一個較新的而且穩定的發布版本,至少所用的版本應該要比版本 2.x 新。訪問 OpenSSH Security 網頁以獲得關於特定舊版本的缺陷的細節(請參閱本文後面的 參考資料 中的鏈接)。到目前為止,OpenSSH 是非常穩定的,而且已經證明不存在其他 SSH 工具所報告的很多缺陷。 在 shell 提示符中,輸入 ssh 並給出重要的 V 選項來檢查版本號: $ ssh -V OpenSSH_3.5p1, SSH protocols 1.5/2.0, OpenSSL 0x0090701f 如果 ssh 返回的版本號大於 2.x,則機器處於相對良好的狀態。無論如何,建議您所有的軟件都使用最新的穩定版本,這對於安全相關的軟件來說尤其重要。 我們的第一個步驟是,使用將會有特權訪問服務器 1 和 2 的帳號登錄到離線存儲服務器機器(見圖 1)。 $ ssh
[email protected] 登錄到離線存儲服務器以後,使用 ssh-keygen 程序並給出 -t dsa 選項來創建一個公鑰/密鑰對。 -t 選項是必須的,用來指定我們要生成的密鑰類型。我們將使用數字簽名算法(Digital Signature Algorithm,DSA),它讓我們可以使用更新的 SSH2 協議。參閱 ssh-keygen 手冊以獲得更多細節。 在 ssh-keygen 執行的過程中,在詢問您口令(passphrase)之前,將提示您輸入 ssh 密鑰存儲的位置。當詢問在何處存儲密鑰時只需要按下回車鍵,然後 ssh-keygen 程序將創建一個名為 .ssh 的隱藏目錄(如果原來不存在),以及兩個文件,一個公鑰文件和一個私鑰文件。 ssh-keygen 的一個有趣特性是,當提示輸入一個口令時,它讓您可以只是簡單地按下回車鍵。如果您沒有給出口令,那麼 ssh-keygen 將生成沒有加密的密鑰!如您所想,這不是個好主意。當要求輸入口令時,確保輸入一個足夠長的字符消息,最好包含混合字符而不僅僅是一個簡單的密碼字符串。 清單 3. 永遠選擇好的口令 [offsite]:$ ssh-keygen -t dsa Generating public/private dsa key pair. Enter file in which to save the key (/home/accountname/.ssh/id_dsa): Enter passphrase (empty for no passphrase): (enter passphrase) Enter same passphrase again: (enter passphrase) Your identification has been saved in /home/accountname/.ssh/id_dsa. Your public key has been saved in /home/accountname/.ssh/id_dsa.pub. The key fingerprint is: 7e:5e:b2:f2:d4:54:58:6a:fa:6b:52:9c:da:a8:53:1b accountname@offsite 由於 ssh-keygen 生成的 .ssh 目錄是一個隱藏的“dot”目錄,所以要給 ls 命令傳入一個 -a 選項來查看新創建的目錄: [offsite]$ ls -a . .. .bash_logout .bash_profile .bashrc .emacs .gtkrc .ssh 進入隱藏的 .ssh 目錄並列出其內容: [offsite]$ cd .ssh [offsite]$ ls -lrt id_dsa id_dsa.pub 現在,在隱藏的 .ssh 目錄中,我們已經擁有了一個私鑰(id_dsa)和一個公鑰(id_dsa.pub)。您可以使用 vi 或 emacs 等文本編輯工具或者簡單地使用 less 或 cat 命令來分析每個密鑰文件的內容。您將看到由混合字符構成的內容已經經過了 base64 編碼。 然後,我們需要將公鑰拷貝並安裝到服務器 1 和 2 上。不要使用 FTP。更合理的是,使用安全拷貝程序來將公鑰傳送到每一台遠程機器上。 清單 4. 將公鑰安裝到遠程服務器上 [offsite]$ scp .ssh/id_dsa.pub
[email protected]:offsite.pub
[email protected]'s passWord: (enter password, not new passphrase!) id_dsa.pub 100% ***************************** 614 00:00 [offsite]$ scp .ssh/id_dsa.pub
[email protected]:offsite.pub
[email protected]'s password: (enter password, not new passphrase!) id_dsa.pub 100% ***************************** 614 00:00 在安裝完新的公鑰後,我們就可以使用創建私鑰和公鑰時指定的口令來登錄到每一台機器。現在,登錄到每台機器,並將 offsite.pub 文件的內容附加到一個名為 authorized_keys 的文件中,這個文件存儲在每台遠程機器的 .ssh 目錄下。我們可以使用一個文本編輯器或者簡單地使用 cat 命令來將 offsite.pub 文件的內容附加到 authorized_keys 文件: 清單 5. 將 offsite.pub 添加到已授權密鑰列表 [offsite]$ ssh
[email protected] [email protected]'s password: (enter password, not new passphrase!) [server1]$ cat offs