如何为多个用户设置svn + ssh?

时间:2016-12-25 17:41:13

标签: svn ssh

如何在只能通过SVN + SSH访问的linux服务器上设置SVN存储库?应该有不同的用户,所有这些用户都应该能够使用SVN,所以不应该登录服务器,不应该禁止没有SSH的SVN。

1 个答案:

答案 0 :(得分:4)

为了确保一切正常,我在ubuntu 14.04服务器(用于托管)上使用Subversion命令行客户端版本1.8.8和ubuntu 16.04笔记本电脑(用于使用SVN)遵循这些确切说明。 / p>

第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)

在命令中,即:

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

要检查一切是否正确,您可以通过以下方式列出群组及其成员(如How to list all users in a Linux group?中所述 - 如果您认为有用的答案/回复):

awk -F: '/^SVN-GROUP/ {print $4;}' /etc/group

第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
chmod -R 770 /home/SSH-USER/SVN

最后一个命令获取"其他"的所有权利。并为所有者(SSH-USER)和组(SVN-GROUP)提供读/写/执行权限。我测试过它:仅使用读/写权限是不够的。但是,我们可以给所有者0(没有权利),因为我们只需要他登录,不要提交或阅读或任何东西。但是,如果我们想要删除该用户的整个SVN,我们就不应该窃取他的权利。

尽管尚未配置访问控制,我们现在可以用内容填充它。这样做的原因是本地用户SSH-USER可以直接提交更改,即使SVN访问配置(我们尚未触摸)也禁止更改。我们只添加两个空文件夹:

 svn mkdir file:///home/sshuser/SVN/folder1
 svn mkdir file:///home/sshuser/SVN/folder2

步骤3:配置SVN访问控制。

首先,我们编辑"主配置文件" SVN:/home/SSH-USER/SVN/conf/svnserve.conf。在这里,确保该文件包含以下三行:

anon-access = none
auth-access = write
authz-db = authz

一些注意事项:文件中已经存在所有三行,但已注释掉。但是,第一行默认授予匿名就绪访问权限,因此我们从" read"到"无"。此外,在大多数指令中,要求一个人取消注释该行"#password-db = passwd"。但是,我们不需要这个,因为我们只授予SVN + SSH访问权限,因此不使用密码。

激活authentification文件authz后,我们现在用它来设置哪个用户可以访问哪个文件夹。因此,请确保文件authz包含以下行:

[groups]
SVN-GROUP = USER-1,USER-2
[/]
* =
@SVN-GROUP = rw

首先,请注意,authz文件中使用的组名称的选择方式与服务器上的组相同,以保持一致性。您可以选择所需的任何组名。另一方面,的用户与服务器上的本地用户相同。根据上面的定义,两个用户都可以完全访问整个存储库,其他任何用户都无权访问。只需添加更多内容即可添加更多特定权限,例如:

[/folder1]
USER-1 = rw
USER-2 = 
[/folder2]
USER-1 = 
USER-2 = rw

第4步:设置对服务器的访问权限。

首先,我们需要创建一个文件夹" .ssh"然后为要访问SVN的所有用户添加公共SSH密钥。但是,个人用户不会使用他们的个人帐户登录,但他们将使用用户SSH-USER的帐户。这样,我们就有一个管理访问权限的文件。当其中一个用户登录(使用SSH-USER帐户)时,ssh访问文件会将该用户更改为相应的本地用户。

mkdir /home/SSH-USER/.ssh
touch authorized_keys
nano authorized_keys

现在使用以下内容填写authorized_keys:

command="svnserve -t -r /home/SSH-USER/SVN --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/SVN --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

现在,两个用户都可以使用以下命令访问SVN:" svn checkout svn + ssh:// SSH-USER @ SERVER-URL / folderX。" X为1或2.请注意,由于先前设置的限制,USER-1只能访问folder1,USER-2只能访问folder2。此外,由于svnserve命令将/ home / SSH-USER / SVN定义为SVN的根,因此checkout命令不需要(或被允许)使用完整路径,但只需在/ home / SSH-USER之后的所有内容/ SVN。出于某种原因,检查根文件夹是不可能的,即" svn checkout svn + ssh:// SSH-USER @ SERVER-URL"不管用。但是,在服务器上本地执行相同操作确实有效。 (如果有人可以评论为什么会出现这种情况,或者甚至是如何解决它,我将不胜感激。)

第5步:微调(可选)。

有一些可选但很方便的事情仍然可以做:

(1)减少对USER-1和USER-2的权利 (2)不允许USER-1和USER-2通过服务器上的SSH登录 (3)允许SSH登录SSH-USER(用于配置)。

(1) 对于大多数教程/等。我发现,建议添加" no-port-forwarding,no-agent-forwarding,no-X11-forwarding,no-pty"访问控制以限制各自的权限。请自己搜索,他们有什么限制。然后,authorized_keys文件将如下所示:

command="svnserve -t -r /home/SSH-USER/SVN --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/SVN --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

(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将其放入authorized_keys文件中本地用户名上@客户PC&#34)。如果PUBLIC-KEY已经在该文件中使用(例如,因为想要以USER-1或USER-2(使用存储库)和SSH-USER进行配置登录,则需要创建第二个SSH密钥并告诉控制台应该使用这个用于SSH而不是另一个已经用于SVN + SSH的控制台(用于重定向到USER-1或USER-2)。这里给出了一个很好的解决方案:how to login via ssh if "svnserve -t" is given in authorized_keys?