使用 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 创建的视频教程,该教程将引导您完成所有重要步骤。在 Vimeo 或 YouTube 上观看。
设置 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 所需的工具。只需转到下载部分并获取 PuTTY、Plink、Pageant 和 PuTTYgen。
创建 OpenSSH 证书
下一步是创建用于身份验证的密钥对。有两种可能的方法来创建密钥。第一种是在客户端上使用 PuTTYgen 创建密钥,将公钥上传到您的服务器,并使用 PuTTY 的私钥。另一种是使用 OpenSSH 工具 ssh-keygen 创建密钥对,将私钥下载到您的客户端,并将私钥转换为 PuTTY 样式的私钥。
使用 ssh-keygen 创建密钥
以 root
或 svnuser
身份登录到服务器并键入
ssh-keygen -b 1024 -t dsa -N passphrase -f keyfile
替换为真实的密码短语(只有您知道)和密钥文件。我们刚刚创建了一个具有 1024 位密钥短语的 SSH2 DSA 密钥。如果您键入
ls -l keyfile*
您将看到两个文件,keyfile 和 keyfile.pub。您可能猜到,.pub 文件是公钥文件,另一个是私钥文件。
将公钥附加到 svnuser
主目录中的 .ssh 文件夹中的那些密钥
cat keyfile.pub >> /home/svnuser/.ssh/authorized_keys.
为了使用我们生成的私钥,我们必须将其转换为 putty 格式。这是因为私钥文件格式没有由标准机构指定。将私钥文件下载到您的客户端 PC 后,启动 PuTTYgen 并使用 Conversions -> Import key 浏览到您从服务器获得的 keyfile 文件,输入您在创建密钥时使用的密码短语。最后,单击 Save private key 并将文件另存为 keyfile.PPK。
使用 PuTTYgen 创建密钥
使用 PuTTYgen 生成公钥/私钥对并保存它。将公钥复制到服务器并将其附加到 svnuser
主目录中的 .ssh 文件夹中的那些密钥
cat keyfile.pub >> /home/svnuser/.ssh/authorized_keys
使用 PuTTY 测试
为了测试连接,我们将使用 PuTTY。启动程序,在 Session 选项卡上,将主机名设置为您的服务器的名称或 IP 地址,协议设置为 SSH,并将会话另存为 SvnConnection
或您喜欢的任何名称。在 SSH 选项卡上,将首选 SSH 协议版本设置为 2,并从 Auth 设置您之前转换的 .PPK
私钥文件的完整路径。返回 Sessions 选项卡并点击 Save 按钮。您现在将在已保存会话列表中看到 SvnConnection
。
单击 Open,您应该会看到一个 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 -> Repo-Browser。系统将提示您输入 URL,因此输入以下形式的 URL
svn+ssh://svnuser@SvnConnection/repos
此 URL 是什么意思?Schema 名称是 svn+ssh
,它告诉 TortoiseSVN 如何处理对服务器的请求。在双斜杠之后,您指定要连接到服务器的用户,在本例中为 svnuser
。在 @
之后,我们提供我们的 PuTTY 会话名称。此会话名称包含所有详细信息,例如在哪里可以找到私钥以及服务器的 IP 或 DNS。最后,我们必须提供仓库的路径,该路径相对于服务器上的仓库根目录,如 authorized_keys 文件中所指定。
单击 OK,您应该能够浏览仓库内容。如果是这样,您现在已经有一个与 TortoiseSVN 结合使用的正在运行的 SSH 隧道。
请注意,默认情况下,TortoiseSVN 使用其自己的 Plink 版本进行连接。这避免了每次身份验证尝试都弹出控制台窗口,但也意味着没有地方显示错误消息。如果您收到错误 无法写入标准输出
,您可以尝试在 TortoiseSVN 的网络设置中将 Plink 指定为客户端。这将允许您查看 Plink 生成的真实错误消息。
SSH 配置变体
简化 TortoiseSVN 中 URL 的一种方法是在 PuTTY 会话中设置用户。为此,您必须在 PuTTY 中加载您已定义的会话 SvnConnection
,并在 Connection 选项卡中将 Auto login user 设置为用户名,例如 svnuser
。像以前一样保存您的 PuTTY 会话,并在 TortoiseSVN 中尝试以下 URL
svn+ssh://SvnConnection/repos
这次我们仅将 PuTTY 会话 SvnConnection
提供给 TortoiseSVN 使用的 SSH 客户端 (TortoisePlink.exe)。此客户端将检查会话以获取所有必要的详细信息。
在撰写本文时,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
。