> For the complete documentation index, see [llms.txt](https://docs.keeper.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.keeper.io/keeperpam/jp/commander-cli/command-reference/keeperpam-commands/pam-workflow-security-hardening.md).

# PAM Workflow — セキュリティ強化

## PAM Workflow — セキュリティ強化

本ページでは、PAMワークフローサブシステム向けにコマンダーへ組み込まれたセキュリティ修正を取り扱います。エンドユーザー向けのコマンド構文の変更はありません。デバッグログを有効にして運用する管理者や、厳格な強制適用ポリシーが必要な環境では、内容の把握が重要です。

{% hint style="info" %}
**対象バージョン:** Keeperコマンダー17.3以降 (PR #2013 を含むリリースブランチ)
{% endhint %}

***

### 変更の概要

| 重大度 | 領域                             | 変更内容                                                                   |
| --- | ------------------------------ | ---------------------------------------------------------------------- |
| 高   | デバッグログにおける認証情報のマスク             | `turn_password`、`callback_token`、guacdシークレットフィールドは、デバッグログへ書き込む前にマスクされる |
| 高   | エンタープライズのブール値強制適用              | 空の `booleans=[]` リストは、ウェブボルトと同様にアクションを正しく拒否する                          |
| 中   | `pam workflow update` のブール値フラグ | `true` / `false` 以外の値は暗黙の型変換を行わず、エラーとなる                                |
| 中   | HHMM時間範囲のデコード                  | 時・分の抽出を正しく行うため、`divmod(value, 60)` を `divmod(value, 100)` に修正          |

***

### 1. デバッグログにおける認証情報のマスク

#### 背景

コマンダーを `--debug` で実行するか、Pythonの `logging` レベルを `DEBUG` に設定すると、内部状態が標準出力やログファイルへ書き込まれます。本修正以前は、WebRTC接続パラメーター ( `turn_password` や `callback_token` を含む) およびguacdトンネルパラメーター ( `password`、`private-key`、`passphrase`、`client-key` を含む) がそのままログに記録されていました。

#### 変更内容

**ファイル:** `keepercommander/commands/pam_launch/terminal_connection.py`

以下のフィールドは、いずれの `logging.debug()` 呼び出しの前に `***redacted***` に置き換えられます。

* **WebRTC設定:** `turn_password`、`callback_token`
* **guacd接続パラメーター:** `password`、`private-key`、`passphrase`、`client-key`

その他のフィールド (機密性の低いホスト、ポート、プロトコル値) は変更なくログに記録されるため、デバッグの有用性は維持されます。

#### 影響

通常運用時の動作変更はありません。デバッグレベルのログ出力に書き込まれる内容のみが対象です。コマンダーのログをSIEMへ取り込む管理者は、`DEBUG` ログイベントに認証情報の値が現れないことを確認できます。

***

### 2. 空のブール値強制適用リストに対する厳格な拒否

#### 背景

エンタープライズの強制適用ポリシーは、Keeperバックエンドから `booleans` 配列を含むJSONオブジェクトとして配信されます。キーが存在しない場合 ( `booleans` が欠落) はポリシー未設定とみなし、コマンダーは防御的にアクションを許可します。空配列 ( `booleans: []` ) は以前も同様に許可されていましたが、これは誤りでした。

ウェブボルトは `booleans: []` を「エンタープライズコンテキストは存在するが、関連するポリシーキーは未設定」と解釈し、リストの空さではなくキーの欠落によって拒否します。コマンダーの動作はウェブボルトと一致していませんでした。

#### 変更内容

**ファイル:** `keepercommander/commands/workflow/helpers.py`、`keepercommander/commands/discoveryrotation.py`

`is_pam_action_allowed_by_enforcement` と `_is_rotation_allowed_by_enforcement` は、いずれも以下のロジックを用います。

```
booleans = enforcements.get('booleans')
if booleans is None:
    # キーが完全に欠落 — ポリシー未設定; 防御的に許可
    return True
if not isinstance(booleans, list):
    # 不正なペイロード — 防御的に許可
    return True
# 空リスト: エンタープライズコンテキストは存在、ブール値キーは未設定
# キー参照へフォールスルー; キー欠落時は拒否 (ウェブボルトと一致)
```

#### 影響

エンタープライズの強制適用ポリシーが構成されている環境では、`booleans` が存在するが空であった場合に以前は許可されていたアクションがブロックされることがあります。これにより、コマンダーの強制適用の扱いがウェブボルトと揃います。アップグレード後に想定外の拒否が発生した場合は、Keeper管理コンソールでエンタープライズの強制適用ポリシー構成を確認してください。

***

### 3. `pam workflow update` の厳格なブール値引数パーサー

#### 背景

`pam workflow update` コマンドでは、複数のブール値フラグを指定できます。

```
pam workflow update <uid> --enabled <value> --skip-mfa <value> ...
```

以前は、真と評価される任意の文字列 ( `yes`、`1`、`on` など) が暗黙的に `True` に変換されていました。構成ミスが見過ごされる可能性がありました。

#### 変更内容

**ファイル:** `keepercommander/commands/workflow/config_commands.py`

ブール値引数では、リテラル文字列 `true` と `false` のみを指定できます (大文字小文字は区別しません)。それ以外の値を指定すると、明確なメッセージ付きで `argparse.ArgumentTypeError` が返されます。

**以前 (受け付けていたが、現在は拒否):**

```
pam workflow update <uid> --enabled yes      # rejected
pam workflow update <uid> --skip-mfa 1       # rejected
pam workflow update <uid> --enabled on       # rejected
```

**現在 (受け付け):**

```
pam workflow update <uid> --enabled true
pam workflow update <uid> --enabled false
pam workflow update <uid> --skip-mfa True    # case-insensitive
```

#### 影響

非標準のブール値文字列 ( `yes`、`1`、`on`、`no`、`0`、`off`) を用いるスクリプトは、`true` または `false` へ更新する必要があります。コマンダーをアップグレードすると従来の引数値ではコマンドが失敗するため、既存の自動化は修正が必要です（**後方互換性のない変更**）。

***

### 4. HHMM時間範囲デコードの修正

#### 背景

`pam workflow config show` は、ワークフローに構成された `allowedTimes` ウィンドウ、つまり `pam launch` が許可される曜日と時間帯を表示します。時間範囲の開始・終了値は、サーバー側でHHMM整数として保存されます (例: `17:30` → `1730`)。

表示フォーマッターは、時と分の抽出に `divmod(value, 60)` を用いていました。これは秒から分への変換式としては正しいものの、HHMM整数には当てはまりません。 `divmod(1730, 60)` は正しい `(17, 30)` ではなく `(28, 50)` となります。

#### 変更内容

**ファイル:** `keepercommander/commands/workflow/helpers.py`

```python
# Before (incorrect):
start_h, start_m = divmod(tr.startTime, 60)

# After (correct):
start_h, start_m = divmod(tr.startTime, 100)
```

#### 影響

`pam workflow config show` に表示される許可時間ウィンドウが、正しい読みやすい時刻になります。実行時の動作は変わりません。表示出力のみが対象です。許可時間の表示で想定外の時・分が見えていた管理者は、意図どおりかワークフロー構成を再確認してください。

***

### 変更の確認

コマンダーをアップグレードした後、以下の手順でセキュリティ修正が有効になっていることを確認できます。

**認証情報のマスク:** デバッグログ ( `--debug` ) を有効にし、PAMトンネルセッションを開始します。出力に `turn_password`、`callback_token`、guacdの認証情報フィールドが `***redacted***` として表示されることを確認します。

**強制適用の拒否修正:** エンタープライズセッションで、`booleans: []` が設定された強制適用ポリシーの構成に対し `pam workflow list` を実行します。制限されたアクションが想定どおり拒否されることを確認します。

**ブール値引数パーサー:** `pam workflow update <uid> --enabled yes` を実行し、コマンダーが引数エラーを表示することを確認します。

**HHMM表示の修正:** `allowedTimes` ウィンドウを持つワークフローで `pam workflow config show <uid>` を実行し、表示される開始・終了時刻がKeeper管理コンソールの構成と一致することを確認します。


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.keeper.io/keeperpam/jp/commander-cli/command-reference/keeperpam-commands/pam-workflow-security-hardening.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
