Ubuntu 20.04.4下如何创建目录访问受限的SVN用户
默认前提:你的SVN为标准svnserve部署,全程操作需要SVN管理员或服务器root权限。
1. 创建SVN认证账号
先定位到SVN仓库的配置目录,单仓库部署的话配置文件一般在仓库路径下的conf文件夹内,比如仓库存放在/var/svn/proj_repo,配置路径就是/var/svn/proj_repo/conf/。
打开目录下的passwd用户密码文件,在[users]段末尾新增协作用户的账号密码,格式为用户名 = 密码,示例:
[users] # 原有管理员账号保留,下方新增协作账号 collab_zhang = 自定义强密码
如果是多仓库共用统一认证文件,直接修改全局配置中指定的passwd文件即可,无需逐仓库添加账号。
2. 配置全局默认拒绝规则,从根源避免权限泄露
打开同目录下的authz权限配置文件,先配置全局默认规则,所有未明确授权的路径默认禁止所有用户访问:
[groups] # 可按需分组,方便后续批量管理权限 admin_group = 你的管理员账号 collab_group = collab_zhang # SVN根目录默认全禁止 [/] * = @admin_group = rw
等号后留空即代表无任何读写权限。
3. 给协作用户开放指定可访问范围
根据实际需求,给协作账号/协作组开放允许访问的仓库或目录权限。单仓库路径授权格式为[仓库名:目录路径],示例:
# 开放proj_repo仓库下的公共开发目录读写权限 [proj_repo:/public_dev] @collab_group = rw # 如果需要开放整个仓库的访问权,直接配置仓库根路径即可 # [proj_repo:/] # @collab_group = r
如果只需要给用户读权限,把rw改成r即可。
4. 明确禁止保密目录的访问权限
找到你存放私有保密文件的目录路径,单独添加权限规则。SVN的authz权限匹配遵循「最细分路径规则优先级最高」的逻辑,哪怕父目录给了访问权,子目录单独配置禁止就会生效,示例:
# 保密目录为proj_repo下的private_secret路径 [proj_repo:/private_secret] @collab_group = collab_zhang =
配置后协作用户访问该目录时会直接返回403权限不足错误。
5. 校验服务配置并重启生效
打开仓库配置目录下的svnserve.conf文件,确认以下配置项未被注释,路径指向正确:
[general] anon-access = none # 禁止匿名用户访问 auth-access = write # 认证用户按权限执行写入 password-db = passwd # 指向刚才修改的passwd文件,用全局认证就写绝对路径 authz-db = authz # 指向刚才修改的authz权限文件,全局同理写绝对路径
保存后重启svnserve服务加载新配置:
sudo systemctl restart svnserve
6. 权限校验
本地执行命令分别测试可访问目录和保密目录的访问权限,确认规则生效:
# 测试公共目录,应可正常拉取内容 svn co svn://你的服务器地址/proj_repo/public_dev --username collab_zhang # 测试保密目录,应返回权限不足错误 svn co svn://你的服务器地址/proj_repo/private_secret --username collab_zhang
补充:如果你是用Apache+mod_dav_svn方式部署的SVN,仅需把用户创建步骤替换为
htpasswd命令添加Apache认证用户即可,authz路径权限规则和上述操作完全一致,无需调整。
内容的提问来源于stack exchange,提问作者Priyesh Jakhmola

