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

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

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

セキュリティ権限

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

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

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

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

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

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

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

Use this checklist to identify the tasks you perform to secure Block Volume in a new Oracle Cloud Infrastructure tenancy.

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

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

ブロック・ボリューム の使用開始後、このチェックリストを使用して、定期的に実行することをお薦めします。

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

IAMポリシー

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

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

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

DELETE権限を、IAMユーザーおよびグループの最小セットに付与することをお薦めします。この演習では、認可されたユーザーや悪意のあるアクターからの不注意による削除からのデータの損失を最小限に抑えます。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)アルゴリズムを使用して、すべてのブロック・ボリューム、ブート・ボリューム、および保存ボリューム・バックアップを常に暗号化します。ボールト・サービスでは、Oracle提供の暗号化キーまたはカスタム・キーを使用できます。dm-cryptveracrypt、ビット・ロッカーなどのツールを使用して、データ・ボリュームを暗号化することもできます。

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

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

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

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

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

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

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

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"
  }
}

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