概説
Commanderは、多くの問題を解決し、Keeper Securityの環境に関する貴重な情報を提供する強力なツールです。Commanderは、ローカルのデスクトップまたはサーバーで使用するだけでなく、AWSなどのクラウド環境で実行して、スケジュール実行やオンデマンド実行の要望に応えることができます。
この例では、AWS Lambdaで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を使用して、次の依存関係をインストールします。
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のマスターパスワードも追加する必要があります。
このコード例では、環境変数を使用して、送信元と送信先のメールアドレスを設定しています。 スクリプトでメールを送信しない場合、これらは必要ありません。
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-report
とsecurity-audit-report
) の結果を組み合わせたレポートを実行し、JSON添付ファイルとしてメールで送信します。これにより、企業全体のセキュリティ監視データ (社内の各ユーザーの最終ログイン日や総合セキュリティスコアなど) を定期的かつ自動的に取得できます。 ただし、この設定では、その他の一連のCommander関数はLambdaで実行できます。
他のCommander機能、Lambda呼び出しメソッド、およびその他のAWSサービス (プッシュ通知の様々な方法を利用できるSNSなど、たとえば、SMSメッセージ) を試すことで、Keeperプロセスに自動化の恩恵をもたらします。
Commander SDKコードの使用例については、Commander GitHubリポジトリの以下のサンプルスクリプトをご参照ください。
Commanderのさまざまなメソッドの詳細は、コマンドリファレンスセクションをご参照ください。