18 DbNestの使用によるリソースの保護と分離

DbNestを使用して、インスタンス・レベルおよびオペレーティング・システムのリソースを保護および分離できます。

18.1 DbNestについて

DbNestは、CDBレベルおよびPDBレベルで階層化され分離されたランタイム環境を提供します。

これらのランタイム環境では、PDBおよびCDBに関して、ファイル・システムの分離、プロセスID番号領域の分離、およびセキュアなコンピューティングが可能です。マルチテナント環境をセキュリティ侵害から保護するために、dbNestは最新のLinuxリソース分離、ネームスペースおよびコントロール・グループ機能を使用します。

18.2 DbNestの仕組み

DbNestでは、Linuxネームスペースを使用して分離およびファイル・システム・アクセス制御が実現されます。

18.2.1 DbNestの目的

DbNestにより、データベース・インスタンスを同一ホストで実行されている他のデータベースおよびアプリケーションから分離したり、PDB相互およびCDBから分離できます。

インスタンス・レベルのリソースおよびオペレーティング・システム・リソースを共有すると、特に大規模なクラウド・デプロイメントでは、セキュリティ制約および分離制約が発生する場合があります。脆弱性は、外因的である(障害が発生したアプリケーション、リソースの不正アクセス、共有リソースなど)可能性もあります。内因的な脆弱性の例として、障害が発生したOracleプロセスがあります。

データベース・インスタンスではすべてのリソースをあらゆる方法での不正アクセスから保護することが理想的です。データベース・インスタンスとPDBの保護には、次の要件があります。

  • データベース・インスタンスとそのリソースにoracleオペレーティング・システム・ユーザーまたは高権限のオペレーティング・システム・ユーザーがアクセスできないようにする必要があります。

  • 同じOracleホーム内か別のOracleホーム内かに関係なく、別のデータベース・インスタンスまたはアプリケーションがそのデータベース・インスタンスにアクセスできないようにする必要があります。

  • あるPDBからのプロセスが、CDBまたは別のPDBに属するリソースにアクセスできないようにする必要があります。

DbNestは、データベース・インスタンスおよびPDBの保護のためのOracleソリューションです。このインフラストラクチャにより、保護され仮想化された環境でデータベース・インスタンスを実行できるようになります。

このインフラストラクチャは、ネストと呼ばれる階層コンテナを提供する、Linux固有のパッケージとして実装されます。CDBは単一の親ネスト内にあるのに対し、PDBは親の中に作成された個々の子ネスト内にあります。PDBネスト内のLinuxプロセスは独自のプロセスID (PID)番号空間を持ち、他のネスト内のPIDにアクセスできません。プロセスの分離は、悪意のあるユーザーがプロセスを危険にさらした場合のセキュリティ違反における最終レベルの防御です。

18.2.2 Linuxネームスペース

Linuxネームスペースによりグローバル・システム・リソースが抽象化でラップされ、ネームスペース内のプロセスにはグローバル・リソースが独自の分離されたインスタンスを持っているように見えるようになります。

重要なネームスペース・タイプは次のとおりです。

  • プロセス・ネームスペース

    ネームスペースに一連の独立したプロセスIDがあります。最初のプロセスでネームスペースが初期化されます。ネームスペース内のすべてのプロセスには、プロセスID (1から始まる)が与えられます。各プロセスでは、ネームスペース内のプロセスのみを参照できます。

  • ユーザーIDネームスペース

    ユーザー・ネームスペースでは、ネームスペースとオペレーティング・システムとの間でユーザーIDがマップされます。oracleユーザーは、システム全体のルート権限を必要とせずにネームスペースを作成できます。正しく構成されている場合、oracleは実質的にこのネームスペース内のルート・ユーザーですが、この権限はそのネームスペースのみに限定されます。

  • マウント・ネームスペース

    マウント・ネームスペースではマウント・ポイントが制御されます。子ネームスペース内のマウント・ポイントは、その親からは参照できません。ただし、親ネームスペース内のマウント操作はすべて、子から参照できます。

Linuxネームスペースでは、DbNestのためのオペレーティング・システム・インフラストラクチャが提供され、様々なネストを独立した仮想環境として機能させることができます。

18.2.3 DbNestのプロパティ

ネストは、Oracle DatabaseですべてのCDB、PDBまたはアプリケーション・コンテナのために作成されるランタイム環境です。

各ネストは1つのコンテナのみに対応しています。ネスト階層では、コンテナ階層が正確にミラー化されます。CDBには1つ以上のPDBを含めることができるため、CDBの親ネストは1つ以上の子ネストを持つことができます。それぞれの子ネストは、そのネストに含めることができるPDBに対応しています。

データベース・ネスト・インスタンスは、CDBに関連付けられたすべてのネストとメタデータのコレクションです。たとえば、親ネストに1つのCDBが含まれており、そのPDBは、99個あり、それぞれが別々の子ネスト内にあるとします。この場合、このCDBのデータベース・ネスト・インスタンスには、100個のネストが含まれています。データベース・ネスト・インスタンスには、最大で4000個のネストを含めることができます。ホストにx個のCDBが含まれている場合、このホストでは4000x個(最大で8142個)のネストがサポートされます。

ネストには次のような特性があります。

  • オペレーティング・システム分離

    ネストにより、アプリケーションを実行する仮想化環境を提供することで、プロセスID、ユーザー、マウントなどのオペレーティング・システム・リソースを分離します。その階層構造により、親ネストに、子ネストへのアクセスのための可視性がもたらされます。あるPDBに属するプロセスは、他のPDBまたはCDBルートからは参照できません。

  • ファイル・システム分離

    他のネストから重要なエンティティや関連しないエンティティを参照できないようにするために、ネスト内での、ファイル・システム・エンティティの可視性を制御できます。たとえば、hrpdbにおいて、ファイル・システム・エンティティである/lib$ORACLE_HOME/lib、データ・ファイル・パス、トレース・ファイル・パスおよびETLステージング領域のみをそのネスト内で参照できるようにすることができます。シェル、デバイス・ファイルおよびマウント構成は、他のネスト内のPDBからはアクセスできません。

    Linuxネームスペースのピボット・ルートは、chrootと同等です。chrootは、現在実行されているプロセスが認識しているルート・ディレクトリを変更する操作です。バインド・マウントを使用すると、あるディレクトリの内容に別のディレクトリでアクセスできるようになります。これら2つのディレクトリは独立しています。バインド・マウントを使用すると、内容をコピーすることなく、複数のchroot環境に同じファイルを配置できます。

  • リソース管理

    CPUとメモリーなど、ネストのリソースを制御および監視できます。ネストに使用できるリソースは、親ネストから同じリソースを使用できるかどうかに基づいています。

  • セキュア・コンピューティング・モード(seccomp)

    DbNestでは、seccompを使用して、不要または悪意のあるシステム・コールを除外します。seccompでは、内部でBerkeley Packet Filters (BPF)が使用されます。

dbNestを有効にすると、CDBはリソース専用ネスト(または部分ネスト)として作成されます。CDB内の各PDBは、分離管理とリソース管理の両方を含む完全ネストとして作成されます。

18.2.4 DbNestのアーキテクチャ

dbNestのライブラリはOracle Databaseバイナリと統合され、単一の仮想環境が形成されます。

dbNestのインタフェース・レイヤーでは、Linuxネームスペース、リソース、ファイル・システムなどが管理されます。このインタフェース・レイヤーでは、PDBをネストにマップする表を保持するCDBとの相互作用が行われます。

次の図では、2つのPDBを含む1つのCDBについて、dbNestの基本アーキテクチャを示します。

図18-1 CDBネストのアーキテクチャ

図18-1の説明が続きます
「図18-1 CDBネストのアーキテクチャ」の説明

この図は、1つのネスト階層を示しています。親ネストには、データベースのバックグラウンド・プロセスを含む、CDBルートが含まれています。記憶域にOracle Automatic Storage Management (Oracle ASM)が使用されている場合、記憶域セキュリティ・モデルはOracle ASMによって提供されます。

この親ネストには2つの子ネストがあり、一方にはPDB1とそのフォアグラウンド・プロセスが含まれ、もう一方にはPDB2とそのフォアグラウンド・プロセスが含まれています。各PDBでは、それ固有のネスト内にある関連するファイル・システム、トレース・ファイルおよびOracleホーム・ファイルにのみアクセスできます。各ネストでは、それ固有のCPU、メモリーおよびネットワーク・リソースが管理されます。

上の図では、CDBのネスト階層からは、オペレーティング・システムのプロセスとファイルにアクセスできません。たとえば、PDB1からは、Linuxシェル、システム・ファイルまたはアプリケーション・プロセスにアクセスできません。

18.2.5 DbNestのユーザー・インタフェース

デフォルトでは、dbNestは無効になっています。有効化および構成するには、初期化パラメータを使用します。

18.2.5.1 DbNest初期化パラメータ

初期化パラメータを使用することで、DbNestを手動で有効化および構成できます。

ALTER SYSTEM文を使用して次の初期化パラメータを設定するには、インスタンスがサーバー・パラメータ・ファイルで起動されている必要があり、ALTER SYSTEMSCOPE=SPFILEを設定する必要があります。

表18-1 DbNest用の初期化パラメータ

パラメータ 説明

DBNEST_ENABLE

dbNestを有効または無効にします。CDBルートでこのパラメータを設定します。DBNEST_ENABLEには次の値を使用できます。

  • NONE

    dbNestを無効にします。これがデフォルト値です。

  • CDB_RESOURCE_PDB_ALL

    PDBについては完全ネスト、CDBについてはリソース専用ネストを有効にします。

このパラメータを設定するには、専用ブローカが構成されている必要があります。

DBNEST_PDB_FS_CONF

オプションのファイル・システム構成ファイルの場所を指定します。CDBルートでこのパラメータを設定します。

18.2.5.2 DbNest構成ファイル

この構成ファイルはCDB全体に適用され、CDB内にマウントされるパスをリストします。これらのパスはデフォルト・パスの他に用意されます。

構成ファイルの構文

ホワイトリスト登録は、ファイル・システム構成のデフォルトのオプションです。構成ファイルが指定されると、ディレクトリ・パスのリストがデフォルト・パスとともにネスト内にマウントされます。パスを指定する構文は、次のとおりです。

source [destination [options]]

最初の2つのプレースホルダは次のように定義されています。

  • source

    マウントするソース・ディレクトリを指定します。ソースをdevとして指定した場合、ファイル・システムでは、zerorandomurandomshmというファイルのみを含む特別なディレクトリがマウントされます。ファイルshmは、必要に応じてマウントできます。

  • destination

    オプションの宛先ディレクトリを指定します。ディレクトリを指定しない場合は、データベースで、宛先としてsourceが使用されます。

    ノート:

    sourcedestinationの両方を環境変数にできます。

  • options

    optionsにはdestinationを設定する必要があります。オプションとしては次のいずれかを指定できます。

    • roは、読取り専用マウントを指定します。

    • nosetuidは、このディレクトリ内のファイルを介してsetuidを実行しないということを指定します。

    • noexecは、このディレクトリ内のバイナリを実行しないということを指定します。

    • optionalは、ソースを使用可能な場合にのみこのディレクトリをマウントするということを指定します。

ソースおよび宛先ディレクトリのトークン

ソースおよび宛先は、$TOKENまたは${TOKEN}という形式のトークンを持つことができます。トークンは、環境変数として指定するか、dbNestライブラリ・コールのオプションを使用して指定できます。このライブラリ・コールでは、name[array], value[array]という書式を使用します。ユーザー指定の名前/値のペアが優先されます。

DbNestでは、次のトークンがサポートされます。

  • $PDB

  • $PDBID (V$PDBS.CON_IDに表示されるコンテナID)

  • $ORACLE_HOME

  • $ORACLE_BASE

  • $ORACLE_BASE_HOME

  • $ORACLE_BASE_CONFIG

構成ファイル内のディレクティブ

デフォルトでは、構成ファイルは許可リストです。DBNEST_NO_DEFAULTが構成ファイルの最初の行である場合、データベースでは内部のデフォルト・パスが無視されます。次の構成ファイルは/home/oracle/MYCDB/$PDBを許可リストに登録し、内部デフォルト・パスを無視します。

DBNEST_NO_DEFAULT
/home/oracle/MYCDB/$PDB

DBNEST_NO_FS_ROOT_MODEが指定されている場合、この行の後のディレクトリがブロックされ、ブロックリストが作成されます。DbNestは、指定されたディレクトリが存在することを前提としています。ディレクトリ/usr/local/binおよび/bin/usr/binが存在するとします。次の構成ファイルは、これらのディレクトリをブロックリストに登録します。

DBNEST_NO_FS_ROOT_MODE
/usr/local/bin
/bin/usr/bin

ノート:

$ORACLE_HOME/binをブロックリストに登録しないでください。このディレクトリはoracleバイナリの生成に必要なためです。

18.2.6 Oracle Databaseでどのようにネストが管理されるか

DBNEST_ENABLE初期化パラメータにNONE以外の値が設定されている場合、Oracle Databaseはネストを自動的に作成、管理および削除します。これらの操作は、ユーザーに対して透過的です。

具体的には、Oracle Databaseでは次の操作が実行されます。

  • ネストの作成

    インスタンス起動時に、Oracle DatabaseでCDBルートの親ネストが作成され、マウントされたPDBごとに1つの子ネストが作成されます。また、CREATE PLUGGABLE DATABASEコマンドを実行すると、作成されたPDBの子ネストの作成が自動的にトリガーされます。

  • ネストのオープン

    PDBに初めてログインすると、CDBによってそのPDBの子ネストがオープンされます。CDBルートにログインしてPDBをオープンすると、このPDBの子ネストもオープンされます。

  • ネストの更新

    CPU数などのリソースは、CDBの実行中に変化する可能性があります。そのような場合は、リソース・マネージャによって、ネスト構成が自動的に更新されます。

  • ネストのクローズ

    PDB内またはCDBルートからの接続を使用することでPDBをクローズすると、CDBによってPDBの子ネストがクローズされます。バックグラウンド・プロセスによってネストがクローズされます。

  • ネストの削除

    PDBが削除または切断されると、CDBによってPDBの子ネストが削除されます。データベース・インスタンスを停止すると、CDBの親ネストが削除されます。

18.3 DbNestの有効化

dbNestを有効にすると、CDBネストはリソース専用ネストとして作成され、CDBの子PDBは完全ネストとして作成されます。

  1. CDBとそのPDBがローカル・リスナーに登録されていることを確認します。
    このリスナーは、専用ブローカを介してすべての接続をルーティングするように構成する必要があります。クライアントでデータベースに接続すると、リスナーによってその接続がブローカに渡され、その後、そのクライアント接続が専用サーバー・プロセスに渡されます。リスナーと異なり、ブローカはデータベース・インスタンスの一部です。CDBサービスおよびPDBサービスは、リスナーに登録して接続をブローカにリダイレクトする必要があります。

    listener.oraファイルには、次の設定が必要です。

    dedicated_through_broker_listenername=on
  2. 管理権限を持つユーザーとしてCDBルートに接続します。
    たとえば:
    CONNECT c##sec_admin
    Enter password: password
  3. USE_DEDICATED_BROKER初期化パラメータがTRUEに設定されていることを確認します。
    SHOW PARAMETER DEDICATED_BROKER

    次の出力が表示されます。

    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- -----------------------
    use_dedicated_broker                 boolean     TRUE
  4. DBNEST_ENABLE初期化パラメータをCDB_RESOURCE_PDB_ALL、SCOPEをSPFILEに設定します。
    ALTER SYSTEM SET DBNEST_ENABLE=CDB_RESOURCE_PDB_ALL SCOPE=SPFILE;
  5. サーバー・パラメータ・ファイルがALTER SYSTEM SET DBNEST_ENABLE文の設定を使用するようにCDBを再起動します。
    SHUTDOWN IMMEDIATE
    STARTUP
    CDBインスタンスおよびすべてのPDBがデータベース・ネスト内で実行されていることが示されます。
  6. 必要に応じて、アラート・ログをチェックしてdbNestが正しく構成されたことを確認します。
    nestまたはDB Nestを検索します。次のような行が表示されます。
    Instance running inside DB Nest (dbNest_name)

18.4 データベース・ネストのためのファイル・システムの分離の構成

ネスト内でマウントするかネストから除外するように、ファイル・システムを構成できます。

デフォルトでは、dbNestは必要なファイル・システムをマウントします。セキュリティ上の理由から、選択した一連のディレクトリまたはマウント・ポイントを他のネストから参照不可にすることや参照可能にすることができます。次の手順では、CDBとそのPDBが単一のネスト内にあることを前提としています。この手順を実行する前に、ネストがCDBまたはPDBに対して現在有効である必要があります。

  1. Linuxホストで、次の内容を含むテキスト・ファイルnest_blocklist.txt (または任意のファイル名)を作成します。
    DBNEST_NO_FS_ROOT_MODE
    list_of_file_systems_to_exclude

    たとえば、/binおよび/usr/binを除外する場合は、次のようにします。

    DBNEST_NO_FS_ROOT_MODE
    /bin
    /usr/bin
  2. CDBのアラート・ログをチェックして、ネストを使用するように構成されていることを確認します。
    nestまたはDB Nestを検索します。次のような行が表示されます。
    Instance running inside DB Nest (dbNest_name)
  3. 管理権限を持つユーザーとしてCDBルートに接続します。
    たとえば:
    CONNECT c##sec_admin
    Enter password: password
  4. DBNEST_PDB_FS_CONF初期化パラメータに構成ファイルの名前を設定し、SCOPEにSPFILEを設定します。
    たとえば:
    ALTER SYSTEM SET DBNEST_PDB_FS_CONF='/dsk1/nest_blocklist.txt' SCOPE=SPFILE;
  5. サーバー・パラメータ・ファイルがALTER SYSTEM SET DBNEST_PDB_FS_CONF文の設定を使用するようにCDBを再起動します。
    SHUTDOWN IMMEDIATE
    STARTUP