サービスをコールするためのインスタンスの構成

Compute Cloud@Customerコンピュート・インスタンスは、インスタンスで実行されているアプリケーションが、Compute Cloud@Customerユーザーがサービスをコールしてリソースを管理するのと同様の方法でサービスをコールし、リソースを管理できるように構成できます。

インスタンスが認可済アクター(またはプリンシパル)となり、サービス・リソースに対するアクションを実行できるようにするIAMサービス機能をインスタンス・プリンシパルと呼びます。

次のステップを実行して、インスタンスをプリンシパルとして設定および使用します。

サービスのコールを許可するためのインスタンス・ファイアウォールの構成

この項では、インスタンス・ファイアウォール構成を変更する方法、およびシステムの再起動時に変更をリストアするsystemdサービスを作成する方法について説明します。

ファイアウォール構成の変更
  1. 特権ユーザーとして、インスタンス・ファイアウォール構成を変更して、インスタンスがiaasidentityなどのサービス・エンドポイントにアクセスできるようにします。

  2. iptablesコマンドを使用して、次のBareMetalInstanceServicesルールをインスタンス・ファイアウォールに追加します。

    iptables -I BareMetalInstanceServices 14 -p tcp -d 169.254.169.254 --dport 443 -j ACCEPT
    iptables -I BareMetalInstanceServices 14 -p tcp -d 169.254.240.254 --dport 443 -j ACCEPT

    最初のエントリはすべてのエンドポイントに必要です。2番目のエントリは、オブジェクト・ストレージ・エンドポイントに接続するために必要です。

構成の変更の永続化

これらのファイアウォール構成の変更をインスタンスの再起動後も維持するには、次の手順を使用します。

  1. 更新されたIPテーブル構成を保存します。

    iptables-save > /etc/sysconfig/iptables.rules
  2. リブート時に現在の(変更された)ファイアウォール構成を自動的に復元するスクリプトを作成します。

    この例の場合、スクリプト名は/sbin/restore-iptables.shです。/sbin/restore-iptables.shファイルの内容は次のとおりです。

    #!/bin/sh
    /sbin/iptables-restore < /etc/sysconfig/iptables.rules
  3. スクリプトの実行可能ビットを設定します。

    chmod +x /sbin/restore-iptables.sh
  4. systemd oneshotサービスを作成して、起動時に/sbin/restore-iptables.shスクリプトを実行します。

    この例では、サービスの名前は/etc/systemd/system/restore-iptables.serviceです。/etc/systemd/system/restore-iptables.serviceファイルの内容は次のとおりです。

    [Unit]
    Description=Restore IP Tables
    After=cloud-final.service
    
    [Service]
    ExecStart=/sbin/restore-iptables.sh
    User=root
    Group=root
    Type=oneshot
    
    [Install]
    WantedBy=multi-user.target
  5. systemdマネージャ構成を再ロードし、起動時にサービスを実行できるようにします。

    systemctl daemon-reload
    systemctl enable restore-iptables

サービスのコールを許可するためのインスタンス証明書の構成

Compute Cloud@Customerでは、デフォルトで、エンドポイント(iaasidentityなど)は、そのCompute Cloud@Customerに固有のCAによって署名された証明書を提供します。デフォルトでは、OSは、このCompute Cloud@Customerに固有のCAによって署名された証明書を信頼しません。提供された証明書をOSが信頼しない場合、OCI SDKまたはCLIの使用を試行すると、CERTIFICATE_VERIFY_FAILEDエラーで失敗します。

このトピックで説明するソリューションのいずれかを実装して、インスタンスでOCI SDKまたはCLIを正常に使用します。

重要

インスタンスにSSHを適用できるユーザーは、インスタンスに付与された権限を自動的に継承します。

オプション1: 証明書持込み(BYOC)

Compute Cloud@Customerでは、独自の認証局(CA)証明書を提供して、CAトラスト・チェーンを使用できます。独自の証明書を使用するには、サポート・リクエストを開き、独自の証明書の使用をリクエストします。「サポート・リクエストの作成」を参照してください。サポートにアクセスするには、OCIコンソールへのサインインの説明に従ってOracle Cloudコンソールにサインインします。

Linux OSでは、次のコマンドによって、デフォルトで信頼できるCAが一覧表示されます。

trust list --filter=ca-anchors

オプション2: 使用するCAバンドルをSDKコードで指定します

このメソッドは、Compute Cloud@Customer固有のCAバンドルをインスタンスにコピーしますが、サーバーの証明書(--insecure)は検証しません。セキュリティを確保するには、取得したバンドルのコンテンツ(external_ca.crt)を確認します。

  1. Compute Cloud@Customerのiaasエンドポイントから証明書を取得します。

    curl --insecure -sS -o external_ca.crt --noproxy "*" https://iaas.ccc_name.domain_name/cachain

    このコマンドは、--user-data-fileオプションまたはuser_dataフィールドを指定した--metadataオプションのいずれかを使用して、起動時にインスタンスに渡されるスクリプト内にあります。スクリプトはinit時にインスタンス内でcloud-initによって実行され、多くのインスタンスでこの証明書ファイルを手動で取得する手間が省けます。

  2. external_ca.crtファイルに保存されているCAバンドルの内容を確認します。

  3. Python SDKコードでCAバンドルを指定します。

    signer = oci.auth.signers.InstancePrincipalsSecurityTokenSigner(
        federation_client_cert_bundle_verify="/home/opc/external_ca.crt"
    )
    identity_client = oci.identity.IdentityClient(config={}, signer=signer)
    identity_client.base_client.session.verify = "/home/opc/external_ca.crt"

オプション3: Compute Cloud@Customer CAバンドルをグローバルに信頼する

このメソッドは前のメソッドと同じですが、次の違いがあります: SDKコードでCAバンドルを指定するかわりに、このメソッドによってCAバンドルがトラスト・チェーンに追加されます。

重要

CAバンドルがトラスト・チェーンに追加されると、このコンピュート・インスタンス上のすべてのアプリケーションは、このバンドルで指定されたCAで署名された証明書を信頼します。これが許容可能なセキュリティ・リスクであるかどうかを検討します。

  1. Compute Cloud@Customerのiaasエンドポイントから証明書を取得します。

    curl --insecure -sS -o external_ca.crt --noproxy "*" https://iaas.ccc_name.domain_name/cachain
  2. external_ca.crtファイルに保存されているCAバンドルの内容を確認します。

  3. グローバルCAトラスト・チェーンを更新します。

    cp external_ca.crt /etc/pki/ca-trust/source/anchors/
    update-ca-trust extract

このメソッドのステップ1および3は、--user-data-fileオプションまたはuser_dataフィールドを指定した--metadataオプションのいずれかを使用して、起動時にインスタンスに渡されるスクリプトに含まれる場合があります。スクリプトは、init時にインスタンス内でcloud-initによって実行され、多くのインスタンスでこれらのステップを手動で実行する労力を節約します。