Nexus Repository 3 实用指南:从命名到权限管理,带你玩转私有仓库! LDAP 集成、单点登录配置详解,附 Maven 项目实战案例,助你打造高效安全的软件仓库!

Sonatype Nexus系列产品的命名规则比较的怪异。当你使用搜索引擎进行产品的搜索时,会出现一大堆词汇指向同一个产品:Nexus3/Repository Manager 3/Nexus Repository 3/Nexus repository OSS/Nexus repository PRO/Nexus Repository,同时公司的名字又是叫Sonatype,好巧不巧,又有一个常用产品叫做Sonarqube,一下子懵了。

首先,Sonatype和Sonarqube这两家公司应该是没有关系的,至于为什么都喜欢sona这个词根,我没查到,有人知道的话可以在留言区补充一下。

其次,我们口中常说的Nexus3指的应该就是他们公司旗下的Repository产品,有的时候也表述成 Repository Manager 3,目前是第3个版本。其中Repository分成社区版本及收费版本,社区版叫做Nexus repository OSS,付费版叫做Nexus repository PRO。至于为什么叫OSS,真的也猜不出来,这家公司的marketing人员是鬼才。

观摩一下这家公司的部分产品线,研究官网的时候,还发现他们有个社区版的漏洞产品,有空玩一玩。

Nexus这个产品架构功能简单,安装不复杂,因此本文主要就是介绍一下基础功能,以及权限管理层面的一些思路。

Nexus Repository主要功能就是方便大伙实现仓库的缓存加速,私有仓库的搭建以及对上述两个类别进行混合。支持的类型真的很多:Maven/Java, npm, NuGet, Helm, Docker, p2, OBR, APT, Go, R, Conan还有一些linux发行版的源等等。

一、搭建

搭建部分过于简单,此处不表述了。但是官方反复强调一个点,他们镜像中的那个内嵌的PostgreSQL不稳定,假定作为生产使用的话,建议各位爷自己搭一个外置的。

Deploying Nexus Repository in containers with an embedded database has been known to corrupt the database under some circumstances. We strongly recommend that you use an external PostgreSQL database for Kubernetes deployments.

同时他们给了一个高可用的架构图,以及高可用的方案,这个搞起来应该很简单,有时间的朋友可以试一下:https://help.sonatype.com/repomanager3/planning-your-implementation/resiliency-and-high-availability/single-data-center-on-premises-deployment-example-using-kubernetes

二、配置

2.1 Blob Stores

在进行Repositories配置之前我们先看下Blob Stores,这个是存放非结构化数据的真实位置。可以配置本地的路径以及S3。我们发布的包、proxy代理缓存产生的数据等本质上就存放在这个地方。

2.2 Repositories

Nexus的仓库总共分成3个类别,我用口语表述一下区别:

  • proxy : 把官方或公共的仓库、源等进行代理并缓存。proxy的意义其实有两层:一是提升补包的效率,本地的带宽肯定更粗一点。二是对于部分公司/单位,安全要求很高没有公网出访权限的情况下,proxy的用处就很大了,可以进行网络出口权限的收敛。

  • hosted : 私有/本地仓库,存放你们项目自己的包,镜像,文件等等。

  • group : 把上述两种类别的仓库,排个优先级,然后组合,拼成一个仓库,这样配置的时候就配这一个链接即可。

OK,那我们分析分析,权限应该怎么管?

  • 原则上我们可以认为,proxy仓库就是各类公共源的本地代理,所以建议管理员对于本公司可能用到的各类别仓库,集中进行proxy的配置,然后对所有用户开放。项目组的层面没有必要再去配置公共仓库了。

  • 项目层面,配置建立一个hosted仓库。再用group仓库将hosted和某个类型公共proxy组合一下就可以给项目成员使用了。hosted和group从权限管理角度来说,都是私有的。

那么如何实现上述的构想呢?

我们安装Nexus之后,在Security>Anonymous Access的配置,我们需要将允许匿名访问开启。

所谓的匿名访问,在nexus中就是指未登录的访问,使用anonymous这个用户的权限。默认情况下这个用户默认被授权了anonymous这个role,啥都干不了。因此我们需要做三件事情,首先去创建一个新role,给这个role赋予我们期望的权限,最后将这个role授权给我们的anonymous用户,这样就能实现无鉴权的公共仓库。

Security>Roles ,创建新的role:

此处privilege处,以一个maven的public仓库为例,只需要给read、browse这两个权限即可。(role也是可以继承组合的,此处我们不需要配置。)

Security>Users,将role授权给anonymous用户

最终的效果,在未登录系统的情况下可以看到我们privilege中授权的公共仓库。

关于group及hosted的权限管理,就建议按照项目组建立账号,并正常开展仓库权限的授权即可。此处不再赘述。

附一个pom.xml中配置仓库的样例

<repositories>
  <repository>
    <id>nexus</id>
    <name>Team Nexus Repository</name>
    <url>http://nexus3.ctuber.top/repository/maven-public/</url>
  </repository>
</repositories>

<pluginRepositories>
  <pluginRepository>
    <id>nexus</id>
    <name>Team Nexus Repository</name>
    <url>http://nexus3.ctuber.top/repository/maven-public/</url>
  </pluginRepository>
</pluginRepositories>

接下去来讲一下Nexus与LDAP的集成,都是界面配置,很简单,此处截图给大家做个参考:

最后补充一下Nexus单点的文档,官方支持的很好,在ldap完成配置之后,可以很方便的进行单点,https://help.sonatype.com/repomanager3/nexus-repository-administration/user-authentication/authentication-via-remote-user-token