TortoiseSVN Logo

使用 SSH 保護 Svnserve

本節提供逐步指南,說明如何設定 Subversion 和 TortoiseSVN 以使用 svn+ssh 協定。如果您已經使用已驗證的 SSH 連線登入您的伺服器,那麼您已經準備就緒,並且可以在 Subversion 書籍中找到更多詳細資訊。如果您未使用 SSH,但想要使用它來保護您的 Subversion 安裝,本指南提供了一種簡單的方法,該方法不涉及在伺服器上為每個 subversion 使用者建立單獨的 SSH 使用者帳戶。

在此實作中,我們為所有 subversion 使用者建立一個單一的 SSH 使用者帳戶,並使用不同的驗證金鑰來區分真實的 Subversion 使用者。

在本附錄中,我們假設您已經安裝了 subversion 工具,並且已經按照本手冊其他地方的詳細說明建立了一個儲存庫。請注意,與 SSH 一起使用時,您不應將 svnserve 作為服務或守護程式啟動。

這裡的大部分資訊來自 Marc Logemann 提供的教學,該教學已在 tortoisesvn.net 上存檔。Thorsten Müller 提供了關於設定 Windows 伺服器的額外資訊。感謝各位!

您還可以觀看 Maximo Migliari 建立的影片教學,它將帶您完成所有重要的步驟。在 VimeoYouTube 上觀看。

設定 Linux 伺服器

您需要在伺服器上啟用 SSH,這裡我們假設您將使用 OpenSSH。在大多數發行版中,這已經安裝完成。若要找出答案,請輸入以下內容來尋找 ssh 工作

ps xa | grep sshd

需要注意的一點是,如果您從原始碼建置 Subversion 並且沒有為 ./configure 提供任何引數,Subversion 會在 /usr/local 下建立一個 bin 目錄,並將其二進位檔案放置在那裡。如果您想使用與 SSH 的通道模式,您必須知道透過 SSH 登入的使用者需要執行 svnserve 程式和一些其他二進位檔案。因此,要麼將 /usr/local/bin 放入 PATH 變數中,要麼將二進位檔案的符號連結建立到 /usr/sbin 目錄,或任何其他通常在 PATH 中的目錄。

為了檢查一切是否正常,請以目標使用者身分透過 SSH 登入,並透過輸入以下內容來測試 svnserve 是否現在可訪問

which svnserve

建立一個新使用者,我們將使用該使用者來訪問 svn 儲存庫

useradd -m svnuser

請務必授予此使用者對儲存庫的完整存取權限。

設定 Windows 伺服器

安裝 Cygwin SSH 守護程式,或使用 Windows 10 SSH 工具。

建立一個新的 Windows 使用者帳戶 svnuser,我們將使用該帳戶來訪問儲存庫。請務必授予此使用者對儲存庫的完整存取權限。

如果還沒有密碼檔案,請使用 Cygwin 主控台從以下位置建立一個密碼檔案

mkpasswd -l > /etc/passwd

用於 TortoiseSVN 的 SSH 用戶端工具

PuTTY 網站 取得我們在 Windows 用戶端上使用 SSH 所需的工具。只需前往下載區段並取得 PuttyPlinkPageantPuttygen

建立 OpenSSH 憑證

下一步是建立用於驗證的金鑰對。有兩種可能的方法來建立金鑰。第一種是在用戶端上使用 PuTTYgen 建立金鑰,將公鑰上傳到您的伺服器,並將私鑰與 PuTTY 一起使用。另一種是使用 OpenSSH 工具 ssh-keygen 建立金鑰對,將私鑰下載到您的用戶端,並將私鑰轉換為 PuTTY 樣式的私鑰。

使用 ssh-keygen 建立金鑰

rootsvnuser 身分登入伺服器並輸入

ssh-keygen -b 1024 -t dsa -N passphrase -f keyfile

替換為真實的密碼短語 (只有您知道) 和金鑰檔案。我們剛剛建立了一個具有 1024 位元密碼短語的 SSH2 DSA 金鑰。如果您輸入

ls -l keyfile*

您將看到兩個檔案,keyfilekeyfile.pub。您可能猜到,.pub 檔案是公鑰檔案,另一個是私鑰檔案。

將公鑰附加到 svnuser 主目錄中的 .ssh 資料夾中的那些公鑰

cat keyfile.pub >> /home/svnuser/.ssh/authorized_keys
.

為了使用我們產生的私鑰,我們必須將其轉換為 putty 格式。這是因為私鑰檔案格式未由標準機構指定。在您將私鑰檔案下載到您的用戶端 PC 後,啟動 PuTTYgen 並使用轉換 -> 匯入金鑰 瀏覽到您從伺服器取得的檔案 keyfile,即您在建立金鑰時使用的密碼短語。最後,按一下儲存私鑰,並將檔案儲存為 keyfile.PPK

使用 PuTTYgen 建立金鑰

使用 PuTTYgen 產生公鑰/私鑰對並儲存它。將公鑰複製到伺服器,並將其附加到 svnuser 主目錄中的 .ssh 資料夾中的那些公鑰

cat keyfile.pub >> /home/svnuser/.ssh/authorized_keys

使用 PuTTY 測試

為了測試連線,我們將使用 PuTTY。啟動程式,並在連線標籤上將主機名稱設定為您的伺服器的名稱或 IP 位址,將協定設定為 SSH,並將會話儲存為 SvnConnection 或您喜歡的任何名稱。在 SSH 標籤上,將首選 SSH 協定版本設定為 2,並從驗證設定為您先前轉換的 .PPK 私鑰檔案的完整路徑。返回會話標籤並點擊儲存按鈕。您現在將在已儲存的會話列表中看到 SvnConnection

點擊開啟,您應該會看到類似 telnet 的登入提示。使用 svnuser 作為使用者名稱,如果一切順利,您應該直接連線而不會提示輸入密碼。

您可能需要編輯伺服器上的 /etc/sshd_config。如下編輯行,然後重新啟動 SSH 服務。

PubkeyAuthentication yes
PasswordAuthentication no
PermitEmptyPasswords no
ChallengeResponseAuthentication no

使用 TortoiseSVN 測試 SSH

到目前為止,我們僅測試了您可以使用 SSH 登入。現在我們需要確保 SSH 連線實際上可以執行 svnserve。在伺服器上修改 /home/svnuser/.ssh/authorized_keys 如下,以允許多個 subversion 作者使用相同的系統帳戶 svnuser。請注意,每個 subversion 作者都使用相同的登入,但使用不同的驗證金鑰,因此您必須為每個作者新增一行。注意:這一切都在非常長的一行上。

command="svnserve -t -r <ReposRootPath> --tunnel-user=<author>",
         no-port-forwarding,no-agent-forwarding,no-X11-forwarding,
         no-pty ssh-rsa <PublicKey> <Comment>

您需要根據您的設定設定幾個值。

<ReposRootPath> 應替換為包含您的儲存庫的目錄的路徑。這避免了在 URL 中指定完整伺服器路徑的需要。請注意,即使在 Windows 伺服器上,您也必須使用正斜線,例如 c:/svn/reposroot。在下面的範例中,我們假設您在儲存庫根目錄中有一个名為 repos 的儲存庫資料夾。

<author> 應替換為您想要在提交時儲存的 svn 作者。這也允許 svnserve 在 svnserve.conf 中使用其自身的存取權限。

<PublicKey> 應替換為您先前產生的公鑰。

<Comment> 可以是您喜歡的任何註解,但它對於將 svn 作者名稱對應到人員的真實姓名很有用。

在 Windows 檔案總管中的任何資料夾上按一下滑鼠右鍵,然後選取TortoiseSVN -> 儲存庫瀏覽器,系統將提示您輸入 URL,因此輸入以下形式的 URL

svn+ssh://svnuser@SvnConnection/repos

這個 URL 是什麼意思?架構名稱是 svn+ssh,它告訴 TortoiseSVN 如何處理對伺服器的請求。在雙斜線之後,您指定要連線到伺服器的使用者,在本例中為 svnuser。在 @ 之後,我們提供我們的 PuTTY 會話名稱。此會話名稱包含所有詳細資訊,例如在哪裡找到私鑰以及伺服器的 IP 或 DNS。最後,我們必須提供儲存庫的路徑,相對於伺服器上的儲存庫根目錄,如 authorized_keys 檔案中所指定。

點擊確定,您應該能夠瀏覽儲存庫內容。如果是這樣,您現在就有了與 TortoiseSVN 結合使用的執行中 SSH 通道。

請注意,預設情況下,TortoiseSVN 使用其自己的 Plink 版本進行連線。這避免了每次驗證嘗試都彈出主控台視窗,但這也意味著沒有地方顯示錯誤訊息。如果您收到 無法寫入標準輸出 錯誤,您可以嘗試在 TortoiseSVN 的網路設定中指定 Plink 作為用戶端。這將允許您看到 Plink 產生的真實錯誤訊息。

SSH 組態變體

簡化 TortoiseSVN 中 URL 的一種方法是在 PuTTY 會話內部設定使用者。為此,您必須在 PuTTY 中載入您已定義的會話 SvnConnection,並在連線標籤中將自動登入使用者名稱設定為使用者名稱,例如 svnuser。像以前一樣儲存您的 PuTTY 會話,並在 TortoiseSVN 內部嘗試以下 URL

svn+ssh://SvnConnection/repos

這次我們僅向 TortoiseSVN 使用的 SSH 用戶端 (TortoisePlink.exe) 提供 PuTTY 會話 SvnConnection。此用戶端將檢查會話以獲取所有必要的詳細資訊。

在撰寫本文時,PuTTY 不會檢查所有已儲存的組態,因此如果您有多個具有相同伺服器名稱的組態,它將選擇第一個符合的組態。此外,如果您編輯預設組態並儲存它,則不會儲存自動登入使用者名稱。

許多人喜歡使用 Pageant 來儲存他們的所有金鑰。由於 PuTTY 會話能夠儲存金鑰,因此您並非總是需要 Pageant。但是想像一下,您想要儲存多個不同伺服器的金鑰;在這種情況下,您將必須根據您嘗試連線的伺服器不斷編輯 PuTTY 會話。在這種情況下,Pageant 非常有意義,因為當 PuTTY、Plink、TortoisePlink 或任何其他基於 PuTTY 的工具嘗試連線到 SSH 伺服器時,它會檢查 Pageant 持有的所有私鑰以啟動連線。

對於此任務,只需執行 Pageant 並新增私鑰。它應該是與您在上面的 PuTTY 會話中定義的相同的私鑰。如果您使用 Pageant 進行私鑰儲存,您可以刪除對已儲存的 PuTTY 會話中的私鑰檔案的參考。您可以為其他伺服器或當然的其他使用者新增更多金鑰。

如果您不想在每次重新啟動用戶端後重複此程序,您應該將 Pageant 放置在 Windows 安裝的自動啟動群組中。您可以使用完整路徑作為命令列引數將金鑰附加到 Pageant.exe。

連線到 SSH 伺服器的最後一種方法是僅在 TortoiseSVN 內部使用此 URL

svn+ssh://[email protected]/repos
svn+ssh://[email protected]/repos

如您所見,我們不使用已儲存的 PuTTY 會話,而是使用 IP 位址 (或網域名稱) 作為連線目標。我們也提供使用者,但您可能會問如何找到私鑰檔案。由於 TortoisePlink.exe 只是 PuTTY 套件中的標準 Plink 工具的修改版本,因此 TortoiseSVN 也將嘗試 Pageant 中儲存的所有金鑰。

如果您使用最後一種方法,請確保您沒有在 PuTTY 中設定預設使用者名稱。我們收到報告指出 PuTTY 中存在一個錯誤,在這種情況下會導致連線關閉。若要移除預設使用者,只需清除 HKEY_CURRENT_USER\Software\SimonTatham\Putty\Sessions\Default%20Settings\HostName