AWS LambdaでCommanderを使用

AWSクラウドでCommanderを実行

概説

Commanderは、多くの問題を解決し、Keeper Securityの環境に関する貴重な情報を提供する強力なツールです。Commanderは、ローカルのデスクトップまたはサーバーで使用するだけでなく、AWSなどのクラウド環境で実行して、スケジュール実行やオンデマンド実行の要望に応えることができます。

この例では、AWS LambdaでCommanderを使用して、ユーザーレポートと使用状況レポートを計画的に実行する方法を説明します。

前提条件

  • Commander

  • マスターパスワードログイン方式を使用するKeeperユーザーアカウント (SSOログインとMFAはユーザー操作なしでは利用できません)

  • AWSのアクセス権、Lambda関数の作成権限、AWS Cloud 9でのレイヤーの作成権限

手順

Cloud 9を使用してLambdaレイヤーを作成

Commanderは、AWS Lambdaで実行する環境に対応したマシンでパッケージ化する必要があります。これを行うには、Cloud 9でCommanderパッケージを作成します。

Cloud 9プラットフォームとしてAmazon Linux 2を選択します。

AWS Cloud 9で、インストール済みのPythonインタープリタのバージョンを確認します。

python3 --version
Python 3.7.16

2023年3月現在、Python 3.8をインストールできます

sudo amazon-linux-extras install python3.8

python3.8 --version
Python 3.8.16

AWS Cloud 9で、zipファイル形式を使用してレイヤーを作成し、pythonディレクトリを追加します

mkdir commander-layer
cd commander-layer
mkdir python

pipを使用して、次の依存関係をインストールします。

  • keepercommander

pip3 install -t ./package keepercommander

Python 3.8をインストールした場合

pip3.8 install -t ./package keepercommander

現在インストール済みのCommanderパッケージをzip圧縮します

zip ../deployment-package.zip .
cd ..

Lambdaレイヤーを公開します

aws lambda publish-layer-version --layer-name keepercommander 
--zip-file fileb://deployment-package.zip --compatible-runtimes python3.7
aws lambda publish-layer-version --layer-name keepercommander 
--zip-file fileb://deployment-package.zip --compatible-runtimes python3.8

Lambdaの作成

AWS Lambdaで、Lambdaエディタを使用してPython関数を作成します。

lambda_handler関数は、処理される際にLambdaによって呼び出されます。

Commander Lambda関数の完全な例を以下に例示します。

#  _  __
# | |/ /___ ___ _ __  ___ _ _ ®
# | ' </ -_) -_) '_ \/ -_) '_|
# |_|\_\___\___| .__/\___|_|
#              |_|
#
# Keeper Commander
# Copyright 2023 Keeper Security Inc.
# Contact: ops@keepersecurity.com
#
#
import json
import os
import datetime
from typing import Optional

from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

import boto3

from keepercommander import api
from keepercommander.commands.enterprise import UserReportCommand, SecurityAuditReportCommand
from keepercommander.params import KeeperParams

# 既存の2つのCommanderレポートのデータを組み合わせて、レポートを作成(形式:JSON)
def create_user_report(params):  # タイプ:(KeeperParams) -> オプション[str]
    user_report = UserReportCommand()
    user_report_data = user_report.execute(params, format='json')
    data = json.loads(user_report_data)
    users = {x['email']: x for x in data}
    security_audit_report = SecurityAuditReportCommand()
    security_audit_report_data = security_audit_report.execute(params, format='json')
    if security_audit_report_data:
        data = json.loads(security_audit_report_data)
        for x in data:
            if 'email' in x:
                email = x['email']
                if email in users:
                    user = users[email]
                    for key in x:
                        if key not in user:
                            if key not in ('node_path', 'username'):
                                user[key] = x[key]
                else:
                    users[email] = x

    return json.dumps(list(users.values()), indent=2)


# このLambdaのエントリポイント
def lambda_handler(event, context):
    params = get_params()
    api.login(params)
    
    # AWSの組み込みロギングモジュールを使用して、Commander関連の問題(無効なクレデンシャルや不適切なアカウント権限など)をログに記録して異常終了
    if not params.session_token:
        print('Not connected') 
        return 'Error:See Lambda log for details'
    if not params.enterprise:
        print('Not enterprise administrator')
        return 'Error:See Lambda log for details'
    
    # レポートの生成と送信 
    report = create_user_report(params)
    response = email_result(report)
    return response


# このLambdaの環境変数で指定された受信者にレポートデータを(JSON添付ファイルとして)メールで送信
def email_result(report):
    sender = os.environ.get('KEEPER_SENDER')
    sendto = os.environ.get('KEEPER_SENDTO')
    region = 'us-east-1'
    ses_client = boto3.client('ses', region_name=region)

    message = MIMEMultipart('mixed')
    message['Subject'] = 'Keeper Commander User Security Report With  CSV (attached)'
    message['From'] = sender
    message['To'] = sendto
    now = datetime.datetime.now()

    body = MIMEText(f'User Report Output created and sent at {now}', 'plain')
    message.attach(body)

    attachment = MIMEApplication(report)
    attachment.add_header('Content-Disposition', 'attachment', filename='user-report.json')
    message.attach(attachment)

    response = ses_client.send_raw_email(
        Source=message['From'],
        Destinations=[sendto],
        RawMessage={'Data': message.as_string()}
    )
    
    return response


# 環境変数から必要なCommanderパラメータを取得
def get_params():
    user = os.environ.get('KEEPER_USER')
    pw = os.environ.get('KEEPER_PASSWORD')
    server = os.environ.get('KEEPER_SERVER')
    private_key = os.environ.get('KEEPER_PRIVATE_KEY')
    token = os.environ.get('KEEPER_DEV_TOKEN')
    my_params = KeeperParams()
    my_params.user = user
    my_params.password = pw
    my_params.server = server
    my_params.device_private_key = private_key
    my_params.device_token = token
    return my_params


if __name__ == '__main__':
    from keepercommander.__main__ import get_params_from_config
    my_params = get_params_from_config(os.path.join(os.path.dirname(__file__), 'config.json'))

    if my_params.user:
        print(f'User(Email): {my_params.user}')
    else:
        while not my_params.user:
            my_params.user = input('User(Email): ')

    api.login(my_params)
    if not my_params.session_token:
        exit(1)

    print(create_user_report(my_params))

この関数は以下の複数の要素で構成されています。

lambda_handler関数

この関数は、lambdaが実行されたときに呼び出されます。他のすべての関数は、この関数から呼び出す必要があります。

Commanderパラメータの収集

Commanderは、ユーザーアカウントを認証するために複数のパラメータを使用します。 これらを環境変数として添付し、Lambdaに注入します。 以下の説明をご参照ください。

Commander関数

上記の手順は、LambdaでCommanderを実行するために_必要な_すべての手順です。これらの手順が完了すると、Commander SDKコードを実行できるようになります。

この例では、ユーザーステータスレポートを実行し、結果をメールアドレスに送信します。

Commanderパラメータの設定

Commanderは、複数のパラメータを使用してユーザーアカウントを認証し、アクセスするKeeperリージョンを識別します。 これらのパラメータをLambdaに渡すために、環境変数として設定します。

パラメータの収集

CLIにログインすると、Commanderが必要なパラメータを自動的に作成してくれます。 必要なパラメータを生成する最も簡単な方法は、マシンでCommanderのCLIにログインすることです。

Commanderパラメータを取得するには、生成されたconfig.jsonファイルを開きます。 デフォルトでは、このファイルはマシンのUsers/[your username]/.keeper/フォルダにあります。 詳細は、設定ファイルのドキュメントをご参照ください。

以下のようなファイルが表示されるはずです。

{
    "clone_code":"36[...]A0g",
    "user": "user@example.com",
    "server": "keepersecurity.com",
    "private_key": "sxv[...]oz3p=fzw",
    "device_token": "xko[...]r2IxdiQ"
}

AWS Lambdaのパラメータ設定

必要なCommanderパラメータを環境変数として設定するには、まず、lambda設定に移動し、「Environment Variables (環境変数)」を選択します。

Commanderの各パラメータをLambdaで使用する環境変数として設定します。

また、Commanderへのログインに使用するKeeperのマスターパスワードも追加する必要があります。

環境変数名

KEEPER_USER

Keeperユーザーアカウントのメールアドレス (設定のuserフィールド)

user@example.com

KEEPER_SERVER

Keeperサーバーのドメイン (設定のserverフィールド)

keepersecurity.com

KEEPER_CLONE_CODE

設定のclone_codeフィールド

36df3[...]A0dsa4g

KEEPER_PRIVATE_KEY

設定のprivate_keyフィールド

sxv[...]oz3p=fzw

KEEPER_DEV_TOKEN

設定のdevice_tokenフィールド

xko[...]r2IxdiQ

KEEPER_PASSWORD

Keeperアカウントのパスワード

*****

KEEPER_SENDER

メールの送信元のアドレス

user@example.com

KEEPER_SENDTO

メールの送信先のアドレス

receiver@example.com

このコード例では、環境変数を使用して、送信元と送信先のメールアドレスを設定しています。 スクリプトでメールを送信しない場合、これらは必要ありません。

Lambdaの設定

タイムアウトの設定

Lambda設定の全般設定セクションで、タイムアウト値を変更することをお勧めします。一部のCommander関数は実行に時間がかかるため、スクリプトの完了にこの数値よりも長い時間がかかる場合、Lambdaは完了せずに自動的に終了してしまいます。

途中で終了する心配のない数値に設定してください。値を300秒 (5分) に設定すれば、ほとんどのプロセスに十分な時間を上回るはずです。

レイヤーの選択

Lambdaエディタで、上記で作成したレイヤーを選択して、LambdaビルドにCommanderパッケージを追加します。

実行スケジュールの作成

Lambdaを呼び出すEventCloudトリガーを作成し、適切な頻度 (たとえば、1日に1回や30日に1回) で動作するように設定します。

AWSでは、メールやSMSによるトリガーなど、他のいくつかのソースからLambdaを呼び出すように設定することもできます。その他のオプションについては、Lambdaの呼び出しに関するAmazonのドキュメントをご参照ください。

メール送信の設定

この例では、レポート結果をメールで送信します。メールを有効にするには、LambdaがSESのSendEmail/SendRawEmailサービスにアクセスできるようにする必要があります。

さらに、メール送信を有効にするには、IAM IDを作成する必要があります。

AWSでのメール送信の設定の詳細は、Amazonのドキュメントをご参照ください。

この例では、レポート結果をメールで送信します。メールを有効にするには、LambdaがSESのSendEmail/SendRawEmailサービスにアクセスできるようにする必要があります。

次の手順

この例では、2つのCommanderレポート (security-reportsecurity-audit-report) の結果を組み合わせたレポートを実行し、JSON添付ファイルとしてメールで送信します。これにより、企業全体のセキュリティ監視データ (社内の各ユーザーの最終ログイン日や総合セキュリティスコアなど) を定期的かつ自動的に取得できます。 ただし、この設定では、その他の一連のCommander関数はLambdaで実行できます。

他のCommander機能、Lambda呼び出しメソッド、およびその他のAWSサービス (プッシュ通知の様々な方法を利用できるSNSなど、たとえば、SMSメッセージ) を試すことで、Keeperプロセスに自動化の恩恵をもたらします。

Commander SDKコードの使用例については、Commander GitHubリポジトリの以下のサンプルスクリプトをご参照ください。

Commanderのさまざまなメソッドの詳細は、コマンドリファレンスセクションをご参照ください。

pageコマンドリファレンス

最終更新