# Java SDKでのPAMの利用方法

PAM (特権アクセスマネージャー) レコードには、特権リソースへの接続方法を定義する接続設定が含まれています。Java SDKでは、これらの設定にアクセスするために、次の3つの専用クラスが用意されています。

* **PamRbiConnection**\
  RBI (Remote Browser Isolation) 接続の設定を提供します。音声やクリップボードの制御設定が含まれます。
* **PamSettingsConnection**\
  プロトコル別の接続設定を提供します (RDP、SSH、VNC、Kubernetes)。
* **PamSettingsPortForward**\
  ローカルポートの設定を含む、ポートフォワーディングの構成を提供します。

## PAM接続設定にアクセスする

{% code title="Example.java" %}

```java
import com.keepersecurity.secretsManager.core.*;

// ストレージは既に初期化されていると仮定
SecretsManagerOptions options = new SecretsManagerOptions(storage);
KeeperSecrets secrets = SecretsManager.getSecrets(options);

KeeperRecord pamRecord = secrets.getRecords().get(0);
KeeperRecordData data = pamRecord.getData();

// PAM設定フィールドにアクセス
PamSettings pamSettings = data.getField(PamSettings.class);
if (pamSettings != null && !pamSettings.getValue().isEmpty()) {
    PamSetting setting = pamSettings.getValue().get(0);

    // 接続設定にアクセスする
    if (setting.getConnection() != null) {
        PamSettingsConnection conn = setting.getConnection();

        System.out.println("Protocol: " + conn.getProtocol());
        System.out.println("Port: " + conn.getPort());

        // プロトコル固有の設定にアクセス
        if ("rdp".equals(conn.getProtocol())) {
            System.out.println("Screen Width: " + conn.getWidth());
            System.out.println("Screen Height: " + conn.getHeight());
            System.out.println("Color Depth: " + conn.getColorDepth());
        }
    }
}
```

{% endcode %}

## RDP接続設定

Windowsリモートデスクトップ接続向けのRDP固有の設定にアクセスします。

{% code title="Example.java" %}

```java
PamSettings pamSettings = data.getField(PamSettings.class);
if (pamSettings != null && !pamSettings.getValue().isEmpty()) {
    PamSetting setting = pamSettings.getValue().get(0);

    if (setting.getConnection() != null && "rdp".equals(setting.getConnection().getProtocol())) {
        PamSettingsConnection conn = setting.getConnection();

        // 表示設定
        System.out.println("Width: " + conn.getWidth());
        System.out.println("Height: " + conn.getHeight());
        System.out.println("DPI: " + conn.getDpi());
        System.out.println("Color Depth: " + conn.getColorDepth());

        // リモートアプリケーション設定
        System.out.println("Initial Program: " + conn.getInitialProgram());
        System.out.println("Remote App: " + conn.getRemoteApp());
        System.out.println("Remote App Directory: " + conn.getRemoteAppDir());
        System.out.println("Remote App Arguments: " + conn.getRemoteAppArgs());

        // オーディオ設定
        System.out.println("Console Audio: " + conn.getConsoleAudio());
        System.out.println("Enable Audio Input: " + conn.getEnableAudioInput());

        // クライアント設定
        System.out.println("Client Name: " + conn.getClientName());
        System.out.println("Server Layout: " + conn.getServerLayout());

        // 機能の切り替え
        System.out.println("Enable Touch: " + conn.getEnableTouch());
        System.out.println("Enable Printing: " + conn.getEnablePrinting());
        System.out.println("Enable Theming: " + conn.getEnableTheming());
        System.out.println("Enable Font Smoothing: " + conn.getEnableFontSmoothing());

        // キャッシュ設定
        System.out.println("Disable Bitmap Caching: " + conn.getDisableBitmapCaching());
        System.out.println("Disable Offscreen Caching: " + conn.getDisableOffscreenCaching());
        System.out.println("Disable Glyph Caching: " + conn.getDisableGlyphCaching());

        // その他の設定
        System.out.println("Normalize Clipboard: " + conn.getNormalizeClipboard());
        System.out.println("Console Mode: " + conn.getConsole());
        System.out.println("Read Only: " + conn.getReadOnly());
    }
}
```

{% endcode %}

## SSH/端末接続設定

SSHおよびターミナル固有の設定にアクセスします。

{% code title="Example.java" %}

```java
PamSettings pamSettings = data.getField(PamSettings.class);
if (pamSettings != null && !pamSettings.getValue().isEmpty()) {
    PamSetting setting = pamSettings.getValue().get(0);

    if (setting.getConnection() != null && "ssh".equals(setting.getConnection().getProtocol())) {
        PamSettingsConnection conn = setting.getConnection();

        // 端末表示設定
        System.out.println("Font Name: " + conn.getFontName());
        System.out.println("Scrollback Buffer: " + conn.getScrollback());
        System.out.println("Terminal Type: " + conn.getTerminalType());

        // 入力設定
        System.out.println("Backspace Key: " + conn.getBackspace());

        // ローカライゼーション設定
        System.out.println("Clipboard Encoding: " + conn.getClipboardEncoding());
        System.out.println("Locale: " + conn.getLocale());
        System.out.println("Timezone: " + conn.getTimezone());

        // 接続設定
        System.out.println("Server Alive Interval: " + conn.getServerAliveInterval());
    }
}
```

{% endcode %}

## VNC接続設定

リモートデスクトップ制御向けのVNC固有の設定にアクセスします。

{% code title="Example.java" %}

```java
PamSettings pamSettings = data.getField(PamSettings.class);
if (pamSettings != null && !pamSettings.getValue().isEmpty()) {
    PamSetting setting = pamSettings.getValue().get(0);

    if (setting.getConnection() != null && "vnc".equals(setting.getConnection().getProtocol())) {
        PamSettingsConnection conn = setting.getConnection();

        // オーディオ設定
        System.out.println("Enable Audio: " + conn.getEnableAudio());
        System.out.println("Audio Server: " + conn.getAudioServername());

        // 表示設定
        System.out.println("Swap Red/Blue: " + conn.getSwapRedBlue());
        System.out.println("Cursor Mode: " + conn.getCursor());
        System.out.println("Force Lossless: " + conn.getForceLossless());
    }
}
```

{% endcode %}

## Kubernetes接続設定

Kubernetes固有の設定にアクセスします。

{% code title="Example.java" %}

```java
PamSettings pamSettings = data.getField(PamSettings.class);
if (pamSettings != null && !pamSettings.getValue().isEmpty()) {
    PamSetting setting = pamSettings.getValue().get(0);

    if (setting.getConnection() != null && "k8s".equals(setting.getConnection().getProtocol())) {
        PamSettingsConnection conn = setting.getConnection();

        // 接続設定
        System.out.println("Use SSL: " + conn.getUseSSL());
        System.out.println("Namespace: " + conn.getNamespace());
        System.out.println("Pod: " + conn.getPod());
        System.out.println("Container: " + conn.getContainer());

        // 証明書設定
        System.out.println("CA Certificate: " + conn.getCaCert());
        System.out.println("Client Certificate: " + conn.getClientCert());
        System.out.println("Client Key: " + conn.getClientKey());
    }
}
```

{% endcode %}

## RBIオーディオおよびクリップボード制御

オーディオおよびクリップボード管理のためのRBI (リモートブラウザ分離) 設定にアクセスします。

{% code title="Example.java" %}

```java
import com.keepersecurity.secretsManager.core.*;

PamRemoteBrowserSettings rbiSettings = data.getField(PamRemoteBrowserSettings.class);
if (rbiSettings != null && !rbiSettings.getValue().isEmpty()) {
    PamRemoteBrowserSetting setting = rbiSettings.getValue().get(0);

    if (setting.getConnection() != null) {
        PamRbiConnection rbi = setting.getConnection();

        // オーディオ制御
        System.out.println("Disable Audio: " + rbi.getDisableAudio());
        System.out.println("Audio Channels: " + rbi.getAudioChannels());
        System.out.println("Audio BPS: " + rbi.getAudioBps());
        System.out.println("Audio Sample Rate: " + rbi.getAudioSampleRate());

        // クリップボード制御
        System.out.println("Disable Copy: " + rbi.getDisableCopy());
        System.out.println("Disable Paste: " + rbi.getDisablePaste());
    }
}
```

{% endcode %}

## ポートフォワーディング構成

ローカルポートのカスタマイズを含むポートフォワーディング設定にアクセスします。

{% code title="Example.java" %}

```java
PamSettings pamSettings = data.getField(PamSettings.class);
if (pamSettings != null && !pamSettings.getValue().isEmpty()) {
    PamSetting setting = pamSettings.getValue().get(0);

    if (setting.getPortForward() != null) {
        PamSettingsPortForward portForward = setting.getPortForward();

        // 基本的なポートフォワーディング
        System.out.println("Port: " + portForward.getPort());

        // ローカルポート設定
        System.out.println("Use Specified Local Port: " + portForward.getUseSpecifiedLocalPort());
        if (Boolean.TRUE.equals(portForward.getUseSpecifiedLocalPort())) {
            System.out.println("Local Port: " + portForward.getLocalPort());
        }
    }
}
```

{% endcode %}

## 完全なPAM接続の例

{% code title="PAMConnectionExample.java" %}

```java
import com.keepersecurity.secretsManager.core.*;

public class PAMConnectionExample {
    public static void main(String[] args) throws Exception {
        // ストレージは既に初期化されていると仮定
        SecretsManagerOptions options = new SecretsManagerOptions(storage);
        KeeperSecrets secrets = SecretsManager.getSecrets(options);

        for (KeeperRecord record : secrets.getRecords()) {
            KeeperRecordData data = record.getData();

            // 接続設定を持つPAMレコードかどうかを確認
            PamSettings pamSettings = data.getField(PamSettings.class);
            if (pamSettings != null && !pamSettings.getValue().isEmpty()) {
                PamSetting setting = pamSettings.getValue().get(0);

                // 接続設定にアクセスする
                if (setting.getConnection() != null) {
                    PamSettingsConnection conn = setting.getConnection();
                    String protocol = conn.getProtocol();

                    System.out.println("\n=== PAM Connection: " + data.getTitle() + " ===");
                    System.out.println("Type: " + protocol);
                    System.out.println("Port: " + conn.getPort());

                    // プロトコル固有の設定を処理
                    switch (protocol != null ? protocol : "") {
                        case "rdp":
                            System.out.println("RDP Display: " + conn.getWidth() + "x" + conn.getHeight());
                            System.out.println("Color Depth: " + conn.getColorDepth() + " bit");
                            System.out.println("Audio Input Enabled: " + conn.getEnableAudioInput());
                            break;

                        case "ssh":
                            System.out.println("Terminal Type: " + conn.getTerminalType());
                            System.out.println("Font: " + conn.getFontName());
                            System.out.println("Locale: " + conn.getLocale());
                            break;

                        case "vnc":
                            System.out.println("Audio Enabled: " + conn.getEnableAudio());
                            System.out.println("Cursor Mode: " + conn.getCursor());
                            break;

                        case "k8s":
                            System.out.println("Namespace: " + conn.getNamespace());
                            System.out.println("Pod: " + conn.getPod());
                            System.out.println("Container: " + conn.getContainer());
                            break;
                    }
                }

                // RBI設定をチェック
                PamRemoteBrowserSettings rbiSettings = data.getField(PamRemoteBrowserSettings.class);
                if (rbiSettings != null && !rbiSettings.getValue().isEmpty()) {
                    PamRemoteBrowserSetting rbiSetting = rbiSettings.getValue().get(0);
                    if (rbiSetting.getConnection() != null) {
                        PamRbiConnection rbi = rbiSetting.getConnection();
                        System.out.println("RBI Audio Disabled: " + rbi.getDisableAudio());
                        System.out.println("RBI Clipboard Copy Disabled: " + rbi.getDisableCopy());
                        System.out.println("RBI Clipboard Paste Disabled: " + rbi.getDisablePaste());
                    }
                }

                // ポートフォワーディングをチェック
                if (setting.getPortForward() != null) {
                    PamSettingsPortForward pf = setting.getPortForward();
                    if (Boolean.TRUE.equals(pf.getUseSpecifiedLocalPort())) {
                        System.out.println("Local Port: " + pf.getLocalPort());
                    }
                }
            }
        }
    }
}
```

{% endcode %}

{% hint style="warning" %}
プロトコル別フィールドの利用可否

`PamSettingsConnection` クラスには、複数のプロトコル (RDP、SSH、VNC、Kubernetes) に対応したフィールドが含まれています。実際に値が設定されるのは、レコードの `connectionType` に対応するフィールドのみです。

例

* RDPレコード\
  `width`、`height`、`colorDepth` に値が設定されます。
* SSHレコード\
  `fontName`、`terminalType`、`locale` に値が設定されます。
* VNCレコード\
  `enableAudio`、`cursor`、`swapRedBlue` に値が設定されます。
* Kubernetes (K8s) レコード\
  `namespace`、`pod`、`container` に値が設定されます。

プロトコル固有のフィールドにアクセスする前には、必ずnullチェックを行ってください。

```java
if ("rdp".equals(conn.getProtocol())) {
    Integer width = conn.getWidth(); // 安全: RDP固有のフィールド
}
```

RDPレコードに対してSSH用のフィールドへアクセスした場合、戻り値は `null` になります。
{% endhint %}


---

# Agent Instructions: 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:

```
GET https://docs.keeper.io/keeperpam/jp/secrets-manager/developer-sdk-library/java-sdk/working-with-pam-in-java-sdk.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
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.
