KSMを使用したAWS Elastic Container サービス(高度な設定)

ECS (Fargate)サービスを使用してKeeper Automatorを実行し、機密情報のストレージとして Keeper Secrets Managerを実行

概要

本ガイドでは、Fargateを使用してAmazon ECSでKeeper Automatorサービスを起動する方法について解説しながら、公開されたDockerコンテナのシークレット設定を取得するためにKeeper Secrets Managerを使用する方法を解説します。

Keeperのセットアップ

本デプロイでは、Keeper Secrets Managerを使用する必要があるため、Automatorサービスを公開するためにKeeperボルトおよびSSL証明書を設定するために必要な手順を確認します。

(1) SSL証明書

こちらのページの説明に従ってSSL 証明書を作成します。

この手順が完了すると、ssl-certificate.pfxssl-certificate-password.txtの2つのファイルが作成されます。

(2) 共有フォルダの作成

ボルト内に共有フォルダを作成します。このフォルダーは、シークレットマネージャーアプリケーション以外の誰にも共有されません。

(3) 添付ファイルの追加

共有フォルダに記録を作成し、記録UIDをメモします。SSL証明書とSSL証明書パスワードファイルを共有フォルダの記録にアップロードします。

(4) Automatorプロパティファイルの追加

以下の内容のkeeper.propertiesという新しいファイルをアップロードします。

ssl_mode=certificate
ssl_certificate_file=/config/ssl-certificate.pfx
ssl_certificate_file_password=
ssl_certificate_key_password=
automator_host=localhost
automator_port=443
disable_sni_check=true
persist_state=true

disable_sni_check=trueは、マネージドロードバランサーでAutomatorサービスを実行する場合に必要になります。

共有フォルダと記録は以下のようになります。

(5) KSMアプリケーションの作成

コンテナー内にKeeper Secrets Manager(KSM)アプリケーションを作成します。Secrets Manager をご使用でない場合は、こちらのガイドをご参照ください。アプリケーションの名前はAutomatorですが問題ありません。

(6) KSMアプリケーションを共有フォルダに添付

共有フォルダを編集し、Automatorアプリケーションをこのフォルダに追加します。

(7) KSMデバイス設定の作成

Secrets Managerアプリケーションを開き、[デバイス]タブをクリックして、[デバイスの追加]をクリックします。Base64設定を選択します。この設定をダウンロードして保存し、ECSタスク定義で使用できるようにします。

AWSのセットアップ

(1) VPCの作成

VPCが存在しない場合は、複数のサブネット、ルートテーブル、インターネットゲートウェイを持つ基本的なVPCをセットアップする必要があります。こちらの例では、以下のリソースマップに見られるように、インターネットゲートウェイを備えたVPC内に3つのサブネットが含まれています。

(2) CloudWatchロググループの作成

[CloudWatch] > [ロググループの作成]に移動します。

ロググループをautomator-logsと名付けます。

(3) タスク実行IAMロールの作成

[IAM] > [ロールの作成]へ行きます。

[AWSサービス]を選択します。

次に、Elastic Container Serviceを検索して選択します。

[Elastic Container Serviceタスク]を選択し、[次へ]をクリックします。

[AmazonECSTaskExecution]ポリシーをロールに追加し、[次へ]をクリックします。

ECSTaskWritetoLogsという名前を割り当てて、ロールを作成します。

このロールのARNをメモして次の手順で使用できるようにします。

本事例ではarn:aws:iam::373699066757:role/ECSTaskWritetoLogsとなります。

(4) ECSのセキュリティグループを作成

[EC2] > [セキュリティ グループ]に移動し、[セキュリティグループの作成]をクリックします。

Keeperテナントがホストされている地域に応じて、Keeperクラウドからのhttpsポート443を許可する受信ルールを作成する必要があります。各テナントの場所のIPのリストについては以下をご覧ください。以下の例では米国データセンターとなります。

  • また、テストとトラブルシューティングのためにご使用のワークステーションの外部IPアドレスを追加することを推奨します。

MyAutomatorServiceなどの名前を割り当て、[作成]をクリックします。

セキュリティグループを保存した後、受信ルールを再度編集します。今回はHTTPSポート443を追加し、ドロップダウンでセキュリティグループを選択します。これにより、ロードバランサーは状況を監視してトラフィックを分散できるようになります。

(5) EFS用セキュリティグループの作成

クラスターからEFSへのNFSアクセスを制御する別のセキュリティグループを作成します。

[EC2] > [セキュリティ グループ]に移動し、[セキュリティグループの作成]をクリックします。

MyAutomatorEFSのように名前を設定します。

NFSのタイプを選択してカスタムを選択してから、ECSクラスターの前の手順で作成したセキュリティ グループを選択します。

[セキュリティグループの作成]をクリックします。

次の手順のためにセキュリティグループIDをメモしておきます。この場合はsgr-089fea5e4738f3898となります。

(6) 2つのElastic File Systemボリュームを作成

現在、Automatorサービスは2つの異なるフォルダにアクセスする必要があります。本セットアップ例では、SSL証明書とSSLパスフレーズファイルを保存するために1つのボリュームを作成しています。2つ目のボリュームには、Automatorサービスのプロパティファイルが保存されます。これら3つのファイルはKeeperの記録に含まれています。

[AWS] > [Elastic File System]に移動し、[ファイルシステムの作成]をクリックします。

automator_configと名付けて、[作成]をクリックします。

再び[Elastic File System]に移動し、[Create file system]をクリックします。automator_settingsと名付けて[作成]をクリックします。

表示されるファイルシステムID(fs-xxxなど)は、ECSタスク定義で使用されます。

1 分後、2 つのファイルシステムが使用可能になります。それぞれをクリックしてから[ネットワーク]タブを選択し、[管理]をクリックします。

各サブネットのセキュリティグループを上記の手順で作成したもの(MyAutomatorEFSなど)に変更し、[保存]をクリックします。作成された両方のファイルシステムに同じネットワーク変更を加えます。

(7) Elastic Container Serviceクラスターの作成

Amazon Elastic Container Serviceへ進みます。

[クラスターの作成]を選択し、クラスター名とVPCを割り当てます。 こちらの例では、デフォルトの[AWS Fargate(サーバーレス)]インフラストラクチャを使用しています。

  • デフォルトの名前空間はautomatorで問題ありません

  • [インフラストラクチャ]は AWS Fargate(サーバーレス)に設定します

  • [作成]をクリックします

(8) ECSタスク定義の作成

任意のテキストエディタで、以下のJSONタスク定義ファイルをコピーして保存します。

JSONファイルに以下の変更を加えます。

  • 本ガイドの冒頭で作成したKeeper Secrets ManagerのXXXCONFIGXXX値をBase64設定に変更します。

  • 3箇所あるXXXXXを、KSMがアクセスしているボルトの共有フォルダ内のSSL証明書、SSL証明書パスワード、設定ファイルが含間れる記録UIDに変更します。

  • 2つのファイルシステム ID(fs-XXX)を、上記の手順からのものに変更します。

  • ロールIDのXXXをAWSロールに固有のものに変更します。

  • 2箇所のeu-west-1値を、ECSサービスの地域に変更します。

{
    "family": "automator",
    "containerDefinitions": [
        {
            "name": "init",
            "image": "keeper/keeper-secrets-manager-writer:latest",
            "cpu": 1024,
            "memory": 1024,
            "portMappings": [],
            "essential": false,
            "environment": [
                {
                    "name": "KSM_CONFIG",
                    "value": "XXXCONFIGXXX"
                },
                {
                    "name": "SECRETS",
                    "value": "XXXXX/file/ssl-certificate.pfx > file:/usr/mybin/config/ssl-certificate.pfx\nXXXXX/file/ssl-certificate-password.txt > file:/usr/mybin/config/ssl-certificate-password.txt\nXXXXX/file/keeper.properties > file:/usr/mybin/settings/keeper.properties"
                }
            ],
            "mountPoints": [
                {
                    "sourceVolume": "automatorconfig",
                    "containerPath": "/usr/mybin/config"
                },
                {
                    "sourceVolume": "automatorsettings",
                    "containerPath": "/usr/mybin/settings"
                }
            ],
            "volumesFrom": [],
            "logConfiguration": {
                "logDriver": "awslogs",
                "options": {
                    "awslogs-group": "automator-logs",
                    "awslogs-region": "eu-west-1",
                    "awslogs-stream-prefix": "container-1"
                }
            }
        },
        {
            "name": "main",
            "image": "keeper/automator:latest",
            "cpu": 1024,
            "memory": 4096,
            "portMappings": [
                {
                    "containerPort": 443,
                    "hostPort": 443,
                    "protocol": "tcp"
                }
            ],
            "essential": true,
            "environment": [],
            "mountPoints": [
                {
                    "sourceVolume": "automatorconfig",
                    "containerPath": "/usr/mybin/config"
                },
                {
                    "sourceVolume": "automatorsettings",
                    "containerPath": "/usr/mybin/settings"
                }
            ],
            "volumesFrom": [],
            "dependsOn": [
                {
                    "containerName": "init",
                    "condition": "SUCCESS"
                }
            ],
            "logConfiguration": {
                "logDriver": "awslogs",
                "options": {
                    "awslogs-group": "automator-logs",
                    "awslogs-region": "eu-west-1",
                    "awslogs-stream-prefix": "container-2"
                }
            }
        }
    ],
    "executionRoleArn": "arn:aws:iam::XXX:role/ECSTaskWritetoLogs",
    "networkMode": "awsvpc",
    "volumes": [
        {
            "name": "automatorconfig",
            "efsVolumeConfiguration": {
                "fileSystemId": "fs-XXX",
                "rootDirectory": "/",
                "transitEncryption": "ENABLED"
            }
        },
        {
            "name": "automatorsettings",
            "efsVolumeConfiguration": {
                "fileSystemId": "fs-XXX",
                "rootDirectory": "/",
                "transitEncryption": "ENABLED"
            }
        }
    ],
    "requiresCompatibilities": [
        "FARGATE"
    ],
    "cpu": "2048",
    "memory": "5120"
}

次に、[Elastic Container Service] > [タスク定義] > [JSONからタスクを作成]に移動します。

既存のJSONを削除し、変更したJSONファイルをボックスにコピーして貼り付けてから[作成]をクリックします。

このタスク定義は、インスタンスのCPU/メモリ要件に応じて変更できます。

(9) SSL証明書をAWS Certificate Managerにアップロード

AWSのアプリケーションロードバランサーが Automatorのリクエストに対応するには、SSL証明書が AWS Certificate Managerによって管理されている必要があります。

AWS Certificate Managerへ移動し、[インポート]をクリックします。

ご利用のワークステーション上でSSL証明書(.pfx)ファイルを、 PEMエンコードされた証明書本体、PEMエンコードされた秘密キー、PEMエンコードされた証明書チェーンに変換する必要があります。

.pfxファイルはすでに存在するので以下のopensslコマンドを使用します。ssl-certificate.pfxファイルと証明書パスワードをワークステーションへダウンロードし、以下のコマンドを入力します。

  • PEMエンコードされた証明書本体の生成

openssl pkcs12 -in ssl-certificate.pfx -out automator-certificate.pem -nodes
openssl x509 -in automator-certificate.pem -out certificate_body.crt
  • PEMエンコードされた秘密キーの生成

openssl pkey -in automator-certificate.pem -out private_key.key
  • PEMエンコードされた証明書チェーンの生成

openssl crl2pkcs7 -nocrl -certfile automator-certificate.pem | openssl pkcs7 -print_certs -out certificate_chain.crt

3つのファイルの内容を画面へコピーします。

cat certificate_body.crt | pbcopy
   (証明書本体の箇所へ貼り付け)
   
cat private_key.key | pbcopy
   (証明書秘密キーの箇所へ貼り付け)
   
cat certificate_chain.crt | pbcopy
   (証明書チェーンの箇所へ貼り付け)

(10) ターゲットグループの作成

[EC2] > [ターゲットグループ]に移動し、[ターゲットグループの作成] をクリックします。

  • ターゲットの種類として[IPアドレス]を選択します。

  • ターゲットグループ名にautomatortargetgroupまたは任意の名前を入力します。

  • ポート443のHTTPプロトコルを選択します。

  • ECSクラスターを含むVPC を選択します。

  • HTTP1を選択します。

  • [ヘルス チェック] で、ヘルスチェックプロトコルとして[HTTPS]を選択します。

  • ヘルスチェックのパスとして/healthと入力します。

  • [次へ]をクリックします。

  • まだターゲットを選択せずに[ターゲットグループの作成]をクリックします。

(11) アプリケーションロードバランサー(ALB)の作成

[EC2] > [ロードバランサー] > [ロードバランサーの作成]に移動します。

[Application Load Balancer] > [作成]を選択します。

  • automarnalbなどの任意の名前を割り当てます。

  • スキームはInternet-facingとなります。

  • IPアドレスの種類: IPv4

  • [ネットワークマッピング]の箇所で、ECSサービスをホストするVPCとサブネットを選択します。

  • セキュリティグループで、手順4で作成したMyAutomatorServiceを選択します。

  • [リスナーとルーティング]の箇所でHTTPSポート443を選択し、ターゲットグループで前の手順で作成したターゲットグループ(automatortargetgroup)を選択します。

  • [セキュアリスナー設定]で、手順9でAWS Certificate ManagerにアップロードしたACMからのSSL証明書を選択します。

  • [ロードバランサーの作成]をクリックします。

(12) ECSサービスの作成

[Elastic Container Service] > [タスク定義] > 手順8で作成したタスクを選択します。

このタスク定義から、[デプロイ] > [サービスの作成]をクリックします。

  • automatorの既存のクラスターを選択します。

  • サービス名にautomatorserviceまたは任意の名前を割り当てます。

  • 必要なタスクの数については、とりあえず1に設定します。設定が完了後に実行したいタスクの数を増やせます。

  • [ネットワーク]でVPCとサブネットを選択し、既存のセキュリティグループを手順4で作成した ECSセキュリティグループに置き換えます。この場合はMyAutomatorServiceとなります。

  • パブリックIPONにします。

  • [ロードバランシング]で、ロード バランサーの種類として[Application Load Balancer]を選択します。

  • 既存のロードバランサーを使用し、手順11で作成したautomatralbを選択します。

  • 既存のリスナーを使用し、443:HTTPSリスナーを選択します。

  • 既存のターゲットグループを使用し、手順10のターゲットグループを選択します。

  • [作成]をクリックします。

数分後にサービスが起動します。

(13) DNSの更新

DNS名がRoute53によってホストおよび管理されていると仮定します。

Route53 > レコードの作成または編集に移動します。

  • Aレコードを作成します。

  • エイリアスとして設定します。

  • トラフィックを[アプリケーションおよびクラシックロードバランサーへのエイリアス]にルーティングします。

  • AWS地域を選択します。

  • automaticalbアプリケーションロードバランサーを選択します。

  • [シンプルルーティング]を選択します。

  • [保存]を選択します。

次の手順では、タスクを1件だけ実行した状態でKeeper Commanderを使用してAutomatorを設定します。

(14) Keeper Commanderのインストール

この時点ではサービスは実行されていますが、まだKeeperと通信できない状態です。

ご利用のワークステーション、サーバー、コンピューターのどれかにKeeper Commander CLIをインストールします。初期設定にのみ使用します。バイナリインストーラーを含むインストール手順についてはこちらをご覧ください。 Commanderをインストールした後、keeper shellと入力してセッションを開いてからloginコマンドを使用してログインします。Automatorをセットアップするには、Keeper管理者またはSSO ノードを管理する権限を持つ管理者としてログインする必要があります。

$ keeper shell

My Vault> login admin@company.com
.
.
My Vault>

(15) Commanderでの初期設定

Keeper Commanderにログインし、automator createで始まる一連のコマンドを使用してAutomatorを有効にします。

My Vault> automator create --name="My Automator" --node="Azure Cloud"

ノード名 (この場合はAzure Cloud) は、以下のように管理コンソールUIから取得します。

コマンドの出力には、IDプロバイダからのメタデータを含むAutomator設定が表示されます。

                    Automator ID: 1477468749950
                            Name: My Automator
                             URL: 
                         Enabled: No
                     Initialized: No
                          Skills: Device Approval

以下のようにautomator editコマンドを実行します。これによりURLとスキルが設定されます(teamteam_for_userdevice)。

automator edit --url https://<application URL> --skill=team --skill=team_for_user --skill=device "My Automator"

次にキーを交換します。Automator公開キーで暗号化されたエンタープライズ秘密キーがAutomator に提供されます。

automator setup "My Automator"

新しい設定でAutomatorを初期化します。

automator init "My Automator"

サービスを有効にします。

automator enable "My Automator"

この時点で設定は完了となります。

自動ヘルスチェックには以下のURLをご使用になれます。

https://<server>/health

以下はcurlコマンドを使用した例です。

$ curl https://automator.lurey.com/health
OK

本セットアップ例では、ロードバランサーがターゲットインスタンスにヘルスチェックを転送します。

(16) ユーザー体験のテスト

Keeper Automatorが1件のタスクを実行した状態でデプロイされましたので、エンドユーザーの体験をテストできます。ユーザーがSSO IDプロバイダで認証した後は、承認を求めるプロンプトは必要なくなります。

最も簡単なテスト方法は、ブラウザでシークレットモードのウィンドウを開いてKeeperウェブボルトへアクセスし、SSOクラウドでログインすることとなります。デバイスの承認を求めるプロンプトは表示されなくなります。

承認が機能しましたので、実行するタスクの数を増やせます。

(17) タスク定義の更新

ECS画面からAutomatorサービスを開き、[サービスの更新]をクリックします。 次に、実行するタスクの数を設定します。

ログとモニター

Automatorログは、ECSサービスの[ログ]タブまたはCloudWatchで検索およびモニターできます。

最終更新