シークレットと暗号化
二つのマスターシークレット、それが保護するもの、セッションとトークンの有効期間
二つのマスターシークレット
二つのシークレットが、それ以外のすべてを保護します。インスタンスが実際のデータを保持する前に両方を設定し、インスタンスの外に保管し、 軽々しく変更しないでください。
| シークレット | 保護するもの | 設定されていない場合 | 紛失または変更した場合 |
|---|---|---|---|
ENCRYPTION_SECRET | データベースに保存されるすべてのパスワードとトークン。認証情報、LDAP のバインドパスワード、ランナーのトークン、SSO のクライアントシークレット、Slack と Teams の Webhook アドレス、チャットの API キー | ソースコードで公開されている既定のキーが使われます | 紛失:保存されているすべてのシークレットを再入力する必要があります。変更:7.3.0 からは、保存されているすべてのシークレットが再暗号化されます。 下記 を参照 |
ACCESS_TOKEN_SECRET | アクセストークンとリフレッシュトークンの署名。有効期間の長い API トークン も含みます | 起動のたびにランダムなシークレットが生成されるため、再起動のたびに全員がサインアウトされます | すべてのセッションとすべての API トークンが無効になります |
どちらも、設定されていない間は起動時に [SECURITY] の警告としてログに記録されます。設定ページはそれらの編集を拒否し、 API は決してそれらを返さず、バックアップは意図的にそれらを除外します。そのため、紛失した ENCRYPTION_SECRET はどこからも回復できません。 シークレットマネージャーにコピーを保管してください。暗号化シークレットは 32 文字のキーとして使われます。短い値や 長い値は、埋められるか切り詰められます。
ACCESS_TOKEN_SECRET を変更すると、すべてのセッションとすべての API トークンがすぐに終了します。一人のユーザーや一つの セッションのトークンを終了するには、 トークン で説明している失効を使ってください。
暗号化シークレットの変更
7.3.0 からは、 ENCRYPTION_SECRET を設定または変更しても、保存されているシークレットは失われなくなりました。次回の起動時に、ワーカーは ほかの何かがシークレットを書き込む前に、一つのデータベーストランザクションで、すべてのシークレットを新しいキーで再暗号化します。
| 状況 | 設定するもの |
|---|---|
インスタンスが ENCRYPTION_SECRET なしで、公開されている既定のキーで動作していた | ENCRYPTION_SECRET だけ。シークレットは既定のキーから再暗号化されます |
| インスタンスが独自のキーで動作していた | その一回の起動のために、 ENCRYPTION_SECRET に新しいキーを、 ENCRYPTION_SECRET_PREVIOUS に古いキーを設定します |
保存されているシークレットがそのどちらでもないキーで暗号化されていた場合は、何も変更されず、 ENCRYPTION_SECRET_PREVIOUS がそのキーを 指定するまでアプリは起動を拒否します。起動で再暗号化されたら ENCRYPTION_SECRET_PREVIOUS を削除し、 新しい ENCRYPTION_SECRET をすべてのアプリノード、ワーカー、そして自分自身を登録するデータベースモードのすべての RTE に設定してください。その 自己登録( RTE_REGISTER )は 7.3.0 で非推奨になりました。ソケットモードで参加トークン( RTE_JOIN_TOKEN )を使って参加する RTE には ENCRYPTION_SECRET は不要です。 RTE のモード を参照してください。
トークン
サインインすると、有効期間の短いアクセストークンと、より長いリフレッシュトークンが返され、ブラウザーはそれを使って新しい組を取得します。
ACCESS_TOKEN_EXPIRATION:既定は30mです。短くすると、 傍受されたトークンが使える範囲が限られます。ACCESS_TOKEN_REFRESH_EXPIRATION:既定は24hです。 操作のないブラウザーがサインインしたままでいられる時間です。- ロールオプション
allowApiTokensを使うと、ユーザーは指定した日数有効な API トークンを要求でき、extendedTokenExpirationを加えると期限切れにならないものも要求できます。スクリプトからの API アクセスが必要なロールにだけ付与してください。 プロフィールページ では、トークンは 10 分以内にサインインしたブラウザーのセッションから作成され、 別の API トークンからは決して作成されません。期限切れにならないトークンの有効期間は 50 年で、下のイベントでは引き続き終了します。 API_TOKEN_MAX_DAYS:既定は90です。API トークンの最長の 有効期間で、それより長い要求はこの値に切り詰められます。
トークンは署名された JWT ですが、サーバーはすべてのアプリノードで共有される失効したトークンのリストも保持しているので、トークンは 期限切れになる前に終了できます。
| イベント | 終了するもの |
|---|---|
| サインアウト | そのサインインのすべてのトークン。アクセストークン、そのリフレッシュトークン、そしてサインアウトに API トークンを使った場合はその API トークン |
| ユーザー自身または管理者によるパスワードの変更 | 変更前に発行されたユーザーのすべてのトークン。API トークンも含め、すべてのデバイスで |
| ユーザー(ローカル、LDAP、SSO のユーザー)の サインインを許可 スイッチをオフにする、またはローカルユーザーを削除する | ユーザーのすべてのトークン |
| LDAP または SSO のユーザーのページの セッションを終了 | ユーザーのすべてのトークン。ブロックされていなければ再びサインインできます |
| プロフィールページまたはユーザーの API トークン タブで API トークンの 取り消す | その API トークン一つが、すぐに |
スクリプトは、自分の API トークンでサインアウトすることでそのトークンを終了します。 Authorization ヘッダーにトークンを付けて POST /api/v2/auth/logout を呼び出します。