データ セキュリティ:Actian Zen がフラット ファイルより優れたデータ ストアである理由

フラット ファイルは、データ ストレージ用にすばやくセットアップできます。使いやすさから、データ ストレージのニーズとして頻繁に選択されるソリューションです。しかし、多くの場合、単に情報をドライブに永続化することよりも、安全なデータ ストレージが求められます。

情報をセキュリティ保護するには、権限のない当事者からの読み取り、不要なデータの追加、情報の削除からの保護が必要です。これらのニーズを満たすカスタム実装は複雑さが増します。さらに、IoT などの複数レベルの分散データ環境でソリューションが動作しなければならない場合には、その複雑さが増します。

Actian Zen は、フラット ファイルでは不可能なさまざまなレベルおよび方法でのデータ セキュリティのソリューションを提供します。

右側の「このページの内容」では当ページで扱うトピックを示しています。

データ セキュリティ

そもそもデータ セキュリティとはどういうものなのでしょうか? データ セキュリティには、権限付与、認証、および情報への保護レイヤーの提供など、データへのアクセス許可が付与されていない当事者からのアクセスを防ぐための概念が含まれています。

認証により、ユーザーが誰であるかがわかります。

権限付与は、ユーザーに何が許可されているかを決定します。

これらを併せて、ユーザーが誰であるか、そのユーザーにはファイルとそのファイル内のデータへのアクセス権があるかどうかを判断することができます。

データはこれらのファイル内にのみ存在しているわけではありません。データは、ネットワーク接続を介して、または物理ストレージの移動によって、システム間を移動することもできます。誰かがデータを傍受した場合、その人にデータを読み取らせたくないかもしれません。データの読み取りが許可されていない当事者がデータを判読できないようにするために、暗号化が使用されます。

フラット ファイルのデータ ストアのセキュリティ保護

フラット ファイルのセキュリティはどのようなものでしょうか?

通常は、コンピューターごとでオペレーティング システムによって有効になっているファイルのアクセス許可に依存します。ファイルのアクセス許可は、ファイルへのアクセスを全体として付与または拒否するものであるため、ファイル内の特定のデータに権限を適用する方法がありません。

病院内で患者のバイタルを収集および格納する機器を想像してください。誰かがバイタルの分析を実行する必要があるが、フラット ファイル ベースのソリューションでは患者の識別情報がわからない場合、ファイル内のデータの一部にのみアクセス権を付与することは、ファイルのアクセス許可で許可されていません。

さらに、デフォルトでは、ファイル自体が暗号化されていません。ユーザーごとにファイルを暗号化および復号するためのソリューションは、開発者が実装する必要があります。

次のコード例は、データをファイルに書き込み、そのファイルからデータを読み取って表示します。ファイルをテキスト エディターで開くと、データがはっきりと表示されます。

void writeToFile(string fileName, string text)
{
     fstream targetStream(fileName, std::fstream::out|std::ios::binary);
     targetStream.write(text.c_str(), text.size() * sizeof(char));
     targetStream.close();
}

string readFromFile(string fileName)
{
     fstream sourceStream(fileName, fstream::in | fstream::binary);
     sourceStream.seekg(0, ios::end);
     size_t size = sourceStream.tellg();
     sourceStream.seekg(0, ios::beg);
     char* c = new char[size];
     sourceStream.read(c, size);
     string data = string(c, size);
     return data;
}

int main(int argc, char* argv[]) {
     string plainText = "This is the plain text message that will be stored in the file";

     writeToFile("plainText.txt", plainText);
     string textFromFile = readFromFile("plainText.txt");
     cout << textFromFile
}

データを暗号化する必要がある場合、これを行うのは開発者の責任です。

開発者が最初に考えたことは、「データを暗号化するには、すぐ終わる小さなルーチンを書くだけでしょう。そんなに難しくありません。」

実際に、暗号化自体を処理することは難しくないかもしれませんが、非常に多くの決定を下す必要があるため、アプリケーション ソリューションとしてエンジニアリングすることは大きな課題です。

  • どの暗号化アルゴリズムを使用する必要がありますか?
  • どのライブラリによってアルゴリズムが実装され、そのライブラリはどこで入手できますか?

AES256 を使用してデータを暗号化することに決定したとします。それは妥当な選択です。次に、AES 暗号化機能を提供するライブラリを選択する必要があります。それには少し調査が必要ですが(多数の選択肢がありますが、明白なリーダーがいません)、FIPS(Federal Information Processing Standard:連邦情報処理規格)で検証されているという理由から、Open Source Crypto++ ライブラリを使用することにしたと仮定します。

次に、Crypto++ ライブラリをよく理解することが必要です。最新のソースを入手し、それを使用可能な DLL に組み込む必要があります。

その後、いくつかのサンプルをこなして、データの暗号化方法を学習する必要があります。これで、暗号化ライブラリをコードで使用する準備ができました。

次の例は前の例と同じ関数を実行しますが、データをファイルに保存する前に暗号化し、読み取った後に復号する点が異なります。

int main(int argc, char* argv[])
{
     string plainText = "This is the plain text message that will be stored in the file";
     string encryptedText;
     string decryptedText;

     //The text will be encrypted and written to a file
     AES::Encryption aesEncryption(key, AES::DEFAULT_KEYLENGTH);
     CBC_Mode_ExternalCipher::Encryption cbcEncryption(aesEncryption, iv);
     StreamTransformationFilter stfEncryptor(cbcEncryption, new StringSink(encryptedText));
     stfEncryptor.Put(reinterpret_cast<const unsigned char*>(plainText.c_str()), plainText.length());
     stfEncryptor.MessageEnd();

     writeToFile("encrypted.txt", encryptedText);

     // Reading encrypted text from the file and decrypting it.
     std::string dataToDecryot = readFromFile("encrypted.txt");
     AES::Decryption aesDecryption(key, AES::DEFAULT_KEYLENGTH);
     CBC_Mode_ExternalCipher::Decryption cbcDecryption(aesDecryption, iv);
     StreamTransformationFilter stfDecryptor(cbcDecryption, new StringSink(decryptedText));
     stfDecryptor.Put(reinterpret_cast<const unsigned char*>(dataToDecryot.c_str()), 
            dataToDecryot.size());
     stfDecryptor.MessageEnd();

     cout << "Decrypted Text ( " << decryptedText.size() << ")" <<  endl;
      cout << decryptedText;
     cout << endl << endl;
     return 0;
}

このプログラムで作成されたファイルを誰かが見ようとしても、読み取ることができません。

これは機能しますが、ソリューションが難しくなります。後でプロジェクトを本番環境に移行したら、ライブラリやデータを脆弱にする重大なバグが顕在化していないかどうかを定期的にチェックする必要があるということを覚えておいてください。

それは多くの時間と労力を要します。

技術的な質問にすべて答え、すべての調達作業が完了した後も、まだすべてにおける最大の疑問があります。セキュリティ層に穴がないことを確認するために、コードをどのようにテストしますか?

フラット ファイルのデータ ストレージは、多くの場合、開発者にとって実装することが最も簡単なソリューションですが、実際には多くの技術的負担をかけます。

しかし、Actian Zen ソリューションを実装することにより、厳密にテストされ、継続的なサポートがあるデータ セキュリティを簡単に実現することができます。

セキュリティのレベル

もちろん、データ セキュリティはさまざまなレベルで発生しますが、いずれかのレベルでのみ保護を必要とする場合があるため、適切なレベルを設定する機能を提供するシステムが必要です。Actian Zen は、SQL 呼び出しを介してデータにアクセスできるようにするリレーショナル エンジンと、ファイル内のデータを管理するための軽量で高速なソリューション用のトランザクショナル マイクロカーネルの両方を備えています。どちらのオプションもさまざまなレベルのセキュリティを提供します。

これらを層と考えることができます。

第 1 層は、ディレクトリおよびファイル アクセスです。管理者はオペレーティング システムを使用して、ユーザーまたはユーザー グループごとにファイル アクセスをロック ダウンすることができます。Zen は、ユーザーがオペレーティング システムによるアクセス権を持たない場所にあるデータ ファイルへのアクセスを構成するメカニズムでさえも提供します。これにより、ユーザーは直接ファイルを参照、コピー、削除、または変更できなくても、Zen アプリケーションにはファイルへのフル アクセスが許可されます。

第 2 層は、開発者にオーナー ネームの提供を要求する場所です。オーナー ネームは、データをロック ダウンするパスワードとして働きます。

  • 接続ソフトウェアは、あらゆるアクセスにオーナー ネームを提供するか、またはオーナー ネームを提供せずに読み取り専用アクセスのみを許可することができます。
  • データの暗号化は、さまざまな暗号化レベルで指定することができます。

リレーショナル エンジンを使用する場合は、追加のセキュリティ オプションを利用できます。Zen または Windows Active Directory によって、Zen にアクセスできるユーザーをグループに割り当てることができます。また、リレーショナル エンジンを介して権限のオプションをより細かく、特定の列に至るまで指定することもできます。

もう 1 つの層は、ワイヤ暗号化です。これは、データベース接続で送信されるデータが確実に暗号化されるようにします。このネットワーク レベルの暗号化には低、中、高の暗号化レベルの設定があり、暗号化レベルとパフォーマンスとのトレードオフを判断のうえ、設定を決めることができます。Zen では、すべての接続の暗号化を無効にしたり、特定のクライアントまたはサーバーに対してのみ暗号化を有効にしたりすることができます。

Zen でのデータ セキュリティ

Actian Zen は、幅広いプラットフォームおよび開発環境をサポートしています。さまざまなプログラミング言語を使用する開発者は、データ保護のニーズに対するソリューションとして Zen を活用することができます。

保存データ(ドライブに格納済み)および Zen を使って通信しているコンピューターで転送中のデータについて、データを保護するために AES-256 ビット暗号化が提供されます。デフォルトでは、セキュリティは無効になっています。必要に応じて、ソリューションのセキュリティを有効にします。

開発者は、1 つの単純な呼び出しでデータ ファイルを暗号化することができます。

Btrieve::StatusCode BtrieveFile::SetOwner (
    Btrieve::OwnerMode ownerMode,
    const char * ownerName,
    const char * ownerNameAgain,
    bool  useLongOwnerName = true
)

この呼び出しはデータ ファイルにつき 1 回のみ実行する必要があり、以降のファイルへのアクセスはすべて、指定された ownerMode に従って制御されます。

  • OWNER_MODE_ENCRYPTION_NO_READ_ALLOWED
  • OWNER_MODE_ENCRYPTION_READ_ALLOWED
  • OWNER_MODE_NO_ENCRYPTION_NO_READ_ALLOWED
  • OWNER_MODE_NO_ENCRYPTION_READ_ALLOWED

No Read Allowed オプションは、すべてのアクセスにオーナー ネームを必要とするのに対し、Read Allowed オプションは、オーナー ネームを指定せずにファイルを開き、データを読み取ることをアプリケーションに許可します。後者の場合、データを挿入、更新、または削除しようとするとエラーが返されます。

useLongOwnerName はデフォルトで true に設定されており、9 文字以上、最大 24 文字までのオーナー ネームの使用が推奨されることに留意してください。

このメソッドが呼び出されると、Zen エンジンは現在ファイル内にあるすべてのデータを暗号化します。一度オーナー ネームが設定されたら、そのファイルに対する後続のすべての操作は自動的に暗号化および復号を処理します。アプリケーションとの唯一の違いは、ファイルを開く呼び出し時にオーナー ネームを提供していることです。

BtrieveClient btrieveClient;
Btrieve::StatusCode status;
BtrieveFile btrieveFile;
char* File_Name = "PatientInfo.MKD";
char* ownerName = "myOwnerName";
status = btrieveClient.FileOpen(&btrieveFile, FILE_NAME, ownerName, Btrieve::OPEN_MODE_NORMAL);

リレーショナル エンジンを使用すると、権限はより細かくなります。データベースのセキュリティを有効にしたら、CREATE USER、CREATE GROUP、GRANT、REVOKE などの標準の SQL ステートメントを使用してアクセス権限を設定することができます。ユーザーまたはグループには、データベース全体、データベース内の特定のテーブルのみ、テーブル内の特定の列のみ、または特定のストアド プロシージャのみにアクセスする権限が与えられる可能性があります。

これらの異なるレベルのセキュリティ オプションは、さまざまな方法で組み合わせることができます。データベース ファイルへのユーザーの直接アクセスは拒否するが、そのユーザーがデータベースへのリレーショナル接続を介してデータを読み取ることは許可するよう、ソリューションを構成することができます。

デフォルトで、すべてのセキュリティ オプションは無効になっています。セキュリティ計画で、どのオプションを有効にする必要があるかを決定します。

Zen の組み込みの暗号化を使用すると、データの暗号化を自分で行う場合の作業よりもはるかに簡単です。さらに、この暗号化が標準に従ったアルゴリズムを使用する堅固なセキュリティ開発技術に基づいていることがわかっているという利点があります。

いくつかの規制は暗号化を推奨または要求しています。

  • PCI(Payment Card Industry Data Security Standard:クレジット カード業界のセキュリティ基準)は、クレジット カードおよびその会員データを処理するための基準を定義しており、保存および伝送されるデータの暗号化を要求しています。
  • GDPR(General Data Protection Regulation 2016/679:一般データ保護規則)EU 法では、データ処理者は、データの不慮の損失または誤った開示のリスクを考慮する必要があり、許可されていないユーザーが判読できない形式でデータを保存することを推奨するとしています。
  • HIPAA(Health Insurance Portability and Accountability Act:米国の医療保険の相互運用性と説明責任に関する法律)に準拠するために、HHS(Department of Health and Human Services:米国保健福祉省)は、患者データを保護するために暗号化の使用を推奨しています。

次のステップ

フラット ファイルは、データを格納するための簡単なソリューションではありますが、技術的負担を伴います。フラット ファイルを使用すると、データ保護のニーズを満たすために開発者に大きな負担をかけます。

Actian Zen は、多くのデータ保護要件を処理する使いやすいデータ ストレージ ソリューションを提供します。それは、幅広いオペレーティング システムおよび開発環境と互換性があります。

Actian Zen v15 評価版ページから評価版をダウンロードして、Actian Zen を今日から使用することができます。

Actian Zen の詳細については、製品ページを参照してください。

Actian Zen のセキュリティ オプションの詳細は、Zen セキュリティの「データベース エンジンのためのセキュリティに関する概念と作業」をお読みください。