目录
1、撤消访问令牌
2、在CI/CD工作流中使用私有包
2.1 创建新的访问令牌
持续整合
持续部署
交互式工作流
CIDR白名单
2.2 将令牌设置为CI/CD服务器上的环境变量
2.3 创建并签入特定于项目的.npmrc文件
2.4 令牌安全
3、Docker和私有模块
3.1 背景:运行时变量
3.2 更新Dockerfile
3.3 构建Docker镜像
1、撤消访问令牌
为了确保您的帐户和软件包的安全,我们强烈建议您撤销(删除)不再需要或已被泄露的令牌。您可以撤销已创建的任何令牌。
npm token list
2、在令牌表中,查找并复制要删除的令牌的ID。
3、在命令行上,运行以下命令,例如删除的令牌的ID为0a4d81
npm token delete 0a4d81
4、要确认令牌已删除,请再次运行如下命令,查看下令牌是否已删除:
根据创建时间倒序排列的令牌列表,可以发现刚才的只读令牌已删除。
注意:必须使用令牌ID来删除令牌,而不是令牌的截断版本。在某些情况下,在令牌被成功撤销之前可能存在长达一小时的延迟。
2、在CI/CD工作流中使用私有包
您可以使用访问令牌在持续集成(CI)系统中测试私有npm包,或者使用持续部署(CD)系统部署它们。
2.1 创建新的访问令牌
创建一个新的访问令牌,仅用于从CI/CD服务器访问npm包。
持续整合
当生成用于持续集成环境的访问令牌时,我们建议使用具有有限访问权限的粒度访问令牌,以提供更高的安全性。
如果您使用传统令牌,默认情况下,npm token create
将生成具有读写权限的令牌。我们建议创建只读令牌:
npm token create --read-only
有关创建访问令牌(包括CIDR白名单令牌)的详细信息,可以参考之前的文章,NPM与外部服务的集成(上)
持续部署
由于持续部署环境通常涉及到创建部署工件,因此您可能希望在网站上创建一个自动化令牌
。这将允许您发布,即使您在帐户上启用了双因素身份验证。
交互式工作流
如果您的工作流生成了一个包,但您在验证后手动发布了它,那么您将需要创建一个具有读写权限的令牌,这些权限是通过标准令牌创建命令授予的:
npm token create
CIDR白名单
为了提高安全性,您可以使用CIDR白名单令牌,该令牌只能在特定的IP地址范围内使用。您可以使用CIDR白名单和读取和发布令牌或只读令牌:
npm token create --cidr=[list]
npm token create --read-only --cidr=[list]
Example:范例:
npm token create --cidr=192.0.2.0/24
2.2 将令牌设置为CI/CD服务器上的环境变量
在CI/CD服务器中将令牌设置为环境变量或密码。
例如,在GitHub Actions中,您可以将令牌添加为密钥
。然后,您可以将密钥设置为可用于工作流。
如果您将secret命名为NPM_TOKEN
,那么您需要从该secret创建一个名为NPM_TOKEN
的环境变量。
steps:
- run: |
npm install
- env:
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
2.3 创建并签入特定于项目的.npmrc文件
使用特定于项目的.npmrc
文件和令牌的变量,以使用npm安全地验证CI/CD服务器。
1、在项目的根目录中,创建包含以下内容的自定义.npmrc
文件:
//registry.npmjs.org/:_authToken=${NPM_TOKEN}
注意:您指定的是一个文本值
${NPM_TOKEN}
。npm cli会将这个值替换为NPM_TOKEN
环境变量的内容。不要在此文件中放置令牌。
2.4 令牌安全
您的令牌可能有权读取私有包、代表您发布新包或更改用户或包设置。保护好你的令牌。
不要将令牌添加到版本控制中或以不安全的方式存储令牌。将其存储在密码管理器、云提供商的安全存储或CI/CD提供商的安全存储中。
如果可能,请使用具有最低必要权限的粒度访问令牌,并为令牌设置较短的到期日期。
3、Docker和私有模块
要在Docker容器中安装私有npm包,您需要使用Docker构建密钥。
3.1 背景:运行时变量
您不能仅使用运行时变量在Docker容器中安装私有npm包。考虑以下Dockerfile:
FROM node
COPY package.json package.json
RUN npm install
# Add your source files
COPY . .
CMD npm start
它将使用官方的Node.js镜像,将package.json
复制到我们的容器中,安装依赖项,复制源文件并运行package.json
中指定的start命令。
为了安装私有包,你可能会认为我们可以在运行npm install
之前添加一行,使用ENV参数:
ENV NPM_TOKEN=00000000-0000-0000-0000-000000000000
然而,这并不像你期望的那样工作,因为你希望npm安装在你运行docker build
时发生,在这个例子中,没有使用ENV
变量,它们只为运行时设置。
你必须使用Docker构建秘密,而不是运行时变量。
3.2 更新Dockerfile
利用这一点的Dockerfile比前面的示例多了几行,允许我们使用您的全局.npmrc
和在运行npm login
命令时创建的访问令牌(如果您还没有运行它-请在继续之前运行它)。
# https://docs.npmjs.com/docker-and-private-modules
FROM node:18
ENV APP_HOME="/app"
WORKDIR ${APP_HOME}
COPY package*.json ${APP_HOME}/
RUN --mount=type=secret,id=npmrc,target=/root/.npmrc npm install
COPY . ${APP_HOME}/
CMD npm start
这将配置您的Dockerfile通过build secrets接收.npmrc
文件,在npm依赖安装完成后不会留下任何痕迹。
3.3 构建Docker镜像
要使用上述Dockerfile和npm身份验证令牌构建镜像,可以运行以下命令。请注意,最后给予.
将当前目录作为参数提供给docker build
。
docker build . -t secure-app-secrets:1.0 --secret id=npmrc,src=$HOME/.npmrc
这将使用通过build secrets接收的全局.npmrc
文件中的访问令牌构建Docker镜像,因此您可以作为当前登录用户在容器中运行npm install
。
注意:您可能需要指定一个不同于默认
/
的工作目录,否则某些框架(如Angular)将失败。