大規模なシステムを組織で管理するためには、認証システムの管理や適切な権限設定が必要ですが、実際に実現しようと思うと乗り越えるべき壁が多いのも事実。HashiCorpがリリースした認証システム「Boundary」を使うと、システムの認証を1箇所にまとめてユーザーやグループごとに細かく権限管理を行うことができます。

Boundary by HashiCorp

https://www.boundaryproject.io/

Announcing HashiCorp Boundary

https://www.hashicorp.com/blog/hashicorp-boundary

サーバーやデータベースへアクセスする場合、従来はSSHコマンドなどを実行して直接システムにアクセスしていましたが、アクセス権限などをきめ細かく設定できず、意図しない操作がそのまま実行されて障害につながる危険性がありました。この問題を解決するのがBoundaryで、システム全体の認証における「ゲートウェイ」の役割を果たすことで、システムに対するさまざまな認証を統合して管理することができます。



BoundaryはWindows、macOS、Linuxのほか、FreeBSDやSolarisなどで利用可能。今回はUbuntu 20.04にBoundaryをインストールしてみます。

まずは下記コマンドを実行して、Boundaryをインストール。

curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add -
sudo apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main"
sudo apt-get update && sudo apt-get install boundary


今回は試用のため、下記コマンドを実行してBoundaryを開発モードで起動します。

boundary dev


Boundaryを起動すると、認証に必要なユーザー名やパスワードなどが表示されました。



Boundaryを起動しているホストのブラウザで「http://127.0.0.1:9200」にアクセスするとBoundaryのログイン画面が表示されるので、起動時に生成されたユーザーIDとパスワードを入力。テストモードではユーザー名は「admin」、パスワードは「password」となっています。



Boundaryの「組織(Organizations)」を選択する画面が表示されました。デフォルトの組織が用意されていますが、今回は新しく組織を作成するため「New」をクリック。



組織名を入力して「Save」をクリックすると……



新しく組織が作成され、プロジェクトを管理する画面に移ります。新規にプロジェクトを作成するため「New」をクリック。



こちらもプロジェクト名を入力して「Save」をクリックし、プロジェクトを作成します。



プロジェクトには「セッション(Sessions)」「ターゲット(Targets)」「ホストカタログ(Host Catalogs)」という設定項目があります。ひとまずプロジェクトで管理するホストを設定するため、「Host Catalogs」から「New」をクリック。



ホストカタログ名を入力して「Save」をクリック。ホストカタログとは、Boundaryで管理するホストの一覧のことです。



ホストカタログには、ホストの集合であるホストセット(Host Sets)が利用できます。「Host Sets」から「New」をクリック。



ホストセット名を入力して「Save」をクリックします。



続いて「Hosts」から「New」をクリックし、ホストの登録を行います。



ホスト名とIPアドレスを入力して「Save」。



「Targets」から「Host Sets」「Add Host Sets」と進み、ターゲットにホストセットを追加します。



先ほど設定したホストを選択して「Add Host Sets」をクリック。これでホストカタログの設定は完了。



ホストカタログにホストを登録したら、ターゲットの登録を行います。ターゲットとは接続したいサービスのことで、具体的にはSSHやRedis、Postgresなどを登録していきます。



ターゲット名とポートを入力して「Save」をクリックすれば、プロジェクトの接続先に関する基本的な設定は完了。Boundaryでは接続先の管理を「ホスト」と「サービス」に分けて管理することで、簡単かつきめ細かい権限管理ができるようになっています。



続いてプロジェクト内のユーザーやグループに権限を設定していきます。まずはユーザーを追加するため「Users」から「New」をクリック。



ユーザー名を入力して「Save」。



こんな感じでユーザーを登録しておきます。



グループも「Groups」から同じように追加可能。



なお、グループは名称の設定に加え、グループに参加させるユーザーも設定しておく必要があります。



「Roles」ではユーザーやグループごとに、アクセスできるターゲットやホストを設定します。「Roles」タブから「New」をクリックし、ロールを追加します。



ロール名を入力して「Save」をクリック。



「Principals」をクリックし、「Add Principals」をクリック。権限を適用するユーザーやグループを選択していきます。



ユーザーやグループを選択して「Add Principals」をクリック。これで選択したユーザーやグループにロールが適用されました。



「Grants」ではこのロールで「何に」「どんな操作を」許可するかを設定します。記述フォーマットは「id=許可するターゲットやホストのID;type=タイプ;actions=許可する動作」という感じで、記述できたら「Add」をクリックして「Save」をクリック。



「Auth Methods」の項目では、各ユーザーがBoundaryを経由してシステムにアクセスする際の「Boundaryとの認証方法」を設定します。



こちらも認証名を入力して「Save」をクリック。



この認証を利用するアカウントを設定するため「Accounts」から「Create Account」をクリックします。



アカウント名、ログインネーム、パスワードを入力して「Save」。



こんな感じで、各ユーザーに対して認証方法を用意。



あとはユーザー設定の「Accounts」から「Add Accounts」をクリックして……



用意したアカウントをユーザーに割り当て「Add Accounts」をクリックすればOK。これでBoundaryの設定は完了しました。



これで接続できる……と思いきや、正常に接続することができず。デフォルトで用意されているアカウントでも接続を行うことはできませんでした。正しく動作した場合、以下のコマンドを実行してBoundaryの認証を通過し……

boundary authenticate password -auth-method-id=ampw_1234567890 -login-name=admin -password=password


Boundaryコマンドを経由してターゲットにアクセスすることができるようです。

boundary connect ssh -target-id ttcp_1234567890 -username james


また、ターゲットへアクセスが行われた場合、プロジェクトの「Sessions」でどのユーザーがどのターゲットに接続しているかを一覧で確認することが可能です。