sql >> データベース >  >> RDS >> Sqlserver

常に暗号化されるSQLServerについて

    セキュリティは、データ駆動型システムの最も重要な要件の1つです。暗号化は、データを保護する方法の1つです。ウィキペディアでは、暗号化を次のように定義しています。

    暗号化 は、許可された関係者のみがアクセスでき、許可されていない関係者はアクセスできないようにメッセージまたは情報をエンコードするプロセスです。

    SQL Server 2016で、Microsoftは常に暗号化と呼ばれる暗号化機能を導入しました 。この記事では、常に暗号化される内容について説明します。 は、簡単な例を使用して、データの暗号化と復号化にどのように使用できるかです。

    SQL Serverは常に暗号化されていますか?

    常に暗号化 は、クライアントアプリケーションが暗号化キーと復号化キーを管理できるようにするセキュリティ機能であり、クライアントアプリケーションのみが機密データを復号化して使用できるようにします。

    いくつかの暗号化技術が存在しますが、それらは常に暗号化ほど安全ではありません。 。たとえば、対称鍵暗号化は、データベース側でデータを暗号化するために使用されます。このアプローチの欠点は、他のデータベース管理者が復号化キーを持っている場合、データにアクセスできることです。

    一方、常に暗号化の場合 、データはクライアント側で暗号化され、データベースサーバーは暗号化されたバージョンのデータを受信します。したがって、データベース側でデータを解読することはできません。データを暗号化したクライアントのみがデータを復号化できます。

    キータイプ

    SQLServerのAlwaysEncrypted機能は、次の2種類のキーを使用します。

    • 列暗号化キー(CEK)

    常にデータベースサーバーに配置されます。データは実際には列CEKを使用して暗号化されます。ただし、データベース側の誰かがCEKにアクセスできる場合は、データを復号化できます。

    • 列マスターキー(CMK)

    このキーは、クライアント側またはサードパーティのストレージに配置されます。 CMKはCEKを保護するために使用され、セキュリティの層を追加します。 CMKにアクセスできる人は誰でも、実際にCEKを復号化でき、CEKを使用して実際のデータを復号化できます。

    暗号化タイプ

    • 決定論的

    このタイプの暗号化では、同じタイプのデータに対して常に同様の暗号化テキストが生成されます。テーブル列に検索とグループ化を実装する場合は、その列に確定的暗号化を使用します。

    • ランダム化

    ランダム化暗号化は、データを暗号化しようとするたびに、同じタイプのデータに対して異なる暗号化テキストを生成します。列がグループ化と検索に使用されない場合は、ランダム化された暗号化を使用してください。

    構成 常に暗号化 SSMSの使用

    SSMSを介して常に暗号化されるSQLServerを構成できます。ただし、その前に、データベースを作成し、データベースにテーブルを追加する必要があります。これを行うには、次のスクリプトを実行します。

    CREATE DATABASE School
    
    Use School
    CREATE TABLE Student  
    (  
       StudentId int identity(1,1) primary key,  
       Name varchar(100),  
       Password varchar(100) COLLATE Latin1_General_BIN2 not null,  
       SSN varchar(20)  COLLATE Latin1_General_BIN2 not null
    )
    >

    上記のスクリプトでは、 Schoolという名前の新しいデータベースを作成します。 。データベースには4つの列があります: StudentId 名前パスワード 、および SSN 。 Password列とSSN列にCOLLATEがあることがわかります。 常に暗号化する列のCOLLATEを指定する必要があります 。暗号化のタイプは「Latin1_General_BIN2」として指定されています。

    まず、2つのレコードをStudentテーブルに追加してみましょう。

    insert into Student ( Name, Password, SSN)
    VALUES ('John','abc123', '451236521478'),
    ('Mike','xyz123', '789541239654')

    現時点では、常に暗号化は構成されていません。 Studentテーブルのいずれかの列にあるため、Studentテーブルからレコードを選択しようとすると、暗号化された値ではなく実際のデータ値が表示されます。次のクエリを実行して、レコードを選択します。

    SELECT * FROM Student

    出力は次のようになります:

    次に、常に暗号化を有効にするようにSSMSを構成しましょう 。前に述べたように、常に暗号化 列暗号化キーと列マスターキーを作成します。

    学校データベースの既存の列暗号化キーと列マスターキーを確認するには、次の図に示すように、[データベース]->[学校]->[セキュリティ]->[常に暗号化されたキー]に移動します。

    データセットに暗号化されたレコードがないため、リストにCEKまたはCMKは表示されません。

    次に、StudentテーブルのPassword列とSSN列で暗号化を有効にします。これを行うには、[データベース]->[学校]を右クリックします。ドロップダウンメニューから、[列の暗号化]を選択します 次の図に示すオプション:

    次へをクリックします はじめにのボタン 窓。 列の選択から ウィンドウで、[パスワード]列と[SSN]列を確認します。 [パスワード]列で、暗号化の種類をランダム化として選択します 。 SSN列には、決定論的を選択します 。これは次のスクリーンショットに示されています:

    次へをクリックします マスターキー設定のボタン 窓。デフォルトでは、マスターキーは以下に示すようにクライアントマシンに保存されます:

    次へをクリックします 実行設定のボタン および概要 ウィンドウズ。すべてがうまくいけば、次の結果が表示されます。 ウィンドウ。

    ここで、もう一度[データベース]->[学校]->[セキュリティ]->[常に暗号化されたキー]に移動すると、次の図に示すように、新しく作成されたCEKとCMKが表示されます。

    次に、Studentテーブルからレコードを選択してみます。

    SELECT * FROM Student

    出力は次のようになります。

    出力から、Password列とSSN列が暗号化されていることがわかります。

    復号化されたデータの取得

    SELECTクエリは暗号化されたデータを返しました。復号化された形式でデータを取得したい場合はどうなりますか?これを行うには、SSMSで新しいクエリウィンドウを作成し、[接続の変更]をクリックします。 次の図に示すように、オブジェクトエクスプローラの上部にあるアイコン:

    SQLServer接続ウィンドウが表示されます。 オプションを選択します 以下に示すように、右下からボタン:

    表示されたウィンドウで、追加の接続パラメータをクリックします。 次のスクリーンショットに示すように、左上からタブをクリックし、テキストボックスに「列暗号化設定=有効」と入力します。最後に、接続をクリックします ボタン。

    ここで、次のSELECTクエリを再度実行します。

    SELECT * FROM Student

    結果には、以下に示すように、復号化された形式で返されたレコードが表示されます。

    結論

    常に E 暗号化 SQLServerの最新のセキュリティ機能の1つです。この記事では、常にについて簡単に説明しました。 E 暗号化 SQL ServerManagementStudioを使用して有効にする方法。また、常にを使用してデータを暗号化および復号化する基本的な例も確認しました。 E 暗号化 機能。


    1. ストアド関数またはプロシージャを呼び出しても、変更は挿入および永続化されません

    2. sqlalchemyを使用してpostgresqlに接続中にエラーが発生しました

    3. mysqlのint(11)の列のサイズは何バイトですか?

    4. 環境変数を設定せずにMacOS/XにOracleInstantclientをインストールしますか?