カテゴリー
プライベートなNPMパッケージ管理で便利なVerdaccioレジストリをConoHa VPSへお引越しする
※ 当ページには【広告/PR】を含む場合があります。
2022/12/03

長らく社内のオンプレサーバー内にて社外秘の自作NPMパッケージの運用してきた
☆一月277円から使用できる格安VPS☆ ConoHa VPS
以前のローカル環境でVerdaccioサーバーを構築して動かしてみた記事については、以下を記事リンクをご覧ください。
また、円安の影響の煽りで、npm公式のプライベートレポジトリのプランも割高に感じている方も多いのではないかと思います。

企業によっては、
これから円安のリスクや電気代の高騰などのコストに関わるリスクに備えて可能な限り開発コストを節約してみたいのなら、Verdaccioと
ということで今回はConoHa VPSなどのリモートのLinuxサーバーへVerdaccioを引っ越しさせたときの個人的な技術防備録になります。
準備 〜 ConoHa VPSインスタンス(Debian)にDockerを導入する
Verdaccioを起動するためには、npmパッケージ版なども利用可能ですが、よりサクッと使いたい場合にはコンテナ内にサービス機能一式があらかじめ詰め込まれたr
まずは
docker
docker-compose
なお
まずDebian OSへのdockerの導入方法は、リソースビルドするしか無かった時代と比べると、かなり楽になっています。
以下のようにインストールスクリプトが用意されているので、このスクリプトを走らせるだけで簡単にdockerを導入することができます。
$ curl -sSL https://get.docker.com | sh
これで問題が出なければDockerの準備は完了です。
次にdocker-composeですが、
pip3
ちなみに現状のDebian OSはデフォルトでpython3がインストールされていますが、pip3はデフォルトで入ってはいないと思います。
pip3の導入には、aptを使ってインストールできます。
$ sudo apt install python3-pip
pip3が使えるようになったら、簡単にdocker-composeもインストールできます。
$ sudo pip3 install docker-compose
ここまででもうDockerは使えるようになっていますが、もう一つ設定しておきたいのが、ルートユーザーでない場合に
sudo
$ docker ...
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.24/images/create?fromImage=alpine&tag=edge: dial unix /var/run/docker.sock: connect: permission denied
これはroot以外のユーザーにdockerコマンドを直接実行する権限がないと言われているために起こるものです。
毎回
sudo
$ whoami
hoge
#👇権限を与えたいユーザーに"hoge"の箇所を置換える
$ sudo usermod -g docker hoge
$ sudo systemctl restart docker.service
$ id hoge
#👇ユーザーにdockerの実行権限が付与されている
uid=1000(hoge) gid=995(docker) groups=995(docker),...
設定を有効にするためには、一度
Ctrl + D
Verdaccioの起動テスト
先程まででdocker周りの実行環境を整えたので、DockerHubから
ConoHa VPSのインスタンスにSSH接続したら、適当な作業フォルダを作成し、
docker-compose.yml
version: '3'
services:
verdaccio:
image: verdaccio/verdaccio:5
container_name: verdaccio-vps
environment:
NODE_ENV: development
ports:
- "54321:4873"
volumes:
- "./storage:/verdaccio/storage"
- "./conf:/verdaccio/conf"
volumes:
verdaccio:
driver: local
なお、Verdaccioのデフォルトのサービスポートの番号は「4873」ですが、デフォルトのままでは攻撃されやすいので、外部からのアクセスには例えば「54321」などに繋ぎ変えておきましょう。
また、
conf
config.yaml
$ mkdir conf
$ touch conf/config.yaml
とりあえず試しに最初の
config.yaml
storage: /verdaccio/storage
auth:
htpasswd:
file: /verdaccio/conf/htpasswd
algorithm: bcrypt
security:
api:
jwt:
sign:
expiresIn: 60d
notBefore: 1
web:
sign:
expiresIn: 7d
uplinks:
npmjs:
url: https://registry.npmjs.org/
packages:
'@*/*':
access: $authenticated
publish: $authenticated
'**':
access: $all
publish: $authenticated
proxy: npmjs
middlewares:
audit:
enabled: true
logs: { type: stdout, format: pretty, level: http }
なお、より詳しい設定ファイル・
config.yaml
ここまでで、以下のようなプロジェクトフォルダになっていると思います。
$ tree
.
├── conf
│ └── config.yaml
└── docker-compose.yml
コンテナを起動すると、
$ docker-compose up
Recreating verdaccio-vps ... done
Attaching to verdaccio-vps
verdaccio-vps | warn --- config file - /verdaccio/conf/config.yaml
verdaccio-vps | info --- plugin successfully loaded: verdaccio-htpasswd
verdaccio-vps | info --- plugin successfully loaded: verdaccio-audit
verdaccio-vps | warn --- http address - http://0.0.0.0:4873/ - verdaccio/5.18.0
というようにコンテナが起動状態になり、
http://<VPSのIPアドレス>:54321

問題なく確認したら
Ctrl+C
$ docker-compose down
ということで
VerdaccioのSSL対応
パスワードによるログイン認証を行う場合、ローカルの外へ通信の閉じた環境と違って、すべてオンライン越しになるとパスワードを盗み取られるリスクも増大します。
デフォルトのままの
http
https
手順としては公式の内容通りです。
また、以下では
localhost
もし、本番環境を想定したVPSでのVerdaccioサーバー運用を検討している場合には、きちんとしたドメイン名を取得し、
opensslでオレオレ認証を発行してつかう(ローカル環境のみ)
とりあえずは公式のドキュメントにも紹介してあるように「openssl」でSSL認証を行うやり方をやってみます。
まずはSSL認証キーとなるファイルを生成します。
なお、ConoHa VPSのDebianOSインスタンスだとopensslコマンドは最初から使えると思いますが、無い場合には別途インストールしてください。
#👇confフォルダ内に認証キーを生成
$ openssl genrsa -out conf/verdaccio-key.pem 2048
#👇認証キーから秘密キーを生成
$ openssl req -new -sha256 -key conf/verdaccio-key.pem -out conf/verdaccio-csr.pem
#👇SSL認証キーを作成
$ openssl x509 -req -in conf/verdaccio-csr.pem -signkey conf/verdaccio-key.pem -out conf/verdaccio-cert.pem
これらのキーができたら
config.yaml
#...
https:
key: /verdaccio/conf/verdaccio-key.pem
cert: /verdaccio/conf/verdaccio-cert.pem
ca: /verdaccio/conf/verdaccio-csr.pem
#...
生成したファイルを確認すると、通常のユーザーに読み込み権限がない場合があるので、一度権限グループの設定をよく見ておきましょう。
$ ls -la conf/
-rw-r--r-- 1 hoge docker 1918 Nov 29 13:48 config.yaml
-rw-r--r-- 1 hoge docker 1289 Nov 29 13:41 verdaccio-cert.pem
-rw-r--r-- 1 hoge docker 1082 Nov 29 13:38 verdaccio-csr.pem
-rw------- 1 hoge docker 1675 Nov 29 13:29 verdaccio-key.pem
この場合、
verdaccio-key.pem
$ sudo chmod 644 conf/verdaccio-key.pem
$ ls -la conf/
#...
-rw-r--r-- 1 hoge docker 1675 Nov 29 13:29 verdaccio-key.pem
これでSSL対応になりましたので、あとはdocker-composeで起動する際に、環境変数に
VERDACCIO_PROTOCOL=https
version: '3'
services:
#...
environment:
NODE_ENV: development
#👇追加
VERDACCIO_PROTOCOL: https
#...
再度、
docker-compose up

ちゃんとVerdaccioのダッシュボードがhttpsでアクセス可能になりました。
ちなみにこの
npm
$ npm --version
8.19.2
$ npm adduser --registry https://xxx.xxx.xxx.xxx:54321
npm WARN adduser `adduser` will be split into `login` and `register` in a future version. `adduser` will become an alias of `register`. `login` (currently an alias) will become its own command.
npm notice Log in on https://xxx.xxx.xxx.xxx:54321/
npm ERR! code DEPTH_ZERO_SELF_SIGNED_CERT
npm ERR! errno DEPTH_ZERO_SELF_SIGNED_CERT
npm ERR! request to https://xxx.xxx.xxx.xxx:54321/-/v1/login failed, reason: self-signed certificate
npm ERR! A complete log of this run can be found in:
npm ERR! /home/node/.npm/_logs/2022-11-29T08_00_46_660Z-debug-0.log
おおよそちょっと以前のnpmコマンドでは、
DEPTH_ZERO_SELF_SIGNED_CERT
ですが最近では悪意のあるマルウェアが巧妙に仕込まれたNPMパッケージがたびたび報告されるケースもテックニュース界隈で話題となっています。
この辺の事情もあり、現行のnpmではセキュリティ強化の観点から、「オレオレSSL認証局」で建てた本番環境で運用しているリモートサーバー側へのhttpsアクセスの『裏ワザ』は許可されていないのではと推測します。
mkcertによるSSL認証の置き換えで試す(ローカル環境のみ)
もう一つ、高機能なローカル開発環境のSSL認証を実現させる
なお、この項目の内容に興味がなければ、次の項目へスキップして頂いても構いません。
こちらだとせめて、ブラウザのアクセスブロッキングだけでもどうにかなる...?と期待はしていましたが、結論からいうと、mkcertといえどもリモートサーバー越しのhttpsアクセスはブロックされる仕様です。
セキュリティ面でも、「openssl」も「mkcert」もリモート側で運用するような本番環境ではリスクがあるので、オンライン等でリモート間の利用は避けたほうが良いようです。
まずは&
$ sudo apt install libnss3-tools
$ curl -JLO "https://dl.filippo.io/mkcert/latest?for=linux/amd64"
$ ls
#👇最新のバイナリバージョンの確認
mkcert-v1.4.4-linux-amd64
$ chmod +x mkcert-v1.4.4-linux-amd64
$ sudo cp mkcert-v1.4.4-linux-amd64 /usr/local/bin/mkcert
$ mkcert --version
v1.4.4
#👇インストール後の後片付け
$ rm -rf mkcert-v1.4.4-linux-amd64
mkcertがインストールできたので、早速自分認証を発行してみます。
$ mkcert -install
Created a new local CA 💥
The local CA is now installed in the system trust store! ⚡️
これでローカルにオレオレCA(認証局)が発行されたようです。
これでmkcertの準備が完了し、実際に利用したいドメイン名(複数名指定可能)を指定して以下のようにコマンドを叩くと、
$ mkcert localhost 127.0.0.1 <ConoHa VPSのIPアドレス> ...
Created a new certificate valid for the following names 📜
- "localhost"
- "127.0.0.1"
- "xxx.xxx.xxx.xxx"
The certificate is at "./localhost+2.pem" and the key at "./localhost+2-key.pem" ✅
It will expire on 1 March 2025 🗓
というように現在のフォルダに
localhost+2.pem
localhost+2-key.pem
conf
$ sudo chmod 644 localhost+2-key.pem
$ mv localhost+2.pem localhost+2-key.pem conf/
これらのキーを再び
config.yaml
https
#...
https:
key: /verdaccio/conf/localhost+2-key.pem
cert: /verdaccio/conf/localhost+2.pem
#...
これでVerdaccioを立ち上げて、
https://...

...症状としてはopensslでも同じですね。 オレオレ証明書のセキュリティで引っかかるようです。
ということでここまでの教訓として、Verdaccioサーバーを本格導入・運営していくためには、
1. 独自ドメインを取得&信頼のある第三者認証局を利用したSSL対応
2. JWT(JSON Web Token)などを利用したHTTPリクエストヘッダーでのユーザー認証
3. iptableなどを利用したファイヤーウォールでのアクセス制限
のような対策が別途必要になることが分かります。
Verdaccioサーバーへのユーザー認証などセキュリティ面の設定の話は長くなりそうなので一旦保留し、この記事では
http
ConoHa VPSのVerdaccioレジストリでパッケージを操作する
前項までの内容で、シンプルなVerdaccioレジストリがリモートで立ち上がるようになりました。
せっかくなので、自作のnpmパッケージをpublishしたり、ダウンロードしてみたりと、簡単なnpmコマンドからの基本操作が行えるかも検証してみます。
Verdaccioのパッケージ管理について
リモートのVerdaccioサーバーでパッケージの操作をしていく前に、Verdaccio独自の
通常、パッケージのアクセスに関する設定は
[config.yaml] > [packages]
packages:
#👇スコープ付きのパッケージ①
#誰でも読み込みOK&パブリッシュは登録ユーザーのみ
'@hoge/*':
access: $all
publish: $authenticated
#👇スコープ付きのパッケージ②
#誰でも読み込みOK&パブリッシュは登録ユーザーのみ
#パッケージがない場合、通常のnpmレポジトリへ探しに行く
'@piyo/*':
access: $all
publish: $authenticated
proxy: npmjs
#👇ユーザー指定のパッケージ①
#fugaの専用パッケージ...登録ユーザーのみ読み込み&fugaのみパブリッシュOK
'fuga-*':
access: $authenticated
publish: fuga
#👇ユーザー指定のパッケージ②
#mogeの専用パッケージ...moge/fugaのみ読み込み&mogeのみパブリッシュOK
'moge-*':
access: moge fuga
publish: moge
#👇上記以外のその他のパッケージ
#ログイン不要で誰でも取得&パブリッシュ可
'**':
access: $all
publish: $all
proxy: npmjs
基本的には、packagesでより先に記述した設定が優先されるため、
「**」
各パッケージルートにそれぞれのアクセス属性を書いていくわけですが、必須フィールドなのが
access
publish
文字通り、「誰に」パッケージを閲覧可能するか、またパッケージをパブリッシュ可能にするかの属性を制御します。 ここで指定できるトークンとしては種類がありますが、覚えておくのは
$anonymous
$all
$authenticated
<ユーザー名>
パッケージのアクセス権限は
$anonymous
$all
$authenticated
<ユーザー名>
$anonymous
$all
$anonymous
$all
$authenticated
さらに、
<ユーザー名>
また、
proxy
これについては、基本的に
npmjs
proxy
npmjs
proxy
クライアント側からユーザーの登録
ここからはパッケージの操作を行っていきます。
最初にユーザーを登録する必要があります。
まずはリモート側のVerdaccioサーバーを起動しておきましょう。
$ docker-compose up
ローカルのクライアント側から
「npm-adduser」
$ npm adduser --registry http://<ConoHa VPSのIPアドレス>:54321
問題なく接続出来ていたらOKです。
なお、npm v8以前では
「npm-adduser」
もし、お手元のnpmコマンドがv9以上ならば、
adduser
login
NPMパッケージをVerdaccioサーバーへアップロードする
自作パッケージのパブリッシュに関しては、
[config.yaml] > [packages]
package.json
$ npm publish --registry http://<ConoHa VPSのIPアドレス>:54321
問題なければ、開発中のNPMパッケージがパブリッシュ出来ているはずです。

まとめ
今回は
現行のNPM公式のTeamsプラン相当だと、月々$7/userの利用コストがかかるので、組織として運用していくならば
また課題として、本番環境でのVerdaccioサーバーへのセキュリティ面での話も考えなくてはいけないので、今後時間が許せば、じっくりと設定方法の紹介をしていこうかと思います。
記事を書いた人
ナンデモ系エンジニア
主にAngularでフロントエンド開発することが多いです。 開発環境はLinuxメインで進めているので、シェルコマンドも多用しております。 コツコツとプログラミングするのが好きな人間です。
カテゴリー