Boundary Enterprise をアップグレードする
Notes: お使いの環境で実施する際は、開発環境等で手順を確認した上で実施する様にして下さい。
Lab の Boundary Enterprise 環境をアップグレードした際のメモです。上記の通り、お使いの環境で実施する際は、開発環境等で手順を確認した上で実施する様にして下さい。
手順は以下のドキュメントに従って実施しています。
What is Boundary
Boundary は、セキュアなリモートアクセスを実現するためのプロダクトになります。外部の IdP (OIDC, LDAP) と連携し認証されたユーザーの属性毎に、ターゲットとなる Linux, Windows, Database, Kubernetes クラスタ等へのアクセス制御を行う事が出来ます。
また、ターゲットへアクセスする際に必要となる認証情報は、Vault と連携しユーザーがローカルに認証情報を持たずに、ターゲットにアクセスする事が出来ます。
Boundary は、Community 版、Enterprise 版、SaaS 版が提供されており、Enterprise 版、SaaS 版では、マルチホップ構成、クレデンシャルインジェクション、SSH セッションレコーディング等のエンタープライズ機能を利用する事が出来ます。
Boundary のベーシックな内容やユースケースに関しては、References にある Youtube でご確認頂けます。
Boundary Enterprise environment
アップグレードを行った Boundary Enterprise の環境は下記のような構成になっています。Boundary Controller, Boundary Worker はそれぞれ仮想マシン上で稼働しています。
KMS としては Vault Enterprise を利用し、データベースとしては PostgreSQL を Nomad を使ってコンテナとしてオーケストレーションしている構成になります。
Upgrade Boundary
Boundary Controller と Boundary Worker をそれぞれ手順に従ってアップグレードしていきます。アップグレードの一環として Controller が利用しているデータベースのスキーマを更新する必要があり、データベースのバックアップを取っておきます。
Backup database
手順にある通り、事前にデータベースのバックアップを取得します。
docker exec --user=root -it postgresql-c5ec4974-18e3-6c35-e096-8d23da6e4b35 pg_dump -h localhost -p 5432 -U postgres -d boundary -f boundary_backup.sql
コンテナにアクセスし、バックアップファイルが作成されているか確認し、中身も確認しておきます。
docker exec -it postgresql-c5ec4974-18e3-6c35-e096-8d23da6e4b35 /bin/bash
$ cat boundary_backup.sql | grep "CREATE TABLE" | awk -F'.' '{print $2}' | tr -d '('
sessions_pending_daily_snapshot
auth_account
auth_ldap_account
auth_ldap_account_attribute_map
auth_ldap_bind_credential
auth_ldap_certificate
auth_ldap_client_certificate
auth_ldap_group_entry_search
auth_ldap_managed_group
auth_ldap_method
auth_ldap_method_state_enm
auth_ldap_url
auth_ldap_user_entry_search
...<SNIP>...
worker_auth_authorized
worker_auth_authorized_state_enm
worker_auth_ca
worker_auth_ca_certificate
worker_auth_certificate_bundle
worker_auth_operational_indicator_enm
worker_auth_server_led_activation_token
Upgrade Boundary Controller
Controller をアップグレードしていきます。最初に現行のバージョンを確認します。
$ boundary version
Version information:
Build Date: 2023-06-12T09:07:19Z
Git Revision: ad861aeeec40746bec4bcae98acb28beaae10ad1
Metadata: ent
Version Number: 0.13.0+ent
次に、Controller を停止させ、Boundary のバイナリを 0.14.2+ent
のバイナリに置き換えます。
systemctl stop boundary-controller
sudo mv boundary /usr/local/bin/boundary
$ boundary version
Version information:
Build Date: 2023-10-31T19:23:08Z
Git Revision: 6c0971ad406430dd11b59e20eae1a776e679441b
Metadata: ent
Version Number: 0.14.2+ent
新しいバイナリに更新されたので、Controller を起動させます。
systemctl start boundary-controller
boundary-controller
のステータスを確認してみます。ドキュメントに記載がある通り、データベースの更新が完了していないため、起動に失敗しているのが分かります。
$ systemctl status boundary-controller.service
× boundary-controller.service - "HashiCorp Boundary controller - A tool for secure remote access"
Loaded: loaded (/etc/systemd/system/boundary-controller.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Thu 2023-12-07 17:57:35 JST; 3s ago
Process: 20873 ExecStart=/usr/local/bin/boundary server -config /etc/boundary.d/controller.hcl (code=exited, status=2)
Main PID: 20873 (code=exited, status=2)
CPU: 1.037s
Dec 07 17:57:33 hashi-server systemd[1]: Started "HashiCorp Boundary controller - A tool for secure remote access".
Dec 07 17:57:35 hashi-server boundary[20873]: Database schema must be updated to use this version. Run 'boundary database migrate' to update the database. NOTE: Boundary does not currently support live migration; Ensure all>
Dec 07 17:57:35 hashi-server systemd[1]: boundary-controller.service: Main process exited, code=exited, status=2/INVALIDARGUMENT
Dec 07 17:57:35 hashi-server systemd[1]: boundary-controller.service: Failed with result 'exit-code'.
Dec 07 17:57:35 hashi-server systemd[1]: boundary-controller.service: Consumed 1.037s CPU time.
エラーメッセージにある通り、boundary migrate
コマンドを実行して、データベースの更新を行います。下記の通り、Migrations successfully run.
と出力されれば、データベースの更新は完了です。
$ boundary database migrate -config /etc/boundary.d/controller.hcl
{"id":"tnj4DvJoTm","source":"https://hashicorp.com/boundary/hashi-server/boundary-database-migrate","specversion":"1.0","type":"system","data":{"version":"v0.1","op":"github.com/hashicorp/boundary/internal/event.(*HclogLoggerAdapter).writeEvent","data":{"@original-log-level":"none","@original-log-name":"aws","msg":"configuring client automatic mTLS"}},"datacontentype":"application/cloudevents","time":"2023-12-07T17:58:26.010407397+09:00"}
...<SNIP>...
{"id":"w7mtI2lkVs","source":"https://hashicorp.com/boundary/hashi-server/boundary-database-migrate","specversion":"1.0","type":"system","data":{"version":"v0.1","op":"github.com/hashicorp/boundary/internal/event.(*HclogLoggerAdapter).writeEvent","data":{"@original-log-level":"none","@original-log-name":"aws","msg":"plugin exited"}},"datacontentype":"application/cloudevents","time":"2023-12-07T17:58:27.18652615+09:00"}
Migrations successfully run.
データベースの更新が完了したので、Controller を再起動し、無事に起動してくれば完了です。
systemctl restart boundary-controller
$ systemctl status boundary-controller.service
● boundary-controller.service - "HashiCorp Boundary controller - A tool for secure remote access"
Loaded: loaded (/etc/systemd/system/boundary-controller.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2023-12-07 17:58:41 JST; 4s ago
Main PID: 21007 (boundary)
Tasks: 45 (limit: 9389)
Memory: 389.0M
CPU: 1.470s
CGroup: /system.slice/boundary-controller.service
├─21007 /usr/local/bin/boundary server -config /etc/boundary.d/controller.hcl
├─21015 /tmp/3229364360/boundary-plugin-kms-transit-iDlM2
├─21023 /tmp/2682920135/boundary-plugin-kms-transit-OSFhi
├─21032 /tmp/1933782481/boundary-plugin-kms-transit-IZwgy
├─21041 /tmp/3827760407/boundary-plugin-aws-kq8et
└─21049 /tmp/2372989776/boundary-plugin-azure-ulyGt
...<SNIP>...
Upgrade Boundary Worker
Controller のアップグレードが完了したら、Worker 側もアップグレードします。
Worker 側のアップグレード作業は非常にシンプルで、以下のステップを実施する事でアップグレードは完了です。
- Worker の停止
- Boundary バイナリの更新
- Worker の起動
Summary
Upgrade and database migration に従い実施する事で、特に躓く箇所もなく、Boundary Enteprise v0.13 -> v0.14 へのアップグレードが出来ました。
References
Youtube
BoundaryとVaultによるセキュアなリモートホストアクセス
Boundaryのロールベースアクセスコントロール
Discussion