gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 14:11:24 26 4
gpt4 key购买 nike

如何在只能通过SVN + SSH访问的Linux服务器上设置SVN存储库?应该有不同的用户,所有用户都应该只能使用SVN,因此不应将其登录到服务器,并且应禁止没有SSH的SVN。

最佳答案

为确保一切正常,我在具有Subversion命令行客户端1.8.8版的ubuntu 14.04服务器(用于托管)和一台ubuntu 16.04便携式计算机(用于使用SVN)上遵循以下确切说明。 [稍后,我已经使用Ubuntu 18.04.3 LTS服务器和客户端(即,两台计算机具有相同的当前操作系统)进行了测试/确认。

步骤1:定义用户。

假设我们有两个将要使用SVN的用户。我们将必须在计算机上为这些用户定义本地帐户,以便将它们放入一个公共(public)组。这是授予组对存储库的写访问权限所必需的,否则提交将不起作用。我们还将看到如何防止这些用户登录服务器(因为我们只希望他们作为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
chown -R SSH-USER /home/SSH-USER/SVN
chmod -R 770 /home/SSH-USER/SVN

最后两个命令从“其他”获得所有权限,并向所有者(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

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

首先,我们编辑SVN的“主要配置文件”:/home/SSH-USER/SVN/conf/svnserve.conf。在这里,确保文件包含以下三行:
anon-access = none
auth-access = write
authz-db = authz

一些注意事项:文件中已经存在所有三行,但已将其注释掉。但是,第一行默认会授予匿名就绪访问权限,因此我们将其从“读取”更改为“无”。此外,在大多数指令中,要求取消注释“#password-db = passwd”行。但是,我们不需要这样做,因为我们仅授予SVN + SSH访问权限,因此不使用密码。

激活了身份验证文件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的用户添加公共(public)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

现在,用以下内容填充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

对于不熟悉authorized_keys文件的用户,请注意,local-username-on @ client-pc-of-USER-i只是用于管理/标记不同条目(即用户名和机器)的标签,因此“信息”放在这里不会错。此外,PUBLIC-KEY-OF-USER-i是实际密钥,即在该用户各自的公共(public)密钥文件中找到的很长的String。

现在,两个用户都可以使用以下命令访问SVN:“svn checkout svn + ssh:// SSH-USER @ SERVER-URL / SVN”。请注意,由于先前设置的限制,USER-1仅可以访问文件夹1,而USER-2仅可以访问文件夹2。此外,由于svnserve命令将/ home / SSH-USER定义为SVN的根目录,因此checkout命令不需要(或允许使用)完整路径,而只需使用/ home / SSH-USER之后的所有内容(即,该文件夹需要以/ SVN开头)。

步骤5:微调(可选)。

还有一些可选的但方便的事情:

(1)给予USER-1和USER-2较少的权限。
(2)不允许USER-1和USER-2通过SSH在服务器上登录。
(3)允许SSH用户登录SSH(用于配置目的)。

(1)
对于大多数教程/等等。我发现,建议在访问控制中添加“无端口转发,无代理转发,无X11转发,无虚假”以限制各自的权限。请您自己搜索,限制条件。然后,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

(2)
我们必须创建本地用户USER-1和USER-2,以便他们能够获得对存储库的写访问权。但是,我们不希望它们能够连接到服务器(以运行程序等)。当然,我们不能只告诉他们他们的密码,但是显然有一种更好的方法。为此,请考虑问题 https://serverfault.com/questions/538915/prevent-user-access-to-console-but-still-allow-svnssh-access-to-svn-repos

(3)
由于已在登录时执行svnserve命令,因此无法再使用SSH-USER身份,因此不能再使用authorized_keys文件中使用的所有SSH密钥通过SSH登录。因此,如果您仍然希望能够以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)。这里给出了一个很好的解决方案: how to login via ssh if "svnserve -t" is given in authorized_keys?

关于svn - 如何为多个用户设置svn + ssh?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41323235/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com