Ubuntu 搭建 SASL+SVN 服务
本文摘自qaq卟言博客。Ubuntu 搭建 SASL+SVN 服务
前言
前天直播写代码完事了后,向我的svn仓库提交完代码后,闲得无聊就看了一下仓库日志
发现有很多非法错误请求,于是直播的时候就把这个日志监控拦截也补充到我之前的监控中了
也就是在 卟言更新日志 页面中的2026-01-04中提到的实现拦截SVN非法请求
做完了这个功能后,于是乎我就去研究了一下官方的文档说明
选择服务器配置 - 《使用 Subversion 进行版本控制》
发现以下的内容
如果您试图为您的团队设置最简单的服务器,使用普通的 svnserve 安装是最简单、最快的途径。
但是请注意,您的存储库数据将通过网络以明文形式传输。
如果您的部署完全在您公司的局域网或 VPN 内,这不成问题。
如果存储库暴露于开放的互联网,您可能需要确保存储库的内容不敏感(例如,它只包含开源代码),
或者您需要付出额外努力来配置 SASL 以加密网络通信。
好家伙根本就没有加密数据内容,好家伙合着我一直都在裸奔😏,当然只是存储库数据,用户密码是不会传输的
参考:
svnserve,自定义服务器 - 《使用 Subversion 进行版本控制》
默认情况下,svnserve 服务器只知道如何发送 CRAM-MD5[61] 身份验证质询。
本质上,服务器向客户端发送少量数据。
客户端使用 MD5 哈希算法对数据和密码的组合创建指纹,然后将指纹作为响应发送。
服务器使用存储的密码执行相同的计算,以验证结果是否相同。实际密码不会在网络上传输。
然后我就按照官方的要求进行配置加密,官方的文档中有两种方法实现
第一种是通过代理比如通过apache或nginx等web服务器连接svn,架构为svn+apache+ldap的集成
第二种是通过svn+sasl+ldap的集成
第一种的话checkout地址都需要从svn://改成http(s)://那我全部拉仓库的客户端都要换太麻烦了
毕竟svn客户端在1.5版本后都支持sasl功能了,所以这里直接用第二个方法就够了
SASL
安装SASL
sudo apt install libsasl2-2 libsasl2-modules sasl2-bin配置sasl
修改配置
sudo nano /etc/default/saslauthd配置内容
START=yes
MECHANISMS="saslsb"
配置介绍
START: 是否在系统启动时自动启动
yes:启用
no:禁用
MECHANISMS: 认证机制
sasldb:直接用自带的数据库文件(/etc/sasldb2)来存储和验证用户密码
pam:用系统的 PAM(Pluggable Authentication Modules)进行认证,比如系统的用户密码
ldap:使用 LDAP 目录服务验证用户
shadow:直接读取 /etc/shadow 文件验证系统用户(需要 root 权限)
kerberos5:使用 Kerberos 进行认证
重启服务
/etc/init.d/saslauthd restart创建用户
添加
sudo saslpasswd2 -c -u 卟言SVN版本库 buyan删除
sudo saslpasswd2 -d -u 卟言SVN版本库 buyan测试
testsaslauthd -u buyan -p 123456789 -r 卟言SVN版本库联动svn
创建配置文件
sudo touch /usr/lib/sasl2/svn.conf编辑配置文件
sudo nano /usr/lib/sasl2/svn.conf配置内容
pwcheck_method: saslauthd
mech_list: CRAM-MD5 DIGEST-MD5 PLAIN
配置说明
pwcheck_method: 指定 SASL 验证密码的方式
auxprop:使用 辅助属性插件(Auxiliary Property Plugin) 获取来用户密码,插件由 auxprop_plugin 指定(比如说 sasldb)
saslauthd:直接使用 saslauthd 服务验证(在默认配置中/etc/default/saslauthd修改)。
pwcheck:使用 pwcheck 守护进程(已过时)。
shadow:直接读取系统 /etc/shadow 文件(需 root 权限)。
auxprop_plugin: 指定 auxprop 方式使用的具体插件
sasldb:使用 SASL 自带的数据库文件(通常是 /etc/sasldb2)存储用户密码
sql:使用 SQL 数据库(如 MySQL、PostgreSQL)来获取密码
ldapdb:使用 LDAP 目录服务来获取密码
mech_list: 指定 SASL 服务端支持的 认证机制列表
PLAIN: 明文传输用户名和密码(Base64 编码,本质仍是明文)
CRAM-MD5: 基于挑战 - 响应(Challenge-Response)机制,不传输明文密码
DIGEST-MD5: 类似 CRAM-MD5,但更复杂,支持会话安全(Session Security)
设置权限
sudo chown buyan:buyan /etc/sasldb2sudo chmod 600 /etc/sasldb2不设置可能会出现这种问题
SVN
配置SVN
安装步骤这里不再啰嗦了,可以查看ubuntu svn版本库搭建
修改配置
sudo nano /media/buyan/1/版本库/conf/svnserve.conf内容
[sasl]
use-sasl = true
min-encryption = 0
max-encryption = 256
注意
# password-db = passwd这行保持注释掉的状态,不使用passwd文件
min-encryption因为sasl已经加密了如果像网上配置125可能会报Could not obtain the list of SASL mechanisms或者乱码
realm要跟sasl创建用户的仓库一致并且不能有空格
参考svnserve,自定义服务器 - 《使用 Subversion 进行版本控制》
一些警告:首先,确保saslpasswd2的“realm”参数与您在存储库的svnserve.conf文件中定义的 realm 相匹配; 如果它们不匹配,身份验证将失败。此外,由于 SASL 的缺陷,公共 realm 必须是一个不包含空格的字符串。 最后,如果您决定使用标准的 SASL 密码数据库, 请确保svnserve程序对该文件具有读取权限(如果使用 OTP 等机制,可能还需要写入权限)。
重启
killall svnserve以用户身份运行不要使用sudo或管理员这样子限制对用户文件的读访问权限
svnserve –d –r /media/buyan/1/版本库测试
额外
其实如果是很多人开发比如公司内部,可以配LDAP来配合SASL
LDAP协议的好处就是你公司的所有员工在所有这些工具里共享同一套用户名和密码,
来人的时候新增一个用户就能自动访问所有系统,走人的时候一键删除就取消了他对所有系统的访问权限
不过我自己一个人的SVN就不搞这些花里胡哨的了,因为就我一个用户
参考
选择服务器配置 - 《使用 Subversion 进行版本控制》
svnserve,自定义服务器 - 《使用 Subversion 进行版本控制》
相关
SVN无法编辑日志信息的解决方法
ubuntu svn版本库搭建
