注意:ブログの一部には、PostgreSQLのサポート、コンサルティング、トレーニングを提供する会社であるCyberTecによる「POSTGRESQLインスタンスレベル暗号化の可用性の発表」からの参照と例が含まれています。
組織は、データベースに保存する必要のある非常に重要な情報など、さまざまな種類のデータを扱います。セキュリティは、医療記録や金融取引などの機密データが不正な手段を持つ人々の手に渡らないようにするための考慮事項の重要な側面です。何年にもわたって、開発者はデータの整合性と保護を改善するための複数の手段を考え出します。最も採用されている手法の1つは、データ侵害を防ぐための暗号化です。
あなたが複雑な保護手段を使用したかもしれないのと同じくらい、何人かの人々はまだあなたのシステムにアクセスすることになるかもしれません。暗号化はセキュリティの追加レイヤーです。 PostgreSQLは、信頼できない管理者、安全でないネットワーク接続、データベースサーバーの盗難の結果としてデータを開示から保護する柔軟性を提供するだけでなく、さまざまなレベルで暗号化を提供します。 PostgreSQLは、次のようなさまざまな暗号化オプションを提供します。
- SSLホスト認証
- ネットワーク全体でのデータの暗号化
- データパーティションの暗号化
- 特定の列の暗号化
- パスワードストレージの暗号化
- クライアント側の暗号化
ただし、採用する暗号化戦略が高度であるほど、データからロックアウトされる可能性が高くなります。さらに、読み取りプロセスは困難であるだけでなく、クエリと復号化に多くのリソースを必要とします。選択する暗号化オプションは、機密性の観点から扱うデータの性質によって異なります。次の図は、サーバートランザクション中のデータの暗号化と復号化の全体的な手順を示しています。
この記事では、企業が機密情報を保護するさまざまな方法について説明しますが、主な関心事は、前述のインスタンスレベルの暗号化です。
暗号化
暗号化とは、データをエンコードして、元の形式ではなくなり、読み取ることができないようにすることです。データベースに関するデータには、保存データと移動データの2種類があります。データがデータベースに保存されている場合、それは保存データと呼ばれます。一方、たとえばクライアントがデータベースにリクエストを送信した場合、一部のデータが返され、クライアントに到達する必要がある場合、そのデータは移動中のデータと呼ばれます。 2つの異なるタイプのデータは、同様のテクノロジーを使用して保護する必要があります。たとえば、ユーザーがパスワードを送信する必要があるようにアプリケーションが開発された場合、このパスワードはプレーンテキストとしてデータベースに保存されません。保存する前に、このプレーンテキストを別の文字列に変更するために使用されるエンコード手順がいくつかあります。さらに、ユーザーがログインシステムなどでこのパスワードを使用する必要がある場合は、復号化プロセスで送信されるパスワードを比較する方法が必要です。
データベースの暗号化はさまざまな方法で実装できますが、多くの開発者はトランスポートレベルを考慮に入れていません。ただし、さまざまなアプローチは、特に仮想メモリが頻繁にアクセスされている場合に、低速化されたデータアクセス時間のさまざまな落とし穴にも関連しています。
保存データの暗号化
保存データとは、ディスクに物理的に保存されている非アクティブなデータを意味します。クラウドベンダーがインフラストラクチャに完全にアクセスできるクラウド環境でデータベースをホストする場合、暗号化はデータの制御を維持するための優れた手段となる可能性があります。使用できる暗号化戦略のいくつかを以下で説明します。
フルディスク暗号化(FDE)
FDEの背後にある概念は、通常、データの一部を含む可能性のあるすべてのファイルと一時ストレージを保護することです。特に、保護したいものを選択するのが難しい場合、またはファイルを見逃したくない場合は、非常に効率的です。この戦略の主な利点は、システムにアクセスした後、エンドユーザーが特別な注意を払う必要がないことです。ただし、このアプローチにはいくつかの落とし穴があります。これらには以下が含まれます:
- 暗号化と復号化のプロセスにより、全体的なデータアクセス時間が遅くなります。
- システムがオンの場合、情報が復号化されて読み取れるようになるため、データが保護されない場合があります。したがって、ファイルベースの暗号化など、他の暗号化戦略を採用する必要があります。
ファイルベースの暗号化
この場合、ファイルまたはディレクトリは、スタック可能な暗号化ファイルシステム自体によって暗号化されます。 PostgreSQLでは、この記事で説明されているように、pg_cryptoアプローチをよく使用します。
ファイルシステム暗号化の利点には、次のようなものがあります。
- アクション制御は、公開鍵暗号を使用して実施できます
- 暗号化されたボリューム全体のバックアップではなく、暗号化された形式でも個別に変更されたファイルのバックアップができるように、暗号化されたファイルを個別に管理します。
ただし、これは、クラスター化されたデータに使用できる信頼性の高い暗号化方法ではありません。その理由は、一部のファイルベースの暗号化ソリューションでは、攻撃者が回復する可能性のある暗号化されたファイルの残りが残る可能性があるためです。したがって、最適な組み合わせアプローチは、これをフルディスク暗号化と組み合わせることです。
インスタンスレベルの暗号化
インスタンスレベルでは、PostgreSQLクラスターを構成するすべてのファイルが保存データの暗号化としてディスクに保存されるようにバッファーを使用します。次に、ディスクから共有バッファに読み込まれるときに、復号化ブロックとして表示されます。これらのブロックを共有バッファからディスクに書き込んだ後、それらは再び自動的に暗号化されます。データベースは、最初にinitdbコマンドを使用して暗号化で初期化されます。次に、起動時に、暗号化キーがサーバーによってこれら2つの方法のいずれかでフェッチされます。 pgcrypto.keysetup_commandパラメーターまたは環境変数を介して。
今日のホワイトペーパーをダウンロードするClusterControlを使用したPostgreSQLの管理と自動化PostgreSQLの導入、監視、管理、スケーリングを行うために知っておくべきことについて学ぶホワイトペーパーをダウンロードするインスタンスレベルの暗号化の設定
インスタンスレベルの暗号化を設定する方法の概要を以下の手順で説明します。
- RedHatベースのOSの場合はコマンドrpm-qa| grep contribを使用して、DebianベースのOSの場合はdpkg -l | grep contribを使用して、「contrib」がインストールされているかどうかを確認します。リストにない場合は、Debianベースの環境を使用している場合はapt-get install postgresql-contribを使用してインストールし、RedHatベースのOSを使用している場合はyuminstallpostgresql-contribを使用してインストールします。
- PostgreSQLコードを作成します。
- 暗号化キーを確立し、initdbコマンドを実行してクラスターを初期化する
read -sp "Postgres passphrase: " PGENCRYPTIONKEY export PGENCRYPTIONKEY=$PGENCRYPTIONKEY initdb –data-encryption pgcrypto --data-checksums -D cryptotest
- コマンド
$ postgres -D /usr/local/pgsql/data
- 次のコマンドでPGENCRYPTIONKEY環境変数を設定します:
キーは、上記のコマンド「pgcrypto.keysetup_command」postgresql.confパラメーターを介したカスタムでより安全なキー読み取り手順によって設定することもできます。export PGENCRYPTIONKEY=topsecret pg_ctl -D cryptotest start
パフォーマンスへの期待
コストのないオプションはないため、暗号化には常にパフォーマンスが犠牲になります。ワークロードがIO指向の場合、パフォーマンスが大幅に低下すると予想される場合がありますが、そうではない場合があります。通常のサーバーハードウェアでは、データセットがバッファーで共有されていないか、バッファーにとどまる時間が短い場合、パフォーマンスへの影響はごくわずかである可能性があります。
データベースの暗号化を行った後、暗号化が実際にパフォーマンスに影響を与えるかどうかを確認するためにいくつかの小さなテストを実行しました。結果は以下の表に示されています。
ワークロード | 暗号化なし | 暗号化あり | パフォーマンスコスト |
---|---|---|---|
一括挿入操作 | 26s | 68s | 161% |
共有バッファへの読み取り/書き込みフィッティング(1:3の比率) | 3200TPS | 3068TPS | 4.13% |
共有バッファーからの読み取り専用 | 2234 TPS | 2219 TPS | 0.68% |
読み取り専用で共有バッファーに適合しない | 1845 TP | 1434 TPS | 22.28% |
読み取り/書き込みが1:3の比率で共有バッファーに適合しない | 3422 TPS | 2545 TPS | 25.6% |
上の表に示されているように、パフォーマンスが161%から0.7%に跳ね上がることがあるため、パフォーマンスが非線形であることがわかります。これは、共有バッファとディスク間で移動されるページの量に敏感であることに加えて、暗号化パフォーマンスがワークロード固有であることを示す単純な指標です。これは、関連するワークロードによっては、CPUの能力にも影響を与える可能性があります。インスタンスレベルの暗号化は非常に実行可能なオプションであり、多くの環境で最も簡単なアプローチです。
結論
データの暗号化は、特にデータベース管理における機密情報にとって重要な作業です。 PostgreSQLに関する限り、データ暗号化に利用できるオプションは多数あります。暗号化にはパフォーマンスが犠牲になるため、使用するアプローチを決定するときは、データ、アプリケーションアーキテクチャ、およびデータ使用量を理解することが重要です。このようにして、暗号化を有効にするタイミング、データが公開される場所、安全な場所を理解できます。これは、使用するのに最適な暗号化アプローチです。