ブロック・ボリュームの保護

このトピックでは、ブロック・ボリュームのセキュリティ情報および推奨事項について説明します。

ブロック・ボリューム・サービスを使用すると、ブロック・ストレージ・ボリュームを動的にプロビジョニングおよび管理できます。ストレージ、パフォーマンスおよびアプリケーションの要件を満たすように、必要に応じて、ボリュームの作成、アタッチ、接続および移動と、ボリューム・パフォーマンスの変更を行うことができます。ボリュームをインスタンスにアタッチおよび接続した後は、そのボリュームを通常のハード・ドライブのように使用できます。また、データを失うことなく、ボリュームを切断して別のインスタンスにアタッチすることもできます。

セキュリティの責任

ブロック・ボリュームをセキュアに使用するには、セキュリティおよびコンプライアンスの責任について学習します。

通常、Oracleはクラウド・インフラストラクチャおよび操作のセキュリティ(クラウド・オペレータのアクセス制御やインフラストラクチャ・セキュリティ・パッチ適用など)を提供します。クラウド・リソースをセキュアに構成する責任はユーザーにあります。クラウドのセキュリティは、ユーザーとOracleの共同責任です。

Oracleは、次のセキュリティ要件を担当します。

  • 物理セキュリティ: Oracleは、Oracle Cloud Infrastructureで提供されるすべてのサービスを実行するグローバル・インフラストラクチャを保護する責任を負います。このインフラストラクチャは、Oracle Cloud Infrastructureサービスを実行するハードウェア、ソフトウェア、ネットワーキングおよび設備で構成されます。

このページでは、セキュリティ権限について説明します。このページには、次の領域があります。

  • アクセス制御: 可能なかぎり権限を制限します。ユーザーが作業を行うために必要なアクセス権のみを付与する必要があります。
  • 暗号化および機密保護:暗号化キーおよびシークレットを使用してデータを保護し、保護されたリソースに接続します。これらのキーを定期的にローテーションします。

初期セキュリティ・タスク

このチェックリストを使用して、新しいOracle Cloud Infrastructureテナンシでブロック・ボリュームを保護するために実行するタスクを識別します。

タスク 詳細情報
IAMポリシーを使用したユーザーおよびリソースへのアクセス権の付与 IAMポリシー
カスタム・キーを使用したリソースの暗号化 データの暗号化
クラウド・ガードの有効化および構成(オプション) クラウド・ガード
セキュリティ・ゾーンの作成(オプション) セキュリティ・ゾーン

定期的なセキュリティ・タスク

ブロック・ボリュームの開始後、このチェックリストを使用して、定期的に実行することが推奨されるセキュリティ・タスクを識別します。

タスク 詳細情報
暗号化キーのローテーション データの暗号化
クラウド・ガードで検出された問題への対応 クラウド・ガード
定期的にバックアップを実行します データの耐久性
セキュリティ監査を実行します 監査

IAMポリシー

ポリシーを使用して、ブロック・ボリュームへのアクセスを制限します。

ポリシーは、Oracle Cloud Infrastructureリソースに誰がどのようにアクセスできるかを指定します。詳細は、ポリシーの仕組みを参照してください。

グループに、その責任を実行するために必要な最小限の権限を割り当てます。各ポリシーには、グループが許可されるアクションを説明する動詞があります。最もアクセスの少ない量から、使用可能な動詞はinspectreaduseおよびmanageです。

最小限のIAMユーザーおよびグループにDELETE権限を付与することをお薦めします。この演習では、認可されたユーザーまたは悪意のあるアクターによる不注意な削除によるデータの損失を最小限に抑えます。DELETE権限はテナンシ管理者にのみ付与します。

Oracle Cloud Infrastructureでは、ブロック・ボリュームとブート・ボリュームという2つのタイプのボリュームがサポートされています。ブロック・ボリュームを使用すると、インスタンス・ストレージ容量を動的に拡張できます。ブート・ボリュームには、コンピュート・インスタンスの起動に使用されるイメージが含まれます。IAMサービスによって、関連するボリューム・リソース・タイプがグループ化され、volume-familyと呼ばれる結合リソース・タイプになります。

IAMユーザーおよびグループの最小アクセス権限を、volume-familyのリソース・タイプに割り当てます。volume-familyのリソース・タイプは、volumesvolume-attachmentsおよびvolume-backupsです。

  • volumesリソースは、インスタンス・ストレージ容量の動的拡張が可能で、インスタンスを起動するイメージを格納できる、デタッチ可能なブロック・ボリューム・デバイスです。
  • volume-attachmentsリソースは、ボリュームとインスタンスの間のアタッチメントです。
  • volume-backupsリソースは、ブロック・ボリュームの作成またはブロック・ボリュームのリカバリに使用できるボリュームのポイントインタイム・コピーです。
ボリュームの削除の防止

次のポリシーの例では、ボリュームおよびバックアップに対する削除以外のすべてのアクションの実行がグループVolumeUsersに許可されます。

Allow group VolumeUsers to manage volumes in tenancy
 where request.permission!='VOLUME_DELETE' 
Allow group VolumeUsers to manage volume-backups in tenancy
 where request.permission!='VOLUME_BACKUP_DELETE'

VolumeUsersがインスタンスからボリュームをデタッチできない場合は、次のポリシーを前の例に追加できます。

Allow group VolumeUsers to manage volume-attachments in tenancy
 where request.permission!='VOLUME_ATTACHMENT_DELETE'

ブロック・ボリューム・ポリシーの詳細およびその他の例を表示するには、コア・サービスの詳細を参照してください。

クラウド・ガード

クラウド・ガードを有効にし、それを使用して、ブロック・ボリュームのセキュリティ問題を検出して対応します。

問題の検出時に、クラウド・ガードによって修正アクションが提案されます。特定のアクションを自動的に実行するようにクラウド・ガードを構成することもできます。クラウド・ガードには、ブロック・ボリュームの次のディテクタ・ルールが含まれています。

  • ブロック・ボリュームがOracle管理キーで暗号化されています
  • ブロック・ボリュームがアタッチされていません

クラウド・ガードで使用可能なすべてのディテクタ・ルールのリストは、ディテクタ・レシピ・リファレンスを参照してください。

まだ行っていない場合は、クラウド・ガードを有効にし、リソースを含むコンパートメントをモニターするように構成します。クラウド・ガード・ターゲットを構成して、テナンシ全体(ルート・コンパートメントおよびすべてのサブコンパートメント)を調査するか、特定のコンパートメントのみをチェックできます。クラウド・ガードの開始を参照してください。

クラウド・ガードを有効にすると、検出されたセキュリティの問題を表示して解決できます。「報告された問題の処理」を参照してください。

セキュリティ・ゾーン

セキュリティ・ゾーンを使用すると、ブロック・ボリュームのリソースがセキュリティのベスト・プラクティスに準拠していることが保証されます。

セキュリティ・ゾーンは、1つ以上のコンパートメントおよびセキュリティ・ゾーン・レシピに関連付けられます。セキュリティ・ゾーンのコンパートメントでリソースを作成および更新すると、Oracle Cloud Infrastructureでは、これらの操作がレシピのセキュリティ・ゾーン・ポリシーのリストに対して検証されます。レシピ内のポリシーに違反している場合、操作は拒否されます。次のセキュリティ・ゾーン・ポリシーは、ブロック・ボリュームのリソースに使用できます。

  • deny block_volume_not_in_security_​zone_attach_to_instance_​in_security_zone
  • deny block_volume_in_security_​zone_attach_to_instance_​not_in_security_zone
  • deny boot_volume_not_in_security_​zone_attach_to_instance_​in_security_zone
  • deny boot_volume_in_security_​zone_attach_to_instance_​not_in_security_zone
  • deny attached_block_volume_not_​in_security_zone_move_to_​compartment_in_security_zone
  • deny attached_boot_volume_not_in_​security_zone_move_to_​compartment_in_security_zone
  • deny block_volume_without_​vault_key
  • deny boot_volume_without_​vault_key

すべてのセキュリティ・ゾーン・ポリシーのリストは、セキュリティ・ゾーン・ポリシーを参照してください。

既存のリソースをセキュリティ・ゾーン内のコンパートメントに移動するには、リソースがゾーンのレシピ内のすべてのセキュリティ・ゾーン・ポリシーに準拠している必要があります。同様に、セキュリティ・ゾーンの外部のコンパートメントは安全性が低い可能性があるため、セキュリティ・ゾーン内のリソースは移動できません。セキュリティ・ゾーンの管理を参照してください。

データ暗号化

ブロック・ボリューム・サービスは、256ビット暗号化によるAdvanced Encryption Standard (AES)アルゴリズムを使用して、すべてのブロック・ボリューム、ブート・ボリュームおよび保存ボリューム・バックアップを常に暗号化します。Vaultサービスでは、Oracle提供の暗号化キーまたはカスタム・キーを使用できます。dm-cryptveracrypt、Bit-Lockerなどのツールを使用してデータ・ボリュームを暗号化することもできます。

デフォルトでは、すべてのボリュームとそのバックアップは、Oracle提供の暗号化キーを使用して暗号化されます。ボリュームがバックアップからクローニングまたはリストアされるたびに、ボリュームに新しい一意の暗号化キーが割り当てられます。

Vaultサービスを使用したボリュームの暗号化

デフォルトの暗号化キーは、特定のOracle Cloud Infrastructureリソースの作成時に自動的に生成できますが、Vaultサービスで独自のカスタム暗号化キーを作成および管理することをお薦めします。

ボールトは、データの保護に使用する暗号化キーを格納する論理エンティティです。保護モードに応じて、キーはサーバーに格納されるか、可用性が高く耐久性のあるハードウェア・セキュリティ・モジュール(HSM)に格納されます。当社のHSMは、連邦情報処理標準(FIPS) 140-2セキュリティ・レベル3のセキュリティ認証を満たしています。ボールトの管理およびキーの管理を参照してください。

Vaultサービスで暗号化キーを作成してローテーションし、ブロック・ボリュームのリソースを保護します。ブロック・ボリュームの作成およびブロック・ボリュームへのキーの割当てを参照してください。

各マスター暗号化キーには、キー・バージョンが自動的に割り当てられます。キーをローテーションすると、ボールト・サービスにより新しいキー・バージョンが生成されます。定期的にキーをローテーションすると、1つのキー・バージョンによって暗号化または署名されるデータの量が制限されます。キーが構成されたことがある場合、キーのローテーションによりデータのリスクが軽減されます。キーの管理を参照してください。

IAMポリシーを使用して、暗号化キーの作成、ローテーションおよび削除を厳密に制限することをお薦めします。Vaultサービスの詳細を参照してください。

dm-cryptによるルート以外のボリュームの暗号化

dm-cryptは、暗号化されたボリュームを提供するためのカーネルレベルの暗号化メカニズム(Linux devicemapperフレームワークに含まれる)です。ファイルシステム(ext4やNTFSなど)から渡されるデータを暗号化し、Linux Unified Key Setup (LUKS)形式でストレージ・デバイスに格納します。

暗号化されたボリュームは、完全なディスク、ディスク・パーティション、論理ボリューム、またはループバック・デバイスを使用して作成されたファイル対応のストレージに格納できます。Cryptsetupは、dm-cryptの管理に使用されるユーザー・レベルのユーティリティであり、パーティションおよびファイルの暗号化に使用されます。dm-cryptは、暗号化ルーチンにLinux crypto APIを使用します。

  1. ブロック・ストレージ・ボリュームをインスタンスにアタッチします(たとえば/dev/sdb)
  2. LUKS暗号化のために/dev/sdbをフォーマットします。プロンプトが表示されたら、LUKSパスフレーズを入力します。パスフレーズは、ボリュームの暗号化に使用されるLUKSマスター・キーの暗号化に使用されます。
    cryptsetup -y luksFormat /dev/sdb
  3. LUKSのフォーマットが成功したことを確認します。
    cryptsetup isLuks /dev/sdb && echo Success
  4. デバイスに関する暗号化情報を取得します。
    cryptsetup luksDump /dev/sdb
  5. デバイスのLUKS UUIDを取得します。UUID値は、/etc/crypttabの構成に使用されます。
    cryptsetup luksUUID /dev/sdb
  6. デバイス名dev_nameを指定してLUKSコンテナを作成します。このコマンドは、デバイス・ノード/dev/mapper/<dev_name>も作成します。
    cryptsetup luksOpen /dev/sdb <dev_name>
  7. マップされたデバイスの情報を取得します。
    dmsetup info <dev_name>
  8. デバイスノードを ext4ファイルシステムとしてフォーマットします。
    sudo mkfs -t ext4 /dev/sdb 
  9. デバイス・ノードをマウントします。
    mount /dev/mapper/<dev_name> /home/encrypt_fs
  10. /etc/crypttabにエントリを追加します。
    <dev_name> UUID=<LUKS UUID of /dev/sdb> none

    /home/encrypt_fsにコピーされるすべてのファイルは、LUKSによって暗号化されます。

  11. 暗号化されたボリュームの使用可能なキースロットにキーファイルを追加します。このキーファイルは、暗号化されたボリュームにアクセスするために使用できます。
    dd if=/dev/urandom of=$HOME/keyfile bs=32 count=1
    chmod 600 $HOME/keyfile
    cryptsetup luksAddKey /dev/sdb ~/keyfile
  12. ファイルの暗号化ステータスを確認します。
    cryptsetup status /home/encrypt_fs
  13. 完了後にアンマウントします。
    umount /home/encrypt_fs
    cryptsetup luksClose <dev_name>

暗号化ボリュームにアクセスする必要がある場合:

cryptsetup luksOpen /dev/sdb <dev_name> --key-file=/home/opc/keyfile
mount /dev/mapper/<dev_name> /home/encrypt_fs

キーファイルを失うか、キーファイルまたはパスフレーズが破損した場合は、暗号化されたボリュームを復号化することはできません。その結果、データが永続的に失われます。キーファイルの永続コピーをオンプレミス・ホストに格納することをお薦めします。

dm-cryptで暗号化したデータ・ボリュームのリモート・マウント

次のステップでは、キーファイルがオンプレミス・ホスト(SRC_IP)にあり、<OCI_SSH_KEY>がインスタンスのSSH秘密キーであるとします。

  1. オンプレミス・ホストからインスタンスにキーファイルをコピーします。
    scp -i <OCI_SSH_KEY> keyfile opc@<SRC_IP>:/home/opc
  2. 暗号化されたボリュームを開きます。
    ssh i <OCI_SSH_KEY> opc@<SRC_IP> "cryptsetup luksOpen /dev/sdb <dev_name> --key-file=/home/opc/keyfile"
  3. ボリュームをマウントします。
    ssh -i <OCI_SSH_KEY> opc@<SRC_IP> "mount /dev/mapper/<dev_name> /home/encrypt_fs"
  4. マウントされたボリューム内のデータに対して操作を実行します。
  5. 暗号化されたボリュームをアンマウントします。
    ssh -i <OCI_SSH_KEY> opc@<SRC_IP> "umount /home/encrypt_fs"
    ssh -i <OCI_SSH_KEY> opc@<SRC_IP> "cryptsetup luksClose <dev_name>"
  6. インスタンスからキーファイルを削除します。
    ssh -i <OCI_SSH_KEY> opc@<SRC_IP> "\rm -f /home/opc/keyfile"

データ耐久性

ブロック・ボリュームでデータの定期的なバックアップを実行します。バックアップを削除する最小限のユーザーおよびグループ・セット権限を付与することをお薦めします。

削除や破損によるデータ損失を最小限に抑えるために、ボリュームの定期的なバックアップをお勧めします。Oracle Cloud Infrastructureでは、スケジュール済バックアップを自動的に実行できます。スケジュール済バックアップの詳細は、ポリシーベースのバックアップを参照してください。

認可されたユーザーによる不注意な削除または悪意のある削除によるデータの損失を最小限に抑えるために、VOLUME_DELETEVOLUME_ATTACHMENT_DELETEおよびVOLUME_BACKUP_DELETE権限をIAMユーザーおよびグループの最小セットに付与することをお薦めします。DELETE権限はテナンシ管理者およびコンパートメント管理者にのみ付与します。

監査

ブロック・ボリュームのアクセス・ログおよびその他のセキュリティ・データを検索します。

監査サービスでは、Oracle Cloud InfrastructureリソースへのすべてのAPIコールが自動的に記録されます。監査サービスを使用してテナンシ内のすべてのユーザー・アクティビティを監視することで、セキュリティおよびコンプライアンスの目標を達成できます。コンソール、SDKおよびコマンドライン(CLI)のコールはすべてAPIを経由するため、これらのソースからのすべてのアクティビティが含まれます。監査レコードは、認証済でフィルタ可能な問合せAPIから利用できます。また、オブジェクト・ストレージからバッチ・ファイルとして取得できます。監査ログの内容には、発生したアクティビティ、アクティビティを開始したユーザー、リクエストの日時、リクエストのソースIP、ユーザー・エージェントおよびHTTPヘッダーが含まれます。監査ログ・イベントの表示を参照してください。

監査ログの例
{
  "datetime": 1642993213028,
  "logContent": {
    "data": {
      "additionalDetails": {
        "X-Real-Port": 55984
      },
      "availabilityDomain": "AD3",
      "compartmentId": "ocid1.compartment.oc1..<unique_ID>",
      "compartmentName": "mycompartment",
      "definedTags": null,
      "eventGroupingId": "<unique_ID>",
      "eventName": "ListBootVolumes",
      "freeformTags": null,
      "identity": {
        "authType": null,
        "callerId": null,
        "callerName": null,
        "consoleSessionId": null,
        "credentials": "<key>",
        "ipAddress": "<IP_address>",
        "principalId": "<user_ID>",
        "principalName": "<user_name>",
        "tenantId": "ocid1.tenancy.oc1..<unique_ID>",
        "userAgent": "Oracle-JavaSDK/1.37.1 (Linux/4.14.35-2047.510.4.1.el7uek.x86_64; Java/1.8.0_301; Java HotSpot(TM) 64-Bit Server VM GraalVM EE 20.3.3/25.301-b09-jvmci-20.3-b18)"
      },
      "message": "ListBootVolumes succeeded",
      "request": {
        "action": "GET",
        "headers": {
          "Accept": [
            "application/json"
          ],
          "Authorization": [
            "Signature headers=\"date (request-target) host\",keyId=<key>"
          ],
          "Connection": [
            "keep-alive"
          ],
          "Date": [
            "Mon, 24 Jan 2022 03:00:12 GMT"
          ],
          "User-Agent": [
            "Oracle-JavaSDK/1.37.1 (Linux/4.14.35-2047.510.4.1.el7uek.x86_64; Java/1.8.0_301; Java HotSpot(TM) 64-Bit Server VM GraalVM EE 20.3.3/25.301-b09-jvmci-20.3-b18)"
          ],
          "opc-client-info": [
            "Oracle-JavaSDK/1.37.1"
          ],
          "opc-request-id": [
            "<unique_ID>"
          ]
        },
        "id": "<unique_ID>",
        "parameters": {
          "availabilityDomain": [
            "EMIr:PHX-AD-3"
          ],
          "compartmentId": [
            "ocid1.compartment.oc1..<unique_ID>"
          ],
          "limit": [
            "1000"
          ]
        },
        "path": "/20160918/bootVolumes"
      },
      "resourceId": null,
      "response": {
        "headers": {
          "Connection": [
            "close"
          ],
          "Content-Length": [
            "2"
          ],
          "Content-Type": [
            "application/json"
          ],
          "Date": [
            "Mon, 24 Jan 2022 03:00:13 GMT"
          ],
          "X-Content-Type-Options": [
            "nosniff"
          ],
          "opc-request-id": [
            "<unique_ID>"
          ]
        },
        "message": null,
        "payload": {},
        "responseTime": "2022-01-24T03:00:13.028Z",
        "status": "200"
      },
      "stateChange": {
        "current": null,
        "previous": null
      }
    },
    "dataschema": "2.0",
    "id": "<unique_ID>",
    "oracle": {
      "compartmentid": "ocid1.compartment.oc1..<unique_ID>",
      "ingestedtime": "2022-01-24T03:00:45.483Z",
      "loggroupid": "_Audit",
      "tenantid": "ocid1.tenancy.oc1..<unique_ID>"
    },
    "source": "",
    "specversion": "1.0",
    "time": "2022-01-24T03:00:13.028Z",
    "type": "com.oraclecloud.BlockVolumes.ListBootVolumes"
  }
}

テナンシでクラウド・ガードを有効にした場合、潜在的なセキュリティ上の懸念があるユーザー・アクティビティがレポートされます。問題を検出すると、クラウド・ガードによって修正アクションが提案されます。特定のアクションを自動的に実行するようにクラウド・ガードを構成することもできます。クラウド・ガードの開始およびレポートされた問題の処理を参照してください。