Unitのセキュリティ(デフォルトからの変更を推奨する設定)
概要
Ansible を利用してPersonium Unitを作成した場合、デフォルトで強い権限を持つUnitマスタートークンが有効になっています。本章ではデフォルトからの変更を推奨する設定についてご説明します。
推奨する設定には以下のようなものがあります。
- Unitマスタートークンの無効化
- Unit管理アカウントの管理
Unitマスタートークンの無効化
Unitマスタートークンは開発やテストの時に使うことを想定したものであり、特殊なケースを除き多くの場合本番運用ではセキュリティ的観点から無効化すべきものです。 しかし、新規作成されたPersonium にはUnit管理に使用するCellやアカウントが存在しません。そのためAnsible 実行前に任意のUnitマスタートークンを設定し、有効化した状態で構築しています。
Unitマスタートークンの無効化手順
UnitマスタートークンはAPサーバで以下の手順を行い無効化することが可能です。
'personium-unit-config.properties' の修正
vi /personium/personium-core/conf/18888/personium-unit-config.properties
- io.personium.core.masterToken パラメータをコメントアウトする事でUnitマスタートークンを無効化できます。
例:
... ##### Major Settings Items ##### # Unit Master Token. # Blank string should be configured in production use to disable it. # io.personium.core.masterToken= <- このパラメータをコメントアウトする # ...
Tomcat を再起動します
systemctl restart tomcat
Unit管理アカウントの管理
Ansible でPersonium Unitを管理するアカウントとしてデフォルトでunitadmin というUnitユーザーを作成しています。unitadmin は全てのCellやBoxといったリソースに対して追加・変更・削除といった操作が可能です。そのため、Ansible で構築した環境では共通的に使用するアカウント名のため、セキュリティレベルは下がってしまいます。
本番利用にあたっては、以下施策を組み合わせて実施することが必要です。
- unitadmin アカウントのパスワードを定期的に変更する
- unitadmin アカウントをリネームして用いる
- unitadmin Cellをリネームして用いる
- 外部にUnitユーザ管理機構を構築して利用する
Unitユーザーのパスワード変更
管理者権限としてCellにアクセス可能なUnit管理用のトークン(Unitユーザトークン)を取得します。 管理者権限としてのアクセスとは、Cellを作ったり消したりする権限を持つ状態で操作することを指します。 Unitユーザトークンは、Ansible で構築したUnitの環境情報で取得したUnit管理アカウント情報を用いて取得します。
OAuth2 Token エンドポイントAPIを使用します。(一旦取得したトークンは、1時間有効です)curl "https://unitadmin.{Personium_FQDN}/__token" \ -X POST -i -k \ -d "grant_type=password&username={unitadmin_account}&password={unitadmin_password}&p_target=https://{Personium_FQDN}/" \ -H "Content-Type: application/x-www-form-urlencoded"
成功するとAPIからJSON形式でレスポンスが返ります。 ここで取得した"access_token"の値が、Unitユーザトークンとなります。
{ "access_token":"PEFzc........(省略)........W9uPg", "refresh_token_expires_in":86400, "refresh_token":"RA~tw........(省略)........EeWsQ", "token_type":"Bearer", "expires_in":3600, "p_target":"https://{Personium_FQDN}/" }
取得したトークンを利用してパスワード変更を行います。パスワード変更はAccount更新APIのリクエストヘッダーの'X-Personium-Credential' に任意のパスワードを指定することで変更できます。 この例では "abcd1234" が 変更後のパスワードです。
(注意)
Unit管理アカウントは強い権限を持っているため、変更後のパスワードには推測されにくいものを指定してください。curl "https://unitadmin.{Personium_FQDN}/__ctl/Account('{unitadmin_account}')" \ -X PUT -i -k \ -H "X-Personium-Credential:abcd1234" -H "Content-Type: application/json" -H "Authorization:Bearer {Token}" \ -d "{\"Name\":\"{unitadmin_account}\"}"
このAPIはjson形式のレスポンス(ボディ)を返しません。 レスポンスコード204が返れば成功です。
HTTP/1.1 204 No Content
(注意)
変更した「Unit管理パスワード」を忘却したときはマスタートークンを用いUnit管理パスワードを変更する必要があります。
unitadmin アカウントをリネームして用いる
デフォルトの設定では強力な権限を持つトークンを取得するためのアカウントが簡単にわかってしまいます。
unitadmin アカウントをリネームすることで、この状態を解消します。
この例では "administrator" が 変更後のアカウントです。
curl "https://unitadmin.{Personium_FQDN}/__ctl/Account('unitadmin')" \
-X PUT -i -k \
-H "X-Personium-Credential:{unitadmin_password}" -H "Content-Type: application/json" -H "Authorization: Bearer {Token}" \
-d "{\"Name\":\"administrator\"}"
(注意)
※実施後、unitadminのトークンで作成済の既存のCellには、マスタートークン以外でのアクセスが出来なくなります。
unitadmin Cell のリネーム
デフォルトの設定では強力な権限を持つトークンを取得するためのエンドポイントURLが簡単にわかってしまいます。 unitadmin Cellをリネームすることで、この状態を解消します。 この例では "personium-admin" が 変更後のCell名です。
curl "https://{Personium_FQDN}/__ctl/Cell(Name='unitadmin')" \
-X PUT -i -k \
-H "Authorization: Bearer {Token}" -H "Content-Type: application/json" \
-d "{\"Name\":\"personium-admin\"}"
unitadmin CellがUnitユーザトークン発行可能な特別なCellであることは、APサーバ上のunit-config.propertiesファイルにおいて設定されています。 リネームしたCellに引き続き同様の権限を持たせるためには、unit-config.propertiesファイル上での設定を変更する必要もあります。
'personium-unit-config.properties' の修正
vi /personium/personium-core/conf/18888/personium-unit-config.properties
- io.personium.core.unitUser.issuers パラメータを修正する事でリネームしたCellに同様の権限を持たせます。
例:
... # 変更前 io.personium.core.unitUser.issuers=personium-localunit:/unitadmin/ # 変更後 io.personium.core.unitUser.issuers=personium-localunit:/personium-admin/ ...
Tomcat を再起動します
systemctl restart tomcat
(注意)
※実施後、unitadminのトークンで作成済の既存のCellには、マスタートークン以外でのアクセスが出来なくなります。
外部Unitユーザ管理機構を構築して利用
Unitユーザトークンの要件を満たすトークンを発行する機構を別途用意すれば、unitadmin Cell自体を使う必要はありません。