LogoLogo
Keeperコネクションマネージャー
Keeperコネクションマネージャー
  • 概要
  • セキュリティアーキテクチャ
  • インストール
    • ライセンスキー
    • システム要件
    • インストールの準備
    • Dockerの自動インストール
      • サービス管理
      • アップグレード
      • パッケージの追加
    • Docker Composeインストール
      • keeper/guacamole
      • keeper/guacd
      • データベースイメージ
        • keeper/guacamole-db-mysql
        • keeper/guacamole-db-postgres
      • SSLターミネーション
        • keeper/guacamole-ssl-nginx
        • カスタムSSL証明書の使用
      • アップグレード
    • バックアップと復元
  • 認証オプション
    • SAML SSO認証
      • Microsoft Azure
      • Okta
      • Google Workspace
      • OneLogin
      • Oracle
      • PingIdentity
    • TOTPを使用した2FA
    • Duoを使用した2FA
    • SSL/TLSクライアント認証
    • 複数のホスト名
    • PIV/CAC/スマートカード
    • アカウントの承認/拒否ワークフロー
    • OpenID Connect認証
    • LDAP認証
      • 複数のLDAPサーバーの使用
      • LDAP内の接続データを格納
      • LDAPとデータベースの併用
  • 接続プロトコル
    • RDP
    • SSH
    • VNC
    • Telnet
    • リモートブラウザ分離
    • Kubernetes
    • MySQL
      • インポートとエクスポート
      • キーボードショートカット
    • PostgreSQL
      • インポートとエクスポート
      • キーボードショートカット
    • Microsoft SQL Server
      • インポートとエクスポート
      • キーボードショートカット
    • ホストインスタンスへの接続
    • 永続的リバースSSHトンネル
      • WindowsサービスとしてのAutoSSH
      • Linux - AutoSSH
      • Windows - OpenSSH
  • KCMの使用方法
    • ログイン画面
    • ホーム画面
    • 接続の作成
      • 接続の一括インポート
    • KCMの使用方法
    • ファイル転送設定
    • 接続の共有
    • セッションのレコーディングと再生
    • AWS EC2ディスカバリ
    • クレデンシャルパススルー
    • 動的接続
    • カスタムブランディング
      • ロゴを追加する
  • ボルト連携
    • KCMをボルトに接続
    • 動的トークン
    • 静的トークン
    • 複数ボルトの連携
    • EC2 Cloud Connector
    • 高度な機能
    • KeeperPAM
  • カスタム拡張機能
  • ゲストモード
  • 高可用性
  • 詳細設定
    • guacamole.properties
      • SAML 2.0認証の設定プロパティ
      • Duo二要素認証の設定プロパティ
      • 暗号化されたJSONの設定プロパティ
      • LDAP設定のプロパティ
      • MySQL/MariaDBの設定プロパティ
      • PostgreSQL設定のプロパティ
      • SQL Serverの設定プロパティ
      • ログイン試行のプロパティ
  • トラブルシューティング
  • 接続のインポート
  • 接続のエクスポート
  • リリース前テスト
  • 変更記録
  • ライセンス供与とオープンソース
  • サポート範囲
  • セキュリティアドバイザリ
  • アクセシビリティ適合性
Powered by GitBook
On this page
  • 概要
  • 備考

接続のエクスポート

Keeperコネクションマネージャーから接続データをエクスポート

Previous接続のインポートNextリリース前テスト

Last updated 4 months ago

概要

本ページでは、Pythonスクリプトを使用して、接続データと接続パラメータをJSONファイルにエクスポートする方法の1つについて取り扱います。エクスポートされたファイルは、別の Keeperコネクションマネージャーのインスタンスへ接続をインポート (を参照) したり、Keeperコネクションマネージャーのクラウドバージョンへの移行に使用したりできます。

本ページに記載の例は、MySQLデータベースを使用したKeeperコネクションマネージャーの標準であるに基づいています。

1

ローカルマシンへのMySQLポートを開く

PythonファイルがDockerコンテナ内のデータベースをクエリできるようにするには、/etc/kcm-setup/docker-compose.jsonファイルを編集し、以下のように「ports」セクションを「db」コンテナに追加します。

db:
        image: keeper/guacamole-db-mysql :2
        restart: unless-stopped 
        environment:
            ACCEPT EULA: "Y"
            GUACAMOLE_DATABASE: "guacamole_db"
            GUACAMOLE_USERNAME: "guacamole_user"
            GUACAMOLE_PASSWORD: "XXXXXXXXXXXXXXXXXXXXXXXXX"
            GUACAMOLE_ADMIN_PASSWORD: "XXXXXXXXXXXXXXXXXXXXXXXXX"
            MYSQL_ROOT_PASSWORD: "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
        LOG_LEVEL: "debug"
        ports:
            - "3306:3306"            
2

Pythonモジュールをインストールする

インスタンスにすでにPython3がインストールされている前提で、必要なPythonモジュールをインストールします。

pip3 install mysql-connector-python
pip3 install pyyaml
3

エクスポートスクリプトを作成する

以下のコードをコピーしてexport.pyというファイルに貼り付け、Keeperコネクションマネージャーの インスタンス (kcm-setup.runファイルと同じ場所) に配置します。このPythonスクリプトは以下を実行します。

  • 標準/etc/kcm-setup/フォルダ内のdocker-compose.ymlファイルを特定する。

  • MySQLの認証情報を取得し、データベースに接続する。

  • 接続情報をエクスポートし、同じフォルダにexport.jsonというファイルを作成する。

環境によっては、ファイルを編集する必要がある場合があります。

export.py
import mysql.connector
import json
import yaml

# docker-compose.ymlファイルへのパス
docker_compose_file = '/etc/kcm-setup/docker-compose.yml'

# docker-compose.ymlからデータベースの認証情報を抽出する関数
def get_db_config_from_compose():
    with open(docker_compose_file, 'r') as file:
        # docker-composeのYAMLファイルを読み込む
        compose_data = yaml.safe_load(file)
        
        # `db`サービスから必要な情報を抽出
        db_service = compose_data['services']['db']
        environment = db_service['environment']
        
        db_name = environment.get('GUACAMOLE_DATABASE', 'guacamole_db')
        db_user = environment.get('GUACAMOLE_USERNAME', 'guacamole_user')
        db_password = environment.get('GUACAMOLE_PASSWORD', 'password')  # 存在しない場合のデフォルト値
        
        return {
            'host': 'localhost',  # データベースがDocker内にあるため、ローカルであると仮定します
            'user': db_user,
            'password': db_password,
            'database': db_name,
            'port': 3306  # デフォルトの MySQL ポート
        }

def build_connection_group_paths(cursor):
    """
    Build a dictionary mapping group IDs to their full paths by resolving parent-child relationships.
    """
    cursor.execute("SELECT connection_group_id, parent_id, connection_group_name FROM guacamole_connection_group")
    groups = cursor.fetchall()

    group_paths = {}

    def resolve_path(group_id):
        if group_id is None:
            return "ROOT"
        if group_id in group_paths:
            return group_paths[group_id]
        # Find the group details
        group = next(g for g in groups if g['connection_group_id'] == group_id)
        parent_path = resolve_path(group['parent_id'])
        full_path = f"{parent_path}/{group['connection_group_name']}"
        group_paths[group_id] = full_path
        return full_path

    # すべてのグループのパスを解決
    for group in groups:
        resolve_path(group['connection_group_id'])

    return group_paths

# 接続、ユーザー、グループ、属性を取得するためのSQLクエリ
query = """
SELECT
    c.connection_id,
    c.connection_name AS name,
    c.protocol,
    cp.parameter_name,
    cp.parameter_value,
    e.name AS entity_name,
    e.type AS entity_type,
    g.connection_group_id,
    g.parent_id,
    g.connection_group_name AS group_name,
    ca.attribute_name,
    ca.attribute_value
FROM
    guacamole_connection c
LEFT JOIN
    guacamole_connection_parameter cp ON c.connection_id = cp.connection_id
LEFT JOIN
    guacamole_connection_attribute ca ON c.connection_id = ca.connection_id
LEFT JOIN
    guacamole_connection_group g ON c.parent_id = g.connection_group_id
LEFT JOIN
    guacamole_connection_permission p ON c.connection_id = p.connection_id
LEFT JOIN
    guacamole_entity e ON p.entity_id = e.entity_id;
"""

def export_to_json(db_config):
    try:
        # データベースに接続する
        conn = mysql.connector.connect(**db_config)
        cursor = conn.cursor(dictionary=True)  # Dictionary cursor for better handling

        # 接続グループパスを作成する
        connection_group_paths = build_connection_group_paths(cursor) 

        # クエリを実行する
        cursor.execute(query)
        rows = cursor.fetchall()

        # データを期待される形式に整理する
        connections = {}
        for row in rows:
            conn_id = row['connection_id']
            if conn_id not in connections:
                # 接続グループのパスを解決する
                group_path = connection_group_paths.get(row['connection_group_id'], "ROOT")
                connections[conn_id] = {
                    'name': row['name'],
                    'protocol': row['protocol'],
                    'parameters': {},
                    'users': [],
                    'groups': [],  # ユーザーグループはここに配置します
                    'group': group_path,  # 接続グループパス
                    'attributes': {}
                }
            # パラメータを処理する
            if row['parameter_name']:
                connections[conn_id]['parameters'][row['parameter_name']] = row['parameter_value']
            # ユーザーを処理する
            if row['entity_type'] == 'USER' and row['entity_name'] not in connections[conn_id]['users']:
                connections[conn_id]['users'].append(row['entity_name'])
            # ユーザーグループを処理する
            if row['entity_type'] == 'USER_GROUP' and row['entity_name'] not in connections[conn_id]['groups']:
                connections[conn_id]['groups'].append(row['entity_name'])
            # 属性を処理する
            if row['attribute_name']:
                connections[conn_id]['attributes'][row['attribute_name']] = row['attribute_value']

        # リスト形式に変換
        connection_list = [conn for conn in connections.values()]

        # データをJSONファイルに出力
        with open('export.json', 'w') as json_file:
            json.dump(connection_list, json_file, indent=4)

        print("Export successful! Data written to export.json")

    except mysql.connector.Error as err:
        print(f"Error: {err}")
    finally:
        # カーソルと接続を閉じる
        if cursor:
            cursor.close()
        if conn:
            conn.close()

if __name__ == '__main__':
    # `docker-compose.yml` からデータベース設定を取得する
    db_config = get_db_config_from_compose()
    export_to_json(db_config)

スクリプトを実行するには、以下のように入力します。

sudo python3 export.py

これにより、ローカルフォルダにexport.jsonというファイルが生成されます。

このexport.jsonファイルには、接続の作成方法によっては接続シークレットが含まれる可能性があります。そのため、このファイルはKeeperボルトに保存して保護してください。

備考

  • 「groups」オブジェクトはユーザーグループを指します。

  • 「group」オブジェクトはコネクショングループの場所を指します。

  • このデータを別のKCMインスタンスにインポートする際、ターゲットにコネクショングループが存在している場合にのみ、接続は正常にインポートされます。

こちらのページ
Docker自動インストール方法