如何在只能通过 SVN+SSH 访问的 linux 服务器上设置 SVN 存储库?应该有不同的用户,所有用户都应该能够使用SVN,所以他们不应该登录服务器,应该禁止没有SSH的SVN。
为了确保一切正常,我在带有 Subversion 命令行客户端、版本 1.8.8 和 ubuntu 16.04 笔记本电脑(用于使用 SVN)的 ubuntu 14.04 服务器(用于托管)上遵循这些确切的说明。[很久以后,我用 Ubuntu 18.04.3 LTS 服务器和客户端测试/确认了这一点(即,两台计算机具有相同的当前操作系统)。]
第 1 步:定义用户。
假设我们有两个不同的用户将使用 SVN。我们必须在机器上为这些用户定义本地帐户,以便能够将他们放入一个公共组中。这是授予组对存储库的写访问权限所必需的,否则提交将不起作用。我们还将看到如何阻止这些用户登录服务器(因为我们只希望他们作为 SVN 用户;本地帐户只是用于此目的的一种不可避免的手段)。由于 svn+ssh 需要 SSH 登录,我们需要一个额外的用户来连接机器。所以,我们有:
USER-1 (to access SVN)
USER-2 (to access SVN)
SSH-USER (to connect to the server)
SVN-GROUP (a group with members USER-1 and USER-2)
Run Code Online (Sandbox Code Playgroud)
在命令中,即:
adduser USER-1
adduser USER-2
adduser SSH-USER
groupadd SVN-GROUP
sudo usermod -aG SVN-GROUP USER-1
sudo usermod -aG SVN-GROUP USER-2
Run Code Online (Sandbox Code Playgroud)
要检查一切是否正确,您可以通过以下方式列出组及其成员(如如何列出 Linux 组中的所有用户中所述? - 如果您觉得有用的话,就像那个答案/回复一样):
awk -F: '/^SVN-GROUP/ {print $4;}' /etc/group
Run Code Online (Sandbox Code Playgroud)
第 2 步:创建 SVN 并填充内容。
首先,我们使用用于登录服务器的用户 SSH-USER 登录服务器。然后,我们为 SVN 创建一个空文件夹,然后用一个空的 SVN 填充它,然后设置权限,以便组中的每个人都具有完全访问权限。
mkdir /home/SSH-USER/SVN
svnadmin create /home/SSH-USER/SVN
chgrp -R SVN-GROUP /home/SSH-USER/SVN
chown -R SSH-USER /home/SSH-USER/SVN
chmod -R 770 /home/SSH-USER/SVN
Run Code Online (Sandbox Code Playgroud)
最后两个命令从“其他人”那里获得所有权限,并将读/写/执行权限授予所有者(SSH-USER)和组(SVN-GROUP)。我已经对其进行了测试:仅使用读/写权限是不够的。然而,我们可以给所有者 0(无权限),因为我们只需要他登录,而不是提交或阅读或任何东西。但是,如果我们想删除该用户的整个SVN,我们不应该窃取他的权利。
尽管还没有配置访问控制,我们现在已经可以用内容填充它了。这样做的原因是本地用户 SSH-USER 可以直接提交更改,即使 SVN 访问配置(我们尚未触及)确实禁止它。我们只添加两个空文件夹:
svn mkdir file:///home/SSH-USER/SVN/folder1
svn mkdir file:///home/SSH-USER/SVN/folder2
Run Code Online (Sandbox Code Playgroud)
第三步:配置SVN访问控制。
首先,我们编辑SVN的“主配置文件”:/home/SSH-USER/SVN/conf/svnserve.conf。在这里,确保文件包含以下三行:
anon-access = none
auth-access = write
authz-db = authz
Run Code Online (Sandbox Code Playgroud)
一些注意事项:所有三行都已存在于文件中,但已注释掉。然而,第一行默认授予匿名就绪访问,因此我们将其从“读取”更改为“无”。此外,在大多数指令中,要求取消注释“#password-db = passwd”这一行。但是我们不需要这个,因为我们只授予 SVN+SSH 访问权限,所以不使用密码。
激活身份验证文件 authz 后,我们现在使用它来设置哪个用户可以访问哪个文件夹。因此,请确保文件 authz 包含以下几行:
[groups]
SVN-GROUP = USER-1,USER-2
[/]
* =
@SVN-GROUP = rw
Run Code Online (Sandbox Code Playgroud)
首先,请注意 authz 文件中使用的组名只是以与我们在服务器上的组相同的方式选择以保持一致性。您可以选择任何您想要的组名。用户,在另一侧,具有比服务器上的本地用户相同。根据上面的定义,两个用户都拥有对整个存储库的完全访问权限,其他用户没有任何访问权限。可以通过简单地添加更多内容来添加更多特定权利,例如:
[/folder1]
USER-1 = rw
USER-2 =
[/folder2]
USER-1 =
USER-2 = rw
Run Code Online (Sandbox Code Playgroud)
第 4 步:设置对服务器的访问。
首先,我们需要创建一个文件夹“.ssh”,然后为所有想要访问 SVN 的用户添加公共 SSH 密钥。但是,个人用户不会使用他们的个人帐户登录,而是使用用户 SSH-USER 的帐户。这样,我们就有了一个管理访问的文件。当其中一个用户登录(使用 SSH-USER 的帐户)时,ssh 访问文件会将该用户更改为相应的本地用户。
mkdir /home/SSH-USER/.ssh
touch /home/SSH-USER/.ssh/authorized_keys
nano /home/SSH-USER/.ssh/authorized_keys
Run Code Online (Sandbox Code Playgroud)
现在用以下内容填充authorized_keys:
command="svnserve -t -r /home/SSH-USER --log-file=/home/SSH-USER/SVN/svnlog.txt --tunnel-user=USER-1 --config-file=/home/SSH-USER/SVN/conf/svnserve.conf" ssh-rsa PUBLIC-KEY-OF-USER-1 local-username-on@client-pc-of-USER-1
command="svnserve -t -r /home/SSH-USER --log-file=/home/SSH-USER/SVN/svnlog.txt --tunnel-user=USER-2 --config-file=/home/SSH-USER/SVN/conf/svnserve.conf" ssh-rsa PUBLIC-KEY-OF-USER-2 local-username-on@client-pc-of-USER-2
Run Code Online (Sandbox Code Playgroud)
对于不熟悉authorized_keys 文件的用户请注意local-username-on@client-pc-of-USER-i 只是管理/标记不同条目(即用户名和机器)的标签,因此“信息”放在这里不会错。此外,PUBLIC-KEY-OF-USER-i 是实际密钥,即在该用户的相应公钥文件中找到的非常长的字符串。
现在,两个用户都可以使用以下命令访问 SVN:“svn checkout svn+ssh://SSH-USER@SERVER-URL/SVN .”。注意,由于之前设置的限制,USER-1 只能访问folder1,USER-2 只能访问folder2。此外,由于 svnserve 命令将 /home/SSH-USER 定义为 SVN 的根,因此 checkout 命令不需要(或被允许)使用完整路径,而只是 /home/SSH-USER 之后的所有内容(即,文件夹需要以 /SVN 开头)。
第 5 步:微调(可选)。
有一些可选但方便的事情人们仍然想做:
(1) 给予 USER-1 和 USER-2 较少的权限。
(2) 不允许 USER-1 和 USER-2 在服务器上通过 SSH 登录。
(3) 允许 SSH-USER 进行 SSH 登录(用于配置目的)。
(1) 对于大多数教程/等。我发现,建议在访问控制中添加“no-port-forwarding,no-agent-forwarding,no-X11-forwarding,no-pty”以限制各自的权限。请自行搜索,他们限制了什么。然后,authorized_keys 文件将如下所示:
command="svnserve -t -r /home/SSH-USER --log-file=/home/SSH-USER/SVN/svnlog.txt --tunnel-user=USER-1 --config-file=/home/SSH-USER/SVN/conf/svnserve.conf",no-port-forwarding,no-agent-forwarding,no-X11-forwarding,no-pty ssh-rsa PUBLIC-KEY-OF-USER-1 local-username-on@client-pc-of-USER-1
command="svnserve -t -r /home/SSH-USER --log-file=/home/SSH-USER/SVN/svnlog.txt --tunnel-user=USER-2 --config-file=/home/SSH-USER/SVN/conf/svnserve.conf",no-port-forwarding,no-agent-forwarding,no-X11-forwarding,no-pty ssh-rsa PUBLIC-KEY-OF-USER-2 local-username-on@client-pc-of-USER-2
Run Code Online (Sandbox Code Playgroud)
(2) 我们必须创建本地用户 USER-1 和 USER-2,以便他们能够获得对存储库的写访问权限。但是,我们不希望它们能够连接到服务器(运行程序等)。当然,我们不能告诉他们他们的密码,但显然有更好的方法。为此,请考虑问题https://serverfault.com/questions/538915/prevent-user-access-to-console-but-still-allow-svnssh-access-to-svn-repos。
(3) 在authorized_keys 文件中使用的所有SSH 密钥都不能再用于通过SSH 以SSH-USER 身份登录,因为svnserve 命令是在登录时执行的,这阻止了使用控制台。因此,如果您仍然希望能够以 SSH-USER 身份登录,则需要依靠不同的 SSH 密钥登录(并仅使用表达式“ssh-rsa PUBLIC-KEY local-username 将其放入authorized_keys 文件中” -on@client-pc")。如果 PUBLIC-KEY 已在该文件中使用(例如,因为想要以 USER-1 或 USER-2(使用存储库)以及 SSH-USER 身份登录以进行配置),则需要创建第二个SSH 密钥并告诉控制台应该将这个密钥用于 SSH,而不是另一个已经用于 SVN+SSH 的控制台(用于重定向到 USER-1 或 USER-2)。如果authorized_keys 中给出了“svnserve -t”,如何通过ssh 登录?
| 归档时间: |
|
| 查看次数: |
3083 次 |
| 最近记录: |