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

Roving Edgeコンピュート・インスタンスは、インスタンスで実行されているアプリケーションがサービスを呼び出したり、Roving Edgeユーザーがリソースを管理するためのサービスを呼び出す方法に似たリソースを管理できるように構成できます。

インスタンス・プリンシパルは、サービス・リソースに対してアクションを実行する権限があるコンピュート・インスタンスです。インスタンス・プリンシパルで実行されるアプリケーションは、Oracle Roving Edgeユーザーがリソースを管理するためにサービスをコールする方法と同様のサービスをコールしたり、リソースを管理したりできます。インスタンスは、ユーザーが主体アクターであるのと同じように主体アクターです。インスタンス・プリンシパルを使用する場合、サービス・リソースを管理する必要があるアプリケーションを実行するために、インスタンスでユーザー資格証明または構成ファイルを構成する必要はありません。

インスタンス・プリンシパルに認可を付与するには、そのインスタンスを動的グループのメンバーとして含めます。動的グループは、ユーザーグループがユーザーに承認を提供するのと同様に、インスタンスに承認を提供します。

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

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

  • インスタンスがサービス・エンドポイントにアクセスできるように、インスタンス・ファイアウォールを構成します。サービスのコールを許可するためのインスタンス・ファイアウォールの構成を参照してください。

  • インスタンスが、必要なリソースへのアクセス権限を付与する動的グループに含まれていることを確認します。動的グループの作成と管理を参照してください。

    インスタンスは、動的グループの一致ルールで指定されたコンパートメントに作成するか、コンパートメントに移動する必要があります。または、インスタンスには、一致ルールで指定されたリソース・タグが割り当てられている必要があります。照合ルールの記述を参照してください。

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

このトピックでは、インスタンス・ファイアウォール構成を変更する方法と、システムが再起動した場合に変更をリストアするsystemdサービスを作成する方法について説明します。

ファイアウォール構成の変更

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

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

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

デフォルトでは、Roving Edgeエンドポイント(iaasidentityなど)は、そのデバイスに固有のCAによって署名された証明書を提供します。デフォルトでは、オペレーティング・システムは、このRoving Edgeに固有のCAによって署名された証明書を信頼しません。提供されている証明書をOSが信頼しない場合、OCI SDKまたはCLIの使用を試みると、CERTIFICATE_VERIFY_FAILEDエラーで失敗します。

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

ノート

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

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

OSが信頼するCAによって署名された証明書がある場合は、その証明書を提供するようにRoving Edgeを構成します。

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

trust list --filter=ca-anchors

独自の証明書を提供する方法については、「CA Trust Chainを使用した外部インタフェースへのアクセス」を参照してください。

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

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

  1. アプライアンスのiaasエンドポイントから証明書を取得します。

    curl --insecure -sS -o external_ca.crt --noproxy "*" https://iaas.pca_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: Roving Edge CAバンドルのグローバルな信頼

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

ノート

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

  1. アプライアンスのiaasエンドポイントから証明書を取得します。

    curl --insecure -sS -o external_ca.crt --noproxy "*" https://iaas.pca_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によって実行されるため、多数のインスタンスでこれらのステップを手動で実行する手間が節約されます。

Instance Principals用のPython SDKおよびCLIの構成

このトピックでは、Python SDK、CLIまたはTerraformのインスタンス・プリンシパル認可を有効にする方法について説明します。

Python SDKのInstance Principal認可の有効化

SDK for Pythonで、次の例に示すようにoci.auth.signers.InstancePrincipalsSecurityTokenSignerオブジェクトを作成します:

# By default this will hit the auth service in the region returned by http://169.254.169.254/opc/v1/instance/region on the instance.
			
signer = oci.auth.signers.InstancePrincipalsSecurityTokenSigner()
identity_client = oci.identity.IdentityClient(config={}, signer=signer)

待機せずにトークンをリフレッシュするには、次のコマンドを使用します。

signer.refresh_security_token()

CLIに対するインスタンス・プリンシパル認可の有効化

次の例に示すように、コマンドの認可オプション(--auth)を設定します。

oci os ns get --auth instance_principal

あるいは、次の環境変数を設定します。

OCI_CLI_AUTH=instance_principal

両方を設定した場合、--authに設定された値が環境変数より優先されます。

Terraformに対するインスタンス・プリンシパル認可の有効化

次の例に示すように、プロバイダ定義でauth属性を「InstancePrincipal」に設定してください。

variable "region" {}

provider "oci" {
   auth = "InstancePrincipal"  
   region = "${var.region}"

}

インスタンス・プリンシパル認可を使用する場合は、tenancy_ociduser_ocidfingerprintおよびprivate_key_path属性を含める必要はありません。