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

ECS (Fargate)サービスを使用してKeeperオートメーターを実行し、機密情報のストレージとして Keeperシークレットマネージャーを実行

概要

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

Keeperのセットアップ

本デプロイでは、Keeperシークレットマネージャーを使用する必要があるため、オートメーターサービスを公開するためにKeeperボルトおよびSSL証明書を設定するために必要な手順を確認します。

1. SSL証明書

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

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

2. 共有フォルダの作成

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

3. 添付ファイルの追加

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

4. オートメータープロパティファイルの追加

以下の内容の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は、マネージドロードバランサーでオートメーターサービスを実行する場合に必要になります。

共有フォルダとレコードは以下のようになります。

共有フォルダのレコードに3つのファイル

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

コンテナー内にKeeperシークレットマネージャー (KSM) アプリケーションを作成します。シークレットマネージャーをご使用でない場合は、こちらのガイドをご参照ください。アプリケーションの名前はオートメーターですが問題ありません。

KSMアプリケーション

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

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

共有フォルダにアプリケーションを割り当てる

7. KSMデバイス設定の作成

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

base64設定の作成

AWSのセットアップ

1. VPCの作成

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

VPCのセットアップ

2. CloudWatchロググループの作成

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

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

CloudWatchロググループの作成

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

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

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

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

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

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

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

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

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

ARNをメモ

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

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

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

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

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

ECSセキュリティグループの作成
Keeperテナント地域
IP1
IP2

US

54.208.20.102/32

34.203.159.189/32

US GovCloud

18.252.135.74/32

18.253.212.59/32

EU

52.210.163.45/32

54.246.185.95/32

AU

3.106.40.41/32

54.206.208.132/32

CA

35.182.216.11/32

15.223.136.134/32

JP

54.150.11.204/32

52.68.53.105/32

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

EFSでのネットワークセキュリティグループの管理

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

EFSでセキュリティグループを変更

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

Amazon Elastic Container Serviceへ進みます。

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

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

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

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

AWS FargateでECSクラスターを作成

8. ECSタスク定義の作成

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

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

  • 本ガイドの冒頭で作成したKeeperシークレットマネージャーの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を削除し、変更したJSONファイルをボックスにコピーして貼り付けてから[作成]をクリックします。

タスク定義

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

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

AWSのアプリケーションロードバランサーがオートメーターのリクエストに対応するには、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
   (証明書チェーンの箇所へ貼り付け)
Automatorサービス用に証明書をインポート

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のターゲットグループを選択します。

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

ECSサービスの環境部分
デプロイ設定
ECSサービスのネットワーク部分

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

13. DNSの更新

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

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

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

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

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

  • AWS地域を選択します。

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

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

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

次の手順では、タスクを1件だけ実行した状態でKeeperコマンダーを使用してオートメーターを設定します。

14. Keeperコマンダーのインストール

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

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

$ keeper shell

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

15. コマンダーでの初期設定

Keeperコマンダーにログインし、automator createで始まる一連のコマンドを使用してオートメーターを有効にします。

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

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

オートメーターの作成

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

                    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 setup "My Automator"

新しい設定でオートメーターを初期化します。

automator init "My Automator"

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

automator enable "My Automator"

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

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

https://<server>/health

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

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

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

16. ユーザー体験のテスト

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

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

ボルトへのログイン
SSOログイン
自動承認
ボルトの復号化

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

17. タスク定義の更新

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

サービスの更新
必要なタスク数を設定

ログとモニター

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

ログとモニター

最終更新