最佳实践
以下指南是我们收集并通常向所有用户推荐的最佳实践列表。 不要将这个指南当做是强制的,你可以根据你的需要来选取采纳其中的一部分。
你可以在Verdaccio社区自由的提出你的最佳实践.
私有仓库
您可以添加用户并管理哪个用户可以访问哪个包。
建议您定义私有包的前缀, 如 local-*
或者 scope @my-company/*
,这样你的所有私有包应该像这样:local-foo
。 通过这种方法您可以清楚地把公有包和私有包分开。
yaml
packages:
'@my-company/*':
access: $all
publish: $authenticated
'local-*':
access: $all
publish: $authenticated
'@*/*':
access: $all
publish: $authenticated
'**':
access: $all
publish: $authenticated
请务必记住,软件包的配置顺序很重要,总是从上到下匹配。
从npmjs.org使用公有包
如果一些包没有在存储里,服务器将试着从npmjs.org中取它。 如果npmjs.org坏了,它会假装没有其他的包存在, 并起到缓存包的作用。 Verdaccio 将只下载需要的内容(由客户端请求),这些信息将被缓存,因此如果客户端再次请求相同的内容,无需向 npmjs.org 询问即可提供。
示例:
如果您成功地从服务器请求了一次 express@4.0.1
,那么即使 npmjs.org 出现故障,您也可以随时再次请求(及其所有依赖项)。 不过请注意,express@4.0.0
在有人实际需要时才会被下载。 如果 npmjs.org 离线,服务器将表示只发布了 express@4.0.1
(缓存中的内容),而没有发布其他内容。
覆盖公共包
如果你想使用某个公共软件包 foo
的修改版本,你可以直接将其发布到本地服务器,这样当你输入 npm install foo
时,它会考虑安装你的版本。
这里有两个选项:
您想创建一个单独的 fork 并停止与公共版本同步。
如果要这样做,应修改配置文件,这样 Verdaccio 就不会再向 npmjs 发出有关此软件包的请求。 在
config.yaml
中为该软件包添加一个单独条目,并从proxy
列表中移除npmjs
,然后重启服务器。packages:
'@my-company/*':
access: $all
publish: $authenticated
# comment it out or leave it empty
# proxy:当您在本地发布软件包时,您可能应该使用比现有软件包更高的版本字符串,这样就不会与缓存中的软件包冲突。
您希望临时使用自己的版本,但在它更新后立即切换回公共版本。
为了避免版本冲突,您应该使用下一个补丁版本的自定义预发布后缀。 例如,如果公共软件包的版本是 0.1.2,则可以上传
0.1.3-my-temp-fix
。npm version 0.1.3-my-temp-fix
npm --publish --tag fix --registry http://localhost:4873这样,您的软件包将一直使用,直到其原始维护者将其公共软件包更新到
0.1.3
。
安全
安全从环境开始。
补充阅读:
- 10 npm Security Best Practices 并按照其中概述的步骤进行操作。
- Avoiding npm substitution attacks
- Dependency Confusion: When Are Your npm Packages Vulnerable?
- Practical Mitigations For Dependency Confusion Attack > Feel free to attach here new useful articles to improve the security.
通过 $authentiated
灵活的设置访问权限
默认情况下,所有用户都可以访问您在 Verdaccio 中发布的所有软件包。 我们建议将软件包的 access
属性更新为 $authenticated
,以防止外部非授权用户访问注册中心。
packages:
'@my-company/*':
access: $authenticated
publish: $authenticated
'@*/*':
access: $authenticated
publish: $authenticated
'**':
access: $authenticated
publish: $authenticated
这样,除非获得授权,否则任何人都无法访问您的注册中心,并且私有包不会显示在 Web 界面中。
删除 proxy
以提高私有包的安全性
安装完成后,默认情况下所有软件包都将解析到默认的上行链接(公共注册中心 npmjs
)。
packages:
'@*/*':
access: $authenticated
publish: $authenticated
proxy: npmjs
'**':
access: $authenticated
publish: $authenticated
proxy: npmjs
这意味着,即使像 @my-company/auth
这样的私有软件包是在本地发布的,服务器也会查询公共注册表。 如果您不打算这样做,请删除 proxy
属性,并使用类似这样的配置:
packages:
'@my-company/*':
access: $authenticated
publish: $authenticated
unpublish: $authenticated
'@*/*':
access: $authenticated
publish: $authenticated
proxy: npmjs
'**':
access: $authenticated
publish: $authenticated
proxy: npmjs
这将避免下载压缩包和不必要地从外部注册中心合并元数据。
服务器
加密连接
通常建议使用HTTPS。 因此,我们建议阅读 SSL 部分以确保 Verdaccio 的安全,或者在 Verdaccio 之上使用 HTTPS 反向代理。
令牌过期
自verdaccio@3.x
起,令牌没有过期日期。 因此,我们在接下来的verdaccio@4.x
中引入了 JWT 功能PR#896。
security:
api:
jwt:
sign:
expiresIn: 15d
notBefore: 0
web:
sign:
expiresIn: 1h
使用此配置将覆盖当前系统,您将能够控制令牌的生存时间。
使用 JWT 还可以提高身份验证插件的性能。 旧系统会在每次请求时执行解包并验证凭据,而 JWT 则依赖令牌签名,避免了插件的开销。
顺便提一句,请注意在 npmjs 和 legacy 中,verdaccio 标记永远不会过期(/),除非你手动使其失效。
速率限制
自版本 v5.4.0
起,关键接口已默认启用速率限制。 以下命令被视为用户接口:
npm token
所有变体npm login/adduser
npm profile
所有支持的变体- 用户网站
/sec/login
接口。
前面的接口列表限制为 100
个请求每 15 分钟,这足以满足基本使用要求,如果需要提高该级别,请查看 userRateLimit
配置选项。
userRateLimit:
windowMs: 50000 <- (minutes * 60 * 1000)
max: 1000 (number of request peer windowMs)
网站接口例如 search、packages、sidebar 和 detail 默认受保护,每 2 分钟可请求 5,000 次,也可通过 Web ui 选项进行配置。
我们建议根据您的需求自定义此值,以避免对关键接口进行任何类型的 (DDoS) 或暴力破解攻击。
例如,
npm install
使用的 CLI API 接口目前不受限制,因为它们不被认为是关键接口,但如果您有任何充分的理由,请展开讨论。